cabloy 5.1.61 → 5.1.63

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 (230) hide show
  1. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  2. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
  3. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  4. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
  5. package/CHANGELOG.md +55 -0
  6. package/CLAUDE.md +1 -0
  7. package/cabloy-docs/.vitepress/config.mjs +158 -12
  8. package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
  9. package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
  10. package/cabloy-docs/ai/skills.md +1 -0
  11. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  12. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  13. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  14. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  15. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  16. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  17. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  18. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  19. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  20. package/cabloy-docs/backend/cli.md +20 -11
  21. package/cabloy-docs/backend/config-guide.md +4 -4
  22. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  23. package/cabloy-docs/backend/controller-guide.md +12 -2
  24. package/cabloy-docs/backend/crud-workflow.md +7 -3
  25. package/cabloy-docs/backend/dto-guide.md +12 -2
  26. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  27. package/cabloy-docs/backend/election-guide.md +2 -2
  28. package/cabloy-docs/backend/entity-guide.md +12 -3
  29. package/cabloy-docs/backend/error-guide.md +3 -3
  30. package/cabloy-docs/backend/event-guide.md +4 -4
  31. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  32. package/cabloy-docs/backend/field-indexes.md +9 -3
  33. package/cabloy-docs/backend/foundation.md +8 -8
  34. package/cabloy-docs/backend/i18n-guide.md +6 -6
  35. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  36. package/cabloy-docs/backend/introduction.md +13 -0
  37. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  38. package/cabloy-docs/backend/model-guide.md +16 -6
  39. package/cabloy-docs/backend/openapi-guide.md +3 -0
  40. package/cabloy-docs/backend/queue-guide.md +3 -3
  41. package/cabloy-docs/backend/redlock-guide.md +2 -2
  42. package/cabloy-docs/backend/schedule-guide.md +2 -2
  43. package/cabloy-docs/backend/scripts.md +8 -0
  44. package/cabloy-docs/backend/serialization-guide.md +2 -2
  45. package/cabloy-docs/backend/service-guide.md +18 -9
  46. package/cabloy-docs/backend/startup-guide.md +5 -5
  47. package/cabloy-docs/backend/status-guide.md +7 -7
  48. package/cabloy-docs/backend/unit-testing.md +3 -3
  49. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  50. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  51. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  52. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  53. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  54. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  55. package/cabloy-docs/frontend/api-guide.md +4 -4
  56. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  57. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  58. package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
  59. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  60. package/cabloy-docs/frontend/cli.md +5 -5
  61. package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
  62. package/cabloy-docs/frontend/component-guide.md +5 -5
  63. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  64. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  65. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  66. package/cabloy-docs/frontend/form-guide.md +27 -30
  67. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  68. package/cabloy-docs/frontend/foundation.md +10 -6
  69. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  70. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  71. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  72. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  73. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  74. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  75. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  76. package/cabloy-docs/frontend/introduction.md +29 -7
  77. package/cabloy-docs/frontend/model-architecture.md +38 -2
  78. package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
  79. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  80. package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
  81. package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
  82. package/cabloy-docs/frontend/model-state-guide.md +12 -9
  83. package/cabloy-docs/frontend/module-scope.md +8 -8
  84. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  85. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  86. package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
  87. package/cabloy-docs/frontend/page-guide.md +9 -9
  88. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  89. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  90. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  91. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  92. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  93. package/cabloy-docs/frontend/quickstart.md +14 -2
  94. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  95. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  96. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  97. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  98. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  99. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  100. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  101. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  102. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  103. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  104. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  105. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  106. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  107. package/cabloy-docs/frontend/server-data.md +2 -1
  108. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  109. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  110. package/cabloy-docs/frontend/table-cell-cookbook.md +571 -0
  111. package/cabloy-docs/frontend/table-guide.md +373 -0
  112. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  113. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  114. package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
  115. package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
  116. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  117. package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
  118. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  119. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  120. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  121. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  122. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  123. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  124. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  125. package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
  126. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  127. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
  128. package/cabloy-docs/fullstack/introduction.md +3 -0
  129. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
  130. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  131. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  132. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  133. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
  134. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
  135. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
  136. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
  137. package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
  138. package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
  139. package/cabloy-docs/reference/package-map.md +4 -3
  140. package/package.json +1 -1
  141. package/vona/pnpm-lock.yaml +22 -258
  142. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  143. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  144. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  145. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  146. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  147. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  148. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  149. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  150. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  151. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  152. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  153. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  154. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  155. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  156. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  157. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  158. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  159. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  160. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  161. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  162. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  163. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  164. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  165. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  166. package/vona/src/suite/a-training/package.json +12 -0
  167. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  168. package/vona/src/suite/a-training/tsconfig.json +10 -0
  169. package/zova/packages-zova/zova/package.json +2 -2
  170. package/zova/pnpm-lock.yaml +423 -682
  171. package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolOne/render.tsx +5 -3
  172. package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +5 -3
  173. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  174. package/zova/src/suite/a-training/modules/training-student/package.json +57 -0
  175. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  176. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  177. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  178. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  179. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  180. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  181. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  182. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  183. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  184. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  185. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +53 -0
  186. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  187. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  188. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  189. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  190. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  191. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  192. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  193. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  194. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  195. package/zova/src/suite/a-training/package.json +12 -0
  196. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  197. package/zova/src/suite/a-training/tsconfig.json +4 -0
  198. package/zova/src/suite/cabloy-basic/modules/basic-app/package.json +60 -0
  199. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +137 -0
  200. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/locales.ts +7 -0
  201. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/this.ts +2 -0
  202. package/zova/src/suite/cabloy-basic/modules/basic-app/src/bean/behavior.appModal.tsx +260 -0
  203. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/config.ts +39 -0
  204. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/en-us.ts +7 -0
  205. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/zh-cn.ts +7 -0
  206. package/zova/src/suite/cabloy-basic/modules/basic-app/src/index.ts +4 -0
  207. package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/appModalItem.ts +16 -0
  208. package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/index.ts +1 -0
  209. package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkey.ts +38 -0
  210. package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkeySys.ts +14 -0
  211. package/zova/src/suite/cabloy-basic/modules/basic-app/src/service/appModal.ts +89 -0
  212. package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/appModal.ts +52 -0
  213. package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/index.ts +1 -0
  214. package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.build.json +13 -0
  215. package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.json +5 -0
  216. package/zova/src/suite/cabloy-basic/modules/basic-commands/package.json +6 -1
  217. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +16 -0
  218. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.alert.tsx +8 -14
  219. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.confirm.tsx +10 -7
  220. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.prompt.tsx +30 -0
  221. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx +5 -3
  222. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  223. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  224. package/zova/src/suite/cabloy-basic/modules/basic-table/package.json +6 -1
  225. package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionDelete.tsx +4 -2
  226. package/zova/src/suite/cabloy-basic/package.json +1 -0
  227. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  228. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  229. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  230. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,450 @@
