@dodlhuat/basix 1.4.2 → 1.5.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 (121) hide show
  1. package/README.md +55 -9
  2. package/css/alert.scss +9 -9
  3. package/css/badge.scss +5 -25
  4. package/css/bottom-sheet.scss +2 -6
  5. package/css/breadcrumb.scss +18 -9
  6. package/css/calendar.scss +19 -29
  7. package/css/carousel.scss +3 -3
  8. package/css/chart.scss +1 -6
  9. package/css/checkbox.scss +1 -1
  10. package/css/chips.scss +13 -23
  11. package/css/code-viewer.scss +2 -2
  12. package/css/color-picker.scss +3 -5
  13. package/css/context-menu.scss +3 -8
  14. package/css/datepicker.scss +84 -71
  15. package/css/defaults.scss +25 -0
  16. package/css/docs.scss +6 -6
  17. package/css/dropdown.scss +3 -8
  18. package/css/editor.scss +15 -18
  19. package/css/file-uploader.scss +6 -17
  20. package/css/flyout-menu.scss +5 -1
  21. package/css/form.scss +43 -57
  22. package/css/gallery.scss +15 -0
  23. package/css/group-picker.scss +28 -17
  24. package/css/icons.scss +7 -327
  25. package/css/lightbox.scss +7 -7
  26. package/css/mixins.scss +77 -0
  27. package/css/modal.scss +4 -8
  28. package/css/parameters.scss +8 -2
  29. package/css/placeholder.scss +2 -17
  30. package/css/popover.scss +2 -7
  31. package/css/properties.scss +0 -5
  32. package/css/push-menu.scss +1 -1
  33. package/css/range-slider.scss +7 -6
  34. package/css/stepper.scss +4 -3
  35. package/css/style.css +279 -554
  36. package/css/style.css.map +1 -1
  37. package/css/style.min.css +1 -1
  38. package/css/style.min.css.map +1 -1
  39. package/css/tabs.scss +3 -7
  40. package/css/timepicker.scss +3 -3
  41. package/css/tooltip.scss +1 -1
  42. package/css/typography.scss +3 -3
  43. package/css/virtual-dropdown.scss +12 -27
  44. package/js/bottom-sheet.d.ts +5 -5
  45. package/js/bottom-sheet.js +41 -58
  46. package/js/calendar.d.ts +1 -2
  47. package/js/calendar.js +77 -84
  48. package/js/carousel.d.ts +2 -1
  49. package/js/carousel.js +25 -16
  50. package/js/chart.d.ts +1 -1
  51. package/js/chart.js +104 -65
  52. package/js/code-viewer.d.ts +1 -1
  53. package/js/code-viewer.js +7 -18
  54. package/js/color-picker.d.ts +2 -2
  55. package/js/color-picker.js +20 -22
  56. package/js/context-menu.d.ts +1 -1
  57. package/js/context-menu.js +10 -12
  58. package/js/datepicker.d.ts +14 -3
  59. package/js/datepicker.js +180 -99
  60. package/js/docs-nav.js +1 -1
  61. package/js/dropdown.d.ts +1 -1
  62. package/js/dropdown.js +4 -5
  63. package/js/editor.d.ts +1 -1
  64. package/js/editor.js +30 -34
  65. package/js/file-uploader.d.ts +2 -9
  66. package/js/file-uploader.js +57 -86
  67. package/js/flyout-menu.d.ts +3 -3
  68. package/js/flyout-menu.js +20 -22
  69. package/js/gallery.d.ts +6 -2
  70. package/js/gallery.js +49 -20
  71. package/js/group-picker.d.ts +2 -1
  72. package/js/group-picker.js +30 -34
  73. package/js/lightbox.d.ts +5 -3
  74. package/js/lightbox.js +36 -31
  75. package/js/listeners.d.ts +7 -0
  76. package/js/listeners.js +14 -0
  77. package/js/modal.d.ts +4 -1
  78. package/js/modal.js +17 -22
  79. package/js/popover.d.ts +2 -2
  80. package/js/popover.js +42 -37
  81. package/js/position.js +3 -5
  82. package/js/push-menu.d.ts +8 -2
  83. package/js/push-menu.js +34 -23
  84. package/js/range-slider.d.ts +2 -2
  85. package/js/range-slider.js +7 -6
  86. package/js/scroll.js +4 -7
  87. package/js/scrollbar.d.ts +3 -3
  88. package/js/scrollbar.js +39 -42
  89. package/js/select.d.ts +1 -1
  90. package/js/select.js +20 -24
  91. package/js/sidebar-nav.d.ts +2 -1
  92. package/js/sidebar-nav.js +15 -10
  93. package/js/stepper.d.ts +1 -1
  94. package/js/stepper.js +9 -11
  95. package/js/table.d.ts +1 -1
  96. package/js/table.js +24 -23
  97. package/js/tabs.d.ts +1 -1
  98. package/js/tabs.js +10 -17
  99. package/js/theme.d.ts +1 -0
  100. package/js/theme.js +6 -15
  101. package/js/timepicker.d.ts +8 -6
  102. package/js/timepicker.js +36 -36
  103. package/js/toast.d.ts +4 -1
  104. package/js/toast.js +13 -5
  105. package/js/tooltip.d.ts +1 -4
  106. package/js/tooltip.js +14 -23
  107. package/js/tree.d.ts +0 -1
  108. package/js/tree.js +6 -11
  109. package/js/utils.js +7 -8
  110. package/js/virtual-dropdown.d.ts +1 -1
  111. package/js/virtual-dropdown.js +26 -28
  112. package/package.json +2 -1
  113. package/svg-icons/chevron_right.svg +1 -0
  114. package/svg-icons/keyboard_arrow_down.svg +1 -0
  115. package/css/calendar.css +0 -928
  116. package/css/guitar-chords.css +0 -251
  117. package/fonts/MaterialSymbolsOutlined.woff2 +0 -0
  118. package/js/form-builder.js +0 -107
  119. package/js/guitar-chords.js +0 -268
  120. package/js/lazy-loader.js +0 -121
  121. package/js/request.js +0 -51
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Basix 1.4.2
1
+ # Basix 1.5.0
2
2
 
