openyida 2026.9.21 → 2026.9.22-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +14 -20
  2. package/bin/yida.js +6 -11
  3. package/lib/app/app-list.js +3 -7
  4. package/lib/app/canvas-compile.js +12 -22
  5. package/lib/app/check-prd-completeness.js +0 -7
  6. package/lib/app/create-app.js +1 -4
  7. package/lib/app/create-form/args.js +12 -37
  8. package/lib/app/create-form/batch.js +11 -86
  9. package/lib/app/create-form.js +86 -193
  10. package/lib/app/create-page.js +17 -84
  11. package/lib/app/custom-theme.js +0 -11
  12. package/lib/app/form-field-validator.js +41 -26
  13. package/lib/app/form-open-guard.js +10 -97
  14. package/lib/app/get-form-config.js +0 -1
  15. package/lib/app/inline-css-guard.js +31 -1
  16. package/lib/app/services/form-compiler.js +4 -2
  17. package/lib/app/theme-from-design.js +41 -144
  18. package/lib/app/theme-presets.js +1 -1
  19. package/lib/app/update-app.js +13 -63
  20. package/lib/asset/ai-image.js +9 -59
  21. package/lib/asset/asset-cmd.js +7 -18
  22. package/lib/asset/asset-plan.js +9 -102
  23. package/lib/asset/asset-resolve.js +10 -55
  24. package/lib/asset/asset-status.js +4 -5
  25. package/lib/asset/host-capabilities.js +2 -11
  26. package/lib/asset/url-verify.js +4 -19
  27. package/lib/auth/dws-sync.js +148 -0
  28. package/lib/auth/token-auth.js +73 -9
  29. package/lib/auth/token-store.js +50 -0
  30. package/lib/connector/connector-test.js +5 -19
  31. package/lib/connector/contract.js +1 -3
  32. package/lib/core/agent-capabilities.js +16 -19
  33. package/lib/core/command-manifest.js +40 -329
  34. package/lib/core/locales/en.js +17 -74
  35. package/lib/core/locales/zh.js +16 -73
  36. package/lib/core/redact.js +10 -15
  37. package/lib/core/sample.js +30 -72
  38. package/lib/core/utils.js +4 -0
  39. package/lib/design-plan/design-plan.js +4 -51
  40. package/lib/design-plan/init.js +26 -121
  41. package/lib/design-plan/materialize.js +348 -451
  42. package/lib/design-plan/normalize.js +29 -74
  43. package/lib/design-plan/parallel.js +16 -71
  44. package/lib/design-plan/patch.js +16 -63
  45. package/lib/design-plan/preview.js +8 -6
  46. package/lib/design-plan/validate.js +11 -71
  47. package/lib/process/create-process.js +50 -84
  48. package/lib/samples/openyida-scaffold/canvas-form-drawer.canvas.jsx +90 -20
  49. package/lib/samples/openyida-scaffold/canvas-nav/content.jsx +13 -93
  50. package/lib/samples/openyida-scaffold/canvas-nav/data.jsx +18 -100
  51. package/lib/samples/openyida-scaffold/canvas-nav/mixed.jsx +4 -6
  52. package/lib/samples/openyida-scaffold/canvas-nav/shared.jsx +5 -5
  53. package/lib/samples/openyida-scaffold/canvas-nav/side.jsx +2 -1
  54. package/lib/samples/openyida-scaffold/canvas-nav/sidebar.jsx +1 -1
  55. package/lib/samples/openyida-scaffold/canvas-nav/top.jsx +9 -15
  56. package/lib/samples/yida-canvas-table-form/table-form-batch-submit.canvas.jsx +83 -9
  57. package/lib/samples/yida-rechart/trend-combo.canvas.jsx +87 -14
  58. package/package.json +1 -3
  59. package/scripts/postinstall.js +3 -3
  60. package/yida-skills/SKILL.md +16 -19
  61. package/yida-skills/references/official-example-schema-patterns.md +1 -1
  62. package/yida-skills/references/yida-api.md +0 -4
  63. package/yida-skills/skills/yida-app/SKILL.md +23 -46
  64. package/yida-skills/skills/yida-app/workflow/parallel-work.md +6 -15
  65. package/yida-skills/skills/yida-app/workflow/plan/step-1-understand.md +1 -1
  66. package/yida-skills/skills/yida-app/workflow/plan/step-2-confirm.md +1 -1
  67. package/yida-skills/skills/yida-app/workflow/plan/step-4-deliver.md +15 -29
  68. package/yida-skills/skills/yida-app/workflow/plan/workflow.md +11 -29
  69. package/yida-skills/skills/yida-app/workflow/step-1-resource-context.md +2 -4
  70. package/yida-skills/skills/yida-app/workflow/step-2-design.md +9 -23
  71. package/yida-skills/skills/yida-app/workflow/step-3-create-or-reuse-app.md +4 -6
  72. package/yida-skills/skills/yida-app/workflow/step-4-forms-processes.md +4 -15
  73. package/yida-skills/skills/yida-app/workflow/step-6-main-page.md +4 -6
  74. package/yida-skills/skills/yida-app/workflow/step-7-page-code.md +9 -15
  75. package/yida-skills/skills/yida-app/workflow/step-8-publish-navigation.md +11 -25
  76. package/yida-skills/skills/yida-app/workflow/step-9-output-finish.md +28 -68
  77. package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +43 -42
  78. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-style-implementation-guide.md +44 -60
  79. package/yida-skills/skills/yida-canvas-custom-page/references/canvas-theme-provider.md +50 -72
  80. package/yida-skills/skills/yida-canvas-custom-page/references/component-library-guide.md +1 -13
  81. package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +1 -140
  82. package/yida-skills/skills/yida-canvas-custom-page/references/navigation-and-entry-guide.md +72 -101
  83. package/yida-skills/skills/yida-canvas-custom-page/references/page-generation-guide.md +32 -35
  84. package/yida-skills/skills/yida-canvas-custom-page/scripts/build-canvas-theme.js +3 -29
  85. package/yida-skills/skills/yida-canvas-custom-page/scripts/canvas-theme-provider.template.jsx +6 -69
  86. package/yida-skills/skills/yida-canvas-data-binding/SKILL.md +0 -26
  87. package/yida-skills/skills/yida-create-app/SKILL.md +0 -2
  88. package/yida-skills/skills/yida-create-form-page/SKILL.md +58 -72
  89. package/yida-skills/skills/yida-create-form-page/references/advanced-form-modes.md +5 -5
  90. package/yida-skills/skills/yida-create-form-page/references/association-form-field.md +4 -4
  91. package/yida-skills/skills/yida-create-form-page/references/batch-forms.md +5 -6
  92. package/yida-skills/skills/yida-create-form-page/references/field-definition-guide.md +19 -7
  93. package/yida-skills/skills/yida-create-form-page/references/form-field-properties.md +44 -62
  94. package/yida-skills/skills/yida-create-page/SKILL.md +6 -14
  95. package/yida-skills/skills/yida-create-process/SKILL.md +2 -13
  96. package/yida-skills/skills/yida-custom-page/SKILL.md +0 -2
  97. package/yida-skills/skills/yida-custom-page/references/design-system.md +1 -1
  98. package/yida-skills/skills/yida-dashboard/SKILL.md +4 -5
  99. package/yida-skills/skills/yida-data-management/SKILL.md +2 -4
  100. package/yida-skills/skills/yida-data-management/references/data-format-guide.md +4 -4
  101. package/yida-skills/skills/yida-design/SKILL.md +14 -29
  102. package/yida-skills/skills/yida-design/references/app/blueprint.md +70 -0
  103. package/yida-skills/skills/yida-design/references/app/navigation-patterns.md +43 -0
  104. package/yida-skills/skills/yida-design/references/app/role-journey.md +30 -0
  105. package/yida-skills/skills/yida-design/references/ask-human-interaction-contract.md +42 -67
  106. package/yida-skills/skills/yida-design/references/asset-workflow.md +2 -6
  107. package/yida-skills/skills/yida-design/references/design-mode.md +4 -4
  108. package/yida-skills/skills/yida-design/references/page-quality-gates.md +38 -26
  109. package/yida-skills/skills/yida-design/references/style-design-selection.md +137 -0
  110. package/yida-skills/skills/yida-design/references/style-designs/_design-md-template.md +185 -0
  111. package/yida-skills/skills/yida-design/references/style-designs/aqua-service-progress-dashboard.md +242 -0
  112. package/yida-skills/skills/yida-design/references/style-designs/blue-insight-operations-dashboard.md +243 -0
  113. package/yida-skills/skills/yida-design/references/style-designs/blue-productivity-insight-workbench.md +242 -0
  114. package/yida-skills/skills/yida-design/references/style-designs/command-filter-card-console.md +304 -0
  115. package/yida-skills/skills/yida-design/references/style-designs/contrast-command-analytics-workbench.md +261 -0
  116. package/yida-skills/skills/yida-design/references/style-designs/dark-stage-analytic-dashboard.md +369 -0
  117. package/yida-skills/skills/yida-design/references/style-designs/filterable-card-catalog.md +354 -0
  118. package/yida-skills/skills/yida-design/references/style-designs/green-timeline-progress-workbench.md +250 -0
  119. package/yida-skills/skills/yida-design/references/style-designs/registry.md +117 -0
  120. package/yida-skills/skills/yida-design/references/style-designs/soft-analytic-workbench.md +348 -0
  121. package/yida-skills/skills/yida-design/references/style-designs/soft-blue-grid-analytic-dashboard.md +658 -0
  122. package/yida-skills/skills/yida-design/references/style-designs/soft-bordered-analytic-workbench.md +385 -0
  123. package/yida-skills/skills/yida-design/references/style-designs/soft-curated-filter-gallery.md +300 -0
  124. package/yida-skills/skills/yida-design/references/style-designs/soft-modular-analytic-workbench.md +404 -0
  125. package/yida-skills/skills/yida-design/references/style-designs/soft-progress-analytics-workbench.md +382 -0
  126. package/yida-skills/skills/yida-design/references/style-designs/soft-timeline-analytics-workbench.md +367 -0
  127. package/yida-skills/skills/yida-design/references/style-designs/teal-rail-analytics-workbench.md +341 -0
  128. package/yida-skills/skills/yida-design/references/theme/app-custom-theme-template.css +432 -350
  129. package/yida-skills/skills/yida-design/references/visual-decision-engine.md +143 -19
  130. package/yida-skills/skills/yida-design/references/visual-scaffold-recipes.md +27 -15
  131. package/yida-skills/skills/yida-design/sub_skill/page-design/SKILL.md +0 -4
  132. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/SKILL.md +8 -22
  133. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/README.md +10 -14
  134. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/assets/build-plan-template.html +4 -9
  135. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-compact-schema.md +27 -49
  136. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/build-plan-schema.md +154 -33
  137. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-design.md +127 -48
  138. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/references/visual-theme-selection.md +51 -37
  139. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/render_build_plan.py +48 -43
  140. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/scripts/validate_design_themes.py +190 -0
  141. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/README.md +98 -0
  142. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-media-grid.md +339 -0
  143. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-modular-clarity.md +348 -0
  144. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/airy-structured-clarity.md +344 -0
  145. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ambient-halo-layered.md +345 -0
  146. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-focus-layered.md +355 -0
  147. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/dark-luminous-modular.md +377 -0
  148. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/deep-stage-duotone.md +352 -0
  149. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/hairline-runway-clarity.md +389 -0
  150. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/high-contrast-modular.md +364 -0
  151. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/index.json +329 -0
  152. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/interlocked-vivid-modules.md +348 -0
  153. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/matrix-grid-focus.md +345 -0
  154. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/media-rail-inspector.md +379 -0
  155. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mist-layered-signal.md +347 -0
  156. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/modular-rail-signal.md +352 -0
  157. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/mono-grid-signal.md +386 -0
  158. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/ribbon-ledger-lift.md +384 -0
  159. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/segmented-meter-clarity.md +388 -0
  160. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/split-rail-precision.md +341 -0
  161. package/yida-skills/skills/yida-design/sub_skill/yida-design-plan/templates/design-themes/status-framed-media-grid.md +361 -0
  162. package/yida-skills/skills/yida-design/workflow/output-design.md +375 -117
  163. package/yida-skills/skills/yida-design/workflow/output-prd.md +185 -0
  164. package/yida-skills/skills/yida-design/workflow/step-1-read-brief.md +1 -1
  165. package/yida-skills/skills/yida-design/workflow/step-2-theme-system.md +29 -33
  166. package/yida-skills/skills/yida-design/workflow/step-4-wireframe-interaction.md +1 -3
  167. package/yida-skills/skills/yida-design/workflow/step-5-visual-states.md +106 -22
  168. package/yida-skills/skills/yida-design/workflow/step-6-handoff.md +22 -15
  169. package/yida-skills/skills/yida-form-permission/SKILL.md +0 -6
  170. package/yida-skills/skills/yida-image-assets/SKILL.md +50 -73
  171. package/yida-skills/skills/yida-image-assets/references/manifest-contract.md +52 -82
  172. package/yida-skills/skills/yida-image-assets/references/source-policy.md +15 -14
  173. package/yida-skills/skills/yida-integration/SKILL.md +0 -1
  174. package/yida-skills/skills/yida-login/SKILL.md +0 -2
  175. package/yida-skills/skills/yida-nav-group/SKILL.md +2 -4
  176. package/yida-skills/skills/yida-nav-shell/SKILL.md +12 -36
  177. package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +136 -79
  178. package/yida-skills/skills/yida-page-config/SKILL.md +4 -13
  179. package/yida-skills/skills/yida-prd/SKILL.md +3 -5
  180. package/yida-skills/skills/yida-prd/references/app/blueprint.md +4 -4
  181. package/yida-skills/skills/yida-prd/references/app/navigation-patterns.md +3 -6
  182. package/yida-skills/skills/yida-prd/references/app/role-journey.md +3 -5
  183. package/yida-skills/skills/yida-prd/references/plan-content.md +0 -4
  184. package/yida-skills/skills/yida-prd/workflow/output-prd.md +11 -18
  185. package/yida-skills/skills/yida-prd/workflow/plan-business.md +4 -4
  186. package/yida-skills/skills/yida-prd/workflow/step-2-information-architecture.md +8 -11
  187. package/yida-skills/skills/yida-publish-page/SKILL.md +1 -9
  188. package/yida-skills/skills/yida-requirement-analysis/SKILL.md +39 -10
  189. package/yida-skills/skills/yida-requirement-analysis/workflow/prepare-brief.md +71 -40
  190. package/yida-skills/skills-index.json +16 -36
  191. package/lib/app/application-entry-urls.js +0 -31
  192. package/lib/app/application-style.js +0 -69
  193. package/lib/app/canvas-icon-exports.json +0 -6160
  194. package/lib/app/canvas-icon-guard.js +0 -87
  195. package/lib/app/canvas-navigation-guard.js +0 -84
  196. package/lib/app/canvas-path-guard.js +0 -78
  197. package/lib/app/canvas-theme-guard.js +0 -184
  198. package/lib/app/form-data-response-guard.js +0 -57
  199. package/lib/asset/asset-execution.js +0 -79
  200. package/lib/core/css-structure.js +0 -37
  201. package/lib/design/check-design.js +0 -51
  202. package/lib/design/document.js +0 -458
  203. package/lib/design/icon-contrast.js +0 -85
  204. package/lib/design/page-content.js +0 -11
  205. package/lib/design-plan/artifact-updates.js +0 -117
  206. package/lib/design-plan/confirmation.js +0 -13
  207. package/lib/design-plan/entry-navigation.js +0 -97
  208. package/lib/design-plan/navigation-policy.js +0 -38
  209. package/lib/design-plan/rebase.js +0 -60
  210. package/lib/design-plan/themes.js +0 -101
  211. package/lib/design-plan/visual-policy.js +0 -42
  212. package/lib/samples/openyida-scaffold/canvas-admin-entry.jsx +0 -62
  213. package/lib/samples/openyida-scaffold/canvas-navigation.jsx +0 -56
  214. package/lib/samples/openyida-scaffold/canvas-view-state.jsx +0 -74
  215. package/yida-skills/skills/yida-app/references/entry-navigation.md +0 -193
  216. package/yida-skills/skills/yida-canvas-custom-page/references/view-state-recovery.md +0 -52
  217. package/yida-skills/skills/yida-canvas-data-binding/references/business-action-permissions.md +0 -31
  218. package/yida-skills/skills/yida-design/references/application-style-library.md +0 -93
  219. package/yida-skills/skills/yida-design/references/application-theme-consistency.md +0 -150
  220. package/yida-skills/skills/yida-design/references/native-form-styles.md +0 -208
  221. package/yida-skills/skills/yida-design/references/navigation-decision.md +0 -53
  222. package/yida-skills/skills/yida-design/references/page-continuity.md +0 -42
  223. package/yida-skills/skills/yida-design/references/theme/application-style-recipes.css +0 -58
  224. package/yida-skills/skills/yida-design/references/theme-selection.md +0 -67
  225. package/yida-skills/skills/yida-design/scripts/validate_design_themes.py +0 -302
  226. package/yida-skills/skills/yida-design/templates/application-styles.json +0 -398
  227. package/yida-skills/skills/yida-design/templates/design-themes/README.md +0 -73
  228. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/app_theme.css +0 -748
  229. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/design.md +0 -274
  230. package/yida-skills/skills/yida-design/templates/design-themes/app-amber/form-layout.json +0 -15
  231. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/app_theme.css +0 -748
  232. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/design.md +0 -274
  233. package/yida-skills/skills/yida-design/templates/design-themes/app-editorial/form-layout.json +0 -14
  234. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/app_theme.css +0 -748
  235. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/design.md +0 -274
  236. package/yida-skills/skills/yida-design/templates/design-themes/app-executive/form-layout.json +0 -13
  237. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/app_theme.css +0 -748
  238. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/design.md +0 -274
  239. package/yida-skills/skills/yida-design/templates/design-themes/app-finance/form-layout.json +0 -14
  240. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/app_theme.css +0 -748
  241. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/design.md +0 -274
  242. package/yida-skills/skills/yida-design/templates/design-themes/app-glass/form-layout.json +0 -14
  243. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/app_theme.css +0 -748
  244. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/design.md +0 -274
  245. package/yida-skills/skills/yida-design/templates/design-themes/app-graphite/form-layout.json +0 -14
  246. package/yida-skills/skills/yida-design/templates/design-themes/app-line/app_theme.css +0 -748
  247. package/yida-skills/skills/yida-design/templates/design-themes/app-line/design.md +0 -274
  248. package/yida-skills/skills/yida-design/templates/design-themes/app-line/form-layout.json +0 -13
  249. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/app_theme.css +0 -748
  250. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/design.md +0 -274
  251. package/yida-skills/skills/yida-design/templates/design-themes/app-neon/form-layout.json +0 -14
  252. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/app_theme.css +0 -754
  253. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/design.md +0 -279
  254. package/yida-skills/skills/yida-design/templates/design-themes/app-nordic/form-layout.json +0 -13
  255. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/app_theme.css +0 -748
  256. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/design.md +0 -274
  257. package/yida-skills/skills/yida-design/templates/design-themes/app-paper/form-layout.json +0 -13
  258. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/app_theme.css +0 -748
  259. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/design.md +0 -274
  260. package/yida-skills/skills/yida-design/templates/design-themes/app-platinum/form-layout.json +0 -14
  261. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/app_theme.css +0 -748
  262. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/design.md +0 -274
  263. package/yida-skills/skills/yida-design/templates/design-themes/app-plum/form-layout.json +0 -14
  264. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/app_theme.css +0 -758
  265. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/design.md +0 -281
  266. package/yida-skills/skills/yida-design/templates/design-themes/app-pop/form-layout.json +0 -14
  267. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/app_theme.css +0 -748
  268. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/design.md +0 -274
  269. package/yida-skills/skills/yida-design/templates/design-themes/app-sage/form-layout.json +0 -14
  270. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/app_theme.css +0 -748
  271. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/design.md +0 -274
  272. package/yida-skills/skills/yida-design/templates/design-themes/app-teal/form-layout.json +0 -14
  273. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/app_theme.css +0 -754
  274. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/design.md +0 -279
  275. package/yida-skills/skills/yida-design/templates/design-themes/app-terminal/form-layout.json +0 -14
  276. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/app_theme.css +0 -752
  277. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/design.md +0 -278
  278. package/yida-skills/skills/yida-design/templates/design-themes/app-ticket/form-layout.json +0 -13
  279. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/app_theme.css +0 -748
  280. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/design.md +0 -274
  281. package/yida-skills/skills/yida-design/templates/design-themes/app-wire/form-layout.json +0 -14
  282. package/yida-skills/skills/yida-design/templates/design-themes/basic-tokens.json +0 -118
  283. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/app_theme.css +0 -690
  284. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/design.md +0 -382
  285. package/yida-skills/skills/yida-design/templates/design-themes/dark-inset-hairline/form-layout.json +0 -13
  286. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/app_theme.css +0 -691
  287. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/design.md +0 -380
  288. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-fine-lines/form-layout.json +0 -13
  289. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/app_theme.css +0 -696
  290. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/design.md +0 -378
  291. package/yida-skills/skills/yida-design/templates/design-themes/dark-rail-signal-panels/form-layout.json +0 -13
  292. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/app_theme.css +0 -689
  293. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/design.md +0 -238
  294. package/yida-skills/skills/yida-design/templates/design-themes/free-creative/form-layout.json +0 -13
  295. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/app_theme.css +0 -692
  296. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/design.md +0 -375
  297. package/yida-skills/skills/yida-design/templates/design-themes/graphite-bevel-grid/form-layout.json +0 -13
  298. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/app_theme.css +0 -691
  299. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/design.md +0 -362
  300. package/yida-skills/skills/yida-design/templates/design-themes/hairline-shared-bands/form-layout.json +0 -13
  301. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/app_theme.css +0 -691
  302. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/design.md +0 -409
  303. package/yida-skills/skills/yida-design/templates/design-themes/hairline-soft-blocks/form-layout.json +0 -13
  304. package/yida-skills/skills/yida-design/templates/design-themes/index.json +0 -464
  305. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/app_theme.css +0 -701
  306. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/design.md +0 -379
  307. package/yida-skills/skills/yida-design/templates/design-themes/ink-glow-soft-panels/form-layout.json +0 -13
  308. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/app_theme.css +0 -691
  309. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/design.md +0 -404
  310. package/yida-skills/skills/yida-design/templates/design-themes/inset-frame-pixel-rhythm/form-layout.json +0 -13
  311. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/app_theme.css +0 -698
  312. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/design.md +0 -389
  313. package/yida-skills/skills/yida-design/templates/design-themes/outlined-texture-duotone/form-layout.json +0 -13
  314. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/app_theme.css +0 -691
  315. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/design.md +0 -372
  316. package/yida-skills/skills/yida-design/templates/design-themes/soft-inset-surfaces/form-layout.json +0 -13
  317. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/app_theme.css +0 -690
  318. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/design.md +0 -455
  319. package/yida-skills/skills/yida-design/templates/design-themes/soft-outline-rhythm/form-layout.json +0 -13
  320. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/app_theme.css +0 -698
  321. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/design.md +0 -394
  322. package/yida-skills/skills/yida-design/templates/design-themes/soft-rail-bold-band/form-layout.json +0 -13
  323. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/app_theme.css +0 -692
  324. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/design.md +0 -391
  325. package/yida-skills/skills/yida-design/templates/design-themes/soft-spectral-panels/form-layout.json +0 -13
  326. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/app_theme.css +0 -711
  327. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/design.md +0 -408
  328. package/yida-skills/skills/yida-design/templates/design-themes/warm-canvas-contrast-panels/form-layout.json +0 -13
  329. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/app_theme.css +0 -692
  330. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/design.md +0 -383
  331. package/yida-skills/skills/yida-design/templates/design-themes/warm-rail-muted-panels/form-layout.json +0 -13
  332. package/yida-skills/skills/yida-design/templates/navigation-styles.json +0 -769
  333. package/yida-skills/skills/yida-requirement-analysis/references/experience-groups.md +0 -79
  334. package/yida-skills/skills/yida-requirement-analysis/references/handoff.md +0 -68
