@shamar/adonis 0.1.0

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 (134) hide show
  1. package/assets/admin.css +2 -0
  2. package/assets/alpine.min.js +5 -0
  3. package/assets/input.css +2286 -0
  4. package/assets/shamar-ui.js +3658 -0
  5. package/dist/assets-controller.d.ts +12 -0
  6. package/dist/assets-controller.d.ts.map +1 -0
  7. package/dist/assets-controller.js +32 -0
  8. package/dist/assets-controller.js.map +1 -0
  9. package/dist/config.d.ts +79 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +38 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/configure.d.ts +21 -0
  14. package/dist/configure.d.ts.map +1 -0
  15. package/dist/configure.js +20 -0
  16. package/dist/configure.js.map +1 -0
  17. package/dist/context.d.ts +22 -0
  18. package/dist/context.d.ts.map +1 -0
  19. package/dist/context.js +2 -0
  20. package/dist/context.js.map +1 -0
  21. package/dist/controller.d.ts +31 -0
  22. package/dist/controller.d.ts.map +1 -0
  23. package/dist/controller.js +45 -0
  24. package/dist/controller.js.map +1 -0
  25. package/dist/controllers/admin_controller.d.ts +72 -0
  26. package/dist/controllers/admin_controller.d.ts.map +1 -0
  27. package/dist/controllers/admin_controller.js +1075 -0
  28. package/dist/controllers/admin_controller.js.map +1 -0
  29. package/dist/discover.d.ts +7 -0
  30. package/dist/discover.d.ts.map +1 -0
  31. package/dist/discover.js +50 -0
  32. package/dist/discover.js.map +1 -0
  33. package/dist/form-state.d.ts +41 -0
  34. package/dist/form-state.d.ts.map +1 -0
  35. package/dist/form-state.js +74 -0
  36. package/dist/form-state.js.map +1 -0
  37. package/dist/index.d.ts +10 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +10 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/middleware/require_api_key_middleware.d.ts +30 -0
  42. package/dist/middleware/require_api_key_middleware.d.ts.map +1 -0
  43. package/dist/middleware/require_api_key_middleware.js +59 -0
  44. package/dist/middleware/require_api_key_middleware.js.map +1 -0
  45. package/dist/provider.d.ts +9 -0
  46. package/dist/provider.d.ts.map +1 -0
  47. package/dist/provider.js +66 -0
  48. package/dist/provider.js.map +1 -0
  49. package/dist/resources/api_key_resource.d.ts +35 -0
  50. package/dist/resources/api_key_resource.d.ts.map +1 -0
  51. package/dist/resources/api_key_resource.js +225 -0
  52. package/dist/resources/api_key_resource.js.map +1 -0
  53. package/dist/routes.d.ts +5 -0
  54. package/dist/routes.d.ts.map +1 -0
  55. package/dist/routes.js +97 -0
  56. package/dist/routes.js.map +1 -0
  57. package/dist/runtime.d.ts +27 -0
  58. package/dist/runtime.d.ts.map +1 -0
  59. package/dist/runtime.js +74 -0
  60. package/dist/runtime.js.map +1 -0
  61. package/dist/shamar/auth.d.ts +30 -0
  62. package/dist/shamar/auth.d.ts.map +1 -0
  63. package/dist/shamar/auth.js +218 -0
  64. package/dist/shamar/auth.js.map +1 -0
  65. package/dist/shamar/branding.d.ts +24 -0
  66. package/dist/shamar/branding.d.ts.map +1 -0
  67. package/dist/shamar/branding.js +91 -0
  68. package/dist/shamar/branding.js.map +1 -0
  69. package/dist/shamar/display-relations.d.ts +7 -0
  70. package/dist/shamar/display-relations.d.ts.map +1 -0
  71. package/dist/shamar/display-relations.js +89 -0
  72. package/dist/shamar/display-relations.js.map +1 -0
  73. package/dist/shamar/list-headers.d.ts +38 -0
  74. package/dist/shamar/list-headers.d.ts.map +1 -0
  75. package/dist/shamar/list-headers.js +218 -0
  76. package/dist/shamar/list-headers.js.map +1 -0
  77. package/dist/shamar/list-query.d.ts +229 -0
  78. package/dist/shamar/list-query.d.ts.map +1 -0
  79. package/dist/shamar/list-query.js +564 -0
  80. package/dist/shamar/list-query.js.map +1 -0
  81. package/dist/shamar/menu.d.ts +48 -0
  82. package/dist/shamar/menu.d.ts.map +1 -0
  83. package/dist/shamar/menu.js +93 -0
  84. package/dist/shamar/menu.js.map +1 -0
  85. package/dist/shamar/paths.d.ts +5 -0
  86. package/dist/shamar/paths.d.ts.map +1 -0
  87. package/dist/shamar/paths.js +16 -0
  88. package/dist/shamar/paths.js.map +1 -0
  89. package/dist/shamar/relation-fields.d.ts +54 -0
  90. package/dist/shamar/relation-fields.d.ts.map +1 -0
  91. package/dist/shamar/relation-fields.js +94 -0
  92. package/dist/shamar/relation-fields.js.map +1 -0
  93. package/dist/shamar/resource-actions.d.ts +9 -0
  94. package/dist/shamar/resource-actions.d.ts.map +1 -0
  95. package/dist/shamar/resource-actions.js +42 -0
  96. package/dist/shamar/resource-actions.js.map +1 -0
  97. package/dist/shamar/view-context.d.ts +79 -0
  98. package/dist/shamar/view-context.d.ts.map +1 -0
  99. package/dist/shamar/view-context.js +74 -0
  100. package/dist/shamar/view-context.js.map +1 -0
  101. package/dist/types.d.ts +15 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +2 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +67 -0
  106. package/resources/views/shamar/dashboard.edge +24 -0
  107. package/resources/views/shamar/form.edge +87 -0
  108. package/resources/views/shamar/index.edge +149 -0
  109. package/resources/views/shamar/partials/boolean-value.edge +25 -0
  110. package/resources/views/shamar/partials/csrf.edge +1 -0
  111. package/resources/views/shamar/partials/detail-entry.edge +72 -0
  112. package/resources/views/shamar/partials/dialog-host.edge +125 -0
  113. package/resources/views/shamar/partials/field-affix-icon.edge +23 -0
  114. package/resources/views/shamar/partials/field-input.edge +585 -0
  115. package/resources/views/shamar/partials/field-relation-checkbox.edge +104 -0
  116. package/resources/views/shamar/partials/field-relation-m2m.edge +110 -0
  117. package/resources/views/shamar/partials/field-relation-m2o.edge +116 -0
  118. package/resources/views/shamar/partials/field-relation-table.edge +139 -0
  119. package/resources/views/shamar/partials/form-container.edge +82 -0
  120. package/resources/views/shamar/partials/icon.edge +14 -0
  121. package/resources/views/shamar/partials/list-row.edge +73 -0
  122. package/resources/views/shamar/partials/list-toolbar.edge +269 -0
  123. package/resources/views/shamar/partials/nav-mobile.edge +21 -0
  124. package/resources/views/shamar/partials/nav.edge +58 -0
  125. package/resources/views/shamar/partials/page-heading.edge +130 -0
  126. package/resources/views/shamar/partials/pagination.edge +73 -0
  127. package/resources/views/shamar/partials/record-pager.edge +37 -0
  128. package/resources/views/shamar/partials/schema-node.edge +289 -0
  129. package/resources/views/shamar/partials/shell-close.edge +20 -0
  130. package/resources/views/shamar/partials/shell-open.edge +51 -0
  131. package/resources/views/shamar/partials/toast.edge +5 -0
  132. package/resources/views/shamar/partials/topbar.edge +115 -0
  133. package/resources/views/shamar/show.edge +17 -0
  134. package/stubs/config/shamar.stub +29 -0