3
3
  Basix is intended as a starter for the rapid development of a design. Each design element can be added individually to
4
4
  include only the data required. It is using plain javascript / typescript and therefore is not dependent on any plugin.
@@ -9,6 +9,52 @@ A demo can be found here: <a href="http://www.andibauer.at/basix/" target="_blan
9
9
 
10
10
  ## Migration Guide
11
11
 
12
+ ### 1.4.3 → 1.5.0
13
+
14
+ #### Breaking changes
15
+
16
+ **Font icons removed — SVG sprite is now the only icon system**
17
+
18
+ The `.icon` base class, all `.icon-*` glyph classes, and the bundled `MaterialSymbolsOutlined.woff2` font have been removed from `icons.scss` and `fonts/`. Every component that rendered a font-icon glyph now renders an inline `<svg><use href="svg-icons/icons.svg#name"/></svg>` instead. If your own markup used the font classes directly, replace them:
19
+
20
+ ```html
21
+ <!-- Before (1.4.3) -->
22
+ <span class="icon icon-close"></span>
23
+
24
+ <!-- After (1.5.0) -->
25
+ <svg class="icon-svg"><use href="svg-icons/icons.svg#close"/></svg>
26
+ ```
27
+
28
+ A handful of glyph names used by the font don't exist under the same name in the sprite; use the sprite's equivalents:
29
+
30
+ | Font glyph | SVG sprite equivalent |
31
+ |---|---|
32
+ | `icon-navigate_before` / `icon-navigate_next` | `chevron_left` / `chevron_right` |
33
+ | `icon-expand_more` | `keyboard_arrow_down` |
34
+ | `icon-light` / `icon-dark` | `light_mode` / `dark_mode` |
35
+
36
+ #### Other changes
37
+
38
+ - **`BottomSheet`, `Lightbox`, `GroupPicker`, `Modal`, `Toast`, `SidebarNav`, `Carousel`, `Select`** — gained an `iconBasePath` option (default `'svg-icons/'`) controlling where each component looks for the SVG sprite, matching the existing `Calendar`/`Stepper` convention.
39
+ - **`PushMenu.init()`** now accepts an optional `{ iconBasePath }` argument (previously took no arguments).
40
+ - **`Lightbox.bind()`** now accepts an optional second `iconBasePath` argument, threaded through to every lightbox it opens.
41
+ - **New design tokens** in `parameters.scss`: a 3-step tint scale (`$tint-subtle`/`$tint-medium`/`$tint-strong`) for state-color backgrounds, and an expanded, properly-ordered radius scale (`$radius-xs/sm/md/lg/panel/xl`). Several components' corner radii and background tints shifted slightly to align to these scales — no component's visual language changed, just consolidated toward consistent steps.
42
+ - **New shared mixins** in `mixins.scss`: `float-panel` (floating dropdown/menu/popover shell), `hide-scrollbar`, `tinted-tag` (badge/chip tint), `muted-icon-color` (close-button hover).
43
+ - **Bug fix** — `DatePicker`'s day-of-week headers and clock labels referenced an undefined `--text-muted` custom property (silently falling back to inherited text color). Fixed to use the existing `--secondary-text` token.
44
+ - **CI** — added a GitHub Actions workflow (lint, typecheck, build, and a check that committed `js/`/`css` build output matches source) and `sass` is now a real `devDependency` instead of relying on a global install.
45
+
46
+ ### 1.4.2 → 1.4.3
47
+
48
+ No breaking changes.
49
+
50
+ - **`DatePicker`** — the `timePicker: true` hour/minute picker is now an Android-style analog clock instead of up/down spinners. Tap or drag to pick the hour, then the minute, on a 24-hour dual-ring face (outer ring = even hours, inner ring = odd hours). `selectedHours`/`selectedMinutes` and all existing options are unchanged.
51
+ - **`DatePicker`** — clock interactions (hour/minute selection, AM/PM-less 24h switching) now only re-render the time picker instead of rebuilding the whole calendar, avoiding unnecessary DOM churn.
52
+ - **Internal** — the remaining per-component `AbortController` boilerplate (introduced in 1.4.1) has been consolidated into a small shared `ListenerGroup` utility (`src/listeners.ts`) used by every component's event lifecycle.
53
+ - **CSS bug fix** — several component hover states (`DatePicker`'s Set button and nav buttons, `CodeViewer`'s copy button, `FlyoutMenu`'s close button) were silently overridden by the global button reset due to a CSS specificity collision, so the intended hover color/background never rendered. Fixed by scoping each rule against the global reset.
54
+ - **CSS cleanup** — consolidated duplicated `box-shadow` glow/focus-ring declarations across `Calendar`, `Editor`, `Stepper`, `RangeSlider`, `TimePicker`, form fields, and `VirtualDropdown` into shared mixins (`field-shadow-rest`, `field-shadow-hover`, `field-shadow-focus`) in `mixins.scss`. No visual change.
55
+ - **Cleanup** — removed unused legacy files (`form-builder.js`, `guitar-chords.js`/`.css`, `lazy-loader.js`, `request.js`) and a stale, pre-integration copy of `calendar.css`, plus dead `.datepicker-select` CSS.
56
+ - **Type fixes** — resolved two pre-existing TypeScript errors in `Tabs` and `VirtualDropdown` (`keydown` listeners typed against `Element` instead of `HTMLElement`).
57
+
12
58
  ### 1.4.1 → 1.4.2
13
59
 
14
60
  No breaking changes.
@@ -112,20 +158,20 @@ The Card component is a CSS-only component that creates visually contained conte
112
158
 
113
159
  ### Icons
114
160
 
115
- Basix ships icons in two formats:
116
-
117
- **Font icons** — a reduced Google Material Icon font (~5.5 KB vs the full 242.5 KB). Use the `.icon` class with a modifier.
161
+ Basix ships the full Google Material Icon set (~6,400+ icons) as a single `svg-icons/icons.svg` sprite. Reference any icon by name with `<use>`, and style size/color with the `.icon-svg` class — it inherits `currentColor`, so the icon follows the surrounding text color automatically.
118
162
 
119
163
  ``` html
120
- <span class="icon icon-home"></span>
164
+ <svg class="icon-svg"><use href="svg-icons/icons.svg#home"/></svg>
121
165
  ```
122
166
 
123
- **SVG sprite** the full Google Material Icon set (~6,400+ icons) in a single `svg-icons/icons.svg` sprite. Preferred for consistent sizing, `currentColor` inheritance, and use inside JS-generated markup.
167
+ Components that render icons from JS (`Modal`, `Toast`, `BottomSheet`, `Lightbox`, `Carousel`, `GroupPicker`, `SidebarNav`, `Calendar`, `Stepper`, `PushMenu`, `Select`, `ContextMenu`) accept an `iconBasePath` option (default `'svg-icons/'`) so you can point them at the sprite's location relative to your page:
124
168
 
125
- ``` html
126
- <svg class="icon-svg"><use href="svg-icons/icons.svg#home"/></svg>
169
+ ``` js
170
+ new Modal({ content: '…', iconBasePath: '../svg-icons/' });
127
171
  ```
128
172
 
173
+ A couple of purely-decorative icons that need to render with zero markup (the `Breadcrumb` separator, the native `<select>` dropdown arrow) use `mask-image` against small standalone SVGs (`svg-icons/chevron_right.svg`, `svg-icons/keyboard_arrow_down.svg`) instead of the sprite, since sprite symbols are only instantiable via `<use>`.
174
+
129
175
  ---
130
176
 
131
177
  ## Forms
@@ -431,7 +477,7 @@ The Chips component displays small interactive elements like tags or filters. CS
431
477
  <div class="chip clickable">Clickable Chip</div>
432
478
  <div class="chip closeable">
433
479
  Closeable Chip
434
- <button class="close"><span class="icon icon-close"></span></button>
480
+ <button class="close"><svg class="icon-svg"><use href="svg-icons/icons.svg#close"/></svg></button>
435
481
  </div>
436
482
  </div>
437
483
  ```
package/css/alert.scss CHANGED
@@ -17,7 +17,7 @@ $alert-border-width: 4px;
17
17
  }
18
18
 
19
19
  .alert-close:hover {
20
- background: color-mix(in srgb, $accent 12%, transparent);
20
+ background: color-mix(in srgb, $accent $tint-medium, transparent);
21
21
  }
22
22
  }
23
23
 
@@ -48,28 +48,28 @@ $alert-border-width: 4px;
48
48
  &-info {
49
49
  @include alert-variant(
50
50
  var(--accent-color),
51
- color-mix(in srgb, var(--accent-color) 8%, var(--background))
51
+ color-mix(in srgb, var(--accent-color) $tint-subtle, var(--background))
52
52
  );
53
53
  }
54
54
 
55
55
  &-success {
56
56
  @include alert-variant(
57
57
  var(--success),
58
- color-mix(in srgb, var(--success) 8%, var(--background))
58
+ color-mix(in srgb, var(--success) $tint-subtle, var(--background))
59
59
  );
60
60
  }
61
61
 
62
62
  &-warning {
63
63
  @include alert-variant(
64
64
  var(--warning),
65
- color-mix(in srgb, var(--warning) 8%, var(--background))
65
+ color-mix(in srgb, var(--warning) $tint-subtle, var(--background))
66
66
  );
67
67
  }
68
68
 
69
69
  &-error {
70
70
  @include alert-variant(
71
71
  var(--error),
72
- color-mix(in srgb, var(--error) 8%, var(--background))
72
+ color-mix(in srgb, var(--error) $tint-subtle, var(--background))
73
73
  );
74
74
  }
