@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
@@ -49,7 +49,7 @@ const tags = ref<Array<{ id?: string }>>([]);
49
49
 
50
50
  ### Free-form Text Entry
51
51
 
52
- In the default mode (`multivalue` is `false`), users type a value into the input and press **Enter** or **comma** to add it as a chip. This mode works with different input types.
52
+ In the default mode (`multivalue` is `false`), users type a value into the input and press **Enter** to add it as a chip. This mode works with different input types.
53
53
 
54
54
  ```vue
55
55
  <VcMultivalue v-model="tags" label="Keywords" placeholder="Type and press Enter" />
@@ -305,34 +305,44 @@ const selectedArray = ref([{ id: "1", title: "Option 1" }]);
305
305
 
306
306
  ## Slots
307
307
 
308
- | Slot | Scope | Description |
309
- | --------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------- |
310
- | `option` | `{ item: T, index: number }` | Custom rendering for dropdown options (dictionary mode) |
311
- | `selected-item` | `{ value: string \| number, item: T, index: number, remove: () => void }` | Custom rendering for selected value chips |
312
- | `prepend` | -- | Content rendered before the field area (inside the border) |
313
- | `append` | -- | Content rendered after the field area (inside the border) |
314
- | `error` | -- | Custom error message markup (replaces default VcHint) |
315
- | `hint` | -- | Custom hint markup (replaces default VcHint) |
308
+ | Slot | Scope | Description |
309
+ | --------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
310
+ | `option` | `{ item: T, index: number }` | Custom rendering for dropdown options (dictionary mode) |
311
+ | `selected-item` | `{ value: string \| number \| T[keyof T], item: T, index: number, remove: () => void }` | Custom rendering for selected value chips |
312
+ | `prepend` | -- | Content rendered before the field area (inside the border) |
313
+ | `append` | -- | Content rendered after the field area (inside the border) |
314
+ | `error` | -- | Custom error message markup (replaces default VcHint) |
315
+ | `hint` | -- | Custom hint markup (replaces default VcHint) |
316
316
 
317
317
  ## CSS Variables
318
318
 
319
319
  The component uses `--multivalue-*` variables that fall back to `--select-*` tokens for visual consistency with VcSelect.
320
320
 
321
- | Variable | Default | Description |
322
- | ------------------------------------ | ---------------------------------------------------------------------- | --------------------------------- |
323
- | `--multivalue-height` | `36px` | Minimum height of the input field |
324
- | `--multivalue-border-radius` | `var(--select-border-radius, 6px)` | Border radius |
325
- | `--multivalue-border-color` | `var(--select-border-color, var(--neutrals-300))` | Default border color |
326
- | `--multivalue-background-color` | `var(--select-background-color, transparent)` | Field background |
327
- | `--multivalue-text-color` | `var(--select-text-color, var(--neutrals-800))` | Field text color |
328
- | `--multivalue-chip-background-color` | `var(--select-multiple-options-background-color, var(--neutrals-100))` | Chip background |
329
- | `--multivalue-chip-border-color` | `var(--select-multiple-options-border-color, var(--neutrals-200))` | Chip border |
330
- | `--multivalue-border-color-focus` | `var(--select-border-color-focus, var(--primary-500))` | Border color on focus |
331
- | `--multivalue-focus-ring-color` | `var(--select-focus-ring-color, var(--primary-100))` | Focus ring color |
332
- | `--multivalue-border-color-error` | `var(--select-border-color-error, var(--danger-500))` | Border on error |
333
- | `--multivalue-error-ring-color` | `var(--select-error-ring-color, var(--danger-100))` | Error ring color |
334
- | `--multivalue-disabled-text-color` | `var(--neutrals-500)` | Disabled text color |
335
- | `--multivalue-loading-color` | `var(--select-loading-color, var(--info-500))` | Loading spinner color |
321
+ | Variable | Default | Description |
322
+ | ------------------------------------------ | ----------------------------------------------------------------------------------------------- | --------------------------------- |
323
+ | `--multivalue-height` | `36px` | Minimum height of the input field |
324
+ | `--multivalue-border-radius` | `var(--select-border-radius, 6px)` | Border radius |
325
+ | `--multivalue-border-color` | `var(--select-border-color, var(--neutrals-300))` | Default border color |
326
+ | `--multivalue-background-color` | `var(--select-background-color, transparent)` | Field background |
327
+ | `--multivalue-text-color` | `var(--select-text-color, var(--neutrals-800))` | Field text color |
328
+ | `--multivalue-placeholder-color` | `var(--select-placeholder-color, var(--neutrals-400))` | Placeholder text color |
329
+ | `--multivalue-padding` | `10px` | Field inner padding |
330
+ | `--multivalue-dropdown-bg` | `var(--select-dropdown-bg, var(--additional-50))` | Dropdown panel background |
331
+ | `--multivalue-dropdown-border` | `var(--select-dropdown-border, var(--neutrals-200))` | Dropdown panel border |
332
+ | `--multivalue-dropdown-shadow` | `var(--select-dropdown-shadow, 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1))` | Dropdown panel shadow |
333
+ | `--multivalue-search-border-color` | `var(--select-search-border-color, var(--neutrals-200))` | Search input border color |
334
+ | `--multivalue-item-hover-background-color` | `var(--select-option-background-color-hover, var(--neutrals-100))` | Option row hover background |
335
+ | `--multivalue-chip-background-color` | `var(--select-multiple-options-background-color, var(--neutrals-100))` | Chip background |
336
+ | `--multivalue-chip-border-color` | `var(--select-multiple-options-border-color, var(--neutrals-200))` | Chip border |
337
+ | `--multivalue-clear-icon-color` | `var(--select-clear-color, var(--neutrals-400))` | Clear icon color |
338
+ | `--multivalue-clear-icon-color-hover` | `var(--select-clear-color-hover, var(--neutrals-600))` | Clear icon hover color |
339
+ | `--multivalue-border-color-focus` | `var(--select-border-color-focus, var(--primary-500))` | Border color on focus |
340
+ | `--multivalue-focus-ring-color` | `var(--select-focus-ring-color, var(--primary-100))` | Focus ring color |
341
+ | `--multivalue-border-color-error` | `var(--select-border-color-error, var(--danger-500))` | Border on error |
342
+ | `--multivalue-error-ring-color` | `var(--select-error-ring-color, var(--danger-100))` | Error ring color |
343
+ | `--multivalue-hint-color` | `var(--danger-500)` | Hint/error message text color |
344
+ | `--multivalue-disabled-text-color` | `var(--neutrals-500)` | Disabled text color |
345
+ | `--multivalue-loading-color` | `var(--select-loading-color, var(--info-500))` | Loading spinner color |
336
346
 
337
347
  ## Accessibility
338
348
 
@@ -341,8 +351,7 @@ The component uses `--multivalue-*` variables that fall back to `--select-*` tok
341
351
  - Dropdown list has `role="listbox"` with a generated `id`
342
352
  - Chip remove buttons are individually focusable
343
353
  - Keyboard navigation:
344
- - **Enter** / **comma** -- submits the current input as a new value
345
- - **Backspace** -- removes the last chip when the input is empty
354
+ - **Enter** -- submits the current input as a new value (blur also submits, via `onInputSubmit`)
346
355
  - **Arrow keys** -- navigate items in the dropdown (dictionary mode)
347
356
  - **Escape** -- closes the dropdown
348
357
  - The `required` prop sets `aria-required` on the field
@@ -366,7 +375,7 @@ This behavior is powered by `BladeLoadingKey` via Vue's provide/inject. The comp
366
375
 
367
376
  - Composed of internal sub-components in `vc-multivalue/_internal/`: the chip list renderer, the dropdown panel, and the trigger input.
368
377
  - Composables are in `vc-multivalue/composables/` — chip management and dropdown open/close state are separated into composables.
369
- - Free-form mode: each `keydown` for Enter or comma (`','`) triggers a chip add; Backspace on empty input removes the last chip.
378
+ - Free-form mode: Enter (`@keypress.enter`) or blur triggers a chip add. Chip removal is done only via the chip's remove button.
370
379
  - Dictionary mode: already-selected items are filtered out of the dropdown list reactively.
371
380
  - Source file: `framework/ui/components/molecules/vc-multivalue/vc-multivalue.vue`
372
381
  - Internal components: `framework/ui/components/molecules/vc-multivalue/_internal/`
@@ -57,7 +57,7 @@ VcPagination displays a sliding window of page number buttons centered on the cu
57
57
  - **Desktop:** 5 visible page buttons (default)
58
58
  - **Mobile:** 3 visible page buttons (default)
59
59
 
60
- The component detects the viewport via the injected `IsMobileKey`. You can override the window size with the `maxPages` prop regardless of viewport.
60
+ The component detects the viewport via `useResponsive()` (`isMobile`). You can override the window size with the `maxPages` prop regardless of viewport.
61
61
 
62
62
  ```vue
