mithril-materialized 3.16.0 → 3.17.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 (46) hide show
  1. package/README.md +32 -2
  2. package/dist/advanced.css +92 -1
  3. package/dist/button.d.ts +3 -1
  4. package/dist/circular-progress.d.ts +2 -2
  5. package/dist/combobox.d.ts +35 -0
  6. package/dist/components.css +127 -14
  7. package/dist/core.css +278 -3
  8. package/dist/floating-action-button.d.ts +2 -1
  9. package/dist/form-section.d.ts +35 -0
  10. package/dist/forms.css +280 -5
  11. package/dist/index.css +340 -19
  12. package/dist/index.d.ts +3 -2
  13. package/dist/index.esm.js +697 -296
  14. package/dist/index.esm.js.map +1 -0
  15. package/dist/index.js +710 -295
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.min.css +2 -2
  18. package/dist/index.umd.js +710 -295
  19. package/dist/index.umd.js.map +1 -0
  20. package/dist/input-options.d.ts +4 -1
  21. package/dist/likert-scale.d.ts +2 -1
  22. package/dist/linear-progress.d.ts +2 -2
  23. package/dist/material-icon.d.ts +2 -1
  24. package/dist/radio.d.ts +9 -0
  25. package/dist/range-slider.d.ts +3 -2
  26. package/dist/rating.d.ts +2 -1
  27. package/dist/search-select.d.ts +15 -2
  28. package/dist/select.d.ts +14 -1
  29. package/dist/sidenav.d.ts +6 -0
  30. package/dist/treeview.d.ts +2 -2
  31. package/dist/types.d.ts +5 -0
  32. package/dist/utilities.css +93 -2
  33. package/dist/utils.d.ts +30 -1
  34. package/package.json +16 -19
  35. package/sass/components/_badge-component.scss +8 -0
  36. package/sass/components/_buttons.scss +9 -9
  37. package/sass/components/_global.scss +93 -0
  38. package/sass/components/_likert-scale.scss +24 -0
  39. package/sass/components/_theme-variables.scss +22 -1
  40. package/sass/components/_toggle-group.scss +3 -0
  41. package/sass/components/forms/_form-groups.scss +1 -1
  42. package/sass/components/forms/_form-section.scss +63 -0
  43. package/sass/components/forms/_forms.scss +1 -0
  44. package/sass/components/forms/_input-fields.scss +55 -0
  45. package/sass/components/forms/_range-enhanced.scss +3 -3
  46. package/sass/components/forms/_select.scss +85 -0
package/README.md CHANGED
@@ -58,11 +58,12 @@ Components marked with an * are not included in the original materialize-css lib
58
58
  - TimePicker (with inline mode and switchable AM/PM/24h)*