75
75
 
@@ -110,28 +110,28 @@ $alert-border-width: 4px;
110
110
  &-info {
111
111
  @include alert-variant(
112
112
  var(--accent-color),
113
- color-mix(in srgb, var(--accent-color) 10%, var(--background))
113
+ color-mix(in srgb, var(--accent-color) $tint-medium, var(--background))
114
114
  );
115
115
  }
116
116
 
117
117
  &-success {
118
118
  @include alert-variant(
119
119
  var(--success),
120
- color-mix(in srgb, var(--success) 10%, var(--background))
120
+ color-mix(in srgb, var(--success) $tint-medium, var(--background))
121
121
  );
122
122
  }
123
123
 
124
124
  &-warning {
125
125
  @include alert-variant(
126
126
  var(--warning),
127
- color-mix(in srgb, var(--warning) 10%, var(--background))
127
+ color-mix(in srgb, var(--warning) $tint-medium, var(--background))
128
128
  );
129
129
  }
130
130
 
131
131
  &-error {
132
132
  @include alert-variant(
133
133
  var(--error),
134
- color-mix(in srgb, var(--error) 10%, var(--background))
134
+ color-mix(in srgb, var(--error) $tint-medium, var(--background))
135
135
  );
136
136
  }
137
137
  }
package/css/badge.scss CHANGED
@@ -1,10 +1,6 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
-
4
- @mixin badge-variant($color, $bg) {
5
- background: $bg;
6
- color: $color;
7
- }
3
+ @use "mixins" as *;
8
4
 