1
+ # Router View Hosts Guide
2
+
3
+ This guide explains how router-view hosts work in Zova within the Cabloy monorepo.
4
+
5
+ Use this page after [Page Route Guide](/frontend/page-route-guide), [A-Router Guide](/frontend/a-router-guide), and [Zova Router Under the Hood](/frontend/zova-router-under-the-hood) when your next question is no longer “how is the route registered?” but “which routed host actually owns the page instance, keep-alive behavior, and workspace model?”.
6
+
7
+ Read this page together with:
8
+
9
+ - [Page Route Guide](/frontend/page-route-guide)
10
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
11
+ - [Router Tabs Introduction](/frontend/router-tabs-introduction)
12
+ - [Router Tabs vs Stack](/frontend/router-tabs-vs-stack)
13
+ - [Router Stack Guide](/frontend/router-stack-guide)
14
+ - [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
15
+ - [Page Meta Guide](/frontend/page-meta-guide)
16
+ - [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)
17
+ - [Zova Source Reading Map](/frontend/zova-source-reading-map)
18
+
19
+ If you reached this page from the routing branch of [Zova Source Reading Map](/frontend/zova-source-reading-map), this is the next step after route registration and controller route-state injection.
20
+
21
+ > [!TIP]
22
+ > **Router ecosystem docs path**
23
+ >
24
+ > 1. **[Page Route Guide](/frontend/page-route-guide)** — learn the public route-record and layout surface
25
+ > 2. **[A-Router Guide](/frontend/a-router-guide)** — learn what the `a-router` package owns in the runtime
26
+ > 3. **[Zova Router Under the Hood](/frontend/zova-router-under-the-hood)** — learn how the core router runtime cooperates
27
+ > 4. **[Router View Hosts Guide](/frontend/router-view-hosts-guide)** — learn how routed pages are actually hosted
28
+ > 5. **[Router Tabs Overview](/frontend/router-tabs-overview)** — learn the business/workbench meaning of router tabs
29
+ > 6. **[Router Tabs Mechanism](/frontend/router-tabs-mechanism)** — learn the shared tabs model in code
30
+ > 7. **[Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)** — learn how the current Basic layouts turn the shared model into a visible shell
31
+ > 8. **[Zova Source Reading Map](/frontend/zova-source-reading-map)** — learn which files to read next
32
+ >
33
+ > **You are here:** step 4.
34
+ > **Previous pages:** [Page Route Guide](/frontend/page-route-guide), [A-Router Guide](/frontend/a-router-guide), and [Zova Router Under the Hood](/frontend/zova-router-under-the-hood).
35
+ > **Next recommended pages:** [Router Tabs Overview](/frontend/router-tabs-overview), [Router Tabs Mechanism](/frontend/router-tabs-mechanism), [Page Meta Guide](/frontend/page-meta-guide), and [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration).
36
+
37
+ ## Why this page exists
38
+
39
+ After contributors understand route records, guards, aliases, and typed params/query, the next practical question is usually about the routed host itself.
40
+
41
+ Typical follow-up questions are:
42
+
43
+ - why does one routed page behave like a plain shell page while another behaves like a workbench tab?
44
+ - where does keep-alive inclusion come from?
45
+ - where do `tabKey`, `componentKey`, and page-level task state actually attach?
46
+ - what is the difference among `routerViewEmpty`, `routerViewTabs`, and `routerViewStack`?
47
+
48
+ This page answers those questions.
49
+
50
+ ## The shortest accurate mental model
51
+
52
+ The shortest accurate model is:
53
+
54
+ 1. `a-router` resolves the target route
55
+ 2. the routed page enters a router-view host, not only a bare Vue Router outlet
56
+ 3. the host decides whether the route is treated as plain output, a workbench tab, or a stack item
57
+ 4. the host computes routed identity such as `tabKey`, `componentKey`, and keep-alive participation
58
+ 5. the shared router bean calls host callbacks on forward/back navigation and page-meta updates
59
+ 6. the active layout chooses which host component to render
60
+
61
+ That is why routed-page behavior in Zova is not only a route-record concern. It is also a host-selection concern.
62
+
63
+ ## The public host entrypoints
64
+
65
+ The public wrapper components are:
66
+
67
+ - `ZRouterViewEmpty`
68
+ - `ZRouterViewTabs`
69
+ - `ZRouterViewStack`
70
+
71
+ Representative wrapper sources:
72
+
73
+ - `zova/src/suite-vendor/a-zova/modules/a-router/src/.metadata/component/routerViewEmpty.ts`
74
+ - `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/.metadata/component/routerViewTabs.ts`
75
+ - `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/.metadata/component/routerViewStack.ts`
76
+
77
+ These wrapper files matter for two reasons:
78
+
79
+ - they show that router-view hosts still enter the runtime through the normal `useController(...)` wrapper path
80
+ - they confirm that `controllerRef` exposes the controller instance of the host, not a generic DOM ref
81
+
82
+ So even at the routed-host level, Zova keeps the same controller-oriented component model.
83
+
84
+ ## The shared contract: `BeanRouterViewBase`
85
+
86
+ The shared base host lives in:
87
+
88
+ ```text
89
+ zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerViewBase.tsx
90
+ ```
91
+
92
+ This is the core host contract for richer routed shells.
93
+
94
+ Its main responsibilities are:
95
+
96
+ - register itself on the bean host as `$$routerView`
97
+ - register and deregister itself with `$router`
98
+ - expose host callbacks for forward-route and back-route handling
99
+ - expose `setPageMeta(...)` for task-level page metadata updates
100
+ - wrap routed pages in `RouterView`
101
+ - wrap routed pages in `KeepAlive`
102
+ - set vnode `key` from the host-computed route meta
103
+ - inject the current page route into the routed vnode through host providers
104
+
105
+ A practical reading takeaway is:
106
+
107
+ - **a routed page enters a host controller first, then the host decides how the page instance participates in the shell**
108
+
109
+ ## The route-meta contract for hosts
110
+
111
+ The shared host-level route-meta types live in:
112
+
113
+ ```text
114
+ zova/src/suite-vendor/a-zova/modules/a-router/src/types/routerView.ts
115
+ ```
116
+
117
+ The important records are:
118
+
119
+ - `IRouteViewRouteItem`
120
+ - `IRouteViewRouteMeta`
121
+
122
+ A compact interpretation is:
123
+
124
+ - `tabKey` = the host-level grouping identity
125
+ - `componentKey` = the page-instance identity
126
+ - `fullPath` = the concrete route visit
127
+ - `keepAlive` = whether that routed instance should participate in host keep-alive inclusion
128
+
129
+ This is the point where route state becomes host state.
130
+
131
+ ## Host 1: `routerViewEmpty`
132
+
133
+ The minimal host controller lives in:
134
+
135
+ ```text
136
+ zova/src/suite-vendor/a-zova/modules/a-router/src/component/routerViewEmpty/controller.tsx
137
+ ```
138
+
139
+ ### Zova-native role
140
+
141
+ `routerViewEmpty` is the minimal routed host.
142
+
143
+ It is for cases where the page should render directly without the richer tab/workspace model.
144
+
145
+ ### Source-confirmed runtime behavior
146
+
147
+ This host overrides `render()` instead of using the base `BeanRouterViewBase.render()` pipeline.
148
+
149
+ That means it:
150
+
151
+ - renders a plain `RouterView`
152
+ - creates the routed vnode directly from `component.Component`
153
+ - injects the current page route provider
154
+ - does **not** use the base keep-alive inclusion flow
155
+ - does **not** ask a host model to compute `tabKey` or `componentKey`
156
+
157
+ A practical reading takeaway is:
158
+
159
+ - **`routerViewEmpty` is the lowest-friction routed host and the closest thing to a shell-minimal route outlet in Zova**
160
+
161
+ ## Host 2: `routerViewTabs`
162
+
163
+ The tabs host controller lives in:
164
+
165
+ ```text
166
+ zova/src/suite-vendor/a-zova/modules/a-routertabs/src/component/routerViewTabs/controller.tsx
167
+ ```
168
+
169
+ Its shared model lives in:
170
+
171
+ ```text
172
+ zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts
173
+ ```
174
+
175
+ ### Zova-native role
176
+
177
+ `routerViewTabs` is the routed host for the workbench-style tabs model.
178
+
179
+ It does not invent a second routing system.
180
+
181
+ Instead it reinterprets normal route visits as:
182
+
183
+ - stable level-1 workspaces through `tabKey`
184
+ - level-2 routed page instances through `componentKey`
185
+ - task-level page presentation through `pageMeta`
186
+ - keep-alive participation through the tabs model
187
+
188
+ ### Source-confirmed runtime behavior
189
+
190
+ The controller itself is intentionally thin.
191
+
192
+ It delegates these responsibilities to `ModelTabs`:
193
+
194
+ - `backRoute(...)`
195
+ - `forwardRoute(...)`
196
+ - `setPageMeta(...)`
197
+ - `prepareRouteMeta(...)`
198
+ - `keepAliveInclude`
199
+
200
+ That means the tabs host is really the shell-facing controller surface for the model, while `ModelTabs` is the real state owner.
201
+
202
+ ### What `ModelTabs` actually owns
203
+
204
+ Inside `ModelTabs`, the main responsibilities are:
205
+
206
+ - keep the `tabs` array as the workbench-state owner
207
+ - track `tabKeyCurrent` and `componentKeyCurrent`
208
+ - compute `tabCurrent` and `tabCurrentIndex`
209
+ - compute `keepAliveInclude`
210
+ - load cached tab state when enabled
211
+ - add, update, activate, prune, and delete tabs and tab items
212
+ - update task-level `pageMeta`
213
+ - derive route-level host metadata from route meta and route identity
214
+
215
+ This is the main source-level fact about `a-routertabs`:
216
+
217
+ - **the workbench model is implemented as a model bean, not as ad hoc layout-local state**
218
+
219
+ ### How route identity becomes workbench identity
220
+
221
+ `ModelTabs.prepareRouteMeta(route)` does four important things:
222
+
223
+ 1. keeps `fullPath`
224
+ 2. computes `componentKey`
225
+ 3. computes `tabKey`
226
+ 4. computes `keepAlive`
227
+
228
+ The key rules are:
229
+
230
+ - explicit `meta.componentKey` has highest priority
231
+ - otherwise a named route with `componentKeyMode: 'nameOnly'` reuses the route name
232
+ - otherwise the route path becomes the effective page-instance identity
233
+ - explicit `meta.tabKey` groups several route visits into one workspace
234
+ - if `meta.tabKey` is absent, the model falls back to `componentKey`
235
+
236
+ That is why [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook) is really a host-behavior document as much as a route-meta document.
237
+
238
+ ### Why page metadata matters here
239
+
240
+ `ModelTabs.updateTabItemPageMeta(...)` stores page-level task state such as:
241
+
242
+ - `pageTitle`
243
+ - `pageDirty`
244
+ - `formMeta`
245
+
246
+ This is how task-level routed state becomes visible in workbench UI.
247
+
248
+ In the current Basic source, the Admin layout uses this for task-row icon and title behavior such as dirty state and create/edit indicators.
249
+
250
+ ### Current Cabloy Basic consumers
251
+
252
+ In the current public Cabloy Basic source, `routerViewTabs` is the actively used richer routed host.
253
+
254
+ Representative consumers:
255
+
256
+ - `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/controller.tsx`
257
+ - `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.tabs.tsx`
258
+ - `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx`
259
+ - `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tabs.tsx`
260
+
261
+ The source-confirmed split is:
262
+
263
+ - Admin renders the two-level workbench meaning directly
264
+ - Web reuses the same `ModelTabs` state but presents the top level as a menu-like workspace surface
265
+
266
+ ### Config-sensitive differences in current Basic source
267
+
268
+ Representative config sources:
269
+
270
+ - `zova/src/suite/a-home/modules/home-layoutadmin/src/config/config.ts`
271
+ - `zova/src/suite/a-home/modules/home-layoutweb/src/config/config.ts`
272
+
273
+ In the current Basic source:
274
+
275
+ - Admin uses `scene: ''`, `max: 6`, `maxItems: 3`, `cache: true`
276
+ - Web uses `scene: 'web'`, `max: 6`, `maxItems: 6`, `cache: false`
277
+
278
+ That means the shared tabs model is stable, but the layout can still choose different cache and density behavior.
279
+
280
+ ## Host 3: `routerViewStack`
281
+
282
+ The stack host controller lives in:
283
+
284
+ ```text
285
+ zova/src/suite-vendor/a-zova/modules/a-routerstack/src/component/routerViewStack/controller.tsx
286
+ ```
287
+
288
+ Its shared model lives in:
289
+
290
+ ```text
291
+ zova/src/suite-vendor/a-zova/modules/a-routerstack/src/model/stack.ts
292
+ ```
293
+
294
+ ### Zova-native role
295
+
296
+ `routerViewStack` is the minimal richer host for stack-style routed caching.
297
+
298
+ Unlike `routerViewTabs`, it does not model a stable business workspace plus nested work items.
299
+
300
+ Instead it treats routed visits as a linear stack of page instances.
301
+
302
+ ### Source-confirmed runtime behavior
303
+
304
+ The controller mirrors the tabs host shape, but with a smaller contract:
305
+
306
+ - `backRoute(...)` delegates to `ModelStack.backRoute(...)`
307
+ - `forwardRoute(...)` delegates to `ModelStack.forwardRoute(...)`
308
+ - `prepareRouteMeta(...)` delegates to `ModelStack.prepareRouteMeta(...)`
309
+ - `getKeepAliveInclude()` delegates to `ModelStack.keepAliveInclude`
310
+
311
+ There is no `setPageMeta(...)` override here.
312
+
313
+ That is an important difference from `routerViewTabs`.
314
+
315
+ ### What `ModelStack` actually owns
316
+
317
+ Inside `ModelStack`, the main responsibilities are:
318
+
319
+ - keep the `tabs` array as a linear stack of routed instances
320
+ - compute `keepAliveInclude`
321
+ - add, update, delete, and prune stack items by recency
322
+ - map both `tabKey` and `componentKey` to `route.fullPath`
323
+
324
+ The crucial identity rule is:
325
+
326
+ ```typescript
327
+ return { tabKey: fullPath, componentKey: fullPath, fullPath };
328
+ ```
329
+
330
+ That means:
331
+
332
+ - each concrete route visit is its own stack item
333
+ - there is no level-1 workspace grouping
334
+ - there is no separate task-level page-meta model
335
+ - the host behaves more like a bounded stack of routed instances than a business workbench
336
+
337
+ ### Practical interpretation
338
+
339
+ `routerViewStack` is useful when you want:
340
+
341
+ - routed keep-alive behavior
342
+ - per-visit identity
343
+ - simple pruning by recency
344
+ - no extra workbench grouping semantics
345
+
346
+ A practical reading takeaway is:
347
+
348
+ - **`a-routerstack` is a host-level cache/stack primitive, not a tabs/workspace mechanism**
349
+
350
+ If your next question is specifically about how a page author should update task-level title, dirty state, or form scene through `$router.setPageMeta(...)`, continue with [Page Meta Guide](/frontend/page-meta-guide).
351
+
352
+ ### Current usage boundary in Cabloy Basic
353
+
354
+ In the current public Cabloy Basic source, there is no app-level layout consumer of `ZRouterViewStack` outside the vendor module itself.
355
+
356
+ That means the stack host is present as a reusable framework primitive, but the current public Basic layouts visibly consume `routerViewTabs` rather than `routerViewStack`.
357
+
358
+ This is a source-confirmed statement based on the current repo search surface, not a guarantee about all future editions or downstream apps.
359
+
360
+ ## Empty vs tabs vs stack
361
+
362
+ A useful routing-host comparison is:
363
+
364
+ | Host | Main role | Identity model | Page-meta support | Current Basic consumer shape |
365
+ | ----------------- | ----------------------------- | ------------------------- | ---------------------------- | ------------------------------------------------------------ |
366
+ | `routerViewEmpty` | minimal routed host | no richer host model | no host-level page-meta flow | empty/minimal shell routing |
367
+ | `routerViewTabs` | workbench host | `tabKey` + `componentKey` | yes | Admin and Web layouts |
368
+ | `routerViewStack` | stack-style routed cache host | `fullPath` only | no | framework primitive, no current public Basic layout consumer |
369
+
370
+ ## How to choose the right mental model while reading source
371
+
372
+ Use these questions first:
373
+
374
+ ### When the page feels shell-minimal
375
+
376
+ Start with `routerViewEmpty`.
377
+
378
+ Ask:
379
+
380
+ - does this route only need plain routed output?
381
+ - is keep-alive or workspace state intentionally absent?
382
+
383
+ ### When the page feels like part of a workbench
384
+
385
+ Start with `routerViewTabs` and `ModelTabs`.
386
+
387
+ Ask:
388
+
389
+ - does this route need stable workspace grouping?
390
+ - does it need several inner work items?
391
+ - does page-level dirty/title/form state matter visibly?
392
+
393
+ ### When the page feels like a linear routed cache
394
+
395
+ Start with `routerViewStack` and `ModelStack`.
396
+
397
+ Ask:
398
+
399
+ - does each route visit stand alone?
400
+ - is fullPath-level identity enough?
401
+ - do I want pruning and keep-alive without the two-level workspace model?
402
+
403
+ ## Suggested source-reading path
404
+
405
+ When the question is specifically about routed hosts, read these files in order:
406
+
407
+ 1. `zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerViewBase.tsx`
408
+ 2. `zova/src/suite-vendor/a-zova/modules/a-router/src/component/routerViewEmpty/controller.tsx`
409
+ 3. `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/component/routerViewTabs/controller.tsx`
410
+ 4. `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts`
411
+ 5. `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/component/routerViewStack/controller.tsx`
412
+ 6. `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/model/stack.ts`
413
+ 7. the active layout controller/render pair that consumes the host you care about
414
+
415
+ In the current Basic source, the most important app-level consumers are:
416
+
417
+ - `home-layoutadmin`
418
+ - `home-layoutweb`
419
+
420
+ ## Common mistakes to avoid
421
+
422
+ ### Mistake 1: treating `RouterView` as the whole routed contract
423
+
424
+ In Zova, the routed host can add keep-alive, grouping, task-state, and shell-specific behavior on top of route matching.
425
+
426
+ ### Mistake 2: assuming router tabs are only a UI widget
427
+
428
+ In Zova, `a-routertabs` is a routed host plus a shared workbench-state model.
429
+
430
+ ### Mistake 3: assuming `a-routerstack` is just a smaller copy of `a-routertabs`
431
+
432
+ It is not.
433
+
434
+ `a-routerstack` uses a different identity model and does not carry the same page-meta and workspace semantics.
435
+
436
+ ### Mistake 4: assuming current Basic layout usage defines the full framework contract
437
+
438
+ Current Basic source confirms active consumers for `routerViewTabs`, but `routerViewStack` still exists as a reusable framework host primitive even when the current public layouts do not use it.
439
+
440
+ ## Edition note
441
+
442
+ This guide describes the shared routed-host architecture and the current public Cabloy Basic source.
443
+
444
+ That means the host contract is not limited to one visible Admin tab row. However, layout-level presentation and actual host selection can still vary by edition, flavor, or downstream app.
445
+
446
+ ## Final takeaway
447
+
448
+ If [Zova Router Under the Hood](/frontend/zova-router-under-the-hood) explains how a route becomes routable, this page explains how that routed page is actually hosted after route resolution.
449
+
450
+ That host layer is where Zova distinguishes among plain routed output, workbench tabs, and stack-style routed caching.
@@ -58,7 +58,8 @@ A practical contract-consumption reading is:
58
58
 
59
59
  - [OpenAPI Guide](/backend/openapi-guide) explains backend contract emission
60
60
  - [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk) explains the fullstack contract bridge
61
- - [OpenAPI SDK Guide](/frontend/openapi-sdk-guide), [API Schema Guide](/frontend/api-schema-guide), and [SDK Guide](/frontend/sdk-guide) explain different frontend consumption layers
61
+ - [OpenAPI SDK Guide](/frontend/openapi-sdk-guide), [Generated Contract Consumption Specimen](/frontend/generated-contract-consumption-specimen), [API Schema Guide](/frontend/api-schema-guide), and [SDK Guide](/frontend/sdk-guide) explain different frontend consumption layers
62
+ - [A-OpenAPI Under the Hood](/frontend/a-openapi-under-the-hood) explains the lower-level runtime behind `$sdk`, bootstrap, permissions, and schema extraction
62
63
 
63
64
  ## Implementation checks for frontend data-loading changes
64
65
 
@@ -64,7 +64,7 @@ A module can provide system-level main lifecycle entrypoints.
64
64
  Representative creation command:
65
65
 
66
66
  ```bash
67
- npm run zova :init:mainSys demo-student
67
+ npm run zova :init:mainSys training-student
68
68
  ```
69
69
 
70
70
  Representative pattern:
@@ -84,7 +84,7 @@ A module can also attach richer system lifecycle behavior through monkey-based h
84
84
  Representative creation command:
85
85
 
86
86
  ```bash
87
- npm run zova :init:monkeySys demo-student
87
+ npm run zova :init:monkeySys training-student
88
88
  ```
89
89
 
90
90
  Representative pattern: