@vc-shell/vc-app-skill 2.1.0 → 2.2.0-pr260.a8bd3a7

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 (141) hide show
  1. package/package.json +1 -1
  2. package/runtime/VERSION +1 -1
  3. package/runtime/agents/migration-agent.md +4 -2
  4. package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
  5. package/runtime/knowledge/docs/core/api/platform.docs.md +20 -18
  6. package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +43 -34
  7. package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +5 -3
  8. package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +12 -10
  9. package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +7 -5
  10. package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +8 -6
  11. package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +3 -1
  12. package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +1 -1
  13. package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +8 -5
  14. package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +12 -12
  15. package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +3 -3
  16. package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +4 -3
  17. package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +1 -0
  18. package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +3 -3
  19. package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +5 -4
  20. package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +3 -3
  21. package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +2 -0
  22. package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +1 -2
  23. package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +1 -1
  24. package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +3 -3
  25. package/runtime/knowledge/docs/core/composables/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +1 -0
  26. package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +1 -1
  27. package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +2 -2
  28. package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +2 -1
  29. package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +18 -18
  30. package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +3 -3
  31. package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +10 -7
  32. package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +7 -7
  33. package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +18 -12
  34. package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +2 -2
  35. package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +20 -20
  36. package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +15 -24
  37. package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +2 -2
  38. package/runtime/knowledge/docs/core/notifications/composables/useBladeNotifications.docs.md +1 -2
  39. package/runtime/knowledge/docs/core/notifications/composables/useBroadcastFilter.docs.md +3 -3
  40. package/runtime/knowledge/docs/core/notifications/composables/useNotificationStore.docs.md +19 -18
  41. package/runtime/knowledge/docs/core/notifications/notifications.docs.md +50 -30
  42. package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +30 -11
  43. package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +1 -1
  44. package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +2 -3
  45. package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +26 -26
  46. package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +2 -3
  47. package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +11 -50
  48. package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +9 -6
  49. package/runtime/knowledge/docs/core/services/services.docs.md +15 -13
  50. package/runtime/knowledge/docs/core/types/types.docs.md +37 -40
  51. package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +1 -2
  52. package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +21 -30
  53. package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +2 -2
  54. package/runtime/knowledge/docs/core/utilities/utilities.docs.md +9 -8
  55. package/runtime/knowledge/docs/injection-keys.docs.md +6 -11
  56. package/runtime/knowledge/docs/modules/assets/assets-details.docs.md +7 -7
  57. package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +1 -1
  58. package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +20 -12
  59. package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +10 -10
  60. package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +6 -6
  61. package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +4 -4
  62. package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +16 -14
  63. package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +1 -1
  64. package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +12 -11
  65. package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +10 -3
  66. package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +3 -3
  67. package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +9 -2
  68. package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +4 -2
  69. package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
  70. package/runtime/knowledge/docs/shell/components/notification-dropdown/notification-dropdown.docs.md +35 -31
  71. package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -11
  72. package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +8 -7
  73. package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +23 -21
  74. package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +5 -3
  75. package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +7 -7
  76. package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +11 -11
  77. package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +28 -16
  78. package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +17 -19
  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} +24 -27
  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 +509 -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 +3 -3
  138. package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +4 -4
  139. package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +2 -3
  140. package/runtime/knowledge/migration-prompts/table-url-state-migration.md +221 -0
  141. package/runtime/vc-app.md +1 -0
