@vc-shell/vc-app-skill 2.1.0-pr256.0fe3abb → 2.1.0-pr257.a5b1627

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 (139) hide show
  1. package/package.json +1 -1
  2. package/runtime/knowledge/docs/core/api/platform.docs.md +18 -20
  3. package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +34 -43
  4. package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +3 -5
  5. package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +10 -12
  6. package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +5 -7
  7. package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +6 -8
  8. package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +1 -3
  9. package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +1 -1
  10. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +5 -8
  11. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +12 -12
  12. package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +3 -3
  13. package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +3 -4
  14. package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +0 -1
  15. package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +3 -3
  16. package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +4 -5
  17. package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +3 -3
  18. package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +0 -2
  19. package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +2 -1
  20. package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +1 -1
  21. package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +3 -3
  22. package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +1 -1
  23. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +2 -2
  24. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +1 -2
  25. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +18 -18
  26. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +3 -3
  27. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +7 -10
  28. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +7 -7
  29. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +12 -18
  30. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +2 -2
  31. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +20 -20
  32. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +24 -15
  33. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +2 -2
  34. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +30 -50
  35. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +11 -30
  36. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +1 -1
  37. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +3 -2
  38. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +26 -26
  39. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +3 -2
  40. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +50 -11
  41. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +6 -9
  42. package/runtime/knowledge/docs/core/services/services.docs.md +13 -15
  43. package/runtime/knowledge/docs/core/types/types.docs.md +40 -37
  44. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +2 -1
  45. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +30 -21
  46. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +2 -2
  47. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +8 -9
  48. package/runtime/knowledge/docs/injection-keys.docs.md +11 -6
  49. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +1 -1
  50. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +12 -20
  51. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +10 -10
  52. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +6 -6
  53. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +4 -4
  54. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +14 -16
  55. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +1 -1
  56. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +11 -12
  57. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +3 -10
  58. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +3 -3
  59. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +2 -9
  60. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +2 -4
  61. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  62. package/runtime/knowledge/docs/shell/components/notification-dropdown/notification-dropdown.docs.md +31 -35
  63. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +11 -17
  64. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +7 -8
  65. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +21 -23
  66. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +3 -5
  67. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +7 -7
  68. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +11 -11
  69. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +16 -28
  70. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +19 -17
  71. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +0 -21
  72. package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +1 -2
  73. package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +2 -2
  74. package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +14 -15
  75. package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +6 -9
  76. package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +1 -1
  77. package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +9 -10
  78. package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +4 -19
  79. package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +2 -2
  80. package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +4 -5
  81. package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +4 -5
  82. package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +8 -9
  83. package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +0 -7
  84. package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +1 -1
  85. package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +2 -2
  86. package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +1 -1
  87. package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +10 -11
  88. package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +8 -28
  89. package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +19 -22
  90. package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +8 -8
  91. package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +6 -16
  92. package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +8 -9
  93. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +34 -42
  94. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +1 -1
  95. package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +1 -14
  96. package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +1 -3
  97. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +33 -34
  98. package/runtime/knowledge/docs/ui/components/molecules/{vc-popover/vc-popover.docs.md → vc-dropdown-panel/vc-dropdown-panel.docs.md} +25 -26
  99. package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +24 -26
  100. package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +14 -12
  101. package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +30 -30
  102. package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +2 -2
  103. package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +1 -1
  104. package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +31 -34
  105. package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +12 -14
  106. package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +1 -1
  107. package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +27 -36
  108. package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +1 -5
  109. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +9 -10
  110. package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +19 -44
  111. package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +11 -11
  112. package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +14 -15
  113. package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +15 -15
  114. package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +13 -15
  115. package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +1 -5
  116. package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +0 -18
  117. package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +78 -48
  118. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +11 -9
  119. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +43 -71
  120. package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +20 -27
  121. package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +2 -2
  122. package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +12 -12
  123. package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +24 -33
  124. package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +26 -43
  125. package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +9 -15
  126. package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +6 -8
  127. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +4 -4
  128. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +3 -2
  129. package/runtime/knowledge/docs/core/blade-navigation/table-query-state/useTableQueryState.docs.md +0 -95
  130. package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +0 -35
  131. package/runtime/knowledge/docs/core/notifications/composables/useBladeNotifications.docs.md +0 -183
  132. package/runtime/knowledge/docs/core/notifications/composables/useBroadcastFilter.docs.md +0 -117
  133. package/runtime/knowledge/docs/core/notifications/composables/useNotificationContext.docs.md +0 -150
  134. package/runtime/knowledge/docs/core/notifications/composables/useNotificationStore.docs.md +0 -114
  135. package/runtime/knowledge/docs/modules/assets/assets-details.docs.md +0 -123
  136. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/dashboard-widget-skeleton.docs.md +0 -33
  137. package/runtime/knowledge/docs/ui/components/atoms/vc-environment-banner/vc-environment-banner.docs.md +0 -42
  138. package/runtime/knowledge/docs/ui/components/organisms/vc-scheduler/vc-scheduler.docs.md +0 -412
  139. package/runtime/knowledge/docs/ui/composables/useTableSearch.docs.md +0 -130
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vc-shell/vc-app-skill",
3
- "version": "2.1.0-pr256.0fe3abb",
3
+ "version": "2.1.0-pr257.a5b1627",
4
4
  "description": "AI coding skill for scaffolding and generating VirtoCommerce Shell applications. Works with Claude Code, OpenCode, Gemini, Codex, Cursor.",
5
5
  "bin": "./bin/install.cjs",
