{"_id":"@aikkk/ticket-designer","_rev":"6-37c4dff5b6e0676915e704ae465149e8","name":"@aikkk/ticket-designer","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@aikkk/ticket-designer","version":"0.1.0","license":"MIT","_id":"@aikkk/ticket-designer@0.1.0","maintainers":[{"name":"aikkk","email":"448424147@qq.com"}],"homepage":"https://github.com/CluadWong/TicketDesigner","bugs":{"url":"https://github.com/CluadWong/TicketDesigner/issues"},"dist":{"shasum":"18c6e406d55f2ccf269e2ddff9ae3491619820a6","tarball":"https://registry.npmjs.org/@aikkk/ticket-designer/-/ticket-designer-0.1.0.tgz","fileCount":120,"integrity":"sha512-Wkl2Xd/wXYo4ZSNKgT3kUO4wFxooWPO+dRcs1h/eg89m8MKjB+5JG80Jc+VoiFVRoehvIOiLwvQFkQYeBUpu0Q==","signatures":[{"sig":"MEUCIEBK72pC7koEmxbJGce6plP4WlWcpgUAtAnE1wnN90QoAiEA02nSuLjEwLV4Z/8HuUpKRdet5gDV+FWrL/k9d2qOmjI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382024},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./designer":{"types":"./dist/designer.d.ts","import":"./dist/designer.js"},"./renderer":{"types":"./dist/renderer.d.ts","import":"./dist/renderer.js"},"./style.css":"./dist/renderer-core.css","./designer/style.css":"./dist/designer-ui.css","./renderer/style.css":"./dist/renderer-core.css"},"gitHead":"dbb1182d19170ac387a899c05169dd3165a777da","private":false,"scripts":{"dev":"vite","test":"vitest run","build":"vue-tsc --noEmit && vite build","preview":"vite preview","build:lib":"vite build --config vite.lib.config.ts","pack:check":"npm run build:lib && npm run build:types && npm pack --dry-run","test:watch":"vitest","build:types":"vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly --outDir dist && node scripts/fix-dts-alias.mjs"},"_npmUser":{"name":"aikkk","email":"448424147@qq.com"},"deprecated":"Renamed to @cluadwong/form-designer. Install with: npm i @cluadwong/form-designer","repository":{"url":"git+https://github.com/CluadWong/TicketDesigner.git","type":"git"},"_npmVersion":"10.8.2","description":"固定布局表单设计器与渲染组件（Schema V2）：可视化编排版式 → 导出 Schema JSON → 渲染 / 填写 / 打印","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.19.3","dependencies":{"dompurify":"^3.4.14","@panzoom/panzoom":"^4.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^5.4.0","jsdom":"^24.0.0","vitest":"^1.6.0","vue-tsc":"^2.1.0","typescript":"^5.5.0","@vue/test-utils":"^2.4.0","@vitejs/plugin-vue":"^5.1.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-designer_0.1.0_1788937094841_0.5437850668840585","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aikkk/ticket-designer","version":"0.1.1","license":"MIT","_id":"@aikkk/ticket-designer@0.1.1","maintainers":[{"name":"aikkk","email":"448424147@qq.com"}],"homepage":"https://github.com/CluadWong/TicketDesigner","bugs":{"url":"https://github.com/CluadWong/TicketDesigner/issues"},"dist":{"shasum":"4ee34bfa72c82417cb301c792646e3ac6a6bb411","tarball":"https://registry.npmjs.org/@aikkk/ticket-designer/-/ticket-designer-0.1.1.tgz","fileCount":120,"integrity":"sha512-EZvrWI5AaT2XhggQAgM8EHZrEdjb/NfV5fO3bnRoljSDm3p9qizp5Cv7mUFL/JuOROgROKlxV3O7UiywPOqsFQ==","signatures":[{"sig":"MEQCIEOJ55JZV711P9JYFfnVm5gsP0KnZCA9y9Oy9u13oBXOAiA2EzqTlGK5fVcb3ruRGTyEjjHzJyzVoBWHPAfS/Xl0ww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384285},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./designer":{"types":"./dist/designer.d.ts","import":"./dist/designer.js"},"./renderer":{"types":"./dist/renderer.d.ts","import":"./dist/renderer.js"},"./style.css":"./dist/renderer-core.css","./designer/style.css":"./dist/designer-ui.css","./renderer/style.css":"./dist/renderer-core.css"},"gitHead":"368938a931279d11b52b86091457f5ef6d75f9c8","private":false,"scripts":{"dev":"vite","test":"vitest run","build":"vue-tsc --noEmit && vite build","preview":"vite preview","promote":"bash scripts/promote-to-release.sh","release":"bash scripts/release.sh","build:lib":"vite build --config vite.lib.config.ts","pack:check":"npm run build:lib && npm run build:types && npm pack --dry-run","test:watch":"vitest","build:types":"vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly --outDir dist && node scripts/fix-dts-alias.mjs"},"_npmUser":{"name":"aikkk","email":"448424147@qq.com"},"deprecated":"Renamed to @cluadwong/form-designer. Install with: npm i @cluadwong/form-designer","repository":{"url":"git+https://github.com/CluadWong/TicketDesigner.git","type":"git"},"_npmVersion":"10.8.2","description":"固定布局表单设计器与渲染组件（Schema V2）：可视化编排版式 → 导出 Schema JSON → 渲染 / 填写 / 打印","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.19.3","dependencies":{"dompurify":"^3.4.14","@panzoom/panzoom":"^4.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^5.4.0","jsdom":"^24.0.0","vitest":"^1.6.0","vue-tsc":"^2.1.0","typescript":"^5.5.0","@vue/test-utils":"^2.4.0","@vitejs/plugin-vue":"^5.1.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-designer_0.1.1_1789002226137_0.2355501671352076","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aikkk/ticket-designer","version":"0.1.2","license":"MIT","_id":"@aikkk/ticket-designer@0.1.2","maintainers":[{"name":"aikkk","email":"448424147@qq.com"}],"homepage":"https://github.com/CluadWong/TicketDesigner","bugs":{"url":"https://github.com/CluadWong/TicketDesigner/issues"},"dist":{"shasum":"61ade2c64d501632f6d7982cac0d0d96b3168467","tarball":"https://registry.npmjs.org/@aikkk/ticket-designer/-/ticket-designer-0.1.2.tgz","fileCount":120,"integrity":"sha512-SUPy4jE7EUUAOZw7uJByppzbeLap0CN0buB1EU+2PwOu0ZrDQj+y6pXbgCih7PXKTAlWLR3rea1BIULZrztGEA==","signatures":[{"sig":"MEUCIQCXAjdJq8pQw9Mpf8jlan4hyE43YCVa+jsGzZqtqInt/wIgDdXJczglCyL0l9aMHzG89O+NJwAJIrZwqHBcWwfhIEc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":384276},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./designer":{"types":"./dist/designer.d.ts","import":"./dist/designer.js"},"./renderer":{"types":"./dist/renderer.d.ts","import":"./dist/renderer.js"},"./style.css":"./dist/renderer-core.css","./designer/style.css":"./dist/designer-ui.css","./renderer/style.css":"./dist/renderer-core.css"},"gitHead":"a89a726fa08abe68fda16fea07d79f6963ce326f","private":false,"scripts":{"dev":"vite","test":"vitest run","build":"vue-tsc --noEmit && vite build","preview":"vite preview","promote":"bash scripts/promote-to-release.sh","release":"bash scripts/release.sh","build:lib":"vite build --config vite.lib.config.ts","pack:check":"npm run build:lib && npm run build:types && npm pack --dry-run","test:watch":"vitest","build:types":"vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly --outDir dist && node scripts/fix-dts-alias.mjs"},"_npmUser":{"name":"aikkk","email":"448424147@qq.com"},"deprecated":"Renamed to @cluadwong/form-designer. Install with: npm i @cluadwong/form-designer","repository":{"url":"git+https://github.com/CluadWong/TicketDesigner.git","type":"git"},"_npmVersion":"10.8.2","description":"固定布局表单设计器与渲染组件（Schema V2）：可视化编排版式 → 导出 Schema JSON → 渲染 / 填写 / 打印","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"20.19.3","dependencies":{"dompurify":"^3.4.14","@panzoom/panzoom":"^4.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^5.4.0","jsdom":"^24.0.0","vitest":"^1.6.0","vue-tsc":"^2.1.0","typescript":"^5.5.0","@vue/test-utils":"^2.4.0","@vitejs/plugin-vue":"^5.1.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-designer_0.1.2_1789008819646_0.03237051499462762","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aikkk/ticket-designer","version":"0.1.4","license":"MIT","_id":"@aikkk/ticket-designer@0.1.4","maintainers":[{"name":"aikkk","email":"448424147@qq.com"}],"homepage":"https://github.com/CluadWong/TicketDesigner","bugs":{"url":"https://github.com/CluadWong/TicketDesigner/issues"},"dist":{"shasum":"cdc9600b2b3d366242d5fb6650cc748f90845ef9","tarball":"https://registry.npmjs.org/@aikkk/ticket-designer/-/ticket-designer-0.1.4.tgz","fileCount":121,"integrity":"sha512-nQGwLe8cgeoGTjQOt/uEQJoPN0Kc67XKDvGPLp2hA0NVM+jjhbLSpkM76sR7WpERZekTGN/Zcavdn1ppPO9ZlQ==","signatures":[{"sig":"MEUCIQCwnGPppXj/AosaQxrF3Vza6aUo9tmdiXjNP/XeSd5RDgIgNc7qa4Hub3zV9vtT2UzEkm1CY+6nhQaqpWltmaFS0Xo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":409468},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./designer":{"types":"./dist/designer.d.ts","import":"./dist/designer.js"},"./renderer":{"types":"./dist/renderer.d.ts","import":"./dist/renderer.js"},"./style.css":"./dist/ticket-designer.css","./designer/style.css":"./dist/designer-ui.css","./renderer/style.css":"./dist/renderer-core.css"},"gitHead":"f61f9fccf59cce16b12d1021707b47558aa0f2e6","private":false,"scripts":{"dev":"vite","test":"vitest run","build":"vue-tsc --noEmit && vite build","preview":"vite preview","promote":"bash scripts/promote-to-release.sh","release":"bash scripts/release.sh","build:lib":"vite build --config vite.lib.config.ts","pack:check":"npm run build:lib && npm run build:types && npm pack --dry-run","test:watch":"vitest","build:types":"vue-tsc -p tsconfig.lib.json --declaration --emitDeclarationOnly --outDir dist && node scripts/fix-dts-alias.mjs"},"_npmUser":{"name":"aikkk","email":"448424147@qq.com"},"deprecated":"Renamed to @cluadwong/form-designer. Install with: npm i @cluadwong/form-designer","repository":{"url":"git+https://github.com/CluadWong/TicketDesigner.git","type":"git"},"_npmVersion":"10.9.7","description":"固定布局表单设计器与渲染组件（Schema V2）：可视化编排版式 → 导出 Schema JSON → 渲染 / 填写 / 打印","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.22.2","dependencies":{"dompurify":"^3.4.14","@panzoom/panzoom":"^4.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.0","vite":"^5.4.0","jsdom":"^24.0.0","vitest":"^1.6.0","vue-tsc":"^2.1.0","typescript":"^5.5.0","@vue/test-utils":"^2.4.0","@vitejs/plugin-vue":"^5.1.0"},"peerDependencies":{"vue":"^3.5.0"},"_npmOperationalInternal":{"tmp":"tmp/ticket-designer_0.1.4_1789012027467_0.5546931209379153","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-09-09T06:58:14.684Z","modified":"2026-09-14T06:39:03.228Z","0.1.0":"2026-09-09T06:58:14.951Z","0.1.1":"2026-09-10T01:03:46.278Z","0.1.2":"2026-09-10T02:53:39.819Z","0.1.4":"2026-09-10T03:47:07.660Z"},"bugs":{"url":"https://github.com/CluadWong/TicketDesigner/issues"},"license":"MIT","homepage":"https://github.com/CluadWong/TicketDesigner","repository":{"url":"git+https://github.com/CluadWong/TicketDesigner.git","type":"git"},"description":"固定布局表单设计器与渲染组件（Schema V2）：可视化编排版式 → 导出 Schema JSON → 渲染 / 填写 / 打印","maintainers":[{"name":"aikkk","email":"448424147@qq.com"}],"readme":"# @aikkk/ticket-designer\n\n> 固定布局表单设计器：可视化编排版式 → 导出 Schema JSON → 由渲染组件消费并填充/打印。\n\n[![npm version](https://img.shields.io/npm/v/@aikkk/ticket-designer)](https://www.npmjs.com/package/@aikkk/ticket-designer)\n[![license](https://img.shields.io/npm/l/@aikkk/ticket-designer)](./LICENSE)\n\n技术栈 Vue 3.5 + TypeScript + Vite + Vitest，无后端依赖。\n\n## 它解决什么\n\n纸质作业票、工作票、登记表这类表单的共同点是**版式固定、要精确打印**。传统表单引擎按流式布局渲染，对不齐格子、打不出边框。\n本项目的 Schema V2 用「页面 → 格子(Grid) → 行 → 单元格 → 组件」的固定坐标模型描述版式，渲染结果与打印结果同源同口径。\n\n## 特性\n\n- **设计器**：左侧组件栏拖拽到画布、结构树层级选择、右侧属性面板、撤销/重做、自动分页预览、一键打印\n- **节点类型**：Page / Grid（格子）/ Row / Cell / P（字段）/ Text（固定文本）/ Table / HTML / Image\n- **渲染内核**：设计、预览、填写、打印共用同一渲染路径（由 `RenderPathIsomorphism` 测试锁死逐字符一致）\n- **自动分页**：`src/engine-v2/pagination.ts` 纯函数分页，DOM 无关、确定性，按 Grid 行边界与 Table 数据行切分\n- **字段级权限与校验**：`fieldPermissions`（READ/EDIT/HIDDEN）与 `rules`（必填）与数据同轨注入，不进 Schema\n- **纸张与打印**：A4/A3 尺寸驱动方向，`@page` 由渲染内核运行时注入\n- **完整类型声明**：Schema V2 类型、渲染期领域逻辑（分页 / 派生）随包导出\n\n## 安装\n\n```bash\nnpm i @aikkk/ticket-designer\n# 或\npnpm add @aikkk/ticket-designer\n```\n\n`vue` 是 peerDependency（`^3.5.0`），宿主需自备；同仓多实例时务必 `resolve.dedupe: ['vue']`（见下方注意事项）。\n\n## 快速开始\n\n消费端（渲染 / 填写 / 打印）只需 `renderer` 入口，最小示例：\n\n```vue\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { FormRenderer, printForm } from '@aikkk/ticket-designer/renderer'\nimport type { FormSchemaV2, FormDataV2 } from '@aikkk/ticket-designer/renderer'\n// 样式按入口分离，引入 renderer 对应的样式\nimport '@aikkk/ticket-designer/renderer/style.css'\n\n// 设计器导出的 Schema JSON（服务端存储后下发）\nconst schema = ref<FormSchemaV2>(/* ... */)\nconst data = ref<FormDataV2>({})\n</script>\n\n<template>\n  <FormRenderer :schema=\"schema\" v-model:data=\"data\" />\n  <button @click=\"printForm()\">打印</button>\n</template>\n```\n\n需要在宿主内编排模板时，改用 `designer` 入口：\n\n```ts\nimport { FormDesigner, buildBlankSchema } from '@aikkk/ticket-designer/designer'\nimport '@aikkk/ticket-designer/designer/style.css'\n```\n\n## 用法\n\n两个按需入口，按消费场景选择：\n\n| 入口 | 内容 | 谁用 |\n|---|---|---|\n| `@aikkk/ticket-designer/renderer` | `FormRenderer` / `GridFormRenderer` / `printForm` / `collectFieldValues` / Schema 类型 | 消费端：渲染、填写、打印 |\n| `@aikkk/ticket-designer/designer` | `FormDesigner` / `defaultDesignerUIConfig` / `buildBlankSchema` | 需要在宿主内编排模板时 |\n\n数据流：\n\n```\n设计器编排 → 导出 Schema JSON →（外部服务存储）→ 消费页引用 FormRenderer + schema + data → 渲染 / 填写 / 打印\n```\n\nSchema 只描述版式，不携带数据；数据（含字段权限、校验规则）在渲染时通过 props 注入。\n\n## 注意事项\n\n- **vue 唯一实例**：`vue` 是 peerDependency，宿主必须 `resolve.dedupe: ['vue']`，否则会打进第二份 Vue，响应式 / provide-inject / 组件解析全断。\n- **样式别引错**：样式按入口分离（`renderer/style.css` / `designer/style.css`），只引 renderer 的宿主不要引 designer 样式，避免污染全局。\n- **Schema 不含数据**：字段权限、校验规则与数据同轨在渲染时注入，不进 Schema，存储态 schema 可放心复用。\n- `FormRenderer` 的 `options` 支持 `bare / zoom / fitOnMount / readonly` 等渲染形态，详见 [docs/engine.md](./docs/engine.md)。\n\n## 架构与目录\n\n```\nsrc/\n├── types/                # Schema V2 类型定义、序列化、校验、结构操作\n├── engine-v2/            # 渲染期领域逻辑：分页引擎、派生计算、节点地址\n├── components/\n│   ├── renderer-v2/      # 渲染内核：GridFormRenderer / FormRenderer / GridSchemaNode / HtmlBlock / PaperViewport\n│   └── designer/         # 设计器：FormDesigner 编排层 + CanvasSurface 表面层 + composables + inspectors\n├── preview/              # 预览/填写演示页\n├── dev/                  # 示例数据与测试夹具（被测试与演示页引用）\n├── utils/ styles/ samples/ test-utils/\ndocs/                     # 设计契约文档（索引见 docs/README.md）\n```\n\n**分层约定**：渲染内核不认识\"选中/拖拽/落点\"，这些交互设计态相关的内容一律在表面层 `CanvasSurface.vue` 完成；\n设计器与消费页都通过 `FormRenderer` 渲染，内核保持可独立消费。\n\n## 文档\n\n| 文档 | 内容 |\n|---|---|\n| [docs/README.md](./docs/README.md) | 文档索引 |\n| [docs/design.md](./docs/design.md) | Schema 结构与节点模型设计契约 |\n| [docs/design-biz.md](./docs/design-biz.md) | 业务与交互设计 |\n| [docs/engine.md](./docs/engine.md) | 渲染引擎契约（索引/校验/渲染/尺寸/边框/打印） |\n| [docs/user-guide.md](./docs/user-guide.md) | 用户操作指南（与应用内「帮助」同源） |\n\n## 本地开发\n\n```bash\nnpm install\nnpm run dev        # 启动设计器（默认 http://localhost:5173）\nnpm test           # vitest run\nnpm run build      # vue-tsc --noEmit && vite build\nnpm run preview    # 预览构建产物\n```\n\n演示页：`preview.html`（最简消费页演示：schema → 渲染，验证渲染内核可脱离设计器独立运行）。\n\n### 验证基线\n\n- `npx vitest run`：**365 passed（46 文件）**\n- `npx vue-tsc --noEmit`：无错误\n\n### 分支\n\n- `release`：对外发布分支，发布到公共 npmjs（`@aikkk/ticket-designer`），只保留源码、测试与对外文档。一键发布脚本 `npm run release` 在此分支运行。\n- `main`：GitHub 默认分支，**已设分支保护（Require a pull request before merging），禁止直推**。`release` 发布后由脚本自动开 PR(`release → main`) 并请求自动合并；无 `gh` CLI 时打印手动建 PR 链接。\n- `dev`：内部开发分支（源码同样托管在 GitHub）。`npm run promote` 后再执行 `npm run release` 完成发版。\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}