@allxsmith/bestax-bulma 5.34.3 → 5.35.1

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 (74) hide show
  1. package/dist/bestax.css +1 -1
  2. package/dist/bestax.css.map +1 -1
  3. package/dist/esm/components/Loading.js +19 -6
  4. package/dist/esm/components/Loading.js.map +1 -1
  5. package/dist/esm/components/Menu.js +5 -1
  6. package/dist/esm/components/Menu.js.map +1 -1
  7. package/dist/esm/components/Modal.js +22 -31
  8. package/dist/esm/components/Modal.js.map +1 -1
  9. package/dist/esm/components/Sidebar.js +19 -6
  10. package/dist/esm/components/Sidebar.js.map +1 -1
  11. package/dist/esm/components/Steps.js +14 -13
  12. package/dist/esm/components/Steps.js.map +1 -1
  13. package/dist/esm/components/Toast.js +18 -7
  14. package/dist/esm/components/Toast.js.map +1 -1
  15. package/dist/esm/components/Tooltip.js +3 -3
  16. package/dist/esm/components/Tooltip.js.map +1 -1
  17. package/dist/esm/elements/Icon.js +2 -3
  18. package/dist/esm/elements/Icon.js.map +1 -1
  19. package/dist/esm/elements/Loader.js +2 -1
  20. package/dist/esm/elements/Loader.js.map +1 -1
  21. package/dist/esm/form/Checkbox.js +37 -4
  22. package/dist/esm/form/Checkbox.js.map +1 -1
  23. package/dist/esm/form/Slider.js +5 -4
  24. package/dist/esm/form/Slider.js.map +1 -1
  25. package/dist/esm/form/Taginput.js +21 -9
  26. package/dist/esm/form/Taginput.js.map +1 -1
  27. package/dist/esm/form/_pickerInternals/PickerPopover.js +9 -1
  28. package/dist/esm/form/_pickerInternals/PickerPopover.js.map +1 -1
  29. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js +5 -4
  30. package/dist/esm/form/_pickerInternals/useSegmentedEntry.js.map +1 -1
  31. package/dist/esm/helpers/overlayStack.js +49 -0
  32. package/dist/esm/helpers/overlayStack.js.map +1 -0
  33. package/dist/esm/helpers/useLatestRef.js +33 -0
  34. package/dist/esm/helpers/useLatestRef.js.map +1 -0
  35. package/dist/extras.css +1 -1
  36. package/dist/extras.css.map +1 -1
  37. package/dist/index.cjs +242 -95
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/types/components/Loading.d.ts +13 -3
  40. package/dist/types/components/Menu.d.ts +14 -1
  41. package/dist/types/components/Modal.d.ts +7 -4
  42. package/dist/types/components/Sidebar.d.ts +8 -3
  43. package/dist/types/components/Steps.d.ts +27 -5
  44. package/dist/types/components/Toast.d.ts +5 -2
  45. package/dist/types/elements/Icon.d.ts +6 -1
  46. package/dist/types/elements/Loader.d.ts +2 -1
  47. package/dist/types/form/Checkbox.d.ts +11 -0
  48. package/dist/types/form/Taginput.d.ts +5 -1
  49. package/dist/types/helpers/overlayStack.d.ts +15 -0
  50. package/dist/types/helpers/useLatestRef.d.ts +21 -0
  51. package/dist/types-cjs/components/Loading.d.ts +13 -3
  52. package/dist/types-cjs/components/Menu.d.ts +14 -1
  53. package/dist/types-cjs/components/Modal.d.ts +7 -4
  54. package/dist/types-cjs/components/Sidebar.d.ts +8 -3
  55. package/dist/types-cjs/components/Steps.d.ts +27 -5
  56. package/dist/types-cjs/components/Toast.d.ts +5 -2
  57. package/dist/types-cjs/elements/Icon.d.ts +6 -1
  58. package/dist/types-cjs/elements/Loader.d.ts +2 -1
  59. package/dist/types-cjs/form/Checkbox.d.ts +11 -0
  60. package/dist/types-cjs/form/Taginput.d.ts +5 -1
  61. package/dist/types-cjs/helpers/overlayStack.d.ts +15 -0
  62. package/dist/types-cjs/helpers/useLatestRef.d.ts +21 -0
  63. package/dist/versions/bestax-no-dark-mode.css +1 -1
  64. package/dist/versions/bestax-no-dark-mode.css.map +1 -1
  65. package/dist/versions/bestax-no-helpers-prefixed.css +1 -1
  66. package/dist/versions/bestax-no-helpers-prefixed.css.map +1 -1
  67. package/dist/versions/bestax-no-helpers.css +1 -1
  68. package/dist/versions/bestax-no-helpers.css.map +1 -1
  69. package/dist/versions/bestax-prefixed.css +1 -1
  70. package/dist/versions/bestax-prefixed.css.map +1 -1
  71. package/package.json +1 -1
  72. package/src/scss/components/_steps.scss +96 -38
  73. package/src/scss/elements/_loader.scss +20 -0
  74. package/src/scss/form/_checkbox.scss +28 -1
