@vc-shell/vc-app-skill 2.1.0-pr255.4dc5c0d → 2.1.0-pr256.0fe3abb

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 +20 -18
  3. package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +43 -34
  4. package/runtime/knowledge/docs/core/blade-navigation/table-query-state/useTableQueryState.docs.md +95 -0
  5. package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +5 -3
  6. package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +12 -10
  7. package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +7 -5
  8. package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +8 -6
  9. package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +3 -1
  10. package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +1 -1
  11. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +8 -5
  12. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +12 -12
  13. package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +3 -3
  14. package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +4 -3
  15. package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +1 -0
  16. package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +3 -3
  17. package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +5 -4
  18. package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +3 -3
  19. package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +2 -0
  20. package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +1 -2
  21. package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +1 -1
  22. package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +3 -3
  23. package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +35 -0
  24. package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +1 -1
  25. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +2 -2
  26. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +2 -1
  27. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +18 -18
  28. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +3 -3
  29. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +10 -7
  30. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +7 -7
  31. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +18 -12
  32. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +2 -2
  33. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +20 -20
  34. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +15 -24
  35. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +2 -2
  36. package/runtime/knowledge/docs/core/notifications/composables/useBladeNotifications.docs.md +183 -0
  37. package/runtime/knowledge/docs/core/notifications/composables/useBroadcastFilter.docs.md +117 -0
  38. package/runtime/knowledge/docs/core/notifications/composables/useNotificationContext.docs.md +150 -0
  39. package/runtime/knowledge/docs/core/notifications/composables/useNotificationStore.docs.md +114 -0
  40. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +50 -30
  41. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +30 -11
  42. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +1 -1
  43. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +2 -3
  44. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +26 -26
  45. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +2 -3
  46. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +11 -50
  47. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +9 -6
  48. package/runtime/knowledge/docs/core/services/services.docs.md +15 -13
  49. package/runtime/knowledge/docs/core/types/types.docs.md +37 -40
  50. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +1 -2
  51. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +21 -30
  52. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +2 -2
  53. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +9 -8
  54. package/runtime/knowledge/docs/injection-keys.docs.md +6 -11
  55. package/runtime/knowledge/docs/modules/assets/assets-details.docs.md +123 -0
  56. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +1 -1
  57. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +20 -12
  58. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +10 -10
  59. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +6 -6
  60. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +4 -4
  61. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +16 -14
  62. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +1 -1
  63. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +12 -11
  64. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +10 -3
  65. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +3 -3
  66. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +9 -2
  67. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +4 -2
  68. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  69. package/runtime/knowledge/docs/shell/components/notification-dropdown/notification-dropdown.docs.md +35 -31
  70. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -11
  71. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +8 -7
  72. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +23 -21
  73. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +5 -3
  74. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +7 -7
  75. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +11 -11
  76. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +28 -16
  77. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +17 -19
  78. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/dashboard-widget-skeleton.docs.md +33 -0
  79. package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +21 -0
  80. package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +2 -1
  81. package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +2 -2
  82. package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +15 -14
  83. package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +9 -6
  84. package/runtime/knowledge/docs/ui/components/atoms/vc-environment-banner/vc-environment-banner.docs.md +42 -0
  85. package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +1 -1
  86. package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +10 -9
  87. package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +19 -4
  88. package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +2 -2
  89. package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +5 -4
  90. package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +5 -4
  91. package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +9 -8
  92. package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +7 -0
  93. package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +1 -1
  94. package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +2 -2
  95. package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +1 -1
  96. package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +11 -10
  97. package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +28 -8
  98. package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +22 -19
  99. package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +8 -8
  100. package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +16 -6
  101. package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +9 -8
  102. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +42 -34
  103. package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +1 -1
  104. package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +14 -1
  105. package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +3 -1
  106. package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +34 -33
  107. package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +26 -24
  108. package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +12 -14
  109. package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +30 -30
  110. package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +2 -2
  111. package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +1 -1
  112. package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +34 -31
  113. package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +14 -12
  114. package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +1 -1
  115. package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +36 -27
  116. package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +5 -1
  117. package/runtime/knowledge/docs/ui/components/molecules/{vc-dropdown-panel/vc-dropdown-panel.docs.md → vc-popover/vc-popover.docs.md} +26 -25
  118. package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +10 -9
  119. package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +44 -19
  120. package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +11 -11
  121. package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +15 -14
  122. package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +15 -15
  123. package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +15 -13
  124. package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +5 -1
  125. package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +18 -0
  126. package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +48 -78
  127. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +9 -11
  128. package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +71 -43
  129. package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +27 -20
  130. package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +2 -2
  131. package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +12 -12
  132. package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +33 -24
  133. package/runtime/knowledge/docs/ui/components/organisms/vc-scheduler/vc-scheduler.docs.md +412 -0
  134. package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +43 -26
  135. package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +15 -9
  136. package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +8 -6
  137. package/runtime/knowledge/docs/ui/composables/useTableSearch.docs.md +130 -0
  138. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +4 -4
  139. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +2 -3