@@ -11,9 +11,8 @@
11
11
  | 宜搭开放 API(OpenAPI,`appKey`/`appSecret` 签名) | 服务端 / 平台连接器 | 需服务端签名;浏览器直连会泄露 secret。由后端或已鉴权的平台连接器调用。 |
12
12
  | 平台已配置连接器 `window.__OPENYIDA_CONNECTOR_API__` | **第三方 API 默认** | 页面只保存 `Http_*` `connectorName`、`operationId`、`connectionId` 和业务输入,由固定的同源运行时桥调用;鉴权与密钥留在平台侧。 |
13
13
  | 内部表单数据端点(同源、依赖登录 cookie + CSRF) | 降级可用 | 仅在 yida JS-API 桥不存在时使用;必须使用同源相对路径、`credentials: 'include'` 和运行态 CSRF token。 |
14
- | 公开访问网关 `window.pageConfig[...]`(同源、匿名态) | **匿名页仅此可用** | 仅当页面运行在 `/o/...` 公开链接(`FREELOGIN`、`loginUser.userId === 'FREEUSER'`)时使用;提交 URL 从 `window.pageConfig.RECEIPT_SAVE_FORM_DATA` 取值,为 origin 相对路径;CSRF 优先从 `window.g_config._csrf_token` 取,兼容 `pageConfig` 等运行态配置,**作为请求参数**(不是 header)传递;必须设置 `X-Requested-With: XMLHttpRequest` 头;`credentials: 'same-origin'`。仅当显示页和目标表单都已开启公开访问(`isOpen === 'y'`)且目标表单权限包含 `FREE_LOGIN` 数据规则时平台才会放行。 |
15
14
 
