diff --git a/.dockerignore b/.dockerignore index 103c281..4401a39 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,3 +19,6 @@ coverage **/__pycache__ **/.venv + +# Local authoring assets are uploaded via APIs, never application build inputs. +/content diff --git a/apps/wiki/db/006_post_public_ids.sql b/apps/wiki/db/006_post_public_ids.sql new file mode 100644 index 0000000..59dc076 --- /dev/null +++ b/apps/wiki/db/006_post_public_ids.sql @@ -0,0 +1,5 @@ +BEGIN; +-- API-authored notes may retain a legacy 24-character public ID without code registration. +ALTER TABLE posts ADD COLUMN public_id text UNIQUE CHECK(public_id ~ '^[0-9a-f]{24}$'); +INSERT INTO schema_migrations(version) VALUES('006_post_public_ids'); +COMMIT; diff --git a/apps/wiki/package.json b/apps/wiki/package.json index f23d94e..4833b0a 100644 --- a/apps/wiki/package.json +++ b/apps/wiki/package.json @@ -10,7 +10,7 @@ "build": "next build && esbuild src/worker.ts --bundle --platform=node --format=cjs --external:pg-native --external:playwright-core --outfile=dist/worker.cjs && esbuild scripts/bootstrap.ts --bundle --platform=node --format=cjs --external:pg-native --external:playwright-core --outfile=dist/bootstrap.cjs && esbuild scripts/publish-learning-series.ts --bundle --platform=node --format=cjs --external:pg-native --external:playwright-core --outfile=dist/publish-learning-series.cjs && node scripts/prepare-standalone.mjs", "start": "next start", "typecheck": "next typegen && tsc --noEmit", - "test": "tsx --test tests/api-documentation.test.ts tests/health.test.ts tests/model.test.ts tests/learning-series.test.ts tests/skill-docs.test.ts tests/wiki.test.ts tests/explore.test.ts tests/preview.test.ts tests/note-markdown.test.tsx tests/layout-reference.test.tsx", + "test": "tsx --test tests/api-documentation.test.ts tests/health.test.ts tests/model.test.ts tests/learning-series.test.ts tests/skill-docs.test.ts tests/wiki.test.ts tests/explore.test.ts tests/preview.test.ts tests/note-markdown.test.tsx tests/api-publication.test.ts", "test:smoke": "node scripts/smoke.mjs", "storage:prepare": "tsx scripts/bootstrap.ts", "content:publish-learning": "tsx scripts/publish-learning-series.ts", diff --git a/apps/wiki/public/layout-reference/ReferenceLayout.tsx b/apps/wiki/public/layout-reference/ReferenceLayout.tsx deleted file mode 100644 index 951bf18..0000000 --- a/apps/wiki/public/layout-reference/ReferenceLayout.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import type {CSSProperties} from 'react'; -import layouts from './manifest.json'; -export const layoutIds = ['ref-01','ref-02','ref-03','ref-04','ref-05','ref-06','ref-07','ref-08','ref-09','ref-10','ref-11','ref-12','ref-13','ref-14','ref-15','ref-16','ref-17','ref-18','ref-19','ref-20','ref-21','ref-22','ref-23','ref-24','ref-25','ref-26','ref-27'] as const; -export type LayoutId=typeof layoutIds[number]; -export type Replacements={text?:Record;images?:Record}; -export function getLayout(id:string){return layouts.find(layout=>layout.id===id)} -export function validateReplacements(id:string,replacements:Replacements){ - const layout=getLayout(id);if(!layout)throw Error(`Unknown layout ID: ${id}`); - for(const[kind,values]of [['text',replacements.text],['image',replacements.images]] as const)for(const key of Object.keys(values||{})){ - if(!layout.elements.some(e=>key===id+'/'+e.id&&e.kind===kind))throw Error(`Component does not belong to ${id} or has the wrong kind: ${key}`); - }return layout; -} -function textStyle(text:string,box:number[],width:number,direction:string):CSSProperties{ - const vertical=direction==='vertical'||direction==='rotated',lines=text.split('\n'),units=Math.max(...lines.map(line=>Array.from(line).reduce((n,c)=>n+(/[\u3400-\u9fff]/.test(c)?1:.56),0)),1); - const size=vertical?Math.min(box[2],box[3]/Math.max(text.length,1)):Math.min(box[3]/(lines.length*1.1),box[2]/units); - return {fontSize:`${size/width*100}cqw`,lineHeight:1.1,whiteSpace:'pre-wrap',writingMode:vertical?'vertical-rl':undefined,textOrientation:direction==='rotated'?'sideways':undefined,transform:direction==='angled'?'rotate(-12deg)':undefined,transformOrigin:'left center',color:'#222',fontFamily:'"Songti SC", "Noto Serif CJK SC", serif'}; -} -/** Untouched mode reconstructs typed source layers; replacement mode keeps the exact preset geometry. */ -export default function ReferenceLayout({id,text={},images={},assetBase=''}:{id:LayoutId;text?:Record;images?:Record;assetBase?:string}){ - const layout=validateReplacements(id,{text,images}),src=(url:string)=>assetBase+url; - return
-
- - {layout.elements.map(e=>{ - const[x,y,w,h]=e.box,key=id+'/'+e.id,position:CSSProperties={position:'absolute',left:x/layout.width*100+'%',top:y/layout.height*100+'%',width:w/layout.width*100+'%',height:h/layout.height*100+'%',zIndex:e.kind==='text'?3:e.kind==='decoration'?2:1}; - if(e.kind==='text'&&Object.hasOwn(text,key)){ - if(e.direction==='curved')throw Error(`Curved text requires the source-specific SVG path: ${key}`); - return - {'underlay' in e&&} - {text[key]} - ; - } - if(e.kind==='image'&&Object.hasOwn(images,key))return {e.role}; - return {e.kind==='text'?e.text||`${e.role}:原字形保真,内容未辨识`:''}; - })} -
-
; -} diff --git a/apps/wiki/public/layout-reference/index.html b/apps/wiki/public/layout-reference/index.html deleted file mode 100644 index b2db0d2..0000000 --- a/apps/wiki/public/layout-reference/index.html +++ /dev/null @@ -1 +0,0 @@ -27 张原图版面索引

27 张原图版面 · 一一对应

按原图从上到下、每行从左到右编号,排除左侧说明栏。点击每张可分开检查文字、图片占位/色块与装饰。

查看编号原图 · 机器索引

diff --git a/apps/wiki/public/layout-reference/index.json b/apps/wiki/public/layout-reference/index.json deleted file mode 100644 index a27fcdd..0000000 --- a/apps/wiki/public/layout-reference/index.json +++ /dev/null @@ -1,466 +0,0 @@ -{ - "version": 2, - "sourceSha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "numbering": "row-major; exclude left title banner", - "layouts": [ - { - "id": "ref-01", - "name": "双矩形错位与左下说明", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 46, - 113, - 171 - ], - "row": 1, - "column": 2 - }, - "manifest": "/layout-reference/ref-01/manifest.json" - }, - { - "id": "ref-02", - "name": "四格图片列与双列竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 46, - 112, - 171 - ], - "row": 1, - "column": 3 - }, - "manifest": "/layout-reference/ref-02/manifest.json" - }, - { - "id": "ref-03", - "name": "左上标题与右下错位图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 46, - 114, - 173 - ], - "row": 1, - "column": 4 - }, - "manifest": "/layout-reference/ref-03/manifest.json" - }, - { - "id": "ref-04", - "name": "满版灰底椭圆与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 45, - 113, - 173 - ], - "row": 1, - "column": 5 - }, - "manifest": "/layout-reference/ref-04/manifest.json" - }, - { - "id": "ref-05", - "name": "五圆出血与右侧竖排大字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 45, - 112, - 172 - ], - "row": 1, - "column": 6 - }, - "manifest": "/layout-reference/ref-05/manifest.json" - }, - { - "id": "ref-06", - "name": "满高左图与右侧窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 228, - 114, - 172 - ], - "row": 2, - "column": 2 - }, - "manifest": "/layout-reference/ref-06/manifest.json" - }, - { - "id": "ref-07", - "name": "同心圆图位与底部年份", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 228, - 112, - 172 - ], - "row": 2, - "column": 3 - }, - "manifest": "/layout-reference/ref-07/manifest.json" - }, - { - "id": "ref-08", - "name": "双层满宽图与字距横栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 227, - 113, - 173 - ], - "row": 2, - "column": 4 - }, - "manifest": "/layout-reference/ref-08/manifest.json" - }, - { - "id": "ref-09", - "name": "左侧分字标题与右侧长图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 227, - 113, - 173 - ], - "row": 2, - "column": 5 - }, - "manifest": "/layout-reference/ref-09/manifest.json" - }, - { - "id": "ref-10", - "name": "半页深底与裁切英文 blue", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 227, - 113, - 173 - ], - "row": 2, - "column": 6 - }, - "manifest": "/layout-reference/ref-10/manifest.json" - }, - { - "id": "ref-11", - "name": "左上双行标题与右下主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 410, - 114, - 173 - ], - "row": 3, - "column": 2 - }, - "manifest": "/layout-reference/ref-11/manifest.json" - }, - { - "id": "ref-12", - "name": "三图模块与左侧分散字框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 409, - 112, - 173 - ], - "row": 3, - "column": 3 - }, - "manifest": "/layout-reference/ref-12/manifest.json" - }, - { - "id": "ref-13", - "name": "横题与右侧出血扁椭圆", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 410, - 114, - 173 - ], - "row": 3, - "column": 4 - }, - "manifest": "/layout-reference/ref-13/manifest.json" - }, - { - "id": "ref-14", - "name": "大矩形与小方图及居中横题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 409, - 113, - 174 - ], - "row": 3, - "column": 5 - }, - "manifest": "/layout-reference/ref-14/manifest.json" - }, - { - "id": "ref-15", - "name": "英文双行刊头与四分之一圆图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 409, - 112, - 173 - ], - "row": 3, - "column": 6 - }, - "manifest": "/layout-reference/ref-15/manifest.json" - }, - { - "id": "ref-16", - "name": "上下灰阶色带与底部白区", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 592, - 113, - 173 - ], - "row": 4, - "column": 1 - }, - "manifest": "/layout-reference/ref-16/manifest.json" - }, - { - "id": "ref-17", - "name": "英文刊头与圆形叠标及窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 591, - 113, - 174 - ], - "row": 4, - "column": 2 - }, - "manifest": "/layout-reference/ref-17/manifest.json" - }, - { - "id": "ref-18", - "name": "上大图与下方英文双行", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 591, - 113, - 174 - ], - "row": 4, - "column": 3 - }, - "manifest": "/layout-reference/ref-18/manifest.json" - }, - { - "id": "ref-19", - "name": "四角大字与中央双圆竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 593, - 113, - 171 - ], - "row": 4, - "column": 4 - }, - "manifest": "/layout-reference/ref-19/manifest.json" - }, - { - "id": "ref-20", - "name": "右上大弧面与左下圆形标题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 592, - 114, - 173 - ], - "row": 4, - "column": 5 - }, - "manifest": "/layout-reference/ref-20/manifest.json" - }, - { - "id": "ref-21", - "name": "右侧旋转英文与节点方图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 592, - 114, - 173 - ], - "row": 4, - "column": 6 - }, - "manifest": "/layout-reference/ref-21/manifest.json" - }, - { - "id": "ref-22", - "name": "三段斜切背景与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 774, - 113, - 173 - ], - "row": 5, - "column": 1 - }, - "manifest": "/layout-reference/ref-22/manifest.json" - }, - { - "id": "ref-23", - "name": "上方方图与中部大写英文", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 775, - 114, - 172 - ], - "row": 5, - "column": 2 - }, - "manifest": "/layout-reference/ref-23/manifest.json" - }, - { - "id": "ref-24", - "name": "斜排中文与倾斜装饰线框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 775, - 113, - 172 - ], - "row": 5, - "column": 3 - }, - "manifest": "/layout-reference/ref-24/manifest.json" - }, - { - "id": "ref-25", - "name": "左侧竖题与右下方形主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 774, - 113, - 173 - ], - "row": 5, - "column": 4 - }, - "manifest": "/layout-reference/ref-25/manifest.json" - }, - { - "id": "ref-26", - "name": "三行英文与曲线指引小图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 774, - 114, - 173 - ], - "row": 5, - "column": 5 - }, - "manifest": "/layout-reference/ref-26/manifest.json" - }, - { - "id": "ref-27", - "name": "对角双区与斜向文字带", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 618, - 774, - 112, - 172 - ], - "row": 5, - "column": 6 - }, - "manifest": "/layout-reference/ref-27/manifest.json" - } - ] -} diff --git a/apps/wiki/public/layout-reference/layout-reference-toolkit.zip b/apps/wiki/public/layout-reference/layout-reference-toolkit.zip deleted file mode 100644 index 9eb3200..0000000 Binary files a/apps/wiki/public/layout-reference/layout-reference-toolkit.zip and /dev/null differ diff --git a/apps/wiki/public/layout-reference/ref-01/index.html b/apps/wiki/public/layout-reference/ref-01/index.html deleted file mode 100644 index eaebe75..0000000 --- a/apps/wiki/public/layout-reference/ref-01/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-01 · 双矩形错位与左下说明

ref-01 / 双矩形错位与左下说明

原图纸底与画框 -BULUBLUE -左下说明(未辨识原字形) - - - - -构件标注

原图第 1 行、第 2 列;113×171 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-01/manifest.json b/apps/wiki/public/layout-reference/ref-01/manifest.json deleted file mode 100644 index f9d318e..0000000 --- a/apps/wiki/public/layout-reference/ref-01/manifest.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "id": "ref-01", - "name": "双矩形错位与左下说明", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 46, - 113, - 171 - ], - "row": 1, - "column": 2 - }, - "width": 113, - "height": 171, - "reference": "/layout-reference/ref-01/source.png", - "annotated": "/layout-reference/ref-01/annotated.png", - "background": "/layout-reference/ref-01/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "品牌字标", - "box": [ - 8, - 20, - 36, - 15 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-01/T01.png", - "pixels": 274, - "underlay": "/layout-reference/ref-01/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左下说明", - "box": [ - 7, - 121, - 44, - 34 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-01/T02.png", - "pixels": 468, - "underlay": "/layout-reference/ref-01/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方主图", - "box": [ - 24, - 14, - 77, - 71 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/I01.png", - "pixels": 5259, - "mask": "/layout-reference/ref-01/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方副图", - "box": [ - 42, - 89, - 59, - 70 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/I02.png", - "pixels": 4097, - "mask": "/layout-reference/ref-01/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "顶部短线", - "box": [ - 41, - 4, - 29, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/D01.png", - "pixels": 55 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部横线", - "box": [ - 29, - 158, - 58, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/D02.png", - "pixels": 167 - } - ], - "ocr": [ - { - "box": [ - 0.07374631491782553, - 0.12865497059314956, - 0.31268436578171094, - 0.06237816764132553 - ], - "confidence": 0.5, - "text": "BULUBLUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19323, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-02/index.html b/apps/wiki/public/layout-reference/ref-02/index.html deleted file mode 100644 index 4693607..0000000 --- a/apps/wiki/public/layout-reference/ref-02/index.html +++ /dev/null @@ -1,21 +0,0 @@ - -ref-02 · 四格图片列与双列竖题

ref-02 / 四格图片列与双列竖题

原图纸底与画框 -蓝羽毛版式设计系列 -版式灵感收藏 -图片一图注(未辨识原字形) -图片二图注(未辨识原字形) -图片三图注(未辨识原字形) -右下说明(未辨识原字形) -右下品牌与说明(未辨识原字形) - - - - - - -构件标注

原图第 1 行、第 3 列;112×171 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-02/manifest.json b/apps/wiki/public/layout-reference/ref-02/manifest.json deleted file mode 100644 index b746732..0000000 --- a/apps/wiki/public/layout-reference/ref-02/manifest.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "id": "ref-02", - "name": "四格图片列与双列竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 46, - 112, - 171 - ], - "row": 1, - "column": 3 - }, - "width": 112, - "height": 171, - "reference": "/layout-reference/ref-02/source.png", - "annotated": "/layout-reference/ref-02/annotated.png", - "background": "/layout-reference/ref-02/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧主标题", - "box": [ - 91, - 0, - 20, - 126 - ], - "text": "蓝羽毛版式设计系列", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-02/T01.png", - "pixels": 1348, - "underlay": "/layout-reference/ref-02/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中间副标题", - "box": [ - 70, - 0, - 19, - 84 - ], - "text": "版式灵感收藏", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-02/T02.png", - "pixels": 776, - "underlay": "/layout-reference/ref-02/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "图片一图注", - "box": [ - 0, - 34, - 20, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T03.png", - "pixels": 28, - "underlay": "/layout-reference/ref-02/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "图片二图注", - "box": [ - 0, - 71, - 29, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T04.png", - "pixels": 74, - "underlay": "/layout-reference/ref-02/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "图片三图注", - "box": [ - 2, - 132, - 37, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T05.png", - "pixels": 39, - "underlay": "/layout-reference/ref-02/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "右下说明", - "box": [ - 50, - 81, - 32, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T06.png", - "pixels": 348, - "underlay": "/layout-reference/ref-02/T06-underlay.png" - }, - { - "id": "T07", - "kind": "text", - "role": "右下品牌与说明", - "box": [ - 51, - 143, - 51, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T07.png", - "pixels": 483, - "underlay": "/layout-reference/ref-02/T07-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "图片一", - "box": [ - 4, - 3, - 40, - 30 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I01.png", - "pixels": 1198, - "mask": "/layout-reference/ref-02/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "图片二", - "box": [ - 2, - 38, - 44, - 33 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I02.png", - "pixels": 1443, - "mask": "/layout-reference/ref-02/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "图片三", - "box": [ - 2, - 74, - 44, - 56 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I03.png", - "pixels": 2421, - "mask": "/layout-reference/ref-02/I03-mask.png" - }, - { - "id": "I04", - "kind": "image", - "role": "图片四", - "box": [ - 2, - 135, - 44, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I04.png", - "pixels": 1276, - "mask": "/layout-reference/ref-02/I04-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "分栏细线", - "box": [ - 65, - 2, - 2, - 72 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/D01.png", - "pixels": 143 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下横线组", - "box": [ - 50, - 158, - 57, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/D02.png", - "pixels": 407 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19152, - "unreadableText": 5 - } -} diff --git a/apps/wiki/public/layout-reference/ref-03/index.html b/apps/wiki/public/layout-reference/ref-03/index.html deleted file mode 100644 index 75b7dd7..0000000 --- a/apps/wiki/public/layout-reference/ref-03/index.html +++ /dev/null @@ -1,17 +0,0 @@ - -ref-03 · 左上标题与右下错位图

ref-03 / 左上标题与右下错位图

原图纸底与画框 -蓝羽毛 -右上说明(未辨识原字形) -01 -左下信息两列(未辨识原字形) - - - - - -构件标注

原图第 1 行、第 4 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-03/manifest.json b/apps/wiki/public/layout-reference/ref-03/manifest.json deleted file mode 100644 index f2da201..0000000 --- a/apps/wiki/public/layout-reference/ref-03/manifest.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "id": "ref-03", - "name": "左上标题与右下错位图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 46, - 114, - 173 - ], - "row": 1, - "column": 4 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-03/source.png", - "annotated": "/layout-reference/ref-03/annotated.png", - "background": "/layout-reference/ref-03/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "主标题", - "box": [ - 0, - 0, - 45, - 20 - ], - "text": "蓝羽毛", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-03/T01.png", - "pixels": 372, - "underlay": "/layout-reference/ref-03/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右上说明", - "box": [ - 80, - 22, - 29, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-03/T02.png", - "pixels": 359, - "underlay": "/layout-reference/ref-03/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "编号", - "box": [ - 100, - 48, - 8, - 7 - ], - "text": "01", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-03/T03.png", - "pixels": 39, - "underlay": "/layout-reference/ref-03/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下信息两列", - "box": [ - 4, - 118, - 37, - 33 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-03/T04.png", - "pixels": 353, - "underlay": "/layout-reference/ref-03/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 4, - 22, - 75, - 82 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/I01.png", - "pixels": 6006, - "mask": "/layout-reference/ref-03/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右下副图", - "box": [ - 45, - 107, - 63, - 48 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/I02.png", - "pixels": 3004, - "mask": "/layout-reference/ref-03/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "斜引线", - "box": [ - 80, - 49, - 18, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D01.png", - "pixels": 38 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部左短线", - "box": [ - 24, - 164, - 13, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D02.png", - "pixels": 52 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部右短线", - "box": [ - 79, - 163, - 16, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D03.png", - "pixels": 65 - } - ], - "ocr": [ - { - "box": [ - 0.0221329192553819, - 0.02865017716183693, - 0.3329271461531433, - 0.08913510199456776 - ], - "confidence": 0.5, - "text": "蓝羽毛" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-04/index.html b/apps/wiki/public/layout-reference/ref-04/index.html deleted file mode 100644 index 3fd2afd..0000000 --- a/apps/wiki/public/layout-reference/ref-04/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-04 · 满版灰底椭圆与右侧白字

ref-04 / 满版灰底椭圆与右侧白字

原图纸底与画框 -蓝羽毛 -版式 -椭圆左沿弧形微字(未辨识原字形) -右侧辅助小字(未辨识原字形) - - - - -构件标注

原图第 1 行、第 5 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-04/manifest.json b/apps/wiki/public/layout-reference/ref-04/manifest.json deleted file mode 100644 index cfe91f6..0000000 --- a/apps/wiki/public/layout-reference/ref-04/manifest.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "id": "ref-04", - "name": "满版灰底椭圆与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 45, - 113, - 173 - ], - "row": 1, - "column": 5 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-04/source.png", - "annotated": "/layout-reference/ref-04/annotated.png", - "background": "/layout-reference/ref-04/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖向标题", - "box": [ - 80, - 4, - 22, - 54 - ], - "text": "蓝羽毛", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-04/T01.png", - "pixels": 674, - "underlay": "/layout-reference/ref-04/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右下竖向标题", - "box": [ - 79, - 104, - 28, - 45 - ], - "text": "版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-04/T02.png", - "pixels": 831, - "underlay": "/layout-reference/ref-04/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "椭圆左沿弧形微字", - "box": [ - 12, - 21, - 23, - 109 - ], - "text": null, - "direction": "curved", - "reading": "unreadable", - "asset": "/layout-reference/ref-04/T03.png", - "pixels": 487, - "underlay": "/layout-reference/ref-04/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧辅助小字", - "box": [ - 83, - 82, - 20, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-04/T04.png", - "pixels": 39, - "underlay": "/layout-reference/ref-04/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央倾斜椭圆图位", - "box": [ - 11, - 16, - 92, - 143 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/I01.png", - "pixels": 9110, - "mask": "/layout-reference/ref-04/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上方块与短线", - "box": [ - 3, - 8, - 12, - 13 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D01.png", - "pixels": 105 - }, - { - "id": "D02", - "kind": "decoration", - "role": "左下阶梯线组", - "box": [ - 3, - 132, - 29, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D02.png", - "pixels": 258 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部细线", - "box": [ - 4, - 167, - 48, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D03.png", - "pixels": 48 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-05/index.html b/apps/wiki/public/layout-reference/ref-05/index.html deleted file mode 100644 index 69e7823..0000000 --- a/apps/wiki/public/layout-reference/ref-05/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-05 · 五圆出血与右侧竖排大字

ref-05 / 五圆出血与右侧竖排大字

原图纸底与画框 -蓝羽毛 -版式设计 设计灵感 - - - - - - -构件标注

原图第 1 行、第 6 列;112×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-05/manifest.json b/apps/wiki/public/layout-reference/ref-05/manifest.json deleted file mode 100644 index 7f24cd4..0000000 --- a/apps/wiki/public/layout-reference/ref-05/manifest.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "id": "ref-05", - "name": "五圆出血与右侧竖排大字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 45, - 112, - 172 - ], - "row": 1, - "column": 6 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-05/source.png", - "annotated": "/layout-reference/ref-05/annotated.png", - "background": "/layout-reference/ref-05/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧大标题", - "box": [ - 72, - 71, - 28, - 99 - ], - "text": "蓝羽毛", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-05/T01.png", - "pixels": 1148, - "underlay": "/layout-reference/ref-05/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右侧细标题", - "box": [ - 100, - 72, - 11, - 90 - ], - "text": "版式设计 设计灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-05/T02.png", - "pixels": 487, - "underlay": "/layout-reference/ref-05/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上出血圆", - "box": [ - 1, - 5, - 44, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I01.png", - "pixels": 2144, - "mask": "/layout-reference/ref-05/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右上出血圆", - "box": [ - 56, - 1, - 54, - 44 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I02.png", - "pixels": 2070, - "mask": "/layout-reference/ref-05/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "中部圆", - "box": [ - 46, - 44, - 42, - 42 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I03.png", - "pixels": 1302, - "mask": "/layout-reference/ref-05/I03-mask.png" - }, - { - "id": "I04", - "kind": "image", - "role": "左中小圆", - "box": [ - 3, - 73, - 38, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I04.png", - "pixels": 1107, - "mask": "/layout-reference/ref-05/I04-mask.png" - }, - { - "id": "I05", - "kind": "image", - "role": "左下出血圆", - "box": [ - 1, - 119, - 66, - 50 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I05.png", - "pixels": 2892, - "mask": "/layout-reference/ref-05/I05-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "中下竖线组", - "box": [ - 47, - 106, - 24, - 43 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/D01.png", - "pixels": 286 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 0 - } -} diff --git a/apps/wiki/public/layout-reference/ref-06/index.html b/apps/wiki/public/layout-reference/ref-06/index.html deleted file mode 100644 index 0dd137e..0000000 --- a/apps/wiki/public/layout-reference/ref-06/index.html +++ /dev/null @@ -1,15 +0,0 @@ - -ref-06 · 满高左图与右侧窄栏

ref-06 / 满高左图与右侧窄栏

原图纸底与画框 -蓝羽毛の版式 -审美提升 设计灵感 -底部英文标识(未辨识原字形) - - - - -构件标注

原图第 2 行、第 2 列;114×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-06/manifest.json b/apps/wiki/public/layout-reference/ref-06/manifest.json deleted file mode 100644 index 7d083fd..0000000 --- a/apps/wiki/public/layout-reference/ref-06/manifest.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "id": "ref-06", - "name": "满高左图与右侧窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 228, - 114, - 172 - ], - "row": 2, - "column": 2 - }, - "width": 114, - "height": 172, - "reference": "/layout-reference/ref-06/source.png", - "annotated": "/layout-reference/ref-06/annotated.png", - "background": "/layout-reference/ref-06/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖向主标题", - "box": [ - 98, - 28, - 9, - 59 - ], - "text": "蓝羽毛の版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-06/T01.png", - "pixels": 376, - "underlay": "/layout-reference/ref-06/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右侧竖向说明", - "box": [ - 81, - 49, - 14, - 49 - ], - "text": "审美提升 设计灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-06/T02.png", - "pixels": 368, - "underlay": "/layout-reference/ref-06/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部英文标识", - "box": [ - 78, - 162, - 32, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-06/T03.png", - "pixels": 204, - "underlay": "/layout-reference/ref-06/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左侧满高图片", - "box": [ - 4, - 3, - 69, - 163 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/I01.png", - "pixels": 11240, - "mask": "/layout-reference/ref-06/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "右上短竖线", - "box": [ - 89, - 4, - 3, - 26 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D01.png", - "pixels": 53 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下细长线组", - "box": [ - 80, - 102, - 15, - 58 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D02.png", - "pixels": 584 - }, - { - "id": "D03", - "kind": "decoration", - "role": "右侧斜引线", - "box": [ - 81, - 93, - 12, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D03.png", - "pixels": 45 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19608, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-07/index.html b/apps/wiki/public/layout-reference/ref-07/index.html deleted file mode 100644 index 3c771a8..0000000 --- a/apps/wiki/public/layout-reference/ref-07/index.html +++ /dev/null @@ -1,15 +0,0 @@ - -ref-07 · 同心圆图位与底部年份

ref-07 / 同心圆图位与底部年份

原图纸底与画框 -下沿环形文字(未辨识原字形) -2025 -年份下副标题(未辨识原字形) -底部说明(未辨识原字形) -右下品牌(未辨识原字形) - - -构件标注

原图第 2 行、第 3 列;112×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-07/manifest.json b/apps/wiki/public/layout-reference/ref-07/manifest.json deleted file mode 100644 index 5483193..0000000 --- a/apps/wiki/public/layout-reference/ref-07/manifest.json +++ /dev/null @@ -1,168 +0,0 @@ -{ - "id": "ref-07", - "name": "同心圆图位与底部年份", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 228, - 112, - 172 - ], - "row": 2, - "column": 3 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-07/source.png", - "annotated": "/layout-reference/ref-07/annotated.png", - "background": "/layout-reference/ref-07/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "下沿环形文字", - "box": [ - 17, - 75, - 90, - 34 - ], - "text": null, - "direction": "curved", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T01.png", - "pixels": 160, - "underlay": "/layout-reference/ref-07/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "年份", - "box": [ - 2, - 129, - 27, - 12 - ], - "text": "2025", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-07/T02.png", - "pixels": 226, - "underlay": "/layout-reference/ref-07/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "年份下副标题", - "box": [ - 3, - 140, - 58, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T03.png", - "pixels": 168, - "underlay": "/layout-reference/ref-07/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部说明", - "box": [ - 1, - 146, - 109, - 16 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T04.png", - "pixels": 1217, - "underlay": "/layout-reference/ref-07/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右下品牌", - "box": [ - 58, - 161, - 52, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T05.png", - "pixels": 245, - "underlay": "/layout-reference/ref-07/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央圆形主图", - "box": [ - 18, - 9, - 92, - 94 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-07/I01.png", - "pixels": 6852, - "mask": "/layout-reference/ref-07/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "同心环线", - "box": [ - 0, - 0, - 112, - 138 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-07/D01.png", - "pixels": 5238 - } - ], - "ocr": [ - { - "box": [ - 0.026785715591931197, - 0.7558139533053403, - 0.23511904761904764, - 0.0678294573643411 - ], - "confidence": 1, - "text": "2025" - }, - { - "box": [ - 0.5292150606737416, - 0.9085944883228659, - 0.43264130183628624, - 0.05102807791658148 - ], - "confidence": 0.30000001192092896, - "text": "能車贤好雞 蓋羽毛" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 4 - } -} diff --git a/apps/wiki/public/layout-reference/ref-08/index.html b/apps/wiki/public/layout-reference/ref-08/index.html deleted file mode 100644 index ae8a607..0000000 --- a/apps/wiki/public/layout-reference/ref-08/index.html +++ /dev/null @@ -1,13 +0,0 @@ - -ref-08 · 双层满宽图与字距横栏

ref-08 / 双层满宽图与字距横栏

原图纸底与画框 -BULUBLUE -蓝羽毛设计 -DESIGNFOR2026 - - -构件标注

原图第 2 行、第 4 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-08/manifest.json b/apps/wiki/public/layout-reference/ref-08/manifest.json deleted file mode 100644 index 939e44d..0000000 --- a/apps/wiki/public/layout-reference/ref-08/manifest.json +++ /dev/null @@ -1,135 +0,0 @@ -{ - "id": "ref-08", - "name": "双层满宽图与字距横栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 227, - 113, - 173 - ], - "row": 2, - "column": 4 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-08/source.png", - "annotated": "/layout-reference/ref-08/annotated.png", - "background": "/layout-reference/ref-08/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "顶部英文刊头", - "box": [ - 0, - 0, - 111, - 14 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T01.png", - "pixels": 782, - "underlay": "/layout-reference/ref-08/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "顶部中文刊头", - "box": [ - 0, - 14, - 111, - 16 - ], - "text": "蓝羽毛设计", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T02.png", - "pixels": 732, - "underlay": "/layout-reference/ref-08/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中央字距标签", - "box": [ - 3, - 68, - 107, - 8 - ], - "text": "DESIGNFOR2026", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T03.png", - "pixels": 360, - "underlay": "/layout-reference/ref-08/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中部横向图片", - "box": [ - 4, - 31, - 102, - 36 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-08/I01.png", - "pixels": 3671, - "mask": "/layout-reference/ref-08/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下部大图", - "box": [ - 4, - 76, - 102, - 88 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-08/I02.png", - "pixels": 8975, - "mask": "/layout-reference/ref-08/I02-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.04129793275112562, - 0.01926782282729944, - 0.8938053097345132, - 0.06165703275529866 - ], - "confidence": 0.5, - "text": "BULUBLUE" - }, - { - "box": [ - 0.04129793395280237, - 0.07899807351316634, - 0.9115044247787611, - 0.08863198458574184 - ], - "confidence": 0.5, - "text": "蓝羽毛设计" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 0 - } -} diff --git a/apps/wiki/public/layout-reference/ref-09/index.html b/apps/wiki/public/layout-reference/ref-09/index.html deleted file mode 100644 index 83142c4..0000000 --- a/apps/wiki/public/layout-reference/ref-09/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-09 · 左侧分字标题与右侧长图

ref-09 / 左侧分字标题与右侧长图

原图纸底与画框 -版 -左侧小字组(未辨识原字形) -式 -底部左侧竖字(未辨识原字形) -底部日期标识(未辨识原字形) - - - -构件标注

原图第 2 行、第 5 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-09/manifest.json b/apps/wiki/public/layout-reference/ref-09/manifest.json deleted file mode 100644 index 84df58e..0000000 --- a/apps/wiki/public/layout-reference/ref-09/manifest.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "id": "ref-09", - "name": "左侧分字标题与右侧长图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 227, - 113, - 173 - ], - "row": 2, - "column": 5 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-09/source.png", - "annotated": "/layout-reference/ref-09/annotated.png", - "background": "/layout-reference/ref-09/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 7, - 16, - 19, - 19 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-09/T01.png", - "pixels": 195, - "underlay": "/layout-reference/ref-09/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧小字组", - "box": [ - 8, - 37, - 24, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T02.png", - "pixels": 162, - "underlay": "/layout-reference/ref-09/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左中大字", - "box": [ - 8, - 65, - 17, - 15 - ], - "text": "式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-09/T03.png", - "pixels": 93, - "underlay": "/layout-reference/ref-09/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部左侧竖字", - "box": [ - 2, - 142, - 15, - 29 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T04.png", - "pixels": 150, - "underlay": "/layout-reference/ref-09/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部日期标识", - "box": [ - 40, - 136, - 60, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T05.png", - "pixels": 186, - "underlay": "/layout-reference/ref-09/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右侧竖长图片", - "box": [ - 38, - 14, - 65, - 109 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/I01.png", - "pixels": 6978, - "mask": "/layout-reference/ref-09/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "底部上横线组", - "box": [ - 40, - 144, - 55, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/D01.png", - "pixels": 318 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部双线", - "box": [ - 41, - 157, - 61, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/D02.png", - "pixels": 305 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 3 - } -} diff --git a/apps/wiki/public/layout-reference/ref-10/index.html b/apps/wiki/public/layout-reference/ref-10/index.html deleted file mode 100644 index a3e339e..0000000 --- a/apps/wiki/public/layout-reference/ref-10/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-10 · 半页深底与裁切英文 blue

ref-10 / 半页深底与裁切英文 blue

原图纸底与画框 -blue -英文上方小标签(未辨识原字形) -深底居中说明(未辨识原字形) - - - -构件标注

原图第 2 行、第 6 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-10/manifest.json b/apps/wiki/public/layout-reference/ref-10/manifest.json deleted file mode 100644 index 9a17ab3..0000000 --- a/apps/wiki/public/layout-reference/ref-10/manifest.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "id": "ref-10", - "name": "半页深底与裁切英文 blue", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 227, - 113, - 173 - ], - "row": 2, - "column": 6 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-10/source.png", - "annotated": "/layout-reference/ref-10/annotated.png", - "background": "/layout-reference/ref-10/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "裁切英文标题", - "box": [ - 0, - 49, - 85, - 32 - ], - "text": "blue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-10/T01.png", - "pixels": 1504, - "underlay": "/layout-reference/ref-10/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "英文上方小标签", - "box": [ - 10, - 46, - 73, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-10/T02.png", - "pixels": 105, - "underlay": "/layout-reference/ref-10/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "深底居中说明", - "box": [ - 25, - 144, - 61, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-10/T03.png", - "pixels": 398, - "underlay": "/layout-reference/ref-10/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "下半页深色图片区", - "box": [ - 1, - 81, - 110, - 91 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/I01.png", - "pixels": 9284, - "mask": "/layout-reference/ref-10/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上角标", - "box": [ - 0, - 4, - 10, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/D01.png", - "pixels": 21 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右上角标", - "box": [ - 103, - 4, - 10, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/D02.png", - "pixels": 23 - } - ], - "ocr": [ - { - "box": [ - 1.2867459860650037e-9, - 0.32755298650587994, - 0.7463126843657818, - 0.1502890173410405 - ], - "confidence": 0.30000001192092896, - "text": "DUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-11/index.html b/apps/wiki/public/layout-reference/ref-11/index.html deleted file mode 100644 index a2103fd..0000000 --- a/apps/wiki/public/layout-reference/ref-11/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-11 · 左上双行标题与右下主图

ref-11 / 左上双行标题与右下主图

原图纸底与画框 -蓝羽毛 -版式灵感 -右上小标签(未辨识原字形) -右上信息组(未辨识原字形) -右中短标识(未辨识原字形) -左下脚注(未辨识原字形) - - -构件标注

原图第 3 行、第 2 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-11/manifest.json b/apps/wiki/public/layout-reference/ref-11/manifest.json deleted file mode 100644 index 8bc78de..0000000 --- a/apps/wiki/public/layout-reference/ref-11/manifest.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "id": "ref-11", - "name": "左上双行标题与右下主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 410, - 114, - 173 - ], - "row": 3, - "column": 2 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-11/source.png", - "annotated": "/layout-reference/ref-11/annotated.png", - "background": "/layout-reference/ref-11/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "第一行标题", - "box": [ - 0, - 4, - 54, - 22 - ], - "text": "蓝羽毛", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-11/T01.png", - "pixels": 643, - "underlay": "/layout-reference/ref-11/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "第二行标题", - "box": [ - 0, - 27, - 72, - 23 - ], - "text": "版式灵感", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-11/T02.png", - "pixels": 884, - "underlay": "/layout-reference/ref-11/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右上小标签", - "box": [ - 84, - 2, - 5, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T03.png", - "pixels": 23, - "underlay": "/layout-reference/ref-11/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右上信息组", - "box": [ - 81, - 20, - 23, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T04.png", - "pixels": 145, - "underlay": "/layout-reference/ref-11/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右中短标识", - "box": [ - 82, - 55, - 23, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T05.png", - "pixels": 38, - "underlay": "/layout-reference/ref-11/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "左下脚注", - "box": [ - 0, - 158, - 32, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T06.png", - "pixels": 112, - "underlay": "/layout-reference/ref-11/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下主图", - "box": [ - 47, - 68, - 60, - 94 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-11/I01.png", - "pixels": 5640, - "mask": "/layout-reference/ref-11/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左中横线组", - "box": [ - 15, - 91, - 23, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-11/D01.png", - "pixels": 373 - } - ], - "ocr": [ - { - "box": [ - 0.0029239778265106767, - 0.04431599267822739, - 0.4766081871345029, - 0.11560693641618491 - ], - "confidence": 1, - "text": "蓝羽毛" - }, - { - "box": [ - 0.026110667628392013, - 0.17872041532632799, - 0.6085973817702622, - 0.11654760842148737 - ], - "confidence": 1, - "text": "版式灵感" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 4 - } -} diff --git a/apps/wiki/public/layout-reference/ref-12/index.html b/apps/wiki/public/layout-reference/ref-12/index.html deleted file mode 100644 index a387dd7..0000000 --- a/apps/wiki/public/layout-reference/ref-12/index.html +++ /dev/null @@ -1,19 +0,0 @@ - -ref-12 · 三图模块与左侧分散字框

ref-12 / 三图模块与左侧分散字框

原图纸底与画框 - -版 -蓝羽毛の设计 -式 -分格图注(未辨识原字形) -底部说明(未辨识原字形) - - - - - -构件标注

原图第 3 行、第 3 列;112×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-12/manifest.json b/apps/wiki/public/layout-reference/ref-12/manifest.json deleted file mode 100644 index e6f6d3f..0000000 --- a/apps/wiki/public/layout-reference/ref-12/manifest.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "id": "ref-12", - "name": "三图模块与左侧分散字框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 409, - 112, - 173 - ], - "row": 3, - "column": 3 - }, - "width": 112, - "height": 173, - "reference": "/layout-reference/ref-12/source.png", - "annotated": "/layout-reference/ref-12/annotated.png", - "background": "/layout-reference/ref-12/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "左下水平分隔", - "box": [ - 0, - 146, - 31, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D01.png", - "pixels": 61 - }, - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 0, - 0, - 32, - 39 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-12/T01.png", - "pixels": 580, - "underlay": "/layout-reference/ref-12/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧竖向副题", - "box": [ - 6, - 53, - 13, - 66 - ], - "text": "蓝羽毛の设计", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-12/T02.png", - "pixels": 487, - "underlay": "/layout-reference/ref-12/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左下大字", - "box": [ - 0, - 138, - 32, - 33 - ], - "text": "式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-12/T03.png", - "pixels": 359, - "underlay": "/layout-reference/ref-12/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "分格图注", - "box": [ - 24, - 132, - 87, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-12/T04.png", - "pixels": 172, - "underlay": "/layout-reference/ref-12/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部说明", - "box": [ - 35, - 157, - 76, - 13 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-12/T05.png", - "pixels": 632, - "underlay": "/layout-reference/ref-12/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右上主图", - "box": [ - 24, - 18, - 85, - 74 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I01.png", - "pixels": 6212, - "mask": "/layout-reference/ref-12/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方左图片", - "box": [ - 24, - 94, - 53, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I02.png", - "pixels": 1961, - "mask": "/layout-reference/ref-12/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "下方右图片", - "box": [ - 79, - 94, - 30, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I03.png", - "pixels": 1110, - "mask": "/layout-reference/ref-12/I03-mask.png" - }, - { - "id": "D02", - "kind": "decoration", - "role": "顶部短横线组", - "box": [ - 46, - 6, - 54, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D02.png", - "pixels": 266 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部中横线组", - "box": [ - 35, - 141, - 65, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D03.png", - "pixels": 697 - } - ], - "ocr": [ - { - "box": [ - 0.014880952149470902, - -3.67515795574036e-10, - 0.2678571428571429, - 0.19845857418111745 - ], - "confidence": 1, - "text": "版" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19376, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-13/index.html b/apps/wiki/public/layout-reference/ref-13/index.html deleted file mode 100644 index b762188..0000000 --- a/apps/wiki/public/layout-reference/ref-13/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-13 · 横题与右侧出血扁椭圆

ref-13 / 横题与右侧出血扁椭圆

原图纸底与画框 -版式 -灵感 -标题中央微字(未辨识原字形) -左下分行说明(未辨识原字形) -底部信息(未辨识原字形) - -构件标注

原图第 3 行、第 4 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-13/manifest.json b/apps/wiki/public/layout-reference/ref-13/manifest.json deleted file mode 100644 index 71c8fc5..0000000 --- a/apps/wiki/public/layout-reference/ref-13/manifest.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "id": "ref-13", - "name": "横题与右侧出血扁椭圆", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 410, - 114, - 173 - ], - "row": 3, - "column": 4 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-13/source.png", - "annotated": "/layout-reference/ref-13/annotated.png", - "background": "/layout-reference/ref-13/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "顶部左标题", - "box": [ - 8, - 12, - 35, - 16 - ], - "text": "版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-13/T01.png", - "pixels": 316, - "underlay": "/layout-reference/ref-13/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "顶部右标题", - "box": [ - 70, - 12, - 34, - 16 - ], - "text": "灵感", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-13/T02.png", - "pixels": 343, - "underlay": "/layout-reference/ref-13/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "标题中央微字", - "box": [ - 48, - 14, - 16, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T03.png", - "pixels": 62, - "underlay": "/layout-reference/ref-13/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下分行说明", - "box": [ - 8, - 100, - 29, - 48 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T04.png", - "pixels": 646, - "underlay": "/layout-reference/ref-13/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部信息", - "box": [ - 4, - 162, - 103, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T05.png", - "pixels": 248, - "underlay": "/layout-reference/ref-13/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右侧扁椭圆主图", - "box": [ - 8, - 31, - 103, - 119 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-13/I01.png", - "pixels": 8615, - "mask": "/layout-reference/ref-13/I01-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.07309941752558477, - 0.06743737990125243, - 0.8421052631578948, - 0.10404624277456653 - ], - "confidence": 0.30000001192092896, - "text": "版式=灵感" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 3 - } -} diff --git a/apps/wiki/public/layout-reference/ref-14/index.html b/apps/wiki/public/layout-reference/ref-14/index.html deleted file mode 100644 index d0a171a..0000000 --- a/apps/wiki/public/layout-reference/ref-14/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-14 · 大矩形与小方图及居中横题

ref-14 / 大矩形与小方图及居中横题

原图纸底与画框 -蓝羽毛 版式灵感设计分享 -中部辅助标签(未辨识原字形) -底部两处标识(未辨识原字形) - - - -构件标注

原图第 3 行、第 5 列;113×174 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-14/manifest.json b/apps/wiki/public/layout-reference/ref-14/manifest.json deleted file mode 100644 index 1c444b4..0000000 --- a/apps/wiki/public/layout-reference/ref-14/manifest.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "id": "ref-14", - "name": "大矩形与小方图及居中横题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 409, - 113, - 174 - ], - "row": 3, - "column": 5 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-14/source.png", - "annotated": "/layout-reference/ref-14/annotated.png", - "background": "/layout-reference/ref-14/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "中部横向主标题", - "box": [ - 9, - 77, - 91, - 11 - ], - "text": "蓝羽毛 版式灵感设计分享", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-14/T01.png", - "pixels": 495, - "underlay": "/layout-reference/ref-14/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中部辅助标签", - "box": [ - 11, - 93, - 40, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-14/T02.png", - "pixels": 147, - "underlay": "/layout-reference/ref-14/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部两处标识", - "box": [ - 9, - 147, - 80, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-14/T03.png", - "pixels": 178, - "underlay": "/layout-reference/ref-14/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 9, - 11, - 68, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/I01.png", - "pixels": 4421, - "mask": "/layout-reference/ref-14/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右下小图", - "box": [ - 57, - 94, - 44, - 38 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/I02.png", - "pixels": 1672, - "mask": "/layout-reference/ref-14/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "右上细线阶梯", - "box": [ - 81, - 11, - 21, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/D01.png", - "pixels": 217 - } - ], - "ocr": [ - { - "box": [ - 0.07374630927974439, - 0.45785440622605367, - 0.817109144542773, - 0.04980842911877392 - ], - "confidence": 0.30000001192092896, - "text": "置羽毛 版式煲感设计分享" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-15/index.html b/apps/wiki/public/layout-reference/ref-15/index.html deleted file mode 100644 index 66b1bb7..0000000 --- a/apps/wiki/public/layout-reference/ref-15/index.html +++ /dev/null @@ -1,15 +0,0 @@ - -ref-15 · 英文双行刊头与四分之一圆图

ref-15 / 英文双行刊头与四分之一圆图

原图纸底与画框 -bulublue -design -右上说明(未辨识原字形) -BULUBLUE DESIGN - - - -构件标注

原图第 3 行、第 6 列;112×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-15/manifest.json b/apps/wiki/public/layout-reference/ref-15/manifest.json deleted file mode 100644 index 5740a26..0000000 --- a/apps/wiki/public/layout-reference/ref-15/manifest.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "id": "ref-15", - "name": "英文双行刊头与四分之一圆图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 409, - 112, - 173 - ], - "row": 3, - "column": 6 - }, - "width": 112, - "height": 173, - "reference": "/layout-reference/ref-15/source.png", - "annotated": "/layout-reference/ref-15/annotated.png", - "background": "/layout-reference/ref-15/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "英文第一行", - "box": [ - 6, - 5, - 75, - 19 - ], - "text": "bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T01.png", - "pixels": 477, - "underlay": "/layout-reference/ref-15/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "英文第二行", - "box": [ - 6, - 25, - 60, - 18 - ], - "text": "design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T02.png", - "pixels": 524, - "underlay": "/layout-reference/ref-15/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右上说明", - "box": [ - 82, - 4, - 26, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-15/T03.png", - "pixels": 164, - "underlay": "/layout-reference/ref-15/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部品牌与角标", - "box": [ - 1, - 164, - 109, - 8 - ], - "text": "BULUBLUE DESIGN", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T04.png", - "pixels": 354, - "underlay": "/layout-reference/ref-15/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上部弧面主图", - "box": [ - 3, - 26, - 104, - 82 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I01.png", - "pixels": 7070, - "mask": "/layout-reference/ref-15/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方左图片", - "box": [ - 3, - 108, - 65, - 52 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I02.png", - "pixels": 3337, - "mask": "/layout-reference/ref-15/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "下方右图片", - "box": [ - 70, - 108, - 36, - 51 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I03.png", - "pixels": 1836, - "mask": "/layout-reference/ref-15/I03-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.04371143600401779, - 0.05444647915103584, - 0.6863866533551897, - 0.08956561520379858 - ], - "confidence": 1, - "text": "bulublue" - }, - { - "box": [ - 0.04360773550246531, - 0.1459897803830712, - 0.5169511976696195, - 0.10108402377148817 - ], - "confidence": 1, - "text": "design" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19376, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-16/index.html b/apps/wiki/public/layout-reference/ref-16/index.html deleted file mode 100644 index 0358b53..0000000 --- a/apps/wiki/public/layout-reference/ref-16/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-16 · 上下灰阶色带与底部白区

ref-16 / 上下灰阶色带与底部白区

原图纸底与画框 -高级版式 -蓝羽毛版式 -底部右说明(未辨识原字形) -底部右脚注(未辨识原字形) - - -构件标注

原图第 4 行、第 1 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-16/manifest.json b/apps/wiki/public/layout-reference/ref-16/manifest.json deleted file mode 100644 index 221c4a7..0000000 --- a/apps/wiki/public/layout-reference/ref-16/manifest.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "id": "ref-16", - "name": "上下灰阶色带与底部白区", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 592, - 113, - 173 - ], - "row": 4, - "column": 1 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-16/source.png", - "annotated": "/layout-reference/ref-16/annotated.png", - "background": "/layout-reference/ref-16/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右上竖字", - "box": [ - 83, - 14, - 6, - 25 - ], - "text": "高级版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-16/T01.png", - "pixels": 123, - "underlay": "/layout-reference/ref-16/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "底部左标题", - "box": [ - 9, - 119, - 32, - 3 - ], - "text": "蓝羽毛版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-16/T02.png", - "pixels": 71, - "underlay": "/layout-reference/ref-16/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部右说明", - "box": [ - 51, - 130, - 45, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-16/T03.png", - "pixels": 527, - "underlay": "/layout-reference/ref-16/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部右脚注", - "box": [ - 51, - 155, - 49, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-16/T04.png", - "pixels": 144, - "underlay": "/layout-reference/ref-16/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上部浅色图片区", - "box": [ - 1, - 1, - 109, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-16/I01.png", - "pixels": 5654, - "mask": "/layout-reference/ref-16/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中部深色图片区", - "box": [ - 1, - 54, - 109, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-16/I02.png", - "pixels": 5777, - "mask": "/layout-reference/ref-16/I02-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.08545858282579882, - 0.6702334819989704, - 0.2804102714786136, - 0.03718236140433073 - ], - "confidence": 0.30000001192092896, - "text": "經引毛飯式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-17/index.html b/apps/wiki/public/layout-reference/ref-17/index.html deleted file mode 100644 index c2d5ed9..0000000 --- a/apps/wiki/public/layout-reference/ref-17/index.html +++ /dev/null @@ -1,17 +0,0 @@ - -ref-17 · 英文刊头与圆形叠标及窄栏

ref-17 / 英文刊头与圆形叠标及窄栏

原图纸底与画框 - -Bulublue -Design -高级感版式. -右侧窄栏正文(未辨识原字形) - - - - -构件标注

原图第 4 行、第 2 列;113×174 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-17/manifest.json b/apps/wiki/public/layout-reference/ref-17/manifest.json deleted file mode 100644 index 6dec2b6..0000000 --- a/apps/wiki/public/layout-reference/ref-17/manifest.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "id": "ref-17", - "name": "英文刊头与圆形叠标及窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 591, - 113, - 174 - ], - "row": 4, - "column": 2 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-17/source.png", - "annotated": "/layout-reference/ref-17/annotated.png", - "background": "/layout-reference/ref-17/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "右栏底线", - "box": [ - 82, - 121, - 29, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D01.png", - "pixels": 30 - }, - { - "id": "T01", - "kind": "text", - "role": "左上英文第一行", - "box": [ - 6, - 10, - 63, - 10 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T01.png", - "pixels": 277, - "underlay": "/layout-reference/ref-17/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左上英文第二行", - "box": [ - 5, - 20, - 56, - 16 - ], - "text": "Design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T02.png", - "pixels": 423, - "underlay": "/layout-reference/ref-17/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中部中文横题", - "box": [ - 51, - 50, - 60, - 16 - ], - "text": "高级感版式.", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T03.png", - "pixels": 459, - "underlay": "/layout-reference/ref-17/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧窄栏正文", - "box": [ - 82, - 67, - 29, - 54 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-17/T04.png", - "pixels": 329, - "underlay": "/layout-reference/ref-17/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左下主图", - "box": [ - 5, - 68, - 73, - 101 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/I01.png", - "pixels": 7161, - "mask": "/layout-reference/ref-17/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "左中叠加圆形", - "box": [ - 5, - 53, - 22, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/I02.png", - "pixels": 372, - "mask": "/layout-reference/ref-17/I02-mask.png" - }, - { - "id": "D02", - "kind": "decoration", - "role": "刊头右侧双线", - "box": [ - 61, - 27, - 50, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D02.png", - "pixels": 253 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部横向贴条", - "box": [ - 58, - 167, - 54, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D03.png", - "pixels": 324 - } - ], - "ocr": [ - { - "box": [ - 0.05014749428466078, - 0.0651340998323755, - 0.5663716814159292, - 0.06896551724137923 - ], - "confidence": 1, - "text": "Bulublue" - }, - { - "box": [ - 0.04661209192494646, - 0.1362427019870669, - 0.4878967645245668, - 0.07617359965240367 - ], - "confidence": 0.30000001192092896, - "text": "Design" - }, - { - "box": [ - 0.447888041843808, - 0.30109252421060173, - 0.5496516494976031, - 0.07597587117746873 - ], - "confidence": 0.5, - "text": "高级感版式," - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-18/index.html b/apps/wiki/public/layout-reference/ref-18/index.html deleted file mode 100644 index 4cd5e8b..0000000 --- a/apps/wiki/public/layout-reference/ref-18/index.html +++ /dev/null @@ -1,15 +0,0 @@ - -ref-18 · 上大图与下方英文双行

ref-18 / 上大图与下方英文双行

原图纸底与画框 -左上微标识(未辨识原字形) -Bulublue -Design -底部短信息组(未辨识原字形) - - - -构件标注

原图第 4 行、第 3 列;113×174 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-18/manifest.json b/apps/wiki/public/layout-reference/ref-18/manifest.json deleted file mode 100644 index d0628bd..0000000 --- a/apps/wiki/public/layout-reference/ref-18/manifest.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "id": "ref-18", - "name": "上大图与下方英文双行", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 591, - 113, - 174 - ], - "row": 4, - "column": 3 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-18/source.png", - "annotated": "/layout-reference/ref-18/annotated.png", - "background": "/layout-reference/ref-18/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上微标识", - "box": [ - 0, - 4, - 8, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-18/T01.png", - "pixels": 34, - "underlay": "/layout-reference/ref-18/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "下方英文第一行", - "box": [ - 5, - 108, - 75, - 17 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-18/T02.png", - "pixels": 471, - "underlay": "/layout-reference/ref-18/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "下方英文第二行", - "box": [ - 5, - 125, - 74, - 17 - ], - "text": "Design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-18/T03.png", - "pixels": 435, - "underlay": "/layout-reference/ref-18/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部短信息组", - "box": [ - 2, - 155, - 102, - 16 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-18/T04.png", - "pixels": 418, - "underlay": "/layout-reference/ref-18/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方主图", - "box": [ - 19, - 6, - 88, - 91 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/I01.png", - "pixels": 7995, - "mask": "/layout-reference/ref-18/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左侧竖向刻度", - "box": [ - 0, - 65, - 5, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/D01.png", - "pixels": 112 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下椭圆线组", - "box": [ - 76, - 128, - 34, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/D02.png", - "pixels": 441 - } - ], - "ocr": [ - { - "box": [ - 0.03818345576318917, - 0.6239403036164336, - 0.6846950384719533, - 0.08353701770534006 - ], - "confidence": 0.5, - "text": "Bulublue" - }, - { - "box": [ - 0.03602924893711706, - 0.6949484790717884, - 0.7361454921486105, - 0.14112464495545596 - ], - "confidence": 0.30000001192092896, - "text": "Design m" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-19/index.html b/apps/wiki/public/layout-reference/ref-19/index.html deleted file mode 100644 index ac34dd6..0000000 --- a/apps/wiki/public/layout-reference/ref-19/index.html +++ /dev/null @@ -1,20 +0,0 @@ - -ref-19 · 四角大字与中央双圆竖题

ref-19 / 四角大字与中央双圆竖题

原图纸底与画框 -高 -级 -排 -版 -蓝羽毛の版式灵感 -右侧竖向微字(未辨识原字形) - - - - - - -构件标注

原图第 4 行、第 4 列;113×171 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-19/manifest.json b/apps/wiki/public/layout-reference/ref-19/manifest.json deleted file mode 100644 index 20642d5..0000000 --- a/apps/wiki/public/layout-reference/ref-19/manifest.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "id": "ref-19", - "name": "四角大字与中央双圆竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 593, - 113, - 171 - ], - "row": 4, - "column": 4 - }, - "width": 113, - "height": 171, - "reference": "/layout-reference/ref-19/source.png", - "annotated": "/layout-reference/ref-19/annotated.png", - "background": "/layout-reference/ref-19/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 1, - 1, - 31, - 36 - ], - "text": "高", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T01.png", - "pixels": 401, - "underlay": "/layout-reference/ref-19/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右上大字", - "box": [ - 78, - 0, - 33, - 37 - ], - "text": "级", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T02.png", - "pixels": 455, - "underlay": "/layout-reference/ref-19/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左下大字", - "box": [ - 1, - 132, - 35, - 39 - ], - "text": "排", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T03.png", - "pixels": 511, - "underlay": "/layout-reference/ref-19/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右下大字", - "box": [ - 77, - 133, - 35, - 38 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T04.png", - "pixels": 590, - "underlay": "/layout-reference/ref-19/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "中央竖排标题", - "box": [ - 49, - 37, - 17, - 87 - ], - "text": "蓝羽毛の版式灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-19/T05.png", - "pixels": 482, - "underlay": "/layout-reference/ref-19/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "右侧竖向微字", - "box": [ - 103, - 50, - 9, - 57 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-19/T06.png", - "pixels": 303, - "underlay": "/layout-reference/ref-19/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "顶部出血椭圆", - "box": [ - 1, - 1, - 109, - 58 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I01.png", - "pixels": 4172, - "mask": "/layout-reference/ref-19/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中央圆形图位", - "box": [ - 27, - 44, - 58, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I02.png", - "pixels": 2238, - "mask": "/layout-reference/ref-19/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "底部小椭圆", - "box": [ - 45, - 135, - 22, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I03.png", - "pixels": 283, - "mask": "/layout-reference/ref-19/I03-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "中部左线组", - "box": [ - 0, - 105, - 47, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D01.png", - "pixels": 818 - }, - { - "id": "D02", - "kind": "decoration", - "role": "中部右线组", - "box": [ - 68, - 112, - 39, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D02.png", - "pixels": 435 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部短线", - "box": [ - 43, - 157, - 26, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D03.png", - "pixels": 76 - } - ], - "ocr": [ - { - "box": [ - 0.04129793498384601, - 0.015594541432284448, - 0.22713864306784656, - 0.2007797270955165 - ], - "confidence": 1, - "text": "高" - }, - { - "box": [ - 0.03244837751659291, - 0.7076023384685672, - 0.23893805309734517, - 0.22807017543859653 - ], - "confidence": 1, - "text": "排" - }, - { - "box": [ - 0.6961651915855457, - -5.311890927117702e-10, - 0.23303834808259583, - 0.21247563352826515 - ], - "confidence": 1, - "text": "级" - }, - { - "box": [ - 0.7050147490689528, - 0.7173489271929825, - 0.2271386430678467, - 0.21832358674463936 - ], - "confidence": 1, - "text": "版" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19323, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-20/index.html b/apps/wiki/public/layout-reference/ref-20/index.html deleted file mode 100644 index 14a362c..0000000 --- a/apps/wiki/public/layout-reference/ref-20/index.html +++ /dev/null @@ -1,15 +0,0 @@ - -ref-20 · 右上大弧面与左下圆形标题

ref-20 / 右上大弧面与左下圆形标题

原图纸底与画框 -高级 -版式 -右下短注(未辨识原字形) - - - - -构件标注

原图第 4 行、第 5 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-20/manifest.json b/apps/wiki/public/layout-reference/ref-20/manifest.json deleted file mode 100644 index 7e43965..0000000 --- a/apps/wiki/public/layout-reference/ref-20/manifest.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "id": "ref-20", - "name": "右上大弧面与左下圆形标题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 592, - 114, - 173 - ], - "row": 4, - "column": 5 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-20/source.png", - "annotated": "/layout-reference/ref-20/annotated.png", - "background": "/layout-reference/ref-20/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "圆中第一行", - "box": [ - 22, - 102, - 36, - 15 - ], - "text": "高级", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-20/T01.png", - "pixels": 229, - "underlay": "/layout-reference/ref-20/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "圆中第二行", - "box": [ - 21, - 123, - 39, - 18 - ], - "text": "版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-20/T02.png", - "pixels": 219, - "underlay": "/layout-reference/ref-20/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右下短注", - "box": [ - 72, - 158, - 32, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-20/T03.png", - "pixels": 92, - "underlay": "/layout-reference/ref-20/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右上出血椭圆", - "box": [ - 19, - 1, - 94, - 124 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/I01.png", - "pixels": 9205, - "mask": "/layout-reference/ref-20/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "左下叠加圆", - "box": [ - 8, - 90, - 61, - 59 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/I02.png", - "pixels": 2269, - "mask": "/layout-reference/ref-20/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上竖线", - "box": [ - 8, - 18, - 4, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/D01.png", - "pixels": 211 - }, - { - "id": "D02", - "kind": "decoration", - "role": "左下竖线", - "box": [ - 29, - 151, - 3, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/D02.png", - "pixels": 48 - } - ], - "ocr": [ - { - "box": [ - 0.19446010141722203, - 0.583293929900469, - 0.3181837650767544, - 0.09925391724573618 - ], - "confidence": 0.30000001192092896, - "text": "高级" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-21/index.html b/apps/wiki/public/layout-reference/ref-21/index.html deleted file mode 100644 index 9db8c0d..0000000 --- a/apps/wiki/public/layout-reference/ref-21/index.html +++ /dev/null @@ -1,21 +0,0 @@ - -ref-21 · 右侧旋转英文与节点方图

ref-21 / 右侧旋转英文与节点方图

原图纸底与画框 -Bulublue -25 -03 -2025 -中下说明(未辨识原字形) -底部两块微字(未辨识原字形) - - - - - - - -构件标注

原图第 4 行、第 6 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-21/manifest.json b/apps/wiki/public/layout-reference/ref-21/manifest.json deleted file mode 100644 index 2951852..0000000 --- a/apps/wiki/public/layout-reference/ref-21/manifest.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "id": "ref-21", - "name": "右侧旋转英文与节点方图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 592, - 114, - 173 - ], - "row": 4, - "column": 6 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-21/source.png", - "annotated": "/layout-reference/ref-21/annotated.png", - "background": "/layout-reference/ref-21/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧旋转英文", - "box": [ - 87, - 2, - 25, - 109 - ], - "text": "Bulublue", - "direction": "rotated", - "reading": "verified", - "asset": "/layout-reference/ref-21/T01.png", - "pixels": 1020, - "underlay": "/layout-reference/ref-21/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左日期", - "box": [ - 1, - 108, - 14, - 11 - ], - "text": "25", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T02.png", - "pixels": 46, - "underlay": "/layout-reference/ref-21/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右日期", - "box": [ - 97, - 113, - 11, - 8 - ], - "text": "03", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T03.png", - "pixels": 59, - "underlay": "/layout-reference/ref-21/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右年份", - "box": [ - 85, - 124, - 23, - 9 - ], - "text": "2025", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T04.png", - "pixels": 116, - "underlay": "/layout-reference/ref-21/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "中下说明", - "box": [ - 3, - 128, - 67, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-21/T05.png", - "pixels": 287, - "underlay": "/layout-reference/ref-21/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "底部两块微字", - "box": [ - 5, - 147, - 75, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-21/T06.png", - "pixels": 603, - "underlay": "/layout-reference/ref-21/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 3, - 4, - 76, - 100 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/I01.png", - "pixels": 7379, - "mask": "/layout-reference/ref-21/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "底部灰色信息区", - "box": [ - 1, - 135, - 110, - 35 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/I02.png", - "pixels": 3138, - "mask": "/layout-reference/ref-21/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "上方圆节点", - "box": [ - 28, - 12, - 9, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D01.png", - "pixels": 64 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右上圆节点", - "box": [ - 75, - 29, - 11, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D02.png", - "pixels": 87 - }, - { - "id": "D03", - "kind": "decoration", - "role": "下方圆节点", - "box": [ - 46, - 99, - 11, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D03.png", - "pixels": 80 - }, - { - "id": "D04", - "kind": "decoration", - "role": "右下圆节点", - "box": [ - 97, - 101, - 11, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D04.png", - "pixels": 6 - }, - { - "id": "D05", - "kind": "decoration", - "role": "日期间椭圆线", - "box": [ - 17, - 112, - 77, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D05.png", - "pixels": 200 - } - ], - "ocr": [ - { - "box": [ - 0.03216374201388889, - 0.6512524085500964, - 0.10818713450292397, - 0.046242774566473965 - ], - "confidence": 1, - "text": "25" - }, - { - "box": [ - 0.7009572502841679, - 0.02139049098390966, - 0.2679496675904034, - 0.6943671018861391 - ], - "confidence": 0.30000001192092896, - "text": "Bulublue:" - }, - { - "box": [ - 0.7424248804406856, - 0.7201085946235993, - 0.2110566702502512, - 0.049185508478124196 - ], - "confidence": 1, - "text": "2025" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 2 - } -} diff --git a/apps/wiki/public/layout-reference/ref-22/index.html b/apps/wiki/public/layout-reference/ref-22/index.html deleted file mode 100644 index 74b4d3f..0000000 --- a/apps/wiki/public/layout-reference/ref-22/index.html +++ /dev/null @@ -1,17 +0,0 @@ - -ref-22 · 三段斜切背景与右侧白字

ref-22 / 三段斜切背景与右侧白字

原图纸底与画框 -蓝羽毛版式 -左上说明(未辨识原字形) -左中说明(未辨识原字形) -左下说明(未辨识原字形) -右下日期(未辨识原字形) -底部说明(未辨识原字形) - - - -构件标注

原图第 5 行、第 1 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-22/manifest.json b/apps/wiki/public/layout-reference/ref-22/manifest.json deleted file mode 100644 index 7a3d914..0000000 --- a/apps/wiki/public/layout-reference/ref-22/manifest.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "id": "ref-22", - "name": "三段斜切背景与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 774, - 113, - 173 - ], - "row": 5, - "column": 1 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-22/source.png", - "annotated": "/layout-reference/ref-22/annotated.png", - "background": "/layout-reference/ref-22/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖排主标题", - "box": [ - 82, - 0, - 29, - 146 - ], - "text": "蓝羽毛版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-22/T01.png", - "pixels": 3039, - "underlay": "/layout-reference/ref-22/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左上说明", - "box": [ - 4, - 37, - 35, - 11 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T02.png", - "pixels": 160, - "underlay": "/layout-reference/ref-22/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左中说明", - "box": [ - 2, - 74, - 35, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T03.png", - "pixels": 417, - "underlay": "/layout-reference/ref-22/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下说明", - "box": [ - 3, - 108, - 39, - 20 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T04.png", - "pixels": 430, - "underlay": "/layout-reference/ref-22/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右下日期", - "box": [ - 74, - 144, - 34, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T05.png", - "pixels": 209, - "underlay": "/layout-reference/ref-22/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "底部说明", - "box": [ - 3, - 155, - 62, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T06.png", - "pixels": 373, - "underlay": "/layout-reference/ref-22/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "顶部浅色斜切图", - "box": [ - 1, - 1, - 81, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I01.png", - "pixels": 4545, - "mask": "/layout-reference/ref-22/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中部深色斜带图", - "box": [ - 1, - 33, - 111, - 117 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I02.png", - "pixels": 5013, - "mask": "/layout-reference/ref-22/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "底部灰色斜切图", - "box": [ - 1, - 104, - 109, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I03.png", - "pixels": 4403, - "mask": "/layout-reference/ref-22/I03-mask.png" - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 5 - } -} diff --git a/apps/wiki/public/layout-reference/ref-23/index.html b/apps/wiki/public/layout-reference/ref-23/index.html deleted file mode 100644 index 53097d6..0000000 --- a/apps/wiki/public/layout-reference/ref-23/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-23 · 上方方图与中部大写英文

ref-23 / 上方方图与中部大写英文

原图纸底与画框 -右上标识(未辨识原字形) -主图下方左右标签(未辨识原字形) -BULUBLUE -英文下方四组微字(未辨识原字形) -底部三处标签(未辨识原字形) - -构件标注

原图第 5 行、第 2 列;114×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-23/manifest.json b/apps/wiki/public/layout-reference/ref-23/manifest.json deleted file mode 100644 index b99f4dd..0000000 --- a/apps/wiki/public/layout-reference/ref-23/manifest.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "id": "ref-23", - "name": "上方方图与中部大写英文", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 775, - 114, - 172 - ], - "row": 5, - "column": 2 - }, - "width": 114, - "height": 172, - "reference": "/layout-reference/ref-23/source.png", - "annotated": "/layout-reference/ref-23/annotated.png", - "background": "/layout-reference/ref-23/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右上标识", - "box": [ - 79, - 0, - 26, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T01.png", - "pixels": 85, - "underlay": "/layout-reference/ref-23/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "主图下方左右标签", - "box": [ - 1, - 72, - 78, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T02.png", - "pixels": 129, - "underlay": "/layout-reference/ref-23/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中部大英文", - "box": [ - 0, - 78, - 113, - 25 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-23/T03.png", - "pixels": 1533, - "underlay": "/layout-reference/ref-23/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "英文下方四组微字", - "box": [ - 0, - 104, - 109, - 21 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T04.png", - "pixels": 729, - "underlay": "/layout-reference/ref-23/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部三处标签", - "box": [ - 0, - 165, - 105, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T05.png", - "pixels": 285, - "underlay": "/layout-reference/ref-23/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上方图", - "box": [ - 5, - 4, - 74, - 68 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-23/I01.png", - "pixels": 5032, - "mask": "/layout-reference/ref-23/I01-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.01702461145837529, - 0.45011763555939854, - 0.9542548642521016, - 0.15596627819445708 - ], - "confidence": 1, - "text": "BULUBLUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19608, - "unreadableText": 4 - } -} diff --git a/apps/wiki/public/layout-reference/ref-24/index.html b/apps/wiki/public/layout-reference/ref-24/index.html deleted file mode 100644 index c24875b..0000000 --- a/apps/wiki/public/layout-reference/ref-24/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-24 · 斜排中文与倾斜装饰线框

ref-24 / 斜排中文与倾斜装饰线框

原图纸底与画框 -蓝羽毛版式 -标题下方斜微字(未辨识原字形) - - - - - - -构件标注

原图第 5 行、第 3 列;113×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-24/manifest.json b/apps/wiki/public/layout-reference/ref-24/manifest.json deleted file mode 100644 index 6b759e9..0000000 --- a/apps/wiki/public/layout-reference/ref-24/manifest.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "id": "ref-24", - "name": "斜排中文与倾斜装饰线框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 775, - 113, - 172 - ], - "row": 5, - "column": 3 - }, - "width": 113, - "height": 172, - "reference": "/layout-reference/ref-24/source.png", - "annotated": "/layout-reference/ref-24/annotated.png", - "background": "/layout-reference/ref-24/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "上方斜排标题", - "box": [ - 3, - 0, - 79, - 31 - ], - "text": "蓝羽毛版式", - "direction": "angled", - "reading": "verified", - "asset": "/layout-reference/ref-24/T01.png", - "pixels": 725, - "underlay": "/layout-reference/ref-24/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "标题下方斜微字", - "box": [ - 34, - 27, - 26, - 10 - ], - "text": null, - "direction": "angled", - "reading": "unreadable", - "asset": "/layout-reference/ref-24/T02.png", - "pixels": 91, - "underlay": "/layout-reference/ref-24/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央竖向主图", - "box": [ - 21, - 36, - 68, - 100 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/I01.png", - "pixels": 6799, - "mask": "/layout-reference/ref-24/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左侧斜长线", - "box": [ - 2, - 51, - 14, - 60 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D01.png", - "pixels": 190 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右侧斜长线", - "box": [ - 94, - 15, - 15, - 119 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D02.png", - "pixels": 624 - }, - { - "id": "D03", - "kind": "decoration", - "role": "左下斜向线组", - "box": [ - 13, - 136, - 57, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D03.png", - "pixels": 750 - }, - { - "id": "D04", - "kind": "decoration", - "role": "右下斜贴条组", - "box": [ - 64, - 149, - 42, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D04.png", - "pixels": 438 - }, - { - "id": "D05", - "kind": "decoration", - "role": "底边线", - "box": [ - 1, - 168, - 34, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D05.png", - "pixels": 68 - } - ], - "ocr": [ - { - "box": [ - 0.02748666679407777, - 0.00811422680517071, - 0.6144820131735113, - 0.19655708194703103 - ], - "confidence": 1, - "text": "蓝羽毛版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19436, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-25/index.html b/apps/wiki/public/layout-reference/ref-25/index.html deleted file mode 100644 index 73b3125..0000000 --- a/apps/wiki/public/layout-reference/ref-25/index.html +++ /dev/null @@ -1,14 +0,0 @@ - -ref-25 · 左侧竖题与右下方形主图

ref-25 / 左侧竖题与右下方形主图

原图纸底与画框 -高级·版式 -左侧辅助竖字(未辨识原字形) -右中说明(未辨识原字形) -左下边缘说明(未辨识原字形) - - -构件标注

原图第 5 行、第 4 列;113×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-25/manifest.json b/apps/wiki/public/layout-reference/ref-25/manifest.json deleted file mode 100644 index ee58f5a..0000000 --- a/apps/wiki/public/layout-reference/ref-25/manifest.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "id": "ref-25", - "name": "左侧竖题与右下方形主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 774, - 113, - 173 - ], - "row": 5, - "column": 4 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-25/source.png", - "annotated": "/layout-reference/ref-25/annotated.png", - "background": "/layout-reference/ref-25/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左侧竖题", - "box": [ - 8, - 39, - 8, - 46 - ], - "text": "高级·版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-25/T01.png", - "pixels": 233, - "underlay": "/layout-reference/ref-25/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧辅助竖字", - "box": [ - 20, - 41, - 5, - 21 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T02.png", - "pixels": 51, - "underlay": "/layout-reference/ref-25/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右中说明", - "box": [ - 89, - 42, - 22, - 51 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T03.png", - "pixels": 397, - "underlay": "/layout-reference/ref-25/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下边缘说明", - "box": [ - 15, - 132, - 1, - 11 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T04.png", - "pixels": 3, - "underlay": "/layout-reference/ref-25/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下主图", - "box": [ - 14, - 102, - 94, - 65 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-25/I01.png", - "pixels": 6010, - "mask": "/layout-reference/ref-25/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上阶梯横线", - "box": [ - 4, - 1, - 39, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-25/D01.png", - "pixels": 481 - } - ], - "ocr": [ - { - "box": [ - 0.06489673813555782, - 0.23121387201950871, - 0.08259590677807113, - 0.2601156069364161 - ], - "confidence": 0.30000001192092896, - "text": "高設•版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 3 - } -} diff --git a/apps/wiki/public/layout-reference/ref-26/index.html b/apps/wiki/public/layout-reference/ref-26/index.html deleted file mode 100644 index 2516c48..0000000 --- a/apps/wiki/public/layout-reference/ref-26/index.html +++ /dev/null @@ -1,19 +0,0 @@ - -ref-26 · 三行英文与曲线指引小图

ref-26 / 三行英文与曲线指引小图

原图纸底与画框 - - -Format 58 -Bulubl -Bulublue -高级版式 -左下说明(未辨识原字形) - - - - -构件标注

原图第 5 行、第 5 列;114×173 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-26/manifest.json b/apps/wiki/public/layout-reference/ref-26/manifest.json deleted file mode 100644 index be8279e..0000000 --- a/apps/wiki/public/layout-reference/ref-26/manifest.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "id": "ref-26", - "name": "三行英文与曲线指引小图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 774, - 114, - 173 - ], - "row": 5, - "column": 5 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-26/source.png", - "annotated": "/layout-reference/ref-26/annotated.png", - "background": "/layout-reference/ref-26/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "第二行下划线", - "box": [ - 0, - 41, - 47, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D01.png", - "pixels": 7 - }, - { - "id": "D02", - "kind": "decoration", - "role": "第三行下划线", - "box": [ - 0, - 58, - 67, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D02.png", - "pixels": 134 - }, - { - "id": "T01", - "kind": "text", - "role": "第一行英文", - "box": [ - 0, - 0, - 81, - 18 - ], - "text": "Format 58", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T01.png", - "pixels": 657, - "underlay": "/layout-reference/ref-26/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "第二行英文", - "box": [ - 0, - 23, - 49, - 18 - ], - "text": "Bulubl", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T02.png", - "pixels": 433, - "underlay": "/layout-reference/ref-26/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "第三行英文", - "box": [ - 0, - 41, - 68, - 19 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T03.png", - "pixels": 574, - "underlay": "/layout-reference/ref-26/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧竖排标题", - "box": [ - 98, - 68, - 12, - 46 - ], - "text": "高级版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-26/T04.png", - "pixels": 374, - "underlay": "/layout-reference/ref-26/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "左下说明", - "box": [ - 4, - 140, - 44, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-26/T05.png", - "pixels": 888, - "underlay": "/layout-reference/ref-26/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下方形图片", - "box": [ - 66, - 118, - 43, - 50 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/I01.png", - "pixels": 2150, - "mask": "/layout-reference/ref-26/I01-mask.png" - }, - { - "id": "D03", - "kind": "decoration", - "role": "中间分隔线", - "box": [ - 0, - 60, - 112, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D03.png", - "pixels": 230 - }, - { - "id": "D04", - "kind": "decoration", - "role": "中央自由曲线", - "box": [ - 6, - 48, - 85, - 87 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D04.png", - "pixels": 534 - }, - { - "id": "D05", - "kind": "decoration", - "role": "自动识别细线", - "box": [ - 91, - 59, - 19, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D05.png", - "pixels": 19 - } - ], - "ocr": [ - { - "box": [ - 0.011695904385964868, - 0.017341040546724473, - 0.6549707602339181, - 0.07707129094412335 - ], - "confidence": 0.5, - "text": "Format 58" - }, - { - "box": [ - 0.01461988470535311, - 0.14065510587668595, - 0.4327485380116959, - 0.08285163776493254 - ], - "confidence": 0.5, - "text": "Bulubl" - }, - { - "box": [ - 0.017385159403405345, - 0.23650755152999758, - 0.5821887456882767, - 0.08382497357495267 - ], - "confidence": 1, - "text": "Bulublue" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 1 - } -} diff --git a/apps/wiki/public/layout-reference/ref-27/index.html b/apps/wiki/public/layout-reference/ref-27/index.html deleted file mode 100644 index f0dae63..0000000 --- a/apps/wiki/public/layout-reference/ref-27/index.html +++ /dev/null @@ -1,16 +0,0 @@ - -ref-27 · 对角双区与斜向文字带

ref-27 / 对角双区与斜向文字带

原图纸底与画框 -高级の版式 -蓝羽毛·版式 -底部说明(未辨识原字形) - - - - - -构件标注

原图第 5 行、第 6 列;112×172 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

diff --git a/apps/wiki/public/layout-reference/ref-27/manifest.json b/apps/wiki/public/layout-reference/ref-27/manifest.json deleted file mode 100644 index 24e9698..0000000 --- a/apps/wiki/public/layout-reference/ref-27/manifest.json +++ /dev/null @@ -1,173 +0,0 @@ -{ - "id": "ref-27", - "name": "对角双区与斜向文字带", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 618, - 774, - 112, - 172 - ], - "row": 5, - "column": 6 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-27/source.png", - "annotated": "/layout-reference/ref-27/annotated.png", - "background": "/layout-reference/ref-27/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左侧白色竖题", - "box": [ - 6, - 7, - 12, - 86 - ], - "text": "高级の版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-27/T01.png", - "pixels": 396, - "underlay": "/layout-reference/ref-27/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中部斜向文字", - "box": [ - 3, - 77, - 109, - 37 - ], - "text": "蓝羽毛·版式", - "direction": "angled", - "reading": "verified", - "asset": "/layout-reference/ref-27/T02.png", - "pixels": 273, - "underlay": "/layout-reference/ref-27/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部说明", - "box": [ - 0, - 157, - 112, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-27/T03.png", - "pixels": 865, - "underlay": "/layout-reference/ref-27/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方三角出血图", - "box": [ - 1, - 1, - 108, - 89 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/I01.png", - "pixels": 6738, - "mask": "/layout-reference/ref-27/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方斜切图", - "box": [ - 1, - 91, - 108, - 68 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/I02.png", - "pixels": 4949, - "mask": "/layout-reference/ref-27/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "顶部右阶梯横线", - "box": [ - 61, - 0, - 48, - 20 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D01.png", - "pixels": 581 - }, - { - "id": "D02", - "kind": "decoration", - "role": "中部斜向浅带", - "box": [ - 0, - 72, - 112, - 40 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D02.png", - "pixels": 2000 - }, - { - "id": "D03", - "kind": "decoration", - "role": "左下阶梯横线", - "box": [ - 0, - 145, - 42, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D03.png", - "pixels": 391 - } - ], - "ocr": [ - { - "box": [ - -0.021385720300243924, - 0.4385955087605439, - 0.8388941628592355, - 0.20254762043324548 - ], - "confidence": 0.5, - "text": "蓝羽毛-版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 1 - } -} diff --git a/apps/wiki/scripts/build-reference-layout-demos.ts b/apps/wiki/scripts/build-reference-layout-demos.ts deleted file mode 100644 index 0280e49..0000000 --- a/apps/wiki/scripts/build-reference-layout-demos.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {readFile,writeFile,mkdir} from 'node:fs/promises'; -import path from 'node:path'; -import layouts from '../src/content/layouts/reference/manifest.json'; -const root=path.resolve(import.meta.dirname,'..'),target=path.join(root,'public/layout-reference'); -const esc=(s:string)=>s.replaceAll('&','&').replaceAll('<','<').replaceAll('"','"'); -async function main(){ - await writeFile(path.join(target,'manifest.json'),JSON.stringify(layouts,null,2)+'\n'); - const runtime=await readFile(path.join(root,'src/content/layouts/reference/ReferenceLayout.tsx'),'utf8');await writeFile(path.join(target,'ReferenceLayout.tsx'),runtime); - for(const l of layouts){ - const layers=l.elements.map(e=>{const[x,y,w,h]=e.box;return `${esc(e.kind==='text'?e.text||e.role+'(未辨识原字形)':'')}`}).join('\n'); - const html=`\n${l.id} · ${l.name}

${l.id} / ${l.name}

原图纸底与画框\n${layers}\n构件标注

原图第 ${l.source.row} 行、第 ${l.source.column} 列;${l.width}×${l.height} 像素。显示为原始构件重组,无新生成图形。放大不增加细节。

\n`; - await writeFile(path.join(target,l.id,'index.html'),html); - } - await writeFile(path.join(target,'index.html'),`27 张原图版面索引

27 张原图版面 · 一一对应

按原图从上到下、每行从左到右编号,排除左侧说明栏。点击每张可分开检查文字、图片占位/色块与装饰。

查看编号原图 · 机器索引

\n`); - console.log('Built 27 layer inspectors and the source ID index.'); -} -main().catch(e=>{console.error(e);process.exitCode=1}); diff --git a/apps/wiki/scripts/package-reference-layouts.ts b/apps/wiki/scripts/package-reference-layouts.ts deleted file mode 100644 index 6e87ad6..0000000 --- a/apps/wiki/scripts/package-reference-layouts.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {readFile,writeFile,mkdir,cp,rm} from 'node:fs/promises'; -import path from 'node:path'; -import {spawnSync} from 'node:child_process'; -import {tmpdir} from 'node:os'; -import {guidanceMarkdown} from '../src/content/skills/guidance'; -import {layouts,nextExample} from '../src/content/layouts/documents'; -async function main(){ - const root=path.resolve(import.meta.dirname,'..'),stage=path.join(tmpdir(),'prompt-layout-reference-toolkit');await rm(stage,{recursive:true,force:true});await mkdir(stage,{recursive:true}); - const put=async(name:string,text:string)=>{const file=path.join(stage,name);await mkdir(path.dirname(file),{recursive:true});await writeFile(file,text+'\n')}; - await cp(path.join(root,'public/layout-reference'),path.join(stage,'public/layout-reference'),{recursive:true,filter:source=>!source.endsWith('.zip')}); - for(const file of ['ReferenceLayout.tsx','manifest.json'])await put('components/reference-layouts/'+file,await readFile(path.join(root,'src/content/layouts/reference',file),'utf8')); - for(const l of layouts){await put('documents/'+l.id+'.md',guidanceMarkdown('premium-layout/'+l.id)!);await put('app/designs/'+l.id+'/page.tsx',nextExample(l.id))} - await put('documents/router.md',guidanceMarkdown('premium-layout/router')!); - await put('app/layout.tsx',`import type {ReactNode} from 'react';\nexport default function RootLayout({children}:{children:ReactNode}){return {children}}`); - await put('README.md',`# 27 张原图一一对应排版\n\n先读 documents/router.md,再选定 ref-01 至 ref-27 中的固定 ID。\n\n原始参考拼图是 736×980,每张约 112×173;素材保留原像素,不能恢复缺失的小字。默认 ReferenceLayout 逐层重组原图;文字仍是分类明确的原字形资产,不是已恢复成精确字体的矢量文字。text 属性可按完整构件键替换为 DOM 文本,未辨识细字不要猜写。\n\nHTML 检查器位于 public/layout-reference/index.html,需要通过静态服务器提供 public 目录。React 项目将 components 和 public 素材合入现有项目;Next.js 项目同时可使用 app/designs 下各个固定路由页。已有根布局应合并,不覆盖;@/ 指向源码根。\n\n包中没有 package.json,供合入现有 React / Next.js 项目。保留 manifest.json 与所有素材的相对路径。调用 ref-01 时只允许 ref-01/Txx 和 ref-01/Ixx;组件会验证类型与归属。弧形文字替换须专门建立该版面的 SVG 文字路径,通用组件会拒绝直接改成横排。\n\n原作者与素材许可未提供;本包用于用户提供参考图的识别、设计分析与原图对照,不声明模板所有权。\n`); - const result=spawnSync('python3',['-c',`import pathlib,zipfile,sys\nroot=pathlib.Path(sys.argv[1]);out=pathlib.Path(sys.argv[2])\nwith zipfile.ZipFile(out,'w',zipfile.ZIP_DEFLATED) as z:\n for p in sorted(root.rglob('*')):\n if p.is_file():z.write(p,p.relative_to(root))`,stage,path.join(root,'public/layout-reference/layout-reference-toolkit.zip')],{stdio:'inherit'}); - if(result.status!==0)throw Error('ZIP packaging failed');console.log('Packaged 27 layouts, 28 documents, React, Next.js and classified source assets.'); -} -main().catch(e=>{console.error(e);process.exitCode=1}); diff --git a/apps/wiki/src/content/layouts/documents.ts b/apps/wiki/src/content/layouts/documents.ts deleted file mode 100644 index 1e245a9..0000000 --- a/apps/wiki/src/content/layouts/documents.ts +++ /dev/null @@ -1,52 +0,0 @@ -import layouts from './reference/manifest.json'; -import type {Block} from '../skills/catalog'; -import type {GuidanceDocument,GuidanceResource} from '../skills/guidance'; -import {guidanceUrl} from '../page-links'; -export {layouts}; -const p=(text:string):Block=>({type:'paragraph',text}); -const h=(text:string):Block=>({type:'heading',text}); -const code=(text:string):Block=>({type:'code',text}); -const links=(...refs:string[]):Block=>({type:'links',refs}); -const doc=(id:string,title:string):GuidanceResource=>({id,kind:'document',title,documentPath:'premium-layout/'+id,href:guidanceUrl('premium-layout/'+id)+'?agent_mode=True',human:guidanceUrl('premium-layout/'+id)}); -const file=(id:string,title:string,href:string):GuidanceResource=>({id,kind:'document',title,href}); -const image=(id:string,title:string,href:string):GuidanceResource=>({id,kind:'image',title,href}); -const typeName=(kind:string)=>kind==='text'?'文字':kind==='image'?'图片占位 / 色块':'装饰'; -const sourceNote='原始拼图仅 736×980,每张约 112×173 像素。小字无法可靠辨认;其内容标为待核对,并保存独立原字形图层。放大不会恢复缺失信息。灰绿色区域为原设计中的图片占位 / 色块,参考图没有可辨认的真实照片。'; -export const legacyLayoutIds=['5971fc3d2563aa8005df5c13','9ad47529a7eaeee1fef771ca','7f158059ba3a2b80dd750cc3','370d1881f229af63f1946df9','31a978620a0d388f84772c95','c34cf81137654ad38850c9bd','dbe94ccaa708bd120549ae86','768587e537d6f1ee77a51961','0962c2bf1c558e0e32425f59','347b732caa4af4afa43b65a4','3edf144a443c1fdf23827fb3','97227671a9dc95c4948e591b']; -export function reactExample(id:string){return `// components/Example.tsx\nimport ReferenceLayout from './reference-layouts/ReferenceLayout';\nexport default function Example() {\n return ;\n}\n// 原样模式使用该 ID 的独立图层,保留原字形与原构图。\n// 组件、manifest.json 和 public/layout-reference 素材必须一起复制。`} -export function nextExample(id:string){return `// app/designs/${id}/page.tsx\nimport type { Metadata } from 'next';\nimport ReferenceLayout from '@/components/reference-layouts/ReferenceLayout';\nexport const metadata: Metadata = {title:'${id} · 原图对应排版'};\nexport default function Page() {\n return
;\n}\n// 沿用项目根布局。@/ 指向源码根,组件可直接作为 Server Component。`} -export function htmlExample(id:string){return `\n${id}\n\n
\n`} -const router:GuidanceDocument={ - path:'premium-layout/router',title:'高级感排版 · 27 张原图 Router',collection:'高级感排版', - resources:[image('source-map','27 张原图编号对应图','/layout-reference/numbered-source.png'),file('inspector','27 张构件检查器','/layout-reference/index.html'),file('index-json','27 张机器索引','/layout-reference/index.json'),file('runtime','React / TSX 完整组件源文件','/layout-reference/ReferenceLayout.tsx'),file('manifest','React 组件配套 manifest.json','/layout-reference/manifest.json'),file('bundle','27 张完整源码与素材 ZIP','/layout-reference/layout-reference-toolkit.zip'),...layouts.map(l=>doc(l.id,l.id+' · '+l.name))], - blocks:[p('本系列严格对应用户参考图中的 27 张独立设计,每张保留自己的原图裁片、文字、图片占位 / 色块、装饰和坐标。左侧“高级感排版 / 模板合集”说明栏不计入。编号从上到下、每行从左到右:前 3 行各 5 张,后 2 行各 6 张,共 27 张设计 post,另有本篇 Router。'), - h('先查原图编号,再调用固定 ID'),links('inspector','index-json','bundle'),p('指定 ref-01 至 ref-27 中的一个 ID。禁止把旧的“同心圆”“巨字”等类型名当成任意近似模板;每个 ID 只对应一个 source.box、一份 manifest 和本设计的构件。无法确定编号时先返回候选原图裁片,由使用者选择,再生成。'), - p('| ID | 原图位置(含左侧说明栏所在列) | 对应设计 |\n| --- | --- | --- |\n'+layouts.map(l=>`| ${l.id} | 第 ${l.source.row} 行、第 ${l.source.column} 列 | ${l.name} |`).join('\n')), - links(...layouts.map(l=>l.id)), - h('识别算法与人工复核'),p('1. 从拼图外沿采样灰底,按 RGB 最大通道差 >19 建立前景二值掩膜。2. 四邻域连通域提取外框,按宽 86–124px、高 146–189px 过滤,检测出 27 张卡片。3. 按 y 坐标聚成 5 行,行内按 x 排序,保存绝对裁片坐标。4. 使用本机 macOS Vision 提取 OCR 候选与置信度,再逐张复核文字区、色块与装饰 ROI。5. 根据各图位的局部颜色种子建立图形掩膜,文字前景独立分离;残余字形按基线、间距、字高与已有文字块合并。6. 对所有独立图层重组并执行像素比较。'), - p('OCR 置信度不是事实保证;本清单对可读标题进行了人工核对。ref-01 的品牌字标整体为 T01,不能把末尾字符再标为 T03。编号在一张图内按文字 T、图片占位 I、装饰 D 分组;对外调用使用完整键 ref-01/T01,防止跨版面混用。'), - h('三类构件及背景'),p('T / text:标题、正文、品牌字、日期、图注与字距标签。文字不属于图片区;已核对内容记录在 text 字段,无法辨认的内容为 null。I / image:原设计的图片占位或灰绿色色块。它们可由实际照片替换,原始形状和位置由 mask 保持;本参考没有真实照片。D / decoration:线框、圆环、圆节点、引线、分隔线与贴条。纸底与原拼图画框单独保存在 background。'), - h('必须区分:保真重组与可编辑替换'),p('默认模式按分类好的原图构件重组,保留原字形和像素;它不是高分辨率矢量重绘,也不意味着 OCR 全部识别正确。替换模式按同一 ID 和原坐标渲染新文字或新图片;字体与内容变化会产生视觉差异。替换过的版本不得称为与原图逐像素一致。曲线文字保留原字形,若要替换须沿该版面的专用 SVG 路径排字,通用组件会拒绝普通文本替换,以免把弧形改成直排。'),p(sourceNote), - h('严格调用协议'),code(JSON.stringify({layoutId:'ref-01',mode:'reference',sourceBox:layouts[0].source.box,components:{'ref-01/T01':{kind:'text',role:'品牌字标'},'ref-01/T02':{kind:'text',role:'左下说明'},'ref-01/I01':{kind:'image',role:'上方主图'},'ref-01/I02':{kind:'image',role:'下方副图'}}},null,2)), - h('React / TSX 与 Next.js 文件准备'),links('runtime','manifest','bundle'),p('将 ZIP 中 components/reference-layouts 放进项目组件目录,将 public/layout-reference 放到项目 public 下。React 项目直接导入组件使用;Next.js App Router 可将组件保留为 Server Component。已有根布局继续沿用,设置中文 lang,按项目路径调整 @/ 别名。只有图层开关、拖拽或编辑器等交互外壳需要 use client;图片和字形保真层使用原生 img 避免优化改变原像素或透明遮罩。'), - code(reactExample('ref-01')),code(nextExample('ref-01')), - h('替换必须按构件类型和完整键执行'),code(`import ReferenceLayout from './reference-layouts/ReferenceLayout';\nexport default function Customized() {\n return ;\n}\n// ref-02/T01 不能传给 ref-01;I01 不能作为文字键。运行时会拒绝。\n// 保留某个构件原样:不要传对应键。未知细字不能猜写。`), - h('字体、图片与高级工具'),p('参考图中的字形已保存在独立文字资产;尚不能从低清拼图可靠确定具体字体。编辑时使用用户提供且已授权的中文 / 拉丁字体,先检查横排、竖排、旋转和倾斜方向,再调整字距与行距。SVG 适用于弧形文字和可编辑轮廓,Figma 可按每张 manifest 的源坐标建立画板与图层;不要重新套用另一张版面的圆形、网格或色块位置。图片替换采用 cover,并保留本设计的 mask;需要完整主体时先检查裁切。'), - h('验收与停止条件'),p('逐张核对原裁片、编号和 source.box;检查文字、图片占位和装饰三类掩膜。默认模式必须逐像素重组一致;该检查只证明资产重组保真,不证明语义标注或 OCR 一定正确,仍须核对标注图。特别检查同一单词是否被拆成两个 T、数字是否被旋转标题吞并、底线是否被并入文字。调用时不能跨设计借构件。更换内容后再次检查溢出、换行、透明边缘与图片裁切。网页正文另外提供可读的 DOM 文本,不把 112×173 的海报小字当作移动端正文。'), - ], -}; -export const layoutDocuments:GuidanceDocument[]=[router,...layouts.map((l):GuidanceDocument=>{ - const title=l.id+' · '+l.name; - const texts=l.elements.filter(e=>e.kind==='text'),images=l.elements.filter(e=>e.kind==='image'),decor=l.elements.filter(e=>e.kind==='decoration'); - return {path:'premium-layout/'+l.id,title,collection:'高级感排版',resources:[image('reference',l.id+' · 原图裁片',l.reference),image('annotated',l.id+' · 文字/图片/装饰标注',l.annotated),image('text-map',l.id+' · 仅文字掩膜(蓝色)',`/layout-reference/${l.id}/text-map.png`),image('image-map',l.id+' · 仅图片占位/色块(橙色)',`/layout-reference/${l.id}/image-map.png`),image('decor-map',l.id+' · 仅装饰掩膜(绿色)',`/layout-reference/${l.id}/decoration-map.png`),doc('router','27 张原图 Router'),file('inspect','打开本设计构件检查器',`/layout-reference/${l.id}/index.html`),file('json','本设计完整构件 JSON',`/layout-reference/${l.id}/manifest.json`),file('runtime','React 完整组件','/layout-reference/ReferenceLayout.tsx'),file('bundle','完整源码与素材 ZIP','/layout-reference/layout-reference-toolkit.zip')],blocks:[ - p(`${l.id} 只对应原图第 ${l.source.row} 行、可见第 ${l.source.column} 列的“${l.name}”。原裁片坐标 [x,y,w,h] = [${l.source.box.join(', ')}];本篇逐项列出文字 ${texts.length} 组、图片占位/色块 ${images.length} 组、装饰 ${decor.length} 组,不替换成近似构图。`),links('inspect','json'), - h('原图与分类图怎么看'),p('本 post 的第 1 张是直接裁出的原版面,第 2 张标出构件框,第 3 张只显示蓝色文字掩膜,第 4 张只显示橙色图片区掩膜,第 5 张只显示绿色装饰。T 与 I 可在坐标上叠放,例如标题压住图位;它们仍是不同类型,不能合并成图片。检查器可独立关闭各类构件并点击表格定位。'), - h('构件逐项对应表'),p('| 完整构件键 | 类型 | 用途 | 本裁片坐标 x,y,w,h | 内容 / 状态 |\n| --- | --- | --- | --- | --- |\n'+l.elements.map(e=>`| ${l.id}/${e.id} | ${typeName(e.kind)} | ${e.role} | ${e.box.join(', ')} | ${e.kind==='text'?(e.text??'待核对,保留原字形'):'非文字'} |`).join('\n')), - h('布局与制作步骤'),p(`1. 以 ${l.width}×${l.height} 的源坐标建立画板;输出可等比放大,比例必须保持 ${l.width}:${l.height}。2. 建立本设计的 ${images.map(e=>e.id+' '+e.role).join('、')},使用对应 mask,保持它们各自位置。3. 单独放置 ${texts.map(e=>e.id+' '+e.role).join('、')},按表内方向与坐标定位。4. 还原 ${decor.map(e=>e.id+' '+e.role).join('、')||'原设计已有的细节'},不得借用别的设计。5. 与原裁片叠加比较,再检查文字是否被图层遮挡。`), - h('文字和图层的具体规则'),p(texts.map(e=>`${e.id}:${e.direction==='vertical'?'竖排':e.direction==='rotated'?'整体旋转排字':e.direction==='angled'?'倾斜排字':e.direction==='curved'?'沿曲线排字':'横排'};${e.text?'已核对可读内容“'+e.text+'”':'内容无法可靠辨认,保留原字形,不编造正文'}。`).join('\n')),p(sourceNote), - h('HTML / CSS:固定本设计 ID'),code(htmlExample(l.id)), - h('React / TSX:固定本设计组件'),code(reactExample(l.id)),links('runtime','bundle'), - h('Next.js App Router:固定本设计路由'),code(nextExample(l.id)), - h('本设计的验收标准'),p(`layoutId 必须等于 ${l.id},source.box 必须为 [${l.source.box.join(', ')}];所有构件资产必须来自 /layout-reference/${l.id}/。核对本篇 ${texts.length} 组 T、${images.length} 组 I、${decor.length} 组 D 的归属和坐标。默认原字形模式的图层拼回与原裁片一致;文字替换模式则按布局与可读性验收,不再声称像素一致。原字标、日期和细字不能因为识别残余而重复编号。`),links('router'), - ]}; -})]; diff --git a/apps/wiki/src/content/layouts/reference/ReferenceLayout.tsx b/apps/wiki/src/content/layouts/reference/ReferenceLayout.tsx deleted file mode 100644 index 951bf18..0000000 --- a/apps/wiki/src/content/layouts/reference/ReferenceLayout.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import type {CSSProperties} from 'react'; -import layouts from './manifest.json'; -export const layoutIds = ['ref-01','ref-02','ref-03','ref-04','ref-05','ref-06','ref-07','ref-08','ref-09','ref-10','ref-11','ref-12','ref-13','ref-14','ref-15','ref-16','ref-17','ref-18','ref-19','ref-20','ref-21','ref-22','ref-23','ref-24','ref-25','ref-26','ref-27'] as const; -export type LayoutId=typeof layoutIds[number]; -export type Replacements={text?:Record;images?:Record}; -export function getLayout(id:string){return layouts.find(layout=>layout.id===id)} -export function validateReplacements(id:string,replacements:Replacements){ - const layout=getLayout(id);if(!layout)throw Error(`Unknown layout ID: ${id}`); - for(const[kind,values]of [['text',replacements.text],['image',replacements.images]] as const)for(const key of Object.keys(values||{})){ - if(!layout.elements.some(e=>key===id+'/'+e.id&&e.kind===kind))throw Error(`Component does not belong to ${id} or has the wrong kind: ${key}`); - }return layout; -} -function textStyle(text:string,box:number[],width:number,direction:string):CSSProperties{ - const vertical=direction==='vertical'||direction==='rotated',lines=text.split('\n'),units=Math.max(...lines.map(line=>Array.from(line).reduce((n,c)=>n+(/[\u3400-\u9fff]/.test(c)?1:.56),0)),1); - const size=vertical?Math.min(box[2],box[3]/Math.max(text.length,1)):Math.min(box[3]/(lines.length*1.1),box[2]/units); - return {fontSize:`${size/width*100}cqw`,lineHeight:1.1,whiteSpace:'pre-wrap',writingMode:vertical?'vertical-rl':undefined,textOrientation:direction==='rotated'?'sideways':undefined,transform:direction==='angled'?'rotate(-12deg)':undefined,transformOrigin:'left center',color:'#222',fontFamily:'"Songti SC", "Noto Serif CJK SC", serif'}; -} -/** Untouched mode reconstructs typed source layers; replacement mode keeps the exact preset geometry. */ -export default function ReferenceLayout({id,text={},images={},assetBase=''}:{id:LayoutId;text?:Record;images?:Record;assetBase?:string}){ - const layout=validateReplacements(id,{text,images}),src=(url:string)=>assetBase+url; - return
-
- - {layout.elements.map(e=>{ - const[x,y,w,h]=e.box,key=id+'/'+e.id,position:CSSProperties={position:'absolute',left:x/layout.width*100+'%',top:y/layout.height*100+'%',width:w/layout.width*100+'%',height:h/layout.height*100+'%',zIndex:e.kind==='text'?3:e.kind==='decoration'?2:1}; - if(e.kind==='text'&&Object.hasOwn(text,key)){ - if(e.direction==='curved')throw Error(`Curved text requires the source-specific SVG path: ${key}`); - return - {'underlay' in e&&} - {text[key]} - ; - } - if(e.kind==='image'&&Object.hasOwn(images,key))return {e.role}; - return {e.kind==='text'?e.text||`${e.role}:原字形保真,内容未辨识`:''}; - })} -
-
; -} diff --git a/apps/wiki/src/content/layouts/reference/manifest.json b/apps/wiki/src/content/layouts/reference/manifest.json deleted file mode 100644 index 9a4d0c4..0000000 --- a/apps/wiki/src/content/layouts/reference/manifest.json +++ /dev/null @@ -1,4792 +0,0 @@ -[ - { - "id": "ref-01", - "name": "双矩形错位与左下说明", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 46, - 113, - 171 - ], - "row": 1, - "column": 2 - }, - "width": 113, - "height": 171, - "reference": "/layout-reference/ref-01/source.png", - "annotated": "/layout-reference/ref-01/annotated.png", - "background": "/layout-reference/ref-01/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "品牌字标", - "box": [ - 8, - 20, - 36, - 15 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-01/T01.png", - "pixels": 274, - "underlay": "/layout-reference/ref-01/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左下说明", - "box": [ - 7, - 121, - 44, - 34 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-01/T02.png", - "pixels": 468, - "underlay": "/layout-reference/ref-01/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方主图", - "box": [ - 24, - 14, - 77, - 71 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/I01.png", - "pixels": 5259, - "mask": "/layout-reference/ref-01/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方副图", - "box": [ - 42, - 89, - 59, - 70 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/I02.png", - "pixels": 4097, - "mask": "/layout-reference/ref-01/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "顶部短线", - "box": [ - 41, - 4, - 29, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/D01.png", - "pixels": 55 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部横线", - "box": [ - 29, - 158, - 58, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-01/D02.png", - "pixels": 167 - } - ], - "ocr": [ - { - "box": [ - 0.07374631491782553, - 0.12865497059314956, - 0.31268436578171094, - 0.06237816764132553 - ], - "confidence": 0.5, - "text": "BULUBLUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19323, - "unreadableText": 1 - } - }, - { - "id": "ref-02", - "name": "四格图片列与双列竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 46, - 112, - 171 - ], - "row": 1, - "column": 3 - }, - "width": 112, - "height": 171, - "reference": "/layout-reference/ref-02/source.png", - "annotated": "/layout-reference/ref-02/annotated.png", - "background": "/layout-reference/ref-02/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧主标题", - "box": [ - 91, - 0, - 20, - 126 - ], - "text": "蓝羽毛版式设计系列", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-02/T01.png", - "pixels": 1348, - "underlay": "/layout-reference/ref-02/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中间副标题", - "box": [ - 70, - 0, - 19, - 84 - ], - "text": "版式灵感收藏", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-02/T02.png", - "pixels": 776, - "underlay": "/layout-reference/ref-02/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "图片一图注", - "box": [ - 0, - 34, - 20, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T03.png", - "pixels": 28, - "underlay": "/layout-reference/ref-02/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "图片二图注", - "box": [ - 0, - 71, - 29, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T04.png", - "pixels": 74, - "underlay": "/layout-reference/ref-02/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "图片三图注", - "box": [ - 2, - 132, - 37, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T05.png", - "pixels": 39, - "underlay": "/layout-reference/ref-02/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "右下说明", - "box": [ - 50, - 81, - 32, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T06.png", - "pixels": 348, - "underlay": "/layout-reference/ref-02/T06-underlay.png" - }, - { - "id": "T07", - "kind": "text", - "role": "右下品牌与说明", - "box": [ - 51, - 143, - 51, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-02/T07.png", - "pixels": 483, - "underlay": "/layout-reference/ref-02/T07-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "图片一", - "box": [ - 4, - 3, - 40, - 30 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I01.png", - "pixels": 1198, - "mask": "/layout-reference/ref-02/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "图片二", - "box": [ - 2, - 38, - 44, - 33 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I02.png", - "pixels": 1443, - "mask": "/layout-reference/ref-02/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "图片三", - "box": [ - 2, - 74, - 44, - 56 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I03.png", - "pixels": 2421, - "mask": "/layout-reference/ref-02/I03-mask.png" - }, - { - "id": "I04", - "kind": "image", - "role": "图片四", - "box": [ - 2, - 135, - 44, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/I04.png", - "pixels": 1276, - "mask": "/layout-reference/ref-02/I04-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "分栏细线", - "box": [ - 65, - 2, - 2, - 72 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/D01.png", - "pixels": 143 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下横线组", - "box": [ - 50, - 158, - 57, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-02/D02.png", - "pixels": 407 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19152, - "unreadableText": 5 - } - }, - { - "id": "ref-03", - "name": "左上标题与右下错位图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 46, - 114, - 173 - ], - "row": 1, - "column": 4 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-03/source.png", - "annotated": "/layout-reference/ref-03/annotated.png", - "background": "/layout-reference/ref-03/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "主标题", - "box": [ - 0, - 0, - 45, - 20 - ], - "text": "蓝羽毛", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-03/T01.png", - "pixels": 372, - "underlay": "/layout-reference/ref-03/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右上说明", - "box": [ - 80, - 22, - 29, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-03/T02.png", - "pixels": 359, - "underlay": "/layout-reference/ref-03/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "编号", - "box": [ - 100, - 48, - 8, - 7 - ], - "text": "01", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-03/T03.png", - "pixels": 39, - "underlay": "/layout-reference/ref-03/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下信息两列", - "box": [ - 4, - 118, - 37, - 33 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-03/T04.png", - "pixels": 353, - "underlay": "/layout-reference/ref-03/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 4, - 22, - 75, - 82 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/I01.png", - "pixels": 6006, - "mask": "/layout-reference/ref-03/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右下副图", - "box": [ - 45, - 107, - 63, - 48 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/I02.png", - "pixels": 3004, - "mask": "/layout-reference/ref-03/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "斜引线", - "box": [ - 80, - 49, - 18, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D01.png", - "pixels": 38 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部左短线", - "box": [ - 24, - 164, - 13, - 4 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D02.png", - "pixels": 52 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部右短线", - "box": [ - 79, - 163, - 16, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-03/D03.png", - "pixels": 65 - } - ], - "ocr": [ - { - "box": [ - 0.0221329192553819, - 0.02865017716183693, - 0.3329271461531433, - 0.08913510199456776 - ], - "confidence": 0.5, - "text": "蓝羽毛" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 2 - } - }, - { - "id": "ref-04", - "name": "满版灰底椭圆与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 45, - 113, - 173 - ], - "row": 1, - "column": 5 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-04/source.png", - "annotated": "/layout-reference/ref-04/annotated.png", - "background": "/layout-reference/ref-04/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖向标题", - "box": [ - 80, - 4, - 22, - 54 - ], - "text": "蓝羽毛", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-04/T01.png", - "pixels": 674, - "underlay": "/layout-reference/ref-04/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右下竖向标题", - "box": [ - 79, - 104, - 28, - 45 - ], - "text": "版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-04/T02.png", - "pixels": 831, - "underlay": "/layout-reference/ref-04/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "椭圆左沿弧形微字", - "box": [ - 12, - 21, - 23, - 109 - ], - "text": null, - "direction": "curved", - "reading": "unreadable", - "asset": "/layout-reference/ref-04/T03.png", - "pixels": 487, - "underlay": "/layout-reference/ref-04/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧辅助小字", - "box": [ - 83, - 82, - 20, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-04/T04.png", - "pixels": 39, - "underlay": "/layout-reference/ref-04/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央倾斜椭圆图位", - "box": [ - 11, - 16, - 92, - 143 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/I01.png", - "pixels": 9110, - "mask": "/layout-reference/ref-04/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上方块与短线", - "box": [ - 3, - 8, - 12, - 13 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D01.png", - "pixels": 105 - }, - { - "id": "D02", - "kind": "decoration", - "role": "左下阶梯线组", - "box": [ - 3, - 132, - 29, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D02.png", - "pixels": 258 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部细线", - "box": [ - 4, - 167, - 48, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-04/D03.png", - "pixels": 48 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } - }, - { - "id": "ref-05", - "name": "五圆出血与右侧竖排大字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 45, - 112, - 172 - ], - "row": 1, - "column": 6 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-05/source.png", - "annotated": "/layout-reference/ref-05/annotated.png", - "background": "/layout-reference/ref-05/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧大标题", - "box": [ - 72, - 71, - 28, - 99 - ], - "text": "蓝羽毛", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-05/T01.png", - "pixels": 1148, - "underlay": "/layout-reference/ref-05/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右侧细标题", - "box": [ - 100, - 72, - 11, - 90 - ], - "text": "版式设计 设计灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-05/T02.png", - "pixels": 487, - "underlay": "/layout-reference/ref-05/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上出血圆", - "box": [ - 1, - 5, - 44, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I01.png", - "pixels": 2144, - "mask": "/layout-reference/ref-05/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右上出血圆", - "box": [ - 56, - 1, - 54, - 44 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I02.png", - "pixels": 2070, - "mask": "/layout-reference/ref-05/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "中部圆", - "box": [ - 46, - 44, - 42, - 42 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I03.png", - "pixels": 1302, - "mask": "/layout-reference/ref-05/I03-mask.png" - }, - { - "id": "I04", - "kind": "image", - "role": "左中小圆", - "box": [ - 3, - 73, - 38, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I04.png", - "pixels": 1107, - "mask": "/layout-reference/ref-05/I04-mask.png" - }, - { - "id": "I05", - "kind": "image", - "role": "左下出血圆", - "box": [ - 1, - 119, - 66, - 50 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/I05.png", - "pixels": 2892, - "mask": "/layout-reference/ref-05/I05-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "中下竖线组", - "box": [ - 47, - 106, - 24, - 43 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-05/D01.png", - "pixels": 286 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 0 - } - }, - { - "id": "ref-06", - "name": "满高左图与右侧窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 228, - 114, - 172 - ], - "row": 2, - "column": 2 - }, - "width": 114, - "height": 172, - "reference": "/layout-reference/ref-06/source.png", - "annotated": "/layout-reference/ref-06/annotated.png", - "background": "/layout-reference/ref-06/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖向主标题", - "box": [ - 98, - 28, - 9, - 59 - ], - "text": "蓝羽毛の版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-06/T01.png", - "pixels": 376, - "underlay": "/layout-reference/ref-06/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右侧竖向说明", - "box": [ - 81, - 49, - 14, - 49 - ], - "text": "审美提升 设计灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-06/T02.png", - "pixels": 368, - "underlay": "/layout-reference/ref-06/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部英文标识", - "box": [ - 78, - 162, - 32, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-06/T03.png", - "pixels": 204, - "underlay": "/layout-reference/ref-06/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左侧满高图片", - "box": [ - 4, - 3, - 69, - 163 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/I01.png", - "pixels": 11240, - "mask": "/layout-reference/ref-06/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "右上短竖线", - "box": [ - 89, - 4, - 3, - 26 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D01.png", - "pixels": 53 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下细长线组", - "box": [ - 80, - 102, - 15, - 58 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D02.png", - "pixels": 584 - }, - { - "id": "D03", - "kind": "decoration", - "role": "右侧斜引线", - "box": [ - 81, - 93, - 12, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-06/D03.png", - "pixels": 45 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19608, - "unreadableText": 1 - } - }, - { - "id": "ref-07", - "name": "同心圆图位与底部年份", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 228, - 112, - 172 - ], - "row": 2, - "column": 3 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-07/source.png", - "annotated": "/layout-reference/ref-07/annotated.png", - "background": "/layout-reference/ref-07/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "下沿环形文字", - "box": [ - 17, - 75, - 90, - 34 - ], - "text": null, - "direction": "curved", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T01.png", - "pixels": 160, - "underlay": "/layout-reference/ref-07/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "年份", - "box": [ - 2, - 129, - 27, - 12 - ], - "text": "2025", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-07/T02.png", - "pixels": 226, - "underlay": "/layout-reference/ref-07/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "年份下副标题", - "box": [ - 3, - 140, - 58, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T03.png", - "pixels": 168, - "underlay": "/layout-reference/ref-07/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部说明", - "box": [ - 1, - 146, - 109, - 16 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T04.png", - "pixels": 1217, - "underlay": "/layout-reference/ref-07/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右下品牌", - "box": [ - 58, - 161, - 52, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-07/T05.png", - "pixels": 245, - "underlay": "/layout-reference/ref-07/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央圆形主图", - "box": [ - 18, - 9, - 92, - 94 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-07/I01.png", - "pixels": 6852, - "mask": "/layout-reference/ref-07/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "同心环线", - "box": [ - 0, - 0, - 112, - 138 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-07/D01.png", - "pixels": 5238 - } - ], - "ocr": [ - { - "box": [ - 0.026785715591931197, - 0.7558139533053403, - 0.23511904761904764, - 0.0678294573643411 - ], - "confidence": 1, - "text": "2025" - }, - { - "box": [ - 0.5292150606737416, - 0.9085944883228659, - 0.43264130183628624, - 0.05102807791658148 - ], - "confidence": 0.30000001192092896, - "text": "能車贤好雞 蓋羽毛" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 4 - } - }, - { - "id": "ref-08", - "name": "双层满宽图与字距横栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 227, - 113, - 173 - ], - "row": 2, - "column": 4 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-08/source.png", - "annotated": "/layout-reference/ref-08/annotated.png", - "background": "/layout-reference/ref-08/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "顶部英文刊头", - "box": [ - 0, - 0, - 111, - 14 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T01.png", - "pixels": 782, - "underlay": "/layout-reference/ref-08/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "顶部中文刊头", - "box": [ - 0, - 14, - 111, - 16 - ], - "text": "蓝羽毛设计", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T02.png", - "pixels": 732, - "underlay": "/layout-reference/ref-08/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中央字距标签", - "box": [ - 3, - 68, - 107, - 8 - ], - "text": "DESIGNFOR2026", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-08/T03.png", - "pixels": 360, - "underlay": "/layout-reference/ref-08/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中部横向图片", - "box": [ - 4, - 31, - 102, - 36 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-08/I01.png", - "pixels": 3671, - "mask": "/layout-reference/ref-08/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下部大图", - "box": [ - 4, - 76, - 102, - 88 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-08/I02.png", - "pixels": 8975, - "mask": "/layout-reference/ref-08/I02-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.04129793275112562, - 0.01926782282729944, - 0.8938053097345132, - 0.06165703275529866 - ], - "confidence": 0.5, - "text": "BULUBLUE" - }, - { - "box": [ - 0.04129793395280237, - 0.07899807351316634, - 0.9115044247787611, - 0.08863198458574184 - ], - "confidence": 0.5, - "text": "蓝羽毛设计" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 0 - } - }, - { - "id": "ref-09", - "name": "左侧分字标题与右侧长图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 227, - 113, - 173 - ], - "row": 2, - "column": 5 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-09/source.png", - "annotated": "/layout-reference/ref-09/annotated.png", - "background": "/layout-reference/ref-09/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 7, - 16, - 19, - 19 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-09/T01.png", - "pixels": 195, - "underlay": "/layout-reference/ref-09/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧小字组", - "box": [ - 8, - 37, - 24, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T02.png", - "pixels": 162, - "underlay": "/layout-reference/ref-09/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左中大字", - "box": [ - 8, - 65, - 17, - 15 - ], - "text": "式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-09/T03.png", - "pixels": 93, - "underlay": "/layout-reference/ref-09/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部左侧竖字", - "box": [ - 2, - 142, - 15, - 29 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T04.png", - "pixels": 150, - "underlay": "/layout-reference/ref-09/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部日期标识", - "box": [ - 40, - 136, - 60, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-09/T05.png", - "pixels": 186, - "underlay": "/layout-reference/ref-09/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右侧竖长图片", - "box": [ - 38, - 14, - 65, - 109 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/I01.png", - "pixels": 6978, - "mask": "/layout-reference/ref-09/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "底部上横线组", - "box": [ - 40, - 144, - 55, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/D01.png", - "pixels": 318 - }, - { - "id": "D02", - "kind": "decoration", - "role": "底部双线", - "box": [ - 41, - 157, - 61, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-09/D02.png", - "pixels": 305 - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 3 - } - }, - { - "id": "ref-10", - "name": "半页深底与裁切英文 blue", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 227, - 113, - 173 - ], - "row": 2, - "column": 6 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-10/source.png", - "annotated": "/layout-reference/ref-10/annotated.png", - "background": "/layout-reference/ref-10/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "裁切英文标题", - "box": [ - 0, - 49, - 85, - 32 - ], - "text": "blue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-10/T01.png", - "pixels": 1504, - "underlay": "/layout-reference/ref-10/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "英文上方小标签", - "box": [ - 10, - 46, - 73, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-10/T02.png", - "pixels": 105, - "underlay": "/layout-reference/ref-10/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "深底居中说明", - "box": [ - 25, - 144, - 61, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-10/T03.png", - "pixels": 398, - "underlay": "/layout-reference/ref-10/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "下半页深色图片区", - "box": [ - 1, - 81, - 110, - 91 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/I01.png", - "pixels": 9284, - "mask": "/layout-reference/ref-10/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上角标", - "box": [ - 0, - 4, - 10, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/D01.png", - "pixels": 21 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右上角标", - "box": [ - 103, - 4, - 10, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-10/D02.png", - "pixels": 23 - } - ], - "ocr": [ - { - "box": [ - 1.2867459860650037e-9, - 0.32755298650587994, - 0.7463126843657818, - 0.1502890173410405 - ], - "confidence": 0.30000001192092896, - "text": "DUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } - }, - { - "id": "ref-11", - "name": "左上双行标题与右下主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 410, - 114, - 173 - ], - "row": 3, - "column": 2 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-11/source.png", - "annotated": "/layout-reference/ref-11/annotated.png", - "background": "/layout-reference/ref-11/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "第一行标题", - "box": [ - 0, - 4, - 54, - 22 - ], - "text": "蓝羽毛", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-11/T01.png", - "pixels": 643, - "underlay": "/layout-reference/ref-11/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "第二行标题", - "box": [ - 0, - 27, - 72, - 23 - ], - "text": "版式灵感", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-11/T02.png", - "pixels": 884, - "underlay": "/layout-reference/ref-11/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右上小标签", - "box": [ - 84, - 2, - 5, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T03.png", - "pixels": 23, - "underlay": "/layout-reference/ref-11/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右上信息组", - "box": [ - 81, - 20, - 23, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T04.png", - "pixels": 145, - "underlay": "/layout-reference/ref-11/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右中短标识", - "box": [ - 82, - 55, - 23, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T05.png", - "pixels": 38, - "underlay": "/layout-reference/ref-11/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "左下脚注", - "box": [ - 0, - 158, - 32, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-11/T06.png", - "pixels": 112, - "underlay": "/layout-reference/ref-11/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下主图", - "box": [ - 47, - 68, - 60, - 94 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-11/I01.png", - "pixels": 5640, - "mask": "/layout-reference/ref-11/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左中横线组", - "box": [ - 15, - 91, - 23, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-11/D01.png", - "pixels": 373 - } - ], - "ocr": [ - { - "box": [ - 0.0029239778265106767, - 0.04431599267822739, - 0.4766081871345029, - 0.11560693641618491 - ], - "confidence": 1, - "text": "蓝羽毛" - }, - { - "box": [ - 0.026110667628392013, - 0.17872041532632799, - 0.6085973817702622, - 0.11654760842148737 - ], - "confidence": 1, - "text": "版式灵感" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 4 - } - }, - { - "id": "ref-12", - "name": "三图模块与左侧分散字框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 409, - 112, - 173 - ], - "row": 3, - "column": 3 - }, - "width": 112, - "height": 173, - "reference": "/layout-reference/ref-12/source.png", - "annotated": "/layout-reference/ref-12/annotated.png", - "background": "/layout-reference/ref-12/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "左下水平分隔", - "box": [ - 0, - 146, - 31, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D01.png", - "pixels": 61 - }, - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 0, - 0, - 32, - 39 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-12/T01.png", - "pixels": 580, - "underlay": "/layout-reference/ref-12/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧竖向副题", - "box": [ - 6, - 53, - 13, - 66 - ], - "text": "蓝羽毛の设计", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-12/T02.png", - "pixels": 487, - "underlay": "/layout-reference/ref-12/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左下大字", - "box": [ - 0, - 138, - 32, - 33 - ], - "text": "式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-12/T03.png", - "pixels": 359, - "underlay": "/layout-reference/ref-12/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "分格图注", - "box": [ - 24, - 132, - 87, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-12/T04.png", - "pixels": 172, - "underlay": "/layout-reference/ref-12/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部说明", - "box": [ - 35, - 157, - 76, - 13 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-12/T05.png", - "pixels": 632, - "underlay": "/layout-reference/ref-12/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右上主图", - "box": [ - 24, - 18, - 85, - 74 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I01.png", - "pixels": 6212, - "mask": "/layout-reference/ref-12/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方左图片", - "box": [ - 24, - 94, - 53, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I02.png", - "pixels": 1961, - "mask": "/layout-reference/ref-12/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "下方右图片", - "box": [ - 79, - 94, - 30, - 37 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/I03.png", - "pixels": 1110, - "mask": "/layout-reference/ref-12/I03-mask.png" - }, - { - "id": "D02", - "kind": "decoration", - "role": "顶部短横线组", - "box": [ - 46, - 6, - 54, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D02.png", - "pixels": 266 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部中横线组", - "box": [ - 35, - 141, - 65, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-12/D03.png", - "pixels": 697 - } - ], - "ocr": [ - { - "box": [ - 0.014880952149470902, - -3.67515795574036e-10, - 0.2678571428571429, - 0.19845857418111745 - ], - "confidence": 1, - "text": "版" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19376, - "unreadableText": 2 - } - }, - { - "id": "ref-13", - "name": "横题与右侧出血扁椭圆", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 410, - 114, - 173 - ], - "row": 3, - "column": 4 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-13/source.png", - "annotated": "/layout-reference/ref-13/annotated.png", - "background": "/layout-reference/ref-13/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "顶部左标题", - "box": [ - 8, - 12, - 35, - 16 - ], - "text": "版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-13/T01.png", - "pixels": 316, - "underlay": "/layout-reference/ref-13/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "顶部右标题", - "box": [ - 70, - 12, - 34, - 16 - ], - "text": "灵感", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-13/T02.png", - "pixels": 343, - "underlay": "/layout-reference/ref-13/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "标题中央微字", - "box": [ - 48, - 14, - 16, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T03.png", - "pixels": 62, - "underlay": "/layout-reference/ref-13/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下分行说明", - "box": [ - 8, - 100, - 29, - 48 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T04.png", - "pixels": 646, - "underlay": "/layout-reference/ref-13/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部信息", - "box": [ - 4, - 162, - 103, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-13/T05.png", - "pixels": 248, - "underlay": "/layout-reference/ref-13/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右侧扁椭圆主图", - "box": [ - 8, - 31, - 103, - 119 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-13/I01.png", - "pixels": 8615, - "mask": "/layout-reference/ref-13/I01-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.07309941752558477, - 0.06743737990125243, - 0.8421052631578948, - 0.10404624277456653 - ], - "confidence": 0.30000001192092896, - "text": "版式=灵感" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 3 - } - }, - { - "id": "ref-14", - "name": "大矩形与小方图及居中横题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 497, - 409, - 113, - 174 - ], - "row": 3, - "column": 5 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-14/source.png", - "annotated": "/layout-reference/ref-14/annotated.png", - "background": "/layout-reference/ref-14/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "中部横向主标题", - "box": [ - 9, - 77, - 91, - 11 - ], - "text": "蓝羽毛 版式灵感设计分享", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-14/T01.png", - "pixels": 495, - "underlay": "/layout-reference/ref-14/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中部辅助标签", - "box": [ - 11, - 93, - 40, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-14/T02.png", - "pixels": 147, - "underlay": "/layout-reference/ref-14/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部两处标识", - "box": [ - 9, - 147, - 80, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-14/T03.png", - "pixels": 178, - "underlay": "/layout-reference/ref-14/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 9, - 11, - 68, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/I01.png", - "pixels": 4421, - "mask": "/layout-reference/ref-14/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "右下小图", - "box": [ - 57, - 94, - 44, - 38 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/I02.png", - "pixels": 1672, - "mask": "/layout-reference/ref-14/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "右上细线阶梯", - "box": [ - 81, - 11, - 21, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-14/D01.png", - "pixels": 217 - } - ], - "ocr": [ - { - "box": [ - 0.07374630927974439, - 0.45785440622605367, - 0.817109144542773, - 0.04980842911877392 - ], - "confidence": 0.30000001192092896, - "text": "置羽毛 版式煲感设计分享" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 2 - } - }, - { - "id": "ref-15", - "name": "英文双行刊头与四分之一圆图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 617, - 409, - 112, - 173 - ], - "row": 3, - "column": 6 - }, - "width": 112, - "height": 173, - "reference": "/layout-reference/ref-15/source.png", - "annotated": "/layout-reference/ref-15/annotated.png", - "background": "/layout-reference/ref-15/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "英文第一行", - "box": [ - 6, - 5, - 75, - 19 - ], - "text": "bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T01.png", - "pixels": 477, - "underlay": "/layout-reference/ref-15/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "英文第二行", - "box": [ - 6, - 25, - 60, - 18 - ], - "text": "design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T02.png", - "pixels": 524, - "underlay": "/layout-reference/ref-15/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右上说明", - "box": [ - 82, - 4, - 26, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-15/T03.png", - "pixels": 164, - "underlay": "/layout-reference/ref-15/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部品牌与角标", - "box": [ - 1, - 164, - 109, - 8 - ], - "text": "BULUBLUE DESIGN", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-15/T04.png", - "pixels": 354, - "underlay": "/layout-reference/ref-15/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上部弧面主图", - "box": [ - 3, - 26, - 104, - 82 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I01.png", - "pixels": 7070, - "mask": "/layout-reference/ref-15/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方左图片", - "box": [ - 3, - 108, - 65, - 52 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I02.png", - "pixels": 3337, - "mask": "/layout-reference/ref-15/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "下方右图片", - "box": [ - 70, - 108, - 36, - 51 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-15/I03.png", - "pixels": 1836, - "mask": "/layout-reference/ref-15/I03-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.04371143600401779, - 0.05444647915103584, - 0.6863866533551897, - 0.08956561520379858 - ], - "confidence": 1, - "text": "bulublue" - }, - { - "box": [ - 0.04360773550246531, - 0.1459897803830712, - 0.5169511976696195, - 0.10108402377148817 - ], - "confidence": 1, - "text": "design" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19376, - "unreadableText": 1 - } - }, - { - "id": "ref-16", - "name": "上下灰阶色带与底部白区", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 592, - 113, - 173 - ], - "row": 4, - "column": 1 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-16/source.png", - "annotated": "/layout-reference/ref-16/annotated.png", - "background": "/layout-reference/ref-16/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右上竖字", - "box": [ - 83, - 14, - 6, - 25 - ], - "text": "高级版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-16/T01.png", - "pixels": 123, - "underlay": "/layout-reference/ref-16/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "底部左标题", - "box": [ - 9, - 119, - 32, - 3 - ], - "text": "蓝羽毛版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-16/T02.png", - "pixels": 71, - "underlay": "/layout-reference/ref-16/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部右说明", - "box": [ - 51, - 130, - 45, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-16/T03.png", - "pixels": 527, - "underlay": "/layout-reference/ref-16/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部右脚注", - "box": [ - 51, - 155, - 49, - 5 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-16/T04.png", - "pixels": 144, - "underlay": "/layout-reference/ref-16/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上部浅色图片区", - "box": [ - 1, - 1, - 109, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-16/I01.png", - "pixels": 5654, - "mask": "/layout-reference/ref-16/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中部深色图片区", - "box": [ - 1, - 54, - 109, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-16/I02.png", - "pixels": 5777, - "mask": "/layout-reference/ref-16/I02-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.08545858282579882, - 0.6702334819989704, - 0.2804102714786136, - 0.03718236140433073 - ], - "confidence": 0.30000001192092896, - "text": "經引毛飯式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 2 - } - }, - { - "id": "ref-17", - "name": "英文刊头与圆形叠标及窄栏", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 135, - 591, - 113, - 174 - ], - "row": 4, - "column": 2 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-17/source.png", - "annotated": "/layout-reference/ref-17/annotated.png", - "background": "/layout-reference/ref-17/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "右栏底线", - "box": [ - 82, - 121, - 29, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D01.png", - "pixels": 30 - }, - { - "id": "T01", - "kind": "text", - "role": "左上英文第一行", - "box": [ - 6, - 10, - 63, - 10 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T01.png", - "pixels": 277, - "underlay": "/layout-reference/ref-17/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左上英文第二行", - "box": [ - 5, - 20, - 56, - 16 - ], - "text": "Design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T02.png", - "pixels": 423, - "underlay": "/layout-reference/ref-17/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中部中文横题", - "box": [ - 51, - 50, - 60, - 16 - ], - "text": "高级感版式.", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-17/T03.png", - "pixels": 459, - "underlay": "/layout-reference/ref-17/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧窄栏正文", - "box": [ - 82, - 67, - 29, - 54 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-17/T04.png", - "pixels": 329, - "underlay": "/layout-reference/ref-17/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左下主图", - "box": [ - 5, - 68, - 73, - 101 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/I01.png", - "pixels": 7161, - "mask": "/layout-reference/ref-17/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "左中叠加圆形", - "box": [ - 5, - 53, - 22, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/I02.png", - "pixels": 372, - "mask": "/layout-reference/ref-17/I02-mask.png" - }, - { - "id": "D02", - "kind": "decoration", - "role": "刊头右侧双线", - "box": [ - 61, - 27, - 50, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D02.png", - "pixels": 253 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部横向贴条", - "box": [ - 58, - 167, - 54, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-17/D03.png", - "pixels": 324 - } - ], - "ocr": [ - { - "box": [ - 0.05014749428466078, - 0.0651340998323755, - 0.5663716814159292, - 0.06896551724137923 - ], - "confidence": 1, - "text": "Bulublue" - }, - { - "box": [ - 0.04661209192494646, - 0.1362427019870669, - 0.4878967645245668, - 0.07617359965240367 - ], - "confidence": 0.30000001192092896, - "text": "Design" - }, - { - "box": [ - 0.447888041843808, - 0.30109252421060173, - 0.5496516494976031, - 0.07597587117746873 - ], - "confidence": 0.5, - "text": "高级感版式," - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 1 - } - }, - { - "id": "ref-18", - "name": "上大图与下方英文双行", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 591, - 113, - 174 - ], - "row": 4, - "column": 3 - }, - "width": 113, - "height": 174, - "reference": "/layout-reference/ref-18/source.png", - "annotated": "/layout-reference/ref-18/annotated.png", - "background": "/layout-reference/ref-18/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上微标识", - "box": [ - 0, - 4, - 8, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-18/T01.png", - "pixels": 34, - "underlay": "/layout-reference/ref-18/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "下方英文第一行", - "box": [ - 5, - 108, - 75, - 17 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-18/T02.png", - "pixels": 471, - "underlay": "/layout-reference/ref-18/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "下方英文第二行", - "box": [ - 5, - 125, - 74, - 17 - ], - "text": "Design", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-18/T03.png", - "pixels": 435, - "underlay": "/layout-reference/ref-18/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "底部短信息组", - "box": [ - 2, - 155, - 102, - 16 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-18/T04.png", - "pixels": 418, - "underlay": "/layout-reference/ref-18/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方主图", - "box": [ - 19, - 6, - 88, - 91 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/I01.png", - "pixels": 7995, - "mask": "/layout-reference/ref-18/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左侧竖向刻度", - "box": [ - 0, - 65, - 5, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/D01.png", - "pixels": 112 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右下椭圆线组", - "box": [ - 76, - 128, - 34, - 19 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-18/D02.png", - "pixels": 441 - } - ], - "ocr": [ - { - "box": [ - 0.03818345576318917, - 0.6239403036164336, - 0.6846950384719533, - 0.08353701770534006 - ], - "confidence": 0.5, - "text": "Bulublue" - }, - { - "box": [ - 0.03602924893711706, - 0.6949484790717884, - 0.7361454921486105, - 0.14112464495545596 - ], - "confidence": 0.30000001192092896, - "text": "Design m" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19662, - "unreadableText": 2 - } - }, - { - "id": "ref-19", - "name": "四角大字与中央双圆竖题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 593, - 113, - 171 - ], - "row": 4, - "column": 4 - }, - "width": 113, - "height": 171, - "reference": "/layout-reference/ref-19/source.png", - "annotated": "/layout-reference/ref-19/annotated.png", - "background": "/layout-reference/ref-19/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左上大字", - "box": [ - 1, - 1, - 31, - 36 - ], - "text": "高", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T01.png", - "pixels": 401, - "underlay": "/layout-reference/ref-19/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "右上大字", - "box": [ - 78, - 0, - 33, - 37 - ], - "text": "级", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T02.png", - "pixels": 455, - "underlay": "/layout-reference/ref-19/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左下大字", - "box": [ - 1, - 132, - 35, - 39 - ], - "text": "排", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T03.png", - "pixels": 511, - "underlay": "/layout-reference/ref-19/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右下大字", - "box": [ - 77, - 133, - 35, - 38 - ], - "text": "版", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-19/T04.png", - "pixels": 590, - "underlay": "/layout-reference/ref-19/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "中央竖排标题", - "box": [ - 49, - 37, - 17, - 87 - ], - "text": "蓝羽毛の版式灵感", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-19/T05.png", - "pixels": 482, - "underlay": "/layout-reference/ref-19/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "右侧竖向微字", - "box": [ - 103, - 50, - 9, - 57 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-19/T06.png", - "pixels": 303, - "underlay": "/layout-reference/ref-19/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "顶部出血椭圆", - "box": [ - 1, - 1, - 109, - 58 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I01.png", - "pixels": 4172, - "mask": "/layout-reference/ref-19/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中央圆形图位", - "box": [ - 27, - 44, - 58, - 57 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I02.png", - "pixels": 2238, - "mask": "/layout-reference/ref-19/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "底部小椭圆", - "box": [ - 45, - 135, - 22, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/I03.png", - "pixels": 283, - "mask": "/layout-reference/ref-19/I03-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "中部左线组", - "box": [ - 0, - 105, - 47, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D01.png", - "pixels": 818 - }, - { - "id": "D02", - "kind": "decoration", - "role": "中部右线组", - "box": [ - 68, - 112, - 39, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D02.png", - "pixels": 435 - }, - { - "id": "D03", - "kind": "decoration", - "role": "底部短线", - "box": [ - 43, - 157, - 26, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-19/D03.png", - "pixels": 76 - } - ], - "ocr": [ - { - "box": [ - 0.04129793498384601, - 0.015594541432284448, - 0.22713864306784656, - 0.2007797270955165 - ], - "confidence": 1, - "text": "高" - }, - { - "box": [ - 0.03244837751659291, - 0.7076023384685672, - 0.23893805309734517, - 0.22807017543859653 - ], - "confidence": 1, - "text": "排" - }, - { - "box": [ - 0.6961651915855457, - -5.311890927117702e-10, - 0.23303834808259583, - 0.21247563352826515 - ], - "confidence": 1, - "text": "级" - }, - { - "box": [ - 0.7050147490689528, - 0.7173489271929825, - 0.2271386430678467, - 0.21832358674463936 - ], - "confidence": 1, - "text": "版" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19323, - "unreadableText": 1 - } - }, - { - "id": "ref-20", - "name": "右上大弧面与左下圆形标题", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 592, - 114, - 173 - ], - "row": 4, - "column": 5 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-20/source.png", - "annotated": "/layout-reference/ref-20/annotated.png", - "background": "/layout-reference/ref-20/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "圆中第一行", - "box": [ - 22, - 102, - 36, - 15 - ], - "text": "高级", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-20/T01.png", - "pixels": 229, - "underlay": "/layout-reference/ref-20/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "圆中第二行", - "box": [ - 21, - 123, - 39, - 18 - ], - "text": "版式", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-20/T02.png", - "pixels": 219, - "underlay": "/layout-reference/ref-20/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右下短注", - "box": [ - 72, - 158, - 32, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-20/T03.png", - "pixels": 92, - "underlay": "/layout-reference/ref-20/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右上出血椭圆", - "box": [ - 19, - 1, - 94, - 124 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/I01.png", - "pixels": 9205, - "mask": "/layout-reference/ref-20/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "左下叠加圆", - "box": [ - 8, - 90, - 61, - 59 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/I02.png", - "pixels": 2269, - "mask": "/layout-reference/ref-20/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上竖线", - "box": [ - 8, - 18, - 4, - 53 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/D01.png", - "pixels": 211 - }, - { - "id": "D02", - "kind": "decoration", - "role": "左下竖线", - "box": [ - 29, - 151, - 3, - 22 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-20/D02.png", - "pixels": 48 - } - ], - "ocr": [ - { - "box": [ - 0.19446010141722203, - 0.583293929900469, - 0.3181837650767544, - 0.09925391724573618 - ], - "confidence": 0.30000001192092896, - "text": "高级" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 1 - } - }, - { - "id": "ref-21", - "name": "右侧旋转英文与节点方图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 616, - 592, - 114, - 173 - ], - "row": 4, - "column": 6 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-21/source.png", - "annotated": "/layout-reference/ref-21/annotated.png", - "background": "/layout-reference/ref-21/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧旋转英文", - "box": [ - 87, - 2, - 25, - 109 - ], - "text": "Bulublue", - "direction": "rotated", - "reading": "verified", - "asset": "/layout-reference/ref-21/T01.png", - "pixels": 1020, - "underlay": "/layout-reference/ref-21/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左日期", - "box": [ - 1, - 108, - 14, - 11 - ], - "text": "25", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T02.png", - "pixels": 46, - "underlay": "/layout-reference/ref-21/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右日期", - "box": [ - 97, - 113, - 11, - 8 - ], - "text": "03", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T03.png", - "pixels": 59, - "underlay": "/layout-reference/ref-21/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右年份", - "box": [ - 85, - 124, - 23, - 9 - ], - "text": "2025", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-21/T04.png", - "pixels": 116, - "underlay": "/layout-reference/ref-21/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "中下说明", - "box": [ - 3, - 128, - 67, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-21/T05.png", - "pixels": 287, - "underlay": "/layout-reference/ref-21/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "底部两块微字", - "box": [ - 5, - 147, - 75, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-21/T06.png", - "pixels": 603, - "underlay": "/layout-reference/ref-21/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上主图", - "box": [ - 3, - 4, - 76, - 100 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/I01.png", - "pixels": 7379, - "mask": "/layout-reference/ref-21/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "底部灰色信息区", - "box": [ - 1, - 135, - 110, - 35 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/I02.png", - "pixels": 3138, - "mask": "/layout-reference/ref-21/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "上方圆节点", - "box": [ - 28, - 12, - 9, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D01.png", - "pixels": 64 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右上圆节点", - "box": [ - 75, - 29, - 11, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D02.png", - "pixels": 87 - }, - { - "id": "D03", - "kind": "decoration", - "role": "下方圆节点", - "box": [ - 46, - 99, - 11, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D03.png", - "pixels": 80 - }, - { - "id": "D04", - "kind": "decoration", - "role": "右下圆节点", - "box": [ - 97, - 101, - 11, - 9 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D04.png", - "pixels": 6 - }, - { - "id": "D05", - "kind": "decoration", - "role": "日期间椭圆线", - "box": [ - 17, - 112, - 77, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-21/D05.png", - "pixels": 200 - } - ], - "ocr": [ - { - "box": [ - 0.03216374201388889, - 0.6512524085500964, - 0.10818713450292397, - 0.046242774566473965 - ], - "confidence": 1, - "text": "25" - }, - { - "box": [ - 0.7009572502841679, - 0.02139049098390966, - 0.2679496675904034, - 0.6943671018861391 - ], - "confidence": 0.30000001192092896, - "text": "Bulublue:" - }, - { - "box": [ - 0.7424248804406856, - 0.7201085946235993, - 0.2110566702502512, - 0.049185508478124196 - ], - "confidence": 1, - "text": "2025" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 2 - } - }, - { - "id": "ref-22", - "name": "三段斜切背景与右侧白字", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 15, - 774, - 113, - 173 - ], - "row": 5, - "column": 1 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-22/source.png", - "annotated": "/layout-reference/ref-22/annotated.png", - "background": "/layout-reference/ref-22/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右侧竖排主标题", - "box": [ - 82, - 0, - 29, - 146 - ], - "text": "蓝羽毛版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-22/T01.png", - "pixels": 3039, - "underlay": "/layout-reference/ref-22/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左上说明", - "box": [ - 4, - 37, - 35, - 11 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T02.png", - "pixels": 160, - "underlay": "/layout-reference/ref-22/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "左中说明", - "box": [ - 2, - 74, - 35, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T03.png", - "pixels": 417, - "underlay": "/layout-reference/ref-22/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下说明", - "box": [ - 3, - 108, - 39, - 20 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T04.png", - "pixels": 430, - "underlay": "/layout-reference/ref-22/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "右下日期", - "box": [ - 74, - 144, - 34, - 12 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T05.png", - "pixels": 209, - "underlay": "/layout-reference/ref-22/T05-underlay.png" - }, - { - "id": "T06", - "kind": "text", - "role": "底部说明", - "box": [ - 3, - 155, - 62, - 14 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-22/T06.png", - "pixels": 373, - "underlay": "/layout-reference/ref-22/T06-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "顶部浅色斜切图", - "box": [ - 1, - 1, - 81, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I01.png", - "pixels": 4545, - "mask": "/layout-reference/ref-22/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "中部深色斜带图", - "box": [ - 1, - 33, - 111, - 117 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I02.png", - "pixels": 5013, - "mask": "/layout-reference/ref-22/I02-mask.png" - }, - { - "id": "I03", - "kind": "image", - "role": "底部灰色斜切图", - "box": [ - 1, - 104, - 109, - 66 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-22/I03.png", - "pixels": 4403, - "mask": "/layout-reference/ref-22/I03-mask.png" - } - ], - "ocr": [], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 5 - } - }, - { - "id": "ref-23", - "name": "上方方图与中部大写英文", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 134, - 775, - 114, - 172 - ], - "row": 5, - "column": 2 - }, - "width": 114, - "height": 172, - "reference": "/layout-reference/ref-23/source.png", - "annotated": "/layout-reference/ref-23/annotated.png", - "background": "/layout-reference/ref-23/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "右上标识", - "box": [ - 79, - 0, - 26, - 8 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T01.png", - "pixels": 85, - "underlay": "/layout-reference/ref-23/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "主图下方左右标签", - "box": [ - 1, - 72, - 78, - 7 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T02.png", - "pixels": 129, - "underlay": "/layout-reference/ref-23/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "中部大英文", - "box": [ - 0, - 78, - 113, - 25 - ], - "text": "BULUBLUE", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-23/T03.png", - "pixels": 1533, - "underlay": "/layout-reference/ref-23/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "英文下方四组微字", - "box": [ - 0, - 104, - 109, - 21 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T04.png", - "pixels": 729, - "underlay": "/layout-reference/ref-23/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "底部三处标签", - "box": [ - 0, - 165, - 105, - 6 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-23/T05.png", - "pixels": 285, - "underlay": "/layout-reference/ref-23/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "左上方图", - "box": [ - 5, - 4, - 74, - 68 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-23/I01.png", - "pixels": 5032, - "mask": "/layout-reference/ref-23/I01-mask.png" - } - ], - "ocr": [ - { - "box": [ - 0.01702461145837529, - 0.45011763555939854, - 0.9542548642521016, - 0.15596627819445708 - ], - "confidence": 1, - "text": "BULUBLUE" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19608, - "unreadableText": 4 - } - }, - { - "id": "ref-24", - "name": "斜排中文与倾斜装饰线框", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 256, - 775, - 113, - 172 - ], - "row": 5, - "column": 3 - }, - "width": 113, - "height": 172, - "reference": "/layout-reference/ref-24/source.png", - "annotated": "/layout-reference/ref-24/annotated.png", - "background": "/layout-reference/ref-24/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "上方斜排标题", - "box": [ - 3, - 0, - 79, - 31 - ], - "text": "蓝羽毛版式", - "direction": "angled", - "reading": "verified", - "asset": "/layout-reference/ref-24/T01.png", - "pixels": 725, - "underlay": "/layout-reference/ref-24/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "标题下方斜微字", - "box": [ - 34, - 27, - 26, - 10 - ], - "text": null, - "direction": "angled", - "reading": "unreadable", - "asset": "/layout-reference/ref-24/T02.png", - "pixels": 91, - "underlay": "/layout-reference/ref-24/T02-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "中央竖向主图", - "box": [ - 21, - 36, - 68, - 100 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/I01.png", - "pixels": 6799, - "mask": "/layout-reference/ref-24/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左侧斜长线", - "box": [ - 2, - 51, - 14, - 60 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D01.png", - "pixels": 190 - }, - { - "id": "D02", - "kind": "decoration", - "role": "右侧斜长线", - "box": [ - 94, - 15, - 15, - 119 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D02.png", - "pixels": 624 - }, - { - "id": "D03", - "kind": "decoration", - "role": "左下斜向线组", - "box": [ - 13, - 136, - 57, - 24 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D03.png", - "pixels": 750 - }, - { - "id": "D04", - "kind": "decoration", - "role": "右下斜贴条组", - "box": [ - 64, - 149, - 42, - 23 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D04.png", - "pixels": 438 - }, - { - "id": "D05", - "kind": "decoration", - "role": "底边线", - "box": [ - 1, - 168, - 34, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-24/D05.png", - "pixels": 68 - } - ], - "ocr": [ - { - "box": [ - 0.02748666679407777, - 0.00811422680517071, - 0.6144820131735113, - 0.19655708194703103 - ], - "confidence": 1, - "text": "蓝羽毛版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19436, - "unreadableText": 1 - } - }, - { - "id": "ref-25", - "name": "左侧竖题与右下方形主图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 376, - 774, - 113, - 173 - ], - "row": 5, - "column": 4 - }, - "width": 113, - "height": 173, - "reference": "/layout-reference/ref-25/source.png", - "annotated": "/layout-reference/ref-25/annotated.png", - "background": "/layout-reference/ref-25/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左侧竖题", - "box": [ - 8, - 39, - 8, - 46 - ], - "text": "高级·版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-25/T01.png", - "pixels": 233, - "underlay": "/layout-reference/ref-25/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "左侧辅助竖字", - "box": [ - 20, - 41, - 5, - 21 - ], - "text": null, - "direction": "vertical", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T02.png", - "pixels": 51, - "underlay": "/layout-reference/ref-25/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "右中说明", - "box": [ - 89, - 42, - 22, - 51 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T03.png", - "pixels": 397, - "underlay": "/layout-reference/ref-25/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "左下边缘说明", - "box": [ - 15, - 132, - 1, - 11 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-25/T04.png", - "pixels": 3, - "underlay": "/layout-reference/ref-25/T04-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下主图", - "box": [ - 14, - 102, - 94, - 65 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-25/I01.png", - "pixels": 6010, - "mask": "/layout-reference/ref-25/I01-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "左上阶梯横线", - "box": [ - 4, - 1, - 39, - 17 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-25/D01.png", - "pixels": 481 - } - ], - "ocr": [ - { - "box": [ - 0.06489673813555782, - 0.23121387201950871, - 0.08259590677807113, - 0.2601156069364161 - ], - "confidence": 0.30000001192092896, - "text": "高設•版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19549, - "unreadableText": 3 - } - }, - { - "id": "ref-26", - "name": "三行英文与曲线指引小图", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 496, - 774, - 114, - 173 - ], - "row": 5, - "column": 5 - }, - "width": 114, - "height": 173, - "reference": "/layout-reference/ref-26/source.png", - "annotated": "/layout-reference/ref-26/annotated.png", - "background": "/layout-reference/ref-26/background.png", - "elements": [ - { - "id": "D01", - "kind": "decoration", - "role": "第二行下划线", - "box": [ - 0, - 41, - 47, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D01.png", - "pixels": 7 - }, - { - "id": "D02", - "kind": "decoration", - "role": "第三行下划线", - "box": [ - 0, - 58, - 67, - 2 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D02.png", - "pixels": 134 - }, - { - "id": "T01", - "kind": "text", - "role": "第一行英文", - "box": [ - 0, - 0, - 81, - 18 - ], - "text": "Format 58", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T01.png", - "pixels": 657, - "underlay": "/layout-reference/ref-26/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "第二行英文", - "box": [ - 0, - 23, - 49, - 18 - ], - "text": "Bulubl", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T02.png", - "pixels": 433, - "underlay": "/layout-reference/ref-26/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "第三行英文", - "box": [ - 0, - 41, - 68, - 19 - ], - "text": "Bulublue", - "direction": "horizontal", - "reading": "verified", - "asset": "/layout-reference/ref-26/T03.png", - "pixels": 574, - "underlay": "/layout-reference/ref-26/T03-underlay.png" - }, - { - "id": "T04", - "kind": "text", - "role": "右侧竖排标题", - "box": [ - 98, - 68, - 12, - 46 - ], - "text": "高级版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-26/T04.png", - "pixels": 374, - "underlay": "/layout-reference/ref-26/T04-underlay.png" - }, - { - "id": "T05", - "kind": "text", - "role": "左下说明", - "box": [ - 4, - 140, - 44, - 29 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-26/T05.png", - "pixels": 888, - "underlay": "/layout-reference/ref-26/T05-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "右下方形图片", - "box": [ - 66, - 118, - 43, - 50 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/I01.png", - "pixels": 2150, - "mask": "/layout-reference/ref-26/I01-mask.png" - }, - { - "id": "D03", - "kind": "decoration", - "role": "中间分隔线", - "box": [ - 0, - 60, - 112, - 3 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D03.png", - "pixels": 230 - }, - { - "id": "D04", - "kind": "decoration", - "role": "中央自由曲线", - "box": [ - 6, - 48, - 85, - 87 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D04.png", - "pixels": 534 - }, - { - "id": "D05", - "kind": "decoration", - "role": "自动识别细线", - "box": [ - 91, - 59, - 19, - 1 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-26/D05.png", - "pixels": 19 - } - ], - "ocr": [ - { - "box": [ - 0.011695904385964868, - 0.017341040546724473, - 0.6549707602339181, - 0.07707129094412335 - ], - "confidence": 0.5, - "text": "Format 58" - }, - { - "box": [ - 0.01461988470535311, - 0.14065510587668595, - 0.4327485380116959, - 0.08285163776493254 - ], - "confidence": 0.5, - "text": "Bulubl" - }, - { - "box": [ - 0.017385159403405345, - 0.23650755152999758, - 0.5821887456882767, - 0.08382497357495267 - ], - "confidence": 1, - "text": "Bulublue" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19722, - "unreadableText": 1 - } - }, - { - "id": "ref-27", - "name": "对角双区与斜向文字带", - "source": { - "url": "/layout-reference/source.png", - "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", - "box": [ - 618, - 774, - 112, - 172 - ], - "row": 5, - "column": 6 - }, - "width": 112, - "height": 172, - "reference": "/layout-reference/ref-27/source.png", - "annotated": "/layout-reference/ref-27/annotated.png", - "background": "/layout-reference/ref-27/background.png", - "elements": [ - { - "id": "T01", - "kind": "text", - "role": "左侧白色竖题", - "box": [ - 6, - 7, - 12, - 86 - ], - "text": "高级の版式", - "direction": "vertical", - "reading": "verified", - "asset": "/layout-reference/ref-27/T01.png", - "pixels": 396, - "underlay": "/layout-reference/ref-27/T01-underlay.png" - }, - { - "id": "T02", - "kind": "text", - "role": "中部斜向文字", - "box": [ - 3, - 77, - 109, - 37 - ], - "text": "蓝羽毛·版式", - "direction": "angled", - "reading": "verified", - "asset": "/layout-reference/ref-27/T02.png", - "pixels": 273, - "underlay": "/layout-reference/ref-27/T02-underlay.png" - }, - { - "id": "T03", - "kind": "text", - "role": "底部说明", - "box": [ - 0, - 157, - 112, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "unreadable", - "asset": "/layout-reference/ref-27/T03.png", - "pixels": 865, - "underlay": "/layout-reference/ref-27/T03-underlay.png" - }, - { - "id": "I01", - "kind": "image", - "role": "上方三角出血图", - "box": [ - 1, - 1, - 108, - 89 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/I01.png", - "pixels": 6738, - "mask": "/layout-reference/ref-27/I01-mask.png" - }, - { - "id": "I02", - "kind": "image", - "role": "下方斜切图", - "box": [ - 1, - 91, - 108, - 68 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/I02.png", - "pixels": 4949, - "mask": "/layout-reference/ref-27/I02-mask.png" - }, - { - "id": "D01", - "kind": "decoration", - "role": "顶部右阶梯横线", - "box": [ - 61, - 0, - 48, - 20 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D01.png", - "pixels": 581 - }, - { - "id": "D02", - "kind": "decoration", - "role": "中部斜向浅带", - "box": [ - 0, - 72, - 112, - 40 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D02.png", - "pixels": 2000 - }, - { - "id": "D03", - "kind": "decoration", - "role": "左下阶梯横线", - "box": [ - 0, - 145, - 42, - 15 - ], - "text": null, - "direction": "horizontal", - "reading": "not-text", - "asset": "/layout-reference/ref-27/D03.png", - "pixels": 391 - } - ], - "ocr": [ - { - "box": [ - -0.021385720300243924, - 0.4385955087605439, - 0.8388941628592355, - 0.20254762043324548 - ], - "confidence": 0.5, - "text": "蓝羽毛-版式" - } - ], - "verification": { - "pixelIdentical": true, - "pixels": 19264, - "unreadableText": 1 - } - } -] diff --git a/apps/wiki/src/content/page-ids.json b/apps/wiki/src/content/page-ids.json index 108d506..781b809 100644 --- a/apps/wiki/src/content/page-ids.json +++ b/apps/wiki/src/content/page-ids.json @@ -12,45 +12,5 @@ "wiki:Main:welcome": "54d12ae51429f66fa7991ef5", "wiki:Help:namespaces": "1a33340838520492b2e095c0", "wiki:Template:idea": "40e0e456e2f5943610fef538", - "wiki:Draft:inbox": "a599a5734d13ec81fed1ffd1", - "guidance:premium-layout/router": "8eb8c76500580f7a4b56ba3c", - "guidance:premium-layout/offset-panels": "5971fc3d2563aa8005df5c13", - "guidance:premium-layout/vertical-rail": "9ad47529a7eaeee1fef771ca", - "guidance:premium-layout/monumental-type": "7f158059ba3a2b80dd750cc3", - "guidance:premium-layout/orbital-rings": "370d1881f229af63f1946df9", - "guidance:premium-layout/organic-ellipse": "31a978620a0d388f84772c95", - "guidance:premium-layout/modular-grid": "c34cf81137654ad38850c9bd", - "guidance:premium-layout/editorial-serif": "dbe94ccaa708bd120549ae86", - "guidance:premium-layout/horizontal-band": "768587e537d6f1ee77a51961", - "guidance:premium-layout/diagonal-cards": "0962c2bf1c558e0e32425f59", - "guidance:premium-layout/annotation-lines": "347b732caa4af4afa43b65a4", - "guidance:premium-layout/split-contrast": "3edf144a443c1fdf23827fb3", - "guidance:premium-layout/type-frame": "97227671a9dc95c4948e591b", - "guidance:premium-layout/ref-01": "eb937b42be92a9f6feee684f", - "guidance:premium-layout/ref-02": "1179d1b1a5f21a99fa0cf542", - "guidance:premium-layout/ref-03": "f3079f1dbb242180e04b602b", - "guidance:premium-layout/ref-04": "b7a5981ea582ed94384af2ae", - "guidance:premium-layout/ref-05": "a01a0ab78461632b8cb148f9", - "guidance:premium-layout/ref-06": "c524f9c3858052ebcc5ab8ef", - "guidance:premium-layout/ref-07": "7d4cefdfada28bbe9e570af3", - "guidance:premium-layout/ref-08": "e53f7620a90d3f8076c44326", - "guidance:premium-layout/ref-09": "18aff77f5f032eda1a2cd04b", - "guidance:premium-layout/ref-10": "d5906c34d3efb6fdbcb40da8", - "guidance:premium-layout/ref-11": "d1718fd03494af0c8c95e4c4", - "guidance:premium-layout/ref-12": "f78131152506cbf7dec7506a", - "guidance:premium-layout/ref-13": "d3c5eae33973291530d1118e", - "guidance:premium-layout/ref-14": "b042317268286cff3e52d145", - "guidance:premium-layout/ref-15": "acbebf9c77fb2432be877bf0", - "guidance:premium-layout/ref-16": "d3b2ec816983aadb5b4690be", - "guidance:premium-layout/ref-17": "7b1b2fc5b9690213bbbe07ac", - "guidance:premium-layout/ref-18": "5b376e57c70ce8a49cf4e491", - "guidance:premium-layout/ref-19": "246c33f9fff157ab9a4c1df7", - "guidance:premium-layout/ref-20": "b5db869088ed8296d8329f83", - "guidance:premium-layout/ref-21": "fd6b7caabcf3077f9bdc32c7", - "guidance:premium-layout/ref-22": "8561d1fd6f23335373eab1ba", - "guidance:premium-layout/ref-23": "30f3978167ba3da8770ec5de", - "guidance:premium-layout/ref-24": "6c72e53a6e2f497852f98f04", - "guidance:premium-layout/ref-25": "51c0712b17a8372a5fa151df", - "guidance:premium-layout/ref-26": "f356b77194288909ee4352b4", - "guidance:premium-layout/ref-27": "b30a9778355b7132633f51b3" + "wiki:Draft:inbox": "a599a5734d13ec81fed1ffd1" } diff --git a/apps/wiki/src/content/skills/guidance.ts b/apps/wiki/src/content/skills/guidance.ts index 59d7cb2..ed8c258 100644 --- a/apps/wiki/src/content/skills/guidance.ts +++ b/apps/wiki/src/content/skills/guidance.ts @@ -1,5 +1,4 @@ import {guidanceUrl} from '../page-links'; -import {layoutDocuments} from '../layouts/documents'; import {getSkill,skillCatalog,type Block,type Resource} from './catalog'; export type GuidanceResource=Resource&{documentPath?:string}; @@ -44,7 +43,6 @@ guidanceDocuments.push({ {type:'links',refs:['doc:street-people/checks','doc:shadow-puppet/delivery']}, ], }); -guidanceDocuments.unshift(...layoutDocuments); const registry=new Map(guidanceDocuments.map(doc=>[doc.path,doc])); export function getGuidance(path:string){return registry.get(path);} export function guidanceBacklinks(path:string){return guidanceDocuments.filter(doc=>doc.path!==path&&doc.blocks.some(b=>b.type==='links'&&b.refs!.some(id=>doc.resources.find(r=>r.id===id)?.documentPath===path)));} diff --git a/apps/wiki/src/lib/api-documentation.ts b/apps/wiki/src/lib/api-documentation.ts index 5921140..2270fe5 100644 --- a/apps/wiki/src/lib/api-documentation.ts +++ b/apps/wiki/src/lib/api-documentation.ts @@ -6,7 +6,7 @@ export const apiDocuments:Record={ "统一内容流", "GET", "查询参数:q(可选,最多 200 字符);category(可选,标签名称或命名空间);cursor(可选,上一页 nextCursor)。", - "JSON:entries 数组与 nextCursor;没有更多结果时 nextCursor 为 null。静态内容仅出现在第一页。", + "JSON:entries 数组与 nextCursor;没有更多结果时 nextCursor 为 null。静态内容仅出现在第一页;已由相同 publicId 的数据库笔记接管时不重复展示。", "GET /api/explore-feed?q=排版", "503:素材库暂时无法连接。" ], @@ -21,18 +21,18 @@ export const apiDocuments:Record={ "/api/notes/{id}": [ "读取与编辑笔记", "GET, PUT", - "路径参数:id,笔记稳定 ID。PUT 使用 application/json,所有字段必填:title(1–200 字符)、description(最多 1000 字符)、markdown(最多 100000 字符)、tags(最多 50 个标签 UUID)、revision(GET 返回的 entry.revision,64 位十六进制)。", - "GET 返回 {entry,tags};PUT 返回更新后的 {entry}。先 GET 获取 revision,再 PUT;冲突后重新读取。", + "路径参数:id,笔记稳定 ID(publicId 或存储 UUID)。PUT 使用 application/json,以下字段必填:title(1–200 字符)、description(最多 1000 字符)、markdown(最多 100000 字符)、tags(最多 50 个标签 UUID)、revision(GET 返回的 entry.revision,64 位十六进制)。可选 assets(最多 100 项 {id:媒体 UUID,role:content|caption},替换媒体关联,原二进制不删除);coverAssetId(图片 UUID 或 null,必须为本笔记 content 图片;null 清除显式封面)。静态代码页须先通过创建接口保存为数据库笔记,才可更新媒体。", + "GET 返回 {entry,tags},entry.assets 为媒体关联、entry.coverAssetId 为显式封面;PUT 返回更新后的 {entry}。先 GET 获取 revision,再 PUT;冲突后重新读取。", "GET /api/notes/{id}\nPUT /api/notes/{id}\n{\"title\":\"标题\",\"description\":\"简介\",\"markdown\":\"正文\",\"tags\":[],\"revision\":\"\"}", "400:输入错误;404:笔记不存在;409:版本冲突。" ], "/api/posts": [ "创建笔记或素材包", "POST", - "application/json:kind(必填,image / video / audio / article / motion)、title(必填,1–200 字符);slug(可选,最多 120 字符,以小写字母或数字开头,仅含小写字母、数字、连字符);description(可选,最多 1000 字符);text(可选,最多 100000 字符);tags(可选,最多 50 个 UUID);coverAssetId(可选,图片 UUID);assets(可选,最多 100 项,{id: UUID,role: content | caption},role 默认 content)。媒体类型必须引用至少一个对应类型的 content 素材。", - "201 JSON:{id,slug}。引用已有素材;不会在此接口上传二进制文件。", + "application/json:kind(必填,image / video / audio / article / motion)、title(必填,1–200 字符);publicId(可选,唯一的 24 位小写十六进制稳定 ID,用于保留原页面地址);slug(可选,最多 120 字符,以小写字母或数字开头,仅含小写字母、数字、连字符);description(可选,最多 1000 字符);text(可选,最多 100000 字符);tags(可选,最多 50 个 UUID);coverAssetId(可选,图片 UUID);assets(可选,最多 100 项,{id: UUID,role: content | caption},role 默认 content)。媒体类型必须引用至少一个对应类型的 content 素材。", + "201 JSON:{id,slug,url,publicId?},url 为 /explore/。id 仍为存储 UUID。引用已有素材;不会在此接口上传二进制文件。", "POST /api/posts\n{\"kind\":\"article\",\"title\":\"新笔记\",\"text\":\"正文\",\"tags\":[]}", - "400:输入或素材引用不合法;409:slug 已存在。" + "400:输入或素材引用不合法;409:slug 或 publicId 已存在。" ], "/api/tags": [ "标签列表与创建", @@ -43,10 +43,10 @@ export const apiDocuments:Record={ "400:输入错误;409:slug 冲突。" ], "/api/upload": [ - "上传媒体并创建素材包", + "上传媒体,可独立保存素材", "POST", - "multipart/form-data:kind(必填,image / video / audio);title(必填,1–200 字符);slug(可选,小写字母或数字组成的非空段,以连字符分隔,最多 120 字符);description(可选,最多 100000 字符);tags(可选,UUID 数组的 JSON 字符串,最多 50 项);文件字段名任意,至少一个文件。最多 16 个文件,单个不超过 250 MB,总计不超过 1 GB。图片支持 JPG、PNG、WebP、GIF、AVIF;音频必须为独立声音文件。", - "201 JSON:{id,slug,url,assets},assets 为素材 UUID 数组。视频会自动进入后台加工队列。", + "multipart/form-data:kind(必填,image / video / audio);title(普通上传必填,1–200 字符;assetOnly=true 时可省略);assetOnly(可选,字符串 true / false,默认 false;true 时只存媒体,不创建 post);slug(可选,小写字母或数字组成的非空段,以连字符分隔,最多 120 字符);description(可选,最多 100000 字符);tags(可选,UUID 数组的 JSON 字符串,最多 50 项);文件字段名任意,至少一个文件。最多 16 个文件,单个不超过 250 MB,总计不超过 1 GB。图片支持 JPG、PNG、WebP、GIF、AVIF;音频必须为独立声音文件。", + "201 JSON:普通上传为 {id,slug,url,assets};assetOnly=true 为 {assets,files:[{id,filename,sha256}]},不创建 post。assets 为素材 UUID 数组,之后可交给 /api/posts 组合;视频素材会自动进入后台加工队列。", "POST /api/upload\nContent-Type: multipart/form-data\nkind=image\ntitle=示例图片\ntags=[]\nfile=<图片文件>", "400:输入或媒体不合法;409:slug 冲突;413:上传超过限制。" ], diff --git a/apps/wiki/src/lib/api.ts b/apps/wiki/src/lib/api.ts index c496458..35b8ba6 100644 --- a/apps/wiki/src/lib/api.ts +++ b/apps/wiki/src/lib/api.ts @@ -8,6 +8,7 @@ export function apiError(res: NextApiResponse,error: unknown) { if(error instanceof ZodError) return res.status(400).json({error:"请检查输入内容",issues:error.issues}); const message=error instanceof Error?error.message:""; const clientMessages:Record={ + 'Media changes require a stored note':'媒体与封面需先通过创建接口保存为数据库笔记', 'Character PNG must have transparency':'请上传带真实透明背景的 PNG,透明区域 alpha 为 0,人物内部 alpha 至少为 250', 'Referenced asset does not exist':'引用的素材不存在', 'A media post needs matching content':'素材包需要包含对应类型的素材', diff --git a/apps/wiki/src/lib/explore.ts b/apps/wiki/src/lib/explore.ts index 6147dd2..ae259bc 100644 --- a/apps/wiki/src/lib/explore.ts +++ b/apps/wiki/src/lib/explore.ts @@ -3,22 +3,24 @@ import {noteDescriptions} from '@/content/note-descriptions'; import {guidanceDocuments,guidanceMarkdown} from '@/content/skills/guidance'; import {wikiPages,wikiMarkdown} from '@/content/wiki'; import {skillCatalog} from '@/content/skills/catalog'; +import {publicPostId} from './model'; import {pageId,exploreUrl,guidanceUrl} from '@/content/page-links'; -import {getPostById,feed} from './library'; +import {getPostById,feed,publishedPublicIds} from './library'; import {applyStaticEdit,staticEdits,withRevision} from './note-edits'; export type ExploreMedia={kind:'image'|'video'|'audio';url:string;title:string;poster?:string}; -export type ExploreEntry={id:string;title:string;description:string;imageCount:number;namespace:string;categories:string[];markdown:string;media:ExploreMedia[];color:string;postSlug?:string;editableMarkdown?:string;revision?:string}; +export type ExploreEntry={id:string;title:string;description:string;imageCount:number;namespace:string;categories:string[];markdown:string;media:ExploreMedia[];color:string;postSlug?:string;editableMarkdown?:string;revision?:string;assets?:{id:string;kind:string;role:string}[];coverAssetId?:string|null}; export const staticEntries:ExploreEntry[]=[...guidanceDocuments.map(doc=>{const card=skillCatalog.find(c=>doc.path===c.id);return {id:pageId('guidance:'+doc.path),title:doc.title,description:noteDescriptions[doc.path]||doc.blocks.find(b=>b.type==='paragraph')?.text||doc.title,imageCount:new Set([...(card?[card.image]:[]),...doc.resources.filter(r=>r.kind==='image').map(r=>r.href)]).size,namespace:'Main',categories:[doc.collection],markdown:guidanceMarkdown(doc.path)!,media:Array.from(new Map([...(card?[{kind:'image' as const,url:card.image,title:card.alt}]:[]),...doc.resources.filter(r=>r.kind==='image').map(r=>({kind:'image' as const,url:r.href,title:r.title}))].map(m=>[m.url,m])).values()),color:'#eee5dc'};}),...wikiPages.map(page=>({id:pageId('wiki:'+page.namespace+':'+page.slug),title:page.title,description:page.summary,imageCount:0,namespace:page.namespace,categories:page.categories,markdown:wikiMarkdown(page),media:[],color:page.color}))]; // Canonicalize document references, including absolute links; pictures remain explicit links. export function canonicalMarkdown(text:string){return text.replace(/\]\((?:http:\/\/8\.211\.154\.134:18131)?\/skills\/([^ )]+)\)/g,(whole,path:string)=>{const clean=path.replace(/\/index\.md$/,'').replace(/\.md$/,'');return pageId('guidance:'+clean)?']('+guidanceUrl(clean)+'?agent_mode=True)':whole;});} export async function getEntry(id:string,client?:PoolClient):Promise{ - const page=staticEntries.find(e=>e.id===id);if(page){const edits=await staticEdits(client);return withRevision(applyStaticEdit({...page,markdown:canonicalMarkdown(page.markdown)},edits.find(e=>e.page_id===id)));} - if(!/^[0-9a-f-]{36}$/.test(id))return null; - const post=await getPostById(id,client);if(!post)return null; - const media:ExploreMedia[]=post.assets.filter(a=>a.kind!=='text'&&a.role==='content').map(a=>({kind:a.kind as ExploreMedia['kind'],url:'/api/media/'+a.id,title:a.filename||post.title,...(a.kind==='video'&&a.variants.includes('poster')?{poster:'/api/media/'+post.assets.find(p=>p.source_asset_id===a.id&&p.derivation==='poster')?.id}:{})})); + const validId=/^(?:[0-9a-f]{24}|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/.test(id); + const post=validId&&(process.env.DATABASE_URL||client||id.length===36)?await getPostById(id,client):null; + if(!post){const page=staticEntries.find(e=>e.id===id);if(!page)return null;const edits=await staticEdits(client);return withRevision(applyStaticEdit({...page,markdown:canonicalMarkdown(page.markdown)},edits.find(e=>e.page_id===id)));} + const orderedAssets=[...post.assets].sort((a,b)=>Number(b.id===post.cover_asset_id)-Number(a.id===post.cover_asset_id)); + const media:ExploreMedia[]=orderedAssets.filter(a=>a.kind!=='text'&&a.role==='content').map(a=>({kind:a.kind as ExploreMedia['kind'],url:'/api/media/'+a.id,title:a.filename||post.title,...(a.kind==='video'&&a.variants.includes('poster')?{poster:'/api/media/'+post.assets.find(p=>p.source_asset_id===a.id&&p.derivation==='poster')?.id}:{})})); const editableMarkdown=post.assets.filter(a=>a.kind==='text').map(a=>a.body||'').join('\n\n'); const body=editableMarkdown+'\n\n'+post.assets.filter(a=>a.derivation).map(a=>'['+({poster:'视频封面',audio_track:'独立音轨',silent_video:'静音视频'}[a.derivation||'']||a.derivation)+'](/api/media/'+a.id+')').join(' · '); - return withRevision({id:post.id,title:post.title,editableMarkdown,description:post.description||body.slice(0,180)||post.title,imageCount:media.filter(m=>m.kind==='image').length,namespace:['image','video','audio'].includes(post.kind)?'File':'Main',categories:post.tags.map(t=>t.name),markdown:'# '+post.title+'\n\n'+body,media,color:'#eee5dc',postSlug:post.slug}); + return withRevision({id:publicPostId(post),assets:post.assets.filter(a=>a.kind!=='text').map(a=>({id:a.id,kind:a.kind,role:a.role})),coverAssetId:post.cover_asset_id,title:post.title,editableMarkdown,description:post.description||body.slice(0,180)||post.title,imageCount:media.filter(m=>m.kind==='image').length,namespace:['image','video','audio'].includes(post.kind)?'File':'Main',categories:post.tags.map(t=>t.name),markdown:'# '+post.title+'\n\n'+body,media,color:'#eee5dc',postSlug:post.slug}); } -export async function exploreFeed(q='',category='',cursor?:string){const [data,edits]=await Promise.all([feed({q,cursor}),staticEdits()]);const pages=staticEntries.map(e=>applyStaticEdit(e,edits.find(edit=>edit.page_id===e.id)));return {entries:[...(cursor?[]:pages.filter(e=>(!q||(e.title+e.description).includes(q)))),...data.posts.map(post=>{const cover=post.cover_asset_id||post.assets.find(a=>a.kind==='image'&&a.role==='content')?.id;const video=post.assets.find(a=>a.kind==='video');return {id:post.id,title:post.title,description:post.description||post.assets.find(a=>a.kind==='text')?.body?.slice(0,180)||post.title,imageCount:post.assets.filter(a=>a.kind==='image'&&a.role==='content').length,namespace:['image','video','audio'].includes(post.kind)?'File':'Main',categories:post.tags.map(t=>t.name),markdown:'',media:cover?[{kind:'image' as const,url:'/api/media/'+cover,title:post.title}]:video?.variants.includes('poster')?[{kind:'image' as const,url:'/api/media/'+post.assets.find(a=>a.source_asset_id===video.id&&a.derivation==='poster')?.id,title:post.title}]:[],color:'#eee5dc'};})].filter(e=>!category||e.categories.includes(category)||e.namespace===category),nextCursor:data.nextCursor};} +export async function exploreFeed(q='',category='',cursor?:string){const [data,edits,published]=await Promise.all([feed({q,cursor}),staticEdits(),publishedPublicIds()]);const pages=staticEntries.filter(e=>!published.includes(e.id)).map(e=>applyStaticEdit(e,edits.find(edit=>edit.page_id===e.id)));return {entries:[...(cursor?[]:pages.filter(e=>(!q||(e.title+e.description).includes(q)))),...data.posts.map(post=>{const cover=post.cover_asset_id||post.assets.find(a=>a.kind==='image'&&a.role==='content')?.id;const video=post.assets.find(a=>a.kind==='video');return {id:publicPostId(post),title:post.title,description:post.description||post.assets.find(a=>a.kind==='text')?.body?.slice(0,180)||post.title,imageCount:post.assets.filter(a=>a.kind==='image'&&a.role==='content').length,namespace:['image','video','audio'].includes(post.kind)?'File':'Main',categories:post.tags.map(t=>t.name),markdown:'',media:cover?[{kind:'image' as const,url:'/api/media/'+cover,title:post.title}]:video?.variants.includes('poster')?[{kind:'image' as const,url:'/api/media/'+post.assets.find(a=>a.source_asset_id===video.id&&a.derivation==='poster')?.id,title:post.title}]:[],color:'#eee5dc'};})].filter(e=>!category||e.categories.includes(category)||e.namespace===category),nextCursor:data.nextCursor};} export function entryText(entry:ExploreEntry){return `${entry.markdown}\n\nDescription: ${entry.description}\nNamespace: ${entry.namespace}\nCategories: ${entry.categories.join(', ')}\n\n`+entry.media.map(m=>`- ${m.kind}: [${m.title}](${m.url})`).join('\n')+'\n\n[网页]('+exploreUrl(entry.id)+')\n';} diff --git a/apps/wiki/src/lib/library.ts b/apps/wiki/src/lib/library.ts index d0a6ba7..12220a6 100644 --- a/apps/wiki/src/lib/library.ts +++ b/apps/wiki/src/lib/library.ts @@ -14,7 +14,7 @@ export async function getPost(slug: string): Promise { return serialize(result.rows,await tags())[0] || null; } export async function getPostById(id:string,client?:PoolClient):Promise{ - const result=await (client||db()).query(`${expand} WHERE p.id=$1`,[id]); + const result=await (client||db()).query(`${expand} WHERE ${/^[0-9a-f]{24}$/.test(id)?'p.public_id':'p.id'}=$1`,[id]); return serialize(result.rows,await tags(client))[0]||null; } export async function feed(options: {kind?: PostKind; path?: string; cursor?: string; q?: string} = {}): Promise { @@ -31,3 +31,5 @@ export async function feed(options: {kind?: PostKind; path?: string; cursor?: st const contributions=(await db().query(`SELECT to_char(occurred_at AT TIME ZONE 'Asia/Shanghai','YYYY-MM-DD') AS day,sum(amount)::integer AS total FROM contribution_events WHERE occurred_at>=now()-interval '366 days' GROUP BY day ORDER BY day`)).rows; return {posts,tags:allTags,contributions,nextCursor:hasMore&&last?encodeCursor(last.created_at,last.id):null}; } + +export async function publishedPublicIds():Promise{return (await db().query("SELECT public_id FROM posts WHERE public_id IS NOT NULL")).rows.map(p=>p.public_id);} diff --git a/apps/wiki/src/lib/model.ts b/apps/wiki/src/lib/model.ts index f0dc2e5..07cdc9f 100644 --- a/apps/wiki/src/lib/model.ts +++ b/apps/wiki/src/lib/model.ts @@ -8,7 +8,7 @@ export const sections = [ export type PostKind = typeof sections[number]["kind"]; export type Asset = { id: string; kind: "image" | "video" | "audio" | "text"; filename: string | null; body: string | null; width: number | null; height: number | null; duration: number | null; has_audio: boolean | null; processing_status: string; variants: string[]; role: string; source_asset_id: string | null; derivation: string | null }; export type Tag = { id: string; name: string; slug: string; path: string }; -export type Post = { description: string; id: string; slug: string; kind: PostKind; title: string; created_at: string; updated_at: string; cover_asset_id: string | null; assets: Asset[]; tags: Tag[] }; +export type Post = { description: string; id: string; public_id?: string | null; slug: string; kind: PostKind; title: string; created_at: string; updated_at: string; cover_asset_id: string | null; assets: Asset[]; tags: Tag[] }; export type FeedData = { posts: Post[]; tags: Tag[]; contributions: { day: string; total: number }[]; nextCursor: string | null; unavailable?: boolean }; export function validSection(path: string) { return sections.find(s => s.path === path); } export const mediaUrl = (id: string, variant?: string) => `/api/media/${id}${variant ? `?variant=${variant}` : ""}`; @@ -20,3 +20,5 @@ export function decodeCursor(value?: string) { } catch { /* invalid pagination cursor */ } throw new Error("Invalid cursor"); } + +export const publicPostId=(post:Pick)=>post.public_id||post.id; diff --git a/apps/wiki/src/lib/note-edits.ts b/apps/wiki/src/lib/note-edits.ts index 2721f24..926efda 100644 --- a/apps/wiki/src/lib/note-edits.ts +++ b/apps/wiki/src/lib/note-edits.ts @@ -3,36 +3,54 @@ import {createHash,randomUUID} from 'node:crypto'; import {z} from 'zod'; import {db,transaction} from './db'; import type {ExploreEntry} from './explore'; +import {linkDerivedAssets} from './asset-links'; +import {postInput} from './write'; export function withoutTitle(markdown:string){return markdown.replace(/^# [^\n]*(?:\n|$)\n?/,'');} export function withRevision(entry:ExploreEntry):ExploreEntry{ const editableMarkdown=entry.editableMarkdown??withoutTitle(entry.markdown); - const revision=createHash('sha256').update(JSON.stringify([entry.title,entry.description,editableMarkdown,[...entry.categories].sort()])).digest('hex'); + const revision=createHash('sha256').update(JSON.stringify([entry.title,entry.description,editableMarkdown,[...entry.categories].sort(),entry.coverAssetId??null,entry.assets?.map(a=>[a.id,a.role])??[]])).digest('hex'); return {...entry,editableMarkdown,revision}; } export async function staticEdits(client?:PoolClient){if(!process.env.DATABASE_URL)return [];return (await (client||db()).query(`SELECT e.*,COALESCE((SELECT jsonb_agg(t.name ORDER BY t.name) FROM note_edit_tags et JOIN tags t ON t.id=et.tag_id WHERE et.page_id=e.page_id),'[]') AS categories FROM note_edits e`)).rows;} export function applyStaticEdit(entry:ExploreEntry,edit?:{title:string;description:string;markdown:string;categories:string[]}):ExploreEntry{ return edit?{...entry,title:edit.title,description:edit.description,editableMarkdown:edit.markdown,markdown:'# '+edit.title+'\n\n'+edit.markdown,categories:edit.categories}:entry; } -export const noteEditInput=z.object({title:z.string().trim().min(1).max(200),description:z.string().trim().max(1000),markdown:z.string().max(100000),tags:z.array(z.uuid()).max(50),revision:z.string().regex(/^[0-9a-f]{64}$/)}); +export const noteEditInput=z.object({title:z.string().trim().min(1).max(200),description:z.string().trim().max(1000),markdown:z.string().max(100000),tags:z.array(z.uuid()).max(50),revision:z.string().regex(/^[0-9a-f]{64}$/),assets:postInput.shape.assets.unwrap().optional(),coverAssetId:z.uuid().nullable().optional()}); export class NoteEditConflict extends Error{} export async function saveNote(id:string,input:z.infer,read:(client:PoolClient)=>Promise){ await transaction(async client=>{ await client.query('SELECT pg_advisory_xact_lock(hashtextextended($1,0))',['note-edit:'+id]); - const isPost=/^[0-9a-f-]{36}$/.test(id); - if(isPost)await client.query('SELECT id FROM posts WHERE id=$1 FOR UPDATE',[id]); + const stored=(await client.query(`SELECT id,kind,cover_asset_id FROM posts WHERE ${/^[0-9a-f]{24}$/.test(id)?'public_id':'id'}=$1 FOR UPDATE`,[id])).rows[0]; + const isPost=Boolean(stored),postId=stored?.id; const current=await read(client);if(!current)throw Error('Note not found'); if(current.revision!==input.revision)throw new NoteEditConflict('这篇笔记已被修改,请重新打开编辑后再保存。'); const tagIds=[...new Set(input.tags)]; if((await client.query('SELECT id FROM tags WHERE id=ANY($1::uuid[])',[tagIds])).rowCount!==tagIds.length)throw Error('Tag not found'); if(isPost){ - await client.query('UPDATE posts SET title=$2,description=$3,updated_at=now(),edited_at=now() WHERE id=$1',[id,input.title,input.description]); + if(input.assets!==undefined){ + const ids=[...new Set(input.assets.map(a=>a.id))]; + const assets=ids.length?(await client.query('SELECT id,kind FROM assets WHERE id=ANY($1::uuid[])',[ids])).rows:[]; + if(assets.length!==ids.length||assets.some(a=>a.kind==='text'))throw Error('Referenced asset does not exist'); + if(['image','video','audio'].includes(stored.kind)&&!input.assets.some(a=>a.role==='content'&&assets.some(r=>r.id===a.id&&r.kind===stored.kind)))throw Error('A media post needs matching content'); + await client.query("DELETE FROM post_assets pa USING assets a WHERE pa.post_id=$1 AND pa.asset_id=a.id AND a.kind<>'text'",[postId]); + let position=Number((await client.query('SELECT COALESCE(max(position),-1)+1 AS n FROM post_assets WHERE post_id=$1',[postId])).rows[0].n); + for(const a of input.assets)await client.query('INSERT INTO post_assets(post_id,asset_id,position,role) VALUES($1,$2,$3,$4)',[postId,a.id,position++,a.role]); + } + if(input.assets!==undefined&&input.coverAssetId===undefined&&stored.cover_asset_id&&!input.assets.some(a=>a.id===stored.cover_asset_id&&a.role==='content'))await client.query("UPDATE posts SET cover_asset_id=(SELECT a.id FROM post_assets pa JOIN assets a ON a.id=pa.asset_id WHERE pa.post_id=$1 AND pa.role='content' AND a.kind='image' ORDER BY pa.position LIMIT 1) WHERE id=$1",[postId]); + if(input.coverAssetId!==undefined){ + if(input.coverAssetId!==null&&!(await client.query("SELECT 1 FROM assets a JOIN post_assets pa ON pa.asset_id=a.id WHERE pa.post_id=$1 AND a.id=$2 AND a.kind='image' AND pa.role='content'",[postId,input.coverAssetId])).rowCount)throw Error('Cover must reference an image'); + await client.query('UPDATE posts SET cover_asset_id=$2 WHERE id=$1',[postId,input.coverAssetId]); + } + await client.query('UPDATE posts SET title=$2,description=$3,updated_at=now(),edited_at=now() WHERE id=$1',[postId,input.title,input.description]); // Replace this note's text link, never modify a text asset shared by other notes. - await client.query("DELETE FROM post_assets pa USING assets a WHERE pa.post_id=$1 AND pa.asset_id=a.id AND a.kind='text'",[id]); + await client.query("DELETE FROM post_assets pa USING assets a WHERE pa.post_id=$1 AND pa.asset_id=a.id AND a.kind='text'",[postId]); const assetId=randomUUID();await client.query("INSERT INTO assets(id,kind,body) VALUES($1,'text',$2)",[assetId,input.markdown]); - await client.query("INSERT INTO post_assets(post_id,asset_id,position,role) SELECT $1,$2,COALESCE(max(position)+1,0),'caption' FROM post_assets WHERE post_id=$1",[id,assetId]); - await client.query('DELETE FROM post_tags WHERE post_id=$1',[id]); - for(const tagId of tagIds)await client.query('INSERT INTO post_tags(post_id,tag_id) VALUES($1,$2)',[id,tagId]); + await client.query("INSERT INTO post_assets(post_id,asset_id,position,role) SELECT $1,$2,COALESCE(max(position)+1,0),'caption' FROM post_assets WHERE post_id=$1",[postId,assetId]); + await client.query('DELETE FROM post_tags WHERE post_id=$1',[postId]); + for(const tagId of tagIds)await client.query('INSERT INTO post_tags(post_id,tag_id) VALUES($1,$2)',[postId,tagId]); + if(input.assets!==undefined)await linkDerivedAssets(client,postId); }else{ + if(input.assets!==undefined||input.coverAssetId!==undefined)throw Error('Media changes require a stored note'); await client.query(`INSERT INTO note_edits(page_id,title,description,markdown) VALUES($1,$2,$3,$4) ON CONFLICT(page_id) DO UPDATE SET title=excluded.title,description=excluded.description,markdown=excluded.markdown,updated_at=now()`,[id,input.title,input.description,input.markdown]); await client.query('DELETE FROM note_edit_tags WHERE page_id=$1',[id]); for(const tagId of tagIds)await client.query('INSERT INTO note_edit_tags(page_id,tag_id) VALUES($1,$2)',[id,tagId]); diff --git a/apps/wiki/src/lib/write.ts b/apps/wiki/src/lib/write.ts index 0737cbc..553ee11 100644 --- a/apps/wiki/src/lib/write.ts +++ b/apps/wiki/src/lib/write.ts @@ -3,6 +3,7 @@ import { z } from "zod"; import { transaction } from "./db"; import {linkDerivedAssets} from "./asset-links"; export const postInput=z.object({ + publicId:z.string().regex(/^[0-9a-f]{24}$/).optional(), slug:z.string().regex(/^[a-z0-9][a-z0-9-]{0,119}$/).optional(), kind:z.enum(["image","video","audio","article","motion"]),title:z.string().trim().min(1).max(200), assets:z.array(z.object({id:z.uuid(),role:z.enum(["content","caption"]).default("content")})).max(100).default([]), @@ -18,11 +19,11 @@ export async function createPost(input:z.infer) { if(assets.length!==ids.length) throw new Error("Referenced asset does not exist"); if(["image","video","audio"].includes(input.kind)&&!input.assets.some(link=>link.role==='content'&&assets.some(a=>a.id===link.id&&a.kind===input.kind))) throw new Error("A media post needs matching content"); if(input.coverAssetId && !(await client.query("SELECT 1 FROM assets WHERE id=$1 AND kind='image'",[input.coverAssetId])).rowCount) throw new Error("Cover must reference an image"); - await client.query('INSERT INTO posts(id,slug,kind,title,cover_asset_id,description) VALUES($1,$2,$3,$4,$5,$6)',[id,slug,input.kind,input.title,input.coverAssetId||null,input.description||input.text?.slice(0,200)||input.title]); + await client.query('INSERT INTO posts(id,slug,kind,title,cover_asset_id,description,public_id) VALUES($1,$2,$3,$4,$5,$6,$7)',[id,slug,input.kind,input.title,input.coverAssetId||null,input.description||input.text?.slice(0,200)||input.title,input.publicId||null]); for(const [position,a] of input.assets.entries()) await client.query('INSERT INTO post_assets(post_id,asset_id,position,role) VALUES($1,$2,$3,$4)',[id,a.id,position,a.role]); if(input.text){const textId=randomUUID();await client.query("INSERT INTO assets(id,kind,body) VALUES($1,'text',$2)",[textId,input.text]);await client.query("INSERT INTO post_assets(post_id,asset_id,position,role) VALUES($1,$2,$3,'caption')",[id,textId,input.assets.length]);} for(const tag of new Set(input.tags)) await client.query('INSERT INTO post_tags(post_id,tag_id) VALUES($1,$2)',[id,tag]); await linkDerivedAssets(client,id); - return {id,slug}; + return {id,slug,...(input.publicId?{publicId:input.publicId}:{}),url:'/explore/'+(input.publicId||id)}; }); } diff --git a/apps/wiki/src/pages/api/upload.ts b/apps/wiki/src/pages/api/upload.ts index 02bc364..3fe2111 100644 --- a/apps/wiki/src/pages/api/upload.ts +++ b/apps/wiki/src/pages/api/upload.ts @@ -21,8 +21,9 @@ export async function upload(req:NextApiRequest,res:NextApiResponse,policy:Uploa const form=formidable({maxFileSize:250*1024*1024,maxTotalFileSize:1024*1024*1024,maxFiles:16,allowEmptyFiles:false}); form.on('fileBegin',(_name,file)=>temporary.push(file.filepath)); const [fields,files]=await form.parse(req); + const assetOnly=z.enum(['true','false']).default('false').parse(fields.assetOnly?.[0])==='true'; const kind=z.enum(['image','video','audio']).parse(policy.validateImage?'image':fields.kind?.[0]); - const title=z.string().trim().min(1).max(200).parse(fields.title?.[0]||policy.defaultTitle); + const title=z.string().trim().min(1).max(200).parse(fields.title?.[0]||policy.defaultTitle||(assetOnly?'上传素材':undefined)); const slug=z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/).max(120).optional().parse(fields.slug?.[0]); const description=z.string().trim().max(100000).parse(fields.description?.[0]||''); const tagIds=z.array(z.uuid()).max(50).parse(JSON.parse(fields.tags?.[0]||'[]')); @@ -46,19 +47,21 @@ export async function upload(req:NextApiRequest,res:NextApiResponse,policy:Uploa const id=randomUUID(),key=`originals/${id}`;await putFile(key,file.filepath,mime);uploaded.push(key); records.push({id,key,mime,width,height,duration,hasAudio,size:file.size,hash:hash.digest('hex'),filename:file.originalFilename||'未命名素材'}); } - const postId=randomUUID(); + const postId=assetOnly?null:randomUUID(); await transaction(async client=>{ - await client.query('INSERT INTO posts(id,slug,kind,title,description) VALUES($1,$2,$3,$4,$5)',[postId,slug||postId,kind,title,description.slice(0,1000)||title]); + if(postId)await client.query('INSERT INTO posts(id,slug,kind,title,description) VALUES($1,$2,$3,$4,$5)',[postId,slug||postId,kind,title,description.slice(0,1000)||title]); for(const [position,a] of records.entries()){ await client.query('INSERT INTO assets(id,kind,filename,storage_key,mime_type,byte_size,sha256,width,height,duration,has_audio,processing_status) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)',[a.id,kind,a.filename,a.key,a.mime,a.size,a.hash,a.width,a.height,a.duration,a.hasAudio,kind==='video'?'pending':'ready']); - await client.query('INSERT INTO post_assets(post_id,asset_id,position) VALUES($1,$2,$3)',[postId,a.id,position]); + if(postId)await client.query('INSERT INTO post_assets(post_id,asset_id,position) VALUES($1,$2,$3)',[postId,a.id,position]); for(const tag of new Set(tagIds))await client.query('INSERT INTO asset_tags(asset_id,tag_id) VALUES($1,$2)',[a.id,tag]); if(kind==='video')await client.query('INSERT INTO media_jobs(id,asset_id) VALUES($1,$2)',[randomUUID(),a.id]); } - if(description){const id=randomUUID();await client.query("INSERT INTO assets(id,kind,body) VALUES($1,'text',$2)",[id,description]);await client.query("INSERT INTO post_assets(post_id,asset_id,position,role) VALUES($1,$2,$3,'caption')",[postId,id,records.length]);} - for(const tag of new Set(tagIds))await client.query('INSERT INTO post_tags(post_id,tag_id) VALUES($1,$2)',[postId,tag]); + if(postId&&description){const id=randomUUID();await client.query("INSERT INTO assets(id,kind,body) VALUES($1,'text',$2)",[id,description]);await client.query("INSERT INTO post_assets(post_id,asset_id,position,role) VALUES($1,$2,$3,'caption')",[postId,id,records.length]);} + if(postId)for(const tag of new Set(tagIds))await client.query('INSERT INTO post_tags(post_id,tag_id) VALUES($1,$2)',[postId,tag]); }); - uploaded.length=0;return res.status(201).json({id:postId,slug:slug||postId,url:`/p/${slug||postId}`,assets:records.map(a=>a.id)}); + uploaded.length=0; + if(assetOnly)return res.status(201).json({assets:records.map(a=>a.id),files:records.map(a=>({id:a.id,filename:a.filename,sha256:a.hash}))}); + return res.status(201).json({id:postId,slug:slug||postId,url:`/p/${slug||postId}`,assets:records.map(a=>a.id)}); }catch(e){if(e instanceof Error && (/maxFileSize|maxTotalFileSize|maxFiles/.test(e.message)))return res.status(413).json({error:'最多 16 个文件,单个不超过 250 MB,总计不超过 1 GB'});return apiError(res,e);} finally{await Promise.allSettled(temporary.map(p=>rm(p,{force:true})));await Promise.allSettled(uploaded.map(removeObject));} } diff --git a/apps/wiki/src/pages/api/wiki-index.ts b/apps/wiki/src/pages/api/wiki-index.ts index c8da66b..a12d7c1 100644 --- a/apps/wiki/src/pages/api/wiki-index.ts +++ b/apps/wiki/src/pages/api/wiki-index.ts @@ -1,5 +1,6 @@ import type {NextApiRequest,NextApiResponse} from 'next'; +import {publishedPublicIds} from '@/lib/library'; import {staticEntries} from '@/lib/explore'; import {applyStaticEdit,staticEdits} from '@/lib/note-edits'; import {exploreUrl} from '@/content/page-links'; -export default async function handler(_:NextApiRequest,res:NextApiResponse){const edits=await staticEdits();const entries=staticEntries.map(e=>applyStaticEdit(e,edits.find(edit=>edit.page_id===e.id)));res.setHeader('Content-Type','text/plain; charset=utf-8');res.send('# PROMPT\n\n'+entries.map(e=>`- [${e.title}](${exploreUrl(e.id)}?agent_mode=True)`).join('\n')+'\n\n素材分页索引:/api/explore-feed(使用 nextCursor 翻页)。所有内容均使用 /explore/{id}?agent_mode=True 读取纯文本。\n');} +export default async function handler(_:NextApiRequest,res:NextApiResponse){const [edits,published]=await Promise.all([staticEdits(),process.env.DATABASE_URL?publishedPublicIds():Promise.resolve([])]);const entries=staticEntries.filter(e=>!published.includes(e.id)).map(e=>applyStaticEdit(e,edits.find(edit=>edit.page_id===e.id)));res.setHeader('Content-Type','text/plain; charset=utf-8');res.send('# PROMPT\n\n'+entries.map(e=>`- [${e.title}](${exploreUrl(e.id)}?agent_mode=True)`).join('\n')+'\n\n素材分页索引:/api/explore-feed(使用 nextCursor 翻页)。所有内容均使用 /explore/{id}?agent_mode=True 读取纯文本。\n');} diff --git a/apps/wiki/src/pages/explore/[id].tsx b/apps/wiki/src/pages/explore/[id].tsx index aa956fc..a768e6c 100644 --- a/apps/wiki/src/pages/explore/[id].tsx +++ b/apps/wiki/src/pages/explore/[id].tsx @@ -1,7 +1,5 @@ import type {GetServerSideProps} from 'next'; -import {legacyLayoutIds} from '@/content/layouts/documents'; -import {guidanceUrl} from '@/content/page-links'; import {ExploreDetail} from '@/components/ExploreDetail'; import {getEntry,entryText,exploreFeed} from '@/lib/explore'; export default ExploreDetail; -export const getServerSideProps:GetServerSideProps=async({params,query,res,req})=>{if(legacyLayoutIds.includes(String(params?.id)))return {redirect:{destination:guidanceUrl('premium-layout/router'),permanent:false}};try{const entry=await getEntry(String(params?.id||''));if(!entry)return {notFound:true};if(String(query.agent_mode||'').toLowerCase()==='true'){res.setHeader('Content-Type','text/plain; charset=utf-8');res.setHeader('Cache-Control','no-cache');res.end(req.method==='HEAD'?undefined:entryText(entry));return {props:{}};}return {props:{entry,background:(await exploreFeed()).entries}};}catch{res.statusCode=503;res.setHeader('Retry-After','10');res.end('内容暂时无法读取,请稍后重试');return {props:{}};}}; +export const getServerSideProps:GetServerSideProps=async({params,query,res,req})=>{try{const entry=await getEntry(String(params?.id||''));if(!entry)return {notFound:true};if(String(query.agent_mode||'').toLowerCase()==='true'){res.setHeader('Content-Type','text/plain; charset=utf-8');res.setHeader('Cache-Control','no-cache');res.end(req.method==='HEAD'?undefined:entryText(entry));return {props:{}};}return {props:{entry,background:(await exploreFeed()).entries}};}catch{res.statusCode=503;res.setHeader('Retry-After','10');res.end('内容暂时无法读取,请稍后重试');return {props:{}};}}; diff --git a/apps/wiki/src/pages/p/[slug].tsx b/apps/wiki/src/pages/p/[slug].tsx index 20de51b..d7d6cae 100644 --- a/apps/wiki/src/pages/p/[slug].tsx +++ b/apps/wiki/src/pages/p/[slug].tsx @@ -1,4 +1,5 @@ import type {GetServerSideProps} from 'next'; +import {publicPostId} from '@/lib/model'; import {getPost} from '@/lib/library'; export default function LegacyPost(){return null;} -export const getServerSideProps:GetServerSideProps=async({params,query})=>{const post=await getPost(String(params?.slug||''));return post?{redirect:{destination:'/explore/'+post.id+(String(query.agent_mode||'').toLowerCase()==='true'?'?agent_mode=True':''),permanent:true}}:{notFound:true};}; +export const getServerSideProps:GetServerSideProps=async({params,query})=>{const post=await getPost(String(params?.slug||''));return post?{redirect:{destination:'/explore/'+publicPostId(post)+(String(query.agent_mode||'').toLowerCase()==='true'?'?agent_mode=True':''),permanent:true}}:{notFound:true};}; diff --git a/apps/wiki/tests/api-publication.test.ts b/apps/wiki/tests/api-publication.test.ts new file mode 100644 index 0000000..7d23289 --- /dev/null +++ b/apps/wiki/tests/api-publication.test.ts @@ -0,0 +1,28 @@ +import {test} from 'node:test'; +import assert from 'node:assert/strict'; +import {randomUUID} from 'node:crypto'; +import {postInput} from '../src/lib/write'; +import {noteEditInput,withRevision} from '../src/lib/note-edits'; +import {publicPostId} from '../src/lib/model'; +import {entryText,type ExploreEntry} from '../src/lib/explore'; +test('generic API accepts stable public IDs while retaining UUID storage and rejecting invalid IDs',()=>{ + const publicId='0123456789abcdef01234567',stored=randomUUID(); + assert.equal(postInput.parse({kind:'article',title:'文本与图像',publicId}).publicId,publicId); + for(const id of ['bad','ABCDEF0123456789abcdef01','1'.repeat(25)])assert.equal(postInput.safeParse({kind:'article',title:'x',publicId:id}).success,false); + assert.equal(publicPostId({id:stored,public_id:publicId}),publicId);assert.equal(publicPostId({id:stored}),stored); +}); +test('media/cover edits are optional and change optimistic revisions independently of the text',()=>{ + const a=randomUUID(),b=randomUUID(); + const entry:ExploreEntry={id:'0123456789abcdef01234567',title:'笔记',description:'说明',markdown:'# 笔记\n\n正文',namespace:'Main',categories:[],imageCount:1,media:[],color:'#fff',assets:[{id:a,kind:'image',role:'content'}],coverAssetId:a}; + const before=withRevision(entry).revision; + assert.notEqual(withRevision({...entry,coverAssetId:b}).revision,before); + assert.notEqual(withRevision({...entry,assets:[{id:b,kind:'image',role:'content'}]}).revision,before); + const input={title:'笔记',description:'说明',markdown:'正文',tags:[],revision:before}; + assert.equal(noteEditInput.parse(input).assets,undefined); + assert.equal(noteEditInput.parse({...input,assets:[{id:a}],coverAssetId:null}).assets?.[0].role,'content'); +}); +test('AI text preserves JSON, code and media links as ordinary modalities',()=>{ + const id=randomUUID(),markdown='# 文本说明\n\n```json\n{"type":"text","box":[1,2,3,4]}\n```\n\n```tsx\nexport default function Example(){return
}\n```'; + const entry:ExploreEntry={id,title:'文本说明',description:'可访问',markdown,namespace:'Main',categories:[],imageCount:1,media:[{kind:'image',url:'/api/media/'+randomUUID(),title:'标注图'}],color:'#fff'}; + const text=entryText(entry);assert.ok(text.includes(markdown));assert.ok(text.includes(entry.media[0].url));assert.ok(text.includes('/explore/'+id)); +}); diff --git a/apps/wiki/tests/explore.test.ts b/apps/wiki/tests/explore.test.ts index e53eb68..f827ef0 100644 --- a/apps/wiki/tests/explore.test.ts +++ b/apps/wiki/tests/explore.test.ts @@ -15,16 +15,3 @@ test('independent notes expose their own description, tags and complete image co const workflow=(await getEntry(pageId('guidance:shadow-puppet/workflow')))!; assert.notEqual(workflow.description,note.description);assert.notEqual(workflow.id,note.id); }); - -test('agent text preserves tutorial HTML and TSX code without returning an HTML page',async()=>{ - const entry=(await getEntry(pageId('guidance:premium-layout/ref-01')))!; - let body='';const headers:Record={}; - const response={setHeader:(k:string,v:string)=>headers[k]=v,end:(value:string)=>{body=value}}; - await getServerSideProps({params:{id:entry.id},query:{agent_mode:'True'},res:response,req:{method:'GET'}} as never); - assert.match(headers['Content-Type'],/text\/plain/); - assert.ok(body.startsWith('# '+entry.title)); - assert.match(body,/```\n\n/); - assert.ok(body.includes('export default function Example')); - assert.ok(body.includes('app/designs/ref-01/page.tsx')); - assert.equal(body,entryText(entry)); -}); diff --git a/apps/wiki/tests/integration.test.ts b/apps/wiki/tests/integration.test.ts index 7935c01..cfa9176 100644 --- a/apps/wiki/tests/integration.test.ts +++ b/apps/wiki/tests/integration.test.ts @@ -100,6 +100,31 @@ test('real PostgreSQL + S3 notes, flat tags, resource sharing and video processi assert.equal((await request('/api/notes/'+note.id)).entry.title,payload.title,'Static edits outlive content publication'); assert.equal((await fetch(base+'/api/notes/missing')).status,404); assert.equal((await fetch(base+'/api/notes/'+note.id,{method:'DELETE'})).status,405); + // API-only publication: upload independent assets, retain a stable public ID, then update cover. + const postCountBefore=(await db().query('SELECT count(*)::integer AS n FROM posts')).rows[0].n; + const assetsForm=new FormData();assetsForm.set('kind','image');assetsForm.set('assetOnly','true'); + assetsForm.append('files',new Blob([new Uint8Array(a)],{type:'image/png'}),'standalone-a.png'); + const secondImage=await sharp({create:{width:160,height:220,channels:3,background:'#d7c7b5'}}).png().toBuffer(); + assetsForm.append('files',new Blob([new Uint8Array(secondImage)],{type:'image/png'}),'standalone-b.png'); + const uploadedOnly=await fetch(base+'/api/upload',{method:'POST',body:assetsForm});assert.equal(uploadedOnly.status,201,await uploadedOnly.clone().text()); + const independent=await uploadedOnly.json();assert.equal(independent.assets.length,2);assert.equal(independent.files[0].filename,'standalone-a.png'); + assert.equal((await db().query('SELECT count(*)::integer AS n FROM posts')).rows[0].n,postCountBefore,'assetOnly never creates a post'); + const publicId=note.id; + const apiBody='## 纯文本资料\n\n```json\n{"type":"text","box":[1,2,3,4]}\n```\n\n```tsx\nexport default function Demo(){return
}\n```'; + const publishedNote=await request('/api/posts',{kind:'article',title:'API 发布资料',slug:'api-public-'+randomUUID(),publicId,text:apiBody,assets:independent.assets.map((id:string)=>({id})),coverAssetId:independent.assets[0],tags:[child.id]}); + assert.equal(publishedNote.publicId,publicId);assert.ok(!(await fetch(base+'/api/wiki-index').then(r=>r.text())).includes('['+payload.title+']'),'Migrated code entries are not listed under stale titles');assert.equal(publishedNote.url,'/explore/'+publicId); + const publicEntry=(await request('/api/notes/'+publicId)).entry;assert.equal(publicEntry.id,publicId);assert.equal(publicEntry.postSlug,publishedNote.slug);assert.equal(publicEntry.coverAssetId,independent.assets[0]); + assert.equal((await request('/api/explore-feed')).entries.filter((e:{id:string})=>e.id===publicId).length,1,'API note replaces rather than duplicates its static predecessor'); + const publicText=await fetch(base+'/explore/'+publicId+'?agent_mode=True').then(r=>r.text());assert.ok(publicText.includes(apiBody));assert.ok(publicText.includes(independent.assets[0])); + const coverPayload={title:publicEntry.title,description:publicEntry.description,markdown:publicEntry.editableMarkdown,tags:[child.id],revision:publicEntry.revision,coverAssetId:independent.assets[1]}; + const coverSaved=await edit(publicId,coverPayload);assert.equal(coverSaved.status,200,await coverSaved.clone().text()); + const afterCover=(await request('/api/notes/'+publicId)).entry;assert.equal(afterCover.coverAssetId,independent.assets[1]);assert.equal(afterCover.media[0].url,'/api/media/'+independent.assets[1]);assert.notEqual(afterCover.revision,publicEntry.revision); + assert.equal((await edit(publicId,coverPayload)).status,409,'Stale cover edits cannot overwrite current media'); + const replaceMedia=await edit(publicId,{...coverPayload,revision:afterCover.revision,assets:[{id:independent.assets[1],role:'content'},{id:independent.assets[0],role:'caption'}]});assert.equal(replaceMedia.status,200,await replaceMedia.clone().text()); + const finalPublic=(await request('/api/notes/'+publicId)).entry;assert.equal(finalPublic.imageCount,1);assert.equal(finalPublic.assets.length,2);assert.equal(finalPublic.editableMarkdown,apiBody); + const duplicatePublic=await fetch(base+'/api/posts',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({kind:'article',title:'不覆盖已有 ID',publicId,text:'x'})});assert.equal(duplicatePublic.status,409); + assert.equal((await fetch(base+'/p/'+publishedNote.slug,{redirect:'manual'})).headers.get('location'),'/explore/'+publicId); + for(const removed of ['/layout-reference/index.html','/layout-reference/ref-01/index.html','/layout-reference/index.json'])assert.equal((await fetch(base+removed)).status,404,removed); for(const doc of ['SKILL','style','upload','checks']){const r=await fetch(base+`/skills/street-people/${doc}.md`);assert.equal(r.status,200);assert.ok(r.headers.get('content-type')?.includes('text/markdown'));const text=await r.text();assert.ok(text.startsWith('# '));assert.ok(!text.includes('path.join(publicRoot,url); -test('27 source layouts have stable row-major IDs, 5/5/5/6/6 positions and scoped components',async()=>{ - assert.deepEqual(manifest.map(l=>l.id),[...layoutIds]);assert.equal(layoutDocuments.length,28); - assert.deepEqual([1,2,3,4,5].map(row=>manifest.filter(l=>l.source.row===row).length),[5,5,5,6,6]); - const hash=createHash('sha256').update(await readFile(asset('/layout-reference/source.png'))).digest('hex'); - for(const l of manifest){assert.equal(l.source.sha256,hash);assert.equal(new Set(l.elements.map(e=>e.id)).size,l.elements.length);for(const e of l.elements){assert.ok(e.asset.startsWith('/layout-reference/'+l.id+'/'));assert.ok(e.pixels>0);assert.equal(e.id[0],{text:'T',image:'I',decoration:'D'}[e.kind]);if(e.reading==='unreadable')assert.equal(e.text,null)}} -}); -test('all 27 extracted layer composites equal their original source crops at every RGB pixel',async()=>{ - for(const l of manifest){ - const result=await sharp(asset(l.background)).composite(l.elements.map(e=>({input:asset(e.asset),left:e.box[0],top:e.box[1]}))).removeAlpha().raw().toBuffer(); - const reference=await sharp(asset(l.reference)).removeAlpha().raw().toBuffer();assert.ok(result.equals(reference),l.id+' physical layer composite must match'); - } -}); -test('a residual end glyph stays in T01 instead of creating a second word; other columns stay independent',()=>{ - assert.equal(textMergeTarget([38,24,6,6],[{box:[2,20,38,15],direction:'horizontal'}]),0); - assert.equal(textMergeTarget([90,24,6,6],[{box:[2,20,38,15],direction:'horizontal'}]),-1); - const first=manifest[0];assert.deepEqual(first.elements.filter(e=>e.kind==='text').map(e=>e.id),['T01','T02']); - assert.ok(first.elements.find(e=>e.id==='T01')!.box[0]+first.elements.find(e=>e.id==='T01')!.box[2]>=44); - const date=manifest.find(l=>l.id==='ref-21')!.elements.find(e=>e.id==='T03')!;assert.equal(date.text,'03');assert.equal(date.kind,'text'); - const grayWord=manifest.find(l=>l.id==='ref-23')!.elements.find(e=>e.text==='BULUBLUE')!;assert.equal(grayWord.kind,'text'); -}); -test('component replacement rejects foreign IDs and wrong kinds; default React renders exact source assets',()=>{ - assert.throws(()=>validateReplacements('ref-01',{text:{'ref-02/T01':'wrong'}})); - assert.throws(()=>validateReplacements('ref-01',{text:{'ref-01/I01':'wrong'}})); - assert.throws(()=>validateReplacements('missing',{})); - for(const id of layoutIds){const html=renderToStaticMarkup();assert.ok(html.includes('data-layout-id="'+id+'"'));assert.equal((html.match(/data-component=/g)||[]).length,manifest.find(l=>l.id===id)!.elements.length)} - const edited=renderToStaticMarkup();assert.ok(edited.includes('我的品牌'));assert.ok(edited.includes('mask-image'));assert.ok(edited.includes('T01-underlay.png')); -}); -test('HTML, React and Next.js examples bind each source ID and retired approximate posts redirect to Router',async()=>{ - for(const l of manifest){assert.ok(htmlExample(l.id).includes("const id='"+l.id+"'"));transformSync(reactExample(l.id),{loader:'tsx'});transformSync(nextExample(l.id),{loader:'tsx'});const html=await readFile(asset('/layout-reference/'+l.id+'/index.html'),'utf8');assert.ok(html.includes('data-toggle="text"'));assert.ok(html.includes('data-toggle="image"'));assert.ok(html.includes('manifest='+JSON.stringify(l).replaceAll('<','\\u003c')))} - for(const id of legacyLayoutIds){const response=await getServerSideProps({params:{id},query:{},res:{},req:{}} as never);assert.ok('redirect' in response)} -}); diff --git a/content/layout-reference/README.md b/content/layout-reference/README.md new file mode 100644 index 0000000..92c2faa --- /dev/null +++ b/content/layout-reference/README.md @@ -0,0 +1,19 @@ +# 原图排版的本地创作数据 + +本目录是发布客户端的输入,不在 Wiki 应用的 public、pages 或内容注册表中,不提供网页或静态子 URL。 + +- `assets/`:原图、裁片、分类标注、构件 PNG、遮罩及新 Router 封面。 +- `manifest.json`:27 张的源坐标、类型、文字与图形位置,使用 `asset:` 本地逻辑引用。 +- `post-ids.json`:保留的 28 个普通 post 稳定 ID。 +- `annotations.json` / `ocr-evidence.json` / `group-text.ts`:识别、人工复核与同词合并的源资料。 +- `renderer.tsx`:作为 Markdown 代码示例上传的创作端组件,不由 Wiki 编译或运行。 + +本地重建封面:`node scripts/layout-reference-cover.mjs`。 + +发布预检:`node scripts/publish-layout-reference.mjs --dry-run`。 + +实际发布设置 `WIKI_BASE` 为指定 Wiki、`WIKI_PUBLISH_STATE` 为独立的本地检查点路径后运行发布脚本。客户端只调用 `/api/upload`、`/api/posts`、`/api/notes/{id}`、`/api/tags`。先单独上传 PNG,再将媒体 UUID、构件 JSON、源码文本组合为普通 post。所有图片链接都会转换为 `/api/media/{id}`;不上传 HTML 页面、JSON 文件端点或 ZIP 页面。 + +检查点记录站点、素材摘要到 UUID 的映射及已发布 post,支持中断后继续。更新已存在的同 slug post 使用 revision、媒体关联与封面字段;遇到占用 ID 则停止,避免覆盖其他内容。请为不同站点使用不同检查点。 + +对外是 27 张设计 post + 1 篇 Router。Wiki 不需要为这些内容增加路由、组件或代码注册;客户端生成的正文可通过 `?agent_mode=True` 读取。原图低清,未知微字保留独立字形,不猜写。 diff --git a/apps/wiki/src/content/layouts/reference/annotations.json b/content/layout-reference/annotations.json similarity index 100% rename from apps/wiki/src/content/layouts/reference/annotations.json rename to content/layout-reference/annotations.json diff --git a/apps/wiki/public/layout-reference/numbered-source.png b/content/layout-reference/assets/numbered-source.png similarity index 100% rename from apps/wiki/public/layout-reference/numbered-source.png rename to content/layout-reference/assets/numbered-source.png diff --git a/apps/wiki/public/layout-reference/ref-01/D01.png b/content/layout-reference/assets/ref-01/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/D01.png rename to content/layout-reference/assets/ref-01/D01.png diff --git a/apps/wiki/public/layout-reference/ref-01/D02.png b/content/layout-reference/assets/ref-01/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/D02.png rename to content/layout-reference/assets/ref-01/D02.png diff --git a/apps/wiki/public/layout-reference/ref-01/I01-mask.png b/content/layout-reference/assets/ref-01/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/I01-mask.png rename to content/layout-reference/assets/ref-01/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-01/I01.png b/content/layout-reference/assets/ref-01/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/I01.png rename to content/layout-reference/assets/ref-01/I01.png diff --git a/apps/wiki/public/layout-reference/ref-01/I02-mask.png b/content/layout-reference/assets/ref-01/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/I02-mask.png rename to content/layout-reference/assets/ref-01/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-01/I02.png b/content/layout-reference/assets/ref-01/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/I02.png rename to content/layout-reference/assets/ref-01/I02.png diff --git a/apps/wiki/public/layout-reference/ref-01/T01-underlay.png b/content/layout-reference/assets/ref-01/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/T01-underlay.png rename to content/layout-reference/assets/ref-01/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-01/T01.png b/content/layout-reference/assets/ref-01/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/T01.png rename to content/layout-reference/assets/ref-01/T01.png diff --git a/apps/wiki/public/layout-reference/ref-01/T02-underlay.png b/content/layout-reference/assets/ref-01/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/T02-underlay.png rename to content/layout-reference/assets/ref-01/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-01/T02.png b/content/layout-reference/assets/ref-01/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/T02.png rename to content/layout-reference/assets/ref-01/T02.png diff --git a/apps/wiki/public/layout-reference/ref-01/annotated.png b/content/layout-reference/assets/ref-01/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/annotated.png rename to content/layout-reference/assets/ref-01/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-01/background.png b/content/layout-reference/assets/ref-01/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/background.png rename to content/layout-reference/assets/ref-01/background.png diff --git a/apps/wiki/public/layout-reference/ref-01/decoration-map.png b/content/layout-reference/assets/ref-01/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/decoration-map.png rename to content/layout-reference/assets/ref-01/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-01/image-map.png b/content/layout-reference/assets/ref-01/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/image-map.png rename to content/layout-reference/assets/ref-01/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-01/reconstructed.png b/content/layout-reference/assets/ref-01/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/reconstructed.png rename to content/layout-reference/assets/ref-01/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-01/source.png b/content/layout-reference/assets/ref-01/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/source.png rename to content/layout-reference/assets/ref-01/source.png diff --git a/apps/wiki/public/layout-reference/ref-01/text-map.png b/content/layout-reference/assets/ref-01/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-01/text-map.png rename to content/layout-reference/assets/ref-01/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-02/D01.png b/content/layout-reference/assets/ref-02/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/D01.png rename to content/layout-reference/assets/ref-02/D01.png diff --git a/apps/wiki/public/layout-reference/ref-02/D02.png b/content/layout-reference/assets/ref-02/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/D02.png rename to content/layout-reference/assets/ref-02/D02.png diff --git a/apps/wiki/public/layout-reference/ref-02/I01-mask.png b/content/layout-reference/assets/ref-02/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I01-mask.png rename to content/layout-reference/assets/ref-02/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-02/I01.png b/content/layout-reference/assets/ref-02/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I01.png rename to content/layout-reference/assets/ref-02/I01.png diff --git a/apps/wiki/public/layout-reference/ref-02/I02-mask.png b/content/layout-reference/assets/ref-02/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I02-mask.png rename to content/layout-reference/assets/ref-02/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-02/I02.png b/content/layout-reference/assets/ref-02/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I02.png rename to content/layout-reference/assets/ref-02/I02.png diff --git a/apps/wiki/public/layout-reference/ref-02/I03-mask.png b/content/layout-reference/assets/ref-02/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I03-mask.png rename to content/layout-reference/assets/ref-02/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-02/I03.png b/content/layout-reference/assets/ref-02/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I03.png rename to content/layout-reference/assets/ref-02/I03.png diff --git a/apps/wiki/public/layout-reference/ref-02/I04-mask.png b/content/layout-reference/assets/ref-02/I04-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I04-mask.png rename to content/layout-reference/assets/ref-02/I04-mask.png diff --git a/apps/wiki/public/layout-reference/ref-02/I04.png b/content/layout-reference/assets/ref-02/I04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/I04.png rename to content/layout-reference/assets/ref-02/I04.png diff --git a/apps/wiki/public/layout-reference/ref-02/T01-underlay.png b/content/layout-reference/assets/ref-02/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T01-underlay.png rename to content/layout-reference/assets/ref-02/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T01.png b/content/layout-reference/assets/ref-02/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T01.png rename to content/layout-reference/assets/ref-02/T01.png diff --git a/apps/wiki/public/layout-reference/ref-02/T02-underlay.png b/content/layout-reference/assets/ref-02/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T02-underlay.png rename to content/layout-reference/assets/ref-02/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T02.png b/content/layout-reference/assets/ref-02/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T02.png rename to content/layout-reference/assets/ref-02/T02.png diff --git a/apps/wiki/public/layout-reference/ref-02/T03-underlay.png b/content/layout-reference/assets/ref-02/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T03-underlay.png rename to content/layout-reference/assets/ref-02/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T03.png b/content/layout-reference/assets/ref-02/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T03.png rename to content/layout-reference/assets/ref-02/T03.png diff --git a/apps/wiki/public/layout-reference/ref-02/T04-underlay.png b/content/layout-reference/assets/ref-02/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T04-underlay.png rename to content/layout-reference/assets/ref-02/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T04.png b/content/layout-reference/assets/ref-02/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T04.png rename to content/layout-reference/assets/ref-02/T04.png diff --git a/apps/wiki/public/layout-reference/ref-02/T05-underlay.png b/content/layout-reference/assets/ref-02/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T05-underlay.png rename to content/layout-reference/assets/ref-02/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T05.png b/content/layout-reference/assets/ref-02/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T05.png rename to content/layout-reference/assets/ref-02/T05.png diff --git a/apps/wiki/public/layout-reference/ref-02/T06-underlay.png b/content/layout-reference/assets/ref-02/T06-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T06-underlay.png rename to content/layout-reference/assets/ref-02/T06-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T06.png b/content/layout-reference/assets/ref-02/T06.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T06.png rename to content/layout-reference/assets/ref-02/T06.png diff --git a/apps/wiki/public/layout-reference/ref-02/T07-underlay.png b/content/layout-reference/assets/ref-02/T07-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T07-underlay.png rename to content/layout-reference/assets/ref-02/T07-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-02/T07.png b/content/layout-reference/assets/ref-02/T07.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/T07.png rename to content/layout-reference/assets/ref-02/T07.png diff --git a/apps/wiki/public/layout-reference/ref-02/annotated.png b/content/layout-reference/assets/ref-02/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/annotated.png rename to content/layout-reference/assets/ref-02/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-02/background.png b/content/layout-reference/assets/ref-02/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/background.png rename to content/layout-reference/assets/ref-02/background.png diff --git a/apps/wiki/public/layout-reference/ref-02/decoration-map.png b/content/layout-reference/assets/ref-02/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/decoration-map.png rename to content/layout-reference/assets/ref-02/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-02/image-map.png b/content/layout-reference/assets/ref-02/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/image-map.png rename to content/layout-reference/assets/ref-02/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-02/reconstructed.png b/content/layout-reference/assets/ref-02/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/reconstructed.png rename to content/layout-reference/assets/ref-02/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-02/source.png b/content/layout-reference/assets/ref-02/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/source.png rename to content/layout-reference/assets/ref-02/source.png diff --git a/apps/wiki/public/layout-reference/ref-02/text-map.png b/content/layout-reference/assets/ref-02/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-02/text-map.png rename to content/layout-reference/assets/ref-02/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-03/D01.png b/content/layout-reference/assets/ref-03/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/D01.png rename to content/layout-reference/assets/ref-03/D01.png diff --git a/apps/wiki/public/layout-reference/ref-03/D02.png b/content/layout-reference/assets/ref-03/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/D02.png rename to content/layout-reference/assets/ref-03/D02.png diff --git a/apps/wiki/public/layout-reference/ref-03/D03.png b/content/layout-reference/assets/ref-03/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/D03.png rename to content/layout-reference/assets/ref-03/D03.png diff --git a/apps/wiki/public/layout-reference/ref-03/I01-mask.png b/content/layout-reference/assets/ref-03/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/I01-mask.png rename to content/layout-reference/assets/ref-03/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-03/I01.png b/content/layout-reference/assets/ref-03/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/I01.png rename to content/layout-reference/assets/ref-03/I01.png diff --git a/apps/wiki/public/layout-reference/ref-03/I02-mask.png b/content/layout-reference/assets/ref-03/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/I02-mask.png rename to content/layout-reference/assets/ref-03/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-03/I02.png b/content/layout-reference/assets/ref-03/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/I02.png rename to content/layout-reference/assets/ref-03/I02.png diff --git a/apps/wiki/public/layout-reference/ref-03/T01-underlay.png b/content/layout-reference/assets/ref-03/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T01-underlay.png rename to content/layout-reference/assets/ref-03/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-03/T01.png b/content/layout-reference/assets/ref-03/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T01.png rename to content/layout-reference/assets/ref-03/T01.png diff --git a/apps/wiki/public/layout-reference/ref-03/T02-underlay.png b/content/layout-reference/assets/ref-03/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T02-underlay.png rename to content/layout-reference/assets/ref-03/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-03/T02.png b/content/layout-reference/assets/ref-03/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T02.png rename to content/layout-reference/assets/ref-03/T02.png diff --git a/apps/wiki/public/layout-reference/ref-03/T03-underlay.png b/content/layout-reference/assets/ref-03/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T03-underlay.png rename to content/layout-reference/assets/ref-03/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-03/T03.png b/content/layout-reference/assets/ref-03/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T03.png rename to content/layout-reference/assets/ref-03/T03.png diff --git a/apps/wiki/public/layout-reference/ref-03/T04-underlay.png b/content/layout-reference/assets/ref-03/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T04-underlay.png rename to content/layout-reference/assets/ref-03/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-03/T04.png b/content/layout-reference/assets/ref-03/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/T04.png rename to content/layout-reference/assets/ref-03/T04.png diff --git a/apps/wiki/public/layout-reference/ref-03/annotated.png b/content/layout-reference/assets/ref-03/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/annotated.png rename to content/layout-reference/assets/ref-03/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-03/background.png b/content/layout-reference/assets/ref-03/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/background.png rename to content/layout-reference/assets/ref-03/background.png diff --git a/apps/wiki/public/layout-reference/ref-03/decoration-map.png b/content/layout-reference/assets/ref-03/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/decoration-map.png rename to content/layout-reference/assets/ref-03/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-03/image-map.png b/content/layout-reference/assets/ref-03/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/image-map.png rename to content/layout-reference/assets/ref-03/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-03/reconstructed.png b/content/layout-reference/assets/ref-03/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/reconstructed.png rename to content/layout-reference/assets/ref-03/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-03/source.png b/content/layout-reference/assets/ref-03/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/source.png rename to content/layout-reference/assets/ref-03/source.png diff --git a/apps/wiki/public/layout-reference/ref-03/text-map.png b/content/layout-reference/assets/ref-03/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-03/text-map.png rename to content/layout-reference/assets/ref-03/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-04/D01.png b/content/layout-reference/assets/ref-04/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/D01.png rename to content/layout-reference/assets/ref-04/D01.png diff --git a/apps/wiki/public/layout-reference/ref-04/D02.png b/content/layout-reference/assets/ref-04/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/D02.png rename to content/layout-reference/assets/ref-04/D02.png diff --git a/apps/wiki/public/layout-reference/ref-04/D03.png b/content/layout-reference/assets/ref-04/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/D03.png rename to content/layout-reference/assets/ref-04/D03.png diff --git a/apps/wiki/public/layout-reference/ref-04/I01-mask.png b/content/layout-reference/assets/ref-04/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/I01-mask.png rename to content/layout-reference/assets/ref-04/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-04/I01.png b/content/layout-reference/assets/ref-04/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/I01.png rename to content/layout-reference/assets/ref-04/I01.png diff --git a/apps/wiki/public/layout-reference/ref-04/T01-underlay.png b/content/layout-reference/assets/ref-04/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T01-underlay.png rename to content/layout-reference/assets/ref-04/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-04/T01.png b/content/layout-reference/assets/ref-04/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T01.png rename to content/layout-reference/assets/ref-04/T01.png diff --git a/apps/wiki/public/layout-reference/ref-04/T02-underlay.png b/content/layout-reference/assets/ref-04/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T02-underlay.png rename to content/layout-reference/assets/ref-04/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-04/T02.png b/content/layout-reference/assets/ref-04/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T02.png rename to content/layout-reference/assets/ref-04/T02.png diff --git a/apps/wiki/public/layout-reference/ref-04/T03-underlay.png b/content/layout-reference/assets/ref-04/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T03-underlay.png rename to content/layout-reference/assets/ref-04/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-04/T03.png b/content/layout-reference/assets/ref-04/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T03.png rename to content/layout-reference/assets/ref-04/T03.png diff --git a/apps/wiki/public/layout-reference/ref-04/T04-underlay.png b/content/layout-reference/assets/ref-04/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T04-underlay.png rename to content/layout-reference/assets/ref-04/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-04/T04.png b/content/layout-reference/assets/ref-04/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/T04.png rename to content/layout-reference/assets/ref-04/T04.png diff --git a/apps/wiki/public/layout-reference/ref-04/annotated.png b/content/layout-reference/assets/ref-04/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/annotated.png rename to content/layout-reference/assets/ref-04/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-04/background.png b/content/layout-reference/assets/ref-04/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/background.png rename to content/layout-reference/assets/ref-04/background.png diff --git a/apps/wiki/public/layout-reference/ref-04/decoration-map.png b/content/layout-reference/assets/ref-04/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/decoration-map.png rename to content/layout-reference/assets/ref-04/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-04/image-map.png b/content/layout-reference/assets/ref-04/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/image-map.png rename to content/layout-reference/assets/ref-04/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-04/reconstructed.png b/content/layout-reference/assets/ref-04/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/reconstructed.png rename to content/layout-reference/assets/ref-04/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-04/source.png b/content/layout-reference/assets/ref-04/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/source.png rename to content/layout-reference/assets/ref-04/source.png diff --git a/apps/wiki/public/layout-reference/ref-04/text-map.png b/content/layout-reference/assets/ref-04/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-04/text-map.png rename to content/layout-reference/assets/ref-04/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-05/D01.png b/content/layout-reference/assets/ref-05/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/D01.png rename to content/layout-reference/assets/ref-05/D01.png diff --git a/apps/wiki/public/layout-reference/ref-05/I01-mask.png b/content/layout-reference/assets/ref-05/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I01-mask.png rename to content/layout-reference/assets/ref-05/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-05/I01.png b/content/layout-reference/assets/ref-05/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I01.png rename to content/layout-reference/assets/ref-05/I01.png diff --git a/apps/wiki/public/layout-reference/ref-05/I02-mask.png b/content/layout-reference/assets/ref-05/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I02-mask.png rename to content/layout-reference/assets/ref-05/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-05/I02.png b/content/layout-reference/assets/ref-05/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I02.png rename to content/layout-reference/assets/ref-05/I02.png diff --git a/apps/wiki/public/layout-reference/ref-05/I03-mask.png b/content/layout-reference/assets/ref-05/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I03-mask.png rename to content/layout-reference/assets/ref-05/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-05/I03.png b/content/layout-reference/assets/ref-05/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I03.png rename to content/layout-reference/assets/ref-05/I03.png diff --git a/apps/wiki/public/layout-reference/ref-05/I04-mask.png b/content/layout-reference/assets/ref-05/I04-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I04-mask.png rename to content/layout-reference/assets/ref-05/I04-mask.png diff --git a/apps/wiki/public/layout-reference/ref-05/I04.png b/content/layout-reference/assets/ref-05/I04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I04.png rename to content/layout-reference/assets/ref-05/I04.png diff --git a/apps/wiki/public/layout-reference/ref-05/I05-mask.png b/content/layout-reference/assets/ref-05/I05-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I05-mask.png rename to content/layout-reference/assets/ref-05/I05-mask.png diff --git a/apps/wiki/public/layout-reference/ref-05/I05.png b/content/layout-reference/assets/ref-05/I05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/I05.png rename to content/layout-reference/assets/ref-05/I05.png diff --git a/apps/wiki/public/layout-reference/ref-05/T01-underlay.png b/content/layout-reference/assets/ref-05/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/T01-underlay.png rename to content/layout-reference/assets/ref-05/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-05/T01.png b/content/layout-reference/assets/ref-05/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/T01.png rename to content/layout-reference/assets/ref-05/T01.png diff --git a/apps/wiki/public/layout-reference/ref-05/T02-underlay.png b/content/layout-reference/assets/ref-05/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/T02-underlay.png rename to content/layout-reference/assets/ref-05/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-05/T02.png b/content/layout-reference/assets/ref-05/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/T02.png rename to content/layout-reference/assets/ref-05/T02.png diff --git a/apps/wiki/public/layout-reference/ref-05/annotated.png b/content/layout-reference/assets/ref-05/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/annotated.png rename to content/layout-reference/assets/ref-05/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-05/background.png b/content/layout-reference/assets/ref-05/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/background.png rename to content/layout-reference/assets/ref-05/background.png diff --git a/apps/wiki/public/layout-reference/ref-05/decoration-map.png b/content/layout-reference/assets/ref-05/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/decoration-map.png rename to content/layout-reference/assets/ref-05/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-05/image-map.png b/content/layout-reference/assets/ref-05/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/image-map.png rename to content/layout-reference/assets/ref-05/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-05/reconstructed.png b/content/layout-reference/assets/ref-05/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/reconstructed.png rename to content/layout-reference/assets/ref-05/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-05/source.png b/content/layout-reference/assets/ref-05/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/source.png rename to content/layout-reference/assets/ref-05/source.png diff --git a/apps/wiki/public/layout-reference/ref-05/text-map.png b/content/layout-reference/assets/ref-05/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-05/text-map.png rename to content/layout-reference/assets/ref-05/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-06/D01.png b/content/layout-reference/assets/ref-06/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/D01.png rename to content/layout-reference/assets/ref-06/D01.png diff --git a/apps/wiki/public/layout-reference/ref-06/D02.png b/content/layout-reference/assets/ref-06/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/D02.png rename to content/layout-reference/assets/ref-06/D02.png diff --git a/apps/wiki/public/layout-reference/ref-06/D03.png b/content/layout-reference/assets/ref-06/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/D03.png rename to content/layout-reference/assets/ref-06/D03.png diff --git a/apps/wiki/public/layout-reference/ref-06/I01-mask.png b/content/layout-reference/assets/ref-06/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/I01-mask.png rename to content/layout-reference/assets/ref-06/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-06/I01.png b/content/layout-reference/assets/ref-06/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/I01.png rename to content/layout-reference/assets/ref-06/I01.png diff --git a/apps/wiki/public/layout-reference/ref-06/T01-underlay.png b/content/layout-reference/assets/ref-06/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T01-underlay.png rename to content/layout-reference/assets/ref-06/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-06/T01.png b/content/layout-reference/assets/ref-06/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T01.png rename to content/layout-reference/assets/ref-06/T01.png diff --git a/apps/wiki/public/layout-reference/ref-06/T02-underlay.png b/content/layout-reference/assets/ref-06/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T02-underlay.png rename to content/layout-reference/assets/ref-06/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-06/T02.png b/content/layout-reference/assets/ref-06/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T02.png rename to content/layout-reference/assets/ref-06/T02.png diff --git a/apps/wiki/public/layout-reference/ref-06/T03-underlay.png b/content/layout-reference/assets/ref-06/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T03-underlay.png rename to content/layout-reference/assets/ref-06/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-06/T03.png b/content/layout-reference/assets/ref-06/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/T03.png rename to content/layout-reference/assets/ref-06/T03.png diff --git a/apps/wiki/public/layout-reference/ref-06/annotated.png b/content/layout-reference/assets/ref-06/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/annotated.png rename to content/layout-reference/assets/ref-06/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-06/background.png b/content/layout-reference/assets/ref-06/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/background.png rename to content/layout-reference/assets/ref-06/background.png diff --git a/apps/wiki/public/layout-reference/ref-06/decoration-map.png b/content/layout-reference/assets/ref-06/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/decoration-map.png rename to content/layout-reference/assets/ref-06/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-06/image-map.png b/content/layout-reference/assets/ref-06/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/image-map.png rename to content/layout-reference/assets/ref-06/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-06/reconstructed.png b/content/layout-reference/assets/ref-06/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/reconstructed.png rename to content/layout-reference/assets/ref-06/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-06/source.png b/content/layout-reference/assets/ref-06/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/source.png rename to content/layout-reference/assets/ref-06/source.png diff --git a/apps/wiki/public/layout-reference/ref-06/text-map.png b/content/layout-reference/assets/ref-06/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-06/text-map.png rename to content/layout-reference/assets/ref-06/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-07/D01.png b/content/layout-reference/assets/ref-07/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/D01.png rename to content/layout-reference/assets/ref-07/D01.png diff --git a/apps/wiki/public/layout-reference/ref-07/I01-mask.png b/content/layout-reference/assets/ref-07/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/I01-mask.png rename to content/layout-reference/assets/ref-07/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-07/I01.png b/content/layout-reference/assets/ref-07/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/I01.png rename to content/layout-reference/assets/ref-07/I01.png diff --git a/apps/wiki/public/layout-reference/ref-07/T01-underlay.png b/content/layout-reference/assets/ref-07/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T01-underlay.png rename to content/layout-reference/assets/ref-07/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-07/T01.png b/content/layout-reference/assets/ref-07/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T01.png rename to content/layout-reference/assets/ref-07/T01.png diff --git a/apps/wiki/public/layout-reference/ref-07/T02-underlay.png b/content/layout-reference/assets/ref-07/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T02-underlay.png rename to content/layout-reference/assets/ref-07/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-07/T02.png b/content/layout-reference/assets/ref-07/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T02.png rename to content/layout-reference/assets/ref-07/T02.png diff --git a/apps/wiki/public/layout-reference/ref-07/T03-underlay.png b/content/layout-reference/assets/ref-07/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T03-underlay.png rename to content/layout-reference/assets/ref-07/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-07/T03.png b/content/layout-reference/assets/ref-07/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T03.png rename to content/layout-reference/assets/ref-07/T03.png diff --git a/apps/wiki/public/layout-reference/ref-07/T04-underlay.png b/content/layout-reference/assets/ref-07/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T04-underlay.png rename to content/layout-reference/assets/ref-07/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-07/T04.png b/content/layout-reference/assets/ref-07/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T04.png rename to content/layout-reference/assets/ref-07/T04.png diff --git a/apps/wiki/public/layout-reference/ref-07/T05-underlay.png b/content/layout-reference/assets/ref-07/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T05-underlay.png rename to content/layout-reference/assets/ref-07/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-07/T05.png b/content/layout-reference/assets/ref-07/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/T05.png rename to content/layout-reference/assets/ref-07/T05.png diff --git a/apps/wiki/public/layout-reference/ref-07/annotated.png b/content/layout-reference/assets/ref-07/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/annotated.png rename to content/layout-reference/assets/ref-07/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-07/background.png b/content/layout-reference/assets/ref-07/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/background.png rename to content/layout-reference/assets/ref-07/background.png diff --git a/apps/wiki/public/layout-reference/ref-07/decoration-map.png b/content/layout-reference/assets/ref-07/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/decoration-map.png rename to content/layout-reference/assets/ref-07/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-07/image-map.png b/content/layout-reference/assets/ref-07/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/image-map.png rename to content/layout-reference/assets/ref-07/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-07/reconstructed.png b/content/layout-reference/assets/ref-07/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/reconstructed.png rename to content/layout-reference/assets/ref-07/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-07/source.png b/content/layout-reference/assets/ref-07/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/source.png rename to content/layout-reference/assets/ref-07/source.png diff --git a/apps/wiki/public/layout-reference/ref-07/text-map.png b/content/layout-reference/assets/ref-07/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-07/text-map.png rename to content/layout-reference/assets/ref-07/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-08/I01-mask.png b/content/layout-reference/assets/ref-08/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/I01-mask.png rename to content/layout-reference/assets/ref-08/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-08/I01.png b/content/layout-reference/assets/ref-08/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/I01.png rename to content/layout-reference/assets/ref-08/I01.png diff --git a/apps/wiki/public/layout-reference/ref-08/I02-mask.png b/content/layout-reference/assets/ref-08/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/I02-mask.png rename to content/layout-reference/assets/ref-08/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-08/I02.png b/content/layout-reference/assets/ref-08/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/I02.png rename to content/layout-reference/assets/ref-08/I02.png diff --git a/apps/wiki/public/layout-reference/ref-08/T01-underlay.png b/content/layout-reference/assets/ref-08/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T01-underlay.png rename to content/layout-reference/assets/ref-08/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-08/T01.png b/content/layout-reference/assets/ref-08/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T01.png rename to content/layout-reference/assets/ref-08/T01.png diff --git a/apps/wiki/public/layout-reference/ref-08/T02-underlay.png b/content/layout-reference/assets/ref-08/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T02-underlay.png rename to content/layout-reference/assets/ref-08/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-08/T02.png b/content/layout-reference/assets/ref-08/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T02.png rename to content/layout-reference/assets/ref-08/T02.png diff --git a/apps/wiki/public/layout-reference/ref-08/T03-underlay.png b/content/layout-reference/assets/ref-08/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T03-underlay.png rename to content/layout-reference/assets/ref-08/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-08/T03.png b/content/layout-reference/assets/ref-08/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/T03.png rename to content/layout-reference/assets/ref-08/T03.png diff --git a/apps/wiki/public/layout-reference/ref-08/annotated.png b/content/layout-reference/assets/ref-08/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/annotated.png rename to content/layout-reference/assets/ref-08/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-08/background.png b/content/layout-reference/assets/ref-08/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/background.png rename to content/layout-reference/assets/ref-08/background.png diff --git a/apps/wiki/public/layout-reference/ref-08/decoration-map.png b/content/layout-reference/assets/ref-08/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/decoration-map.png rename to content/layout-reference/assets/ref-08/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-08/image-map.png b/content/layout-reference/assets/ref-08/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/image-map.png rename to content/layout-reference/assets/ref-08/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-08/reconstructed.png b/content/layout-reference/assets/ref-08/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/reconstructed.png rename to content/layout-reference/assets/ref-08/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-08/source.png b/content/layout-reference/assets/ref-08/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/source.png rename to content/layout-reference/assets/ref-08/source.png diff --git a/apps/wiki/public/layout-reference/ref-08/text-map.png b/content/layout-reference/assets/ref-08/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-08/text-map.png rename to content/layout-reference/assets/ref-08/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-09/D01.png b/content/layout-reference/assets/ref-09/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/D01.png rename to content/layout-reference/assets/ref-09/D01.png diff --git a/apps/wiki/public/layout-reference/ref-09/D02.png b/content/layout-reference/assets/ref-09/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/D02.png rename to content/layout-reference/assets/ref-09/D02.png diff --git a/apps/wiki/public/layout-reference/ref-09/I01-mask.png b/content/layout-reference/assets/ref-09/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/I01-mask.png rename to content/layout-reference/assets/ref-09/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-09/I01.png b/content/layout-reference/assets/ref-09/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/I01.png rename to content/layout-reference/assets/ref-09/I01.png diff --git a/apps/wiki/public/layout-reference/ref-09/T01-underlay.png b/content/layout-reference/assets/ref-09/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T01-underlay.png rename to content/layout-reference/assets/ref-09/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-09/T01.png b/content/layout-reference/assets/ref-09/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T01.png rename to content/layout-reference/assets/ref-09/T01.png diff --git a/apps/wiki/public/layout-reference/ref-09/T02-underlay.png b/content/layout-reference/assets/ref-09/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T02-underlay.png rename to content/layout-reference/assets/ref-09/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-09/T02.png b/content/layout-reference/assets/ref-09/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T02.png rename to content/layout-reference/assets/ref-09/T02.png diff --git a/apps/wiki/public/layout-reference/ref-09/T03-underlay.png b/content/layout-reference/assets/ref-09/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T03-underlay.png rename to content/layout-reference/assets/ref-09/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-09/T03.png b/content/layout-reference/assets/ref-09/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T03.png rename to content/layout-reference/assets/ref-09/T03.png diff --git a/apps/wiki/public/layout-reference/ref-09/T04-underlay.png b/content/layout-reference/assets/ref-09/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T04-underlay.png rename to content/layout-reference/assets/ref-09/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-09/T04.png b/content/layout-reference/assets/ref-09/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T04.png rename to content/layout-reference/assets/ref-09/T04.png diff --git a/apps/wiki/public/layout-reference/ref-09/T05-underlay.png b/content/layout-reference/assets/ref-09/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T05-underlay.png rename to content/layout-reference/assets/ref-09/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-09/T05.png b/content/layout-reference/assets/ref-09/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/T05.png rename to content/layout-reference/assets/ref-09/T05.png diff --git a/apps/wiki/public/layout-reference/ref-09/annotated.png b/content/layout-reference/assets/ref-09/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/annotated.png rename to content/layout-reference/assets/ref-09/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-09/background.png b/content/layout-reference/assets/ref-09/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/background.png rename to content/layout-reference/assets/ref-09/background.png diff --git a/apps/wiki/public/layout-reference/ref-09/decoration-map.png b/content/layout-reference/assets/ref-09/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/decoration-map.png rename to content/layout-reference/assets/ref-09/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-09/image-map.png b/content/layout-reference/assets/ref-09/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/image-map.png rename to content/layout-reference/assets/ref-09/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-09/reconstructed.png b/content/layout-reference/assets/ref-09/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/reconstructed.png rename to content/layout-reference/assets/ref-09/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-09/source.png b/content/layout-reference/assets/ref-09/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/source.png rename to content/layout-reference/assets/ref-09/source.png diff --git a/apps/wiki/public/layout-reference/ref-09/text-map.png b/content/layout-reference/assets/ref-09/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-09/text-map.png rename to content/layout-reference/assets/ref-09/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-10/D01.png b/content/layout-reference/assets/ref-10/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/D01.png rename to content/layout-reference/assets/ref-10/D01.png diff --git a/apps/wiki/public/layout-reference/ref-10/D02.png b/content/layout-reference/assets/ref-10/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/D02.png rename to content/layout-reference/assets/ref-10/D02.png diff --git a/apps/wiki/public/layout-reference/ref-10/I01-mask.png b/content/layout-reference/assets/ref-10/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/I01-mask.png rename to content/layout-reference/assets/ref-10/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-10/I01.png b/content/layout-reference/assets/ref-10/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/I01.png rename to content/layout-reference/assets/ref-10/I01.png diff --git a/apps/wiki/public/layout-reference/ref-10/T01-underlay.png b/content/layout-reference/assets/ref-10/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T01-underlay.png rename to content/layout-reference/assets/ref-10/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-10/T01.png b/content/layout-reference/assets/ref-10/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T01.png rename to content/layout-reference/assets/ref-10/T01.png diff --git a/apps/wiki/public/layout-reference/ref-10/T02-underlay.png b/content/layout-reference/assets/ref-10/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T02-underlay.png rename to content/layout-reference/assets/ref-10/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-10/T02.png b/content/layout-reference/assets/ref-10/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T02.png rename to content/layout-reference/assets/ref-10/T02.png diff --git a/apps/wiki/public/layout-reference/ref-10/T03-underlay.png b/content/layout-reference/assets/ref-10/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T03-underlay.png rename to content/layout-reference/assets/ref-10/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-10/T03.png b/content/layout-reference/assets/ref-10/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/T03.png rename to content/layout-reference/assets/ref-10/T03.png diff --git a/apps/wiki/public/layout-reference/ref-10/annotated.png b/content/layout-reference/assets/ref-10/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/annotated.png rename to content/layout-reference/assets/ref-10/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-10/background.png b/content/layout-reference/assets/ref-10/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/background.png rename to content/layout-reference/assets/ref-10/background.png diff --git a/apps/wiki/public/layout-reference/ref-10/decoration-map.png b/content/layout-reference/assets/ref-10/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/decoration-map.png rename to content/layout-reference/assets/ref-10/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-10/image-map.png b/content/layout-reference/assets/ref-10/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/image-map.png rename to content/layout-reference/assets/ref-10/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-10/reconstructed.png b/content/layout-reference/assets/ref-10/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/reconstructed.png rename to content/layout-reference/assets/ref-10/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-10/source.png b/content/layout-reference/assets/ref-10/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/source.png rename to content/layout-reference/assets/ref-10/source.png diff --git a/apps/wiki/public/layout-reference/ref-10/text-map.png b/content/layout-reference/assets/ref-10/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-10/text-map.png rename to content/layout-reference/assets/ref-10/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-11/D01.png b/content/layout-reference/assets/ref-11/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/D01.png rename to content/layout-reference/assets/ref-11/D01.png diff --git a/apps/wiki/public/layout-reference/ref-11/I01-mask.png b/content/layout-reference/assets/ref-11/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/I01-mask.png rename to content/layout-reference/assets/ref-11/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-11/I01.png b/content/layout-reference/assets/ref-11/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/I01.png rename to content/layout-reference/assets/ref-11/I01.png diff --git a/apps/wiki/public/layout-reference/ref-11/T01-underlay.png b/content/layout-reference/assets/ref-11/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T01-underlay.png rename to content/layout-reference/assets/ref-11/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T01.png b/content/layout-reference/assets/ref-11/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T01.png rename to content/layout-reference/assets/ref-11/T01.png diff --git a/apps/wiki/public/layout-reference/ref-11/T02-underlay.png b/content/layout-reference/assets/ref-11/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T02-underlay.png rename to content/layout-reference/assets/ref-11/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T02.png b/content/layout-reference/assets/ref-11/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T02.png rename to content/layout-reference/assets/ref-11/T02.png diff --git a/apps/wiki/public/layout-reference/ref-11/T03-underlay.png b/content/layout-reference/assets/ref-11/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T03-underlay.png rename to content/layout-reference/assets/ref-11/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T03.png b/content/layout-reference/assets/ref-11/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T03.png rename to content/layout-reference/assets/ref-11/T03.png diff --git a/apps/wiki/public/layout-reference/ref-11/T04-underlay.png b/content/layout-reference/assets/ref-11/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T04-underlay.png rename to content/layout-reference/assets/ref-11/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T04.png b/content/layout-reference/assets/ref-11/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T04.png rename to content/layout-reference/assets/ref-11/T04.png diff --git a/apps/wiki/public/layout-reference/ref-11/T05-underlay.png b/content/layout-reference/assets/ref-11/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T05-underlay.png rename to content/layout-reference/assets/ref-11/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T05.png b/content/layout-reference/assets/ref-11/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T05.png rename to content/layout-reference/assets/ref-11/T05.png diff --git a/apps/wiki/public/layout-reference/ref-11/T06-underlay.png b/content/layout-reference/assets/ref-11/T06-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T06-underlay.png rename to content/layout-reference/assets/ref-11/T06-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-11/T06.png b/content/layout-reference/assets/ref-11/T06.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/T06.png rename to content/layout-reference/assets/ref-11/T06.png diff --git a/apps/wiki/public/layout-reference/ref-11/annotated.png b/content/layout-reference/assets/ref-11/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/annotated.png rename to content/layout-reference/assets/ref-11/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-11/background.png b/content/layout-reference/assets/ref-11/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/background.png rename to content/layout-reference/assets/ref-11/background.png diff --git a/apps/wiki/public/layout-reference/ref-11/decoration-map.png b/content/layout-reference/assets/ref-11/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/decoration-map.png rename to content/layout-reference/assets/ref-11/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-11/image-map.png b/content/layout-reference/assets/ref-11/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/image-map.png rename to content/layout-reference/assets/ref-11/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-11/reconstructed.png b/content/layout-reference/assets/ref-11/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/reconstructed.png rename to content/layout-reference/assets/ref-11/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-11/source.png b/content/layout-reference/assets/ref-11/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/source.png rename to content/layout-reference/assets/ref-11/source.png diff --git a/apps/wiki/public/layout-reference/ref-11/text-map.png b/content/layout-reference/assets/ref-11/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-11/text-map.png rename to content/layout-reference/assets/ref-11/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-12/D01.png b/content/layout-reference/assets/ref-12/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/D01.png rename to content/layout-reference/assets/ref-12/D01.png diff --git a/apps/wiki/public/layout-reference/ref-12/D02.png b/content/layout-reference/assets/ref-12/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/D02.png rename to content/layout-reference/assets/ref-12/D02.png diff --git a/apps/wiki/public/layout-reference/ref-12/D03.png b/content/layout-reference/assets/ref-12/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/D03.png rename to content/layout-reference/assets/ref-12/D03.png diff --git a/apps/wiki/public/layout-reference/ref-12/I01-mask.png b/content/layout-reference/assets/ref-12/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I01-mask.png rename to content/layout-reference/assets/ref-12/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-12/I01.png b/content/layout-reference/assets/ref-12/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I01.png rename to content/layout-reference/assets/ref-12/I01.png diff --git a/apps/wiki/public/layout-reference/ref-12/I02-mask.png b/content/layout-reference/assets/ref-12/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I02-mask.png rename to content/layout-reference/assets/ref-12/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-12/I02.png b/content/layout-reference/assets/ref-12/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I02.png rename to content/layout-reference/assets/ref-12/I02.png diff --git a/apps/wiki/public/layout-reference/ref-12/I03-mask.png b/content/layout-reference/assets/ref-12/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I03-mask.png rename to content/layout-reference/assets/ref-12/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-12/I03.png b/content/layout-reference/assets/ref-12/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/I03.png rename to content/layout-reference/assets/ref-12/I03.png diff --git a/apps/wiki/public/layout-reference/ref-12/T01-underlay.png b/content/layout-reference/assets/ref-12/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T01-underlay.png rename to content/layout-reference/assets/ref-12/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-12/T01.png b/content/layout-reference/assets/ref-12/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T01.png rename to content/layout-reference/assets/ref-12/T01.png diff --git a/apps/wiki/public/layout-reference/ref-12/T02-underlay.png b/content/layout-reference/assets/ref-12/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T02-underlay.png rename to content/layout-reference/assets/ref-12/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-12/T02.png b/content/layout-reference/assets/ref-12/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T02.png rename to content/layout-reference/assets/ref-12/T02.png diff --git a/apps/wiki/public/layout-reference/ref-12/T03-underlay.png b/content/layout-reference/assets/ref-12/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T03-underlay.png rename to content/layout-reference/assets/ref-12/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-12/T03.png b/content/layout-reference/assets/ref-12/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T03.png rename to content/layout-reference/assets/ref-12/T03.png diff --git a/apps/wiki/public/layout-reference/ref-12/T04-underlay.png b/content/layout-reference/assets/ref-12/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T04-underlay.png rename to content/layout-reference/assets/ref-12/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-12/T04.png b/content/layout-reference/assets/ref-12/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T04.png rename to content/layout-reference/assets/ref-12/T04.png diff --git a/apps/wiki/public/layout-reference/ref-12/T05-underlay.png b/content/layout-reference/assets/ref-12/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T05-underlay.png rename to content/layout-reference/assets/ref-12/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-12/T05.png b/content/layout-reference/assets/ref-12/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/T05.png rename to content/layout-reference/assets/ref-12/T05.png diff --git a/apps/wiki/public/layout-reference/ref-12/annotated.png b/content/layout-reference/assets/ref-12/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/annotated.png rename to content/layout-reference/assets/ref-12/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-12/background.png b/content/layout-reference/assets/ref-12/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/background.png rename to content/layout-reference/assets/ref-12/background.png diff --git a/apps/wiki/public/layout-reference/ref-12/decoration-map.png b/content/layout-reference/assets/ref-12/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/decoration-map.png rename to content/layout-reference/assets/ref-12/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-12/image-map.png b/content/layout-reference/assets/ref-12/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/image-map.png rename to content/layout-reference/assets/ref-12/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-12/reconstructed.png b/content/layout-reference/assets/ref-12/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/reconstructed.png rename to content/layout-reference/assets/ref-12/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-12/source.png b/content/layout-reference/assets/ref-12/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/source.png rename to content/layout-reference/assets/ref-12/source.png diff --git a/apps/wiki/public/layout-reference/ref-12/text-map.png b/content/layout-reference/assets/ref-12/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-12/text-map.png rename to content/layout-reference/assets/ref-12/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-13/I01-mask.png b/content/layout-reference/assets/ref-13/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/I01-mask.png rename to content/layout-reference/assets/ref-13/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-13/I01.png b/content/layout-reference/assets/ref-13/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/I01.png rename to content/layout-reference/assets/ref-13/I01.png diff --git a/apps/wiki/public/layout-reference/ref-13/T01-underlay.png b/content/layout-reference/assets/ref-13/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T01-underlay.png rename to content/layout-reference/assets/ref-13/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-13/T01.png b/content/layout-reference/assets/ref-13/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T01.png rename to content/layout-reference/assets/ref-13/T01.png diff --git a/apps/wiki/public/layout-reference/ref-13/T02-underlay.png b/content/layout-reference/assets/ref-13/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T02-underlay.png rename to content/layout-reference/assets/ref-13/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-13/T02.png b/content/layout-reference/assets/ref-13/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T02.png rename to content/layout-reference/assets/ref-13/T02.png diff --git a/apps/wiki/public/layout-reference/ref-13/T03-underlay.png b/content/layout-reference/assets/ref-13/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T03-underlay.png rename to content/layout-reference/assets/ref-13/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-13/T03.png b/content/layout-reference/assets/ref-13/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T03.png rename to content/layout-reference/assets/ref-13/T03.png diff --git a/apps/wiki/public/layout-reference/ref-13/T04-underlay.png b/content/layout-reference/assets/ref-13/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T04-underlay.png rename to content/layout-reference/assets/ref-13/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-13/T04.png b/content/layout-reference/assets/ref-13/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T04.png rename to content/layout-reference/assets/ref-13/T04.png diff --git a/apps/wiki/public/layout-reference/ref-13/T05-underlay.png b/content/layout-reference/assets/ref-13/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T05-underlay.png rename to content/layout-reference/assets/ref-13/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-13/T05.png b/content/layout-reference/assets/ref-13/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/T05.png rename to content/layout-reference/assets/ref-13/T05.png diff --git a/apps/wiki/public/layout-reference/ref-13/annotated.png b/content/layout-reference/assets/ref-13/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/annotated.png rename to content/layout-reference/assets/ref-13/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-13/background.png b/content/layout-reference/assets/ref-13/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/background.png rename to content/layout-reference/assets/ref-13/background.png diff --git a/apps/wiki/public/layout-reference/ref-13/decoration-map.png b/content/layout-reference/assets/ref-13/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/decoration-map.png rename to content/layout-reference/assets/ref-13/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-13/image-map.png b/content/layout-reference/assets/ref-13/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/image-map.png rename to content/layout-reference/assets/ref-13/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-13/reconstructed.png b/content/layout-reference/assets/ref-13/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/reconstructed.png rename to content/layout-reference/assets/ref-13/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-13/source.png b/content/layout-reference/assets/ref-13/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/source.png rename to content/layout-reference/assets/ref-13/source.png diff --git a/apps/wiki/public/layout-reference/ref-13/text-map.png b/content/layout-reference/assets/ref-13/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-13/text-map.png rename to content/layout-reference/assets/ref-13/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-14/D01.png b/content/layout-reference/assets/ref-14/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/D01.png rename to content/layout-reference/assets/ref-14/D01.png diff --git a/apps/wiki/public/layout-reference/ref-14/I01-mask.png b/content/layout-reference/assets/ref-14/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/I01-mask.png rename to content/layout-reference/assets/ref-14/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-14/I01.png b/content/layout-reference/assets/ref-14/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/I01.png rename to content/layout-reference/assets/ref-14/I01.png diff --git a/apps/wiki/public/layout-reference/ref-14/I02-mask.png b/content/layout-reference/assets/ref-14/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/I02-mask.png rename to content/layout-reference/assets/ref-14/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-14/I02.png b/content/layout-reference/assets/ref-14/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/I02.png rename to content/layout-reference/assets/ref-14/I02.png diff --git a/apps/wiki/public/layout-reference/ref-14/T01-underlay.png b/content/layout-reference/assets/ref-14/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T01-underlay.png rename to content/layout-reference/assets/ref-14/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-14/T01.png b/content/layout-reference/assets/ref-14/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T01.png rename to content/layout-reference/assets/ref-14/T01.png diff --git a/apps/wiki/public/layout-reference/ref-14/T02-underlay.png b/content/layout-reference/assets/ref-14/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T02-underlay.png rename to content/layout-reference/assets/ref-14/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-14/T02.png b/content/layout-reference/assets/ref-14/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T02.png rename to content/layout-reference/assets/ref-14/T02.png diff --git a/apps/wiki/public/layout-reference/ref-14/T03-underlay.png b/content/layout-reference/assets/ref-14/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T03-underlay.png rename to content/layout-reference/assets/ref-14/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-14/T03.png b/content/layout-reference/assets/ref-14/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/T03.png rename to content/layout-reference/assets/ref-14/T03.png diff --git a/apps/wiki/public/layout-reference/ref-14/annotated.png b/content/layout-reference/assets/ref-14/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/annotated.png rename to content/layout-reference/assets/ref-14/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-14/background.png b/content/layout-reference/assets/ref-14/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/background.png rename to content/layout-reference/assets/ref-14/background.png diff --git a/apps/wiki/public/layout-reference/ref-14/decoration-map.png b/content/layout-reference/assets/ref-14/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/decoration-map.png rename to content/layout-reference/assets/ref-14/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-14/image-map.png b/content/layout-reference/assets/ref-14/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/image-map.png rename to content/layout-reference/assets/ref-14/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-14/reconstructed.png b/content/layout-reference/assets/ref-14/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/reconstructed.png rename to content/layout-reference/assets/ref-14/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-14/source.png b/content/layout-reference/assets/ref-14/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/source.png rename to content/layout-reference/assets/ref-14/source.png diff --git a/apps/wiki/public/layout-reference/ref-14/text-map.png b/content/layout-reference/assets/ref-14/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-14/text-map.png rename to content/layout-reference/assets/ref-14/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-15/I01-mask.png b/content/layout-reference/assets/ref-15/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I01-mask.png rename to content/layout-reference/assets/ref-15/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-15/I01.png b/content/layout-reference/assets/ref-15/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I01.png rename to content/layout-reference/assets/ref-15/I01.png diff --git a/apps/wiki/public/layout-reference/ref-15/I02-mask.png b/content/layout-reference/assets/ref-15/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I02-mask.png rename to content/layout-reference/assets/ref-15/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-15/I02.png b/content/layout-reference/assets/ref-15/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I02.png rename to content/layout-reference/assets/ref-15/I02.png diff --git a/apps/wiki/public/layout-reference/ref-15/I03-mask.png b/content/layout-reference/assets/ref-15/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I03-mask.png rename to content/layout-reference/assets/ref-15/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-15/I03.png b/content/layout-reference/assets/ref-15/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/I03.png rename to content/layout-reference/assets/ref-15/I03.png diff --git a/apps/wiki/public/layout-reference/ref-15/T01-underlay.png b/content/layout-reference/assets/ref-15/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T01-underlay.png rename to content/layout-reference/assets/ref-15/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-15/T01.png b/content/layout-reference/assets/ref-15/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T01.png rename to content/layout-reference/assets/ref-15/T01.png diff --git a/apps/wiki/public/layout-reference/ref-15/T02-underlay.png b/content/layout-reference/assets/ref-15/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T02-underlay.png rename to content/layout-reference/assets/ref-15/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-15/T02.png b/content/layout-reference/assets/ref-15/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T02.png rename to content/layout-reference/assets/ref-15/T02.png diff --git a/apps/wiki/public/layout-reference/ref-15/T03-underlay.png b/content/layout-reference/assets/ref-15/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T03-underlay.png rename to content/layout-reference/assets/ref-15/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-15/T03.png b/content/layout-reference/assets/ref-15/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T03.png rename to content/layout-reference/assets/ref-15/T03.png diff --git a/apps/wiki/public/layout-reference/ref-15/T04-underlay.png b/content/layout-reference/assets/ref-15/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T04-underlay.png rename to content/layout-reference/assets/ref-15/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-15/T04.png b/content/layout-reference/assets/ref-15/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/T04.png rename to content/layout-reference/assets/ref-15/T04.png diff --git a/apps/wiki/public/layout-reference/ref-15/annotated.png b/content/layout-reference/assets/ref-15/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/annotated.png rename to content/layout-reference/assets/ref-15/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-15/background.png b/content/layout-reference/assets/ref-15/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/background.png rename to content/layout-reference/assets/ref-15/background.png diff --git a/apps/wiki/public/layout-reference/ref-15/decoration-map.png b/content/layout-reference/assets/ref-15/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/decoration-map.png rename to content/layout-reference/assets/ref-15/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-15/image-map.png b/content/layout-reference/assets/ref-15/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/image-map.png rename to content/layout-reference/assets/ref-15/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-15/reconstructed.png b/content/layout-reference/assets/ref-15/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/reconstructed.png rename to content/layout-reference/assets/ref-15/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-15/source.png b/content/layout-reference/assets/ref-15/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/source.png rename to content/layout-reference/assets/ref-15/source.png diff --git a/apps/wiki/public/layout-reference/ref-15/text-map.png b/content/layout-reference/assets/ref-15/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-15/text-map.png rename to content/layout-reference/assets/ref-15/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-16/I01-mask.png b/content/layout-reference/assets/ref-16/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/I01-mask.png rename to content/layout-reference/assets/ref-16/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-16/I01.png b/content/layout-reference/assets/ref-16/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/I01.png rename to content/layout-reference/assets/ref-16/I01.png diff --git a/apps/wiki/public/layout-reference/ref-16/I02-mask.png b/content/layout-reference/assets/ref-16/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/I02-mask.png rename to content/layout-reference/assets/ref-16/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-16/I02.png b/content/layout-reference/assets/ref-16/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/I02.png rename to content/layout-reference/assets/ref-16/I02.png diff --git a/apps/wiki/public/layout-reference/ref-16/T01-underlay.png b/content/layout-reference/assets/ref-16/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T01-underlay.png rename to content/layout-reference/assets/ref-16/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-16/T01.png b/content/layout-reference/assets/ref-16/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T01.png rename to content/layout-reference/assets/ref-16/T01.png diff --git a/apps/wiki/public/layout-reference/ref-16/T02-underlay.png b/content/layout-reference/assets/ref-16/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T02-underlay.png rename to content/layout-reference/assets/ref-16/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-16/T02.png b/content/layout-reference/assets/ref-16/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T02.png rename to content/layout-reference/assets/ref-16/T02.png diff --git a/apps/wiki/public/layout-reference/ref-16/T03-underlay.png b/content/layout-reference/assets/ref-16/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T03-underlay.png rename to content/layout-reference/assets/ref-16/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-16/T03.png b/content/layout-reference/assets/ref-16/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T03.png rename to content/layout-reference/assets/ref-16/T03.png diff --git a/apps/wiki/public/layout-reference/ref-16/T04-underlay.png b/content/layout-reference/assets/ref-16/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T04-underlay.png rename to content/layout-reference/assets/ref-16/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-16/T04.png b/content/layout-reference/assets/ref-16/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/T04.png rename to content/layout-reference/assets/ref-16/T04.png diff --git a/apps/wiki/public/layout-reference/ref-16/annotated.png b/content/layout-reference/assets/ref-16/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/annotated.png rename to content/layout-reference/assets/ref-16/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-16/background.png b/content/layout-reference/assets/ref-16/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/background.png rename to content/layout-reference/assets/ref-16/background.png diff --git a/apps/wiki/public/layout-reference/ref-16/decoration-map.png b/content/layout-reference/assets/ref-16/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/decoration-map.png rename to content/layout-reference/assets/ref-16/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-16/image-map.png b/content/layout-reference/assets/ref-16/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/image-map.png rename to content/layout-reference/assets/ref-16/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-16/reconstructed.png b/content/layout-reference/assets/ref-16/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/reconstructed.png rename to content/layout-reference/assets/ref-16/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-16/source.png b/content/layout-reference/assets/ref-16/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/source.png rename to content/layout-reference/assets/ref-16/source.png diff --git a/apps/wiki/public/layout-reference/ref-16/text-map.png b/content/layout-reference/assets/ref-16/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-16/text-map.png rename to content/layout-reference/assets/ref-16/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-17/D01.png b/content/layout-reference/assets/ref-17/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/D01.png rename to content/layout-reference/assets/ref-17/D01.png diff --git a/apps/wiki/public/layout-reference/ref-17/D02.png b/content/layout-reference/assets/ref-17/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/D02.png rename to content/layout-reference/assets/ref-17/D02.png diff --git a/apps/wiki/public/layout-reference/ref-17/D03.png b/content/layout-reference/assets/ref-17/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/D03.png rename to content/layout-reference/assets/ref-17/D03.png diff --git a/apps/wiki/public/layout-reference/ref-17/I01-mask.png b/content/layout-reference/assets/ref-17/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/I01-mask.png rename to content/layout-reference/assets/ref-17/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-17/I01.png b/content/layout-reference/assets/ref-17/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/I01.png rename to content/layout-reference/assets/ref-17/I01.png diff --git a/apps/wiki/public/layout-reference/ref-17/I02-mask.png b/content/layout-reference/assets/ref-17/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/I02-mask.png rename to content/layout-reference/assets/ref-17/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-17/I02.png b/content/layout-reference/assets/ref-17/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/I02.png rename to content/layout-reference/assets/ref-17/I02.png diff --git a/apps/wiki/public/layout-reference/ref-17/T01-underlay.png b/content/layout-reference/assets/ref-17/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T01-underlay.png rename to content/layout-reference/assets/ref-17/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-17/T01.png b/content/layout-reference/assets/ref-17/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T01.png rename to content/layout-reference/assets/ref-17/T01.png diff --git a/apps/wiki/public/layout-reference/ref-17/T02-underlay.png b/content/layout-reference/assets/ref-17/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T02-underlay.png rename to content/layout-reference/assets/ref-17/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-17/T02.png b/content/layout-reference/assets/ref-17/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T02.png rename to content/layout-reference/assets/ref-17/T02.png diff --git a/apps/wiki/public/layout-reference/ref-17/T03-underlay.png b/content/layout-reference/assets/ref-17/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T03-underlay.png rename to content/layout-reference/assets/ref-17/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-17/T03.png b/content/layout-reference/assets/ref-17/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T03.png rename to content/layout-reference/assets/ref-17/T03.png diff --git a/apps/wiki/public/layout-reference/ref-17/T04-underlay.png b/content/layout-reference/assets/ref-17/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T04-underlay.png rename to content/layout-reference/assets/ref-17/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-17/T04.png b/content/layout-reference/assets/ref-17/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/T04.png rename to content/layout-reference/assets/ref-17/T04.png diff --git a/apps/wiki/public/layout-reference/ref-17/annotated.png b/content/layout-reference/assets/ref-17/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/annotated.png rename to content/layout-reference/assets/ref-17/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-17/background.png b/content/layout-reference/assets/ref-17/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/background.png rename to content/layout-reference/assets/ref-17/background.png diff --git a/apps/wiki/public/layout-reference/ref-17/decoration-map.png b/content/layout-reference/assets/ref-17/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/decoration-map.png rename to content/layout-reference/assets/ref-17/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-17/image-map.png b/content/layout-reference/assets/ref-17/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/image-map.png rename to content/layout-reference/assets/ref-17/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-17/reconstructed.png b/content/layout-reference/assets/ref-17/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/reconstructed.png rename to content/layout-reference/assets/ref-17/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-17/source.png b/content/layout-reference/assets/ref-17/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/source.png rename to content/layout-reference/assets/ref-17/source.png diff --git a/apps/wiki/public/layout-reference/ref-17/text-map.png b/content/layout-reference/assets/ref-17/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-17/text-map.png rename to content/layout-reference/assets/ref-17/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-18/D01.png b/content/layout-reference/assets/ref-18/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/D01.png rename to content/layout-reference/assets/ref-18/D01.png diff --git a/apps/wiki/public/layout-reference/ref-18/D02.png b/content/layout-reference/assets/ref-18/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/D02.png rename to content/layout-reference/assets/ref-18/D02.png diff --git a/apps/wiki/public/layout-reference/ref-18/I01-mask.png b/content/layout-reference/assets/ref-18/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/I01-mask.png rename to content/layout-reference/assets/ref-18/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-18/I01.png b/content/layout-reference/assets/ref-18/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/I01.png rename to content/layout-reference/assets/ref-18/I01.png diff --git a/apps/wiki/public/layout-reference/ref-18/T01-underlay.png b/content/layout-reference/assets/ref-18/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T01-underlay.png rename to content/layout-reference/assets/ref-18/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-18/T01.png b/content/layout-reference/assets/ref-18/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T01.png rename to content/layout-reference/assets/ref-18/T01.png diff --git a/apps/wiki/public/layout-reference/ref-18/T02-underlay.png b/content/layout-reference/assets/ref-18/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T02-underlay.png rename to content/layout-reference/assets/ref-18/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-18/T02.png b/content/layout-reference/assets/ref-18/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T02.png rename to content/layout-reference/assets/ref-18/T02.png diff --git a/apps/wiki/public/layout-reference/ref-18/T03-underlay.png b/content/layout-reference/assets/ref-18/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T03-underlay.png rename to content/layout-reference/assets/ref-18/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-18/T03.png b/content/layout-reference/assets/ref-18/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T03.png rename to content/layout-reference/assets/ref-18/T03.png diff --git a/apps/wiki/public/layout-reference/ref-18/T04-underlay.png b/content/layout-reference/assets/ref-18/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T04-underlay.png rename to content/layout-reference/assets/ref-18/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-18/T04.png b/content/layout-reference/assets/ref-18/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/T04.png rename to content/layout-reference/assets/ref-18/T04.png diff --git a/apps/wiki/public/layout-reference/ref-18/annotated.png b/content/layout-reference/assets/ref-18/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/annotated.png rename to content/layout-reference/assets/ref-18/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-18/background.png b/content/layout-reference/assets/ref-18/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/background.png rename to content/layout-reference/assets/ref-18/background.png diff --git a/apps/wiki/public/layout-reference/ref-18/decoration-map.png b/content/layout-reference/assets/ref-18/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/decoration-map.png rename to content/layout-reference/assets/ref-18/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-18/image-map.png b/content/layout-reference/assets/ref-18/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/image-map.png rename to content/layout-reference/assets/ref-18/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-18/reconstructed.png b/content/layout-reference/assets/ref-18/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/reconstructed.png rename to content/layout-reference/assets/ref-18/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-18/source.png b/content/layout-reference/assets/ref-18/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/source.png rename to content/layout-reference/assets/ref-18/source.png diff --git a/apps/wiki/public/layout-reference/ref-18/text-map.png b/content/layout-reference/assets/ref-18/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-18/text-map.png rename to content/layout-reference/assets/ref-18/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-19/D01.png b/content/layout-reference/assets/ref-19/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/D01.png rename to content/layout-reference/assets/ref-19/D01.png diff --git a/apps/wiki/public/layout-reference/ref-19/D02.png b/content/layout-reference/assets/ref-19/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/D02.png rename to content/layout-reference/assets/ref-19/D02.png diff --git a/apps/wiki/public/layout-reference/ref-19/D03.png b/content/layout-reference/assets/ref-19/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/D03.png rename to content/layout-reference/assets/ref-19/D03.png diff --git a/apps/wiki/public/layout-reference/ref-19/I01-mask.png b/content/layout-reference/assets/ref-19/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I01-mask.png rename to content/layout-reference/assets/ref-19/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-19/I01.png b/content/layout-reference/assets/ref-19/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I01.png rename to content/layout-reference/assets/ref-19/I01.png diff --git a/apps/wiki/public/layout-reference/ref-19/I02-mask.png b/content/layout-reference/assets/ref-19/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I02-mask.png rename to content/layout-reference/assets/ref-19/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-19/I02.png b/content/layout-reference/assets/ref-19/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I02.png rename to content/layout-reference/assets/ref-19/I02.png diff --git a/apps/wiki/public/layout-reference/ref-19/I03-mask.png b/content/layout-reference/assets/ref-19/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I03-mask.png rename to content/layout-reference/assets/ref-19/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-19/I03.png b/content/layout-reference/assets/ref-19/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/I03.png rename to content/layout-reference/assets/ref-19/I03.png diff --git a/apps/wiki/public/layout-reference/ref-19/T01-underlay.png b/content/layout-reference/assets/ref-19/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T01-underlay.png rename to content/layout-reference/assets/ref-19/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T01.png b/content/layout-reference/assets/ref-19/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T01.png rename to content/layout-reference/assets/ref-19/T01.png diff --git a/apps/wiki/public/layout-reference/ref-19/T02-underlay.png b/content/layout-reference/assets/ref-19/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T02-underlay.png rename to content/layout-reference/assets/ref-19/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T02.png b/content/layout-reference/assets/ref-19/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T02.png rename to content/layout-reference/assets/ref-19/T02.png diff --git a/apps/wiki/public/layout-reference/ref-19/T03-underlay.png b/content/layout-reference/assets/ref-19/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T03-underlay.png rename to content/layout-reference/assets/ref-19/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T03.png b/content/layout-reference/assets/ref-19/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T03.png rename to content/layout-reference/assets/ref-19/T03.png diff --git a/apps/wiki/public/layout-reference/ref-19/T04-underlay.png b/content/layout-reference/assets/ref-19/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T04-underlay.png rename to content/layout-reference/assets/ref-19/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T04.png b/content/layout-reference/assets/ref-19/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T04.png rename to content/layout-reference/assets/ref-19/T04.png diff --git a/apps/wiki/public/layout-reference/ref-19/T05-underlay.png b/content/layout-reference/assets/ref-19/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T05-underlay.png rename to content/layout-reference/assets/ref-19/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T05.png b/content/layout-reference/assets/ref-19/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T05.png rename to content/layout-reference/assets/ref-19/T05.png diff --git a/apps/wiki/public/layout-reference/ref-19/T06-underlay.png b/content/layout-reference/assets/ref-19/T06-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T06-underlay.png rename to content/layout-reference/assets/ref-19/T06-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-19/T06.png b/content/layout-reference/assets/ref-19/T06.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/T06.png rename to content/layout-reference/assets/ref-19/T06.png diff --git a/apps/wiki/public/layout-reference/ref-19/annotated.png b/content/layout-reference/assets/ref-19/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/annotated.png rename to content/layout-reference/assets/ref-19/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-19/background.png b/content/layout-reference/assets/ref-19/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/background.png rename to content/layout-reference/assets/ref-19/background.png diff --git a/apps/wiki/public/layout-reference/ref-19/decoration-map.png b/content/layout-reference/assets/ref-19/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/decoration-map.png rename to content/layout-reference/assets/ref-19/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-19/image-map.png b/content/layout-reference/assets/ref-19/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/image-map.png rename to content/layout-reference/assets/ref-19/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-19/reconstructed.png b/content/layout-reference/assets/ref-19/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/reconstructed.png rename to content/layout-reference/assets/ref-19/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-19/source.png b/content/layout-reference/assets/ref-19/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/source.png rename to content/layout-reference/assets/ref-19/source.png diff --git a/apps/wiki/public/layout-reference/ref-19/text-map.png b/content/layout-reference/assets/ref-19/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-19/text-map.png rename to content/layout-reference/assets/ref-19/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-20/D01.png b/content/layout-reference/assets/ref-20/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/D01.png rename to content/layout-reference/assets/ref-20/D01.png diff --git a/apps/wiki/public/layout-reference/ref-20/D02.png b/content/layout-reference/assets/ref-20/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/D02.png rename to content/layout-reference/assets/ref-20/D02.png diff --git a/apps/wiki/public/layout-reference/ref-20/I01-mask.png b/content/layout-reference/assets/ref-20/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/I01-mask.png rename to content/layout-reference/assets/ref-20/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-20/I01.png b/content/layout-reference/assets/ref-20/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/I01.png rename to content/layout-reference/assets/ref-20/I01.png diff --git a/apps/wiki/public/layout-reference/ref-20/I02-mask.png b/content/layout-reference/assets/ref-20/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/I02-mask.png rename to content/layout-reference/assets/ref-20/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-20/I02.png b/content/layout-reference/assets/ref-20/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/I02.png rename to content/layout-reference/assets/ref-20/I02.png diff --git a/apps/wiki/public/layout-reference/ref-20/T01-underlay.png b/content/layout-reference/assets/ref-20/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T01-underlay.png rename to content/layout-reference/assets/ref-20/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-20/T01.png b/content/layout-reference/assets/ref-20/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T01.png rename to content/layout-reference/assets/ref-20/T01.png diff --git a/apps/wiki/public/layout-reference/ref-20/T02-underlay.png b/content/layout-reference/assets/ref-20/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T02-underlay.png rename to content/layout-reference/assets/ref-20/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-20/T02.png b/content/layout-reference/assets/ref-20/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T02.png rename to content/layout-reference/assets/ref-20/T02.png diff --git a/apps/wiki/public/layout-reference/ref-20/T03-underlay.png b/content/layout-reference/assets/ref-20/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T03-underlay.png rename to content/layout-reference/assets/ref-20/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-20/T03.png b/content/layout-reference/assets/ref-20/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/T03.png rename to content/layout-reference/assets/ref-20/T03.png diff --git a/apps/wiki/public/layout-reference/ref-20/annotated.png b/content/layout-reference/assets/ref-20/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/annotated.png rename to content/layout-reference/assets/ref-20/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-20/background.png b/content/layout-reference/assets/ref-20/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/background.png rename to content/layout-reference/assets/ref-20/background.png diff --git a/apps/wiki/public/layout-reference/ref-20/decoration-map.png b/content/layout-reference/assets/ref-20/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/decoration-map.png rename to content/layout-reference/assets/ref-20/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-20/image-map.png b/content/layout-reference/assets/ref-20/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/image-map.png rename to content/layout-reference/assets/ref-20/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-20/reconstructed.png b/content/layout-reference/assets/ref-20/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/reconstructed.png rename to content/layout-reference/assets/ref-20/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-20/source.png b/content/layout-reference/assets/ref-20/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/source.png rename to content/layout-reference/assets/ref-20/source.png diff --git a/apps/wiki/public/layout-reference/ref-20/text-map.png b/content/layout-reference/assets/ref-20/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-20/text-map.png rename to content/layout-reference/assets/ref-20/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-21/D01.png b/content/layout-reference/assets/ref-21/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/D01.png rename to content/layout-reference/assets/ref-21/D01.png diff --git a/apps/wiki/public/layout-reference/ref-21/D02.png b/content/layout-reference/assets/ref-21/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/D02.png rename to content/layout-reference/assets/ref-21/D02.png diff --git a/apps/wiki/public/layout-reference/ref-21/D03.png b/content/layout-reference/assets/ref-21/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/D03.png rename to content/layout-reference/assets/ref-21/D03.png diff --git a/apps/wiki/public/layout-reference/ref-21/D04.png b/content/layout-reference/assets/ref-21/D04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/D04.png rename to content/layout-reference/assets/ref-21/D04.png diff --git a/apps/wiki/public/layout-reference/ref-21/D05.png b/content/layout-reference/assets/ref-21/D05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/D05.png rename to content/layout-reference/assets/ref-21/D05.png diff --git a/apps/wiki/public/layout-reference/ref-21/I01-mask.png b/content/layout-reference/assets/ref-21/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/I01-mask.png rename to content/layout-reference/assets/ref-21/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-21/I01.png b/content/layout-reference/assets/ref-21/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/I01.png rename to content/layout-reference/assets/ref-21/I01.png diff --git a/apps/wiki/public/layout-reference/ref-21/I02-mask.png b/content/layout-reference/assets/ref-21/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/I02-mask.png rename to content/layout-reference/assets/ref-21/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-21/I02.png b/content/layout-reference/assets/ref-21/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/I02.png rename to content/layout-reference/assets/ref-21/I02.png diff --git a/apps/wiki/public/layout-reference/ref-21/T01-underlay.png b/content/layout-reference/assets/ref-21/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T01-underlay.png rename to content/layout-reference/assets/ref-21/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T01.png b/content/layout-reference/assets/ref-21/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T01.png rename to content/layout-reference/assets/ref-21/T01.png diff --git a/apps/wiki/public/layout-reference/ref-21/T02-underlay.png b/content/layout-reference/assets/ref-21/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T02-underlay.png rename to content/layout-reference/assets/ref-21/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T02.png b/content/layout-reference/assets/ref-21/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T02.png rename to content/layout-reference/assets/ref-21/T02.png diff --git a/apps/wiki/public/layout-reference/ref-21/T03-underlay.png b/content/layout-reference/assets/ref-21/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T03-underlay.png rename to content/layout-reference/assets/ref-21/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T03.png b/content/layout-reference/assets/ref-21/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T03.png rename to content/layout-reference/assets/ref-21/T03.png diff --git a/apps/wiki/public/layout-reference/ref-21/T04-underlay.png b/content/layout-reference/assets/ref-21/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T04-underlay.png rename to content/layout-reference/assets/ref-21/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T04.png b/content/layout-reference/assets/ref-21/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T04.png rename to content/layout-reference/assets/ref-21/T04.png diff --git a/apps/wiki/public/layout-reference/ref-21/T05-underlay.png b/content/layout-reference/assets/ref-21/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T05-underlay.png rename to content/layout-reference/assets/ref-21/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T05.png b/content/layout-reference/assets/ref-21/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T05.png rename to content/layout-reference/assets/ref-21/T05.png diff --git a/apps/wiki/public/layout-reference/ref-21/T06-underlay.png b/content/layout-reference/assets/ref-21/T06-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T06-underlay.png rename to content/layout-reference/assets/ref-21/T06-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-21/T06.png b/content/layout-reference/assets/ref-21/T06.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/T06.png rename to content/layout-reference/assets/ref-21/T06.png diff --git a/apps/wiki/public/layout-reference/ref-21/annotated.png b/content/layout-reference/assets/ref-21/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/annotated.png rename to content/layout-reference/assets/ref-21/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-21/background.png b/content/layout-reference/assets/ref-21/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/background.png rename to content/layout-reference/assets/ref-21/background.png diff --git a/apps/wiki/public/layout-reference/ref-21/decoration-map.png b/content/layout-reference/assets/ref-21/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/decoration-map.png rename to content/layout-reference/assets/ref-21/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-21/image-map.png b/content/layout-reference/assets/ref-21/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/image-map.png rename to content/layout-reference/assets/ref-21/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-21/reconstructed.png b/content/layout-reference/assets/ref-21/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/reconstructed.png rename to content/layout-reference/assets/ref-21/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-21/source.png b/content/layout-reference/assets/ref-21/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/source.png rename to content/layout-reference/assets/ref-21/source.png diff --git a/apps/wiki/public/layout-reference/ref-21/text-map.png b/content/layout-reference/assets/ref-21/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-21/text-map.png rename to content/layout-reference/assets/ref-21/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-22/I01-mask.png b/content/layout-reference/assets/ref-22/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I01-mask.png rename to content/layout-reference/assets/ref-22/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-22/I01.png b/content/layout-reference/assets/ref-22/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I01.png rename to content/layout-reference/assets/ref-22/I01.png diff --git a/apps/wiki/public/layout-reference/ref-22/I02-mask.png b/content/layout-reference/assets/ref-22/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I02-mask.png rename to content/layout-reference/assets/ref-22/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-22/I02.png b/content/layout-reference/assets/ref-22/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I02.png rename to content/layout-reference/assets/ref-22/I02.png diff --git a/apps/wiki/public/layout-reference/ref-22/I03-mask.png b/content/layout-reference/assets/ref-22/I03-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I03-mask.png rename to content/layout-reference/assets/ref-22/I03-mask.png diff --git a/apps/wiki/public/layout-reference/ref-22/I03.png b/content/layout-reference/assets/ref-22/I03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/I03.png rename to content/layout-reference/assets/ref-22/I03.png diff --git a/apps/wiki/public/layout-reference/ref-22/T01-underlay.png b/content/layout-reference/assets/ref-22/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T01-underlay.png rename to content/layout-reference/assets/ref-22/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T01.png b/content/layout-reference/assets/ref-22/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T01.png rename to content/layout-reference/assets/ref-22/T01.png diff --git a/apps/wiki/public/layout-reference/ref-22/T02-underlay.png b/content/layout-reference/assets/ref-22/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T02-underlay.png rename to content/layout-reference/assets/ref-22/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T02.png b/content/layout-reference/assets/ref-22/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T02.png rename to content/layout-reference/assets/ref-22/T02.png diff --git a/apps/wiki/public/layout-reference/ref-22/T03-underlay.png b/content/layout-reference/assets/ref-22/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T03-underlay.png rename to content/layout-reference/assets/ref-22/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T03.png b/content/layout-reference/assets/ref-22/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T03.png rename to content/layout-reference/assets/ref-22/T03.png diff --git a/apps/wiki/public/layout-reference/ref-22/T04-underlay.png b/content/layout-reference/assets/ref-22/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T04-underlay.png rename to content/layout-reference/assets/ref-22/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T04.png b/content/layout-reference/assets/ref-22/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T04.png rename to content/layout-reference/assets/ref-22/T04.png diff --git a/apps/wiki/public/layout-reference/ref-22/T05-underlay.png b/content/layout-reference/assets/ref-22/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T05-underlay.png rename to content/layout-reference/assets/ref-22/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T05.png b/content/layout-reference/assets/ref-22/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T05.png rename to content/layout-reference/assets/ref-22/T05.png diff --git a/apps/wiki/public/layout-reference/ref-22/T06-underlay.png b/content/layout-reference/assets/ref-22/T06-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T06-underlay.png rename to content/layout-reference/assets/ref-22/T06-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-22/T06.png b/content/layout-reference/assets/ref-22/T06.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/T06.png rename to content/layout-reference/assets/ref-22/T06.png diff --git a/apps/wiki/public/layout-reference/ref-22/annotated.png b/content/layout-reference/assets/ref-22/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/annotated.png rename to content/layout-reference/assets/ref-22/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-22/background.png b/content/layout-reference/assets/ref-22/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/background.png rename to content/layout-reference/assets/ref-22/background.png diff --git a/apps/wiki/public/layout-reference/ref-22/decoration-map.png b/content/layout-reference/assets/ref-22/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/decoration-map.png rename to content/layout-reference/assets/ref-22/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-22/image-map.png b/content/layout-reference/assets/ref-22/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/image-map.png rename to content/layout-reference/assets/ref-22/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-22/reconstructed.png b/content/layout-reference/assets/ref-22/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/reconstructed.png rename to content/layout-reference/assets/ref-22/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-22/source.png b/content/layout-reference/assets/ref-22/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/source.png rename to content/layout-reference/assets/ref-22/source.png diff --git a/apps/wiki/public/layout-reference/ref-22/text-map.png b/content/layout-reference/assets/ref-22/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-22/text-map.png rename to content/layout-reference/assets/ref-22/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-23/I01-mask.png b/content/layout-reference/assets/ref-23/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/I01-mask.png rename to content/layout-reference/assets/ref-23/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-23/I01.png b/content/layout-reference/assets/ref-23/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/I01.png rename to content/layout-reference/assets/ref-23/I01.png diff --git a/apps/wiki/public/layout-reference/ref-23/T01-underlay.png b/content/layout-reference/assets/ref-23/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T01-underlay.png rename to content/layout-reference/assets/ref-23/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-23/T01.png b/content/layout-reference/assets/ref-23/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T01.png rename to content/layout-reference/assets/ref-23/T01.png diff --git a/apps/wiki/public/layout-reference/ref-23/T02-underlay.png b/content/layout-reference/assets/ref-23/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T02-underlay.png rename to content/layout-reference/assets/ref-23/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-23/T02.png b/content/layout-reference/assets/ref-23/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T02.png rename to content/layout-reference/assets/ref-23/T02.png diff --git a/apps/wiki/public/layout-reference/ref-23/T03-underlay.png b/content/layout-reference/assets/ref-23/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T03-underlay.png rename to content/layout-reference/assets/ref-23/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-23/T03.png b/content/layout-reference/assets/ref-23/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T03.png rename to content/layout-reference/assets/ref-23/T03.png diff --git a/apps/wiki/public/layout-reference/ref-23/T04-underlay.png b/content/layout-reference/assets/ref-23/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T04-underlay.png rename to content/layout-reference/assets/ref-23/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-23/T04.png b/content/layout-reference/assets/ref-23/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T04.png rename to content/layout-reference/assets/ref-23/T04.png diff --git a/apps/wiki/public/layout-reference/ref-23/T05-underlay.png b/content/layout-reference/assets/ref-23/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T05-underlay.png rename to content/layout-reference/assets/ref-23/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-23/T05.png b/content/layout-reference/assets/ref-23/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/T05.png rename to content/layout-reference/assets/ref-23/T05.png diff --git a/apps/wiki/public/layout-reference/ref-23/annotated.png b/content/layout-reference/assets/ref-23/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/annotated.png rename to content/layout-reference/assets/ref-23/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-23/background.png b/content/layout-reference/assets/ref-23/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/background.png rename to content/layout-reference/assets/ref-23/background.png diff --git a/apps/wiki/public/layout-reference/ref-23/decoration-map.png b/content/layout-reference/assets/ref-23/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/decoration-map.png rename to content/layout-reference/assets/ref-23/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-23/image-map.png b/content/layout-reference/assets/ref-23/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/image-map.png rename to content/layout-reference/assets/ref-23/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-23/reconstructed.png b/content/layout-reference/assets/ref-23/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/reconstructed.png rename to content/layout-reference/assets/ref-23/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-23/source.png b/content/layout-reference/assets/ref-23/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/source.png rename to content/layout-reference/assets/ref-23/source.png diff --git a/apps/wiki/public/layout-reference/ref-23/text-map.png b/content/layout-reference/assets/ref-23/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-23/text-map.png rename to content/layout-reference/assets/ref-23/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-24/D01.png b/content/layout-reference/assets/ref-24/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/D01.png rename to content/layout-reference/assets/ref-24/D01.png diff --git a/apps/wiki/public/layout-reference/ref-24/D02.png b/content/layout-reference/assets/ref-24/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/D02.png rename to content/layout-reference/assets/ref-24/D02.png diff --git a/apps/wiki/public/layout-reference/ref-24/D03.png b/content/layout-reference/assets/ref-24/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/D03.png rename to content/layout-reference/assets/ref-24/D03.png diff --git a/apps/wiki/public/layout-reference/ref-24/D04.png b/content/layout-reference/assets/ref-24/D04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/D04.png rename to content/layout-reference/assets/ref-24/D04.png diff --git a/apps/wiki/public/layout-reference/ref-24/D05.png b/content/layout-reference/assets/ref-24/D05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/D05.png rename to content/layout-reference/assets/ref-24/D05.png diff --git a/apps/wiki/public/layout-reference/ref-24/I01-mask.png b/content/layout-reference/assets/ref-24/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/I01-mask.png rename to content/layout-reference/assets/ref-24/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-24/I01.png b/content/layout-reference/assets/ref-24/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/I01.png rename to content/layout-reference/assets/ref-24/I01.png diff --git a/apps/wiki/public/layout-reference/ref-24/T01-underlay.png b/content/layout-reference/assets/ref-24/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/T01-underlay.png rename to content/layout-reference/assets/ref-24/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-24/T01.png b/content/layout-reference/assets/ref-24/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/T01.png rename to content/layout-reference/assets/ref-24/T01.png diff --git a/apps/wiki/public/layout-reference/ref-24/T02-underlay.png b/content/layout-reference/assets/ref-24/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/T02-underlay.png rename to content/layout-reference/assets/ref-24/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-24/T02.png b/content/layout-reference/assets/ref-24/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/T02.png rename to content/layout-reference/assets/ref-24/T02.png diff --git a/apps/wiki/public/layout-reference/ref-24/annotated.png b/content/layout-reference/assets/ref-24/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/annotated.png rename to content/layout-reference/assets/ref-24/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-24/background.png b/content/layout-reference/assets/ref-24/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/background.png rename to content/layout-reference/assets/ref-24/background.png diff --git a/apps/wiki/public/layout-reference/ref-24/decoration-map.png b/content/layout-reference/assets/ref-24/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/decoration-map.png rename to content/layout-reference/assets/ref-24/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-24/image-map.png b/content/layout-reference/assets/ref-24/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/image-map.png rename to content/layout-reference/assets/ref-24/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-24/reconstructed.png b/content/layout-reference/assets/ref-24/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/reconstructed.png rename to content/layout-reference/assets/ref-24/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-24/source.png b/content/layout-reference/assets/ref-24/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/source.png rename to content/layout-reference/assets/ref-24/source.png diff --git a/apps/wiki/public/layout-reference/ref-24/text-map.png b/content/layout-reference/assets/ref-24/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-24/text-map.png rename to content/layout-reference/assets/ref-24/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-25/D01.png b/content/layout-reference/assets/ref-25/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/D01.png rename to content/layout-reference/assets/ref-25/D01.png diff --git a/apps/wiki/public/layout-reference/ref-25/I01-mask.png b/content/layout-reference/assets/ref-25/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/I01-mask.png rename to content/layout-reference/assets/ref-25/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-25/I01.png b/content/layout-reference/assets/ref-25/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/I01.png rename to content/layout-reference/assets/ref-25/I01.png diff --git a/apps/wiki/public/layout-reference/ref-25/T01-underlay.png b/content/layout-reference/assets/ref-25/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T01-underlay.png rename to content/layout-reference/assets/ref-25/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-25/T01.png b/content/layout-reference/assets/ref-25/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T01.png rename to content/layout-reference/assets/ref-25/T01.png diff --git a/apps/wiki/public/layout-reference/ref-25/T02-underlay.png b/content/layout-reference/assets/ref-25/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T02-underlay.png rename to content/layout-reference/assets/ref-25/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-25/T02.png b/content/layout-reference/assets/ref-25/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T02.png rename to content/layout-reference/assets/ref-25/T02.png diff --git a/apps/wiki/public/layout-reference/ref-25/T03-underlay.png b/content/layout-reference/assets/ref-25/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T03-underlay.png rename to content/layout-reference/assets/ref-25/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-25/T03.png b/content/layout-reference/assets/ref-25/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T03.png rename to content/layout-reference/assets/ref-25/T03.png diff --git a/apps/wiki/public/layout-reference/ref-25/T04-underlay.png b/content/layout-reference/assets/ref-25/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T04-underlay.png rename to content/layout-reference/assets/ref-25/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-25/T04.png b/content/layout-reference/assets/ref-25/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/T04.png rename to content/layout-reference/assets/ref-25/T04.png diff --git a/apps/wiki/public/layout-reference/ref-25/annotated.png b/content/layout-reference/assets/ref-25/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/annotated.png rename to content/layout-reference/assets/ref-25/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-25/background.png b/content/layout-reference/assets/ref-25/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/background.png rename to content/layout-reference/assets/ref-25/background.png diff --git a/apps/wiki/public/layout-reference/ref-25/decoration-map.png b/content/layout-reference/assets/ref-25/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/decoration-map.png rename to content/layout-reference/assets/ref-25/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-25/image-map.png b/content/layout-reference/assets/ref-25/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/image-map.png rename to content/layout-reference/assets/ref-25/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-25/reconstructed.png b/content/layout-reference/assets/ref-25/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/reconstructed.png rename to content/layout-reference/assets/ref-25/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-25/source.png b/content/layout-reference/assets/ref-25/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/source.png rename to content/layout-reference/assets/ref-25/source.png diff --git a/apps/wiki/public/layout-reference/ref-25/text-map.png b/content/layout-reference/assets/ref-25/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-25/text-map.png rename to content/layout-reference/assets/ref-25/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-26/D01.png b/content/layout-reference/assets/ref-26/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/D01.png rename to content/layout-reference/assets/ref-26/D01.png diff --git a/apps/wiki/public/layout-reference/ref-26/D02.png b/content/layout-reference/assets/ref-26/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/D02.png rename to content/layout-reference/assets/ref-26/D02.png diff --git a/apps/wiki/public/layout-reference/ref-26/D03.png b/content/layout-reference/assets/ref-26/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/D03.png rename to content/layout-reference/assets/ref-26/D03.png diff --git a/apps/wiki/public/layout-reference/ref-26/D04.png b/content/layout-reference/assets/ref-26/D04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/D04.png rename to content/layout-reference/assets/ref-26/D04.png diff --git a/apps/wiki/public/layout-reference/ref-26/D05.png b/content/layout-reference/assets/ref-26/D05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/D05.png rename to content/layout-reference/assets/ref-26/D05.png diff --git a/apps/wiki/public/layout-reference/ref-26/I01-mask.png b/content/layout-reference/assets/ref-26/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/I01-mask.png rename to content/layout-reference/assets/ref-26/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-26/I01.png b/content/layout-reference/assets/ref-26/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/I01.png rename to content/layout-reference/assets/ref-26/I01.png diff --git a/apps/wiki/public/layout-reference/ref-26/T01-underlay.png b/content/layout-reference/assets/ref-26/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T01-underlay.png rename to content/layout-reference/assets/ref-26/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-26/T01.png b/content/layout-reference/assets/ref-26/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T01.png rename to content/layout-reference/assets/ref-26/T01.png diff --git a/apps/wiki/public/layout-reference/ref-26/T02-underlay.png b/content/layout-reference/assets/ref-26/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T02-underlay.png rename to content/layout-reference/assets/ref-26/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-26/T02.png b/content/layout-reference/assets/ref-26/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T02.png rename to content/layout-reference/assets/ref-26/T02.png diff --git a/apps/wiki/public/layout-reference/ref-26/T03-underlay.png b/content/layout-reference/assets/ref-26/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T03-underlay.png rename to content/layout-reference/assets/ref-26/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-26/T03.png b/content/layout-reference/assets/ref-26/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T03.png rename to content/layout-reference/assets/ref-26/T03.png diff --git a/apps/wiki/public/layout-reference/ref-26/T04-underlay.png b/content/layout-reference/assets/ref-26/T04-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T04-underlay.png rename to content/layout-reference/assets/ref-26/T04-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-26/T04.png b/content/layout-reference/assets/ref-26/T04.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T04.png rename to content/layout-reference/assets/ref-26/T04.png diff --git a/apps/wiki/public/layout-reference/ref-26/T05-underlay.png b/content/layout-reference/assets/ref-26/T05-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T05-underlay.png rename to content/layout-reference/assets/ref-26/T05-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-26/T05.png b/content/layout-reference/assets/ref-26/T05.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/T05.png rename to content/layout-reference/assets/ref-26/T05.png diff --git a/apps/wiki/public/layout-reference/ref-26/annotated.png b/content/layout-reference/assets/ref-26/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/annotated.png rename to content/layout-reference/assets/ref-26/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-26/background.png b/content/layout-reference/assets/ref-26/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/background.png rename to content/layout-reference/assets/ref-26/background.png diff --git a/apps/wiki/public/layout-reference/ref-26/decoration-map.png b/content/layout-reference/assets/ref-26/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/decoration-map.png rename to content/layout-reference/assets/ref-26/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-26/image-map.png b/content/layout-reference/assets/ref-26/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/image-map.png rename to content/layout-reference/assets/ref-26/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-26/reconstructed.png b/content/layout-reference/assets/ref-26/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/reconstructed.png rename to content/layout-reference/assets/ref-26/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-26/source.png b/content/layout-reference/assets/ref-26/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/source.png rename to content/layout-reference/assets/ref-26/source.png diff --git a/apps/wiki/public/layout-reference/ref-26/text-map.png b/content/layout-reference/assets/ref-26/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-26/text-map.png rename to content/layout-reference/assets/ref-26/text-map.png diff --git a/apps/wiki/public/layout-reference/ref-27/D01.png b/content/layout-reference/assets/ref-27/D01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/D01.png rename to content/layout-reference/assets/ref-27/D01.png diff --git a/apps/wiki/public/layout-reference/ref-27/D02.png b/content/layout-reference/assets/ref-27/D02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/D02.png rename to content/layout-reference/assets/ref-27/D02.png diff --git a/apps/wiki/public/layout-reference/ref-27/D03.png b/content/layout-reference/assets/ref-27/D03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/D03.png rename to content/layout-reference/assets/ref-27/D03.png diff --git a/apps/wiki/public/layout-reference/ref-27/I01-mask.png b/content/layout-reference/assets/ref-27/I01-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/I01-mask.png rename to content/layout-reference/assets/ref-27/I01-mask.png diff --git a/apps/wiki/public/layout-reference/ref-27/I01.png b/content/layout-reference/assets/ref-27/I01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/I01.png rename to content/layout-reference/assets/ref-27/I01.png diff --git a/apps/wiki/public/layout-reference/ref-27/I02-mask.png b/content/layout-reference/assets/ref-27/I02-mask.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/I02-mask.png rename to content/layout-reference/assets/ref-27/I02-mask.png diff --git a/apps/wiki/public/layout-reference/ref-27/I02.png b/content/layout-reference/assets/ref-27/I02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/I02.png rename to content/layout-reference/assets/ref-27/I02.png diff --git a/apps/wiki/public/layout-reference/ref-27/T01-underlay.png b/content/layout-reference/assets/ref-27/T01-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T01-underlay.png rename to content/layout-reference/assets/ref-27/T01-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-27/T01.png b/content/layout-reference/assets/ref-27/T01.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T01.png rename to content/layout-reference/assets/ref-27/T01.png diff --git a/apps/wiki/public/layout-reference/ref-27/T02-underlay.png b/content/layout-reference/assets/ref-27/T02-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T02-underlay.png rename to content/layout-reference/assets/ref-27/T02-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-27/T02.png b/content/layout-reference/assets/ref-27/T02.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T02.png rename to content/layout-reference/assets/ref-27/T02.png diff --git a/apps/wiki/public/layout-reference/ref-27/T03-underlay.png b/content/layout-reference/assets/ref-27/T03-underlay.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T03-underlay.png rename to content/layout-reference/assets/ref-27/T03-underlay.png diff --git a/apps/wiki/public/layout-reference/ref-27/T03.png b/content/layout-reference/assets/ref-27/T03.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/T03.png rename to content/layout-reference/assets/ref-27/T03.png diff --git a/apps/wiki/public/layout-reference/ref-27/annotated.png b/content/layout-reference/assets/ref-27/annotated.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/annotated.png rename to content/layout-reference/assets/ref-27/annotated.png diff --git a/apps/wiki/public/layout-reference/ref-27/background.png b/content/layout-reference/assets/ref-27/background.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/background.png rename to content/layout-reference/assets/ref-27/background.png diff --git a/apps/wiki/public/layout-reference/ref-27/decoration-map.png b/content/layout-reference/assets/ref-27/decoration-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/decoration-map.png rename to content/layout-reference/assets/ref-27/decoration-map.png diff --git a/apps/wiki/public/layout-reference/ref-27/image-map.png b/content/layout-reference/assets/ref-27/image-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/image-map.png rename to content/layout-reference/assets/ref-27/image-map.png diff --git a/apps/wiki/public/layout-reference/ref-27/reconstructed.png b/content/layout-reference/assets/ref-27/reconstructed.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/reconstructed.png rename to content/layout-reference/assets/ref-27/reconstructed.png diff --git a/apps/wiki/public/layout-reference/ref-27/source.png b/content/layout-reference/assets/ref-27/source.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/source.png rename to content/layout-reference/assets/ref-27/source.png diff --git a/apps/wiki/public/layout-reference/ref-27/text-map.png b/content/layout-reference/assets/ref-27/text-map.png similarity index 100% rename from apps/wiki/public/layout-reference/ref-27/text-map.png rename to content/layout-reference/assets/ref-27/text-map.png diff --git a/content/layout-reference/assets/router-cover.png b/content/layout-reference/assets/router-cover.png new file mode 100644 index 0000000..782423f Binary files /dev/null and b/content/layout-reference/assets/router-cover.png differ diff --git a/apps/wiki/public/layout-reference/source.png b/content/layout-reference/assets/source.png similarity index 100% rename from apps/wiki/public/layout-reference/source.png rename to content/layout-reference/assets/source.png diff --git a/apps/wiki/src/content/layouts/reference/group-text.ts b/content/layout-reference/group-text.ts similarity index 100% rename from apps/wiki/src/content/layouts/reference/group-text.ts rename to content/layout-reference/group-text.ts diff --git a/apps/wiki/public/layout-reference/manifest.json b/content/layout-reference/manifest.json similarity index 75% rename from apps/wiki/public/layout-reference/manifest.json rename to content/layout-reference/manifest.json index 9a4d0c4..8c4ba5c 100644 --- a/apps/wiki/public/layout-reference/manifest.json +++ b/content/layout-reference/manifest.json @@ -3,7 +3,7 @@ "id": "ref-01", "name": "双矩形错位与左下说明", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 135, @@ -16,9 +16,9 @@ }, "width": 113, "height": 171, - "reference": "/layout-reference/ref-01/source.png", - "annotated": "/layout-reference/ref-01/annotated.png", - "background": "/layout-reference/ref-01/background.png", + "reference": "asset:ref-01/source.png", + "annotated": "asset:ref-01/annotated.png", + "background": "asset:ref-01/background.png", "elements": [ { "id": "T01", @@ -33,9 +33,9 @@ "text": "BULUBLUE", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-01/T01.png", + "asset": "asset:ref-01/T01.png", "pixels": 274, - "underlay": "/layout-reference/ref-01/T01-underlay.png" + "underlay": "asset:ref-01/T01-underlay.png" }, { "id": "T02", @@ -50,9 +50,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-01/T02.png", + "asset": "asset:ref-01/T02.png", "pixels": 468, - "underlay": "/layout-reference/ref-01/T02-underlay.png" + "underlay": "asset:ref-01/T02-underlay.png" }, { "id": "I01", @@ -67,9 +67,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-01/I01.png", + "asset": "asset:ref-01/I01.png", "pixels": 5259, - "mask": "/layout-reference/ref-01/I01-mask.png" + "mask": "asset:ref-01/I01-mask.png" }, { "id": "I02", @@ -84,9 +84,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-01/I02.png", + "asset": "asset:ref-01/I02.png", "pixels": 4097, - "mask": "/layout-reference/ref-01/I02-mask.png" + "mask": "asset:ref-01/I02-mask.png" }, { "id": "D01", @@ -101,7 +101,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-01/D01.png", + "asset": "asset:ref-01/D01.png", "pixels": 55 }, { @@ -117,7 +117,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-01/D02.png", + "asset": "asset:ref-01/D02.png", "pixels": 167 } ], @@ -143,7 +143,7 @@ "id": "ref-02", "name": "四格图片列与双列竖题", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 256, @@ -156,9 +156,9 @@ }, "width": 112, "height": 171, - "reference": "/layout-reference/ref-02/source.png", - "annotated": "/layout-reference/ref-02/annotated.png", - "background": "/layout-reference/ref-02/background.png", + "reference": "asset:ref-02/source.png", + "annotated": "asset:ref-02/annotated.png", + "background": "asset:ref-02/background.png", "elements": [ { "id": "T01", @@ -173,9 +173,9 @@ "text": "蓝羽毛版式设计系列", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-02/T01.png", + "asset": "asset:ref-02/T01.png", "pixels": 1348, - "underlay": "/layout-reference/ref-02/T01-underlay.png" + "underlay": "asset:ref-02/T01-underlay.png" }, { "id": "T02", @@ -190,9 +190,9 @@ "text": "版式灵感收藏", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-02/T02.png", + "asset": "asset:ref-02/T02.png", "pixels": 776, - "underlay": "/layout-reference/ref-02/T02-underlay.png" + "underlay": "asset:ref-02/T02-underlay.png" }, { "id": "T03", @@ -207,9 +207,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-02/T03.png", + "asset": "asset:ref-02/T03.png", "pixels": 28, - "underlay": "/layout-reference/ref-02/T03-underlay.png" + "underlay": "asset:ref-02/T03-underlay.png" }, { "id": "T04", @@ -224,9 +224,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-02/T04.png", + "asset": "asset:ref-02/T04.png", "pixels": 74, - "underlay": "/layout-reference/ref-02/T04-underlay.png" + "underlay": "asset:ref-02/T04-underlay.png" }, { "id": "T05", @@ -241,9 +241,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-02/T05.png", + "asset": "asset:ref-02/T05.png", "pixels": 39, - "underlay": "/layout-reference/ref-02/T05-underlay.png" + "underlay": "asset:ref-02/T05-underlay.png" }, { "id": "T06", @@ -258,9 +258,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-02/T06.png", + "asset": "asset:ref-02/T06.png", "pixels": 348, - "underlay": "/layout-reference/ref-02/T06-underlay.png" + "underlay": "asset:ref-02/T06-underlay.png" }, { "id": "T07", @@ -275,9 +275,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-02/T07.png", + "asset": "asset:ref-02/T07.png", "pixels": 483, - "underlay": "/layout-reference/ref-02/T07-underlay.png" + "underlay": "asset:ref-02/T07-underlay.png" }, { "id": "I01", @@ -292,9 +292,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/I01.png", + "asset": "asset:ref-02/I01.png", "pixels": 1198, - "mask": "/layout-reference/ref-02/I01-mask.png" + "mask": "asset:ref-02/I01-mask.png" }, { "id": "I02", @@ -309,9 +309,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/I02.png", + "asset": "asset:ref-02/I02.png", "pixels": 1443, - "mask": "/layout-reference/ref-02/I02-mask.png" + "mask": "asset:ref-02/I02-mask.png" }, { "id": "I03", @@ -326,9 +326,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/I03.png", + "asset": "asset:ref-02/I03.png", "pixels": 2421, - "mask": "/layout-reference/ref-02/I03-mask.png" + "mask": "asset:ref-02/I03-mask.png" }, { "id": "I04", @@ -343,9 +343,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/I04.png", + "asset": "asset:ref-02/I04.png", "pixels": 1276, - "mask": "/layout-reference/ref-02/I04-mask.png" + "mask": "asset:ref-02/I04-mask.png" }, { "id": "D01", @@ -360,7 +360,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/D01.png", + "asset": "asset:ref-02/D01.png", "pixels": 143 }, { @@ -376,7 +376,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-02/D02.png", + "asset": "asset:ref-02/D02.png", "pixels": 407 } ], @@ -391,7 +391,7 @@ "id": "ref-03", "name": "左上标题与右下错位图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 376, @@ -404,9 +404,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-03/source.png", - "annotated": "/layout-reference/ref-03/annotated.png", - "background": "/layout-reference/ref-03/background.png", + "reference": "asset:ref-03/source.png", + "annotated": "asset:ref-03/annotated.png", + "background": "asset:ref-03/background.png", "elements": [ { "id": "T01", @@ -421,9 +421,9 @@ "text": "蓝羽毛", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-03/T01.png", + "asset": "asset:ref-03/T01.png", "pixels": 372, - "underlay": "/layout-reference/ref-03/T01-underlay.png" + "underlay": "asset:ref-03/T01-underlay.png" }, { "id": "T02", @@ -438,9 +438,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-03/T02.png", + "asset": "asset:ref-03/T02.png", "pixels": 359, - "underlay": "/layout-reference/ref-03/T02-underlay.png" + "underlay": "asset:ref-03/T02-underlay.png" }, { "id": "T03", @@ -455,9 +455,9 @@ "text": "01", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-03/T03.png", + "asset": "asset:ref-03/T03.png", "pixels": 39, - "underlay": "/layout-reference/ref-03/T03-underlay.png" + "underlay": "asset:ref-03/T03-underlay.png" }, { "id": "T04", @@ -472,9 +472,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-03/T04.png", + "asset": "asset:ref-03/T04.png", "pixels": 353, - "underlay": "/layout-reference/ref-03/T04-underlay.png" + "underlay": "asset:ref-03/T04-underlay.png" }, { "id": "I01", @@ -489,9 +489,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-03/I01.png", + "asset": "asset:ref-03/I01.png", "pixels": 6006, - "mask": "/layout-reference/ref-03/I01-mask.png" + "mask": "asset:ref-03/I01-mask.png" }, { "id": "I02", @@ -506,9 +506,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-03/I02.png", + "asset": "asset:ref-03/I02.png", "pixels": 3004, - "mask": "/layout-reference/ref-03/I02-mask.png" + "mask": "asset:ref-03/I02-mask.png" }, { "id": "D01", @@ -523,7 +523,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-03/D01.png", + "asset": "asset:ref-03/D01.png", "pixels": 38 }, { @@ -539,7 +539,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-03/D02.png", + "asset": "asset:ref-03/D02.png", "pixels": 52 }, { @@ -555,7 +555,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-03/D03.png", + "asset": "asset:ref-03/D03.png", "pixels": 65 } ], @@ -581,7 +581,7 @@ "id": "ref-04", "name": "满版灰底椭圆与右侧白字", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 497, @@ -594,9 +594,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-04/source.png", - "annotated": "/layout-reference/ref-04/annotated.png", - "background": "/layout-reference/ref-04/background.png", + "reference": "asset:ref-04/source.png", + "annotated": "asset:ref-04/annotated.png", + "background": "asset:ref-04/background.png", "elements": [ { "id": "T01", @@ -611,9 +611,9 @@ "text": "蓝羽毛", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-04/T01.png", + "asset": "asset:ref-04/T01.png", "pixels": 674, - "underlay": "/layout-reference/ref-04/T01-underlay.png" + "underlay": "asset:ref-04/T01-underlay.png" }, { "id": "T02", @@ -628,9 +628,9 @@ "text": "版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-04/T02.png", + "asset": "asset:ref-04/T02.png", "pixels": 831, - "underlay": "/layout-reference/ref-04/T02-underlay.png" + "underlay": "asset:ref-04/T02-underlay.png" }, { "id": "T03", @@ -645,9 +645,9 @@ "text": null, "direction": "curved", "reading": "unreadable", - "asset": "/layout-reference/ref-04/T03.png", + "asset": "asset:ref-04/T03.png", "pixels": 487, - "underlay": "/layout-reference/ref-04/T03-underlay.png" + "underlay": "asset:ref-04/T03-underlay.png" }, { "id": "T04", @@ -662,9 +662,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-04/T04.png", + "asset": "asset:ref-04/T04.png", "pixels": 39, - "underlay": "/layout-reference/ref-04/T04-underlay.png" + "underlay": "asset:ref-04/T04-underlay.png" }, { "id": "I01", @@ -679,9 +679,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-04/I01.png", + "asset": "asset:ref-04/I01.png", "pixels": 9110, - "mask": "/layout-reference/ref-04/I01-mask.png" + "mask": "asset:ref-04/I01-mask.png" }, { "id": "D01", @@ -696,7 +696,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-04/D01.png", + "asset": "asset:ref-04/D01.png", "pixels": 105 }, { @@ -712,7 +712,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-04/D02.png", + "asset": "asset:ref-04/D02.png", "pixels": 258 }, { @@ -728,7 +728,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-04/D03.png", + "asset": "asset:ref-04/D03.png", "pixels": 48 } ], @@ -743,7 +743,7 @@ "id": "ref-05", "name": "五圆出血与右侧竖排大字", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 617, @@ -756,9 +756,9 @@ }, "width": 112, "height": 172, - "reference": "/layout-reference/ref-05/source.png", - "annotated": "/layout-reference/ref-05/annotated.png", - "background": "/layout-reference/ref-05/background.png", + "reference": "asset:ref-05/source.png", + "annotated": "asset:ref-05/annotated.png", + "background": "asset:ref-05/background.png", "elements": [ { "id": "T01", @@ -773,9 +773,9 @@ "text": "蓝羽毛", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-05/T01.png", + "asset": "asset:ref-05/T01.png", "pixels": 1148, - "underlay": "/layout-reference/ref-05/T01-underlay.png" + "underlay": "asset:ref-05/T01-underlay.png" }, { "id": "T02", @@ -790,9 +790,9 @@ "text": "版式设计 设计灵感", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-05/T02.png", + "asset": "asset:ref-05/T02.png", "pixels": 487, - "underlay": "/layout-reference/ref-05/T02-underlay.png" + "underlay": "asset:ref-05/T02-underlay.png" }, { "id": "I01", @@ -807,9 +807,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/I01.png", + "asset": "asset:ref-05/I01.png", "pixels": 2144, - "mask": "/layout-reference/ref-05/I01-mask.png" + "mask": "asset:ref-05/I01-mask.png" }, { "id": "I02", @@ -824,9 +824,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/I02.png", + "asset": "asset:ref-05/I02.png", "pixels": 2070, - "mask": "/layout-reference/ref-05/I02-mask.png" + "mask": "asset:ref-05/I02-mask.png" }, { "id": "I03", @@ -841,9 +841,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/I03.png", + "asset": "asset:ref-05/I03.png", "pixels": 1302, - "mask": "/layout-reference/ref-05/I03-mask.png" + "mask": "asset:ref-05/I03-mask.png" }, { "id": "I04", @@ -858,9 +858,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/I04.png", + "asset": "asset:ref-05/I04.png", "pixels": 1107, - "mask": "/layout-reference/ref-05/I04-mask.png" + "mask": "asset:ref-05/I04-mask.png" }, { "id": "I05", @@ -875,9 +875,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/I05.png", + "asset": "asset:ref-05/I05.png", "pixels": 2892, - "mask": "/layout-reference/ref-05/I05-mask.png" + "mask": "asset:ref-05/I05-mask.png" }, { "id": "D01", @@ -892,7 +892,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-05/D01.png", + "asset": "asset:ref-05/D01.png", "pixels": 286 } ], @@ -907,7 +907,7 @@ "id": "ref-06", "name": "满高左图与右侧窄栏", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 134, @@ -920,9 +920,9 @@ }, "width": 114, "height": 172, - "reference": "/layout-reference/ref-06/source.png", - "annotated": "/layout-reference/ref-06/annotated.png", - "background": "/layout-reference/ref-06/background.png", + "reference": "asset:ref-06/source.png", + "annotated": "asset:ref-06/annotated.png", + "background": "asset:ref-06/background.png", "elements": [ { "id": "T01", @@ -937,9 +937,9 @@ "text": "蓝羽毛の版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-06/T01.png", + "asset": "asset:ref-06/T01.png", "pixels": 376, - "underlay": "/layout-reference/ref-06/T01-underlay.png" + "underlay": "asset:ref-06/T01-underlay.png" }, { "id": "T02", @@ -954,9 +954,9 @@ "text": "审美提升 设计灵感", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-06/T02.png", + "asset": "asset:ref-06/T02.png", "pixels": 368, - "underlay": "/layout-reference/ref-06/T02-underlay.png" + "underlay": "asset:ref-06/T02-underlay.png" }, { "id": "T03", @@ -971,9 +971,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-06/T03.png", + "asset": "asset:ref-06/T03.png", "pixels": 204, - "underlay": "/layout-reference/ref-06/T03-underlay.png" + "underlay": "asset:ref-06/T03-underlay.png" }, { "id": "I01", @@ -988,9 +988,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-06/I01.png", + "asset": "asset:ref-06/I01.png", "pixels": 11240, - "mask": "/layout-reference/ref-06/I01-mask.png" + "mask": "asset:ref-06/I01-mask.png" }, { "id": "D01", @@ -1005,7 +1005,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-06/D01.png", + "asset": "asset:ref-06/D01.png", "pixels": 53 }, { @@ -1021,7 +1021,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-06/D02.png", + "asset": "asset:ref-06/D02.png", "pixels": 584 }, { @@ -1037,7 +1037,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-06/D03.png", + "asset": "asset:ref-06/D03.png", "pixels": 45 } ], @@ -1052,7 +1052,7 @@ "id": "ref-07", "name": "同心圆图位与底部年份", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 256, @@ -1065,9 +1065,9 @@ }, "width": 112, "height": 172, - "reference": "/layout-reference/ref-07/source.png", - "annotated": "/layout-reference/ref-07/annotated.png", - "background": "/layout-reference/ref-07/background.png", + "reference": "asset:ref-07/source.png", + "annotated": "asset:ref-07/annotated.png", + "background": "asset:ref-07/background.png", "elements": [ { "id": "T01", @@ -1082,9 +1082,9 @@ "text": null, "direction": "curved", "reading": "unreadable", - "asset": "/layout-reference/ref-07/T01.png", + "asset": "asset:ref-07/T01.png", "pixels": 160, - "underlay": "/layout-reference/ref-07/T01-underlay.png" + "underlay": "asset:ref-07/T01-underlay.png" }, { "id": "T02", @@ -1099,9 +1099,9 @@ "text": "2025", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-07/T02.png", + "asset": "asset:ref-07/T02.png", "pixels": 226, - "underlay": "/layout-reference/ref-07/T02-underlay.png" + "underlay": "asset:ref-07/T02-underlay.png" }, { "id": "T03", @@ -1116,9 +1116,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-07/T03.png", + "asset": "asset:ref-07/T03.png", "pixels": 168, - "underlay": "/layout-reference/ref-07/T03-underlay.png" + "underlay": "asset:ref-07/T03-underlay.png" }, { "id": "T04", @@ -1133,9 +1133,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-07/T04.png", + "asset": "asset:ref-07/T04.png", "pixels": 1217, - "underlay": "/layout-reference/ref-07/T04-underlay.png" + "underlay": "asset:ref-07/T04-underlay.png" }, { "id": "T05", @@ -1150,9 +1150,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-07/T05.png", + "asset": "asset:ref-07/T05.png", "pixels": 245, - "underlay": "/layout-reference/ref-07/T05-underlay.png" + "underlay": "asset:ref-07/T05-underlay.png" }, { "id": "I01", @@ -1167,9 +1167,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-07/I01.png", + "asset": "asset:ref-07/I01.png", "pixels": 6852, - "mask": "/layout-reference/ref-07/I01-mask.png" + "mask": "asset:ref-07/I01-mask.png" }, { "id": "D01", @@ -1184,7 +1184,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-07/D01.png", + "asset": "asset:ref-07/D01.png", "pixels": 5238 } ], @@ -1220,7 +1220,7 @@ "id": "ref-08", "name": "双层满宽图与字距横栏", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 376, @@ -1233,9 +1233,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-08/source.png", - "annotated": "/layout-reference/ref-08/annotated.png", - "background": "/layout-reference/ref-08/background.png", + "reference": "asset:ref-08/source.png", + "annotated": "asset:ref-08/annotated.png", + "background": "asset:ref-08/background.png", "elements": [ { "id": "T01", @@ -1250,9 +1250,9 @@ "text": "BULUBLUE", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-08/T01.png", + "asset": "asset:ref-08/T01.png", "pixels": 782, - "underlay": "/layout-reference/ref-08/T01-underlay.png" + "underlay": "asset:ref-08/T01-underlay.png" }, { "id": "T02", @@ -1267,9 +1267,9 @@ "text": "蓝羽毛设计", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-08/T02.png", + "asset": "asset:ref-08/T02.png", "pixels": 732, - "underlay": "/layout-reference/ref-08/T02-underlay.png" + "underlay": "asset:ref-08/T02-underlay.png" }, { "id": "T03", @@ -1284,9 +1284,9 @@ "text": "DESIGNFOR2026", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-08/T03.png", + "asset": "asset:ref-08/T03.png", "pixels": 360, - "underlay": "/layout-reference/ref-08/T03-underlay.png" + "underlay": "asset:ref-08/T03-underlay.png" }, { "id": "I01", @@ -1301,9 +1301,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-08/I01.png", + "asset": "asset:ref-08/I01.png", "pixels": 3671, - "mask": "/layout-reference/ref-08/I01-mask.png" + "mask": "asset:ref-08/I01-mask.png" }, { "id": "I02", @@ -1318,9 +1318,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-08/I02.png", + "asset": "asset:ref-08/I02.png", "pixels": 8975, - "mask": "/layout-reference/ref-08/I02-mask.png" + "mask": "asset:ref-08/I02-mask.png" } ], "ocr": [ @@ -1355,7 +1355,7 @@ "id": "ref-09", "name": "左侧分字标题与右侧长图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 497, @@ -1368,9 +1368,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-09/source.png", - "annotated": "/layout-reference/ref-09/annotated.png", - "background": "/layout-reference/ref-09/background.png", + "reference": "asset:ref-09/source.png", + "annotated": "asset:ref-09/annotated.png", + "background": "asset:ref-09/background.png", "elements": [ { "id": "T01", @@ -1385,9 +1385,9 @@ "text": "版", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-09/T01.png", + "asset": "asset:ref-09/T01.png", "pixels": 195, - "underlay": "/layout-reference/ref-09/T01-underlay.png" + "underlay": "asset:ref-09/T01-underlay.png" }, { "id": "T02", @@ -1402,9 +1402,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-09/T02.png", + "asset": "asset:ref-09/T02.png", "pixels": 162, - "underlay": "/layout-reference/ref-09/T02-underlay.png" + "underlay": "asset:ref-09/T02-underlay.png" }, { "id": "T03", @@ -1419,9 +1419,9 @@ "text": "式", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-09/T03.png", + "asset": "asset:ref-09/T03.png", "pixels": 93, - "underlay": "/layout-reference/ref-09/T03-underlay.png" + "underlay": "asset:ref-09/T03-underlay.png" }, { "id": "T04", @@ -1436,9 +1436,9 @@ "text": null, "direction": "vertical", "reading": "unreadable", - "asset": "/layout-reference/ref-09/T04.png", + "asset": "asset:ref-09/T04.png", "pixels": 150, - "underlay": "/layout-reference/ref-09/T04-underlay.png" + "underlay": "asset:ref-09/T04-underlay.png" }, { "id": "T05", @@ -1453,9 +1453,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-09/T05.png", + "asset": "asset:ref-09/T05.png", "pixels": 186, - "underlay": "/layout-reference/ref-09/T05-underlay.png" + "underlay": "asset:ref-09/T05-underlay.png" }, { "id": "I01", @@ -1470,9 +1470,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-09/I01.png", + "asset": "asset:ref-09/I01.png", "pixels": 6978, - "mask": "/layout-reference/ref-09/I01-mask.png" + "mask": "asset:ref-09/I01-mask.png" }, { "id": "D01", @@ -1487,7 +1487,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-09/D01.png", + "asset": "asset:ref-09/D01.png", "pixels": 318 }, { @@ -1503,7 +1503,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-09/D02.png", + "asset": "asset:ref-09/D02.png", "pixels": 305 } ], @@ -1518,7 +1518,7 @@ "id": "ref-10", "name": "半页深底与裁切英文 blue", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 616, @@ -1531,9 +1531,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-10/source.png", - "annotated": "/layout-reference/ref-10/annotated.png", - "background": "/layout-reference/ref-10/background.png", + "reference": "asset:ref-10/source.png", + "annotated": "asset:ref-10/annotated.png", + "background": "asset:ref-10/background.png", "elements": [ { "id": "T01", @@ -1548,9 +1548,9 @@ "text": "blue", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-10/T01.png", + "asset": "asset:ref-10/T01.png", "pixels": 1504, - "underlay": "/layout-reference/ref-10/T01-underlay.png" + "underlay": "asset:ref-10/T01-underlay.png" }, { "id": "T02", @@ -1565,9 +1565,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-10/T02.png", + "asset": "asset:ref-10/T02.png", "pixels": 105, - "underlay": "/layout-reference/ref-10/T02-underlay.png" + "underlay": "asset:ref-10/T02-underlay.png" }, { "id": "T03", @@ -1582,9 +1582,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-10/T03.png", + "asset": "asset:ref-10/T03.png", "pixels": 398, - "underlay": "/layout-reference/ref-10/T03-underlay.png" + "underlay": "asset:ref-10/T03-underlay.png" }, { "id": "I01", @@ -1599,9 +1599,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-10/I01.png", + "asset": "asset:ref-10/I01.png", "pixels": 9284, - "mask": "/layout-reference/ref-10/I01-mask.png" + "mask": "asset:ref-10/I01-mask.png" }, { "id": "D01", @@ -1616,7 +1616,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-10/D01.png", + "asset": "asset:ref-10/D01.png", "pixels": 21 }, { @@ -1632,7 +1632,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-10/D02.png", + "asset": "asset:ref-10/D02.png", "pixels": 23 } ], @@ -1658,7 +1658,7 @@ "id": "ref-11", "name": "左上双行标题与右下主图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 135, @@ -1671,9 +1671,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-11/source.png", - "annotated": "/layout-reference/ref-11/annotated.png", - "background": "/layout-reference/ref-11/background.png", + "reference": "asset:ref-11/source.png", + "annotated": "asset:ref-11/annotated.png", + "background": "asset:ref-11/background.png", "elements": [ { "id": "T01", @@ -1688,9 +1688,9 @@ "text": "蓝羽毛", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-11/T01.png", + "asset": "asset:ref-11/T01.png", "pixels": 643, - "underlay": "/layout-reference/ref-11/T01-underlay.png" + "underlay": "asset:ref-11/T01-underlay.png" }, { "id": "T02", @@ -1705,9 +1705,9 @@ "text": "版式灵感", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-11/T02.png", + "asset": "asset:ref-11/T02.png", "pixels": 884, - "underlay": "/layout-reference/ref-11/T02-underlay.png" + "underlay": "asset:ref-11/T02-underlay.png" }, { "id": "T03", @@ -1722,9 +1722,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-11/T03.png", + "asset": "asset:ref-11/T03.png", "pixels": 23, - "underlay": "/layout-reference/ref-11/T03-underlay.png" + "underlay": "asset:ref-11/T03-underlay.png" }, { "id": "T04", @@ -1739,9 +1739,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-11/T04.png", + "asset": "asset:ref-11/T04.png", "pixels": 145, - "underlay": "/layout-reference/ref-11/T04-underlay.png" + "underlay": "asset:ref-11/T04-underlay.png" }, { "id": "T05", @@ -1756,9 +1756,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-11/T05.png", + "asset": "asset:ref-11/T05.png", "pixels": 38, - "underlay": "/layout-reference/ref-11/T05-underlay.png" + "underlay": "asset:ref-11/T05-underlay.png" }, { "id": "T06", @@ -1773,9 +1773,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-11/T06.png", + "asset": "asset:ref-11/T06.png", "pixels": 112, - "underlay": "/layout-reference/ref-11/T06-underlay.png" + "underlay": "asset:ref-11/T06-underlay.png" }, { "id": "I01", @@ -1790,9 +1790,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-11/I01.png", + "asset": "asset:ref-11/I01.png", "pixels": 5640, - "mask": "/layout-reference/ref-11/I01-mask.png" + "mask": "asset:ref-11/I01-mask.png" }, { "id": "D01", @@ -1807,7 +1807,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-11/D01.png", + "asset": "asset:ref-11/D01.png", "pixels": 373 } ], @@ -1843,7 +1843,7 @@ "id": "ref-12", "name": "三图模块与左侧分散字框", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 256, @@ -1856,9 +1856,9 @@ }, "width": 112, "height": 173, - "reference": "/layout-reference/ref-12/source.png", - "annotated": "/layout-reference/ref-12/annotated.png", - "background": "/layout-reference/ref-12/background.png", + "reference": "asset:ref-12/source.png", + "annotated": "asset:ref-12/annotated.png", + "background": "asset:ref-12/background.png", "elements": [ { "id": "D01", @@ -1873,7 +1873,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/D01.png", + "asset": "asset:ref-12/D01.png", "pixels": 61 }, { @@ -1889,9 +1889,9 @@ "text": "版", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-12/T01.png", + "asset": "asset:ref-12/T01.png", "pixels": 580, - "underlay": "/layout-reference/ref-12/T01-underlay.png" + "underlay": "asset:ref-12/T01-underlay.png" }, { "id": "T02", @@ -1906,9 +1906,9 @@ "text": "蓝羽毛の设计", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-12/T02.png", + "asset": "asset:ref-12/T02.png", "pixels": 487, - "underlay": "/layout-reference/ref-12/T02-underlay.png" + "underlay": "asset:ref-12/T02-underlay.png" }, { "id": "T03", @@ -1923,9 +1923,9 @@ "text": "式", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-12/T03.png", + "asset": "asset:ref-12/T03.png", "pixels": 359, - "underlay": "/layout-reference/ref-12/T03-underlay.png" + "underlay": "asset:ref-12/T03-underlay.png" }, { "id": "T04", @@ -1940,9 +1940,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-12/T04.png", + "asset": "asset:ref-12/T04.png", "pixels": 172, - "underlay": "/layout-reference/ref-12/T04-underlay.png" + "underlay": "asset:ref-12/T04-underlay.png" }, { "id": "T05", @@ -1957,9 +1957,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-12/T05.png", + "asset": "asset:ref-12/T05.png", "pixels": 632, - "underlay": "/layout-reference/ref-12/T05-underlay.png" + "underlay": "asset:ref-12/T05-underlay.png" }, { "id": "I01", @@ -1974,9 +1974,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/I01.png", + "asset": "asset:ref-12/I01.png", "pixels": 6212, - "mask": "/layout-reference/ref-12/I01-mask.png" + "mask": "asset:ref-12/I01-mask.png" }, { "id": "I02", @@ -1991,9 +1991,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/I02.png", + "asset": "asset:ref-12/I02.png", "pixels": 1961, - "mask": "/layout-reference/ref-12/I02-mask.png" + "mask": "asset:ref-12/I02-mask.png" }, { "id": "I03", @@ -2008,9 +2008,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/I03.png", + "asset": "asset:ref-12/I03.png", "pixels": 1110, - "mask": "/layout-reference/ref-12/I03-mask.png" + "mask": "asset:ref-12/I03-mask.png" }, { "id": "D02", @@ -2025,7 +2025,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/D02.png", + "asset": "asset:ref-12/D02.png", "pixels": 266 }, { @@ -2041,7 +2041,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-12/D03.png", + "asset": "asset:ref-12/D03.png", "pixels": 697 } ], @@ -2067,7 +2067,7 @@ "id": "ref-13", "name": "横题与右侧出血扁椭圆", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 376, @@ -2080,9 +2080,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-13/source.png", - "annotated": "/layout-reference/ref-13/annotated.png", - "background": "/layout-reference/ref-13/background.png", + "reference": "asset:ref-13/source.png", + "annotated": "asset:ref-13/annotated.png", + "background": "asset:ref-13/background.png", "elements": [ { "id": "T01", @@ -2097,9 +2097,9 @@ "text": "版式", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-13/T01.png", + "asset": "asset:ref-13/T01.png", "pixels": 316, - "underlay": "/layout-reference/ref-13/T01-underlay.png" + "underlay": "asset:ref-13/T01-underlay.png" }, { "id": "T02", @@ -2114,9 +2114,9 @@ "text": "灵感", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-13/T02.png", + "asset": "asset:ref-13/T02.png", "pixels": 343, - "underlay": "/layout-reference/ref-13/T02-underlay.png" + "underlay": "asset:ref-13/T02-underlay.png" }, { "id": "T03", @@ -2131,9 +2131,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-13/T03.png", + "asset": "asset:ref-13/T03.png", "pixels": 62, - "underlay": "/layout-reference/ref-13/T03-underlay.png" + "underlay": "asset:ref-13/T03-underlay.png" }, { "id": "T04", @@ -2148,9 +2148,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-13/T04.png", + "asset": "asset:ref-13/T04.png", "pixels": 646, - "underlay": "/layout-reference/ref-13/T04-underlay.png" + "underlay": "asset:ref-13/T04-underlay.png" }, { "id": "T05", @@ -2165,9 +2165,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-13/T05.png", + "asset": "asset:ref-13/T05.png", "pixels": 248, - "underlay": "/layout-reference/ref-13/T05-underlay.png" + "underlay": "asset:ref-13/T05-underlay.png" }, { "id": "I01", @@ -2182,9 +2182,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-13/I01.png", + "asset": "asset:ref-13/I01.png", "pixels": 8615, - "mask": "/layout-reference/ref-13/I01-mask.png" + "mask": "asset:ref-13/I01-mask.png" } ], "ocr": [ @@ -2209,7 +2209,7 @@ "id": "ref-14", "name": "大矩形与小方图及居中横题", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 497, @@ -2222,9 +2222,9 @@ }, "width": 113, "height": 174, - "reference": "/layout-reference/ref-14/source.png", - "annotated": "/layout-reference/ref-14/annotated.png", - "background": "/layout-reference/ref-14/background.png", + "reference": "asset:ref-14/source.png", + "annotated": "asset:ref-14/annotated.png", + "background": "asset:ref-14/background.png", "elements": [ { "id": "T01", @@ -2239,9 +2239,9 @@ "text": "蓝羽毛 版式灵感设计分享", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-14/T01.png", + "asset": "asset:ref-14/T01.png", "pixels": 495, - "underlay": "/layout-reference/ref-14/T01-underlay.png" + "underlay": "asset:ref-14/T01-underlay.png" }, { "id": "T02", @@ -2256,9 +2256,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-14/T02.png", + "asset": "asset:ref-14/T02.png", "pixels": 147, - "underlay": "/layout-reference/ref-14/T02-underlay.png" + "underlay": "asset:ref-14/T02-underlay.png" }, { "id": "T03", @@ -2273,9 +2273,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-14/T03.png", + "asset": "asset:ref-14/T03.png", "pixels": 178, - "underlay": "/layout-reference/ref-14/T03-underlay.png" + "underlay": "asset:ref-14/T03-underlay.png" }, { "id": "I01", @@ -2290,9 +2290,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-14/I01.png", + "asset": "asset:ref-14/I01.png", "pixels": 4421, - "mask": "/layout-reference/ref-14/I01-mask.png" + "mask": "asset:ref-14/I01-mask.png" }, { "id": "I02", @@ -2307,9 +2307,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-14/I02.png", + "asset": "asset:ref-14/I02.png", "pixels": 1672, - "mask": "/layout-reference/ref-14/I02-mask.png" + "mask": "asset:ref-14/I02-mask.png" }, { "id": "D01", @@ -2324,7 +2324,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-14/D01.png", + "asset": "asset:ref-14/D01.png", "pixels": 217 } ], @@ -2350,7 +2350,7 @@ "id": "ref-15", "name": "英文双行刊头与四分之一圆图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 617, @@ -2363,9 +2363,9 @@ }, "width": 112, "height": 173, - "reference": "/layout-reference/ref-15/source.png", - "annotated": "/layout-reference/ref-15/annotated.png", - "background": "/layout-reference/ref-15/background.png", + "reference": "asset:ref-15/source.png", + "annotated": "asset:ref-15/annotated.png", + "background": "asset:ref-15/background.png", "elements": [ { "id": "T01", @@ -2380,9 +2380,9 @@ "text": "bulublue", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-15/T01.png", + "asset": "asset:ref-15/T01.png", "pixels": 477, - "underlay": "/layout-reference/ref-15/T01-underlay.png" + "underlay": "asset:ref-15/T01-underlay.png" }, { "id": "T02", @@ -2397,9 +2397,9 @@ "text": "design", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-15/T02.png", + "asset": "asset:ref-15/T02.png", "pixels": 524, - "underlay": "/layout-reference/ref-15/T02-underlay.png" + "underlay": "asset:ref-15/T02-underlay.png" }, { "id": "T03", @@ -2414,9 +2414,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-15/T03.png", + "asset": "asset:ref-15/T03.png", "pixels": 164, - "underlay": "/layout-reference/ref-15/T03-underlay.png" + "underlay": "asset:ref-15/T03-underlay.png" }, { "id": "T04", @@ -2431,9 +2431,9 @@ "text": "BULUBLUE DESIGN", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-15/T04.png", + "asset": "asset:ref-15/T04.png", "pixels": 354, - "underlay": "/layout-reference/ref-15/T04-underlay.png" + "underlay": "asset:ref-15/T04-underlay.png" }, { "id": "I01", @@ -2448,9 +2448,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-15/I01.png", + "asset": "asset:ref-15/I01.png", "pixels": 7070, - "mask": "/layout-reference/ref-15/I01-mask.png" + "mask": "asset:ref-15/I01-mask.png" }, { "id": "I02", @@ -2465,9 +2465,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-15/I02.png", + "asset": "asset:ref-15/I02.png", "pixels": 3337, - "mask": "/layout-reference/ref-15/I02-mask.png" + "mask": "asset:ref-15/I02-mask.png" }, { "id": "I03", @@ -2482,9 +2482,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-15/I03.png", + "asset": "asset:ref-15/I03.png", "pixels": 1836, - "mask": "/layout-reference/ref-15/I03-mask.png" + "mask": "asset:ref-15/I03-mask.png" } ], "ocr": [ @@ -2519,7 +2519,7 @@ "id": "ref-16", "name": "上下灰阶色带与底部白区", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 15, @@ -2532,9 +2532,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-16/source.png", - "annotated": "/layout-reference/ref-16/annotated.png", - "background": "/layout-reference/ref-16/background.png", + "reference": "asset:ref-16/source.png", + "annotated": "asset:ref-16/annotated.png", + "background": "asset:ref-16/background.png", "elements": [ { "id": "T01", @@ -2549,9 +2549,9 @@ "text": "高级版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-16/T01.png", + "asset": "asset:ref-16/T01.png", "pixels": 123, - "underlay": "/layout-reference/ref-16/T01-underlay.png" + "underlay": "asset:ref-16/T01-underlay.png" }, { "id": "T02", @@ -2566,9 +2566,9 @@ "text": "蓝羽毛版式", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-16/T02.png", + "asset": "asset:ref-16/T02.png", "pixels": 71, - "underlay": "/layout-reference/ref-16/T02-underlay.png" + "underlay": "asset:ref-16/T02-underlay.png" }, { "id": "T03", @@ -2583,9 +2583,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-16/T03.png", + "asset": "asset:ref-16/T03.png", "pixels": 527, - "underlay": "/layout-reference/ref-16/T03-underlay.png" + "underlay": "asset:ref-16/T03-underlay.png" }, { "id": "T04", @@ -2600,9 +2600,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-16/T04.png", + "asset": "asset:ref-16/T04.png", "pixels": 144, - "underlay": "/layout-reference/ref-16/T04-underlay.png" + "underlay": "asset:ref-16/T04-underlay.png" }, { "id": "I01", @@ -2617,9 +2617,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-16/I01.png", + "asset": "asset:ref-16/I01.png", "pixels": 5654, - "mask": "/layout-reference/ref-16/I01-mask.png" + "mask": "asset:ref-16/I01-mask.png" }, { "id": "I02", @@ -2634,9 +2634,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-16/I02.png", + "asset": "asset:ref-16/I02.png", "pixels": 5777, - "mask": "/layout-reference/ref-16/I02-mask.png" + "mask": "asset:ref-16/I02-mask.png" } ], "ocr": [ @@ -2661,7 +2661,7 @@ "id": "ref-17", "name": "英文刊头与圆形叠标及窄栏", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 135, @@ -2674,9 +2674,9 @@ }, "width": 113, "height": 174, - "reference": "/layout-reference/ref-17/source.png", - "annotated": "/layout-reference/ref-17/annotated.png", - "background": "/layout-reference/ref-17/background.png", + "reference": "asset:ref-17/source.png", + "annotated": "asset:ref-17/annotated.png", + "background": "asset:ref-17/background.png", "elements": [ { "id": "D01", @@ -2691,7 +2691,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-17/D01.png", + "asset": "asset:ref-17/D01.png", "pixels": 30 }, { @@ -2707,9 +2707,9 @@ "text": "Bulublue", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-17/T01.png", + "asset": "asset:ref-17/T01.png", "pixels": 277, - "underlay": "/layout-reference/ref-17/T01-underlay.png" + "underlay": "asset:ref-17/T01-underlay.png" }, { "id": "T02", @@ -2724,9 +2724,9 @@ "text": "Design", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-17/T02.png", + "asset": "asset:ref-17/T02.png", "pixels": 423, - "underlay": "/layout-reference/ref-17/T02-underlay.png" + "underlay": "asset:ref-17/T02-underlay.png" }, { "id": "T03", @@ -2741,9 +2741,9 @@ "text": "高级感版式.", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-17/T03.png", + "asset": "asset:ref-17/T03.png", "pixels": 459, - "underlay": "/layout-reference/ref-17/T03-underlay.png" + "underlay": "asset:ref-17/T03-underlay.png" }, { "id": "T04", @@ -2758,9 +2758,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-17/T04.png", + "asset": "asset:ref-17/T04.png", "pixels": 329, - "underlay": "/layout-reference/ref-17/T04-underlay.png" + "underlay": "asset:ref-17/T04-underlay.png" }, { "id": "I01", @@ -2775,9 +2775,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-17/I01.png", + "asset": "asset:ref-17/I01.png", "pixels": 7161, - "mask": "/layout-reference/ref-17/I01-mask.png" + "mask": "asset:ref-17/I01-mask.png" }, { "id": "I02", @@ -2792,9 +2792,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-17/I02.png", + "asset": "asset:ref-17/I02.png", "pixels": 372, - "mask": "/layout-reference/ref-17/I02-mask.png" + "mask": "asset:ref-17/I02-mask.png" }, { "id": "D02", @@ -2809,7 +2809,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-17/D02.png", + "asset": "asset:ref-17/D02.png", "pixels": 253 }, { @@ -2825,7 +2825,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-17/D03.png", + "asset": "asset:ref-17/D03.png", "pixels": 324 } ], @@ -2871,7 +2871,7 @@ "id": "ref-18", "name": "上大图与下方英文双行", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 256, @@ -2884,9 +2884,9 @@ }, "width": 113, "height": 174, - "reference": "/layout-reference/ref-18/source.png", - "annotated": "/layout-reference/ref-18/annotated.png", - "background": "/layout-reference/ref-18/background.png", + "reference": "asset:ref-18/source.png", + "annotated": "asset:ref-18/annotated.png", + "background": "asset:ref-18/background.png", "elements": [ { "id": "T01", @@ -2901,9 +2901,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-18/T01.png", + "asset": "asset:ref-18/T01.png", "pixels": 34, - "underlay": "/layout-reference/ref-18/T01-underlay.png" + "underlay": "asset:ref-18/T01-underlay.png" }, { "id": "T02", @@ -2918,9 +2918,9 @@ "text": "Bulublue", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-18/T02.png", + "asset": "asset:ref-18/T02.png", "pixels": 471, - "underlay": "/layout-reference/ref-18/T02-underlay.png" + "underlay": "asset:ref-18/T02-underlay.png" }, { "id": "T03", @@ -2935,9 +2935,9 @@ "text": "Design", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-18/T03.png", + "asset": "asset:ref-18/T03.png", "pixels": 435, - "underlay": "/layout-reference/ref-18/T03-underlay.png" + "underlay": "asset:ref-18/T03-underlay.png" }, { "id": "T04", @@ -2952,9 +2952,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-18/T04.png", + "asset": "asset:ref-18/T04.png", "pixels": 418, - "underlay": "/layout-reference/ref-18/T04-underlay.png" + "underlay": "asset:ref-18/T04-underlay.png" }, { "id": "I01", @@ -2969,9 +2969,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-18/I01.png", + "asset": "asset:ref-18/I01.png", "pixels": 7995, - "mask": "/layout-reference/ref-18/I01-mask.png" + "mask": "asset:ref-18/I01-mask.png" }, { "id": "D01", @@ -2986,7 +2986,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-18/D01.png", + "asset": "asset:ref-18/D01.png", "pixels": 112 }, { @@ -3002,7 +3002,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-18/D02.png", + "asset": "asset:ref-18/D02.png", "pixels": 441 } ], @@ -3038,7 +3038,7 @@ "id": "ref-19", "name": "四角大字与中央双圆竖题", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 376, @@ -3051,9 +3051,9 @@ }, "width": 113, "height": 171, - "reference": "/layout-reference/ref-19/source.png", - "annotated": "/layout-reference/ref-19/annotated.png", - "background": "/layout-reference/ref-19/background.png", + "reference": "asset:ref-19/source.png", + "annotated": "asset:ref-19/annotated.png", + "background": "asset:ref-19/background.png", "elements": [ { "id": "T01", @@ -3068,9 +3068,9 @@ "text": "高", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-19/T01.png", + "asset": "asset:ref-19/T01.png", "pixels": 401, - "underlay": "/layout-reference/ref-19/T01-underlay.png" + "underlay": "asset:ref-19/T01-underlay.png" }, { "id": "T02", @@ -3085,9 +3085,9 @@ "text": "级", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-19/T02.png", + "asset": "asset:ref-19/T02.png", "pixels": 455, - "underlay": "/layout-reference/ref-19/T02-underlay.png" + "underlay": "asset:ref-19/T02-underlay.png" }, { "id": "T03", @@ -3102,9 +3102,9 @@ "text": "排", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-19/T03.png", + "asset": "asset:ref-19/T03.png", "pixels": 511, - "underlay": "/layout-reference/ref-19/T03-underlay.png" + "underlay": "asset:ref-19/T03-underlay.png" }, { "id": "T04", @@ -3119,9 +3119,9 @@ "text": "版", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-19/T04.png", + "asset": "asset:ref-19/T04.png", "pixels": 590, - "underlay": "/layout-reference/ref-19/T04-underlay.png" + "underlay": "asset:ref-19/T04-underlay.png" }, { "id": "T05", @@ -3136,9 +3136,9 @@ "text": "蓝羽毛の版式灵感", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-19/T05.png", + "asset": "asset:ref-19/T05.png", "pixels": 482, - "underlay": "/layout-reference/ref-19/T05-underlay.png" + "underlay": "asset:ref-19/T05-underlay.png" }, { "id": "T06", @@ -3153,9 +3153,9 @@ "text": null, "direction": "vertical", "reading": "unreadable", - "asset": "/layout-reference/ref-19/T06.png", + "asset": "asset:ref-19/T06.png", "pixels": 303, - "underlay": "/layout-reference/ref-19/T06-underlay.png" + "underlay": "asset:ref-19/T06-underlay.png" }, { "id": "I01", @@ -3170,9 +3170,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/I01.png", + "asset": "asset:ref-19/I01.png", "pixels": 4172, - "mask": "/layout-reference/ref-19/I01-mask.png" + "mask": "asset:ref-19/I01-mask.png" }, { "id": "I02", @@ -3187,9 +3187,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/I02.png", + "asset": "asset:ref-19/I02.png", "pixels": 2238, - "mask": "/layout-reference/ref-19/I02-mask.png" + "mask": "asset:ref-19/I02-mask.png" }, { "id": "I03", @@ -3204,9 +3204,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/I03.png", + "asset": "asset:ref-19/I03.png", "pixels": 283, - "mask": "/layout-reference/ref-19/I03-mask.png" + "mask": "asset:ref-19/I03-mask.png" }, { "id": "D01", @@ -3221,7 +3221,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/D01.png", + "asset": "asset:ref-19/D01.png", "pixels": 818 }, { @@ -3237,7 +3237,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/D02.png", + "asset": "asset:ref-19/D02.png", "pixels": 435 }, { @@ -3253,7 +3253,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-19/D03.png", + "asset": "asset:ref-19/D03.png", "pixels": 76 } ], @@ -3309,7 +3309,7 @@ "id": "ref-20", "name": "右上大弧面与左下圆形标题", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 496, @@ -3322,9 +3322,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-20/source.png", - "annotated": "/layout-reference/ref-20/annotated.png", - "background": "/layout-reference/ref-20/background.png", + "reference": "asset:ref-20/source.png", + "annotated": "asset:ref-20/annotated.png", + "background": "asset:ref-20/background.png", "elements": [ { "id": "T01", @@ -3339,9 +3339,9 @@ "text": "高级", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-20/T01.png", + "asset": "asset:ref-20/T01.png", "pixels": 229, - "underlay": "/layout-reference/ref-20/T01-underlay.png" + "underlay": "asset:ref-20/T01-underlay.png" }, { "id": "T02", @@ -3356,9 +3356,9 @@ "text": "版式", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-20/T02.png", + "asset": "asset:ref-20/T02.png", "pixels": 219, - "underlay": "/layout-reference/ref-20/T02-underlay.png" + "underlay": "asset:ref-20/T02-underlay.png" }, { "id": "T03", @@ -3373,9 +3373,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-20/T03.png", + "asset": "asset:ref-20/T03.png", "pixels": 92, - "underlay": "/layout-reference/ref-20/T03-underlay.png" + "underlay": "asset:ref-20/T03-underlay.png" }, { "id": "I01", @@ -3390,9 +3390,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-20/I01.png", + "asset": "asset:ref-20/I01.png", "pixels": 9205, - "mask": "/layout-reference/ref-20/I01-mask.png" + "mask": "asset:ref-20/I01-mask.png" }, { "id": "I02", @@ -3407,9 +3407,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-20/I02.png", + "asset": "asset:ref-20/I02.png", "pixels": 2269, - "mask": "/layout-reference/ref-20/I02-mask.png" + "mask": "asset:ref-20/I02-mask.png" }, { "id": "D01", @@ -3424,7 +3424,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-20/D01.png", + "asset": "asset:ref-20/D01.png", "pixels": 211 }, { @@ -3440,7 +3440,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-20/D02.png", + "asset": "asset:ref-20/D02.png", "pixels": 48 } ], @@ -3466,7 +3466,7 @@ "id": "ref-21", "name": "右侧旋转英文与节点方图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 616, @@ -3479,9 +3479,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-21/source.png", - "annotated": "/layout-reference/ref-21/annotated.png", - "background": "/layout-reference/ref-21/background.png", + "reference": "asset:ref-21/source.png", + "annotated": "asset:ref-21/annotated.png", + "background": "asset:ref-21/background.png", "elements": [ { "id": "T01", @@ -3496,9 +3496,9 @@ "text": "Bulublue", "direction": "rotated", "reading": "verified", - "asset": "/layout-reference/ref-21/T01.png", + "asset": "asset:ref-21/T01.png", "pixels": 1020, - "underlay": "/layout-reference/ref-21/T01-underlay.png" + "underlay": "asset:ref-21/T01-underlay.png" }, { "id": "T02", @@ -3513,9 +3513,9 @@ "text": "25", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-21/T02.png", + "asset": "asset:ref-21/T02.png", "pixels": 46, - "underlay": "/layout-reference/ref-21/T02-underlay.png" + "underlay": "asset:ref-21/T02-underlay.png" }, { "id": "T03", @@ -3530,9 +3530,9 @@ "text": "03", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-21/T03.png", + "asset": "asset:ref-21/T03.png", "pixels": 59, - "underlay": "/layout-reference/ref-21/T03-underlay.png" + "underlay": "asset:ref-21/T03-underlay.png" }, { "id": "T04", @@ -3547,9 +3547,9 @@ "text": "2025", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-21/T04.png", + "asset": "asset:ref-21/T04.png", "pixels": 116, - "underlay": "/layout-reference/ref-21/T04-underlay.png" + "underlay": "asset:ref-21/T04-underlay.png" }, { "id": "T05", @@ -3564,9 +3564,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-21/T05.png", + "asset": "asset:ref-21/T05.png", "pixels": 287, - "underlay": "/layout-reference/ref-21/T05-underlay.png" + "underlay": "asset:ref-21/T05-underlay.png" }, { "id": "T06", @@ -3581,9 +3581,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-21/T06.png", + "asset": "asset:ref-21/T06.png", "pixels": 603, - "underlay": "/layout-reference/ref-21/T06-underlay.png" + "underlay": "asset:ref-21/T06-underlay.png" }, { "id": "I01", @@ -3598,9 +3598,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/I01.png", + "asset": "asset:ref-21/I01.png", "pixels": 7379, - "mask": "/layout-reference/ref-21/I01-mask.png" + "mask": "asset:ref-21/I01-mask.png" }, { "id": "I02", @@ -3615,9 +3615,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/I02.png", + "asset": "asset:ref-21/I02.png", "pixels": 3138, - "mask": "/layout-reference/ref-21/I02-mask.png" + "mask": "asset:ref-21/I02-mask.png" }, { "id": "D01", @@ -3632,7 +3632,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/D01.png", + "asset": "asset:ref-21/D01.png", "pixels": 64 }, { @@ -3648,7 +3648,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/D02.png", + "asset": "asset:ref-21/D02.png", "pixels": 87 }, { @@ -3664,7 +3664,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/D03.png", + "asset": "asset:ref-21/D03.png", "pixels": 80 }, { @@ -3680,7 +3680,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/D04.png", + "asset": "asset:ref-21/D04.png", "pixels": 6 }, { @@ -3696,7 +3696,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-21/D05.png", + "asset": "asset:ref-21/D05.png", "pixels": 200 } ], @@ -3742,7 +3742,7 @@ "id": "ref-22", "name": "三段斜切背景与右侧白字", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 15, @@ -3755,9 +3755,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-22/source.png", - "annotated": "/layout-reference/ref-22/annotated.png", - "background": "/layout-reference/ref-22/background.png", + "reference": "asset:ref-22/source.png", + "annotated": "asset:ref-22/annotated.png", + "background": "asset:ref-22/background.png", "elements": [ { "id": "T01", @@ -3772,9 +3772,9 @@ "text": "蓝羽毛版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-22/T01.png", + "asset": "asset:ref-22/T01.png", "pixels": 3039, - "underlay": "/layout-reference/ref-22/T01-underlay.png" + "underlay": "asset:ref-22/T01-underlay.png" }, { "id": "T02", @@ -3789,9 +3789,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-22/T02.png", + "asset": "asset:ref-22/T02.png", "pixels": 160, - "underlay": "/layout-reference/ref-22/T02-underlay.png" + "underlay": "asset:ref-22/T02-underlay.png" }, { "id": "T03", @@ -3806,9 +3806,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-22/T03.png", + "asset": "asset:ref-22/T03.png", "pixels": 417, - "underlay": "/layout-reference/ref-22/T03-underlay.png" + "underlay": "asset:ref-22/T03-underlay.png" }, { "id": "T04", @@ -3823,9 +3823,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-22/T04.png", + "asset": "asset:ref-22/T04.png", "pixels": 430, - "underlay": "/layout-reference/ref-22/T04-underlay.png" + "underlay": "asset:ref-22/T04-underlay.png" }, { "id": "T05", @@ -3840,9 +3840,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-22/T05.png", + "asset": "asset:ref-22/T05.png", "pixels": 209, - "underlay": "/layout-reference/ref-22/T05-underlay.png" + "underlay": "asset:ref-22/T05-underlay.png" }, { "id": "T06", @@ -3857,9 +3857,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-22/T06.png", + "asset": "asset:ref-22/T06.png", "pixels": 373, - "underlay": "/layout-reference/ref-22/T06-underlay.png" + "underlay": "asset:ref-22/T06-underlay.png" }, { "id": "I01", @@ -3874,9 +3874,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-22/I01.png", + "asset": "asset:ref-22/I01.png", "pixels": 4545, - "mask": "/layout-reference/ref-22/I01-mask.png" + "mask": "asset:ref-22/I01-mask.png" }, { "id": "I02", @@ -3891,9 +3891,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-22/I02.png", + "asset": "asset:ref-22/I02.png", "pixels": 5013, - "mask": "/layout-reference/ref-22/I02-mask.png" + "mask": "asset:ref-22/I02-mask.png" }, { "id": "I03", @@ -3908,9 +3908,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-22/I03.png", + "asset": "asset:ref-22/I03.png", "pixels": 4403, - "mask": "/layout-reference/ref-22/I03-mask.png" + "mask": "asset:ref-22/I03-mask.png" } ], "ocr": [], @@ -3924,7 +3924,7 @@ "id": "ref-23", "name": "上方方图与中部大写英文", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 134, @@ -3937,9 +3937,9 @@ }, "width": 114, "height": 172, - "reference": "/layout-reference/ref-23/source.png", - "annotated": "/layout-reference/ref-23/annotated.png", - "background": "/layout-reference/ref-23/background.png", + "reference": "asset:ref-23/source.png", + "annotated": "asset:ref-23/annotated.png", + "background": "asset:ref-23/background.png", "elements": [ { "id": "T01", @@ -3954,9 +3954,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-23/T01.png", + "asset": "asset:ref-23/T01.png", "pixels": 85, - "underlay": "/layout-reference/ref-23/T01-underlay.png" + "underlay": "asset:ref-23/T01-underlay.png" }, { "id": "T02", @@ -3971,9 +3971,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-23/T02.png", + "asset": "asset:ref-23/T02.png", "pixels": 129, - "underlay": "/layout-reference/ref-23/T02-underlay.png" + "underlay": "asset:ref-23/T02-underlay.png" }, { "id": "T03", @@ -3988,9 +3988,9 @@ "text": "BULUBLUE", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-23/T03.png", + "asset": "asset:ref-23/T03.png", "pixels": 1533, - "underlay": "/layout-reference/ref-23/T03-underlay.png" + "underlay": "asset:ref-23/T03-underlay.png" }, { "id": "T04", @@ -4005,9 +4005,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-23/T04.png", + "asset": "asset:ref-23/T04.png", "pixels": 729, - "underlay": "/layout-reference/ref-23/T04-underlay.png" + "underlay": "asset:ref-23/T04-underlay.png" }, { "id": "T05", @@ -4022,9 +4022,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-23/T05.png", + "asset": "asset:ref-23/T05.png", "pixels": 285, - "underlay": "/layout-reference/ref-23/T05-underlay.png" + "underlay": "asset:ref-23/T05-underlay.png" }, { "id": "I01", @@ -4039,9 +4039,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-23/I01.png", + "asset": "asset:ref-23/I01.png", "pixels": 5032, - "mask": "/layout-reference/ref-23/I01-mask.png" + "mask": "asset:ref-23/I01-mask.png" } ], "ocr": [ @@ -4066,7 +4066,7 @@ "id": "ref-24", "name": "斜排中文与倾斜装饰线框", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 256, @@ -4079,9 +4079,9 @@ }, "width": 113, "height": 172, - "reference": "/layout-reference/ref-24/source.png", - "annotated": "/layout-reference/ref-24/annotated.png", - "background": "/layout-reference/ref-24/background.png", + "reference": "asset:ref-24/source.png", + "annotated": "asset:ref-24/annotated.png", + "background": "asset:ref-24/background.png", "elements": [ { "id": "T01", @@ -4096,9 +4096,9 @@ "text": "蓝羽毛版式", "direction": "angled", "reading": "verified", - "asset": "/layout-reference/ref-24/T01.png", + "asset": "asset:ref-24/T01.png", "pixels": 725, - "underlay": "/layout-reference/ref-24/T01-underlay.png" + "underlay": "asset:ref-24/T01-underlay.png" }, { "id": "T02", @@ -4113,9 +4113,9 @@ "text": null, "direction": "angled", "reading": "unreadable", - "asset": "/layout-reference/ref-24/T02.png", + "asset": "asset:ref-24/T02.png", "pixels": 91, - "underlay": "/layout-reference/ref-24/T02-underlay.png" + "underlay": "asset:ref-24/T02-underlay.png" }, { "id": "I01", @@ -4130,9 +4130,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/I01.png", + "asset": "asset:ref-24/I01.png", "pixels": 6799, - "mask": "/layout-reference/ref-24/I01-mask.png" + "mask": "asset:ref-24/I01-mask.png" }, { "id": "D01", @@ -4147,7 +4147,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/D01.png", + "asset": "asset:ref-24/D01.png", "pixels": 190 }, { @@ -4163,7 +4163,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/D02.png", + "asset": "asset:ref-24/D02.png", "pixels": 624 }, { @@ -4179,7 +4179,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/D03.png", + "asset": "asset:ref-24/D03.png", "pixels": 750 }, { @@ -4195,7 +4195,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/D04.png", + "asset": "asset:ref-24/D04.png", "pixels": 438 }, { @@ -4211,7 +4211,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-24/D05.png", + "asset": "asset:ref-24/D05.png", "pixels": 68 } ], @@ -4237,7 +4237,7 @@ "id": "ref-25", "name": "左侧竖题与右下方形主图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 376, @@ -4250,9 +4250,9 @@ }, "width": 113, "height": 173, - "reference": "/layout-reference/ref-25/source.png", - "annotated": "/layout-reference/ref-25/annotated.png", - "background": "/layout-reference/ref-25/background.png", + "reference": "asset:ref-25/source.png", + "annotated": "asset:ref-25/annotated.png", + "background": "asset:ref-25/background.png", "elements": [ { "id": "T01", @@ -4267,9 +4267,9 @@ "text": "高级·版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-25/T01.png", + "asset": "asset:ref-25/T01.png", "pixels": 233, - "underlay": "/layout-reference/ref-25/T01-underlay.png" + "underlay": "asset:ref-25/T01-underlay.png" }, { "id": "T02", @@ -4284,9 +4284,9 @@ "text": null, "direction": "vertical", "reading": "unreadable", - "asset": "/layout-reference/ref-25/T02.png", + "asset": "asset:ref-25/T02.png", "pixels": 51, - "underlay": "/layout-reference/ref-25/T02-underlay.png" + "underlay": "asset:ref-25/T02-underlay.png" }, { "id": "T03", @@ -4301,9 +4301,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-25/T03.png", + "asset": "asset:ref-25/T03.png", "pixels": 397, - "underlay": "/layout-reference/ref-25/T03-underlay.png" + "underlay": "asset:ref-25/T03-underlay.png" }, { "id": "T04", @@ -4318,9 +4318,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-25/T04.png", + "asset": "asset:ref-25/T04.png", "pixels": 3, - "underlay": "/layout-reference/ref-25/T04-underlay.png" + "underlay": "asset:ref-25/T04-underlay.png" }, { "id": "I01", @@ -4335,9 +4335,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-25/I01.png", + "asset": "asset:ref-25/I01.png", "pixels": 6010, - "mask": "/layout-reference/ref-25/I01-mask.png" + "mask": "asset:ref-25/I01-mask.png" }, { "id": "D01", @@ -4352,7 +4352,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-25/D01.png", + "asset": "asset:ref-25/D01.png", "pixels": 481 } ], @@ -4378,7 +4378,7 @@ "id": "ref-26", "name": "三行英文与曲线指引小图", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 496, @@ -4391,9 +4391,9 @@ }, "width": 114, "height": 173, - "reference": "/layout-reference/ref-26/source.png", - "annotated": "/layout-reference/ref-26/annotated.png", - "background": "/layout-reference/ref-26/background.png", + "reference": "asset:ref-26/source.png", + "annotated": "asset:ref-26/annotated.png", + "background": "asset:ref-26/background.png", "elements": [ { "id": "D01", @@ -4408,7 +4408,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/D01.png", + "asset": "asset:ref-26/D01.png", "pixels": 7 }, { @@ -4424,7 +4424,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/D02.png", + "asset": "asset:ref-26/D02.png", "pixels": 134 }, { @@ -4440,9 +4440,9 @@ "text": "Format 58", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-26/T01.png", + "asset": "asset:ref-26/T01.png", "pixels": 657, - "underlay": "/layout-reference/ref-26/T01-underlay.png" + "underlay": "asset:ref-26/T01-underlay.png" }, { "id": "T02", @@ -4457,9 +4457,9 @@ "text": "Bulubl", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-26/T02.png", + "asset": "asset:ref-26/T02.png", "pixels": 433, - "underlay": "/layout-reference/ref-26/T02-underlay.png" + "underlay": "asset:ref-26/T02-underlay.png" }, { "id": "T03", @@ -4474,9 +4474,9 @@ "text": "Bulublue", "direction": "horizontal", "reading": "verified", - "asset": "/layout-reference/ref-26/T03.png", + "asset": "asset:ref-26/T03.png", "pixels": 574, - "underlay": "/layout-reference/ref-26/T03-underlay.png" + "underlay": "asset:ref-26/T03-underlay.png" }, { "id": "T04", @@ -4491,9 +4491,9 @@ "text": "高级版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-26/T04.png", + "asset": "asset:ref-26/T04.png", "pixels": 374, - "underlay": "/layout-reference/ref-26/T04-underlay.png" + "underlay": "asset:ref-26/T04-underlay.png" }, { "id": "T05", @@ -4508,9 +4508,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-26/T05.png", + "asset": "asset:ref-26/T05.png", "pixels": 888, - "underlay": "/layout-reference/ref-26/T05-underlay.png" + "underlay": "asset:ref-26/T05-underlay.png" }, { "id": "I01", @@ -4525,9 +4525,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/I01.png", + "asset": "asset:ref-26/I01.png", "pixels": 2150, - "mask": "/layout-reference/ref-26/I01-mask.png" + "mask": "asset:ref-26/I01-mask.png" }, { "id": "D03", @@ -4542,7 +4542,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/D03.png", + "asset": "asset:ref-26/D03.png", "pixels": 230 }, { @@ -4558,7 +4558,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/D04.png", + "asset": "asset:ref-26/D04.png", "pixels": 534 }, { @@ -4574,7 +4574,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-26/D05.png", + "asset": "asset:ref-26/D05.png", "pixels": 19 } ], @@ -4620,7 +4620,7 @@ "id": "ref-27", "name": "对角双区与斜向文字带", "source": { - "url": "/layout-reference/source.png", + "url": "asset:source.png", "sha256": "121ab8a362c45eee86281ca5dfbbe33577cfcd255579a16c3542530484b9f1dc", "box": [ 618, @@ -4633,9 +4633,9 @@ }, "width": 112, "height": 172, - "reference": "/layout-reference/ref-27/source.png", - "annotated": "/layout-reference/ref-27/annotated.png", - "background": "/layout-reference/ref-27/background.png", + "reference": "asset:ref-27/source.png", + "annotated": "asset:ref-27/annotated.png", + "background": "asset:ref-27/background.png", "elements": [ { "id": "T01", @@ -4650,9 +4650,9 @@ "text": "高级の版式", "direction": "vertical", "reading": "verified", - "asset": "/layout-reference/ref-27/T01.png", + "asset": "asset:ref-27/T01.png", "pixels": 396, - "underlay": "/layout-reference/ref-27/T01-underlay.png" + "underlay": "asset:ref-27/T01-underlay.png" }, { "id": "T02", @@ -4667,9 +4667,9 @@ "text": "蓝羽毛·版式", "direction": "angled", "reading": "verified", - "asset": "/layout-reference/ref-27/T02.png", + "asset": "asset:ref-27/T02.png", "pixels": 273, - "underlay": "/layout-reference/ref-27/T02-underlay.png" + "underlay": "asset:ref-27/T02-underlay.png" }, { "id": "T03", @@ -4684,9 +4684,9 @@ "text": null, "direction": "horizontal", "reading": "unreadable", - "asset": "/layout-reference/ref-27/T03.png", + "asset": "asset:ref-27/T03.png", "pixels": 865, - "underlay": "/layout-reference/ref-27/T03-underlay.png" + "underlay": "asset:ref-27/T03-underlay.png" }, { "id": "I01", @@ -4701,9 +4701,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-27/I01.png", + "asset": "asset:ref-27/I01.png", "pixels": 6738, - "mask": "/layout-reference/ref-27/I01-mask.png" + "mask": "asset:ref-27/I01-mask.png" }, { "id": "I02", @@ -4718,9 +4718,9 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-27/I02.png", + "asset": "asset:ref-27/I02.png", "pixels": 4949, - "mask": "/layout-reference/ref-27/I02-mask.png" + "mask": "asset:ref-27/I02-mask.png" }, { "id": "D01", @@ -4735,7 +4735,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-27/D01.png", + "asset": "asset:ref-27/D01.png", "pixels": 581 }, { @@ -4751,7 +4751,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-27/D02.png", + "asset": "asset:ref-27/D02.png", "pixels": 2000 }, { @@ -4767,7 +4767,7 @@ "text": null, "direction": "horizontal", "reading": "not-text", - "asset": "/layout-reference/ref-27/D03.png", + "asset": "asset:ref-27/D03.png", "pixels": 391 } ], diff --git a/apps/wiki/src/content/layouts/reference/ocr-evidence.json b/content/layout-reference/ocr-evidence.json similarity index 100% rename from apps/wiki/src/content/layouts/reference/ocr-evidence.json rename to content/layout-reference/ocr-evidence.json diff --git a/content/layout-reference/post-ids.json b/content/layout-reference/post-ids.json new file mode 100644 index 0000000..5be0ced --- /dev/null +++ b/content/layout-reference/post-ids.json @@ -0,0 +1,30 @@ +{ + "router": "8eb8c76500580f7a4b56ba3c", + "ref-01": "eb937b42be92a9f6feee684f", + "ref-02": "1179d1b1a5f21a99fa0cf542", + "ref-03": "f3079f1dbb242180e04b602b", + "ref-04": "b7a5981ea582ed94384af2ae", + "ref-05": "a01a0ab78461632b8cb148f9", + "ref-06": "c524f9c3858052ebcc5ab8ef", + "ref-07": "7d4cefdfada28bbe9e570af3", + "ref-08": "e53f7620a90d3f8076c44326", + "ref-09": "18aff77f5f032eda1a2cd04b", + "ref-10": "d5906c34d3efb6fdbcb40da8", + "ref-11": "d1718fd03494af0c8c95e4c4", + "ref-12": "f78131152506cbf7dec7506a", + "ref-13": "d3c5eae33973291530d1118e", + "ref-14": "b042317268286cff3e52d145", + "ref-15": "acbebf9c77fb2432be877bf0", + "ref-16": "d3b2ec816983aadb5b4690be", + "ref-17": "7b1b2fc5b9690213bbbe07ac", + "ref-18": "5b376e57c70ce8a49cf4e491", + "ref-19": "246c33f9fff157ab9a4c1df7", + "ref-20": "b5db869088ed8296d8329f83", + "ref-21": "fd6b7caabcf3077f9bdc32c7", + "ref-22": "8561d1fd6f23335373eab1ba", + "ref-23": "30f3978167ba3da8770ec5de", + "ref-24": "6c72e53a6e2f497852f98f04", + "ref-25": "51c0712b17a8372a5fa151df", + "ref-26": "f356b77194288909ee4352b4", + "ref-27": "b30a9778355b7132633f51b3" +} diff --git a/content/layout-reference/renderer.tsx b/content/layout-reference/renderer.tsx new file mode 100644 index 0000000..3f23554 --- /dev/null +++ b/content/layout-reference/renderer.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import type {CSSProperties} from 'react'; +type Part={id:string;kind:string;role:string;box:number[];asset:string;text?:string|null;direction?:string;mask?:string;underlay?:string}; +export type Layout={id:string;width:number;height:number;background:string;elements:Part[]}; +// The manifest is copied from the post's JSON block. This file is consumer code, not a Wiki route. +export function LayoutPoster({id,layout,text={},images={},assetBase=''}:{id:string;layout:Layout;text?:Record;images?:Record;assetBase?:string}){ + if(layout.id!==id)throw Error('版面 ID 不一致'); + for(const[kind,values]of [['text',text],['image',images]] as const)for(const key of Object.keys(values))if(!layout.elements.some(e=>key===id+'/'+e.id&&kind===e.kind))throw Error('构件类型或所属版面不一致:'+key); + const src=(url:string)=>url.startsWith('/')?assetBase+url:url; + return
+
+ + {layout.elements.map(e=>{ + const[x,y,w,h]=e.box,key=id+'/'+e.id,position:CSSProperties={position:'absolute',left:x/layout.width*100+'%',top:y/layout.height*100+'%',width:w/layout.width*100+'%',height:h/layout.height*100+'%',zIndex:e.kind==='text'?3:e.kind==='decoration'?2:1}; + if(e.kind==='text'&&Object.hasOwn(text,key)){ + if(e.direction==='curved')throw Error('弧形文字须使用本设计专用 SVG 路径,不能直接改成直排'); + const vertical=e.direction==='vertical'||e.direction==='rotated',lines=text[key].split('\n'),units=Math.max(1,...lines.map(line=>Array.from(line).reduce((n,c)=>n+(/[\u3400-\u9fff]/.test(c)?1:.56),0))),size=vertical?Math.min(w,h/Math.max(1,text[key].length)):Math.min(h/(lines.length*1.1),w/units); + return {e.underlay&&}{text[key]}; + } + return {e.kind==='text'?e.text||e.role+'(未辨识原字形)':''}; + })} +
+
; +} diff --git a/content/layout-reference/verify.mjs b/content/layout-reference/verify.mjs new file mode 100644 index 0000000..0e64817 --- /dev/null +++ b/content/layout-reference/verify.mjs @@ -0,0 +1,16 @@ +import {createRequire} from 'node:module'; +import {readFile,access} from 'node:fs/promises'; +import {fileURLToPath} from 'node:url'; +import path from 'node:path'; +import assert from 'node:assert/strict'; +const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'../..'),require=createRequire(path.join(root,'apps/wiki/package.json')),sharp=require('sharp'); +const layouts=JSON.parse(await readFile(path.join(root,'content/layout-reference/manifest.json'),'utf8')); +const file=url=>path.join(root,'content/layout-reference/assets',url.slice('asset:'.length)); +assert.equal(layouts.length,27);assert.equal(new Set(layouts.map(l=>l.id)).size,27); +for(const l of layouts){ + const actual=await sharp(file(l.background)).composite(l.elements.map(e=>({input:file(e.asset),left:e.box[0],top:e.box[1]}))).removeAlpha().raw().toBuffer(),expected=await sharp(file(l.reference)).removeAlpha().raw().toBuffer(); + assert.ok(actual.equals(expected),l.id); + for(const e of l.elements)for(const key of ['asset','mask','underlay'])if(e[key])await access(file(e[key])); +} +assert.deepEqual(layouts[0].elements.filter(e=>e.kind==='text').map(e=>e.id),['T01','T02']); +console.log('27 authoring manifests and 217 classified components verified; all physical composites equal their source crops.'); diff --git a/docs/premium-layouts.md b/docs/premium-layouts.md index 2246cf0..6b0d9e2 100644 --- a/docs/premium-layouts.md +++ b/docs/premium-layouts.md @@ -1,39 +1,26 @@ -# 27 张原图对应排版 +# 原图排版:通过 API 发布普通 post -本组发布 27 张原图一一对应的设计 post,加 1 篇 Router。替换此前的 12 套概括构图;原 Router ID 保持稳定,旧 12 篇 post ID 跳转 Router,不擅自映射到一张近似设计。 +本组内容是 27 张设计 post + 1 篇 Router,保留原有 `/explore/` 地址。素材、封面、构件清单和 HTML/React/Next.js 示例均为 API 上传的数据,不再注册为 Wiki 的代码内容。 -## 原图与编号 +## 通用 API 工作流 -用户提供的 736×980 拼图中,排除左侧“高级感排版”说明栏;从上到下、每行从左到右编号 ref-01…ref-27。前 3 行各 5 张,后 2 行各 6 张,左下两张计入。`public/layout-reference/numbered-source.png` 给出准确位置;`index.json` 为机器入口。 +1. `POST /api/upload`,multipart `assetOnly=true`,独立存储图像,不创建素材包。 +2. `POST /api/posts`,传入 `publicId`(可选的 24 位稳定 ID)、图片关联、正文、标签与封面,创建普通数据库 post。 +3. 后续 `GET /api/notes/{id}` 获取 revision,再 `PUT` 更新文字、媒体关联及 `coverAssetId`。普通 UUID 与稳定 publicId 都可读取和编辑。 +4. 图片通过 `/api/media/{id}`,正文通过原 post 的 `?agent_mode=True` 读取。 -## 识别流程 +publicId 是通用迁移能力,不包含任何排版 ID 特判。数据库 post 可以接管同 ID 的代码条目,内容流按稳定 ID 去重。媒体和封面参与 revision,防止并发修改覆盖。替换素材关联只改引用,不删除原二进制或其他 post 的引用。 -`segment-layout-reference.ts` 从外沿采样灰底,以 RGB 最大通道差 >19 建前景 mask,四邻域连通域按宽高范围筛选,自动检测 27 张。按 y 聚行、按 x 排序;没有手写外裁片表。 +## 本地创作数据与封面 -`recognize-layout-text.swift` 使用 macOS Vision 本地 OCR,证据保存在 `reference/ocr-evidence.json`。逐张人工复核的文字、图位、装饰区域记录在 `annotations.json`。图位依据局部颜色种子建立掩膜;文字按亮暗与背景颜色分离,保留未知微字,不把 OCR 候选当作确认内容。 +`content/layout-reference/` 是 Wiki 应用之外的本地创作输入;不会被应用编译或挂载到 public。27 张原图、217 个文字/图位/装饰构件及识别证据保留在这里。`scripts/publish-layout-reference.mjs` 通过上述通用 API 上传资料,使用检查点保证可继续发布。 -`group-text.ts` 将与既有文字块在基线、间距和字高上相连的残余字形合并。ref-01 的末尾字符保持在 T01,不能再产生 T03;ref-21 的 03 日期与旋转英文保持独立。 +新封面由 27 张实际裁片组成,使用 ref-01…ref-27 标签,并标出文字 113、图位 51、装饰 53。封面经媒体 API 上传并设置为 Router 的普通 coverAssetId。 -T=文字,I=图片占位/色块,D=装饰,背景另存。每个构件有类型、角色、局部 box、原字形资产;文字可读则有 text,未知则为 null。27 张的 source SHA 与裁片绝对坐标持久保存。不同设计使用完整键,例如 ref-01/T01,运行时拒绝跨设计与跨类型替换。 +旧 `/layout-reference/...` 检查器、HTML 演示、JSON 静态文件及 ZIP 资源已从站点移除。构件表与清单直接写在 post 正文中;代码是可复制文本,不在 Wiki 内执行。原有 12 类近似方案的代码重定向特判也移除。 -## 输出和使用 +## 验证 -每张 `public/layout-reference/ref-NN/` 包含原裁片、标注图、三类掩膜图、分离构件 PNG、图位替换 mask、文字下的近似填补层、背景、重组 PNG、构件 JSON 与交互检查器。`ReferenceLayout.tsx` 默认使用原始分类资产重组;替换文字时改为 DOM,替换图位时使用该构件的遮罩,坐标保持对应。原字形模式为像素保真;替换模式并非像素保真,不声称恢复了原字体。 +本地执行类型检查和单元测试。Docker 集成测试验证独立上传不创建 post、stable publicId 接管与去重、正文及 JSON/TSX 的纯文本可读性、封面更新及并发冲突、媒体引用替换、重复 ID 拒绝,以及旧自定义目录返回 404。 -`documents.ts` 为每张生成一篇独立教学 post:原图位置、构件表、文字方向、制作步骤、HTML、React、Next.js 和验收规则。Router 提供完整 27 项索引、识别方法、类型定义和严格调用协议。`package-reference-layouts.ts` 将 28 篇 Markdown、React/Next.js 代码和资产打包为 ZIP。 - -原图只有低分辨率拼图,无法恢复细字或确定字体。保留原字形不等于 OCR 全部正确;自动像素比较只验证重组一致,语义标注仍需人工查看。参考中灰绿区域为占位/色块,无可辨认真实照片。网页长文另提供正常可读正文。 - -## 重建与验证 - -从 apps/wiki 依次执行: - -``` -node --import tsx scripts/segment-layout-reference.ts -node --import tsx scripts/build-reference-layout-demos.ts -node --import tsx scripts/package-reference-layouts.ts -``` - -可选重新运行 Vision OCR:先将每张裁片等比放大,再运行 Swift 脚本,输出新证据,人工复核后更新 annotations;不可直接覆盖已核对语义。 - -`tests/layout-reference.test.tsx` 校验 27 个 ID 与行列、源 SHA、类型与资产归属、全部独立图层的真实合成像素、同词合并、日期独立、跨版面替换拒绝、React 渲染、三类代码示例与旧 post 跳转。生产构建和集成检查通过后,在指定服务器验收;不启动本地页面预览。 +部署成功后运行 API 发布客户端,核对 28 个标准 post、媒体文件、Router 封面、纯文本入口和正文中的全部链接。图像识别与构件合成属于本地创作校验,不作为 Wiki 的页面实现。 diff --git a/scripts/layout-reference-cover.mjs b/scripts/layout-reference-cover.mjs new file mode 100644 index 0000000..ffa2c35 --- /dev/null +++ b/scripts/layout-reference-cover.mjs @@ -0,0 +1,17 @@ +import {createRequire} from 'node:module'; +import {readFile} from 'node:fs/promises'; +import {fileURLToPath} from 'node:url'; +import path from 'node:path'; +const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..'); +const require=createRequire(path.join(root,'apps/wiki/package.json')),sharp=require('sharp'); +const layouts=JSON.parse(await readFile(path.join(root,'content/layout-reference/manifest.json'),'utf8')); +const layers=[];let shapes=''; +for(const[i,l]of layouts.entries()){ + const x=52+i%6*166,y=200+Math.floor(i/6)*232; + shapes+=`${l.id.toUpperCase()}`; + const bytes=await sharp(path.join(root,'content/layout-reference/assets',l.id,'source.png')).resize({width:130,height:190,fit:'inside'}).png().toBuffer(); + const meta=await sharp(bytes).metadata();layers.push({input:bytes,left:Math.round(x+(146-meta.width)/2),top:y+7}); +} +const svg=`27原图对应排版一张设计 · 一份构件清单${shapes}构件分层T 文字 113I 图位 51D 装饰 53共 217 组原裁片 / 坐标 / 代码 / 验收WIKI · TEXT + IMAGEREF-01 — REF-27`; +await sharp(Buffer.from(svg)).composite(layers).png().toFile(path.join(root,'content/layout-reference/assets/router-cover.png')); +console.log('Created Router cover from all 27 actual source crops.'); diff --git a/scripts/publish-layout-reference.mjs b/scripts/publish-layout-reference.mjs new file mode 100644 index 0000000..5b3745c --- /dev/null +++ b/scripts/publish-layout-reference.mjs @@ -0,0 +1,65 @@ +/** Local authoring client. Publishes text/images exclusively through existing generic Wiki APIs. */ +import {readFile,writeFile,mkdir} from 'node:fs/promises'; +import {createHash} from 'node:crypto'; +import {fileURLToPath} from 'node:url'; +import path from 'node:path'; +const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..'),dataRoot=path.join(root,'content/layout-reference'); +const raw=JSON.parse(await readFile(path.join(dataRoot,'manifest.json'),'utf8')); +const ids=JSON.parse(await readFile(path.join(dataRoot,'post-ids.json'),'utf8')); +const renderer=await readFile(path.join(dataRoot,'renderer.tsx'),'utf8'); +const base=(process.env.WIKI_BASE||'http://8.211.154.134:18131').replace(/\/$/,''); +const statePath=process.env.WIKI_PUBLISH_STATE||path.join(root,'output/layout-reference-publish-state.json'); +const dryRun=process.argv.includes('--dry-run'); +let state;try{state=JSON.parse(await readFile(statePath,'utf8'))}catch{state={base,assets:{},posts:{}}} +if(state.base!==base)throw Error('发布状态属于另一站点,请使用独立状态文件'); +const save=async()=>{await mkdir(path.dirname(statePath),{recursive:true});await writeFile(statePath,JSON.stringify(state,null,2)+'\n')}; +async function api(url,options={}){ + const r=await fetch(base+url,{...options,signal:AbortSignal.timeout(120000)});if(r.status===404)return null; + if(!r.ok)throw Error(`${url}: ${r.status} ${(await r.text()).slice(0,400)}`);return r.json(); +} +const assetNames=new Set(['router-cover.png','source.png','numbered-source.png']); +for(const l of raw){for(const field of ['reference','annotated','background'])assetNames.add(l[field].slice('asset:'.length));for(const kind of ['text','image','decoration'])assetNames.add(`${l.id}/${kind}-map.png`);for(const e of l.elements)for(const field of ['asset','mask','underlay'])if(e[field])assetNames.add(e[field].slice('asset:'.length))} +const byFile={},pending=[]; +for(const name of [...assetNames].sort()){ + const bytes=await readFile(path.join(dataRoot,'assets',name)),hash=createHash('sha256').update(bytes).digest('hex');byFile[name]={bytes,hash}; + if(!state.assets[hash]&&!pending.some(a=>a.hash===hash))pending.push({name,bytes,hash}); +} +if(!dryRun){ + for(let offset=0;offset'/api/media/'+(state.assets[byFile[name]?.hash]||(dryRun?'00000000-0000-0000-0000-000000000000':(()=>{throw Error('素材缺失:'+name)})())); +const map=value=>typeof value==='string'&&value.startsWith('asset:')?media(value.slice('asset:'.length)):Array.isArray(value)?value.map(map):value&&typeof value==='object'?Object.fromEntries(Object.entries(value).map(([k,v])=>[k,map(v)])):value; +const layouts=raw.map(({ocr,...l})=>map(l)); +const link=(id,label=id)=>`[${label}](/explore/${ids[id]}?agent_mode=True)`; +const fence=(lang,text)=>'```'+lang+'\n'+text+'\n```'; +const kindName=k=>({text:'文字',image:'图片占位/色块',decoration:'装饰'})[k]; +const reactExample=l=>`// 将本文 JSON 保存为 ${l.id}.json;将下方组件保存为 LayoutPoster.tsx。\nimport {LayoutPoster} from './LayoutPoster';\nimport layout from './${l.id}.json';\nexport default function Example(){\n return ;\n}`; +const nextExample=l=>`// 你的 Next.js 项目 app/page.tsx,沿用现有根布局。\nimport {LayoutPoster} from '@/components/LayoutPoster';\nimport layout from '@/content/${l.id}.json';\nexport default function Page(){\n return
;\n}\n// 静态排版可作为 Server Component;交互外壳才需要 use client。`; +const htmlExample=l=>`\n${l.id}\n\n
`; +const common='默认模式使用已分类的原字形与图形 PNG,重组后保留原像素;它不是字体或矢量轮廓的自动恢复。替换文字时才渲染 DOM 文本,字体变化须重新验收。微字内容未辨识时保持 null,不猜写。参考图中的灰绿区域是图片占位/色块,没有可辨认的真实照片。'; +const sourceNote='原始拼图仅 736×980,每张约 112×173;放大不恢复缺失细节。图片与构件均通过本文的 /api/media 链接读取,JSON 和源码直接作为文本提供。'; +const routerMarkdown=`这是一份以文本和图像为载体的 27 张原图排版路由文档。左侧说明栏不计入;从上到下、每行从左到右编号,前三行各 5 张、后两行各 6 张。每张设计有独立 post、源坐标、构件清单与代码示例。\n\n## 27 张固定对应索引\n\n| ID | 原图位置(含左侧说明栏所在列) | 设计 |\n| --- | --- | --- |\n${layouts.map(l=>`| ${link(l.id)} | 第 ${l.source.row} 行、第 ${l.source.column} 列 | ${l.name} |`).join('\n')}\n\n## 路由规则\n\n输入必须给出 ref-01 至 ref-27 中的一个 ID;不能用近似风格名随意替换构图。读取目标 post 的原图、分类图与 JSON,再按 source.box 和每个构件 box 定位。对外使用完整构件键,例如 ref-01/T01;不得混入 ref-02 的素材。\n\n## 三类构件\n\nT 是文字:标题、品牌、日期、正文、图注。I 是图片占位或色块。D 是线框、圆环、节点和引线。纸底单独保存。相同单词的残字应合并,ref-01 的品牌字标整体为 T01、左下说明为 T02,没有重复的 T03。ref-21 的 03 日期与旋转英文保持独立。\n\n## 识别与复核\n\n先按背景差分和四邻域连通域检测 27 张外框;按 y 聚行、按 x 排序。使用本机 Vision 提取 OCR 候选,再人工核对文字区与图形区;图位按局部颜色种子和连通形状提取。残字按基线、间距和字高合并。默认图层实际合成覆盖 527,155 个像素,与原裁片 RGB 一致;这只证明重组保真,不代替语义复核。\n\n${common}\n\n${sourceNote}\n\n## 调用与交付\n\n1. 明确 layoutId。\n2. 阅读对应 post 的文字、图像与 JSON。\n3. 检查各构件 id、类型、坐标与方向。\n4. 根据 HTML、React 或 Next.js 示例创建你自己的作品。\n5. 替换内容后检查溢出、字体、竖排、裁切和透明边缘。\n\n所有本系列资料均是普通 Wiki post 与媒体资产;不需要独立演示页、检查器、JSON 文件端点或下载页面。获取纯文本用同一个 post 地址加 ?agent_mode=True。\n\n## 共用 React / TSX 渲染器\n\n将下面代码保存到你自己的项目中,配合子文档的 JSON;这些是创作示例,不是 Wiki 站的页面。跨站使用前可先通过 API 下载素材到自己的项目,并按需替换资源路径。\n\n${fence('tsx',renderer)}\n`; +const posts=[{key:'router',publicId:ids.router,slug:'layout-reference-router',title:'高级感排版 · 27 张原图 Router',description:'27 张实际原图的编号索引,按文字、图位和装饰分层调用;文档与图片均可直接读取。',markdown:routerMarkdown,main:['router-cover.png','numbered-source.png'],extra:['source.png']}]; +for(const l of layouts){ + const text=l.elements.filter(e=>e.kind==='text'),images=l.elements.filter(e=>e.kind==='image'),decor=l.elements.filter(e=>e.kind==='decoration'); + const markdown=`${l.id} 只对应原图第 ${l.source.row} 行、第 ${l.source.column} 列的“${l.name}”。原裁片 source.box = [${l.source.box.join(', ')}]。\n\n## 图像阅读顺序\n\n第 1 张是原裁片;第 2 张是构件标注;第 3 张为蓝色文字掩膜;第 4 张为橙色图位掩膜;第 5 张为绿色装饰掩膜。文字 ${text.length} 组、图片占位/色块 ${images.length} 组、装饰 ${decor.length} 组。T 和 I 可以叠放,但不能混成同一构件。\n\n## 构件逐项对应\n\n| 完整键 | 类型 | 用途 | 坐标 x,y,w,h | 内容或状态 |\n| --- | --- | --- | --- | --- |\n${l.elements.map(e=>`| ${l.id}/${e.id} | ${kindName(e.kind)} | ${e.role} | ${e.box.join(', ')} | ${e.kind==='text'?(e.text??'待核对,保留原字形'):'非文字'} |`).join('\n')}\n\n## 制作步骤\n\n1. 使用 ${l.width}×${l.height} 的源坐标建立画板,保持比例。\n2. 按 I 构件放置 ${images.map(e=>e.id+' '+e.role).join('、')},采用本构件 mask。\n3. 分别放置 ${text.map(e=>e.id+' '+e.role).join('、')}。\n4. 还原 ${decor.map(e=>e.id+' '+e.role).join('、')||'原有细节'}。\n5. 与原裁片叠加比较,检查同词拆框、文字遮挡与边缘裁切。\n\n## 文字方向\n\n${text.map(e=>'- '+e.id+':'+({vertical:'竖排',rotated:'整体旋转',angled:'倾斜排字',curved:'沿曲线排字',horizontal:'横排'}[e.direction]||e.direction)+';'+(e.text?'已核对“'+e.text+'”':'无法可靠辨认,保留独立原字形')+'。').join('\n')}\n\n${common}\n\n${sourceNote}\n\n## 机器可读构件清单\n\n以下 JSON 即本设计清单,所有资源都指向标准媒体 API。将它另存到创作项目中即可使用,无需访问其他页面。\n\n${fence('json',JSON.stringify(l,null,2))}\n\n## HTML / CSS 示例\n\n${fence('html',htmlExample(l))}\n\n## React / TSX 示例\n\n${fence('tsx',reactExample(l))}\n\n## 共用渲染器源码\n\n${fence('tsx',renderer)}\n\n## Next.js App Router 示例\n\n${fence('tsx',nextExample(l))}\n\n## 替换与验收\n\n只允许本设计完整键,如 ${l.id}/${text[0].id};图位使用 I 键,不能作为文字键。原样模式保留原图;替换模式会改变内容和字体,需重新验收。弧形文字须沿该设计专用 SVG 路径排字,通用渲染器拒绝直接改成横排。网页长文另提供正常字号正文,不把低分辨率海报小字当作阅读版。\n\n${link('router','返回 27 张 Router')}\n`; + const extra=new Set(['source.png',`${l.id}/background.png`]);for(const e of raw.find(x=>x.id===l.id).elements)for(const key of ['asset','mask','underlay'])if(e[key])extra.add(e[key].slice('asset:'.length)); + posts.push({key:l.id,publicId:ids[l.id],slug:'layout-reference-'+l.id,title:l.id+' · '+l.name,description:`${l.id} 原图一一对应:${text.length} 组文字、${images.length} 组图位、${decor.length} 组装饰;含图像、坐标及 HTML/React/Next.js 示例。`,markdown,main:[`${l.id}/source.png`,`${l.id}/annotated.png`,`${l.id}/text-map.png`,`${l.id}/image-map.png`,`${l.id}/decoration-map.png`],extra:[...extra]}); +} +for(const p of posts){if(p.markdown.length>100000)throw Error('正文超长 '+p.key);if(p.markdown.includes('/layout-reference/'))throw Error('正文仍有专用静态路径 '+p.key)} +if(dryRun){console.log(JSON.stringify({posts:posts.length,uniqueFiles:assetNames.size,uniqueHashes:new Set(Object.values(byFile).map(a=>a.hash)).size,maxText:Math.max(...posts.map(p=>p.markdown.length)),cover:'router-cover.png'}));process.exit(0)} +const tag=await api('/api/tags',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'高级感排版',slug:'premium-layout'})}); +for(const p of [...posts.slice(1),posts[0]]){ + const seen=new Set(),assets=[];for(const[files,role]of [[p.main,'content'],[p.extra,'caption']])for(const name of files){const id=state.assets[byFile[name].hash];if(!seen.has(id)){assets.push({id,role});seen.add(id)}} + const coverAssetId=state.assets[byFile[p.main[0]].hash]; + let existing=await api('/api/notes/'+p.publicId); + if(existing){if(existing.entry.postSlug!==p.slug)throw Error('ID 已被其他内容占用:'+p.publicId);const e=existing.entry;const same=e.title===p.title&&e.description===p.description&&e.editableMarkdown===p.markdown&&e.coverAssetId===coverAssetId&&JSON.stringify(e.assets.map(a=>({id:a.id,role:a.role})))===JSON.stringify(assets)&&e.categories.includes(tag.name);if(!same)existing=await api('/api/notes/'+p.publicId,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({title:p.title,description:p.description,markdown:p.markdown,tags:[tag.id],revision:e.revision,assets,coverAssetId})});} + else await api('/api/posts',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({kind:'article',title:p.title,publicId:p.publicId,slug:p.slug,description:p.description,text:p.markdown,tags:[tag.id],coverAssetId,assets})}); + state.posts[p.key]={publicId:p.publicId,slug:p.slug,coverAssetId,assets:assets.length};await save();console.log('Published '+p.key+' /explore/'+p.publicId); +} +console.log(`Published ${posts.length} ordinary Wiki posts using text and image APIs only.`); diff --git a/apps/wiki/scripts/recognize-layout-text.swift b/scripts/recognize-layout-text.swift similarity index 100% rename from apps/wiki/scripts/recognize-layout-text.swift rename to scripts/recognize-layout-text.swift diff --git a/apps/wiki/scripts/segment-layout-reference.ts b/scripts/segment-layout-reference.ts similarity index 89% rename from apps/wiki/scripts/segment-layout-reference.ts rename to scripts/segment-layout-reference.ts index 49d6e0f..4a596b8 100644 --- a/apps/wiki/scripts/segment-layout-reference.ts +++ b/scripts/segment-layout-reference.ts @@ -3,10 +3,10 @@ import sharp from 'sharp'; import {readFile,writeFile,mkdir,rm} from 'node:fs/promises'; import path from 'node:path'; import {createHash} from 'node:crypto'; -import annotations from '../src/content/layouts/reference/annotations.json'; -import {textMergeTarget,unionBoxes} from '../src/content/layouts/reference/group-text'; -import ocr from '../src/content/layouts/reference/ocr-evidence.json'; -const root=path.resolve(import.meta.dirname,'..'),target=path.join(root,'public/layout-reference'); +import annotations from '../contentasset:annotations.json'; +import {textMergeTarget,unionBoxes} from '../contentasset:group-text'; +import ocr from '../contentasset:ocr-evidence.json'; +const root=path.resolve(import.meta.dirname,'..'),target=path.join(root,'contentasset:assets'); type Box=[number,number,number,number]; type Element={id:string;kind:'text'|'image'|'decoration';role:string;box:Box;text:string|null;direction:string;reading:'verified'|'unreadable'|'not-text';asset:string;mask?:string;underlay?:string;pixels:number}; function components(mask:Uint8Array,w:number,h:number){ @@ -83,7 +83,7 @@ async function main(){ for(const[n,e]of elements.entries()){ const[x,y,bw,bh]=e.box,rgba=Buffer.alloc(bw*bh*4),binary=new Uint8Array(bw*bh); for(let yy=y;yysum+rgb[c],0)/samples.length):245;underlay[j+3]=255;underlay.copy(background,i*4,j,j+4); } - e.underlay=`/layout-reference/${id}/${e.id}-underlay.png`; + e.underlay=`asset:${id}/${e.id}-underlay.png`; await sharp(underlay,{raw:{width:bw,height:bh,channels:4}}).png().toFile(path.join(dir,e.id+'-underlay.png')); } if(e.kind==='image'){ const outside=new Uint8Array(binary.length),q:number[]=[];for(let i=0;i=bw*(bh-1)||i%bw===0||i%bw===bw-1)){q.push(i);outside[i]=1} for(let c=0;c=0&&je.pixels>0),colors={text:'#2c64d8',image:'#e66d22',decoration:'#08875d'}; const overlay=`${kept.map(e=>{const[x,y,bw,bh]=e.box;return `${e.id}`}).join('')}`; await sharp(crop,{raw:{width:w,height:h,channels:3}}).resize(w*6,h*6,{kernel:'nearest'}).composite([{input:Buffer.from(overlay)}]).png().toFile(path.join(dir,'annotated.png')); - const manifest={id,name:spec.name,source:{url:'/layout-reference/source.png',sha256:createHash('sha256').update(source).digest('hex'),box:[p.x,p.y,w,h],row:p.row,column:p.column},width:w,height:h,reference:`/layout-reference/${id}/source.png`,annotated:`/layout-reference/${id}/annotated.png`,background:`/layout-reference/${id}/background.png`,elements:kept,ocr:ocr.find(r=>r.file===id+'.png')?.lines||[],verification:{pixelIdentical:true,pixels:w*h,unreadableText:kept.filter(e=>e.reading==='unreadable').length}}; + const manifest={id,name:spec.name,source:{url:'asset:source.png',sha256:createHash('sha256').update(source).digest('hex'),box:[p.x,p.y,w,h],row:p.row,column:p.column},width:w,height:h,reference:`asset:${id}/source.png`,annotated:`asset:${id}/annotated.png`,background:`asset:${id}/background.png`,elements:kept,ocr:ocr.find(r=>r.file===id+'.png')?.lines||[],verification:{pixelIdentical:true,pixels:w*h,unreadableText:kept.filter(e=>e.reading==='unreadable').length}}; await writeFile(path.join(dir,'manifest.json'),JSON.stringify(manifest,null,2)+'\n');manifests.push(manifest);totalPixels+=w*h; } const overlay=`${manifests.map(m=>{const[x,y,w,h]=m.source.box;return `${m.id}`}).join('')}`; await sharp(source).composite([{input:Buffer.from(overlay)}]).png().toFile(path.join(target,'numbered-source.png')); - await writeFile(path.join(root,'src/content/layouts/reference/manifest.json'),JSON.stringify(manifests,null,2)+'\n'); - await writeFile(path.join(target,'index.json'),JSON.stringify({version:2,sourceSha256:manifests[0].source.sha256,numbering:'row-major; exclude left title banner',layouts:manifests.map(m=>({id:m.id,name:m.name,source:m.source,manifest:`/layout-reference/${m.id}/manifest.json`}))},null,2)+'\n'); + await writeFile(path.join(root,'contentasset:manifest.json'),JSON.stringify(manifests,null,2)+'\n'); + await writeFile(path.join(target,'index.json'),JSON.stringify({version:2,sourceSha256:manifests[0].source.sha256,numbering:'row-major; exclude left title banner',layouts:manifests.map(m=>({id:m.id,name:m.name,source:m.source,manifest:`asset:${m.id}/manifest.json`}))},null,2)+'\n'); console.log(`Detected ${panels.length} panels; ${manifests.reduce((n,m)=>n+m.elements.length,0)} typed components; ${totalPixels} pixels reconstructed exactly.`); } main().catch(e=>{console.error(e);process.exitCode=1});