@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,78 @@
1
+ /**
2
+ * Code and Key Display
3
+ * Monospace text, code boxes, and key displays
4
+ */
5
+
6
+ @use 'variables' as *;
7
+
8
+ // Code box - for displaying keys, code, or technical values
9
+ .code-box {
10
+ word-break: break-all;
11
+ font-family: $font-family-mono;
12
+ background: var(--p-surface-100);
13
+ padding: $space-md;
14
+ border-radius: $radius-sm;
15
+
16
+ // Small variant
17
+ &--sm {
18
+ padding: $space-sm;
19
+ font-size: $font-size-sm;
20
+ }
21
+ }
22
+
23
+ // Tag size variants
24
+ .tag-sm {
25
+ font-size: 0.7rem;
26
+ }
27
+
28
+ .tag-xs {
29
+ font-size: $font-size-xs;
30
+ }
31
+
32
+ // Constrained width for tag previews
33
+ .tags-constrained {
34
+ max-width: 300px;
35
+ }
36
+
37
+ // =============================================================================
38
+ // JSON Viewer
39
+ // =============================================================================
40
+
41
+ .json-viewer {
42
+ background: var(--p-surface-50);
43
+ border: 1px solid var(--p-surface-200);
44
+ border-radius: 0.375rem;
45
+ overflow: auto;
46
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
47
+ font-size: 0.8125rem;
48
+ line-height: 1.5;
49
+ }
50
+
51
+ .json-content {
52
+ padding: 1rem;
53
+ margin: 0;
54
+ white-space: pre-wrap;
55
+ word-break: break-word;
56
+ }
57
+
58
+ .json-key {
59
+ color: #881391;
60
+ }
61
+
62
+ .json-string {
63
+ color: #1a1aa6;
64
+ }
65
+
66
+ .json-number {
67
+ color: #1c00cf;
68
+ }
69
+
70
+ .json-boolean {
71
+ color: #0d22aa;
72
+ font-weight: 500;
73
+ }
74
+
75
+ .json-null {
76
+ color: #808080;
77
+ font-style: italic;
78
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Dialog Content Styles
3
+ * Styles for modal dialog content
4
+ */
5
+
6
+ @use 'variables' as *;
7
+
8
+ // Dialog content spacing
9
+ .dialog-content {
10
+ display: flex;
11
+ align-items: flex-start;
12
+ gap: 1rem;
13
+ margin-bottom: $space-md;
14
+
15
+ p {
16
+ margin: 0;
17
+ line-height: 1.5;
18
+ }
19
+ }
20
+
21
+ // Dialog section title
22
+ .dialog-section-title {
23
+ font-size: $font-size-sm;
24
+ font-weight: $font-weight-semibold;
25
+ margin-bottom: $space-sm;
26
+ color: var(--p-surface-600);
27
+ }
28
+
29
+ // Dialog icon (used in UnsavedChangesDialog, etc.)
30
+ .dialog-icon {
31
+ font-size: 2rem;
32
+ color: var(--p-orange-500);
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ // =============================================================================
37
+ // Multi-Step Dialog
38
+ // =============================================================================
39
+
40
+ .multi-step-dialog {
41
+ padding: 0.5rem 0;
42
+ }
43
+
44
+ .step-content {
45
+ padding: 1rem 0;
46
+ }
47
+
48
+ .step-actions {
49
+ display: flex;
50
+ justify-content: flex-end;
51
+ gap: 0.5rem;
52
+ margin-top: 1.5rem;
53
+ padding-top: 1rem;
54
+ border-top: 1px solid var(--p-surface-200);
55
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * qdadm - Filter Bar Styles
3
+ *
4
+ * Filter bar component for list pages
5
+ */
6
+
7
+ @use 'variables' as *;
8
+
9
+ // =============================================================================
10
+ // Filter Bar Layout
11
+ // =============================================================================
12
+
13
+ .filter-bar {
14
+ display: flex;
15
+ justify-content: space-between;
16
+ align-items: center;
17
+ gap: $space-md;
18
+ margin-bottom: $space-md;
19
+ }
20
+
21
+ .filter-bar-left {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: 0.75rem;
25
+ }
26
+
27
+ .filter-bar-right {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 0.75rem;
31
+ }
32
+
33
+ // =============================================================================
34
+ // Filter Value Indicators
35
+ // =============================================================================
36
+
37
+ // Filter at default value: blue/info (subtle indicator)
38
+ .p-select.filter-default,
39
+ .p-autocomplete.filter-default .p-inputtext {
40
+ border-color: var(--p-primary-400, #60a5fa) !important;
41
+ box-shadow: 0 0 0 1px var(--p-primary-400, #60a5fa) !important;
42
+ }
43
+
44
+ // Filter modified from default: orange/warning (attention needed)
45
+ .p-select.filter-modified,
46
+ .p-autocomplete.filter-modified .p-inputtext {
47
+ border-color: #f97316 !important;
48
+ box-shadow: 0 0 0 1px #f97316 !important;
49
+ }
50
+
51
+ // Legacy: keep filter-active as alias for filter-modified
52
+ .p-select.filter-active,
53
+ .p-inputtext.filter-active {
54
+ border-color: #f97316 !important;
55
+ box-shadow: 0 0 0 1px #f97316 !important;
56
+ }
57
+
58
+ // =============================================================================
59
+ // Button Height Alignment
60
+ // =============================================================================
61
+
62
+ // Ensure buttons match input height in inline form layouts
63
+ .filter-bar .p-button,
64
+ .filter-bar-left .p-button,
65
+ .flex.align-items-end .p-button,
66
+ .flex.items-end .p-button {
67
+ height: 2.5rem;
68
+ align-self: flex-end;
69
+ margin-bottom: 0;
70
+ }
@@ -0,0 +1,434 @@
1
+ /**
2
+ * qdadm - Form Styles
3
+ *
4
+ * Form layouts, fields, and related patterns:
5
+ * - Form grid layouts
6
+ * - Form fields and inputs
7
+ * - Toggle fields and checkboxes
8
+ * - Editor boxes and chips
9
+ * - Info grids and timestamps
10
+ * - Dirty state indicator
11
+ */
12
+
13
+ @use 'variables' as *;
14
+
15
+ // =============================================================================
16
+ // Form Grid Layouts
17
+ // =============================================================================
18
+
19
+ .form-grid {
20
+ display: grid;
21
+ grid-template-columns: repeat(2, 1fr);
22
+ gap: $space-lg;
23
+ padding: $space-md 0;
24
+
25
+ @include tablet {
26
+ grid-template-columns: 1fr;
27
+ }
28
+ }
29
+
30
+ // Form rows - grid layouts
31
+ .form-row {
32
+ display: grid;
33
+ grid-template-columns: repeat(2, 1fr);
34
+ gap: $space-lg;
35
+ align-items: end;
36
+ }
37
+
38
+ .form-row-3 {
39
+ display: grid;
40
+ grid-template-columns: repeat(3, 1fr);
41
+ gap: $space-md;
42
+ align-items: end;
43
+ }
44
+
45
+ .form-row.metadata {
46
+ display: grid;
47
+ grid-template-columns: repeat(4, 1fr);
48
+ gap: $space-md;
49
+ padding: $space-md;
50
+ background: var(--p-surface-50);
51
+ border-radius: $radius-lg;
52
+ align-items: end;
53
+ }
54
+
55
+ .form-row.checkboxes {
56
+ display: flex;
57
+ gap: 3rem;
58
+ }
59
+
60
+ // Spacing between form sections
61
+ .form-row + .form-field,
62
+ .form-field + .form-row {
63
+ margin-top: 1.25rem;
64
+ }
65
+
66
+ // =============================================================================
67
+ // Form Fields
68
+ // =============================================================================
69
+
70
+ .form-field {
71
+ display: flex;
72
+ flex-direction: column;
73
+ gap: $space-sm;
74
+
75
+ label {
76
+ font-weight: $font-weight-medium;
77
+ color: var(--p-surface-700);
78
+ }
79
+
80
+ small {
81
+ color: var(--p-surface-500);
82
+ font-size: 0.85rem;
83
+ }
84
+
85
+ // Force PrimeVue inputs to be full width
86
+ .p-inputtext,
87
+ .p-textarea,
88
+ .p-select,
89
+ .p-multiselect,
90
+ .p-inputwrapper,
91
+ input,
92
+ textarea {
93
+ width: 100% !important;
94
+ box-sizing: border-box;
95
+ }
96
+
97
+ .p-textarea,
98
+ textarea {
99
+ min-height: 100px;
100
+ resize: vertical;
101
+ }
102
+ }
103
+
104
+ // =============================================================================
105
+ // Meta Items
106
+ // =============================================================================
107
+
108
+ .meta-item {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: $space-xs;
112
+
113
+ label {
114
+ font-size: 0.85rem;
115
+ color: var(--p-surface-500);
116
+ }
117
+
118
+ span {
119
+ font-weight: $font-weight-medium;
120
+ }
121
+ }
122
+
123
+ // =============================================================================
124
+ // Toggle/Checkbox Fields
125
+ // =============================================================================
126
+
127
+ .toggle-field {
128
+ flex-direction: row;
129
+ align-items: center;
130
+ gap: $space-md;
131
+
132
+ label {
133
+ min-width: 120px;
134
+ }
135
+ }
136
+
137
+ .checkbox-field {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: $space-sm;
141
+
142
+ label {
143
+ margin: 0;
144
+ cursor: pointer;
145
+ }
146
+ }
147
+
148
+ // =============================================================================
149
+ // Field with Inline Button
150
+ // =============================================================================
151
+
152
+ .url-field,
153
+ .lock-field,
154
+ .envelope-field {
155
+ display: flex;
156
+ gap: $space-sm;
157
+ align-items: center;
158
+
159
+ input {
160
+ flex: 1;
161
+ }
162
+ }
163
+
164
+ // =============================================================================
165
+ // Field Hints and Errors
166
+ // =============================================================================
167
+
168
+ .field-hint,
169
+ .form-hint {
170
+ font-size: 0.8rem;
171
+ color: var(--p-surface-400);
172
+ margin-top: $space-xs;
173
+ display: block;
174
+ }
175
+
176
+ .field-error {
177
+ font-size: 0.8rem;
178
+ color: var(--p-red-500);
179
+ margin-top: $space-xs;
180
+ display: block;
181
+ }
182
+
183
+ // =============================================================================
184
+ // Editor Box (container for complex editors)
185
+ // =============================================================================
186
+
187
+ .editor-box {
188
+ border: $border-width solid var(--p-surface-200);
189
+ border-radius: $radius-lg;
190
+ padding: 0.75rem;
191
+ background: var(--p-surface-50);
192
+ }
193
+
194
+ // Chips container with separator
195
+ .editor-chips {
196
+ display: flex;
197
+ flex-wrap: wrap;
198
+ gap: $space-sm;
199
+ margin-bottom: 0.75rem;
200
+ padding-bottom: 0.75rem;
201
+ border-bottom: $border-width solid var(--p-surface-200);
202
+ }
203
+
204
+ // Chip typography for code-like content
205
+ .chip-code {
206
+ font-family: $font-family-mono;
207
+ font-size: $font-size-sm;
208
+ }
209
+
210
+ .chip-namespace {
211
+ color: var(--p-surface-500);
212
+ }
213
+
214
+ .chip-action {
215
+ color: var(--p-primary-600);
216
+ font-weight: $font-weight-medium;
217
+ }
218
+
219
+ .chip-wildcard {
220
+ color: var(--p-orange-500);
221
+ font-weight: $font-weight-bold;
222
+ }
223
+
224
+ // =============================================================================
225
+ // Info Grids
226
+ // =============================================================================
227
+
228
+ .info-grid {
229
+ display: grid;
230
+ grid-template-columns: repeat(2, 1fr);
231
+ gap: $space-md;
232
+
233
+ > div {
234
+ display: flex;
235
+ flex-direction: column;
236
+ gap: $space-xs;
237
+ }
238
+
239
+ label {
240
+ font-size: 0.85rem;
241
+ color: var(--p-surface-500);
242
+ }
243
+ }
244
+
245
+ .info-item {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: $space-xs;
249
+
250
+ label {
251
+ font-size: $font-size-xs;
252
+ font-weight: $font-weight-semibold;
253
+ color: var(--p-surface-500);
254
+ text-transform: uppercase;
255
+ }
256
+ }
257
+
258
+ .info-value {
259
+ font-size: 0.9rem;
260
+ }
261
+
262
+ // =============================================================================
263
+ // Timestamps Grid
264
+ // =============================================================================
265
+
266
+ .timestamps-grid {
267
+ display: grid;
268
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
269
+ gap: $space-md;
270
+
271
+ &--separator {
272
+ padding-top: $space-md;
273
+ border-top: $border-width solid var(--p-surface-200);
274
+ }
275
+ }
276
+
277
+ .timestamp {
278
+ display: flex;
279
+ flex-direction: column;
280
+ gap: $space-xs;
281
+
282
+ label {
283
+ font-size: $font-size-xs;
284
+ color: var(--text-color-secondary);
285
+ text-transform: uppercase;
286
+ }
287
+ }
288
+
289
+ // =============================================================================
290
+ // Dirty State Indicator
291
+ // =============================================================================
292
+
293
+ .form-dirty-indicator {
294
+ display: flex;
295
+ align-items: center;
296
+ gap: $space-sm;
297
+ padding: $space-sm $space-md;
298
+ background: color-mix(in srgb, var(--p-orange-100) 50%, transparent);
299
+ border: $border-width solid var(--p-orange-300);
300
+ border-radius: $radius-md;
301
+ color: var(--p-orange-700);
302
+ font-size: $font-size-sm;
303
+ margin-bottom: $space-md;
304
+
305
+ i {
306
+ color: var(--p-orange-500);
307
+ }
308
+ }
309
+
310
+ // Modified form fields - orange border
311
+ .form-field.field-dirty {
312
+ .p-inputtext,
313
+ .p-select,
314
+ .p-textarea,
315
+ .p-password input,
316
+ .p-multiselect,
317
+ .p-calendar input,
318
+ .p-inputnumber input,
319
+ .p-dropdown {
320
+ border-color: #f97316 !important;
321
+ box-shadow: 0 0 0 1px #f97316 !important;
322
+ }
323
+ }
324
+
325
+ // =============================================================================
326
+ // Form Cards
327
+ // =============================================================================
328
+
329
+ .form-card {
330
+ background: var(--p-surface-0);
331
+ padding: $space-xl;
332
+ border-radius: $radius-lg;
333
+ }
334
+
335
+ // =============================================================================
336
+ // Config Pages Pattern
337
+ // =============================================================================
338
+
339
+ .config-intro {
340
+ display: flex;
341
+ align-items: flex-start;
342
+ gap: 0.75rem;
343
+ padding: $space-md;
344
+ background: var(--p-surface-50);
345
+ border-radius: $radius-lg;
346
+ margin-bottom: $space-lg;
347
+
348
+ i {
349
+ font-size: 1.25rem;
350
+ color: var(--p-primary-500);
351
+ margin-top: 0.125rem;
352
+ }
353
+ }
354
+
355
+ .config-field {
356
+ margin-bottom: $space-lg;
357
+ }
358
+
359
+ // =============================================================================
360
+ // Form Actions (FormActions component)
361
+ // =============================================================================
362
+
363
+ .form-actions {
364
+ display: flex;
365
+ justify-content: space-between;
366
+ align-items: center;
367
+ margin-top: 1.5rem;
368
+ padding-top: 1.5rem;
369
+ border-top: 1px solid var(--p-surface-200);
370
+ }
371
+
372
+ .form-actions-left {
373
+ display: flex;
374
+ align-items: center;
375
+ gap: 0.5rem;
376
+ }
377
+
378
+ .dirty-indicator {
379
+ color: var(--p-orange-500);
380
+ font-size: 0.5rem;
381
+ animation: pulse 2s infinite;
382
+ }
383
+
384
+ @keyframes pulse {
385
+ 0%, 100% { opacity: 1; }
386
+ 50% { opacity: 0.4; }
387
+ }
388
+
389
+ // =============================================================================
390
+ // Field Invalid State (FormField component)
391
+ // =============================================================================
392
+
393
+ .field-invalid input,
394
+ .field-invalid textarea,
395
+ .field-invalid .p-inputtext,
396
+ .field-invalid .p-select,
397
+ .field-invalid .p-dropdown {
398
+ border-color: var(--p-red-500);
399
+ }
400
+
401
+ .field-invalid input:focus,
402
+ .field-invalid textarea:focus,
403
+ .field-invalid .p-inputtext:focus,
404
+ .field-invalid .p-select:focus,
405
+ .field-invalid .p-dropdown:focus {
406
+ box-shadow: 0 0 0 1px var(--p-red-500);
407
+ }
408
+
409
+ // =============================================================================
410
+ // Form Page (FormPage component)
411
+ // =============================================================================
412
+
413
+ .form-page {
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: 1rem;
417
+ }
418
+
419
+ .form-error-message {
420
+ margin: 1rem 0;
421
+ }
422
+
423
+ .validation-summary {
424
+ margin-bottom: 1rem;
425
+ }
426
+
427
+ .validation-errors {
428
+ margin: 0;
429
+ padding-left: 1.5rem;
430
+
431
+ li {
432
+ margin: 0.25rem 0;
433
+ }
434
+ }