63
63
  <!-- Always show exactly 3 page buttons -->
@@ -265,6 +265,7 @@ currentPage.value = Math.min(currentPage.value, totalPages.value);
265
265
  | `maxPages` | `number` | -- | Override visible page button count. Default: 3 on mobile, 5 on desktop |
266
266
  | `showFirstLast` | `boolean` | `true` | Show first/last page navigation buttons |
267
267
  | `variant` | `"default" \| "minimal"` | `"default"` | Visual style variant |
268
+ | `expanded` | `boolean` | -- | Declared but currently unused in the template |
268
269
 
269
270
  ## Events
270
271
 
@@ -287,6 +288,9 @@ currentPage.value = Math.min(currentPage.value, totalPages.value);
287
288
  | `--pagination-item-color-disabled` | `var(--neutrals-400)` | Disabled button text color |
288
289
  | `--pagination-item-background-color-disabled` | `var(--neutrals-100)` | Disabled button background |
289
290
  | `--pagination-item-border-color` | `var(--secondary-100)` | Default border color |
291
+ | `--pagination-item-border-color-hover` | `var(--neutrals-200)` | Hover border color |
292
+ | `--pagination-item-border-color-current` | `var(--neutrals-200)` | Current page border color |
293
+ | `--pagination-item-border-color-disabled` | `var(--neutrals-200)` | Disabled button border color |
290
294
  | `--pagination-focus-ring-color` | `var(--primary-100)` | Focus ring color for keyboard navigation |
