cabloy 5.1.59 → 5.1.60

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 (102) hide show
  1. package/.claude/skills/cabloy-contract-loop/SKILL.md +16 -0
  2. package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +26 -0
  3. package/.claude/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +144 -0
  4. package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +18 -0
  5. package/.claude/skills/cabloy-resource-field-update/SKILL.md +267 -0
  6. package/.claude/skills/cabloy-resource-field-update/evals/evals.json +53 -0
  7. package/.claude/skills/cabloy-resource-field-update/references/custom-renderer-demo-checklist.md +102 -0
  8. package/.claude/skills/cabloy-resource-field-update/references/field-update-decision-tree.md +120 -0
  9. package/.claude/skills/cabloy-resource-field-update/references/follow-up-checklist.md +80 -0
  10. package/.claude/skills/cabloy-resource-field-update/references/verification-checklist.md +97 -0
  11. package/.github/workflows/docs-pages.yml +2 -0
  12. package/.github/workflows/vona-cov-pg.yml +2 -0
  13. package/.github/workflows/vona-test-crud.yml +4 -2
  14. package/.github/workflows/vona-test-mysql.yml +2 -0
  15. package/.github/workflows/vona-test-pg.yml +2 -0
  16. package/.github/workflows/vona-test-sqlite3.yml +2 -0
  17. package/.github/workflows/vona-tsc.yml +2 -0
  18. package/.github/workflows/zova-ui.yml +2 -0
  19. package/.gitignore +0 -4
  20. package/CHANGELOG.md +30 -0
  21. package/CLAUDE.md +2 -0
  22. package/README.md +15 -0
  23. package/cabloy-docs/.vitepress/config.mjs +43 -0
  24. package/cabloy-docs/ai/class-placement-rule.md +2 -0
  25. package/cabloy-docs/ai/cli-to-skill-map.md +7 -0
  26. package/cabloy-docs/ai/future-skill-roadmap.md +17 -2
  27. package/cabloy-docs/backend/bean-scene-authoring.md +350 -0
  28. package/cabloy-docs/backend/cli.md +26 -1
  29. package/cabloy-docs/backend/foundation.md +28 -3
  30. package/cabloy-docs/backend/introduction.md +8 -0
  31. package/cabloy-docs/backend/service-guide.md +2 -0
  32. package/cabloy-docs/backend/websocket-call-flow.md +435 -0
  33. package/cabloy-docs/backend/websocket-guide.md +455 -0
  34. package/cabloy-docs/backend/websocket-protocol-guide.md +381 -0
  35. package/cabloy-docs/backend/websocket-usage-guide.md +356 -0
  36. package/cabloy-docs/frontend/bean-scene-authoring.md +372 -0
  37. package/cabloy-docs/frontend/behavior-guide.md +449 -0
  38. package/cabloy-docs/frontend/cli.md +12 -0
  39. package/cabloy-docs/frontend/introduction.md +5 -0
  40. package/cabloy-docs/frontend/ioc-and-beans.md +10 -9
  41. package/cabloy-docs/frontend/router-tabs-admin-web-comparison.md +206 -0
  42. package/cabloy-docs/frontend/router-tabs-introduction.md +106 -0
  43. package/cabloy-docs/frontend/router-tabs-mechanism.md +469 -0
  44. package/cabloy-docs/frontend/router-tabs-overview.md +227 -0
  45. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +343 -0
  46. package/cabloy-docs/frontend/ssr-architecture-overview.md +211 -0
  47. package/cabloy-docs/frontend/ssr-build-deploy-guide.md +308 -0
  48. package/cabloy-docs/frontend/ssr-review-checklist.md +184 -0
  49. package/cabloy-docs/frontend/ssr-troubleshooting-guide.md +301 -0
  50. package/cabloy-docs/fullstack/framework-performance.md +3 -3
  51. package/cabloy-docs/fullstack/introduction.md +29 -0
  52. package/cabloy-docs/fullstack/quickstart.md +7 -1
  53. package/cabloy-docs/fullstack/tutorial-1-first-module.md +111 -0
  54. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +122 -0
  55. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +131 -0
  56. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +119 -0
  57. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +144 -0
  58. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +168 -0
  59. package/cabloy-docs/fullstack/tutorials-overview.md +179 -0
  60. package/cabloy-docs/index.md +4 -3
  61. package/cabloy-docs/reference/bean-scene-boilerplates.md +73 -0
  62. package/cabloy-docs/reference/cli-reference.md +2 -0
  63. package/package.json +6 -2
  64. package/scripts/init.ts +18 -2
  65. package/vona/packages-cli/cabloy-cli/package.json +2 -2
  66. package/vona/packages-cli/cli/package.json +1 -1
  67. package/vona/packages-cli/cli-set-api/package.json +1 -1
  68. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.create.module.ts +4 -0
  69. package/vona/packages-vona/vona/package.json +1 -1
  70. package/vona/pnpm-lock.yaml +133 -1088
  71. package/vona/pnpm-workspace.yaml +0 -1
  72. package/vona/src/suite-vendor/a-vona/modules/a-core/assets/static/img/vona.svg +1 -1
  73. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  74. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +1 -1
  75. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +1 -1
  76. package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +2 -2
  77. package/vona/src/suite-vendor/a-vona/package.json +1 -1
  78. package/zova/package.original.json +1 -1
  79. package/zova/packages-cli/cli/package.json +3 -3
  80. package/zova/packages-cli/cli-set-front/cli/templates/init/icon/boilerplate/icons/default/zova.svg +1 -1
  81. package/zova/packages-cli/cli-set-front/package.json +3 -3
  82. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.create.module.ts +4 -0
  83. package/zova/packages-cli/cli-set-front/src/lib/command/create.bean.ts +5 -1
  84. package/zova/packages-utils/zova-vite/package.json +2 -2
  85. package/zova/packages-zova/zova/package.json +2 -2
  86. package/zova/pnpm-lock.yaml +284 -1313
  87. package/zova/pnpm-workspace.yaml +0 -1
  88. package/zova/src/suite/a-home/modules/home-icon/icons/social/cabloy.svg +1 -1
  89. package/zova/src/suite/a-home/modules/home-icon/icons/social/vona.svg +1 -1
  90. package/zova/src/suite/a-home/modules/home-icon/icons/social/zova.svg +1 -1
  91. package/zova/src/suite/a-home/modules/home-icon/src/.metadata/icons/groups/social.svg +3 -3
  92. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +9 -0
  93. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
  94. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +66 -16
  95. package/zova/src/suite-vendor/a-cabloy/package.json +2 -2
  96. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
  97. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts +60 -18
  98. package/zova/src/suite-vendor/a-zova/modules/a-table/cli/tableActionRow/boilerplate/{{sceneName}}.{{beanName}}.tsx_ +6 -1
  99. package/zova/src/suite-vendor/a-zova/modules/a-table/cli/tableCell/boilerplate/{{sceneName}}.{{beanName}}.tsx_ +6 -1
  100. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  101. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  102. package/zova/src/suite-vendor/a-zova/package.json +4 -4