9
5
  .badge {
10
6
  display: inline-flex;
@@ -24,35 +20,19 @@
24
20
  color: var(--secondary-text);
25
21
 
26
22
  &-info {
27
- @include badge-variant(
28
- var(--accent-color),
29
- color-mix(in srgb, var(--accent-color) 12%, var(--background))
30
- );
31
- border-color: color-mix(in srgb, var(--accent-color) 20%, transparent);
23
+ @include tinted-tag(var(--accent-color));
32
24
  }
33
25
 
34
26
  &-success {
35
- @include badge-variant(
36
- var(--success),
37
- color-mix(in srgb, var(--success) 12%, var(--background))
38
- );
39
- border-color: color-mix(in srgb, var(--success) 20%, transparent);
27
+ @include tinted-tag(var(--success));
40
28
  }
41
29
 
42
30
  &-warning {
43
- @include badge-variant(
44
- var(--warning),
45
- color-mix(in srgb, var(--warning) 12%, var(--background))
46
- );
47
- border-color: color-mix(in srgb, var(--warning) 20%, transparent);
31
+ @include tinted-tag(var(--warning));
48
32
  }
49
33
 
50
34
  &-error {
51
- @include badge-variant(
52
- var(--error),
53
- color-mix(in srgb, var(--error) 12%, var(--background))
54
- );
55
- border-color: color-mix(in srgb, var(--error) 20%, transparent);
35
+ @include tinted-tag(var(--error));
56
36
  }
57
37
 
58
38
  &-solid {
@@ -1,5 +1,6 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
+ @use "mixins" as *;
3
4
 
4
5
  .bottom-sheet-wrapper {
5
6
  position: fixed;
@@ -142,12 +143,7 @@
142
143
 
143
144
  .close {
144
145
  cursor: pointer;
145
- color: var(--secondary-text);
146
- transition: color 0.15s ease;
147
-
148
- &:hover {
149
- color: var(--primary-text);
150
- }
146
+ @include muted-icon-color;
151
147
  }
152
148
  }
153
149
 
@@ -19,11 +19,19 @@
19
19
  min-width: 0;
20
20
 
21
21
  + li::before {
22
- content: "\e409";
23
- font-family: "Material Symbols Outlined 24pt";
24
- font-size: 1.125rem;
25
- line-height: 1;
26
- color: var(--divider);
22
+ content: "";
23
+ display: inline-block;
24
+ width: 1.125rem;
25
+ height: 1.125rem;
26
+ background-color: var(--divider);
27
+ mask-image: url("../svg-icons/chevron_right.svg");
28
+ -webkit-mask-image: url("../svg-icons/chevron_right.svg");
29
+ mask-repeat: no-repeat;
30
+ -webkit-mask-repeat: no-repeat;
31
+ mask-position: center;
32
+ -webkit-mask-position: center;
33
+ mask-size: contain;
34
+ -webkit-mask-size: contain;
27
35
  flex-shrink: 0;
28
36
  user-select: none;
29
37
  pointer-events: none;
@@ -38,12 +46,13 @@
38
46
  color: var(--secondary-text);
39
47
  text-decoration: none;
40
48
  padding: 0.25rem 0.375rem;
41
- border-radius: $radius-sm;
49
+ border-radius: $radius-xs;
42
50
  white-space: nowrap;
43
51
  transition: color 0.15s ease, background 0.15s ease;
44
52
 
45
- .icon {
46
- font-size: 1rem;
53
+ .icon-svg {
54
+ width: 1rem;
55
+ height: 1rem;
47
56
  }
48
57
 
49
58
  &:hover {
@@ -53,7 +62,7 @@
53
62
 
54
63
  &:focus-visible {
55
64
  @include focus-ring(-1px);
56
- border-radius: $radius-sm;
65
+ border-radius: $radius-xs;
57
66
  }
58
67
  }
59
68
 
package/css/calendar.scss CHANGED
@@ -1,10 +1,11 @@
1
1
  @use "parameters" as *;
2
+ @use "mixins" as *;
2
3
 
3
4
  .cal {
4
- --cal-spacing-xs: 4px;
5
- --cal-spacing-sm: 8px;
6
- --cal-spacing-md: 12px;
7
- --cal-spacing-lg: 16px;
5
+ --cal-spacing-xs: #{calc($spacing * 0.25)};
6
+ --cal-spacing-sm: #{calc($spacing * 0.5)};
7
+ --cal-spacing-md: #{calc($spacing * 0.75)};
8
+ --cal-spacing-lg: #{$spacing};
8
9
 
9
10
  --cal-bg: var(--background);
10
11
  --cal-bg-alt: var(--secondary-background);
@@ -207,7 +208,7 @@
207
208
  color: var(--cal-accent-text);
208
209
  border-radius: 50%;
209
210
  font-weight: 700;
210
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--cal-accent) 20%, transparent);
211
+ @include focus-glow($tint: 20%, $size: 3px, $color: var(--cal-accent));
211
212
  }
212
213
 
213
214
  &.has-events::after {
@@ -323,10 +324,10 @@
323
324
  &--cont-after { border-radius: var(--cal-radius-sm) 0 0 var(--cal-radius-sm); }
324
325
  &--cont-before#{&}--cont-after { border-radius: 0; }
325
326
 
326
- &.badge-success { border-left-color: var(--success); background: color-mix(in srgb, var(--success) 14%, var(--cal-bg)); }
327
- &.badge-warning { border-left-color: var(--warning); background: color-mix(in srgb, var(--warning) 14%, var(--cal-bg)); }
328
- &.badge-error { border-left-color: var(--error); background: color-mix(in srgb, var(--error) 14%, var(--cal-bg)); }
329
- &.badge-info { border-left-color: var(--accent-color); background: color-mix(in srgb, var(--accent-color) 14%, var(--cal-bg)); }
327
+ &.badge-success { border-left-color: var(--success); background: color-mix(in srgb, var(--success) $tint-medium, var(--cal-bg)); }
328
+ &.badge-warning { border-left-color: var(--warning); background: color-mix(in srgb, var(--warning) $tint-medium, var(--cal-bg)); }
329
+ &.badge-error { border-left-color: var(--error); background: color-mix(in srgb, var(--error) $tint-medium, var(--cal-bg)); }
330
+ &.badge-info { border-left-color: var(--accent-color); background: color-mix(in srgb, var(--accent-color) $tint-medium, var(--cal-bg)); }
330
331
  }
331
332
 
332
333
  .cal__week-row > .cal__span-bar {
@@ -402,7 +403,7 @@
402
403
  &.is-today span {
403
404
  background: var(--cal-today-ring);
404
405
  color: var(--cal-accent-text);
405
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--cal-accent) 20%, transparent);
406
+ @include focus-glow($tint: 20%, $size: 3px, $color: var(--cal-accent));
406
407
  }
407
408
 
408
409
  }