291
295
 
292
296
  ## Accessibility
@@ -1,14 +1,12 @@
1
1
  ---
2
- title: VcDropdownPanel
2
+ title: VcPopover
3
3
  category: components
4
4
  group: navigation
5
5
  ---
6
6
 
7
- # VcDropdownPanel
7
+ # VcPopover
8
8
 
9
- Floating dropdown panel positioned relative to an anchor element, with header, scrollable content, and optional footer. Built on `@floating-ui/vue`.
10
-
11
- ::storybook id="overlay-vcdropdownpanel--default"
9
+ Anchored floating panel (popover) positioned relative to an anchor element, with header, scrollable content, and optional footer. Built on `@floating-ui/vue`.
12
10
 
13
11
  ## When to Use
14
12
 
@@ -27,7 +25,7 @@ Floating dropdown panel positioned relative to an anchor element, with header, s
27
25
  >
28
26
  Toggle Panel
29
27
  </button>
30
- <VcDropdownPanel
28
+ <VcPopover
31
29
  v-model:show="open"
32
30
  :anchor-ref="anchorEl"
33
31
  title="Filter Options"
@@ -35,12 +33,12 @@ Floating dropdown panel positioned relative to an anchor element, with header, s
35
33
  <div class="tw-p-4">
36
34
  <p>Panel content here</p>
37
35
  </div>
38
- </VcDropdownPanel>
36
+ </VcPopover>
39
37
  </template>
40
38
 
41
39
  <script setup lang="ts">
42
40
  import { ref } from "vue";
43
- import { VcDropdownPanel } from "@vc-shell/framework";
41
+ import { VcPopover } from "@vc-shell/framework";
44
42
 
45
43
  const anchorEl = ref<HTMLElement | null>(null);
46
44
  const open = ref(false);
@@ -78,12 +76,10 @@ const open = ref(false);
78
76
 
79
77
  ## Common Patterns
80
78
 
81
- ::storybook id="overlay-vcdropdownpanel--with-footer"
82
-
83
79
  ### Filter Panel with Footer Actions
84
80
 
85
81
  ```vue
86
- <VcDropdownPanel v-model:show="showFilters" :anchor-ref="filterButton" title="Filters">
82
+ <VcPopover v-model:show="showFilters" :anchor-ref="filterButton" title="Filters">
87
83
  <div class="tw-p-4 tw-flex tw-flex-col tw-gap-2">
88
84
  <VcCheckbox v-model="filters.active">Active only</VcCheckbox>
89
85
  <VcCheckbox v-model="filters.inStock">In stock</VcCheckbox>
@@ -93,13 +89,13 @@ const open = ref(false);
93
89
  <VcButton variant="secondary" @click="resetFilters">Reset</VcButton>
94
90
  <VcButton @click="applyFilters">Apply</VcButton>
95
91
  </template>
96
- </VcDropdownPanel>
92
+ </VcPopover>
97
93
  ```
98
94
 
99
95
  ### Custom Header
100
96
 
101
97
  ```vue
102
- <VcDropdownPanel v-model:show="open" :anchor-ref="anchor">
98
+ <VcPopover v-model:show="open" :anchor-ref="anchor">
103
99
  <template #header="{ close }">
104
100
  <div class="tw-flex tw-items-center tw-justify-between tw-w-full tw-px-4 tw-py-3">
105
101
  <span class="tw-font-semibold">Custom Header</span>
@@ -107,13 +103,13 @@ const open = ref(false);
107
103
  </div>
108
104
  </template>
109
105
  <div class="tw-p-4">Content here</div>
110
- </VcDropdownPanel>
106
+ </VcPopover>
111
107
  ```
112
108
 
113
109
  ### Scrollable List
114
110
 
115
111
  ```vue
116
- <VcDropdownPanel v-model:show="open" :anchor-ref="anchor" title="Long Content" :max-height="250">
112
+ <VcPopover v-model:show="open" :anchor-ref="anchor" title="Long Content" :max-height="250">
117
113
  <div class="tw-py-1">
118
114
  <div
119
115
  v-for="item in items"
@@ -123,22 +119,23 @@ const open = ref(false);
123
119
  {{ item.name }}
124
120
  </div>
125
121
  </div>
126
- </VcDropdownPanel>
122
+ </VcPopover>
127
123
  ```