59
59
  - [Selections](https://erikvullings.github.io/mithril-materialized/#!/selections)
60
60
  - Select
61
- - SearchSelect*, a searchable select dropdown
61
+ - SearchSelect*, a searchable select dropdown (supports async remote loading via `loadOptions`)
62
62
  - Options
63
- - RadioButtons
63
+ - RadioButtons (HTML labels/descriptions require explicit `allowHtml: true`)
64
64
  - Switch
65
65
  - Dropdown
66
+ - ToggleButton* (single toggle button component)
66
67
  - [Collections](https://erikvullings.github.io/mithril-materialized/#!/collections)
67
68
  - Basic, Link and Avatar Collections
68
69
  - Collapsible or accordion
@@ -412,6 +413,35 @@ See our [contributing guide](CONTRIBUTING.md) for detailed information.
412
413
  - File upload processing: Real-time without blocking
413
414
  - TextArea auto-resize: <1ms per keystroke
414
415
 
416
+ ### Button semantics
417
+
418
+ `Button`, `LargeButton`, `SmallButton`, and `FlatButton` render native `<button>` elements for actions. Use `href` when the component represents navigation; it then renders an `<a>` without a button `type`.
419
+
420
+ ```typescript
421
+ m(Button, { label: 'Save', onclick: save });
422
+ m(Button, { label: 'Read the docs', href: '/docs' });
423
+ ```
424
+
425
+ > **Migration:** If you relied on the previous anchor markup for navigation, add `href`. Action buttons now correctly use native button semantics.
426
+
427
+ ### Async SearchSelect
428
+
429
+ Use `loadOptions(query)` to retrieve options remotely. The component displays loading, empty, and error states; `i18n` customizes their messages.
430
+
431
+ ```typescript
432
+ m(SearchSelect<number>, {
433
+ label: 'Remote search',
434
+ checkedId: selectedIds,
435
+ options: [],
436
+ loadOptions: (query) => fetchOptions(query),
437
+ onchange: (ids) => {
438
+ selectedIds = ids;
439
+ },
440
+ });
441
+ ```
442
+
443
+ `SearchSelect` uses combobox/listbox ARIA roles and supports `ArrowDown`, `ArrowUp`, `Enter`/`Space`, and `Escape`.
444
+
415
445
  ## Build instructions
416
446
 
417
447
  This repository consists of two packages, combined using `lerna`: the `lib` package that is published to `npm`, as well as an `example` project which uses this library to display the Mithril components that it contains.
package/dist/advanced.css CHANGED
@@ -80,6 +80,31 @@ html {
80
80
  box-sizing: border-box;
81
81
  }
82
82
 
83
+ /* Default themed scrollbar styling for all scroll containers */
84
+ * {
85
+ scrollbar-width: thin;
86
+ scrollbar-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.35)) var(--mm-scrollbar-track-color, transparent);
87
+ }
88
+
89
+ *::-webkit-scrollbar {
90
+ width: 10px;
91
+ height: 10px;
92
+ }
93
+
94
+ *::-webkit-scrollbar-track {
95
+ background: var(--mm-scrollbar-track-color, transparent);
96
+ }
97
+
98
+ *::-webkit-scrollbar-thumb {
99
+ background-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.35));
100
+ border-radius: 8px;
101
+ border: 2px solid var(--mm-scrollbar-track-color, transparent);
102
+ }
103
+
104
+ *::-webkit-scrollbar-thumb:hover {
105
+ background-color: var(--mm-scrollbar-thumb-hover-color, rgba(128, 128, 128, 0.5));
106
+ }
107
+
83
108
  *, *:before, *:after {
84
109
  box-sizing: inherit;
85
110
  }
@@ -572,7 +597,7 @@ td, th {
572
597
  }
573
598
  .collection .collection-item.active {
574
599
  background-color: #26a69a;
575
- color: rgb(234.25, 250.25, 248.75);
600
+ color: rgb(91.862745098%, 98.137254902%, 97.5490196078%);
576
601
  }