@@ -62,19 +62,21 @@ $steps-navigation-margin-top: 1rem !default;
62
62
  }
63
63
 
64
64
  .#{iv.$class-prefix}steps-list:not(.#{iv.$class-prefix}is-vertical) .#{iv.$class-prefix}steps-segment {
65
- padding-top: calc(#{$marker-size} / 2);
65
+ > .#{iv.$class-prefix}steps-link {
66
+ padding-top: calc(#{$marker-size} / 2);
67
+ }
66
68
 
67
69
  &:not(:last-child)::before {
68
70
  top: calc(#{$marker-size} - cv.getVar("steps-divider-height") / 2);
69
- left: calc(50% + #{$marker-size} / 2);
70
- right: calc(-50% + #{$marker-size} / 2);
71
+ inset-inline-start: calc(50% + #{$marker-size} / 2);
72
+ inset-inline-end: calc(-50% + #{$marker-size} / 2);
71
73
  }
72
74
  }
73
75
 
74
76
  &.#{iv.$class-prefix}is-vertical .#{iv.$class-prefix}steps-segment {
75
77
  &:not(:last-child)::after {
76
78
  top: $marker-size;
77
- left: calc(#{$marker-size} / 2 - cv.getVar("steps-divider-height") / 2);
79
+ inset-inline-start: calc(#{$marker-size} / 2 - cv.getVar("steps-divider-height") / 2);
78
80
  }
79
81
  }
80
82
  }
@@ -97,15 +99,23 @@ $steps-navigation-margin-top: 1rem !default;
97
99
  .#{iv.$class-prefix}steps-segment {
98
100
  flex: 1;
99
101
  position: relative;
100
- padding-top: calc(cv.getVar("steps-marker-size") / 2);
101
102
 
102
- // Horizontal divider line — centered through marker
103
+ // The space above the marker is the link's padding, not the
104
+ // segment's, so a clickable step's button covers the whole segment
105
+ // and every part of it takes the click and the pointer.
106
+ > .#{iv.$class-prefix}steps-link {
107
+ padding-top: calc(cv.getVar("steps-marker-size") / 2);
108
+ }
109
+
110
+ // Horizontal divider line, centered through the marker. It runs from
111
+ // this marker's edge to the next one's, which is on the left in a
112
+ // right-to-left page, so it is placed by the inline start and end.
103
113
  &:not(:last-child)::before {
104
114
  content: '';
105
115
  position: absolute;
106
116
  top: calc(cv.getVar("steps-marker-size") - cv.getVar("steps-divider-height") / 2);
107
- left: calc(50% + cv.getVar("steps-marker-size") / 2);
108
- right: calc(-50% + cv.getVar("steps-marker-size") / 2);
117
+ inset-inline-start: calc(50% + cv.getVar("steps-marker-size") / 2);
118
+ inset-inline-end: calc(-50% + cv.getVar("steps-marker-size") / 2);
109
119
  height: cv.getVar("steps-divider-height");
110
120
  background-color: cv.getVar("steps-default-color");
111
121
  @include extras-transition(background-color);
@@ -123,17 +133,17 @@ $steps-navigation-margin-top: 1rem !default;
123
133
  .#{iv.$class-prefix}steps-segment {
124
134
  text-align: center;
125
135
  cursor: default;
136
+ }
126
137
 
127
- &[tabindex="0"] {
128
- cursor: pointer;
129
-
130
- &:focus {
131
- outline: none;
132
- }
138
+ // A clickable step's link is a <button> around the marker and the label. It
139
+ // drops the browser's button look and fills its step the way the <div> does,
140
+ // and the focus ring goes around it.
141
+ button.#{iv.$class-prefix}steps-link {
142
+ @include extras-button-reset;
143
+ width: 100%;
133
144
 
134
- &:focus-visible .#{iv.$class-prefix}steps-marker {
135
- @include extras-focus-outline;
136
- }
145
+ &:focus-visible {
146
+ @include extras-focus-outline;
137
147
  }
138
148
  }
139
149
 
@@ -182,8 +192,10 @@ $steps-navigation-margin-top: 1rem !default;
182
192
  text-align: center;
183
193
  }
184
194
 
185
- // Step title
195
+ // Step title. A block, so a clickable step's <span> title sets its line
196
+ // height from its own font size, the way a plain step's <p> does.
186
197
  .#{iv.$class-prefix}steps-title {
198
+ display: block;
187
199
  font-size: cv.getVar("steps-title-size");
188
200
  font-weight: cv.getVar("steps-title-weight");
189
201
  color: cv.getVar("steps-title-color");
@@ -284,7 +296,9 @@ $steps-navigation-margin-top: 1rem !default;
284
296
  }
285
297
 
286
298
  .#{iv.$class-prefix}steps-segment {
287
- padding-top: 0;
299
+ > .#{iv.$class-prefix}steps-link {
300
+ padding-top: 0;
301
+ }
288
302
 