128
124
 
129
125
  ## CSS Variables
130
126
 
131
- | Variable | Default | Description |
132
- | ------------------------------------ | ----------------------------- | ------------------------ |
133
- | `--dropdown-panel-bg` | `var(--additional-50)` | Panel background |
134
- | `--dropdown-panel-border-color` | `var(--neutrals-200)` | Border color |
135
- | `--dropdown-panel-border-radius` | `6px` | Corner radius |
136
- | `--dropdown-panel-shadow` | `0 4px 16px rgba(0,0,0,0.08)` | Box shadow |
137
- | `--dropdown-panel-z-index` | `10001` | Z-index |
138
- | `--dropdown-panel-title-color` | `var(--neutrals-900)` | Title text color |
139
- | `--dropdown-panel-close-color` | `var(--neutrals-400)` | Close button color |
140
- | `--dropdown-panel-close-hover-color` | `var(--neutrals-600)` | Close button hover color |
141
- | `--dropdown-panel-footer-bg` | `var(--neutrals-50)` | Footer background |
127
+ | Variable | Default | Description |
128
+ | -------------------------------- | ----------------------------- | ------------------------ |
129
+ | `--vc-popover-bg` | `var(--additional-50)` | Panel background |
130
+ | `--vc-popover-border-color` | `var(--neutrals-200)` | Border color |
131
+ | `--vc-popover-border-radius` | `6px` | Corner radius |
132
+ | `--vc-popover-shadow` | `0 4px 16px rgba(0,0,0,0.08)` | Box shadow |
133
+ | `--vc-popover-title-color` | `var(--neutrals-900)` | Title text color |
134
+ | `--vc-popover-close-color` | `var(--neutrals-400)` | Close button color |
135
+ | `--vc-popover-close-hover-color` | `var(--neutrals-600)` | Close button hover color |
136
+ | `--vc-popover-footer-bg` | `var(--neutrals-50)` | Footer background |
137
+
138
+ The panel's z-index comes from the global `--z-critical-floating-panel` token and is not overridable per-instance.
142
139
 
143
140
  ## Accessibility
144
141
 
@@ -66,15 +66,16 @@ const method = ref("standard");
66
66
 
67
67
  ## Key Props
68
68
 
69
- | Prop | Type | Default | Description |
70
- | ------------------------ | -------------------- | -------------- | --------------------------------------------------------------- |
71
- | `modelValue` | `T` | `undefined` | Bound value via `v-model` (shared across the group) |
72
- | `value` | `T` | -- | This radio button's value. Selected when `modelValue === value` |
73
- | `label` | `string` | -- | Text label next to the radio circle |
74
- | `name` | `string` | `"RadioField"` | HTML `name` attribute (must be shared within a group) |
75
- | `binary` | `boolean` | `false` | Enables boolean toggle mode (clicking toggles `true`/`false`) |
76
- | `disabled` | `boolean` | `false` | Disables this radio button |
77
- | `error` / `errorMessage` | `boolean` / `string` | -- | Error styling and message |
69
+ | Prop | Type | Default | Description |
70
+ | ------------------------ | -------------------- | -------------- | ------------------------------------------------------------------------------------------------- |
71
+ | `modelValue` | `T` | `undefined` | Bound value via `v-model` (shared across the group) |
72
+ | `value` | `T` | -- | This radio button's value. Selected when `modelValue === value` |
73
+ | `label` | `string` | -- | Text label next to the radio circle |
74
+ | `name` | `string` | `"RadioField"` | HTML `name` attribute (must be shared within a group) |
75
+ | `binary` | `boolean` | `false` | Enables boolean toggle mode (clicking toggles `true`/`false`) |
76
+ | `disabled` | `boolean` | `false` | Disables this radio button |
77
+ | `error` / `errorMessage` | `boolean` / `string` | -- | Error styling and message |
78
+ | `ariaLabel` | `string` | -- | Accessible name for the input when no visible `label` is set. Applied only when `label` is empty. |
78
79
 
79
80
  ## Common Patterns
80
81
 
@@ -642,36 +642,61 @@ Don't forget `:key` with cascading selects, otherwise the second select will ret
642
642
 
643
643
  ## Slots
644
644
 