16
- 选路原则:读本应用或本轮创建的宜搭表单,默认走 yida JS-API 桥;读第三方或复杂后端数据,走平台连接器桥;只有桥不存在且必须读表单时,才同源直连内部端点。页面运行在公开链接 `/o/...` 时即使能读到 `window.__OPENYIDA_YIDA_API__`,其登录态 `saveFormData` 也会失败;匿名提交必须优先走公开访问网关,且显示页和目标表单都已开启公开访问、目标表单权限包含 `FREE_LOGIN`。Cookie、CSRF、AK/SK 和签名由平台上下文、连接器或后端服务提供,页面不能接收或保存密钥。
15
+ 选路原则:读本应用或本轮创建的宜搭表单,默认走 yida JS-API 桥;读第三方或复杂后端数据,走平台连接器桥;只有桥不存在且必须读表单时,才同源直连内部端点。Cookie、CSRF、AK/SK 和签名由平台上下文、连接器或后端服务提供,页面不能接收或保存密钥。
17
16
 
18
17
  ## 推荐:先写 dataBinding,再实现数据桥
19
18
 
@@ -381,146 +380,10 @@ function fetchFormData(appType, formUuid, signal) {
381
380
  function fieldOf(row, fieldId) { return (row.formData || row)[fieldId]; }
382
381
  ```
383
382
 
384
- ## 公开访问(匿名态)提交
385
-
386
- 页面运行在公开链接 `/o/...` 时,`this.utils.yida.saveFormData` 不可用于匿名提交;页面上即使存在 `window.__OPENYIDA_YIDA_API__` 桥对象,其登录态 `saveFormData` 也会返回 `LOGIN FAILED`。平台在 `window.pageConfig` 里注入的公开访问 API 网关映射,是匿名页写入表单数据的**唯一可行通道**。
387
-
388
- 前置条件(缺一不可,缺任一都不承诺匿名提交):
389
-
390
- - **显示页已开启公开访问**:`openyida get-page-config <appType> <显示页formUuid>` 返回 `isOpen === 'y'`。
391
- - **目标表单(receipt)也已开启公开访问**:`openyida get-page-config <appType> <目标formUuid>` 返回 `isOpen === 'y'`。显示页和目标表单的 `isOpen` 缺一不可。
392
- - **目标表单权限包含 FREE_LOGIN 规则**:`openyida get-permission <appType> <目标formUuid>` 的 DEFAULT 权限组 `dataPermit.rule` 包含 `{"type":"FREE_LOGIN","value":"y"}`。缺少此条会得到 `TIANSHU_160001 没有权限`。
393
- - 页面确实运行在匿名态:`String(window.pageConfig && window.pageConfig.FREELOGIN) === 'true'` 或 `(window.loginUser || {}).userId === 'FREEUSER'`。
394
- - `window.pageConfig.RECEIPT_SAVE_FORM_DATA` 非空(值形如 `/o/<hash>`)。
395
-
396
- 网关请求契约:
397
-
398
- - **URL**:`window.location.origin + window.pageConfig.RECEIPT_SAVE_FORM_DATA`,与租户命名空间无关,不要硬编码 `/dingtalk/web` 或 `/alibaba/web`。
399
- - **方法与编码**:`POST` + `Content-Type: application/x-www-form-urlencoded`。
400
- - **必须的请求头**:`X-Requested-With: XMLHttpRequest`(缺少此头会导致 302 重定向而非 JSON 响应)。
401
- - **CSRF**:优先从 `window.g_config._csrf_token` 取,兼容 `pageConfig`、`YIDA_CONFIG`、`__YIDA__` 等运行态配置,**作为请求参数** `_csrf_token` 传递;`credentials: 'same-origin'`。
402
- - **body 参数**:`formUuid`、`appType`、`_csrf_token`、`value`(`JSON.stringify(字段数组)`)。`_schemaVersion` 不必填。
403
- - **`value` 字段数组格式**:每项固定为 `{componentName, fieldId, fieldData: {value}}`:
404
- ```json
405
- [
406
- {
407
- "componentName": "TextField",
408
- "fieldId": "textField_xxx",
409
- "fieldData": { "value": "文本值" }
410
- }
411
- ]
412
- ```
413
- `componentName` 必须取目标表单 `openyida get-schema <appType> <formUuid> --field-map-json` 返回的真实值,不得根据 `fieldId` 前缀猜测;标准组件名称见[字段定义 JSON 指南](../../yida-create-form-page/references/field-definition-guide.md#支持的字段类型)。`fieldData.value` 沿用表单保存值结构,文本、数字、单选、多选和日期等格式统一引用[数据格式指南](../../yida-data-management/references/data-format-guide.md#常见字段值格式),不在本技能复制第二份映射表。该引用只说明值结构,不代表所有字段都支持公开匿名提交;仍需遵守下方匿名能力边界,并按返回实例 ID 回读目标字段。
414
- 把字段 ID 放进 `fieldData` 会得到 `success: true` 和 `formInstId`,但实际创建的是空记录,不能据此判定提交成功。
415
- - **响应**:`success: true` 时读 `content.formInstId`。
416
-
417
- 自适应提交 helper(页面直接复制;登录态走既有桥,匿名态走公开网关;两态失败都返回可读原因):
418
-
419
- ```jsx
420
- function isFreeLoginPage() {
421
- try {
422
- var cfg = window.pageConfig || {};
423
- if (String(cfg.FREELOGIN) === 'true') { return true; }
424
- } catch (err) {}
425
- try { return (window.loginUser || {}).userId === 'FREEUSER'; } catch (err) {}
426
- return false;
427
- }
428
-
429
- function publicEndpoint(key) {
430
- var cfg = (typeof window !== 'undefined' && window.pageConfig) || {};
431
- var p = cfg[key];
432
- if (!p) { return ''; }
433
- return p.charAt(0) === '/' ? window.location.origin + p : p;
434
- }
435
-
436
- function getCsrfToken() {
437
- var yida = window.__YIDA__ || {};
438
- var sources = [
439
- window.g_config,
440
- window.pageConfig,
441
- window.YIDA_CONFIG,
442
- yida,
443
- yida.config,
444
- yida.pageConfig,
445
- yida.runtimeConfig,
446
- ];
447
- var keys = ['_csrf_token', 'csrfToken', 'csrf_token', 'global_csrf_token'];
448
- for (var i = 0; i < sources.length; i += 1) {
449
- var source = sources[i] || {};
450
- for (var j = 0; j < keys.length; j += 1) {
451
- if (source[keys[j]]) { return source[keys[j]]; }
452
- }
453
- }
454
- return '';
455
- }
456
-
457
- function submitViaPublicGateway(appType, formUuid, fieldArray) {
458
- var url = publicEndpoint('RECEIPT_SAVE_FORM_DATA');
459
- if (!url) {
460
- return Promise.reject(new Error('当前页面未开启公开访问,无法匿名提交'));
461
- }
462
- var csrf = getCsrfToken();
463
- if (!csrf) {
464
- return Promise.reject(new Error('当前公开页面缺少提交凭证,请刷新后重试'));
465
- }
466
- var body = new URLSearchParams();
467
- body.set('formUuid', formUuid);
468
- body.set('appType', appType);
469
- body.set('value', JSON.stringify(fieldArray));
470
- body.set('_csrf_token', csrf);
471
- return fetch(url, {
472
- method: 'POST',
473
- credentials: 'same-origin',
474
- headers: {
475
- 'Content-Type': 'application/x-www-form-urlencoded',
476
- 'X-Requested-With': 'XMLHttpRequest',
477
- },
478
- body: body.toString(),
479
- }).then(function (r) { return r.json(); }).then(function (json) {
480
- if (!json || json.success === false) {
481
- var msg = (json && (json.errorMsg || json.errorCode)) || '匿名提交失败';
482
- throw new Error(msg);
483
- }
484
- return json.content || json;
485
- });
486
- }
487
-
488
- function submitFormData(appType, formUuid, fields, fieldComponents) {
489
- if (isFreeLoginPage()) {
490
- var fieldArray = Object.keys(fields).map(function (fieldId) {
491
- var componentName = fieldComponents && fieldComponents[fieldId];
492
- if (!componentName) {
493
- throw new Error('字段 ' + fieldId + ' 缺少真实 componentName,请先回读表单 Schema');
494
- }
495
- return {
496
- componentName: componentName,
497
- fieldId: fieldId,
498
- fieldData: { value: fields[fieldId] },
499
- };
500
- });
501
- return submitViaPublicGateway(appType, formUuid, fieldArray);
502
- }
503
- return window.__OPENYIDA_YIDA_API__.saveFormData({
504
- appType: appType, formUuid: formUuid,
505
- formDataJson: JSON.stringify(fields),
506
- });
507
- }
508
- ```
509
-
510
- 匿名态能力边界(不要在这些场景里承诺免登能力):
511
-
512
- - **不能发起流程**:`window.pageConfig.START_INSTANCE` 为空字符串,匿名态无法调用 `startProcessInstance`;流程页必须走登录态。
513
- - **不能读取跨组织附件**:匿名会话看不到组织内附件,附件字段默认不支持组织外访问。
514
- - **不支持成员/部门/关联表单/关联查询/行业组件/自定义组件**:这些字段在公开访问表单中被平台限制。
515
- - **唯一性校验不可用**:唯一约束不会在匿名提交时生效,业务侧要另外做去重。
516
- - **提交人恒为匿名**:审计需要真实身份时不要走匿名通道,改为登录页 + 表单公开访问关闭。
517
- - **匿名态开启后**:不再支持从该表单发送卡片消息给个人/群聊。
518
-
519
383
  ## 数据接入验收清单
520
384
 
521
385
  - 已确认 appType、formUuid 和字段 ID 来自真实表单 Schema。
522
386
  - 页面首屏接口返回后,统计总数与数据管理页 / `openyida data query form` 的总数一致。
523
- - 匿名提交不能只检查 `success` / `formInstId` 或总数增长;必须按返回的 `formInstId` 回读记录,确认代表性字段值真实落库。
524
387
  - 真实接口异常时显示错误原因和重试入口。
525
388
  - 提交、点赞等写操作成功后调用 silent reload,只更新统计和列表。
526
389
  - 轮询 `setInterval` 有 cleanup,页面隐藏时暂停请求。
@@ -531,5 +394,3 @@ function submitFormData(appType, formUuid, fields, fieldComponents) {
531
394
  - **幂等**:提交按钮加 loading 锁与去重键,拦截重复写入。
532
395
  - **权限**:写操作是否允许由平台权限决定;失败按后端返回的 `errorMsg` 提示。
533
396
  - **密钥位置**:任何 `appSecret` / 签名逻辑都留在服务端 / 连接器,页面源码里只出现同源相对路径与业务参数。
534
- - **匿名态分流**:页面运行在 `/o/...` 公开链接时,即使存在 `window.__OPENYIDA_YIDA_API__` 桥对象,其 `saveFormData` 仍会返回 `LOGIN FAILED`;必须先识别 `FREELOGIN` / `FREEUSER`,再按上文"公开访问(匿名态)提交"章节走 `window.pageConfig.RECEIPT_SAVE_FORM_DATA`,且 CSRF 走请求参数、`credentials: 'same-origin'`。
535
- - **匿名态限制**:匿名提交不能发起流程(`START_INSTANCE` 为空),唯一性校验不生效,成员/部门/关联表单/关联查询/行业组件/自定义组件不支持,提交人恒为匿名。审计需要真实身份、或需要唯一约束时不走匿名通道。
@@ -1,101 +1,17 @@
1
1
  # YidaCodeCanvas 应用内导航与快捷入口
2
2
 
3
- 作用范围先按 PRD 判断:独立前台的 pageSpecHandoff.navigation 只控制当前入口,配合 standalone 页面配置;后台应用导航继续保留。下文自绘应用级导航与全局隐藏规则,仅适用于整个应用采用 custom。页面内普通表单提交和详情入口必须接入下方标准 iframe 抽屉;全码前台也遵守,不自行实现另一套填写与提交逻辑。
4
-
5
3
  自定义页面里的快捷入口先判定目标类型,再选择跳转方式。目标是应用内页面时,用户应感觉是在宜搭应用导航内切换,而不是弹出一个脱离左侧导航的新页面,也不是在当前自定义页面中额外生成一套侧边导航或顶部应用导航。
6
4
 
7
5
  ## 运行态事实
8
6
 
9
- - `isRenderNav=false` 表示导航展示配置,不证明当前页面位于 iframe。不要仅凭该参数修改 `window.top.location`;嵌入方式、跨域和宿主能力需分别验证。
10
7
  - 宜搭应用壳根据 `navUuid/formUuid` 和 `workbench` 路径维护选中态;同应用页面应进入 `/{appType}/workbench/{formUuid}` 或对应壳层路由。
11
8
  - 发布层会把根级工具注册到 `window.__OPENYIDA_UTILS__`;可用时优先通过 `window.__OPENYIDA_UTILS__.router.push` 做应用内跳转,通过 `window.__OPENYIDA_UTILS__.openPage` 打开外部链接或新窗口场景。
12
9
  - `openPage` / `window.open` 更适合外部链接、新标签、钉钉链接、文件预览等场景;同应用页面默认在当前应用壳内切换。
13
10
  - 页面隐藏应用导航后,页面内自绘导航壳接管跨视图切换;导航可见时使用平台导航承载同级页面切换。
14
11
  - 自绘应用导航按 PRD 安排数量、顺序、分组和任务入口,通常工作台在首位;当前用户的 `getAccessableNavs.json` 结果只用于过滤不可见入口。数据片段和接入规则见 [导航数据来源](../../yida-nav-shell/references/nav-shell-patterns.md#导航数据来源)。
15
12
 
16
- ## 平台导航下的管理页面
17
-
18
- 业务管理端默认由平台菜单负责跨模块切换,自定义页面只实现业务内容。`entryRecommendation.entries[].menu` 是平台菜单与默认任务的规划,不是要求把整份菜单再渲染进工作台。选择自定义页面只改变内容实现方式,不改变导航归属。
19
-
20
- - `entryMode=platform-shell`:保留平台导航,直接实现概览、提醒、列表、筛选和业务操作,不添加品牌顶栏、应用侧栏或覆盖多个管理模块的 Tabs;不要为了容纳重复菜单而改成独立页或隐藏平台导航。
21
- - 合理的页内切换属于同一任务,例如预约页的“全部 / 待处理 / 已完成”、商品页的“在售 / 下架”。即便使用 React 状态切换,“商品管理 / 资讯管理 / 预约管理”仍是跨模块菜单,不能借页内 Tab 重复平台导航。
22
- - 概览里的“处理这条预约”“查看低库存商品”等上下文动作可以保留,使用真实资源和应用路由;不要把平台的全部模块再复制成固定菜单或快捷入口区。
23
- - standalone 只表示独立展示,不自动要求菜单;未规划页面菜单且应用保留平台导航时只实现业务内容,显式 none 同样不创建菜单。
24
- - 只有确认采用应用级自绘导航或独立前台菜单时才使用导航壳。保留筛选、分页、草稿状态本身不是自绘应用导航的理由;这些状态由业务组件管理。
25
-
26
- Plan 输出的 `pages[].navigationPolicy` 明确菜单归属、页面布局和本地切换范围,派发页面任务时与 `pageSpecHandoff` 一并传递,不将它塞进严格的 page-spec 输入。Fast 在 PRD/design.md 记录同样的边界。缺少该字段的旧计划,根据应用导航决策、当前页配置和实际管理链接判断;不能单凭 URL 或页面名称推断导航是否可见。
27
-
28
- 验收要从真实管理端链接打开:平台菜单与页面内容区合起来只出现一套跨模块导航。若两层菜单重复,修改页面源码中的重复菜单,保留平台导航、业务组件、数据与权限;编译通过不能替代这项页面验收。
29
-
30
- ## 先建立动作与目标清单
31
-
32
- 跨页按钮、导航菜单、卡片链接、返回首页共用一份目标映射。编码前为每个动作记录:业务名称、targetType、真实 appType、目标 formUuid/navUuid、必要参数、打开方式;资源来源是创建/查询结果及回读,不从页面名称猜 ID。详情按钮另外记录真实 formInstId 的行数据来源。无目标或无权限时禁用并说明原因,不用空地址或占位链接。
33
-
34
- | 动作目标 | targetType | 接入方式 |
35
- | --- | --- | --- |
36
- | 本页房型 Tab、筛选、多个本地视图 | local | viewKey + selectView,更新状态或 hash |
37
- | 独立前台首页、客房、预订自定义页 | custom | `/{appType}/custom/{formUuid}`,utils 路由 URL 模式 |
38
- | 保留平台应用壳的管理页面 | page | `/{appType}/workbench/{navUuid或formUuid}` |
39
- | 应用工作台 | app | `/{appType}/workbench` |
40
- | 原生提交或详情入口 | submission / detail | 交给 useYidaFormOpen;详情必须带 formInstId |
41
- | 外部网站 | url | 已验证的完整 HTTP(S) 地址,按外链打开 |
42
-
43
- 先提取可复用片段并整体合并到当前文件;保留现有页面业务实现:
44
-
45
- ```bash
46
- openyida sample openyida-page-template canvas-navigation --output .cache/samples/canvas-navigation.jsx
47
- ```
48
-
49
- `buildCanvasPageUrl(entry, context)` 生成链接,`navigateCanvasPage(entry, context)` 执行动作。context 的 appType 与必要时的 platformOrigin 来自实际资源;浏览器正常平台页面默认使用当前 origin,非平台或 opaque 嵌入时显式提供已核实的 origin,不猜域名,也不强行读取顶层窗口。表单动作接入已有 openForm;本页视图接入 selectView。跨应用目标在 entry.appType 中显式声明。
50
-
51
- ```jsx
52
- // APP_TYPE 与 ROOM_PAGE_ID 必须来自本项目资源映射。
53
- const roomEntry = { targetType: 'custom', formUuid: ROOM_PAGE_ID };
54
- const navigationContext = { appType: APP_TYPE };
55
- // 放进业务组件;href 与普通左键点击共用同一目标,保留修饰键和新标签行为。
56
- <a href={buildCanvasPageUrl(roomEntry, navigationContext)} onClick={event => {
57
- if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
58
- event.preventDefault();
59
- navigateCanvasPage(roomEntry, navigationContext);
60
- }}>查看客房</a>
61
- ```
62
-
63
- 应用内 HTTP 路径均保留 `/{appType}` 前缀。`/custom/...`、`/workbench/...`、`/submission/...`、`/formDetail/...` 是缺少应用身份的地址,换成绝对域名也不能修复缺失的 appType。纯页面 ID 的 `router.push('FORM-...', params)` 属于平台路由模式,与完整 URL 模式区分。桥不可用时片段在当前窗口打开完整地址;确需离开嵌入容器时先验证宿主约定,不将 `window.top` 作为默认 fallback。
64
-
65
- 编译/发布会在可静态确定的 href、浏览器导航与 router/openPage 目标中检查缺失前缀,报 `OPENYIDA_CANVAS_PATH_MISSING_APP_TYPE`。字符串片段、注释和动态地址不等于完整目的地,不做全局字符串拦截。该检查不能证明页面 ID 属于正确应用或用户有权限;发布验收仍需逐个点击主动作、返回链接和菜单,核对真实地址、query/hash、目标用途及浏览器返回。
66
-
67
- ## 管理员返回业务工作台
68
-
69
- 当前访问者具有应用管理权限时,可在独立前台页头操作区展示次级按钮“业务工作台”。沿用当前主题,不作为普通访客菜单,不跳应用设计器、应用设置或开发后台。先从 PRD 的管理端入口及资源回读确定真实业务管理页,不把当前前台页或任意第一个菜单当作工作台。
70
-
71
- ```bash
72
- openyida sample openyida-page-template canvas-admin-entry --output .cache/samples/canvas-admin-entry.jsx
73
- ```
74
-
75
- 片段包含统一跳转 helper、身份判断、hook 与按钮。整体合并,已有 `canvas-navigation` 或 React/Button import 时去重;按钮放在已接入的 CanvasThemeProvider 子树内:
76
-
77
- ```jsx
78
- <CanvasAdminWorkbenchButton
79
- appType={APP_TYPE}
80
- workbenchFormUuid={MANAGEMENT_PAGE_ID}
81
- params={{ corpid: CORP_ID }}
82
- />
83
- ```
84
-
85
- 这些常量必须来自真实应用和资源映射;没有 corpid 需求时省略 params。指定管理视图可传 viewUuid。默认使用 `/{appType}/workbench/{workbenchFormUuid}`,不继承前台的 isRenderNav/iframe/hideLeftNav/navConfig.layout 参数。只有已验证应用默认工作台落点正确时才省略页面 ID 并显式传 `useDefaultWorkbench`;默认工作台可能回到前台首页。整个应用采用自绘管理壳时,应选择实际承载该业务壳的页面,并验证其入口,不能靠按钮擅自开启或隐藏应用导航。
86
-
87
- 身份来自当前页面服务端注入的 `window.loginUser.isAppAdmin`,同时核对当前窗口的 `window.g_config.appType` / `window.pageConfig.appType` 与目标 appType 一致、userId 非空。访问态可能只提供 pageConfig;至少有一个非空应用标识,存在两个时必须全部一致,冲突仍按未知处理。只把 `"y"` 或布尔 true 视为允许;`"n"`/false 拒绝,其余未知。禁止 `Boolean(isAppAdmin)` 或 `if (isAppAdmin)`,因为 `"n"` 是真值。没有上下文、应用不匹配、匿名访问时隐藏,不读取父窗口另一应用的角色,不写死管理员名单,也不使用 CLI 操作者身份或 token 判断访问者。
88
-
89
- 这个标识采用平台的 `isSuperOrAppManager` 口径,可能覆盖超级管理员、应用主管理员、数据管理员、开发成员及平台授权角色;它不等价于仅 MAIN,也不等价于某业务角色。若需求限定“仅主管理员”或“业务运营人员”,需另接已验证的当前访问者角色/权限服务,不通过姓名、菜单可见性或复制 CLI 管理员列表代替。
90
-
91
- 按钮初始隐藏,读取上下文后显示;切换应用时旧状态不复用,回到页面时重读上下文,点击前再次读取。这里读取的是服务端页面上下文快照,刷新事件不会主动向权限服务查询最新授权;账号或权限已变化时需刷新页面,平台页面与数据接口始终承担真实授权。按钮显隐不授予任何业务权限。
92
-
93
- 双入口应用保留 `hideAppNav=n`,只让独立前台按既定页面配置隐藏导航。验证管理员能进入指定业务工作台、普通访问者及匿名访问者不显示按钮、缺少上下文不会闪现、目标保留平台导航和业务参数。公开页与嵌入页缺少登录上下文时保持隐藏;不要为显示按钮而发起管理员名单查询或修改权限。
94
-
95
13
  ## 导航决策
96
14
 
97
- 页内筛选、分页、详情往返与草稿按[状态恢复规则](view-state-recovery.md)设计。无现有路由且无未保存编辑拦截需求时可提取 `canvas-view-state`,不要在点击处理里零散保存状态。管理员入口只负责展示和跳转,业务写操作须加载 `yida-canvas-data-binding` 并核对其业务动作权限清单。
98
-
99
15
  | 用户说法 | 怎么理解 | 怎么做 |
100
16
  | --- | --- | --- |
101
17
  | “加侧边导航 / 顶部导航 / 导航壳 / 自绘应用导航” | 自定义页要承担应用级导航 | 进入 `yida-nav-shell`,并执行 `openyida update-app <appType> --hide-app-nav` |
@@ -171,17 +87,17 @@ openyida sample openyida-page-template canvas-admin-entry --output .cache/sample
171
87
 
172
88
  ## 按需接入自定义导航
173
89
 
174
- PRD 确定使用自定义导航时,按 `design.md` 编写导航 UI,先参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 的场景、布局骨架和小段代码,再按业务设计手写外观或迭代已有导航。顶部按连续展示页或业务工作区决定叠加/占位和背景范围,侧导必须支持折叠与拖拽调宽。菜单数据、可见性过滤、当前页和跳转按目录中的协议接入,样式消费应用导航 token;不以选择 CLI 导航模板作为起点。页内切换和跨任务往返均遵循 [页面与导航连续性](../../yida-design/references/page-continuity.md)。
90
+ PRD 确定使用自定义导航时,按 `design.md` 编写导航 UI,先参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 的场景、布局骨架和小段代码,再按业务设计手写外观或迭代已有导航。自定义顶部默认浮导,侧导必须支持折叠与拖拽调宽。菜单数据、可见性过滤、当前页和跳转按目录中的协议接入,样式消费应用导航 token;不以选择 CLI 导航模板作为起点。
175
91
 
176
92
  ## 标准 FormOpenContainer
177
93
 
178
- 页面内操作按钮去新增、提交或查看表单详情时,必须使用 CLI 提供的 `FormOpenContainer` 模板,不凭描述重写同名组件。按钮事件调用 `openForm(request)`,页面 JSX 渲染 hook 返回的 `formOpenContainer`;只有定义没有挂载,不算接入。新标签只用于外部 URL 或用户主动点击抽屉标题栏的新窗口操作。PC 端容器表现为右侧抽屉 + iframe,移动端由模板打开原生表单页,关闭抽屉后触发当前页刷新。已明确的应用级办理导航可在主内容区嵌入原生提交页,导航选中态与当前任务一致。
94
+ 页面内操作按钮去新增、提交或查看表单详情时,统一封装成同一个 `FormOpenContainer`。按钮事件只调用 `openForm(request)`;新标签只用于外部 URL 或用户主动点击抽屉标题栏的新窗口操作。PC 端容器表现为右侧抽屉 + iframe,移动端直接进入原生表单页,关闭抽屉后触发当前页刷新。应用级办理导航的提交页在主内容区嵌入,导航选中态与当前任务一致。
179
95
 
180
- YidaCodeCanvas 推荐使用 antd `Drawer`。`FormOpenContainer` 只负责打开原生提交页或详情页。通用 `CanvasDrawer` 提供标题栏、全屏/退出全屏、关闭和 `extra` 操作区,表单容器额外提供新窗口打开。普通业务内容容器保持透明,跟随抽屉外壳背景。
96
+ YidaCodeCanvas 推荐使用 antd `Drawer`。`FormOpenContainer` 只负责打开原生提交页或详情页。通用 `CanvasDrawer` 提供标题栏、全屏/退出全屏、关闭和 `extra` 操作区,表单容器额外提供新窗口打开。只有普通业务内容模式使用内容卡片。
181
97
 
182
98
  抽屉 header 的工具操作统一使用图标按钮:新窗口打开用 `ExternalLink`,全屏/退出全屏用 `Maximize2` / `Minimize2`,关闭用 `X`。表单抽屉三个操作必须齐全,不得替换为“在新窗口打开”“关闭”等可见文字链接,也不得省略全屏。每个按钮提供对应的 `title`、`aria-label` 和可见键盘焦点;全屏按钮同时更新图标、提示和 `aria-pressed`。按钮默认使用中性色,hover、focus 跟随主题。发布前逐一验证三个按钮的实际行为,不以按钮已渲染代替验收。
183
99
 
184
- 抽屉外壳默认使用 `var(--pod-shell-theme-bg-color, var(--color-white, #fff))`,标题栏与正文容器透明承接同一底色,不使用 `--pod-card-bg-color` 铺满抽屉。CanvasThemeProvider 同步设置 antd Drawer 的组件级背景;其他卡片、弹窗保留各自表面。只有明确的设计覆盖才传 CanvasDrawer.background 或 openForm 的 background,不主动生成卡片色覆盖。抽屉外壳的标题、正文和标题栏按钮默认使用 `--pod-page-header-text-color`,回退到 `--color-text1-4`,显式的 drawer 颜色变量仍可覆盖对应角色。外壳背景跟随应用框架,内部 iframe 独立呈现表单或详情页。传入 `background` 时同时检查标题、按钮和正文的可读性。iframe 内页面继续使用平台主题。
100
+ 模板已内置抽屉主题样式,背景默认使用 `--pod-shell-theme-bg-color`。自定义背景时传入 `CanvasDrawer.background`;表单入口通过 `openForm({ type: 'submission', formUuid, background: 'var(--pod-card-bg-color)' })` 设置。iframe 内页面使用平台主题。
185
101
 
186
102
  提交页和详情页统一由 `FormOpenContainer` 使用 `contentMode="iframe"`:iframe 直接填满标题栏下方的剩余空间,外层不加 `oy-drawer-card`、卡片底色、圆角或 padding,也不设置外层滚动。`oy-drawer-frame` 仅负责尺寸定位和裁切;滚动由 iframe 内页面负责。不要恢复 `calc(100vh - 56px)` 等猜测高度的兜底。
187
103
 
@@ -224,28 +140,83 @@ function ExampleToolbar({ appType, customerFormUuid, selectedCustomer, reload })
224
140
  }
225
141
  ```
226
142
 
227
- 已有页面的表单入口也按标准片段接入,保留业务数据、刷新回调和权限校验;不另写缺少交互能力的抽屉外壳。
143
+ 如果项目没有使用 antd Drawer,可以用自绘 fixed 右侧面板,但组件名、状态结构和 URL 构造仍沿用 `FormOpenContainer / useYidaFormOpen / buildYidaFormUrl`。
228
144
 
229
145
  ## Canvas 点击骨架
230
146
 
231
147
  Canvas 自绘快捷入口时,表单提交和详情入口沿用 `useYidaFormOpen` 返回的 `openForm`。应用内页面用同页跳转,外部链接才新开;提交页在 PC 端进入抽屉,移动端才整页或新页打开,提交页 URL 默认追加 `isRenderNav=false`;详情页 URL 必须包含真实 `formInstId`,并默认追加 `navConfig.layout=1180` 和 `isRenderNav=false`:
232
148
 
233
- 合并 `canvas-navigation` 片段后,只适配业务数据,不另写一套路径拼接:
234
-
235
149
  ```js
236
- function openEntry(entry, currentAppType, runtime) {
237
- const target = entry.targetType === 'detail'
238
- ? { ...entry, formInstId: getYidaFormInstId(entry.row) || entry.formInstId }
239
- : entry;
240
- return navigateCanvasPage(target, {
241
- appType: currentAppType,
242
- openForm: runtime.openForm,
243
- selectView: runtime.selectView,
244
- utils: window.__OPENYIDA_UTILS__,
150
+ function getOpenYidaUtilsBridge() {
151
+ var candidates = [];
152
+ try { candidates.push(window.__OPENYIDA_UTILS__); } catch (err) {}
153
+ try { candidates.push(window.parent && window.parent.__OPENYIDA_UTILS__); } catch (err) {}
154
+ try {
155
+ if (typeof parentWindow !== 'undefined') {
156
+ candidates.push(parentWindow.__OPENYIDA_UTILS__);
157
+ }
158
+ } catch (err) {}
159
+ return candidates.find(function (item) { return item && item.ready; }) || null;
160
+ }
161
+
162
+ function buildYidaBasePath(entry, currentAppType) {
163
+ const appType = entry.appType || currentAppType;
164
+ if (entry.targetType === 'app') return `/${appType}/workbench`;
165
+ if (entry.targetType === 'page') return `/${appType}/workbench/${entry.navUuid || entry.formUuid}`;
166
+ if (entry.targetType === 'submission') {
167
+ return `/${appType}/submission/${entry.formUuid}?isRenderNav=false`;
168
+ }
169
+ if (entry.targetType === 'detail') {
170
+ if (!entry.formInstId) return '';
171
+ return `/${appType}/formDetail/${entry.formUuid}?formInstId=${encodeURIComponent(entry.formInstId)}&navConfig.layout=1180&isRenderNav=false`;
172
+ }
173
+ return entry.url || '';
174
+ }
175
+
176
+ function buildYidaPath(entry, currentAppType) {
177
+ const path = buildYidaBasePath(entry, currentAppType);
178
+ if (!path) return '';
179
+ const url = new URL(path, window.location.origin);
180
+ Object.entries(entry.params || {}).forEach(([key, value]) => {
181
+ if (value !== undefined && value !== null && value !== '') {
182
+ // 路径已带的必需参数(如真实实例 ID)优先,其他业务参数合并。
183
+ if (!url.searchParams.has(key)) url.searchParams.set(key, String(value));
184
+ }
245
185
  });
186
+ return url.href;
246
187
  }
247
- ```
248
188
 
189
+ function openEntry(entry, currentAppType, runtime) {
190
+ if (entry.targetType === 'submission' || entry.targetType === 'detail') {
191
+ runtime.openForm({
192
+ type: entry.targetType,
193
+ title: entry.title || '表单',
194
+ appType: entry.appType || currentAppType,
195
+ formUuid: entry.formUuid,
196
+ formInstId: getYidaFormInstId(entry.row) || entry.formInstId,
197
+ params: entry.params,
198
+ });
199
+ return;
200
+ }
201
+
202
+ const href = buildYidaPath(entry, currentAppType);
203
+ if (!href) return;
204
+ const utilsBridge = getOpenYidaUtilsBridge();
205
+ if (entry.targetType === 'url' || entry.openMode === 'new-tab') {
206
+ if (utilsBridge && typeof utilsBridge.openPage === 'function') {
207
+ utilsBridge.openPage({ url: href });
208
+ return;
209
+ }
210
+ window.open(href, '_blank');
211
+ return;
212
+ }
213
+ if (utilsBridge && utilsBridge.router && typeof utilsBridge.router.push === 'function') {
214
+ utilsBridge.router.push(href, {}, false, true);
215
+ return;
216
+ }
217
+ window.location.href = href;
218
+ }
219
+ ```
249
220
 
250
221
  `getYidaFormInstId` 复用 CLI 抽屉片段中的同名 helper。复制或重命名 helper 时必须连同声明和全部调用点一起修改,不能只生成 `getInstId(...)` 等新调用名。
251
222
 
@@ -10,22 +10,21 @@
10
10
 
11
11
  结构化实现工具提供可编译运行时结构、数据桥、主题变量和基础 primitives。真实业务页结合 `prd.md` 落地业务化区块顺序、数据和文案,结合 `design.md` 落地信息层级、局部构图和样式节奏。
12
12
 
13
- PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec.json`;其中 `entryMode`、`navigation`(只作用于当前入口)、`pageStructure`、`scene`、`contentBlocks`、`themeSummary`、`designFile`、`designRefs`、`dataBinding` 和 `primaryAction` 是页面实现的业务输入。随后读取 `designFile`:用 `designRefs` 查 frontmatter 的场景、组件和状态索引,再按显式 anchor 找到当前页八项设计与共享规则。格式见 [design.md 公共输出契约](../../yida-design/workflow/output-design.md);索引不是规则正文,不能只读元数据就实现。
14
-
15
- 平台导航管理页默认生成纯业务内容,跨模块菜单由平台负责;不要从 `entryRecommendation.menu` 再生成页面侧栏或模块 Tabs。Plan 的 `pages[].navigationPolicy` 与 `pageSpecHandoff` 一并作为实现上下文,Fast 同样记录导航归属;详见[管理页面边界](navigation-and-entry-guide.md#平台导航下的管理页面)。
13
+ PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec.json`;其中 `pageStructure`、`scene`、`contentBlocks`、`themeSummary`、`designFile`、`designRefs`、`dataBinding` 和 `primaryAction` 是页面实现的业务输入。随后必须读取 `designFile` 指向的 `design.md`,用 `designRefs` 找到 `visualScaffold`、`backgroundLayer`、`surfaceMaterial`、`surfaceContrast`、`colorRoles`、`depthRule`、`roundedRule`、`densityRule`、`breathingRule`、组件和状态规则。
16
14
 
17
15
  ## Source Of Truth
18
16
 
19
- 业务按 `prd.md` 实现,视觉按 `design.md` 实现。手写页面可直接使用这两份文件;使用生成器时,先整理 `page-spec.json`:
17
+ `prd.md` 和 `design.md` 是唯一设计事实源。`page-spec.json` 只是页面实现阶段的派生文件,用于喂给生成器或保存一次稳定交接,不是第三份设计文件。
20
18
 
21
- - 业务字段来自当前 PRD。
22
- - 视觉部分保存 `designFile/designRefs` 和一致的 `themeSummary`,完整视觉规则从 design.md 读取。
23
- - `sourceOfTruth` 填写 `prdFile`、`designFile`、`designRefs` 和 `conflictPolicy = "prd-design-win"`。
24
- - spec 与 PRD/design.md 冲突时,按这两份文件重新生成 spec。
19
+ - `page-spec.json` 必须由当前 `prd.md + design.md` 派生,不允许凭空新增视觉规则、页面结构或业务功能。
20
+ - `page-spec.json` 不复制 `visualScaffold`、`surfaceMap`、`componentRecipe`、tokens、完整色盘或组件规则;只保存 `designFile/designRefs` 和与 design.md 一致的 `themeSummary`。
21
+ - spec 必须包含 `sourceOfTruth.prdFile`、`sourceOfTruth.designFile`、`sourceOfTruth.designRefs` 和 `sourceOfTruth.conflictPolicy = "prd-design-win"`。
22
+ - spec 与 PRD/design.md 冲突时,以 PRD/design.md 为准,重新生成 spec;不要修改 PRD/design.md 来迎合旧 spec。
23
+ - 手写页面且结构清楚时可以跳过 `page-spec.json`,但源码实现备注必须能说明已读取 `prd.md` 和 `design.md`。
25
24
 
26
- 按页面任务组织内容:工作台通常包含状态摘要、高频动作、待办、动态和上下文信息;列表页通常包含搜索筛选、列表或表格、详情预览,以及空态和错误时的下一步操作。工作台、首页、门户、看板和展示页推荐 8-10 个有业务目的的区块,窄场景或精简需求按实际任务减少。KPI 子项、快捷入口子项和列表行计入各自所属区块。
25
+ 实现阶段不再从 PRD 里反推视觉,也不直接读取 `references/style-designs/`。该目录只在 yida-design 阶段提供 `design.md` 结构模板;`YidaCodeCanvas` 组件实现只遵守当前项目的 `design.md`。工作台/业务首页通常需要圆润紧凑状态摘要、高频动作、待办/动态/最近记录和右侧上下文;实现阶段用这些结构替代“4 个等宽大 KPI 白卡 + 图标快捷卡 + 大空态白卡”。列表/管理页通常需要顶部视觉区、搜索筛选区、左侧列表或表格、右侧详情预览、错误/空态下一步动作;实现阶段用这些结构替代单个渐变标题、单个指标卡和大块空白提示。工作台、首页、门户、看板、展示页和业务入口页推荐落地 8-10 个有业务目的的区块以上;区块可以紧凑组合,不能用重复 KPI 卡、重复快捷入口或大空白卡凑数;KPI 子项、快捷入口子项和列表行不计入区块数量。窄场景或用户要求精简时可以更少,不应因此阻塞实现。
27
26
 
28
- 如果当前页面正文没有具体布局、表面与组件、状态、响应式或验收安排,先补设计事实再实现。圆角、padding、gap 和密度采用选中主题与当前页决定,不能用固定大圆角或统一间距覆盖主题。状态、列表、动作与空态按真实内容组织,不用空白容器撑满首屏。
27
+ 如果当前 `design.md` 缺少 `roundedRule`、`densityRule` 或 `breathingRule`,先回写设计文件再实现。默认业务页应写清卡片 padding >20px、卡片 gap <20px、卡片圆角 0-32px;状态摘要、任务列表、动作条和空态保持紧凑,不得用额外 margin、超宽空状态框或空白高度制造“高级感”。
29
28
 
30
29
  页面实现路径二选一:结构化实现路径先从 `prd.md + design.md` 派生业务化 `page-spec.json` 并生成可编译骨架,之后读取 CLI 摘要或 `.openyida-page.json`。若发现业务或视觉事实源缺失,先回写 `prd.md` / `design.md` 并重生成 spec;只有实现偏差才对生成源码做小范围 Edit/patch。手写路径直接 Write 最终 `.canvas.jsx`。
31
30
 
@@ -43,22 +42,22 @@ PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec
43
42
  | 问题类型 | 必须修改哪里 | 不允许的做法 |
44
43
  | --- | --- | --- |
45
44
  | 页面目标、业务对象、指标口径、主操作、表单入口、数据来源、`contentBlocks`、空/载/错业务语义不足或错误 | 回写 `prd.md`,再重新派生 `page-spec.json` | 只在 `page-spec.json` 或源码里新增业务区块、指标和动作 |
46
- | 主题关系、token、页面布局、表面层次、色彩角色、形状、密度、组件状态或响应式不足或错误 | 回写 `design.md`,再重新派生 `page-spec.json` 或重读 design.md 实现 | 只在源码里临时写 CSS、主色、玻璃感、卡片材质、圆角、密度、呼吸感或状态样式 |
45
+ | 主题关系、token、`visualScaffold`、`backgroundLayer`、`surfaceMaterial`、`surfaceContrast`、`colorRoles`、`depthRule`、`roundedRule`、`densityRule`、`breathingRule`、组件规则、状态规则、响应式规则不足或错误 | 回写 `design.md`,再重新派生 `page-spec.json` 或重读 design.md 实现 | 只在源码里临时写 CSS、主色、玻璃感、卡片材质、圆角、密度、呼吸感或状态样式 |
47
46
  | `page-spec.json` 缺少 `sourceOfTruth`、`designFile/designRefs`、`dataBinding` 字段,或与 `prd.md/design.md` 不一致 | 丢弃并从最新 `prd.md + design.md` 重新生成 `page-spec.json` | 修改 PRD/design.md 来迎合旧 spec,或把 design.md 的完整视觉规则复制进 spec |
48
47
  | 已创建或解析业务表单,但页面源码没有 `dataBinding.mode=form`、没有 `useYidaData` / `DataBridge`,或没有优先消费 `window.__OPENYIDA_YIDA_API__` | 补齐 `page-spec.json` 的真实 `dataBinding`,读取 `data-bridge-guide.md` 后重新生成或小范围修复源码 | 默认手写 `/query/form/searchFormDatas.json` 或 `/v1/form/searchFormDatas.json` fetch,缺字段映射,或用前端 seedRows 冒充真实表单数据 |
49
48
  | PRD、design.md 和 spec 都完整,但生成源码存在 className、布局比例、字段映射、响应式、loading/empty/error 渲染、编译错误等实现偏差 | 小范围 Edit/patch 源码 | 借源码 patch 新增 PRD 未定义的页面区块、业务动作或 design.md 未定义的视觉风格 |
50
49
 
51
50
  源码 patch 过程中一旦发现需要新增业务区块、改页面目标、改主题关系或补视觉规则,停止 patch,先回写 `prd.md` 或 `design.md`,再重新派生 spec 或重读两份事实源实现。
52
51
 
53
- 设计内容直接映射到源码:外壳、首屏焦点、主要内容、动作、必要上下文、状态反馈与响应式都应有实现位置。`design.md` 的页面正文覆盖这些含义即可,不要求旧 `visualScaffold` 或同名 primitive 字段;没有真实内容的可选侧栏、指标或图形不渲染。
52
+ `visualScaffold` 必须来自 `design.md`,并映射到源码 primitive:`rootShell`、`prioritySurface`、`statusPrimitive`、`actionPrimitive`、`contentPrimitive`、`contextPrimitive`、`statePrimitive`、`responsiveRule`、`roundedRule`、`densityRule` 和 `breathingRule`。如果只有区块名称,没有这些源码级槽位,先补 design.md,不要直接开始写 CSS。
54
53
 
55
- 玻璃、光影、纹理、流光与不规则背景只在已确认设计需要时实现。玻璃明确半透明表面、边框、背景关系和 `backdrop-filter`;光洗不能干扰阅读,流光提供 `prefers-reduced-motion` 静态降级。背景可以自由,内容仍保持栅格、对齐、行高与操作位置稳定;平整画布主题不为“高级感”额外添加装饰。
54
+ 页面要求玻璃感、质感、背景感、光影、流光、不规则顶部或丰富色彩时,必须消费 `backgroundLayer`、`surfaceMaterial`、`colorRoles` 和 `depthRule`:页面根节点优先使用 `softTintCanvas`、带弱渐变的近白画布、细线装饰或素材焦点,再按 `design.md` 选择 `topIrregularWash`、`radialGlowWash`、`flowLight` 或 `organicNoise`。`topIrregularWash` 用顶部波浪、斜切、有机色块、轻装饰曲线或图形标记形成首屏背景;`radialGlowWash` 使用大面积柔和光洗,不使用离散装饰圆球或 bokeh;`flowLight` 必须低速低透明,并写 `prefers-reduced-motion` 静态降级。玻璃面板使用半透明 `rgba` 表面、`backdrop-filter`、细边框和柔和阴影;色彩角色至少区分应用主色、辅助色、语义色和图表色。纯白背景 + 普通纯白不透明卡片不满足玻璃感页面;但近白画布如果有渐变、装饰、素材焦点或足够内容密度,可以作为背景感方案。
56
55
 
57
- 画布、内容面与边界按设计正文和 token 实现。同色画布与卡片可以通过细边界、共容器或留白建立层次;灰底不必统一无边框,渐变不强制搭配玻璃。验收看是否还原当前主题,不用另一套统一材质或尺寸规则覆盖它。
56
+ 实现页面背景和卡片时必须消费 `surfaceContrast`:页面背景与卡片背景不可相近或相同。白色/浅色背景配有边框卡片;浅灰背景(如 `#F3F4F6`)配白色无边框卡片;浅彩色背景配白色无边框卡片;渐变背景配玻璃感卡片。源码不得输出浅底白卡无边框、同色背景同色卡片,或只靠弱阴影区分层级。
58
57
 
59
- 按 design.md 第 2 章已合并的项目配色和导航规则实现,不从模板重新推导另一套默认值;整体绿色风格不能只让按钮变绿。卡片背景使用 `var(--pod-card-bg-color, var(--color-white, #fff))`,边界消费 `--pod-card-border`;页面、卡片、导航、表头、文字与控件一并核对。antd 页面通过主题脚本统一映射主色、容器、文字、填充和边框;语义色暂用 antd 默认值,不能把所有状态改成品牌色。
58
+ design.md 存在“项目配色适配”时先应用该节,它高于模板默认灰阶/品牌面积约束;整体绿色风格不能只让按钮变绿。卡片背景使用 `var(--pod-card-bg-color, var(--color-white, #fff))`,边界消费 `--pod-card-border`;页面、卡片、导航、表头、文字与控件一并核对。antd 页面通过主题脚本统一映射主色、容器、文字、填充和边框;语义色暂用 antd 默认值,不能把所有状态改成品牌色。
60
59
 
61
- 设计需要背景装饰层时,先写根节点和伪元素,再写内容网格:`.oy-page-root` 承载基础底色、`::before` 承载不规则顶部色块或光洗、`::after` 承载低速流光或弱纹理,`.oy-page-content` 使用 `position: relative; z-index: 1;`。背景可以不规则,内容必须规则;标题、筛选、表格、图表、按钮和列表都保持稳定栅格、对齐和对比度。
60
+ 实现背景层时先写根节点和伪元素,再写内容网格:`.oy-page-root` 承载基础底色、`::before` 承载不规则顶部色块或光洗、`::after` 承载低速流光或弱纹理,`.oy-page-content` 使用 `position: relative; z-index: 1;`。背景可以不规则,内容必须规则;标题、筛选、表格、图表、按钮和列表都保持稳定栅格、对齐和对比度。
62
61
 
63
62
  数据真实性边界:
64
63
 
@@ -81,9 +80,7 @@ PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec
81
80
 
82
81
  ### 导航生成规则
83
82
 
84
- 先读应用 navigationType 和当前页 pageSpecHandoff。前台 standalone + navigation.custom 只自绘当前入口菜单,不修改 appBlueprint.hideAppNav;后台继续使用平台导航。前后台页面内普通表单提交与详情均接入 CLI 的 `form-open-container` 模板;全码开发不豁免,不另写填写提交 UI。查询、筛选和展示继续按页面设计实现。
85
-
86
- 自定义导航按 PRD 和 `design.md` 直接实现;参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 的场景与骨架,UI 示例按需查阅。连续展示页使用共同首屏画布与页面滚动,业务工作区保留导航占位和剩余高度;侧边及混合布局支持折叠、恢复宽度和拖拽调宽。菜单同时记录入口用途和打开方式:管理走 workbench,填写走 submission;本页视图切状态,保留导航的表单入口更新主内容 iframe,同标签跨页仅用于已确认承载同一导航壳的目标。页面内新增/详情按钮沿用 FormOpenContainer,切换与返回按 [页面与导航连续性](../../yida-design/references/page-continuity.md) 保留上下文。
83
+ 自定义导航按 PRD 和 `design.md` 直接实现;参考 [导航壳形态目录](../../yida-nav-shell/references/nav-shell-patterns.md) 的场景与骨架,UI 示例按需查阅。顶部默认浮导;侧边及混合布局支持折叠、恢复宽度和拖拽调宽。菜单同时记录入口用途和打开方式:管理走 workbench,填写走 submission;本页视图切状态,保留导航的表单入口更新主内容 iframe,跨页入口默认当前标签跳转。页面内新增/详情按钮沿用 FormOpenContainer。
87
84
 
88
85
  完整地址通过数据桥使用 `router.push(href, params, false, true)`;省略 URL 模式的自动识别只作兼容,详见 [路由模式与数据桥兜底](../../yida-nav-shell/references/nav-shell-patterns.md#路由模式与数据桥兜底)。导航显示参数不控制是否新开标签。
89
86
 
@@ -91,8 +88,8 @@ PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec
91
88
  | --- | --- | --- |
92
89
  | 普通自定义页、工作台、门户、看板、首页 | 不写 `hideAppNav` | 保留平台应用导航 |
93
90
  | 页面内 tab、分段筛选、内容区快捷入口 | 不写 `hideAppNav` | 保留平台应用导航 |
94
- | 整个应用的顶部导航、侧边导航、导航壳、自绘应用级导航 | 写 `appBlueprint.hideAppNav: 'y'` | 执行 `openyida update-app <appType> --hide-app-nav` |
95
- | 独立前台菜单、页面隐藏导航、无导航全屏、`isRenderNav=false` | 写 `appBlueprint.renderNav: false` | 执行 `openyida update-form-config <appType> <formUuid> false "<页面标题>"` |
91
+ | 自定义页顶部导航、侧边导航、导航壳、自绘应用级导航 | 写 `appBlueprint.hideAppNav: 'y'` | 执行 `openyida update-app <appType> --hide-app-nav` |
92
+ | 页面隐藏导航、无导航全屏、`isRenderNav=false` | 写 `appBlueprint.renderNav: false` | 执行 `openyida update-form-config <appType> <formUuid> false "<页面标题>"` |
96
93
 
97
94
  两条规则必须分开:`hideAppNav` 控制应用导航,`renderNav/isRenderNav=false` 控制页面导航。其他自定义页默认不调用 `update-app --hide-app-nav`。
98
95
 
@@ -109,13 +106,13 @@ PRD 写有 `pageSpecHandoff` 时,可以把 `pageSpecHandoff` 转成 `page-spec
109
106
 
110
107
  ## 官网与品牌页素材
111
108
 
112
- 按 `design.md.assetStrategy` 调用 `yida-image-assets`。读取当前页的 `asset-manifests/<pageId>.json`(已有项目可用总清单 `asset-manifest.json`)中 `pages[].materialStatus`;当前页为 `final` 时,只读取该页 `assets[].materialStatus=final` 的图片 URL。总状态为 `draft` 不阻塞已就绪的页面;不手拼 URL,也不内嵌 data URI。
109
+ 按 `design.md.assetStrategy` 调用 `yida-image-assets`。读取 `asset-manifest.json` 中当前页面 `pages[].materialStatus`;当前页为 `final` 时,只读取该页 `assets[].materialStatus=final` 的图片 URL。总状态为 `draft` 不阻塞已就绪的页面;不手拼 URL,也不内嵌 data URI。
113
110
 
114
111
  联网搜图仅使用 Unsplash/Pexels。Unsplash 保留 API 热链和署名;Pexels 保留来源页和摄影师信息。
115
112
 
116
113
  ## 主题实现
117
114
 
118
- antd 页面按 [CanvasThemeProvider 指南](canvas-theme-provider.md) 统一接入主题。已有 Provider 或直接合并 Provider 的页面编译发布原文件;仅使用标记和主题脚本时,才编译发布生成的 `.themed.canvas.jsx`。纯 DOM 页面直接使用应用 CSS 变量。
115
+ 新 antd 页面按 [CanvasThemeProvider 指南](canvas-theme-provider.md) 装配主题;只编译和发布装配后的文件。纯 DOM 页面不需要 Provider;旧 hook 页面按该指南迁移,不能重复接入。
119
116
 
120
117
  主题色决策来自 `yida-design` 的 `design.md`。`app-theme.css` 只在应用级配置,由平台统一作用于整个应用。
121
118
 
@@ -150,13 +147,13 @@ antd 页面按 [CanvasThemeProvider 指南](canvas-theme-provider.md) 统一接
150
147
  "sourceOfTruth": {
151
148
  "prdFile": "prd/渠道增长应用/prd.md",
152
149
  "designFile": "prd/渠道增长应用/design.md",
153
- "designRefs": ["themeProfile", "sceneRecipes.dashboard", "components.chart", "states.empty"],
150
+ "designRefs": ["themeProfile", "sceneRecipes.dashboard", "components.charts", "states.empty"],
154
151
  "conflictPolicy": "prd-design-win"
155
152
  },
156
153
  "pageStructure": "dashboard-overview",
157
154
  "scene": "dashboard",
158
155
  "designFile": "prd/渠道增长应用/design.md",
159
- "designRefs": ["themeProfile", "sceneRecipes.dashboard", "components.chart", "states.empty"],
156
+ "designRefs": ["themeProfile", "sceneRecipes.dashboard", "components.charts", "states.empty"],
160
157
  "themeSummary": {
161
158
  "themeColor": "青绿色应用主题",
162
159
  "styleKeywords": ["运营洞察", "轻量玻璃感", "高密信息"]
@@ -201,18 +198,18 @@ antd 页面按 [CanvasThemeProvider 指南](canvas-theme-provider.md) 统一接
201
198
  | `official-homepage` | Real-scene hero、Product/service visual、Process/space story、Visit/service section、CTA |
202
199
  | `data-screen` | Command map、Metric grid、Rank panel、Screen insight header |
203
200
 
204
- 工作台状态摘要按主题保持紧凑,未定义时可参考 64-88px;不使用横跨整页但内容稀疏的空矩形;快捷入口必须有分组和主次,不能平铺成图标卡阵列;待办、动态、最近记录、洞察、提醒和右侧上下文推荐组合成 8-10 个业务目的区块以上,但不作为硬门槛。空数据也用薄空态行 + 主操作入口,不渲染大块空白卡片。
201
+ 工作台的状态摘要必须是 64-88px 圆润紧凑状态条,不是 180px 高的大白卡,也不是横跨整页但内容稀疏的空矩形;快捷入口必须有分组和主次,不能平铺成图标卡阵列;待办、动态、最近记录、洞察、提醒和右侧上下文推荐组合成 8-10 个业务目的区块以上,但不作为硬门槛。空数据也用薄空态行 + 主操作入口,不渲染大块空白卡片。
205
202
 
206
203
  展示型自定义页面验收时检查 `contentBlocks` 或源码结构:工作台、首页、门户、看板、展示页和业务入口页应有足够多有业务目的的区块;每个区块承担不同任务,例如判断状态、发起动作、筛选、处理待办、查看动态、看洞察、看异常、进入详情、处理空态或补充上下文。区块数量不作为阻塞实现的硬门槛。若 PRD 只写“`KPI 卡片: 学生总数, 课程总数, 本月出勤率, 平均分`、`快捷入口: 录入学生/登记成绩/记录考勤/管理课程`、`最近成绩列表`、`最近考勤记录`”,实现前建议补充 `contentBlocks`;若业务确实是窄场景,可以继续实现并说明取舍。
207
204
 
208
- 所有展示型页面都按当前项目 `design.md` 的页面八项要点与共享规则实现。若只有业务区块和视觉形容词,没有实际布局、表面、组件和响应式决定,先补设计源事实:
209
-
210
- 1. 按当前页正文中的布局安排放置真实 `contentBlocks`,不从主题示例补造业务内容。
211
- 2. 按表面与组件说明选择开放区、连续行、表格或必要容器,并引用对应共享组件 anchor。
212
- 3. 用主题 token 与明确的局部数值实现间距、圆角和层次,保持首屏焦点与内容主次。
213
- 4. 按主操作、状态与响应式说明实现动作、反馈、恢复入口及窄屏重排。
214
- 5. 将实际页面八项验收逐条对应源码和截图;实现偏差局部修正,设计事实变化先更新源事实。
205
+ 所有展示型页面都按当前项目 `design.md` 的 `visualScaffold` 实现。若 PRD 只有业务区块、design.md 只有视觉形容词,没有明确 `layoutRecipe` / `surfaceMap` / `componentRecipe`,先回到 `prd/<项目名>/design.md` 补齐:
215
206
 
216
- 整页刷新时,表格加载遮罩可能因 `transition: all` 遇到延迟加载的基础样式而闪出黑边。标准 Provider 已将遮罩边框固定为零,只保留透明度过渡;保留内置 style,旧页面按 [主题接入步骤](canvas-theme-provider.md) 更新 Provider 并重新发布,不通过修改主题色或全局清除边框处理。
207
+ 1. 先把 `contentBlocks` 映射到 `layoutRecipe` 的槽位。
208
+ 2. 按 `surfaceMap` 决定无框区、细线面板、浅底条、列表行、表格、右侧栏或抽屉,不能把所有区块都做成卡片。
209
+ 3. 按 `sectionRhythm` 排序和控制间距,保证首屏有主次和至少两层信息。
210
+ 4. 按 `roundedRule`、`densityRule` 和 `breathingRule` 写圆角、padding、gap、跨区块间距、列表行高、状态摘要高度、空态高度和贴边修正。
211
+ 5. 按 `componentRecipe` 统一按钮、入口、标签、图标、列表、图表和空态。
212
+ 6. 按源码 primitive 写组件:外层壳、首屏最大视觉锚点、状态摘要、动作条、主要内容、右侧上下文、状态处理和响应式规则都要落成真实 JSX/CSS。
213
+ 7. 写完源码后逐条核对 `acceptanceChecks`,不通过就继续 patch。
217
214
 
218
- 其他控件默认保留组件库样式,仅在实际受到宿主样式干扰时修正:需要局部浮层样式时,通过 `CanvasThemeProvider.getPopupContainer` 选择不会裁剪弹层的容器,`OPENYIDA_CANVAS_CONTROL_CSS` 统一输入框、下拉、日期、运行态字段组件的 hover / focus / dropdown 样式。控件焦点边框或下拉浮层不符合设计时,先检查主题与挂载位置,再按样式指南局部调整,保留可见的键盘焦点。
215
+ 控件默认保留组件库样式,仅在实际受到宿主样式干扰时修正:需要局部浮层样式时,通过 `CanvasThemeProvider.getPopupContainer` 选择不会裁剪弹层的容器,`OPENYIDA_CANVAS_CONTROL_CSS` 统一输入框、下拉、日期、运行态字段组件的 hover / focus / dropdown 样式。出现黑色粗边、浏览器原生 outline、下拉浮层脱离页面风格时,先检查主题与挂载位置,再按样式指南增加局部 reset。