289
303
  &:not(:last-child)::before {
290
304
  top: 50%;
@@ -298,8 +312,7 @@ $steps-navigation-margin-top: 1rem !default;
298
312
  flex-direction: column;
299
313
 
300
314
  .#{iv.$class-prefix}steps-segment {
301
- text-align: left;
302
- padding: 0 0 cv.getVar("steps-vertical-padding") 0;
315
+ text-align: start;
303
316
  position: relative;
304
317
 
305
318
  // Vertical divider line
@@ -307,7 +320,7 @@ $steps-navigation-margin-top: 1rem !default;
307
320
  content: '';
308
321
  position: absolute;
309
322
  top: cv.getVar("steps-marker-size");
310
- left: calc(cv.getVar("steps-marker-size") / 2 - cv.getVar("steps-divider-height") / 2);
323
+ inset-inline-start: calc(cv.getVar("steps-marker-size") / 2 - cv.getVar("steps-divider-height") / 2);
311
324
  width: cv.getVar("steps-divider-height");
312
325
  bottom: 0;
313
326
  background-color: cv.getVar("steps-default-color");
@@ -319,10 +332,13 @@ $steps-navigation-margin-top: 1rem !default;
319
332
  }
320
333
  }
321
334
 
335
+ // The space below each step is the link's padding, for the same reason as
336
+ // the horizontal layout's space above the marker.
322
337
  .#{iv.$class-prefix}steps-link {
323
338
  flex-direction: row;
324
339
  justify-content: flex-start;
325
340
  align-items: flex-start;
341
+ padding: 0 0 cv.getVar("steps-vertical-padding") 0;
326
342
  }
327
343
 
328
344
  .#{iv.$class-prefix}steps-marker {
