@dodlhuat/basix 1.3.2 → 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 +13 -7
  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 -54
  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 +4 -6
  16. package/css/datepicker.scss +4 -7
  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 +66 -44
  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 +2 -6
  36. package/css/sidebar-nav.scss +0 -12
  37. package/css/stepper.scss +0 -4
  38. package/css/style.css +63 -68
  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 +6 -7
  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 -0
  69. package/js/editor.js +9 -3
  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 +3 -0
  75. package/js/gallery.js +22 -24
  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 -0
  87. package/js/push-menu.js +22 -35
  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 +3 -0
  107. package/js/timepicker.js +81 -67
  108. package/js/toast.d.ts +3 -0
  109. package/js/toast.js +24 -15
  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,21 +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
109
  }
116
110
 
117
- /* Directional Variants */
118
111
  .flyout-from-right {
119
112
  top: 0;
120
113
  right: 0;
@@ -137,37 +130,56 @@ body {
137
130
  transform: translate(0, 0);
138
131
  }
139
132
 
140
- /* Flyout Header */
141
133
  .flyout-header {
142
134
  display: flex;
143
135
  justify-content: space-between;
144
136
  align-items: center;
145
- margin-bottom: 3rem;
137
+ margin-bottom: 2.5rem;
138
+ padding-bottom: 1.25rem;
139
+ border-bottom: 1px solid rgba(255, 255, 255, 0.07);
146
140
  }
147
141
 
148
142
  .flyout-title {
149
- font-size: 1.25rem;
143
+ font-size: 0.65rem;
150
144
  font-weight: 600;
151
- color: #94a3b8;
145
+ color: rgba(255, 255, 255, 0.35);
152
146
  text-transform: uppercase;
153
- letter-spacing: 0.1em;
147
+ letter-spacing: 0.14em;
154
148
  }
155
149
 
156
150
  .close-menu {
157
151
  background: none;
158
152
  border: none;
159
- color: var(--flyout-text);
153
+ color: rgba(255, 255, 255, 0.4);
160
154
  cursor: pointer;
161
- padding: 0.5rem;
162
- transition: transform 0.2s, color 0.2s;
155
+ padding: 0.3rem;
156
+ line-height: 0;
157
+ transition: color 0.2s;
163
158
  }
164
159
 
165
160
  .close-menu:hover {
166
- transform: rotate(90deg);
167
- 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
+ }
168
181
  }
169
182
 
170
- /* Flyout Links */
171
183
  .flyout-links {
172
184
  list-style: none;
173
185
  flex-grow: 1;
@@ -188,7 +200,7 @@ body {
188
200
  border: none;
189
201
  font-size: 2rem;
190
202
  font-weight: 600;
191
- color: var(--flyout-text);
203
+ color: rgba(255, 255, 255, 0.6);
192
204
  text-decoration: none;
193
205
  cursor: pointer;
194
206
  font-family: inherit;
@@ -204,28 +216,33 @@ body {
204
216
  transform: translateY(0);
205
217
  }
206
218
 
207
- .flyout-links a:hover,
208
- .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 {
209
225
  color: var(--accent-color);
210
226
  }
211
227
 
212
228
  .chevron {
213
- transition: transform 0.3s;
214
- 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;
215
232
  }
216
233
 
217
234
  .submenu-toggle.active .chevron {
218
235
  transform: rotate(180deg);
236
+ opacity: 1;
219
237
  }
220
238
 
221
- /* Submenu */
222
239
  .submenu {
223
240
  list-style: none;
224
241
  max-height: 0;
225
242
  overflow: hidden;
226
243
  transition: max-height 0.3s ease-out;
227
244
  padding-left: 1rem;
228
- border-left: 1px solid rgba(255, 255, 255, 0.1);
245
+ border-left: 1px solid rgba(255, 255, 255, 0.15);
229
246
  margin-top: 0;
230
247
  }
231
248
 
@@ -235,6 +252,7 @@ body {
235
252
  transition: max-height 0.4s cubic-bezier(0.16, 1, 0.3, 1);
236
253
  }
237
254
 
255
+
238
256
  .submenu li {
239
257
  margin-bottom: 0.5rem;
240
258
  }
@@ -242,29 +260,34 @@ body {
242
260
  .submenu a {
243
261
  font-size: 1.25rem;
244
262
  font-weight: 400;
245
- color: #cbd5e1;
246
- transform: none !important; /* parent `.flyout-menu.is-open .flyout-links a` slides in; submenu items must not */
263
+ color: rgba(255, 255, 255, 0.45);
264
+ transform: none !important;
265
+ transition: color 0.2s !important;
247
266
  transition-delay: 0s !important;
267
+
268
+ &:hover { color: #fff; }
248
269
  }
249
270
 
250
271
  .submenu .submenu-toggle {
251
272
  font-size: 1.25rem;
252
273
  font-weight: 400;
253
- color: #cbd5e1;
274
+ color: rgba(255, 255, 255, 0.45);
254
275
  transform: none !important;
255
276
  transition-delay: 0s !important;
256
277
  padding: 0;
257
278
  margin: 0;
279
+
280
+ &:hover { color: #fff; }
258
281
  }
259
282
 
260
- /* Flyout Footer */
261
283
  .flyout-footer {
262
- padding-top: 2rem;
263
- border-top: 1px solid var(--flyout-border);
264
- color: #64748b;
265
- 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;
266
289
  opacity: 0;
267
- transform: translateY(20px);
290
+ transform: translateY(12px);
268
291
  transition: opacity 0.4s, transform 0.4s;
269
292
  transition-delay: var(--delay);
270
293
  }
@@ -274,7 +297,6 @@ body {
274
297
  transform: translateY(0);
275
298
  }
276
299
 
277
- /* Mobile Responsiveness */
278
300
  @media (max-width: 480px) {
279
301
  :root {
280
302
  --menu-width: 100%;
@@ -284,7 +306,7 @@ body {
284
306
  font-size: 2rem;
285
307
  }
286
308
 
287
- /* Force Fullscreen for all directions */
309
+
288
310
  .flyout-from-right,
289
311
  .flyout-from-left,
290
312
  .flyout-from-top {
@@ -303,7 +325,7 @@ body {
303
325
  transform: translate(0, 0) !important;
304
326
  }
305
327
 
306
- /* Reset Top Menu Horizontal Layout to Vertical for Mobile */
328
+
307
329
  .flyout-from-top .flyout-links {
308
330
  flex-direction: column;
309
331
  align-items: stretch;
@@ -317,7 +339,7 @@ body {
317
339
  .flyout-from-top .flyout-links>li>a,
318
340
  .flyout-from-top .flyout-links>li>.submenu-toggle {
319
341
  font-size: 2rem;
320
- /* Restore larger size */
342
+
321
343
  justify-content: space-between;
322
344
  }
323
345
 
@@ -342,6 +364,6 @@ body {
342
364
  .flyout-from-top .submenu a {
343
365
  font-size: 1.25rem;
344
366
  justify-content: space-between;
345
- /* Match default behavior */
367
+
346
368
  }
347
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);