@@ -148,13 +148,14 @@ async function handleUpload(files: FileList) {
148
148
 
149
149
  ## CSS Custom Properties
150
150
 
151
- | Variable | Default | Description |
152
- | -------------------------------- | --------------------- | -------------------------- |
153
- | `--progressbar-height` | `8px` | Bar height |
154
- | `--progressbar-border-radius` | `9999px` | Border radius (pill shape) |
155
- | `--progressbar-background-color` | `var(--neutrals-200)` | Track background |
156
- | `--progressbar-foreground-color` | `var(--primary-500)` | Fill color |
157
- | `--progressbar-striped-bg` | gradient | Striped variant background |
151
+ | Variable | Default | Description |
152
+ | -------------------------------- | --------------------- | ---------------------------- |
153
+ | `--progressbar-height` | `8px` | Bar height |
154
+ | `--progressbar-border-radius` | `9999px` | Border radius (pill shape) |
155
+ | `--progressbar-background-color` | `var(--neutrals-200)` | Track background |
156
+ | `--progressbar-foreground-color` | `var(--primary-500)` | Fill color |
157
+ | `--progressbar-striped-bg` | gradient | Striped variant background |
158
+ | `--progressbar-striped-color` | `var(--primary-400)` | Striped variant stripe color |
158
159
 
159
160
  ## Tips
160
161
 
@@ -179,7 +180,7 @@ async function handleUpload(files: FileList) {
179
180
 
180
181
  ## Architecture notes
181
182
 
182
- - The fill width is driven by `transform: scaleX(value / 100)` with `transform-origin: left`, not `width`, for smoother GPU-accelerated animation.
183
+ - The fill is a full-width (`width: 100%`) element translated horizontally via `transform: translateX(-(100 - value)%)`, not `width`, for smoother GPU-accelerated animation. There is no `scaleX` or `transform-origin: left`.
183
184
  - The `value` prop is clamped via `Math.min(100, Math.max(0, props.value))` in a computed.
184
185
  - Source: `framework/ui/components/atoms/vc-progress/vc-progress.vue`
185
186
 
@@ -128,6 +128,13 @@ Replace the default chevrons with custom indicators:
128
128
  </VcScrollableContainer>
129
129
  ```
130
130
 
131
+ ## CSS Custom Properties
132
+
133
+ | Variable | Default | Description |
134
+ | ---------------------- | --------------------- | --------------------- |
135
+ | `--scroll-arrow-size` | `16px` | Arrow indicator size |
136
+ | `--scroll-arrow-color` | `var(--neutrals-400)` | Arrow indicator color |
137
+
131
138
  ## Tips
132
139
 
133
140
  - The `speed` prop is captured once at mount time and is not reactive. If you need to change speed dynamically, remount the component with a `:key` binding.
@@ -136,7 +136,7 @@ The last row automatically renders at 60% width for a natural paragraph feel.
136
136
 
137
137
  ## Architecture notes
138
138
 
139
- - The `text` variant uses an `Array(rows).fill(0)` to render `<span>` elements via `v-for`. The last row gets a `width: 60%` inline style for a natural paragraph taper.
139
+ - The `text` variant renders rows via `v-for="index in rows"` over `<div class="vc-skeleton__row">` elements. `getRowWidth(index)` returns `60%` for the last row (inline style) for a natural paragraph taper.
140
140
  - Animation uses a CSS `@keyframes` pulse (opacity oscillation), not a moving shimmer, for simplicity and performance.
141
141
  - Source: `framework/ui/components/atoms/vc-skeleton/vc-skeleton.vue`
142
142
 
@@ -131,8 +131,8 @@ Each variant has its own set of CSS variables following the pattern `--status-{v
131
131
 
132
132
  ## Architecture notes
133
133
 
134
- - The `extend` prop switches a CSS class; all color theming is done via `--status-{variant}-*` CSS variables scoped under `.vc-status`.
135
- - Special variants `"light-danger"`, `"info-dark"`, and `"primary"` are kept for backward compatibility and mapped via a `variantClassMap` in `vc-status.vue`.
134
+ - The `extend` prop toggles the `vc-status--extended` modifier class; all color theming is done via `--status-{variant}-*` CSS variables scoped under `.vc-status`.
135
+ - Each variant is bound directly as `vc-status--${variant}` and styled through a SCSS `@each $variant in $variants` loop; the special variants `"light-danger"`, `"info-dark"`, and `"primary"` are kept for backward compatibility.
136
136
  - Source: `framework/ui/components/atoms/vc-status/vc-status.vue`
137
137
 
138
138
  <!-- internal:end -->
@@ -167,7 +167,7 @@ VcStatusIcon is intentionally minimal. If you need a text label next to the icon
167
167
 
168
168
  ## Architecture notes
169
169
 
170
- - VcStatusIcon wraps two `VcIcon` instances in a single `<span>` with `v-if`/`v-else` switching on the `status` prop.
170
+ - VcStatusIcon wraps two `VcIcon` instances in a single `<div class="vc-status-icon">` with `v-if`/`v-else` switching on the `status` prop.
171
171
  - Icon size inherits from parent font-size; no dedicated size prop is exposed.
172
172
  - Source: `framework/ui/components/atoms/vc-status-icon/vc-status-icon.vue`
173
173
 
@@ -6,7 +6,7 @@ group: feedback
6
6
 
7
7
  # VcTooltip
8
8
 
9
- A floating tooltip that appears on hover or focus to provide contextual information about a trigger element. Powered by Floating UI for automatic positioning, collision detection, and arrow alignment. The tooltip is teleported to the document body for proper stacking above all content.
9
+ A floating tooltip that appears on hover or focus to provide contextual information about a trigger element. Powered by Floating UI for automatic positioning, collision detection, and arrow alignment. The tooltip is teleported to the vc-app root element (falling back to `document.body`) for proper stacking above all content.
10
10
 
11
11
  ## Quick Start
12
12
 
@@ -248,13 +248,13 @@ const actions = [
248
248
  </template>
249
249
  </VcTooltip>
250
250
 
251
- <!-- Correct -- use a popover or dropdown for interactive content -->
252
- <VcPopover>
251
+ <!-- Correct -- use a popover or dropdown component for interactive content -->
252
+ <YourPopover>
253
253
  <span>Click for help</span>
254
254
  <template #content>
255
255
  <a href="/docs">Read the documentation</a>
256
256
  </template>
257
- </VcPopover>
257
+ </YourPopover>
258
258
  ```
259
259
 
260
260
  ### Forgetting the #tooltip slot
@@ -324,7 +324,8 @@ const actions = [
324
324
  | `--tooltip-font-size` | `12px` | Text size |
325
325
  | `--tooltip-padding-x` | `10px` | Horizontal padding |
326
326
  | `--tooltip-padding-y` | `6px` | Vertical padding |
327
- | `--tooltip-z-index` | `1002` | Stacking order |
327
+
328
+ Stacking order comes from the global `--z-critical-tooltip` token and is not overridable per-instance.
328
329
 
329
330
  ## Accessibility
330
331
 
@@ -332,7 +333,7 @@ const actions = [
332
333
  - `aria-describedby` links the trigger to the tooltip when visible
333
334
  - Shows on `focusin`, hides on `focusout` for keyboard users
334
335
  - Escape key dismisses the tooltip
335
- - Tooltip is teleported to the document body for proper stacking context
336
+ - Tooltip is teleported to the vc-app root element (falling back to `document.body`) for proper stacking context
336
337
  - Fade transition (150ms in, 100ms out) provides smooth visual feedback
337
338
  - The tooltip has `pointer-events: none` -- it cannot be interacted with directly
338
339
 
@@ -347,10 +348,10 @@ const actions = [
347
348
  ## Architecture notes
348
349
 
349
350
  - VcTooltip uses `@floating-ui/vue` (`useFloating`, `autoUpdate`, `flip`, `shift`, `arrow`, `offset` middleware).
350
- - The tooltip content is teleported to `<body>` via Vue's `<Teleport>` to escape stacking contexts.
351
- - Show/hide state is managed with a single `isVisible` ref toggled by `mouseenter`/`mouseleave` and `focusin`/`focusout` on the trigger slot wrapper.
352
- - The delay timer is stored in a `timeoutId` ref and cleared on `mouseleave` to cancel pending show.
353
- - Arrow positioning is handled by the `arrowEl` template ref passed to the `arrow` middleware; position is applied via `:style` on the arrow element.
351
+ - The tooltip content is teleported via Vue's `<Teleport>` to escape stacking contexts. The target is resolved by `useTeleportTarget()` with priority explicit target -> vc-app root element (`AppRootElementKey`) -> `<body>` fallback.
352
+ - Show/hide state is managed with a single `tooltipVisible` ref toggled by `mouseenter`/`mouseleave` and `focusin`/`focusout` on the trigger slot wrapper.
353
+ - The delay timer is stored in a `showTimeout` variable (not a ref) and cleared in `hideTooltip`/`onBeforeUnmount` to cancel a pending show.
354
+ - Arrow positioning is handled by the `arrowRef` template ref passed to the `arrow` middleware; position is applied via `:style` on the arrow element.
354
355
  - Source: `framework/ui/components/atoms/vc-tooltip/vc-tooltip.vue`
355
356
 
356
357
  <!-- internal:end -->
@@ -34,14 +34,21 @@ import { VcVideo } from "@vc-shell/framework";
34
34
 
35
35
  ## Key Props
36
36
 
37
- | Prop | Type | Default | Description |
38
- | --------- | -------- | ------- | -------------------------------------------------- |
39
- | `source` | `string` | -- | Embed URL for the video (e.g., YouTube embed link) |
40
- | `label` | `string` | -- | Label text displayed above the video |
41
- | `tooltip` | `string` | -- | Tooltip text shown on the label's info icon |
37
+ | Prop | Type | Default | Description |
38
+ | ------------------- | -------- | ------- | -------------------------------------------------------------------------------------- |
39
+ | `source` | `string` | -- | Embed URL for the video (e.g., YouTube embed link) |
40
+ | `label` | `string` | -- | Label text displayed above the video |
41
+ | `tooltip` | `string` | -- | Tooltip text shown on the label's info icon |
42
+ | `additionalSandbox` | `string` | -- | Extra space-separated iframe sandbox tokens appended to the secure default (see below) |
42
43
 
43
44
  ::storybook id="data-display-vcvideo--with-tooltip" height="400"
44
45
 
46
+ ## Events
47
+
48
+ | Event | Payload | Description |
49
+ | ------- | ------- | ------------------------------------------------------------ |
50
+ | `click` | -- | Declared public emit. Currently the template never fires it. |
51
+
45
52
  ## Common Patterns
46
53
 
47
54
  ### Video with Label and Tooltip
@@ -110,17 +117,30 @@ When `source` is not provided, VcVideo renders a centered film icon placeholder
110
117
 
111
118
  - Always use the **embed** URL format, not the standard watch URL. For YouTube, use `https://www.youtube.com/embed/VIDEO_ID` instead of `https://www.youtube.com/watch?v=VIDEO_ID`.
112
119
  - The iframe has `loading="lazy"`, so videos below the fold are not loaded until the user scrolls to them. This keeps initial page load fast.
113
- - The `sandbox` attribute restricts iframe capabilities to `allow-scripts allow-same-origin allow-presentation allow-popups` for security. If your video host requires additional permissions, you may need a custom wrapper.
120
+ - The `sandbox` attribute defaults to the secure minimum `allow-scripts allow-presentation`. If your video host requires more, append tokens via `additionalSandbox` see the Security section below.
121
+ - The iframe sets a fixed `allow` permissions policy (`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`) plus `allowfullscreen`, so embedded players can autoplay, go fullscreen, and use picture-in-picture. These are not configurable per-instance.
114
122
  - The iframe renders at a fixed height of 300px. To customize the height, override the iframe styles via a scoped CSS rule targeting `.vc-video__container iframe`.
115
123
  - The placeholder has a height of 200px so the layout does not collapse when no source is provided.
116
124
 
117
125
  ## Accessibility
118
126
 
119
127
  - The iframe uses the `title` attribute (set to `label` or "Video") for screen readers
120
- - `sandbox` attribute restricts iframe capabilities to `allow-scripts allow-same-origin allow-presentation allow-popups`
128
+ - `sandbox` attribute defaults to the secure minimum `allow-scripts allow-presentation`
121
129
  - `loading="lazy"` defers iframe load until visible
122
130
  - Placeholder state uses `role="img"` with `aria-label="No video source"`
123
131
 
132
+ ## Security
133
+
134
+ The iframe `sandbox` defaults to `allow-scripts allow-presentation` — the minimum that keeps mainstream embeds (YouTube, Vimeo) working while denying the framed page access to the parent origin. To add capabilities a specific host needs, pass them through `additionalSandbox`:
135
+
136
+ ```vue
137
+ <!-- Some embeds need popups for auth flows -->
138
+ <VcVideo source="https://example.com/embed" additional-sandbox="allow-popups" />
139
+ ```
140
+
141
+ !!! danger "Never combine `allow-same-origin` with `allow-scripts`"
142
+ Per MDN and OWASP, enabling both tokens lets the embedded page remove its own sandbox and reach the parent origin's cookies, `localStorage`, and DOM. `VcVideo` renders whatever `source` you pass, so for untrusted or user-supplied URLs do **not** add `allow-same-origin`.
143
+
124
144
  !!! warning "Always use embed URLs, not watch URLs"
125
145
  YouTube watch URLs (`youtube.com/watch?v=...`) will be blocked by the browser's frame policy. Always convert to the embed format (`youtube.com/embed/VIDEO_ID`). Vimeo similarly requires `player.vimeo.com/video/VIDEO_ID`.
126
146
 
@@ -136,7 +156,7 @@ YouTube watch URLs (`youtube.com/watch?v=...`) will be blocked by the browser's
136
156
 
137
157
  - VcVideo lives in `framework/ui/components/atoms/vc-video/`.
138
158
  - The component is a thin wrapper around a native `<iframe>` — no custom video controls are implemented.
139
- - The `sandbox` attribute is hardcoded to `allow-scripts allow-same-origin allow-presentation allow-popups`. Apps that need additional iframe permissions must wrap the component or use a plain `<iframe>`.
159
+ - The `sandbox` attribute is computed from a secure base (`allow-scripts allow-presentation`) plus any `additionalSandbox` tokens, deduped. `allow-same-origin` is intentionally omitted from the default see the Security section.
140
160
  - The label is rendered via `VcLabel` (internal atom) with the `tooltip` prop forwarded as the VcLabel tooltip slot content.
141
161
  - Placeholder state (`source` is falsy) swaps the iframe for a `<div>` with `role="img"` containing a `VcIcon` with `lucide-film`.
142
162
 
@@ -42,14 +42,15 @@ function openNotifications() {
42
42
 
43
43
  ## Key Props
44
44
 
45
- | Prop | Type | Default | Description |
46
- | ------------ | ------------------ | ------- | ----------------------------------------------------------------- |
47
- | `icon` | `string` | -- | Icon name (Lucide format, e.g., `"lucide-save"`) |
48
- | `title` | `string` | -- | Label text below (or beside) the icon |
49
- | `value` | `string \| number` | -- | Badge count displayed on the icon; numbers above 99 show as "99+" |
50
- | `disabled` | `boolean` | `false` | Prevents clicks and applies muted styling |
51
- | `isExpanded` | `boolean` | `false` | Expanded visual state |
52
- | `horizontal` | `boolean` | `false` | Arranges icon and title side by side instead of stacked |
45
+ | Prop | Type | Default | Description |
46
+ | ------------ | ------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
47
+ | `icon` | `string` | -- | Icon name (Lucide format, e.g., `"lucide-save"`) |
48
+ | `title` | `string` | -- | Label text below (or beside) the icon |
49
+ | `value` | `string \| number` | -- | Badge count displayed on the icon; numbers above 99 show as "99+" |
50
+ | `disabled` | `boolean` | `false` | Prevents clicks and applies muted styling |
51
+ | `isExpanded` | `boolean` | `false` | Expanded visual state |
52
+ | `horizontal` | `boolean` | `false` | Arranges icon and title side by side instead of stacked |
53
+ | `widgetId` | `string` | -- | Sets the `data-widget-id` attribute on the root element. The root also binds `data-widget-name` from `title`; both are used for widget identification/targeting. |
53
54
 
54
55
  ## Events
55
56
 
@@ -97,16 +98,18 @@ Badge values above 99 are automatically displayed as "99+".
97
98
 
98
99
  ## CSS Custom Properties
99
100
 
100
- | Variable | Default | Description |
101
- | ---------------------------- | --------------------- | -------------------- |
102
- | `--widget-bg-color` | `transparent` | Background color |
103
- | `--widget-bg-hover-color` | `var(--neutrals-50)` | Background on hover |
104
- | `--widget-icon-color` | `var(--neutrals-700)` | Icon color |
105
- | `--widget-icon-hover-color` | `var(--primary-600)` | Icon color on hover |
106
- | `--widget-title-color` | `var(--neutrals-600)` | Title text color |
107
- | `--widget-title-hover-color` | `var(--primary-600)` | Title color on hover |
108
- | `--widget-border-radius` | `8px` | Corner radius |
109
- | `--widget-focus-ring-color` | `var(--primary-300)` | Focus ring color |
101
+ | Variable | Default | Description |
102
+ | ------------------------------- | --------------------- | ------------------------- |
103
+ | `--widget-bg-color` | `transparent` | Background color |
104
+ | `--widget-bg-hover-color` | `var(--neutrals-50)` | Background on hover |
105
+ | `--widget-icon-color` | `var(--neutrals-700)` | Icon color |
106
+ | `--widget-icon-hover-color` | `var(--primary-600)` | Icon color on hover |
107
+ | `--widget-icon-disabled-color` | `var(--neutrals-400)` | Icon color when disabled |
108
+ | `--widget-title-color` | `var(--neutrals-600)` | Title text color |
109
+ | `--widget-title-hover-color` | `var(--primary-600)` | Title color on hover |
110
+ | `--widget-title-disabled-color` | `var(--neutrals-400)` | Title color when disabled |
111
+ | `--widget-border-radius` | `8px` | Corner radius |
112
+ | `--widget-focus-ring-color` | `var(--primary-300)` | Focus ring color |
110
113
 
111
114
  ## Accessibility
112
115
 
@@ -128,7 +131,7 @@ Badge values above 99 are automatically displayed as "99+".
128
131
  ## Architecture notes
129
132
 
130
133
  - VcWidget lives in `framework/ui/components/atoms/vc-widget/`.
131
- - The badge overlay is rendered by embedding `VcBadge` with `isDot`/`content` derived from the `value` prop; values above 99 are truncated to `"99+"` in the component template.
134
+ - The badge overlay is rendered by embedding `VcBadge` with `content="truncateCount"`, `custom-position`, `top="-6px"`, and `size="s"`. The `99+` truncation is performed by the shared `formatBadgeCount` utility (via the `truncateCount` computed), not inline in the template.
132
135
  - `isExpanded` applies `.vc-widget--expanded` modifier; used by the shell sidebar to visually distinguish active navigation state.
133
136
  - `horizontal` applies `.vc-widget--horizontal` modifier which switches the internal flex direction from `column` to `row`.
134
137
  - The widget registers as a keyboard-interactive element (`role="button"`, Enter/Space handlers) rather than using a `<button>` to allow embedding arbitrary icon components without nesting interactive elements.
@@ -1,12 +1,12 @@
1
1
  ---
2
- title: MultilanguageSelector
2
+ title: VcLanguageSelector
3
3
  category: components
4
4
  group: form
5
5
  ---
6
6
 
7
- # MultilanguageSelector
7
+ # VcLanguageSelector
8
8
 
9
- Compact circular flag button that opens a dropdown for selecting a content language. Designed for use in detail blades where entities have multilingual fields (e.g., product name, offer description, category title). This is distinct from the `LanguageSelector` settings entry, which changes the application UI locale -- `MultilanguageSelector` controls which language version of the content the user is editing.
9
+ Compact circular flag button that opens a dropdown for selecting a content language. Designed for use in detail blades where entities have multilingual fields (e.g., product name, offer description, category title). This is distinct from the `LanguageSelector` settings entry, which changes the application UI locale -- `VcLanguageSelector` controls which language version of the content the user is editing.
10
10
 
11
11
  ## When to Use
12
12
 
@@ -21,7 +21,7 @@ Compact circular flag button that opens a dropdown for selecting a content langu
21
21
  ```vue
22
22
  <script setup lang="ts">
23
23
  import { ref } from "vue";
24
- import { MultilanguageSelector } from "@vc-shell/framework";
24
+ import { VcLanguageSelector } from "@vc-shell/framework";
25
25
 
26
26
  const currentLang = ref("en-US");
27
27
 
@@ -32,7 +32,7 @@ const languages = [
32
32
  </script>
33
33
 
34
34
  <template>
35
- <MultilanguageSelector
35
+ <VcLanguageSelector
36
36
  v-model="currentLang"
37
37
  :options="languages"
38
38
  />
@@ -58,7 +58,7 @@ A typical use case is a product detail blade where the user can edit the name an
58
58
  ```vue
59
59
  <script setup lang="ts">
60
60
  import { ref, computed } from "vue";
61
- import { MultilanguageSelector } from "@vc-shell/framework";
61
+ import { VcLanguageSelector } from "@vc-shell/framework";
62
62
 
63
63
  const product = ref({
64
64
  names: { "en-US": "Widget", "de-DE": "Widget-Teil" },
@@ -91,7 +91,7 @@ const currentDescription = computed({
91
91
  <template>
92
92
  <VcBlade title="Edit Product">
93
93
  <template #actions>
94
- <MultilanguageSelector
94
+ <VcLanguageSelector
95
95
  v-model="currentLang"
96
96
  :options="languages"
97
97
  />
@@ -132,7 +132,7 @@ onMounted(async () => {
132
132
 
133
133
  - **Compact layout**: The button renders as a small circle showing the flag of the currently selected language. Clicking it opens a dropdown with all available options.
134
134
  - **v-model binding**: The component uses `modelValue` / `update:modelValue` for two-way binding, following the standard Vue 3 v-model convention.
135
- - **Flag images**: The `flag` property on each option is optional. When provided, it shows the flag image; otherwise, the language code text is displayed.
135
+ - **Flag images**: The `flag` property on each option is optional. When provided, it shows the flag image; otherwise, a globe icon (`lucide-globe`) is displayed.
136
136
  - **Dropdown positioning**: The dropdown is positioned relative to the button and adjusts to avoid viewport overflow.
137
137
 
138
138
  ## Tips
@@ -53,12 +53,12 @@ Without `v-model`, no items are expanded on mount. Pass an initial value to pre-
53
53
 
54
54
  Four variants control the visual grouping and spacing of accordion items.
55
55
 
56
- | Variant | Description |
57
- | ----------- | ------------------------------------------------------------------------ |
58
- | `default` | Items stacked with shared top/bottom borders, no gaps |
59
- | `bordered` | Single outer border wrapping all items, items separated by inner borders |
60
- | `separated` | Card-like items with 12px gaps between them, each with its own border |
61
- | `ghost` | Transparent background, minimal styling, no borders or padding |
56
+ | Variant | Description |
57
+ | ----------- | -------------------------------------------------------------------------- |
58
+ | `default` | Items stacked with shared top/bottom borders, no gaps |
59
+ | `bordered` | Single outer border wrapping all items, items separated by inner borders |
60
+ | `separated` | Card-like items with 12px gaps between them, each with its own border |
61
+ | `ghost` | Transparent background, minimal styling, no borders and no content padding |
62
62
 
63
63
  ```vue
64
64
  <VcAccordion :items="items" variant="separated" />
@@ -262,6 +262,16 @@ interface AccordionItem {
262
262
  | `--accordion-item-transition-duration` | `300ms` | Expand/collapse animation duration |
263
263
  | `--accordion-item-fade-height` | `60px` | Fade gradient height on collapsed preview |
264
264
  | `--accordion-item-focus-ring-color` | `var(--primary-100)` | Focus ring color for keyboard navigation |
265
+ | `--accordion-item-header-font-size` | `14px` | Header font size |
266
+ | `--accordion-item-header-font-weight` | `500` | Header font weight |
267
+ | `--accordion-item-header-line-height` | `20px` | Header line height |
268
+ | `--accordion-item-header-text-transform` | `none` | Header text transform |
269
+ | `--accordion-item-header-gap` | `0` | Gap between header label and icon |
270
+ | `--accordion-item-icon-margin-left` | `12px` | Left margin of the chevron icon |
271
+ | `--accordion-item-icon-size` | `20px` | Chevron icon size |
272
+ | `--accordion-item-content-color` | `var(--secondary-950)` | Content body text color |
273
+ | `--accordion-item-content-font-size` | `14px` | Content body font size |
274
+ | `--accordion-item-content-line-height` | `20px` | Content body line height |
265
275
 
266
276
  > **Note:** The `ghost` variant overrides several variables to transparent/zero values for minimal appearance.
267
277
 
@@ -194,10 +194,10 @@ In a typical VC-Shell blade hierarchy, push a breadcrumb each time a child blade
194
194
 
195
195
  ```vue
196
196
  <script setup lang="ts">
197
- import { useBreadcrumbs, useBladeContext } from "@vc-shell/framework";
197
+ import { useBreadcrumbs, useBlade } from "@vc-shell/framework";
198
198
 
199
199
  const { breadcrumbs, push } = useBreadcrumbs();
200
- const { openBlade, closeSelf } = useBladeContext();
200
+ const { openBlade, closeSelf } = useBlade();
201
201
 
202
202
  function openProductDetail(product: Product) {
203
203
  push({
@@ -270,12 +270,13 @@ clickHandler: () => { navigate(); return true; }
270
270
 
271
271
  ## CSS Variables
272
272
 
273
- | Variable | Default | Description |
274
- | ----------------------------------------- | ---------------------- | ------------------------------------ |
275
- | `--separator-color` | `var(--neutrals-400)` | Color of the `/` separator character |
276
- | `--breadcrumbs-item-border-color` | `var(--secondary-300)` | Border color of breadcrumb items |
277
- | `--breadcrumbs-expand-button-color` | `var(--neutrals-500)` | Color of the overflow "more" button |
278
- | `--breadcrumbs-expand-button-color-hover` | `var(--neutrals-600)` | Hover color of the overflow button |
273
+ | Variable | Default | Description |
274
+ | ----------------------------------------- | ---------------------- | ----------------------------------------- |
275
+ | `--separator-color` | `var(--neutrals-400)` | Color of the `/` separator character |
276
+ | `--breadcrumbs-item-border-color` | `var(--secondary-300)` | Border color of breadcrumb items |
277
+ | `--breadcrumbs-item-border-color-hover` | `var(--secondary-400)` | Border color of breadcrumb items on hover |
278
+ | `--breadcrumbs-expand-button-color` | `var(--neutrals-500)` | Color of the overflow "more" button |
279
+ | `--breadcrumbs-expand-button-color-hover` | `var(--neutrals-600)` | Hover color of the overflow button |
279
280
 
280
281
  ## Accessibility
281
282
 
@@ -300,22 +300,23 @@ const selected = ref<string[]>([]);
300
300
 
301
301
  ## Props
302
302
 
303
- | Prop | Type | Default | Description |
304
- | --------------- | ------------------- | ----------- | ---------------------------------------------------------------------- |
305
- | `modelValue` | `boolean \| T[]` | `undefined` | Bound value via `v-model`. Boolean for single, array for multi-select. |
306
- | `value` | `T` | -- | Value added to the array when checked (array mode only) |
307
- | `label` | `string` | -- | Label text displayed above the checkbox |
308
- | `tooltip` | `string` | -- | Tooltip on the label info icon |
309
- | `size` | `"s" \| "m" \| "l"` | `"s"` | Checkbox size variant |
310
- | `indeterminate` | `boolean` | `false` | Shows the indeterminate (dash) visual state |
311
- | `trueValue` | `boolean` | `true` | Value emitted when checked (boolean mode) |
312
- | `falseValue` | `boolean` | `false` | Value emitted when unchecked (boolean mode) |
313
- | `disabled` | `boolean` | `false` | Disables the checkbox |
314
- | `required` | `boolean` | `false` | Shows a required indicator |
315
- | `error` | `boolean` | `false` | Enables error styling |
316
- | `errorMessage` | `string` | -- | Error message displayed below the checkbox |
317
- | `name` | `string` | `"Field"` | HTML name attribute |
318
- | `outline` | `boolean` | `false` | Applies outline style variant |
303
+ | Prop | Type | Default | Description |
304
+ | --------------- | ------------------- | ----------- | ------------------------------------------------------------------------------------------------- |
305
+ | `modelValue` | `boolean \| T[]` | `undefined` | Bound value via `v-model`. Boolean for single, array for multi-select. |
306
+ | `value` | `T` | -- | Value added to the array when checked (array mode only) |
307
+ | `label` | `string` | -- | Label text displayed above the checkbox |
308
+ | `tooltip` | `string` | -- | Tooltip on the label info icon |
309
+ | `size` | `"s" \| "m" \| "l"` | `"s"` | Checkbox size variant |
310
+ | `indeterminate` | `boolean` | `false` | Shows the indeterminate (dash) visual state |
311
+ | `trueValue` | `boolean` | `true` | Value emitted when checked (boolean mode) |
312
+ | `falseValue` | `boolean` | `false` | Value emitted when unchecked (boolean mode) |
313
+ | `disabled` | `boolean` | `false` | Disables the checkbox |
314
+ | `required` | `boolean` | `false` | Shows a required indicator |
315
+ | `error` | `boolean` | `false` | Enables error styling |
316
+ | `errorMessage` | `string` | -- | Error message displayed below the checkbox |
317
+ | `ariaLabel` | `string` | -- | Accessible name for the input when no visible `label` is set. Applied only when `label` is empty. |
318
+ | `name` | `string` | `"Field"` | HTML name attribute |
319
+ | `outline` | `boolean` | `false` | Reserved; declared but currently has no effect |
319
320
 
320
321
  ## Events
321
322
 
@@ -333,24 +334,31 @@ const selected = ref<string[]>([]);
333
334
 
334
335
  ## CSS Variables
335
336
 
336
- | Variable | Default | Description |
337
- | ------------------------------------- | ---------------------- | ------------------------ |
338
- | `--checkbox-size-s` | `16px` | Small variant size |
339
- | `--checkbox-size-m` | `20px` | Medium variant size |
340
- | `--checkbox-size-l` | `24px` | Large variant size |
341
- | `--checkbox-border-color` | `var(--neutrals-300)` | Default border color |
342
- | `--checkbox-border-color-hover` | `var(--neutrals-400)` | Border color on hover |
343
- | `--checkbox-bg-color` | `var(--additional-50)` | Unchecked background |
344
- | `--checkbox-checked-bg-color` | `var(--primary-500)` | Checked background color |
345
- | `--checkbox-checked-border-color` | `var(--primary-500)` | Checked border color |
346
- | `--checkbox-indeterminate-bg-color` | `var(--primary-500)` | Indeterminate background |
347
- | `--checkbox-indeterminate-line-color` | `var(--additional-50)` | Indeterminate dash color |
348
- | `--checkbox-error-border-color` | `var(--danger-500)` | Error state border |
349
- | `--checkbox-error-ring-color` | `var(--danger-100)` | Error ring color |
350
- | `--checkbox-focus-ring-color` | `var(--primary-100)` | Focus ring color |
351
- | `--checkbox-border-radius` | `4px` | Corner radius |
352
- | `--checkbox-disabled-opacity` | `0.5` | Opacity when disabled |
353
- | `--checkbox-transition-duration` | `200ms` | Animation duration |
337
+ | Variable | Default | Description |
338
+ | --------------------------------------- | ---------------------- | ------------------------------- |
339
+ | `--checkbox-size-s` | `16px` | Small variant size |
340
+ | `--checkbox-size-m` | `20px` | Medium variant size |
341
+ | `--checkbox-size-l` | `24px` | Large variant size |
342
+ | `--checkbox-border-color` | `var(--neutrals-300)` | Default border color |
343
+ | `--checkbox-border-color-hover` | `var(--neutrals-400)` | Border color on hover |
344
+ | `--checkbox-bg-color` | `var(--additional-50)` | Unchecked background |
345
+ | `--checkbox-checked-bg-color` | `var(--primary-500)` | Checked background color |
346
+ | `--checkbox-checked-border-color` | `var(--primary-500)` | Checked border color |
347
+ | `--checkbox-indeterminate-bg-color` | `var(--primary-500)` | Indeterminate background |
348
+ | `--checkbox-indeterminate-border-color` | `var(--primary-500)` | Indeterminate border color |
349
+ | `--checkbox-indeterminate-line-color` | `var(--additional-50)` | Indeterminate dash color |
350
+ | `--checkbox-text-color` | `var(--neutrals-900)` | Label text color |
351
+ | `--checkbox-icon-color` | `var(--additional-50)` | Check/dash icon color |
352
+ | `--checkbox-error-text-color` | `var(--danger-500)` | Error message text color |
353
+ | `--checkbox-required-color` | `var(--danger-500)` | Required indicator color |
354
+ | `--checkbox-label-spacing` | `0.5rem` | Spacing below the label |
355
+ | `--checkbox-text-margin` | `0.5rem` | Margin between control and text |
356
+ | `--checkbox-error-border-color` | `var(--danger-500)` | Error state border |
357
+ | `--checkbox-error-ring-color` | `var(--danger-100)` | Error ring color |
358
+ | `--checkbox-focus-ring-color` | `var(--primary-100)` | Focus ring color |
359
+ | `--checkbox-border-radius` | `4px` | Corner radius |
360
+ | `--checkbox-disabled-opacity` | `0.5` | Opacity when disabled |
361
+ | `--checkbox-transition-duration` | `200ms` | Animation duration |
354
362
 
355
363
  ## Accessibility
356
364
 
@@ -153,7 +153,7 @@ When placed inside a `VcBlade` with `loading=true`, the component renders a skel
153
153
  ## Architecture Notes
154
154
 
155
155
  - VcCheckboxGroup delegates rendering to `VcInputGroup` (semantic fieldset wrapper) and renders `VcCheckbox` items from the `options` array, or passes through the default slot for custom layouts.
156
- - The group generates a unique `name` attribute via `useId()` when none is provided, ensuring native radio group behavior.
156
+ - The group generates a unique `name` attribute via `useId()` when none is provided, ensuring native checkbox group naming/behavior.
157
157
  - `normalizedModelValue` guards against non-array `modelValue` to avoid runtime errors when the parent passes `undefined`.
158
158
  - Source file: `framework/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.vue`
159
159
 
@@ -60,6 +60,18 @@ const color = ref<string | null>(null);
60
60
  | `error` / `errorMessage` | `boolean` / `string` | -- | Error styling and validation message |
61
61
  | `disabled` | `boolean` | `false` | Disables the input and color picker |
62
62
 
63
+ ## Events
64
+
65
+ | Event | Payload | Description |
66
+ | ------------------- | ---------------- | ------------------------------------ |
67
+ | `update:modelValue` | `string \| null` | Emitted when the color value changes |
68
+ | `blur` | `Event` | Emitted when the text input blurs |
69
+ | `focus` | -- | Emitted when the text input focuses |
70
+
71
+ ## Exposed Methods
72
+
73
+ - `focus()` -- focuses the text input (accessible via a template ref).
74
+
63
75
  ## Common Patterns
64
76
 
65
77
  ### With Validation
@@ -194,6 +206,7 @@ Uses the same `--input-*` variables as VcInput, plus:
194
206
 
195
207
  - `--color-input-swatch-size` -- swatch square size (default 20px)
196
208
  - `--color-input-swatch-border-radius`, `--color-input-swatch-border-color`
209
+ - `--color-input-swatch-border-color-hover` -- swatch border color on hover (default var(--neutrals-400))
197
210
 
198
211
  ## Tip: CSS Color Names
199
212
 
@@ -218,7 +231,7 @@ When placed inside a `VcBlade` with `loading=true`, the component automatically
218
231
 
219
232
  - The swatch button is a native `<button type="button">` that triggers a hidden `<input type="color">` via programmatic `.click()`. The native color picker is not visible — only the swatch button is.
220
233
  - Color synchronization: typing in the text field updates `modelValue` directly; selecting from the native picker emits the new hex value and also updates the text field.
221
- - The component does NOT validate hex format any string is accepted as-is and the swatch will display whatever color the browser interprets.
234
+ - The text field accepts any string, but the swatch only updates for valid hex codes or recognized CSS color names; unrecognized input leaves the swatch unchanged.
222
235
  - Source file: `framework/ui/components/molecules/vc-color-input/vc-color-input.vue`
223
236
 
224
237
  <!-- internal:end -->
@@ -23,7 +23,9 @@ A date and datetime picker that wraps the [VueDatePicker](https://vue3datepicker
23
23
 
24
24
  - Free-form text entry -- use [VcInput](../vc-input/)
25
25
  - Time-only input -- use `VcInput` with `type="time"`
26
- - Selecting multiple dates or date ranges -- currently not supported (use VueDatePicker directly)
26
+ - Selecting multiple discrete dates -- not supported (use VueDatePicker directly)
27
+
28
+ > **Note:** Date ranges are supported. Pass the `range` option through `datePickerOptions`; the component handles range start/end and commits a partial range on close.
27
29
 
28
30
  > **Note:** `VcInput` with `type="date"` or `type="datetime-local"` automatically delegates to this component internally. You can also use `VcDatePicker` directly for more explicit control over date-specific props.
29
31