;
+}
diff --git a/apps/studio/src/components/NativePreview.tsx b/apps/studio/src/components/NativePreview.tsx
new file mode 100644
index 0000000..c2d7c01
--- /dev/null
+++ b/apps/studio/src/components/NativePreview.tsx
@@ -0,0 +1,14 @@
+import type {Layout} from '../lib/layout-parameters';
+import {paperColor,textColor,defaultText,textSize,slotPosition,imageShape,decorationKind} from '../lib/native-layout';
+import {CurvedCopy} from './NativeCurvedCopy';
+/** The catalogue uses the same native type, contours and ornament as the rendered page. */
+export function NativePreview({layout}:{layout:Layout}){
+ return
;
+}
diff --git a/apps/studio/src/lib/native-layout.ts b/apps/studio/src/lib/native-layout.ts
index 2ec77ba..fe174a4 100644
--- a/apps/studio/src/lib/native-layout.ts
+++ b/apps/studio/src/lib/native-layout.ts
@@ -40,7 +40,7 @@ export function slotPosition(layout:Layout,slot:Slot):CSSProperties {
export function textSize(layout:Layout,slot:Slot,text:string):number {
const [, ,w,h]=slot.box,lines=text.split('\n');
const length=(s:string)=>Array.from(s).reduce((n,c)=>n+(/[\u3400-\u9fff]/.test(c)?1:/[A-Z]/.test(c)?.8:.6),0);
- if(slot.direction==='vertical')return Math.min(w*.9,h/Math.max(1,Array.from(text.replaceAll('\n','')).length)*.95);
+ if(slot.direction==='vertical')return Math.min(w*.9,h/Math.max(1,Array.from(text.replaceAll('\n','')).length)*.88);
if(slot.direction==='rotated')return Math.min(w*.85,h/Math.max(1,length(text)));
if(slot.direction==='curved')return Math.min(2.2,w/Math.max(1,length(text)));
return Math.min(h/(lines.length*1.15),w/Math.max(1,...lines.map(length)))*.92;
diff --git a/apps/studio/src/pages/index.tsx b/apps/studio/src/pages/index.tsx
index a70e7bf..877ce42 100644
--- a/apps/studio/src/pages/index.tsx
+++ b/apps/studio/src/pages/index.tsx
@@ -1,7 +1,6 @@
import Head from 'next/head';
import fixed from '../content/templates/layouts.json';
import standard from '../content/standard-layout.json';
-import type {Layout} from '../lib/layout-parameters';
-import {nativeLayout,paperColor,textColor,defaultText,textSize,slotPosition,imageShape} from '../lib/native-layout';
-function Preview({layout}:{layout:Layout}){return
{layout.elements.map(s=>
{s.kind==='text'?
{defaultText(layout,s)}
:s.kind==='image'?
:}
)}
}
+import {nativeLayout} from '../lib/native-layout';
+import {NativePreview as Preview} from '../components/NativePreview';
export default function StudioEntry(){return Studio · 可视化排版 API 库