@@ -0,0 +1,206 @@
1
+ # Router Tabs Admin and Web Comparison
2
+
3
+ This guide compares how the router-tabs mechanism appears in the Admin and Web layouts in Zova within the Cabloy monorepo.
4
+
5
+ Read this together with:
6
+
7
+ - [Router Tabs Introduction](/frontend/router-tabs-introduction)
8
+ - [Router Tabs Overview](/frontend/router-tabs-overview)
9
+ - [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
10
+ - [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook)
11
+
12
+ ## Why this comparison matters
13
+
14
+ The current Cabloy Basic frontend source uses one shared router-tabs state model in more than one layout.
15
+
16
+ That means future contributors should not assume that the mechanism is identical to one specific tab-row UI.
17
+
18
+ The shared contract is the workbench-state and route-grouping model. The visible layout expression can vary.
19
+
20
+ ## The shared foundation
21
+
22
+ Both layouts reuse the same router-tabs model.
23
+
24
+ They both depend on the same ideas:
25
+
26
+ - `tabKey` as the level-1 workspace grouping identity
27
+ - `componentKey` as the page-instance identity
28
+ - tab activation through router navigation
29
+ - keep-alive integration through the router-tabs controller
30
+ - cache, pruning, and item-state behavior in the shared model
31
+
32
+ Representative shared implementation:
33
+
34
+ - `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts`
35
+ - `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/component/routerViewTabs/controller.tsx`
36
+
37
+ ## The main difference in one sentence
38
+
39
+ The Admin layout shows the workbench model as an explicit two-level tab UI, while the Web layout uses the same underlying state model but presents the top-level workspaces through a horizontal menu-like surface.
40
+
41
+ ## Admin layout view
42
+
43
+ Representative sources:
44
+
45
+ - `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/controller.tsx`
46
+ - `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.tabs.tsx`
47
+
48
+ ### What users see
49
+
50
+ In the Admin layout, users can see the two levels directly:
51
+
52
+ - a first row for workspace-level tabs
53
+ - a second row for task-level items inside the current workspace
54
+
55
+ This is the clearest visual expression of the router-tabs workbench model.
56
+
57
+ ### How level-1 behaves
58
+
59
+ In Admin, level-1 tabs are rendered from `RouteTab` records.
60
+
61
+ The visible title and icon are usually derived from menu-backed tab info rather than from the active inner page title.
62
+
63
+ That means the first row behaves like a business workspace selector.
64
+
65
+ ### How level-2 behaves
66
+
67
+ In Admin, level-2 items are rendered from `tabCurrent.items`.
68
+
69
+ The second row shows task-level state such as:
70
+
71
+ - page title
72
+ - dirty state
73
+ - create/edit form state
74
+ - close actions for inner work items
75
+
76
+ The Admin layout also deliberately skips the anchor item when rendering the second row. That keeps the second level focused on additional work items rather than on the workspace anchor itself.
77
+
78
+ ### When Admin is the best mental model
79
+
80
+ Use the Admin layout as the primary mental model when explaining:
81
+
82
+ - why router tabs are two-level in business meaning
83
+ - how one workspace can hold several work items
84
+ - how page metadata affects task-level presentation
85
+
86
+ ## Web layout view
87
+
88
+ Representative sources:
89
+
90
+ - `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx`
91
+ - `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tabs.tsx`
92
+
93
+ ### What users see
94
+
95
+ In the Web layout, the same router-tabs model is presented differently.
96
+
97
+ The top-level workspace surface is rendered more like a horizontal menu, with support for folders, leaves, and separators.
98
+
99
+ This means the visual experience is less like an IDE-style double tab bar and more like a menu-driven workspace shell.
100
+
101
+ ### How top-level behavior works
102
+
103
+ The Web layout still uses `$$modelTabs.tabs` as the current workspace list.
104
+
105
+ However, instead of rendering a lifted tab row plus a bordered second row, it renders menu items that can:
106
+
107
+ - behave as top-level workspace entries
108
+ - expand folders
109
+ - navigate through menu leaf links
110
+ - highlight the active workspace
111
+
112
+ This is an important reminder that router tabs are not only a cosmetic tab component. They are a route-grouping and workbench-state mechanism that a layout can present in different ways.
113
+
114
+ ### How grouping differs visually
115
+
116
+ In the Web layout, the grouping meaning can still be present even when the UI does not emphasize the second level in the same direct way as Admin.
117
+
118
+ That means the mechanism is still doing grouping and workspace-state management, but the visual expression is tuned for a different frontend shell style.
119
+
120
+ ### When Web is the better mental model
121
+
122
+ Use the Web layout as the primary mental model when explaining:
123
+
124
+ - that the router-tabs model is reusable beyond one tab-row UI
125
+ - that top-level workspaces can be expressed through a menu-like shell
126
+ - that the framework contract is broader than the Admin visual treatment
127
+
128
+ ## Comparison table
129
+
130
+ | Topic | Admin layout | Web layout |
131
+ | ------------------------- | -------------------------------------- | ------------------------------------------------------ |
132
+ | Shared model | router-tabs model | router-tabs model |
133
+ | Top-level presentation | explicit lifted tab row | horizontal menu-like workspace surface |
134
+ | Second-level presentation | explicit bordered task row | not emphasized in the same direct double-row way |
135
+ | Primary user signal | workbench tabs | menu-oriented workspace navigation |
136
+ | Best use as explanation | business meaning of two levels | portability of the shared mechanism |
137
+ | Risk if misread | assuming Admin UI is the only contract | assuming menu presentation means tabs are not involved |
138
+
139
+ ## What is shared and should stay shared
140
+
141
+ Future contributors should preserve these shared behaviors across layouts unless there is an intentional framework change:
142
+
143
+ - route-to-workspace mapping
144
+ - `tabKey` and `componentKey` semantics
145
+ - activation through router navigation
146
+ - keep-alive integration
147
+ - cache and pruning behavior in the shared model
148
+
149
+ If one layout needs different visuals, it should change the presentation layer first rather than casually rewriting the shared state semantics.
150
+
151
+ ## What may differ safely by layout
152
+
153
+ These areas are more naturally layout-specific:
154
+
155
+ - how top-level workspaces are styled
156
+ - whether the second level is displayed explicitly
157
+ - icon placement and density
158
+ - close-button visibility
159
+ - whether the shell feels tab-centric or menu-centric
160
+
161
+ The key rule is:
162
+
163
+ - layout-specific UI may vary
164
+ - workbench-state semantics should stay intentional
165
+
166
+ ## Common mistakes to avoid
167
+
168
+ Avoid these assumptions:
169
+
170
+ ### Mistake 1: Admin rendering is the whole contract
171
+
172
+ This can lead contributors to hard-code two-row visual assumptions into framework-level decisions.
173
+
174
+ ### Mistake 2: Web rendering means router tabs are not involved
175
+
176
+ This can lead contributors to ignore the shared state model and accidentally break workspace continuity.
177
+
178
+ ### Mistake 3: layout differences justify changing `tabKey` or `componentKey` semantics
179
+
180
+ Usually they do not.
181
+
182
+ Those keys belong to the shared routing and state model, not only to one specific layout theme.
183
+
184
+ ## Recommended guidance for future docs and implementation work
185
+
186
+ When documenting or extending this area:
187
+
188
+ 1. explain the shared mechanism first
189
+ 2. use Admin as the clearest business-meaning example
190
+ 3. use Web as the proof that the mechanism is presentation-independent
191
+ 4. keep route-meta guidance layout-neutral unless a real layout-specific exception exists
192
+
193
+ ## Summary
194
+
195
+ The Admin and Web layouts do not represent two different router-tabs mechanisms.
196
+
197
+ They represent two different UI expressions of the same underlying workbench-state model.
198
+
199
+ Admin is the clearest example of explicit two-level tabs. Web is the clearest example that the same grouping and state model can power a different shell style without changing the core semantics.
200
+
201
+ ## See also
202
+
203
+ - [Router Tabs Introduction](/frontend/router-tabs-introduction)
204
+ - [Router Tabs Overview](/frontend/router-tabs-overview)
205
+ - [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
206
+ - [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook)
@@ -0,0 +1,106 @@
1
+ # Router Tabs Introduction
2
+
3
+ This guide is the landing page for the router-tabs documentation set in Zova within the Cabloy monorepo.
4
+
5
+ Use it to understand what the router-tabs mechanism is, which questions each companion document answers, and what order to read them in.
6
+
7
+ ## What router tabs are
8
+
9
+ Router tabs provide a workbench-style navigation model for frontend layouts that need more than a simple route-transition model.
10
+
11
+ In the current Cabloy Basic source, the mechanism supports:
12
+
13
+ - stable workspace-level grouping
14
+ - task-level page-instance switching inside a workspace
15
+ - keep-alive integration for routed work items
16
+ - optional cache restoration for workbench state
17
+ - more than one layout presentation on top of the same shared model
18
+
19
+ That means router tabs are not only a visual tab bar. They are a route-grouping and workbench-state mechanism.
20
+
21
+ ## Start here when you need to answer these questions
22
+
23
+ ### What business problem does this solve?
24
+
25
+ Read [Router Tabs Overview](/frontend/router-tabs-overview).
26
+
27
+ This document explains:
28
+
29
+ - why admin-style applications need more than a simple menu transition model
30
+ - why workspace identity and task identity should stay separate
31
+ - how the mechanism supports parallel work and workbench continuity
32
+
33
+ ### How does the mechanism work in code?
34
+
35
+ Read [Router Tabs Mechanism](/frontend/router-tabs-mechanism).
36
+
37
+ This document explains:
38
+
39
+ - the shared state model
40
+ - `tabKey` and `componentKey`
41
+ - page metadata, keep-alive, cache, and pruning behavior
42
+ - the relationship between the shared model and concrete layouts
43
+
44
+ ### How should I author route meta for this?
45
+
46
+ Read [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook).
47
+
48
+ This document explains:
49
+
50
+ - practical recipes for `tabKey`
51
+ - when to use `componentKeyMode`
52
+ - when to define explicit `componentKey`
53
+ - when to disable keep-alive
54
+ - common authoring mistakes to avoid
55
+
56
+ ### How do Admin and Web layouts differ?
57
+
58
+ Read [Router Tabs Admin and Web Comparison](/frontend/router-tabs-admin-web-comparison).
59
+
60
+ This document explains:
61
+
62
+ - what both layouts share
63
+ - how Admin exposes the two-level model directly
64
+ - how Web reuses the same model with a different shell style
65
+ - why layout-specific UI should not be confused with shared mechanism semantics
66
+
67
+ ## Recommended reading paths
68
+
69
+ ### Product or architecture perspective
70
+
71
+ Recommended order:
72
+
73
+ 1. [Router Tabs Overview](/frontend/router-tabs-overview)
74
+ 2. [Router Tabs Admin and Web Comparison](/frontend/router-tabs-admin-web-comparison)
75
+ 3. [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
76
+
77
+ ### Frontend implementation perspective
78
+
79
+ Recommended order:
80
+
81
+ 1. [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
82
+ 2. [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook)
83
+ 3. [Router Tabs Admin and Web Comparison](/frontend/router-tabs-admin-web-comparison)
84
+
85
+ ### Maintenance and refactor perspective
86
+
87
+ Recommended order:
88
+
89
+ 1. [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
90
+ 2. [Router Tabs Admin and Web Comparison](/frontend/router-tabs-admin-web-comparison)
91
+ 3. `.docs-internal/architecture/router-tabs-design-boundaries.md`
92
+
93
+ ## Scope boundary
94
+
95
+ The public router-tabs docs explain the shared frontend mechanism and how to use it.
96
+
97
+ For internal design boundaries, maintenance invariants, and refactor safety rules, see:
98
+
99
+ - `.docs-internal/architecture/router-tabs-design-boundaries.md`
100
+
101
+ ## See also
102
+
103
+ - [Router Tabs Overview](/frontend/router-tabs-overview)
104
+ - [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
105
+ - [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook)
106
+ - [Router Tabs Admin and Web Comparison](/frontend/router-tabs-admin-web-comparison)