6
6
  "files": [
@@ -31,11 +31,9 @@ All clients extend `AuthApiBase` and accept an optional `baseUrl` and `http` fet
31
31
  | Client | Description |
32
32
  | --------------------------- | -------------------------------------------------------- |
33
33
  | `ExternalSignInClient` | External authentication provider sign-in |
34
- | `AppManifestClient` | Application manifest descriptor operations |
35
34
  | `AppsClient` | Application descriptor operations |
36
35
  | `AuthorizationClient` | Permission and role checking |
37
36
  | `ChangeLogClient` | Platform change log / audit trail |
38
- | `DeveloperToolsClient` | Developer-tools endpoint |
39
37
  | `DiagnosticsClient` | System diagnostics and health |
40
38
  | `DynamicPropertiesClient` | Dynamic property CRUD and dictionary management |
41
39
  | `JobsClient` | Background job management |
@@ -48,20 +46,20 @@ All clients extend `AuthApiBase` and accept an optional `baseUrl` and `http` fet
48
46
 
49
47
  ## Key DTOs (Interfaces)
50
48
 
51
- | Interface | Description |
52
- | -------------------------------- | -------------------------------------------------------------------------------- |
53
- | `PushNotification` | Push notification payload: `id`, `title`, `notifyType`, `isNew`, `created`, etc. |
54
- | `PushNotificationSearchCriteria` | Search criteria for notification queries |
55
- | `ApplicationUser` | Platform user with roles, permissions, logins |
56
- | `Role` | Security role with permissions |
57
- | `Permission` | Individual permission entry |
58
- | `DynamicProperty` | Dynamic property definition |
59
- | `DynamicObjectProperty` | Property value bound to an object |
60
- | `ModuleDescriptor` | Module metadata (id, version, dependencies) |
61
- | `ChangeLogSearchCriteria` | Audit log search parameters |
62
- | `ChangeLogSearchResult` | Paginated audit log results |
63
- | `ObjectSettingEntry` | Setting entry with value and metadata |
64
- | `License` | Platform license information |
49
+ | Interface | Description |
50
+ | -------------------------------- | --------------------------------------------------------------------------------- |
51
+ | `PushNotification` | Push notification payload: `id`, `title`, `notifyType`, `isNew`, `finished`, etc. |
52
+ | `PushNotificationSearchCriteria` | Search criteria for notification queries |
53
+ | `ApplicationUser` | Platform user with roles, permissions, logins |
54
+ | `Role` | Security role with permissions |
55
+ | `Permission` | Individual permission entry |
56
+ | `DynamicProperty` | Dynamic property definition |
57
+ | `DynamicObjectProperty` | Property value bound to an object |
58
+ | `ModuleDescriptor` | Module metadata (id, version, dependencies) |
59
+ | `ChangeLogSearchCriteria` | Audit log search parameters |
60
+ | `ChangeLogSearchResult` | Paginated audit log results |
61
+ | `ObjectSettingEntry` | Setting entry with value and metadata |
62
+ | `License` | Platform license information |
65
63
 
66
64
  ## Base Class
67
65
 
@@ -69,7 +67,7 @@ All clients extend `AuthApiBase` and accept an optional `baseUrl` and `http` fet
69
67
  export class AuthApiBase {
70
68
  authToken: string;
71
69
  setAuthToken(token: string): void;
72
- getBaseUrl(defaultUrl: string, baseUrl: string): string; // always returns ""
70
+ protected getBaseUrl(defaultUrl: string, baseUrl: string): string; // always returns ""
73
71
  protected transformOptions(options: RequestInit): Promise<RequestInit>; // sets the Bearer header only if `authToken` is non-empty
74
72
  }
75
73
  ```
@@ -88,7 +86,7 @@ const criteria: PushNotificationSearchCriteria = { take: 20, skip: 0 };
88
86
  const result = await client.searchPushNotification(criteria);
89
87
 
90
88
  console.log(`Found ${result.totalCount} notifications`);
91
- for (const notification of result.notifyEvents ?? []) {
89
+ for (const notification of result.results ?? []) {
92
90
  console.log(`${notification.title} (${notification.notifyType})`);
93
91
  }
94
92
  ```
@@ -102,7 +100,7 @@ const securityClient = new SecurityClient();
102
100
  const user = await securityClient.getCurrentUser();
103
101
 
104
102
  console.log(`Logged in as: ${user.userName}`);
105
- console.log(`Permissions: ${user.permissions?.join(", ")}`);
103
+ console.log(`Roles: ${user.roles?.map((r) => r.name).join(", ")}`);
106
104
  console.log(`Is admin: ${user.isAdministrator}`);
107
105
  ```
108
106
 
@@ -144,7 +142,7 @@ import { SettingClient, ObjectSettingEntry } from "@vc-shell/framework";
144
142
  const client = new SettingClient();
145
143
 
146
144
  // Read a specific setting
147
- const setting = await client.getGlobalSetting("VirtoCommerce.Notifications.SendGrid.ApiKey");
145
+ const settings = await client.getValues(["VirtoCommerce.Notifications.SendGrid.ApiKey"]);
148
146
 
149
147
  // Update a setting
150
148
  const entry: ObjectSettingEntry = {
@@ -2,7 +2,6 @@
2
2
  title: Blade Navigation Composables
3
3
  category: composables
4
4
  group: blade-navigation
5
- internal: true
6
5
  ---
7
6
 
8
7
  # Blade Navigation Composables
@@ -28,16 +27,11 @@ Blade navigation manages an ordered stack of blade descriptors (plain data objec
28
27
  ## Exports
29
28
 
30
29
  ```typescript
31
- export { useBladeStack } from "@core/blade-navigation/useBladeStack";
32
- export { useBladeMessaging } from "@core/blade-navigation/useBladeMessaging";
33
- export * from "@core/blade-navigation/types";
34
- export { __registerBladeConfig, getBladeConfig, getAllBladeConfigs } from "@core/blade-navigation/bladeConfigRegistry";
35
- export { useTableQueryState } from "@core/blade-navigation/table-query-state";
36
- export type { UseTableQueryStateReturn, TableQueryPatch } from "@core/blade-navigation/table-query-state";
30
+ export { useBladeNavigation } from "./useBladeNavigationAdapter";
31
+ export { createBladeStack, useBladeStack } from "./useBladeStack";
32
+ export { createBladeMessaging, useBladeMessaging } from "./useBladeMessaging";
37
33
  ```
38
34
 
39
- The `createBladeStack` / `createBladeMessaging` factories are internal (not re-exported); they are consumed directly by the framework rendering layer. `useBladeNavigation` is the adapter API documented below, which lives under `core/composables/useBladeNavigationAdapter/`, not in this package.
40
-
41
35
  <!-- internal:end -->
42
36
 
43
37
  ## useBladeStack
@@ -50,28 +44,27 @@ Creates a new stack instance. Called once by the navigation plugin.
50
44
 
51
45
  ### API
52
46
 
53
- | Method | Description |
54
- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
55
- | `openWorkspace(event)` | Sets the root blade (index 0). Closes all existing blades unconditionally. |
56
- | `openBlade(event)` | Opens a child blade after a parent. Closes any blades deeper than the parent (with guard checks). |
57
- | `closeBlade(bladeId)` | Closes a blade and all its children. Returns `true` if a guard prevented closing. |
58
- | `closeChildren(parentId)` | Closes all blades after the given parent. |
59
- | `replaceCurrentBlade(event)` | Destroys the current active blade and creates a new one at the same stack index with the same `parentId`. |
60
- | `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. |
61
- | `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing. |
62
- | `unregisterBeforeClose(bladeId)` | Removes a close guard. |
63
- | `setBladeError(bladeId, error)` | Sets an error on a blade descriptor (displayed as error banner). |
64
- | `clearBladeError(bladeId)` | Clears a blade's error. |
65
- | `setBladeTitle(bladeId, title)` | Updates the blade's title in the descriptor. |
66
- | `updateBladeQuery(bladeId, patch)` | Merges `patch` into the blade descriptor's `query`; keys with empty-string or nullish values are removed. Backs table URL-query-state persistence. |
47
+ | Method | Description |
48
+ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
49
+ | `openWorkspace(event)` | Sets the root blade (index 0). Closes all existing blades unconditionally. |
50
+ | `openBlade(event)` | Opens a child blade after a parent. Closes any blades deeper than the parent (with guard checks). |
51
+ | `closeBlade(bladeId)` | Closes a blade and all its children. Returns `true` if a guard prevented closing. |
52
+ | `closeChildren(parentId)` | Closes all blades after the given parent. |
53
+ | `replaceCurrentBlade(event)` | Destroys the current active blade and creates a new one at the same stack index with the same `parentId`. |
54
+ | `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. |
55
+ | `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing. |
56
+ | `unregisterBeforeClose(bladeId)` | Removes a close guard. |
57
+ | `setBladeError(bladeId, error)` | Sets an error on a blade descriptor (displayed as error banner). |
58
+ | `clearBladeError(bladeId)` | Clears a blade's error. |
59
+ | `setBladeTitle(bladeId, title)` | Updates the blade's title in the descriptor. |
67
60
 
68
61
  ### Computed
69
62
 
70
- | Property | Type | Description |
71
- | ------------- | ------------------------------------------- | ------------------------ |
72
- | `workspace` | `ComputedRef<BladeDescriptor \| undefined>` | The root blade (index 0) |
73
- | `blades` | `ComputedRef<readonly BladeDescriptor[]>` | Full ordered stack |
74
- | `activeBlade` | `ComputedRef<BladeDescriptor \| undefined>` | The last visible blade |
63
+ | Property | Type | Description |
64
+ | ------------- | ---------------------------- | ------------------------ |
65
+ | `workspace` | `BladeDescriptor` | The root blade (index 0) |
66
+ | `blades` | `readonly BladeDescriptor[]` | Full ordered stack |
67
+ | `activeBlade` | `BladeDescriptor` | The last visible blade |
75
68
 
76
69
  ### Composable: `useBladeStack()`
77
70
 
@@ -141,20 +134,18 @@ openBlade({
141
134
 
142
135
  The plain data object stored in the stack for each blade:
143
136
 
144
- | Field | Type | Description |
145
- | ------------- | -------------------------- | -------------------------------------------------------------------------- |
146
- | `id` | `string` | Unique instance ID (auto-generated) |
147
- | `name` | `string` | Blade registration name |
148
- | `url` | `string?` | URL segment for address bar sync |
149
- | `param` | `string?` | Parameter passed when opening (e.g., entity ID) |
150
- | `query` | `Record<string, string>?` | Query parameters |
151
- | `options` | `Record<string, unknown>?` | Arbitrary options passed to the blade |
152
- | `parentId` | `string?` | ID of the parent blade |
153
- | `visible` | `boolean` | Whether the blade is rendered (false when covered via `coverCurrentBlade`) |
154
- | `error` | `unknown?` | Error state for the error banner |
155
- | `title` | `string?` | Dynamic title override |
156
- | `maximized` | `boolean?` | Whether this blade is maximized (fullscreen) — set by VcBladeSlot |
157
- | `breadcrumbs` | `Breadcrumbs[]?` | Navigation breadcrumbs — set by VcBladeSlot |
137
+ | Field | Type | Description |
138
+ | ---------- | ---------- | -------------------------------------------------------------------------- |
139
+ | `id` | `string` | Unique instance ID (auto-generated) |
140
+ | `name` | `string` | Blade registration name |
141
+ | `url` | `string?` | URL segment for address bar sync |
142
+ | `param` | `unknown` | Parameter passed when opening (e.g., entity ID) |
143
+ | `query` | `Record?` | Query parameters |
144
+ | `options` | `unknown` | Arbitrary options passed to the blade |
145
+ | `parentId` | `string?` | ID of the parent blade |
146
+ | `visible` | `boolean` | Whether the blade is rendered (false when covered via `coverCurrentBlade`) |
147
+ | `error` | `unknown?` | Error state for the error banner |
148
+ | `title` | `string?` | Dynamic title override |
158
149
 
159
150
  ## Tips
160
151
 
@@ -172,6 +163,6 @@ The plain data object stored in the stack for each blade:
172
163
  <!-- internal:start -->
173
164
 
174
165
  - `framework/core/composables/useBlade/` -- `useBlade()`, `useBladeContext()` (new API)
175
- - `framework/shell/_internal/blade-navigation/plugin-v2.ts` -- plugin that creates and provides the stack/messaging
166
+ - `framework/shell/_internal/blade-nav/plugin-v2.ts` -- plugin that creates and provides the stack/messaging
176
167
  - `framework/core/blade-navigation/types/index.ts` -- `BladeDescriptor`, `IBladeStack`, `IBladeMessaging`
177
168
  <!-- internal:end -->
@@ -2,7 +2,6 @@
2
2
  title: useAppBarMobileButtons
3
3
  category: composables
4
4
  group: services
5
- internal: true
6
5
  ---
7
6
 
8
7
  # useAppBarMobileButtons
@@ -20,7 +19,7 @@ Manages custom action buttons in the mobile app bar. Uses provide/inject to shar
20
19
 
21
20
  ```vue
22
21
  <script setup lang="ts">
23
- import { useAppBarMobileButtons } from "@core/composables/useAppBarMobileButtons";
22
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
24
23
  import { onUnmounted, computed, ref } from "vue";
25
24
 
26
25
  const { register, unregister } = useAppBarMobileButtons();
@@ -57,7 +56,6 @@ onUnmounted(() => unregister("notifications-btn"));
57
56
  | Field | Type | Required | Description |
58
57
  | ----------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
59
58
  | `id` | `string` | Yes | Unique identifier. Used for register/unregister/lookup. |
60
- | `title` | `string` | No | Accessible name for the icon-only button (used as its `aria-label`; falls back to `id`). |
61
59
  | `icon` | `Component \| string` | No | Icon component or CSS class string (e.g., `'fas fa-bell'`). |
62
60
  | `component` | `Component` | No | Custom Vue component to render instead of a default icon button. |
63
61
  | `props` | `Record<string, unknown>` | No | Props passed to the custom `component`. |
@@ -86,7 +84,7 @@ provideAppBarMobileButtonsService();
86
84
 
87
85
  ```vue
88
86
  <script setup lang="ts">
89
- import { useAppBarMobileButtons } from "@core/composables/useAppBarMobileButtons";
87
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
90
88
  import { ref, computed, onUnmounted } from "vue";
91
89
 
92
90
  const { register, unregister } = useAppBarMobileButtons();
@@ -113,7 +111,7 @@ If you need more than an icon and a click handler (e.g., a dropdown or popover),
113
111
 
114
112
  ```vue
115
113
  <script setup lang="ts">
116
- import { useAppBarMobileButtons } from "@core/composables/useAppBarMobileButtons";
114
+ import { useAppBarMobileButtons } from "@vc-shell/framework";
117
115
  import { onUnmounted, markRaw } from "vue";
118
116
  import LanguageSwitcher from "./LanguageSwitcher.vue";
119
117
 
@@ -57,18 +57,16 @@ None.
57
57
 
58
58
  ### registerAppBarWidgetOptions
59
59
 
60
- | Field | Type | Required | Description |
61
- | ------------- | ---------------------------- | -------- | ------------------------------------------------------------- |
62
- | `id` | `string` | No | Custom ID; auto-generated if omitted |
63
- | `order` | `number` | No | Sort order in the hub Widgets list (lower = appears first) |
64
- | `title` | `string` | No | Tooltip or label text |
65
- | `icon` | `Component \| string` | No | Lucide icon name or a Vue component |
66
- | `component` | `Component` | No | Custom Vue component to render instead of default icon button |
67
- | `props` | `Record<string, unknown>` | No | Props to pass to the custom component |
68
- | `onClick` | `() => void` | No | Click handler for the default icon button |
69
- | `slot` | `string` | No | Named slot target for placement control |
70
- | `badge` | `boolean \| (() => boolean)` | No | Show a badge indicator; pass a getter for reactive state |
71
- | `searchTerms` | `string[]` | No | Extra keywords used to match the widget in hub search |
60
+ | Field | Type | Required | Description |
61
+ | ----------- | ------------------------- | -------- | ------------------------------------------------------------- |
62
+ | `id` | `string` | No | Custom ID; auto-generated if omitted |
63
+ | `order` | `number` | No | Sort order in the hub Widgets list (lower = appears first) |
64
+ | `title` | `string` | No | Tooltip or label text |
65
+ | `icon` | `Component \| string` | No | Lucide icon name or a Vue component |
66
+ | `component` | `Component` | No | Custom Vue component to render instead of default icon button |
67
+ | `props` | `Record<string, unknown>` | No | Props to pass to the custom component |
68
+ | `onClick` | `() => void` | No | Click handler for the default icon button |
69
+ | `slot` | `string` | No | Named slot target for placement control |
72
70
 
73
71
  ### Additional Exports
74
72
 
@@ -50,10 +50,9 @@ export default router;
50
50
 
51
51
  ### Injection Key
52
52
 
53
- | Key | Type | Description |
54
- | ------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
55
- | `AppInsightsOptionsKey` | `InjectionKey<AppInsightsPluginOptions>` | Optional. Provide this at app level with `{ appName: 'Operations Console' }` to prefix all page names. |
56
- | `AppInsightsInstanceKey` | `InjectionKey<ApplicationInsights \| null>` | Carries the Application Insights instance that `useAppInsights` injects (returned as `appInsights`). |
53
+ | Key | Type | Description |
54
+ | ----------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------ |
55
+ | `AppInsightsOptionsKey` | `InjectionKey<AppInsightsPluginOptions>` | Optional. Provide this at app level with `{ appName: 'Operations Console' }` to prefix all page names. |
57
56
 
58
57
  ## How It Works
59
58
 
@@ -73,8 +72,7 @@ import { useAppInsights } from "@vc-shell/framework";
73
72
  const { appInsights } = useAppInsights();
74
73
 
75
74
  function trackOrderPlaced(orderId: string, total: number) {
76
- // appInsights is null when the AI plugin is not installed
77
- appInsights?.trackEvent({
75
+ appInsights.trackEvent({
78
76
  name: "OrderPlaced",
79
77
  properties: { orderId },
80
78
  measurements: { orderTotal: total },
@@ -82,7 +80,7 @@ function trackOrderPlaced(orderId: string, total: number) {
82
80
  }
83
81
 
84
82
  function trackSearchPerformed(query: string, resultCount: number) {
85
- appInsights?.trackEvent({
83
+ appInsights.trackEvent({
86
84
  name: "SearchPerformed",
87
85
  properties: { query },
88
86
  measurements: { resultCount },
@@ -6,8 +6,6 @@ group: data
6
6
 
7
7
  # useAssets
8
8
 
9
- > **Deprecated.** `useAssets` is deprecated in favor of [`useAssetsManager(ref, options)`](../useAssetsManager/). Calling it logs a DEV console warning. This page is kept as legacy/migration guidance; new code should use `useAssetsManager`, which wraps `useAssets` with two-way sync.
10
-
11
9
  Handles file upload, removal, and editing for `ICommonAsset` arrays (images, documents, etc.). This composable encapsulates the platform's asset storage API, handling multipart form upload with batched concurrency (max 4 simultaneous uploads), sort-order assignment, URL decoding, and immutable array operations for remove and edit. It returns a new array from every operation rather than mutating in place, which plays well with Vue's reactivity system and makes undo/redo patterns straightforward.
12
10
 
13
11
  ## When to Use
@@ -34,8 +32,8 @@ async function onFilesSelected(fileList: FileList) {
34
32
  assets.value = [...assets.value, ...newAssets];
35
33
  }
36
34
 
37
- function onRemoveAsset(toDelete: ICommonAsset) {
38
- assets.value = remove([toDelete], assets.value);
35
+ function onDeleteAssets(toDelete: ICommonAsset[]) {
36
+ assets.value = remove(toDelete, assets.value);
39
37
  }
40
38
 
41
39
  function onUpdateAltText(asset: ICommonAsset, altText: string) {
@@ -49,9 +47,9 @@ function onUpdateAltText(asset: ICommonAsset, altText: string) {
49
47
  :loading="loading"
50
48
  >
51
49
  <VcGallery
52
- :images="assets"
50
+ :assets="assets"
53
51
  @upload="onFilesSelected"
54
- @remove="onRemoveAsset"
52
+ @delete="onDeleteAssets"
55
53
  />
56
54
  </VcBlade>
57
55
  </template>
@@ -64,7 +62,7 @@ function onUpdateAltText(asset: ICommonAsset, altText: string) {
64
62
  | Property | Type | Description |
65
63
  | --------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
66
64
  | `upload` | `(files: FileList, uploadPath: string, startingSortOrder?: number) => Promise<ICommonAsset[]>` | Upload files in parallel batches (max 4 concurrent). Returns only successfully uploaded assets. Sort orders are assigned incrementally from `startingSortOrder + 1`. |
67
- | `remove` | `(filesToDelete: ICommonAsset[], initialAssetArr: ICommonAsset[]) => ICommonAsset[]` | Return a new array with deleted items removed. Matching is done by `url`. The original array is not mutated. |
65
+ | `remove` | `(filesToDelete: ICommonAsset[], initialAssetArr: ICommonAsset[]) => ICommonAsset[]` | Return a new array with deleted items removed. Matching is done by `url` field. The original array is not mutated. |
68
66
  | `edit` | `(updatedFiles: ICommonAsset[], initialAssetArr: ICommonAsset[]) => ICommonAsset[]` | Merge updated fields into existing assets (matched by `url`). If `updatedFiles.length === initialAssetArr.length`, the entire array is replaced (reorder mode). |
69
67
  | `loading` | `ComputedRef<boolean>` | Whether an upload or remove operation is currently in progress. |
70
68
 
@@ -132,7 +130,7 @@ async function handleUpload(files: FileList) {
132
130
 
133
131
  ## Tips
134
132
 
135
- - **Sort order starts from `startingSortOrder + 1`.** If you pass `startingSortOrder: 5` and upload 3 files, they get sort orders 6, 7, and 8. Pass `0` to start from 1. Omitting `startingSortOrder` assigns `0` to every uploaded asset (no incremental ordering).
133
+ - **Sort order starts from `startingSortOrder + 1`.** If you pass `startingSortOrder: 5` and upload 3 files, they get sort orders 6, 7, and 8. Pass `0` or omit it to start from 1.
136
134
  - **Failed uploads are silently filtered.** If one file in a batch fails, the others still succeed. The returned array only contains successfully uploaded assets. Check the browser console for error logs from the `use-assets` logger.
137
135
  - **`remove` matches by `url`, not by `id`.** Assets may not have stable IDs before they are saved to the server. The `url` field is used as the matching key because it is always present after upload.
138
136
  - **Each `useAssets()` call creates an independent instance.** Unlike singleton composables, calling `useAssets()` twice gives you two separate `loading` states. This is useful if different parts of your blade upload to different paths.
@@ -58,7 +58,7 @@ const assets = useAssetsManager(ref, options);
58
58
 
59
59
  ```typescript
60
60
  import { useAssetsManager } from "@vc-shell/framework";
61
- import { computed } from "vue";
61
+ import { toRef } from "vue";
62
62
 
63
63
  const assets = useAssetsManager(
64
64
  computed({
@@ -89,8 +89,6 @@ const assets = useAssetsManager(
89
89
  Wrap a single value in a computed array:
90
90
 
91
91
  ```typescript
92
- import { computed } from "vue";
93
-
94
92
  const photoAssets = computed({
95
93
  get: () => (user.value?.iconUrl ? [{ url: user.value.iconUrl }] : []),
96
94
  set: (val) => {
@@ -81,7 +81,7 @@ type AsyncAction<Payload = void, Result = void> = (payload?: Payload, ...rest: a
81
81
 
82
82
  | Property | Type | Description |
83
83
  | --------- | --------------------------------------------- | -------------------------------------------------------------- |
84
- | `loading` | `Readonly<Ref<boolean>>` | Reactive loading state -- `true` while the action is executing |
84
+ | `loading` | `DeepReadonly<Ref<boolean>>` | Reactive loading state -- `true` while the action is executing |
85
85
  | `error` | `DeepReadonly<Ref<DisplayableError \| null>>` | Reactive error -- set on failure, cleared on next invocation |
86
86
  | `action` | `AsyncAction<Payload, Result>` | Wrapped function with the same signature as `innerAction` |
87
87
 
@@ -2,7 +2,6 @@
2
2
  title: useBladeRegistry
3
3
  category: composables
4
4
  group: blade-navigation
5
- internal: true
6
5
  ---
7
6
 
8
7
  # useBladeRegistry
@@ -27,7 +26,7 @@ Internally, the registry maintains a reactive `Map<string, IBladeRegistrationDat
27
26
  ## Basic Usage
28
27
 
29
28
  ```typescript
30
- import { useBladeRegistry } from "@core/composables/useBladeRegistry";
29
+ import { useBladeRegistry } from "@vc-shell/framework";
31
30
 
32
31
  const { getBlade, getBladeComponent } = useBladeRegistry();
33
32
 
@@ -62,8 +61,7 @@ const component = getBladeComponent("OrderDetails");
62
61
 
63
62
  ```typescript
64
63
  <script setup lang="ts">
65
- import { useBladeRegistry } from "@core/composables/useBladeRegistry";
66
- import { useBlade } from "@vc-shell/framework";
64
+ import { useBladeRegistry, useBlade } from "@vc-shell/framework";
67
65
 
68
66
  const { getBlade } = useBladeRegistry();
69
67
  const { openBlade } = useBlade();
@@ -82,7 +80,7 @@ function navigateTo(bladeName: string, param?: string) {
82
80
  ### Deep link resolution
83
81
 
84
82
  ```typescript
85
- import { useBladeRegistry } from "@core/composables/useBladeRegistry";
83
+ import { useBladeRegistry } from "@vc-shell/framework";
86
84
 
87
85
  const { getBladeByRoute } = useBladeRegistry();
88
86
 
@@ -107,7 +105,7 @@ resolveDeepLink("/orders"); // Same result
107
105
 
108
106
  ```typescript
109
107
  <script setup lang="ts">
110
- import { useBladeRegistry } from "@core/composables/useBladeRegistry";
108
+ import { useBladeRegistry } from "@vc-shell/framework";
111
109
 
112
110
  const { registeredBladesMap } = useBladeRegistry();
113
111
 
@@ -123,8 +121,7 @@ const workspaceBlades = computed(() =>
123
121
  ### Checking permissions before navigation
124
122
 
125
123
  ```typescript
126
- import { useBladeRegistry } from "@core/composables/useBladeRegistry";
127
- import { usePermissions } from "@vc-shell/framework";
124
+ import { useBladeRegistry, usePermissions } from "@vc-shell/framework";
128
125
 
129
126
  const { getBlade } = useBladeRegistry();
130
127
  const { hasAccess } = usePermissions();
@@ -82,17 +82,17 @@ Inline `useBladeWidgets([...])` is fine for one-off widgets, but extracting beco
82
82
 
83
83
  ### HeadlessWidgetDeclaration
84
84
 
85
- | Field | Type | Required | Description |
86
- | ----------- | -------------------------------------------------------- | -------- | ----------------------------------------- |
87
- | `id` | `string` | Yes | Unique widget identifier |
88
- | `icon` | `string` | Yes | Icon name (e.g., `"lucide-tag"`) |
89
- | `title` | `string` | Yes | i18n key or display title |
90
- | `badge` | `Ref<number \| string> \| ComputedRef<number \| string>` | No | Badge counter value |
91
- | `loading` | `Ref<boolean> \| ComputedRef<boolean>` | No | Show loading indicator |
92
- | `disabled` | `Ref<boolean> \| boolean` | No | Disable the widget |
93
- | `isVisible` | `ComputedRef<boolean> \| Ref<boolean> \| boolean` | No | Toggle visibility |
94
- | `onClick` | `() => void` | No | Action when widget is clicked |
95
- | `onRefresh` | `() => void \| Promise<void>` | No | Called by `refresh(id)` or `refreshAll()` |
85
+ | Field | Type | Required | Description |
86
+ | ----------- | --------------------------------- | -------- | ----------------------------------------- |
87
+ | `id` | `string` | Yes | Unique widget identifier |
88
+ | `icon` | `string` | Yes | Icon name (e.g., `"lucide-tag"`) |
89
+ | `title` | `string` | Yes | i18n key or display title |
90
+ | `badge` | `Ref<number \| string>` | No | Badge counter value |
91
+ | `loading` | `Ref<boolean>` | No | Show loading indicator |
92
+ | `disabled` | `Ref<boolean> \| boolean` | No | Disable the widget |
93
+ | `isVisible` | `ComputedRef<boolean> \| boolean` | No | Toggle visibility |
94
+ | `onClick` | `() => void` | No | Action when widget is clicked |
95
+ | `onRefresh` | `() => void \| Promise<void>` | No | Called by `refresh(id)` or `refreshAll()` |
96
96
 
97
97
  ### Returns
98
98
 
@@ -331,5 +331,5 @@ const { refreshAll } = useBladeWidgets([]);
331
331
 
332
332
  - `WidgetService` in `framework/core/services/widget-service/` -- underlying service
333
333
  - `WidgetScope` in `framework/ui/components/organisms/vc-blade/_internal/widgets/WidgetScope.vue` -- provides `WidgetScopeKey` to widget components
334
- - `VcBladeSlot` in `framework/shell/_internal/blade-navigation/components/vc-blade-slot/` -- provides `BladeDescriptorKey` to blade components
334
+ - `VcBladeSlot` in `framework/shell/_internal/blade-nav/` -- provides `BladeDescriptorKey` to blade components
335
335
  <!-- internal:end -->
@@ -81,10 +81,10 @@ push({
81
81
 
82
82
  ```typescript
83
83
  <script setup lang="ts">
84
- import { useBreadcrumbs, useBlade } from "@vc-shell/framework";
84
+ import { useBreadcrumbs, useBladeContext } from "@vc-shell/framework";
85
85
 
86
86
  const { push } = useBreadcrumbs();
87
- const { openBlade } = useBlade();
87
+ const { openBlade } = useBladeContext();
88
88
 
89
89
  // Level 1: Catalog
90
90
  push({
@@ -183,4 +183,4 @@ onBeforeUnmount(() => remove([crumbId]));
183
183
 
184
184
  - [useBlade](../useBlade/) -- blade navigation composable
185
185
  - [VcBlade](../../../ui/components/organisms/vc-blade/) -- blade component that displays breadcrumbs
186
- - `framework/core/types/breadcrumbs.ts` -- `Breadcrumbs` interface definition
186
+ - `framework/ui/types/form-field.ts` -- `Breadcrumbs` interface definition
@@ -2,7 +2,6 @@
2
2
  title: useConnectionStatus
3
3
  category: composables
4
4
  group: ui-state
5
- internal: true
6
5
  ---
7
6
 
8
7
  # useConnectionStatus
@@ -19,7 +18,7 @@ Monitors the browser's network connectivity and shows a persistent notification
19
18
 
20
19
  ```vue
21
20
  <script setup lang="ts">
22
- import { useConnectionStatus } from "@core/composables/useConnectionStatus";
21
+ import { useConnectionStatus } from "@vc-shell/framework";
23
22
 
24
23
  const { isOnline } = useConnectionStatus();
25
24
  </script>
@@ -70,7 +69,7 @@ When connectivity is restored, the notification is removed, the CSS class is cle
70
69
 
71
70
  ```vue
72
71
  <script setup lang="ts">
73
- import { useConnectionStatus } from "@core/composables/useConnectionStatus";
72
+ import { useConnectionStatus } from "@vc-shell/framework";
74
73
  import { watch, ref } from "vue";
75
74
 
76
75
  const { isOnline } = useConnectionStatus();
@@ -126,4 +125,4 @@ html.vc-offline {
126
125
  ## Related
127
126
 
128
127
  - `@vueuse/core` `useNetwork` -- underlying browser API wrapper
129
- - `notification` from `@core/notifications/notification` -- the notification system used to display the offline warning
128
+ - `notification` from `@shared/components/notifications` -- the notification system used to display the offline warning
@@ -55,7 +55,6 @@ const { getPropertyValue, setPropertyValue, loadDictionaries, loadMeasurements,
55
55
  | `value` | `string \| IBasePropertyValue[] \| (IBasePropertyDictionaryItem & { value: string })[]` | The new value. Type depends on property configuration. |
56
56
  | `dictionary` | `IBasePropertyDictionaryItem[]?` | Dictionary items. Required when setting a dictionary value. |
57
57
  | `locale` | `string?` | Current locale for multilanguage properties. |
58
- | `initialProp` | `IBaseProperty?` | Original property snapshot, used to reconcile prior values. |
59
58
  | `unitOfMeasureId` | `string?` | Unit of measure ID for measure-type properties. |
60
59
  | `colorCode` | `string?` | Color hex code for color-type properties. |
61
60
 
@@ -59,9 +59,9 @@ initOnce(); // still returns cached result
59
59
  ## How They Work
60
60
 
61
61
  - **debounce**: Uses `setTimeout` / `clearTimeout` internally. Each call clears the previous timeout and starts a new one. The function only fires when there is a pause of at least `delay` ms between calls.
62
- - **throttle**: Uses a `wasThrottled` boolean flag. The first call fires immediately and sets the flag; a `setTimeout` clears the flag after `delay` ms. Calls within that window are silently dropped.
62
+ - **throttle**: Uses a `Date.now()` timestamp check. The first call fires immediately and records the timestamp. Subsequent calls are silently dropped until enough time has passed.
63
63
  - **delay**: A simple wrapper around `setTimeout`. Useful for readability when you want to express "do X after Y ms" without creating a raw timeout.
64
- - **once**: Caches the result in a module-level `WeakMap` keyed by the wrapped function. The first call invokes the function and stores its result; every later call returns the stored value via the map and never re-invokes.
64
+ - **once**: Wraps the function with a boolean guard. After the first call, the result is cached and the original function reference is never called again.
65
65
 
66
66
  ## Recipe: Debounced Search in a Blade Toolbar
67
67
 
@@ -111,7 +111,7 @@ function onSearchInput(value: string) {
111
111
 
112
112
  - **No cancellation API.** Unlike `@vueuse/core`'s `useDebounceFn`, the `debounce` here does not return a cancel method. If you need to cancel a pending debounce on component unmount, use VueUse instead or manually clear the timeout.
113
113
  - **Throttle uses leading-edge firing.** The first call always executes immediately. If you need trailing-edge throttle (fire after the window closes), this implementation does not support it -- use lodash `throttle` with `{ trailing: true }` instead.
114
- - **`once` caches even `undefined` results.** If the wrapped function returns `undefined`, subsequent calls still skip execution and return `undefined`. Caching is based on the WeakMap having an entry for the function ("has it been called"), not on whether the result was truthy.
114
+ - **`once` caches even `undefined` results.** If the wrapped function returns `undefined`, subsequent calls still skip execution and return `undefined`. The guard is based on "has it been called", not "did it return a truthy value".
115
115
  - **`delay(fn, 0)` is not the same as `nextTick`.** `delay` uses `setTimeout(fn, 0)`, which defers to the next macrotask. Vue's `nextTick` defers to the next microtask, which fires sooner. Use `nextTick` for DOM update timing.
116
116
 
117
117
  ## Related
@@ -2,7 +2,6 @@
2
2
  title: useKeyboardNavigation
3
3
  category: composables
4
4
  group: ui-state
5
- internal: true
6
5
  ---
7
6
 
8
7
  # useKeyboardNavigation
@@ -21,8 +20,8 @@ The composable supports two attachment modes: **auto-attach** on mount via a CSS
21
20
 
22
21
  ```vue
23
22
  <script setup lang="ts">
24
- import { useKeyboardNavigation } from "@core/composables/useKeyboardNavigation";
25
- import { ref, nextTick } from "vue";
23
+ import { useKeyboardNavigation } from "@vc-shell/framework";
24
+ import { ref } from "vue";
26
25
 
27
26
  const menuRef = ref<HTMLElement | null>(null);
28
27
  const items = ref(["Dashboard", "Products", "Orders", "Settings"]);
@@ -113,7 +112,7 @@ Auto-attach happens in `onMounted`: if `containerSelector` is set and a matching
113
112
 
114
113
  ```vue
115
114
  <script setup lang="ts">
116
- import { useKeyboardNavigation } from "@core/composables/useKeyboardNavigation";
115
+ import { useKeyboardNavigation } from "@vc-shell/framework";
117
116
  import { ref, watch, nextTick } from "vue";
118
117
 
119
118
  const dropdownRef = ref<HTMLElement | null>(null);
@@ -181,7 +180,7 @@ function selectSuggestion(value: string) {
181
180
  - **Items are re-queried on every key press.** This means dynamically added or removed items are picked up automatically. You do not need to re-initialize after the list changes.
182
181
  - **`loop: false` stops at boundaries.** When looping is disabled, pressing ArrowDown on the last item or ArrowUp on the first item does nothing. This is appropriate for linear navigation patterns.
183
182
  - **Clean up if you manually init.** While auto-attached listeners are cleaned up on `onBeforeUnmount`, if you call `initKeyboardNavigation` on a dynamic element, call `cleanupKeyboardNavigation` when that element is removed.
184
- - **Tab moves the focused index but is not trapped.** Tab/Shift+Tab advances the composable's focused item, but it does not call `preventDefault`, so the browser's native Tab behavior still applies and focus can leave the container. This follows the WAI-ARIA composite widget pattern.
183
+ - **Tab key is intercepted.** The composable handles Tab/Shift+Tab within the container, moving focus between items rather than leaving the container. This follows the WAI-ARIA composite widget pattern.
185
184
 
186
185
  ## Related
187
186