@@ -330,10 +346,13 @@ $steps-navigation-margin-top: 1rem !default;
330
346
  flex-shrink: 0;
331
347
  }
332
348
 
349
+ // The gap sits on the label's start side, between it and the marker, so it
350
+ // moves to the right in a right-to-left page. The variable keeps its
351
+ // `-left` name, so a theme that sets it still applies.
333
352
  .#{iv.$class-prefix}steps-content {
334
353
  margin-top: 0;
335
- margin-left: cv.getVar("steps-vertical-content-margin-left");
336
- text-align: left;
354
+ margin-inline-start: cv.getVar("steps-vertical-content-margin-left");
355
+ text-align: start;
337
356
  padding-top: 0.25rem;
338
357
  }
339
358
  }
@@ -341,16 +360,18 @@ $steps-navigation-margin-top: 1rem !default;
341
360
  // Label on right / left (horizontal only)
342
361
  // The marker stays centered at 50%. The label is absolutely positioned right
343
362
  // next to the marker with a background-color + z-index to cover the connector line.
363
+ // "right" is the end of the line and "left" its start, so both follow the
364
+ // page's direction, the way the vertical layout's flex row does.
344
365
  .#{iv.$class-prefix}steps.#{iv.$class-prefix}has-label-right:not(.#{iv.$class-prefix}is-vertical),
345
366
  .#{iv.$class-prefix}steps.#{iv.$class-prefix}has-label-left:not(.#{iv.$class-prefix}is-vertical) {
346
367
  .#{iv.$class-prefix}steps-link {
347
368
  position: relative;
348
369
  }
349
370
 
371
+ // Left at its static position in the block direction, which centers it on
372
+ // the link's content box, the marker, whatever padding the link has above.
350
373
  .#{iv.$class-prefix}steps-content {
351
374
  position: absolute;
352
- top: 50%;
353
- transform: translateY(-50%);
354
375
  margin-top: 0;
355
376
  background-color: cv.getVar("scheme-main");
356
377
  z-index: 1;
@@ -361,19 +382,19 @@ $steps-navigation-margin-top: 1rem !default;
361
382
 
362
383
  .#{iv.$class-prefix}steps.#{iv.$class-prefix}has-label-right:not(.#{iv.$class-prefix}is-vertical) {
363
384
  .#{iv.$class-prefix}steps-content {
364
- left: calc(50% + cv.getVar("steps-marker-size") / 2 + 0.25rem);
365
- text-align: left;
385
+ inset-inline-start: calc(50% + cv.getVar("steps-marker-size") / 2 + 0.25rem);
386
+ text-align: start;
366
387
  }
367
388
  }
368
389
 
369
390
  .#{iv.$class-prefix}steps.#{iv.$class-prefix}has-label-left:not(.#{iv.$class-prefix}is-vertical) {
370
391
  .#{iv.$class-prefix}steps-content {
371
- right: calc(50% + cv.getVar("steps-marker-size") / 2 + 0.25rem);
372
- text-align: right;
392
+ inset-inline-end: calc(50% + cv.getVar("steps-marker-size") / 2 + 0.25rem);
393
+ text-align: end;
373
394
  }
374
395
  }
375
396
 
376
- // Vertical + label-left: marker on right, label on left, divider on right
397
+ // Vertical + label-left: label at the start, marker and divider at the end
377
398
  .#{iv.$class-prefix}steps.#{iv.$class-prefix}has-label-left.#{iv.$class-prefix}is-vertical {
378
399
  .#{iv.$class-prefix}steps-list.#{iv.$class-prefix}is-vertical {
379
400
  .#{iv.$class-prefix}steps-link {
@@ -381,14 +402,14 @@ $steps-navigation-margin-top: 1rem !default;
381
402
  }
382
403
 
383
404
  .#{iv.$class-prefix}steps-content {