@@ -544,7 +545,7 @@
544
545
  padding: 3px 6px;
545
546
  overflow: hidden;
546
547
  cursor: pointer;
547
- background: color-mix(in srgb, var(--cal-accent) 10%, var(--cal-bg));
548
+ background: color-mix(in srgb, var(--cal-accent) $tint-medium, var(--cal-bg));
548
549
  color: var(--cal-text);
549
550
  border-left: 3px solid var(--cal-accent);
550
551
  z-index: 1;
@@ -568,19 +569,19 @@
568
569
 
569
570
  &.badge-success {
570
571
  border-left-color: var(--success);
571
- background: color-mix(in srgb, var(--success) 10%, var(--cal-bg));
572
+ background: color-mix(in srgb, var(--success) $tint-medium, var(--cal-bg));
572
573
  }
573
574
  &.badge-warning {
574
575
  border-left-color: var(--warning);
575
- background: color-mix(in srgb, var(--warning) 10%, var(--cal-bg));
576
+ background: color-mix(in srgb, var(--warning) $tint-medium, var(--cal-bg));
576
577
  }
577
578
  &.badge-error {
578
579
  border-left-color: var(--error);
579
- background: color-mix(in srgb, var(--error) 10%, var(--cal-bg));
580
+ background: color-mix(in srgb, var(--error) $tint-medium, var(--cal-bg));
580
581
  }
581
582
  &.badge-info {
582
583
  border-left-color: var(--accent-color);
583
- background: color-mix(in srgb, var(--accent-color) 10%, var(--cal-bg));
584
+ background: color-mix(in srgb, var(--accent-color) $tint-medium, var(--cal-bg));
584
585
  }
585
586
  }
586
587
 
@@ -624,7 +625,7 @@
624
625
  }
625
626
 
626
627
  &.is-today {
627
- background: color-mix(in srgb, var(--cal-accent) 4%, var(--cal-bg));
628
+ background: color-mix(in srgb, var(--cal-accent) $tint-subtle, var(--cal-bg));
628
629
  }
629
630
  }
630
631
 
@@ -660,7 +661,7 @@
660
661
  &.is-today {
661
662
  background: var(--cal-today-ring);
662
663
  color: var(--cal-accent-text);
663
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--cal-accent) 20%, transparent);
664
+ @include focus-glow($tint: 20%, $size: 3px, $color: var(--cal-accent));
664
665
  }
665
666
  }
666
667
 
@@ -886,7 +887,7 @@
886
887
 
887
888
  @media (prefers-reduced-motion: no-preference) {
888
889
  .cal__body {
889
- animation: cal-slide-in 0.25s cubic-bezier(0.2, 0, 0, 1);
890
+ animation: bx-fade-slide-up 0.25s cubic-bezier(0.2, 0, 0, 1);
890
891
  }
891
892
 
892
893
  .cal__day,
@@ -907,17 +908,6 @@
907
908
  }