577
602
  .collection .collection-item.active .secondary-content {
578
603
  color: var(--mm-text-on-primary, #fff);
@@ -701,6 +726,72 @@ td, th {
701
726
  /*******************
702
727
  Utility Classes
703
728
  *******************/
729
+ .mm-layout-row {
730
+ display: flex;
731
+ }
732
+
733
+ .mm-layout-row--center {
734
+ align-items: center;
735
+ }
736
+
737
+ .mm-layout-row--align-end {
738
+ align-items: flex-end;
739
+ }
740
+
741
+ .mm-layout-row--wrap {
742
+ flex-wrap: wrap;
743
+ }
744
+
745
+ .mm-layout-row--justify-start {
746
+ justify-content: flex-start;
747
+ }
748
+
749
+ .mm-layout-row--justify-end {
750
+ justify-content: flex-end;
751
+ }
752
+
753
+ .mm-layout-row--justify-between {
754
+ justify-content: space-between;
755
+ }
756
+
757
+ .mm-layout-stack {
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: var(--mm-layout-gap, 0);
761
+ }
762
+
763
+ .mm-layout-cluster {
764
+ display: flex;
765
+ align-items: center;
766
+ flex-wrap: wrap;
767
+ gap: var(--mm-layout-gap, 8px);
768
+ }
769
+
770
+ .mm-layout-grow {
771
+ flex: 1 1 auto;
772
+ min-width: 0;
773
+ }
774
+
775
+ .mm-layout-ml-auto {
776
+ margin-left: auto;
777
+ }
778
+
779
+ .mm-layout-ml-8 {
780
+ margin-left: var(--mm-layout-inline-gap, 8px);
781
+ }
782
+
783
+ .mm-layout-mr-8 {
784
+ margin-right: var(--mm-layout-inline-gap, 8px);
785
+ }
786
+
787
+ .mm-layout-item-icon {
788
+ margin-right: var(--mm-layout-icon-gap, 32px);
789
+ }
790
+
791
+ .mm-layout-gap-sm {
792
+ gap: var(--mm-layout-gap-sm, 8px);
793
+ }
794
+
704
795
  .hide {
705
796
  display: none !important;
706
797
  }
package/dist/button.d.ts CHANGED
@@ -38,6 +38,8 @@ export interface HtmlAttrs {
38
38
  export interface ButtonAttrs extends Attributes {
39
39
  /** Button label text (optional for icon-only buttons) */
40
40
  label?: string;
41
+ /** Optional navigation destination. When provided, the component renders an anchor instead of a button. */
42
+ href?: string;
41
43
  /** Material icon name - see https://materializecss.com/icons.html */
42
44
  iconName?: string;
43
45
  /**
@@ -77,7 +79,7 @@ export interface ButtonAttrs extends Attributes {
77
79
  /**
78
80
  * A factory to create new buttons.
79
81
  *
80
- * @example FlatButton = ButtonFactory('a.waves-effect.waves-teal.btn-flat');
82
+ * @example FlatButton = ButtonFactory('button.waves-effect.waves-teal.btn-flat');
81
83
  */
82
84
  export declare const ButtonFactory: (element: string, defaultClassNames: string, type?: string) => FactoryComponent<ButtonAttrs>;
83
85
  export declare const Button: m.FactoryComponent<ButtonAttrs>;
@@ -1,5 +1,5 @@
1
1
  import { FactoryComponent, Attributes } from 'mithril';
2
- import { MaterialColor, ColorIntensity } from './types';
2
+ import { MaterialColor, ColorIntensity, ComponentStyle } from './types';
3
3
  /** Progress mode - determinate shows specific progress, indeterminate shows loading animation */
4
4
  export type ProgressMode = 'determinate' | 'indeterminate';
5
5
  /** Progress size options */
@@ -25,7 +25,7 @@ export interface CircularProgressAttrs extends Attributes {
25
25
  /** Additional CSS class names */
26
26
  className?: string;
27
27
  /** Additional CSS styles */
28
- style?: any;
28
+ style?: ComponentStyle;
29
29
  /** HTML ID for the component */
30
30
  id?: string;
31
31
  /** ARIA label for accessibility */
@@ -0,0 +1,35 @@
1
+ export type ComboboxKeyAction = 'none' | 'open' | 'close' | 'selectFocused' | 'selectAction';
2
+ export interface ComboboxKeyInput {
3
+ key: string;
4
+ isOpen: boolean;
5
+ focusedIndex: number;
6
+ optionCount: number;
7
+ includeActionRow: boolean;
8
+ }
9
+ export interface ComboboxKeyResult {
10
+ isOpen: boolean;
11
+ focusedIndex: number;
12
+ action: ComboboxKeyAction;
13
+ preventDefault: boolean;
14
+ }
15
+ export type ComboboxViewState = 'loading' | 'error' | 'empty' | 'ready';
16
+ export interface AsyncComboboxState<TOption> {
17
+ options: TOption[];
18
+ isLoading: boolean;
19
+ error: string | null;
20
+ latestRequestId: number;
21
+ }
22
+ export declare const getComboboxKeyResult: ({ key, isOpen, focusedIndex, optionCount, includeActionRow, }: ComboboxKeyInput) => ComboboxKeyResult;
23
+ export declare const getComboboxOptionId: (baseId: string, optionIndex: number) => string;
24
+ export declare const createAsyncComboboxState: <TOption>(initialOptions?: TOption[]) => AsyncComboboxState<TOption>;
25
+ export declare const startAsyncComboboxRequest: <TOption>(state: AsyncComboboxState<TOption>) => {
26
+ requestId: number;
27
+ nextState: AsyncComboboxState<TOption>;
28
+ };
29
+ export declare const resolveAsyncComboboxRequest: <TOption>(state: AsyncComboboxState<TOption>, requestId: number, options: TOption[]) => AsyncComboboxState<TOption>;
30
+ export declare const rejectAsyncComboboxRequest: <TOption>(state: AsyncComboboxState<TOption>, requestId: number, errorMessage: string) => AsyncComboboxState<TOption>;
31
+ export declare const getComboboxViewState: ({ isLoading, error, optionCount, }: {
32
+ isLoading: boolean;
33
+ error: string | null;
34
+ optionCount: number;
35
+ }) => ComboboxViewState;
@@ -3,6 +3,31 @@ html {
3
3
  box-sizing: border-box;
4
4
  }
5
5
 
6
+ /* Default themed scrollbar styling for all scroll containers */
7
+ * {
8
+ scrollbar-width: thin;
9
+ scrollbar-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.35)) var(--mm-scrollbar-track-color, transparent);
10
+ }
11
+
12
+ *::-webkit-scrollbar {
13
+ width: 10px;
14
+ height: 10px;
15
+ }
16
+
17
+ *::-webkit-scrollbar-track {
18
+ background: var(--mm-scrollbar-track-color, transparent);
19
+ }
20
+
21
+ *::-webkit-scrollbar-thumb {
22
+ background-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.35));
23
+ border-radius: 8px;
24
+ border: 2px solid var(--mm-scrollbar-track-color, transparent);
25
+ }
26
+
27
+ *::-webkit-scrollbar-thumb:hover {
28
+ background-color: var(--mm-scrollbar-thumb-hover-color, rgba(128, 128, 128, 0.5));
29
+ }
30
+
6
31
  *, *:before, *:after {
7
32
  box-sizing: inherit;
8
33
  }
@@ -495,7 +520,7 @@ td, th {
495
520
  }
496
521
  .collection .collection-item.active {
497
522
  background-color: #26a69a;
498
- color: rgb(234.25, 250.25, 248.75);
523
+ color: rgb(91.862745098%, 98.137254902%, 97.5490196078%);
499
524
  }
500
525
  .collection .collection-item.active .secondary-content {
501
526
  color: var(--mm-text-on-primary, #fff);
@@ -624,6 +649,72 @@ td, th {
624
649
  /*******************
625
650
  Utility Classes
626
651
  *******************/
652
+ .mm-layout-row {
653
+ display: flex;
654
+ }
655
+
656
+ .mm-layout-row--center {
657
+ align-items: center;
658
+ }
659
+
660
+ .mm-layout-row--align-end {
661
+ align-items: flex-end;
662
+ }
663
+
664
+ .mm-layout-row--wrap {
665
+ flex-wrap: wrap;
666
+ }
667
+
668
+ .mm-layout-row--justify-start {
669
+ justify-content: flex-start;
670
+ }
671
+
672
+ .mm-layout-row--justify-end {
673
+ justify-content: flex-end;
674
+ }
675
+
676
+ .mm-layout-row--justify-between {
677
+ justify-content: space-between;
678
+ }
679
+
680
+ .mm-layout-stack {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: var(--mm-layout-gap, 0);
684
+ }
685
+
686
+ .mm-layout-cluster {
687
+ display: flex;
688
+ align-items: center;
689
+ flex-wrap: wrap;
690
+ gap: var(--mm-layout-gap, 8px);
691
+ }
692
+
693
+ .mm-layout-grow {
694
+ flex: 1 1 auto;
695
+ min-width: 0;
696
+ }
697
+
698
+ .mm-layout-ml-auto {
699
+ margin-left: auto;
700
+ }
701
+
702
+ .mm-layout-ml-8 {
703
+ margin-left: var(--mm-layout-inline-gap, 8px);
704
+ }
705
+
706
+ .mm-layout-mr-8 {
707
+ margin-right: var(--mm-layout-inline-gap, 8px);
708
+ }
709
+
710
+ .mm-layout-item-icon {
711
+ margin-right: var(--mm-layout-icon-gap, 32px);
712
+ }
713
+
714
+ .mm-layout-gap-sm {
715
+ gap: var(--mm-layout-gap-sm, 8px);
716
+ }
717
+
627
718
  .hide {
628
719
  display: none !important;
629
720
  }
@@ -745,24 +836,24 @@ td, th {
745
836
 
746
837
  .btn:focus, .btn-small:focus, .btn-large:focus,
747
838
  .btn-floating:focus {
748
- background-color: rgb(28.5, 124.5, 115.5);
839
+ background-color: var(--mm-primary-color-dark, rgb(11.1764705882%, 48.8235294118%, 45.2941176471%));
749
840
  }
750
841
 
751
842
  .btn, .btn-small, .btn-large {
752
843
  text-decoration: none;
753
- color: #fff;
754
- background-color: #26a69a;
844
+ color: var(--mm-button-text, #fff);
845
+ background-color: var(--mm-primary-color, #26a69a);
755
846
  text-align: center;
756
847
  letter-spacing: 0.5px;
757
848
  transition: background-color 0.2s ease-out;
758
849
  cursor: pointer;
759
850
  }
760
851
  .btn:hover, .btn-small:hover, .btn-large:hover {
761
- background-color: rgb(42.75, 186.75, 173.25);
852
+ background-color: var(--mm-primary-color-dark, rgb(16.7647058824%, 73.2352941176%, 67.9411764706%));
762
853
  }
763
854
 
764
855
  .btn-floating:hover {
765
- background-color: #26a69a;
856
+ background-color: var(--mm-primary-color-dark, #26a69a);
766
857
  }
767
858
  .btn-floating:before {
768
859
  border-radius: 0;
@@ -799,7 +890,7 @@ td, th {
799
890
  }
800
891
  .btn-floating {
801
892
  display: inline-block;
802
- color: #fff;
893
+ color: var(--mm-button-text, #fff);
803
894
  position: relative;
804
895
  overflow: hidden;
805
896
  z-index: 1;
@@ -807,7 +898,7 @@ td, th {
807
898
  height: 40px;
808
899
  line-height: 40px;
809
900
  padding: 0;
810
- background-color: #26a69a;
901
+ background-color: var(--mm-primary-color, #26a69a);
811
902
  border-radius: 50%;
812
903
  transition: background-color 0.3s;
813
904
  cursor: pointer;
@@ -817,7 +908,7 @@ td, th {
817
908
  width: inherit;
818
909
  display: inline-block;
819
910
  text-align: center;
820
- color: #fff;
911
+ color: var(--mm-button-text, #fff);
821
912
  font-size: 1.6rem;
822
913
  line-height: 40px;
823
914
  }
@@ -935,7 +1026,7 @@ button.btn-floating {
935
1026
  z-index: -1;
936
1027
  width: 40px;
937
1028
  height: 40px;
938
- background-color: #26a69a;
1029
+ background-color: var(--mm-primary-color, #26a69a);
939
1030
  border-radius: 50%;
940
1031
  transform: scale(0);
941
1032
  }
@@ -955,7 +1046,7 @@ button.btn-floating {
955
1046
  }
956
1047
  .btn-flat.disabled, .btn-flat.btn-flat[disabled] {
957
1048
  background-color: transparent !important;
958
- color: var(--mm-text-disabled, rgb(178.5, 178.5, 178.5)) !important;
1049
+ color: var(--mm-text-disabled, rgb(70%, 70%, 70%)) !important;
959
1050
  cursor: default;
960
1051
  }
961
1052
 
@@ -1142,7 +1233,7 @@ button.btn-floating {
1142
1233
  }
1143
1234
 
1144
1235
  body.keyboard-focused .dropdown-content li:focus {
1145
- background-color: var(--mm-dropdown-focus, rgb(217.6, 217.6, 217.6));
1236
+ background-color: var(--mm-dropdown-focus, rgb(85.3333333333%, 85.3333333333%, 85.3333333333%));
1146
1237
  }
1147
1238
 
1148
1239
  .input-field.col .dropdown-content [type=checkbox] + label {
@@ -1198,7 +1289,7 @@ body.keyboard-focused .dropdown-content li:focus {
1198
1289
  text-transform: uppercase;
1199
1290
  }
1200
1291
  .tabs .tab a:focus, .tabs .tab a:focus.active {
1201
- background-color: rgba(246.0277777778, 178.4722222222, 181.1111111111, 0.2);
1292
+ background-color: rgba(96.4814814815%, 69.9891067538%, 71.0239651416%, 0.2);
1202
1293
  outline: none;
1203
1294
  }
1204
1295
  .tabs .tab a:hover, .tabs .tab a.active {
@@ -1224,7 +1315,7 @@ body.keyboard-focused .dropdown-content li:focus {
1224
1315
  position: absolute;
1225
1316
  bottom: 0;
1226
1317
  height: 2px;
1227
- background-color: rgb(246.0277777778, 178.4722222222, 181.1111111111);
1318
+ background-color: rgb(96.4814814815%, 69.9891067538%, 71.0239651416%);
1228
1319
  will-change: left, right;
1229
1320
  }
1230
1321
 
@@ -3129,6 +3220,7 @@ body.dark {
3129
3220
  --mm-primary-color: #26a69a;
3130
3221
  --mm-primary-color-light: #80cbc4;
3131
3222
  --mm-primary-color-dark: #00695c;
3223
+ --mm-range-value-text: #000000;
3132
3224
  --mm-secondary-color: #ff6f00;
3133
3225
  --mm-secondary-color-light: #ffa726;
3134
3226
  --mm-secondary-color-dark: #ef6c00;
@@ -3139,6 +3231,7 @@ body.dark {
3139
3231
  --mm-text-secondary: rgba(0, 0, 0, 0.6);
3140
3232
  --mm-text-disabled: rgba(0, 0, 0, 0.38);
3141
3233
  --mm-text-hint: rgba(0, 0, 0, 0.38);
3234
+ --mm-error-color: #f44336;
3142
3235
  --mm-border-color: rgba(0, 0, 0, 0.12);
3143
3236
  --mm-divider-color: rgba(0, 0, 0, 0.12);
3144
3237
  --mm-input-background: #ffffff;
@@ -3163,6 +3256,9 @@ body.dark {
3163
3256
  --mm-shadow-umbra: rgba(0, 0, 0, 0.2);
3164
3257
  --mm-shadow-penumbra: rgba(0, 0, 0, 0.14);
3165
3258
  --mm-shadow-ambient: rgba(0, 0, 0, 0.12);
3259
+ --mm-scrollbar-track-color: #f1f1f1;
3260
+ --mm-scrollbar-thumb-color: rgba(0, 0, 0, 0.35);
3261
+ --mm-scrollbar-thumb-hover-color: rgba(0, 0, 0, 0.5);
3166
3262
  --mm-switch-checked-track: rgba(38, 166, 154, 0.3);
3167
3263
  --mm-switch-checked-thumb: #26a69a;
3168
3264
  --mm-switch-unchecked-track: rgba(0, 0, 0, 0.6);
@@ -3186,6 +3282,7 @@ body {
3186
3282
  --mm-primary-color: #80cbc4;
3187
3283
  --mm-primary-color-light: #b2dfdb;
3188
3284
  --mm-primary-color-dark: #4db6ac;
3285
+ --mm-range-value-text: #000000;
3189
3286
  --mm-secondary-color: #ffa726;
3190
3287
  --mm-secondary-color-light: #ffcc02;
3191
3288
  --mm-secondary-color-dark: #ff8f00;
@@ -3196,6 +3293,7 @@ body {
3196
3293
  --mm-text-secondary: rgba(255, 255, 255, 0.6);
3197
3294
  --mm-text-disabled: rgba(255, 255, 255, 0.38);
3198
3295
  --mm-text-hint: rgba(255, 255, 255, 0.38);
3296
+ --mm-error-color: #ef5350;
3199
3297
  --mm-border-color: rgba(255, 255, 255, 0.12);
3200
3298
  --mm-divider-color: rgba(255, 255, 255, 0.12);
3201
3299
  --mm-input-background: #2d2d2d;
@@ -3221,6 +3319,9 @@ body {
3221
3319
  --mm-dropdown-selected: #1e3a8a;
3222
3320
  --mm-row-hover: rgba(255, 255, 255, 0.04);
3223
3321
  --mm-row-stripe: rgba(255, 255, 255, 0.02);
3322
+ --mm-scrollbar-track-color: #1e1e1e;
3323
+ --mm-scrollbar-thumb-color: rgba(255, 255, 255, 0.3);
3324
+ --mm-scrollbar-thumb-hover-color: rgba(255, 255, 255, 0.45);
3224
3325
  --mm-switch-checked-track: rgba(128, 203, 196, 0.3);
3225
3326
  --mm-switch-checked-thumb: #80cbc4;
3226
3327
  --mm-switch-unchecked-track: rgba(255, 255, 255, 0.6);
@@ -3235,6 +3336,7 @@ body {
3235
3336
  --mm-primary-color: #80cbc4;
3236
3337
  --mm-primary-color-light: #b2dfdb;
3237
3338
  --mm-primary-color-dark: #4db6ac;
3339
+ --mm-range-value-text: #000000;
3238
3340
  --mm-secondary-color: #ffa726;
3239
3341
  --mm-secondary-color-light: #ffcc02;
3240
3342
  --mm-secondary-color-dark: #ff8f00;
@@ -3245,6 +3347,7 @@ body {
3245
3347
  --mm-text-secondary: rgba(255, 255, 255, 0.6);
3246
3348
  --mm-text-disabled: rgba(255, 255, 255, 0.38);
3247
3349
  --mm-text-hint: rgba(255, 255, 255, 0.38);
3350
+ --mm-error-color: #ef5350;
3248
3351
  --mm-border-color: rgba(255, 255, 255, 0.12);
3249
3352
  --mm-divider-color: rgba(255, 255, 255, 0.12);
3250
3353
  --mm-input-background: #2d2d2d;
@@ -3270,6 +3373,9 @@ body {
3270
3373
  --mm-switch-disabled-track: rgba(255, 255, 255, 0.2);
3271
3374
  --mm-switch-disabled-thumb: #424242;
3272
3375
  --mm-table-striped-color: rgba(255, 255, 255, 0.05);
3376
+ --mm-scrollbar-track-color: #1e1e1e;
3377
+ --mm-scrollbar-thumb-color: rgba(255, 255, 255, 0.3);
3378
+ --mm-scrollbar-thumb-hover-color: rgba(255, 255, 255, 0.45);
3273
3379
  }
3274
3380
  }
3275
3381
  .timeline {
@@ -4557,6 +4663,13 @@ nav .theme-toggle:focus {
4557
4663
  flex-shrink: 0;
4558
4664
  }
4559
4665
 
4666
+ .badge-showcase {
4667
+ display: flex;
4668
+ align-items: center;
4669
+ flex-wrap: wrap;
4670
+ gap: var(--mm-badge-showcase-gap, 20px);
4671
+ }
4672
+
4560
4673
  .m-badge {
4561
4674
  position: absolute;
4562
4675
  display: flex;