384
- margin-left: 0;
385
- margin-right: cv.getVar("steps-vertical-content-margin-left");
386
- text-align: right;
405
+ margin-inline-start: 0;
406
+ margin-inline-end: cv.getVar("steps-vertical-content-margin-left");
407
+ text-align: end;
387
408
  }
388
409
 
389
410
  .#{iv.$class-prefix}steps-segment:not(:last-child)::after {
390
- left: auto;
391
- right: calc(cv.getVar("steps-marker-size") / 2 - cv.getVar("steps-divider-height") / 2);
411
+ inset-inline-start: auto;
412
+ inset-inline-end: calc(cv.getVar("steps-marker-size") / 2 - cv.getVar("steps-divider-height") / 2);
392
413
  }
393
414
  }
394
415
  }
@@ -408,7 +429,7 @@ $steps-navigation-margin-top: 1rem !default;
408
429
  }
409
430
 
410
431
  .#{iv.$class-prefix}steps-content {
411
- margin-left: 0;
432
+ margin-inline-start: 0;
412
433
  margin-top: cv.getVar("steps-content-margin-top");
413
434
  text-align: center;
414
435
  background-color: cv.getVar("scheme-main");
@@ -418,7 +439,7 @@ $steps-navigation-margin-top: 1rem !default;
418
439
  }
419
440
 
420
441
  .#{iv.$class-prefix}steps-segment:not(:last-child)::after {
421
- left: calc(50% - cv.getVar("steps-divider-height") / 2);
442
+ inset-inline-start: calc(50% - cv.getVar("steps-divider-height") / 2);
422
443
  }
423
444
  }
424
445
  }
@@ -457,3 +478,40 @@ $steps-navigation-margin-top: 1rem !default;
457
478
  }
458
479
  }
459
480
  }
481
+
482
+ // Forced colors (Windows' contrast themes)
483
+ // The lines and a completed marker's fill are background colors, which forced
484
+ // colors paints in the page's own color, so the lines vanish and every marker
485
+ // looks alike. These paint them in system colors, which forced colors leaves
486
+ // alone, and ring the current marker with an outline. `!important` because the
487
+ // color variants, and a theme's own rules, set the same properties with more
488
+ // specific selectors, and in forced colors this has to win over all of them.
489
+ @media (forced-colors: active) {
490
+ .#{iv.$class-prefix}steps-segment::before,
491
+ .#{iv.$class-prefix}steps-segment::after {
492
+ background-color: CanvasText !important;
493
+ }
494
+
495
+ .#{iv.$class-prefix}steps-segment.#{iv.$class-prefix}is-completed .#{iv.$class-prefix}steps-marker {
496
+ // Left on, the browser paints its text backplate in Canvas behind the
497
+ // check mark, and a Canvas mark on it can't be seen. Turned off, the
498
+ // border is no longer forced either, so it takes the fill's color.
499
+ forced-color-adjust: none;
500
+ background-color: CanvasText !important;
501
+ border-color: CanvasText !important;
502
+ color: Canvas !important;
503
+
504
+ // Nothing inside is forced either, since that's inherited, so a custom
505
+ // `icon` or `completedIcon` that sets its own color would keep it on the
506
+ // fill. It takes the check mark's Canvas instead. Forcing it back on
507
+ // would put a CanvasText glyph on the CanvasText fill, behind a backplate.
508
+ * {
509
+ color: inherit !important;
510
+ }
511
+ }
512
+
513
+ .#{iv.$class-prefix}steps-segment.#{iv.$class-prefix}is-active .#{iv.$class-prefix}steps-marker {
514
+ outline: cv.getVar("steps-divider-height") solid CanvasText;
515
+ outline-offset: cv.getVar("steps-divider-height");
516
+ }
517
+ }
@@ -4,12 +4,22 @@
4
4
  // for users who ask for less motion. Each ring stays drawn, so the loading
5
5
  // state is still visible.
6
6
  //