908
909
  }
909
910
 
910
- @keyframes cal-slide-in {
911
- from {
912
- opacity: 0;
913
- transform: translateY(8px);
914
- }
915
- to {
916
- opacity: 1;
917
- transform: translateY(0);
918
- }
919
- }
920
-
921
911
  @keyframes cal-cell-in {
922
912
  from {
923
913
  opacity: 0;
package/css/carousel.scss CHANGED
@@ -71,9 +71,9 @@
71
71
  opacity 0.2s ease;
72
72
  -webkit-tap-highlight-color: transparent;
73
73
 
74
- .icon {
75
- font-size: 1.5rem;
76
- line-height: 1;
74
+ .icon-svg {
75
+ width: 1.5rem;
76
+ height: 1.5rem;
77
77
  }
78
78
 
79
79
  &:hover {
package/css/chart.scss CHANGED
@@ -76,7 +76,7 @@
76
76
  }
77
77
 
78
78
  .chart-area {
79
- animation: chart-fade-in 0.8s ease forwards;
79
+ animation: bx-fade-in 0.8s ease forwards;
80
80
  }
81
81
 
82
82
  .chart-point-dot {
@@ -224,11 +224,6 @@
224
224
  to { stroke-dashoffset: 0; }
225
225
  }
226
226
 
227
- @keyframes chart-fade-in {
228
- from { opacity: 0; }
229
- to { opacity: 1; }
230
- }
231
-
232
227
  @keyframes chart-grow-y {
233
228
  from { transform: scaleY(0); }
234
229
  to { transform: scaleY(1); }
package/css/checkbox.scss CHANGED
@@ -30,7 +30,7 @@
30
30
  width: $spacing;
31
31
  height: $spacing;
32
32
  border: 2px solid var(--divider);
33
- border-radius: $radius-sm;
33
+ border-radius: $radius-xs;
34
34
  background-color: var(--background);
35
35
  margin-top: 2px;
36
36
  transition: border-color 0.15s ease, background-color 0.15s ease, box-shadow 0.15s ease;
package/css/chips.scss CHANGED
@@ -41,12 +41,12 @@
41
41
  }
42
42
 
43
43
  &.selected {
44
- background: color-mix(in srgb, var(--accent-color) 12%, var(--background));
44
+ background: color-mix(in srgb, var(--accent-color) $tint-medium, var(--background));
45
45
  color: var(--accent-color);
46
- border-color: color-mix(in srgb, var(--accent-color) 25%, transparent);
46
+ border-color: color-mix(in srgb, var(--accent-color) $tint-strong, transparent);
47
47
 
48
48
  &:hover {
49
- background: color-mix(in srgb, var(--accent-color) 18%, var(--background));
49
+ background: color-mix(in srgb, var(--accent-color) $tint-strong, var(--background));
50
50
  }
51
51
  }
52
52
  }
@@ -73,17 +73,15 @@
73
73
  transition: background 0.15s ease, color 0.15s ease;
74
74
 
75
75
  &:hover {
76
- background: color-mix(in srgb, var(--primary-text) 12%, transparent);
76
+ background: color-mix(in srgb, var(--primary-text) $tint-medium, transparent);
77
77
  color: var(--primary-text);
78
78
  }
79
79
 
80
80
  &:active {
81
- background: color-mix(in srgb, var(--primary-text) 18%, transparent);
81
+ background: color-mix(in srgb, var(--primary-text) $tint-strong, transparent);
82
82
  }
83
83
 
84
- .icon,
85
84
  .icon-svg {
86
- font-size: 0.8rem;
87
85
  width: 0.8rem;
88
86
  height: 0.8rem;
89
87
  }
@@ -91,45 +89,37 @@
91
89
  }
92
90
 
93
91
  &-accent {
94
- background: color-mix(in srgb, var(--accent-color) 12%, var(--background));
95
- color: var(--accent-color);
96
- border-color: color-mix(in srgb, var(--accent-color) 20%, transparent);
92
+ @include tinted-tag(var(--accent-color));
97
93
 
98
94
  &.closeable button:hover {
99
- background: color-mix(in srgb, var(--accent-color) 15%, transparent);
95
+ background: color-mix(in srgb, var(--accent-color) $tint-strong, transparent);
100
96
  color: var(--accent-color);
101
97
  }
102
98
  }
103
99
 
104
100
  &-success {
105
- background: color-mix(in srgb, var(--success) 12%, var(--background));
106
- color: var(--success);
107
- border-color: color-mix(in srgb, var(--success) 20%, transparent);
101
+ @include tinted-tag(var(--success));
108
102
 
109
103
  &.closeable button:hover {
110
- background: color-mix(in srgb, var(--success) 15%, transparent);
104
+ background: color-mix(in srgb, var(--success) $tint-strong, transparent);
111
105
  color: var(--success);
112
106
  }
113
107
  }
114
108
 
115
109
  &-warning {
116
- background: color-mix(in srgb, var(--warning) 12%, var(--background));
117
- color: var(--warning);
118
- border-color: color-mix(in srgb, var(--warning) 20%, transparent);
110
+ @include tinted-tag(var(--warning));
119
111
 
120
112
  &.closeable button:hover {
121
- background: color-mix(in srgb, var(--warning) 15%, transparent);
113
+ background: color-mix(in srgb, var(--warning) $tint-strong, transparent);
122
114
  color: var(--warning);
123
115
  }
124
116
  }
125
117
 
126
118
  &-error {
127
- background: color-mix(in srgb, var(--error) 12%, var(--background));
128
- color: var(--error);
129
- border-color: color-mix(in srgb, var(--error) 20%, transparent);
119
+ @include tinted-tag(var(--error));
130
120
 
131
121
  &.closeable button:hover {
132
- background: color-mix(in srgb, var(--error) 15%, transparent);
122
+ background: color-mix(in srgb, var(--error) $tint-strong, transparent);
133
123
  color: var(--error);
134
124
  }
135
125
  }
@@ -30,13 +30,13 @@
30
30
  color: #fff;
31
31
  border: none;
32
32
  padding: calc($spacing * 0.375) calc($spacing * 0.75);
33
- border-radius: $radius-sm;
33
+ border-radius: $radius-xs;
34
34
  cursor: pointer;
35
35
  font-size: 0.75rem;
36
36
  transition: background 0.2s;
37
37
  }
