@vc-shell/vc-app-skill 2.0.0-alpha.32 → 2.0.0-alpha.33-pr220.455e322

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 +59 -47
  2. package/README.md +18 -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 +94 -0
  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 +31 -27
  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 +75 -19
  29. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
  30. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +74 -78
  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 +10 -10
  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/usePopup/usePopup.docs.md +32 -24
  46. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
  47. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +24 -15
  48. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
  49. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
  50. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
  51. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
  52. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
  53. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
  54. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
  55. package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
  56. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
  57. package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
  58. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
  59. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
  60. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
  61. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +107 -91
  62. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
  63. package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
  64. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +98 -90
  65. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
  66. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
  67. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
  68. package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
  69. package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
  70. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
  71. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
  72. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
  73. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
  74. package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
  75. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
  76. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
  77. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +102 -0
  78. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
  79. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
  80. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
  81. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
  82. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
  83. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
  84. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
  85. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
  86. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
  87. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  88. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
  89. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +12 -18
  90. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
  91. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
  92. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
  93. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
  94. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
  95. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
  96. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
  97. package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
  98. package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
  99. package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
  100. package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +104 -59
  101. package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
  102. package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
  103. package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
  104. package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
  105. package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
  106. package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
  107. package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
  108. package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
  109. package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
  110. package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
  111. package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
  112. package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
  113. package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
  114. package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
  115. package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
  116. package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
  117. package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
  118. package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
  119. package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +59 -44
  120. package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
  121. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +96 -64
  122. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +26 -35
  123. package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +69 -22
  124. package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +58 -72
  125. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
  126. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
  127. package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +60 -72
  128. package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +65 -26
  129. package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +46 -49
  130. package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
  131. package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
  132. package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +115 -130
  133. package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +53 -87
  134. package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +56 -63
  135. package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
  136. package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
  137. package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +63 -64
  138. package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
  139. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +59 -19
  140. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +25 -34
  141. package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +42 -32
  142. package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +78 -82
  143. package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +25 -15
  144. package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +59 -63
  145. package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +57 -69
  146. package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
  147. package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
  148. package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
  149. package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +120 -75
  150. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +30 -44
  151. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +536 -365
  152. package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
  153. package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
  154. package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
  155. package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
  156. package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
  157. package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
  158. package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
  159. package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
  160. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
  161. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
  162. package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
  163. package/runtime/knowledge/examples/offers-module.md +15 -13
  164. package/runtime/knowledge/examples/team-module.md +82 -119
  165. package/runtime/knowledge/examples/videos-module.md +44 -17
  166. package/runtime/knowledge/index.md +22 -0
  167. package/runtime/knowledge/migration-prompts/blade-form-migration.md +255 -0
  168. package/runtime/knowledge/migration-prompts/blade-props-migration.md +194 -0
  169. package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
  170. package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
  171. package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
  172. package/runtime/knowledge/migration-prompts/notifications-migration.md +223 -0
  173. package/runtime/knowledge/migration-prompts/nswag-migration.md +244 -0
  174. package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
  175. package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
  176. package/runtime/knowledge/migration-prompts/widgets-migration.md +178 -0
  177. package/runtime/knowledge/patterns/assets-management.md +20 -20
  178. package/runtime/knowledge/patterns/blade-navigation.md +7 -14
  179. package/runtime/knowledge/patterns/blade-widget.md +19 -17
  180. package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
  181. package/runtime/knowledge/patterns/composable-details.md +20 -50
  182. package/runtime/knowledge/patterns/composable-list.md +43 -31
  183. package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
  184. package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
  185. package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
  186. package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
  187. package/runtime/knowledge/patterns/form-validation.md +28 -64
  188. package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
  189. package/runtime/knowledge/patterns/module-structure.md +7 -1
  190. package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
  191. package/runtime/knowledge/patterns/notification-template.md +21 -14
  192. package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
  193. package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
  194. package/runtime/vc-app.md +354 -49
  195. package/runtime/knowledge/docs/core/constants/constants.docs.md +0 -185
