@dodlhuat/basix 1.3.1 → 1.3.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 (118) hide show
  1. package/README.md +14 -8
  2. package/css/accordion.scss +0 -5
  3. package/css/badge.scss +1 -6
  4. package/css/bottom-sheet.scss +3 -8
  5. package/css/breadcrumb.scss +6 -15
  6. package/css/button.scss +2 -1
  7. package/css/calendar.scss +0 -67
  8. package/css/card.scss +0 -5
  9. package/css/carousel.scss +0 -3
  10. package/css/chart.scss +0 -25
  11. package/css/chat-bubbles.scss +0 -15
  12. package/css/checkbox.scss +3 -2
  13. package/css/chips.scss +3 -7
  14. package/css/code-viewer.scss +1 -5
  15. package/css/context-menu.scss +5 -21
  16. package/css/datepicker.scss +6 -9
  17. package/css/docs.scss +0 -4
  18. package/css/dropdown.scss +1 -1
  19. package/css/editor.scss +1 -23
  20. package/css/file-uploader.scss +2 -2
  21. package/css/flyout-menu.scss +65 -58
  22. package/css/form.scss +0 -28
  23. package/css/gallery.scss +2 -3
  24. package/css/group-picker.scss +5 -35
  25. package/css/icons.scss +0 -3
  26. package/css/lightbox.scss +2 -4
  27. package/css/mixins.scss +8 -0
  28. package/css/modal.scss +3 -3
  29. package/css/parameters.scss +6 -1
  30. package/css/popover.scss +3 -15
  31. package/css/progress.scss +0 -6
  32. package/css/push-menu.scss +3 -28
  33. package/css/radiobutton.scss +2 -1
  34. package/css/range-slider.scss +1 -7
  35. package/css/scrollbar.scss +9 -16
  36. package/css/sidebar-nav.scss +0 -12
  37. package/css/stepper.scss +0 -4
  38. package/css/style.css +108 -116
  39. package/css/style.css.map +1 -1
  40. package/css/style.min.css +1 -1
  41. package/css/style.min.css.map +1 -1
  42. package/css/style.scss +1 -1
  43. package/css/table.scss +0 -4
  44. package/css/tabs.scss +0 -2
  45. package/css/timeline.scss +1 -13
  46. package/css/timepicker.scss +55 -39
  47. package/css/toast.scss +1 -1
  48. package/css/tooltip.scss +1 -5
  49. package/css/tree.scss +1 -1
  50. package/css/typography.scss +3 -3
  51. package/css/virtual-dropdown.scss +3 -28
  52. package/js/bottom-sheet.d.ts +3 -1
  53. package/js/bottom-sheet.js +26 -27
  54. package/js/calendar.d.ts +7 -0
  55. package/js/calendar.js +14 -33
  56. package/js/carousel.d.ts +2 -0
  57. package/js/carousel.js +13 -5
  58. package/js/chart.d.ts +4 -0
  59. package/js/chart.js +13 -31
  60. package/js/code-viewer.d.ts +1 -0
  61. package/js/code-viewer.js +4 -0
  62. package/js/context-menu.d.ts +9 -2
  63. package/js/context-menu.js +17 -14
  64. package/js/datepicker.d.ts +4 -0
  65. package/js/datepicker.js +26 -11
  66. package/js/dropdown.d.ts +3 -3
  67. package/js/dropdown.js +6 -9
  68. package/js/editor.d.ts +1 -1
  69. package/js/editor.js +14 -20
  70. package/js/file-uploader.d.ts +4 -0
  71. package/js/file-uploader.js +52 -43
  72. package/js/flyout-menu.d.ts +5 -3
  73. package/js/flyout-menu.js +23 -46
  74. package/js/gallery.d.ts +4 -0
  75. package/js/gallery.js +39 -50
  76. package/js/group-picker.d.ts +5 -0
  77. package/js/group-picker.js +12 -17
  78. package/js/lightbox.d.ts +3 -0
  79. package/js/lightbox.js +12 -6
  80. package/js/modal.d.ts +3 -1
  81. package/js/modal.js +14 -11
  82. package/js/popover.d.ts +2 -0
  83. package/js/popover.js +26 -30
  84. package/js/position.d.ts +2 -0
  85. package/js/position.js +1 -5
  86. package/js/push-menu.d.ts +2 -1
  87. package/js/push-menu.js +25 -48
  88. package/js/range-slider.d.ts +1 -0
  89. package/js/range-slider.js +5 -3
  90. package/js/scroll.d.ts +2 -0
  91. package/js/scroll.js +1 -0
  92. package/js/scrollbar.d.ts +2 -0
  93. package/js/scrollbar.js +24 -36
  94. package/js/select.d.ts +1 -0
  95. package/js/select.js +5 -10
  96. package/js/sidebar-nav.d.ts +2 -0
  97. package/js/sidebar-nav.js +8 -0
  98. package/js/stepper.d.ts +2 -0
  99. package/js/stepper.js +7 -1
  100. package/js/table.d.ts +4 -0
  101. package/js/table.js +15 -22
  102. package/js/tabs.d.ts +2 -0
  103. package/js/tabs.js +6 -14
  104. package/js/theme.d.ts +1 -0
  105. package/js/theme.js +5 -13
  106. package/js/timepicker.d.ts +22 -5
  107. package/js/timepicker.js +160 -57
  108. package/js/toast.d.ts +3 -1
  109. package/js/toast.js +25 -22
  110. package/js/tooltip.d.ts +2 -0
  111. package/js/tooltip.js +21 -19
  112. package/js/tree.d.ts +3 -0
  113. package/js/tree.js +13 -0
  114. package/js/utils.d.ts +1 -3
  115. package/js/utils.js +0 -3
  116. package/js/virtual-dropdown.d.ts +3 -0
  117. package/js/virtual-dropdown.js +25 -0
  118. package/package.json +2 -2
