@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.
Files changed (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/package.json +101 -0
  4. package/src/assets/logo.svg +6 -0
  5. package/src/auth/SessionAuthAdapter.ts +459 -0
  6. package/src/auth/index.ts +15 -0
  7. package/src/chain/ActiveStack.ts +154 -0
  8. package/src/chain/StackHydrator.ts +292 -0
  9. package/src/chain/index.ts +25 -0
  10. package/src/chain/useActiveStack.ts +120 -0
  11. package/src/chain/useStackHydrator.ts +155 -0
  12. package/src/components/BoolCell.vue +34 -0
  13. package/src/components/InfoBanner.vue +73 -0
  14. package/src/components/QdadmRoot.vue +52 -0
  15. package/src/components/SeverityTag.vue +86 -0
  16. package/src/components/dialogs/BulkStatusDialog.vue +60 -0
  17. package/src/components/dialogs/MultiStepDialog.vue +331 -0
  18. package/src/components/dialogs/SimpleDialog.vue +122 -0
  19. package/src/components/dialogs/UnsavedChangesDialog.vue +80 -0
  20. package/src/components/display/BannerZone.vue +65 -0
  21. package/src/components/display/CardsGrid.vue +72 -0
  22. package/src/components/display/CopyableId.vue +84 -0
  23. package/src/components/display/EmptyState.vue +62 -0
  24. package/src/components/display/IntensityBar.vue +190 -0
  25. package/src/components/display/RichCardsGrid.vue +101 -0
  26. package/src/components/edit/FormActions.vue +78 -0
  27. package/src/components/edit/FormField.vue +82 -0
  28. package/src/components/edit/FormInput.vue +158 -0
  29. package/src/components/edit/FormPage.vue +260 -0
  30. package/src/components/edit/FormTab.vue +217 -0
  31. package/src/components/edit/FormTabs.vue +120 -0
  32. package/src/components/edit/LookupField.vue +406 -0
  33. package/src/components/edit/LookupPickerDialog.vue +230 -0
  34. package/src/components/editors/JsonEditorFoldable.vue +470 -0
  35. package/src/components/editors/JsonStructuredField.vue +264 -0
  36. package/src/components/editors/JsonViewer.vue +51 -0
  37. package/src/components/editors/KeyValueEditor.vue +314 -0
  38. package/src/components/editors/LanguageEditor.vue +259 -0
  39. package/src/components/editors/PermissionEditor.vue +558 -0
  40. package/src/components/editors/ScopeEditor.vue +372 -0
  41. package/src/components/editors/VanillaJsonEditor.vue +183 -0
  42. package/src/components/index.ts +83 -0
  43. package/src/components/item/FieldGroups.vue +392 -0
  44. package/src/components/layout/AppLayout.vue +1032 -0
  45. package/src/components/layout/BaseLayout.vue +190 -0
  46. package/src/components/layout/Breadcrumb.vue +55 -0
  47. package/src/components/layout/DashboardLayout.vue +104 -0
  48. package/src/components/layout/FormLayout.vue +256 -0
  49. package/src/components/layout/ListLayout.vue +278 -0
  50. package/src/components/layout/PageHeader.vue +156 -0
  51. package/src/components/layout/PageLayout.vue +126 -0
  52. package/src/components/layout/PageNav.vue +192 -0
  53. package/src/components/layout/SidebarBox.vue +87 -0
  54. package/src/components/layout/Zone.vue +182 -0
  55. package/src/components/layout/defaults/DefaultBreadcrumb.vue +149 -0
  56. package/src/components/layout/defaults/DefaultFooter.vue +89 -0
  57. package/src/components/layout/defaults/DefaultFormActions.vue +67 -0
  58. package/src/components/layout/defaults/DefaultHeader.vue +78 -0
  59. package/src/components/layout/defaults/DefaultMenu.vue +188 -0
  60. package/src/components/layout/defaults/DefaultPagination.vue +75 -0
  61. package/src/components/layout/defaults/DefaultTable.vue +137 -0
  62. package/src/components/layout/defaults/DefaultUserInfo.vue +111 -0
  63. package/src/components/layout/defaults/index.ts +16 -0
  64. package/src/components/lists/ActionButtons.vue +49 -0
  65. package/src/components/lists/ActionColumn.vue +40 -0
  66. package/src/components/lists/FilterBar.vue +54 -0
  67. package/src/components/lists/ListPage.vue +467 -0
  68. package/src/components/pages/LoginPage.vue +334 -0
  69. package/src/components/pages/NotFoundPage.vue +98 -0
  70. package/src/components/show/ShowDisplay.vue +343 -0
  71. package/src/components/show/ShowField.vue +67 -0
  72. package/src/components/show/ShowPage.vue +431 -0
  73. package/src/composables/index.ts +155 -0
  74. package/src/composables/useApp.ts +67 -0
  75. package/src/composables/useAuth.ts +98 -0
  76. package/src/composables/useBareForm.ts +319 -0
  77. package/src/composables/useBreadcrumb.ts +252 -0
  78. package/src/composables/useChildPage.ts +113 -0
  79. package/src/composables/useCurrentEntity.ts +60 -0
  80. package/src/composables/useDeferred.ts +94 -0
  81. package/src/composables/useDirtyState.ts +138 -0
  82. package/src/composables/useEntityItemFormPage.ts +942 -0
  83. package/src/composables/useEntityItemFormPage.types.ts +451 -0
  84. package/src/composables/useEntityItemPage.ts +438 -0
  85. package/src/composables/useEntityItemShowPage.ts +722 -0
  86. package/src/composables/useFieldManager.ts +692 -0
  87. package/src/composables/useForm.ts +544 -0
  88. package/src/composables/useGuardStore.ts +53 -0
  89. package/src/composables/useHooks.ts +56 -0
  90. package/src/composables/useInfoBanner.ts +217 -0
  91. package/src/composables/useJsonSyntax.ts +122 -0
  92. package/src/composables/useLayoutResolver.ts +329 -0
  93. package/src/composables/useListPage.ts +1535 -0
  94. package/src/composables/useListPage.types.ts +437 -0
  95. package/src/composables/useListPage.utils.ts +101 -0
  96. package/src/composables/useNavContext.ts +439 -0
  97. package/src/composables/useNavigation.ts +216 -0
  98. package/src/composables/useOptionsLookup.ts +323 -0
  99. package/src/composables/usePageTitle.ts +84 -0
  100. package/src/composables/useSSEBridge.ts +142 -0
  101. package/src/composables/useSemanticBreadcrumb.ts +222 -0
  102. package/src/composables/useSidebarState.ts +24 -0
  103. package/src/composables/useSignals.ts +52 -0
  104. package/src/composables/useUnsavedChangesGuard.ts +155 -0
  105. package/src/composables/useUserImpersonator.ts +317 -0
  106. package/src/composables/useZoneRegistry.ts +252 -0
  107. package/src/core/bundles.ts +558 -0
  108. package/src/core/decorator.ts +420 -0
  109. package/src/core/extension.ts +470 -0
  110. package/src/core/index.ts +59 -0
  111. package/src/deferred/DeferredRegistry.ts +353 -0
  112. package/src/deferred/index.ts +15 -0
  113. package/src/editors/index.ts +12 -0
  114. package/src/entity/EntityManager.cache.ts +530 -0
  115. package/src/entity/EntityManager.crud.ts +615 -0
  116. package/src/entity/EntityManager.interface.ts +78 -0
  117. package/src/entity/EntityManager.query.ts +221 -0
  118. package/src/entity/EntityManager.relations.ts +151 -0
  119. package/src/entity/EntityManager.ts +944 -0
  120. package/src/entity/EntityManager.types.ts +288 -0
  121. package/src/entity/auth/CompositeAuthAdapter.ts +194 -0
  122. package/src/entity/auth/EntityAuthAdapter.ts +119 -0
  123. package/src/entity/auth/PermissiveAdapter.ts +43 -0
  124. package/src/entity/auth/RoleHierarchy.ts +128 -0
  125. package/src/entity/auth/SecurityChecker.ts +202 -0
  126. package/src/entity/auth/factory.ts +203 -0
  127. package/src/entity/auth/index.ts +47 -0
  128. package/src/entity/factory.test.js +189 -0
  129. package/src/entity/factory.ts +146 -0
  130. package/src/entity/index.ts +49 -0
  131. package/src/entity/storage/ApiStorage.ts +228 -0
  132. package/src/entity/storage/IStorage.ts +100 -0
  133. package/src/entity/storage/LocalStorage.ts +200 -0
  134. package/src/entity/storage/MemoryStorage.ts +184 -0
  135. package/src/entity/storage/MockApiStorage.ts +318 -0
  136. package/src/entity/storage/SdkStorage.ts +377 -0
  137. package/src/entity/storage/factory.test.js +159 -0
  138. package/src/entity/storage/factory.ts +209 -0
  139. package/src/entity/storage/index.ts +75 -0
  140. package/src/gen/FieldMapper.ts +122 -0
  141. package/src/gen/StorageProfileFactory.ts +93 -0
  142. package/src/gen/connectors/BaseConnector.ts +150 -0
  143. package/src/gen/connectors/ManualConnector.test.js +499 -0
  144. package/src/gen/connectors/ManualConnector.ts +414 -0
  145. package/src/gen/connectors/OpenAPIConnector.test.js +836 -0
  146. package/src/gen/connectors/OpenAPIConnector.ts +693 -0
  147. package/src/gen/connectors/__fixtures__/sample-openapi.json +311 -0
  148. package/src/gen/connectors/index.ts +27 -0
  149. package/src/gen/createManagers.ts +245 -0
  150. package/src/gen/decorators.ts +134 -0
  151. package/src/gen/generateManagers.test.js +540 -0
  152. package/src/gen/generateManagers.ts +398 -0
  153. package/src/gen/index.ts +66 -0
  154. package/src/gen/schema.ts +248 -0
  155. package/src/gen/vite-plugin.ts +114 -0
  156. package/src/generated/managers/testManager.js +45 -0
  157. package/src/generated/managers/testManager.ts +46 -0
  158. package/src/hooks/HookRegistry.ts +16 -0
  159. package/src/hooks/index.ts +15 -0
  160. package/src/i18n/I18n.ts +344 -0
  161. package/src/i18n/IncrementalDomainProvider.ts +153 -0
  162. package/src/i18n/InlineTranslationProvider.ts +4 -0
  163. package/src/i18n/LazyTranslationProvider.ts +102 -0
  164. package/src/i18n/MessagesRegistry.ts +4 -0
  165. package/src/i18n/Resolver.ts +4 -0
  166. package/src/i18n/__tests__/I18n.test.ts +169 -0
  167. package/src/i18n/__tests__/IncrementalDomainProvider.test.ts +146 -0
  168. package/src/i18n/__tests__/LazyTranslationProvider.test.ts +100 -0
  169. package/src/i18n/__tests__/Resolver.test.ts +271 -0
  170. package/src/i18n/defaults/DefaultCoreProvider.ts +28 -0
  171. package/src/i18n/defaults/core.en.yml +55 -0
  172. package/src/i18n/defaults/core.fr.yml +55 -0
  173. package/src/i18n/index.ts +55 -0
  174. package/src/i18n/loaders/raw-modules.d.ts +15 -0
  175. package/src/i18n/loaders/yaml.ts +35 -0
  176. package/src/i18n/strategies.ts +4 -0
  177. package/src/i18n/types.ts +34 -0
  178. package/src/i18n/useI18n.ts +34 -0
  179. package/src/index.ts +453 -0
  180. package/src/kernel/EventRouter.ts +23 -0
  181. package/src/kernel/Kernel.api.ts +79 -0
  182. package/src/kernel/Kernel.auth.ts +120 -0
  183. package/src/kernel/Kernel.i18n.ts +29 -0
  184. package/src/kernel/Kernel.modules.ts +170 -0
  185. package/src/kernel/Kernel.registries.ts +237 -0
  186. package/src/kernel/Kernel.routing.ts +334 -0
  187. package/src/kernel/Kernel.ts +460 -0
  188. package/src/kernel/Kernel.types.ts +263 -0
  189. package/src/kernel/Kernel.vue.ts +304 -0
  190. package/src/kernel/KernelContext.entities.ts +80 -0
  191. package/src/kernel/KernelContext.events.ts +57 -0
  192. package/src/kernel/KernelContext.i18n.ts +37 -0
  193. package/src/kernel/KernelContext.permissions.ts +38 -0
  194. package/src/kernel/KernelContext.routing.ts +280 -0
  195. package/src/kernel/KernelContext.ts +252 -0
  196. package/src/kernel/KernelContext.types.ts +173 -0
  197. package/src/kernel/KernelContext.zones.ts +54 -0
  198. package/src/kernel/Module.ts +169 -0
  199. package/src/kernel/ModuleLoader.ts +645 -0
  200. package/src/kernel/SSEBridge.ts +11 -0
  201. package/src/kernel/SignalBus.ts +48 -0
  202. package/src/kernel/index.ts +56 -0
  203. package/src/module/index.ts +33 -0
  204. package/src/module/moduleRegistry.ts +492 -0
  205. package/src/modules/debug/AuthCollector.ts +501 -0
  206. package/src/modules/debug/Collector.ts +20 -0
  207. package/src/modules/debug/DebugBridge.ts +14 -0
  208. package/src/modules/debug/DebugModule.ts +220 -0
  209. package/src/modules/debug/EntitiesCollector.ts +839 -0
  210. package/src/modules/debug/ErrorCollector.ts +4 -0
  211. package/src/modules/debug/I18nCollector.ts +9 -0
  212. package/src/modules/debug/LocalStorageAdapter.ts +7 -0
  213. package/src/modules/debug/RouterCollector.ts +449 -0
  214. package/src/modules/debug/SignalCollector.ts +4 -0
  215. package/src/modules/debug/ToastCollector.ts +4 -0
  216. package/src/modules/debug/ZonesCollector.ts +447 -0
  217. package/src/modules/debug/components/DebugBar.vue +31 -0
  218. package/src/modules/debug/components/adminPanelsConfig.ts +42 -0
  219. package/src/modules/debug/components/index.ts +9 -0
  220. package/src/modules/debug/components/panels/AuthPanel.vue +267 -0
  221. package/src/modules/debug/components/panels/EntitiesPanel.vue +572 -0
  222. package/src/modules/debug/components/panels/I18nPanel.vue +738 -0
  223. package/src/modules/debug/components/panels/RouterPanel.vue +440 -0
  224. package/src/modules/debug/components/panels/ZonesPanel.vue +133 -0
  225. package/src/modules/debug/components/panels/index.ts +16 -0
  226. package/src/modules/debug/index.ts +58 -0
  227. package/src/modules/debug/styles.scss +2671 -0
  228. package/src/notifications/NotificationBadge.vue +35 -0
  229. package/src/notifications/NotificationListener.vue +71 -0
  230. package/src/notifications/NotificationModule.ts +76 -0
  231. package/src/notifications/NotificationPanel.vue +478 -0
  232. package/src/notifications/NotificationStore.ts +288 -0
  233. package/src/notifications/index.ts +42 -0
  234. package/src/notifications/styles.scss +32 -0
  235. package/src/orchestrator/Orchestrator.ts +427 -0
  236. package/src/orchestrator/index.ts +8 -0
  237. package/src/orchestrator/useOrchestrator.ts +80 -0
  238. package/src/plugin.ts +251 -0
  239. package/src/query/FilterQuery.ts +306 -0
  240. package/src/query/QueryExecutor.ts +341 -0
  241. package/src/query/index.ts +16 -0
  242. package/src/security/EntityRolesProvider.ts +385 -0
  243. package/src/security/PermissionMatcher.ts +152 -0
  244. package/src/security/PermissionRegistry.ts +273 -0
  245. package/src/security/PersistableRolesProvider.ts +584 -0
  246. package/src/security/RolesManager.ts +136 -0
  247. package/src/security/RolesProvider.ts +167 -0
  248. package/src/security/RolesProviderStorage.ts +211 -0
  249. package/src/security/SecurityModule.ts +94 -0
  250. package/src/security/StaticRolesProvider.ts +117 -0
  251. package/src/security/UsersManager.ts +163 -0
  252. package/src/security/index.ts +77 -0
  253. package/src/security/pages/RoleForm.vue +276 -0
  254. package/src/security/pages/RoleList.vue +123 -0
  255. package/src/styles/_alerts.scss +95 -0
  256. package/src/styles/_buttons.scss +391 -0
  257. package/src/styles/_cards.scss +241 -0
  258. package/src/styles/_code.scss +78 -0
  259. package/src/styles/_dialogs.scss +55 -0
  260. package/src/styles/_filter-bar.scss +70 -0
  261. package/src/styles/_forms.scss +434 -0
  262. package/src/styles/_helpers.scss +153 -0
  263. package/src/styles/_lists.scss +225 -0
  264. package/src/styles/_main.scss +356 -0
  265. package/src/styles/_markdown.scss +88 -0
  266. package/src/styles/_responsive.scss +255 -0
  267. package/src/styles/_show-pages.scss +186 -0
  268. package/src/styles/_sidebar.scss +380 -0
  269. package/src/styles/_states.scss +115 -0
  270. package/src/styles/_stats.scss +47 -0
  271. package/src/styles/_variables.scss +224 -0
  272. package/src/styles/index.scss +38 -0
  273. package/src/styles/theme/_components.scss +331 -0
  274. package/src/styles/theme/_index.scss +10 -0
  275. package/src/styles/theme/_tokens.scss +147 -0
  276. package/src/styles/theme/_utilities.scss +175 -0
  277. package/src/toast/ToastBridgeModule.ts +68 -0
  278. package/src/toast/ToastListener.vue +55 -0
  279. package/src/toast/index.ts +26 -0
  280. package/src/toast/useSignalToast.ts +154 -0
  281. package/src/types/index.ts +285 -0
  282. package/src/types/pluralize.d.ts +19 -0
  283. package/src/types/quarkernel.d.ts +50 -0
  284. package/src/utils/formatters.ts +174 -0
  285. package/src/utils/index.ts +35 -0
  286. package/src/utils/transformers.ts +131 -0
  287. package/src/vite/qdadmDebugPlugin.ts +401 -0
  288. package/src/vite-env.d.ts +50 -0
  289. package/src/zones/ZoneRegistry.ts +934 -0
  290. package/src/zones/index.ts +29 -0
  291. 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