@@ -98,12 +98,13 @@ export default {
98
98
 
99
99
  ### Registration options
100
100
 
101
- | Option | Type | Required | Description |
102
- | ----------- | ----------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
103
- | `id` | `string` | No | Unique identifier for the entry. Auto-generated when omitted. |
104
- | `group` | `string` | No | Group name (entries are grouped and separated by dividers). Defaults to `"general"`. |
105
- | `order` | `number` | No | Sort order within the group (lower = higher position). Defaults to the current registry size at registration time, preserving insertion order. |
106
- | `component` | `Component` | Yes | Vue component to render as the menu item. |
101
+ | Option | Type | Required | Description |
102
+ | ----------- | ------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
103
+ | `id` | `string` | No | Unique identifier for the entry. Auto-generated when omitted. |
104
+ | `group` | `string` | No | Group name (entries are grouped and separated by dividers). Defaults to `"general"`. |
105
+ | `order` | `number` | No | Sort order within the group (lower = higher position). Defaults to the current registry size at registration time, preserving insertion order. |
106
+ | `component` | `Component` | Yes | Vue component to render as the menu item. |
107
+ | `props` | `Record<string, unknown>` | No | Props bound to the rendered component via `v-bind`. |
107
108
 
108
109
  ### Group rendering
109
110
 
@@ -117,7 +118,7 @@ Groups are separated by a horizontal divider and items within each group are sor
117
118
  ## Details
118
119
 
119
120
  - **Service-driven content**: The menu has no props and renders entirely from the `useSettingsMenu()` registry. This makes it fully extensible -- any module can add entries.
120
- - **CloseSettingsMenuKey injection**: The menu provides a `CloseSettingsMenuKey` injection to its children. Menu items inject this to close the dropdown before performing their action (e.g., opening a popup or navigating).
121
+ - **CloseSettingsMenuKey injection**: `CloseSettingsMenuKey` is provided by the containing `UserDropdownButton`, not by `SettingsMenu`. `SettingsMenu` itself provides nothing; it only reads `useSettingsMenu().items` and renders them. Menu item children inject the key supplied by the parent dropdown to close it before performing their action (e.g., opening a popup or navigating). Rendering `SettingsMenu` standalone leaves `CloseSettingsMenuKey` undefined for its children.
121
122
  - **Ordering**: Items are sorted by `order` within their group. Use consistent order ranges across modules to maintain a predictable menu layout.
122
123
  - **Dynamic registration**: Items can be registered at any time, but registering during module `install()` ensures they are available when the menu first renders.
123
124
 
@@ -21,10 +21,10 @@ The component handles the visual representation of a single menu entry: an icon
21
21
 
22
22
  The component includes a `submenu` slot that **automatically adapts to the viewport**:
23
23
 
24
- - **Desktop**: renders a floating `VcDropdownPanel` anchored to the menu item (`placement="right-start"`)
24
+ - **Desktop**: renders a floating `VcPopover` anchored to the menu item (`placement="right-start"`)
25
25
  - **Mobile**: renders an inline accordion with animated expand/collapse (via `useCollapsible`)
26
26
 
27
- This removes the need for consumers to manage `VcDropdownPanel`, `isMobile` checks, or z-index issues manually.
27
+ This removes the need for consumers to manage `VcPopover`, `isMobile` checks, or z-index issues manually.
28
28
 
29
29
  ## When to Use
30
30
 
@@ -51,23 +51,25 @@ import { SettingsMenuItem } from "@vc-shell/framework";
51
51
 
52
52
  ## Key Props
53
53
 
54
- | Prop | Type | Default | Description |
55
- | --------------- | ------------------------------ | ----------- | -------------------------------------------------------------------------------- |
56
- | `title` | `string` | `undefined` | Menu item label |
57
- | `icon` | `string \| Component` | `undefined` | Icon name or component |
58
- | `image` | `string` | `undefined` | Image URL (alternative to icon) |
59
- | `value` | `string` | `undefined` | Current value displayed on the right |
60
- | `showChevron` | `boolean` | `false` | Shows right chevron for sub-menus (auto-enabled when `submenu` slot is provided) |
61
- | `isActive` | `boolean` | `false` | Highlights the item (auto-managed when `submenu` slot is provided) |
62
- | `disabled` | `boolean` | `false` | Disables click interaction |
63
- | `triggerAction` | `"click" \| "hover" \| "none"` | `"click"` | What interaction opens the item |
54
+ | Prop | Type | Default | Description |
55
+ | --------------- | ------------------------------ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
56
+ | `title` | `string` | `undefined` | Menu item label |
57
+ | `icon` | `string \| Component` | `undefined` | Icon name or component |
58
+ | `image` | `string` | `undefined` | Image URL (alternative to icon) |
59
+ | `emptyIcon` | `string` | `undefined` | Fallback icon shown on the `VcImage` when `image` fails to load |
60
+ | `value` | `string` | `undefined` | Current value displayed on the right |
61
+ | `showChevron` | `boolean` | `false` | Shows right chevron for sub-menus (auto-enabled when `submenu` slot is provided) |
62
+ | `isActive` | `boolean` | `false` | Highlights the item (auto-managed when `submenu` slot is provided) |
63
+ | `disabled` | `boolean` | `false` | Disables click interaction |
64
+ | `isVisible` | `boolean` | `true` | Hides the item when `false` via the `--invisible` class |
65
+ | `triggerAction` | `"click" \| "hover" \| "none"` | `"click"` | What interaction opens the item. Note: `"hover"` is not implemented (no hover handler); only `"click"` and `"none"` have runtime behavior |
64
66
 
65
67
  ## Events
66
68
 
67
- | Event | Payload | Description |
68
- | --------------- | ------- | -------------------------------------------------------------------- |
69
- | `trigger:click` | -- | Emitted when the item is clicked (only when `triggerAction="click"`) |
70
- | `trigger:hover` | -- | Emitted when hovered (only when `triggerAction="hover"`) |
69
+ | Event | Payload | Description |
70
+ | --------------- | ------- | ------------------------------------------------------------------------------------------------------- |
71
+ | `trigger:click` | -- | Emitted when the item is clicked (only when `triggerAction="click"`) |
72
+ | `trigger:hover` | -- | Declared but not implemented: `triggerAction="hover"` has no runtime handler, so this event never fires |
71
73
 
72
74
  ## Slots
73
75
 
@@ -156,15 +158,15 @@ The `submenu` slot can contain any content, not just `VcDropdownItem`:
156
158
  </SettingsMenuItem>
157
159
  ```
158
160
 
159
- ## Migration: Manual VcDropdownPanel to Submenu Slot
161
+ ## Migration: Manual VcPopover to Submenu Slot
160
162
 
161
163
  Before (manual dropdown management):
162
164
 
163
165
  ```vue
164
166
  <SettingsMenuItem ref="menuItemRef" icon="lucide-palette" title="Theme" :value="currentTheme" :show-chevron="true" :is-active="isOpen" @trigger:click="isOpen = !isOpen" />
165
- <VcDropdownPanel v-model:show="isOpen" :anchor-ref="menuItemRef?.triggerRef ?? null" placement="right-start" width="180px">
167
+ <VcPopover v-model:show="isOpen" :anchor-ref="menuItemRef?.triggerRef ?? null" placement="right-start" width="180px">
166
168
  <!-- options -->
167
- </VcDropdownPanel>
169
+ </VcPopover>
168
170
  ```
169
171
 
170
172
  After (submenu slot):
@@ -180,7 +182,7 @@ After (submenu slot):
180
182
  **What changes:**
181
183
 
182
184
  - Remove `ref`, `isOpen`, `:show-chevron`, `:is-active`, `@trigger:click` toggle -- all auto-managed
183
- - Remove `VcDropdownPanel` wrapper entirely
185
+ - Remove `VcPopover` wrapper entirely
184
186
  - Move dropdown content into `#submenu` slot
185
187
  - Mobile adaptation is automatic (no `isMobile` check needed)
186
188
 
@@ -201,5 +203,5 @@ Do not set `triggerAction="none"` and then rely on `@trigger:click` -- the event
201
203
  - [SettingsMenu](../settings-menu/settings-menu.docs.md) -- parent container
202
204
  - [ThemeSelector](../theme-selector/theme-selector.docs.md) -- uses SettingsMenuItem with submenu slot
203
205
  - [LanguageSelector](../language-selector/language-selector.docs.md) -- uses SettingsMenuItem with submenu slot
204
- - [VcDropdownPanel](../../../ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md) -- used internally for desktop sub-menus
206
+ - [VcPopover](../../../ui/components/molecules/vc-popover/vc-popover.docs.md) -- used internally for desktop sub-menus
205
207
  - [VcDropdown](../../../ui/components/molecules/vc-dropdown/vc-dropdown.docs.md) -- recommended for sub-menu option rows
@@ -7,6 +7,8 @@ internal: true
7
7
 
8
8
  # Sidebar Component
9
9
 
10
+ > **Deprecated.** The `Sidebar` wrapper is deprecated in favor of `VcSidebar` (`framework/ui/components/organisms/vc-sidebar`) and may be removed in a future release. Use this page as legacy/migration guidance only; build new code on `VcSidebar` directly.
11
+
10
12
  A responsive sidebar wrapper that conditionally renders content inside a `VcSidebar` panel or inline, based on viewport and expansion state.
11
13
 
12
14
  ## Overview
@@ -62,7 +64,7 @@ When `render="mobile"` and the viewport is desktop, the content slot renders inl
62
64
 
63
65
  ## Behavior
64
66
 
65
- - **Visibility**: The sidebar is visible when `isExpanded === true` AND the `render` mode matches the current viewport (injected via `IsMobileKey` / `IsDesktopKey`).
67
+ - **Visibility**: The sidebar is visible when `isExpanded === true` AND the `render` mode matches the current viewport (resolved via `useResponsive()` -- `isMobile` / `isDesktop`).
66
68
  - **Teleport**: On mobile, the inner `VcSidebar` teleports to the document body for proper overlay stacking.
67
69
  - **Close**: Closing the sidebar emits `close` -- the parent must update `isExpanded`.
68
70
 
@@ -70,9 +72,9 @@ When `render="mobile"` and the viewport is desktop, the content slot renders inl
70
72
 
71
73
  - Use `render="mobile"` for panels that should be drawers on phones but inline panels on desktop.
72
74
  - The `header` slot receives a `close` function so custom headers can include their own close button.
73
- - The component injects `IsMobileKey` and `IsDesktopKey` from the framework's injection keys.
75
+ - The component resolves the viewport via `useResponsive()` (`isMobile` / `isDesktop`).
74
76
 
75
77
  ## Related
76
78
 
77
79
  - `framework/ui/components/organisms/vc-sidebar/` -- the underlying `VcSidebar` organism
78
- - `framework/injection-keys.ts` -- `IsMobileKey`, `IsDesktopKey`
80
+ - `framework/core/composables/useResponsive/` -- `isMobile` / `isDesktop` viewport helper
@@ -48,12 +48,12 @@ This component has no props. Themes are managed via the `useTheme()` composable.
48
48
 
49
49
  ## Recipe: Registering Custom Themes
50
50
 
51
- Before the `ThemeSelector` can show themes, they must be registered with the theme service. Themes are defined as objects with a `key` that corresponds to a CSS class or custom property set:
51
+ Before the `ThemeSelector` can show themes, they must be registered with the theme service. Themes are defined as objects with a `key` that corresponds to a `data-theme` attribute value and its custom property set:
52
52
 
53
53
  ```ts
54
54
  import { useTheme } from "@vc-shell/framework";
55
55
 
56
- const { register, setTheme, currentTheme } = useTheme();
56
+ const { register, setTheme, currentThemeKey } = useTheme();
57
57
 
58
58
  // Register available themes during app initialization
59
59
  register([
@@ -66,16 +66,16 @@ register([
66
66
  setTheme("light");
67
67
  ```
68
68
 
69
- The theme `key` is applied as a CSS class on the root element, allowing CSS custom properties to cascade:
69
+ The theme `key` is written to the `data-theme` attribute on the root element (`<html data-theme="light">`, via `useColorMode({ attribute: "data-theme" })`), allowing CSS custom properties to cascade:
70
70
 
71
71
  ```scss
72
72
  // In your theme CSS files
73
- .light {
73
+ :root[data-theme="light"] {
74
74
  --primary-500: #3b82f6;
75
75
  --surface-bg: #ffffff;
76
76
  }
77
77
 
78
- .dark {
78
+ :root[data-theme="dark"] {
79
79
  --primary-500: #60a5fa;
80
80
  --surface-bg: #1e1e2e;
81
81
  }
@@ -103,14 +103,14 @@ window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e)
103
103
  ## Details
104
104
 
105
105
  - **Theme persistence**: The selected theme is persisted to localStorage, so the user's preference survives page reloads and browser restarts.
106
- - **Toast notification**: When the user switches themes via the selector, a brief toast notification confirms the change (e.g., "Theme changed to Dark").
106
+ - **Toast notification**: When the user switches themes via the selector, a brief toast notification shows the new theme's localized name (e.g., "Dark").
107
107
  - **Cascading submenu**: On desktop, selecting the theme entry opens a submenu listing all registered themes. The current theme is highlighted.
108
108
  - **CSS custom properties**: Themes work by switching CSS custom properties defined in `framework/assets/styles/theme/colors.scss`. Components reference these variables (e.g., `tw-bg-[var(--primary-500)]`), so theme changes are instant.
109
109
 
110
110
  ## Tips
111
111
 
112
112
  - If only one theme is registered, the `ThemeSelector` still renders but the submenu will have only one option. Consider hiding it if theming is not a feature of your application.
113
- - Theme keys should be short, lowercase identifiers. They are used as CSS class names on the root element.
113
+ - Theme keys should be short, lowercase identifiers. They are written to the `data-theme` attribute on the root element.
114
114
  - Always pair theme registration with corresponding CSS custom property definitions. A registered theme without CSS variables will result in unstyled or broken visuals.
115
115
  - The framework's built-in components use CSS custom properties from the theme system. Custom components should follow the same pattern for consistent theming.
116
116
 
@@ -33,12 +33,12 @@ import { UserDropdownButton } from "@vc-shell/framework";
33
33
 
34
34
  ## Key Props
35
35
 
36
- | Prop | Type | Default | Description |
37
- | ----------- | --------- | ----------- | ----------------------------- |
38
- | `name` | `string` | `undefined` | User display name |
39
- | `role` | `string` | `undefined` | User role label |
40
- | `avatarUrl` | `string` | `undefined` | URL for the user avatar image |
41
- | `disabled` | `boolean` | `false` | Prevents menu from opening |
36
+ | Prop | Type | Default | Description |
37
+ | ----------- | --------- | ----------- | --------------------------------------------------------------------------------------------------------------- |
38
+ | `name` | `string` | `undefined` | User display name |
39
+ | `role` | `string` | `undefined` | User role label |
40
+ | `avatarUrl` | `string` | `undefined` | URL for the user avatar image |
41
+ | `disabled` | `boolean` | `false` | Visual-only: applies the `--auto-width` layout class. Does not suppress clicks or prevent the menu from opening |
42
42
 
43
43
  ## Recipe: Wiring to User Management Composable
44
44
 
@@ -50,11 +50,11 @@ import { computed } from "vue";
50
50
  import { UserDropdownButton } from "@vc-shell/framework";
51
51
  import { useUserManagement } from "@vc-shell/framework";
52
52
 
53
- const { currentUser } = useUserManagement();
53
+ const { user } = useUserManagement();
54
54
 
55
- const displayName = computed(() => (currentUser.value ? `${currentUser.value.firstName} ${currentUser.value.lastName}` : ""));
56
- const role = computed(() => currentUser.value?.roles?.[0]?.name ?? "");
57
- const avatarUrl = computed(() => currentUser.value?.photoUrl);
55
+ const displayName = computed(() => (user.value ? `${user.value.firstName} ${user.value.lastName}` : ""));
56
+ const role = computed(() => user.value?.roles?.[0]?.name ?? "");
57
+ const avatarUrl = computed(() => user.value?.photoUrl);
58
58
  </script>
59
59
 
60
60
  <template>
@@ -86,7 +86,7 @@ On mobile viewports (`$isMobile`), clicking the button opens a full-height slide
86
86
  ## Tips
87
87
 
88
88
  - The component is typically placed in the sidebar footer slot of the app shell. You rarely need to instantiate it manually -- the framework shell handles its placement.
89
- - If `disabled` is `true`, clicking the button does nothing and the menu does not open. Use this during critical operations where navigation should be prevented.
89
+ - The `disabled` prop is visual-only (it applies the `--auto-width` layout class). It does not block clicks or prevent the menu from opening; the handler always toggles the menu.
90
90
  - All menu items are driven by `useSettingsMenu()` registrations. To add custom items to the user menu, register them via the service rather than modifying this component.
91
91
 
92
92
  ## Related Components
@@ -61,25 +61,36 @@ const config: ChartConfig = {
61
61
 
62
62
  ## Key Props (shared across chart types)
63
63
 
64
- | Prop | Type | Default | Description |
65
- | ------------- | ------------- | ----------- | ------------------------------------ |
66
- | `data` | `T[]` | -- | Array of data points |
67
- | `config` | `ChartConfig` | -- | Series color and label configuration |
68
- | `xKey` | `keyof T` | -- | Key for x-axis values (line/bar) |
69
- | `yKeys` | `(keyof T)[]` | -- | Keys for y-axis series (line/bar) |
70
- | `showTooltip` | `boolean` | `true` | Enable hover tooltips |
71
- | `showLegend` | `boolean` | `true` | Show color legend below chart |
72
- | `rangeStart` | `number` | `undefined` | Filter data from this x value |
73
- | `rangeEnd` | `number` | `undefined` | Filter data up to this x value |
64
+ | Prop | Type | Default | Description |
65
+ | ------------- | ---------------------------------------------- | ----------- | ------------------------------------ |
66
+ | `data` | `T[]` | -- | Array of data points |
67
+ | `config` | `ChartConfig` | -- | Series color and label configuration |
68
+ | `xKey` | `keyof T` | -- | Key for x-axis values (line/bar) |
69
+ | `yKeys` | `(keyof T)[]` | -- | Keys for y-axis series (line/bar) |
70
+ | `showTooltip` | `boolean` | `true` | Enable hover tooltips |
71
+ | `showLegend` | `boolean` | `true` | Show color legend below chart |
72
+ | `rangeStart` | `ChartRangeValue` (`number \| string \| Date`) | `undefined` | Filter data from this x value |
73
+ | `rangeEnd` | `ChartRangeValue` (`number \| string \| Date`) | `undefined` | Filter data up to this x value |
74
+ | `showXAxis` | `boolean` | `true` | Show the x-axis (line/bar) |
75
+ | `showYAxis` | `boolean` | `true` | Show the y-axis (line/bar) |
76
+ | `showGrid` | `boolean` | `true` | Show y-axis grid lines (line/bar) |
77
+ | `numXTicks` | `number` | `undefined` | Number of x-axis ticks (line/bar) |
78
+ | `numYTicks` | `number` | `5` | Number of y-axis ticks (line/bar) |
79
+ | `xTickFormat` | `(value: number \| Date) => string` | `undefined` | Format x-axis tick labels (line/bar) |
80
+ | `yTickFormat` | `(value: number) => string` | `undefined` | Format y-axis tick labels (line/bar) |
81
+ | `height` | `number` | `undefined` | Fixed chart height in px |
74
82
 
75
83
  ### Donut-specific props
76
84
 
77
- | Prop | Type | Default | Description |
78
- | ----------------- | --------- | ----------- | ------------------------------ |
79
- | `valueKey` | `keyof T` | -- | Key for segment values |
80
- | `centralLabel` | `string` | `undefined` | Large text in donut center |
81
- | `centralSubLabel` | `string` | `undefined` | Small text below central label |
82
- | `arcWidth` | `number` | `60` | Donut arc thickness |
85
+ | Prop | Type | Default | Description |
86
+ | ----------------- | --------------------------- | ----------- | --------------------------------------- |
87
+ | `valueKey` | `keyof T` | -- | Key for segment values |
88
+ | `centralLabel` | `string` | `undefined` | Large text in donut center |
89
+ | `centralSubLabel` | `string` | `undefined` | Small text below central label |
90
+ | `arcWidth` | `number` | `60` | Donut arc thickness |
91
+ | `valueFormat` | `(value: number) => string` | `undefined` | Formats segment values in tooltip/label |
92
+ | `colorKey` | `keyof T` | `undefined` | Data key holding a per-segment color |
93
+ | `cornerRadius` | `number` | `4` | Rounded corner radius of arcs |
83
94
 
84
95
  ## ChartConfig Type
85
96
 
@@ -91,6 +102,7 @@ type ChartConfig = Record<
91
102
  {
92
103
  label: string; // Display name in legend and tooltip
93
104
  color: string; // CSS color value (hex, var(), rgb, etc.)
105
+ icon?: string; // Optional icon shown alongside the series label
94
106
  }
95
107
  >;
96
108
  ```
@@ -67,20 +67,17 @@ import { DashboardWidgetCard } from "@vc-shell/framework";
67
67
  ```vue
68
68
  <DashboardWidgetCard header="Orders" icon="lucide-shopping-cart">
69
69
  <template #stats>
70
- <DashboardStatItem :value="48" label="Total" />
71
- <DashboardStatItem :value="12" label="Today" variant="info" />
70
+ <DashboardStatItem :value="48" label="Total" variant="success" />
71
+ <DashboardStatItem :value="12" label="Today" />
72
72
  <DashboardStatItem :value="3" label="Pending" variant="warning" />
73
- <DashboardStatItem :value="1" label="Failed" variant="error" />
73
+ <DashboardStatItem :value="1" label="Failed" variant="danger" />
74
74
  </template>
75
75
  <template #content>
76
76
  <DashboardFeedList>
77
- <DashboardFeedRow v-for="order in recentOrders" :key="order.id">
78
- <template #icon>
79
- <VcIcon :icon="getOrderIcon(order.status)" size="s" />
80
- </template>
81
- <template #title>{{ order.number }}</template>
82
- <template #subtitle>{{ order.customerName }}</template>
83
- <template #meta>{{ formatDateRelative(order.createdDate) }}</template>
77
+ <DashboardFeedRow v-for="order in recentOrders" :key="order.id" @click="openOrder(order)">
78
+ <VcIcon :icon="getOrderIcon(order.status)" size="s" />
79
+ <span>{{ order.number }} — {{ order.customerName }}</span>
80
+ <template #trailing>{{ formatDateRelative(order.createdDate) }}</template>
84
81
  </DashboardFeedRow>
85
82
  </DashboardFeedList>
86
83
  </template>
@@ -167,22 +164,23 @@ import OrdersWidget from "./OrdersWidget.vue";
167
164
 
168
165
  const dashboard = useDashboard();
169
166
 
170
- dashboard.register({
167
+ dashboard.registerWidget({
171
168
  id: "orders-overview",
169
+ name: "Orders overview",
172
170
  component: markRaw(OrdersWidget),
171
+ size: { width: 6, height: 4 },
172
+ position: { x: 0, y: 0 },
173
173
  props: { limit: 10 },
174
- order: 1,
175
- layout: { w: 6, h: 4, x: 0, y: 0 },
176
174
  });
177
175
  ```
178
176
 
179
177
  ## Companion Components
180
178
 
181
- | Component | Description |
182
- | ------------------- | --------------------------------------------------------------- |
183
- | `DashboardStatItem` | Single KPI stat with value, label, and optional color variant |
184
- | `DashboardFeedList` | Scrollable list container for feed rows |
185
- | `DashboardFeedRow` | Individual feed item with icon, title, subtitle, and meta slots |
179
+ | Component | Description |
180
+ | ------------------- | -------------------------------------------------------------------------------------------------------------- |
181
+ | `DashboardStatItem` | Single KPI stat with value, label, and optional color variant |
182
+ | `DashboardFeedList` | Scrollable list container for feed rows |
183
+ | `DashboardFeedRow` | Individual feed item: default slot for leading content, `#trailing` slot for right-side content, emits `click` |
186
184
 
187
185
  ## Tip: Set a Minimum Height
188
186
 
@@ -200,4 +198,4 @@ When the card content is loaded asynchronously, the card may collapse to zero he
200
198
 
201
199
  - [DraggableDashboard](../draggable-dashboard/draggable-dashboard.docs.md) -- grid layout container
202
200
  - [DashboardCharts](../dashboard-charts/dashboard-charts.docs.md) -- chart components for widget content
203
- - [useDashboard](../../../core/composables/useDashboard/) -- dashboard widget registration service
201
+ - [useDashboard](../../../core/composables/useDashboard/useDashboard.docs.md) -- dashboard widget registration service
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: DashboardWidgetSkeleton
3
+ category: composables
4
+ group: utilities
5
+ internal: true
6
+ ---
7
+
8
+ # DashboardWidgetSkeleton
9
+
10
+ Internal placeholder card used by `GridstackDashboard` while remote modules are still loading. Mimics the shape of `DashboardWidgetCard` (header with icon + title, stats row, content lines) with a shimmer animation. Not exported from `@vc-shell/framework` — consumed only inside the dashboard organism.
11
+
12
+ ## When to Use
13
+
14
+ - You won't use this directly. `GridstackDashboard` renders one per `SkeletonItem` while `ModulesReadyKey` resolves to `false`.
15
+ - If you build a custom dashboard layout and want the same loading aesthetic, copy this file rather than importing it — the component is intentionally internal so the dashboard team can change its markup at any time.
16
+
17
+ ## Layout Contract
18
+
19
+ The skeleton has no props. Its parent positions it via inline `style` (`grid-column` / `grid-row`) inside a 12-column CSS grid. Card height/width is fully determined by the grid cell it occupies, so the skeleton stretches to fill its slot.
20
+
21
+ ## Accessibility
22
+
23
+ - The wrapper has `aria-hidden="true"` so screen readers ignore the visual placeholders. The parent grid carries `role="status"` + `aria-busy="true"` to announce loading state once.
24
+ - Shimmer animation is disabled when the user prefers reduced motion.
25
+
26
+ ## Design Tokens
27
+
28
+ Skeleton inherits dashboard card tokens where possible (`--dashboard-widget-card-background`, `--dashboard-widget-card-border-color`, `--dashboard-widget-card-border-radius`, `--dashboard-widget-card-shadow`) so its silhouette matches the real card. Shimmer colors are read from `--neutrals-100` / `--neutrals-200`.
29
+
30
+ ## Related
31
+
32
+ - [DraggableDashboard](./draggable-dashboard.docs.md) — owns the skeleton grid and decides when to render placeholders.
33
+ - [DashboardWidgetCard](../dashboard-widget-card/dashboard-widget-card.docs.md) — the real card whose shape skeletons imitate.
@@ -140,6 +140,27 @@ function resetLayout() {
140
140
  - The 12-column grid means common widget widths are: 3 (quarter), 4 (third), 6 (half), and 12 (full width).
141
141
  - Register widgets during module `install()` before the dashboard component mounts. Late registrations may not be picked up.
142
142
 
143
+ ## Advanced / Exports
144
+
145
+ Besides the `DraggableDashboard` component, `draggable-dashboard/index.ts` re-exports these symbols through the framework root, for building a custom Gridstack dashboard:
146
+
147
+ | Export | Kind | Description |
148
+ | ------------------------- | ---------- | ----------------------------------------------------------- |
149
+ | `useGridstack` | composable | Low-level Gridstack integration for a custom dashboard |
150
+ | `UseGridstackOptions` | type | Options for `useGridstack` |
151
+ | `UseGridstackReturn` | type | Return shape of `useGridstack` |
152
+ | `DashboardWidgetSize` | type | Widget size shape: `{ width, height }` |
153
+ | `DashboardWidgetPosition` | type | Widget position shape: `{ x, y }` |
154
+ | `DashboardDragEvent` | type | Payload emitted on widget drag/reorder |
155
+ | `DashboardGridConfig` | type | Grid configuration options |
156
+ | `toGridstackWidget` | function | Maps an `IDashboardWidget` to a Gridstack widget descriptor |
157
+ | `fromGridstackNode` | function | Maps a Gridstack node back to layout data |
158
+ | `loadLayoutFromStorage` | function | Reads persisted layout from localStorage |
159
+ | `saveLayoutToStorage` | function | Writes layout to localStorage |
160
+ | `mergeLayoutWithWidgets` | function | Merges a persisted layout onto the registered widget set |
161
+ | `clearLayoutStorage` | function | Clears the persisted layout |
162
+ | `LAYOUT_STORAGE_KEY` | constant | localStorage key used for layout persistence |
163
+
143
164
  ## Related Components
144
165
 
145
166
  - [DashboardWidgetCard](../dashboard-widget-card/dashboard-widget-card.docs.md) -- card container for widget content
@@ -39,6 +39,7 @@ A small indicator component for displaying counts, status dots, or short text la
39
39
  | `inline` | `boolean` | `false` | Renders as an inline element without absolute positioning |
40
40
  | `clickable` | `boolean` | `false` | Makes the badge respond to click events |
41
41
  | `disabled` | `boolean` | `false` | Disables interaction on clickable badges |
42
+ | `active` | `boolean` | `false` | Applies the active-state color tokens to the badge |
42
43
  | `customPosition` | `boolean` | `false` | Enables custom `top`/`right` positioning |
43
44
  | `top` | `string` | -- | Custom top offset (requires `customPosition`) |
44
45
  | `right` | `string` | -- | Custom right offset (requires `customPosition`) |
@@ -144,7 +145,7 @@ Fine-tune the badge position relative to its parent:
144
145
 
145
146
  - VcBadge lives in `framework/ui/components/atoms/vc-badge/`.
146
147
  - Overlay mode uses `position: absolute` on the badge element; the parent slot wrapper is set to `position: relative` via the `.vc-badge` CSS class.
147
- - The `inline` prop switches the root element from `<span class="vc-badge">` (overlay) to `<span class="vc-badge--inline">` with no position context.
148
+ - The `inline` prop switches the root element from the `<div class="vc-badge">` wrapper (overlay) to a `<div class="vc-badge__badge vc-badge__badge--inline">` rendered directly with no position context.
148
149
  - Color palette tokens: overlay uses `--{variant}-500` fills; inline uses `--{variant}-50` background + `--{variant}-700` text, defined in `framework/assets/styles/theme/colors.scss`.
149
150
  - Clickable mode integrates `role="button"` and keyboard handlers directly in the component — no separate button wrapper — to preserve the overlay stacking context.
150
151
 
@@ -172,8 +172,8 @@ Override the default "Show more" button with a custom trigger:
172
172
 
173
173
  ## Architecture notes
174
174
 
175
- - Legacy variants `"light-danger"`, `"info-dark"`, and `"primary"` are mapped in `vc-banner.vue` via a computed `resolvedVariant`. A `console.warn` is emitted in development mode only.
176
- - The collapse animation is driven by `max-height` CSS transition with a JS-measured `scrollHeight`. The `--vc-banner-collapsed-height` CSS variable is injected inline as a style binding.
175
+ - Legacy variants `"light-danger"`, `"info-dark"`, and `"primary"` are mapped in `vc-banner.vue` via a computed `normalizedVariant` (backed by the `normalizeVariant` function). A `console.warn` is emitted in development mode only.
176
+ - The collapse is driven by an inline `max-height` style bound via `wrapperStyle` from `useCollapsible` (max-height set to the measured `collapsedHeight` in px when collapsed), transitioned in CSS. There is no `--vc-banner-collapsed-height` custom property.
177
177
  - Source: `framework/ui/components/atoms/vc-banner/vc-banner.vue`
178
178
 
179
179
  <!-- internal:end -->
@@ -265,19 +265,19 @@ Use the `loading` prop, not `disabled`. A disabled button gives no progress feed
265
265
 
266
266
  ## Props
267
267
 
268
- | Prop | Type | Default | Description |
269
- | ----------- | ------------------------------------------------------------------------------------------------------------ | ----------- | --------------------------------------------------------------- |
270
- | `variant` | `"primary" \| "secondary" \| "danger" \| "warning" \| "success" \| "info" \| "outline" \| "ghost" \| "link"` | `"primary"` | Visual style variant |
271
- | `size` | `"sm" \| "default" \| "lg" \| "icon" \| "icon-sm"` | `"default"` | Button size |
272
- | `icon` | `string \| Component` | -- | Icon identifier or Vue component |
273
- | `iconClass` | `string` | -- | Additional CSS class for the icon element |
274
- | `iconSize` | `IconSize` | `"s"` | Size of the icon (`"xs"`, `"s"`, `"m"`, `"l"`, `"xl"`, `"xxl"`) |
275
- | `loading` | `boolean` | `false` | Shows spinner, disables interaction, sets `aria-busy` |
276
- | `disabled` | `boolean` | `false` | Disables the button |
277
- | `selected` | `boolean` | `false` | Applies selected/active visual state, sets `aria-pressed` |
278
- | `text` | `boolean` | `false` | Renders as borderless text in the variant's color |
279
- | `type` | `"button" \| "submit" \| "reset"` | `"button"` | HTML button type |
280
- | `ariaLabel` | `string` | -- | Accessible label (required for icon-only buttons) |
268
+ | Prop | Type | Default | Description |
269
+ | ----------- | ------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------------------- |
270
+ | `variant` | `"primary" \| "secondary" \| "danger" \| "warning" \| "success" \| "info" \| "outline" \| "ghost" \| "link"` | `"primary"` | Visual style variant |
271
+ | `size` | `"sm" \| "default" \| "lg" \| "icon" \| "icon-sm"` | `"default"` | Button size |
272
+ | `icon` | `string \| Component` | -- | Icon identifier or Vue component |
273
+ | `iconClass` | `string` | -- | Additional CSS class for the icon element |
274
+ | `iconSize` | `IconSize` | `"s"` | Size of the icon (`"xs"`, `"s"`, `"m"`, `"l"`, `"xl"`, `"xxl"`, `"xxxl"`) |
275
+ | `loading` | `boolean` | `false` | Shows spinner, disables interaction, sets `aria-busy` |
276
+ | `disabled` | `boolean` | `false` | Disables the button |
277
+ | `selected` | `boolean` | `false` | Applies selected/active visual state, sets `aria-pressed` |
278
+ | `text` | `boolean` | `false` | Renders as borderless text in the variant's color |
279
+ | `type` | `"button" \| "submit" \| "reset"` | `"button"` | HTML button type |
280
+ | `ariaLabel` | `string` | -- | Accessible label (required for icon-only buttons) |
281
281
 
282
282
  ## Events
283
283
 
@@ -304,6 +304,7 @@ All visual properties are customizable through CSS custom properties. Each varia
304
304
  | `--button-border-radius` | `6px` | Corner radius for all buttons |
305
305
  | `--button-focus-ring-color` | `var(--primary-300)` | Focus ring color |
306
306
  | `--button-focus-ring-width` | `2px` | Focus ring thickness |
307
+ | `--button-focus-ring-offset` | `2px` | Focus ring offset |
307
308
  | `--button-{size}-height` | `--button-default-height: 36px` | Height per size |
308
309
 
309
310
  ## Accessibility
@@ -327,6 +328,6 @@ All visual properties are customizable through CSS custom properties. Each varia
327
328
  ## Architecture notes
328
329
 
329
330
  - VcButton calls `e.preventDefault()` on click to support `link` variant pattern. Form submit buttons must use `type="submit"` to bypass this.
330
- - `VcButtonGroup` integration is via provide/inject (`vcButtonGroupSize` injection key in `framework/injection-keys.ts`).
331
+ - `VcButtonGroup` integration is via provide/inject using the `ButtonGroupKey` injection key defined in `framework/ui/components/atoms/vc-button/types.ts`.
331
332
  - Size aliases `xs`/`base` are kept for backward compatibility — slated for removal in v3.
332
333
  <!-- internal:end -->
@@ -57,12 +57,15 @@ The `shadow` prop adds an inset shadow as a scroll cue. Use it for content that
57
57
 
58
58
  ## CSS Variables
59
59
 
60
- | Variable | Default | Description |
61
- | --------------------------- | ------------- | ------------------------------------ |
62
- | `--container-padding` | `16px` | Inner padding of the scrollable area |
63
- | `--container-bg` | `transparent` | Background color |
64
- | `--container-border-radius` | `0` | Border radius |
65
- | `--container-gap` | `0` | Gap between child elements |
60
+ | Variable | Default | Description |
61
+ | ---------------------------- | -------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
62
+ | `--container-padding` | `16px` | Inner padding of the scrollable area |
63
+ | `--container-bg` | `transparent` | Background color |
64
+ | `--container-border-radius` | `0` | Border radius |
65
+ | `--container-gap` | `0` | Gap between child elements |
66
+ | `--container-shadow-color` | `var(--additional-950)` | Scroll-shadow color (RGB channels used by `--container-shadow`) |
67
+ | `--container-shadow-opacity` | `0.1` | Scroll-shadow opacity |
68
+ | `--container-shadow` | `0 3px 2px rgba(var(--container-shadow-color), var(--container-shadow-opacity)) inset` | Inset shadow applied when the `shadow` prop is set |
66
69
 
67
70
  ## Exposed Methods
68
71
 
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: VcEnvironmentBanner
3
+ category: components
4
+ group: feedback
5
+ ---
6
+
7
+ # VcEnvironmentBanner
8
+
9
+ Centered badge pinned to the top of the application that labels the current
10
+ environment (Development, QA, Demo, etc.). Mirrors the platform environment
11
+ banner (vc-env-badge). Purely presentational — it renders the colored badge and
12
+ its label, and does not know where the name comes from. Visibility and color are
13
+ decided by the caller (see `useEnvironmentName`).
14
+
15
+ ## When to Use
16
+
17
+ - Inside the app shell to make non-production environments visually obvious
18
+ - When NOT to use: do not place it manually in blades — `VcApp` already mounts it
19
+
20
+ ## Props
21
+
22
+ - `name: string` — environment label to render
23
+ - `color?: string` — badge color (vc-shell theme tokens); recognized values are `primary | secondary | info | success | warning | danger | neutral`, any other value falls back to neutral via CSS, default `neutral`
24
+
25
+ ## Quick Start
26
+
27
+ ```vue
28
+ <template>
29
+ <VcEnvironmentBanner
30
+ v-if="!isIgnored"
31
+ :name="environmentName"
32
+ :color="color"
33
+ />
34
+ </template>
35
+
36
+ <script setup>
37
+ import { VcEnvironmentBanner } from "@vc-shell/framework";
38
+ import { useEnvironmentName } from "@vc-shell/framework";
39
+
40
+ const { environmentName, isIgnored, color } = useEnvironmentName();
41
+ </script>
42
+ ```