@@ -1,6 +1,3 @@
1
- /* Flyout menu uses its own dark palette intentionally —
2
- it renders over any background regardless of light/dark mode.
3
- Scoped here rather than polluting :root. */
4
1
  .flyout-menu,
5
2
  .flyout-overlay,
6
3
  .site-header,
@@ -26,7 +23,6 @@ body {
26
23
  min-height: 100vh;
27
24
  }
28
25
 
29
- /* Header */
30
26
  .site-header {
31
27
  display: flex;
32
28
  justify-content: space-between;
@@ -80,7 +76,6 @@ body {
80
76
  font-size: 1.2rem;
81
77
  }
82
78
 
83
- /* Flyout Overlay */
84
79
  .flyout-overlay {
85
80
  position: fixed;
86
81
  top: 0;
@@ -100,22 +95,19 @@ body {
100
95
  visibility: visible;
101
96
  }
102
97
 
103
- /* Flyout Menu Base */
104
98
  .flyout-menu {
105
99
  position: fixed;
106
- background: var(--flyout-bg);
107
- backdrop-filter: blur(20px);
108
- -webkit-backdrop-filter: blur(20px);
100
+ background: rgba(10, 15, 30, 0.82);
101
+ backdrop-filter: blur(28px) saturate(1.4);
102
+ -webkit-backdrop-filter: blur(28px) saturate(1.4);
109
103
  z-index: 210;
110
104
  display: flex;
111
105
  flex-direction: column;
112
- padding: 2rem;
113
- box-shadow: 0 0 30px rgba(0, 0, 0, 0.5);
106
+ padding: 1.75rem 1.5rem;
107
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.06), 0 32px 80px rgba(0, 0, 0, 0.6);
114
108
  transition: transform var(--transition-speed) cubic-bezier(0.25, 1, 0.5, 1);
115
- /* Smoother rollout */
116
109
  }
117
110
 
118
- /* Directional Variants */
119
111
  .flyout-from-right {
120
112
  top: 0;
121
113
  right: 0;
@@ -138,37 +130,56 @@ body {
138
130
  transform: translate(0, 0);
139
131
  }
140
132
 
141
- /* Flyout Header */
142
133
  .flyout-header {
143
134
  display: flex;
144
135
  justify-content: space-between;
145
136
  align-items: center;
146
- margin-bottom: 3rem;
137
+ margin-bottom: 2.5rem;
138
+ padding-bottom: 1.25rem;
139
+ border-bottom: 1px solid rgba(255, 255, 255, 0.07);
147
140
  }
148
141
 
149
142
  .flyout-title {
150
- font-size: 1.25rem;
143
+ font-size: 0.65rem;
151
144
  font-weight: 600;
152
- color: #94a3b8;
145
+ color: rgba(255, 255, 255, 0.35);
153
146
  text-transform: uppercase;
154
- letter-spacing: 0.1em;
147
+ letter-spacing: 0.14em;
155
148
  }
156
149
 
157
150
  .close-menu {
158
151
  background: none;
159
152
  border: none;
160
- color: var(--flyout-text);
153
+ color: rgba(255, 255, 255, 0.4);
161
154
  cursor: pointer;
162
- padding: 0.5rem;
163
- transition: transform 0.2s, color 0.2s;
155
+ padding: 0.3rem;
156
+ line-height: 0;
157
+ transition: color 0.2s;
164
158
  }
165
159
 
166
160
  .close-menu:hover {
167
- transform: rotate(90deg);
168
- color: var(--accent-color);
161
+ color: #fff;
162
+ }
163
+
164
+ .flyout-menu button {
165
+ display: flex;
166
+ padding: 0;
167
+ border-radius: 0;
168
+ background: none;
169
+ font-size: inherit;
170
+ font-weight: inherit;
171
+ white-space: normal;
172
+ transition: color 0.2s;
173
+
174
+ &:hover:not(:disabled),
175
+ &:active:not(:disabled),
176
+ &.active {
177
+ background: none;
178
+ transform: none;
179
+ box-shadow: none;
180
+ }
169
181
  }
170
182
 
171
- /* Flyout Links */
172
183
  .flyout-links {
173
184
  list-style: none;
174
185
  flex-grow: 1;
@@ -189,7 +200,7 @@ body {
189
200
  border: none;
190
201
  font-size: 2rem;
191
202
  font-weight: 600;
192
- color: var(--flyout-text);
203
+ color: rgba(255, 255, 255, 0.6);
193
204
  text-decoration: none;
194
205
  cursor: pointer;
195
206
  font-family: inherit;
@@ -205,40 +216,43 @@ body {
205
216
  transform: translateY(0);
206
217
  }
207
218
 
208
- .flyout-links a:hover,
209
- .submenu-toggle:hover {
219
+ .flyout-links > li > a:hover,
220
+ .flyout-links > li > .submenu-toggle:hover {
221
+ color: #fff;
222
+ }
223
+
224
+ .submenu-toggle.active {
210
225
  color: var(--accent-color);
211
226
  }
212
227
 
213
228
  .chevron {
214
- transition: transform 0.3s;
215
- opacity: 0.7;
229
+ flex-shrink: 0;
230
+ opacity: 0.5;
231
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.2s;
216
232
  }
217
233
 
218
234
  .submenu-toggle.active .chevron {
219
235
  transform: rotate(180deg);
236
+ opacity: 1;
220
237
  }
221
238
 
222
- /* Submenu */
223
239
  .submenu {
224
240
  list-style: none;
225
241
  max-height: 0;
226
242
  overflow: hidden;
227
243
  transition: max-height 0.3s ease-out;
228
244
  padding-left: 1rem;
229
- border-left: 1px solid rgba(255, 255, 255, 0.1);
245
+ border-left: 1px solid rgba(255, 255, 255, 0.15);
230
246
  margin-top: 0;
231
247
  }
232
248
 
233
249
  .submenu.is-open {
234
250
  max-height: 500px;
235
- /* Reduced from 2000px for tighter animation */
236
- /* Arbitrary large height, increased for nesting */
237
251
  margin-top: 1rem;
238
252
  transition: max-height 0.4s cubic-bezier(0.16, 1, 0.3, 1);
239
- /* Smoother easing */
240
253
  }
241
254
 
255
+
242
256
  .submenu li {
243
257
  margin-bottom: 0.5rem;
244
258
  }
@@ -246,30 +260,34 @@ body {
246
260
  .submenu a {
247
261
  font-size: 1.25rem;
248
262
  font-weight: 400;
249
- color: #cbd5e1;
263
+ color: rgba(255, 255, 255, 0.45);
250
264
  transform: none !important;
251
- /* Override slide-in for submenu items */
265
+ transition: color 0.2s !important;
252
266
  transition-delay: 0s !important;
267
+
268
+ &:hover { color: #fff; }
253
269
  }
254
270
 
255
271
  .submenu .submenu-toggle {
256
272
  font-size: 1.25rem;
257
273
  font-weight: 400;
258
- color: #cbd5e1;
274
+ color: rgba(255, 255, 255, 0.45);
259
275
  transform: none !important;
260
276
  transition-delay: 0s !important;
261
277
  padding: 0;
262
278
  margin: 0;
279
+
280
+ &:hover { color: #fff; }
263
281
  }
264
282
 
265
- /* Flyout Footer */
266
283
  .flyout-footer {
267
- padding-top: 2rem;
268
- border-top: 1px solid var(--flyout-border);
269
- color: #64748b;
270
- font-size: 0.9rem;
284
+ padding-top: 1.25rem;
285
+ border-top: 1px solid rgba(255, 255, 255, 0.07);
286
+ color: rgba(255, 255, 255, 0.25);
287
+ font-size: 0.72rem;
288
+ letter-spacing: 0.03em;
271
289
  opacity: 0;
272
- transform: translateY(20px);
290
+ transform: translateY(12px);
273
291
  transition: opacity 0.4s, transform 0.4s;
274
292
  transition-delay: var(--delay);
275
293
  }
@@ -279,7 +297,6 @@ body {
279
297
  transform: translateY(0);
280
298
  }
281
299
 
282
- /* Mobile Responsiveness */
283
300
  @media (max-width: 480px) {
284
301
  :root {
285
302
  --menu-width: 100%;
@@ -289,7 +306,7 @@ body {
289
306
  font-size: 2rem;
290
307
  }
291
308
 
292
- /* Force Fullscreen for all directions */
309
+
293
310
  .flyout-from-right,
294
311
  .flyout-from-left,
295
312
  .flyout-from-top {
@@ -300,17 +317,7 @@ body {
300
317
  right: auto !important;
301
318
  bottom: auto !important;
302
319
  border: none !important;
303
- /* Remove borders for cleaner fullscreen look */
304
320
  border-right: 1px solid var(--flyout-border) !important;
305
- /* Add consistent right border */
306
- transform: translateX(-100%) !important;
307
- /* Force ALL to slide from LEFT with !important */
308
- }
309
-
310
- /* Remove specific transforms and force left slide */
311
- .flyout-from-right,
312
- .flyout-from-left,
313
- .flyout-from-top {
314
321
  transform: translateX(-100%) !important;
315
322
  }
316
323
 
@@ -318,7 +325,7 @@ body {
318
325
  transform: translate(0, 0) !important;
319
326
  }
320
327
 
321
- /* Reset Top Menu Horizontal Layout to Vertical for Mobile */
328
+
322
329
  .flyout-from-top .flyout-links {
323
330
  flex-direction: column;
324
331
  align-items: stretch;
@@ -332,7 +339,7 @@ body {
332
339
  .flyout-from-top .flyout-links>li>a,
333
340
  .flyout-from-top .flyout-links>li>.submenu-toggle {
334
341
  font-size: 2rem;
335
- /* Restore larger size */
342
+
336
343
  justify-content: space-between;
337
344
  }
338
345
 
@@ -357,6 +364,6 @@ body {
357
364
  .flyout-from-top .submenu a {
358
365
  font-size: 1.25rem;
359
366
  justify-content: space-between;
360
- /* Match default behavior */
367
+
361
368
  }
362
369
  }
package/css/form.scss CHANGED
@@ -1,10 +1,6 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
3
 
4
- // ─────────────────────────────────────────────────────────────────────────────
5
- // Keyframes
6
- // ─────────────────────────────────────────────────────────────────────────────
7
-
8
4
  @keyframes field-error-shake {
9
5
  0%, 100% { transform: translateX(0); }
10
6
  18% { transform: translateX(-5px); }
@@ -35,10 +31,6 @@
35
31
  }
36
32
  }
37
33
 
38
- // ─────────────────────────────────────────────────────────────────────────────
39
- // Base field styles
40
- // ─────────────────────────────────────────────────────────────────────────────
41
-
42
34
  textarea, select, .select .dropdown, input {
43
35
  width: 100%;
44
36
  border: 1.5px solid var(--divider);
@@ -99,10 +91,6 @@ select {
99
91
  cursor: pointer;
100
92
  }
101
93
 
102
- // ─────────────────────────────────────────────────────────────────────────────
103
- // Custom select / dropdown
104
- // ─────────────────────────────────────────────────────────────────────────────
105
-
106
94
  .select-group {
107
95
  .dropdown {
108
96
  position: relative;
@@ -286,10 +274,6 @@ select {
286
274
  }
287
275
  }
288
276
 
289
- // ─────────────────────────────────────────────────────────────────────────────
290
- // Form group — label + field + hint
291
- // ─────────────────────────────────────────────────────────────────────────────
292
-
293
277
  .form-group {
294
278
  display: flex;
295
279
  flex-direction: column;
@@ -383,10 +367,6 @@ select {
383
367
  }
384
368
  }
385
369
 
386
- // ─────────────────────────────────────────────────────────────────────────────
387
- // Input group — prefix / suffix addons
388
- // ─────────────────────────────────────────────────────────────────────────────
389
-
390
370
  .input-group {
391
371
  display: flex;
392
372
 
@@ -431,10 +411,6 @@ select {
431
411
  }
432
412
  }
433
413
 
434
- // ─────────────────────────────────────────────────────────────────────────────
435
- // Readonly
436
- // ─────────────────────────────────────────────────────────────────────────────
437
-
438
414
  input[readonly], textarea[readonly] {
439
415
  background-color: var(--secondary-background);
440
416
  color: var(--secondary-text);
@@ -443,10 +419,6 @@ input[readonly], textarea[readonly] {
443
419
  border-style: dashed;
444
420
  }
445
421
 
446
- // ─────────────────────────────────────────────────────────────────────────────
447
- // Size variants
448
- // ─────────────────────────────────────────────────────────────────────────────
449
-
450
422
  input.input-sm, textarea.input-sm {
451
423
  min-height: calc($form-height * 0.85);
452
424
  font-size: 0.875rem;
package/css/gallery.scss CHANGED
@@ -1,5 +1,6 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
+ @use "mixins" as *;
3
4
 
4
5
  .masonry-container {
5
6
  display: flex;
@@ -44,8 +45,7 @@
44
45
  }
45
46
 
46
47
  &:focus-visible {
47
- outline: 2px solid var(--accent-color);
48
- outline-offset: 2px;
48
+ @include focus-ring();
49
49
  }
50
50
  }
51
51
 
@@ -96,7 +96,6 @@
96
96
  font-size: 0.8125rem;
97
97
  }
98
98
 
99
- // Staggered entrance for items
100
99
  @media (prefers-reduced-motion: no-preference) {
101
100
  .masonry-item {
102
101
  animation: masonry-in 0.4s cubic-bezier(0.2, 0, 0, 1) both;
@@ -1,13 +1,12 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
+ @use "mixins" as *;
3
4
 
4
5
  .group-picker {
5
6
  position: relative;
6
7
  width: 100%;
7
8
  color: var(--primary-text);
8
9
 
9
- // ─── Selection summary ─────────────────────────────────────────────────────
10
-
11
10
  &__selection {
12
11
  display: flex;
13
12
  flex-wrap: wrap;
@@ -17,18 +16,16 @@
17
16
  padding: calc($spacing * 0.35) calc($spacing * 0.6);
18
17
  background: var(--background);
19
18
  border: 1px solid var(--divider);
20
- border-radius: calc($border-radius / 2);
19
+ border-radius: $radius-sm;
21
20
  margin-bottom: calc($spacing * 0.75);
22
21
  box-shadow: $shadow;
23
22
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
24
23
 
25
- // Chips inside use gap — suppress their own margins
26
24
  .chip {
27
25
  margin: 0;
28
26
  animation: gp-chip-in 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) both;
29
27
  }
30
28
 
31
- // Fix font icon centering inside the absolute close button
32
29
  .chip.closeable button {
33
30
  display: inline-flex;
34
31
  align-items: center;
@@ -48,15 +45,13 @@
48
45
 
49
46
  &:focus-within {
50
47
  border-color: var(--accent-color);
51
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color) 15%, transparent);
48
+ @include focus-glow(15%);
52
49
  }
53
50
  }
54
51
 
55
- // Parent chip — solid accent fill
56
- // Specificity 0,3,0 via .chip.group-picker__chip--parent → beats .chips .chip (0,2,0)
57
52
  &__selection .chip.group-picker__chip--parent {
58
53
  background: var(--accent-color);
59
- color: var(--background); // same pattern as button.scss button-variant
54
+ color: var(--background);
60
55
 
61
56
  button {
62
57
  background: color-mix(in srgb, var(--accent-color) 78%, black);
@@ -64,9 +59,6 @@
64
59
  }
65
60
  }
66
61
 
67
- // ─── Search ────────────────────────────────────────────────────────────────
68
- // Basix <input> handles border, focus ring, shadow — we only position the icon
69
-
70
62
  &__search {
71
63
  position: relative;
72
64
  margin-bottom: calc($spacing * 0.5);
@@ -88,21 +80,17 @@
88
80
  z-index: 1;
89
81
  }
90
82
 
91
- // ─── List container ────────────────────────────────────────────────────────
92
-
93
83
  &__list {
94
84
  max-height: 420px;
95
85
  overflow-y: auto;
96
86
  overflow-x: hidden;
97
87
  -webkit-overflow-scrolling: touch;
98
88
  border: 1px solid var(--divider);
99
- border-radius: calc($border-radius / 2);
89
+ border-radius: $radius-sm;
100
90
  background: var(--background);
101
91
  box-shadow: $shadow;
102
92
  }
103
93
 
104
- // ─── Empty state ───────────────────────────────────────────────────────────
105
-
106
94
  &__empty {
107
95
  display: flex;
108
96
  flex-direction: column;
@@ -120,8 +108,6 @@
120
108
  }
121
109
  }
122
110
 
123
- // ─── Group row ─────────────────────────────────────────────────────────────
124
-
125
111
  &__group {
126
112
  border-bottom: 1px solid var(--divider);
127
113
 
@@ -129,7 +115,6 @@
129
115
  border-bottom: none;
130
116
  }
131
117
 
132
- // Expanded state: tint the header and accent the label
133
118
  &.is-expanded > .group-picker__group-header {
134
119
  background: color-mix(in srgb, var(--accent-color) 4%, transparent);
135
120
 
@@ -158,7 +143,6 @@
158
143
  }
159
144
  }
160
145
 
161
- // Chevron — accent color when expanded, eased rotation
162
146
  &__chevron {
163
147
  flex-shrink: 0;
164
148
  font-size: 1rem;
@@ -190,7 +174,6 @@
190
174
  }
191
175
  }
192
176
 
193
- // Action button — pill style, overrides Basix <button> base where needed
194
177
  &__group-action {
195
178
  flex-shrink: 0;
196
179
  font-size: 0.6875rem;
@@ -217,7 +200,6 @@
217
200
  transform: scale(0.94);
218
201
  }
219
202
 
220
- // When button-primary is added by JS — keep pill shape
221
203
  &.button-primary {
222
204
  border-radius: calc($border-radius * 3);
223
205
  font-size: 0.6875rem;
@@ -230,8 +212,6 @@
230
212
  }
231
213
  }
232
214
 
233
- // ─── Leaf group ────────────────────────────────────────────────────────────
234
-
235
215
  &__group.is-leaf {
236
216
  cursor: pointer;
237
217
 
@@ -249,7 +229,6 @@
249
229
  }
250
230
  }
251
231
 
252
- // Leaf check icon — springs in on select
253
232
  &__leaf-check {
254
233
  flex-shrink: 0;
255
234
  font-size: 1.1rem;
@@ -260,8 +239,6 @@
260
239
  transform 0.22s cubic-bezier(0.34, 1.56, 0.64, 1);
261
240
  }
262
241
 
263
- // ─── Subgroups accordion ───────────────────────────────────────────────────
264
-
265
242
  &__subgroups {
266
243
  height: 0;
267
244
  overflow: hidden;
@@ -274,20 +251,17 @@
274
251
  }
275
252
  }
276
253
 
277
- // Subgroup chip list — indented to align with label, not chevron
278
254
  &__subgroup-list {
279
255
  display: flex;
280
256
  flex-wrap: wrap;
281
257
  gap: calc($spacing * 0.3);
282
258
  padding: calc($spacing * 0.3) calc($spacing * 0.85) calc($spacing * 0.75) calc($spacing * 2.35);
283
259
 
284
- // Chips use gap — suppress their own margins
285
260
  .chip {
286
261
  margin: 0;
287
262
  }
288
263
  }
289
264
 
290
- // Subgroup chip — selected/disabled states on top of .chip.clickable
291
265
  &__subgroup {
292
266
  transition: background 0.15s ease, color 0.15s ease, outline-color 0.15s ease;
293
267
 
@@ -313,8 +287,6 @@
313
287
  }
314
288
  }
315
289
 
316
- // ─── Chip entrance animation ─────────────────────────────────────────────────
317
-
318
290
  @keyframes gp-chip-in {
319
291
  from {
320
292
  opacity: 0;
@@ -326,8 +298,6 @@
326
298
  }
327
299
  }
328
300
 
329
- // ─── Responsive ──────────────────────────────────────────────────────────────
330
-
331
301
  @media (max-width: 768px) {
332
302
  .group-picker {
333
303
  &__list {
package/css/icons.scss CHANGED
@@ -1,10 +1,8 @@
1
-
2
1
  @font-face {
3
2
  font-family: "Material Symbols Outlined 24pt";
4
3
  src: url("../fonts/MaterialSymbolsOutlined.woff2") format("woff2");
5
4
  }
6
5
 
7
-
8
6
  .icon {
9
7
  font-family: "Material Symbols Outlined 24pt", serif;
10
8
  font-style: normal;
@@ -17,7 +15,6 @@
17
15
  -moz-osx-font-smoothing: grayscale;
18
16
  }
19
17
 
20
-
21
18
  .icon-delete::before {
22
19
  content: "\e872";
23
20
  }
package/css/lightbox.scss CHANGED
@@ -95,7 +95,7 @@
95
95
  max-width: 100%;
96
96
  max-height: calc(90dvh - 3.5rem);
97
97
  cursor: zoom-in;
98
- border-radius: calc($border-radius * 2);
98
+ border-radius: $radius-lg;
99
99
  overflow: hidden;
100
100
  background: rgba(255, 255, 255, 0.04);
101
101
 
@@ -149,7 +149,6 @@
149
149
  justify-content: center;
150
150
  z-index: 1;
151
151
 
152
- // Override spinner colors for the dark overlay
153
152
  .spinner {
154
153
  border-color: rgba(255, 255, 255, 0.15);
155
154
  border-top-color: rgba(255, 255, 255, 0.7);
@@ -163,7 +162,7 @@
163
162
  object-fit: contain;
164
163
  opacity: 0;
165
164
  transition: opacity 0.25s ease;
166
- border-radius: calc($border-radius * 2);
165
+ border-radius: $radius-lg;
167
166
  user-select: none;
168
167
  -webkit-user-drag: none;
169
168
 
@@ -196,7 +195,6 @@
196
195
  user-select: none;
197
196
  }
198
197
 
199
- // Prev/Next buttons — glass pill, matches carousel style
200
198
  .lightbox-prev,
201
199
  .lightbox-next {
202
200
  position: fixed;
@@ -0,0 +1,8 @@
1
+ @mixin focus-ring($offset: 2px) {
2
+ outline: 2px solid var(--accent-color);
3
+ outline-offset: $offset;
4
+ }
5
+
6
+ @mixin focus-glow($tint: 35%, $size: 3px, $color: var(--accent-color)) {
7
+ box-shadow: 0 0 0 #{$size} color-mix(in srgb, #{$color} #{$tint}, transparent);
8
+ }
package/css/modal.scss CHANGED
@@ -35,7 +35,7 @@
35
35
  .modal {
36
36
  background: var(--background);
37
37
  border: 1px solid var(--divider);
38
- border-radius: calc($border-radius * 2);
38
+ border-radius: $radius-lg;
39
39
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15), 0 4px 16px rgba(0, 0, 0, 0.08);
40
40
  padding: $spacing;
41
41
  position: fixed;
@@ -70,14 +70,14 @@
70
70
  margin: (-$spacing) (-$spacing) $spacing;
71
71
  padding: $spacing;
72
72
  border-bottom: 1px solid var(--divider);
73
- border-radius: calc($border-radius * 2) calc($border-radius * 2) 0 0;
73
+ border-radius: $radius-lg $radius-lg 0 0;
74
74
  }
75
75
 
76
76
  .footer {
77
77
  margin: $spacing (-$spacing) (-$spacing);
78
78
  padding: $spacing;
79
79
  border-top: 1px solid var(--divider);
80
- border-radius: 0 0 calc($border-radius * 2) calc($border-radius * 2);
80
+ border-radius: 0 0 $radius-lg $radius-lg;
81
81
  display: flex;
82
82
  justify-content: flex-end;
83
83
 
@@ -1,4 +1,9 @@
1
1
  $spacing: 1rem;
2
2
  $border-radius: 0.4rem;
3
3
  $form-height: 2rem;
4
- $shadow: 0 1px 2px rgba(56, 65, 74, .15);
4
+ $shadow: 0 1px 2px rgba(56, 65, 74, .15);
5
+
6
+ $radius-sm: calc($border-radius / 2);
7
+ $radius-lg: calc($border-radius * 2);
8
+ $radius-panel: calc($border-radius * 2.5);
9
+ $radius-xl: calc($border-radius * 4);