645
- | Slot | Scope | Description |
646
- | -------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------ |
647
- | `option` | `{ index, opt, selected, toggleOption }` | Custom option rendering. **You must call `toggleOption(opt)` on click.** |
648
- | `selected-item` | `{ index, opt, selected, removeAtIndex }` | Custom rendering of selected chips (multiple) |
649
- | `control` | `{ toggleHandler, isOpened }` | Full trigger replacement |
650
- | `prepend` / `append` | — | Content outside the field |
651
- | `prepend-inner` / `append-inner` | — | Content inside the field |
652
- | `no-options` | — | Shown when there are no options |
653
- | `error` / `hint` | — | Custom rendering of error/hint |
645
+ | Slot | Scope | Description |
646
+ | -------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------ |
647
+ | `option` | `{ index, opt, selected, label, toggleOption }` | Custom option rendering. **You must call `toggleOption(opt)` on click.** |
648
+ | `selected-item` | `{ index, opt, selected, removeAtIndex }` | Custom rendering of selected chips (multiple) |
649
+ | `control` | `{ toggleHandler, isOpened }` | Full trigger replacement |
650
+ | `prepend` / `append` | — | Content outside the field |
651
+ | `prepend-inner` / `append-inner` | — | Content inside the field |
652
+ | `no-options` | — | Shown when there are no options |
653
+ | `error` / `hint` | — | Custom rendering of error/hint |
654
654
 
655
655
  ## CSS Variables
656
656
 
657
657
  ```css
658
658
  :root {
659
659
  --select-height: 36px;
660
- --select-height-small: 28px;
661
- --select-border-radius: 4px;
660
+ --select-height-small: 32px;
661
+ --select-border-radius: 6px;
662
662
  --select-border-color: var(--neutrals-300);
663
- --select-border-color-focus: var(--primary-100);
664
- --select-border-color-error: var(--danger-500);
665
663
  --select-text-color: var(--neutrals-800);
666
- --select-padding: 10px;
664
+ --select-padding: 12px;
665
+
667
666
  --select-background-color: var(--additional-50);
668
- --select-background-color-disabled: var(--neutrals-200);
667
+
669
668
  --select-placeholder-color: var(--neutrals-400);
670
- --select-chevron-color: var(--primary-500);
671
- --select-clear-color: var(--primary-500);
669
+
670
+ --select-chevron-color: var(--neutrals-500);
671
+ --select-chevron-color-hover: var(--neutrals-700);
672
+ --select-clear-color: var(--neutrals-400);
673
+ --select-clear-color-hover: var(--neutrals-600);
674
+
675
+ --select-loading-color: var(--info-500);
676
+
677
+ --select-option-background-color-hover: var(--neutrals-100);
678
+ --select-option-background-color-selected: var(--accent-100);
679
+ --select-option-check-color: var(--primary-500);
680
+
681
+ --select-multiple-options-background-color: var(--neutrals-100);
682
+ --select-multiple-options-border-color: var(--neutrals-200);
683
+
672
684
  --select-dropdown-bg: var(--additional-50);
673
- --select-option-background-color-hover: var(--accent-100);
674
- --select-option-background-color-selected: var(--accent-200);
685
+ --select-dropdown-border: var(--neutrals-200);
686
+ --select-dropdown-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
687
+
688
+ --select-search-border-color: var(--neutrals-200);
689
+ --select-search-background-color: var(--additional-50);
690
+ --select-border-color-input: var(--secondary-200);
691
+
692
+ --select-border-color-focus: var(--primary-500);
693
+ --select-focus-ring-color: var(--primary-100);
694
+
695
+ --select-background-color-disabled: var(--neutrals-200);
696
+ --select-disabled-text-color: var(--neutrals-500);
697
+
698
+ --select-border-color-error: var(--danger-500);
699
+ --select-error-ring-color: var(--danger-100);
675
700
  }
676
701
  ```
677
702
 
