@vc-shell/framework 2.1.0-pr254.42766e0 → 2.1.0-pr255.4dc5c0d

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 (160) hide show
  1. package/dist/ai-agent/index.js +11 -10
  2. package/dist/ai-agent/index.js.map +1 -1
  3. package/dist/charts/index.d.ts +2 -0
  4. package/dist/charts/index.d.ts.map +1 -0
  5. package/dist/charts/index.js +9 -0
  6. package/dist/charts/index.js.map +1 -0
  7. package/dist/chunks/DashboardDonutChart.vue_vue_type_script_setup_true_lang-hTcM33bM.js +446 -0
  8. package/dist/chunks/DashboardDonutChart.vue_vue_type_script_setup_true_lang-hTcM33bM.js.map +1 -0
  9. package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cx8_DCu_.js +1124 -0
  10. package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cx8_DCu_.js.map +1 -0
  11. package/dist/chunks/{VcAiAgentPanel.vue_vue_type_style_index_0_lang-D077_c8I.js → VcAiAgentPanel.vue_vue_type_style_index_0_lang-D2KmNhhl.js} +834 -1907
  12. package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-D2KmNhhl.js.map +1 -0
  13. package/dist/chunks/VcTableAdapter.vue_vue_type_script_setup_true_lang-BL653h9q.js +18282 -0
  14. package/dist/chunks/VcTableAdapter.vue_vue_type_script_setup_true_lang-BL653h9q.js.map +1 -0
  15. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-CtkZR5a1.js +4227 -0
  16. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-CtkZR5a1.js.map +1 -0
  17. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Cs-yidUE.js +641 -0
  18. package/dist/chunks/dashboard-feed-row.vue_vue_type_script_setup_true_lang-Cs-yidUE.js.map +1 -0
  19. package/dist/chunks/{index-DELXU1qy.js → index-CvSe3hjU.js} +11 -10
  20. package/dist/chunks/{index-DELXU1qy.js.map → index-CvSe3hjU.js.map} +1 -1
  21. package/dist/chunks/vendor-js-beautify-D-6mWVv0.js +1784 -0
  22. package/dist/chunks/vendor-js-beautify-D-6mWVv0.js.map +1 -0
  23. package/dist/chunks/{vendor-vueuse-core-CEdpDfzx.js → vendor-vueuse-core-BYWoPpF_.js} +5 -5
  24. package/dist/chunks/{vendor-vueuse-core-CEdpDfzx.js.map → vendor-vueuse-core-BYWoPpF_.js.map} +1 -1
  25. package/dist/core/blade-navigation/bladeConfigRegistry.d.ts +0 -11
  26. package/dist/core/blade-navigation/bladeConfigRegistry.d.ts.map +1 -1
  27. package/dist/core/blade-navigation/descriptorFactory.d.ts +2 -0
  28. package/dist/core/blade-navigation/descriptorFactory.d.ts.map +1 -0
  29. package/dist/core/blade-navigation/singletons.d.ts +0 -2
  30. package/dist/core/blade-navigation/singletons.d.ts.map +1 -1
  31. package/dist/core/blade-navigation/types/index.d.ts +12 -6
  32. package/dist/core/blade-navigation/types/index.d.ts.map +1 -1
  33. package/dist/core/blade-navigation/useBladeMessaging.d.ts +1 -17
  34. package/dist/core/blade-navigation/useBladeMessaging.d.ts.map +1 -1
  35. package/dist/core/blade-navigation/useBladeStack.d.ts +1 -18
  36. package/dist/core/blade-navigation/useBladeStack.d.ts.map +1 -1
  37. package/dist/core/composables/createServiceRegistry.d.ts +42 -0
  38. package/dist/core/composables/createServiceRegistry.d.ts.map +1 -0
  39. package/dist/core/composables/useBladeNavigationAdapter/index.d.ts +0 -5
  40. package/dist/core/composables/useBladeNavigationAdapter/index.d.ts.map +1 -1
  41. package/dist/core/composables/useDashboard/index.d.ts.map +1 -1
  42. package/dist/core/composables/useEnvironmentName/index.d.ts +0 -5
  43. package/dist/core/composables/useEnvironmentName/index.d.ts.map +1 -1
  44. package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
  45. package/dist/core/composables/usePopup/index.d.ts.map +1 -1
  46. package/dist/core/composables/usePopup/preset-registry.d.ts +0 -2
  47. package/dist/core/composables/usePopup/preset-registry.d.ts.map +1 -1
  48. package/dist/core/composables/usePopup/singleton.d.ts +0 -2
  49. package/dist/core/composables/usePopup/singleton.d.ts.map +1 -1
  50. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  51. package/dist/core/composables/useSettingsMenu/index.d.ts.map +1 -1
  52. package/dist/core/composables/useSlowNetworkDetection/index.d.ts +0 -2
  53. package/dist/core/composables/useSlowNetworkDetection/index.d.ts.map +1 -1
  54. package/dist/core/composables/useTheme/index.d.ts.map +1 -1
  55. package/dist/core/composables/useToolbar/index.d.ts.map +1 -1
  56. package/dist/core/composables/useUser/index.d.ts +0 -2
  57. package/dist/core/composables/useUser/index.d.ts.map +1 -1
  58. package/dist/core/interceptors/index.d.ts.map +1 -1
  59. package/dist/core/notifications/notification.d.ts.map +1 -1
  60. package/dist/core/plugins/ai-agent/constants.d.ts.map +1 -1
  61. package/dist/core/plugins/ai-agent/services/message-transport.d.ts.map +1 -1
  62. package/dist/core/plugins/ai-agent/types.d.ts +12 -1
  63. package/dist/core/plugins/ai-agent/types.d.ts.map +1 -1
  64. package/dist/core/plugins/permissions/index.d.ts.map +1 -1
  65. package/dist/core/plugins/validation/rules.d.ts.map +1 -1
  66. package/dist/core/services/_internal/createGenericItemRegistry.d.ts +35 -0
  67. package/dist/core/services/_internal/createGenericItemRegistry.d.ts.map +1 -0
  68. package/dist/core/services/_internal/index.d.ts +1 -0
  69. package/dist/core/services/_internal/index.d.ts.map +1 -1
  70. package/dist/core/services/app-bar-menu-service.d.ts.map +1 -1
  71. package/dist/core/services/app-bar-mobile-buttons-service.d.ts +2 -0
  72. package/dist/core/services/app-bar-mobile-buttons-service.d.ts.map +1 -1
  73. package/dist/core/services/settings-menu-service.d.ts.map +1 -1
  74. package/dist/core/utilities/backendRegistry.d.ts +38 -0
  75. package/dist/core/utilities/backendRegistry.d.ts.map +1 -0
  76. package/dist/core/utilities/index.d.ts +1 -0
  77. package/dist/core/utilities/index.d.ts.map +1 -1
  78. package/dist/dashboard/index.d.ts +3 -0
  79. package/dist/dashboard/index.d.ts.map +1 -0
  80. package/dist/dashboard/index.js +16 -0
  81. package/dist/dashboard/index.js.map +1 -0
  82. package/dist/framework.js +2149 -3060
  83. package/dist/framework.js.map +1 -1
  84. package/dist/index.css +2 -2
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/locales/de.js +91 -3
  88. package/dist/locales/en.js +91 -3
  89. package/dist/locales/en.json +91 -3
  90. package/dist/locales/types.d.ts +88 -0
  91. package/dist/shell/_internal/blade-navigation/components/vc-blade-slot/vc-blade-slot.vue.d.ts.map +1 -1
  92. package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts +33 -0
  93. package/dist/shell/_internal/notifications/components/notification-container/computeToastOffsets.d.ts.map +1 -0
  94. package/dist/shell/_internal/notifications/components/notification-container/index.d.ts.map +1 -1
  95. package/dist/shell/_internal/notifications/components/notification-container/useToastStack.d.ts +17 -0
  96. package/dist/shell/_internal/notifications/components/notification-container/useToastStack.d.ts.map +1 -0
  97. package/dist/shell/auth/LoginPage/components/login/Login.vue.d.ts.map +1 -1
  98. package/dist/shell/auth/utils.d.ts +6 -2
  99. package/dist/shell/auth/utils.d.ts.map +1 -1
  100. package/dist/tailwind.config.d.ts.map +1 -1
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
  103. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts +8 -0
  104. package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
  105. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
  106. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts +2 -0
  107. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  108. package/dist/ui/components/molecules/vc-color-input/vc-color-input.vue.d.ts.map +1 -1
  109. package/dist/ui/components/molecules/vc-dropdown/vc-dropdown.vue.d.ts +3 -0
  110. package/dist/ui/components/molecules/vc-dropdown/vc-dropdown.vue.d.ts.map +1 -1
  111. package/dist/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.vue.d.ts.map +1 -1
  112. package/dist/ui/components/molecules/vc-editor/_internal/vc-editor-custom-button.vue.d.ts.map +1 -1
  113. package/dist/ui/components/molecules/vc-editor/_internal/vc-editor-font-selector.vue.d.ts.map +1 -1
  114. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  115. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  116. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  117. package/dist/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue.d.ts.map +1 -1
  118. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts +2 -0
  119. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts.map +1 -1
  120. package/dist/ui/components/molecules/vc-switch/vc-switch.vue.d.ts +2 -0
  121. package/dist/ui/components/molecules/vc-switch/vc-switch.vue.d.ts.map +1 -1
  122. package/dist/ui/components/molecules/vc-toast/vc-toast.vue.d.ts.map +1 -1
  123. package/dist/ui/components/organisms/vc-app/_internal/app-bar/components/AppBarMobileActions.vue.d.ts.map +1 -1
  124. package/dist/ui/components/organisms/vc-app/_internal/layouts/DesktopLayout.vue.d.ts.map +1 -1
  125. package/dist/ui/components/organisms/vc-app/_internal/sidebar/SidebarHeader.vue.d.ts.map +1 -1
  126. package/dist/ui/components/organisms/vc-blade/_internal/BladeStatusBanners.vue.d.ts.map +1 -1
  127. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  128. package/dist/ui/components/organisms/vc-data-table/VcDataTable.vue.d.ts.map +1 -1
  129. package/dist/ui/components/organisms/vc-data-table/components/ColumnFilter.vue.d.ts.map +1 -1
  130. package/dist/ui/components/organisms/vc-data-table/components/DataTableBody.vue.d.ts.map +1 -1
  131. package/dist/ui/components/organisms/vc-data-table/components/DataTableCellRenderer.vue.d.ts.map +1 -1
  132. package/dist/ui/components/organisms/vc-data-table/components/DataTableHeader.vue.d.ts.map +1 -1
  133. package/dist/ui/components/organisms/vc-data-table/components/DataTableRow.vue.d.ts.map +1 -1
  134. package/dist/ui/components/organisms/vc-data-table/components/TableAddRowButton.vue.d.ts.map +1 -1
  135. package/dist/ui/components/organisms/vc-data-table/components/TableCheckbox.vue.d.ts +5 -1
  136. package/dist/ui/components/organisms/vc-data-table/components/TableCheckbox.vue.d.ts.map +1 -1
  137. package/dist/ui/components/organisms/vc-data-table/components/TableGroupRow.vue.d.ts.map +1 -1
  138. package/dist/ui/components/organisms/vc-data-table/components/TableRow.vue.d.ts.map +1 -1
  139. package/dist/ui/components/organisms/vc-data-table/components/TableRowActions.vue.d.ts.map +1 -1
  140. package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts +50 -0
  141. package/dist/ui/components/organisms/vc-data-table/composables/createTableSelectionFacade.d.ts.map +1 -0
  142. package/dist/ui/components/organisms/vc-data-table/composables/index.d.ts +2 -0
  143. package/dist/ui/components/organisms/vc-data-table/composables/index.d.ts.map +1 -1
  144. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts +0 -248
  145. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableOrchestrator.d.ts.map +1 -1
  146. package/dist/ui/components/organisms/vc-data-table/composables/useDataTableState.d.ts.map +1 -1
  147. package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts +3 -0
  148. package/dist/ui/components/organisms/vc-data-table/composables/useTableColumnsResize.d.ts.map +1 -1
  149. package/dist/ui/components/organisms/vc-data-table/vc-data-table.stories.helpers.d.ts +32 -0
  150. package/dist/ui/components/organisms/vc-data-table/vc-data-table.stories.helpers.d.ts.map +1 -0
  151. package/dist/ui/components/organisms/vc-gallery/_internal/vc-gallery-filmstrip/vc-gallery-filmstrip.vue.d.ts.map +1 -1
  152. package/dist/ui/index.js +142 -141
  153. package/dist/ui/index.js.map +1 -1
  154. package/package.json +19 -7
  155. package/tailwind.config.ts +0 -6
  156. package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-D077_c8I.js.map +0 -1
  157. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-BnbquDGw.js +0 -22319
  158. package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-BnbquDGw.js.map +0 -1
  159. package/dist/chunks/vendor-prettier-2Sf6a5jB.js +0 -5309
  160. package/dist/chunks/vendor-prettier-2Sf6a5jB.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VcTableAdapter.vue_vue_type_style_index_0_lang-CtkZR5a1.js","sources":["../../core/plugins/i18n/index.ts","../../core/utilities/generateId.ts","../../core/utilities/errorTypes.ts","../../core/utilities/error.ts","../../core/utilities/colorUtils.ts","../../core/utilities/backendRegistry.ts","../../core/composables/useUserManagement/index.ts","../../core/composables/usePermissions/index.ts","../../core/notifications/notification.ts","../../core/plugins/validation/rules.ts","../../core/services/_internal/createPreregistrationBus.ts","../../core/services/_internal/createBladeScopedRegistry.ts","../../core/services/_internal/createSimpleMapRegistry.ts","../../core/services/_internal/createGenericItemRegistry.ts","../../core/services/menu-service.ts","../../core/composables/createServiceRegistry.ts","../../core/composables/useMenuService/index.ts","../../core/composables/useResponsive/index.ts","../../core/composables/useAppInsights/index.ts","../../core/composables/useErrorHandler/index.ts","../../core/utilities/pendingErrorNotifications.ts","../../shell/components/error-interceptor/interceptor.ts","../../ui/components/atoms/vc-button/types.ts","../../ui/composables/useBladeLoading/index.ts","../../ui/components/atoms/vc-button/vc-button.vue","../../ui/composables/useFloatingPosition.ts","../../ui/components/molecules/vc-input-group/context.ts","../../ui/composables/useFormField.ts","../../ui/composables/useScrollArrows.ts","../../ui/composables/useTeleportTarget.ts","../../ui/components/atoms/vc-skeleton/vc-skeleton.vue","../../ui/components/atoms/vc-container/vc-container.vue","../../ui/components/atoms/vc-hint/vc-hint.vue","../../ui/components/atoms/vc-hint/index.ts","../../ui/components/atoms/vc-tooltip/vc-tooltip.vue","../../ui/components/atoms/vc-label/vc-label.vue","../../ui/components/atoms/vc-scrollable-container/vc-scrollable-container.vue","../../core/services/toolbar-service.ts","../../core/constants/index.ts","../../core/composables/useToolbar/index.ts","../../core/services/widget-service.ts","../../core/composables/useTheme/index.ts","../../core/services/dashboard-service.ts","../../core/composables/useDashboard/index.ts","../../core/services/app-bar-menu-service.ts","../../core/services/settings-menu-service.ts","../../core/composables/useSettingsMenu/index.ts","../../ui/components/molecules/vc-date-picker/vc-date-picker.vue","../../ui/components/molecules/vc-color-input/vc-color-input.vue","../../ui/components/molecules/vc-input/vc-input.vue","../../ui/components/molecules/vc-editor/_internal/extensions/font-size.ts","../../core/composables/useKeyboardNavigation/index.ts","../../ui/components/molecules/vc-select/composables/useSelectValueMapping.ts","../../ui/components/molecules/vc-select/composables/useSelectVisibility.ts","../../ui/components/molecules/vc-select/composables/useSelectDropdown.ts","../../ui/components/molecules/vc-select/composables/useSelectDataSource.ts","../../ui/components/molecules/vc-select/composables/useSelectSelection.ts","../../ui/components/molecules/vc-select/_internal/SelectTrigger.vue","../../ui/components/molecules/vc-select/_internal/SelectDropdown.vue","../../ui/components/molecules/vc-select/vc-select.vue","../../ui/components/molecules/vc-input-dropdown/vc-input-dropdown.vue","../../ui/components/molecules/vc-input-currency/vc-input-currency.vue","../../ui/components/organisms/vc-app/_internal/app-bar/composables/useAppBarState.ts","../../ui/components/organisms/vc-data-table/keys.ts","../../ui/components/organisms/vc-data-table/components/VcColumn.vue","../../ui/components/organisms/vc-data-table/composables/useCellRegistry.ts","../../ui/components/organisms/vc-data-table/components/_internal/SlotProxy.ts","../../core/directives/loading/index.ts"],"sourcesContent":["import { createI18n } from \"vue-i18n\";\r\n\r\nconst i18n = createI18n({\r\n legacy: false,\r\n globalInjection: true,\r\n locale: \"en\",\r\n fallbackLocale: \"en\",\r\n formatFallbackMessages: true,\r\n});\r\n\r\nexport { i18n };\r\n","export function generateId() {\r\n return Math.random().toString(36).substring(2, 9);\r\n}\r\n","/**\r\n * Base error class for VC-Shell framework\r\n * Provides structured error handling with error codes and context\r\n */\r\nexport class FrameworkError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly context?: Record<string, unknown>,\r\n ) {\r\n super(message);\r\n this.name = \"FrameworkError\";\r\n\r\n // Maintains proper stack trace for where our error was thrown (only available on V8)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, FrameworkError);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n message: this.message,\r\n context: this.context,\r\n stack: this.stack,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when validation fails\r\n */\r\nexport class ValidationError extends FrameworkError {\r\n constructor(message: string, context?: Record<string, unknown>) {\r\n super(message, \"VALIDATION_ERROR\", context);\r\n this.name = \"ValidationError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a service operation fails\r\n */\r\nexport class ServiceError extends FrameworkError {\r\n constructor(message: string, context?: Record<string, unknown>) {\r\n super(message, \"SERVICE_ERROR\", context);\r\n this.name = \"ServiceError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a required dependency is not provided\r\n */\r\nexport class InjectionError extends FrameworkError {\r\n constructor(serviceName: string, context?: Record<string, unknown>) {\r\n super(`${serviceName} not provided. Make sure to call the corresponding 'provide' function.`, \"INJECTION_ERROR\", {\r\n serviceName,\r\n ...context,\r\n });\r\n this.name = \"InjectionError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when component registration fails\r\n */\r\nexport class RegistrationError extends FrameworkError {\r\n constructor(componentName: string, reason: string, context?: Record<string, unknown>) {\r\n super(`Failed to register '${componentName}': ${reason}`, \"REGISTRATION_ERROR\", {\r\n componentName,\r\n ...context,\r\n });\r\n this.name = \"RegistrationError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when a blade operation fails\r\n */\r\nexport class BladeError extends FrameworkError {\r\n constructor(message: string, bladeId?: string, context?: Record<string, unknown>) {\r\n super(message, \"BLADE_ERROR\", {\r\n bladeId,\r\n ...context,\r\n });\r\n this.name = \"BladeError\";\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown when module loading fails\r\n */\r\nexport class ModuleLoadError extends FrameworkError {\r\n constructor(moduleId: string, reason: string, context?: Record<string, unknown>) {\r\n super(`Failed to load module '${moduleId}': ${reason}`, \"MODULE_LOAD_ERROR\", {\r\n moduleId,\r\n ...context,\r\n });\r\n this.name = \"ModuleLoadError\";\r\n }\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is a FrameworkError\r\n */\r\nexport function isFrameworkError(error: unknown): error is FrameworkError {\r\n return error instanceof FrameworkError;\r\n}\r\n\r\n/**\r\n * Wraps an unknown error into a FrameworkError\r\n */\r\nexport function wrapError(error: unknown, code = \"UNKNOWN_ERROR\"): FrameworkError {\r\n if (isFrameworkError(error)) {\r\n return error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return new FrameworkError(error.message, code, {\r\n originalError: error.name,\r\n stack: error.stack,\r\n });\r\n }\r\n\r\n return new FrameworkError(String(error), code);\r\n}\r\n","// A custom error class to normalize different error types for display.\nexport class DisplayableError extends Error {\n details: string;\n originalError: unknown;\n\n constructor(shortMessage: string, details: string, originalError: unknown) {\n super(shortMessage);\n this.name = \"DisplayableError\";\n this.details = details;\n this.originalError = originalError;\n }\n}\n// TODO: add to docs?\n/**\n * Parses an unknown error type into a standardized DisplayableError.\n * This function handles nested errors, API responses, and various error formats.\n * @param errorToParse The error to analyze.\n * @returns A DisplayableError instance.\n */\nexport function parseError(errorToParse: unknown): DisplayableError {\n if (errorToParse instanceof DisplayableError) {\n return errorToParse;\n }\n\n // Handle Axios-style errors, which are instances of Error but have a `response` property.\n if (errorToParse instanceof Error && \"response\" in errorToParse && errorToParse.response) {\n // Delegate to parse the nested response object.\n return parseError(errorToParse.response);\n }\n\n // Handle standard Error objects.\n if (errorToParse instanceof Error) {\n return new DisplayableError(errorToParse.message, errorToParse.stack || String(errorToParse), errorToParse);\n }\n\n // Handle strings, which might be JSON.\n if (typeof errorToParse === \"string\") {\n try {\n const parsed = JSON.parse(errorToParse);\n return parseError(parsed);\n } catch {\n // Not a JSON string, treat as a plain message.\n return new DisplayableError(errorToParse, errorToParse, errorToParse);\n }\n }\n\n // Handle plain objects, which are likely API responses.\n if (typeof errorToParse === \"object\" && errorToParse !== null) {\n const errorObject = errorToParse as Record<string, any>;\n\n // Check if it conforms to the expected API error response structure.\n if (\"status\" in errorObject && \"data\" in errorObject) {\n const status = errorObject.status;\n const statusText = errorObject.statusText || \"Error\"; // TODO: i18n\n const shortMessage = `${status}: ${statusText}`;\n\n const data = errorObject.data;\n let details = \"\";\n\n if (data) {\n if (typeof data.exceptionMessage === \"string\") {\n details = data.exceptionMessage;\n } else if (typeof data.message === \"string\") {\n details = data.message;\n } else if (Array.isArray(data.errors)) {\n details = data.errors.join(\"\\n\");\n } else if (typeof data === \"string\") {\n details = data;\n } else {\n details = JSON.stringify(data, null, 2);\n }\n } else {\n // Fallback if data is null/undefined.\n details = JSON.stringify(errorObject, null, 2);\n }\n\n return new DisplayableError(shortMessage, details, errorToParse);\n }\n\n // Fallback for other object structures.\n const shortMessage = (errorObject.message as string) || \"An unexpected error occurred.\";\n const details = (errorObject.stack as string) || JSON.stringify(errorObject, null, 2);\n return new DisplayableError(shortMessage, details, errorToParse);\n }\n\n // Fallback for any other type (null, number, etc.).\n return new DisplayableError(\"An unknown error occurred.\", String(errorToParse), errorToParse);\n}\n","import { createLogger } from \"@core/utilities/logger\";\n\nconst logger = createLogger(\"color-utils\");\n\n/**\n * Convert CSS color name to hex code using Canvas API\n * @param colorName - CSS color name (e.g., \"red\", \"blue\", \"lime\")\n * @returns Hex code or null if not found\n */\nexport function convertColorNameToHex(colorName: string): string | null {\n if (!colorName || typeof colorName !== \"string\") {\n return null;\n }\n\n try {\n // Create temporary canvas to use browser's color parsing\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) return null;\n\n // Try to set the color\n ctx.fillStyle = colorName.trim();\n\n // If browser doesn't recognize it, fillStyle stays as default\n if (ctx.fillStyle === \"#000000\" && colorName.trim().toLowerCase() !== \"black\") {\n return null;\n }\n\n return ctx.fillStyle; // Returns hex format\n } catch (error) {\n logger.warn(\"Error converting color name to hex:\", error);\n return null;\n }\n}\n\n/**\n * Check if a string is a valid hex color\n * @param value - String to check\n * @returns True if valid hex color\n */\nexport function isValidHexColor(value: string): boolean {\n if (!value || typeof value !== \"string\") {\n return false;\n }\n\n const normalizedValue = value.startsWith(\"#\") ? value : `#${value}`;\n return /^#[0-9A-Fa-f]{6}$/.test(normalizedValue);\n}\n\n/**\n * Normalize hex color format (ensure it starts with #)\n * @param hex - Hex color code\n * @returns Normalized hex color\n */\nexport function normalizeHexColor(hex: string): string {\n if (!hex || typeof hex !== \"string\") {\n return \"\";\n }\n\n return hex.startsWith(\"#\") ? hex : `#${hex}`;\n}\n","/**\n * Backend registry primitive.\n *\n * Core modules define an interface and call `get()` lazily; the shell registers\n * the concrete implementation during plugin install. This is the \"core defines\n * the interface, shell provides the backend\" seam used by notifications and\n * popup. Keeps the registration wiring in one typed place instead of a\n * hand-rolled module-scoped `let` per consumer.\n */\n\nexport interface BackendRegistry<T> {\n /** Register (or replace) the backend implementation. */\n register(impl: T): void;\n /** Current backend, or `null` when none has been registered yet. */\n get(): T | null;\n /** Clear the backend. Primarily for test teardown. */\n reset(): void;\n}\n\n/**\n * Single-slot registry: one backend implementation at a time.\n *\n * @param onChange optional hook fired whenever the backend is set or reset;\n * lets a consumer keep a live ESM binding in sync with the registry.\n */\nexport function createBackendRegistry<T>(onChange?: (impl: T | null) => void): BackendRegistry<T> {\n let impl: T | null = null;\n\n return {\n register(next: T): void {\n impl = next;\n onChange?.(impl);\n },\n get(): T | null {\n return impl;\n },\n reset(): void {\n impl = null;\n onChange?.(impl);\n },\n };\n}\n\nexport interface KeyedBackendRegistry<K, V> {\n /** Register (or replace) the implementation for a key. */\n register(key: K, value: V): void;\n /** Implementation for a key, or `undefined` when unregistered. */\n get(key: K): V | undefined;\n /** Clear all registered implementations. Primarily for test teardown. */\n reset(): void;\n}\n\n/**\n * Keyed registry: several implementations addressed by a key (e.g. popup\n * presets). Backed by a `Map`.\n */\nexport function createKeyedBackendRegistry<K, V>(): KeyedBackendRegistry<K, V> {\n const store = new Map<K, V>();\n\n return {\n register(key: K, value: V): void {\n store.set(key, value);\n },\n get(key: K): V | undefined {\n return store.get(key);\n },\n reset(): void {\n store.clear();\n },\n };\n}\n","import { ComputedRef } from \"vue\";\nimport { _sharedInternalUserLogic } from \"@core/composables/useUser\";\nimport { SecurityResult, IdentityResult, LoginType, UserDetail, SignInResult } from \"@core/api/platform\";\nimport type { RequestPasswordResult } from \"@core/types\";\n\n// Interface for the API exposed by useUserManagement (for framework/admin use)\nexport interface UseUserManagementReturn {\n user: ComputedRef<UserDetail | undefined>;\n loading: ComputedRef<boolean>;\n isAdministrator: ComputedRef<boolean | undefined>;\n isAuthenticated: ComputedRef<boolean>;\n // Methods specific to user management\n validateToken: (userId: string, token: string) => Promise<boolean>;\n validatePassword: (password: string) => Promise<IdentityResult>;\n resetPasswordByToken: (userId: string, password: string, token: string) => Promise<SecurityResult>;\n getLoginType: () => Promise<LoginType[]>;\n loadUser: () => Promise<UserDetail>;\n requestPasswordReset: (loginOrEmail: string) => Promise<RequestPasswordResult>;\n changeUserPassword: (oldPassword: string, newPassword: string) => Promise<SecurityResult | undefined>;\n\n signIn: (username: string, password: string) => Promise<SignInResult | { succeeded: boolean; error?: any }>;\n signOut: () => Promise<void>;\n}\n\n/** @deprecated Use UseUserManagementReturn instead */\nexport type IUserManagementAPI = UseUserManagementReturn;\n\nexport const useUserManagement = (): UseUserManagementReturn => {\n const internals = _sharedInternalUserLogic();\n return {\n user: internals.user,\n loading: internals.loading,\n isAdministrator: internals.isAdministrator,\n isAuthenticated: internals.isAuthenticated,\n validateToken: internals.validateToken,\n validatePassword: internals.validatePassword,\n resetPasswordByToken: internals.resetPasswordByToken,\n getLoginType: internals.getLoginType,\n loadUser: internals.loadUser,\n requestPasswordReset: internals.requestPasswordReset,\n changeUserPassword: internals.changeUserPassword,\n signIn: internals.signIn,\n signOut: internals.signOut,\n };\n};\n","import { useUserManagement } from \"@core/composables/useUserManagement\";\n\nexport interface UsePermissionsReturn {\n hasAccess(permissions: string | string[] | undefined): boolean;\n}\n\n/** @deprecated Use UsePermissionsReturn instead */\nexport type IUsePermissions = UsePermissionsReturn;\n\nexport function usePermissions(): UsePermissionsReturn {\n const { user } = useUserManagement();\n\n function hasAccess(permissions: string | string[] | undefined) {\n const userPermissions = user.value?.permissions ?? [];\n\n if (!permissions || (Array.isArray(permissions) && permissions.length === 0) || user.value?.isAdministrator) {\n return true;\n } else if (Array.isArray(permissions)) {\n return permissions.some((permission) => userPermissions.includes(permission));\n } else if (typeof permissions === \"string\") {\n return userPermissions.includes(permissions);\n } else {\n throw new Error(\"Permissions must be a string or an array of strings\");\n }\n }\n\n return {\n hasAccess,\n };\n}\n","import { mergeProps } from \"vue\";\nimport { Content, NotificationOptions, NotificationPosition } from \"@core/notifications/toast-types\";\nimport { generateId, createLogger, createBackendRegistry } from \"@core/utilities\";\n\nconst logger = createLogger(\"notification\");\n\n// ── Container backend (set by shell during plugin install) ───────────────────\n\ninterface NotificationBackend {\n defaultOptions: NotificationOptions;\n actions: {\n add(options: NotificationOptions): void;\n remove(id: string | number): void;\n clear(): void;\n dismiss(notificationId: string | number): void;\n update(option: NotificationOptions): void;\n setPosition(position: NotificationPosition): void;\n };\n getAllNotifications(): NotificationOptions[];\n appendInstance(options: NotificationOptions): void;\n getNotification(notificationId: string | number): NotificationOptions | undefined;\n hasNotification(notificationId: string | number): boolean;\n}\n\nconst backendRegistry = createBackendRegistry<NotificationBackend>();\n\n/**\n * Shell registers the notification backend during plugin install.\n */\nexport function setNotificationBackend(backend: NotificationBackend): void {\n backendRegistry.register(backend);\n}\n\n// ── Public API ───────────────────────────────────────────────────────────────\n\nfunction showNotification(content: Content, options: NotificationOptions) {\n const _backend = backendRegistry.get();\n if (!_backend) {\n logger.debug(\"Backend not yet registered — notification call ignored.\");\n return undefined;\n }\n\n options = mergeProps(\n _backend.defaultOptions as Record<string, unknown>,\n options as Record<string, unknown>,\n ) as NotificationOptions;\n\n if (\n !options.notificationId ||\n (typeof options.notificationId !== \"string\" && typeof options.notificationId !== \"number\")\n ) {\n options.notificationId = generateId();\n }\n\n options = {\n ...options,\n content,\n };\n\n _backend.appendInstance(options);\n return options.notificationId;\n}\n\nconst notification = (content: Content, options?: NotificationOptions) =>\n showNotification(content, { ...options, type: \"default\" });\n\nnotification.error = (content: Content, options?: NotificationOptions) =>\n showNotification(content, { ...options, type: \"error\" });\n\nnotification.warning = (content: Content, options?: NotificationOptions) =>\n showNotification(content, { ...options, type: \"warning\" });\n\nnotification.success = (content: Content, options?: NotificationOptions) =>\n showNotification(content, { ...options, type: \"success\" });\n\nnotification.clearAll = () => {\n backendRegistry.get()?.actions.clear();\n};\n\nnotification.remove = (notificationId?: number | string) => {\n const _backend = backendRegistry.get();\n if (!_backend) return;\n if (notificationId) {\n _backend.actions.dismiss(notificationId);\n } else {\n _backend.actions.clear();\n }\n};\n\nnotification.update = (notificationId: string | number, options: NotificationOptions) => {\n const _backend = backendRegistry.get();\n if (!_backend) return notificationId;\n\n if (!_backend.hasNotification(notificationId)) {\n logger.warn(`Cannot update: notification with ID ${notificationId} not found`);\n return notificationId;\n }\n\n const item = _backend.getNotification(String(notificationId));\n\n if (item) {\n if (options.position && options.position !== item.position) {\n const updatedOptions: NotificationOptions = {\n ...item,\n ...options,\n updateId: generateId(),\n notificationId: notificationId,\n };\n\n let contentToUse: Content | undefined;\n\n if (options.content !== undefined) {\n contentToUse = options.content;\n delete updatedOptions.content;\n } else if (item.content) {\n contentToUse = item.content;\n delete updatedOptions.content;\n }\n\n if (contentToUse) {\n _backend.actions.remove(notificationId);\n return showNotification(contentToUse, updatedOptions);\n }\n } else {\n const updateOptions = {\n ...options,\n updateId: generateId(),\n notificationId: notificationId,\n };\n\n _backend.actions.update(updateOptions);\n return notificationId;\n }\n }\n\n return notificationId;\n};\n\nnotification.setPosition = (position: NotificationPosition) => {\n const _backend = backendRegistry.get();\n if (_backend) _backend.defaultOptions.position = position;\n};\n\nnotification.clearPosition = (position: NotificationPosition) => {\n const _backend = backendRegistry.get();\n if (!_backend) return;\n\n const notificationsInPosition = _backend\n .getAllNotifications()\n .filter((item) => (item.position || _backend!.defaultOptions.position) === position);\n\n notificationsInPosition.forEach((item) => {\n if (item.notificationId) {\n _backend!.actions.dismiss(item.notificationId);\n }\n });\n};\n\nnotification.debug = () => {\n const _backend = backendRegistry.get();\n if (!_backend) {\n logger.debug(\"Backend not registered\");\n return { active: [], defaultOptions: {} };\n }\n\n Object.entries(_backend.defaultOptions).forEach(([key, value]) => {\n logger.debug(`Default option ${key}: `, value);\n });\n\n Object.entries(_backend.actions).forEach(([key]) => {\n logger.debug(`Available action: ${key}`);\n });\n\n const groupedNotifications = _backend.getAllNotifications().reduce<\n Record<\n string,\n Array<{\n id: string | number;\n type?: string;\n content: string;\n }>\n >\n >((acc, item) => {\n const position = (item.position as string) || (_backend!.defaultOptions.position as string);\n\n if (!acc[position]) {\n acc[position] = [];\n }\n\n acc[position].push({\n id: item.notificationId || \"unknown\",\n type: item.type,\n content: typeof item.content === \"string\" ? item.content : \"[Component]\",\n });\n\n return acc;\n }, {});\n\n Object.entries(groupedNotifications).forEach(([position, items]) => {\n logger.debug(`Position ${position}: ${items.length} notifications`);\n items.forEach((item) => logger.debug(` - ${item.id} (${item.type}): ${item.content}`));\n });\n\n return {\n active: _backend.getAllNotifications(),\n defaultOptions: _backend.defaultOptions,\n };\n};\n\nexport { notification };\n","import { i18n } from \"@core/plugins/i18n\";\nimport { defineRule } from \"vee-validate\";\nimport { all } from \"@vee-validate/rules\";\n\nObject.keys(all).forEach((rule: string) => {\n defineRule(rule, (all as Record<string, any>)[rule]);\n});\n\n/**\n * Check if an image dimension larger than a given size.\n */\nexport const mindimensions = (images: HTMLInputElement, [width, height]: [string | number, string | number]) => {\n // The field is empty so it should pass\n if (!images?.files || !images.files?.length) {\n return true;\n }\n\n const validateImage = (file: File, width: string | number, height: string | number) => {\n const URL = window.URL || window.webkitURL;\n return new Promise((resolve) => {\n const image = new Image();\n const objectUrl = URL.createObjectURL(file);\n // Always release the object URL once the image settles, or it leaks for\n // the lifetime of the document (one per validated file).\n image.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve(false);\n };\n image.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const isValid = image.width >= Number(width) && image.height >= Number(height);\n if (isValid) {\n resolve(true);\n } else {\n resolve(i18n.global.t(\"messages.min_dimensions.error\", { width, height }));\n }\n };\n\n image.src = objectUrl;\n });\n };\n const list = [];\n const fileList = images.files;\n for (let i = 0; i < fileList.length; i++) {\n if (!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(fileList[i].name)) {\n return Promise.resolve(i18n.global.t(\"messages.min_dimensions.not_image_error\"));\n }\n\n list.push(fileList[i]);\n }\n return Promise.all(list.map((file) => validateImage(file, width, height))).then((res) => {\n const isInvalid = res.find((x) => x !== true);\n if (isInvalid === false || typeof isInvalid === \"string\") {\n return isInvalid;\n } else {\n return true;\n }\n });\n};\n\ndefineRule(\"mindimensions\", mindimensions);\n\n/**\n * Check if image not exceeding a given size in kilobytes\n */\nexport const fileWeight = (file: HTMLInputElement, [size]: [number]) => {\n if (!file?.files || !file.files?.length) {\n return true;\n }\n\n const maxSize = size * 1000;\n\n const fileSizeChecker = (file: File) => {\n return file.size > maxSize;\n };\n\n const list = [];\n for (let i = 0; i < file.files.length; i++) {\n list.push(file.files[i]);\n }\n\n const checker = list.map((x) => fileSizeChecker(x));\n\n const isInvalid = checker.find((x) => x === true);\n if (isInvalid) {\n return i18n.global.t(\"messages.file_weight\", { size });\n } else {\n return true;\n }\n};\n\ndefineRule(\"fileWeight\", fileWeight);\n\nconst compare = (\n value: string | Date,\n [target]: string[] | Date[],\n comparer: (first: number, second: number) => boolean,\n errorMessage: string,\n): boolean | string => {\n // The field is empty so it should pass\n if (!value || (typeof value == \"string\" && !value.length)) {\n return true;\n }\n\n let first_date;\n let second_date;\n if (value instanceof Date) {\n first_date = value;\n }\n\n if (target instanceof Date) {\n second_date = target;\n }\n\n if (typeof value === \"string\") {\n first_date = new Date(value);\n }\n\n if (typeof target === \"string\") {\n second_date = new Date(target);\n }\n\n if (first_date?.getTime && first_date?.getTime() > 0 && second_date?.getTime && second_date?.getTime() > 0) {\n if (comparer(second_date.getTime(), first_date.getTime())) {\n return errorMessage;\n }\n }\n\n return true;\n};\n\n// before\nexport const before = (value: string, [target]: string[]) =>\n compare(value, [target], (first, second) => first < second, i18n.global.t(\"messages.before\"));\ndefineRule(\"before\", before);\n\n// after\nexport const after = (value: string, [target]: string[]) =>\n compare(value, [target], (first, second) => first > second, i18n.global.t(\"messages.after\"));\n\ndefineRule(\"after\", after);\n\nexport const bigInt = (value: string) => {\n if (Number.isSafeInteger(parseInt(value))) {\n return true;\n } else {\n return i18n.global.t(\"messages.bigint\");\n }\n};\n\ndefineRule(\"bigint\", bigInt);\n","import { createLogger } from \"@core/utilities\";\r\n\r\nexport interface PreregistrationBusOptions<TItem, TService> {\r\n name: string;\r\n getKey: (item: TItem) => string;\r\n registerIntoService: (service: TService, item: TItem) => void;\r\n unregisterFromService?: (service: TService, id: string) => void;\r\n}\r\n\r\nexport interface PreregistrationBus<TItem, TService> {\r\n preregister(item: TItem): void;\r\n unregister(id: string): void;\r\n removePreregistered(predicate: (item: TItem) => boolean): void;\r\n getPreregistered(): TItem[];\r\n replayInto(service: TService): void;\r\n dispose(service: TService): void;\r\n broadcast(cb: (service: TService) => void): void;\r\n getFirstInstance(): TService | undefined;\r\n readonly instanceCount: number;\r\n}\r\n\r\nexport function createPreregistrationBus<TItem, TService>(\r\n options: PreregistrationBusOptions<TItem, TService>,\r\n): PreregistrationBus<TItem, TService> {\r\n const logger = createLogger(`${options.name}-bus`);\r\n const store = new Map<string, TItem>();\r\n const instances = new Set<TService>();\r\n\r\n function preregister(item: TItem): void {\r\n const key = options.getKey(item);\r\n store.set(key, item);\r\n\r\n if (instances.size > 0) {\r\n broadcast((service) => {\r\n try {\r\n options.registerIntoService(service, item);\r\n } catch (e) {\r\n logger.warn(`Failed to live-register item (key=${key}):`, e);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function unregister(id: string): void {\r\n store.delete(id);\r\n\r\n if (options.unregisterFromService && instances.size > 0) {\r\n instances.forEach((service) => {\r\n try {\r\n options.unregisterFromService!(service, id);\r\n } catch (e) {\r\n logger.warn(`Failed to live-unregister item (id=${id}):`, e);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function removePreregistered(predicate: (item: TItem) => boolean): void {\r\n for (const [key, item] of store) {\r\n if (predicate(item)) {\r\n store.delete(key);\r\n }\r\n }\r\n }\r\n\r\n function getPreregistered(): TItem[] {\r\n return Array.from(store.values());\r\n }\r\n\r\n function replayInto(service: TService): void {\r\n instances.add(service);\r\n store.forEach((item, key) => {\r\n try {\r\n options.registerIntoService(service, item);\r\n } catch (e) {\r\n logger.warn(`Failed to replay item (key=${key}):`, e);\r\n }\r\n });\r\n }\r\n\r\n function dispose(service: TService): void {\r\n instances.delete(service);\r\n }\r\n\r\n function broadcast(cb: (service: TService) => void): void {\r\n instances.forEach((service) => cb(service));\r\n }\r\n\r\n function getFirstInstance(): TService | undefined {\r\n return instances.values().next().value;\r\n }\r\n\r\n return {\r\n preregister,\r\n unregister,\r\n removePreregistered,\r\n getPreregistered,\r\n replayInto,\r\n dispose,\r\n broadcast,\r\n getFirstInstance,\r\n get instanceCount() {\r\n return instances.size;\r\n },\r\n };\r\n}\r\n","import { reactive } from \"vue\";\r\n\r\nexport interface BladeScopedRegistryOptions<TItem extends { id: string }, TRegistration> {\r\n createRegistration: (bladeId: string, item: TItem) => TRegistration;\r\n getRegistrationBladeId: (registration: TRegistration) => string;\r\n getRegistrationItemId: (registration: TRegistration) => string;\r\n}\r\n\r\nexport interface BladeScopedRegistry<TItem extends { id: string }, TRegistration> {\r\n readonly registry: Record<string, TItem[]>;\r\n readonly registrations: TRegistration[];\r\n register(item: TItem, bladeId: string): void;\r\n unregister(itemId: string, bladeId: string): void;\r\n get(bladeId: string): TItem[];\r\n clear(bladeId: string): void;\r\n update(id: string, bladeId: string, partial: Partial<TItem>): void;\r\n isRegistered(id: string): boolean;\r\n}\r\n\r\nexport function createBladeScopedRegistry<TItem extends { id: string }, TRegistration>(\r\n options: BladeScopedRegistryOptions<TItem, TRegistration>,\r\n): BladeScopedRegistry<TItem, TRegistration> {\r\n const registry = reactive<Record<string, TItem[]>>({});\r\n // Cast needed: reactive() unwraps refs in generics, but our TRegistration types are plain objects\r\n const registrations = reactive([]) as TRegistration[];\r\n const registrationCountById = reactive(new Map<string, number>());\r\n\r\n function incrementCount(id: string): void {\r\n registrationCountById.set(id, (registrationCountById.get(id) ?? 0) + 1);\r\n }\r\n\r\n function decrementCount(id: string): void {\r\n const count = registrationCountById.get(id);\r\n if (!count || count <= 1) {\r\n registrationCountById.delete(id);\r\n return;\r\n }\r\n registrationCountById.set(id, count - 1);\r\n }\r\n\r\n function register(item: TItem, bladeId: string): void {\r\n const normalizedBladeId = bladeId.toLowerCase();\r\n\r\n if (!registry[normalizedBladeId]) {\r\n registry[normalizedBladeId] = [];\r\n }\r\n\r\n const existing = registry[normalizedBladeId].find((i) => i.id === item.id);\r\n if (existing) {\r\n Object.assign(existing, item, { bladeId: normalizedBladeId });\r\n return;\r\n }\r\n\r\n const registryItem: TItem = { ...item, bladeId: normalizedBladeId } as TItem;\r\n registry[normalizedBladeId].push(registryItem);\r\n registrations.push(options.createRegistration(normalizedBladeId, registryItem));\r\n incrementCount(item.id);\r\n }\r\n\r\n function unregister(itemId: string, bladeId: string): void {\r\n const normalizedBladeId = bladeId.toLowerCase();\r\n\r\n const bladeItems = registry[normalizedBladeId];\r\n if (bladeItems) {\r\n const itemIndex = bladeItems.findIndex((i) => i.id === itemId);\r\n if (itemIndex !== -1) {\r\n const [removedItem] = bladeItems.splice(itemIndex, 1);\r\n if (removedItem) {\r\n decrementCount(removedItem.id);\r\n }\r\n }\r\n }\r\n\r\n const registrationIndex = registrations.findIndex(\r\n (r) => options.getRegistrationBladeId(r) === normalizedBladeId && options.getRegistrationItemId(r) === itemId,\r\n );\r\n if (registrationIndex !== -1) {\r\n registrations.splice(registrationIndex, 1);\r\n }\r\n }\r\n\r\n function get(bladeId: string): TItem[] {\r\n const normalizedBladeId = bladeId ? bladeId.toLowerCase() : \"\";\r\n return [...(registry[normalizedBladeId] || [])];\r\n }\r\n\r\n function clear(bladeId: string): void {\r\n const normalizedBladeId = bladeId.toLowerCase();\r\n const bladeItems = registry[normalizedBladeId];\r\n\r\n if (bladeItems) {\r\n bladeItems.forEach((item) => decrementCount(item.id));\r\n delete registry[normalizedBladeId];\r\n }\r\n\r\n const registrationIndexes = registrations\r\n .map((r, index) => (options.getRegistrationBladeId(r) === normalizedBladeId ? index : -1))\r\n .filter((index) => index !== -1)\r\n .reverse();\r\n\r\n registrationIndexes.forEach((index) => {\r\n registrations.splice(index, 1);\r\n });\r\n }\r\n\r\n function update(id: string, bladeId: string, partial: Partial<TItem>): void {\r\n const normalizedBladeId = bladeId.toLowerCase();\r\n const existing = registry[normalizedBladeId]?.find((i) => i.id === id);\r\n if (!existing) return;\r\n Object.assign(existing, partial, { bladeId: normalizedBladeId });\r\n }\r\n\r\n function isRegistered(id: string): boolean {\r\n return registrationCountById.has(id);\r\n }\r\n\r\n return {\r\n registry,\r\n registrations,\r\n register,\r\n unregister,\r\n get,\r\n clear,\r\n update,\r\n isRegistered,\r\n };\r\n}\r\n","import { ref, computed, type Ref, type ComputedRef } from \"vue\";\r\n\r\nexport interface SimpleMapRegistryOptions<TItem, TOptions> {\r\n createItem: (options: TOptions, currentSize: number) => TItem;\r\n getId: (options: TOptions) => string;\r\n}\r\n\r\nexport interface SimpleMapRegistry<TItem extends { id: string; order?: number }, TOptions> {\r\n readonly itemsMap: Ref<Map<string, TItem>>;\r\n readonly sortedItems: ComputedRef<TItem[]>;\r\n register(options: TOptions): string;\r\n unregister(id: string): void;\r\n}\r\n\r\nexport function createSimpleMapRegistry<TItem extends { id: string; order?: number }, TOptions>(\r\n options: SimpleMapRegistryOptions<TItem, TOptions>,\r\n): SimpleMapRegistry<TItem, TOptions> {\r\n const itemsMap = ref<Map<string, TItem>>(new Map()) as Ref<Map<string, TItem>>;\r\n\r\n const sortedItems = computed<TItem[]>(() => {\r\n return Array.from(itemsMap.value.values()).sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\r\n });\r\n\r\n function register(opts: TOptions): string {\r\n const id = options.getId(opts) || crypto.randomUUID();\r\n const item = options.createItem(opts, itemsMap.value.size);\r\n itemsMap.value.set(id, { ...item, id } as TItem);\r\n return id;\r\n }\r\n\r\n function unregister(id: string): void {\r\n itemsMap.value.delete(id);\r\n }\r\n\r\n return {\r\n itemsMap,\r\n sortedItems,\r\n register,\r\n unregister,\r\n };\r\n}\r\n","import type { ComputedRef } from \"vue\";\nimport { createSimpleMapRegistry } from \"@core/services/_internal/createSimpleMapRegistry\";\nimport type { PreregistrationBus } from \"@core/services/_internal/createPreregistrationBus\";\n\n/**\n * A register/unregister/items service backed by a {@link createSimpleMapRegistry},\n * with preregistered items replayed in from a {@link PreregistrationBus}.\n */\nexport interface GenericItemService<TItem, TOptions> {\n register: (options: TOptions) => string;\n unregister: (id: string) => void;\n items: ComputedRef<TItem[]>;\n}\n\n/**\n * Options for {@link createGenericItemRegistry}.\n */\nexport interface GenericItemRegistryOptions<TItem extends { id: string; order?: number }, TOptions> {\n /** Maps register options to a stored item. `currentSize` is the pre-insert map size. */\n createItem: (options: TOptions, currentSize: number) => TItem;\n /** Extracts the id from register options (falsy → a UUID is generated). */\n getId: (options: TOptions) => string;\n /** Bus whose preregistered items are replayed into the created service. */\n bus: Pick<PreregistrationBus<TOptions, GenericItemService<TItem, TOptions>>, \"replayInto\">;\n}\n\n/**\n * Builds a register/unregister/items service around a simple map registry and\n * replays any preregistered items from the bus. Shared by the structurally\n * identical app-bar and settings-menu services.\n */\nexport function createGenericItemRegistry<TItem extends { id: string; order?: number }, TOptions>(\n options: GenericItemRegistryOptions<TItem, TOptions>,\n): GenericItemService<TItem, TOptions> {\n const mapRegistry = createSimpleMapRegistry<TItem, TOptions>({\n createItem: options.createItem,\n getId: options.getId,\n });\n\n const service: GenericItemService<TItem, TOptions> = {\n register: (opts) => mapRegistry.register(opts),\n unregister: (id) => mapRegistry.unregister(id),\n items: mapRegistry.sortedItems,\n };\n\n options.bus.replayInto(service);\n\n return service;\n}\n","import { type Component, ref, type Ref } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport type { MenuItem, MenuItemBadgeConfig } from \"@core/types\";\nimport { createPreregistrationBus } from \"@core/services/_internal\";\n\n/**\n * Canonical identity key for a menu item. Single source of truth.\n * Priority: id → routeId → url → groupConfig.id+title → group+title → deep hash.\n * isSameMenuItem is derived from this function.\n */\nfunction menuItemIdentity(item: MenuItem): string {\n if (item.id !== undefined) return `id:${String(item.id)}`;\n if (item.routeId) return `route:${item.routeId}`;\n if (item.url) return `url:${item.url}`;\n if (item.groupConfig?.id) return `gc:${item.groupConfig.id}:${item.title}`;\n if (item.group) return `g:${item.group}:${item.title}`;\n return `hash:${JSON.stringify(_.omit(item, \"title\"))}`;\n}\n\n// Global state for pre-registering badges before the service is available.\nconst preregisteredMenuBadges: Ref<Map<string, MenuItemBadgeConfig>> = ref(new Map());\n\nexport const menuServiceBus = createPreregistrationBus<MenuItem, MenuService>({\n name: \"menu-service\",\n getKey: menuItemIdentity,\n registerIntoService: (service, item) => service.addMenuItem(item),\n});\n\n/**\n * Registers a menu item before the service is initialized\n */\nexport function addMenuItem(item: MenuItem): void {\n menuServiceBus.preregister(item);\n}\n\n/**\n * Removes a previously registered menu item from the bus store and all live services.\n * Works both before and after the service is initialized.\n *\n * The caller must provide the same identity fields used during registration\n * (typically routeId, or url, or explicit id).\n */\nexport function removeRegisteredMenuItem(item: MenuItem): void {\n menuServiceBus.removePreregistered((stored) => isSameMenuItem(stored, item));\n menuServiceBus.broadcast((service) => service.removeMenuItem(item));\n}\n\n/**\n * Sets a badge for a menu item by its routeId (blade name) or groupId.\n * Can be called at any time, even after menu registration.\n * @param id - routeId for menu items, groupId for groups\n * @param badge - Badge configuration (number, ref, function, or full config)\n */\nexport function setMenuBadge(id: string, badge: MenuItemBadgeConfig): void {\n preregisteredMenuBadges.value.set(id, badge);\n menuServiceBus.broadcast((service) => {\n service.menuBadges.value.set(id, badge);\n });\n}\n\n/**\n * Gets the badge for a menu item by routeId or groupId.\n * @param id - routeId for menu items, groupId for groups\n */\nexport function getMenuBadge(id: string): MenuItemBadgeConfig | undefined {\n const service = menuServiceBus.getFirstInstance();\n if (service) {\n return service.menuBadges.value.get(id);\n }\n\n return preregisteredMenuBadges.value.get(id);\n}\n\n/**\n * Removes a badge from a menu item.\n * @param id - routeId for menu items, groupId for groups\n */\nexport function removeMenuBadge(id: string): void {\n preregisteredMenuBadges.value.delete(id);\n menuServiceBus.broadcast((service) => {\n service.menuBadges.value.delete(id);\n });\n}\n\n/**\n * Returns the reactive badge registry map.\n * Used internally by menu components to reactively watch for badge changes.\n */\nexport function getMenuBadges(): Ref<Map<string, MenuItemBadgeConfig>> {\n const service = menuServiceBus.getFirstInstance();\n return service?.menuBadges ?? preregisteredMenuBadges;\n}\n\nexport interface MenuService {\n addMenuItem: (item: MenuItem) => void;\n menuItems: Ref<MenuItem[]>;\n removeMenuItem: (item: MenuItem) => void;\n menuBadges: Ref<Map<string, MenuItemBadgeConfig>>;\n}\n\n// Default priority values\nconst DEFAULT_PRIORITY = Infinity;\nconst DEFAULT_GROUP_PRIORITY = Infinity;\n\n/**\n * Checks if two menu items represent the same logical item.\n * Derived from menuItemIdentity — single source of truth.\n *\n * Note: This is symmetric — both items are compared by their\n * highest-priority identity field. Passing a partial item (e.g. only url)\n * will only match items whose highest-priority field is also url.\n */\nfunction isSameMenuItem(left: MenuItem, right: MenuItem): boolean {\n return menuItemIdentity(left) === menuItemIdentity(right);\n}\n\ninterface GroupInfo {\n groupId: string;\n groupTitle: string;\n groupIcon: string | Component | undefined;\n groupPriority: number | undefined;\n groupPermissions: string | string[] | undefined;\n}\n\nfunction extractGroupInfo(item: MenuItem): GroupInfo {\n if (item.groupConfig) {\n return {\n groupId: item.groupConfig.id,\n groupTitle: item.groupConfig.title || item.groupConfig.id,\n groupIcon: item.groupConfig.icon,\n groupPriority: item.groupConfig.priority,\n groupPermissions: item.groupConfig.permissions,\n };\n }\n return {\n groupId: \"group_\" + _.snakeCase(item.group as string),\n groupTitle: item.group as string,\n groupIcon: item.groupIcon,\n groupPriority: item.priority,\n groupPermissions: undefined,\n };\n}\n\nfunction sortByPriority(a: MenuItem, b: MenuItem): number {\n return (a.priority ?? DEFAULT_PRIORITY) - (b.priority ?? DEFAULT_PRIORITY);\n}\n\nfunction sortByGroupPriority(a: MenuItem, b: MenuItem): number {\n const p = (item: MenuItem): number => item.inGroupPriority ?? item.priority ?? DEFAULT_GROUP_PRIORITY;\n return p(a) - p(b);\n}\n\n/**\n * Adds a raw item into the groups map. Creates or updates the group immutably.\n */\nfunction addItemToGroup(item: MenuItem, groups: Map<string, MenuItem>): void {\n const info = extractGroupInfo(item);\n\n const groupItem = {\n ..._.omit(item, [\"group\", \"groupIcon\", \"groupPriority\", \"groupConfig\"]),\n } as MenuItem;\n\n const existing = groups.get(info.groupId);\n\n if (existing) {\n const children = [...(existing.children ?? [])];\n const childIndex = children.findIndex((c) => isSameMenuItem(c, groupItem));\n if (childIndex > -1) {\n children[childIndex] = groupItem;\n } else {\n children.push(groupItem);\n }\n\n // Immutable group update\n groups.set(info.groupId, {\n ...existing,\n children,\n ...(item.groupConfig?.title && { title: item.groupConfig.title }),\n ...(item.groupConfig?.icon !== undefined && { groupIcon: item.groupConfig.icon }),\n ...(item.groupConfig?.priority !== undefined && { priority: item.groupConfig.priority }),\n ...(item.groupConfig?.permissions !== undefined && { permissions: item.groupConfig.permissions }),\n });\n } else {\n groups.set(info.groupId, {\n groupId: info.groupId,\n groupIcon: info.groupIcon ?? \"\",\n title: info.groupTitle,\n children: [groupItem],\n priority: info.groupPriority ?? item.priority ?? DEFAULT_PRIORITY,\n permissions: info.groupPermissions,\n } as MenuItem);\n }\n}\n\n/**\n * Builds the finalized menu tree from raw items. Pure function — no side effects.\n *\n * Internally uses Maps for dedup (groups by groupId, standalone by identity key).\n * When duplicate items exist in the input, last registration wins.\n */\nfunction buildMenuTree(rawItems: MenuItem[]): MenuItem[] {\n const groups = new Map<string, MenuItem>();\n const standalone = new Map<string, MenuItem>();\n\n for (const item of rawItems) {\n if (item.group || item.groupConfig) {\n addItemToGroup(item, groups);\n } else if (item.title) {\n standalone.set(menuItemIdentity(item), { ...item });\n }\n }\n\n return finalizeMenuItems([...groups.values(), ...standalone.values()]);\n}\n\nfunction finalizeMenuItems(items: MenuItem[]): MenuItem[] {\n return items\n .map(\n (item): MenuItem => ({\n ...item,\n children: item.children ? [...item.children].sort(sortByGroupPriority) : undefined,\n }),\n )\n .sort(sortByPriority);\n}\n\n/**\n * Menu service implementation\n * Handles the registration and organization of menu items\n */\nexport function createMenuService(): MenuService {\n const menuItems: Ref<MenuItem[]> = ref([]);\n let rawMenu: MenuItem[] = [];\n const menuBadges: Ref<Map<string, MenuItemBadgeConfig>> = ref(new Map(preregisteredMenuBadges.value));\n\n function addMenuItem(item: MenuItem): void {\n rawMenu.push(item);\n menuItems.value = buildMenuTree(rawMenu);\n }\n\n function removeMenuItem(item: MenuItem): void {\n const before = rawMenu.length;\n rawMenu = rawMenu.filter((raw) => !isSameMenuItem(raw, item));\n if (rawMenu.length !== before) {\n menuItems.value = buildMenuTree(rawMenu);\n }\n }\n\n const service: MenuService = {\n addMenuItem,\n menuItems,\n removeMenuItem,\n menuBadges,\n };\n\n menuServiceBus.replayInto(service);\n\n return service;\n}\n","import { inject, provide, getCurrentScope, onScopeDispose, type InjectionKey } from \"vue\";\nimport type { PreregistrationBus } from \"@core/services/_internal\";\nimport { InjectionError } from \"@core/utilities\";\n\n/**\n * Options for {@link createServiceRegistry}.\n */\nexport interface ServiceRegistryOptions<TService> {\n /** Injection key the service is provided/injected under. */\n key: InjectionKey<TService> | string;\n /** Factory called once per provider scope to create the service instance. */\n create: () => TService;\n /** Preregistration bus whose `dispose` runs on scope teardown. */\n bus: Pick<PreregistrationBus<unknown, TService>, \"dispose\">;\n /** Service name used in the {@link InjectionError} thrown by `use()`. */\n name: string;\n /**\n * Optional hook invoked before throwing when `use()` finds no service.\n * Use it to reproduce a bespoke `logger.error(...)` call.\n */\n onMissing?: () => void;\n}\n\n/**\n * A provide/use pair around a single provide/inject service.\n */\nexport interface ServiceRegistry<TService> {\n /**\n * Injects an ancestor-provided service or creates, provides and registers a\n * new one (disposing it via the bus on scope teardown). Idempotent within a\n * provider chain.\n */\n provide(): TService;\n /**\n * Injects the provided service or throws {@link InjectionError} if none is\n * available in the current context.\n */\n use(): TService;\n}\n\n/**\n * Removes the duplicated inject-or-create-provide-onScopeDispose and\n * inject-or-throw boilerplate shared by the framework's service composables.\n */\nexport function createServiceRegistry<TService>(options: ServiceRegistryOptions<TService>): ServiceRegistry<TService> {\n const { key, create, bus, name, onMissing } = options;\n\n function provideService(): TService {\n const existingService = inject(key, null);\n if (existingService) {\n return existingService;\n }\n\n const service = create();\n provide(key, service);\n\n if (getCurrentScope()) {\n onScopeDispose(() => bus.dispose(service));\n }\n\n return service;\n }\n\n function useService(): TService {\n const service = inject(key, null);\n if (!service) {\n onMissing?.();\n throw new InjectionError(name);\n }\n return service;\n }\n\n return {\n provide: provideService,\n use: useService,\n };\n}\n","import { getCurrentInstance } from \"vue\";\nimport {\n MenuService,\n createMenuService,\n addMenuItem,\n removeRegisteredMenuItem,\n setMenuBadge,\n getMenuBadge,\n removeMenuBadge,\n getMenuBadges,\n menuServiceBus,\n} from \"@core/services/menu-service\";\nimport { MenuServiceKey } from \"@framework/injection-keys\";\nimport { createLogger } from \"@core/utilities\";\nimport { createServiceRegistry } from \"@core/composables/createServiceRegistry\";\n\nexport type UseMenuServiceReturn = MenuService;\n\nconst logger = createLogger(\"use-menu-service\");\n\nconst registry = createServiceRegistry<MenuService>({\n key: MenuServiceKey,\n create: createMenuService,\n bus: menuServiceBus,\n name: \"MenuService\",\n onMissing: () => logger.error(\"Menu service not found in current context. Injection chain:\", getCurrentInstance()),\n});\n\nexport function provideMenuService(): MenuService {\n return registry.provide();\n}\n\nexport function useMenuService(): MenuService {\n return registry.use();\n}\n\nexport { addMenuItem, removeRegisteredMenuItem, setMenuBadge, getMenuBadge, removeMenuBadge, getMenuBadges };\n","import { inject, ref, type Ref } from \"vue\";\nimport { IsMobileKey, IsDesktopKey, IsPhoneKey, IsTabletKey, IsTouchKey } from \"@framework/injection-keys\";\n\nexport interface UseResponsiveReturn {\n isMobile: Ref<boolean>;\n isDesktop: Ref<boolean>;\n isPhone: Ref<boolean>;\n isTablet: Ref<boolean>;\n isTouch: boolean;\n}\n\n/**\n * Reactive breakpoint state.\n *\n * Replaces `$isMobile.value` / `$isDesktop.value` in templates\n * and `inject(IsMobileKey)` in script setup.\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * const { isMobile, isDesktop } = useResponsive();\n * </script>\n * <template>\n * <div v-if=\"isDesktop\">Desktop only</div>\n * </template>\n * ```\n */\nexport function useResponsive(): UseResponsiveReturn {\n return {\n isMobile: inject(IsMobileKey, ref(false)),\n isDesktop: inject(IsDesktopKey, ref(true)),\n isPhone: inject(IsPhoneKey, ref(false)),\n isTablet: inject(IsTabletKey, ref(false)),\n isTouch: inject(IsTouchKey, false),\n };\n}\n","import { inject, type InjectionKey } from \"vue\";\nimport { AppInsightsPluginOptions } from \"vue3-application-insights\";\nimport { generateW3CId } from \"@microsoft/applicationinsights-core-js\";\nimport { useUserManagement } from \"@core/composables/useUserManagement\";\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\n\nexport const AppInsightsOptionsKey: InjectionKey<AppInsightsPluginOptions> = Symbol(\"AppInsightsOptions\");\nexport const AppInsightsInstanceKey: InjectionKey<ApplicationInsights | null> = Symbol(\"AppInsightsInstance\");\n\nexport interface UseAppInsightsReturn {\n setupPageTracking: {\n beforeEach: (route: { name: string }) => void;\n afterEach: (route: { name: string; fullPath: string }) => void;\n };\n appInsights: ApplicationInsights | null;\n}\n\n/** @deprecated Use UseAppInsightsReturn instead */\nexport type IUseAppInsights = UseAppInsightsReturn;\n\nexport function useAppInsights(): UseAppInsightsReturn {\n const appInsights = inject(AppInsightsInstanceKey, null);\n const { user } = useUserManagement();\n const appInsightsOptions = inject(AppInsightsOptionsKey, undefined);\n\n function setupPageTracking() {\n const appName = appInsightsOptions?.appName ? `[${appInsightsOptions.appName}] ` : \"\";\n\n const pageName = (route: { name: string }) => `${appName}${route.name as string}`;\n\n function beforeEach(route: { name: string }) {\n if (!appInsights) return;\n const name = pageName(route);\n appInsights.context.telemetryTrace.traceID = generateW3CId();\n appInsights.context.telemetryTrace.name = route.name as string;\n\n appInsights.startTrackPage(name);\n }\n\n function afterEach(route: { name: string; fullPath: string }) {\n if (!appInsights) return;\n const name = pageName(route);\n const url = location.protocol + \"//\" + location.host + route.fullPath;\n appInsights.stopTrackPage(name, url, {\n userId: user.value?.id ?? \"\",\n userName: user.value?.userName ?? \"\",\n });\n }\n\n return {\n beforeEach,\n afterEach,\n };\n }\n\n return {\n setupPageTracking: setupPageTracking(),\n appInsights,\n };\n}\n","import { onErrorCaptured, getCurrentInstance, ref, Ref, nextTick } from \"vue\";\nimport { useAppInsights } from \"@core/composables/useAppInsights\";\nimport { useUserManagement } from \"@core/composables/useUserManagement\";\nimport { DisplayableError, parseError } from \"@core/utilities/error\";\nimport { createLogger } from \"@core/utilities\";\n\nconst logger = createLogger(\"use-error-handler\");\n\nexport interface UseErrorHandlerReturn {\n error: Ref<DisplayableError | null>;\n reset(): void;\n}\n\n/** @deprecated Use UseErrorHandlerReturn instead */\nexport type IUseErrorHandler = UseErrorHandlerReturn;\n\n/**\n * A composable to handle and normalize errors within a component's lifecycle.\n * It captures errors, tracks them with Application Insights, and emits them\n * for parent components to handle.\n *\n * @param capture - If true, prevents the error from propagating further up the component tree.\n * @returns An object with the reactive error and a reset function.\n */\nexport function useErrorHandler(capture?: boolean): UseErrorHandlerReturn {\n const error = ref<DisplayableError | null>(null);\n const instance = getCurrentInstance();\n const { appInsights } = useAppInsights();\n const { user } = useUserManagement();\n const isProcessing = ref(false);\n\n function reset() {\n error.value = null;\n\n if (instance) {\n instance.emit(\"reset\");\n }\n }\n\n onErrorCaptured((err: unknown) => {\n if (isProcessing.value) {\n return !capture;\n }\n\n isProcessing.value = true;\n\n const capturedError = parseError(err);\n error.value = capturedError;\n\n if (appInsights) {\n appInsights.trackException({\n exception: capturedError,\n properties: {\n userId: user.value?.id ?? \"\",\n userName: user.value?.userName ?? \"\",\n },\n });\n }\n\n logger.error(\"Captured Error:\", capturedError.originalError);\n\n if (instance) {\n instance.emit(\"error\", capturedError);\n }\n\n nextTick(() => {\n isProcessing.value = false;\n });\n\n // if `capture` is true, stop the error from propagating further.\n return !capture;\n });\n\n return {\n error,\n reset,\n };\n}\n","/**\r\n * Shared WeakMap that allows useAsync to register a deferred toast notification,\r\n * and ErrorInterceptor to cancel it when the same error is caught for blade banner display.\r\n *\r\n * This decouples the two modules — neither imports the other directly.\r\n *\r\n * IMPORTANT: This module must NOT have top-level imports from @core/notifications\r\n * because it is transitively imported by useAsync (in the @core/composables barrel),\r\n * and @core/notifications may pull in @ui/components which imports from\r\n * @core/composables — creating a circular dependency.\r\n */\r\n\r\ninterface PendingNotification {\r\n timerId: ReturnType<typeof setTimeout>;\r\n notifId: string;\r\n}\r\n\r\nconst pending = new WeakMap<object, PendingNotification>();\r\n\r\n/**\r\n * Register a deferred error notification for an error object.\r\n * Called by useAsync after scheduling a setTimeout for the toast.\r\n */\r\nexport function setPendingErrorNotification(\r\n error: object,\r\n timerId: ReturnType<typeof setTimeout>,\r\n notifId: string,\r\n): void {\r\n pending.set(error, { timerId, notifId });\r\n}\r\n\r\n/**\r\n * Cancel a deferred error notification for an error object.\r\n * Called by ErrorInterceptor when it catches the error and will show a blade banner instead.\r\n * Returns true if a pending notification was found and cancelled.\r\n */\r\nexport function cancelPendingErrorNotification(error: unknown): boolean {\r\n if (error && typeof error === \"object\") {\r\n // Try direct lookup first, then fall back to originalError.\r\n // useErrorHandler wraps errors via parseError() → DisplayableError,\r\n // so the watch receives a different object than what useAsync stored.\r\n const directEntry = pending.get(error);\r\n const originalError =\r\n \"originalError\" in error && error.originalError && typeof error.originalError === \"object\"\r\n ? (error.originalError as object)\r\n : undefined;\r\n const entry = directEntry ?? (originalError ? pending.get(originalError) : undefined);\r\n const key = directEntry ? error : originalError;\r\n\r\n if (entry && key) {\r\n clearTimeout(entry.timerId);\r\n // Lazy import to avoid circular dependency at module load time.\r\n // In practice, clearTimeout above is sufficient since the deferred\r\n // setTimeout(0) hasn't fired yet when this runs synchronously from\r\n // ErrorInterceptor's onErrorCaptured. The remove() is a safety net.\r\n import(\"@core/notifications/notification\").then(({ notification }) => {\r\n notification.remove(entry.notifId);\r\n });\r\n pending.delete(key);\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n","import { useErrorHandler } from \"@core/composables/useErrorHandler\";\nimport { defineComponent, inject, watch, type VNode } from \"vue\";\nimport { BladeDescriptorKey, BladeStackKey } from \"@core/blade-navigation/types\";\nimport { cancelPendingErrorNotification } from \"@core/utilities/pendingErrorNotifications\";\n\nexport interface Props {\n capture?: boolean;\n}\n\nexport interface Emits {\n (event: \"error\", value: Error | string): void;\n (event: \"reset\"): void;\n}\n\nexport type Slots = {\n slots: {\n default: (args: { error: Error | string | null; reset: () => void }) => VNode[];\n };\n};\n\nexport default defineComponent({\n name: \"ErrorInterceptor\",\n props: {\n capture: {\n default: false,\n type: Boolean,\n },\n },\n emits: {\n error(value: Error | string) {\n return (value && value instanceof Error) || typeof value === \"string\";\n },\n reset(): boolean {\n return true;\n },\n },\n setup(props, { slots }) {\n // Inject blade context BEFORE registering onErrorCaptured so we can\n // stop error propagation when inside a blade (prevents duplicate toast\n // from the global error handler).\n const descriptor = inject(BladeDescriptorKey, undefined);\n const bladeStack = inject(BladeStackKey, undefined);\n const hasBlade = !!(descriptor && bladeStack);\n\n const { error, reset } = useErrorHandler(hasBlade || props.capture);\n\n if (hasBlade) {\n watch(error, (newError) => {\n const bladeId = descriptor!.value.id;\n if (newError) {\n // Cancel any deferred useAsync toast — blade banner replaces it\n cancelPendingErrorNotification(newError);\n bladeStack!.setBladeError(bladeId, newError);\n } else {\n bladeStack!.clearBladeError(bladeId);\n }\n });\n }\n\n return () =>\n slots.default?.({\n error: error.value,\n reset,\n });\n },\n});\n","import type { InjectionKey } from \"vue\";\r\n\r\nexport type ButtonVariant =\r\n | \"primary\"\r\n | \"secondary\"\r\n | \"danger\"\r\n | \"warning\"\r\n | \"success\"\r\n | \"info\"\r\n | \"outline\"\r\n | \"ghost\"\r\n | \"link\";\r\n\r\nexport type ButtonSize =\r\n | \"sm\"\r\n | \"default\"\r\n | \"lg\"\r\n | \"icon\"\r\n | \"icon-sm\"\r\n // Legacy aliases (backward compat)\r\n | \"xs\"\r\n | \"base\";\r\n\r\nexport interface ButtonGroupContext {\r\n size?: { value: ButtonSize | undefined };\r\n attached?: { value: boolean };\r\n}\r\n\r\nexport const ButtonGroupKey: InjectionKey<ButtonGroupContext> = Symbol(\"vc-button-group\");\r\n","import { inject, ref } from \"vue\";\nimport { BladeLoadingKey } from \"@framework/injection-keys\";\n\n/**\n * Returns the blade loading state from the nearest VcBlade ancestor.\n * When `true`, components should render their skeleton variant.\n */\nexport function useBladeLoading() {\n return inject(BladeLoadingKey, ref(false));\n}\n","<template>\n <button\n v-if=\"!bladeLoading\"\n :class=\"buttonClass\"\n :type=\"type\"\n :disabled=\"disabled || loading\"\n :aria-label=\"ariaLabel\"\n :aria-busy=\"loading || undefined\"\n :aria-pressed=\"selected || undefined\"\n @click=\"onClick\"\n >\n <!-- Loading: spinner replaces icon; shown inline next to text -->\n <VcIcon\n v-if=\"loading\"\n icon=\"lucide-loader-2\"\n class=\"vc-button__icon tw-animate-spin\"\n :size=\"iconSize\"\n />\n <VcIcon\n v-else-if=\"icon\"\n :class=\"['vc-button--icon', iconClass]\"\n :icon=\"icon\"\n :size=\"iconSize\"\n />\n <span\n v-if=\"$slots['default']\"\n class=\"vc-button__title\"\n >\n <slot />\n </span>\n </button>\n</template>\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script lang=\"ts\" setup>\nimport { computed, inject, type Component } from \"vue\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { ButtonGroupKey, type ButtonVariant, type ButtonSize } from \"@ui/components/atoms/vc-button/types\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\n\nconst SIZE_ALIAS: Record<string, string> = {\n base: \"default\",\n xs: \"sm\",\n};\n\nexport interface Props {\n icon?: string | Component;\n iconClass?: string;\n iconSize?: InstanceType<typeof VcIcon>[\"$props\"][\"size\"];\n variant?: ButtonVariant;\n disabled?: boolean;\n size?: ButtonSize;\n selected?: boolean;\n text?: boolean;\n type?: \"button\" | \"submit\" | \"reset\";\n loading?: boolean;\n ariaLabel?: string;\n}\n\nexport interface Emits {\n /**\n * Emitted when component is clicked\n * */\n (event: \"click\", value: Event): void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: \"primary\",\n iconSize: \"s\",\n size: \"default\",\n type: \"button\",\n loading: false,\n});\n\nconst bladeLoading = useBladeLoading();\nconst emit = defineEmits<Emits>();\n\ndefineSlots<{\n default: (props?: any) => any;\n}>();\n\nconst group = inject(ButtonGroupKey, null);\n\nconst effectiveSize = computed(() => {\n const raw = group?.size?.value ?? props.size;\n return SIZE_ALIAS[raw as string] ?? raw;\n});\n\nconst buttonClass = computed(() => {\n return [\n \"vc-button\",\n {\n [`vc-button-${props.variant}`]: props.variant,\n [`vc-button--${effectiveSize.value}`]: effectiveSize.value,\n \"vc-button--selected\": props.selected,\n \"vc-button--text\": props.text,\n \"vc-button--disabled\": props.disabled || props.loading,\n \"vc-button--loading\": props.loading,\n },\n ];\n});\n\nfunction onClick(e: Event): void {\n if (!props.disabled && !props.loading) {\n e.preventDefault();\n emit(\"click\", e);\n }\n}\n</script>\n\n<style lang=\"scss\">\n:root {\n // PRIMARY (WCAG AA: --primary-700 yields 4.77:1 contrast with white)\n --button-primary-background-color: var(--primary-700);\n --button-primary-background-color-hover: var(--primary-700);\n --button-primary-background-color-disabled: var(--primary-700);\n --button-primary-text-color: var(--additional-50);\n --button-primary-text-color-disabled: var(--additional-50);\n --button-primary-border-color: var(--primary-700);\n --button-primary-border-color-hover: var(--primary-700);\n --button-primary-border-color-disabled: var(--primary-700);\n\n // SECONDARY (preserved from original)\n --button-secondary-background-color: var(--additional-50);\n --button-secondary-background-color-hover: var(--primary-50);\n --button-secondary-background-color-disabled: var(--additional-50);\n --button-secondary-text-color: var(--neutrals-700);\n --button-secondary-text-color-disabled: var(--neutrals-400);\n --button-secondary-border-color: var(--secondary-300);\n --button-secondary-border-color-hover: var(--secondary-400);\n --button-secondary-border-color-disabled: var(--secondary-300);\n\n // DANGER\n --button-danger-background-color: var(--danger-700);\n --button-danger-background-color-hover: var(--danger-700);\n --button-danger-background-color-disabled: var(--danger-700);\n --button-danger-text-color: var(--additional-50);\n --button-danger-text-color-disabled: var(--additional-50);\n --button-danger-border-color: var(--danger-700);\n --button-danger-border-color-hover: var(--danger-700);\n --button-danger-border-color-disabled: var(--danger-700);\n\n // WARNING (dark text on light background for contrast)\n --button-warning-background-color: var(--warning-500);\n --button-warning-background-color-hover: var(--warning-500);\n --button-warning-background-color-disabled: var(--warning-500);\n --button-warning-text-color: var(--neutrals-800);\n --button-warning-text-color-disabled: var(--neutrals-800);\n --button-warning-border-color: var(--warning-500);\n --button-warning-border-color-hover: var(--warning-500);\n --button-warning-border-color-disabled: var(--warning-500);\n\n // SUCCESS\n --button-success-background-color: var(--success-700);\n --button-success-background-color-hover: var(--success-700);\n --button-success-background-color-disabled: var(--success-700);\n --button-success-text-color: var(--additional-50);\n --button-success-text-color-disabled: var(--additional-50);\n --button-success-border-color: var(--success-700);\n --button-success-border-color-hover: var(--success-700);\n --button-success-border-color-disabled: var(--success-700);\n\n // INFO\n --button-info-background-color: var(--info-700);\n --button-info-background-color-hover: var(--info-700);\n --button-info-background-color-disabled: var(--info-700);\n --button-info-text-color: var(--additional-50);\n --button-info-text-color-disabled: var(--additional-50);\n --button-info-border-color: var(--info-700);\n --button-info-border-color-hover: var(--info-700);\n --button-info-border-color-disabled: var(--info-700);\n\n // OUTLINE (transparent bg, border from secondary)\n --button-outline-background-color: transparent;\n --button-outline-background-color-hover: var(--primary-50);\n --button-outline-background-color-disabled: transparent;\n --button-outline-text-color: var(--neutrals-700);\n --button-outline-text-color-disabled: var(--neutrals-400);\n --button-outline-border-color: var(--secondary-300);\n --button-outline-border-color-hover: var(--secondary-400);\n --button-outline-border-color-disabled: var(--secondary-300);\n\n // GHOST (no border, no bg)\n --button-ghost-background-color: transparent;\n --button-ghost-background-color-hover: var(--primary-50);\n --button-ghost-background-color-disabled: transparent;\n --button-ghost-text-color: var(--neutrals-700);\n --button-ghost-text-color-disabled: var(--neutrals-400);\n --button-ghost-border-color: transparent;\n --button-ghost-border-color-hover: transparent;\n --button-ghost-border-color-disabled: transparent;\n\n // LINK (text link style)\n --button-link-background-color: transparent;\n --button-link-background-color-hover: transparent;\n --button-link-background-color-disabled: transparent;\n --button-link-text-color: var(--primary-700);\n --button-link-text-color-disabled: var(--neutrals-400);\n --button-link-border-color: transparent;\n --button-link-border-color-hover: transparent;\n --button-link-border-color-disabled: transparent;\n\n // FOCUS RING\n --button-focus-ring-color: var(--primary-300);\n --button-focus-ring-width: 2px;\n --button-focus-ring-offset: 2px;\n\n --button-border-radius: 6px;\n\n // sm: h-8 px-3 text-xs (no vertical padding, fixed height)\n --button-sm-height: 32px;\n --button-sm-padding-hor: 12px;\n\n // default: h-9 px-4 py-2\n --button-default-height: 36px;\n --button-default-padding-hor: 16px;\n --button-default-padding-vert: 8px;\n\n // lg: h-10 px-6 (no vertical padding, fixed height)\n --button-lg-height: 40px;\n --button-lg-padding-hor: 24px;\n\n // icon: h-9 w-9 square\n --button-icon-size: 36px;\n\n // icon-sm: h-6 w-6 compact square (24px, for table cells)\n --button-icon-sm-size: 24px;\n}\n\n$variants: primary, secondary, danger, warning, success, info, outline, ghost, link;\n\n.vc-button {\n position: relative;\n\n // Expand touch target to 44px minimum for WCAG 2.5.8 compliance\n // Uses ::after pseudo-element to extend hit area without affecting visual size\n &::after {\n content: \"\";\n position: absolute;\n inset: 50% auto auto 50%;\n transform: translate(-50%, -50%);\n min-width: 44px;\n min-height: 44px;\n width: 100%;\n height: 100%;\n }\n\n &__icon + &__title {\n @apply tw-ml-2 tw-text-left;\n }\n\n &--loading {\n @apply tw-cursor-wait #{!important};\n }\n\n @each $variant in $variants {\n &.vc-button-#{$variant} {\n @apply tw-inline-flex tw-items-center tw-font-medium tw-cursor-pointer tw-box-border\n tw-transition-colors tw-duration-150 tw-ease-in-out\n tw-rounded-[var(--button-border-radius)]\n tw-bg-[color:var(--button-#{$variant}-background-color)]\n tw-border tw-border-[color:var(--button-#{$variant}-border-color)] tw-border-solid\n tw-flex tw-justify-center\n tw-text-[color:var(--button-#{$variant}-text-color)];\n\n &:hover:not(:disabled) {\n @apply tw-opacity-90;\n }\n\n // Keyboard focus only\n &:focus-visible {\n @apply tw-outline-none\n tw-ring-[length:var(--button-focus-ring-width)]\n tw-ring-offset-[length:var(--button-focus-ring-offset)]\n tw-ring-[color:var(--button-focus-ring-color)];\n }\n\n // Clean disabled\n &:disabled {\n @apply tw-opacity-50 tw-cursor-not-allowed tw-pointer-events-none;\n }\n\n // text modifier — ghost-like appearance (backward compat)\n &.vc-button--text {\n @apply tw-border-none tw-bg-transparent\n tw-text-[color:var(--button-#{$variant}-background-color)]\n hover:tw-text-[color:var(--button-#{$variant}-background-color-hover)]\n focus:tw-text-[color:var(--button-#{$variant}-background-color-hover)]\n disabled:tw-text-[color:var(--button-#{$variant}-text-color-disabled)] disabled:tw-opacity-50;\n\n @apply tw-p-0 tw-min-h-0 #{!important};\n\n &:hover:not(:disabled) {\n @apply tw-opacity-100;\n }\n }\n\n &.vc-button--selected {\n @apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)];\n\n &.vc-button--text {\n @apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)] tw-bg-opacity-[0.07] tw-p-1;\n }\n }\n\n // Size: sm — h-8 px-3 text-xs (no vertical padding)\n &.vc-button--sm {\n @apply tw-h-[var(--button-sm-height)] tw-px-[var(--button-sm-padding-hor)] tw-py-0 tw-text-xs #{!important};\n }\n\n // Size: default — h-9 px-4 py-2\n &.vc-button--default {\n @apply tw-h-[var(--button-default-height)] tw-py-[var(--button-default-padding-vert)] tw-px-[var(--button-default-padding-hor)] tw-text-sm tw-leading-4;\n }\n\n // Size: lg — h-10 px-6 (no vertical padding)\n &.vc-button--lg {\n @apply tw-h-[var(--button-lg-height)] tw-px-[var(--button-lg-padding-hor)] tw-py-0 tw-text-sm tw-leading-4 #{!important};\n }\n\n // Size: icon — h-9 w-9 square\n &.vc-button--icon {\n @apply tw-h-[var(--button-icon-size)] tw-w-[var(--button-icon-size)] tw-p-0 #{!important};\n }\n\n // Size: icon-sm — h-6 w-6 compact square (24px, for table cells)\n &.vc-button--icon-sm {\n @apply tw-h-[var(--button-icon-sm-size)] tw-w-[var(--button-icon-sm-size)] tw-p-0 #{!important};\n }\n\n .vc-button--icon + .vc-button__title {\n @apply tw-ml-1;\n }\n }\n }\n\n // Special hover overrides for structural variants (bg change, not just opacity)\n &.vc-button-secondary:hover:not(:disabled):not(.vc-button--text) {\n @apply tw-opacity-100 tw-bg-[color:var(--button-secondary-background-color-hover)]\n tw-border-[color:var(--button-secondary-border-color-hover)];\n }\n\n &.vc-button-outline:hover:not(:disabled):not(.vc-button--text) {\n @apply tw-opacity-100 tw-bg-[color:var(--button-outline-background-color-hover)]\n tw-border-[color:var(--button-outline-border-color-hover)];\n }\n\n &.vc-button-ghost:hover:not(:disabled):not(.vc-button--text) {\n @apply tw-opacity-100 tw-bg-[color:var(--button-ghost-background-color-hover)];\n }\n\n &.vc-button-link {\n // Link variant: no padding, no min-height — behaves like inline text\n @apply tw-p-0 tw-h-auto tw-min-h-0 #{!important};\n\n &:hover:not(:disabled):not(.vc-button--text) {\n @apply tw-opacity-100;\n\n // Underline only on text, not icon — prevents split underline with icon+text\n .vc-button__title {\n @apply tw-underline tw-underline-offset-4;\n }\n }\n }\n}\n</style>\n","import {\n autoUpdate,\n flip,\n offset as floatingOffset,\n shift,\n useFloating,\n type Middleware,\n type Placement,\n type ReferenceElement,\n type Strategy,\n} from \"@floating-ui/vue\";\nimport { computed, toValue, type MaybeRefOrGetter, type Ref } from \"vue\";\n\nexport interface FloatingOffset {\n mainAxis?: number;\n crossAxis?: number;\n alignmentAxis?: number;\n}\n\nexport interface UseFloatingPositionOptions {\n placement?: MaybeRefOrGetter<Placement>;\n strategy?: MaybeRefOrGetter<Strategy>;\n offset?: MaybeRefOrGetter<FloatingOffset | number | undefined>;\n middleware?: MaybeRefOrGetter<Middleware[] | undefined>;\n enableFlip?: MaybeRefOrGetter<boolean>;\n enableShift?: MaybeRefOrGetter<boolean>;\n autoUpdate?: MaybeRefOrGetter<boolean>;\n shiftPadding?: number;\n}\n\n/**\n * Shared floating-ui adapter with reactive placement/offset defaults.\n */\nexport function useFloatingPosition(\n referenceEl: Ref<ReferenceElement | null>,\n floatingEl: Ref<HTMLElement | null>,\n options: UseFloatingPositionOptions = {},\n) {\n const resolvedPlacement = computed<Placement>(() => toValue(options.placement) ?? \"bottom\");\n const resolvedStrategy = computed<Strategy>(() => toValue(options.strategy) ?? \"absolute\");\n\n const resolvedMiddleware = computed<Middleware[]>(() => {\n const explicitMiddleware = toValue(options.middleware);\n\n if (explicitMiddleware?.length) {\n return explicitMiddleware;\n }\n\n const middleware: Middleware[] = [];\n\n if (toValue(options.enableFlip) !== false) {\n middleware.push(flip({ padding: options.shiftPadding ?? 8 }));\n }\n\n if (toValue(options.enableShift) !== false) {\n middleware.push(shift({ padding: options.shiftPadding ?? 8 }));\n }\n\n const offsetValue = toValue(options.offset);\n\n if (typeof offsetValue === \"number\") {\n middleware.push(floatingOffset(offsetValue));\n } else {\n middleware.push(\n floatingOffset({\n mainAxis: offsetValue?.mainAxis ?? 0,\n crossAxis: offsetValue?.crossAxis ?? 0,\n alignmentAxis: offsetValue?.alignmentAxis,\n }),\n );\n }\n\n return middleware;\n });\n\n const floating = useFloating(referenceEl, floatingEl, {\n placement: resolvedPlacement,\n strategy: resolvedStrategy,\n whileElementsMounted: toValue(options.autoUpdate) === false ? undefined : autoUpdate,\n middleware: resolvedMiddleware,\n });\n\n const floatingStyle = computed(() => ({\n position: resolvedStrategy.value,\n top: `${floating.y.value ?? 0}px`,\n left: `${floating.x.value ?? 0}px`,\n }));\n\n return {\n ...floating,\n floatingStyle,\n resolvedPlacement,\n resolvedStrategy,\n };\n}\n","import type { InjectionKey, Ref } from \"vue\";\n\nexport interface InputGroupContext {\n name: Ref<string | undefined>;\n disabled: Ref<boolean>;\n invalid: Ref<boolean>;\n describedBy: Ref<string | undefined>;\n}\n\nexport const InputGroupContextKey: InjectionKey<InputGroupContext> = Symbol(\"vc-input-group-context\");\n","import { computed, inject, useId } from \"vue\";\nimport type { IFormFieldProps } from \"@ui/types/form-field\";\nimport { InputGroupContextKey } from \"@ui/components/molecules/vc-input-group/context\";\n\n/**\n * Shared logic for all form field components.\n * Handles: unique ID generation, ARIA attribute computation,\n * InputGroupContext integration, and resolved disabled/invalid state.\n */\nexport function useFormField(props: IFormFieldProps & { hint?: string }) {\n const groupContext = inject(InputGroupContextKey, null);\n const uid = useId();\n\n const fieldId = computed(() => `vc-field-${uid}`);\n const labelId = computed(() => `${fieldId.value}-label`);\n const errorId = computed(() => `${fieldId.value}-error`);\n const hintId = computed(() => `${fieldId.value}-hint`);\n\n const invalid = computed(() => !!props.error || !!props.errorMessage || !!groupContext?.invalid.value);\n\n const resolvedDisabled = computed(() => !!props.disabled || !!groupContext?.disabled.value);\n\n const resolvedName = computed(() => groupContext?.name.value || props.name);\n\n const ariaRequired = computed(() => (props.required ? true : undefined));\n\n const ariaDescribedBy = computed(() => {\n const ids = new Set<string>();\n\n if (groupContext?.describedBy.value) {\n groupContext.describedBy.value.split(/\\s+/).forEach((id) => ids.add(id));\n }\n\n if (props.errorMessage) {\n ids.add(errorId.value);\n }\n\n if (props.hint) {\n ids.add(hintId.value);\n }\n\n return ids.size ? Array.from(ids).join(\" \") : undefined;\n });\n\n return {\n fieldId,\n labelId,\n errorId,\n hintId,\n invalid,\n resolvedDisabled,\n resolvedName,\n ariaRequired,\n ariaDescribedBy,\n groupContext,\n };\n}\n","import { ref, onBeforeUnmount, type Ref } from \"vue\";\r\nimport { useResizeObserver } from \"@vueuse/core\";\r\n\r\nexport interface UseScrollArrowsOptions {\r\n /** Pixels per animation frame (~60fps). Default: 2 */\r\n speed?: number;\r\n}\r\n\r\nexport function useScrollArrows(viewportRef: Ref<HTMLElement | null>, options: UseScrollArrowsOptions = {}) {\r\n const { speed = 2 } = options;\r\n\r\n const canScrollUp = ref(false);\r\n const canScrollDown = ref(false);\r\n let scrollAnimationId: number | null = null;\r\n\r\n function updateScrollState() {\r\n const el = viewportRef.value;\r\n if (!el) {\r\n canScrollUp.value = false;\r\n canScrollDown.value = false;\r\n return;\r\n }\r\n canScrollUp.value = el.scrollTop > 0;\r\n canScrollDown.value = Math.ceil(el.scrollTop) < el.scrollHeight - el.clientHeight;\r\n }\r\n\r\n function startScroll(direction: \"up\" | \"down\") {\r\n stopScroll();\r\n const el = viewportRef.value;\r\n if (!el) return;\r\n\r\n function tick() {\r\n if (!el) return;\r\n el.scrollTop += direction === \"up\" ? -speed : speed;\r\n updateScrollState();\r\n scrollAnimationId = requestAnimationFrame(tick);\r\n }\r\n scrollAnimationId = requestAnimationFrame(tick);\r\n }\r\n\r\n function stopScroll() {\r\n if (scrollAnimationId !== null) {\r\n cancelAnimationFrame(scrollAnimationId);\r\n scrollAnimationId = null;\r\n }\r\n }\r\n\r\n useResizeObserver(viewportRef, updateScrollState);\r\n\r\n onBeforeUnmount(() => {\r\n stopScroll();\r\n });\r\n\r\n return {\r\n canScrollUp,\r\n canScrollDown,\r\n startScroll,\r\n stopScroll,\r\n updateScrollState,\r\n };\r\n}\r\n","import { computed, inject, type MaybeRefOrGetter, toValue } from \"vue\";\nimport { AppRootElementKey } from \"@framework/injection-keys\";\n\nexport interface UseTeleportTargetOptions {\n to?: MaybeRefOrGetter<string | HTMLElement | null | undefined>;\n fallbackToBody?: boolean;\n}\n\n/**\n * Resolves teleport target consistently across the UI kit.\n * Priority: explicit target -> vc-app root element -> body.\n */\nexport function useTeleportTarget(options: UseTeleportTargetOptions = {}) {\n const appRootRef = inject(AppRootElementKey, undefined);\n\n const teleportTarget = computed<string | HTMLElement | undefined>(() => {\n const explicitTarget = options.to ? toValue(options.to) : undefined;\n\n if (explicitTarget) {\n return explicitTarget;\n }\n\n if (appRootRef?.value) {\n return appRootRef.value;\n }\n\n if (options.fallbackToBody === false) {\n return undefined;\n }\n\n return \"body\";\n });\n\n return {\n teleportTarget,\n };\n}\n","<template>\n <!-- Text variant: rows of skeleton lines (original behavior) -->\n <div\n v-if=\"variant === 'text'\"\n class=\"vc-skeleton\"\n :class=\"{\n 'vc-skeleton--animated': animated,\n }\"\n role=\"status\"\n aria-busy=\"true\"\n :aria-label=\"ariaLabel\"\n >\n <span class=\"tw-sr-only\">{{ ariaLabel }}</span>\n <div\n v-for=\"index in rows\"\n :key=\"index\"\n class=\"vc-skeleton__row\"\n :style=\"{\n width: getRowWidth(index),\n }\"\n aria-hidden=\"true\"\n ></div>\n </div>\n\n <!-- Circle / Block variant: single shape element -->\n <div\n v-else\n class=\"vc-skeleton__shape\"\n :class=\"[`vc-skeleton__shape--${variant}`, { 'tw-animate-pulse': animated }]\"\n :style=\"{\n width: normalizeSize(width),\n height: normalizeSize(height),\n }\"\n role=\"status\"\n aria-busy=\"true\"\n :aria-label=\"ariaLabel\"\n >\n <span class=\"tw-sr-only\">{{ ariaLabel }}</span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nconst props = withDefaults(\n defineProps<{\n /** Shape variant: text rows, circle, or rectangular block */\n variant?: \"text\" | \"circle\" | \"block\";\n /** Number of rows (only for variant=\"text\") */\n rows?: number;\n /** Custom width (number treated as px, string used as-is) */\n width?: string | number;\n /** Custom height (number treated as px, string used as-is) */\n height?: string | number;\n animated?: boolean;\n /** Screen reader label */\n ariaLabel?: string;\n }>(),\n {\n variant: \"text\",\n rows: 1,\n animated: true,\n ariaLabel: \"Loading...\",\n },\n);\n\nfunction getRowWidth(index: number) {\n if (index === props.rows) {\n return \"60%\";\n }\n return \"100%\";\n}\n\nfunction normalizeSize(value: string | number | undefined): string | undefined {\n if (value === undefined) return undefined;\n return typeof value === \"number\" ? `${value}px` : value;\n}\n</script>\n\n<style lang=\"scss\">\n:root {\n --vc-skeleton-bg: var(--neutrals-200);\n --vc-skeleton-highlight: var(--neutrals-300);\n --vc-skeleton-border-radius: 6px;\n --vc-skeleton-row-height: 16px;\n --vc-skeleton-row-gap: 12px;\n}\n\n.vc-skeleton {\n @apply tw-w-full tw-flex tw-flex-col;\n gap: var(--vc-skeleton-row-gap);\n\n &__row {\n height: var(--vc-skeleton-row-height);\n @apply tw-bg-[color:var(--vc-skeleton-bg)] tw-rounded-[var(--vc-skeleton-border-radius)];\n }\n\n &--animated &__row {\n @apply tw-animate-pulse;\n }\n\n &__shape {\n @apply tw-bg-[color:var(--vc-skeleton-bg)];\n\n &--block {\n @apply tw-rounded-[var(--vc-skeleton-border-radius)];\n }\n\n &--circle {\n @apply tw-rounded-full;\n }\n }\n}\n</style>\n","<template>\n <component\n :is=\"ariaLabel ? 'section' : 'div'\"\n :class=\"[\n 'vc-container',\n {\n 'vc-container--shadow': shadow && scroll,\n 'vc-container--nopadding': noPadding,\n },\n ]\"\n :aria-label=\"ariaLabel\"\n >\n <div\n ref=\"component\"\n class=\"vc-container__inner\"\n tabindex=\"0\"\n @scroll=\"onScroll\"\n >\n <slot></slot>\n </div>\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from \"vue\";\nimport { useResizeObserver } from \"@vueuse/core\";\n\nexport interface Props {\n shadow?: boolean;\n noPadding?: boolean;\n /** When provided, renders as <section> with this label instead of <div> */\n ariaLabel?: string;\n}\n\nexport interface Emits {\n (event: \"scroll\", e: Event): void;\n}\n\ndefineProps<Props>();\n\nconst emit = defineEmits<Emits>();\n\nconst component = ref<HTMLElement>();\nconst scroll = ref(false);\n\nconst scrollTop = () => {\n if (component.value) {\n component.value.scroll(0, 0);\n }\n};\n\nfunction onScroll(e: Event) {\n emit(\"scroll\", e);\n}\n\nuseResizeObserver(component, () => {\n scroll.value = !!(component.value && component.value.clientHeight < component.value.scrollHeight);\n});\n\ndefineExpose({\n scrollTop,\n component,\n});\n</script>\n\n<style lang=\"scss\">\n:root {\n --container-padding: 16px;\n --container-gap: 0;\n --container-bg: transparent;\n --container-border-radius: 0;\n --container-shadow-color: var(--additional-950);\n --container-shadow-opacity: 0.1;\n --container-shadow: 0 3px 2px rgba(var(--container-shadow-color), var(--container-shadow-opacity)) inset;\n}\n\n.vc-container {\n @apply tw-w-full tw-h-full tw-overflow-hidden tw-box-border tw-flex tw-flex-col tw-relative;\n background-color: var(--container-bg);\n border-radius: var(--container-border-radius);\n gap: var(--container-gap);\n\n &--shadow {\n @apply tw-shadow-[--container-shadow];\n }\n\n &__inner {\n @apply tw-relative tw-overflow-y-auto tw-overflow-x-hidden\n tw-flex-1;\n padding: var(--container-padding);\n }\n\n &--nopadding &__inner {\n padding: 0;\n }\n}\n</style>\n","<template>\n <div\n :id=\"id\"\n class=\"vc-hint\"\n :class=\"{\n 'vc-hint--error': error,\n }\"\n :role=\"error ? 'alert' : undefined\"\n >\n <slot></slot>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nexport interface Props {\n /** Optional id for linking with aria-describedby on inputs */\n id?: string;\n /** Shows hint in error state */\n error?: boolean;\n}\n\ndefineProps<Props>();\n</script>\n\n<style lang=\"scss\">\n:root {\n --hint-color: var(--neutrals-500);\n --hint-error-color: var(--danger-500);\n --hint-font-size: 12px;\n --hint-line-height: 1.4;\n}\n\n.vc-hint {\n color: var(--hint-color);\n font-size: var(--hint-font-size);\n line-height: var(--hint-line-height);\n\n &--error {\n color: var(--hint-error-color);\n }\n}\n</style>\n","import _Hint from \"@ui/components/atoms/vc-hint/vc-hint.vue\";\r\nimport { VNode } from \"vue\";\r\n\r\nexport const VcHint = _Hint as typeof _Hint & {\r\n new (): {\r\n $slots: {\r\n default: () => VNode[];\r\n };\r\n };\r\n};\r\n","<template>\n <div\n ref=\"target\"\n class=\"vc-tooltip\"\n @mouseenter=\"showTooltip\"\n @mouseleave=\"hideTooltip\"\n @focusin=\"showTooltip\"\n @focusout=\"hideTooltip\"\n @keydown.escape=\"hideTooltip\"\n >\n <div\n ref=\"tooltipCompRef\"\n class=\"vc-tooltip__trigger\"\n :aria-describedby=\"tooltipVisible ? tooltipId : undefined\"\n >\n <slot></slot>\n </div>\n\n <teleport :to=\"teleportTarget\">\n <Transition name=\"vc-tooltip-fade\">\n <div\n v-if=\"tooltipVisible && !disabled && $slots['tooltip']\"\n :id=\"tooltipId\"\n ref=\"tooltipRef\"\n role=\"tooltip\"\n :style=\"tooltipStyle\"\n class=\"vc-tooltip__wrapper\"\n :class=\"`vc-tooltip__wrapper--${variant}`\"\n >\n <!-- Arrow: rotated square, inner half hidden by body (z-index) -->\n <div\n v-if=\"arrow\"\n ref=\"arrowRef\"\n class=\"vc-tooltip__arrow\"\n :class=\"`vc-tooltip__arrow--${variant}`\"\n :style=\"arrowStyle\"\n />\n <!-- Body: sits on top of arrow via z-index, covers inner half -->\n <div\n class=\"vc-tooltip__body\"\n :class=\"`vc-tooltip__body--${variant}`\"\n >\n <slot name=\"tooltip\"></slot>\n </div>\n </div>\n </Transition>\n </teleport>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script lang=\"ts\" setup>\nimport {\n arrow as arrowMiddleware,\n flip,\n offset as offsetMiddleware,\n shift,\n autoUpdate,\n useFloating,\n type Placement,\n} from \"@floating-ui/vue\";\nimport { computed, onBeforeUnmount, ref, useId } from \"vue\";\nimport { useTeleportTarget } from \"@ui/composables\";\n\nexport type TooltipPlacement =\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"right-start\"\n | \"right-end\"\n | \"left-start\"\n | \"left-end\";\n\nexport type TooltipVariant = \"default\" | \"dark\" | \"info\";\n\nexport interface Props {\n placement?: TooltipPlacement;\n offset?: {\n crossAxis?: number;\n mainAxis?: number;\n };\n delay?: number;\n arrow?: boolean;\n variant?: TooltipVariant;\n maxWidth?: number | string;\n disabled?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n placement: \"bottom\",\n offset: () => ({\n crossAxis: 0,\n mainAxis: 8,\n }),\n delay: 0,\n arrow: true,\n variant: \"default\",\n maxWidth: 240,\n disabled: false,\n});\n\ndefineSlots<{\n default: (props: any) => any;\n tooltip?: (props: any) => any;\n}>();\n\nconst tooltipId = `vc-tooltip-${useId()}`;\nconst tooltipVisible = ref(false);\nconst tooltipCompRef = ref<HTMLElement | null>(null);\nconst tooltipRef = ref<HTMLElement | null>(null);\nconst arrowRef = ref<HTMLElement | null>(null);\nconst target = ref<HTMLElement | null>(null);\nlet showTimeout: ReturnType<typeof setTimeout> | null = null;\n\nconst ARROW_SIZE = 8;\n\nconst { teleportTarget } = useTeleportTarget();\n\nconst middleware = computed(() => {\n const mw = [\n offsetMiddleware({\n mainAxis: props.offset?.mainAxis ?? 8,\n crossAxis: props.offset?.crossAxis ?? 0,\n }),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ];\n if (props.arrow) {\n mw.push(arrowMiddleware({ element: arrowRef, padding: 4 }));\n }\n return mw;\n});\n\nconst {\n floatingStyles,\n placement: resolvedPlacement,\n middlewareData,\n} = useFloating(tooltipCompRef, tooltipRef, {\n placement: computed(() => props.placement as Placement),\n whileElementsMounted: autoUpdate,\n middleware,\n});\n\nconst resolvedMaxWidth = computed(() => {\n if (typeof props.maxWidth === \"number\") return `${props.maxWidth}px`;\n return props.maxWidth;\n});\n\nconst tooltipStyle = computed(() => ({\n ...floatingStyles.value,\n maxWidth: resolvedMaxWidth.value,\n}));\n\nconst side = computed(() => {\n return resolvedPlacement.value.split(\"-\")[0] as \"top\" | \"right\" | \"bottom\" | \"left\";\n});\n\nconst arrowStyle = computed(() => {\n const data = middlewareData.value.arrow;\n if (!data) return {};\n\n const style: Record<string, string> = {};\n\n if (data.x != null) style.left = `${data.x}px`;\n if (data.y != null) style.top = `${data.y}px`;\n\n // Place on the opposite side, offset by half (rotated square center at edge)\n const staticSide = { top: \"bottom\", right: \"left\", bottom: \"top\", left: \"right\" }[side.value]!;\n style[staticSide] = `${-ARROW_SIZE / 2}px`;\n\n return style;\n});\n\nconst showTooltip = () => {\n if (props.disabled) return;\n if (props.delay > 0) {\n showTimeout = setTimeout(() => {\n tooltipVisible.value = true;\n }, props.delay);\n } else {\n tooltipVisible.value = true;\n }\n};\n\nconst hideTooltip = () => {\n if (showTimeout) {\n clearTimeout(showTimeout);\n showTimeout = null;\n }\n tooltipVisible.value = false;\n};\n\nonBeforeUnmount(() => {\n if (showTimeout) {\n clearTimeout(showTimeout);\n showTimeout = null;\n }\n});\n</script>\n\n<style lang=\"scss\">\n:root {\n --tooltip-bg: var(--additional-50);\n --tooltip-text: var(--neutrals-700);\n --tooltip-dark-bg: var(--neutrals-800);\n --tooltip-dark-text: var(--additional-50);\n --tooltip-info-bg: var(--primary-600);\n --tooltip-info-text: var(--additional-50);\n --tooltip-border-radius: 6px;\n --tooltip-font-size: 12px;\n --tooltip-padding-x: 10px;\n --tooltip-padding-y: 6px;\n}\n\n.vc-tooltip {\n &__trigger {\n @apply tw-inline-flex tw-w-full tw-h-full;\n }\n\n // Wrapper: positioned by floating-ui, holds arrow + body\n &__wrapper {\n @apply tw-absolute;\n z-index: var(--z-critical-tooltip);\n width: max-content;\n pointer-events: none;\n\n // drop-shadow on wrapper traces the composited silhouette (body + visible arrow)\n &--default {\n filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.12));\n }\n\n &--dark {\n filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.25));\n }\n\n &--info {\n filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.15));\n }\n }\n\n // Body: sits ON TOP of arrow (z-index: 1), its background covers arrow's inner half\n &__body {\n @apply tw-relative tw-z-[var(--z-local-above)] tw-leading-snug tw-font-normal;\n border-radius: var(--tooltip-border-radius);\n font-size: var(--tooltip-font-size);\n padding: var(--tooltip-padding-y) var(--tooltip-padding-x);\n\n &--default {\n background-color: var(--tooltip-bg);\n color: var(--tooltip-text);\n }\n\n &--dark {\n background-color: var(--tooltip-dark-bg);\n color: var(--tooltip-dark-text);\n }\n\n &--info {\n background-color: var(--tooltip-info-bg);\n color: var(--tooltip-info-text);\n }\n }\n\n // Arrow: rotated 45° square behind body — only outer half is visible\n &__arrow {\n @apply tw-absolute;\n width: 8px;\n height: 8px;\n transform: rotate(45deg);\n\n &--default {\n background-color: var(--tooltip-bg);\n }\n\n &--dark {\n background-color: var(--tooltip-dark-bg);\n }\n\n &--info {\n background-color: var(--tooltip-info-bg);\n }\n }\n}\n\n// Transition: opacity only (floating-ui uses transform for positioning)\n.vc-tooltip-fade-enter-active {\n transition: opacity 150ms ease-out;\n}\n\n.vc-tooltip-fade-leave-active {\n transition: opacity 100ms ease-in;\n}\n\n.vc-tooltip-fade-enter-from,\n.vc-tooltip-fade-leave-to {\n opacity: 0;\n}\n</style>\n","<template>\n <component\n :is=\"htmlFor ? 'label' : 'div'\"\n class=\"vc-label\"\n :class=\"{\n 'vc-label--error': error,\n }\"\n :for=\"htmlFor || undefined\"\n >\n <div class=\"vc-label__text\">\n <span class=\"vc-label__content\">\n <slot></slot>\n </span>\n <span\n v-if=\"required\"\n class=\"vc-label__required\"\n aria-hidden=\"true\"\n >*</span\n >\n </div>\n <span\n v-if=\"$slots['tooltip']\"\n class=\"vc-label__tooltip\"\n >\n <VcTooltip placement=\"top-start\">\n <VcIcon\n class=\"vc-label__tooltip-icon\"\n :icon=\"tooltipIcon\"\n size=\"s\"\n ></VcIcon>\n <template #tooltip>\n <slot name=\"tooltip\"></slot>\n </template>\n </VcTooltip>\n </span>\n\n <div\n v-if=\"multilanguage\"\n class=\"vc-label__language\"\n >\n {{ currentLanguage }}\n </div>\n </component>\n</template>\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script lang=\"ts\" setup>\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcTooltip } from \"@ui/components/atoms/vc-tooltip\";\n\nexport interface Props {\n /**\n * Shows required field indicator (asterisk)\n */\n required?: boolean;\n /**\n * Icon to use for the tooltip\n */\n tooltipIcon?: string;\n /**\n * Shows language indicator for multilanguage fields\n */\n multilanguage?: boolean;\n /**\n * Current language code to display\n */\n currentLanguage?: string;\n /**\n * Shows the label in error state\n */\n error?: boolean;\n /**\n * HTML `for` attribute — links the label to the input with matching id.\n * When provided, renders as `<label>` instead of `<div>`.\n */\n htmlFor?: string;\n}\n\nwithDefaults(defineProps<Props>(), {\n tooltipIcon: \"lucide-info\",\n});\n\ndefineSlots<{\n default: (props: any) => any;\n tooltip?: (props: any) => any;\n}>();\n</script>\n\n<style lang=\"scss\">\n:root {\n --label-text-color: var(--neutrals-700);\n --label-required-color: var(--danger-500);\n --label-tooltip-color: var(--neutrals-400);\n --label-lang-color: var(--neutrals-500);\n --label-error-color: var(--danger-500);\n}\n\n.vc-label {\n @apply tw-flex tw-flex-row tw-justify-between tw-items-center tw-relative tw-text-[color:var(--label-text-color)];\n\n &__text {\n @apply tw-flex-nowrap tw-font-medium tw-truncate;\n }\n\n &__content {\n @apply tw-truncate tw-text-sm;\n }\n\n &__required {\n @apply tw-text-[color:var(--label-required-color)] tw-ml-0.5;\n }\n\n &__tooltip {\n @apply tw-grow-0 tw-basis-0 tw-ml-1 tw-relative tw-mr-auto;\n }\n\n &__tooltip-icon {\n @apply tw-text-[color:var(--label-tooltip-color)] tw-transition-colors tw-duration-150;\n\n &:hover {\n @apply tw-text-neutrals-600;\n }\n }\n\n &__language {\n @apply tw-text-[color:var(--label-lang-color)] tw-shrink-0 tw-text-xs tw-font-normal tw-bg-neutrals-100 tw-rounded tw-px-1.5 tw-py-0.5;\n }\n\n &--error &__text {\n @apply tw-text-[color:var(--label-error-color)];\n }\n}\n</style>\n","<template>\n <div\n class=\"vc-scrollable-container\"\n role=\"region\"\n :aria-label=\"$t('COMPONENTS.ATOMS.VC_SCROLLABLE_CONTAINER.LABEL')\"\n >\n <div\n class=\"vc-scrollable-container__arrow\"\n :class=\"{ 'vc-scrollable-container__arrow--hidden': !canScrollUp }\"\n aria-hidden=\"true\"\n @pointerenter=\"startScroll('up')\"\n @pointerleave=\"stopScroll\"\n >\n <slot name=\"arrow-up\">\n <VcIcon\n icon=\"lucide-chevron-up\"\n size=\"xs\"\n />\n </slot>\n </div>\n\n <div\n ref=\"viewportRef\"\n class=\"vc-scrollable-container__viewport\"\n tabindex=\"0\"\n @scroll=\"updateScrollState\"\n @keydown.up.prevent=\"scrollByKey('up')\"\n @keydown.down.prevent=\"scrollByKey('down')\"\n >\n <slot />\n </div>\n\n <div\n class=\"vc-scrollable-container__arrow\"\n :class=\"{ 'vc-scrollable-container__arrow--hidden': !canScrollDown }\"\n aria-hidden=\"true\"\n @pointerenter=\"startScroll('down')\"\n @pointerleave=\"stopScroll\"\n >\n <slot name=\"arrow-down\">\n <VcIcon\n icon=\"lucide-chevron-down\"\n size=\"xs\"\n />\n </slot>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from \"vue\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { useScrollArrows, type UseScrollArrowsOptions } from \"@ui/composables\";\n\nconst props = withDefaults(\n defineProps<{\n speed?: number;\n }>(),\n {\n speed: undefined,\n },\n);\n\nconst viewportRef = ref<HTMLElement | null>(null);\n\nconst options: UseScrollArrowsOptions = {};\nif (props.speed !== undefined) {\n options.speed = props.speed;\n}\n\nconst SCROLL_STEP = 40;\n\nconst { canScrollUp, canScrollDown, startScroll, stopScroll, updateScrollState } = useScrollArrows(\n viewportRef,\n options,\n);\n\nfunction scrollByKey(direction: \"up\" | \"down\") {\n if (!viewportRef.value) return;\n const delta = direction === \"up\" ? -SCROLL_STEP : SCROLL_STEP;\n viewportRef.value.scrollBy({ top: delta, behavior: \"smooth\" });\n}\n\ndefineExpose({\n viewportRef,\n updateScrollState,\n});\n</script>\n\n<style lang=\"scss\">\n:root {\n --scroll-arrow-size: 16px;\n --scroll-arrow-color: var(--neutrals-400);\n}\n\n.vc-scrollable-container {\n @apply tw-flex tw-flex-col tw-min-h-0;\n\n &__arrow {\n @apply tw-flex tw-items-center tw-justify-center tw-py-1\n tw-cursor-default tw-shrink-0\n tw-transition-opacity tw-duration-150;\n color: var(--scroll-arrow-color);\n font-size: var(--scroll-arrow-size);\n\n &--hidden {\n @apply tw-opacity-0 tw-pointer-events-none tw-h-0 tw-py-0 tw-overflow-hidden;\n }\n }\n\n &__viewport {\n @apply tw-flex-grow tw-overflow-auto tw-min-h-0;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n}\n</style>\n","import type { IBladeToolbar } from \"@core/types\";\nimport { createBladeScopedRegistry, createPreregistrationBus } from \"@core/services/_internal\";\n\nexport interface IToolbarItem extends IBladeToolbar {\n id: string;\n bladeId?: string;\n priority?: number;\n}\n\nexport interface IToolbarRegistration {\n bladeId: string;\n toolbarItem: IToolbarItem;\n}\n\nexport interface IToolbarService {\n registerToolbarItem: (toolbarItem: IToolbarItem, bladeId: string) => void;\n unregisterToolbarItem: (toolbarItemId: string, bladeId: string) => void;\n getToolbarItems: (bladeId: string) => IToolbarItem[];\n clearBladeToolbarItems: (bladeId: string) => void;\n registeredToolbarItems: IToolbarRegistration[];\n isToolbarItemRegistered: (id: string) => boolean;\n updateToolbarItem: ({\n id,\n bladeId,\n toolbarItem,\n }: {\n id: string;\n bladeId: string;\n toolbarItem: Partial<IToolbarItem>;\n }) => void;\n}\n\nexport const toolbarBus = createPreregistrationBus<IToolbarRegistration, IToolbarService>({\n name: \"toolbar-service\",\n getKey: (reg) => `${reg.bladeId.toLowerCase()}::${reg.toolbarItem.id}`,\n registerIntoService: (service, reg) => service.registerToolbarItem(reg.toolbarItem, reg.bladeId),\n});\n\n/**\n * Registers a toolbar button before the service is initialized.\n */\nexport function registerToolbarItem(toolbarItem: IToolbarItem, bladeId: string): void {\n const normalizedBladeId = bladeId.toLowerCase();\n toolbarBus.preregister({\n bladeId: normalizedBladeId,\n toolbarItem,\n });\n}\n\nexport function createToolbarService(): IToolbarService {\n const bladeRegistry = createBladeScopedRegistry<IToolbarItem, IToolbarRegistration>({\n createRegistration: (bladeId, item) => ({ bladeId, toolbarItem: item }),\n getRegistrationBladeId: (r) => r.bladeId,\n getRegistrationItemId: (r) => r.toolbarItem.id,\n });\n\n const registerToolbarItem = (toolbarItem: IToolbarItem, bladeId: string): void => {\n bladeRegistry.register(toolbarItem, bladeId);\n };\n\n const unregisterToolbarItem = (toolbarItemId: string, bladeId: string): void => {\n bladeRegistry.unregister(toolbarItemId, bladeId);\n };\n\n const getToolbarItems = (bladeId: string): IToolbarItem[] => {\n const normalizedBladeId = bladeId ? bladeId.toLowerCase() : \"\";\n const bladeItems = bladeRegistry.get(normalizedBladeId);\n const globalItems = bladeRegistry.get(\"*\");\n\n const result: IToolbarItem[] = [...bladeItems];\n const existingIds = new Set(result.map((item) => item.id));\n\n globalItems.forEach((item) => {\n if (!existingIds.has(item.id)) {\n result.push(item);\n }\n });\n\n return [...result];\n };\n\n const clearBladeToolbarItems = (bladeId: string): void => {\n bladeRegistry.clear(bladeId);\n };\n\n const updateToolbarItem = ({\n id,\n bladeId,\n toolbarItem,\n }: {\n id: string;\n bladeId: string;\n toolbarItem: Partial<IToolbarItem>;\n }): void => {\n bladeRegistry.update(id, bladeId, toolbarItem);\n };\n\n const service: IToolbarService = {\n registerToolbarItem,\n unregisterToolbarItem,\n getToolbarItems,\n clearBladeToolbarItems,\n registeredToolbarItems: bladeRegistry.registrations,\n isToolbarItemRegistered: (id) => bladeRegistry.isRegistered(id),\n updateToolbarItem,\n };\n\n toolbarBus.replayInto(service);\n\n return service;\n}\n","export const FALLBACK_BLADE_ID = \"fallback-blade-id\";\n\nexport * from \"@core/constants/locale\";\nexport * from \"@core/constants/defaults\";\n","import { inject, computed, getCurrentInstance, onBeforeUnmount } from \"vue\";\nimport { ToolbarServiceKey } from \"@framework/injection-keys\";\nimport { IToolbarItem, IToolbarService, createToolbarService, toolbarBus } from \"@core/services/toolbar-service\";\nimport { FALLBACK_BLADE_ID } from \"@core/constants\";\nimport { BladeDescriptorKey } from \"@core/blade-navigation/types\";\nimport { createServiceRegistry } from \"@core/composables/createServiceRegistry\";\n\n// Global toolbar service (if not provided through provide/inject)\nlet globalToolbarService: IToolbarService | null = null;\n\nexport interface UseToolbarOptions {\n /**\n * Clears all toolbar items for the current blade on component unmount.\n * Enabled by default for backward compatibility.\n */\n autoCleanup?: boolean;\n}\n\nexport interface UseToolbarReturn {\n registerToolbarItem: (toolbarItem: IToolbarItem, targetBladeId?: string) => void;\n unregisterToolbarItem: (toolbarItemId: string, targetBladeId?: string) => void;\n updateToolbarItem: (id: string, toolbarItem: Partial<IToolbarItem>, targetBladeId?: string) => void;\n getToolbarItems: (targetBladeId?: string) => IToolbarItem[];\n clearBladeToolbarItems: (targetBladeId?: string) => void;\n isToolbarItemRegistered: IToolbarService[\"isToolbarItemRegistered\"];\n registeredToolbarItems: IToolbarService[\"registeredToolbarItems\"];\n}\n\nconst registry = createServiceRegistry<IToolbarService>({\n key: ToolbarServiceKey,\n create: createToolbarService,\n bus: toolbarBus,\n name: \"ToolbarService\",\n});\n\nexport function provideToolbarService(): IToolbarService {\n return registry.provide();\n}\n\n/**\n * Composable for working with the toolbar\n * @returns Methods for managing toolbar buttons\n */\nexport function useToolbar(options: UseToolbarOptions = {}): UseToolbarReturn {\n const { autoCleanup = true } = options;\n\n // Try to get the service from dependency injection\n const toolbarService = inject<IToolbarService | null>(ToolbarServiceKey, null);\n\n // If the service is not injected, create a global one\n if (!toolbarService && !globalToolbarService) {\n globalToolbarService = createToolbarService();\n }\n\n const service = toolbarService || globalToolbarService;\n\n if (!service) {\n throw new Error(\"Toolbar service is not available\");\n }\n\n // Get the ID of the current blade\n const descriptor = inject(BladeDescriptorKey, undefined);\n\n const bladeId = computed(() => descriptor?.value?.id ?? FALLBACK_BLADE_ID);\n\n // Functions for working with the toolbar\n /**\n * Registers a toolbar button\n * @param toolbarItem - Toolbar button object\n * @param toolbarItem.id - Unique identifier of the button\n * @param toolbarItem.priority - Button priority (higher - more important, displayed at the beginning). Default is 0.\n */\n const resolveBladeId = (targetBladeId?: string): string => targetBladeId ?? bladeId.value;\n\n const registerToolbarItem = (toolbarItem: IToolbarItem, targetBladeId?: string) => {\n service.registerToolbarItem(toolbarItem, resolveBladeId(targetBladeId));\n };\n\n const unregisterToolbarItem = (toolbarItemId: string, targetBladeId?: string) => {\n service.unregisterToolbarItem(toolbarItemId, resolveBladeId(targetBladeId));\n };\n\n const updateToolbarItem = (id: string, toolbarItem: Partial<IToolbarItem>, targetBladeId?: string) => {\n service.updateToolbarItem({ id, bladeId: resolveBladeId(targetBladeId), toolbarItem });\n };\n\n const getToolbarItems = (targetBladeId?: string) => {\n return service.getToolbarItems(resolveBladeId(targetBladeId));\n };\n\n const clearBladeToolbarItems = (targetBladeId?: string) => {\n service.clearBladeToolbarItems(resolveBladeId(targetBladeId));\n };\n\n // Automatic cleanup when the component is unmounted\n const instance = getCurrentInstance();\n if (instance && autoCleanup) {\n onBeforeUnmount(() => {\n clearBladeToolbarItems();\n });\n }\n\n return {\n registerToolbarItem,\n unregisterToolbarItem,\n updateToolbarItem,\n getToolbarItems,\n clearBladeToolbarItems,\n isToolbarItemRegistered: service.isToolbarItemRegistered,\n registeredToolbarItems: service.registeredToolbarItems,\n };\n}\n","import { Component, ComputedRef, Ref } from \"vue\";\nimport type { BladeDescriptor } from \"@core/blade-navigation/types\";\nimport { cloneDeep } from \"lodash-es\";\nimport { createBladeScopedRegistry, createPreregistrationBus } from \"@core/services/_internal\";\n\nexport type WidgetEventHandler = (...args: unknown[]) => void;\n\nexport interface IWidgetEvents {\n [key: string]: Set<WidgetEventHandler>;\n}\n\nexport interface IExposedWidget {\n id?: string;\n [key: string]: unknown;\n}\n\nexport interface IWidgetScope {\n /** Register trigger contract (onRefresh, onClick, badge) */\n setTrigger: (trigger: IWidgetTrigger) => void;\n}\n\nexport interface IWidgetTrigger {\n /** Lucide icon name for dropdown rendering */\n icon?: string;\n /** Display title (fallback: IWidget.title) */\n title?: string;\n /** Reactive badge value */\n badge?: Ref<number | string> | ComputedRef<number | string>;\n /** Handler called when the widget is clicked in dropdown */\n onClick?: () => void;\n /** Handler called to refresh widget data */\n onRefresh?: () => void | Promise<void>;\n /** Disabled state — static or reactive */\n disabled?: Ref<boolean> | ComputedRef<boolean> | boolean;\n}\n\n/** Fields present only on headless widgets (when `headless` is set on IWidget) */\nexport interface IHeadlessWidgetFields {\n icon: string;\n badge?: Ref<number | string> | ComputedRef<number | string>;\n loading?: Ref<boolean> | ComputedRef<boolean>;\n disabled?: Ref<boolean> | ComputedRef<boolean> | boolean;\n onClick?: () => void;\n onRefresh?: () => void | Promise<void>;\n}\n\nexport interface IWidget {\n id: string;\n title?: string;\n /** @deprecated Use headless widgets via `useBladeWidgets()` or external widgets via `registerExternalWidget()` */\n component?: Component;\n /** @deprecated External widgets inject data via `injectBladeContext()` */\n props?: Record<string, unknown>;\n /** @deprecated External widgets inject data via `injectBladeContext()` */\n events?: Record<string, unknown>;\n isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: BladeDescriptor) => boolean);\n /** @deprecated Use headless widgets via `useBladeWidgets()` instead */\n updateFunctionName?: string;\n trigger?: IWidgetTrigger;\n /** When set, framework renders VcWidget from these fields instead of component */\n headless?: IHeadlessWidgetFields;\n}\n\nexport interface IWidgetRegistration {\n bladeId: string;\n widget: IWidget;\n}\n\nexport interface IExternalWidgetRegistration {\n id: string;\n component: Component;\n targetBlades?: string[];\n isVisible?: boolean | ComputedRef<boolean> | Ref<boolean> | ((blade?: BladeDescriptor) => boolean);\n title?: string;\n /** @deprecated Use headless widgets via `useBladeWidgets()` instead */\n updateFunctionName?: string;\n}\n\nexport interface IWidgetService {\n registerWidget: (widget: IWidget, bladeId: string) => void;\n unregisterWidget: (widgetId: string, bladeId: string) => void;\n getWidgets: (bladeId: string) => IWidget[];\n updateWidget: ({ id, bladeId, widget }: { id: string; bladeId: string; widget: Partial<IWidget> }) => void;\n getExternalWidgetsForBlade: (bladeId: string) => IExternalWidgetRegistration[];\n getAllExternalWidgets: () => IExternalWidgetRegistration[];\n cloneWidget: <T extends IWidget | IExternalWidgetRegistration>(widget: T) => T;\n}\n\n// --- External widgets (module-level, independent of service instances) ---\n\nconst externalWidgets = new Map<string, IExternalWidgetRegistration>();\n\nfunction normalizeTargetBlades(targetBlades?: string[]): string[] | undefined {\n return targetBlades?.map((bladeId) => bladeId.toLowerCase());\n}\n\n/**\n * Registers an external widget for use across different blades.\n */\nexport function registerExternalWidget(widget: IExternalWidgetRegistration): void {\n externalWidgets.set(widget.id, {\n ...widget,\n targetBlades: normalizeTargetBlades(widget.targetBlades),\n });\n}\n\n/**\n * Gets list of external widgets for a specific blade type.\n */\nexport function getExternalWidgetsForBlade(bladeId: string): IExternalWidgetRegistration[] {\n const normalizedBladeId = bladeId.toLowerCase();\n\n return Array.from(externalWidgets.values())\n .filter((widget) => !widget.targetBlades || widget.targetBlades.includes(normalizedBladeId))\n .map((widget) => ({ ...widget, targetBlades: widget.targetBlades ? [...widget.targetBlades] : undefined }));\n}\n\n/**\n * Gets all external widgets.\n */\nexport function getAllExternalWidgets(): IExternalWidgetRegistration[] {\n return Array.from(externalWidgets.values()).map((widget) => ({\n ...widget,\n targetBlades: widget.targetBlades ? [...widget.targetBlades] : undefined,\n }));\n}\n\n/**\n * Deep clones a widget definition to avoid accidental shared mutations.\n */\nexport function cloneWidget<T extends IWidget | IExternalWidgetRegistration>(widget: T): T {\n return cloneDeep(widget);\n}\n\n// --- Preregistration bus ---\n\nexport const widgetBus = createPreregistrationBus<IWidgetRegistration, IWidgetService>({\n name: \"widget-service\",\n getKey: (reg) => `${reg.bladeId.toLowerCase()}::${reg.widget.id}`,\n registerIntoService: (service, reg) => service.registerWidget(reg.widget, reg.bladeId),\n});\n\n/**\n * Registers a widget before the service is initialized.\n */\nexport function registerWidget(widget: IWidget, bladeId: string): void {\n const normalizedBladeId = bladeId.toLowerCase();\n widgetBus.preregister({\n bladeId: normalizedBladeId,\n widget,\n });\n}\n\n// --- Service factory ---\n\nexport function createWidgetService(): IWidgetService {\n const bladeRegistry = createBladeScopedRegistry<IWidget, IWidgetRegistration>({\n createRegistration: (bladeId, item) => ({ bladeId, widget: item }),\n getRegistrationBladeId: (r) => r.bladeId,\n getRegistrationItemId: (r) => r.widget.id,\n });\n\n const getExternalWidgetsForBladeLocal = (bladeId: string): IExternalWidgetRegistration[] => {\n return getExternalWidgetsForBlade(bladeId.toLowerCase());\n };\n\n const service: IWidgetService = {\n registerWidget: (widget, bladeId) => bladeRegistry.register(widget, bladeId),\n unregisterWidget: (widgetId, bladeId) => bladeRegistry.unregister(widgetId, bladeId),\n getWidgets: (bladeId) => bladeRegistry.get(bladeId),\n updateWidget: ({ id, bladeId, widget }) => bladeRegistry.update(id, bladeId, widget),\n getExternalWidgetsForBlade: getExternalWidgetsForBladeLocal,\n getAllExternalWidgets,\n cloneWidget,\n };\n\n widgetBus.replayInto(service);\n\n return service;\n}\n","import { BasicColorSchema, createSharedComposable, useColorMode, useCycleList } from \"@vueuse/core\";\nimport { computed, watchEffect, ref, type Ref } from \"vue\";\nimport * as _ from \"lodash-es\";\nimport { i18n } from \"@core/plugins/i18n\";\nimport { createLogger } from \"@core/utilities\";\n\nconst logger = createLogger(\"use-theme\");\n\nexport interface ThemeDefinition {\n key: string;\n localizationKey?: string;\n}\n\nexport interface DisplayTheme {\n key: string;\n name: string; // localized name\n}\n\nexport interface UseThemeReturn {\n themes: Ref<DisplayTheme[]>;\n currentThemeKey: Ref<string>;\n currentLocalizedName: Ref<string>;\n next: () => void;\n register: (themesToAdd: ThemeDefinition | ThemeDefinition[]) => void;\n unregister: (themeKeysToRemove: string | string[]) => void;\n setTheme: (themeKey: string) => void;\n}\n\n/** @deprecated Use UseThemeReturn instead */\nexport type IUseTheme = UseThemeReturn;\n\n// Initialize with a default \"light\" theme, assuming a convention for its localization key.\nconst _themeRegistry: Ref<ThemeDefinition[]> = ref([\n { key: \"light\", localizationKey: \"CORE.THEMES.LIGHT\" },\n { key: \"dark\", localizationKey: \"CORE.THEMES.DARK\" },\n]);\n\nexport const useTheme = createSharedComposable((): UseThemeReturn => {\n const { t } = i18n.global;\n\n function register(themesToAdd: ThemeDefinition | ThemeDefinition[]) {\n (Array.isArray(themesToAdd) ? themesToAdd : [themesToAdd]).forEach((themeDef) => {\n if (!_themeRegistry.value.some((t) => t.key === themeDef.key)) {\n _themeRegistry.value.push(themeDef);\n }\n });\n }\n\n function unregister(themeKeysToRemove: string | string[]) {\n (Array.isArray(themeKeysToRemove) ? themeKeysToRemove : [themeKeysToRemove]).forEach((keyToRemove) => {\n const index = _themeRegistry.value.findIndex((t) => t.key === keyToRemove);\n if (index >= 0) {\n // Ensure we don't unregister the last theme if it's active, or handle active theme change.\n // For simplicity now, just remove. Consider active theme implications if this is an issue.\n // Especially if 'light' is removed and it's the initial/fallback.\n // However, 'light' is added by default and this function is for custom themes.\n _themeRegistry.value.splice(index, 1);\n }\n });\n }\n\n const themeKeys = computed(() => _themeRegistry.value.map((t) => t.key));\n\n const mode = useColorMode({\n attribute: \"data-theme\",\n emitAuto: true,\n initialValue: \"light\", // Should align with a default theme in _themeRegistry\n modes: {\n // Dynamically build modes from registered theme keys\n ...themeKeys.value.reduce(\n (acc, name) => {\n acc[name] = name; // Maps theme key to itself (e.g., \"ocean\": \"ocean\")\n return acc;\n },\n {} as Record<string, string>,\n ),\n },\n });\n\n const { state, next } = useCycleList(themeKeys, { initialValue: mode });\n\n watchEffect(() => {\n if (state.value) {\n // Ensure state.value is not undefined\n mode.value = state.value as BasicColorSchema; // state.value is a theme key\n }\n });\n\n function setTheme(themeKey: string) {\n if (themeKeys.value.includes(themeKey)) {\n state.value = themeKey;\n } else {\n logger.warn(`Attempted to set an unregistered theme: ${themeKey}`);\n }\n }\n\n const currentLocalizedName = computed(() => {\n const currentDef = _themeRegistry.value.find((t) => t.key === state.value);\n if (currentDef) {\n return currentDef.localizationKey ? t(currentDef.localizationKey) : _.capitalize(currentDef.key);\n }\n // Fallback if current theme key somehow not in registry (should not happen with proper setTheme guard)\n return state.value ? _.capitalize(state.value) : \"\";\n });\n\n return {\n themes: computed(() =>\n _themeRegistry.value.map((themeDef) => ({\n key: themeDef.key,\n name: themeDef.localizationKey ? t(themeDef.localizationKey) : _.capitalize(themeDef.key),\n })),\n ),\n currentThemeKey: state,\n currentLocalizedName,\n next,\n register,\n unregister,\n setTheme,\n };\n});\n","import { shallowReactive, Component } from \"vue\";\nimport { createPreregistrationBus } from \"@core/services/_internal\";\n\nexport interface DashboardWidgetSize {\n width: number;\n height: number;\n}\n\nexport interface DashboardWidgetPosition {\n x: number;\n y: number;\n}\n\nexport interface DashboardWidget {\n id: string;\n name: string;\n component: Component;\n size: DashboardWidgetSize;\n position?: DashboardWidgetPosition;\n permissions?: string[];\n props?: Record<string, unknown>;\n}\n\nexport interface IDashboardService {\n registerWidget: (widget: DashboardWidget) => void;\n getWidgets: () => DashboardWidget[];\n updateWidgetPosition: (widgetId: string, position: DashboardWidgetPosition) => void;\n getLayout: () => ReadonlyMap<string, DashboardWidgetPosition>;\n}\n\nexport interface CreateDashboardServiceOptions {\n hasAccess?: (permissions: string[] | undefined) => boolean;\n}\n\nexport const dashboardBus = createPreregistrationBus<DashboardWidget, IDashboardService>({\n name: \"dashboard-service\",\n getKey: (widget) => widget.id,\n registerIntoService: (service, widget) => service.registerWidget(widget),\n});\n\n/**\n * Registers a widget before the service is initialized.\n */\nexport function registerDashboardWidget(widget: DashboardWidget): void {\n dashboardBus.preregister(widget);\n}\n\nconst createState = () => ({\n widgets: shallowReactive<Map<string, DashboardWidget>>(new Map()),\n layout: shallowReactive<Map<string, DashboardWidgetPosition>>(new Map()),\n});\n\n/**\n * Creates a service for managing dashboard widgets.\n */\nexport function createDashboardService(options: CreateDashboardServiceOptions = {}): IDashboardService {\n const state = createState();\n const hasAccess = options.hasAccess ?? (() => true);\n\n const registerWidget = (widget: DashboardWidget): void => {\n if (state.widgets.has(widget.id)) {\n throw new Error(`Widget with id ${widget.id} already registered`);\n }\n\n state.widgets.set(widget.id, {\n ...widget,\n permissions: widget.permissions ? [...widget.permissions] : undefined,\n position: widget.position ? { ...widget.position } : undefined,\n props: widget.props ? { ...widget.props } : undefined,\n });\n\n if (widget.position) {\n state.layout.set(widget.id, { ...widget.position });\n }\n };\n\n const getWidgets = (): DashboardWidget[] => {\n return Array.from(state.widgets.values())\n .filter((widget) => !widget.permissions || widget.permissions.length === 0 || hasAccess(widget.permissions))\n .map((widget) => ({\n ...widget,\n permissions: widget.permissions ? [...widget.permissions] : undefined,\n position: widget.position ? { ...widget.position } : undefined,\n props: widget.props ? { ...widget.props } : undefined,\n }));\n };\n\n const updateWidgetPosition = (widgetId: string, position: DashboardWidgetPosition): void => {\n if (!state.widgets.has(widgetId)) {\n throw new Error(`Widget with id ${widgetId} not found`);\n }\n\n state.layout.set(widgetId, { ...position });\n };\n\n const getLayout = (): ReadonlyMap<string, DashboardWidgetPosition> => {\n return new Map(state.layout);\n };\n\n const service: IDashboardService = {\n registerWidget,\n getWidgets,\n updateWidgetPosition,\n getLayout,\n };\n\n dashboardBus.replayInto(service);\n\n return service;\n}\n","import {\n createDashboardService,\n IDashboardService,\n registerDashboardWidget,\n dashboardBus,\n} from \"@core/services/dashboard-service\";\nimport { DashboardServiceKey } from \"@framework/injection-keys\";\nimport { usePermissions } from \"@core/composables/usePermissions\";\nimport { createLogger } from \"@core/utilities\";\nimport { createServiceRegistry } from \"@core/composables/createServiceRegistry\";\n\nexport type UseDashboardReturn = IDashboardService;\n\nconst logger = createLogger(\"use-dashboard\");\n\nconst registry = createServiceRegistry<IDashboardService>({\n key: DashboardServiceKey,\n bus: dashboardBus,\n name: \"DashboardService\",\n create: () => {\n let hasAccessResolver: (permissions: string[] | undefined) => boolean = () => true;\n\n try {\n const { hasAccess } = usePermissions();\n hasAccessResolver = (permissions) => hasAccess(permissions);\n } catch (error) {\n logger.warn(\"Permissions composable unavailable, dashboard falls back to allow-all access check\", error);\n }\n\n return createDashboardService({\n hasAccess: hasAccessResolver,\n });\n },\n onMissing: () => logger.error(\"Dashboard service not found\"),\n});\n\nexport function provideDashboardService(): IDashboardService {\n return registry.provide();\n}\n\nexport function useDashboard(): UseDashboardReturn {\n return registry.use();\n}\n\nexport { registerDashboardWidget };\n","import { ComputedRef, markRaw } from \"vue\";\nimport { createGenericItemRegistry, createPreregistrationBus } from \"@core/services/_internal\";\n\nexport interface AppBarWidget {\n id: string;\n order?: number;\n title?: string;\n icon?: import(\"vue\").Component | string;\n component?: import(\"vue\").Component;\n props?: Record<string, unknown>;\n onClick?: () => void;\n slot?: string;\n badge?: boolean | (() => boolean);\n searchTerms?: string[];\n}\n\nexport interface registerAppBarWidgetOptions extends Omit<AppBarWidget, \"id\"> {\n id?: string;\n}\n\nexport interface IAppBarWidgetService {\n register: (options: registerAppBarWidgetOptions) => string;\n unregister: (id: string) => void;\n items: ComputedRef<AppBarWidget[]>;\n}\n\nexport const appBarWidgetBus = createPreregistrationBus<registerAppBarWidgetOptions, IAppBarWidgetService>({\n name: \"app-bar-menu-service\",\n getKey: (item) => item.id || crypto.randomUUID(),\n registerIntoService: (service, item) => service.register(item),\n unregisterFromService: (service, id) => service.unregister(id),\n});\n\n/**\n * Registers an AppBar menu item before the service is initialized\n */\nexport function addAppBarWidget(item: registerAppBarWidgetOptions): void {\n appBarWidgetBus.preregister(item);\n}\n\n/**\n * Creates an AppBar menu service\n * Manages the registration and organization of AppBar menu items\n */\nexport function createAppBarWidgetService(): IAppBarWidgetService {\n return createGenericItemRegistry<AppBarWidget, registerAppBarWidgetOptions>({\n bus: appBarWidgetBus,\n createItem: (options, currentSize) => ({\n id: options.id || \"\",\n order: options.order ?? currentSize,\n title: options.title,\n icon: typeof options.icon === \"object\" ? markRaw(options.icon) : options.icon,\n component: options.component ? markRaw(options.component) : undefined,\n props: options.props,\n onClick: options.onClick,\n slot: options.slot,\n badge: options.badge,\n searchTerms: options.searchTerms,\n }),\n getId: (options) => options.id || \"\",\n });\n}\n","import { ComputedRef, markRaw } from \"vue\";\nimport { createGenericItemRegistry, createPreregistrationBus } from \"@core/services/_internal\";\n\nexport interface ISettingsMenuItem {\n id: string;\n order?: number;\n group?: string;\n component: import(\"vue\").Component;\n props?: Record<string, unknown>;\n}\n\nexport interface RegisterSettingsMenuItemOptions extends Omit<ISettingsMenuItem, \"id\"> {\n id?: string;\n}\n\nexport interface ISettingsMenuService {\n register: (options: RegisterSettingsMenuItemOptions) => string;\n unregister: (id: string) => void;\n items: ComputedRef<ISettingsMenuItem[]>;\n}\n\nexport const settingsMenuBus = createPreregistrationBus<RegisterSettingsMenuItemOptions, ISettingsMenuService>({\n name: \"settings-menu-service\",\n getKey: (item) => item.id || crypto.randomUUID(),\n registerIntoService: (service, item) => service.register(item),\n unregisterFromService: (service, id) => service.unregister(id),\n});\n\n/**\n * Registers a settings menu item before the service is initialized\n */\nexport function addSettingsMenuItem(item: RegisterSettingsMenuItemOptions): void {\n settingsMenuBus.preregister(item);\n}\n\n/**\n * Creates a settings menu service\n * Manages the registration and organization of settings menu items\n */\nexport function createSettingsMenuService(): ISettingsMenuService {\n return createGenericItemRegistry<ISettingsMenuItem, RegisterSettingsMenuItemOptions>({\n bus: settingsMenuBus,\n createItem: (options, currentSize) => ({\n id: options.id || \"\",\n order: options.order ?? currentSize,\n group: options.group,\n component: markRaw(options.component),\n props: options.props,\n }),\n getId: (options) => options.id || \"\",\n });\n}\n","import { createSettingsMenuService, ISettingsMenuService, settingsMenuBus } from \"@core/services/settings-menu-service\";\nimport { SettingsMenuServiceKey } from \"@framework/injection-keys\";\nimport { createLogger } from \"@core/utilities\";\nimport { createServiceRegistry } from \"@core/composables/createServiceRegistry\";\n\nexport type UseSettingsMenuReturn = ISettingsMenuService;\n\nconst logger = createLogger(\"use-settings-menu\");\n\nconst registry = createServiceRegistry<ISettingsMenuService>({\n key: SettingsMenuServiceKey,\n create: createSettingsMenuService,\n bus: settingsMenuBus,\n name: \"SettingsMenuService\",\n onMissing: () => logger.error(\"Settings menu service not found\"),\n});\n\nexport function provideSettingsMenu(): ISettingsMenuService {\n return registry.provide();\n}\n\nexport function useSettingsMenu(): UseSettingsMenuReturn {\n return registry.use();\n}\n","<template>\n <!-- Skeleton mode -->\n <div\n v-if=\"bladeLoading\"\n class=\"vc-date-picker vc-date-picker--skeleton\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n\n <!-- Normal mode -->\n <div\n v-else\n class=\"vc-date-picker\"\n :class=\"[\n {\n 'vc-date-picker--error': invalid,\n 'vc-date-picker--disabled': resolvedDisabled,\n 'vc-date-picker--focused': isFocused,\n },\n ]\"\n >\n <!-- Label -->\n <VcLabel\n v-if=\"label\"\n :id=\"labelId\"\n class=\"vc-date-picker__label\"\n :required=\"required\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :error=\"invalid\"\n >\n <span>{{ label }}</span>\n <template\n v-if=\"tooltip\"\n #tooltip\n >{{ tooltip }}</template\n >\n </VcLabel>\n\n <div\n class=\"vc-date-picker__field-wrapper\"\n :class=\"{\n 'vc-date-picker__field-wrapper--default': size === 'default',\n 'vc-date-picker__field-wrapper--small': size === 'small',\n }\"\n >\n <div class=\"vc-date-picker__field-container\">\n <div class=\"vc-date-picker__field\">\n <VueDatePicker\n v-model=\"internalValue\"\n :placeholder=\"\n placeholder ||\n (type === 'datetime-local'\n ? $t('COMPONENTS.MOLECULES.VC_INPUT.DATE_TIME_PLACEHOLDER')\n : $t('COMPONENTS.MOLECULES.VC_INPUT.DATE_PLACEHOLDER'))\n \"\n :disabled=\"resolvedDisabled\"\n :name=\"name\"\n :autofocus=\"autofocus\"\n :max-date=\"maxDate\"\n time-picker-inline\n :enable-time-picker=\"type === 'datetime-local'\"\n :format=\"formatDateWithLocale\"\n :locale=\"locale\"\n :start-time=\"{ hours: 0, minutes: 0 }\"\n :clearable=\"false\"\n :config=\"{ closeOnAutoApply: false }\"\n auto-apply\n :teleport-center=\"isMobile\"\n :is24=\"isBrowserLocale24h\"\n v-bind=\"resolvedDatePickerOptions\"\n :teleport=\"isDesktop ? 'body' : undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-required=\"ariaRequired\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-labelledby=\"label ? labelId : undefined\"\n class=\"vc-date-picker__input\"\n tabindex=\"0\"\n @focus=\"handleFocus\"\n @closed=\"handleBlur\"\n @range-start=\"handleRangeStart\"\n @range-end=\"handleRangeEnd\"\n @tooltip-open=\"handleFocus\"\n @tooltip-close=\"handleBlur\"\n />\n\n <button\n v-if=\"clearable && internalValue && !disabled\"\n type=\"button\"\n class=\"vc-date-picker__clear\"\n :aria-label=\"$t('COMPONENTS.MOLECULES.VC_DATE_PICKER.CLEAR')\"\n @click=\"onReset\"\n >\n <VcIcon\n size=\"xs\"\n icon=\"lucide-x\"\n ></VcIcon>\n </button>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"vc-date-picker__loading\"\n >\n <VcIcon\n icon=\"lucide-loader-2\"\n class=\"vc-date-picker__loading-icon\"\n size=\"m\"\n ></VcIcon>\n </div>\n </div>\n </div>\n\n <Transition\n name=\"slide-up\"\n mode=\"out-in\"\n >\n <div v-if=\"invalid && errorMessage\">\n <VcHint\n :id=\"errorId\"\n class=\"vc-date-picker__hint-error\"\n :error=\"true\"\n >{{ errorMessage }}</VcHint\n >\n </div>\n <div v-else>\n <VcHint\n v-if=\"hint\"\n :id=\"hintId\"\n class=\"vc-date-picker__desc\"\n >{{ hint }}</VcHint\n >\n </div>\n </Transition>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script lang=\"ts\" setup>\nimport { computed, ref, watch } from \"vue\";\nimport { useResponsive } from \"@framework/core/composables/useResponsive\";\nimport { useFormField } from \"@ui/composables/useFormField\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport { VcLabel } from \"@ui/components/atoms/vc-label\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcHint } from \"@ui/components/atoms/vc-hint\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\nimport VueDatePicker, { VueDatePickerProps, ModelValue } from \"@vuepic/vue-datepicker\";\nimport \"@vuepic/vue-datepicker/dist/main.css\";\nimport type { ITextFieldProps } from \"@ui/types\";\n\nexport interface VcDatePickerProps extends ITextFieldProps {\n modelValue?: ModelValue;\n type?: \"date\" | \"datetime-local\";\n datePickerOptions?: VueDatePickerProps;\n}\n\nexport interface VcDatePickerEmits {\n (event: \"update:modelValue\", value: ModelValue | null | undefined): void;\n (event: \"blur\", value: Event): void;\n (event: \"focus\"): void;\n}\n\nconst props = withDefaults(defineProps<VcDatePickerProps>(), {\n type: \"date\",\n name: \"Field\",\n size: \"default\",\n});\n\nconst emit = defineEmits<VcDatePickerEmits>();\n\nconst bladeLoading = useBladeLoading();\nconst { isMobile, isDesktop } = useResponsive();\nconst { labelId, errorId, hintId, invalid, resolvedDisabled, ariaRequired, ariaDescribedBy } = useFormField(props);\n\n// State\nconst isFocused = ref(false);\nconst locale = window.navigator.language;\nconst internalValue = ref<ModelValue | undefined>(props.modelValue);\nconst pendingRangeStart = ref<Date | null>(null);\n\nconst maxDate = computed(() => (props.type === \"date\" && \"9999-12-31\") || undefined);\n\nconst isBrowserLocale24h = (() => {\n const hr = new Intl.DateTimeFormat(locale, { hour: \"numeric\" }).format();\n return Number.isInteger(Number(hr));\n})();\n\n// Build a date-fns format string matching the browser locale for text input parsing.\n// When `format` prop is a function, VueDatePicker cannot reverse-parse typed text,\n// so we derive a parseable pattern from Intl.DateTimeFormat parts.\nconst textInputParseFormat = computed(() => {\n const includeTime = props.type === \"datetime-local\";\n const parts = new Intl.DateTimeFormat(locale, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n ...(includeTime ? { hour: \"2-digit\", minute: \"2-digit\", hour12: !isBrowserLocale24h } : {}),\n }).formatToParts(new Date(2000, 0, 15, 13, 30));\n\n const tokenMap: Record<string, string> = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n hour: isBrowserLocale24h ? \"HH\" : \"hh\",\n minute: \"mm\",\n dayPeriod: \"aa\",\n };\n\n return parts.map((p) => tokenMap[p.type] ?? p.value).join(\"\");\n});\n\n// When textInput is enabled via datePickerOptions, inject the parse format automatically.\n// Consumer-provided textInput options (if object) take precedence.\nconst resolvedDatePickerOptions = computed(() => {\n if (!props.datePickerOptions?.textInput) return props.datePickerOptions;\n\n const opts = { ...props.datePickerOptions };\n const userTextInput = typeof opts.textInput === \"object\" ? opts.textInput : {};\n opts.textInput = {\n format: textInputParseFormat.value,\n rangeSeparator: \" - \",\n ...userTextInput,\n } as (typeof opts)[\"textInput\"];\n\n return opts;\n});\n\nconst formatDateWithLocale = (date: Date | Date[]) => {\n const options: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n };\n\n if (props.type === \"datetime-local\") {\n options.hour = \"numeric\";\n options.minute = \"numeric\";\n options.hour12 = !isBrowserLocale24h;\n }\n\n const formatSingleDate = (d: Date) => new Intl.DateTimeFormat(locale, options).format(d);\n\n if (Array.isArray(date)) {\n // Use \" - \" separator matching textInput.rangeSeparator so the text input\n // parser can correctly split start/end. Show separator even for partial\n // ranges ([date, null]) so the user edits the start part, not appends end.\n return date.map((d) => (d != null ? formatSingleDate(d) : \"\")).join(\" - \");\n } else {\n return formatSingleDate(date);\n }\n};\n\n// Sync external modelValue → internal\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (internalValue.value !== newVal) {\n internalValue.value = newVal;\n }\n },\n);\n\n// Sync internal → emit (with guard to prevent watch loop)\nwatch(internalValue, (newVal, oldVal) => {\n if (newVal !== oldVal && newVal !== props.modelValue) {\n pendingRangeStart.value = null;\n emit(\"update:modelValue\", newVal);\n }\n});\n\nfunction onReset() {\n internalValue.value = null;\n emit(\"update:modelValue\", null);\n}\n\nfunction handleRangeStart(date: Date) {\n pendingRangeStart.value = date;\n}\n\nfunction handleRangeEnd() {\n pendingRangeStart.value = null;\n}\n\nfunction handleBlur(e: Event) {\n // Commit partial range: user selected start date but closed picker without selecting end\n if (pendingRangeStart.value != null) {\n internalValue.value = [pendingRangeStart.value, null] as ModelValue;\n pendingRangeStart.value = null;\n }\n isFocused.value = false;\n emit(\"blur\", e);\n}\n\nfunction handleFocus() {\n isFocused.value = true;\n emit(\"focus\");\n}\n</script>\n\n<style lang=\"scss\">\n/* CSS variables are also defined in vc-input; duplicated here for standalone use */\n:root {\n --input-height: 36px;\n --input-height-small: 32px;\n --input-border-radius: 6px;\n --input-border-color: var(--neutrals-300);\n --input-padding: 12px;\n --input-background-color: var(--additional-50);\n --input-placeholder-color: var(--neutrals-400);\n --input-clear-color: var(--neutrals-400);\n --input-clear-color-hover: var(--neutrals-600);\n --input-text-color: var(--neutrals-800);\n --input-disabled-text-color: var(--neutrals-500);\n --input-disabled-bg-color: var(--neutrals-200);\n --input-text-color-error: var(--danger-500);\n --input-border-color-error: var(--danger-500);\n --input-border-color-focus: var(--primary-500);\n --input-focus-ring-color: var(--primary-100);\n --input-error-ring-color: var(--danger-100);\n}\n\n.vc-date-picker {\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &__label {\n @apply tw-mb-2;\n }\n\n &__field-wrapper {\n @apply tw-px-[var(--input-padding)] tw-relative tw-flex tw-flex-nowrap tw-w-full tw-min-w-0 tw-box-border tw-grow\n tw-border tw-border-solid tw-border-[color:var(--input-border-color)]\n tw-rounded-[var(--input-border-radius)] tw-bg-[color:var(--input-background-color)]\n tw-shadow-sm tw-transition-[color,box-shadow] tw-duration-150 tw-ease-in-out\n tw-outline-none;\n\n &--default {\n @apply tw-h-[var(--input-height)];\n }\n\n &--small {\n @apply tw-h-[var(--input-height-small)];\n }\n }\n\n &__field-container {\n @apply tw-flex tw-flex-nowrap tw-flex-auto tw-h-full;\n }\n\n &__field {\n @apply tw-w-auto tw-min-w-0 tw-max-w-full tw-relative tw-flex tw-flex-row tw-flex-auto tw-flex-nowrap [height:inherit];\n }\n\n &__clear {\n @apply tw-cursor-pointer tw-pl-3 tw-text-[color:var(--input-clear-color)]\n hover:tw-text-[color:var(--input-clear-color-hover)] tw-flex tw-items-center\n tw-border-none tw-bg-transparent tw-outline-none tw-p-0;\n }\n\n &__loading {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pl-3;\n }\n\n &__loading-icon {\n @apply tw-animate-spin tw-text-[color:var(--input-clear-color)];\n }\n\n &__hint-error {\n @apply tw-mt-1 [--hint-error-color:var(--input-text-color-error)];\n }\n\n &__desc {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm tw-mt-1;\n }\n\n &--error &__field-wrapper {\n @apply tw-border tw-border-solid tw-border-[color:var(--input-border-color-error)]\n tw-ring-[3px] tw-ring-[color:var(--input-error-ring-color)];\n }\n\n &--disabled &__field-wrapper {\n @apply tw-opacity-50;\n }\n\n &--disabled &__field-wrapper,\n &--disabled &__field {\n @apply tw-cursor-not-allowed tw-pointer-events-none;\n }\n\n &--focused &__field-wrapper {\n @apply tw-border-[color:var(--input-border-color-focus)]\n tw-ring-[3px] tw-ring-[color:var(--input-focus-ring-color)]\n tw-outline-none;\n }\n}\n\n/* VueDatePicker theme integration - shared with VcInput */\n.dp__main {\n @apply tw-flex tw-items-center tw-h-full;\n\n & > div {\n @apply tw-w-full tw-h-full tw-flex tw-items-center;\n }\n\n .vc-app--mobile & {\n & > div {\n @apply tw-w-auto tw-h-auto tw-flex-auto tw-items-center;\n }\n }\n}\n\n.dp__pm_am_button {\n background: var(--dp-primary-color) !important;\n color: var(--dp-primary-text-color) !important;\n border: none !important;\n padding: var(--dp-common-padding) !important;\n border-radius: var(--dp-border-radius) !important;\n cursor: pointer !important;\n}\n\n.dp__input_icons {\n padding: 6px 0 !important;\n}\n\n.dp__input_wrap {\n @apply tw-w-full tw-h-full;\n box-sizing: border-box !important;\n}\n\n.dp__input {\n @apply tw-font-jakarta tw-border-none tw-outline-none tw-h-full tw-min-w-0 tw-w-full tw-box-border tw-grow tw-text-sm tw-text-[color:var(--input-text-color)] !important;\n\n --dp-input-padding: 0;\n\n border: none !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n line-height: 1.25rem !important;\n\n &::-ms-reveal,\n &::-ms-clear {\n @apply tw-hidden;\n }\n}\n\ninput.dp__input {\n background-color: transparent !important;\n height: auto;\n}\n\ninput.dp__input.dp__input_icon_pad {\n padding-inline-start: 28px !important;\n}\n\ninput.dp__input::placeholder {\n color: var(--input-placeholder-color) !important;\n opacity: 1;\n}\n\ninput.dp__input:disabled {\n background-color: transparent;\n}\n\n.dp__menu_inner {\n @apply tw-font-jakarta tw-text-[14px] !important;\n}\n\n.dp--tp-wrap {\n min-width: var(--dp-menu-min-width);\n max-width: 100% !important;\n}\n\n.dp__theme_light {\n --dp-background-color: var(--additional-50);\n --dp-text-color: var(--neutrals-800);\n --dp-hover-color: var(--neutrals-200);\n --dp-hover-text-color: var(--neutrals-800);\n --dp-hover-icon-color: var(--neutrals-400);\n --dp-primary-color: var(--primary-500);\n --dp-primary-disabled-color: var(--secondary-400);\n --dp-primary-text-color: var(--neutrals-50);\n --dp-secondary-color: var(--secondary-300);\n --dp-border-color: var(--neutrals-300);\n --dp-menu-border-color: var(--neutrals-300);\n --dp-border-color-hover: var(--neutrals-400);\n --dp-border-color-focus: var(--neutrals-400);\n --dp-disabled-color: var(--input-disabled-bg-color);\n --dp-disabled-color-text: var(--input-disabled-text-color);\n --dp-scroll-bar-background: var(--neutrals-200);\n --dp-scroll-bar-color: var(--neutrals-400);\n --dp-success-color: var(--success-500);\n --dp-success-color-disabled: var(--success-200);\n --dp-icon-color: var(--neutrals-400);\n --dp-danger-color: var(--danger-500);\n --dp-marker-color: var(--danger-500);\n --dp-tooltip-color: var(--additional-50);\n --dp-disabled-color-text: var(--neutrals-400);\n --dp-highlight-color: rgba(25, 118, 210, 0.1);\n --dp-range-between-dates-background-color: var(--dp-hover-color);\n --dp-range-between-dates-text-color: var(--dp-hover-text-color);\n --dp-range-between-border-color: var(--dp-hover-color);\n}\n</style>\n","<template>\n <div\n v-if=\"bladeLoading\"\n class=\"vc-color-input vc-color-input--skeleton\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n <div\n v-else\n class=\"vc-color-input\"\n :class=\"[\n {\n 'vc-color-input--error': invalid,\n 'vc-color-input--disabled': resolvedDisabled,\n 'vc-color-input--focused': isFocused,\n },\n ]\"\n >\n <!-- Label -->\n <VcLabel\n v-if=\"label\"\n :id=\"labelId\"\n :html-for=\"inputId\"\n class=\"vc-color-input__label\"\n :required=\"required\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :error=\"invalid\"\n >\n <span>{{ label }}</span>\n <template\n v-if=\"tooltip\"\n #tooltip\n >{{ tooltip }}</template\n >\n </VcLabel>\n\n <div\n class=\"vc-color-input__field-wrapper\"\n :class=\"{\n 'vc-color-input__field-wrapper--default': size === 'default',\n 'vc-color-input__field-wrapper--small': size === 'small',\n }\"\n >\n <div class=\"vc-color-input__field-container\">\n <div class=\"vc-color-input__field\">\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n v-model=\"textValue\"\n :placeholder=\"placeholder\"\n type=\"text\"\n :disabled=\"resolvedDisabled\"\n :name=\"name\"\n :autofocus=\"autofocus\"\n :aria-invalid=\"invalid || undefined\"\n :aria-required=\"ariaRequired\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-labelledby=\"label ? labelId : undefined\"\n class=\"vc-color-input__input\"\n tabindex=\"0\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n @input=\"onTextInput\"\n />\n\n <!-- Color picker swatch -->\n <div class=\"vc-color-input__color-container\">\n <button\n type=\"button\"\n class=\"vc-color-input__color-square\"\n :style=\"{ backgroundColor: colorValue || '#ffffff' }\"\n :aria-label=\"`Pick color${colorValue ? ': ' + colorValue : ''}`\"\n @click=\"openColorPicker\"\n ></button>\n <input\n ref=\"colorPickerRef\"\n type=\"color\"\n :value=\"colorValue\"\n class=\"vc-color-input__color-picker-hidden\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n @change=\"handleColorPickerChange\"\n />\n </div>\n\n <button\n v-if=\"clearable && textValue && !disabled\"\n type=\"button\"\n class=\"vc-color-input__clear\"\n :aria-label=\"$t('COMPONENTS.MOLECULES.VC_COLOR_INPUT.CLEAR')\"\n @click=\"onReset\"\n >\n <VcIcon\n size=\"xs\"\n icon=\"lucide-x\"\n ></VcIcon>\n </button>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"vc-color-input__loading\"\n >\n <VcIcon\n icon=\"lucide-loader-2\"\n class=\"vc-color-input__loading-icon\"\n size=\"m\"\n ></VcIcon>\n </div>\n </div>\n </div>\n\n <Transition\n name=\"slide-up\"\n mode=\"out-in\"\n >\n <div v-if=\"invalid && errorMessage\">\n <VcHint\n :id=\"errorId\"\n class=\"vc-color-input__hint-error\"\n :error=\"true\"\n >{{ errorMessage }}</VcHint\n >\n </div>\n <div v-else>\n <VcHint\n v-if=\"hint\"\n :id=\"hintId\"\n class=\"vc-color-input__desc\"\n >{{ hint }}</VcHint\n >\n </div>\n </Transition>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script lang=\"ts\" setup>\nimport { ref, watch, nextTick } from \"vue\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\n\nconst bladeLoading = useBladeLoading();\nimport { useFormField } from \"@ui/composables/useFormField\";\nimport { VcLabel } from \"@ui/components/atoms/vc-label\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcHint } from \"@ui/components/atoms/vc-hint\";\nimport { convertColorNameToHex, isValidHexColor, normalizeHexColor } from \"@core/utilities\";\nimport type { ITextFieldProps } from \"@ui/types\";\n\nexport interface VcColorInputProps extends ITextFieldProps {\n modelValue?: string | null;\n}\n\nexport interface VcColorInputEmits {\n (event: \"update:modelValue\", value: string | null): void;\n (event: \"blur\", value: Event): void;\n (event: \"focus\"): void;\n}\n\nconst props = withDefaults(defineProps<VcColorInputProps>(), {\n name: \"Field\",\n size: \"default\",\n});\n\nconst emit = defineEmits<VcColorInputEmits>();\n\nconst {\n fieldId: inputId,\n labelId,\n errorId,\n hintId,\n invalid,\n resolvedDisabled,\n ariaRequired,\n ariaDescribedBy,\n} = useFormField(props);\n\n// State\nconst isFocused = ref(false);\nconst isSyncing = ref(false);\nconst inputRef = ref<HTMLInputElement>();\nconst colorPickerRef = ref<HTMLInputElement>();\nconst textValue = ref(props.modelValue ?? \"\");\nconst colorValue = ref(\"\");\n\n// Initialize color value from modelValue\nfunction syncColorFromText(value: string) {\n if (!value || typeof value !== \"string\") {\n colorValue.value = \"\";\n return;\n }\n\n const trimmed = value.trim();\n\n if (isValidHexColor(trimmed)) {\n colorValue.value = normalizeHexColor(trimmed);\n return;\n }\n\n const hexColor = convertColorNameToHex(trimmed);\n if (hexColor) {\n colorValue.value = hexColor;\n }\n}\n\n// Sync external modelValue → internal (with guard to prevent loop)\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (isSyncing.value) return;\n isSyncing.value = true;\n textValue.value = newVal ?? \"\";\n nextTick(() => {\n syncColorFromText(newVal ?? \"\");\n isSyncing.value = false;\n });\n },\n { immediate: true },\n);\n\n// Sync colorValue → hidden picker\nwatch(colorValue, (newColorValue) => {\n if (newColorValue && colorPickerRef.value) {\n colorPickerRef.value.value = newColorValue;\n }\n});\n\nfunction onTextInput() {\n if (isSyncing.value) return;\n isSyncing.value = true;\n emit(\"update:modelValue\", textValue.value || null);\n nextTick(() => {\n syncColorFromText(textValue.value);\n isSyncing.value = false;\n });\n}\n\nfunction handleColorPickerChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (target?.value) {\n const hexColor = normalizeHexColor(target.value);\n colorValue.value = hexColor;\n textValue.value = hexColor;\n emit(\"update:modelValue\", hexColor);\n }\n}\n\nfunction openColorPicker() {\n colorPickerRef.value?.click();\n}\n\nfunction onReset() {\n textValue.value = \"\";\n colorValue.value = \"\";\n emit(\"update:modelValue\", null);\n}\n\nfunction handleBlur(e: Event) {\n isFocused.value = false;\n emit(\"blur\", e);\n}\n\nfunction handleFocus() {\n isFocused.value = true;\n emit(\"focus\");\n}\n\nfunction focus() {\n inputRef.value?.focus();\n}\n\ndefineExpose({ focus });\n</script>\n\n<style lang=\"scss\">\n/* CSS variables are also defined in vc-input; duplicated here for standalone use */\n:root {\n --input-height: 36px;\n --input-height-small: 32px;\n --input-border-radius: 6px;\n --input-border-color: var(--neutrals-300);\n --input-padding: 12px;\n --input-background-color: var(--additional-50);\n --input-placeholder-color: var(--neutrals-400);\n --input-clear-color: var(--neutrals-400);\n --input-clear-color-hover: var(--neutrals-600);\n --input-text-color: var(--neutrals-800);\n --input-disabled-text-color: var(--neutrals-500);\n --input-disabled-bg-color: var(--neutrals-200);\n --input-text-color-error: var(--danger-500);\n --input-border-color-error: var(--danger-500);\n --input-border-color-focus: var(--primary-500);\n --input-focus-ring-color: var(--primary-100);\n --input-error-ring-color: var(--danger-100);\n\n --color-input-swatch-size: 20px;\n --color-input-swatch-border-radius: 4px;\n --color-input-swatch-border-color: var(--neutrals-300);\n --color-input-swatch-border-color-hover: var(--neutrals-400);\n}\n\n.vc-color-input {\n &__label {\n @apply tw-mb-2;\n }\n\n &__field-wrapper {\n @apply tw-px-[var(--input-padding)] tw-relative tw-flex tw-flex-nowrap tw-w-full tw-min-w-0 tw-box-border tw-grow\n tw-border tw-border-solid tw-border-[color:var(--input-border-color)]\n tw-rounded-[var(--input-border-radius)] tw-bg-[color:var(--input-background-color)]\n tw-shadow-sm tw-transition-[color,box-shadow] tw-duration-150 tw-ease-in-out\n tw-outline-none;\n\n &--default {\n @apply tw-h-[var(--input-height)];\n }\n\n &--small {\n @apply tw-h-[var(--input-height-small)];\n }\n }\n\n &__field-container {\n @apply tw-flex tw-flex-nowrap tw-flex-auto tw-h-full;\n }\n\n &__field {\n @apply tw-w-auto tw-min-w-0 tw-max-w-full tw-relative tw-flex tw-flex-row tw-flex-auto tw-flex-nowrap [height:inherit];\n\n input.vc-color-input__input {\n @apply tw-border-none tw-outline-none tw-h-full tw-min-w-0 tw-w-full tw-box-border tw-grow tw-text-sm tw-text-[color:var(--input-text-color)];\n background: transparent;\n\n &::placeholder {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm;\n }\n }\n }\n\n &__color-container {\n @apply tw-relative tw-flex tw-items-center;\n }\n\n &__color-square {\n @apply tw-cursor-pointer tw-flex tw-items-center tw-justify-center tw-ml-2\n tw-border tw-border-solid tw-bg-transparent tw-p-0 tw-outline-none;\n width: var(--color-input-swatch-size);\n height: var(--color-input-swatch-size);\n border-radius: var(--color-input-swatch-border-radius);\n border-color: var(--color-input-swatch-border-color);\n\n &:hover {\n border-color: var(--color-input-swatch-border-color-hover);\n }\n\n &:focus-visible {\n @apply tw-ring-[3px] tw-ring-[color:var(--input-focus-ring-color)] tw-outline-none;\n }\n }\n\n &__color-picker-hidden {\n @apply tw-opacity-0 tw-absolute tw-pointer-events-none tw-w-0 tw-h-0;\n }\n\n &__clear {\n @apply tw-cursor-pointer tw-pl-3 tw-text-[color:var(--input-clear-color)]\n hover:tw-text-[color:var(--input-clear-color-hover)] tw-flex tw-items-center\n tw-border-none tw-bg-transparent tw-outline-none tw-p-0;\n }\n\n &__loading {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pl-3;\n }\n\n &__loading-icon {\n @apply tw-animate-spin tw-text-[color:var(--input-clear-color)];\n }\n\n &__hint-error {\n @apply tw-mt-1 [--hint-error-color:var(--input-text-color-error)];\n }\n\n &__desc {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm tw-mt-1;\n }\n\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &--error &__field-wrapper {\n @apply tw-border tw-border-solid tw-border-[color:var(--input-border-color-error)]\n tw-ring-[3px] tw-ring-[color:var(--input-error-ring-color)];\n }\n\n &--error &__field input {\n @apply tw-text-[color:var(--input-text-color-error)];\n }\n\n &--disabled &__field-wrapper {\n @apply tw-opacity-50;\n }\n\n &--disabled &__field-wrapper,\n &--disabled &__field,\n &--disabled input {\n @apply tw-cursor-not-allowed tw-pointer-events-none;\n }\n\n &--focused &__field-wrapper {\n @apply tw-border-[color:var(--input-border-color-focus)]\n tw-ring-[3px] tw-ring-[color:var(--input-focus-ring-color)]\n tw-outline-none;\n }\n}\n</style>\n","<template>\n <!-- Skeleton mode -->\n <div\n v-if=\"bladeLoading\"\n v-bind=\"rootAttrs\"\n class=\"vc-input vc-input--skeleton\"\n :class=\"$attrs.class\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n\n <!-- Backward compat delegation: date types -->\n <VcDatePicker\n v-else-if=\"type === 'date' || type === 'datetime-local'\"\n v-bind=\"attrs\"\n :model-value=\"modelValue\"\n :type=\"type\"\n :date-picker-options=\"datePickerOptions\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :error=\"error\"\n :error-message=\"errorMessage\"\n :required=\"required\"\n :clearable=\"clearable\"\n :loading=\"loading\"\n :autofocus=\"autofocus\"\n :size=\"size\"\n :tooltip=\"tooltip\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :name=\"name\"\n @update:model-value=\"(v) => emit('update:modelValue', (v ?? null) as Date | string | null)\"\n @blur=\"(v: Event) => emit('blur', v)\"\n @focus=\"emit('focus')\"\n />\n <!-- Backward compat delegation: color type -->\n <VcColorInput\n v-else-if=\"type === 'color'\"\n v-bind=\"attrs\"\n :model-value=\"(modelValue as string) ?? null\"\n :label=\"label\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :error=\"error\"\n :error-message=\"errorMessage\"\n :required=\"required\"\n :clearable=\"clearable\"\n :loading=\"loading\"\n :autofocus=\"autofocus\"\n :size=\"size\"\n :tooltip=\"tooltip\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :name=\"name\"\n @update:model-value=\"(v: string | null) => emit('update:modelValue', v)\"\n @blur=\"(v: Event) => emit('blur', v)\"\n @focus=\"emit('focus')\"\n />\n\n <!-- Clean text input -->\n <div\n v-else\n v-bind=\"rootAttrs\"\n class=\"vc-input\"\n :class=\"[\n $attrs.class,\n `vc-input--${type}`,\n {\n 'vc-input--clearable': clearable,\n 'vc-input--error': invalid,\n 'vc-input--disabled': resolvedDisabled,\n 'vc-input--focused': isFocused,\n },\n ]\"\n >\n <!-- Input label -->\n <VcLabel\n v-if=\"label\"\n :id=\"labelId\"\n :html-for=\"inputId\"\n class=\"vc-input__label\"\n :required=\"required\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :error=\"invalid\"\n >\n <span>{{ label }}</span>\n <template\n v-if=\"tooltip\"\n #tooltip\n >{{ tooltip }}</template\n >\n </VcLabel>\n\n <div class=\"vc-input__container\">\n <div\n v-if=\"$slots['prepend']\"\n class=\"vc-input__prepend\"\n >\n <slot\n name=\"prepend\"\n :focus=\"focus\"\n ></slot>\n </div>\n\n <div\n class=\"vc-input__field-wrapper\"\n :class=\"{\n 'vc-input__field-wrapper--default': size === 'default',\n 'vc-input__field-wrapper--small': size === 'small',\n }\"\n >\n <div class=\"vc-input__field-container\">\n <div\n v-if=\"$slots['prepend-inner']\"\n class=\"vc-input__prepend-inner\"\n >\n <slot\n name=\"prepend-inner\"\n :focus=\"focus\"\n ></slot>\n </div>\n\n <div class=\"vc-input__field\">\n <div\n v-if=\"prefix\"\n class=\"vc-input__prefix\"\n >\n {{ prefix }}\n </div>\n\n <slot\n name=\"control\"\n :editable=\"resolvedDisabled\"\n :focused=\"autofocus\"\n :model-value=\"handleValue\"\n :emit-value=\"emitValue\"\n :placeholder=\"placeholder\"\n >\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n v-model=\"handleValue\"\n :placeholder=\"placeholder\"\n :type=\"internalTypeComputed\"\n :disabled=\"resolvedDisabled\"\n :name=\"resolvedName\"\n :maxlength=\"maxlength\"\n :autofocus=\"autofocus\"\n :aria-invalid=\"invalid || undefined\"\n :aria-required=\"ariaRequired\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-labelledby=\"label ? labelId : undefined\"\n class=\"vc-input__input\"\n tabindex=\"0\"\n @keydown=\"onKeyDown\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n />\n </slot>\n\n <div\n v-if=\"suffix\"\n class=\"vc-input__suffix\"\n >\n {{ suffix }}\n </div>\n\n <button\n v-if=\"clearable && mutatedModel && !resolvedDisabled && type !== 'password'\"\n type=\"button\"\n class=\"vc-input__clear\"\n :aria-label=\"$t('COMPONENTS.CONTROLS.CLEAR')\"\n @click=\"onReset\"\n >\n <VcIcon\n size=\"xs\"\n icon=\"lucide-x\"\n ></VcIcon>\n </button>\n\n <button\n v-if=\"type === 'password'\"\n type=\"button\"\n class=\"vc-input__showhide\"\n :aria-label=\"internalType === 'password' ? 'Show password' : 'Hide password'\"\n @click=\"internalType = internalType === 'password' ? 'text' : 'password'\"\n >\n <VcIcon\n size=\"s\"\n :icon=\"internalType === 'password' ? 'lucide-eye-off' : 'lucide-eye'\"\n ></VcIcon>\n </button>\n </div>\n\n <div\n v-if=\"$slots['append-inner']\"\n class=\"vc-input__append-inner\"\n >\n <slot\n name=\"append-inner\"\n :focus=\"focus\"\n ></slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"vc-input__loading\"\n >\n <VcIcon\n icon=\"lucide-loader-2\"\n class=\"vc-input__loading-icon\"\n size=\"m\"\n ></VcIcon>\n </div>\n </div>\n </div>\n\n <div\n v-if=\"$slots['append']\"\n class=\"vc-input__append\"\n >\n <slot\n name=\"append\"\n :focus=\"focus\"\n ></slot>\n </div>\n </div>\n\n <Transition\n name=\"slide-up\"\n mode=\"out-in\"\n >\n <div v-if=\"invalid && errorMessage\">\n <slot name=\"error\">\n <VcHint\n :id=\"errorId\"\n class=\"vc-input__hint-error\"\n :error=\"true\"\n >{{ errorMessage }}</VcHint\n >\n </slot>\n </div>\n <div v-else>\n <slot name=\"hint\">\n <VcHint\n v-if=\"hint\"\n :id=\"hintId\"\n class=\"vc-input__desc\"\n >{{ hint }}</VcHint\n >\n </slot>\n </div>\n </Transition>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, ref, unref, useAttrs, watch, type VNode } from \"vue\";\nimport { VcLabel } from \"@ui/components/atoms/vc-label\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcHint } from \"@ui/components/atoms/vc-hint\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\nimport { VcDatePicker } from \"@ui/components/molecules/vc-date-picker\";\nimport { VcColorInput } from \"@ui/components/molecules/vc-color-input\";\nimport { useFormField } from \"@ui/composables/useFormField\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport type { VueDatePickerProps } from \"@vuepic/vue-datepicker\";\nimport type { ITextFieldProps } from \"@ui/types\";\n\nexport interface Props extends ITextFieldProps {\n /**\n * Model of the component; Use with a listener for 'update:model-value' event OR use v-model directive\n */\n modelValue?: string | number | Date | null;\n /**\n * Input type\n * Default value: text\n */\n type?:\n | \"text\"\n | \"password\"\n | \"email\"\n | \"tel\"\n | \"url\"\n | \"time\"\n | \"color\"\n | \"number\"\n | \"integer\"\n | \"date\"\n | \"datetime-local\";\n /**\n * Prefix\n */\n prefix?: string;\n /**\n * Suffix\n */\n suffix?: string;\n /**\n * Debounce amount (in milliseconds) when updating model\n */\n debounce?: string | number;\n /**\n * Specify a max length of model\n * Default value: 1024\n */\n maxlength?: string | number;\n /**\n * The step attribute is a number that specifies the granularity that the value must adhere to.\n */\n step?: string;\n /**\n * VueDatePicker options\n *\n * Used only when type is 'date' or 'datetime-local'\n *\n * @see https://vue3datepicker.com/\n */\n datePickerOptions?: VueDatePickerProps;\n}\n\nexport interface Emits {\n /**\n * Emitted when the component needs to change the model; Is also used by v-model\n * Type of value depends on input type:\n * - string inputs: string | null\n * - number inputs: number | null\n * - date inputs: Date\n */\n (event: \"update:modelValue\", value: string | number | Date | null | undefined): void;\n (event: \"blur\", value: Event): void;\n (event: \"focus\"): void;\n}\n\ndefineOptions({\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n type: \"text\",\n name: \"Field\",\n maxlength: \"1024\",\n step: \"1\",\n size: \"default\",\n});\n\nconst attrs = useAttrs();\nconst rootAttrs = computed(() => {\n const { class: _class, ...rest } = attrs;\n return rest;\n});\n\nconst emit = defineEmits<Emits>();\nconst bladeLoading = useBladeLoading();\n\ndefineSlots<{\n /**\n * Slot for controls\n * @param scope\n */\n control: (scope: {\n /**\n * Field is editable\n */\n editable: boolean | undefined;\n /**\n * Field has focus\n */\n focused: boolean | undefined;\n /**\n * Field's value - type depends on input type\n */\n modelValue: string | number | Date | null;\n /**\n * Function that emits an @input event in the context of the field\n * @param value Value to be emitted - type depends on input type\n */\n emitValue: (value: string | number | Date | null) => void;\n /**\n * Field placeholder text\n */\n placeholder: string | undefined;\n }) => VNode[];\n /**\n * Prepend outer field\n */\n prepend: (props: { focus: () => void }) => VNode[];\n /**\n * Prepend inner field\n */\n \"prepend-inner\": (props: { focus: () => void }) => VNode[];\n /**\n * Append to inner field\n */\n \"append-inner\": (props: { focus: () => void }) => VNode[];\n /**\n * Append outer field\n */\n append: (props: { focus: () => void }) => VNode[];\n /**\n * Slot for errors\n */\n error: (props: Record<string, never>) => VNode[];\n /**\n * Slot for hint text\n */\n hint: (props: Record<string, never>) => VNode[];\n}>();\n\nconst {\n fieldId: inputId,\n labelId,\n errorId,\n hintId,\n invalid,\n resolvedDisabled,\n resolvedName,\n ariaRequired,\n ariaDescribedBy,\n} = useFormField(props);\n\nlet emitTimer: NodeJS.Timeout;\nlet emitValueFn;\nconst temp = ref();\nconst inputRef = ref();\nconst internalType = ref(unref(props.type));\nconst isFocused = ref(false);\nconst mutatedModel = ref();\n\nconst internalTypeComputed = computed({\n get() {\n if (internalType.value === \"integer\") {\n return \"number\";\n }\n\n return internalType.value;\n },\n set(value) {\n internalType.value = value;\n },\n});\n\nconst rawModel = computed(() => unref(props.modelValue));\nconst handleValue = computed({\n get() {\n return props.type === \"integer\" || props.type === \"number\" ? (isNaN(temp.value) ? \"\" : temp.value) : temp.value;\n },\n set(value) {\n if (props.type === \"number\" || props.type === \"integer\") {\n if (value < 0) {\n temp.value = Math.abs(value);\n } else {\n temp.value = value;\n }\n } else {\n temp.value = value;\n }\n\n onInput(temp.value);\n },\n});\n\nwatch(\n rawModel,\n (newVal) => {\n if (props.type === \"number\" && newVal !== null) {\n mutatedModel.value = parseFloat(newVal as string);\n } else if (props.type === \"integer\" && newVal !== null) {\n mutatedModel.value = Math.trunc(newVal as number);\n } else {\n mutatedModel.value = newVal;\n }\n\n if (temp.value !== mutatedModel.value) {\n temp.value = mutatedModel.value;\n }\n },\n { immediate: true },\n);\n\nfunction onKeyDown(e: KeyboardEvent) {\n const allowedKeys = [\"Backspace\", \"Delete\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"];\n const keypressed = e.key;\n\n if (props.type === \"number\" || props.type === \"integer\") {\n if (keypressed === \"-\" || keypressed === \"e\" || keypressed === \"+\") {\n e.preventDefault();\n }\n }\n if (props.type === \"integer\") {\n if (!/^\\d$/.test(keypressed) && !allowedKeys.includes(keypressed)) {\n e.preventDefault();\n return;\n }\n }\n}\n\nfunction onInput(value: string | number | Date | null) {\n emitValue(value);\n}\n\nfunction emitValue(val: string | number | Date | null) {\n emitValueFn = () => {\n if (mutatedModel.value !== val) {\n let value;\n if (props.type === \"number\" && val !== null && val !== undefined) {\n value = val !== \"\" ? parseFloat(val as string) : null;\n } else if (props.type === \"integer\" && val !== null && val !== undefined) {\n value = val !== \"\" ? Math.trunc(parseInt(val as string)) : null;\n } else {\n value = val;\n }\n\n emit(\"update:modelValue\", value);\n }\n emitValueFn = undefined;\n };\n\n if (props.debounce !== undefined) {\n clearTimeout(emitTimer);\n emitTimer = setTimeout(emitValueFn, +props.debounce);\n } else {\n emitValueFn();\n }\n}\n\nfunction onReset() {\n temp.value = null;\n emit(\"update:modelValue\", null);\n}\n\nfunction handleBlur(e: Event) {\n isFocused.value = false;\n emit(\"blur\", e);\n}\n\nfunction focus() {\n inputRef.value?.focus();\n}\n\nfunction handleFocus() {\n isFocused.value = true;\n emit(\"focus\");\n}\n</script>\n\n<style lang=\"scss\">\n:root {\n --input-height: 36px;\n --input-height-small: 32px;\n --input-border-radius: 6px;\n --input-border-color: var(--neutrals-300);\n\n --input-padding: 12px;\n\n --input-background-color: var(--additional-50);\n --input-placeholder-color: var(--neutrals-400);\n --input-clear-color: var(--neutrals-400);\n --input-clear-color-hover: var(--neutrals-600);\n --input-text-color: var(--neutrals-800);\n\n // Disabled\n --input-disabled-text-color: var(--neutrals-500);\n --input-disabled-bg-color: var(--neutrals-200);\n\n // Error\n --input-text-color-error: var(--danger-500);\n --input-border-color-error: var(--danger-500);\n\n // Focus\n --input-border-color-focus: var(--primary-500);\n\n // Ring colors\n --input-focus-ring-color: var(--primary-100);\n --input-error-ring-color: var(--danger-100);\n}\n\n.vc-input {\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &__label {\n @apply tw-mb-2;\n }\n\n &__container {\n @apply tw-flex tw-flex-nowrap tw-items-start;\n }\n\n &__prepend,\n &__append {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pr-3 tw-pl-3;\n }\n\n &__field-wrapper {\n @apply tw-px-[var(--input-padding)] tw-relative tw-flex tw-flex-nowrap tw-w-full tw-min-w-0 tw-box-border tw-grow\n tw-border tw-border-solid tw-border-[color:var(--input-border-color)]\n tw-rounded-[var(--input-border-radius)] tw-bg-[color:var(--input-background-color)]\n tw-shadow-sm tw-transition-[color,box-shadow] tw-duration-150 tw-ease-in-out\n tw-outline-none;\n\n &--default {\n @apply tw-h-[var(--input-height)];\n }\n\n &--small {\n @apply tw-h-[var(--input-height-small)];\n }\n }\n\n &__field-container {\n @apply tw-flex tw-flex-nowrap tw-flex-auto tw-h-full;\n }\n\n &__prepend-inner,\n &__append-inner {\n @apply tw-flex tw-items-center tw-flex-nowrap;\n }\n\n &__append-inner {\n @apply tw-pl-3;\n }\n\n &__prepend-inner {\n @apply tw-pr-3;\n }\n\n &__field {\n @apply tw-flex tw-flex-row tw-flex-auto tw-w-full tw-min-w-0;\n }\n\n &__prefix,\n &__suffix {\n @apply tw-flex tw-items-center tw-flex-wrap tw-pointer-events-none;\n }\n\n &__prefix {\n @apply tw-pr-3;\n }\n\n &__suffix {\n @apply tw-pl-3;\n }\n\n &__clear,\n &__showhide {\n @apply tw-cursor-pointer tw-pl-3;\n }\n\n &__clear {\n @apply tw-border-none tw-bg-transparent tw-outline-none tw-p-0 tw-cursor-pointer\n tw-text-[color:var(--input-clear-color)] hover:tw-text-[color:var(--input-clear-color-hover)] tw-flex tw-items-center;\n }\n\n &__showhide {\n @apply tw-border-none tw-bg-transparent tw-outline-none tw-p-0 tw-cursor-pointer\n tw-text-[color:var(--input-clear-color)] hover:tw-text-[color:var(--input-clear-color-hover)] tw-flex tw-items-center;\n }\n\n &__loading {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pl-3;\n }\n\n &__loading-icon {\n @apply tw-animate-spin tw-text-[color:var(--input-clear-color)];\n }\n\n &__input {\n background: transparent;\n &:-webkit-autofill,\n &:-webkit-autofill:focus {\n transition:\n background-color 600000s 0s,\n color 600000s 0s;\n }\n &[data-autocompleted] {\n background-color: transparent !important;\n }\n }\n\n &__field {\n @apply tw-w-auto tw-min-w-0 tw-max-w-full tw-relative tw-flex tw-flex-row tw-flex-auto tw-flex-nowrap [height:inherit];\n input {\n @apply tw-border-none tw-outline-none tw-h-full tw-min-w-0 tw-w-full tw-box-border tw-grow tw-text-sm tw-text-[color:var(--input-text-color)] tw-text-ellipsis;\n\n &::-webkit-input-placeholder {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm;\n }\n\n &::-moz-placeholder {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm;\n }\n\n &::-ms-placeholder {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm;\n }\n\n &::placeholder {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm;\n }\n\n &::-ms-reveal,\n &::-ms-clear {\n @apply tw-hidden;\n }\n }\n }\n\n &__hint-error {\n @apply tw-mt-1 [--hint-color:var(--input-text-color-error)];\n }\n\n &__desc {\n @apply tw-text-[color:var(--input-placeholder-color)] tw-text-sm tw-mt-1;\n }\n\n &--error &__field-wrapper {\n @apply tw-border tw-border-solid tw-border-[color:var(--input-border-color-error)]\n tw-ring-[3px] tw-ring-[color:var(--input-error-ring-color)];\n }\n\n &--error &__field input {\n @apply tw-text-[color:var(--input-text-color-error)];\n }\n\n &--disabled input {\n @apply tw-text-[color:var(--input-disabled-text-color)] tw-pointer-events-none;\n }\n\n &--disabled &__field-wrapper {\n @apply tw-opacity-50;\n }\n\n &--disabled &__field-wrapper,\n &--disabled &__field,\n &--disabled input {\n @apply tw-cursor-not-allowed tw-pointer-events-none;\n }\n\n &--focused &__field-wrapper {\n @apply tw-border-[color:var(--input-border-color-focus)]\n tw-ring-[3px] tw-ring-[color:var(--input-focus-ring-color)]\n tw-outline-none;\n }\n\n /* Respond to aria-invalid on child input (future-proof for form systems) */\n &__field-wrapper:has(input[aria-invalid=\"true\"]) {\n @apply tw-border-[color:var(--input-border-color-error)]\n tw-ring-[3px] tw-ring-[color:var(--input-error-ring-color)];\n }\n}\n</style>\n","import { Extension } from \"@tiptap/core\";\r\nimport \"@tiptap/extension-text-style\";\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n fontSize: {\r\n setFontSize: (fontSize: string) => ReturnType;\r\n unsetFontSize: () => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const FontSize = Extension.create({\r\n name: \"fontSize\",\r\n\r\n addOptions() {\r\n return {\r\n types: [\"textStyle\"],\r\n };\r\n },\r\n\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: (element) => element.style.fontSize?.replace(/['\"]+/g, \"\"),\r\n renderHTML: (attributes) => {\r\n if (!attributes.fontSize) {\r\n return {};\r\n }\r\n\r\n return {\r\n style: `font-size: ${attributes.fontSize}`,\r\n };\r\n },\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setFontSize:\r\n (fontSize: string) =>\r\n ({ chain }) => {\r\n return chain().setMark(\"textStyle\", { fontSize }).run();\r\n },\r\n unsetFontSize:\r\n () =>\r\n ({ chain }) => {\r\n return chain().setMark(\"textStyle\", { fontSize: null }).run();\r\n },\r\n };\r\n },\r\n});\r\n","import { onMounted, onBeforeUnmount, ref } from \"vue\";\n\nexport interface UseKeyboardNavigationOptions {\n containerSelector?: string;\n itemSelector?: string;\n onEnter?: (element: HTMLElement) => void;\n onEscape?: () => void;\n loop?: boolean;\n}\n\nexport interface UseKeyboardNavigationReturn {\n initKeyboardNavigation: (el: HTMLElement) => void;\n cleanupKeyboardNavigation: () => void;\n focusNextElement: () => void;\n focusPreviousElement: () => void;\n focusFirstElement: () => void;\n focusLastElement: () => void;\n setFocusedIndex: (index: number) => void;\n getFocusedIndex: () => number;\n}\n\n/**\n * Hook for implementing standard keyboard navigation inside components\n * @param options Options for configuring navigation\n * @returns Object with methods for managing focus\n */\nexport function useKeyboardNavigation(options: UseKeyboardNavigationOptions = {}): UseKeyboardNavigationReturn {\n const {\n containerSelector = '[role=\"menu\"]',\n itemSelector = '[tabindex=\"0\"]',\n onEnter,\n onEscape,\n loop = true,\n } = options;\n\n const container = ref<HTMLElement | null>(null);\n const focusedItemIndex = ref(-1);\n\n /**\n * Validate and reset focused index if it's out of bounds\n */\n const validateFocusedIndex = (elements: HTMLElement[]) => {\n if (focusedItemIndex.value >= elements.length || focusedItemIndex.value < 0) {\n focusedItemIndex.value = elements.length > 0 ? 0 : -1;\n }\n };\n\n /**\n * Handler for keydown events for navigation\n */\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!container.value) return;\n\n const focusableElements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n\n if (!focusableElements.length) return;\n\n // Validate focused index before processing any navigation\n validateFocusedIndex(focusableElements);\n\n switch (event.key) {\n case \"Tab\":\n // Standard tabulation between elements\n handleTabNavigation(event, focusableElements);\n break;\n case \"ArrowDown\":\n // Navigation forward\n event.preventDefault();\n focusNextElement(focusableElements);\n break;\n case \"ArrowUp\":\n // Navigation backward\n event.preventDefault();\n focusPreviousElement(focusableElements);\n break;\n case \"Enter\":\n case \" \":\n // Selection of the current element\n if (focusedItemIndex.value >= 0 && focusedItemIndex.value < focusableElements.length) {\n const currentElement = focusableElements[focusedItemIndex.value];\n if (currentElement) {\n event.preventDefault();\n if (onEnter) {\n onEnter(currentElement);\n } else if (typeof currentElement.click === \"function\") {\n currentElement.click();\n }\n }\n }\n break;\n case \"Escape\":\n // Closing the menu or cancellation\n if (onEscape) {\n event.preventDefault();\n onEscape();\n }\n break;\n }\n };\n\n /**\n * Handling standard tabulation\n */\n const handleTabNavigation = (event: KeyboardEvent, elements: HTMLElement[]) => {\n if (event.shiftKey) {\n // Shift+Tab - backward\n focusPreviousElement(elements);\n } else {\n // Tab - forward\n focusNextElement(elements);\n }\n };\n\n /**\n * Focus on the next element\n */\n const focusNextElement = (elements: HTMLElement[]) => {\n if (!elements.length) return;\n\n validateFocusedIndex(elements);\n\n if (focusedItemIndex.value < elements.length - 1) {\n focusedItemIndex.value++;\n } else if (loop) {\n focusedItemIndex.value = 0;\n } else {\n // If loop is false and we're at the last element, stay at the last element\n return;\n }\n\n const elementToFocus = elements[focusedItemIndex.value];\n if (elementToFocus && typeof elementToFocus.focus === \"function\") {\n elementToFocus.focus();\n }\n };\n\n /**\n * Focus on the previous element\n */\n const focusPreviousElement = (elements: HTMLElement[]) => {\n if (!elements.length) return;\n\n validateFocusedIndex(elements);\n\n if (focusedItemIndex.value > 0) {\n focusedItemIndex.value--;\n } else if (loop) {\n focusedItemIndex.value = elements.length - 1;\n } else {\n // If loop is false and we're at the first element, stay at the first element\n return;\n }\n\n const elementToFocus = elements[focusedItemIndex.value];\n if (elementToFocus && typeof elementToFocus.focus === \"function\") {\n elementToFocus.focus();\n }\n };\n\n /**\n * Focus on the first element\n */\n const focusFirstElement = (elements: HTMLElement[]) => {\n if (!elements.length) return;\n focusedItemIndex.value = 0;\n const elementToFocus = elements[0];\n if (elementToFocus && typeof elementToFocus.focus === \"function\") {\n elementToFocus.focus();\n }\n };\n\n /**\n * Focus on the last element\n */\n const focusLastElement = (elements: HTMLElement[]) => {\n if (!elements.length) return;\n focusedItemIndex.value = elements.length - 1;\n const elementToFocus = elements[elements.length - 1];\n if (elementToFocus && typeof elementToFocus.focus === \"function\") {\n elementToFocus.focus();\n }\n };\n\n /**\n * Initialization and event processing\n */\n const initKeyboardNavigation = (el: HTMLElement) => {\n // Clean up previous listener to avoid double-registration\n // (onMounted may have auto-attached to a global containerSelector match)\n if (container.value) {\n container.value.removeEventListener(\"keydown\", handleKeyDown);\n }\n container.value = el;\n el.addEventListener(\"keydown\", handleKeyDown);\n };\n\n /**\n * Cancelling event processing\n */\n const cleanupKeyboardNavigation = () => {\n if (container.value) {\n container.value.removeEventListener(\"keydown\", handleKeyDown);\n container.value = null;\n }\n };\n\n onMounted(() => {\n if (typeof document !== \"undefined\" && containerSelector) {\n const el = document.querySelector(containerSelector) as HTMLElement;\n if (el) {\n initKeyboardNavigation(el);\n }\n }\n });\n\n onBeforeUnmount(() => {\n cleanupKeyboardNavigation();\n });\n\n return {\n initKeyboardNavigation,\n cleanupKeyboardNavigation,\n focusNextElement: () => {\n if (container.value) {\n const elements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n focusNextElement(elements);\n }\n },\n focusPreviousElement: () => {\n if (container.value) {\n const elements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n focusPreviousElement(elements);\n }\n },\n focusFirstElement: () => {\n if (container.value) {\n const elements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n focusFirstElement(elements);\n }\n },\n focusLastElement: () => {\n if (container.value) {\n const elements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n focusLastElement(elements);\n }\n },\n setFocusedIndex: (index: number) => {\n if (container.value) {\n const elements = Array.from(container.value.querySelectorAll(itemSelector)) as HTMLElement[];\n if (index >= 0 && index < elements.length) {\n focusedItemIndex.value = index;\n }\n }\n },\n getFocusedIndex: () => focusedItemIndex.value,\n };\n}\n","import { computed, ComputedRef } from \"vue\";\r\nimport { isEqual } from \"lodash-es\";\r\n\r\nexport type OptionProp<T> = ((option: T) => string) | string | undefined;\r\n\r\ninterface UseSelectValueMappingOptions<Option> {\r\n optionValue: () => OptionProp<Option>;\r\n optionLabel: () => OptionProp<Option>;\r\n}\r\n\r\nfunction getPropValueFn<Option>(propValue: OptionProp<Option>, defaultVal: OptionProp<Option>) {\r\n const val = propValue !== undefined ? propValue : defaultVal;\r\n\r\n if (typeof val === \"function\") {\r\n return val;\r\n } else {\r\n return (opt: Option) => {\r\n // Support for primitive types (string, number, etc.)\r\n if (opt === null || typeof opt !== \"object\") {\r\n return opt;\r\n }\r\n\r\n if (val && val in (opt as Record<string, unknown>)) {\r\n return (opt as Record<string, unknown>)[val];\r\n } else {\r\n return opt;\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function useSelectValueMapping<Option>(options: UseSelectValueMappingOptions<Option>) {\r\n const getOptionValue = computed(() => getPropValueFn(options.optionValue(), \"id\")) as ComputedRef<\r\n (opt: Option) => any\r\n >;\r\n\r\n const getOptionLabel = computed(() => getPropValueFn(options.optionLabel(), \"title\")) as ComputedRef<\r\n (opt: Option) => any\r\n >;\r\n\r\n function getOption(value: Option, valueCache: Option[], defaultValues: Option[], optionsList: Option[]) {\r\n const fn = (opt: Option) => isEqual(getOptionValue.value(opt), value);\r\n return defaultValues.find(fn) || optionsList.find(fn) || valueCache.find(fn) || value;\r\n }\r\n\r\n function getEmittingOptionValue(opt: Option) {\r\n return getOptionLabel.value(opt);\r\n }\r\n\r\n function fieldValueIsFilled(val: Option[]) {\r\n return val !== undefined && val !== null && (\"\" + val).length > 0;\r\n }\r\n\r\n return {\r\n getOptionValue,\r\n getOptionLabel,\r\n getOption,\r\n getEmittingOptionValue,\r\n fieldValueIsFilled,\r\n };\r\n}\r\n","import { ref, onMounted, onUnmounted } from \"vue\";\r\n\r\nexport function useSelectVisibility() {\r\n const selectRootRef = ref<HTMLDivElement | null>(null);\r\n const isSelectVisible = ref(false);\r\n\r\n let rootVisibilityObserver: IntersectionObserver | null = null;\r\n let fallbackTimerId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n function checkVisibilityFallback() {\r\n if (selectRootRef.value && !isSelectVisible.value) {\r\n const rect = selectRootRef.value.getBoundingClientRect();\r\n const isVisible =\r\n rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;\r\n if (isVisible) {\r\n isSelectVisible.value = true;\r\n }\r\n }\r\n }\r\n\r\n function ensureVisibility() {\r\n if (!isSelectVisible.value && selectRootRef.value) {\r\n const rect = selectRootRef.value.getBoundingClientRect();\r\n const isVisible =\r\n rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;\r\n if (isVisible) {\r\n isSelectVisible.value = true;\r\n }\r\n }\r\n }\r\n\r\n onMounted(() => {\r\n if (selectRootRef.value) {\r\n rootVisibilityObserver = new IntersectionObserver(\r\n ([entry]) => {\r\n isSelectVisible.value = entry.isIntersecting;\r\n },\r\n { threshold: 0.1 },\r\n );\r\n rootVisibilityObserver.observe(selectRootRef.value);\r\n\r\n // Fallback for iframe: check visibility after a delay\r\n fallbackTimerId = setTimeout(checkVisibilityFallback, 100);\r\n }\r\n });\r\n\r\n onUnmounted(() => {\r\n if (fallbackTimerId !== null) {\r\n clearTimeout(fallbackTimerId);\r\n fallbackTimerId = null;\r\n }\r\n if (rootVisibilityObserver && selectRootRef.value) {\r\n rootVisibilityObserver.unobserve(selectRootRef.value);\r\n }\r\n if (rootVisibilityObserver) {\r\n rootVisibilityObserver.disconnect();\r\n }\r\n });\r\n\r\n return {\r\n selectRootRef,\r\n isSelectVisible,\r\n ensureVisibility,\r\n };\r\n}\r\n","import { ref, computed, type Ref, watch } from \"vue\";\nimport { offset as uiOffset, flip, shift, type Middleware, type Placement } from \"@floating-ui/vue\";\nimport { useFloatingPosition } from \"@ui/composables\";\n\ntype FloatingInstanceType = ReturnType<typeof useFloatingPosition> & {\n middlewareData: Ref<{\n sameWidth?: {\n width?: string;\n };\n }>;\n};\n\ninterface UseSelectDropdownOptions {\n placement: string;\n outline: () => boolean;\n isSelectVisible: Ref<boolean>;\n selectRootRef: Ref<HTMLElement | null>;\n disabled: () => boolean;\n ensureVisibility: () => void;\n}\n\nexport function useSelectDropdown(options: UseSelectDropdownOptions) {\n const isOpened = ref(false);\n const isFocused = ref(false);\n const dropdownToggleRef = ref<HTMLElement | null>(null);\n const dropdownRef = ref<HTMLElement | null>(null);\n\n function sameWidth(): Middleware {\n return {\n name: \"sameWidth\",\n fn({ rects }) {\n return {\n data: {\n width: options.outline() ? `${rects.reference.width}px` : \"max-content\",\n },\n };\n },\n };\n }\n\n const popper = useFloatingPosition(dropdownToggleRef, dropdownRef, {\n placement: computed(() => options.placement as Placement),\n middleware: computed(() => [\n flip({ fallbackPlacements: [\"top\", \"bottom\"] }),\n shift({ mainAxis: false }),\n sameWidth(),\n uiOffset({ mainAxis: 4 }),\n ]),\n }) as FloatingInstanceType;\n\n const dropdownStyle = computed(() => {\n return {\n top: `${popper.y.value ?? 0}px`,\n left: `${popper.x.value ?? 0}px`,\n width: popper.middlewareData.value.sameWidth?.width,\n };\n });\n\n watch(\n () => popper.isPositioned.value,\n (newVal) => {\n if (newVal) {\n popper.update();\n }\n },\n );\n\n function toggleDropdown() {\n if (options.disabled()) return;\n\n // Ensure isSelectVisible is true when opening dropdown (fallback for iframe)\n if (!isOpened.value && !options.isSelectVisible.value) {\n options.ensureVisibility();\n }\n\n isOpened.value = !isOpened.value;\n }\n\n return {\n isOpened,\n isFocused,\n dropdownToggleRef,\n dropdownRef,\n popper,\n dropdownStyle,\n toggleDropdown,\n };\n}\n","import { ref, computed, type Ref, type ComputedRef, watch } from \"vue\";\r\nimport { isEqual } from \"lodash-es\";\r\n\r\ninterface UseSelectDataSourceOptions<T> {\r\n options: () => ((...args: any[]) => Promise<any>) | T[];\r\n getOptionValue: ComputedRef<(opt: T) => any>;\r\n getOptionLabel: ComputedRef<(opt: T) => any>;\r\n isSelectVisible: Ref<boolean>;\r\n debounce: () => number | string;\r\n emit: {\r\n search: (val: string) => void;\r\n };\r\n}\r\n\r\nexport function useSelectDataSource<T>(opts: UseSelectDataSourceOptions<T>) {\r\n // --- Internal state ---\r\n const cachedItems = ref<T[]>([]) as Ref<T[]>;\r\n const searchResults = ref<T[] | null>(null) as Ref<T[] | null>;\r\n const totalCount = ref(0);\r\n const loading = ref(false);\r\n const searchLoading = ref(false);\r\n const filterString = ref<string | undefined>();\r\n const resolvedDefaults = ref<T[]>([]) as Ref<T[]>;\r\n const defaultOptionLoading = ref(false);\r\n const resolveCache = new Map<string, T>();\r\n let isLoaded = false;\r\n\r\n // --- Debounce state ---\r\n let debounceTimer: ReturnType<typeof setTimeout> | undefined;\r\n\r\n // --- Computed ---\r\n const displayItems = computed<T[]>(() => {\r\n return searchResults.value ?? cachedItems.value;\r\n });\r\n\r\n const hasMore = computed(() => {\r\n return cachedItems.value.length < totalCount.value;\r\n });\r\n\r\n // --- Helper: populate resolveCache from items ---\r\n function populateResolveCache(items: T[]) {\r\n for (const item of items) {\r\n const key = String(opts.getOptionValue.value(item));\r\n resolveCache.set(key, item);\r\n }\r\n }\r\n\r\n // --- Actions ---\r\n\r\n async function open(): Promise<void> {\r\n if (isLoaded) {\r\n return; // use cache — even if result was empty\r\n }\r\n\r\n const optionsSource = opts.options();\r\n\r\n if (typeof optionsSource === \"function\") {\r\n try {\r\n loading.value = true;\r\n const data = await optionsSource(undefined, 0);\r\n cachedItems.value = (data?.results as T[]) ?? [];\r\n totalCount.value = data?.totalCount ?? 0;\r\n populateResolveCache(cachedItems.value);\r\n isLoaded = true;\r\n } catch (e) {\r\n console.error(\"useSelectDataSource: error loading options\", e);\r\n cachedItems.value = [];\r\n totalCount.value = 0;\r\n } finally {\r\n loading.value = false;\r\n }\r\n } else if (Array.isArray(optionsSource)) {\r\n cachedItems.value = [...optionsSource] as T[];\r\n totalCount.value = cachedItems.value.length;\r\n populateResolveCache(cachedItems.value);\r\n isLoaded = true;\r\n }\r\n }\r\n\r\n function close(): void {\r\n searchResults.value = null;\r\n filterString.value = undefined;\r\n if (debounceTimer) {\r\n clearTimeout(debounceTimer);\r\n debounceTimer = undefined;\r\n }\r\n }\r\n\r\n async function loadMore(): Promise<void> {\r\n const optionsSource = opts.options();\r\n if (typeof optionsSource !== \"function\" || loading.value) return;\r\n\r\n try {\r\n loading.value = true;\r\n const data = await optionsSource(filterString.value, cachedItems.value.length);\r\n const existingIds = new Set(cachedItems.value.map((item) => String(opts.getOptionValue.value(item))));\r\n const newItems = ((data?.results as T[]) ?? []).filter(\r\n (item) => !existingIds.has(String(opts.getOptionValue.value(item))),\r\n );\r\n cachedItems.value = [...cachedItems.value, ...newItems];\r\n totalCount.value = data?.totalCount ?? totalCount.value;\r\n populateResolveCache(newItems);\r\n } catch (e) {\r\n console.error(\"useSelectDataSource: error loading more\", e);\r\n } finally {\r\n loading.value = false;\r\n }\r\n }\r\n\r\n // --- Search ---\r\n\r\n async function executeSearch(keyword: string): Promise<void> {\r\n filterString.value = keyword;\r\n const optionsSource = opts.options();\r\n\r\n if (typeof optionsSource === \"function\") {\r\n try {\r\n searchLoading.value = true;\r\n const data = await optionsSource(keyword);\r\n searchResults.value = (data?.results as T[]) ?? [];\r\n totalCount.value = data?.totalCount ?? 0;\r\n populateResolveCache(searchResults.value);\r\n } catch (e) {\r\n console.error(\"useSelectDataSource: error searching\", e);\r\n searchResults.value = [];\r\n } finally {\r\n searchLoading.value = false;\r\n }\r\n } else {\r\n // Client-side filter\r\n searchResults.value = cachedItems.value.filter((item) => {\r\n const label = opts.getOptionLabel.value(item);\r\n return String(label).toLowerCase().includes(keyword.toLowerCase());\r\n });\r\n }\r\n }\r\n\r\n function onInput(event: Event): void {\r\n if (!event?.target) return;\r\n const value = (event.target as HTMLInputElement).value;\r\n\r\n const debounceMs = Number(opts.debounce());\r\n if (debounceTimer) clearTimeout(debounceTimer);\r\n\r\n if (debounceMs > 0) {\r\n debounceTimer = setTimeout(() => {\r\n opts.emit.search(value);\r\n executeSearch(value);\r\n }, debounceMs);\r\n } else {\r\n opts.emit.search(value);\r\n executeSearch(value);\r\n }\r\n }\r\n\r\n function clearSearch(): void {\r\n searchResults.value = null;\r\n filterString.value = undefined;\r\n if (debounceTimer) {\r\n clearTimeout(debounceTimer);\r\n debounceTimer = undefined;\r\n }\r\n // Restore totalCount from cached data\r\n totalCount.value = cachedItems.value.length;\r\n }\r\n\r\n // --- Resolve ---\r\n\r\n async function resolve(ids: string[]): Promise<T[]> {\r\n if (ids.length === 0) return [];\r\n\r\n const uncachedIds = ids.filter((id) => !resolveCache.has(String(id)));\r\n\r\n // Check cachedItems for any uncached ids\r\n const stillMissing = uncachedIds.filter((id) => {\r\n const found = cachedItems.value.find((item) => isEqual(opts.getOptionValue.value(item), id));\r\n if (found) {\r\n resolveCache.set(String(id), found);\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n // Only fetch truly missing from API\r\n const optionsSource = opts.options();\r\n if (stillMissing.length > 0 && typeof optionsSource === \"function\") {\r\n try {\r\n defaultOptionLoading.value = true;\r\n const data = await optionsSource(undefined, undefined, stillMissing);\r\n if (data?.results) {\r\n populateResolveCache(data.results as T[]);\r\n }\r\n } catch (e) {\r\n console.error(\"useSelectDataSource: error resolving\", e);\r\n } finally {\r\n defaultOptionLoading.value = false;\r\n }\r\n\r\n // Fallback: if the ids-based call didn't return the needed items\r\n // (API may not support the ids parameter), load first page\r\n const stillNotFound = stillMissing.filter((id) => !resolveCache.has(String(id)));\r\n if (stillNotFound.length > 0 && !isLoaded) {\r\n await open();\r\n }\r\n } else if (stillMissing.length > 0 && Array.isArray(optionsSource)) {\r\n // Static array: search directly in the provided options\r\n for (const item of optionsSource as T[]) {\r\n const key = String(opts.getOptionValue.value(item));\r\n if (stillMissing.includes(key)) {\r\n resolveCache.set(key, item);\r\n }\r\n }\r\n }\r\n\r\n const resolved = ids.map((id) => resolveCache.get(String(id))).filter(Boolean) as T[];\r\n resolvedDefaults.value = resolved;\r\n return resolved;\r\n }\r\n\r\n async function refresh(): Promise<void> {\r\n cachedItems.value = [];\r\n searchResults.value = null;\r\n totalCount.value = 0;\r\n resolveCache.clear();\r\n resolvedDefaults.value = [];\r\n isLoaded = false;\r\n await open();\r\n }\r\n\r\n // --- Watch: options prop change → full reset ---\r\n watch(\r\n opts.options,\r\n async () => {\r\n cachedItems.value = [];\r\n searchResults.value = null;\r\n totalCount.value = 0;\r\n resolveCache.clear();\r\n isLoaded = false;\r\n\r\n // Static array: always populate immediately (data is already in memory)\r\n const optionsSource = opts.options();\r\n if (Array.isArray(optionsSource)) {\r\n cachedItems.value = [...optionsSource] as T[];\r\n totalCount.value = cachedItems.value.length;\r\n populateResolveCache(cachedItems.value);\r\n isLoaded = true;\r\n\r\n // Re-resolve defaults from the new options so selected labels display correctly\r\n if (resolvedDefaults.value.length === 0) {\r\n const currentDefaults = resolvedDefaults.value;\r\n const reResolved =\r\n currentDefaults.length === 0\r\n ? cachedItems.value.filter((item) => {\r\n const key = String(opts.getOptionValue.value(item));\r\n return resolveCache.has(key);\r\n })\r\n : currentDefaults;\r\n if (reResolved.length === 0) {\r\n // resolveCache was just cleared and repopulated — resolvedDefaults\r\n // will be picked up via displayItems in innerValue computed\r\n }\r\n }\r\n }\r\n },\r\n { deep: false },\r\n );\r\n\r\n return {\r\n displayItems,\r\n loading,\r\n searchLoading,\r\n hasMore,\r\n filterString,\r\n resolvedDefaults,\r\n defaultOptionLoading,\r\n cachedItems: cachedItems as Readonly<Ref<T[]>>,\r\n\r\n open,\r\n close,\r\n onInput,\r\n clearSearch,\r\n loadMore,\r\n resolve,\r\n refresh,\r\n };\r\n}\r\n","import { computed, watch, Ref, ComputedRef } from \"vue\";\r\nimport { isEqual } from \"lodash-es\";\r\n\r\ninterface UseSelectSelectionOptions<Option> {\r\n modelValue: () => any;\r\n multiple: () => boolean | undefined;\r\n emitValue: () => boolean;\r\n mapOptions: () => boolean;\r\n displayItems: Ref<Option[]> | ComputedRef<Option[]>;\r\n resolvedDefaults: Ref<Option[]>;\r\n cachedItems: Readonly<Ref<Option[]>>;\r\n getOptionValue: ComputedRef<(opt: Option) => any>;\r\n getOptionLabel: ComputedRef<(opt: Option) => any>;\r\n getOption: (value: Option, valueCache: Option[], defaultValues: Option[], optionsList: Option[]) => Option;\r\n fieldValueIsFilled: (val: Option[]) => boolean;\r\n isOpened: Ref<boolean>;\r\n popperUpdate: () => void;\r\n emit: {\r\n updateModelValue: (val: any) => void;\r\n close: () => void;\r\n };\r\n}\r\n\r\nexport function useSelectSelection<Option>(opts: UseSelectSelectionOptions<Option>) {\r\n let innerValueCache: Option[] = [];\r\n\r\n const innerValue = computed((): Option[] => {\r\n const mapNull = opts.mapOptions() === true && opts.multiple() !== true;\r\n\r\n const val =\r\n opts.modelValue() !== undefined && (opts.modelValue() !== null || mapNull === true)\r\n ? opts.multiple() === true && Array.isArray(opts.modelValue())\r\n ? opts.modelValue()\r\n : [opts.modelValue()]\r\n : [];\r\n\r\n if (opts.mapOptions() === true && Array.isArray(opts.displayItems.value) === true) {\r\n const cache = opts.mapOptions() === true && innerValueCache !== undefined ? innerValueCache : [];\r\n\r\n const values = val.map((v: Option) => {\r\n const found = opts.getOption(v, cache, opts.resolvedDefaults.value, opts.displayItems.value);\r\n // If not found in displayItems (search active), try cachedItems\r\n if (found === v && opts.cachedItems.value.length > 0) {\r\n const fromCache = opts.getOption(v, cache, opts.resolvedDefaults.value, opts.cachedItems.value);\r\n if (fromCache !== v) return fromCache;\r\n }\r\n return found;\r\n });\r\n\r\n return opts.modelValue() === null && mapNull === true ? values.filter((v: Option) => v !== null) : values;\r\n }\r\n\r\n return val;\r\n });\r\n\r\n watch(\r\n innerValue,\r\n (val) => {\r\n innerValueCache = val;\r\n },\r\n { immediate: true },\r\n );\r\n\r\n const innerOptionsValue = computed(() => innerValue.value.map((opt) => opts.getOptionValue.value(opt)));\r\n\r\n function isOptionSelected(opt: Option) {\r\n const val = opts.getOptionValue.value(opt);\r\n return innerOptionsValue.value.find((v) => isEqual(v, val)) !== void 0;\r\n }\r\n\r\n const selectedScope = computed(\r\n (): {\r\n index: number;\r\n opt: Option;\r\n selected: boolean;\r\n toggleOption: (opt: Option) => void;\r\n removeAtIndex: (index: number) => void;\r\n }[] => {\r\n return innerValue.value.map((opt: Option, i: number) => ({\r\n index: i,\r\n opt,\r\n selected: true,\r\n toggleOption,\r\n removeAtIndex,\r\n }));\r\n },\r\n );\r\n\r\n const hasValue = computed(() => opts.fieldValueIsFilled(innerValue.value));\r\n\r\n const optionScope = computed(() => {\r\n return opts.displayItems.value.map((opt, i) => {\r\n return {\r\n index: i,\r\n opt,\r\n selected: isOptionSelected(opt) === true,\r\n label: opts.getOptionLabel.value(opt),\r\n toggleOption,\r\n };\r\n });\r\n });\r\n\r\n function toggleOption(opt: Option) {\r\n if (opt === void 0) {\r\n return;\r\n }\r\n\r\n const optValue = opts.getOptionValue.value(opt) as Option[];\r\n\r\n if (opts.multiple() !== true) {\r\n if (innerValue.value.length === 0 || isEqual(opts.getOptionValue.value(innerValue.value[0]), optValue) !== true) {\r\n opts.emit.updateModelValue(opts.emitValue() === true ? optValue : opt);\r\n }\r\n\r\n opts.isOpened.value = false;\r\n opts.emit.close();\r\n return;\r\n }\r\n\r\n if (innerValue.value.length === 0) {\r\n const val = opts.emitValue() === true ? optValue : opt;\r\n opts.emit.updateModelValue(opts.multiple() === true ? ([val] as Option[]) : (val as Option));\r\n return;\r\n }\r\n\r\n const model = opts.modelValue().slice();\r\n const index = innerOptionsValue.value.findIndex((v) => isEqual(v, optValue));\r\n\r\n if (index > -1) {\r\n model.splice(index, 1);\r\n } else {\r\n const val = opts.emitValue() === true ? optValue : opt;\r\n model.push(val);\r\n }\r\n\r\n opts.emit.updateModelValue(model);\r\n\r\n if (opts.isOpened.value) {\r\n opts.popperUpdate();\r\n }\r\n }\r\n\r\n function removeAtIndex(index: number) {\r\n if (index > -1 && index < innerValue.value.length) {\r\n if (opts.multiple() === true) {\r\n const model = opts.modelValue().slice();\r\n model.splice(index, 1);\r\n opts.emit.updateModelValue(model);\r\n } else {\r\n opts.emit.updateModelValue(null);\r\n }\r\n }\r\n }\r\n\r\n function onReset() {\r\n if (opts.multiple()) {\r\n opts.emit.updateModelValue([]);\r\n return;\r\n }\r\n opts.emit.updateModelValue(null);\r\n }\r\n\r\n return {\r\n innerValue,\r\n selectedScope,\r\n hasValue,\r\n innerOptionsValue,\r\n optionScope,\r\n toggleOption,\r\n removeAtIndex,\r\n isOptionSelected,\r\n onReset,\r\n };\r\n}\r\n","<template>\n <div\n ref=\"toggleRef\"\n class=\"vc-select__dropdown-toggle\"\n >\n <slot\n name=\"control\"\n :toggle-handler=\"toggleDropdown\"\n :is-opened=\"isOpened\"\n >\n <div class=\"vc-select__control\">\n <div\n v-if=\"$slots['prepend']\"\n class=\"vc-select__prepend\"\n >\n <slot name=\"prepend\"></slot>\n </div>\n <div\n class=\"vc-select__field-wrapper\"\n :class=\"{\n 'vc-select__field-wrapper--default': size === 'default',\n 'vc-select__field-wrapper--small': size === 'small',\n }\"\n >\n <div class=\"vc-select__field\">\n <div class=\"vc-select__field-inner\">\n <div class=\"vc-select__field-content\">\n <div\n v-if=\"$slots['prepend-inner']\"\n class=\"vc-select__prepend-inner\"\n >\n <slot name=\"prepend-inner\"></slot>\n </div>\n <div class=\"vc-select__field-main\">\n <div\n v-if=\"prefix\"\n class=\"vc-select__prefix\"\n >\n {{ prefix }}\n </div>\n <div\n data-test-id=\"dropdown-toggle\"\n class=\"vc-select__input\"\n role=\"combobox\"\n tabindex=\"0\"\n :aria-expanded=\"isOpened\"\n aria-haspopup=\"listbox\"\n :aria-controls=\"isOpened ? listboxId : undefined\"\n :aria-labelledby=\"label ? labelId : undefined\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-required=\"ariaRequired\"\n :aria-invalid=\"error || undefined\"\n @click.stop=\"toggleDropdown\"\n @keydown.enter.stop=\"toggleDropdown\"\n @keydown.space.stop=\"toggleDropdown\"\n @focus=\"$emit('focus')\"\n @blur=\"$emit('blur')\"\n >\n <div\n v-if=\"!hasValue\"\n class=\"vc-select__placeholder\"\n >\n <template v-if=\"placeholder\">{{ placeholder }}</template>\n <template v-else>{{ t(\"COMPONENTS.MOLECULES.VC_SELECT.CLICK_TO_SELECT\") }}</template>\n </div>\n <template v-else-if=\"selectedScope && selectedScope.length && hasValue\">\n <div class=\"vc-select__selected\">\n <div\n v-for=\"(item, i) in selectedScope\"\n :key=\"i\"\n class=\"vc-select__selected-item\"\n >\n <template v-if=\"multiple\">\n <slot\n name=\"selected-item\"\n v-bind=\"item\"\n >\n <div class=\"vc-select__multiple-item\">\n <template v-if=\"loading\">\n <span class=\"vc-select__loading\">{{\n t(\"COMPONENTS.MOLECULES.VC_SELECT.LOADING\")\n }}</span>\n </template>\n <template v-else>\n <span>{{ getOptionLabel(item.opt) }}</span>\n </template>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"vc-select__chip-remove\"\n :aria-label=\"`Remove ${getOptionLabel(item.opt) || ''}`\"\n tabindex=\"0\"\n @click.stop=\"$emit('removeAtIndex', item.index)\"\n @keydown.enter.stop.prevent=\"$emit('removeAtIndex', item.index)\"\n >\n <VcIcon\n class=\"vc-select__icon-remove\"\n icon=\"lucide-x\"\n size=\"xs\"\n />\n </button>\n </div>\n </slot>\n </template>\n <template v-else-if=\"!multiple\">\n <template v-if=\"loading\">\n <span class=\"vc-select__loading\">{{ t(\"COMPONENTS.MOLECULES.VC_SELECT.LOADING\") }}</span>\n </template>\n <template v-else>\n <slot\n name=\"selected-item\"\n v-bind=\"item\"\n >\n {{\n loading\n ? t(\"COMPONENTS.MOLECULES.VC_SELECT.LOADING\")\n : getEmittingOptionValue(item.opt)\n }}\n </slot>\n </template>\n </template>\n </div>\n </div>\n </template>\n </div>\n <div\n v-if=\"suffix\"\n class=\"vc-select__suffix\"\n >\n {{ suffix }}\n </div>\n <div\n v-if=\"clearable && hasValue && !disabled\"\n class=\"vc-select__clear\"\n role=\"button\"\n :aria-label=\"$t('COMPONENTS.CONTROLS.CLEAR_SELECTION')\"\n tabindex=\"0\"\n @click=\"$emit('reset')\"\n @keydown.enter=\"$emit('reset')\"\n @keydown.space=\"$emit('reset')\"\n >\n <VcIcon\n size=\"xs\"\n icon=\"lucide-x\"\n ></VcIcon>\n </div>\n </div>\n <div\n v-if=\"$slots['append-inner']\"\n class=\"vc-select__append-inner\"\n >\n <slot name=\"append-inner\"></slot>\n </div>\n <!-- Loading-->\n <div\n v-if=\"loading || listLoading || defaultOptionLoading\"\n class=\"vc-select__loading-icon\"\n >\n <VcIcon\n icon=\"lucide-loader-2\"\n class=\"tw-animate-spin\"\n size=\"m\"\n ></VcIcon>\n </div>\n <!-- Select chevron-->\n <div\n v-if=\"!disabled\"\n class=\"vc-select__chevron-container\"\n role=\"button\"\n :aria-label=\"$t('COMPONENTS.CONTROLS.TOGGLE_DROPDOWN')\"\n tabindex=\"0\"\n @click.stop=\"toggleDropdown\"\n @keydown.enter.stop=\"toggleDropdown\"\n @keydown.space.stop=\"toggleDropdown\"\n >\n <div class=\"vc-select__chevron\">\n <VcIcon\n size=\"s\"\n icon=\"lucide-chevron-down\"\n ></VcIcon>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"vc-select__hint-error\">\n <Transition\n name=\"slide-up\"\n mode=\"out-in\"\n >\n <div v-if=\"error && errorMessage\">\n <slot name=\"error\">\n <VcHint\n :id=\"errorId\"\n class=\"vc-select__error-message\"\n :error=\"true\"\n >\n {{ errorMessage }}\n </VcHint>\n </slot>\n </div>\n <div v-else>\n <slot name=\"hint\">\n <VcHint\n v-if=\"hint\"\n :id=\"hintId\"\n class=\"vc-select__hint\"\n >\n {{ hint }}\n </VcHint>\n </slot>\n </div>\n </Transition>\n </div>\n </div>\n\n <div\n v-if=\"$slots['append']\"\n class=\"vc-select__append\"\n >\n <slot name=\"append\"></slot>\n </div>\n </div>\n </slot>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from \"vue\";\nimport { VcHint } from \"@ui/components/atoms/vc-hint\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { useI18n } from \"vue-i18n\";\n\ndefineProps<{\n isOpened: boolean;\n hasValue: boolean;\n selectedScope: {\n index: number;\n opt: any;\n selected: boolean;\n toggleOption: (opt: any) => void;\n removeAtIndex: (index: number) => void;\n }[];\n multiple?: boolean;\n loading?: boolean;\n disabled?: boolean;\n clearable?: boolean;\n placeholder?: string;\n prefix?: string;\n suffix?: string;\n size?: \"default\" | \"small\";\n error?: boolean;\n errorMessage?: string;\n hint?: string;\n listLoading: boolean;\n defaultOptionLoading: boolean;\n listboxId: string;\n labelId: string;\n label?: string;\n ariaDescribedBy?: string;\n ariaRequired?: boolean | undefined;\n errorId: string;\n hintId: string;\n toggleDropdown: () => void;\n getOptionLabel: (opt: any) => any;\n getEmittingOptionValue: (opt: any) => any;\n}>();\n\ndefineEmits<{\n focus: [];\n blur: [];\n reset: [];\n removeAtIndex: [index: number];\n}>();\n\ndefineSlots<{\n control: (scope: { toggleHandler: () => void; isOpened: boolean }) => any;\n \"prepend-inner\": (props: any) => any;\n \"append-inner\": (props: any) => any;\n prepend: (props: any) => any;\n append: (props: any) => any;\n \"selected-item\": (scope: {\n index: number;\n opt: any;\n selected: boolean;\n removeAtIndex: (index: number) => void;\n }) => any;\n error: (props: any) => any;\n hint: (props: any) => any;\n}>();\n\nconst { t } = useI18n({ useScope: \"global\" });\n\nconst toggleRef = ref<HTMLElement | null>(null);\n\ndefineExpose({\n toggleRef,\n});\n</script>\n","<template>\n <teleport :to=\"teleportTarget\">\n <Transition name=\"select-dropdown\">\n <div\n v-if=\"isOpened\"\n :id=\"listboxId\"\n ref=\"dropdownElRef\"\n v-on-click-outside=\"[() => emit('clickOutside'), { ignore: [dropdownToggleRef] }]\"\n data-test-id=\"dropdown\"\n class=\"vc-select__dropdown\"\n role=\"listbox\"\n :aria-label=\"ariaLabel\"\n :style=\"dropdownStyle\"\n @wheel=\"onDropdownWheel\"\n >\n <input\n v-if=\"searchable\"\n ref=\"searchInputRef\"\n class=\"vc-select__search-input\"\n tabindex=\"0\"\n :aria-label=\"$t('COMPONENTS.CONTROLS.SEARCH_OPTIONS')\"\n autocomplete=\"off\"\n @input=\"emit('input', $event)\"\n @keydown.space.stop\n @keydown.enter.stop\n />\n\n <VcScrollableContainer\n ref=\"scrollContainerRef\"\n class=\"vc-select__scroll-container\"\n >\n <!-- Render existing options -->\n <div\n v-for=\"(item, i) in optionScope\"\n :key=\"i\"\n class=\"vc-select__option\"\n data-test-id=\"option\"\n role=\"option\"\n :aria-selected=\"item.selected\"\n :class=\"{ 'vc-select__option--selected': item.selected }\"\n tabindex=\"0\"\n :data-index=\"i\"\n @click=\"item.toggleOption(item.opt)\"\n @keydown.enter=\"item.toggleOption(item.opt)\"\n @keydown.space=\"item.toggleOption(item.opt)\"\n >\n <slot\n name=\"option\"\n v-bind=\"item\"\n >{{ item.label }}</slot\n >\n <span\n v-if=\"item.selected\"\n class=\"vc-select__check-icon\"\n >\n <VcIcon\n icon=\"lucide-check\"\n size=\"xs\"\n />\n </span>\n </div>\n\n <!-- Loading Indicator (Initial or More) -->\n <div\n v-if=\"listLoading\"\n class=\"vc-select__list-loading-indicator\"\n >\n <VcIcon\n icon=\"lucide-loader-2\"\n class=\"tw-animate-spin\"\n size=\"m\"\n />\n <span class=\"tw-ml-1\">\n {{\n optionsListLength > 0\n ? t(\"COMPONENTS.MOLECULES.VC_SELECT.LOADING_MORE\")\n : t(\"COMPONENTS.MOLECULES.VC_SELECT.LOADING\")\n }}\n </span>\n </div>\n\n <!-- Show \"No options\" message -->\n <div\n v-if=\"!listLoading && !optionsListLength\"\n class=\"vc-select__no-options\"\n >\n <slot name=\"no-options\">\n <span class=\"vc-select__no-options-text\">{{ t(\"COMPONENTS.MOLECULES.VC_SELECT.NO_OPTIONS\") }}</span>\n </slot>\n </div>\n\n <!-- Intersection observer target for loading more -->\n <span\n v-if=\"hasNextPage && !listLoading\"\n ref=\"loadMoreRef\"\n class=\"vc-select__load-more-trigger\"\n ></span>\n </VcScrollableContainer>\n </div>\n </Transition>\n </teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, watch, nextTick } from \"vue\";\nimport { vOnClickOutside } from \"@vueuse/components\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcScrollableContainer } from \"@ui/components/atoms/vc-scrollable-container\";\nimport { useI18n } from \"vue-i18n\";\nimport { useTeleportTarget } from \"@ui/composables\";\n\nconst props = defineProps<{\n isOpened: boolean;\n listboxId: string;\n ariaLabel: string;\n dropdownStyle: Record<string, string | undefined>;\n searchable?: boolean;\n optionScope: {\n index: number;\n opt: any;\n selected: boolean;\n label: any;\n toggleOption: (opt: any) => void;\n }[];\n listLoading: boolean;\n optionsListLength: number;\n hasNextPage: boolean;\n dropdownToggleRef: HTMLElement | null;\n}>();\n\nconst emit = defineEmits<{\n input: [event: Event];\n clickOutside: [];\n}>();\n\ndefineSlots<{\n option: (scope: { index: number; opt: any; selected: boolean; label: any; toggleOption: (opt: any) => void }) => any;\n \"no-options\": (props: any) => any;\n}>();\n\nconst { t } = useI18n({ useScope: \"global\" });\nconst { teleportTarget } = useTeleportTarget();\n\nconst dropdownElRef = ref<HTMLElement | null>(null);\nconst searchInputRef = ref<HTMLInputElement | null>(null);\nconst scrollContainerRef = ref<InstanceType<typeof VcScrollableContainer> | null>(null);\nconst loadMoreRef = ref<HTMLElement | null>(null);\n\nconst viewportRef = computed<HTMLElement | null>(() => scrollContainerRef.value?.viewportRef ?? null);\n\nfunction onDropdownWheel(event: WheelEvent) {\n const el = viewportRef.value;\n if (!el) return;\n\n const isInViewport = el.contains(event.target as Node);\n\n if (isInViewport) {\n const atTop = el.scrollTop <= 0 && event.deltaY < 0;\n const atBottom = Math.ceil(el.scrollTop) >= el.scrollHeight - el.clientHeight && event.deltaY > 0;\n if (atTop || atBottom) {\n event.preventDefault();\n }\n } else {\n event.preventDefault();\n el.scrollTop += event.deltaY;\n }\n scrollContainerRef.value?.updateScrollState();\n}\n\nwatch(\n () => props.isOpened,\n (opened) => {\n if (opened) {\n nextTick(() => scrollContainerRef.value?.updateScrollState());\n }\n },\n);\n\nwatch(\n () => props.optionScope.length,\n () => {\n if (props.isOpened) {\n nextTick(() => scrollContainerRef.value?.updateScrollState());\n }\n },\n);\n\ndefineExpose({\n dropdownElRef,\n searchInputRef,\n viewportRef,\n loadMoreRef,\n});\n</script>\n","<template>\n <!-- Skeleton mode -->\n <div\n v-if=\"bladeLoading\"\n v-bind=\"rootAttrs\"\n class=\"vc-select vc-select--skeleton\"\n :class=\"$attrs.class\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n\n <!-- Normal mode -->\n <div\n v-else\n ref=\"selectRootRef\"\n v-bind=\"rootAttrs\"\n class=\"vc-select\"\n :class=\"[\n $attrs.class,\n {\n 'vc-select--opened': isOpened,\n 'vc-select--error': invalid,\n 'vc-select--disabled': resolvedDisabled,\n 'vc-select--has-hint-or-error': invalid || hint,\n 'vc-select--no-outline': !outline,\n 'vc-select--focused': isFocused,\n },\n ]\"\n >\n <!-- Select label -->\n <VcLabel\n v-if=\"label\"\n :id=\"labelId\"\n class=\"vc-select__label\"\n :required=\"required\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n :error=\"invalid\"\n >\n <span>{{ label }}</span>\n <template\n v-if=\"tooltip\"\n #tooltip\n >\n <span v-html=\"DOMPurify.sanitize(tooltip)\"></span>\n </template>\n </VcLabel>\n\n <!-- Select field -->\n <div class=\"vc-select__field-container\">\n <SelectTrigger\n ref=\"selectTriggerRef\"\n :is-opened=\"isOpened\"\n :has-value=\"hasValue\"\n :selected-scope=\"selectedScope\"\n :multiple=\"multiple\"\n :loading=\"loading\"\n :disabled=\"resolvedDisabled\"\n :clearable=\"clearable\"\n :placeholder=\"placeholder\"\n :prefix=\"prefix\"\n :suffix=\"suffix\"\n :size=\"size\"\n :error=\"invalid\"\n :error-message=\"errorMessage\"\n :hint=\"hint\"\n :list-loading=\"dataSource.loading.value || dataSource.searchLoading.value\"\n :default-option-loading=\"dataSource.defaultOptionLoading.value\"\n :listbox-id=\"listboxId\"\n :label-id=\"labelId\"\n :label=\"label\"\n :aria-described-by=\"ariaDescribedBy\"\n :aria-required=\"ariaRequired\"\n :error-id=\"errorId\"\n :hint-id=\"hintId\"\n :toggle-dropdown=\"toggleDropdown\"\n :get-option-label=\"getOptionLabel\"\n :get-emitting-option-value=\"getEmittingOptionValue\"\n @focus=\"isFocused = true\"\n @blur=\"isFocused = false\"\n @reset=\"onReset\"\n @remove-at-index=\"removeAtIndex\"\n >\n <template\n v-if=\"$slots['control']\"\n #control=\"scope\"\n >\n <slot\n name=\"control\"\n v-bind=\"scope\"\n />\n </template>\n <template\n v-if=\"$slots['prepend']\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <template\n v-if=\"$slots['append']\"\n #append\n >\n <slot name=\"append\" />\n </template>\n <template\n v-if=\"$slots['prepend-inner']\"\n #prepend-inner\n >\n <slot name=\"prepend-inner\" />\n </template>\n <template\n v-if=\"$slots['append-inner']\"\n #append-inner\n >\n <slot name=\"append-inner\" />\n </template>\n <template\n v-if=\"$slots['selected-item']\"\n #selected-item=\"scope\"\n >\n <slot\n name=\"selected-item\"\n v-bind=\"scope\"\n />\n </template>\n <template\n v-if=\"$slots['error']\"\n #error\n >\n <slot name=\"error\" />\n </template>\n <template\n v-if=\"$slots['hint']\"\n #hint\n >\n <slot name=\"hint\" />\n </template>\n </SelectTrigger>\n\n <SelectDropdown\n ref=\"selectDropdownRef\"\n :is-opened=\"isOpened\"\n :listbox-id=\"listboxId\"\n v-bind=\"{ ariaLabel: label || name }\"\n :dropdown-style=\"dropdownStyle\"\n :searchable=\"searchable\"\n :option-scope=\"optionScope\"\n :list-loading=\"dataSource.loading.value || dataSource.searchLoading.value\"\n :options-list-length=\"dataSource.displayItems.value.length\"\n :has-next-page=\"dataSource.hasMore.value\"\n :dropdown-toggle-ref=\"selectTriggerRef?.toggleRef ?? null\"\n @input=\"dataSource.onInput\"\n @click-outside=\"onClickOutside\"\n >\n <template\n v-if=\"$slots['option']\"\n #option=\"scope\"\n >\n <slot\n name=\"option\"\n v-bind=\"scope\"\n />\n </template>\n <template\n v-if=\"$slots['no-options']\"\n #no-options\n >\n <slot name=\"no-options\" />\n </template>\n </SelectDropdown>\n </div>\n </div>\n</template>\n\n<!-- eslint-disable @typescript-eslint/no-explicit-any -->\n<script\n lang=\"ts\"\n setup\n generic=\"\n V = string | string[] | null,\n T = unknown,\n P extends { results?: T[]; totalCount?: number } | undefined = undefined\n \"\n>\nimport { ref, computed, watch, watchEffect, nextTick, useAttrs } from \"vue\";\nimport { useFormField } from \"@ui/composables/useFormField\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport { useIntersectionObserver } from \"@vueuse/core\";\nimport { VcLabel } from \"@ui/components/atoms/vc-label\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\nimport { useI18n } from \"vue-i18n\";\nimport { useKeyboardNavigation } from \"@core/composables/useKeyboardNavigation\";\nimport {\n useSelectValueMapping,\n type OptionProp,\n} from \"@ui/components/molecules/vc-select/composables/useSelectValueMapping\";\nimport type { IFormFieldProps } from \"@ui/types\";\nimport { useSelectVisibility } from \"@ui/components/molecules/vc-select/composables/useSelectVisibility\";\nimport { useSelectDropdown } from \"@ui/components/molecules/vc-select/composables/useSelectDropdown\";\nimport { useSelectDataSource } from \"@ui/components/molecules/vc-select/composables/useSelectDataSource\";\nimport { useSelectSelection } from \"@ui/components/molecules/vc-select/composables/useSelectSelection\";\nimport SelectTrigger from \"@ui/components/molecules/vc-select/_internal/SelectTrigger.vue\";\nimport SelectDropdown from \"@ui/components/molecules/vc-select/_internal/SelectDropdown.vue\";\nimport DOMPurify from \"dompurify\";\n\ntype ArrayElementType<U> = U extends Array<infer V> ? V : never;\ntype Option = P extends { results?: T[]; totalCount?: number } ? T & ArrayElementType<Required<P>[\"results\"]> : T;\n\ntype BaseSelectProps = {\n mapOptions?: boolean;\n hint?: string;\n prefix?: string;\n suffix?: string;\n loading?: boolean;\n clearable?: boolean;\n multiple?: boolean;\n options?: ((keyword?: string, skip?: number, ids?: string[]) => Promise<P>) | T[];\n optionValue?: OptionProp<Option>;\n optionLabel?: OptionProp<Option>;\n debounce?: number | string;\n placeholder?: string;\n searchable?: boolean;\n multilanguage?: boolean;\n currentLanguage?: string;\n size?: \"default\" | \"small\";\n outline?: boolean;\n placement?:\n | \"top\"\n | \"right\"\n | \"bottom\"\n | \"left\"\n | \"top-start\"\n | \"top-end\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"right-start\"\n | \"right-end\"\n | \"left-start\"\n | \"left-end\";\n};\n\ntype SelectProps<ModelValueType> = IFormFieldProps &\n BaseSelectProps & {\n modelValue?: ModelValueType;\n emitValue?: boolean;\n };\n\ndefineOptions({\n inheritAttrs: false,\n});\n\ndefineSlots<{\n /**\n * Custom select control\n */\n control: (scope: { toggleHandler: () => void; isOpened: boolean }) => any;\n /**\n * Prepend inner field\n */\n \"prepend-inner\": (props: any) => any;\n /**\n * Append to inner field\n */\n \"append-inner\": (props: any) => any;\n /**\n * Prepend outer field\n */\n prepend: (props: any) => any;\n /**\n * Append outer field\n */\n append: (props: any) => any;\n /**\n * Slot for errors\n */\n error: (props: any) => any;\n /**\n * Slot for hint text\n */\n hint: (props: any) => any;\n /**\n * Override default selection slot\n * @param scope\n */\n \"selected-item\": (scope: {\n /**\n * Selection index\n */\n index: number;\n /**\n * Selected option -- its value is taken from model\n */\n opt: Option;\n /**\n * Always true -- passed as prop\n */\n selected: boolean;\n /**\n * Remove selected option located at specific index\n * @param index Index at which to remove selection\n */\n removeAtIndex: (index: number) => void;\n }) => any;\n /**\n * Override default selection slot;\n */\n option: (scope: {\n /**\n * Option index\n */\n index: number;\n /**\n * Option -- its value is taken from 'options' prop\n */\n opt: Option;\n /**\n * Is option selected\n */\n selected: boolean;\n /**\n * Add/remove option from model\n * @param opt Option to add to model\n */\n toggleOption: (opt: any) => void;\n }) => any;\n \"no-options\": (props: any) => any;\n}>();\n\nconst props = withDefaults(defineProps<SelectProps<V>>(), {\n optionValue: \"id\",\n optionLabel: \"title\",\n debounce: 500,\n clearable: true,\n name: \"Field\",\n emitValue: true,\n mapOptions: true,\n size: \"default\",\n options: (): T[] => [],\n outline: true,\n placement: \"bottom\",\n});\n\nconst attrs = useAttrs();\nconst rootAttrs = computed(() => {\n const { class: _class, ...rest } = attrs;\n return rest;\n});\n\nconst emit = defineEmits<{\n /**\n * Emitted when the component needs to change the model; Is also used by v-model\n */\n\n \"update:modelValue\": [inputValue: V];\n /**\n * Emitted when user wants to filter a value\n */\n search: [inputValue: string];\n /**\n * Emitted when the select options list is hidden\n */\n close: [];\n}>();\n\nconst { t: _t } = useI18n({ useScope: \"global\" });\nconst bladeLoading = useBladeLoading();\n\nconst {\n fieldId,\n labelId,\n errorId,\n hintId,\n invalid,\n resolvedDisabled,\n resolvedName: _resolvedName,\n ariaRequired,\n ariaDescribedBy,\n} = useFormField(props);\nconst listboxId = computed(() => `${fieldId.value}-listbox`);\n\n// --- Subcomponent refs ---\nconst selectTriggerRef = ref<InstanceType<typeof SelectTrigger> | null>(null);\nconst selectDropdownRef = ref<InstanceType<typeof SelectDropdown> | null>(null);\n\n// --- Composables ---\n\nconst { selectRootRef, isSelectVisible, ensureVisibility } = useSelectVisibility();\n\nconst { getOptionValue, getOptionLabel, getOption, getEmittingOptionValue, fieldValueIsFilled } =\n useSelectValueMapping<Option>({\n optionValue: () => props.optionValue,\n optionLabel: () => props.optionLabel,\n });\n\nconst { isOpened, isFocused, dropdownToggleRef, dropdownRef, popper, dropdownStyle, toggleDropdown } =\n useSelectDropdown({\n placement: props.placement,\n outline: () => props.outline,\n isSelectVisible,\n selectRootRef,\n disabled: () => props.disabled ?? false,\n ensureVisibility,\n });\n\n// Sync subcomponent DOM refs → Floating UI refs\nwatchEffect(() => {\n dropdownToggleRef.value = selectTriggerRef.value?.toggleRef ?? null;\n});\nwatchEffect(() => {\n dropdownRef.value = selectDropdownRef.value?.dropdownElRef ?? null;\n});\n\nconst dataSource = useSelectDataSource<Option>({\n options: () => props.options as any,\n getOptionValue,\n getOptionLabel,\n isSelectVisible,\n debounce: () => props.debounce ?? 500,\n emit: {\n search: (val: string) => emit(\"search\", val),\n },\n});\n\nconst { selectedScope, hasValue, optionScope, toggleOption, removeAtIndex, onReset } = useSelectSelection<Option>({\n modelValue: () => props.modelValue,\n multiple: () => props.multiple,\n emitValue: () => props.emitValue ?? true,\n mapOptions: () => props.mapOptions ?? true,\n displayItems: dataSource.displayItems,\n resolvedDefaults: dataSource.resolvedDefaults,\n cachedItems: dataSource.cachedItems,\n getOptionValue,\n getOptionLabel,\n getOption,\n fieldValueIsFilled,\n isOpened,\n popperUpdate: () => popper.update(),\n emit: {\n updateModelValue: (val: any) => emit(\"update:modelValue\", val),\n close: () => emit(\"close\"),\n },\n});\n\n// --- Intersection observer for infinite scroll ---\n// Use computed refs from dropdown subcomponent\nconst loadMoreEl = computed(() => selectDropdownRef.value?.loadMoreRef ?? null);\nconst viewportRoot = computed(() => selectDropdownRef.value?.viewportRef ?? null);\n\nuseIntersectionObserver(\n loadMoreEl,\n ([{ isIntersecting }]) => {\n if (isIntersecting && dataSource.hasMore.value) {\n dataSource.loadMore();\n }\n },\n { threshold: 1, root: viewportRoot },\n);\n\n// --- Keyboard navigation ---\nconst keyboardNavigation = useKeyboardNavigation({\n onEnter: (element: HTMLElement) => {\n const index = parseInt(element.getAttribute(\"data-index\") || \"0\", 10);\n if (optionScope.value && optionScope.value[index]) {\n optionScope.value[index].toggleOption(optionScope.value[index].opt);\n }\n },\n onEscape: () => {\n isOpened.value = false;\n emit(\"close\");\n nextTick(() => {\n const toggleEl = selectTriggerRef.value?.toggleRef?.querySelector('[role=\"combobox\"]') as HTMLElement | null;\n toggleEl?.focus();\n });\n },\n});\n\n// --- Event handlers for subcomponents ---\nfunction onClickOutside() {\n isOpened.value = false;\n emit(\"close\");\n}\n\n// --- Orchestration watchers ---\n\n// When dropdown opens/closes: load options, init keyboard nav, focus\nwatch(isOpened, async (newIsOpened) => {\n if (newIsOpened) {\n await dataSource.open();\n\n nextTick(() => {\n popper.update();\n const dropdownEl = selectDropdownRef.value?.dropdownElRef;\n const searchInput = selectDropdownRef.value?.searchInputRef;\n\n if (dropdownEl) {\n keyboardNavigation.initKeyboardNavigation(dropdownEl);\n if (props.searchable && searchInput) {\n searchInput.focus();\n } else {\n const firstFocusable = dropdownEl.querySelector(\n '.vc-select__option[tabindex=\"0\"], .vc-select__search-input[tabindex=\"0\"]',\n ) as HTMLElement | null;\n\n if (firstFocusable) {\n firstFocusable.focus();\n } else {\n keyboardNavigation.focusFirstElement();\n }\n }\n }\n });\n } else {\n keyboardNavigation.cleanupKeyboardNavigation();\n dataSource.close();\n }\n});\n\n// Resolve selected values when modelValue changes\nwatch(\n () => props.modelValue,\n async (currentModelVal) => {\n if (currentModelVal == null || (Array.isArray(currentModelVal) && currentModelVal.length === 0)) {\n dataSource.resolvedDefaults.value = [];\n return;\n }\n\n const emitVal = props.emitValue ?? true;\n const mapOpt = props.mapOptions ?? true;\n\n if (mapOpt) {\n const values = Array.isArray(currentModelVal) ? currentModelVal : [currentModelVal];\n\n // When emitValue is true, modelValue is always a primitive ID — resolve all.\n // When emitValue is false, modelValue should be a full object, but initial data\n // from the backend often provides just a primitive ID — resolve those too.\n const toResolve = emitVal ? values : values.filter((v) => v != null && typeof v !== \"object\");\n\n if (toResolve.length > 0) {\n const stringIds = toResolve.filter((id) => id != null).map(String);\n if (stringIds.length > 0) {\n await dataSource.resolve(stringIds);\n }\n }\n }\n },\n { immediate: true },\n);\n</script>\n\n<style lang=\"scss\">\n:root {\n --select-height: 36px;\n --select-height-small: 32px;\n --select-border-radius: 6px;\n --select-border-color: var(--neutrals-300);\n --select-text-color: var(--neutrals-800);\n --select-padding: 12px;\n\n // Trigger — transparent bg\n --select-background-color: var(--additional-50);\n\n --select-placeholder-color: var(--neutrals-400);\n\n // Chevron & Clear — muted instead of primary\n --select-chevron-color: var(--neutrals-500);\n --select-chevron-color-hover: var(--neutrals-700);\n --select-clear-color: var(--neutrals-400);\n --select-clear-color-hover: var(--neutrals-600);\n\n --select-loading-color: var(--info-500);\n\n // Options — neutral hover, soft selected\n --select-option-background-color-hover: var(--neutrals-100);\n --select-option-background-color-selected: var(--accent-100);\n --select-option-check-color: var(--primary-500);\n\n // Multi-select chips\n --select-multiple-options-background-color: var(--neutrals-100);\n --select-multiple-options-border-color: var(--neutrals-200);\n\n // Dropdown\n --select-dropdown-bg: var(--additional-50);\n --select-dropdown-border: var(--neutrals-200);\n --select-dropdown-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);\n\n // Search\n --select-search-border-color: var(--neutrals-200);\n --select-search-background-color: var(--additional-50);\n --select-border-color-input: var(--secondary-200);\n\n // Focus\n --select-border-color-focus: var(--primary-500);\n --select-focus-ring-color: var(--primary-100);\n\n // Disabled\n --select-background-color-disabled: var(--neutrals-200);\n --select-disabled-text-color: var(--neutrals-500);\n\n // Error\n --select-border-color-error: var(--danger-500);\n --select-error-ring-color: var(--danger-100);\n}\n\n.vc-select {\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &--no-outline {\n .vc-select__chevron-container {\n display: none;\n }\n\n .vc-select__field-wrapper {\n border: none;\n background-color: transparent !important;\n box-shadow: none;\n }\n }\n\n &__container {\n @apply tw-box-border tw-w-full;\n }\n\n &__label {\n @apply tw-mb-2;\n }\n\n &__field-container {\n @apply tw-flex tw-flex-nowrap tw-items-start tw-relative tw-rounded-[var(--select-border-radius)];\n }\n\n &__dropdown-toggle {\n @apply tw-flex tw-flex-auto tw-text-left tw-max-w-full;\n }\n\n &__control {\n @apply tw-relative tw-flex tw-flex-auto tw-text-left tw-max-w-full;\n }\n\n &__prepend,\n &__append {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pr-3;\n }\n\n &__field-wrapper {\n @apply tw-relative tw-flex tw-flex-auto tw-overflow-x-clip tw-truncate tw-rounded-[var(--select-border-radius)]\n tw-border tw-border-solid tw-border-[color:var(--select-border-color)]\n tw-bg-[color:var(--select-background-color)]\n tw-shadow-sm tw-transition-[color,box-shadow] tw-duration-150 tw-ease-in-out;\n\n &--default {\n @apply tw-min-h-[var(--select-height)];\n }\n\n &--small {\n @apply tw-min-h-[var(--select-height-small)];\n }\n }\n\n &__field {\n @apply tw-truncate tw-relative tw-box-border tw-flex tw-flex-col tw-flex-nowrap tw-flex-auto tw-items-stretch tw-text-[color:var(--select-text-color)];\n }\n\n &__field-inner {\n @apply tw-flex tw-flex-col tw-flex-nowrap tw-flex-auto tw-relative tw-min-w-0;\n }\n\n &__field-content {\n @apply tw-flex tw-flex-nowrap tw-flex-auto tw-h-full tw-px-[var(--select-padding)] tw-min-w-0;\n }\n\n &__prepend-inner,\n &__append-inner {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pr-3;\n }\n\n &__field-main {\n @apply tw-flex tw-flex-nowrap tw-flex-auto tw-h-full tw-truncate;\n }\n\n &__prefix,\n &__suffix {\n @apply tw-flex tw-items-center tw-flex-wrap tw-pr-3 tw-pointer-events-none tw-text-sm;\n }\n\n &__input {\n @apply tw-appearance-none tw-border-none tw-outline-none tw-flex tw-items-center tw-w-full tw-box-border tw-cursor-pointer invalid:tw-text-[color:var(--select-placeholder-color)] tw-truncate;\n\n &--default {\n @apply tw-min-h-10;\n }\n\n &--small {\n @apply tw-min-h-7;\n }\n }\n\n &__placeholder {\n @apply tw-text-[color:var(--select-placeholder-color)] tw-text-sm tw-truncate;\n }\n\n &__selected {\n @apply tw-flex tw-flex-wrap tw-gap-1 tw-py-1 tw-min-w-0;\n }\n\n &__selected-item {\n @apply tw-flex tw-items-center tw-text-sm tw-truncate;\n }\n\n &__multiple-item {\n @apply tw-bg-[color:var(--select-multiple-options-background-color)] tw-border tw-border-solid\n tw-border-[color:var(--select-multiple-options-border-color)] tw-rounded-[4px]\n tw-flex tw-items-center tw-h-6 tw-box-border tw-px-2 tw-text-xs tw-gap-1;\n }\n\n &__loading {\n @apply tw-text-[color:var(--select-loading-color)];\n }\n\n &__icon-remove {\n @apply tw-text-[color:var(--select-clear-color)] tw-cursor-pointer hover:tw-text-[color:var(--select-clear-color-hover)];\n }\n\n &__chip-remove {\n @apply tw-appearance-none tw-border-0 tw-bg-transparent tw-p-0 tw-cursor-pointer tw-flex tw-items-center tw-rounded-full;\n\n &:focus-visible {\n @apply tw-outline-none tw-ring-2 tw-ring-[color:var(--select-focus-ring-color)];\n }\n }\n\n &__clear {\n @apply tw-cursor-pointer tw-flex tw-items-center tw-pl-3 tw-text-[color:var(--select-clear-color)] hover:tw-text-[color:var(--select-clear-color-hover)];\n }\n\n &__loading-icon {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pl-3 tw-text-[color:var(--select-loading-color)];\n }\n\n &__chevron-container {\n @apply tw-flex tw-items-center tw-flex-nowrap tw-pl-3 tw-cursor-pointer;\n }\n\n &__chevron {\n @apply tw-flex-nowrap tw-text-[color:var(--select-chevron-color)] tw-opacity-50\n tw-transition-transform tw-duration-200\n hover:tw-text-[color:var(--select-chevron-color-hover)] hover:tw-opacity-100;\n }\n\n &__hint-error {\n @apply tw-absolute tw-translate-y-full tw-left-0 tw-right-0 tw-bottom-0 tw-min-h-5;\n }\n\n &__error-message {\n @apply tw-mt-1 [--hint-color:var(--select-border-color-error)];\n }\n\n &__hint {\n @apply tw-text-[color:var(--select-placeholder-color)] tw-mt-1 tw-break-words tw-p-0;\n }\n\n &__dropdown {\n @apply tw-flex tw-flex-col tw-box-border tw-max-h-72 tw-h-auto tw-z-[var(--z-critical-dropdown-panel)]\n tw-overflow-hidden tw-absolute\n tw-bg-[color:var(--select-dropdown-bg)]\n tw-border tw-border-solid tw-border-[color:var(--select-dropdown-border)]\n tw-rounded-[var(--select-border-radius)]\n tw-p-1;\n box-shadow: var(--select-dropdown-shadow);\n }\n\n &__viewport {\n @apply tw-overflow-y-auto tw-overflow-x-hidden tw-flex-1;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n &__scroll-button {\n @apply tw-flex tw-items-center tw-justify-center tw-py-1\n tw-cursor-default tw-shrink-0\n tw-text-[color:var(--select-placeholder-color)]\n tw-transition-opacity tw-duration-150;\n }\n\n &__search-input {\n @apply tw-w-full tw-box-border tw-border tw-border-solid tw-border-[color:var(--select-search-border-color)] tw-bg-transparent tw-rounded-[var(--select-border-radius)] tw-h-8 tw-leading-8 tw-outline-none tw-mb-2 tw-px-2 tw-text-sm\n focus:tw-border-[color:var(--select-border-color-focus)] focus:tw-ring-[3px] focus:tw-ring-[color:var(--select-focus-ring-color)]\n tw-transition-[color,box-shadow] tw-duration-150 tw-ease-in-out;\n }\n\n &__no-options {\n @apply tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center;\n }\n\n &__no-options-text {\n @apply tw-m-4 tw-text-sm tw-font-normal tw-text-[color:var(--select-placeholder-color)];\n }\n\n &__option {\n @apply tw-flex tw-items-center tw-min-h-8 tw-box-border\n tw-py-1.5 tw-pr-8 tw-pl-2\n tw-rounded-[4px]\n tw-cursor-pointer tw-text-sm tw-relative tw-select-none\n hover:tw-bg-[color:var(--select-option-background-color-hover)];\n\n &--selected {\n @apply tw-bg-[color:var(--select-option-background-color-selected)]\n hover:tw-bg-[color:var(--select-option-background-color-selected)];\n }\n }\n\n &__check-icon {\n @apply tw-absolute tw-right-2 tw-flex tw-items-center tw-justify-center\n tw-text-[color:var(--select-option-check-color)];\n }\n\n &__list-loading-indicator {\n @apply tw-flex tw-items-center tw-justify-center tw-p-2 tw-text-sm tw-text-[color:var(--select-text-color)];\n\n span {\n @apply tw-mr-2;\n }\n }\n\n &__load-more-trigger {\n @apply tw-block tw-h-[1px]; /* Ensures it's in layout flow for intersection observer */\n }\n\n &.vc-select--opened &__chevron {\n @apply tw-rotate-180 tw-opacity-100;\n }\n\n &.vc-select--opened &__field-wrapper {\n @apply tw-border-[color:var(--select-border-color-focus)]\n tw-ring-[3px] tw-ring-[color:var(--select-focus-ring-color)]\n tw-outline-none;\n }\n\n &.vc-select--error &__field-wrapper {\n @apply tw-border tw-border-solid tw-border-[color:var(--select-border-color-error)]\n tw-ring-[3px] tw-ring-[color:var(--select-error-ring-color)];\n }\n\n &.vc-select--disabled &__field-wrapper {\n @apply tw-opacity-50;\n }\n\n &.vc-select--disabled &__field-wrapper,\n &.vc-select--disabled &__field,\n &.vc-select--disabled &__input {\n @apply tw-cursor-not-allowed tw-pointer-events-none;\n }\n\n &--focused .vc-select__field-wrapper {\n @apply tw-border-[color:var(--select-border-color-focus)]\n tw-ring-[3px] tw-ring-[color:var(--select-focus-ring-color)]\n tw-outline-none;\n }\n\n &.vc-select--has-hint-or-error {\n @apply tw-pb-5;\n }\n}\n\n// Dropdown enter/leave transition (fade + scale)\n.select-dropdown-enter-active {\n transition:\n opacity 0.15s ease,\n transform 0.15s ease;\n}\n\n.select-dropdown-leave-active {\n transition:\n opacity 0.1s ease,\n transform 0.1s ease;\n}\n\n.select-dropdown-enter-from {\n opacity: 0;\n transform: scale(0.95) translateY(-4px);\n}\n\n.select-dropdown-leave-to {\n opacity: 0;\n transform: scale(0.95) translateY(-4px);\n}\n</style>\n","<template>\n <!-- Skeleton mode -->\n <div\n v-if=\"bladeLoading\"\n class=\"vc-input-dropdown vc-input-dropdown--skeleton\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n\n <!-- Normal mode -->\n <VcSelect\n v-else\n class=\"vc-input-dropdown\"\n :options=\"options\"\n :option-label=\"optionLabel\"\n :option-value=\"optionValue\"\n :searchable=\"searchable\"\n :debounce=\"debounce\"\n :disabled=\"disabled\"\n :label=\"label\"\n :required=\"required\"\n :model-value=\"option\"\n :tooltip=\"tooltip\"\n :multilanguage=\"multilanguage\"\n :current-language=\"currentLanguage\"\n @update:model-value=\"$emit('update:option', $event)\"\n >\n <template #option=\"scope\">\n <slot\n name=\"option\"\n v-bind=\"scope\"\n ></slot>\n </template>\n <template #control=\"{ toggleHandler, isOpened }\">\n <VcInput\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :clearable=\"clearable\"\n :prefix=\"prefix\"\n :suffix=\"suffix\"\n :name=\"name\"\n :model-value=\"modelValue\"\n :loading=\"loading\"\n :disabled=\"disabled\"\n :autofocus=\"autofocus\"\n :error=\"error\"\n :error-message=\"errorMessage\"\n :maxlength=\"maxlength\"\n :type=\"inputType\"\n class=\"vc-input-dropdown__input\"\n @update:model-value=\"$emit('update:model-value', $event)\"\n @blur=\"$emit('blur', $event)\"\n >\n <template #append-inner>\n <div class=\"tw-flex tw-items-center\">\n <slot\n name=\"button\"\n :toggle-handler=\"toggleHandler\"\n >\n <template v-if=\"options && options.length\">\n <button\n type=\"button\"\n class=\"vc-input-dropdown__toggle-button\"\n tabindex=\"0\"\n :aria-label=\"$t('COMPONENTS.CONTROLS.SELECT_OPTION')\"\n :aria-expanded=\"isOpened\"\n aria-haspopup=\"listbox\"\n @click.stop.prevent=\"toggleHandler\"\n @keydown.enter.stop.prevent=\"toggleHandler\"\n @keydown.space.stop.prevent=\"toggleHandler\"\n >\n {{ unref(option) }}\n </button>\n </template>\n </slot>\n <VcButton\n v-if=\"options && options.length\"\n :icon=\"isOpened ? 'lucide-chevron-up' : 'lucide-chevron-down'\"\n icon-size=\"s\"\n text\n :aria-label=\"$t('COMPONENTS.CONTROLS.TOGGLE_DROPDOWN')\"\n icon-class=\"vc-input-dropdown__toggle-button-icon\"\n @click.stop.prevent=\"toggleHandler\"\n ></VcButton>\n </div>\n <slot\n v-if=\"$slots['append-inner']\"\n name=\"append-inner\"\n ></slot>\n </template>\n <template\n v-if=\"$slots.control\"\n #control=\"scope\"\n >\n <slot\n name=\"control\"\n v-bind=\"scope\"\n ></slot>\n </template>\n <template\n v-if=\"$slots['prepend-inner']\"\n #prepend-inner\n >\n <slot name=\"prepend-inner\"></slot>\n </template>\n <template\n v-if=\"$slots['append']\"\n #append\n >\n <slot name=\"append\"></slot>\n </template>\n <template\n v-if=\"$slots['prepend']\"\n #prepend\n >\n <slot name=\"prepend\"></slot>\n </template>\n </VcInput>\n </template>\n </VcSelect>\n</template>\n<script lang=\"ts\" setup>\nimport { unref } from \"vue\";\nimport { VcSelect } from \"@ui/components/molecules/vc-select\";\nimport { VcInput } from \"@ui/components/molecules/vc-input\";\nimport { type OptionProp } from \"@ui/components/molecules/vc-select\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\nimport { VcButton } from \"@ui/components/atoms/vc-button\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport type { ITextFieldProps } from \"@ui/types/form-field\";\n\nexport interface VcInputDropdownProps extends ITextFieldProps {\n /**\n * Model of the input component\n */\n modelValue: string | number | Date | null | undefined;\n /**\n * Prefix\n */\n prefix?: string;\n /**\n * Suffix\n */\n suffix?: string;\n /**\n * Debounce amount (in milliseconds) for search input\n * Default: 0\n */\n debounce?: string | number;\n /**\n * Specify a max length of model\n * Default value: 1024\n */\n maxlength?: string | number;\n /**\n * Default selected option from dropdown\n */\n option: unknown;\n /**\n * Available options that the user can select from.\n * Default value: []\n */\n options?: unknown[];\n /**\n * Property of option which holds the 'value'\n * Default value: id\n * @param option The current option being processed\n * @returns Value of the current option\n */\n optionValue?: OptionProp<unknown>;\n /**\n * Property of option which holds the 'label'\n * Default value: title\n * @param option The current option being processed\n * @returns Label of the current option\n */\n optionLabel?: OptionProp<unknown>;\n /**\n * Enable search in dropdown\n */\n searchable?: boolean;\n /**\n * Type of the input field\n * Default: text\n */\n inputType?: \"text\" | \"password\" | \"email\" | \"tel\" | \"number\" | \"integer\" | \"url\" | \"time\" | \"date\" | \"datetime-local\";\n}\n\nexport interface VcInputDropdownEmits {\n (event: \"update:model-value\", value: string | number | Date | null | undefined): void;\n (event: \"update:option\", value: unknown): void;\n (event: \"change\", value: unknown): void;\n (event: \"blur\", value: Event): void;\n}\n\nconst _props = withDefaults(defineProps<VcInputDropdownProps>(), {\n debounce: 0,\n searchable: false,\n inputType: \"text\",\n});\n\ndefineSlots<{\n /**\n * Slot for custom dropdown open handler\n */\n button: (scope: {\n /**\n * Dropdown open/close handler\n */\n toggleHandler: () => void;\n }) => unknown;\n /**\n * Slot for custom append-inner content\n */\n \"append-inner\": (props: Record<string, never>) => unknown;\n /**\n * Slot for custom prepend-inner content\n */\n \"prepend-inner\": (props: Record<string, never>) => unknown;\n /**\n * Slot for custom append content\n */\n append: (props: Record<string, never>) => unknown;\n /**\n * Slot for custom prepend content\n */\n prepend: (props: Record<string, never>) => unknown;\n /**\n * Slot for custom input control\n */\n control: (scope: {\n placeholder?: string;\n focused?: boolean;\n modelValue: string | number | Date | null | undefined;\n emitValue: (value: string | number | Date | null) => void;\n }) => unknown;\n option: (scope: {\n index: number;\n //todo: Create generic component\n opt: unknown;\n selected: boolean;\n toggleOption: (opt: unknown) => void;\n }) => unknown;\n}>();\n\ndefineEmits<VcInputDropdownEmits>();\n\nconst bladeLoading = useBladeLoading();\n</script>\n\n<style lang=\"scss\">\n:root {\n --input-dropdown-toggle-color: var(--primary-500);\n}\n\n.vc-input-dropdown {\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &__input {\n @apply tw-w-full;\n }\n\n &__toggle-button {\n @apply tw-text-[color:var(--input-dropdown-toggle-color)] tw-not-italic tw-font-medium tw-text-sm tw-cursor-pointer;\n }\n\n &__toggle-button-icon {\n @apply tw-text-[color:var(--input-dropdown-toggle-color)] tw-ml-3;\n }\n}\n</style>\n","<template>\n <!-- Skeleton mode -->\n <div\n v-if=\"bladeLoading\"\n class=\"vc-input-currency vc-input-currency--skeleton\"\n >\n <VcSkeleton\n v-if=\"label\"\n variant=\"block\"\n :width=\"60 + (label?.length || 0) * 4\"\n :height=\"11\"\n />\n <VcSkeleton\n variant=\"block\"\n width=\"100%\"\n :height=\"36\"\n />\n </div>\n\n <!-- Normal mode -->\n <VcInputDropdown\n v-else\n class=\"vc-input-currency\"\n :options=\"options\"\n :option-label=\"optionLabel\"\n :option-value=\"optionValue\"\n :searchable=\"searchable\"\n :debounce=\"debounce\"\n :disabled=\"disabled\"\n :label=\"label\"\n :required=\"required\"\n :option=\"option\"\n :model-value=\"numberValue\"\n :tooltip=\"tooltip\"\n :placeholder=\"placeholder\"\n :hint=\"hint\"\n :clearable=\"clearable\"\n :prefix=\"prefix\"\n :suffix=\"suffix\"\n :name=\"name\"\n :loading=\"loading\"\n :autofocus=\"autofocus\"\n :error=\"error\"\n :error-message=\"errorMessage\"\n :maxlength=\"maxlength\"\n input-type=\"number\"\n @update:model-value=\"updateModel\"\n @update:option=\"$emit('update:option', $event)\"\n @blur=\"handleBlur\"\n >\n <template #control=\"{ placeholder: holder }\">\n <input\n ref=\"inputRef\"\n type=\"text\"\n :disabled=\"disabled\"\n :placeholder=\"holder\"\n :aria-label=\"label || undefined\"\n class=\"vc-input-currency__control\"\n tabindex=\"0\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeyDown\"\n @paste=\"handlePaste\"\n />\n </template>\n </VcInputDropdown>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useCurrencyInput, CurrencyDisplay } from \"vue-currency-input\";\nimport { watch } from \"vue\";\nimport { VcInputDropdown } from \"@ui/components/molecules/vc-input-dropdown\";\nimport { VcSkeleton } from \"@ui/components/atoms/vc-skeleton\";\nimport { useBladeLoading } from \"@ui/composables/useBladeLoading\";\nimport { type OptionProp } from \"@ui/components/molecules/vc-select\";\nimport type { IFormFieldProps } from \"@ui/types\";\n\nexport interface Props extends IFormFieldProps {\n /** Model of the currency component; Use with a listener for 'update:price' event OR use v-model:price directive */\n modelValue: number | null | undefined;\n /** Input placeholder text */\n placeholder?: string;\n /** Input description (hint) text below input component */\n hint?: string;\n /** Appends clearable icon when a value is set; When clicked, model becomes null */\n clearable?: boolean;\n /** Prefix */\n prefix?: string;\n /** Suffix */\n suffix?: string;\n /** Signals the user a process is in progress by displaying a spinner */\n loading?: boolean;\n /** Debounce amount (in milliseconds) for search input. Default: 0 */\n debounce?: string | number;\n /** Focus field on initial component render */\n autofocus?: boolean;\n /** Specify a max length of model. Default value: 1024 */\n maxlength?: string | number;\n /** Option label */\n option?: string;\n /** Available options that the user can select from. Default value: [] */\n options?: unknown[];\n /** Property of option which holds the 'value'. Default value: id */\n optionValue?: OptionProp<unknown>;\n /** Property of option which holds the 'label'. Default value: title */\n optionLabel?: OptionProp<unknown>;\n /** Currency sign display settings */\n currencyDisplay?: `${CurrencyDisplay}`;\n precision?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15;\n /** Enable search in dropdown */\n searchable?: boolean;\n}\n\nexport interface Emits {\n (event: \"update:model-value\", value: string | number | null): void;\n (event: \"update:option\", value: unknown): void;\n (event: \"change\", value: string | number | null): void;\n (event: \"blur\", value: Event): void;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n debounce: 0,\n currencyDisplay: CurrencyDisplay.hidden,\n precision: 2,\n searchable: false,\n});\n\nconst emit = defineEmits<Emits>();\nconst bladeLoading = useBladeLoading();\n\nconst { inputRef, setOptions, numberValue, setValue } = useCurrencyInput(\n {\n locale: navigator.language,\n currency: props.option || \"USD\",\n currencyDisplay: props.currencyDisplay as CurrencyDisplay,\n hideGroupingSeparatorOnFocus: false,\n precision: props.precision,\n hideCurrencySymbolOnFocus: false,\n hideNegligibleDecimalDigitsOnFocus: false,\n },\n false,\n);\n\n// Change currency settings\nwatch(\n () => props.option,\n (newVal) => {\n if (newVal)\n setOptions({\n locale: navigator.language,\n currency: newVal,\n currencyDisplay: props.currencyDisplay as CurrencyDisplay,\n hideGroupingSeparatorOnFocus: false,\n precision: props.precision,\n hideCurrencySymbolOnFocus: false,\n hideNegligibleDecimalDigitsOnFocus: false,\n });\n },\n);\n\nwatch(\n () => props.modelValue,\n (value) => {\n setValue(value as number | null);\n },\n);\n\nwatch(numberValue, (value) => {\n emit(\"update:model-value\", value);\n});\n\nfunction updateModel(value: string | number | Date | null | undefined) {\n if (inputRef.value) {\n inputRef.value.value = value as string;\n }\n numberValue.value = typeof value === \"number\" ? value : value === null ? null : parseFloat(String(value)) || null;\n emit(\"update:model-value\", numberValue.value);\n}\n\nfunction handleBlur(event: Event) {\n emit(\"blur\", event);\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (e.key === \"-\" || e.key === \"e\") {\n e.preventDefault();\n }\n\n // Navigation with Tab and Enter\n if (e.key === \"Tab\") {\n // Standard behavior of tabulation\n } else if (e.key === \"Enter\") {\n // Complete editing and go to the next field\n if (e.target) {\n (e.target as HTMLElement).blur();\n }\n\n // Find all tabindex elements and go to the next one\n const allElements = Array.from(document.querySelectorAll('[tabindex=\"0\"]:not(:disabled)'));\n const currentIndex = allElements.indexOf(e.target as HTMLElement);\n\n if (currentIndex >= 0 && currentIndex < allElements.length - 1) {\n (allElements[currentIndex + 1] as HTMLElement).focus();\n }\n }\n}\n\nfunction handlePaste(e: ClipboardEvent) {\n const pasteData = e.clipboardData?.getData(\"text/plain\");\n if (typeof pasteData !== \"undefined\" && parseInt(pasteData) < 0) {\n e.preventDefault();\n }\n}\n</script>\n\n<style lang=\"scss\">\n:root {\n --input-curr-toggle-color: var(--primary-500);\n}\n\n.vc-input-currency {\n &--skeleton {\n @apply tw-flex tw-flex-col tw-gap-1.5;\n }\n\n &__control {\n @apply tw-border-none tw-px-0 tw-py-0 tw-text-sm tw-outline-none tw-bg-transparent tw-w-full tw-h-full;\n }\n}\n</style>\n","import { inject, provide, ref, type InjectionKey, type Ref } from \"vue\";\n\ninterface AppBarState {\n activeWidgetId: Ref<string | null>;\n activeMobileActionId: Ref<string | null>;\n}\n\nconst AppBarStateKey: InjectionKey<AppBarState> = Symbol(\"VcAppBarState\");\n\nconst fallbackState: AppBarState = {\n activeWidgetId: ref<string | null>(null),\n activeMobileActionId: ref<string | null>(null),\n};\n\n/**\n * Provides scoped AppBar state for a single VcApp instance.\n * This prevents cross-instance state leaks when multiple shell roots exist.\n */\nexport function provideAppBarState(): AppBarState {\n const state: AppBarState = {\n activeWidgetId: ref<string | null>(null),\n activeMobileActionId: ref<string | null>(null),\n };\n\n provide(AppBarStateKey, state);\n return state;\n}\n\n/**\n * Returns AppBar state from the nearest provider.\n * Falls back to a shared state for backward compatibility in legacy usage.\n */\nexport function useAppBarState(): AppBarState {\n return inject(AppBarStateKey, fallbackState);\n}\n","import type { InjectionKey, Ref, ComputedRef } from \"vue\";\nimport type { ColumnCollector } from \"@ui/components/organisms/vc-data-table/utils/ColumnCollector\";\nimport type { FilterValue } from \"@ui/components/organisms/vc-data-table/types\";\n\n// TableContext moved here from useTableContext.ts to break circular dependency\nexport interface TableContext<_T = any> {\n selectedRowIndex: ComputedRef<number | undefined>;\n setSelectedRowIndex: (index: number | undefined) => void;\n variant: ComputedRef<string | undefined>;\n}\n\nexport const TableContextKey: InjectionKey<TableContext> = Symbol(\"TableContext\");\nexport const ColumnCollectorKey: InjectionKey<ColumnCollector> = Symbol(\"ColumnCollector\");\nexport const FillerWidthKey: InjectionKey<ComputedRef<number>> = Symbol(\"FillerWidth\");\nexport const IsColumnReorderingKey: InjectionKey<Ref<boolean>> = Symbol(\"IsColumnReordering\");\n\nexport interface FilterContext {\n filterValues: Ref<Record<string, FilterValue>>;\n updateFilter: (field: string, value: FilterValue) => void;\n clearFilter: (field: string) => void;\n clearAllFilters: () => void;\n hasActiveFilters: ComputedRef<boolean>;\n activeFilterCount: ComputedRef<number>;\n}\n\nexport const FilterContextKey: InjectionKey<FilterContext> = Symbol(\"FilterContext\");\n","<script lang=\"ts\">\n/**\n * VcColumn - Renderless column definition component for VcDataTable\n *\n * This component does not render any DOM elements. Instead, it registers itself\n * with the parent VcDataTable via inject/provide pattern.\n *\n * Usage:\n * ```vue\n * <VcDataTable :items=\"data\">\n * <VcColumn id=\"name\" field=\"name\" title=\"Name\" sortable />\n * <VcColumn id=\"price\" field=\"price\" title=\"Price\" type=\"money\">\n * <template #editor=\"{ data, field }\">\n * <VcInputCurrency v-model=\"data[field]\" />\n * </template>\n * </VcColumn>\n * </VcDataTable>\n * ```\n */\nimport { defineComponent, inject, onMounted, onUnmounted, getCurrentInstance } from \"vue\";\nimport type { PropType } from \"vue\";\nimport { ColumnCollectorKey } from \"@ui/components/organisms/vc-data-table/keys\";\nimport type { VcColumnProps, ColumnFilterConfig } from \"@ui/components/organisms/vc-data-table/types\";\n\n// Cell type options matching existing cell formatters\nexport type CellType =\n | \"text\"\n | \"number\"\n | \"money\"\n | \"date\"\n | \"date-ago\"\n | \"time\"\n | \"datetime\"\n | \"image\"\n | \"link\"\n | \"html\"\n | \"status\"\n | \"status-icon\";\n\nexport default defineComponent({\n name: \"VcColumn\",\n inheritAttrs: false,\n\n props: {\n // === Identity ===\n /** Unique column identifier (must be unique within the table) */\n id: {\n type: String,\n required: true,\n },\n /** Data field path to read from each item (default: same as `id`) */\n field: {\n type: String,\n default: undefined,\n },\n\n // === Display ===\n /** Column header title text */\n title: {\n type: String,\n default: undefined,\n },\n /** Cell formatter type — determines how cell value is rendered */\n type: {\n type: String as PropType<CellType>,\n default: \"text\",\n },\n /** Field name to read currency code from (used with `type=\"money\"`, default: `\"currency\"`) */\n currencyField: {\n type: String,\n default: \"currency\",\n },\n /** Date/number format string (e.g. `\"DD.MM.YYYY\"`) */\n format: {\n type: String,\n default: undefined,\n },\n\n // === Sizing ===\n /** Column width in px or CSS string (e.g. `200`, `\"150px\"`) */\n width: {\n type: [String, Number] as PropType<string | number>,\n default: undefined,\n },\n /** Minimum column width (default: `60px`) */\n minWidth: {\n type: [String, Number] as PropType<string | number>,\n default: undefined,\n },\n /** Maximum column width */\n maxWidth: {\n type: [String, Number] as PropType<string | number>,\n default: undefined,\n },\n\n // === Alignment ===\n /** Cell text alignment */\n align: {\n type: String as PropType<\"start\" | \"center\" | \"end\">,\n default: undefined,\n },\n /** Header text alignment (default: same as `align`) */\n headerAlign: {\n type: String as PropType<\"start\" | \"center\" | \"end\">,\n default: undefined,\n },\n\n // === Sorting ===\n /** Whether the column is sortable (shows sort icon on hover) */\n sortable: {\n type: Boolean,\n default: false,\n },\n /** Override backend field name for sorting (default: column `id`) */\n sortField: {\n type: String,\n default: undefined,\n },\n\n // === Filtering ===\n /** Declarative filter config: `true` for text, `\"field\"` for text with custom field, or object for select/dateRange */\n filter: {\n type: [Boolean, String, Object] as PropType<ColumnFilterConfig>,\n default: undefined,\n },\n /** Override backend field name for filtering (default: column `id`) */\n filterField: {\n type: String,\n default: undefined,\n },\n /** Placeholder text for the filter input */\n filterPlaceholder: {\n type: String,\n default: undefined,\n },\n\n // === Visibility ===\n /** Whether the column is visible (default: `true`). Hidden columns can be toggled via column switcher */\n visible: {\n type: Boolean,\n default: true,\n },\n /** If `true`, column stays visible even when `showAllColumns=false` (e.g. when blade narrows) */\n alwaysVisible: {\n type: Boolean,\n default: false,\n },\n\n // === Editing ===\n /** Whether the cell is editable (enables inline edit on click) */\n editable: {\n type: Boolean,\n default: false,\n },\n /** Validation rules for the editable cell (field name → validator) */\n rules: {\n type: Object as PropType<Record<string, unknown>>,\n default: undefined,\n },\n\n // === Styling ===\n /** Custom CSS class applied to the entire column (header + body cells) */\n class: {\n type: String,\n default: undefined,\n },\n /** Custom CSS class applied only to the header cell */\n headerClass: {\n type: String,\n default: undefined,\n },\n /** Custom CSS class applied only to body cells */\n bodyClass: {\n type: String,\n default: undefined,\n },\n /** Number of lines to clamp cell text to (`0` = no clamp, default: `2`) */\n lineClamp: {\n type: Number,\n default: 2,\n },\n\n // === Special modes ===\n /** Renders a selection checkbox column (`\"single\"` = radio, `\"multiple\"` = checkbox) */\n selectionMode: {\n type: String as PropType<\"single\" | \"multiple\">,\n default: undefined,\n },\n /** Renders row edit save/cancel buttons in this column */\n rowEditor: {\n type: Boolean,\n default: false,\n },\n /** Renders a drag handle for row reordering */\n rowReorder: {\n type: Boolean,\n default: false,\n },\n /** Renders an expand/collapse toggle for row expansion */\n expander: {\n type: Boolean,\n default: false,\n },\n\n // === Mobile ===\n /**\n * Mobile card role — determines how column is displayed on mobile.\n * - `\"title\"`: Primary identifier, displayed at top (full width, bold)\n * - `\"image\"`: Visual element, displayed on left side\n * - `\"field\"`: Data with label, auto-distributed in 2x2 grid (max 4)\n * - `\"status\"`: Status badge, displayed at bottom (multiple allowed)\n */\n mobileRole: {\n type: String as PropType<\"title\" | \"image\" | \"field\" | \"status\">,\n default: undefined,\n },\n /** Explicit grid position for mobile card layout */\n mobilePosition: {\n type: String as PropType<\"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\">,\n default: undefined,\n },\n /** Whether column is visible on mobile (default: `true` — hidden unless `mobileRole` is specified) */\n mobileVisible: {\n type: Boolean,\n default: true,\n },\n },\n\n setup(props, { slots }) {\n // Inject the column collector from parent VcDataTable\n const $columns = inject(ColumnCollectorKey, null);\n const instance = getCurrentInstance();\n\n onMounted(() => {\n if ($columns && instance) {\n // Register this column with the parent\n $columns.add({\n instance,\n props: props as VcColumnProps,\n slots,\n });\n }\n });\n\n onUnmounted(() => {\n if ($columns && instance) {\n $columns.delete(instance);\n }\n });\n\n // Renderless component - returns null\n return () => null;\n },\n});\n</script>\n","import { shallowReactive, type Component, type DefineComponent } from \"vue\";\r\n\r\n/**\r\n * Supported cell types for VcDataTable columns.\r\n * Maps to cell formatter components.\r\n */\r\nexport type CellType =\r\n | \"text\"\r\n | \"number\"\r\n | \"money\"\r\n | \"date\"\r\n | \"date-ago\"\r\n | \"time\"\r\n | \"datetime\"\r\n | \"image\"\r\n | \"link\"\r\n | \"html\"\r\n | \"status\"\r\n | \"status-icon\";\r\n\r\n/**\r\n * Configuration for cell type-specific props.\r\n * Different cell types may require additional props beyond the common ones.\r\n */\r\nexport interface CellTypeConfig {\r\n /** Whether this cell type supports inline editing */\r\n editable?: boolean;\r\n /** Additional props to pass to the cell component */\r\n additionalProps?: string[];\r\n}\r\n\r\n/**\r\n * Registration entry for a cell component in the registry.\r\n */\r\nexport interface CellRegistration {\r\n /** The cell type identifier */\r\n type: CellType | string;\r\n /** The Vue component to render for this cell type */\r\n component: Component | DefineComponent<any, any, any>;\r\n /** Optional configuration for this cell type */\r\n config?: CellTypeConfig;\r\n}\r\n\r\n// Reactive registry - changes trigger Vue reactivity\r\nconst registry = shallowReactive(new Map<string, CellRegistration>());\r\n\r\n/**\r\n * useCellRegistry - Composable for managing cell type components.\r\n *\r\n * Implements the Registry pattern with Vue 3 reactivity:\r\n * 1. Decouples cell type definitions from the renderer\r\n * 2. Easy registration of custom cell types\r\n * 3. Open/Closed Principle: extend without modifying DataTableCellRenderer\r\n * 4. Reactive: changes trigger component updates\r\n *\r\n * @example\r\n * ```ts\r\n * const { register, get, has } = useCellRegistry();\r\n *\r\n * // Register a custom cell type\r\n * register({\r\n * type: \"rating\",\r\n * component: CellRating,\r\n * config: { editable: false }\r\n * });\r\n *\r\n * // Get component for a type\r\n * const registration = get(\"rating\");\r\n * ```\r\n */\r\nexport function useCellRegistry() {\r\n /**\r\n * Register a cell type with its component.\r\n * @param registration - The cell registration entry\r\n */\r\n const register = (registration: CellRegistration): void => {\r\n registry.set(registration.type, registration);\r\n };\r\n\r\n /**\r\n * Get the registration for a cell type.\r\n * @param type - The cell type to look up\r\n * @returns The registration entry or undefined if not found\r\n */\r\n const get = (type: string): CellRegistration | undefined => {\r\n return registry.get(type);\r\n };\r\n\r\n /**\r\n * Check if a cell type is registered.\r\n * @param type - The cell type to check\r\n */\r\n const has = (type: string): boolean => {\r\n return registry.has(type);\r\n };\r\n\r\n /**\r\n * Get all registered cell types.\r\n * @returns Array of registered type names\r\n */\r\n const getRegisteredTypes = (): string[] => {\r\n return Array.from(registry.keys());\r\n };\r\n\r\n /**\r\n * Unregister a cell type.\r\n * @param type - The cell type to remove\r\n */\r\n const unregister = (type: string): boolean => {\r\n return registry.delete(type);\r\n };\r\n\r\n /**\r\n * Clear all registrations.\r\n */\r\n const clear = (): void => {\r\n registry.clear();\r\n };\r\n\r\n return {\r\n register,\r\n get,\r\n has,\r\n getRegisteredTypes,\r\n unregister,\r\n clear,\r\n };\r\n}\r\n\r\nexport type UseCellRegistryReturn = ReturnType<typeof useCellRegistry>;\r\n","import { defineComponent, type PropType, type VNode } from \"vue\";\n\n/**\n * Stable wrapper for rendering slot functions without recreating the component tree.\n *\n * When VcColumn slots are captured at setup time, they become static function references.\n * Passing them directly as children would cause Vue to diff them as new VNodes on every\n * parent re-render, destroying and recreating the subtree. SlotProxy wraps the function\n * in a stable component instance so Vue can reuse the existing DOM.\n */\nexport const SlotProxy = defineComponent({\n name: \"SlotProxy\",\n props: {\n slotFn: { type: Function as PropType<(scope: Record<string, unknown>) => VNode | VNode[]>, required: true },\n scope: { type: Object as PropType<Record<string, unknown>>, default: () => ({}) },\n },\n setup(props) {\n return () => props.slotFn(props.scope);\n },\n});\n","import { DirectiveBinding } from \"vue\";\nimport \"./styles.css\";\n\ninterface LoadingOptions {\n size?: \"small\" | \"medium\" | \"large\";\n color?: string;\n blur?: boolean;\n fullscreen?: boolean;\n}\n\nexport const loading = (el: HTMLElement, binding: DirectiveBinding) => {\n const zIndex = binding.arg ? parseInt(binding.arg, 10) : 9000;\n\n const options: LoadingOptions = typeof binding.value === \"object\" ? binding.value : { blur: true };\n\n if (binding.value) {\n el.classList.add(\"v-loading\");\n\n if (options.size) {\n el.setAttribute(\"data-loading-size\", options.size);\n }\n\n if (options.color) {\n el.style.setProperty(\"--v-loading-spinner-color\", options.color);\n }\n\n if (options.blur === false) {\n el.classList.add(\"v-loading--no-blur\");\n }\n\n if (options.fullscreen) {\n el.classList.add(\"v-loading--fullscreen\");\n }\n\n el.style.setProperty(\"--v-loading-z-index\", `${zIndex}`);\n } else {\n el.classList.remove(\"v-loading\", \"v-loading--no-blur\", \"v-loading--fullscreen\");\n el.removeAttribute(\"data-loading-size\");\n el.style.removeProperty(\"--v-loading-z-index\");\n el.style.removeProperty(\"--v-loading-spinner-color\");\n }\n};\n"],"names":["i18n","createI18n","generateId","FrameworkError","message","code","context","ValidationError","ServiceError","InjectionError","serviceName","RegistrationError","componentName","reason","BladeError","bladeId","ModuleLoadError","moduleId","isFrameworkError","error","wrapError","DisplayableError","shortMessage","details","originalError","parseError","errorToParse","parsed","errorObject","status","statusText","data","logger","createLogger","convertColorNameToHex","colorName","canvas","ctx","isValidHexColor","value","normalizedValue","normalizeHexColor","hex","createBackendRegistry","onChange","impl","next","createKeyedBackendRegistry","store","key","useUserManagement","internals","_sharedInternalUserLogic","usePermissions","user","hasAccess","permissions","userPermissions","permission","backendRegistry","setNotificationBackend","backend","showNotification","content","options","_backend","mergeProps","notification","notificationId","item","updatedOptions","contentToUse","updateOptions","position","groupedNotifications","acc","items","all","rule","defineRule","mindimensions","images","width","height","validateImage","file","URL","resolve","image","objectUrl","isValid","list","fileList","i","res","isInvalid","x","fileWeight","size","maxSize","fileSizeChecker","compare","target","comparer","errorMessage","first_date","second_date","before","first","second","after","bigInt","createPreregistrationBus","instances","preregister","broadcast","service","e","unregister","id","removePreregistered","predicate","getPreregistered","replayInto","dispose","cb","getFirstInstance","createBladeScopedRegistry","registry","reactive","registrations","registrationCountById","incrementCount","decrementCount","count","register","normalizedBladeId","existing","registryItem","itemId","bladeItems","itemIndex","removedItem","registrationIndex","r","get","clear","index","update","partial","isRegistered","createSimpleMapRegistry","itemsMap","ref","sortedItems","computed","a","b","opts","createGenericItemRegistry","mapRegistry","menuItemIdentity","_.omit","preregisteredMenuBadges","menuServiceBus","addMenuItem","removeRegisteredMenuItem","stored","isSameMenuItem","setMenuBadge","badge","getMenuBadge","removeMenuBadge","getMenuBadges","DEFAULT_PRIORITY","DEFAULT_GROUP_PRIORITY","left","right","extractGroupInfo","_.snakeCase","sortByPriority","sortByGroupPriority","p","addItemToGroup","groups","info","groupItem","children","childIndex","c","buildMenuTree","rawItems","standalone","finalizeMenuItems","createMenuService","menuItems","rawMenu","menuBadges","removeMenuItem","raw","createServiceRegistry","create","bus","name","onMissing","provideService","existingService","inject","provide","getCurrentScope","onScopeDispose","useService","MenuServiceKey","getCurrentInstance","provideMenuService","useMenuService","useResponsive","IsMobileKey","IsDesktopKey","IsPhoneKey","IsTabletKey","IsTouchKey","AppInsightsOptionsKey","AppInsightsInstanceKey","useAppInsights","appInsights","appInsightsOptions","setupPageTracking","appName","pageName","route","beforeEach","generateW3CId","afterEach","url","useErrorHandler","capture","instance","isProcessing","reset","onErrorCaptured","err","capturedError","nextTick","pending","setPendingErrorNotification","timerId","notifId","cancelPendingErrorNotification","directEntry","entry","notification$1","_Interceptor","defineComponent","props","slots","descriptor","BladeDescriptorKey","bladeStack","BladeStackKey","hasBlade","watch","newError","ButtonGroupKey","useBladeLoading","BladeLoadingKey","SIZE_ALIAS","__props","bladeLoading","emit","__emit","group","effectiveSize","buttonClass","onClick","_unref","_createElementBlock","_createBlock","VcIcon","$slots","_openBlock","_hoisted_2","_renderSlot","_ctx","useFloatingPosition","referenceEl","floatingEl","resolvedPlacement","toValue","resolvedStrategy","resolvedMiddleware","explicitMiddleware","middleware","flip","shift","offsetValue","floatingOffset","floating","useFloating","autoUpdate","floatingStyle","InputGroupContextKey","useFormField","groupContext","uid","useId","fieldId","labelId","errorId","hintId","invalid","resolvedDisabled","resolvedName","ariaRequired","ariaDescribedBy","ids","useScrollArrows","viewportRef","speed","canScrollUp","canScrollDown","scrollAnimationId","updateScrollState","el","startScroll","direction","stopScroll","tick","useResizeObserver","onBeforeUnmount","useTeleportTarget","appRootRef","AppRootElementKey","explicitTarget","getRowWidth","normalizeSize","_createElementVNode","_toDisplayString","_Fragment","_renderList","_normalizeStyle","_normalizeClass","_hoisted_4","component","scroll","scrollTop","onScroll","__expose","_resolveDynamicComponent","VcHint","_Hint","tooltipId","tooltipVisible","tooltipCompRef","tooltipRef","arrowRef","showTimeout","teleportTarget","mw","offsetMiddleware","arrowMiddleware","floatingStyles","middlewareData","resolvedMaxWidth","tooltipStyle","side","arrowStyle","style","staticSide","showTooltip","hideTooltip","_Teleport","_createVNode","_Transition","_hoisted_1","_hoisted_3","VcTooltip","_hoisted_5","SCROLL_STEP","scrollByKey","delta","$t","_cache","args","toolbarBus","reg","registerToolbarItem","toolbarItem","createToolbarService","bladeRegistry","unregisterToolbarItem","toolbarItemId","getToolbarItems","globalItems","result","existingIds","clearBladeToolbarItems","updateToolbarItem","FALLBACK_BLADE_ID","globalToolbarService","ToolbarServiceKey","provideToolbarService","useToolbar","autoCleanup","toolbarService","resolveBladeId","targetBladeId","externalWidgets","normalizeTargetBlades","targetBlades","registerExternalWidget","widget","getExternalWidgetsForBlade","getAllExternalWidgets","cloneWidget","cloneDeep","widgetBus","registerWidget","createWidgetService","widgetId","_themeRegistry","useTheme","createSharedComposable","t","themesToAdd","themeDef","themeKeysToRemove","keyToRemove","themeKeys","mode","useColorMode","state","useCycleList","watchEffect","setTheme","themeKey","currentLocalizedName","currentDef","_.capitalize","dashboardBus","registerDashboardWidget","createState","shallowReactive","createDashboardService","DashboardServiceKey","hasAccessResolver","provideDashboardService","useDashboard","appBarWidgetBus","addAppBarWidget","createAppBarWidgetService","currentSize","markRaw","settingsMenuBus","addSettingsMenuItem","createSettingsMenuService","SettingsMenuServiceKey","provideSettingsMenu","useSettingsMenu","isMobile","isDesktop","isFocused","locale","internalValue","pendingRangeStart","maxDate","isBrowserLocale24h","hr","textInputParseFormat","includeTime","parts","tokenMap","resolvedDatePickerOptions","userTextInput","formatDateWithLocale","date","formatSingleDate","d","newVal","oldVal","onReset","handleRangeStart","handleRangeEnd","handleBlur","handleFocus","VcSkeleton","VcLabel","_mergeProps","$event","_hoisted_6","_hoisted_7","inputId","isSyncing","inputRef","colorPickerRef","textValue","colorValue","syncColorFromText","trimmed","hexColor","newColorValue","onTextInput","handleColorPickerChange","event","openColorPicker","focus","_hoisted_9","_hoisted_10","_hoisted_11","attrs","useAttrs","rootAttrs","_class","rest","emitTimer","emitValueFn","temp","internalType","unref","mutatedModel","internalTypeComputed","rawModel","handleValue","onInput","onKeyDown","allowedKeys","keypressed","emitValue","val","$attrs","VcDatePicker","v","VcColorInput","_hoisted_8","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","FontSize","Extension","element","attributes","fontSize","chain","useKeyboardNavigation","containerSelector","itemSelector","onEnter","onEscape","loop","container","focusedItemIndex","validateFocusedIndex","elements","handleKeyDown","focusableElements","handleTabNavigation","focusNextElement","focusPreviousElement","currentElement","elementToFocus","focusFirstElement","focusLastElement","initKeyboardNavigation","cleanupKeyboardNavigation","onMounted","getPropValueFn","propValue","defaultVal","opt","useSelectValueMapping","getOptionValue","getOptionLabel","getOption","valueCache","defaultValues","optionsList","fn","isEqual","getEmittingOptionValue","fieldValueIsFilled","useSelectVisibility","selectRootRef","isSelectVisible","rootVisibilityObserver","fallbackTimerId","checkVisibilityFallback","rect","ensureVisibility","onUnmounted","useSelectDropdown","isOpened","dropdownToggleRef","dropdownRef","sameWidth","rects","popper","uiOffset","dropdownStyle","toggleDropdown","useSelectDataSource","cachedItems","searchResults","totalCount","loading","searchLoading","filterString","resolvedDefaults","defaultOptionLoading","resolveCache","isLoaded","debounceTimer","displayItems","hasMore","populateResolveCache","open","optionsSource","close","loadMore","newItems","executeSearch","keyword","label","debounceMs","clearSearch","stillMissing","found","resolved","refresh","currentDefaults","useSelectSelection","innerValueCache","innerValue","mapNull","cache","values","fromCache","innerOptionsValue","isOptionSelected","selectedScope","toggleOption","removeAtIndex","hasValue","optionScope","optValue","model","useI18n","toggleRef","_withModifiers","$emit","_withKeys","_hoisted_16","_hoisted_17","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","dropdownElRef","searchInputRef","scrollContainerRef","loadMoreRef","onDropdownWheel","atTop","atBottom","opened","VcScrollableContainer","_createTextVNode","vOnClickOutside","_t","_resolvedName","listboxId","selectTriggerRef","selectDropdownRef","dataSource","loadMoreEl","viewportRoot","useIntersectionObserver","isIntersecting","keyboardNavigation","onClickOutside","newIsOpened","dropdownEl","searchInput","firstFocusable","currentModelVal","emitVal","toResolve","stringIds","DOMPurify","SelectTrigger","_withCtx","scope","SelectDropdown","VcSelect","toggleHandler","VcInput","VcButton","setOptions","numberValue","setValue","useCurrencyInput","updateModel","allElements","currentIndex","handlePaste","pasteData","VcInputDropdown","holder","AppBarStateKey","fallbackState","provideAppBarState","useAppBarState","TableContextKey","ColumnCollectorKey","FillerWidthKey","IsColumnReorderingKey","FilterContextKey","_sfc_main","$columns","useCellRegistry","registration","type","SlotProxy","binding","zIndex"],"mappings":"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"}