@vc-shell/vc-app-skill 2.0.0-alpha.33 → 2.0.0-alpha.34

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 (195) hide show
  1. package/CHANGELOG.md +78 -54
  2. package/README.md +42 -12
  3. package/package.json +4 -4
  4. package/runtime/VERSION +1 -1
  5. package/runtime/agents/api-analyzer.md +31 -16
  6. package/runtime/agents/blade-enhancer.md +15 -9
  7. package/runtime/agents/details-blade-generator.md +47 -31
  8. package/runtime/agents/list-blade-generator.md +21 -37
  9. package/runtime/agents/locales-generator.md +3 -0
  10. package/runtime/agents/migration-agent.md +18 -7
  11. package/runtime/agents/module-analyzer.md +2 -0
  12. package/runtime/agents/module-assembler.md +15 -0
  13. package/runtime/agents/promote-agent.md +15 -4
  14. package/runtime/agents/type-checker.md +11 -0
  15. package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
  16. package/runtime/knowledge/docs/core/api/platform.docs.md +30 -30
  17. package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +41 -41
  18. package/runtime/knowledge/docs/core/composables/bladeContext/index.docs.md +12 -10
  19. package/runtime/knowledge/docs/core/composables/useApiClient/useApiClient.docs.md +11 -14
  20. package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +35 -35
  21. package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +35 -35
  22. package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +15 -15
  23. package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +21 -18
  24. package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +28 -24
  25. package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +90 -61
  26. package/runtime/knowledge/docs/core/composables/useBeforeUnload/useBeforeUnload.docs.md +19 -18
  27. package/runtime/knowledge/docs/core/composables/useBlade/useBlade.docs.md +89 -68
  28. package/runtime/knowledge/docs/core/composables/useBladeForm/useBladeForm.docs.md +27 -25
  29. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
  30. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +43 -47
  31. package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +11 -11
  32. package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +27 -15
  33. package/runtime/knowledge/docs/core/composables/useDashboard/useDashboard.docs.md +30 -30
  34. package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +34 -36
  35. package/runtime/knowledge/docs/core/composables/useErrorHandler/useErrorHandler.docs.md +44 -23
  36. package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +14 -11
  37. package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +47 -38
  38. package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +37 -28
  39. package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +23 -17
  40. package/runtime/knowledge/docs/core/composables/useMenuExpanded/index.docs.md +9 -9
  41. package/runtime/knowledge/docs/core/composables/useMenuService/useMenuService.docs.md +42 -42
  42. package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +22 -12
  43. package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +33 -41
  44. package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +16 -16
  45. package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +28 -0
  46. package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +32 -24
  47. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
  48. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +22 -13
  49. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
  50. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
  51. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
  52. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
  53. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
  54. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
  55. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
  56. package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
  57. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
  58. package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
  59. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
  60. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
  61. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
  62. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +79 -62
  63. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
  64. package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
  65. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +91 -83
  66. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
  67. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
  68. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
  69. package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
  70. package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
  71. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
  72. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
  73. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
  74. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
  75. package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
  76. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
  77. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
  78. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +5 -5
  79. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
  80. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
  81. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
  82. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
  83. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
  84. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
  85. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
  86. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
  87. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
  88. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  89. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
  90. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +11 -17
  91. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
  92. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
  93. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
  94. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
  95. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
  96. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
  97. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
  98. package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
  99. package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
  100. package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
  101. package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +100 -59
  102. package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
  103. package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
  104. package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
  105. package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
  106. package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
  107. package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
  108. package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
  109. package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
  110. package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
  111. package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
  112. package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
  113. package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
  114. package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
  115. package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
  116. package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
  117. package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
  118. package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
  119. package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
  120. package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +55 -44
  121. package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
  122. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +92 -65
  123. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +22 -36
  124. package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +65 -23
  125. package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +52 -73
  126. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
  127. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
  128. package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +56 -73
  129. package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +61 -27
  130. package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +42 -50
  131. package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
  132. package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
  133. package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +109 -131
  134. package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +47 -88
  135. package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +50 -64
  136. package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
  137. package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
  138. package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +57 -65
  139. package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
  140. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +55 -20
  141. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +21 -35
  142. package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +38 -33
  143. package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +72 -83
  144. package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +21 -16
  145. package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +55 -64
  146. package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +51 -70
  147. package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
  148. package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
  149. package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
  150. package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +90 -75
  151. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +99 -48
  152. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +548 -367
  153. package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
  154. package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
  155. package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
  156. package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
  157. package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
  158. package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
  159. package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
  160. package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
  161. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
  162. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
  163. package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
  164. package/runtime/knowledge/examples/offers-module.md +15 -13
  165. package/runtime/knowledge/examples/team-module.md +82 -119
  166. package/runtime/knowledge/examples/videos-module.md +44 -17
  167. package/runtime/knowledge/index.md +22 -0
  168. package/runtime/knowledge/migration-prompts/blade-form-migration.md +17 -8
  169. package/runtime/knowledge/migration-prompts/blade-props-migration.md +1 -2
  170. package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
  171. package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
  172. package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
  173. package/runtime/knowledge/migration-prompts/notifications-migration.md +8 -3
  174. package/runtime/knowledge/migration-prompts/nswag-migration.md +25 -29
  175. package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
  176. package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
  177. package/runtime/knowledge/migration-prompts/widgets-migration.md +48 -27
  178. package/runtime/knowledge/patterns/assets-management.md +20 -20
  179. package/runtime/knowledge/patterns/blade-navigation.md +7 -14
  180. package/runtime/knowledge/patterns/blade-widget.md +19 -17
  181. package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
  182. package/runtime/knowledge/patterns/composable-details.md +20 -50
  183. package/runtime/knowledge/patterns/composable-list.md +43 -31
  184. package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
  185. package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
  186. package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
  187. package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
  188. package/runtime/knowledge/patterns/form-validation.md +28 -64
  189. package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
  190. package/runtime/knowledge/patterns/module-structure.md +7 -1
  191. package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
  192. package/runtime/knowledge/patterns/notification-template.md +21 -14
  193. package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
  194. package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
  195. package/runtime/vc-app.md +241 -62