@@ -50,21 +50,21 @@ const products = [
50
50
 
51
51
  ## Key Props
52
52
 
53
- | Prop | Type | Default | Description |
54
- | -------------------- | ---------------------------------------- | -------------------- | ------------------------------------------------------- |
55
- | `slides` | `Record<string, unknown>[] \| unknown[]` | `[]` | Array of slide data objects |
56
- | `navigation` | `boolean` | `false` | Show previous/next navigation buttons |
57
- | `slidesPerView` | `string \| "auto"` | `"auto"` | Number of visible slides at once |
58
- | `spaceBetweenSlides` | `number` | `10` | Gap between slides in pixels |
59
- | `overflow` | `boolean` | `false` | Allow slides to be visible outside the container bounds |
60
- | `ariaLabel` | `string` | `"Content carousel"` | Accessible label for the slider region |
53
+ | Prop | Type | Default | Description |
54
+ | -------------------- | ---------------------------------------- | -------- | ------------------------------------------------------------------------------------- |
55
+ | `slides` | `Record<string, unknown>[] \| unknown[]` | `[]` | Array of slide data objects |
56
+ | `navigation` | `boolean` | `false` | Show previous/next navigation buttons |
57
+ | `slidesPerView` | `string \| "auto"` | `"auto"` | Number of visible slides at once |
58
+ | `spaceBetweenSlides` | `number` | `10` | Gap between slides in pixels |
59
+ | `overflow` | `boolean` | `false` | Allow slides to be visible outside the container bounds |
60
+ | `ariaLabel` | `string` | -- | Accessible label for the slider region. Falls back to `"Content carousel"` when unset |
61
61
 
62
62
  ## Common Patterns
63
63
 
64
64
  ### Fixed Slides Per View
65
65
 
66
66
  ```vue
67
- <VcSlider :slides="items" :slides-per-view="3" navigation :space-between-slides="20">
67
+ <VcSlider :slides="items" :slides-per-view="'3'" navigation :space-between-slides="20">
68
68
  <template #default="{ slide }">
69
69
  <ProductCard :product="slide" />
70
70
  </template>
@@ -96,7 +96,7 @@ const products = [
96
96
  ### Single Slide View
97
97
 
98
98
  ```vue
99
- <VcSlider :slides="banners" :slides-per-view="1" navigation>
99
+ <VcSlider :slides="banners" :slides-per-view="'1'" navigation>
100
100
  <template #default="{ slide }">
101
101
  <img :src="slide.imageUrl" class="tw-w-full tw-rounded" />
102
102
  </template>
@@ -140,7 +140,7 @@ When placed inside a `VcBlade` with `loading=true`, the component automatically
140
140
 
141
141
  - VcSlider wraps the `swiper/vue` `<Swiper>` / `<SwiperSlide>` components with the `Navigation` module. Navigation buttons are custom DOM elements (`.vc-slider__prev` / `.vc-slider__next`) referenced by Swiper's `navigation.prevEl` / `nextEl` selectors.
142
142
  - `overflow` prop toggles `overflow: visible` on the swiper container, allowing slides to bleed outside bounds — useful for "peek" effects.
143
- - `slidesPerView="auto"` (default) lets each slide size itself from content. Pass a number for fixed-count layouts.
143
+ - `slidesPerView="auto"` (default) lets each slide size itself from content. Pass a numeric string (e.g. `"3"`) for fixed-count layouts.
144
144
  - The `slides` prop accepts any array. Each item is exposed as `{ slide }` in the default scoped slot.
145
145
  - Source file: `framework/ui/components/molecules/vc-slider/vc-slider.vue`
146
146
 
@@ -240,20 +240,21 @@ const isActive = ref(true);
240
240
 
241
241
  ## Props
242
242
 
243
- | Prop | Type | Default | Description |
244
- | -------------- | ---------------------- | ------- | ---------------------------------------------------- |
245
- | `modelValue` | `boolean \| undefined` | -- | Bound value via `v-model` |
246
- | `label` | `string` | -- | Label text above the switch |
247
- | `hint` | `string` | -- | Helper text displayed below the switch |
248
- | `labelTooltip` | `string` | -- | Tooltip shown on the label info icon |
249
- | `tooltip` | `string` | -- | **Deprecated.** Use `hint` or `labelTooltip` instead |
250
- | `trueValue` | `boolean` | `true` | Value that represents the checked state |
251
- | `falseValue` | `boolean` | `false` | Value that represents the unchecked state |
252
- | `disabled` | `boolean` | `false` | Disables the switch |
253
- | `required` | `boolean` | `false` | Shows a required indicator on the label |
254
- | `error` | `boolean` | `false` | Enables error styling |
255
- | `errorMessage` | `string` | -- | Error message displayed below the switch |
256
- | `name` | `string` | -- | HTML name attribute for the hidden input |
243
+ | Prop | Type | Default | Description |
244
+ | -------------- | ---------------------- | ------- | -------------------------------------------------------------------------------------------------- |
245
+ | `modelValue` | `boolean \| undefined` | -- | Bound value via `v-model` |
246
+ | `label` | `string` | -- | Label text above the switch |
247
+ | `hint` | `string` | -- | Helper text displayed below the switch |
248
+ | `labelTooltip` | `string` | -- | Tooltip shown on the label info icon |
249
+ | `tooltip` | `string` | -- | **Deprecated.** Use `hint` or `labelTooltip` instead |
250
+ | `trueValue` | `boolean` | `true` | Value that represents the checked state |
251
+ | `falseValue` | `boolean` | `false` | Value that represents the unchecked state |
252
+ | `disabled` | `boolean` | `false` | Disables the switch |
253
+ | `required` | `boolean` | `false` | Shows a required indicator on the label |
254
+ | `error` | `boolean` | `false` | Enables error styling |
255
+ | `errorMessage` | `string` | -- | Error message displayed below the switch |
256
+ | `ariaLabel` | `string` | -- | Accessible name for the switch when no visible `label` is set. Applied only when `label` is empty. |
257
+ | `name` | `string` | -- | Field name used for validation/id generation (not rendered as an HTML name attribute on the input) |
257
258
 
258
259
  ## Events
259
260
 
@@ -236,21 +236,21 @@ const description = ref<string>("");
236
236
 
237
237
  ## Props
238
238
 
239
- | Prop | Type | Default | Description |
240
- | ----------------- | --------- | ----------- | ----------------------------------------------- |
241
- | `modelValue` | `string` | `undefined` | Bound value via `v-model` |
242
- | `label` | `string` | -- | Label text displayed above the textarea |
243
- | `placeholder` | `string` | -- | Placeholder text inside the empty textarea |
244
- | `hint` | `string` | -- | Helper text displayed below the field |
245
- | `tooltip` | `string` | -- | Tooltip on the label info icon |
246
- | `maxlength` | `string` | `"1024"` | Maximum character count (native HTML attribute) |
247
- | `required` | `boolean` | `false` | Shows a required indicator on the label |
248
- | `error` | `boolean` | `false` | Enables error styling (red border + ring) |
249
- | `errorMessage` | `string` | -- | Error message text below the field |
250
- | `disabled` | `boolean` | `false` | Disables the textarea |
251
- | `name` | `string` | `"Field"` | HTML name attribute |
252
- | `multilanguage` | `boolean` | `false` | Shows language badge on the label |
253
- | `currentLanguage` | `string` | -- | Language code displayed in the badge |
239
+ | Prop | Type | Default | Description |
240
+ | ----------------- | --------- | ----------- | ---------------------------------------------------------------------------------------------------- |
241
+ | `modelValue` | `string` | `undefined` | Bound value via `v-model` |
242
+ | `label` | `string` | -- | Label text displayed above the textarea |
243
+ | `placeholder` | `string` | -- | Placeholder text inside the empty textarea |
244
+ | `hint` | `string` | -- | Helper text displayed below the field |
245
+ | `tooltip` | `string` | -- | Tooltip on the label info icon |
246
+ | `maxlength` | `string` | `"1024"` | Maximum character count (native HTML attribute) |
247
+ | `required` | `boolean` | `false` | Shows a required indicator on the label |
248
+ | `error` | `boolean` | `false` | Enables error styling (red border + ring) |
249
+ | `errorMessage` | `string` | -- | Error message text below the field |
250
+ | `disabled` | `boolean` | `false` | Disables the textarea |
251
+ | `name` | `string` | `"Field"` | Field name used for validation/id generation (not applied as an HTML name attribute on the textarea) |
252
+ | `multilanguage` | `boolean` | `false` | Shows language badge on the label |
253
+ | `currentLanguage` | `string` | -- | Language code displayed in the badge |
254
254
 
255
255
  ## Events
256
256
 
@@ -148,7 +148,7 @@ Toasts use Sonner-style stacking: the newest toast is in front, older toasts sca
148
148
 
149
149
  On touch devices, horizontal swipe dismisses toasts (threshold: 45px or velocity > 0.11px/ms).
150
150
 
151
- The auto-dismiss timer (default 5000ms) pauses on hover. Set `timeout: false` for persistent toasts.
151
+ The auto-dismiss timer (default 3000ms) pauses on hover. Set `timeout: false` for persistent toasts.
152
152
 
153
153
  ```ts
154
154
  notification("Quick flash", { timeout: 1500 });
@@ -246,11 +246,11 @@ These props are used internally by the notification system. You rarely need to s
246
246
 
247
247
  | Prop | Type | Default | Description |
248
248
  | ---------------- | ------------------------------------------------ | -------------- | ------------------------------------------------------ |
249
- | `content` | `string \| Component` | -- | Notification message or custom component |
249
+ | `content` | `string \| VNode \| Component` | -- | Notification message or custom component |
250
250
  | `notificationId` | `number \| string` | -- | Unique identifier |
251
251
  | `updateId` | `number \| string` | -- | ID for update tracking |
252
252
  | `type` | `"default" \| "success" \| "error" \| "warning"` | `"default"` | Notification type (determines icon and accent color) |
253
- | `timeout` | `number \| boolean` | `5000` | Auto-dismiss delay in ms, or `false` to disable |
253
+ | `timeout` | `number \| boolean` | `3000` | Auto-dismiss delay in ms, or `false` to disable |
254
254
  | `pauseOnHover` | `boolean` | `true` | Pause timeout while mouse hovers over the toast |
255
255
  | `limit` | `number` | -- | Maximum number of visible notifications |
256
256
  | `position` | `NotificationPosition` | `"top-center"` | Screen position for the toast |
@@ -269,16 +269,18 @@ These props are used internally by the notification system. You rarely need to s
269
269
 
270
270
  ## Notification Service Methods
271
271
 
272
- | Method | Signature | Description |
273
- | ---------------------------- | ----------------------------------------------------------------------------------- | ------------------------------- |
274
- | `notification()` | `(message: string \| Component, options?: NotificationOptions) => string \| number` | Show a default notification |
275
- | `notification.success()` | `(message: string \| Component) => string \| number` | Show a success notification |
276
- | `notification.error()` | `(message: string \| Component) => string \| number` | Show an error notification |
277
- | `notification.warning()` | `(message: string \| Component) => string \| number` | Show a warning notification |
278
- | `notification.update()` | `(id, options: Partial<NotificationOptions>) => void` | Update an existing notification |
279
- | `notification.remove()` | `(id: string \| number) => void` | Remove a specific notification |
280
- | `notification.clearAll()` | `() => void` | Remove all notifications |
281
- | `notification.setPosition()` | `(position: NotificationPosition) => void` | Change the global position |
272
+ | Method | Signature | Description |
273
+ | ------------------------------ | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
274
+ | `notification()` | `(message: string \| VNode \| Component, options?: NotificationOptions) => string \| number` | Show a default notification |
275
+ | `notification.success()` | `(message: string \| VNode \| Component, options?: NotificationOptions) => string \| number` | Show a success notification |
276
+ | `notification.error()` | `(message: string \| VNode \| Component, options?: NotificationOptions) => string \| number` | Show an error notification |
277
+ | `notification.warning()` | `(message: string \| VNode \| Component, options?: NotificationOptions) => string \| number` | Show a warning notification |
278
+ | `notification.update()` | `(id: string \| number, options: NotificationOptions) => string \| number` | Update an existing notification; returns the id |
279
+ | `notification.remove()` | `(id?: string \| number) => void` | Remove a specific notification; omitting the id removes all (equivalent to `clearAll()`) |
280
+ | `notification.clearAll()` | `() => void` | Remove all notifications |
281
+ | `notification.clearPosition()` | `(position: NotificationPosition) => void` | Remove all notifications in one position |
282
+ | `notification.setPosition()` | `(position: NotificationPosition) => void` | Change the global position |
283
+ | `notification.debug()` | `() => { active; defaultOptions }` | Diagnostics helper: logs active toasts and default options, returns them |
282
284
 
283
285
  ## CSS Variables
284
286
 
@@ -89,6 +89,10 @@ VcApp orchestrates several internal systems:
89
89
 
90
90
  On desktop viewports, VcApp renders a collapsible sidebar on the left with navigation menu items, user info in the footer, and the blade workspace on the right. On mobile viewports, the sidebar is replaced by a top bar with a hamburger menu that opens a slide-over navigation panel.
91
91
 
92
+ ### Environment Indicator
93
+
94
+ VcApp renders a `VcEnvironmentBanner` when an environment name is detected via `useEnvironmentName()` (derived from the current hostname) and the environment is not ignored. The banner surfaces the environment name and color, making it obvious when you are working against a non-production instance.
95
+
92
96
  ### Sidebar Menu Search
93
97
 
94
98
  ::storybook id="layout-vcapp--with-sidebar-search" height="500"
@@ -140,7 +144,7 @@ If you use the `menu` slot to provide a custom menu, the `searchQuery` prop is p
140
144
 
141
145
  ### Dynamic Module Registration
142
146
 
143
- Modules registered via `useDynamicModules()` are loaded at runtime. Each module can contribute menu items, blades, toolbar actions, settings pages, and dashboard widgets. VcApp handles module loading errors gracefully by displaying notification toasts.
147
+ Modules are provided/consumed via the `DynamicModulesKey` injection (see `injection-keys.ts` and `useShellBootstrap`) and loaded at runtime. Each module can contribute menu items, blades, toolbar actions, settings pages, and dashboard widgets. VcApp handles module loading errors gracefully by displaying notification toasts.
144
148
 
145
149
  ### App Hub
146
150
 
@@ -77,6 +77,24 @@ The card is centered both vertically and horizontally. On narrow viewports, it s
77
77
 
78
78
  The layout uses a `<main>` element as the page landmark and an `<h2>` for the card title, providing a correct heading hierarchy for screen readers and SEO.
79
79
 
80
+ ### App Version Footer
81
+
82
+ When the active route sets `meta.appVersion`, VcAuthLayout renders that string below the card (in a `.vc-auth-layout__version` element). Set it via your Vue Router route meta; when absent, nothing is rendered.
83
+
84
+ ## CSS Custom Properties
85
+
86
+ | Variable | Default | Description |
87
+ | ------------------------------ | --------------------------------------------------------------- | ------------------------------ |
88
+ | `--auth-layout-bg` | `var(--neutrals-100)` | Page background |
89
+ | `--auth-layout-card-bg` | `var(--additional-50)` | Card background |
90
+ | `--auth-layout-card-border` | `var(--neutrals-200)` | Card border color |
91
+ | `--auth-layout-card-shadow` | `0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)` | Card shadow |
92
+ | `--auth-layout-card-radius` | `12px` | Card corner radius |
93
+ | `--auth-layout-card-max-width` | `420px` | Card / footer max width |
94
+ | `--auth-layout-title-color` | `var(--neutrals-900)` | Title text color |
95
+ | `--auth-layout-subtitle-color` | `var(--neutrals-400)` | Subtitle and footer text color |
96
+ | `--auth-layout-version-color` | `var(--neutrals-400)` | Version string text color |
97
+
80
98
  ## Recipe: Sign-In Page with SSO
81
99
 
82
100
  ```vue