@@ -0,0 +1,2286 @@
1
+ @import "tailwindcss";
2
+
3
+ /* Package UI (Edge templates + client JS). */
4
+ @source "../resources/views/**/*.edge";
5
+ @source "./shamar-ui.js";
6
+
7
+ /*
8
+ * App schemas may inject Tailwind via:
9
+ * .extraAttributes({ class: '…' })
10
+ * .extraInputAttributes({ class: '…' })
11
+ * Scan consumer apps in this monorepo so those utilities are not purged.
12
+ */
13
+ @source "../../../apps/**/*.{ts,js,edge}";
14
+
15
+ @custom-variant dark (&:where(.dark, .dark *));
16
+
17
+ @theme {
18
+ /* Brand primary scale — #F1511B at 500 */
19
+ --color-primary-50: #fff4f0;
20
+ --color-primary-100: #fee9e2;
21
+ --color-primary-200: #fdc9b8;
22
+ --color-primary-300: #f89a72;
23
+ --color-primary-400: #f36d3d;
24
+ --color-primary-500: #f1511b;
25
+ --color-primary-600: #e04a18;
26
+ --color-primary-700: #c94115;
27
+ --color-primary-800: #a23512;
28
+ --color-primary-900: #7a280e;
29
+ --color-primary-950: #451a0a;
30
+
31
+ /* Gray scale (Loom dark surfaces) */
32
+ --color-gray-300: #d1d5db;
33
+ --color-gray-400: #9ca3af;
34
+ --color-gray-500: #6b7280;
35
+ --color-gray-600: #4b5563;
36
+ --color-gray-700: #374151;
37
+ --color-gray-800: #1f2937;
38
+ --color-gray-900: #111827;
39
+ --color-gray-950: #0a1018;
40
+ --color-gray-50: #f9fafb;
41
+ --color-gray-100: #f3f4f6;
42
+ --color-gray-200: #e5e7eb;
43
+
44
+ /* Legacy shamar-* aliases (map to primary) */
45
+ --color-shamar-primary: #f1511b;
46
+ --color-shamar-primary-50: #fff4f0;
47
+ --color-shamar-primary-100: #fee9e2;
48
+ --color-shamar-primary-600: #f1511b;
49
+ --color-shamar-primary-700: #c94115;
50
+ --color-shamar-primary-800: #a23512;
51
+ --color-shamar-accent: #286291;
52
+ --color-shamar-accent-50: #e8f0f7;
53
+ --color-shamar-accent-100: #d1e1ef;
54
+ --color-shamar-accent-600: #286291;
55
+ --color-shamar-accent-700: #1f4d73;
56
+ --color-shamar-surface: #ffffff;
57
+ --color-shamar-muted: #64748b;
58
+
59
+ /* Loom semantic tokens (brand-mapped to primary orange) */
60
+ --color-body: #475569;
61
+ --color-body-subtle: #64748b;
62
+ --color-heading: #0f172a;
63
+ --color-neutral-primary: #ffffff;
64
+ --color-neutral-secondary: #fff4f0;
65
+ --color-neutral-tertiary: #fee9e2;
66
+ --color-default: #fdc9b8;
67
+ --color-fg-brand: #f1511b;
68
+ --color-fg-brand-strong: #a23512;
69
+ --color-brand-soft: #fee9e2;
70
+ --color-brand-softer: #fee9e2;
71
+ --color-fg-danger: #b91c1c;
72
+ --color-danger-soft: #fef2f2;
73
+ --color-success-soft: #ecfdf5;
74
+ --color-success-strong: #047857;
75
+ --color-warning-soft: #fffbeb;
76
+ --color-warning-strong: #b45309;
77
+ --color-toast-success-bg: #059669;
78
+ --color-toast-success-border: #047857;
79
+ --color-toast-success-glow: rgb(5 150 105 / 28%);
80
+ --color-toast-success-title: #ffffff;
81
+ --color-toast-success-body: #d1fae5;
82
+ --color-toast-success-icon: #ecfdf5;
83
+ --color-toast-error-bg: #dc2626;
84
+ --color-toast-error-border: #b91c1c;
85
+ --color-toast-error-glow: rgb(220 38 38 / 28%);
86
+ --color-toast-error-title: #ffffff;
87
+ --color-toast-error-body: #fee2e2;
88
+ --color-toast-error-icon: #fef2f2;
89
+ --color-toast-warning-bg: #d97706;
90
+ --color-toast-warning-border: #b45309;
91
+ --color-toast-warning-glow: rgb(217 119 6 / 28%);
92
+ --color-toast-warning-title: #ffffff;
93
+ --color-toast-warning-body: #fef3c7;
94
+ --color-toast-warning-icon: #fffbeb;
95
+ --color-toast-info-bg: #2563eb;
96
+ --color-toast-info-border: #1d4ed8;
97
+ --color-toast-info-glow: rgb(37 99 235 / 28%);
98
+ --color-toast-info-title: #ffffff;
99
+ --color-toast-info-body: #dbeafe;
100
+ --color-toast-info-icon: #eff6ff;
101
+ --color-shamar-shell: color-mix(in srgb, var(--color-primary-50) 35%, #ffffff);
102
+ --color-card-border: var(--color-gray-200);
103
+ --color-surface-hover: var(--color-neutral-tertiary);
104
+ --color-surface-header: color-mix(in srgb, var(--color-neutral-tertiary) 50%, transparent);
105
+ --color-surface-inset: color-mix(in srgb, var(--color-neutral-tertiary) 45%, transparent);
106
+ --color-surface-row-hover: color-mix(in srgb, var(--color-neutral-tertiary) 30%, transparent);
107
+ --color-badge-neutral: var(--color-neutral-tertiary);
108
+ }
109
+
110
+ .dark {
111
+ /* Calm dark: lighter shell, darker elevated cards */
112
+ --color-body: var(--color-gray-300);
113
+ --color-body-subtle: var(--color-gray-400);
114
+ --color-heading: #f3f4f6;
115
+ --color-neutral-primary: var(--color-gray-900);
116
+ --color-neutral-secondary: var(--color-gray-800);
117
+ --color-neutral-tertiary: #151c28;
118
+ --color-default: var(--color-gray-700);
119
+ --color-fg-brand: var(--color-primary-500);
120
+ --color-fg-brand-strong: var(--color-primary-400);
121
+ --color-brand-soft: var(--color-primary-900);
122
+ --color-brand-softer: var(--color-primary-950);
123
+ --color-shamar-shell: var(--color-gray-800);
124
+ --color-card-border: color-mix(in srgb, var(--color-gray-600) 55%, transparent);
125
+ --color-fg-danger: #f87171;
126
+ --color-danger-soft: #450a0a;
127
+ --color-success-soft: #064e3b;
128
+ --color-success-strong: #6ee7b7;
129
+ --color-warning-soft: #451a03;
130
+ --color-warning-strong: #fcd34d;
131
+ --color-toast-success-bg: #065f46;
132
+ --color-toast-success-border: #047857;
133
+ --color-toast-success-glow: rgb(16 185 129 / 22%);
134
+ --color-toast-success-title: #ecfdf5;
135
+ --color-toast-success-body: #a7f3d0;
136
+ --color-toast-success-icon: #d1fae5;
137
+ --color-toast-error-bg: #991b1b;
138
+ --color-toast-error-border: #b91c1c;
139
+ --color-toast-error-glow: rgb(248 113 113 / 20%);
140
+ --color-toast-error-title: #fef2f2;
141
+ --color-toast-error-body: #fecaca;
142
+ --color-toast-error-icon: #fee2e2;
143
+ --color-toast-warning-bg: #92400e;
144
+ --color-toast-warning-border: #b45309;
145
+ --color-toast-warning-glow: rgb(251 191 36 / 18%);
146
+ --color-toast-warning-title: #fffbeb;
147
+ --color-toast-warning-body: #fde68a;
148
+ --color-toast-warning-icon: #fef3c7;
149
+ --color-toast-info-bg: #1e40af;
150
+ --color-toast-info-border: #1d4ed8;
151
+ --color-toast-info-glow: rgb(96 165 250 / 18%);
152
+ --color-toast-info-title: #eff6ff;
153
+ --color-toast-info-body: #bfdbfe;
154
+ --color-toast-info-icon: #dbeafe;
155
+ --color-surface-hover: color-mix(in srgb, var(--color-gray-700) 50%, var(--color-gray-900));
156
+ --color-surface-header: color-mix(in srgb, var(--color-gray-800) 65%, var(--color-gray-900));
157
+ --color-surface-inset: color-mix(in srgb, var(--color-gray-800) 55%, var(--color-gray-900));
158
+ --color-surface-row-hover: color-mix(in srgb, var(--color-gray-700) 35%, var(--color-gray-900));
159
+ --color-badge-neutral: color-mix(in srgb, var(--color-gray-700) 45%, var(--color-gray-900));
160
+ }
161
+
162
+ :where(.dark, .dark *) {
163
+ color-scheme: dark;
164
+ }
165
+
166
+ /* All native controls follow brand + light/dark tokens (including future inputs). */
167
+ :where(html) {
168
+ accent-color: var(--color-fg-brand);
169
+ }
170
+
171
+ :where(.dark, .dark *) {
172
+ accent-color: var(--color-fg-brand);
173
+ }
174
+
175
+ input[type='checkbox'],
176
+ input[type='radio'],
177
+ input[type='range'],
178
+ input[type='color'],
179
+ progress,
180
+ meter {
181
+ accent-color: var(--color-fg-brand);
182
+ }
183
+
184
+ input[type='checkbox'],
185
+ input[type='radio'] {
186
+ width: 1rem;
187
+ height: 1rem;
188
+ flex-shrink: 0;
189
+ margin: 0;
190
+ color: var(--color-fg-brand);
191
+ accent-color: var(--color-fg-brand);
192
+ cursor: pointer;
193
+ vertical-align: middle;
194
+ }
195
+
196
+ /* Soft-rounded themed checkbox (native radius is unreliable). */
197
+ input[type='checkbox'] {
198
+ -webkit-appearance: none;
199
+ appearance: none;
200
+ border: 1.5px solid var(--color-default);
201
+ border-radius: 0.3rem;
202
+ background-color: var(--color-neutral-primary);
203
+ background-position: center;
204
+ background-repeat: no-repeat;
205
+ background-size: 0.7rem;
206
+ transition: background-color 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease;
207
+ }
208
+
209
+ input[type='checkbox']:hover:not(:disabled) {
210
+ border-color: color-mix(in srgb, var(--color-fg-brand) 55%, var(--color-default));
211
+ }
212
+
213
+ input[type='checkbox']:checked {
214
+ background-color: var(--color-fg-brand);
215
+ border-color: var(--color-fg-brand);
216
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E");
217
+ }
218
+
219
+ input[type='checkbox']:indeterminate {
220
+ background-color: var(--color-fg-brand);
221
+ border-color: var(--color-fg-brand);
222
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M3.5 8h9'/%3E%3C/svg%3E");
223
+ }
224
+
225
+ input[type='radio'] {
226
+ border-radius: 9999px;
227
+ }
228
+
229
+ input[type='checkbox']:focus-visible,
230
+ input[type='radio']:focus-visible {
231
+ outline: none;
232
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-fg-brand) 28%, transparent);
233
+ }
234
+
235
+ input[type='checkbox']:disabled,
236
+ input[type='radio']:disabled {
237
+ opacity: 0.55;
238
+ cursor: not-allowed;
239
+ }
240
+
241
+ [x-cloak] { display: none !important; }
242
+
243
+ a[href],
244
+ button:not(:disabled),
245
+ [role='button']:not([aria-disabled='true']),
246
+ [role='tab'],
247
+ label[for],
248
+ label:has(input, select, textarea),
249
+ summary,
250
+ select,
251
+ input[type='checkbox'],
252
+ input[type='radio'],
253
+ .shamar-interactive {
254
+ cursor: pointer;
255
+ }
256
+
257
+ button:disabled,
258
+ [aria-disabled='true'] {
259
+ cursor: not-allowed;
260
+ }
261
+
262
+ .nav-item {
263
+ color: var(--color-body);
264
+ }
265
+ @media (hover: hover) {
266
+ .nav-item:hover {
267
+ background-color: var(--color-primary-100);
268
+ color: var(--color-fg-brand);
269
+ }
270
+ }
271
+ .nav-item.nav-active {
272
+ background-color: var(--color-primary-200);
273
+ color: var(--color-fg-brand-strong);
274
+ font-weight: 600;
275
+ }
276
+
277
+ :where(.dark, .dark *) .nav-item:hover {
278
+ background-color: var(--color-surface-hover);
279
+ color: var(--color-heading);
280
+ }
281
+
282
+ :where(.dark, .dark *) .nav-item.nav-active {
283
+ background-color: var(--color-surface-inset);
284
+ color: var(--color-fg-brand);
285
+ font-weight: 600;
286
+ }
287
+
288
+ @utility shamar-card {
289
+ border-radius: 0.75rem;
290
+ border: 1px solid var(--color-card-border);
291
+ background-color: var(--color-neutral-primary);
292
+ }
293
+
294
+ fieldset.shamar-card {
295
+ border: 1px solid var(--color-card-border);
296
+ margin: 0;
297
+ min-width: 0;
298
+ background-color: var(--color-neutral-primary);
299
+ }
300
+
301
+ :where(.dark, .dark *) .shamar-card,
302
+ :where(.dark, .dark *) fieldset.shamar-card {
303
+ background-color: var(--color-neutral-primary);
304
+ }
305
+
306
+ /* Form Section — card with header / optional description + icon */
307
+ .shamar-form-section__header {
308
+ display: flex;
309
+ align-items: flex-start;
310
+ gap: 0.75rem;
311
+ padding: 1rem 1.25rem;
312
+ border-bottom: 1px solid var(--color-card-border);
313
+ background-color: var(--color-surface-header, var(--color-neutral-secondary));
314
+ }
315
+
316
+ .shamar-form-section__header--centered {
317
+ align-items: center;
318
+ }
319
+
320
+ .shamar-form-section__icon {
321
+ display: inline-flex;
322
+ flex-shrink: 0;
323
+ align-items: center;
324
+ justify-content: center;
325
+ width: 2rem;
326
+ height: 2rem;
327
+ border-radius: 0.5rem;
328
+ color: var(--color-fg-brand);
329
+ background-color: var(--color-brand-soft);
330
+ }
331
+
332
+ .shamar-form-section__titles {
333
+ display: flex;
334
+ flex-direction: column;
335
+ justify-content: center;
336
+ min-width: 0;
337
+ }
338
+
339
+ .shamar-form-section__title {
340
+ margin: 0;
341
+ font-size: 0.875rem;
342
+ font-weight: 600;
343
+ color: var(--color-heading);
344
+ line-height: 1.35;
345
+ }
346
+
347
+ .shamar-form-section__description {
348
+ margin: 0.25rem 0 0;
349
+ font-size: 0.8125rem;
350
+ color: var(--color-body-subtle, var(--color-shamar-muted));
351
+ line-height: 1.4;
352
+ }
353
+
354
+ .shamar-form-section__body {
355
+ padding: 1.25rem 1.25rem 1.75rem;
356
+ }
357
+
358
+ .shamar-wizard__panel {
359
+ padding-bottom: 0.5rem;
360
+ }
361
+
362
+ .shamar-radio {
363
+ padding-bottom: 0.15rem;
364
+ }
365
+
366
+ /* Form Fieldset — legend grouping (lighter than Section card) */
367
+ .shamar-form-fieldset {
368
+ margin: 0;
369
+ min-width: 0;
370
+ padding: 0.75rem 1rem 1rem;
371
+ border: 1px solid var(--color-card-border);
372
+ border-radius: 0.75rem;
373
+ background-color: transparent;
374
+ }
375
+
376
+ .shamar-form-fieldset--card {
377
+ background-color: var(--color-neutral-primary);
378
+ }
379
+
380
+ .shamar-form-section--plain {
381
+ border: 1px solid var(--color-card-border);
382
+ background-color: transparent;
383
+ }
384
+
385
+ .shamar-form-fieldset__legend {
386
+ padding: 0 0.35rem;
387
+ font-size: 0.8125rem;
388
+ font-weight: 600;
389
+ color: var(--color-heading);
390
+ }
391
+
392
+ .shamar-form-fieldset__description {
393
+ margin: 0 0 0.75rem;
394
+ font-size: 0.8125rem;
395
+ color: var(--color-body-subtle, var(--color-shamar-muted));
396
+ }
397
+
398
+ :where(.dark, .dark *) .shamar-form-fieldset {
399
+ border-color: var(--color-card-border);
400
+ }
401
+
402
+ .shamar-dialog-backdrop {
403
+ position: fixed;
404
+ inset: 0;
405
+ z-index: 50;
406
+ background-color: color-mix(in srgb, #000 40%, transparent);
407
+ }
408
+
409
+ .shamar-dialog-panel {
410
+ position: fixed;
411
+ top: 50%;
412
+ left: 50%;
413
+ z-index: 51;
414
+ display: flex;
415
+ flex-direction: column;
416
+ max-width: calc(100vw - 1.5rem);
417
+ max-height: calc(100vh - 1.5rem);
418
+ border: 1px solid var(--color-card-border);
419
+ border-radius: 0.75rem;
420
+ background-color: var(--color-neutral-primary);
421
+ overflow: hidden;
422
+ }
423
+
424
+ .shamar-dialog-panel.is-fullscreen {
425
+ inset: 0.75rem !important;
426
+ top: 0.75rem !important;
427
+ left: 0.75rem !important;
428
+ width: auto !important;
429
+ height: auto !important;
430
+ max-width: none;
431
+ max-height: none;
432
+ transform: none !important;
433
+ }
434
+
435
+ .shamar-dialog-panel.is-prompt {
436
+ width: min(28rem, calc(100vw - 1.5rem)) !important;
437
+ height: auto !important;
438
+ max-height: calc(100vh - 1.5rem);
439
+ }
440
+
441
+ .shamar-dialog-header {
442
+ display: flex;
443
+ align-items: center;
444
+ gap: 0.5rem;
445
+ border-bottom: 1px solid var(--color-card-border);
446
+ padding: 0.625rem 0.875rem;
447
+ cursor: move;
448
+ user-select: none;
449
+ }
450
+
451
+ .shamar-dialog-body {
452
+ flex: 1;
453
+ min-height: 0;
454
+ overflow: auto;
455
+ padding: 1rem;
456
+ }
457
+
458
+ .shamar-embed-section + .shamar-embed-section {
459
+ margin-top: 1.25rem;
460
+ padding-top: 1.25rem;
461
+ border-top: 1px solid var(--color-card-border);
462
+ }
463
+
464
+ .shamar-embed-section__header {
465
+ margin-bottom: 1rem;
466
+ }
467
+
468
+ .shamar-embed-section .shamar-field--readonly .shamar-field__value {
469
+ padding: 0;
470
+ border: 0;
471
+ background: transparent;
472
+ }
473
+
474
+ .shamar-dialog-footer {
475
+ display: flex;
476
+ flex-shrink: 0;
477
+ align-items: center;
478
+ justify-content: flex-end;
479
+ gap: 0.5rem;
480
+ border-top: 1px solid var(--color-card-border);
481
+ padding: 0.75rem 0.875rem;
482
+ background-color: var(--color-neutral-primary);
483
+ }
484
+
485
+ .shamar-dialog-body--prompt {
486
+ padding-top: 1.25rem;
487
+ padding-bottom: 1.25rem;
488
+ }
489
+
490
+ .shamar-dialog-prompt-icon {
491
+ display: flex;
492
+ height: 2.25rem;
493
+ width: 2.25rem;
494
+ flex-shrink: 0;
495
+ align-items: center;
496
+ justify-content: center;
497
+ border-radius: 9999px;
498
+ }
499
+
500
+ .shamar-dialog-prompt-icon.is-danger {
501
+ background-color: var(--color-danger-soft);
502
+ color: var(--color-fg-danger);
503
+ }
504
+
505
+ .shamar-dialog-prompt-icon.is-warning {
506
+ background-color: var(--color-warning-soft);
507
+ color: var(--color-warning-strong);
508
+ }
509
+
510
+ .shamar-dialog-prompt-icon.is-info {
511
+ background-color: var(--color-brand-soft);
512
+ color: var(--color-fg-brand);
513
+ }
514
+
515
+ .shamar-dialog-prompt-icon.is-success {
516
+ background-color: var(--color-success-soft);
517
+ color: var(--color-success-strong);
518
+ }
519
+
520
+ .shamar-bulk-bar {
521
+ display: flex;
522
+ flex-wrap: wrap;
523
+ align-items: center;
524
+ gap: 0.75rem 1rem;
525
+ border-top: 1px solid var(--color-card-border);
526
+ background-color: var(--color-surface-header, var(--color-neutral-primary));
527
+ padding: 0.625rem 1rem;
528
+ }
529
+
530
+ .shamar-bulk-bar__meta {
531
+ display: flex;
532
+ flex-wrap: wrap;
533
+ align-items: center;
534
+ gap: 0.5rem 0.75rem;
535
+ min-width: 0;
536
+ }
537
+
538
+ .shamar-bulk-bar__count {
539
+ font-size: 0.875rem;
540
+ color: var(--color-body);
541
+ font-weight: 500;
542
+ }
543
+
544
+ .shamar-bulk-bar__link {
545
+ border: 0;
546
+ background: transparent;
547
+ padding: 0;
548
+ font-size: 0.75rem;
549
+ color: var(--color-body-subtle);
550
+ text-decoration: underline;
551
+ cursor: pointer;
552
+ }
553
+
554
+ .shamar-bulk-bar__link:hover {
555
+ color: var(--color-fg-brand);
556
+ }
557
+
558
+ .shamar-bulk-menu {
559
+ position: relative;
560
+ }
561
+
562
+ .shamar-bulk-menu__trigger {
563
+ display: inline-flex;
564
+ align-items: center;
565
+ gap: 0.375rem;
566
+ border: 1px solid var(--color-card-border);
567
+ border-radius: 0.375rem;
568
+ background-color: var(--color-neutral-primary);
569
+ padding: 0.375rem 0.75rem;
570
+ font-size: 0.875rem;
571
+ font-weight: 500;
572
+ color: var(--color-body);
573
+ cursor: pointer;
574
+ }
575
+
576
+ .shamar-bulk-menu__trigger:hover {
577
+ background-color: var(--color-surface-hover);
578
+ }
579
+
580
+ .shamar-bulk-menu__trigger[aria-expanded="true"] {
581
+ border-color: var(--color-fg-brand);
582
+ color: var(--color-heading);
583
+ }
584
+
585
+ .shamar-bulk-menu__chevron {
586
+ width: 0.875rem;
587
+ height: 0.875rem;
588
+ transition: transform 120ms ease;
589
+ }
590
+
591
+ .shamar-bulk-menu__chevron.is-open {
592
+ transform: rotate(180deg);
593
+ }
594
+
595
+ .shamar-bulk-menu__panel {
596
+ position: absolute;
597
+ left: 0;
598
+ top: calc(100% + 0.25rem);
599
+ z-index: 30;
600
+ min-width: 12rem;
601
+ padding: 0.25rem;
602
+ border: 1px solid var(--color-card-border);
603
+ border-radius: 0.5rem;
604
+ background-color: var(--color-neutral-primary);
605
+ box-shadow: 0 10px 24px color-mix(in srgb, #000 12%, transparent);
606
+ }
607
+
608
+ .shamar-bulk-menu__item {
609
+ display: block;
610
+ width: 100%;
611
+ border: 0;
612
+ border-radius: 0.375rem;
613
+ background: transparent;
614
+ padding: 0.5rem 0.75rem;
615
+ text-align: left;
616
+ font-size: 0.875rem;
617
+ color: var(--color-body);
618
+ cursor: pointer;
619
+ }
620
+
621
+ .shamar-bulk-menu__item:hover {
622
+ background-color: var(--color-surface-hover);
623
+ color: var(--color-heading);
624
+ }
625
+
626
+ .shamar-bulk-menu__item.is-danger {
627
+ color: var(--color-fg-danger);
628
+ }
629
+
630
+ .shamar-bulk-menu__item.is-danger:hover {
631
+ background-color: var(--color-danger-soft);
632
+ color: var(--color-fg-danger);
633
+ }
634
+
635
+ .shamar-chip {
636
+ display: inline-flex;
637
+ align-items: center;
638
+ gap: 0.25rem;
639
+ max-width: 100%;
640
+ padding: 0.125rem 0.25rem 0.125rem 0.5rem;
641
+ border-radius: 0.375rem;
642
+ background-color: var(--color-brand-soft);
643
+ color: var(--color-fg-brand);
644
+ font-size: 0.75rem;
645
+ font-weight: 500;
646
+ }
647
+
648
+ .shamar-chip--group {
649
+ background-color: var(--color-badge-neutral, var(--color-surface-hover));
650
+ color: var(--color-heading);
651
+ }
652
+
653
+ .shamar-chip__remove {
654
+ display: inline-flex;
655
+ align-items: center;
656
+ justify-content: center;
657
+ border: 0;
658
+ border-radius: 0.25rem;
659
+ padding: 0.125rem;
660
+ background: transparent;
661
+ color: inherit;
662
+ cursor: pointer;
663
+ }
664
+
665
+ .shamar-chip__remove:hover {
666
+ background-color: color-mix(in srgb, currentColor 16%, transparent);
667
+ }
668
+
669
+ .shamar-toolbar-menu {
670
+ position: relative;
671
+ }
672
+
673
+ .shamar-toolbar-btn {
674
+ display: inline-flex;
675
+ align-items: center;
676
+ gap: 0.375rem;
677
+ border: 1px solid var(--color-card-border);
678
+ border-radius: 0.375rem;
679
+ background-color: var(--color-neutral-primary);
680
+ padding: 0.375rem 0.75rem;
681
+ font-size: 0.875rem;
682
+ font-weight: 500;
683
+ color: var(--color-body);
684
+ cursor: pointer;
685
+ }
686
+
687
+ .shamar-toolbar-btn:hover {
688
+ background-color: var(--color-surface-hover);
689
+ }
690
+
691
+ .shamar-toolbar-btn.is-active {
692
+ border-color: var(--color-fg-brand);
693
+ color: var(--color-heading);
694
+ }
695
+
696
+ .shamar-toolbar-btn__badge {
697
+ display: inline-flex;
698
+ min-width: 1.25rem;
699
+ height: 1.25rem;
700
+ align-items: center;
701
+ justify-content: center;
702
+ border-radius: 9999px;
703
+ background-color: var(--color-fg-brand);
704
+ color: #fff;
705
+ font-size: 0.6875rem;
706
+ font-weight: 700;
707
+ padding: 0 0.35rem;
708
+ }
709
+
710
+ .shamar-toolbar-panel {
711
+ position: absolute;
712
+ right: 0;
713
+ top: calc(100% + 0.35rem);
714
+ z-index: 40;
715
+ width: min(18rem, calc(100vw - 2rem));
716
+ border: 1px solid var(--color-card-border);
717
+ border-radius: 0.625rem;
718
+ background-color: var(--color-neutral-primary);
719
+ box-shadow: 0 12px 28px color-mix(in srgb, #000 14%, transparent);
720
+ overflow: hidden;
721
+ }
722
+
723
+ .shamar-toolbar-panel__head {
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: space-between;
727
+ gap: 0.75rem;
728
+ padding: 0.75rem 0.875rem 0.5rem;
729
+ }
730
+
731
+ .shamar-toolbar-panel__list {
732
+ padding: 0.25rem;
733
+ max-height: 18rem;
734
+ overflow: auto;
735
+ }
736
+
737
+ .shamar-toolbar-panel__item {
738
+ display: flex;
739
+ width: 100%;
740
+ align-items: center;
741
+ justify-content: space-between;
742
+ gap: 0.75rem;
743
+ border: 0;
744
+ border-radius: 0.375rem;
745
+ background: transparent;
746
+ padding: 0.55rem 0.75rem;
747
+ text-align: left;
748
+ font-size: 0.875rem;
749
+ color: var(--color-body);
750
+ cursor: pointer;
751
+ }
752
+
753
+ .shamar-toolbar-panel__item:hover,
754
+ .shamar-toolbar-panel__item.is-selected {
755
+ background-color: var(--color-surface-hover);
756
+ color: var(--color-heading);
757
+ }
758
+
759
+ .shamar-toolbar-panel__back {
760
+ display: inline-flex;
761
+ align-items: center;
762
+ gap: 0.35rem;
763
+ width: 100%;
764
+ border: 0;
765
+ border-bottom: 1px solid var(--color-card-border);
766
+ background: transparent;
767
+ padding: 0.65rem 0.875rem;
768
+ font-size: 0.8125rem;
769
+ font-weight: 600;
770
+ color: var(--color-heading);
771
+ cursor: pointer;
772
+ }
773
+
774
+ .shamar-toolbar-panel__back:hover {
775
+ background-color: var(--color-surface-hover);
776
+ }
777
+
778
+ .shamar-list-group__cell {
779
+ padding: 0.5rem 1rem;
780
+ background: color-mix(in srgb, var(--color-surface-header, #f5f5f5) 88%, transparent);
781
+ border-top: 1px solid var(--color-card-border);
782
+ }
783
+
784
+ .shamar-list-group__label {
785
+ font-size: 0.75rem;
786
+ font-weight: 700;
787
+ letter-spacing: 0.02em;
788
+ text-transform: uppercase;
789
+ color: var(--color-heading);
790
+ }
791
+
792
+ .shamar-list-group__count {
793
+ margin-left: 0.5rem;
794
+ font-size: 0.75rem;
795
+ color: var(--color-body-subtle);
796
+ }
797
+
798
+ .shamar-list-group__count::before {
799
+ content: '· ';
800
+ }
801
+
802
+ .shamar-secret-reveal {
803
+ display: flex;
804
+ align-items: stretch;
805
+ gap: 0.5rem;
806
+ margin-top: 0.25rem;
807
+ border: 1px solid var(--color-card-border);
808
+ border-radius: 0.5rem;
809
+ background-color: var(--color-neutral-secondary, var(--color-neutral-primary));
810
+ overflow: hidden;
811
+ }
812
+
813
+ .shamar-secret-reveal__value {
814
+ flex: 1;
815
+ min-width: 0;
816
+ padding: 0.75rem 0.875rem;
817
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
818
+ font-size: 0.75rem;
819
+ line-height: 1.4;
820
+ word-break: break-all;
821
+ color: var(--color-heading);
822
+ }
823
+
824
+ .shamar-secret-reveal__copy {
825
+ flex-shrink: 0;
826
+ align-self: stretch;
827
+ padding: 0 0.875rem;
828
+ border: none;
829
+ border-left: 1px solid var(--color-card-border);
830
+ background: transparent;
831
+ font-size: 0.8125rem;
832
+ font-weight: 600;
833
+ color: var(--color-fg-brand);
834
+ cursor: pointer;
835
+ }
836
+
837
+ .shamar-secret-reveal__copy:hover {
838
+ background-color: var(--color-surface-hover);
839
+ }
840
+
841
+ .shamar-dialog-resize-handle {
842
+ position: absolute;
843
+ right: 0;
844
+ bottom: 0;
845
+ width: 1rem;
846
+ height: 1rem;
847
+ cursor: nwse-resize;
848
+ }
849
+
850
+ #shamar-toast-stack {
851
+ position: fixed;
852
+ top: 1rem;
853
+ right: 1rem;
854
+ z-index: 60;
855
+ display: flex;
856
+ flex-direction: column;
857
+ gap: 0.75rem;
858
+ width: min(26rem, calc(100vw - 2rem));
859
+ pointer-events: none;
860
+ }
861
+
862
+ .shamar-toast {
863
+ pointer-events: auto;
864
+ display: flex;
865
+ align-items: flex-start;
866
+ gap: 0.875rem;
867
+ padding: 0.95rem 1rem;
868
+ border-radius: 0.9rem;
869
+ border: 1px solid transparent;
870
+ box-shadow:
871
+ 0 18px 40px -16px var(--shamar-toast-glow, rgb(15 23 42 / 18%)),
872
+ 0 8px 16px -12px rgb(15 23 42 / 16%);
873
+ opacity: 0;
874
+ transform: translateX(0.75rem) scale(0.98);
875
+ transition:
876
+ opacity 0.2s ease,
877
+ transform 0.2s ease;
878
+ }
879
+
880
+ .shamar-toast.is-visible {
881
+ opacity: 1;
882
+ transform: translateX(0) scale(1);
883
+ }
884
+
885
+ .shamar-toast--success {
886
+ background: var(--color-toast-success-bg);
887
+ border-color: var(--color-toast-success-border);
888
+ --shamar-toast-glow: var(--color-toast-success-glow);
889
+ }
890
+
891
+ .shamar-toast--error {
892
+ background: var(--color-toast-error-bg);
893
+ border-color: var(--color-toast-error-border);
894
+ --shamar-toast-glow: var(--color-toast-error-glow);
895
+ }
896
+
897
+ .shamar-toast--warning {
898
+ background: var(--color-toast-warning-bg);
899
+ border-color: var(--color-toast-warning-border);
900
+ --shamar-toast-glow: var(--color-toast-warning-glow);
901
+ }
902
+
903
+ .shamar-toast--info {
904
+ background: var(--color-toast-info-bg);
905
+ border-color: var(--color-toast-info-border);
906
+ --shamar-toast-glow: var(--color-toast-info-glow);
907
+ }
908
+
909
+ .shamar-toast__icon {
910
+ display: flex;
911
+ align-items: center;
912
+ justify-content: center;
913
+ flex-shrink: 0;
914
+ width: 2.25rem;
915
+ height: 2.25rem;
916
+ border-radius: 9999px;
917
+ background: rgb(255 255 255 / 16%);
918
+ color: var(--shamar-toast-icon, #ffffff);
919
+ }
920
+
921
+ .shamar-toast--success .shamar-toast__icon {
922
+ --shamar-toast-icon: var(--color-toast-success-icon);
923
+ }
924
+
925
+ .shamar-toast--error .shamar-toast__icon {
926
+ --shamar-toast-icon: var(--color-toast-error-icon);
927
+ }
928
+
929
+ .shamar-toast--warning .shamar-toast__icon {
930
+ --shamar-toast-icon: var(--color-toast-warning-icon);
931
+ }
932
+
933
+ .shamar-toast--info .shamar-toast__icon {
934
+ --shamar-toast-icon: var(--color-toast-info-icon);
935
+ }
936
+
937
+ .shamar-toast__icon svg {
938
+ width: 1.15rem;
939
+ height: 1.15rem;
940
+ }
941
+
942
+ .shamar-toast__content {
943
+ flex: 1;
944
+ min-width: 0;
945
+ padding-top: 0.1rem;
946
+ }
947
+
948
+ .shamar-toast__title {
949
+ margin: 0;
950
+ font-size: 0.95rem;
951
+ line-height: 1.35;
952
+ font-weight: 700;
953
+ letter-spacing: -0.01em;
954
+ color: var(--shamar-toast-title, #ffffff);
955
+ }
956
+
957
+ .shamar-toast--success .shamar-toast__title {
958
+ --shamar-toast-title: var(--color-toast-success-title);
959
+ }
960
+
961
+ .shamar-toast--error .shamar-toast__title {
962
+ --shamar-toast-title: var(--color-toast-error-title);
963
+ }
964
+
965
+ .shamar-toast--warning .shamar-toast__title {
966
+ --shamar-toast-title: var(--color-toast-warning-title);
967
+ }
968
+
969
+ .shamar-toast--info .shamar-toast__title {
970
+ --shamar-toast-title: var(--color-toast-info-title);
971
+ }
972
+
973
+ .shamar-toast__body {
974
+ margin: 0.2rem 0 0;
975
+ font-size: 0.875rem;
976
+ line-height: 1.5;
977
+ color: var(--shamar-toast-body, rgb(255 255 255 / 88%));
978
+ }
979
+
980
+ .shamar-toast--success .shamar-toast__body {
981
+ --shamar-toast-body: var(--color-toast-success-body);
982
+ }
983
+
984
+ .shamar-toast--error .shamar-toast__body {
985
+ --shamar-toast-body: var(--color-toast-error-body);
986
+ }
987
+
988
+ .shamar-toast--warning .shamar-toast__body {
989
+ --shamar-toast-body: var(--color-toast-warning-body);
990
+ }
991
+
992
+ .shamar-toast--info .shamar-toast__body {
993
+ --shamar-toast-body: var(--color-toast-info-body);
994
+ }
995
+
996
+ .shamar-toast__dismiss {
997
+ flex-shrink: 0;
998
+ display: inline-flex;
999
+ align-items: center;
1000
+ justify-content: center;
1001
+ width: 1.75rem;
1002
+ height: 1.75rem;
1003
+ margin: -0.15rem -0.15rem 0 0;
1004
+ border: 0;
1005
+ border-radius: 0.5rem;
1006
+ background: transparent;
1007
+ color: var(--shamar-toast-body, rgb(255 255 255 / 88%));
1008
+ font-size: 1.15rem;
1009
+ line-height: 1;
1010
+ cursor: pointer;
1011
+ transition: background-color 0.15s ease, color 0.15s ease;
1012
+ }
1013
+
1014
+ .shamar-toast__dismiss:hover {
1015
+ background: rgb(255 255 255 / 12%);
1016
+ color: var(--shamar-toast-title, #ffffff);
1017
+ }
1018
+
1019
+ .shamar-kanban-grid {
1020
+ display: grid;
1021
+ gap: 1rem;
1022
+ grid-template-columns: repeat(1, minmax(0, 1fr));
1023
+ }
1024
+
1025
+ @media (min-width: 640px) {
1026
+ .shamar-kanban-grid {
1027
+ grid-template-columns: repeat(
1028
+ min(2, var(--shamar-kanban-cols, 4)),
1029
+ minmax(0, 1fr)
1030
+ );
1031
+ }
1032
+ }
1033
+
1034
+ @media (min-width: 768px) {
1035
+ .shamar-kanban-grid {
1036
+ grid-template-columns: repeat(
1037
+ min(3, var(--shamar-kanban-cols, 4)),
1038
+ minmax(0, 1fr)
1039
+ );
1040
+ }
1041
+ }
1042
+
1043
+ @media (min-width: 1024px) {
1044
+ .shamar-kanban-grid {
1045
+ grid-template-columns: repeat(var(--shamar-kanban-cols, 4), minmax(0, 1fr));
1046
+ }
1047
+ }
1048
+
1049
+ /** Grouped board: horizontal stage columns, cards stacked inside each. */
1050
+ .shamar-kanban-board {
1051
+ display: flex;
1052
+ gap: 1rem;
1053
+ align-items: stretch;
1054
+ overflow-x: auto;
1055
+ padding-bottom: 0.25rem;
1056
+ }
1057
+
1058
+ .shamar-kanban-column {
1059
+ display: flex;
1060
+ flex-direction: column;
1061
+ flex: 0 0 min(18rem, 85vw);
1062
+ min-height: 16rem;
1063
+ max-height: min(70vh, 42rem);
1064
+ border-radius: 0.75rem;
1065
+ border: 1px solid var(--color-border-default, rgb(0 0 0 / 10%));
1066
+ background: var(--color-surface-header, rgb(0 0 0 / 3%));
1067
+ }
1068
+
1069
+ .shamar-kanban-column__header {
1070
+ display: flex;
1071
+ align-items: center;
1072
+ justify-content: space-between;
1073
+ gap: 0.5rem;
1074
+ padding: 0.75rem 0.875rem;
1075
+ border-bottom: 1px solid var(--color-border-default, rgb(0 0 0 / 8%));
1076
+ }
1077
+
1078
+ .shamar-kanban-column__title {
1079
+ margin: 0;
1080
+ font-size: 0.8125rem;
1081
+ font-weight: 600;
1082
+ color: var(--color-text-heading, inherit);
1083
+ text-transform: capitalize;
1084
+ }
1085
+
1086
+ .shamar-kanban-column__count {
1087
+ font-size: 0.75rem;
1088
+ color: var(--color-text-body-subtle, rgb(0 0 0 / 45%));
1089
+ font-variant-numeric: tabular-nums;
1090
+ }
1091
+
1092
+ .shamar-kanban-column__body {
1093
+ display: flex;
1094
+ flex-direction: column;
1095
+ gap: 0.75rem;
1096
+ padding: 0.75rem;
1097
+ overflow-y: auto;
1098
+ flex: 1 1 auto;
1099
+ }
1100
+
1101
+ .shamar-kanban-column__empty {
1102
+ margin: 0;
1103
+ padding: 1.5rem 0.5rem;
1104
+ text-align: center;
1105
+ font-size: 0.8125rem;
1106
+ color: var(--color-text-body-subtle, rgb(0 0 0 / 45%));
1107
+ }
1108
+
1109
+ @utility shamar-focus-ring {
1110
+ border-color: var(--color-fg-brand);
1111
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-fg-brand) 28%, transparent);
1112
+ outline: none;
1113
+ }
1114
+
1115
+ /** Themed checkbox input — do not put this class on the field label wrapper. */
1116
+ @utility shamar-checkbox-input {
1117
+ width: 1rem;
1118
+ height: 1rem;
1119
+ flex-shrink: 0;
1120
+ margin: 0;
1121
+ -webkit-appearance: none;
1122
+ appearance: none;
1123
+ border: 1.5px solid var(--color-default);
1124
+ border-radius: 0.3rem;
1125
+ background-color: var(--color-neutral-primary);
1126
+ background-position: center;
1127
+ background-repeat: no-repeat;
1128
+ background-size: 0.7rem;
1129
+ accent-color: var(--color-fg-brand);
1130
+ color: var(--color-fg-brand);
1131
+ cursor: pointer;
1132
+ vertical-align: middle;
1133
+ transition: background-color 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease;
1134
+
1135
+ &:hover:not(:disabled) {
1136
+ border-color: color-mix(in srgb, var(--color-fg-brand) 55%, var(--color-default));
1137
+ }
1138
+
1139
+ &:checked {
1140
+ background-color: var(--color-fg-brand);
1141
+ border-color: var(--color-fg-brand);
1142
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E");
1143
+ }
1144
+
1145
+ &:indeterminate {
1146
+ background-color: var(--color-fg-brand);
1147
+ border-color: var(--color-fg-brand);
1148
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M3.5 8h9'/%3E%3C/svg%3E");
1149
+ }
1150
+
1151
+ &:focus-visible {
1152
+ outline: none;
1153
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-fg-brand) 28%, transparent);
1154
+ }
1155
+
1156
+ &:disabled {
1157
+ opacity: 0.55;
1158
+ cursor: not-allowed;
1159
+ }
1160
+ }
1161
+
1162
+ /** Themed radio — same tokens as checkbox for future multi-choice fields. */
1163
+ @utility shamar-radio {
1164
+ width: 1rem;
1165
+ height: 1rem;
1166
+ flex-shrink: 0;
1167
+ margin: 0;
1168
+ accent-color: var(--color-fg-brand);
1169
+ color: var(--color-fg-brand);
1170
+ cursor: pointer;
1171
+ vertical-align: middle;
1172
+
1173
+ &:focus-visible {
1174
+ outline: none;
1175
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-fg-brand) 28%, transparent);
1176
+ border-radius: 9999px;
1177
+ }
1178
+
1179
+ &:disabled {
1180
+ opacity: 0.55;
1181
+ cursor: not-allowed;
1182
+ }
1183
+ }
1184
+
1185
+ @utility shamar-input {
1186
+ width: 100%;
1187
+ border-radius: 0.5rem;
1188
+ border: 1px solid var(--color-default);
1189
+ background-color: var(--color-neutral-primary);
1190
+ padding: 0.5rem 0.75rem;
1191
+ font-size: 0.875rem;
1192
+ line-height: 1.25rem;
1193
+ color: var(--color-heading);
1194
+ outline: none;
1195
+ accent-color: var(--color-fg-brand);
1196
+ -webkit-appearance: none;
1197
+ appearance: none;
1198
+
1199
+ &:focus,
1200
+ &:focus-visible {
1201
+ @apply shamar-focus-ring;
1202
+ }
1203
+
1204
+ &::placeholder {
1205
+ color: var(--color-body-subtle);
1206
+ }
1207
+
1208
+ &[type='search']::-webkit-search-decoration,
1209
+ &[type='search']::-webkit-search-cancel-button {
1210
+ -webkit-appearance: none;
1211
+ appearance: none;
1212
+ }
1213
+ }
1214
+
1215
+ @utility shamar-select {
1216
+ appearance: none;
1217
+ border-radius: 0.5rem;
1218
+ border: 1px solid var(--color-default);
1219
+ background-color: var(--color-neutral-primary);
1220
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af' stroke-width='2'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 8.25l-7.5 7.5-7.5-7.5'/%3E%3C/svg%3E");
1221
+ background-repeat: no-repeat;
1222
+ background-position: right 0.5rem center;
1223
+ background-size: 0.875rem;
1224
+ padding: 0.4375rem 1.75rem 0.4375rem 0.625rem;
1225
+ font-size: 0.8125rem;
1226
+ line-height: 1.25rem;
1227
+ color: var(--color-heading);
1228
+ outline: none;
1229
+ accent-color: var(--color-fg-brand);
1230
+ cursor: pointer;
1231
+
1232
+ &:focus,
1233
+ &:focus-visible {
1234
+ @apply shamar-focus-ring;
1235
+ }
1236
+ }
1237
+
1238
+ select.shamar-select option,
1239
+ select.shamar-input option {
1240
+ background-color: var(--color-neutral-primary);
1241
+ color: var(--color-heading);
1242
+ }
1243
+
1244
+ .shamar-form-grid {
1245
+ display: grid;
1246
+ gap: 1.25rem;
1247
+ grid-template-columns: repeat(var(--shamar-form-cols, 2), minmax(0, 1fr));
1248
+ }
1249
+
1250
+ .shamar-detail-grid {
1251
+ display: grid;
1252
+ gap: 0;
1253
+ grid-template-columns: repeat(var(--shamar-detail-cols, 2), minmax(0, 1fr));
1254
+ }
1255
+
1256
+ @media (max-width: 639px) {
1257
+ .shamar-form-grid,
1258
+ .shamar-detail-grid {
1259
+ grid-template-columns: 1fr;
1260
+ }
1261
+
1262
+ .shamar-field-cell,
1263
+ .shamar-detail-cell {
1264
+ grid-column: 1 / -1 !important;
1265
+ }
1266
+ }
1267
+
1268
+ .shamar-field-cell,
1269
+ .shamar-detail-cell {
1270
+ min-width: 0;
1271
+ }
1272
+
1273
+ .shamar-detail__label {
1274
+ display: block;
1275
+ margin: 0;
1276
+ font-size: 0.75rem;
1277
+ font-weight: 650;
1278
+ letter-spacing: 0.02em;
1279
+ text-transform: uppercase;
1280
+ color: var(--color-heading);
1281
+ }
1282
+
1283
+ .shamar-detail__label-row,
1284
+ .shamar-field__label-row {
1285
+ display: flex;
1286
+ align-items: baseline;
1287
+ justify-content: space-between;
1288
+ gap: 0.75rem;
1289
+ margin-bottom: 0.5rem;
1290
+ }
1291
+
1292
+ .shamar-detail__label-row {
1293
+ margin-bottom: 0;
1294
+ }
1295
+
1296
+ .shamar-detail__label-row .shamar-detail__label {
1297
+ flex: 1 1 auto;
1298
+ min-width: 0;
1299
+ }
1300
+
1301
+ .shamar-field__label-row .shamar-field__label {
1302
+ margin-bottom: 0;
1303
+ flex: 1 1 auto;
1304
+ min-width: 0;
1305
+ }
1306
+
1307
+ .shamar-field__label {
1308
+ display: block;
1309
+ margin-bottom: 0.5rem;
1310
+ font-size: 0.875rem;
1311
+ font-weight: 500;
1312
+ color: var(--color-heading);
1313
+ }
1314
+
1315
+ .shamar-field__required {
1316
+ color: var(--color-fg-danger);
1317
+ }
1318
+
1319
+ .shamar-field__hint {
1320
+ flex: 0 1 auto;
1321
+ max-width: 55%;
1322
+ margin: 0;
1323
+ font-size: 0.75rem;
1324
+ font-weight: 500;
1325
+ line-height: 1.35;
1326
+ text-align: right;
1327
+ color: var(--color-body-subtle);
1328
+ }
1329
+
1330
+ .shamar-field__help {
1331
+ margin-top: 0.5rem;
1332
+ font-size: 0.75rem;
1333
+ line-height: 1.4;
1334
+ color: var(--color-body-subtle);
1335
+ }
1336
+
1337
+ .shamar-field__error {
1338
+ margin-top: 0.375rem;
1339
+ font-size: 0.75rem;
1340
+ line-height: 1.4;
1341
+ color: var(--color-fg-danger);
1342
+ }
1343
+
1344
+ .shamar-field.is-invalid .shamar-field__label {
1345
+ color: var(--color-fg-danger);
1346
+ }
1347
+
1348
+ .shamar-input.is-invalid,
1349
+ .shamar-select.is-invalid,
1350
+ .shamar-m2m-checkboxes.is-invalid,
1351
+ [data-shamar-m2o-config].is-invalid,
1352
+ [data-shamar-m2m-config].is-invalid {
1353
+ border-color: var(--color-fg-danger);
1354
+ }
1355
+
1356
+ .shamar-input.is-invalid:focus,
1357
+ .shamar-select.is-invalid:focus {
1358
+ outline-color: var(--color-fg-danger);
1359
+ border-color: var(--color-fg-danger);
1360
+ }
1361
+
1362
+ .shamar-field__value {
1363
+ font-size: 0.875rem;
1364
+ line-height: 1.5;
1365
+ color: var(--color-body);
1366
+ }
1367
+
1368
+ .shamar-field--readonly .shamar-field__value {
1369
+ padding: 0.625rem 0.75rem;
1370
+ border-radius: 0.5rem;
1371
+ border: 1px solid var(--color-card-border);
1372
+ background: var(--color-surface-inset);
1373
+ }
1374
+
1375
+ .shamar-input-group {
1376
+ display: flex;
1377
+ align-items: stretch;
1378
+ width: 100%;
1379
+ }
1380
+
1381
+ .shamar-input-group .shamar-input {
1382
+ flex: 1;
1383
+ min-width: 0;
1384
+ }
1385
+
1386
+ .shamar-input-group.has-prefix .shamar-input {
1387
+ border-top-left-radius: 0;
1388
+ border-bottom-left-radius: 0;
1389
+ }
1390
+
1391
+ .shamar-input-group.has-suffix .shamar-input {
1392
+ border-top-right-radius: 0;
1393
+ border-bottom-right-radius: 0;
1394
+ }
1395
+
1396
+ .shamar-input-group__affix {
1397
+ display: inline-flex;
1398
+ align-items: center;
1399
+ padding: 0 0.75rem;
1400
+ border: 1px solid var(--color-default);
1401
+ background: var(--color-surface-inset);
1402
+ color: var(--color-body-subtle);
1403
+ font-size: 0.8125rem;
1404
+ white-space: nowrap;
1405
+ }
1406
+
1407
+ .shamar-input-group.has-prefix .shamar-input-group__affix:first-child {
1408
+ border-right: 0;
1409
+ border-top-left-radius: 0.5rem;
1410
+ border-bottom-left-radius: 0.5rem;
1411
+ }
1412
+
1413
+ .shamar-input-group.has-suffix .shamar-input-group__affix:last-child {
1414
+ border-left: 0;
1415
+ border-top-right-radius: 0.5rem;
1416
+ border-bottom-right-radius: 0.5rem;
1417
+ }
1418
+
1419
+ .shamar-input-group__affix--icon,
1420
+ .shamar-input-group__affix--action {
1421
+ padding: 0 0.65rem;
1422
+ }
1423
+
1424
+ .shamar-input-group__affix--action {
1425
+ cursor: pointer;
1426
+ background: var(--color-neutral-primary);
1427
+ color: var(--color-body-subtle);
1428
+ }
1429
+
1430
+ .shamar-input-group__affix--action:hover {
1431
+ color: var(--color-heading);
1432
+ background: var(--color-surface-hover, var(--color-neutral-secondary));
1433
+ }
1434
+
1435
+ .shamar-field__counter {
1436
+ margin: 0.35rem 0 0;
1437
+ font-size: 0.75rem;
1438
+ color: var(--color-body-subtle);
1439
+ text-align: right;
1440
+ }
1441
+
1442
+ .shamar-input--file {
1443
+ padding: 0.4rem 0.5rem;
1444
+ }
1445
+
1446
+ .shamar-toggle {
1447
+ position: relative;
1448
+ display: flex;
1449
+ align-items: center;
1450
+ gap: 0.75rem;
1451
+ width: 100%;
1452
+ min-width: 0;
1453
+ cursor: pointer;
1454
+ user-select: none;
1455
+ }
1456
+
1457
+ .shamar-toggle--inline {
1458
+ min-height: 2.5rem;
1459
+ padding: 0.375rem 0;
1460
+ }
1461
+
1462
+ .shamar-toggle__text {
1463
+ display: flex;
1464
+ flex-direction: column;
1465
+ gap: 0.15rem;
1466
+ flex: 1 1 auto;
1467
+ min-width: 0;
1468
+ }
1469
+
1470
+ .shamar-toggle.is-disabled {
1471
+ opacity: 0.55;
1472
+ cursor: not-allowed;
1473
+ }
1474
+
1475
+ .shamar-toggle__input {
1476
+ position: absolute;
1477
+ width: 1px;
1478
+ height: 1px;
1479
+ padding: 0;
1480
+ margin: -1px;
1481
+ overflow: hidden;
1482
+ clip: rect(0, 0, 0, 0);
1483
+ white-space: nowrap;
1484
+ border: 0;
1485
+ }
1486
+
1487
+ .shamar-toggle__track {
1488
+ position: relative;
1489
+ width: 2.75rem;
1490
+ height: 1.5rem;
1491
+ flex-shrink: 0;
1492
+ border-radius: 9999px;
1493
+ background: var(--color-gray-300);
1494
+ border: 1px solid color-mix(in srgb, var(--color-gray-400) 70%, transparent);
1495
+ transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
1496
+ }
1497
+
1498
+ :where(.dark, .dark *) .shamar-toggle__track {
1499
+ background: var(--color-gray-700);
1500
+ border-color: var(--color-gray-600);
1501
+ }
1502
+
1503
+ .shamar-toggle__thumb {
1504
+ position: absolute;
1505
+ top: 0.125rem;
1506
+ left: 0.125rem;
1507
+ width: 1.125rem;
1508
+ height: 1.125rem;
1509
+ border-radius: 9999px;
1510
+ background: #ffffff;
1511
+ box-shadow: 0 1px 3px rgb(15 23 42 / 18%);
1512
+ transition: transform 0.18s ease;
1513
+ }
1514
+
1515
+ .shamar-toggle__input:focus-visible + .shamar-toggle__track {
1516
+ @apply shamar-focus-ring;
1517
+ }
1518
+
1519
+ .shamar-toggle__input:checked + .shamar-toggle__track {
1520
+ background: var(--color-fg-brand);
1521
+ border-color: color-mix(in srgb, var(--color-fg-brand) 80%, #000);
1522
+ }
1523
+
1524
+ .shamar-toggle__input:checked + .shamar-toggle__track .shamar-toggle__thumb {
1525
+ transform: translateX(1.25rem);
1526
+ }
1527
+
1528
+ .shamar-toggle__label {
1529
+ font-size: 0.875rem;
1530
+ font-weight: 500;
1531
+ color: var(--color-heading);
1532
+ }
1533
+
1534
+ .shamar-boolean {
1535
+ display: inline-flex;
1536
+ align-items: center;
1537
+ gap: 0.4rem;
1538
+ max-width: 100%;
1539
+ border-radius: 9999px;
1540
+ padding: 0.2rem 0.65rem 0.2rem 0.3rem;
1541
+ font-size: 0.8125rem;
1542
+ font-weight: 600;
1543
+ line-height: 1.2;
1544
+ border: 1px solid transparent;
1545
+ }
1546
+
1547
+ .shamar-boolean--custom {
1548
+ padding-left: 0.35rem;
1549
+ }
1550
+
1551
+ .shamar-boolean--icon-only {
1552
+ padding: 0.3rem;
1553
+ }
1554
+
1555
+ .shamar-boolean__mark {
1556
+ display: inline-flex;
1557
+ flex-shrink: 0;
1558
+ align-items: center;
1559
+ justify-content: center;
1560
+ width: 1.35rem;
1561
+ height: 1.35rem;
1562
+ border-radius: 9999px;
1563
+ background: color-mix(in srgb, currentColor 14%, transparent);
1564
+ }
1565
+
1566
+ .shamar-boolean__glyph {
1567
+ font-size: 0.8rem;
1568
+ line-height: 1;
1569
+ }
1570
+
1571
+ .shamar-boolean__label {
1572
+ padding-right: 0.15rem;
1573
+ letter-spacing: 0.01em;
1574
+ }
1575
+
1576
+ .shamar-boolean.is-true {
1577
+ background: var(--color-success-soft);
1578
+ color: var(--color-success-strong);
1579
+ border-color: color-mix(in srgb, var(--color-success-strong) 18%, transparent);
1580
+ }
1581
+
1582
+ .shamar-boolean.is-false {
1583
+ background: var(--color-badge-neutral);
1584
+ color: var(--color-body-subtle);
1585
+ border-color: color-mix(in srgb, var(--color-card-border) 80%, transparent);
1586
+ }
1587
+
1588
+ .shamar-field .shamar-select,
1589
+ .shamar-field-cell .shamar-select {
1590
+ display: block;
1591
+ width: 100%;
1592
+ max-width: 100%;
1593
+ min-width: 0;
1594
+ }
1595
+
1596
+ /* Custom select combobox (single + multi with chips). */
1597
+ .shamar-combobox {
1598
+ position: relative;
1599
+ width: 100%;
1600
+ min-width: 0;
1601
+ }
1602
+
1603
+ .shamar-combobox__control {
1604
+ display: flex;
1605
+ align-items: center;
1606
+ gap: 0.35rem;
1607
+ min-height: 2.5rem;
1608
+ width: 100%;
1609
+ padding: 0.25rem 0.35rem 0.25rem 0.65rem;
1610
+ border: 1px solid var(--color-default);
1611
+ border-radius: 0.5rem;
1612
+ background: var(--color-neutral-primary);
1613
+ cursor: text;
1614
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
1615
+ }
1616
+
1617
+ .shamar-combobox.is-open .shamar-combobox__control,
1618
+ .shamar-combobox__control:focus-within {
1619
+ border-color: var(--color-fg-brand);
1620
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-fg-brand) 28%, transparent);
1621
+ }
1622
+
1623
+ .shamar-combobox.is-invalid .shamar-combobox__control {
1624
+ border-color: var(--color-fg-danger);
1625
+ }
1626
+
1627
+ .shamar-combobox.is-disabled .shamar-combobox__control {
1628
+ opacity: 0.55;
1629
+ cursor: not-allowed;
1630
+ background: var(--color-surface-inset, var(--color-neutral-secondary));
1631
+ }
1632
+
1633
+ .shamar-combobox__chips {
1634
+ display: flex;
1635
+ flex: 1 1 auto;
1636
+ flex-wrap: wrap;
1637
+ align-items: center;
1638
+ gap: 0.35rem;
1639
+ min-width: 0;
1640
+ }
1641
+
1642
+ .shamar-combobox__chip {
1643
+ display: inline-flex;
1644
+ align-items: center;
1645
+ gap: 0.2rem;
1646
+ max-width: 100%;
1647
+ padding: 0.15rem 0.2rem 0.15rem 0.5rem;
1648
+ border-radius: 999px;
1649
+ background: var(--color-brand-soft);
1650
+ color: var(--color-fg-brand);
1651
+ font-size: 0.75rem;
1652
+ font-weight: 550;
1653
+ line-height: 1.25;
1654
+ }
1655
+
1656
+ .shamar-combobox__chip-label {
1657
+ min-width: 0;
1658
+ overflow: hidden;
1659
+ text-overflow: ellipsis;
1660
+ white-space: nowrap;
1661
+ }
1662
+
1663
+ .shamar-combobox__chip-remove {
1664
+ display: inline-flex;
1665
+ align-items: center;
1666
+ justify-content: center;
1667
+ width: 1.15rem;
1668
+ height: 1.15rem;
1669
+ border: 0;
1670
+ border-radius: 999px;
1671
+ background: transparent;
1672
+ color: inherit;
1673
+ cursor: pointer;
1674
+ }
1675
+
1676
+ .shamar-combobox__chip-remove:hover {
1677
+ background: color-mix(in srgb, var(--color-fg-brand) 18%, transparent);
1678
+ }
1679
+
1680
+ .shamar-combobox__search {
1681
+ flex: 1 1 6rem;
1682
+ min-width: 4rem;
1683
+ width: auto;
1684
+ margin: 0;
1685
+ padding: 0.3rem 0;
1686
+ border: 0;
1687
+ background: transparent;
1688
+ color: var(--color-heading);
1689
+ font-size: 0.875rem;
1690
+ outline: none;
1691
+ box-shadow: none;
1692
+ }
1693
+
1694
+ .shamar-combobox__search--single {
1695
+ flex: 1 1 auto;
1696
+ min-width: 0;
1697
+ }
1698
+
1699
+ .shamar-combobox__search:disabled {
1700
+ cursor: not-allowed;
1701
+ }
1702
+
1703
+ .shamar-combobox__clear,
1704
+ .shamar-combobox__toggle {
1705
+ display: inline-flex;
1706
+ flex-shrink: 0;
1707
+ align-items: center;
1708
+ justify-content: center;
1709
+ width: 1.75rem;
1710
+ height: 1.75rem;
1711
+ border: 0;
1712
+ border-radius: 0.375rem;
1713
+ background: transparent;
1714
+ color: var(--color-body-subtle);
1715
+ cursor: pointer;
1716
+ }
1717
+
1718
+ .shamar-combobox__clear:hover,
1719
+ .shamar-combobox__toggle:hover {
1720
+ color: var(--color-heading);
1721
+ background: var(--color-surface-hover, var(--color-neutral-secondary));
1722
+ }
1723
+
1724
+ .shamar-combobox__toggle {
1725
+ color: var(--color-body-subtle);
1726
+ }
1727
+
1728
+ .shamar-combobox.is-open .shamar-combobox__toggle {
1729
+ color: var(--color-fg-brand);
1730
+ }
1731
+
1732
+ .shamar-combobox__dropdown {
1733
+ position: absolute;
1734
+ z-index: 40;
1735
+ top: calc(100% + 0.25rem);
1736
+ left: 0;
1737
+ right: 0;
1738
+ max-height: 16rem;
1739
+ overflow: auto;
1740
+ padding: 0.35rem;
1741
+ border: 1px solid var(--color-default);
1742
+ border-radius: 0.5rem;
1743
+ background: var(--color-neutral-primary);
1744
+ box-shadow: 0 10px 30px color-mix(in srgb, #000 12%, transparent);
1745
+ }
1746
+
1747
+ .shamar-combobox__option {
1748
+ display: flex;
1749
+ align-items: center;
1750
+ justify-content: space-between;
1751
+ gap: 0.75rem;
1752
+ width: 100%;
1753
+ padding: 0.45rem 0.6rem;
1754
+ border: 0;
1755
+ border-radius: 0.375rem;
1756
+ background: transparent;
1757
+ color: var(--color-heading);
1758
+ font-size: 0.875rem;
1759
+ text-align: left;
1760
+ cursor: pointer;
1761
+ }
1762
+
1763
+ .shamar-combobox__option:hover,
1764
+ .shamar-combobox__option.is-active {
1765
+ background: var(--color-surface-hover, var(--color-neutral-secondary));
1766
+ }
1767
+
1768
+ .shamar-combobox__option.is-selected {
1769
+ color: var(--color-fg-brand);
1770
+ font-weight: 550;
1771
+ }
1772
+
1773
+ .shamar-combobox__option-check {
1774
+ flex-shrink: 0;
1775
+ color: var(--color-fg-brand);
1776
+ }
1777
+
1778
+ .shamar-combobox__empty {
1779
+ padding: 0.65rem 0.6rem;
1780
+ color: var(--color-body-subtle);
1781
+ font-size: 0.8125rem;
1782
+ }
1783
+
1784
+
1785
+ .shamar-field.text-right .shamar-input,
1786
+ .shamar-field.text-right .shamar-select,
1787
+ .shamar-field.text-right .shamar-combobox__search {
1788
+ text-align: right;
1789
+ }
1790
+
1791
+ .shamar-field.text-center .shamar-input,
1792
+ .shamar-field.text-center .shamar-select,
1793
+ .shamar-field.text-center .shamar-combobox__search {
1794
+ text-align: center;
1795
+ }
1796
+
1797
+ .shamar-field.text-justify .shamar-input,
1798
+ .shamar-field.text-justify .shamar-select,
1799
+ .shamar-field.text-justify .shamar-combobox__search {
1800
+ text-align: justify;
1801
+ }
1802
+
1803
+
1804
+ /* Backward-compatible alias */
1805
+ .shamar-boolean-badge {
1806
+ display: inline-flex;
1807
+ align-items: center;
1808
+ border-radius: 9999px;
1809
+ padding: 0.2rem 0.65rem;
1810
+ font-size: 0.75rem;
1811
+ font-weight: 600;
1812
+ }
1813
+
1814
+ .shamar-boolean-badge.is-true {
1815
+ background: var(--color-success-soft);
1816
+ color: var(--color-success-strong);
1817
+ }
1818
+
1819
+ .shamar-boolean-badge.is-false {
1820
+ background: var(--color-badge-neutral);
1821
+ color: var(--color-body-subtle);
1822
+ }
1823
+
1824
+ .shamar-field[data-field-type="relation"] {
1825
+ width: 100%;
1826
+ }
1827
+
1828
+ .shamar-m2o {
1829
+ width: 100%;
1830
+ }
1831
+
1832
+ .shamar-m2o__row {
1833
+ width: 100%;
1834
+ }
1835
+
1836
+ .shamar-m2o__input {
1837
+ min-height: 2.375rem;
1838
+ }
1839
+
1840
+ .shamar-m2o__input.is-readonly {
1841
+ cursor: default;
1842
+ opacity: 0.85;
1843
+ }
1844
+
1845
+ .shamar-m2o__dropdown {
1846
+ min-width: 100%;
1847
+ }
1848
+
1849
+ .shamar-m2o__dropdown li[role="option"],
1850
+ .shamar-m2m__dropdown li[role="option"],
1851
+ .shamar-m2m-table li {
1852
+ cursor: pointer;
1853
+ }
1854
+
1855
+ .shamar-m2o__dropdown svg,
1856
+ .shamar-m2m__dropdown svg,
1857
+ .shamar-m2m-table svg {
1858
+ width: 0.875rem;
1859
+ height: 0.875rem;
1860
+ flex-shrink: 0;
1861
+ }
1862
+
1863
+ .shamar-m2o__clear svg,
1864
+ .shamar-m2m .shamar-chip__remove svg {
1865
+ width: 0.75rem;
1866
+ height: 0.75rem;
1867
+ flex-shrink: 0;
1868
+ }
1869
+
1870
+ .shamar-m2o__open {
1871
+ align-self: stretch;
1872
+ }
1873
+
1874
+ .shamar-m2m {
1875
+ width: 100%;
1876
+ }
1877
+
1878
+ .shamar-m2m__box {
1879
+ cursor: text;
1880
+ }
1881
+
1882
+ .shamar-m2m__box.is-readonly {
1883
+ cursor: default;
1884
+ opacity: 0.85;
1885
+ }
1886
+
1887
+ .shamar-m2m__box.is-open {
1888
+ border-color: var(--color-fg-brand, currentColor);
1889
+ }
1890
+
1891
+ .shamar-m2m__input {
1892
+ min-height: 1.25rem;
1893
+ }
1894
+
1895
+ .shamar-m2m__dropdown {
1896
+ min-width: 100%;
1897
+ }
1898
+
1899
+ .shamar-chip {
1900
+ line-height: 1.25;
1901
+ }
1902
+
1903
+ .shamar-m2m-checkboxes,
1904
+ .shamar-m2m-table {
1905
+ width: 100%;
1906
+ }
1907
+
1908
+ .shamar-m2m-table__card {
1909
+ overflow: visible;
1910
+ }
1911
+
1912
+ .shamar-m2m-table__toolbar {
1913
+ position: relative;
1914
+ z-index: 2;
1915
+ }
1916
+
1917
+ .shamar-m2m-table__add {
1918
+ position: relative;
1919
+ }
1920
+
1921
+ .shamar-m2m-table__add-dropdown {
1922
+ z-index: 50;
1923
+ }
1924
+
1925
+ /* Let relation dropdowns escape form section cards. */
1926
+ .shamar-form-section:has(.shamar-m2m-table),
1927
+ .shamar-form-section:has(.shamar-m2o),
1928
+ .shamar-form-section:has(.shamar-m2m) {
1929
+ overflow: visible;
1930
+ }
1931
+
1932
+ .shamar-m2m-checkboxes__body--framed {
1933
+ max-height: 28rem;
1934
+ overflow: auto;
1935
+ border: 1px solid var(--color-default);
1936
+ border-radius: 0.5rem;
1937
+ padding: 0.5rem;
1938
+ }
1939
+
1940
+ .shamar-m2m-checkboxes__body--open {
1941
+ max-height: none;
1942
+ overflow: visible;
1943
+ border: 0;
1944
+ padding: 0;
1945
+ }
1946
+
1947
+ .shamar-m2m-checkboxes__list {
1948
+ display: grid;
1949
+ grid-template-columns: repeat(var(--shamar-checkbox-cols, 1), minmax(0, 1fr));
1950
+ gap: 0.125rem 0.5rem;
1951
+ }
1952
+
1953
+ .shamar-m2m-checkboxes__clusters {
1954
+ display: grid;
1955
+ grid-template-columns: repeat(var(--shamar-checkbox-cols, 1), minmax(0, 1fr));
1956
+ gap: 0.625rem;
1957
+ align-items: start;
1958
+ }
1959
+
1960
+ .shamar-m2m-checkboxes__cluster {
1961
+ display: flex;
1962
+ flex-direction: column;
1963
+ min-width: 0;
1964
+ border: 1px solid var(--color-default);
1965
+ border-radius: 0.5rem;
1966
+ background: var(--color-neutral-primary);
1967
+ overflow: hidden;
1968
+ }
1969
+
1970
+ .shamar-m2m-checkboxes__cluster-header {
1971
+ display: flex;
1972
+ align-items: flex-start;
1973
+ justify-content: space-between;
1974
+ gap: 0.5rem;
1975
+ padding: 0.5rem 0.625rem;
1976
+ border-bottom: 1px solid var(--color-default);
1977
+ background: var(--color-surface-header, var(--color-neutral-secondary, transparent));
1978
+ }
1979
+
1980
+ .shamar-m2m-checkboxes__cluster-count {
1981
+ font-size: 0.65rem;
1982
+ line-height: 1.25;
1983
+ color: var(--color-body-subtle);
1984
+ font-variant-numeric: tabular-nums;
1985
+ }
1986
+
1987
+ .shamar-m2m-checkboxes__cluster-body {
1988
+ display: flex;
1989
+ flex-direction: column;
1990
+ gap: 0.0625rem;
1991
+ padding: 0.375rem;
1992
+ }
1993
+
1994
+ .shamar-m2m-checkboxes__clusters--cols-1,
1995
+ .shamar-m2m-checkboxes__list--cols-1 {
1996
+ --shamar-checkbox-cols: 1;
1997
+ }
1998
+
1999
+ .shamar-m2m-checkboxes__clusters--cols-2,
2000
+ .shamar-m2m-checkboxes__list--cols-2 {
2001
+ --shamar-checkbox-cols: 2;
2002
+ }
2003
+
2004
+ .shamar-m2m-checkboxes__clusters--cols-3,
2005
+ .shamar-m2m-checkboxes__list--cols-3 {
2006
+ --shamar-checkbox-cols: 3;
2007
+ }
2008
+
2009
+ .shamar-m2m-checkboxes__clusters--cols-4,
2010
+ .shamar-m2m-checkboxes__list--cols-4 {
2011
+ --shamar-checkbox-cols: 4;
2012
+ }
2013
+
2014
+ @media (max-width: 1024px) {
2015
+ .shamar-m2m-checkboxes__clusters--cols-3,
2016
+ .shamar-m2m-checkboxes__clusters--cols-4 {
2017
+ --shamar-checkbox-cols: 2;
2018
+ }
2019
+ }
2020
+
2021
+ @media (max-width: 640px) {
2022
+ .shamar-m2m-checkboxes__clusters,
2023
+ .shamar-m2m-checkboxes__list {
2024
+ --shamar-checkbox-cols: 1 !important;
2025
+ }
2026
+ }
2027
+
2028
+ .shamar-list-refresh {
2029
+ display: inline-flex;
2030
+ align-items: center;
2031
+ justify-content: center;
2032
+ width: 2.25rem;
2033
+ height: 2.25rem;
2034
+ border-radius: 0.5rem;
2035
+ border: 1px solid var(--color-default);
2036
+ background: var(--color-neutral-primary);
2037
+ color: var(--color-body-subtle);
2038
+ transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
2039
+ }
2040
+
2041
+ .shamar-list-refresh:hover {
2042
+ color: var(--color-fg-brand);
2043
+ border-color: var(--color-fg-brand);
2044
+ background: var(--color-brand-softer);
2045
+ }
2046
+
2047
+ .shamar-list-refresh.is-auto {
2048
+ color: var(--color-fg-brand);
2049
+ border-color: var(--color-fg-brand);
2050
+ background: var(--color-brand-softer);
2051
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--color-fg-brand) 35%, transparent);
2052
+ }
2053
+
2054
+ .shamar-list-refresh:disabled,
2055
+ .shamar-list-refresh.is-busy {
2056
+ cursor: wait;
2057
+ opacity: 0.55;
2058
+ pointer-events: none;
2059
+ }
2060
+
2061
+ .shamar-list-refresh.is-auto .shamar-list-refresh__icon,
2062
+ .shamar-list-refresh.is-busy .shamar-list-refresh__icon {
2063
+ animation: shamar-refresh-spin 1.25s linear infinite;
2064
+ }
2065
+
2066
+ @keyframes shamar-refresh-spin {
2067
+ to {
2068
+ transform: rotate(360deg);
2069
+ }
2070
+ }
2071
+
2072
+ @media (prefers-reduced-motion: reduce) {
2073
+ .shamar-list-refresh.is-auto .shamar-list-refresh__icon {
2074
+ animation: none;
2075
+ }
2076
+ }
2077
+
2078
+ /* Schema layout: tabs, wizard, flex, callout, tags, etc. */
2079
+ .shamar-form-grid.is-dense,
2080
+ .shamar-detail-grid.is-dense { gap: 0.5rem; }
2081
+ .shamar-form-grid.is-gapless,
2082
+ .shamar-detail-grid.is-gapless { gap: 0; }
2083
+
2084
+ .shamar-tabs { display: flex; flex-direction: column; gap: 0; }
2085
+ .shamar-tabs--contained { border: 1px solid var(--color-card-border); border-radius: 0.75rem; overflow: hidden; background: var(--color-neutral-primary); }
2086
+ .shamar-tabs--vertical { flex-direction: row; align-items: stretch; }
2087
+ .shamar-tabs__list { display: flex; gap: 0.25rem; padding: 0.5rem; border-bottom: 1px solid var(--color-card-border); background: var(--color-surface-header, var(--color-neutral-secondary)); overflow-x: auto; }
2088
+ .shamar-tabs--vertical .shamar-tabs__list { flex-direction: column; border-bottom: 0; border-right: 1px solid var(--color-card-border); min-width: 10rem; }
2089
+ .shamar-tabs__tab { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.75rem; border-radius: 0.5rem; font-size: 0.8125rem; font-weight: 550; color: var(--color-body-subtle); background: transparent; border: 0; cursor: pointer; }
2090
+ .shamar-tabs__tab.is-active { color: var(--color-heading); background: var(--color-neutral-primary); box-shadow: 0 0 0 1px var(--color-card-border); }
2091
+ .shamar-tabs__badge { font-size: 0.7rem; padding: 0.1rem 0.4rem; border-radius: 999px; background: var(--color-brand-soft); color: var(--color-fg-brand); }
2092
+ .shamar-tabs__panels { padding: 1rem; flex: 1; }
2093
+
2094
+ .shamar-wizard { padding: 1rem; }
2095
+ .shamar-wizard__steps { display: flex; gap: 0.75rem; list-style: none; margin: 0 0 1rem; padding: 0; flex-wrap: wrap; }
2096
+ .shamar-wizard__step { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.8125rem; color: var(--color-body-subtle); }
2097
+ .shamar-wizard__step.is-active { color: var(--color-heading); font-weight: 600; }
2098
+ .shamar-wizard__step.is-done { color: var(--color-fg-brand); }
2099
+ .shamar-wizard__index { width: 1.5rem; height: 1.5rem; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--color-neutral-secondary); font-size: 0.75rem; }
2100
+ .shamar-wizard__step.is-active .shamar-wizard__index { background: var(--color-fg-brand); color: #fff; }
2101
+ .shamar-wizard__description { margin: 0 0 0.75rem; font-size: 0.875rem; color: var(--color-body-subtle); }
2102
+ .shamar-wizard__nav { display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem; }
2103
+ .shamar-wizard__btn { padding: 0.4rem 0.85rem; border-radius: 0.5rem; border: 1px solid var(--color-card-border); background: var(--color-neutral-primary); font-size: 0.8125rem; cursor: pointer; }
2104
+ .shamar-wizard__btn--primary { background: var(--color-fg-brand); border-color: transparent; color: #fff; }
2105
+
2106
+ .shamar-flex { display: flex; flex-direction: column; gap: 1rem; }
2107
+ @media (min-width: 768px) {
2108
+ .shamar-flex--from-md { flex-direction: row; align-items: flex-start; }
2109
+ }
2110
+ .shamar-flex__item { flex: 1 1 0; min-width: 0; }
2111
+ .shamar-flex__item--fixed { flex: 0 0 auto; }
2112
+
2113
+ .shamar-callout { border-radius: 0.75rem; padding: 0.85rem 1rem; border: 1px solid var(--color-card-border); }
2114
+ .shamar-callout__title { font-weight: 600; font-size: 0.875rem; color: var(--color-heading); }
2115
+ .shamar-callout__body { margin-top: 0.25rem; font-size: 0.8125rem; color: var(--color-body-subtle); }
2116
+ .shamar-callout--info { background: color-mix(in srgb, var(--color-fg-brand) 8%, transparent); border-color: color-mix(in srgb, var(--color-fg-brand) 30%, transparent); }
2117
+ .shamar-callout--success { background: color-mix(in srgb, #16a34a 10%, transparent); }
2118
+ .shamar-callout--warning { background: color-mix(in srgb, #d97706 10%, transparent); }
2119
+ .shamar-callout--danger { background: color-mix(in srgb, var(--color-fg-danger) 10%, transparent); }
2120
+
2121
+ .shamar-empty-state { text-align: center; padding: 2rem 1rem; color: var(--color-body-subtle); }
2122
+ .shamar-empty-state__title { margin: 0; font-size: 1rem; color: var(--color-heading); }
2123
+ .shamar-empty-state__description { margin: 0.35rem 0 0; font-size: 0.875rem; }
2124
+
2125
+ .shamar-placeholder__label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; color: var(--color-heading); }
2126
+ .shamar-placeholder__content { margin-top: 0.25rem; font-size: 0.875rem; color: var(--color-body); }
2127
+
2128
+ /* Checkbox field control (label wrapper) — fills grid cell width. */
2129
+ .shamar-checkbox {
2130
+ display: flex;
2131
+ align-items: center;
2132
+ gap: 0.5rem;
2133
+ width: 100%;
2134
+ min-width: 0;
2135
+ font-size: 0.875rem;
2136
+ cursor: pointer;
2137
+ user-select: none;
2138
+ }
2139
+
2140
+ .shamar-checkbox--inline {
2141
+ min-height: 2.5rem;
2142
+ padding: 0.375rem 0;
2143
+ }
2144
+
2145
+ .shamar-checkbox.is-disabled {
2146
+ opacity: 0.55;
2147
+ cursor: not-allowed;
2148
+ }
2149
+
2150
+ .shamar-checkbox__text {
2151
+ display: flex;
2152
+ flex-direction: column;
2153
+ gap: 0.15rem;
2154
+ flex: 1 1 auto;
2155
+ min-width: 0;
2156
+ }
2157
+
2158
+ .shamar-checkbox__label {
2159
+ font-size: 0.875rem;
2160
+ font-weight: 500;
2161
+ color: var(--color-heading);
2162
+ }
2163
+
2164
+ .shamar-radio__option { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; }
2165
+ .shamar-radio { display: flex; flex-direction: column; gap: 0.5rem; }
2166
+ .shamar-radio--inline { flex-direction: row; flex-wrap: wrap; gap: 0.75rem 1.25rem; }
2167
+
2168
+ .shamar-color { display: flex; align-items: center; gap: 0.5rem; }
2169
+ .shamar-color__swatch { width: 2.25rem; height: 2.25rem; padding: 0; border: 1px solid var(--color-card-border); border-radius: 0.4rem; background: transparent; cursor: pointer; }
2170
+ .shamar-color__value {
2171
+ flex: 1 1 auto;
2172
+ min-width: 0;
2173
+ cursor: default;
2174
+ color: var(--color-body-subtle);
2175
+ }
2176
+ .shamar-color__value:read-only {
2177
+ background: var(--color-surface-inset, var(--color-neutral-secondary));
2178
+ }
2179
+
2180
+ .shamar-input-affixes {
2181
+ display: flex;
2182
+ align-items: stretch;
2183
+ gap: 0.5rem;
2184
+ width: 100%;
2185
+ min-width: 0;
2186
+ }
2187
+ .shamar-input-affixes > .shamar-input-group,
2188
+ .shamar-input-affixes > .shamar-input {
2189
+ flex: 1 1 auto;
2190
+ min-width: 0;
2191
+ }
2192
+ .shamar-input-affixes--stacked {
2193
+ flex-direction: column;
2194
+ align-items: stretch;
2195
+ gap: 0.35rem;
2196
+ }
2197
+ .shamar-input-affixes__outside {
2198
+ display: inline-flex;
2199
+ align-items: center;
2200
+ font-size: 0.8125rem;
2201
+ font-weight: 500;
2202
+ color: var(--color-body-subtle);
2203
+ white-space: nowrap;
2204
+ }
2205
+ .shamar-input-affixes__outside--icon {
2206
+ color: var(--color-heading);
2207
+ }
2208
+ .shamar-input-affixes:not(.shamar-input-affixes--stacked) .shamar-input-affixes__outside {
2209
+ align-self: center;
2210
+ }
2211
+ .shamar-color-entry { display: inline-flex; align-items: center; gap: 0.4rem; }
2212
+ .shamar-color-entry__swatch { width: 1rem; height: 1rem; border-radius: 0.25rem; border: 1px solid var(--color-card-border); }
2213
+
2214
+ .shamar-tags { display: flex; flex-direction: column; gap: 0.5rem; }
2215
+ .shamar-tags__list { display: flex; flex-wrap: wrap; gap: 0.35rem; }
2216
+ .shamar-tags__chip { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.15rem 0.45rem; border-radius: 999px; background: var(--color-brand-soft); color: var(--color-fg-brand); font-size: 0.75rem; }
2217
+ .shamar-tags__remove { border: 0; background: transparent; cursor: pointer; color: inherit; line-height: 1; }
2218
+
2219
+ .shamar-input-group { display: flex; align-items: stretch; width: 100%; }
2220
+ .shamar-input-group .shamar-input { flex: 1; min-width: 0; }
2221
+ .shamar-input-group.has-prefix .shamar-input {
2222
+ border-top-left-radius: 0;
2223
+ border-bottom-left-radius: 0;
2224
+ }
2225
+ .shamar-input-group.has-suffix .shamar-input {
2226
+ border-top-right-radius: 0;
2227
+ border-bottom-right-radius: 0;
2228
+ }
2229
+ .shamar-input-group__affix {
2230
+ display: inline-flex;
2231
+ align-items: center;
2232
+ padding: 0 0.75rem;
2233
+ border: 1px solid var(--color-card-border);
2234
+ background: var(--color-surface-header, var(--color-neutral-secondary));
2235
+ font-size: 0.8125rem;
2236
+ color: var(--color-body-subtle);
2237
+ white-space: nowrap;
2238
+ }
2239
+ .shamar-input-group.has-prefix .shamar-input-group__affix:first-child {
2240
+ border-right: 0;
2241
+ border-top-left-radius: 0.5rem;
2242
+ border-bottom-left-radius: 0.5rem;
2243
+ }
2244
+ .shamar-input-group.has-suffix .shamar-input-group__affix:last-child {
2245
+ border-left: 0;
2246
+ border-top-right-radius: 0.5rem;
2247
+ border-bottom-right-radius: 0.5rem;
2248
+ }
2249
+
2250
+ .shamar-badge { display: inline-flex; padding: 0.15rem 0.5rem; border-radius: 999px; font-size: 0.75rem; font-weight: 550; background: var(--color-brand-soft); color: var(--color-fg-brand); }
2251
+ .shamar-badges { display: flex; flex-wrap: wrap; gap: 0.35rem; align-items: center; }
2252
+ .shamar-copyable { display: inline-flex; align-items: center; gap: 0.5rem; }
2253
+ .shamar-copyable__btn { font-size: 0.75rem; border: 1px solid var(--color-card-border); border-radius: 0.35rem; padding: 0.15rem 0.4rem; background: var(--color-neutral-primary); cursor: pointer; }
2254
+ .shamar-image-entry { max-width: 8rem; max-height: 8rem; border-radius: 0.5rem; object-fit: cover; border: 1px solid var(--color-card-border); }
2255
+
2256
+ .shamar-form-section__header--collapsible { cursor: pointer; user-select: none; }
2257
+ .shamar-form-section__header--collapsible:hover .shamar-form-section__chevron {
2258
+ color: var(--color-heading);
2259
+ background: var(--color-neutral-primary);
2260
+ border-color: var(--color-card-border);
2261
+ }
2262
+ .shamar-form-section__chevron {
2263
+ margin-left: auto;
2264
+ display: inline-flex;
2265
+ flex-shrink: 0;
2266
+ align-items: center;
2267
+ justify-content: center;
2268
+ width: 1.75rem;
2269
+ height: 1.75rem;
2270
+ border-radius: 0.5rem;
2271
+ border: 1px solid transparent;
2272
+ color: var(--color-body-subtle);
2273
+ background: transparent;
2274
+ transition:
2275
+ transform 0.18s ease,
2276
+ color 0.15s ease,
2277
+ background-color 0.15s ease,
2278
+ border-color 0.15s ease;
2279
+ }
2280
+ .shamar-form-section__chevron svg {
2281
+ display: block;
2282
+ transition: transform 0.18s ease;
2283
+ }
2284
+ .shamar-form-section__chevron.is-open svg {
2285
+ transform: rotate(180deg);
2286
+ }