@quazardous/qdadm 1.19.3
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.
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/package.json +101 -0
- package/src/assets/logo.svg +6 -0
- package/src/auth/SessionAuthAdapter.ts +459 -0
- package/src/auth/index.ts +15 -0
- package/src/chain/ActiveStack.ts +154 -0
- package/src/chain/StackHydrator.ts +292 -0
- package/src/chain/index.ts +25 -0
- package/src/chain/useActiveStack.ts +120 -0
- package/src/chain/useStackHydrator.ts +155 -0
- package/src/components/BoolCell.vue +34 -0
- package/src/components/InfoBanner.vue +73 -0
- package/src/components/QdadmRoot.vue +52 -0
- package/src/components/SeverityTag.vue +86 -0
- package/src/components/dialogs/BulkStatusDialog.vue +60 -0
- package/src/components/dialogs/MultiStepDialog.vue +331 -0
- package/src/components/dialogs/SimpleDialog.vue +122 -0
- package/src/components/dialogs/UnsavedChangesDialog.vue +80 -0
- package/src/components/display/BannerZone.vue +65 -0
- package/src/components/display/CardsGrid.vue +72 -0
- package/src/components/display/CopyableId.vue +84 -0
- package/src/components/display/EmptyState.vue +62 -0
- package/src/components/display/IntensityBar.vue +190 -0
- package/src/components/display/RichCardsGrid.vue +101 -0
- package/src/components/edit/FormActions.vue +78 -0
- package/src/components/edit/FormField.vue +82 -0
- package/src/components/edit/FormInput.vue +158 -0
- package/src/components/edit/FormPage.vue +260 -0
- package/src/components/edit/FormTab.vue +217 -0
- package/src/components/edit/FormTabs.vue +120 -0
- package/src/components/edit/LookupField.vue +406 -0
- package/src/components/edit/LookupPickerDialog.vue +230 -0
- package/src/components/editors/JsonEditorFoldable.vue +470 -0
- package/src/components/editors/JsonStructuredField.vue +264 -0
- package/src/components/editors/JsonViewer.vue +51 -0
- package/src/components/editors/KeyValueEditor.vue +314 -0
- package/src/components/editors/LanguageEditor.vue +259 -0
- package/src/components/editors/PermissionEditor.vue +558 -0
- package/src/components/editors/ScopeEditor.vue +372 -0
- package/src/components/editors/VanillaJsonEditor.vue +183 -0
- package/src/components/index.ts +83 -0
- package/src/components/item/FieldGroups.vue +392 -0
- package/src/components/layout/AppLayout.vue +1032 -0
- package/src/components/layout/BaseLayout.vue +190 -0
- package/src/components/layout/Breadcrumb.vue +55 -0
- package/src/components/layout/DashboardLayout.vue +104 -0
- package/src/components/layout/FormLayout.vue +256 -0
- package/src/components/layout/ListLayout.vue +278 -0
- package/src/components/layout/PageHeader.vue +156 -0
- package/src/components/layout/PageLayout.vue +126 -0
- package/src/components/layout/PageNav.vue +192 -0
- package/src/components/layout/SidebarBox.vue +87 -0
- package/src/components/layout/Zone.vue +182 -0
- package/src/components/layout/defaults/DefaultBreadcrumb.vue +149 -0
- package/src/components/layout/defaults/DefaultFooter.vue +89 -0
- package/src/components/layout/defaults/DefaultFormActions.vue +67 -0
- package/src/components/layout/defaults/DefaultHeader.vue +78 -0
- package/src/components/layout/defaults/DefaultMenu.vue +188 -0
- package/src/components/layout/defaults/DefaultPagination.vue +75 -0
- package/src/components/layout/defaults/DefaultTable.vue +137 -0
- package/src/components/layout/defaults/DefaultUserInfo.vue +111 -0
- package/src/components/layout/defaults/index.ts +16 -0
- package/src/components/lists/ActionButtons.vue +49 -0
- package/src/components/lists/ActionColumn.vue +40 -0
- package/src/components/lists/FilterBar.vue +54 -0
- package/src/components/lists/ListPage.vue +467 -0
- package/src/components/pages/LoginPage.vue +334 -0
- package/src/components/pages/NotFoundPage.vue +98 -0
- package/src/components/show/ShowDisplay.vue +343 -0
- package/src/components/show/ShowField.vue +67 -0
- package/src/components/show/ShowPage.vue +431 -0
- package/src/composables/index.ts +155 -0
- package/src/composables/useApp.ts +67 -0
- package/src/composables/useAuth.ts +98 -0
- package/src/composables/useBareForm.ts +319 -0
- package/src/composables/useBreadcrumb.ts +252 -0
- package/src/composables/useChildPage.ts +113 -0
- package/src/composables/useCurrentEntity.ts +60 -0
- package/src/composables/useDeferred.ts +94 -0
- package/src/composables/useDirtyState.ts +138 -0
- package/src/composables/useEntityItemFormPage.ts +942 -0
- package/src/composables/useEntityItemFormPage.types.ts +451 -0
- package/src/composables/useEntityItemPage.ts +438 -0
- package/src/composables/useEntityItemShowPage.ts +722 -0
- package/src/composables/useFieldManager.ts +692 -0
- package/src/composables/useForm.ts +544 -0
- package/src/composables/useGuardStore.ts +53 -0
- package/src/composables/useHooks.ts +56 -0
- package/src/composables/useInfoBanner.ts +217 -0
- package/src/composables/useJsonSyntax.ts +122 -0
- package/src/composables/useLayoutResolver.ts +329 -0
- package/src/composables/useListPage.ts +1535 -0
- package/src/composables/useListPage.types.ts +437 -0
- package/src/composables/useListPage.utils.ts +101 -0
- package/src/composables/useNavContext.ts +439 -0
- package/src/composables/useNavigation.ts +216 -0
- package/src/composables/useOptionsLookup.ts +323 -0
- package/src/composables/usePageTitle.ts +84 -0
- package/src/composables/useSSEBridge.ts +142 -0
- package/src/composables/useSemanticBreadcrumb.ts +222 -0
- package/src/composables/useSidebarState.ts +24 -0
- package/src/composables/useSignals.ts +52 -0
- package/src/composables/useUnsavedChangesGuard.ts +155 -0
- package/src/composables/useUserImpersonator.ts +317 -0
- package/src/composables/useZoneRegistry.ts +252 -0
- package/src/core/bundles.ts +558 -0
- package/src/core/decorator.ts +420 -0
- package/src/core/extension.ts +470 -0
- package/src/core/index.ts +59 -0
- package/src/deferred/DeferredRegistry.ts +353 -0
- package/src/deferred/index.ts +15 -0
- package/src/editors/index.ts +12 -0
- package/src/entity/EntityManager.cache.ts +530 -0
- package/src/entity/EntityManager.crud.ts +615 -0
- package/src/entity/EntityManager.interface.ts +78 -0
- package/src/entity/EntityManager.query.ts +221 -0
- package/src/entity/EntityManager.relations.ts +151 -0
- package/src/entity/EntityManager.ts +944 -0
- package/src/entity/EntityManager.types.ts +288 -0
- package/src/entity/auth/CompositeAuthAdapter.ts +194 -0
- package/src/entity/auth/EntityAuthAdapter.ts +119 -0
- package/src/entity/auth/PermissiveAdapter.ts +43 -0
- package/src/entity/auth/RoleHierarchy.ts +128 -0
- package/src/entity/auth/SecurityChecker.ts +202 -0
- package/src/entity/auth/factory.ts +203 -0
- package/src/entity/auth/index.ts +47 -0
- package/src/entity/factory.test.js +189 -0
- package/src/entity/factory.ts +146 -0
- package/src/entity/index.ts +49 -0
- package/src/entity/storage/ApiStorage.ts +228 -0
- package/src/entity/storage/IStorage.ts +100 -0
- package/src/entity/storage/LocalStorage.ts +200 -0
- package/src/entity/storage/MemoryStorage.ts +184 -0
- package/src/entity/storage/MockApiStorage.ts +318 -0
- package/src/entity/storage/SdkStorage.ts +377 -0
- package/src/entity/storage/factory.test.js +159 -0
- package/src/entity/storage/factory.ts +209 -0
- package/src/entity/storage/index.ts +75 -0
- package/src/gen/FieldMapper.ts +122 -0
- package/src/gen/StorageProfileFactory.ts +93 -0
- package/src/gen/connectors/BaseConnector.ts +150 -0
- package/src/gen/connectors/ManualConnector.test.js +499 -0
- package/src/gen/connectors/ManualConnector.ts +414 -0
- package/src/gen/connectors/OpenAPIConnector.test.js +836 -0
- package/src/gen/connectors/OpenAPIConnector.ts +693 -0
- package/src/gen/connectors/__fixtures__/sample-openapi.json +311 -0
- package/src/gen/connectors/index.ts +27 -0
- package/src/gen/createManagers.ts +245 -0
- package/src/gen/decorators.ts +134 -0
- package/src/gen/generateManagers.test.js +540 -0
- package/src/gen/generateManagers.ts +398 -0
- package/src/gen/index.ts +66 -0
- package/src/gen/schema.ts +248 -0
- package/src/gen/vite-plugin.ts +114 -0
- package/src/generated/managers/testManager.js +45 -0
- package/src/generated/managers/testManager.ts +46 -0
- package/src/hooks/HookRegistry.ts +16 -0
- package/src/hooks/index.ts +15 -0
- package/src/i18n/I18n.ts +344 -0
- package/src/i18n/IncrementalDomainProvider.ts +153 -0
- package/src/i18n/InlineTranslationProvider.ts +4 -0
- package/src/i18n/LazyTranslationProvider.ts +102 -0
- package/src/i18n/MessagesRegistry.ts +4 -0
- package/src/i18n/Resolver.ts +4 -0
- package/src/i18n/__tests__/I18n.test.ts +169 -0
- package/src/i18n/__tests__/IncrementalDomainProvider.test.ts +146 -0
- package/src/i18n/__tests__/LazyTranslationProvider.test.ts +100 -0
- package/src/i18n/__tests__/Resolver.test.ts +271 -0
- package/src/i18n/defaults/DefaultCoreProvider.ts +28 -0
- package/src/i18n/defaults/core.en.yml +55 -0
- package/src/i18n/defaults/core.fr.yml +55 -0
- package/src/i18n/index.ts +55 -0
- package/src/i18n/loaders/raw-modules.d.ts +15 -0
- package/src/i18n/loaders/yaml.ts +35 -0
- package/src/i18n/strategies.ts +4 -0
- package/src/i18n/types.ts +34 -0
- package/src/i18n/useI18n.ts +34 -0
- package/src/index.ts +453 -0
- package/src/kernel/EventRouter.ts +23 -0
- package/src/kernel/Kernel.api.ts +79 -0
- package/src/kernel/Kernel.auth.ts +120 -0
- package/src/kernel/Kernel.i18n.ts +29 -0
- package/src/kernel/Kernel.modules.ts +170 -0
- package/src/kernel/Kernel.registries.ts +237 -0
- package/src/kernel/Kernel.routing.ts +334 -0
- package/src/kernel/Kernel.ts +460 -0
- package/src/kernel/Kernel.types.ts +263 -0
- package/src/kernel/Kernel.vue.ts +304 -0
- package/src/kernel/KernelContext.entities.ts +80 -0
- package/src/kernel/KernelContext.events.ts +57 -0
- package/src/kernel/KernelContext.i18n.ts +37 -0
- package/src/kernel/KernelContext.permissions.ts +38 -0
- package/src/kernel/KernelContext.routing.ts +280 -0
- package/src/kernel/KernelContext.ts +252 -0
- package/src/kernel/KernelContext.types.ts +173 -0
- package/src/kernel/KernelContext.zones.ts +54 -0
- package/src/kernel/Module.ts +169 -0
- package/src/kernel/ModuleLoader.ts +645 -0
- package/src/kernel/SSEBridge.ts +11 -0
- package/src/kernel/SignalBus.ts +48 -0
- package/src/kernel/index.ts +56 -0
- package/src/module/index.ts +33 -0
- package/src/module/moduleRegistry.ts +492 -0
- package/src/modules/debug/AuthCollector.ts +501 -0
- package/src/modules/debug/Collector.ts +20 -0
- package/src/modules/debug/DebugBridge.ts +14 -0
- package/src/modules/debug/DebugModule.ts +220 -0
- package/src/modules/debug/EntitiesCollector.ts +839 -0
- package/src/modules/debug/ErrorCollector.ts +4 -0
- package/src/modules/debug/I18nCollector.ts +9 -0
- package/src/modules/debug/LocalStorageAdapter.ts +7 -0
- package/src/modules/debug/RouterCollector.ts +449 -0
- package/src/modules/debug/SignalCollector.ts +4 -0
- package/src/modules/debug/ToastCollector.ts +4 -0
- package/src/modules/debug/ZonesCollector.ts +447 -0
- package/src/modules/debug/components/DebugBar.vue +31 -0
- package/src/modules/debug/components/adminPanelsConfig.ts +42 -0
- package/src/modules/debug/components/index.ts +9 -0
- package/src/modules/debug/components/panels/AuthPanel.vue +267 -0
- package/src/modules/debug/components/panels/EntitiesPanel.vue +572 -0
- package/src/modules/debug/components/panels/I18nPanel.vue +738 -0
- package/src/modules/debug/components/panels/RouterPanel.vue +440 -0
- package/src/modules/debug/components/panels/ZonesPanel.vue +133 -0
- package/src/modules/debug/components/panels/index.ts +16 -0
- package/src/modules/debug/index.ts +58 -0
- package/src/modules/debug/styles.scss +2671 -0
- package/src/notifications/NotificationBadge.vue +35 -0
- package/src/notifications/NotificationListener.vue +71 -0
- package/src/notifications/NotificationModule.ts +76 -0
- package/src/notifications/NotificationPanel.vue +478 -0
- package/src/notifications/NotificationStore.ts +288 -0
- package/src/notifications/index.ts +42 -0
- package/src/notifications/styles.scss +32 -0
- package/src/orchestrator/Orchestrator.ts +427 -0
- package/src/orchestrator/index.ts +8 -0
- package/src/orchestrator/useOrchestrator.ts +80 -0
- package/src/plugin.ts +251 -0
- package/src/query/FilterQuery.ts +306 -0
- package/src/query/QueryExecutor.ts +341 -0
- package/src/query/index.ts +16 -0
- package/src/security/EntityRolesProvider.ts +385 -0
- package/src/security/PermissionMatcher.ts +152 -0
- package/src/security/PermissionRegistry.ts +273 -0
- package/src/security/PersistableRolesProvider.ts +584 -0
- package/src/security/RolesManager.ts +136 -0
- package/src/security/RolesProvider.ts +167 -0
- package/src/security/RolesProviderStorage.ts +211 -0
- package/src/security/SecurityModule.ts +94 -0
- package/src/security/StaticRolesProvider.ts +117 -0
- package/src/security/UsersManager.ts +163 -0
- package/src/security/index.ts +77 -0
- package/src/security/pages/RoleForm.vue +276 -0
- package/src/security/pages/RoleList.vue +123 -0
- package/src/styles/_alerts.scss +95 -0
- package/src/styles/_buttons.scss +391 -0
- package/src/styles/_cards.scss +241 -0
- package/src/styles/_code.scss +78 -0
- package/src/styles/_dialogs.scss +55 -0
- package/src/styles/_filter-bar.scss +70 -0
- package/src/styles/_forms.scss +434 -0
- package/src/styles/_helpers.scss +153 -0
- package/src/styles/_lists.scss +225 -0
- package/src/styles/_main.scss +356 -0
- package/src/styles/_markdown.scss +88 -0
- package/src/styles/_responsive.scss +255 -0
- package/src/styles/_show-pages.scss +186 -0
- package/src/styles/_sidebar.scss +380 -0
- package/src/styles/_states.scss +115 -0
- package/src/styles/_stats.scss +47 -0
- package/src/styles/_variables.scss +224 -0
- package/src/styles/index.scss +38 -0
- package/src/styles/theme/_components.scss +331 -0
- package/src/styles/theme/_index.scss +10 -0
- package/src/styles/theme/_tokens.scss +147 -0
- package/src/styles/theme/_utilities.scss +175 -0
- package/src/toast/ToastBridgeModule.ts +68 -0
- package/src/toast/ToastListener.vue +55 -0
- package/src/toast/index.ts +26 -0
- package/src/toast/useSignalToast.ts +154 -0
- package/src/types/index.ts +285 -0
- package/src/types/pluralize.d.ts +19 -0
- package/src/types/quarkernel.d.ts +50 -0
- package/src/utils/formatters.ts +174 -0
- package/src/utils/index.ts +35 -0
- package/src/utils/transformers.ts +131 -0
- package/src/vite/qdadmDebugPlugin.ts +401 -0
- package/src/vite-env.d.ts +50 -0
- package/src/zones/ZoneRegistry.ts +934 -0
- package/src/zones/index.ts +29 -0
- package/src/zones/zones.ts +191 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design Tokens - CSS Custom Properties
|
|
3
|
+
*
|
|
4
|
+
* Generates CSS custom properties (--fad-*) from SCSS variables.
|
|
5
|
+
* These tokens map to PrimeVue theme variables for consistency.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
@use '../variables' as *;
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
// ===========================================================================
|
|
12
|
+
// Colors - Semantic
|
|
13
|
+
// ===========================================================================
|
|
14
|
+
|
|
15
|
+
// Text colors
|
|
16
|
+
--fad-text-primary: var(--p-text-color);
|
|
17
|
+
--fad-text-secondary: var(--p-text-muted-color);
|
|
18
|
+
--fad-text-disabled: var(--p-surface-400);
|
|
19
|
+
--fad-text-inverse: var(--p-surface-0);
|
|
20
|
+
|
|
21
|
+
// Surface colors (backgrounds, cards, overlays)
|
|
22
|
+
--fad-surface-ground: var(--p-surface-ground);
|
|
23
|
+
--fad-surface-card: var(--p-surface-card);
|
|
24
|
+
--fad-surface-overlay: var(--p-surface-overlay);
|
|
25
|
+
--fad-surface-border: var(--p-surface-200);
|
|
26
|
+
--fad-surface-hover: var(--p-surface-100);
|
|
27
|
+
|
|
28
|
+
// Primary brand color
|
|
29
|
+
--fad-primary: var(--p-primary-color);
|
|
30
|
+
--fad-primary-hover: var(--p-primary-600);
|
|
31
|
+
--fad-primary-text: var(--p-primary-contrast-color);
|
|
32
|
+
|
|
33
|
+
// Status colors
|
|
34
|
+
--fad-success: var(--p-green-500);
|
|
35
|
+
--fad-warning: var(--p-orange-500);
|
|
36
|
+
--fad-danger: var(--p-red-500);
|
|
37
|
+
--fad-info: var(--p-blue-500);
|
|
38
|
+
|
|
39
|
+
// ===========================================================================
|
|
40
|
+
// Spacing
|
|
41
|
+
// ===========================================================================
|
|
42
|
+
|
|
43
|
+
--fad-space-2xs: #{$space-2xs};
|
|
44
|
+
--fad-space-xs: #{$space-xs};
|
|
45
|
+
--fad-space-sm: #{$space-sm};
|
|
46
|
+
--fad-space-md: #{$space-md};
|
|
47
|
+
--fad-space-lg: #{$space-lg};
|
|
48
|
+
--fad-space-xl: #{$space-xl};
|
|
49
|
+
--fad-space-2xl: #{$space-2xl};
|
|
50
|
+
|
|
51
|
+
// ===========================================================================
|
|
52
|
+
// Typography
|
|
53
|
+
// ===========================================================================
|
|
54
|
+
|
|
55
|
+
--fad-font-family: #{$font-family-base};
|
|
56
|
+
|
|
57
|
+
// Font sizes
|
|
58
|
+
--fad-font-size-2xs: #{$font-size-2xs};
|
|
59
|
+
--fad-font-size-xs: #{$font-size-xs};
|
|
60
|
+
--fad-font-size-sm: #{$font-size-sm};
|
|
61
|
+
--fad-font-size-md: #{$font-size-md};
|
|
62
|
+
--fad-font-size-lg: #{$font-size-lg};
|
|
63
|
+
--fad-font-size-xl: #{$font-size-xl};
|
|
64
|
+
--fad-font-size-2xl: #{$font-size-2xl};
|
|
65
|
+
|
|
66
|
+
// Font weights
|
|
67
|
+
--fad-font-weight-light: #{$font-weight-light};
|
|
68
|
+
--fad-font-weight-normal: #{$font-weight-normal};
|
|
69
|
+
--fad-font-weight-medium: #{$font-weight-medium};
|
|
70
|
+
--fad-font-weight-semibold: #{$font-weight-semibold};
|
|
71
|
+
--fad-font-weight-bold: #{$font-weight-bold};
|
|
72
|
+
|
|
73
|
+
// Line heights
|
|
74
|
+
--fad-line-height-tight: #{$line-height-tight};
|
|
75
|
+
--fad-line-height-normal: #{$line-height-normal};
|
|
76
|
+
--fad-line-height-relaxed: #{$line-height-relaxed};
|
|
77
|
+
|
|
78
|
+
// ===========================================================================
|
|
79
|
+
// Borders & Radius
|
|
80
|
+
// ===========================================================================
|
|
81
|
+
|
|
82
|
+
--fad-border-width: #{$border-width};
|
|
83
|
+
--fad-border-color: var(--fad-surface-border);
|
|
84
|
+
|
|
85
|
+
--fad-radius-sm: #{$radius-sm};
|
|
86
|
+
--fad-radius-md: #{$radius-md};
|
|
87
|
+
--fad-radius-lg: #{$radius-lg};
|
|
88
|
+
--fad-radius-xl: #{$radius-xl};
|
|
89
|
+
--fad-radius-full: #{$radius-full};
|
|
90
|
+
|
|
91
|
+
// ===========================================================================
|
|
92
|
+
// Shadows
|
|
93
|
+
// ===========================================================================
|
|
94
|
+
|
|
95
|
+
--fad-shadow-sm: #{$shadow-sm};
|
|
96
|
+
--fad-shadow-md: #{$shadow-md};
|
|
97
|
+
--fad-shadow-lg: #{$shadow-lg};
|
|
98
|
+
--fad-shadow-xl: #{$shadow-xl};
|
|
99
|
+
|
|
100
|
+
// ===========================================================================
|
|
101
|
+
// Transitions
|
|
102
|
+
// ===========================================================================
|
|
103
|
+
|
|
104
|
+
--fad-transition-instant: #{$transition-instant};
|
|
105
|
+
--fad-transition-fast: #{$transition-fast};
|
|
106
|
+
--fad-transition-normal: #{$transition-normal};
|
|
107
|
+
--fad-transition-slow: #{$transition-slow};
|
|
108
|
+
|
|
109
|
+
// ===========================================================================
|
|
110
|
+
// Z-Index
|
|
111
|
+
// ===========================================================================
|
|
112
|
+
|
|
113
|
+
--fad-z-dropdown: #{$z-dropdown};
|
|
114
|
+
--fad-z-sticky: #{$z-sticky};
|
|
115
|
+
--fad-z-fixed: #{$z-fixed};
|
|
116
|
+
--fad-z-modal-backdrop: #{$z-modal-backdrop};
|
|
117
|
+
--fad-z-modal: #{$z-modal};
|
|
118
|
+
--fad-z-popover: #{$z-popover};
|
|
119
|
+
--fad-z-tooltip: #{$z-tooltip};
|
|
120
|
+
|
|
121
|
+
// ===========================================================================
|
|
122
|
+
// Layout
|
|
123
|
+
// ===========================================================================
|
|
124
|
+
|
|
125
|
+
--fad-sidebar-width: #{$sidebar-width};
|
|
126
|
+
--fad-sidebar-width-tablet: #{$sidebar-width-tablet};
|
|
127
|
+
--fad-sidebar-width-collapsed: #{$sidebar-width-collapsed};
|
|
128
|
+
--fad-header-height: #{$header-height};
|
|
129
|
+
--fad-content-max-width: #{$content-max-width};
|
|
130
|
+
|
|
131
|
+
// ===========================================================================
|
|
132
|
+
// Navigation
|
|
133
|
+
// ===========================================================================
|
|
134
|
+
|
|
135
|
+
--fad-nav-item-height: #{$nav-item-height};
|
|
136
|
+
--fad-nav-item-padding-x: #{$nav-item-padding-x};
|
|
137
|
+
--fad-nav-item-padding-y: #{$nav-item-padding-y};
|
|
138
|
+
--fad-nav-icon-size: #{$nav-icon-size};
|
|
139
|
+
--fad-nav-section-gap: #{$nav-section-gap};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Dark mode overrides
|
|
143
|
+
.dark-mode {
|
|
144
|
+
--fad-surface-border: var(--p-surface-700);
|
|
145
|
+
--fad-surface-hover: var(--p-surface-800);
|
|
146
|
+
--fad-text-disabled: var(--p-surface-500);
|
|
147
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility Classes
|
|
3
|
+
*
|
|
4
|
+
* Minimal utility classes for common patterns.
|
|
5
|
+
* Keep it small - use components for complex layouts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
@use '../variables' as *;
|
|
9
|
+
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Display
|
|
12
|
+
// =============================================================================
|
|
13
|
+
|
|
14
|
+
.d-none { display: none !important; }
|
|
15
|
+
.d-block { display: block !important; }
|
|
16
|
+
.d-flex { display: flex !important; }
|
|
17
|
+
.d-inline-flex { display: inline-flex !important; }
|
|
18
|
+
.d-grid { display: grid !important; }
|
|
19
|
+
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Flexbox
|
|
22
|
+
// =============================================================================
|
|
23
|
+
|
|
24
|
+
.flex-row { flex-direction: row; }
|
|
25
|
+
.flex-column { flex-direction: column; }
|
|
26
|
+
.flex-wrap { flex-wrap: wrap; }
|
|
27
|
+
.flex-1 { flex: 1; }
|
|
28
|
+
.flex-auto { flex: auto; }
|
|
29
|
+
.flex-none { flex: none; }
|
|
30
|
+
|
|
31
|
+
.items-start { align-items: flex-start; }
|
|
32
|
+
.items-center { align-items: center; }
|
|
33
|
+
.items-end { align-items: flex-end; }
|
|
34
|
+
.items-stretch { align-items: stretch; }
|
|
35
|
+
|
|
36
|
+
.justify-start { justify-content: flex-start; }
|
|
37
|
+
.justify-center { justify-content: center; }
|
|
38
|
+
.justify-end { justify-content: flex-end; }
|
|
39
|
+
.justify-between { justify-content: space-between; }
|
|
40
|
+
.justify-around { justify-content: space-around; }
|
|
41
|
+
|
|
42
|
+
.gap-xs { gap: $space-xs; }
|
|
43
|
+
.gap-sm { gap: $space-sm; }
|
|
44
|
+
.gap-md { gap: $space-md; }
|
|
45
|
+
.gap-lg { gap: $space-lg; }
|
|
46
|
+
.gap-xl { gap: $space-xl; }
|
|
47
|
+
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// Width
|
|
50
|
+
// =============================================================================
|
|
51
|
+
|
|
52
|
+
.w-full { width: 100% !important; }
|
|
53
|
+
.w-auto { width: auto !important; }
|
|
54
|
+
.w-50 { width: 50%; }
|
|
55
|
+
.max-w-full { max-width: 100%; }
|
|
56
|
+
|
|
57
|
+
// =============================================================================
|
|
58
|
+
// Spacing (Margin/Padding)
|
|
59
|
+
// =============================================================================
|
|
60
|
+
|
|
61
|
+
// Margin
|
|
62
|
+
.m-0 { margin: 0; }
|
|
63
|
+
.m-auto { margin: auto; }
|
|
64
|
+
|
|
65
|
+
.mt-0 { margin-top: 0; }
|
|
66
|
+
.mt-xs { margin-top: $space-xs; }
|
|
67
|
+
.mt-sm { margin-top: $space-sm; }
|
|
68
|
+
.mt-md { margin-top: $space-md; }
|
|
69
|
+
.mt-lg { margin-top: $space-lg; }
|
|
70
|
+
.mt-xl { margin-top: $space-xl; }
|
|
71
|
+
|
|
72
|
+
.mb-0 { margin-bottom: 0; }
|
|
73
|
+
.mb-xs { margin-bottom: $space-xs; }
|
|
74
|
+
.mb-sm { margin-bottom: $space-sm; }
|
|
75
|
+
.mb-md { margin-bottom: $space-md; }
|
|
76
|
+
.mb-lg { margin-bottom: $space-lg; }
|
|
77
|
+
.mb-xl { margin-bottom: $space-xl; }
|
|
78
|
+
|
|
79
|
+
.ml-auto { margin-left: auto; }
|
|
80
|
+
.mr-auto { margin-right: auto; }
|
|
81
|
+
.mx-auto { margin-left: auto; margin-right: auto; }
|
|
82
|
+
|
|
83
|
+
// Padding
|
|
84
|
+
.p-0 { padding: 0; }
|
|
85
|
+
.p-xs { padding: $space-xs; }
|
|
86
|
+
.p-sm { padding: $space-sm; }
|
|
87
|
+
.p-md { padding: $space-md; }
|
|
88
|
+
.p-lg { padding: $space-lg; }
|
|
89
|
+
.p-xl { padding: $space-xl; }
|
|
90
|
+
|
|
91
|
+
.px-md { padding-left: $space-md; padding-right: $space-md; }
|
|
92
|
+
.py-md { padding-top: $space-md; padding-bottom: $space-md; }
|
|
93
|
+
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// Text
|
|
96
|
+
// =============================================================================
|
|
97
|
+
|
|
98
|
+
.text-left { text-align: left; }
|
|
99
|
+
.text-center { text-align: center; }
|
|
100
|
+
.text-right { text-align: right; }
|
|
101
|
+
|
|
102
|
+
.text-xs { font-size: $font-size-xs; }
|
|
103
|
+
.text-sm { font-size: $font-size-sm; }
|
|
104
|
+
.text-md { font-size: $font-size-md; }
|
|
105
|
+
.text-lg { font-size: $font-size-lg; }
|
|
106
|
+
.text-xl { font-size: $font-size-xl; }
|
|
107
|
+
.text-2xl { font-size: $font-size-2xl; }
|
|
108
|
+
|
|
109
|
+
.font-normal { font-weight: $font-weight-normal; }
|
|
110
|
+
.font-medium { font-weight: $font-weight-medium; }
|
|
111
|
+
.font-semibold { font-weight: $font-weight-semibold; }
|
|
112
|
+
.font-bold { font-weight: $font-weight-bold; }
|
|
113
|
+
|
|
114
|
+
.text-primary { color: var(--fad-text-primary); }
|
|
115
|
+
.text-secondary { color: var(--fad-text-secondary); }
|
|
116
|
+
.text-muted { color: var(--fad-text-secondary); }
|
|
117
|
+
.text-success { color: var(--fad-success); }
|
|
118
|
+
.text-warning { color: var(--fad-warning); }
|
|
119
|
+
.text-danger { color: var(--fad-danger); }
|
|
120
|
+
|
|
121
|
+
.truncate {
|
|
122
|
+
overflow: hidden;
|
|
123
|
+
text-overflow: ellipsis;
|
|
124
|
+
white-space: nowrap;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// =============================================================================
|
|
128
|
+
// Visibility
|
|
129
|
+
// =============================================================================
|
|
130
|
+
|
|
131
|
+
.visible { visibility: visible; }
|
|
132
|
+
.invisible { visibility: hidden; }
|
|
133
|
+
.opacity-0 { opacity: 0; }
|
|
134
|
+
.opacity-50 { opacity: 0.5; }
|
|
135
|
+
.opacity-100 { opacity: 1; }
|
|
136
|
+
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// Borders
|
|
139
|
+
// =============================================================================
|
|
140
|
+
|
|
141
|
+
.border { border: $border-width solid var(--fad-border-color); }
|
|
142
|
+
.border-0 { border: none; }
|
|
143
|
+
.border-top { border-top: $border-width solid var(--fad-border-color); }
|
|
144
|
+
.border-bottom { border-bottom: $border-width solid var(--fad-border-color); }
|
|
145
|
+
|
|
146
|
+
.rounded-sm { border-radius: $radius-sm; }
|
|
147
|
+
.rounded-md { border-radius: $radius-md; }
|
|
148
|
+
.rounded-lg { border-radius: $radius-lg; }
|
|
149
|
+
.rounded-full { border-radius: $radius-full; }
|
|
150
|
+
|
|
151
|
+
// =============================================================================
|
|
152
|
+
// Cursor
|
|
153
|
+
// =============================================================================
|
|
154
|
+
|
|
155
|
+
.cursor-pointer { cursor: pointer; }
|
|
156
|
+
.cursor-default { cursor: default; }
|
|
157
|
+
.cursor-not-allowed { cursor: not-allowed; }
|
|
158
|
+
|
|
159
|
+
// =============================================================================
|
|
160
|
+
// Overflow
|
|
161
|
+
// =============================================================================
|
|
162
|
+
|
|
163
|
+
.overflow-hidden { overflow: hidden; }
|
|
164
|
+
.overflow-auto { overflow: auto; }
|
|
165
|
+
.overflow-y-auto { overflow-y: auto; }
|
|
166
|
+
.overflow-x-auto { overflow-x: auto; }
|
|
167
|
+
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// Position
|
|
170
|
+
// =============================================================================
|
|
171
|
+
|
|
172
|
+
.relative { position: relative; }
|
|
173
|
+
.absolute { position: absolute; }
|
|
174
|
+
.fixed { position: fixed; }
|
|
175
|
+
.sticky { position: sticky; }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToastBridgeModule - Bridges signal bus to PrimeVue Toast
|
|
3
|
+
*
|
|
4
|
+
* This module integrates toast functionality via the signal bus:
|
|
5
|
+
* - Registers ToastListener component to handle toast:* signals
|
|
6
|
+
* - Provides useSignalToast() composable for emitting toasts
|
|
7
|
+
*
|
|
8
|
+
* Usage in modules:
|
|
9
|
+
* import { useSignalToast } from '@quazardous/qdadm'
|
|
10
|
+
* const toast = useSignalToast()
|
|
11
|
+
* toast.success('Saved!', 'Your changes have been saved')
|
|
12
|
+
* toast.error('Error', 'Something went wrong')
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { createKernel, ToastBridgeModule } from '@quazardous/qdadm'
|
|
16
|
+
*
|
|
17
|
+
* const kernel = createKernel()
|
|
18
|
+
* kernel.use(new ToastBridgeModule())
|
|
19
|
+
* await kernel.boot()
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { Module } from '../kernel/Module'
|
|
23
|
+
import type { KernelContext } from '../kernel/KernelContext'
|
|
24
|
+
import ToastListener from './ToastListener.vue'
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Zone name for toast listener component
|
|
28
|
+
* Prefixed with _ to hide from ZonesCollector (internal zone)
|
|
29
|
+
*/
|
|
30
|
+
export const TOAST_ZONE = '_app:toasts'
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* ToastBridgeModule - Handles toast notifications via signals
|
|
34
|
+
*/
|
|
35
|
+
export class ToastBridgeModule extends Module {
|
|
36
|
+
/**
|
|
37
|
+
* Module identifier
|
|
38
|
+
*/
|
|
39
|
+
static override moduleName = 'toast-bridge'
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* No dependencies
|
|
43
|
+
*/
|
|
44
|
+
static override requires: string[] = []
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* High priority - should load early
|
|
48
|
+
*/
|
|
49
|
+
static override priority = 10
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Connect module to kernel
|
|
53
|
+
* @param ctx - Kernel context
|
|
54
|
+
*/
|
|
55
|
+
async connect(ctx: KernelContext): Promise<void> {
|
|
56
|
+
// Define the toast zone
|
|
57
|
+
ctx.zone(TOAST_ZONE)
|
|
58
|
+
|
|
59
|
+
// Register ToastListener component in the zone
|
|
60
|
+
ctx.block(TOAST_ZONE, {
|
|
61
|
+
id: 'toast-listener',
|
|
62
|
+
component: ToastListener,
|
|
63
|
+
weight: 0,
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export default ToastBridgeModule
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* ToastListener - Bridges signal bus to PrimeVue Toast
|
|
4
|
+
*
|
|
5
|
+
* Invisible component that listens to toast:* signals and displays
|
|
6
|
+
* them using PrimeVue's Toast component.
|
|
7
|
+
*
|
|
8
|
+
* This component should be registered in a zone via ToastBridgeModule.
|
|
9
|
+
*/
|
|
10
|
+
import { onMounted, onUnmounted, inject } from 'vue'
|
|
11
|
+
import { useToast } from 'primevue/usetoast'
|
|
12
|
+
import type { SignalBus } from '../kernel/SignalBus'
|
|
13
|
+
|
|
14
|
+
interface ToastEventData {
|
|
15
|
+
summary?: string
|
|
16
|
+
detail?: string
|
|
17
|
+
life?: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const toast = useToast()
|
|
21
|
+
const signals = inject<SignalBus | null>('qdadmSignals', null)
|
|
22
|
+
|
|
23
|
+
let unsubscribe: (() => void) | null = null
|
|
24
|
+
|
|
25
|
+
onMounted(() => {
|
|
26
|
+
if (!signals) {
|
|
27
|
+
console.warn('[ToastListener] No signals bus injected')
|
|
28
|
+
return
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Listen to all toast signals
|
|
32
|
+
unsubscribe = signals.on('toast:*', (event) => {
|
|
33
|
+
const data = event.data as ToastEventData | undefined
|
|
34
|
+
const severity = event.name.split(':')[1] // toast:success -> success
|
|
35
|
+
toast.add({
|
|
36
|
+
severity,
|
|
37
|
+
summary: data?.summary,
|
|
38
|
+
detail: data?.detail,
|
|
39
|
+
life: data?.life ?? 3000
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
onUnmounted(() => {
|
|
45
|
+
if (unsubscribe) {
|
|
46
|
+
unsubscribe()
|
|
47
|
+
unsubscribe = null
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<template>
|
|
53
|
+
<!-- Invisible listener component -->
|
|
54
|
+
<span style="display: none" />
|
|
55
|
+
</template>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast Module - Signal-based toast notifications
|
|
3
|
+
*
|
|
4
|
+
* Provides toast notifications that go through the signal bus,
|
|
5
|
+
* allowing for proper debugging and interception.
|
|
6
|
+
*
|
|
7
|
+
* Components:
|
|
8
|
+
* - ToastBridgeModule: Registers ToastListener for handling signals
|
|
9
|
+
* - ToastListener: Vue component that displays toasts via PrimeVue
|
|
10
|
+
* - useSignalToast: Composable for emitting toast signals
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
ToastBridgeModule,
|
|
15
|
+
TOAST_ZONE,
|
|
16
|
+
} from './ToastBridgeModule'
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
useSignalToast,
|
|
20
|
+
type ToastSeverity,
|
|
21
|
+
type ToastOptions,
|
|
22
|
+
type ToastMethodOptions,
|
|
23
|
+
type SignalToastAPI,
|
|
24
|
+
} from './useSignalToast'
|
|
25
|
+
|
|
26
|
+
export { default as ToastListener } from './ToastListener.vue'
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useSignalToast - Composable for emitting toast notifications via signals
|
|
3
|
+
*
|
|
4
|
+
* This composable provides a simple API for showing toasts that go through
|
|
5
|
+
* the signal bus. Works with ToastBridgeModule which handles displaying
|
|
6
|
+
* the toasts via PrimeVue.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { useSignalToast } from '@quazardous/qdadm'
|
|
10
|
+
*
|
|
11
|
+
* // With explicit emitter name
|
|
12
|
+
* const toast = useSignalToast('MyComponent')
|
|
13
|
+
* toast.success('Saved!', 'Your changes have been saved')
|
|
14
|
+
*
|
|
15
|
+
* // Without emitter (defaults to 'unknown')
|
|
16
|
+
* const toast = useSignalToast()
|
|
17
|
+
* toast.error('Error', 'Something went wrong')
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { inject, getCurrentInstance } from 'vue'
|
|
21
|
+
import type { SignalBus } from '../kernel/SignalBus'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Toast severity types
|
|
25
|
+
*/
|
|
26
|
+
export type ToastSeverity = 'success' | 'info' | 'warn' | 'error'
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Toast options for the add method
|
|
30
|
+
*/
|
|
31
|
+
export interface ToastOptions {
|
|
32
|
+
severity?: ToastSeverity
|
|
33
|
+
summary: string
|
|
34
|
+
detail?: string
|
|
35
|
+
life?: number
|
|
36
|
+
/** Force classic PrimeVue toast even when NotificationModule is active */
|
|
37
|
+
forceToast?: boolean
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Toast method options
|
|
42
|
+
*/
|
|
43
|
+
export interface ToastMethodOptions {
|
|
44
|
+
/** Force classic PrimeVue toast even when NotificationModule is active */
|
|
45
|
+
forceToast?: boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Toast API returned by useSignalToast
|
|
50
|
+
*/
|
|
51
|
+
export interface SignalToastAPI {
|
|
52
|
+
success: (summary: string, detail?: string, life?: number, options?: ToastMethodOptions) => void
|
|
53
|
+
error: (summary: string, detail?: string, life?: number, options?: ToastMethodOptions) => void
|
|
54
|
+
info: (summary: string, detail?: string, life?: number, options?: ToastMethodOptions) => void
|
|
55
|
+
warn: (summary: string, detail?: string, life?: number, options?: ToastMethodOptions) => void
|
|
56
|
+
add: (options: ToastOptions) => void
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Composable for emitting toast notifications via signal bus
|
|
61
|
+
* @param emitter - Identifier for the toast source (component/module name)
|
|
62
|
+
* @returns Toast API
|
|
63
|
+
*/
|
|
64
|
+
export function useSignalToast(emitter?: string): SignalToastAPI {
|
|
65
|
+
const injectedSignals = inject<SignalBus | undefined>('qdadmSignals')
|
|
66
|
+
|
|
67
|
+
// Try to auto-detect emitter from current component if not provided
|
|
68
|
+
const instance = getCurrentInstance()
|
|
69
|
+
const componentType = instance?.type as { name?: string; __name?: string } | undefined
|
|
70
|
+
const resolvedEmitter = emitter || componentType?.name || componentType?.__name || 'unknown'
|
|
71
|
+
|
|
72
|
+
if (!injectedSignals) {
|
|
73
|
+
console.warn('[useSignalToast] No signals bus injected - toasts will not work')
|
|
74
|
+
// Return no-op functions
|
|
75
|
+
return {
|
|
76
|
+
success: () => {},
|
|
77
|
+
error: () => {},
|
|
78
|
+
info: () => {},
|
|
79
|
+
warn: () => {},
|
|
80
|
+
add: () => {},
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Capture signals after null check for closure
|
|
85
|
+
const signals = injectedSignals
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Show a toast notification
|
|
89
|
+
* @param severity - Toast severity (success, info, warn, error)
|
|
90
|
+
* @param summary - Toast title
|
|
91
|
+
* @param detail - Toast detail message
|
|
92
|
+
* @param life - Duration in ms (0 for sticky)
|
|
93
|
+
* @param forceToast - Force classic PrimeVue toast when NotificationModule is active
|
|
94
|
+
*/
|
|
95
|
+
function addToast(severity: ToastSeverity, summary: string, detail?: string, life: number = 3000, forceToast?: boolean): void {
|
|
96
|
+
signals.emit(`toast:${severity}`, { summary, detail, life, emitter: resolvedEmitter, forceToast })
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
/**
|
|
101
|
+
* Show success toast
|
|
102
|
+
* @param summary - Toast title
|
|
103
|
+
* @param detail - Toast detail message
|
|
104
|
+
* @param life - Duration in ms
|
|
105
|
+
* @param options - Additional options
|
|
106
|
+
*/
|
|
107
|
+
success(summary: string, detail?: string, life: number = 3000, options?: ToastMethodOptions): void {
|
|
108
|
+
addToast('success', summary, detail, life, options?.forceToast)
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Show error toast
|
|
113
|
+
* @param summary - Toast title
|
|
114
|
+
* @param detail - Toast detail message
|
|
115
|
+
* @param life - Duration in ms (longer for errors)
|
|
116
|
+
* @param options - Additional options
|
|
117
|
+
*/
|
|
118
|
+
error(summary: string, detail?: string, life: number = 5000, options?: ToastMethodOptions): void {
|
|
119
|
+
addToast('error', summary, detail, life, options?.forceToast)
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Show info toast
|
|
124
|
+
* @param summary - Toast title
|
|
125
|
+
* @param detail - Toast detail message
|
|
126
|
+
* @param life - Duration in ms
|
|
127
|
+
* @param options - Additional options
|
|
128
|
+
*/
|
|
129
|
+
info(summary: string, detail?: string, life: number = 3000, options?: ToastMethodOptions): void {
|
|
130
|
+
addToast('info', summary, detail, life, options?.forceToast)
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Show warning toast
|
|
135
|
+
* @param summary - Toast title
|
|
136
|
+
* @param detail - Toast detail message
|
|
137
|
+
* @param life - Duration in ms
|
|
138
|
+
* @param options - Additional options
|
|
139
|
+
*/
|
|
140
|
+
warn(summary: string, detail?: string, life: number = 4000, options?: ToastMethodOptions): void {
|
|
141
|
+
addToast('warn', summary, detail, life, options?.forceToast)
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Generic add method (compatible with PrimeVue toast.add)
|
|
146
|
+
* @param options - Toast options
|
|
147
|
+
*/
|
|
148
|
+
add(options: ToastOptions): void {
|
|
149
|
+
addToast(options.severity || 'info', options.summary, options.detail, options.life, options.forceToast)
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export default useSignalToast
|