@@ -16,42 +16,41 @@ Internally uses a strategy pattern — each property type (regular, boolean, dic
16
16
  ```typescript
17
17
  import { useDynamicProperties } from "@vc-shell/framework";
18
18
 
19
- const { getPropertyValue, setPropertyValue, loadDictionaries, loadMeasurements, loading } =
20
- useDynamicProperties({
21
- searchDictionary: (criteria) => api.searchPropertyDictionaryItems(criteria),
22
- searchMeasurements: (measureId, locale) => api.searchMeasurements(measureId, locale),
23
- });
19
+ const { getPropertyValue, setPropertyValue, loadDictionaries, loadMeasurements, loading } = useDynamicProperties({
20
+ searchDictionary: (criteria) => api.searchPropertyDictionaryItems(criteria),
21
+ searchMeasurements: (measureId, locale) => api.searchMeasurements(measureId, locale),
22
+ });
24
23
  ```
25
24
 
26
25
  ## API
27
26
 
28
27
  ### Options
29
28
 
30
- | Option | Type | Required | Description |
31
- |--------|------|----------|-------------|
32
- | `searchDictionary` | `(criteria: IBasePropertyDictionaryItemSearchCriteria) => Promise<IBasePropertyDictionaryItem[] \| undefined>` | Yes | API function to search dictionary items by property ID and keyword |
33
- | `searchMeasurements` | `(measureId: string, locale?: string) => Promise<IBaseMeasurementDictionaryItem[] \| undefined>` | No | API function for loading measurement units. Only needed for measure-type properties |
29
+ | Option | Type | Required | Description |
30
+ | -------------------- | -------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------- |
31
+ | `searchDictionary` | `(criteria: IBasePropertyDictionaryItemSearchCriteria) => Promise<IBasePropertyDictionaryItem[] \| undefined>` | Yes | API function to search dictionary items by property ID and keyword |
32
+ | `searchMeasurements` | `(measureId: string, locale?: string) => Promise<IBaseMeasurementDictionaryItem[] \| undefined>` | No | API function for loading measurement units. Only needed for measure-type properties |
34
33
 
35
34
  ### Returns
36
35
 
37
- | Property | Type | Description |
38
- |----------|------|-------------|
39
- | `getPropertyValue` | `(property, locale) => PropertyDisplayValue` | Read display value for a property. Returns string, boolean, or array depending on type. Does NOT mutate the property. |
40
- | `setPropertyValue` | `(params: SetPropertyValueParams) => void` | Write value to a property. Handles type-specific transformation and empty cleanup. |
41
- | `loadDictionaries` | `(propertyId, keyword?, locale?) => Promise<...>` | Load dictionary items. If locale is provided, resolves localized values. |
42
- | `loadMeasurements` | `(measureId, keyword?, locale?) => Promise<...>` | Load measurement units. No-op if `searchMeasurements` was not provided. |
43
- | `loading` | `ComputedRef<boolean>` | Whether a dictionary lookup is in progress. |
36
+ | Property | Type | Description |
37
+ | ------------------ | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
38
+ | `getPropertyValue` | `(property, locale) => PropertyDisplayValue` | Read display value for a property. Returns string, boolean, or array depending on type. Does NOT mutate the property. |
39
+ | `setPropertyValue` | `(params: SetPropertyValueParams) => void` | Write value to a property. Handles type-specific transformation and empty cleanup. |
40
+ | `loadDictionaries` | `(propertyId, keyword?, locale?) => Promise<...>` | Load dictionary items. If locale is provided, resolves localized values. |
41
+ | `loadMeasurements` | `(measureId, keyword?, locale?) => Promise<...>` | Load measurement units. No-op if `searchMeasurements` was not provided. |
42
+ | `loading` | `ComputedRef<boolean>` | Whether a dictionary lookup is in progress. |
44
43
 
45
44
  ### SetPropertyValueParams
46
45
 
47
- | Field | Type | Description |
48
- |-------|------|-------------|
49
- | `property` | `IBaseProperty` | The property object to update. Modified in place. |
50
- | `value` | `string \| IBasePropertyValue[] \| (IBasePropertyDictionaryItem & { value: string })[]` | The new value. Type depends on property configuration. |
51
- | `dictionary` | `IBasePropertyDictionaryItem[]?` | Dictionary items. Required when setting a dictionary value. |
52
- | `locale` | `string?` | Current locale for multilanguage properties. |
53
- | `unitOfMeasureId` | `string?` | Unit of measure ID for measure-type properties. |
54
- | `colorCode` | `string?` | Color hex code for color-type properties. |
46
+ | Field | Type | Description |
47
+ | ----------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
48
+ | `property` | `IBaseProperty` | The property object to update. Modified in place. |
49
+ | `value` | `string \| IBasePropertyValue[] \| (IBasePropertyDictionaryItem & { value: string })[]` | The new value. Type depends on property configuration. |
50
+ | `dictionary` | `IBasePropertyDictionaryItem[]?` | Dictionary items. Required when setting a dictionary value. |
51
+ | `locale` | `string?` | Current locale for multilanguage properties. |
52
+ | `unitOfMeasureId` | `string?` | Unit of measure ID for measure-type properties. |
53
+ | `colorCode` | `string?` | Color hex code for color-type properties. |
55
54
 
56
55
  ### PropertyDisplayValue
57
56
 
@@ -65,13 +64,13 @@ type PropertyDisplayValue = string | IBasePropertyValue[] | boolean;
65
64
 
66
65
  The composable resolves a strategy handler based on property flags:
67
66
 
68
- | Priority | Condition | Strategy | Handles |
69
- |----------|-----------|----------|---------|
70
- | 1 | `valueType === "Measure"` | measureStrategy | Numeric input with unit dropdown |
71
- | 2 | `valueType === "Color"` && !dictionary | colorStrategy | Color picker, multivalue colors |
72
- | 3 | `valueType === "Boolean"` | booleanStrategy | Checkbox/switch |
73
- | 4 | `dictionary === true` | dictionaryStrategy | Select dropdowns with localized options |
74
- | 5 | (default) | regularStrategy | ShortText, LongText, Number, Integer, DateTime |
67
+ | Priority | Condition | Strategy | Handles |
68
+ | -------- | -------------------------------------- | ------------------ | ---------------------------------------------- |
69
+ | 1 | `valueType === "Measure"` | measureStrategy | Numeric input with unit dropdown |
70
+ | 2 | `valueType === "Color"` && !dictionary | colorStrategy | Color picker, multivalue colors |
71
+ | 3 | `valueType === "Boolean"` | booleanStrategy | Checkbox/switch |
72
+ | 4 | `dictionary === true` | dictionaryStrategy | Select dropdowns with localized options |
73
+ | 5 | (default) | regularStrategy | ShortText, LongText, Number, Integer, DateTime |
75
74
 
76
75
  ### Value Getting
77
76
 
@@ -124,11 +123,10 @@ This ensures that `useBladeForm`'s deep comparison correctly detects "no change"
124
123
  <script setup lang="ts">
125
124
  import { useDynamicProperties } from "@vc-shell/framework";
126
125
 
127
- const { getPropertyValue, setPropertyValue, loadDictionaries, loadMeasurements } =
128
- useDynamicProperties({
129
- searchDictionary: searchDictionaryItems,
130
- searchMeasurements: searchMeasurementItems,
131
- });
126
+ const { getPropertyValue, setPropertyValue, loadDictionaries, loadMeasurements } = useDynamicProperties({
127
+ searchDictionary: searchDictionaryItems,
128
+ searchMeasurements: searchMeasurementItems,
129
+ });
132
130
  </script>
133
131
  ```
134
132
 
@@ -13,17 +13,24 @@ Captures and normalizes errors within a component's subtree using Vue's `onError
13
13
 
14
14
  ```vue
15
15
  <script setup lang="ts">
16
- import { useErrorHandler } from '@vc-shell/framework';
16
+ import { useErrorHandler } from "@vc-shell/framework";
17
17
 
18
18
  // capture: true prevents the error from propagating further up the tree
19
19
  const { error, reset } = useErrorHandler(true);
20
20
  </script>
21
21
 
22
22
  <template>
23
- <div v-if="error" class="tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded">
23
+ <div
24
+ v-if="error"
25
+ class="tw-p-4 tw-bg-red-50 tw-border tw-border-red-200 tw-rounded"
26
+ >
24
27
  <p class="tw-text-red-700 tw-font-semibold">{{ error.message }}</p>
25
28
  <p class="tw-text-red-500 tw-text-sm tw-mt-1">{{ error.details }}</p>
26
- <VcButton class="tw-mt-2" @click="reset">Dismiss</VcButton>
29
+ <VcButton
30
+ class="tw-mt-2"
31
+ @click="reset"
32
+ >Dismiss</VcButton
33
+ >
27
34
  </div>
28
35
  <slot v-else />
29
36
  </template>
@@ -33,28 +40,29 @@ const { error, reset } = useErrorHandler(true);
33
40
 
34
41
  ### Parameters
35
42
 
36
- | Parameter | Type | Required | Description |
37
- |-----------|------|----------|-------------|
38
- | `capture` | `boolean` | No | If `true`, prevents the error from propagating further up the component tree (the error is "swallowed" at this level). If `false` or `undefined`, the error continues propagating to parent error handlers. |
43
+ | Parameter | Type | Required | Description |
44
+ | --------- | --------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
45
+ | `capture` | `boolean` | No | If `true`, prevents the error from propagating further up the component tree (the error is "swallowed" at this level). If `false` or `undefined`, the error continues propagating to parent error handlers. |
39
46
 
40
47
  ### Returns
41
48
 
42
- | Property | Type | Description |
43
- |----------|------|-------------|
44
- | `error` | `Ref<DisplayableError \| null>` | The most recently captured error, or `null` if no error has occurred or it has been reset. |
45
- | `reset` | `() => void` | Clears the error state (sets `error` to `null`) and emits a `reset` event on the component instance. |
49
+ | Property | Type | Description |
50
+ | -------- | ------------------------------- | ---------------------------------------------------------------------------------------------------- |
51
+ | `error` | `Ref<DisplayableError \| null>` | The most recently captured error, or `null` if no error has occurred or it has been reset. |
52
+ | `reset` | `() => void` | Clears the error state (sets `error` to `null`) and emits a `reset` event on the component instance. |
46
53
 
47
54
  ### DisplayableError
48
55
 
49
- | Property | Type | Description |
50
- |----------|------|-------------|
51
- | `message` | `string` | Short, user-facing error message suitable for display in the UI. |
52
- | `details` | `string` | Detailed technical description (stack trace, API error body, etc.). |
53
- | `originalError` | `unknown` | The original thrown value, preserved for programmatic inspection. |
56
+ | Property | Type | Description |
57
+ | --------------- | --------- | ------------------------------------------------------------------- |
58
+ | `message` | `string` | Short, user-facing error message suitable for display in the UI. |
59
+ | `details` | `string` | Detailed technical description (stack trace, API error body, etc.). |
60
+ | `originalError` | `unknown` | The original thrown value, preserved for programmatic inspection. |
54
61
 
55
62
  ### Emitted Events
56
63
 
57
64
  The composable emits events on the current component instance (accessible via `@error` and `@reset` in the parent template):
65
+
58
66
  - `error` -- emitted with the `DisplayableError` when an error is captured
59
67
  - `reset` -- emitted when `reset()` is called
60
68
 
@@ -75,7 +83,7 @@ Create a reusable error boundary that wraps any blade content:
75
83
  ```vue
76
84
  <!-- ErrorBoundary.vue -->
77
85
  <script setup lang="ts">
78
- import { useErrorHandler } from '@vc-shell/framework';
86
+ import { useErrorHandler } from "@vc-shell/framework";
79
87
 
80
88
  const props = defineProps<{
81
89
  fallbackMessage?: string;
@@ -85,13 +93,23 @@ const { error, reset } = useErrorHandler(true);
85
93
  </script>
86
94
 
87
95
  <template>
88
- <div v-if="error" class="tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8">
89
- <VcIcon icon="fas fa-exclamation-triangle" class="tw-text-4xl tw-text-warning-500 tw-mb-4" />
96
+ <div
97
+ v-if="error"
98
+ class="tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8"
99
+ >
100
+ <VcIcon
101
+ icon="fas fa-exclamation-triangle"
102
+ class="tw-text-4xl tw-text-warning-500 tw-mb-4"
103
+ />
90
104
  <h3 class="tw-text-lg tw-font-semibold">
91
- {{ fallbackMessage ?? 'Something went wrong' }}
105
+ {{ fallbackMessage ?? "Something went wrong" }}
92
106
  </h3>
93
107
  <p class="tw-text-sm tw-text-gray-500 tw-mt-2">{{ error.message }}</p>
94
- <VcButton class="tw-mt-4" @click="reset">Try Again</VcButton>
108
+ <VcButton
109
+ class="tw-mt-4"
110
+ @click="reset"
111
+ >Try Again</VcButton
112
+ >
95
113
  </div>
96
114
  <slot v-else />
97
115
  </template>
@@ -113,17 +131,20 @@ Usage in a blade:
113
131
 
114
132
  ```vue
115
133
  <template>
116
- <ChildBlade @error="onChildError" @reset="onChildReset" />
134
+ <ChildBlade
135
+ @error="onChildError"
136
+ @reset="onChildReset"
137
+ />
117
138
  </template>
118
139
 
119
140
  <script setup lang="ts">
120
141
  function onChildError(error: DisplayableError) {
121
- console.error('Child blade error:', error.message);
142
+ console.error("Child blade error:", error.message);
122
143
  // Optionally show a notification or log to external service
123
144
  }
124
145
 
125
146
  function onChildReset() {
126
- console.log('Child blade error was dismissed');
147
+ console.log("Child blade error was dismissed");
127
148
  }
128
149
  </script>
129
150
  ```
@@ -12,7 +12,7 @@ Provides lightweight utility functions for timing control: debounce, throttle, d
12
12
  ## Quick Start
13
13
 
14
14
  ```typescript
15
- import { useFunctions } from '@vc-shell/framework';
15
+ import { useFunctions } from "@vc-shell/framework";
16
16
 
17
17
  const { debounce, throttle, delay, once } = useFunctions();
18
18
 
@@ -31,7 +31,7 @@ delay(() => showTooltip(), 500);
31
31
 
32
32
  // Ensure a function runs only once (e.g., expensive initialization)
33
33
  const initOnce = once(() => {
34
- console.log('This runs exactly once');
34
+ console.log("This runs exactly once");
35
35
  return expensiveSetup();
36
36
  });
37
37
  initOnce(); // runs and caches the result
@@ -43,12 +43,12 @@ initOnce(); // still returns cached result
43
43
 
44
44
  ### Returns
45
45
 
46
- | Property | Type | Description |
47
- |---|---|---|
48
- | `debounce` | `(fn, delay: number) => (...args) => void` | Delays invocation until `delay` ms after the last call. Each new call resets the timer. |
46
+ | Property | Type | Description |
47
+ | ---------- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
48
+ | `debounce` | `(fn, delay: number) => (...args) => void` | Delays invocation until `delay` ms after the last call. Each new call resets the timer. |
49
49
  | `throttle` | `(fn, delay: number) => (...args) => void` | Invokes at most once per `delay` ms on the leading edge. Subsequent calls within the window are ignored. |
50
- | `delay` | `(fn, ms?: number) => void` | Runs `fn` after `ms` milliseconds (default 0, which defers to the next macrotask via `setTimeout`). |
51
- | `once` | `(fn) => (...args) => unknown` | Ensures `fn` executes only once; subsequent calls return the cached result of the first invocation. |
50
+ | `delay` | `(fn, ms?: number) => void` | Runs `fn` after `ms` milliseconds (default 0, which defers to the next macrotask via `setTimeout`). |
51
+ | `once` | `(fn) => (...args) => unknown` | Ensures `fn` executes only once; subsequent calls return the cached result of the first invocation. |
52
52
 
53
53
  ## How They Work
54
54
 
@@ -61,11 +61,11 @@ initOnce(); // still returns cached result
61
61
 
62
62
  ```vue
63
63
  <script setup lang="ts">
64
- import { useFunctions } from '@vc-shell/framework';
65
- import { ref } from 'vue';
64
+ import { useFunctions } from "@vc-shell/framework";
65
+ import { ref } from "vue";
66
66
 
67
67
  const { debounce } = useFunctions();
68
- const searchQuery = ref('');
68
+ const searchQuery = ref("");
69
69
  const results = ref<Product[]>([]);
70
70
 
71
71
  const performSearch = debounce(async (query: string) => {
@@ -91,7 +91,10 @@ function onSearchInput(value: string) {
91
91
  @update:model-value="onSearchInput"
92
92
  />
93
93
  </template>
94
- <div v-for="product in results" :key="product.id">
94
+ <div
95
+ v-for="product in results"
96
+ :key="product.id"
97
+ >
95
98
  {{ product.name }}
96
99
  </div>
97
100
  </VcBlade>
@@ -14,11 +14,11 @@ The composable supports two attachment modes: **auto-attach** on mount via a CSS
14
14
 
15
15
  ```vue
16
16
  <script setup lang="ts">
17
- import { useKeyboardNavigation } from '@vc-shell/framework';
18
- import { ref } from 'vue';
17
+ import { useKeyboardNavigation } from "@vc-shell/framework";
18
+ import { ref } from "vue";
19
19
 
20
20
  const menuRef = ref<HTMLElement | null>(null);
21
- const items = ref(['Dashboard', 'Products', 'Orders', 'Settings']);
21
+ const items = ref(["Dashboard", "Products", "Orders", "Settings"]);
22
22
 
23
23
  const { initKeyboardNavigation, focusFirstElement } = useKeyboardNavigation({
24
24
  itemSelector: '[role="menuitem"]',
@@ -43,7 +43,10 @@ function openMenu() {
43
43
  </script>
44
44
 
45
45
  <template>
46
- <div ref="menuRef" role="menu">
46
+ <div
47
+ ref="menuRef"
48
+ role="menu"
49
+ >
47
50
  <div
48
51
  v-for="item in items"
49
52
  :key="item"
@@ -61,26 +64,26 @@ function openMenu() {
61
64
 
62
65
  ### Parameters (Options Object)
63
66
 
64
- | Parameter | Type | Default | Description |
65
- |---|---|---|---|
66
- | `containerSelector` | `string` | `'[role="menu"]'` | CSS selector to auto-find the container on mount. Set to empty string to disable auto-attach. |
67
- | `itemSelector` | `string` | `'[tabindex="0"]'` | CSS selector for focusable items inside the container. |
68
- | `onEnter` | `(el: HTMLElement) => void` | `undefined` | Called when Enter or Space is pressed on a focused item. Falls back to `el.click()` if not provided. |
69
- | `onEscape` | `() => void` | `undefined` | Called when Escape is pressed. Typically used to close the menu or popover. |
70
- | `loop` | `boolean` | `true` | When `true`, pressing ArrowDown on the last item wraps to the first, and ArrowUp on the first wraps to the last. |
67
+ | Parameter | Type | Default | Description |
68
+ | ------------------- | --------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------- |
69
+ | `containerSelector` | `string` | `'[role="menu"]'` | CSS selector to auto-find the container on mount. Set to empty string to disable auto-attach. |
70
+ | `itemSelector` | `string` | `'[tabindex="0"]'` | CSS selector for focusable items inside the container. |
71
+ | `onEnter` | `(el: HTMLElement) => void` | `undefined` | Called when Enter or Space is pressed on a focused item. Falls back to `el.click()` if not provided. |
72
+ | `onEscape` | `() => void` | `undefined` | Called when Escape is pressed. Typically used to close the menu or popover. |
73
+ | `loop` | `boolean` | `true` | When `true`, pressing ArrowDown on the last item wraps to the first, and ArrowUp on the first wraps to the last. |
71
74
 
72
75
  ### Returns
73
76
 
74
- | Property | Type | Description |
75
- |---|---|---|
76
- | `initKeyboardNavigation` | `(el: HTMLElement) => void` | Manually attach keyboard listener to an element. Cleans up any previous attachment first. |
77
- | `cleanupKeyboardNavigation` | `() => void` | Remove listener and reset state. Called automatically on `onBeforeUnmount`. |
78
- | `focusNextElement` | `() => void` | Move focus to the next item. Wraps if `loop` is `true`. |
79
- | `focusPreviousElement` | `() => void` | Move focus to the previous item. Wraps if `loop` is `true`. |
80
- | `focusFirstElement` | `() => void` | Focus the first matching item in the container. |
81
- | `focusLastElement` | `() => void` | Focus the last matching item in the container. |
82
- | `setFocusedIndex` | `(index: number) => void` | Set focus to a specific index. No-op if index is out of bounds. |
83
- | `getFocusedIndex` | `() => number` | Get the currently focused index (`-1` if no item is focused). |
77
+ | Property | Type | Description |
78
+ | --------------------------- | --------------------------- | ----------------------------------------------------------------------------------------- |
79
+ | `initKeyboardNavigation` | `(el: HTMLElement) => void` | Manually attach keyboard listener to an element. Cleans up any previous attachment first. |
80
+ | `cleanupKeyboardNavigation` | `() => void` | Remove listener and reset state. Called automatically on `onBeforeUnmount`. |
81
+ | `focusNextElement` | `() => void` | Move focus to the next item. Wraps if `loop` is `true`. |
82
+ | `focusPreviousElement` | `() => void` | Move focus to the previous item. Wraps if `loop` is `true`. |
83
+ | `focusFirstElement` | `() => void` | Focus the first matching item in the container. |
84
+ | `focusLastElement` | `() => void` | Focus the last matching item in the container. |
85
+ | `setFocusedIndex` | `(index: number) => void` | Set focus to a specific index. No-op if index is out of bounds. |
86
+ | `getFocusedIndex` | `() => number` | Get the currently focused index (`-1` if no item is focused). |
84
87
 
85
88
  ## How It Works
86
89
 
@@ -99,26 +102,25 @@ Auto-attach happens in `onMounted`: if `containerSelector` is set and a matching
99
102
 
100
103
  ```vue
101
104
  <script setup lang="ts">
102
- import { useKeyboardNavigation } from '@vc-shell/framework';
103
- import { ref, watch, nextTick } from 'vue';
105
+ import { useKeyboardNavigation } from "@vc-shell/framework";
106
+ import { ref, watch, nextTick } from "vue";
104
107
 
105
108
  const dropdownRef = ref<HTMLElement | null>(null);
106
109
  const isOpen = ref(false);
107
110
  const suggestions = ref<string[]>([]);
108
111
 
109
- const { initKeyboardNavigation, cleanupKeyboardNavigation, focusFirstElement } =
110
- useKeyboardNavigation({
111
- containerSelector: '', // disable auto-attach
112
- itemSelector: '.suggestion-item',
113
- onEnter: (el) => {
114
- selectSuggestion(el.dataset.value!);
115
- isOpen.value = false;
116
- },
117
- onEscape: () => {
118
- isOpen.value = false;
119
- },
120
- loop: true,
121
- });
112
+ const { initKeyboardNavigation, cleanupKeyboardNavigation, focusFirstElement } = useKeyboardNavigation({
113
+ containerSelector: "", // disable auto-attach
114
+ itemSelector: ".suggestion-item",
115
+ onEnter: (el) => {
116
+ selectSuggestion(el.dataset.value!);
117
+ isOpen.value = false;
118
+ },
119
+ onEscape: () => {
120
+ isOpen.value = false;
121
+ },
122
+ loop: true,
123
+ });
122
124
 
123
125
  watch(isOpen, async (open) => {
124
126
  if (open) {
@@ -139,8 +141,15 @@ function selectSuggestion(value: string) {
139
141
 
140
142
  <template>
141
143
  <div>
142
- <VcInput @focus="isOpen = true" @input="fetchSuggestions" />
143
- <div v-if="isOpen" ref="dropdownRef" class="suggestion-dropdown">
144
+ <VcInput
145
+ @focus="isOpen = true"
146
+ @input="fetchSuggestions"
147
+ />
148
+ <div
149
+ v-if="isOpen"
150
+ ref="dropdownRef"
151
+ class="suggestion-dropdown"
152
+ >
144
153
  <div
145
154
  v-for="item in suggestions"
146
155
  :key="item"
@@ -15,26 +15,35 @@ Also exports `provideLanguages()` for framework-level initialization.
15
15
 
16
16
  ```vue
17
17
  <script setup lang="ts">
18
- import { useLanguages } from '@vc-shell/framework';
19
- import { ref, onMounted } from 'vue';
18
+ import { useLanguages } from "@vc-shell/framework";
19
+ import { ref, onMounted } from "vue";
20
20
 
21
21
  const { currentLocale, setLocale, getFlag, getCountryCode } = useLanguages();
22
- const flagUrl = ref('');
22
+ const flagUrl = ref("");
23
23
 
24
24
  onMounted(async () => {
25
25
  flagUrl.value = await getFlag(currentLocale.value);
26
26
  });
27
27
 
28
28
  function switchToGerman() {
29
- setLocale('de-DE');
29
+ setLocale("de-DE");
30
30
  }
31
31
  </script>
32
32
 
33
33
  <template>
34
34
  <div class="tw-flex tw-items-center tw-gap-2">
35
- <img v-if="flagUrl" :src="flagUrl" alt="flag" class="tw-w-6 tw-h-4" />
35
+ <img
36
+ v-if="flagUrl"
37
+ :src="flagUrl"
38
+ alt="flag"
39
+ class="tw-w-6 tw-h-4"
40
+ />
36
41
  <span>{{ currentLocale }}</span>
37
- <VcButton size="sm" @click="switchToGerman">Deutsch</VcButton>
42
+ <VcButton
43
+ size="sm"
44
+ @click="switchToGerman"
45
+ >Deutsch</VcButton
46
+ >
38
47
  </div>
39
48
  </template>
40
49
  ```
@@ -47,19 +56,19 @@ None.
47
56
 
48
57
  ### Returns (`ILanguageService`)
49
58
 
50
- | Property / Method | Type | Description |
51
- |-------------------|------|-------------|
52
- | `currentLocale` | `ComputedRef<string>` | The currently active locale code (e.g., `"en-US"`, `"de-DE"`). |
53
- | `setLocale` | `(locale: string) => void` | Switches the application locale. This updates `vue-i18n`'s locale and triggers re-rendering of all translated text. |
54
- | `getLocaleByTag` | `(localeTag: string) => string \| undefined` | Resolves a locale tag to its display string (e.g., `"en-US"` to `"English (United States)"`). Returns `undefined` if the tag is not recognized. |
55
- | `resolveCamelCaseLocale` | `(locale: string) => string` | Converts a locale code to camelCase format (e.g., `"en-US"` to `"enUs"`). Useful for dynamic property access on objects keyed by locale. |
56
- | `getFlag` | `(language: string) => Promise<string>` | Fetches a flag image URL for the given language/locale. Returns a promise because flags may be loaded lazily. |
57
- | `getCountryCode` | `(language: string) => string` | Extracts the country code from a language tag (e.g., `"en-US"` to `"US"`, `"de-DE"` to `"DE"`). |
59
+ | Property / Method | Type | Description |
60
+ | ------------------------ | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
61
+ | `currentLocale` | `ComputedRef<string>` | The currently active locale code (e.g., `"en-US"`, `"de-DE"`). |
62
+ | `setLocale` | `(locale: string) => void` | Switches the application locale. This updates `vue-i18n`'s locale and triggers re-rendering of all translated text. |
63
+ | `getLocaleByTag` | `(localeTag: string) => string \| undefined` | Resolves a locale tag to its display string (e.g., `"en-US"` to `"English (United States)"`). Returns `undefined` if the tag is not recognized. |
64
+ | `resolveCamelCaseLocale` | `(locale: string) => string` | Converts a locale code to camelCase format (e.g., `"en-US"` to `"enUs"`). Useful for dynamic property access on objects keyed by locale. |
65
+ | `getFlag` | `(language: string) => Promise<string>` | Fetches a flag image URL for the given language/locale. Returns a promise because flags may be loaded lazily. |
66
+ | `getCountryCode` | `(language: string) => string` | Extracts the country code from a language tag (e.g., `"en-US"` to `"US"`, `"de-DE"` to `"DE"`). |
58
67
 
59
68
  ### Additional Exports
60
69
 
61
- | Export | Description |
62
- |--------|-------------|
70
+ | Export | Description |
71
+ | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
63
72
  | `provideLanguages()` | Creates and provides the language service via Vue injection. Returns existing service if already provided in the current tree. Falls back to a module-level singleton if no injection context is available. |
64
73
 
65
74
  ## How It Works
@@ -77,19 +86,17 @@ The fallback behavior means `useLanguages()` is safe to call in module `install(
77
86
 
78
87
  ```vue
79
88
  <script setup lang="ts">
80
- import { useLanguages } from '@vc-shell/framework';
81
- import { ref, onMounted, watch } from 'vue';
89
+ import { useLanguages } from "@vc-shell/framework";
90
+ import { ref, onMounted, watch } from "vue";
82
91
 
83
92
  const { currentLocale, setLocale, getFlag } = useLanguages();
84
93
 
85
- const availableLocales = ['en-US', 'de-DE', 'fr-FR', 'es-ES'];
94
+ const availableLocales = ["en-US", "de-DE", "fr-FR", "es-ES"];
86
95
  const flags = ref<Record<string, string>>({});
87
96
 
88
97
  onMounted(async () => {
89
98
  // Pre-fetch all flags in parallel
90
- const entries = await Promise.all(
91
- availableLocales.map(async (locale) => [locale, await getFlag(locale)] as const),
92
- );
99
+ const entries = await Promise.all(availableLocales.map(async (locale) => [locale, await getFlag(locale)] as const));
93
100
  flags.value = Object.fromEntries(entries);
94
101
  });
95
102
 
@@ -107,7 +114,11 @@ function onLocaleChange(locale: string) {
107
114
  :class="{ 'tw-bg-primary-50': locale === currentLocale }"
108
115
  @click="onLocaleChange(locale)"
109
116
  >
110
- <img v-if="flags[locale]" :src="flags[locale]" class="tw-w-6 tw-h-4" />
117
+ <img
118
+ v-if="flags[locale]"
119
+ :src="flags[locale]"
120
+ class="tw-w-6 tw-h-4"
121
+ />
111
122
  <span>{{ locale }}</span>
112
123
  </div>
113
124
  </div>
@@ -117,16 +128,14 @@ function onLocaleChange(locale: string) {
117
128
  ## Recipe: Locale-Aware Dynamic Property Display
118
129
 
119
130
  ```typescript
120
- import { useLanguages } from '@vc-shell/framework';
121
- import { useDynamicProperties } from '@vc-shell/framework';
131
+ import { useLanguages } from "@vc-shell/framework";
132
+ import { useDynamicProperties } from "@vc-shell/framework";
122
133
 
123
134
  const { currentLocale } = useLanguages();
124
135
  const { getPropertyValue } = useDynamicProperties(/* ... */);
125
136
 
126
137
  // Read a multilanguage property value for the current locale
127
- const displayValue = computed(() =>
128
- getPropertyValue(property.value, currentLocale.value),
129
- );
138
+ const displayValue = computed(() => getPropertyValue(property.value, currentLocale.value));
130
139
  ```
131
140
 
132
141
  ## Tips