@@ -16,9 +16,9 @@ description: Performs surgical edits on a prototype module to replace mock data
16
16
  "entityName": "string — PascalCase entity name"
17
17
  },
18
18
  "dataSource": {
19
- "clientClass": "string — NSwag client class name (e.g., 'VcmpSellerSecurityClient')",
20
- "entityType": "string — PascalCase entity type (e.g., 'SellerUser')",
21
- "entityTypePath": "string — import path for entity types (e.g., '../../api_client/virtocommerce.marketplace')",
19
+ "clientClass": "string — NSwag client class name (e.g., 'MyEntityClient')",
20
+ "entityType": "string — PascalCase entity type (e.g., 'MyEntity')",
21
+ "entityTypePath": "string — import path for entity types (e.g., '../../api_client/virtocommerce.mymodule')",
22
22
  "searchMethod": "string? — camelCase search method on client",
23
23
  "getMethod": "string? — camelCase get method on client",
24
24
  "createMethod": "string? — camelCase create method on client",
@@ -61,6 +61,7 @@ If `bladeTypes` is `"details-only"`, skip all list composable and list blade fil
61
61
  ### Step 1: Validate generated files
62
62
 
63
63
  For each path in `prototypeMetadata.generatedFiles`:
64
+
64
65
  1. Check that `{targetDir}/{path}` exists on disk
65
66
  2. Read the file contents
66
67
  3. If a file is missing, record a warning: `"MISSING: {path} — listed in prototypeMetadata but not found on disk"`
@@ -76,11 +77,13 @@ Process each composable file (`.ts` files under `composables/`) listed in `gener
76
77
  Search for `// vc-app:mock-start` and `// vc-app:mock-end` markers in the file.
77
78
 
78
79
  **Primary path (markers found):**
80
+
79
81
  - Extract the entire block between `// vc-app:mock-start` and `// vc-app:mock-end` (inclusive of the marker lines)
80
82
  - Replace the block with the real API integration code (see Step 2c)
81
83
  - Remove the marker comments themselves
82
84
 
83
85
  **Fallback path (markers NOT found):**
86
+
84
87
  - Pattern-match mock function signatures: look for functions that return hardcoded arrays/objects, `const mockData`, `const mock`, `setTimeout` simulating async, or inline `Promise.resolve(...)` with literal data
85
88
  - Replace matched regions with real API integration code
86
89
  - Set status to `DONE_WITH_CONCERNS` with concern: `"Mock markers not found in {filePath} — used pattern-matching fallback. Verify edits manually."`
@@ -90,6 +93,7 @@ Search for `// vc-app:mock-start` and `// vc-app:mock-end` markers in the file.
90
93
  At the top of the file, apply these import changes:
91
94
 
92
95
  **Add** (if not already present):
96
+
93
97
  ```ts
94
98
  import { useApiClient } from "@vc-shell/framework";
95
99
  import { {dataSource.clientClass} } from "{dataSource.entityTypePath}";
@@ -97,6 +101,7 @@ import { {dataSource.entityType}, /* SearchQuery, SearchResult types as needed *
97
101
  ```
98
102
 
99
103
  **Remove:**
104
+
100
105
  - Any imports that reference mock data files or mock type definitions that no longer exist
101
106
  - Do NOT remove other existing imports (framework composables, Vue imports, etc.)
102
107
 
@@ -109,6 +114,7 @@ const apiClient = useApiClient({dataSource.clientClass});
109
114
  ```
110
115
 
111
116
  Then replace mock function bodies:
117
+
112
118
  - **List composable** (`useList` / `use{EntityPlural}`):
113
119
  - Mock search/fetch function → `apiClient.{dataSource.searchMethod}(query)`
114
120
  - Mock remove function → `apiClient.{dataSource.deleteMethod}(ids)`
@@ -118,6 +124,7 @@ Then replace mock function bodies:
118
124
  - Mock delete function → `apiClient.{dataSource.deleteMethod}(ids)`
119
125
 
120
126
  If a method is not provided in `dataSource` (e.g., `deleteMethod` is undefined), leave a TODO comment:
127
+
121
128
  ```ts
122
129
  // TODO [vc-app:promote]: deleteMethod not provided — implement manually
123
130
  ```
@@ -139,11 +146,13 @@ For each entry in `fieldMap`:
139
146
  - Computed property keys and template literals referencing the field
140
147
 
141
148
  - **`action: "delete"`** — Remove code blocks that reference the deleted field. If the field appears in a return statement or interface, remove it. If it appears in logic that cannot be cleanly removed, comment it out with:
149
+
142
150
  ```ts
143
151
  // TODO [vc-app:promote]: removed field "{mockFieldName}" — clean up surrounding logic
144
152
  ```
145
153
 
146
154
  - **`action: "keep-stub"`** — Leave the existing code for this field in place and add a comment:
155
+
147
156
  ```ts
148
157
  // TODO [vc-app:promote]: {mockFieldName} — kept as stub, provide implementation
149
158
  ```
@@ -156,6 +165,7 @@ For each entry in `fieldMap`:
156
165
  #### 2f: Preserve untouched code
157
166
 
158
167
  All code outside the mock block and the renamed/deleted field references must remain exactly as-is. This includes:
168
+
159
169
  - Computed properties
160
170
  - Watchers
161
171
  - Validation logic
@@ -235,7 +245,7 @@ Compile the final report with:
235
245
  - `DONE_WITH_CONCERNS` — transformations applied but with fallback pattern-matching or ambiguities
236
246
  - `BLOCKED` — cannot proceed (all files missing, or critical error)
237
247
 
238
- - **Files modified:** list each file with a one-line summary of changes (e.g., `"composables/useTeamMembers/index.ts — replaced mock data source with VcmpSellerSecurityClient API calls, renamed 3 fields"`)
248
+ - **Files modified:** list each file with a one-line summary of changes (e.g., `"composables/useTeamMembers/index.ts — replaced mock data source with UserSecurityClient API calls, renamed 3 fields"`)
239
249
 
240
250
  - **Warnings:** list all warnings collected during Steps 1-5
241
251
 
@@ -244,6 +254,7 @@ Compile the final report with:
244
254
  ## Output Contract
245
255
 
246
256
  Report format:
257
+
247
258
  ```
248
259
  Status: DONE | DONE_WITH_CONCERNS | BLOCKED
249
260
  Files modified:
@@ -23,11 +23,13 @@ No pattern files needed. This agent works with TypeScript diagnostics directly.
23
23
  ### Step 1: Run vue-tsc
24
24
 
25
25
  From `projectRoot`, run:
26
+
26
27
  ```bash
27
28
  cd {projectRoot} && npx vue-tsc --noEmit 2>&1
28
29
  ```
29
30
 
30
31
  Capture all output. If `vue-tsc` is not available, fall back to:
32
+
31
33
  ```bash
32
34
  cd {projectRoot} && npx tsc --noEmit 2>&1
33
35
  ```
@@ -35,6 +37,7 @@ cd {projectRoot} && npx tsc --noEmit 2>&1
35
37
  ### Step 2: Filter errors to generated files only
36
38
 
37
39
  Parse the output for TypeScript error lines. Each error line has format:
40
+
38
41
  ```
39
42
  {filepath}({line},{col}): error TS{code}: {message}
40
43
  ```
@@ -48,27 +51,34 @@ If no errors match the generated files, report **PASS** and stop.
48
51
  For each error in the generated files, attempt to fix using these patterns:
49
52
 
50
53
  **TS2339 — Property does not exist on type:**
54
+
51
55
  - If `entity.{field}` and `{field}` is not on the entity type, add `?` optional chaining: `entity.value?.{field}`
52
56
  - If it's a missing property on an imported type, add a type assertion: `(entity.value as any).{field}` as a last resort
53
57
 
54
58
  **TS2345 — Argument type mismatch:**
59
+
55
60
  - If passing `string | undefined` where `string` is expected, add non-null assertion: `value!`
56
61
  - If command class is missing a required field, add it from the entity with a comment
57
62
 
58
63
  **TS2304 — Cannot find name:**
64
+
59
65
  - If a composable function name is wrong, check the composable file and correct the import/destructure
60
66
  - If an imported type is missing, check the api client file for the correct class name
61
67
 
62
68
  **TS7006 — Parameter implicitly has 'any' type:**
69
+
63
70
  - Add explicit type annotation from context (e.g., `(query: ISearch{Entity}Query)`)
64
71
 
65
72
  **TS2554 — Expected N arguments but got M:**
73
+
66
74
  - Check the method signature in the api client file and adjust the call
67
75
 
68
76
  **TS1005 — Expected token:**
77
+
69
78
  - Syntax error — re-read the generated file and fix malformed syntax
70
79
 
71
80
  For each fix:
81
+
72
82
  1. Read the affected generated file
73
83
  2. Apply the minimal fix (Edit tool, targeted replacement)
74
84
  3. Note the fix applied
@@ -108,6 +118,7 @@ Returns a text report with PASS/FAIL status, fixes applied, and any remaining er
108
118
  ## Self-Check
109
119
 
110
120
  Before completing, verify:
121
+
111
122
  - [ ] `vue-tsc` (or `tsc`) was run from `projectRoot`, not from a subdirectory
112
123
  - [ ] Only errors in `generatedFiles` were addressed — no fixes to unrelated files
113
124
  - [ ] Fixes were minimal (targeted Edit calls, not full file rewrites)
@@ -1 +1 @@
1
- Synced from framework at commit b399787ff on 2026-04-14T15:15:27.844Z
1
+ Synced from framework at commit cec6c9078 on 2026-04-22T09:43:16.584Z
@@ -21,38 +21,38 @@ Each API client class extends `AuthApiBase`, which automatically attaches the Be
21
21
 
22
22
  All clients extend `AuthApiBase` and accept an optional `baseUrl` and `http` fetch implementation.
23
23
 
24
- | Client | Description |
25
- |--------|-------------|
26
- | `ExternalSignInClient` | External authentication provider sign-in |
27
- | `AppsClient` | Application descriptor operations |
28
- | `AuthorizationClient` | Permission and role checking |
29
- | `ChangeLogClient` | Platform change log / audit trail |
30
- | `DiagnosticsClient` | System diagnostics and health |
31
- | `DynamicPropertiesClient` | Dynamic property CRUD and dictionary management |
32
- | `JobsClient` | Background job management |
33
- | `LocalizableSettingsClient` | Localizable setting values |
34
- | `ModulesClient` | Platform module management (install, update, restart) |
35
- | `OAuthAppsClient` | OAuth application registration |
36
- | `PushNotificationClient` | Push notification search and mark-as-read |
37
- | `SecurityClient` | User management, roles, permissions, password operations |
38
- | `SettingClient` | Platform settings CRUD |
24
+ | Client | Description |
25
+ | --------------------------- | -------------------------------------------------------- |
26
+ | `ExternalSignInClient` | External authentication provider sign-in |
27
+ | `AppsClient` | Application descriptor operations |
28
+ | `AuthorizationClient` | Permission and role checking |
29
+ | `ChangeLogClient` | Platform change log / audit trail |
30
+ | `DiagnosticsClient` | System diagnostics and health |
31
+ | `DynamicPropertiesClient` | Dynamic property CRUD and dictionary management |
32
+ | `JobsClient` | Background job management |
33
+ | `LocalizableSettingsClient` | Localizable setting values |
34
+ | `ModulesClient` | Platform module management (install, update, restart) |
35
+ | `OAuthAppsClient` | OAuth application registration |
36
+ | `PushNotificationClient` | Push notification search and mark-as-read |
37
+ | `SecurityClient` | User management, roles, permissions, password operations |
38
+ | `SettingClient` | Platform settings CRUD |
39
39
 
40
40
  ## Key DTOs (Interfaces)
41
41
 
42
- | Interface | Description |
43
- |-----------|-------------|
44
- | `PushNotification` | Push notification payload: `id`, `title`, `notifyType`, `isNew`, `finished`, etc. |
45
- | `PushNotificationSearchCriteria` | Search criteria for notification queries |
46
- | `ApplicationUser` | Platform user with roles, permissions, logins |
47
- | `Role` | Security role with permissions |
48
- | `Permission` | Individual permission entry |
49
- | `DynamicProperty` | Dynamic property definition |
50
- | `DynamicObjectProperty` | Property value bound to an object |
51
- | `ModuleDescriptor` | Module metadata (id, version, dependencies) |
52
- | `ChangeLogSearchCriteria` | Audit log search parameters |
53
- | `ChangeLogSearchResult` | Paginated audit log results |
54
- | `ObjectSettingEntry` | Setting entry with value and metadata |
55
- | `License` | Platform license information |
42
+ | Interface | Description |
43
+ | -------------------------------- | --------------------------------------------------------------------------------- |
44
+ | `PushNotification` | Push notification payload: `id`, `title`, `notifyType`, `isNew`, `finished`, etc. |
45
+ | `PushNotificationSearchCriteria` | Search criteria for notification queries |
46
+ | `ApplicationUser` | Platform user with roles, permissions, logins |
47
+ | `Role` | Security role with permissions |
48
+ | `Permission` | Individual permission entry |
49
+ | `DynamicProperty` | Dynamic property definition |
50
+ | `DynamicObjectProperty` | Property value bound to an object |
51
+ | `ModuleDescriptor` | Module metadata (id, version, dependencies) |
52
+ | `ChangeLogSearchCriteria` | Audit log search parameters |
53
+ | `ChangeLogSearchResult` | Paginated audit log results |
54
+ | `ObjectSettingEntry` | Setting entry with value and metadata |
55
+ | `License` | Platform license information |
56
56
 
57
57
  ## Base Class
58
58
 
@@ -93,7 +93,7 @@ const securityClient = new SecurityClient();
93
93
  const user = await securityClient.getCurrentUser();
94
94
 
95
95
  console.log(`Logged in as: ${user.userName}`);
96
- console.log(`Roles: ${user.roles?.map(r => r.name).join(", ")}`);
96
+ console.log(`Roles: ${user.roles?.map((r) => r.name).join(", ")}`);
97
97
  console.log(`Is admin: ${user.isAdministrator}`);
98
98
  ```
99
99
 
@@ -34,27 +34,27 @@ Creates a new stack instance. Called once by the navigation plugin.
34
34
 
35
35
  ### API
36
36
 
37
- | Method | Description |
38
- |---|---|
39
- | `openWorkspace(event)` | Sets the root blade (index 0). Closes all existing blades unconditionally. |
40
- | `openBlade(event)` | Opens a child blade after a parent. Closes any blades deeper than the parent (with guard checks). |
41
- | `closeBlade(bladeId)` | Closes a blade and all its children. Returns `true` if a guard prevented closing. |
42
- | `closeChildren(parentId)` | Closes all blades after the given parent. |
43
- | `replaceCurrentBlade(event)` | Destroys the current active blade and creates a new one at the same stack index with the same `parentId`. |
44
- | `coverCurrentBlade(event)` | Hides the current active blade (keeps it in the stack) and opens a new blade on top. Closing the covering blade restores the hidden blade. |
45
- | `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing. |
46
- | `unregisterBeforeClose(bladeId)` | Removes a close guard. |
47
- | `setBladeError(bladeId, error)` | Sets an error on a blade descriptor (displayed as error banner). |
48
- | `clearBladeError(bladeId)` | Clears a blade's error. |
49
- | `setBladeTitle(bladeId, title)` | Updates the blade's title in the descriptor. |
37
+ | Method | Description |
38
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
39
+ | `openWorkspace(event)` | Sets the root blade (index 0). Closes all existing blades unconditionally. |
40
+ | `openBlade(event)` | Opens a child blade after a parent. Closes any blades deeper than the parent (with guard checks). |
41
+ | `closeBlade(bladeId)` | Closes a blade and all its children. Returns `true` if a guard prevented closing. |
42
+ | `closeChildren(parentId)` | Closes all blades after the given parent. |
43
+ | `replaceCurrentBlade(event)` | Destroys the current active blade and creates a new one at the same stack index with the same `parentId`. |
44
+ | `coverCurrentBlade(event)` | Hides the current active blade (keeps it in the stack) and opens a new blade on top. Closing the covering blade restores the hidden blade. |
45
+ | `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing. |
46
+ | `unregisterBeforeClose(bladeId)` | Removes a close guard. |
47
+ | `setBladeError(bladeId, error)` | Sets an error on a blade descriptor (displayed as error banner). |
48
+ | `clearBladeError(bladeId)` | Clears a blade's error. |
49
+ | `setBladeTitle(bladeId, title)` | Updates the blade's title in the descriptor. |
50
50
 
51
51
  ### Computed
52
52
 
53
- | Property | Type | Description |
54
- |---|---|---|
55
- | `workspace` | `BladeDescriptor` | The root blade (index 0) |
56
- | `blades` | `readonly BladeDescriptor[]` | Full ordered stack |
57
- | `activeBlade` | `BladeDescriptor` | The last visible blade |
53
+ | Property | Type | Description |
54
+ | ------------- | ---------------------------- | ------------------------ |
55
+ | `workspace` | `BladeDescriptor` | The root blade (index 0) |
56
+ | `blades` | `readonly BladeDescriptor[]` | Full ordered stack |
57
+ | `activeBlade` | `BladeDescriptor` | The last visible blade |
58
58
 
59
59
  ### Composable: `useBladeStack()`
60
60
 
@@ -66,11 +66,11 @@ Inter-blade communication via exposed methods.
66
66
 
67
67
  ### Factory: `createBladeMessaging(bladeStack)`
68
68
 
69
- | Method | Description |
70
- |---|---|
71
- | `exposeToChildren(bladeId, methods)` | Registers methods that child blades can call |
69
+ | Method | Description |
70
+ | ------------------------------------------ | ------------------------------------------------------------------------- |
71
+ | `exposeToChildren(bladeId, methods)` | Registers methods that child blades can call |
72
72
  | `callParent(callerBladeId, method, args?)` | Calls a method on the caller's parent blade. Returns the method's result. |
73
- | `cleanup(bladeId)` | Removes exposed methods for a blade (called on close). |
73
+ | `cleanup(bladeId)` | Removes exposed methods for a blade (called on close). |
74
74
 
75
75
  ### Composable: `useBladeMessaging()`
76
76
 
@@ -84,13 +84,13 @@ The primary composable for module developers. Maps the legacy `IUseBladeNavigati
84
84
 
85
85
  ```typescript
86
86
  const {
87
- openBlade, // Open a child blade
88
- closeBlade, // Close by index (deprecated -- use useBlade().closeSelf())
89
- resolveBladeByName, // Look up a blade component by name
90
- onParentCall, // Call parent blade method (deprecated -- use useBlade().callParent())
91
- onBeforeClose, // Register close guard (deprecated -- use useBlade().onBeforeClose())
92
- blades, // Reactive blade array (shim objects)
93
- activeWorkspace, // Current workspace blade
87
+ openBlade, // Open a child blade
88
+ closeBlade, // Close by index (deprecated -- use useBlade().closeSelf())
89
+ resolveBladeByName, // Look up a blade component by name
90
+ onParentCall, // Call parent blade method (deprecated -- use useBlade().callParent())
91
+ onBeforeClose, // Register close guard (deprecated -- use useBlade().onBeforeClose())
92
+ blades, // Reactive blade array (shim objects)
93
+ activeWorkspace, // Current workspace blade
94
94
  } = useBladeNavigation();
95
95
  ```
96
96
 
@@ -124,18 +124,18 @@ openBlade({
124
124
 
125
125
  The plain data object stored in the stack for each blade:
126
126
 
127
- | Field | Type | Description |
128
- |---|---|---|
129
- | `id` | `string` | Unique instance ID (auto-generated) |
130
- | `name` | `string` | Blade registration name |
131
- | `url` | `string?` | URL segment for address bar sync |
132
- | `param` | `unknown` | Parameter passed when opening (e.g., entity ID) |
133
- | `query` | `Record?` | Query parameters |
134
- | `options` | `unknown` | Arbitrary options passed to the blade |
135
- | `parentId` | `string?` | ID of the parent blade |
136
- | `visible` | `boolean` | Whether the blade is rendered (false when covered via `coverCurrentBlade`) |
137
- | `error` | `unknown?` | Error state for the error banner |
138
- | `title` | `string?` | Dynamic title override |
127
+ | Field | Type | Description |
128
+ | ---------- | ---------- | -------------------------------------------------------------------------- |
129
+ | `id` | `string` | Unique instance ID (auto-generated) |
130
+ | `name` | `string` | Blade registration name |
131
+ | `url` | `string?` | URL segment for address bar sync |
132
+ | `param` | `unknown` | Parameter passed when opening (e.g., entity ID) |
133
+ | `query` | `Record?` | Query parameters |
134
+ | `options` | `unknown` | Arbitrary options passed to the blade |
135
+ | `parentId` | `string?` | ID of the parent blade |
136
+ | `visible` | `boolean` | Whether the blade is rendered (false when covered via `coverCurrentBlade`) |
137
+ | `error` | `unknown?` | Error state for the error banner |
138
+ | `title` | `string?` | Dynamic title override |
139
139
 
140
140
  ## Tips
141
141
 
@@ -15,7 +15,7 @@ The pattern follows a "define once, inject anywhere" approach: the blade compone
15
15
 
16
16
  ```typescript
17
17
  // In a blade's <script setup>
18
- import { defineBladeContext, injectBladeContext } from '@vc-shell/framework';
18
+ import { defineBladeContext, injectBladeContext } from "@vc-shell/framework";
19
19
 
20
20
  // Provide context — refs/computeds are auto-unwrapped for consumers
21
21
  defineBladeContext({ item, disabled, loading });
@@ -26,7 +26,7 @@ defineBladeContext(computed(() => ({ id: item.value?.id })));
26
26
 
27
27
  ```typescript
28
28
  // In a widget or nested component
29
- import { injectBladeContext } from '@vc-shell/framework';
29
+ import { injectBladeContext } from "@vc-shell/framework";
30
30
 
31
31
  const ctx = injectBladeContext();
32
32
  // Refs are already unwrapped — access values directly, no .value needed
@@ -38,9 +38,9 @@ const item = computed(() => ctx.value.item as { id: string; name: string });
38
38
 
39
39
  ### defineBladeContext
40
40
 
41
- | Parameter | Type | Required | Description |
42
- |---|---|---|---|
43
- | `data` | `MaybeRefOrGetter<Record<string, unknown>>` | Yes | Plain object, ref, or getter to expose |
41
+ | Parameter | Type | Required | Description |
42
+ | --------- | ------------------------------------------- | -------- | -------------------------------------- |
43
+ | `data` | `MaybeRefOrGetter<Record<string, unknown>>` | Yes | Plain object, ref, or getter to expose |
44
44
 
45
45
  Returns `void`. Must be called in the blade's `<script setup>`.
46
46
 
@@ -82,11 +82,13 @@ const customer = ref({ id: "cust-1", name: "Acme Corp" });
82
82
  const loading = ref(false);
83
83
 
84
84
  // Expose the customer data to all descendant widgets
85
- defineBladeContext(computed(() => ({
86
- id: customer.value?.id,
87
- name: customer.value?.name,
88
- loading: loading.value,
89
- })));
85
+ defineBladeContext(
86
+ computed(() => ({
87
+ id: customer.value?.id,
88
+ name: customer.value?.name,
89
+ loading: loading.value,
90
+ })),
91
+ );
90
92
  </script>
91
93
  ```
92
94
 
@@ -187,10 +187,7 @@ const { action: loadDashboardData } = useAsync(async () => {
187
187
  const orderClient = await getOrderClient();
188
188
  const customerClient = await getCustomerClient();
189
189
 
190
- const [orders, customers] = await Promise.all([
191
- orderClient.searchOrders({ take: 5, sort: "createdDate:DESC" }),
192
- customerClient.searchCustomers({ take: 5, sort: "createdDate:DESC" }),
193
- ]);
190
+ const [orders, customers] = await Promise.all([orderClient.searchOrders({ take: 5, sort: "createdDate:DESC" }), customerClient.searchCustomers({ take: 5, sort: "createdDate:DESC" })]);
194
191
 
195
192
  recentOrders.value = orders.results ?? [];
196
193
  recentCustomers.value = customers.results ?? [];
@@ -263,25 +260,25 @@ const response = await fetch("https://api.weather.com/forecast");
263
260
 
264
261
  ### Parameters
265
262
 
266
- | Parameter | Type | Required | Description |
267
- |-----------|------|----------|-------------|
268
- | `c` | `new (baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) => ApiClient` | Yes | API client constructor class. Must implement `IAuthApiBase`. |
263
+ | Parameter | Type | Required | Description |
264
+ | --------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------ |
265
+ | `c` | `new (baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) => ApiClient` | Yes | API client constructor class. Must implement `IAuthApiBase`. |
269
266
 
270
267
  ### Returns: `UseApiClientReturn<ApiClient>`
271
268
 
272
- | Property | Type | Description |
273
- |----------|------|-------------|
269
+ | Property | Type | Description |
270
+ | -------------- | -------------------------- | ---------------------------------------------------------------------- |
274
271
  | `getApiClient` | `() => Promise<ApiClient>` | Async factory that returns a configured, authenticated client instance |
275
272
 
276
273
  ### IAuthApiBase Interface
277
274
 
278
275
  All generated API client classes implement this interface:
279
276
 
280
- | Property / Method | Type | Description |
281
- |-------------------|------|-------------|
282
- | `authToken` | `string` | Current authentication token |
283
- | `setAuthToken` | `(token: string) => void` | Sets the authentication token |
284
- | `getBaseUrl` | `(defaultUrl: string, baseUrl: string) => string` | Resolves the API base URL |
277
+ | Property / Method | Type | Description |
278
+ | ----------------- | ------------------------------------------------- | ----------------------------- |
279
+ | `authToken` | `string` | Current authentication token |
280
+ | `setAuthToken` | `(token: string) => void` | Sets the authentication token |
281
+ | `getBaseUrl` | `(defaultUrl: string, baseUrl: string) => string` | Resolves the API base URL |
285
282
 
286
283
  ### Generated Client Classes
287
284
 
@@ -13,15 +13,15 @@ Manages custom action buttons in the mobile app bar. Uses provide/inject to shar
13
13
 
14
14
  ```vue
15
15
  <script setup lang="ts">
16
- import { useAppBarMobileButtons } from '@vc-shell/framework';
17
- import { onUnmounted, computed, ref } from 'vue';
16
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
17
+ import { onUnmounted, computed, ref } from "vue";
18
18
 
19
19
  const { register, unregister } = useAppBarMobileButtons();
20
20
  const unreadCount = ref(3);
21
21
 
22
22
  register({
23
- id: 'notifications-btn',
24
- icon: 'fas fa-bell',
23
+ id: "notifications-btn",
24
+ icon: "fas fa-bell",
25
25
  onClick: () => openNotificationsPanel(),
26
26
  order: 10,
27
27
  badge: computed(() => unreadCount.value > 0),
@@ -29,7 +29,7 @@ register({
29
29
  });
30
30
 
31
31
  // Always clean up when the component is destroyed
32
- onUnmounted(() => unregister('notifications-btn'));
32
+ onUnmounted(() => unregister("notifications-btn"));
33
33
  </script>
34
34
  ```
35
35
 
@@ -37,27 +37,27 @@ onUnmounted(() => unregister('notifications-btn'));
37
37
 
38
38
  ### Returns
39
39
 
40
- | Property | Type | Description |
41
- |---|---|---|
42
- | `registeredButtons` | `ComputedRef<AppBarButtonContent[]>` | All registered buttons (unfiltered, unsorted). Useful for debugging. |
43
- | `register` | `(button: AppBarButtonContent) => void` | Add or update a button by `id`. If a button with the same ID already exists, it is replaced. |
44
- | `unregister` | `(buttonId: string) => void` | Remove a button by `id`. No-op if the ID does not exist. |
45
- | `getButton` | `(buttonId: string) => AppBarButtonContent \| undefined` | Look up a single button by ID. |
46
- | `getButtons` | `ComputedRef<AppBarButtonContent[]>` | Visible buttons sorted by `order` (ascending). Filters out buttons where `isVisible` is `false`. |
40
+ | Property | Type | Description |
41
+ | ------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
42
+ | `registeredButtons` | `ComputedRef<AppBarButtonContent[]>` | All registered buttons (unfiltered, unsorted). Useful for debugging. |
43
+ | `register` | `(button: AppBarButtonContent) => void` | Add or update a button by `id`. If a button with the same ID already exists, it is replaced. |
44
+ | `unregister` | `(buttonId: string) => void` | Remove a button by `id`. No-op if the ID does not exist. |
45
+ | `getButton` | `(buttonId: string) => AppBarButtonContent \| undefined` | Look up a single button by ID. |
46
+ | `getButtons` | `ComputedRef<AppBarButtonContent[]>` | Visible buttons sorted by `order` (ascending). Filters out buttons where `isVisible` is `false`. |
47
47
 
48
48
  ### AppBarButtonContent
49
49
 
50
- | Field | Type | Required | Description |
51
- |---|---|---|---|
52
- | `id` | `string` | Yes | Unique identifier. Used for register/unregister/lookup. |
53
- | `icon` | `Component \| string` | No | Icon component or CSS class string (e.g., `'fas fa-bell'`). |
54
- | `component` | `Component` | No | Custom Vue component to render instead of a default icon button. |
55
- | `props` | `Record<string, unknown>` | No | Props passed to the custom `component`. |
56
- | `onClick` | `() => void` | No | Click handler for the default button rendering. |
57
- | `onClose` | `() => void` | No | Close/dismiss handler (e.g., for popover-style buttons). |
58
- | `order` | `number` | No | Sort priority. Lower values appear first. Defaults to 0 if omitted. |
59
- | `isVisible` | `MaybeRef<boolean>` | No | Reactive visibility toggle. When `false`, the button is excluded from `getButtons`. Defaults to `true`. |
60
- | `badge` | `MaybeRef<boolean>` | No | Show a small badge indicator on the button (e.g., for unread notifications). |
50
+ | Field | Type | Required | Description |
51
+ | ----------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
52
+ | `id` | `string` | Yes | Unique identifier. Used for register/unregister/lookup. |
53
+ | `icon` | `Component \| string` | No | Icon component or CSS class string (e.g., `'fas fa-bell'`). |
54
+ | `component` | `Component` | No | Custom Vue component to render instead of a default icon button. |
55
+ | `props` | `Record<string, unknown>` | No | Props passed to the custom `component`. |
56
+ | `onClick` | `() => void` | No | Click handler for the default button rendering. |
57
+ | `onClose` | `() => void` | No | Close/dismiss handler (e.g., for popover-style buttons). |
58
+ | `order` | `number` | No | Sort priority. Lower values appear first. Defaults to 0 if omitted. |
59
+ | `isVisible` | `MaybeRef<boolean>` | No | Reactive visibility toggle. When `false`, the button is excluded from `getButtons`. Defaults to `true`. |
60
+ | `badge` | `MaybeRef<boolean>` | No | Show a small badge indicator on the button (e.g., for unread notifications). |
61
61
 
62
62
  ## Setup
63
63
 
@@ -65,7 +65,7 @@ onUnmounted(() => unregister('notifications-btn'));
65
65
 
66
66
  ```typescript
67
67
  // Inside VcApp.vue setup
68
- import { provideAppBarMobileButtonsService } from '@vc-shell/framework';
68
+ import { provideAppBarMobileButtonsService } from "@vc-shell/framework";
69
69
 
70
70
  provideAppBarMobileButtonsService();
71
71
  ```
@@ -74,15 +74,15 @@ provideAppBarMobileButtonsService();
74
74
 
75
75
  ```vue
76
76
  <script setup lang="ts">
77
- import { useAppBarMobileButtons } from '@vc-shell/framework';
78
- import { ref, computed, onUnmounted } from 'vue';
77
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
78
+ import { ref, computed, onUnmounted } from "vue";
79
79
 
80
80
  const { register, unregister } = useAppBarMobileButtons();
81
81
  const isFilterActive = ref(false);
82
82
 
83
83
  register({
84
- id: 'product-list-filter',
85
- icon: computed(() => isFilterActive.value ? 'fas fa-filter' : 'far fa-filter'),
84
+ id: "product-list-filter",
85
+ icon: computed(() => (isFilterActive.value ? "fas fa-filter" : "far fa-filter")),
86
86
  onClick: () => {
87
87
  isFilterActive.value = !isFilterActive.value;
88
88
  // Open or close the filter panel
@@ -91,7 +91,7 @@ register({
91
91
  badge: isFilterActive,
92
92
  });
93
93
 
94
- onUnmounted(() => unregister('product-list-filter'));
94
+ onUnmounted(() => unregister("product-list-filter"));
95
95
  </script>
96
96
  ```
97
97
 
@@ -101,20 +101,20 @@ If you need more than an icon and a click handler (e.g., a dropdown or popover),
101
101
 
102
102
  ```vue
103
103
  <script setup lang="ts">
104
- import { useAppBarMobileButtons } from '@vc-shell/framework';
105
- import { onUnmounted, markRaw } from 'vue';
106
- import LanguageSwitcher from './LanguageSwitcher.vue';
104
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
105
+ import { onUnmounted, markRaw } from "vue";
106
+ import LanguageSwitcher from "./LanguageSwitcher.vue";
107
107
 
108
108
  const { register, unregister } = useAppBarMobileButtons();
109
109
 
110
110
  register({
111
- id: 'language-switcher',
111
+ id: "language-switcher",
112
112
  component: markRaw(LanguageSwitcher),
113
- props: { position: 'bottom-right' },
113
+ props: { position: "bottom-right" },
114
114
  order: 50,
115
115
  });
116
116
 
117
- onUnmounted(() => unregister('language-switcher'));
117
+ onUnmounted(() => unregister("language-switcher"));
118
118
  </script>
119
119
  ```
120
120