38
38
 
39
- .copy-button:hover {
39
+ .copy-button:hover:not(:disabled) {
40
40
  background: #5a5a5a;
41
41
  }
42
42
 
@@ -1,5 +1,6 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
+ @use "mixins" as *;
3
4
 
4
5
  $thumb-size: 18px;
5
6
  $thumb-size-touch: 22px;
@@ -9,15 +10,12 @@ $preview-size: 40px;
9
10
 
10
11
  .color-picker {
11
12
  width: 100%;
12
- background: var(--background);
13
- border: 1px solid var(--divider);
14
- border-radius: $radius-lg;
13
+ @include float-panel($radius-lg);
15
14
  padding: $spacing;
16
15
  box-sizing: border-box;
17
16
  display: flex;
18
17
  flex-direction: column;
19
18
  gap: calc($spacing * 0.75);
20
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
21
19
  }
22
20
 
23
21
  // ─── Saturation / brightness field ────────────────────────────────────────────
@@ -232,7 +230,7 @@ $preview-size: 40px;
232
230
 
233
231
  &:focus {
234
232
  border-color: var(--accent-color);
235
- box-shadow: 0 0 0 2px var(--accent-color-tint);
233
+ @include focus-glow($tint: 12%, $size: 2px);
236
234
  }
237
235
  }
238
236
 
@@ -1,18 +1,13 @@
1
1
  @use "properties";
2
2
  @use "parameters" as *;
3
+ @use "mixins" as *;
3
4
 
4
5
  .context-menu {
5
6
  position: fixed;
6
7
  z-index: 9999;
7
8
  min-width: 200px;
8
9
  padding: calc($spacing * 0.375) 0;
9
- background: var(--background);
10
- border: 1px solid var(--divider);
11
- border-radius: $radius-panel;
12
- box-shadow:
13
- 0 8px 32px rgba(0, 0, 0, 0.12),
14
- 0 2px 8px rgba(0, 0, 0, 0.08),
15
- 0 1px 2px rgba(0, 0, 0, 0.04);
10
+ @include float-panel;
16
11
  list-style: none;
17
12
  margin: 0;
18
13
  opacity: 0;
@@ -108,7 +103,7 @@
108
103
 
109
104
  &:hover,
110
105
  &.is-focused {
111
- background: color-mix(in srgb, var(--error) 8%, var(--background));
106
+ background: color-mix(in srgb, var(--error) $tint-subtle, var(--background));
112
107
  color: var(--error);
113
108
 
114
109
  .context-menu-icon {