7
+ // It also keeps each ring open in forced colors (Windows' contrast themes).
8
+ // Bulma leaves two sides of the ring `transparent`, and forced colors paints
9
+ // those in the text color like any other border, so the ring closes, and a
10
+ // closed ring turning looks like one standing still. `Canvas`, the page's
11
+ // own color, is a system color, which forced colors leaves alone.
12
+ //
7
13
  // These rules override stock Bulma, and Bulma's CSS can land on either side
8
14
  // of this partial: `versions/bestax-no-dark-mode.scss` emits the extras first,
9
15
  // an app can link `extras.css` ahead of its own Bulma, and a component can
10
16
  // re-spin a ring with a more specific selector (`.autocomplete .loader`).
11
17
  // `!important` is what wins in every one of those cases, whatever the order
12
18
  // or specificity, so the override does not depend on where this file lands.
19
+ //
20
+ // Bulma's rings come from its `%loader` placeholder, but a module can't add
21
+ // to what another module's `@extend` reaches, and `extras.css` is built
22
+ // without Bulma at all, so each ring is named here.
13
23
 
14
24
  @use "bulma/sass/utilities/initial-variables" as iv;
15
25
 
@@ -21,3 +31,13 @@
21
31
  animation: none !important;
22
32
  }
23
33
  }
34
+
35
+ @media (forced-colors: active) {
36
+ .#{iv.$class-prefix}loader,
37
+ .#{iv.$class-prefix}button.#{iv.$class-prefix}is-loading::after,
38
+ .#{iv.$class-prefix}control.#{iv.$class-prefix}is-loading::after,
39
+ .#{iv.$class-prefix}select.#{iv.$class-prefix}is-loading::after {
40
+ border-top-color: Canvas !important;
41
+ border-right-color: Canvas !important;
42
+ }
43
+ }
@@ -18,6 +18,10 @@ $checkbox-focus-shadow-size: 0 0 0 0.125em !default;
18
18
  $checkbox-transition-duration: cv.getVar("duration") !default;
19
19
  $checkbox-indeterminate-color: cv.getVar("primary") !default;
20
20
 
21
+ // The check mark, drawn as an image normally and used as a mask in forced
22
+ // colors. Private, since it's the shape rather than a themable value.
23
+ $-check-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
24
+
21
25
  // Register CSS custom properties
22
26
  .#{iv.$class-prefix}styled-checkbox {
23
27
  @include cv.register-vars(
@@ -134,7 +138,7 @@ $checkbox-indeterminate-color: cv.getVar("primary") !default;
134
138
  transition-property: opacity, transform;
135
139
  transition-duration: cv.getVar("checkbox-transition-duration");
136
140
  transition-timing-function: ease;
137
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
141
+ background-image: $-check-mark;
138
142
  background-size: contain;
139
143
  background-repeat: no-repeat;
140
144
  background-position: center;
@@ -183,6 +187,29 @@ $checkbox-indeterminate-color: cv.getVar("primary") !default;
183
187
  input[type="checkbox"]:checked + .check {
184
188
  background-color: Highlight;
185
189
  border-color: Highlight;
190
+
191
+ // The mark's image has a black stroke, which forced colors leaves as
192
+ // it is, black on the Highlight fill. Use its shape as a mask instead
193
+ // and paint it in HighlightText, the color made to read on Highlight.
194
+ &::after {
195
+ background-image: none;
196
+ background-color: HighlightText;
197
+ mask-image: $-check-mark;
198
+ mask-size: contain;
199
+ mask-repeat: no-repeat;
200
+ mask-position: center;
201
+ }
202
+ }
203
+
204
+ // Forced colors repaints the mixed fill and its dash in the same color,
205
+ // which leaves an empty box. Draw the dash in system colors that keep it
206
+ // visible, checked or not.
207
+ input[type="checkbox"]:indeterminate + .check {
208
+ background-color: Canvas;
209
+
210
+ &::before {
211
+ background-color: CanvasText;
212
+ }
186
213
  }
187
214
 
188
215
  input[type="checkbox"]:focus-visible + .check {