@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,224 @@
1
+ /**
2
+ * qdadm - Design System Variables
3
+ *
4
+ * Centralized SCSS variables for the entire framework.
5
+ * Import this file in any component that needs access to these values:
6
+ * @use 'qdadm/styles/variables' as *;
7
+ *
8
+ * Note: CSS custom properties (--fad-*) are still generated for runtime theming.
9
+ * SCSS variables are for compile-time values (breakpoints, calculations, mixins).
10
+ */
11
+
12
+ // =============================================================================
13
+ // COLORS
14
+ // =============================================================================
15
+ // Note: Color values use CSS custom properties for runtime theming.
16
+ // These SCSS variables are for reference/documentation only.
17
+
18
+ // Primary brand color
19
+ $color-primary: var(--p-primary-color) !default;
20
+ $color-primary-hover: var(--p-primary-600) !default;
21
+
22
+ // Status colors
23
+ $color-success: var(--p-green-500) !default;
24
+ $color-warning: var(--p-orange-500) !default;
25
+ $color-danger: var(--p-red-500) !default;
26
+ $color-info: var(--p-blue-500) !default;
27
+
28
+ // =============================================================================
29
+ // TYPOGRAPHY
30
+ // =============================================================================
31
+ // Modern, clean typography inspired by VSCode/Material Design.
32
+ // Lighter weights and tighter sizes for a refined look.
33
+
34
+ // Font family - Inter for modern UI, system fonts as fallback
35
+ $font-family-base: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !default;
36
+ $font-family-mono: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace !default;
37
+
38
+ // Font sizes (rem-based for accessibility)
39
+ // Modern compact scale - readable but efficient
40
+ $font-size-2xs: 0.6875rem !default; // 11px - Micro text (badges, version)
41
+ $font-size-xs: 0.75rem !default; // 12px - Small text, section titles
42
+ $font-size-sm: 0.875rem !default; // 14px - Nav items, secondary text
43
+ $font-size-md: 0.9375rem !default; // 15px - Body text
44
+ $font-size-lg: 1rem !default; // 16px - Headings
45
+ $font-size-xl: 1.125rem !default; // 18px - Large headings
46
+ $font-size-2xl: 1.25rem !default; // 20px - Page titles
47
+
48
+ // Font weights - prefer lighter weights for modern look
49
+ $font-weight-light: 300 !default; // Light text
50
+ $font-weight-normal: 400 !default; // Body text
51
+ $font-weight-medium: 500 !default; // Emphasized text
52
+ $font-weight-semibold: 600 !default; // Headings (use sparingly)
53
+ $font-weight-bold: 700 !default; // Strong emphasis (rare)
54
+
55
+ // Line heights
56
+ $line-height-tight: 1.25 !default;
57
+ $line-height-normal: 1.5 !default;
58
+ $line-height-relaxed: 1.75 !default;
59
+
60
+ // =============================================================================
61
+ // SPACING
62
+ // =============================================================================
63
+ // Compact spacing scale for modern UI.
64
+ // More economical use of space, similar to VSCode/IDE density.
65
+
66
+ $space-2xs: 0.125rem !default; // 2px - Micro spacing
67
+ $space-xs: 0.25rem !default; // 4px - Tight spacing (inline elements)
68
+ $space-sm: 0.375rem !default; // 6px - Small gaps (compact)
69
+ $space-md: 0.75rem !default; // 12px - Default spacing (reduced from 16px)
70
+ $space-lg: 1rem !default; // 16px - Section spacing
71
+ $space-xl: 1.5rem !default; // 24px - Large sections
72
+ $space-2xl: 2rem !default; // 32px - Page-level spacing
73
+
74
+ // =============================================================================
75
+ // BORDERS & RADIUS
76
+ // =============================================================================
77
+
78
+ $border-width: 1px !default;
79
+ $border-color: var(--p-surface-200) !default;
80
+
81
+ $radius-sm: 0.25rem !default; // 4px - Subtle rounding
82
+ $radius-md: 0.375rem !default; // 6px - Inputs, buttons
83
+ $radius-lg: 0.5rem !default; // 8px - Cards, modals
84
+ $radius-xl: 0.75rem !default; // 12px - Large cards
85
+ $radius-full: 9999px !default; // Fully rounded (pills, avatars)
86
+
87
+ // =============================================================================
88
+ // SHADOWS
89
+ // =============================================================================
90
+
91
+ $shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !default;
92
+ $shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1) !default;
93
+ $shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1) !default;
94
+ $shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1) !default;
95
+
96
+ // =============================================================================
97
+ // TRANSITIONS
98
+ // =============================================================================
99
+ // Snappy transitions for responsive feel.
100
+ // Modern UIs use shorter durations - instant feedback matters.
101
+
102
+ $transition-instant: 50ms ease !default; // Near-instant (active states)
103
+ $transition-fast: 100ms ease !default; // Micro-interactions (hover, focus)
104
+ $transition-normal: 150ms ease !default; // Standard transitions
105
+ $transition-slow: 200ms ease !default; // Larger animations (modals, drawers)
106
+
107
+ // =============================================================================
108
+ // Z-INDEX SCALE
109
+ // =============================================================================
110
+ // Layering system to ensure proper stacking.
111
+
112
+ $z-dropdown: 1000 !default; // Dropdowns, selects
113
+ $z-sticky: 1020 !default; // Sticky headers
114
+ $z-fixed: 1030 !default; // Fixed elements
115
+ $z-modal-backdrop: 1040 !default; // Modal backdrop
116
+ $z-modal: 1050 !default; // Modal content
117
+ $z-popover: 1060 !default; // Popovers, tooltips
118
+ $z-tooltip: 1070 !default; // Top-level tooltips
119
+
120
+ // =============================================================================
121
+ // LAYOUT - SIDEBAR
122
+ // =============================================================================
123
+ // Compact sidebar dimensions for modern admin layout.
124
+ // Inspired by VSCode's slim sidebar proportions.
125
+
126
+ $sidebar-width: 15rem !default; // 240px - Desktop sidebar
127
+ $sidebar-width-tablet: 13rem !default; // 208px - Tablet sidebar width (768-1023px)
128
+ $sidebar-width-collapsed: 2.5rem !default; // 40px - Collapsed sidebar (icon-only)
129
+
130
+ // Header
131
+ $header-height: 2.75rem !default; // 44px - Mobile header height (compact)
132
+
133
+ // Content
134
+ $content-max-width: 87.5rem !default; // 1400px - Maximum content width
135
+
136
+ // =============================================================================
137
+ // LAYOUT - NAVIGATION
138
+ // =============================================================================
139
+ // Navigation item sizing - readable but compact.
140
+
141
+ $nav-item-height: 2rem !default; // 32px - Nav item height
142
+ $nav-item-padding-x: 0.75rem !default; // 12px - Horizontal padding
143
+ $nav-item-padding-y: 0.5rem !default; // 8px - Vertical padding
144
+ $nav-icon-size: 1rem !default; // 16px - Icon size
145
+ $nav-section-gap: 0.5rem !default; // 8px - Gap between sections
146
+
147
+ // =============================================================================
148
+ // BREAKPOINTS
149
+ // =============================================================================
150
+ // Desktop-first breakpoint system (max-width queries).
151
+ // Usage: @include tablet { ... }
152
+
153
+ $bp-desktop-lg: 1400px !default; // Large desktop (wide monitors)
154
+ $bp-desktop: 1200px !default; // Standard desktop
155
+ $bp-tablet-lg: 1024px !default; // Large tablet / small laptop
156
+ $bp-tablet: 768px !default; // Tablet portrait
157
+ $bp-mobile-lg: 576px !default; // Large mobile (landscape)
158
+ $bp-mobile: 480px !default; // Standard mobile
159
+
160
+ // Sidebar behavior thresholds
161
+ $bp-sidebar-collapse: $bp-tablet-lg !default; // Sidebar collapses below this
162
+ $bp-sidebar-hidden: $bp-tablet !default; // Sidebar becomes drawer below this
163
+
164
+ // =============================================================================
165
+ // BREAKPOINT MIXINS
166
+ // =============================================================================
167
+ // Desktop-first media query mixins (max-width).
168
+ // Usage in components:
169
+ // @use 'qdadm/styles/variables' as *;
170
+ // .sidebar { @include tablet { width: 60px; } }
171
+
172
+ @mixin desktop-lg {
173
+ @media (max-width: #{$bp-desktop-lg - 1px}) { @content; }
174
+ }
175
+
176
+ @mixin desktop {
177
+ @media (max-width: #{$bp-desktop - 1px}) { @content; }
178
+ }
179
+
180
+ @mixin tablet-lg {
181
+ @media (max-width: #{$bp-tablet-lg - 1px}) { @content; }
182
+ }
183
+
184
+ @mixin tablet {
185
+ @media (max-width: #{$bp-tablet - 1px}) { @content; }
186
+ }
187
+
188
+ @mixin mobile-lg {
189
+ @media (max-width: #{$bp-mobile-lg - 1px}) { @content; }
190
+ }
191
+
192
+ @mixin mobile {
193
+ @media (max-width: #{$bp-mobile - 1px}) { @content; }
194
+ }
195
+
196
+ // Utility mixins for visibility
197
+ @mixin hide-below($bp) {
198
+ @media (max-width: #{$bp - 1px}) { display: none !important; }
199
+ }
200
+
201
+ @mixin show-below($bp) {
202
+ display: none !important;
203
+ @media (max-width: #{$bp - 1px}) { display: block !important; }
204
+ }
205
+
206
+ // Sidebar-specific mixins
207
+ @mixin sidebar-collapsed {
208
+ @media (max-width: #{$bp-sidebar-collapse - 1px}) { @content; }
209
+ }
210
+
211
+ @mixin sidebar-hidden {
212
+ @media (max-width: #{$bp-sidebar-hidden - 1px}) { @content; }
213
+ }
214
+
215
+ // =============================================================================
216
+ // HELPER FUNCTIONS
217
+ // =============================================================================
218
+
219
+ /// Convert pixel value to rem
220
+ /// @param {Number} $px - Pixel value
221
+ /// @return {Number} - Rem value (base 16px)
222
+ @function px-to-rem($px) {
223
+ @return ($px / 16) * 1rem;
224
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * qdadm - Styles Entry Point
3
+ *
4
+ * Import this file in your main.js:
5
+ * import 'qdadm/styles'
6
+ *
7
+ * Or import individual partials:
8
+ * @use 'qdadm/styles/variables' as *;
9
+ */
10
+
11
+ // Design tokens (CSS custom properties)
12
+ @use './theme/tokens';
13
+
14
+ // Theme utilities and components
15
+ @use './theme/utilities';
16
+ @use './theme/components';
17
+
18
+ // Main framework styles
19
+ @use './main';
20
+ @use './forms';
21
+ @use './stats';
22
+ @use './states';
23
+ @use './lists';
24
+ @use './filter-bar';
25
+ @use './helpers';
26
+
27
+ // Component-specific styles
28
+ @use './alerts';
29
+ @use './buttons';
30
+ @use './cards';
31
+ @use './code';
32
+ @use './dialogs';
33
+ @use './markdown';
34
+ @use './show-pages';
35
+ @use './sidebar';
36
+
37
+ // Responsive styles (must be last for specificity)
38
+ @use './responsive';
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Component Styles
3
+ *
4
+ * Reusable component classes that can be used directly in templates
5
+ * or as base styles for Vue components.
6
+ */
7
+
8
+ @use '../variables' as *;
9
+
10
+ // =============================================================================
11
+ // Cards
12
+ // =============================================================================
13
+
14
+ .fad-card {
15
+ background: var(--fad-surface-card);
16
+ border: $border-width solid var(--fad-border-color);
17
+ border-radius: $radius-lg;
18
+ padding: $space-lg;
19
+ }
20
+
21
+ .fad-card-header {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: space-between;
25
+ margin-bottom: $space-md;
26
+ padding-bottom: $space-md;
27
+ border-bottom: $border-width solid var(--fad-border-color);
28
+ }
29
+
30
+ .fad-card-title {
31
+ font-size: $font-size-lg;
32
+ font-weight: $font-weight-semibold;
33
+ color: var(--fad-text-primary);
34
+ margin: 0;
35
+ }
36
+
37
+ .fad-card-body {
38
+ color: var(--fad-text-primary);
39
+ }
40
+
41
+ .fad-card-footer {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: flex-end;
45
+ gap: $space-sm;
46
+ margin-top: $space-md;
47
+ padding-top: $space-md;
48
+ border-top: $border-width solid var(--fad-border-color);
49
+ }
50
+
51
+ // =============================================================================
52
+ // Form Elements
53
+ // =============================================================================
54
+
55
+ .fad-form-field {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: $space-sm;
59
+ margin-bottom: $space-lg;
60
+ }
61
+
62
+ .fad-form-label {
63
+ font-weight: $font-weight-medium;
64
+ color: var(--fad-text-primary);
65
+ font-size: $font-size-sm;
66
+ }
67
+
68
+ .fad-form-label-required::after {
69
+ content: " *";
70
+ color: var(--fad-danger);
71
+ }
72
+
73
+ .fad-form-help {
74
+ font-size: $font-size-xs;
75
+ color: var(--fad-text-secondary);
76
+ }
77
+
78
+ .fad-form-error {
79
+ font-size: $font-size-xs;
80
+ color: var(--fad-danger);
81
+ }
82
+
83
+ .fad-form-row {
84
+ display: grid;
85
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
86
+ gap: $space-md;
87
+ }
88
+
89
+ .fad-form-section-title {
90
+ font-size: $font-size-lg;
91
+ font-weight: $font-weight-semibold;
92
+ color: var(--fad-text-primary);
93
+ margin: $space-xl 0 $space-md 0;
94
+ padding-bottom: $space-sm;
95
+ border-bottom: $border-width solid var(--fad-border-color);
96
+
97
+ &:first-child {
98
+ margin-top: 0;
99
+ }
100
+ }
101
+
102
+ // =============================================================================
103
+ // Form Field States
104
+ // =============================================================================
105
+
106
+ .fad-form-field--dirty {
107
+ position: relative;
108
+
109
+ &::before {
110
+ content: "";
111
+ position: absolute;
112
+ left: -8px;
113
+ top: 0;
114
+ bottom: 0;
115
+ width: 3px;
116
+ background: var(--fad-warning);
117
+ border-radius: $radius-full;
118
+ }
119
+ }
120
+
121
+ .fad-form-field--error .fad-form-label {
122
+ color: var(--fad-danger);
123
+ }
124
+
125
+ // =============================================================================
126
+ // Page Header
127
+ // =============================================================================
128
+
129
+ .fad-page-header {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ margin-bottom: $space-lg;
134
+ padding-bottom: $space-md;
135
+ }
136
+
137
+ .fad-page-title {
138
+ font-size: $font-size-2xl;
139
+ font-weight: $font-weight-semibold;
140
+ color: var(--fad-text-primary);
141
+ margin: 0;
142
+ }
143
+
144
+ .fad-page-actions {
145
+ display: flex;
146
+ gap: $space-sm;
147
+ }
148
+
149
+ // =============================================================================
150
+ // Empty State
151
+ // =============================================================================
152
+
153
+ .fad-empty-state {
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ justify-content: center;
158
+ padding: $space-2xl $space-md;
159
+ text-align: center;
160
+ color: var(--fad-text-secondary);
161
+ }
162
+
163
+ .fad-empty-state-icon {
164
+ font-size: 3rem;
165
+ opacity: 0.5;
166
+ margin-bottom: $space-md;
167
+ }
168
+
169
+ .fad-empty-state-title {
170
+ font-size: $font-size-lg;
171
+ font-weight: $font-weight-medium;
172
+ color: var(--fad-text-primary);
173
+ margin: 0 0 $space-sm 0;
174
+ }
175
+
176
+ .fad-empty-state-description {
177
+ font-size: $font-size-sm;
178
+ max-width: 400px;
179
+ }
180
+
181
+ // =============================================================================
182
+ // Loading State
183
+ // =============================================================================
184
+
185
+ .fad-loading {
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ padding: $space-2xl;
190
+ }
191
+
192
+ .fad-loading-spinner {
193
+ animation: fad-spin 1s linear infinite;
194
+ }
195
+
196
+ @keyframes fad-spin {
197
+ from { transform: rotate(0deg); }
198
+ to { transform: rotate(360deg); }
199
+ }
200
+
201
+ // =============================================================================
202
+ // Status Badges
203
+ // =============================================================================
204
+
205
+ .fad-badge {
206
+ display: inline-flex;
207
+ align-items: center;
208
+ padding: $space-xs $space-sm;
209
+ font-size: $font-size-xs;
210
+ font-weight: $font-weight-medium;
211
+ border-radius: $radius-full;
212
+ text-transform: uppercase;
213
+ letter-spacing: 0.025em;
214
+
215
+ &--success {
216
+ background: var(--p-green-100);
217
+ color: var(--p-green-700);
218
+ }
219
+
220
+ &--warning {
221
+ background: var(--p-orange-100);
222
+ color: var(--p-orange-700);
223
+ }
224
+
225
+ &--danger {
226
+ background: var(--p-red-100);
227
+ color: var(--p-red-700);
228
+ }
229
+
230
+ &--info {
231
+ background: var(--p-blue-100);
232
+ color: var(--p-blue-700);
233
+ }
234
+
235
+ &--neutral {
236
+ background: var(--p-surface-100);
237
+ color: var(--p-surface-600);
238
+ }
239
+ }
240
+
241
+ // =============================================================================
242
+ // Tabs (for form tabs)
243
+ // =============================================================================
244
+
245
+ .fad-tabs {
246
+ display: flex;
247
+ gap: $space-xs;
248
+ border-bottom: $border-width solid var(--fad-border-color);
249
+ margin-bottom: $space-lg;
250
+ }
251
+
252
+ .fad-tab {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: $space-xs;
256
+ padding: $space-sm $space-md;
257
+ font-size: $font-size-sm;
258
+ font-weight: $font-weight-medium;
259
+ color: var(--fad-text-secondary);
260
+ background: transparent;
261
+ border: none;
262
+ border-bottom: 2px solid transparent;
263
+ cursor: pointer;
264
+ transition: all $transition-fast;
265
+ margin-bottom: -1px;
266
+
267
+ &:hover {
268
+ color: var(--fad-text-primary);
269
+ }
270
+
271
+ &--active {
272
+ color: var(--fad-primary);
273
+ border-bottom-color: var(--fad-primary);
274
+ }
275
+ }
276
+
277
+ .fad-tab-count {
278
+ background: var(--p-surface-100);
279
+ color: var(--fad-text-secondary);
280
+ padding: 0.125rem 0.375rem;
281
+ border-radius: $radius-full;
282
+ font-size: $font-size-xs;
283
+
284
+ .fad-tab--active & {
285
+ background: var(--p-primary-100);
286
+ color: var(--fad-primary);
287
+ }
288
+ }
289
+
290
+ // =============================================================================
291
+ // Page Navigation (breadcrumb + navlinks)
292
+ // =============================================================================
293
+
294
+ .fad-page-nav {
295
+ display: flex;
296
+ justify-content: space-between;
297
+ align-items: center;
298
+ margin-bottom: $space-sm;
299
+ }
300
+
301
+ .fad-page-nav-breadcrumb {
302
+ flex: 1;
303
+ }
304
+
305
+ .fad-page-nav-links {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: $space-sm;
309
+ font-size: $font-size-sm;
310
+ }
311
+
312
+ .fad-page-nav-separator {
313
+ color: var(--fad-text-secondary);
314
+ }
315
+
316
+ .fad-page-nav-link {
317
+ color: var(--fad-primary);
318
+ text-decoration: none;
319
+ transition: color $transition-fast;
320
+
321
+ &:hover {
322
+ color: var(--fad-primary-hover);
323
+ text-decoration: underline;
324
+ }
325
+
326
+ &--active {
327
+ color: var(--fad-text-primary);
328
+ font-weight: $font-weight-medium;
329
+ pointer-events: none;
330
+ }
331
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * qdadm Design System - Theme
3
+ *
4
+ * Import this file to get all theme styles.
5
+ * Use the fad-* classes in your components.
6
+ */
7
+
8
+ @use 'tokens';
9
+ @use 'utilities';
10
+ @use 'components';