mithril-materialized 3.15.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 (47) hide show
  1. package/README.md +32 -2
  2. package/dist/advanced.css +109 -4
  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 +144 -17
  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 +357 -22
  12. package/dist/index.d.ts +3 -2
  13. package/dist/index.esm.js +728 -299
  14. package/dist/index.esm.js.map +1 -0
  15. package/dist/index.js +741 -298
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.min.css +2 -2
  18. package/dist/index.umd.js +741 -298
  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 +11 -1
  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 +20 -20
  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/_sidenav.scss +21 -3
  40. package/sass/components/_theme-variables.scss +22 -1
  41. package/sass/components/_toggle-group.scss +3 -0
  42. package/sass/components/forms/_form-groups.scss +1 -1
  43. package/sass/components/forms/_form-section.scss +63 -0
  44. package/sass/components/forms/_forms.scss +1 -0
  45. package/sass/components/forms/_input-fields.scss +55 -0
  46. package/sass/components/forms/_range-enhanced.scss +3 -3
  47. 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
  }
@@ -861,18 +952,32 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
861
952
  margin: 0;
862
953
  transform: translateX(-100%);
863
954
  height: 100%;
864
- height: calc(100% + 60px);
865
- height: -moz-calc(100%);
866
- padding-bottom: 60px;
955
+ padding-bottom: 0;
867
956
  background-color: var(--mm-surface-color, #fff);
868
957
  z-index: 999;
869
958
  overflow-y: auto;
959
+ overflow-x: hidden;
870
960
  will-change: transform;
871
961
  backface-visibility: hidden;
872
962
  transform: translateX(-105%);
873
963
  transition: transform 0.3s ease, left 0.3s ease, right 0.3s ease;
874
964
  display: flex;
875
965
  flex-direction: column;
966
+ scrollbar-width: thin;
967
+ scrollbar-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.3)) transparent;
968
+ }
969
+ .sidenav::-webkit-scrollbar {
970
+ width: 4px;
971
+ }
972
+ .sidenav::-webkit-scrollbar-track {
973
+ background: transparent;
974
+ }
975
+ .sidenav::-webkit-scrollbar-thumb {
976
+ background: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.3));
977
+ border-radius: 2px;
978
+ }
979
+ .sidenav::-webkit-scrollbar-thumb:hover {
980
+ background: var(--mm-scrollbar-thumb-hover-color, rgba(128, 128, 128, 0.5));
876
981
  }
877
982
  .sidenav.sidenav-left {
878
983
  left: 0;
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
 
@@ -1659,18 +1750,32 @@ ul.sidenav.right-aligned li > a:not(.btn):not(.btn-large):not(.btn-flat):not(.bt
1659
1750
  margin: 0;
1660
1751
  transform: translateX(-100%);
1661
1752
  height: 100%;
1662
- height: calc(100% + 60px);
1663
- height: -moz-calc(100%);
1664
- padding-bottom: 60px;
1753
+ padding-bottom: 0;
1665
1754
  background-color: var(--mm-surface-color, #fff);
1666
1755
  z-index: 999;
1667
1756
  overflow-y: auto;
1757
+ overflow-x: hidden;
1668
1758
  will-change: transform;
1669
1759
  backface-visibility: hidden;
1670
1760
  transform: translateX(-105%);
1671
1761
  transition: transform 0.3s ease, left 0.3s ease, right 0.3s ease;
1672
1762
  display: flex;
1673
1763
  flex-direction: column;
1764
+ scrollbar-width: thin;
1765
+ scrollbar-color: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.3)) transparent;
1766
+ }
1767
+ .sidenav::-webkit-scrollbar {
1768
+ width: 4px;
1769
+ }
1770
+ .sidenav::-webkit-scrollbar-track {
1771
+ background: transparent;
1772
+ }
1773
+ .sidenav::-webkit-scrollbar-thumb {
1774
+ background: var(--mm-scrollbar-thumb-color, rgba(128, 128, 128, 0.3));
1775
+ border-radius: 2px;
1776
+ }
1777
+ .sidenav::-webkit-scrollbar-thumb:hover {
1778
+ background: var(--mm-scrollbar-thumb-hover-color, rgba(128, 128, 128, 0.5));
1674
1779
  }
1675
1780
  .sidenav.sidenav-left {
1676
1781
  left: 0;
@@ -3115,6 +3220,7 @@ body.dark {
3115
3220
  --mm-primary-color: #26a69a;
3116
3221
  --mm-primary-color-light: #80cbc4;
3117
3222
  --mm-primary-color-dark: #00695c;
3223
+ --mm-range-value-text: #000000;
3118
3224
  --mm-secondary-color: #ff6f00;
3119
3225
  --mm-secondary-color-light: #ffa726;
3120
3226
  --mm-secondary-color-dark: #ef6c00;
@@ -3125,6 +3231,7 @@ body.dark {
3125
3231
  --mm-text-secondary: rgba(0, 0, 0, 0.6);
3126
3232
  --mm-text-disabled: rgba(0, 0, 0, 0.38);
3127
3233
  --mm-text-hint: rgba(0, 0, 0, 0.38);
3234
+ --mm-error-color: #f44336;
3128
3235
  --mm-border-color: rgba(0, 0, 0, 0.12);
3129
3236
  --mm-divider-color: rgba(0, 0, 0, 0.12);
3130
3237
  --mm-input-background: #ffffff;
@@ -3149,6 +3256,9 @@ body.dark {
3149
3256
  --mm-shadow-umbra: rgba(0, 0, 0, 0.2);
3150
3257
  --mm-shadow-penumbra: rgba(0, 0, 0, 0.14);
3151
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);
3152
3262
  --mm-switch-checked-track: rgba(38, 166, 154, 0.3);
3153
3263
  --mm-switch-checked-thumb: #26a69a;
3154
3264
  --mm-switch-unchecked-track: rgba(0, 0, 0, 0.6);
@@ -3172,6 +3282,7 @@ body {
3172
3282
  --mm-primary-color: #80cbc4;
3173
3283
  --mm-primary-color-light: #b2dfdb;
3174
3284
  --mm-primary-color-dark: #4db6ac;
3285
+ --mm-range-value-text: #000000;
3175
3286
  --mm-secondary-color: #ffa726;
3176
3287
  --mm-secondary-color-light: #ffcc02;
3177
3288
  --mm-secondary-color-dark: #ff8f00;
@@ -3182,6 +3293,7 @@ body {
3182
3293
  --mm-text-secondary: rgba(255, 255, 255, 0.6);
3183
3294
  --mm-text-disabled: rgba(255, 255, 255, 0.38);
3184
3295
  --mm-text-hint: rgba(255, 255, 255, 0.38);
3296
+ --mm-error-color: #ef5350;
3185
3297
  --mm-border-color: rgba(255, 255, 255, 0.12);
3186
3298
  --mm-divider-color: rgba(255, 255, 255, 0.12);
3187
3299
  --mm-input-background: #2d2d2d;
@@ -3207,6 +3319,9 @@ body {
3207
3319
  --mm-dropdown-selected: #1e3a8a;
3208
3320
  --mm-row-hover: rgba(255, 255, 255, 0.04);
3209
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);
3210
3325
  --mm-switch-checked-track: rgba(128, 203, 196, 0.3);
3211
3326
  --mm-switch-checked-thumb: #80cbc4;
3212
3327
  --mm-switch-unchecked-track: rgba(255, 255, 255, 0.6);
@@ -3221,6 +3336,7 @@ body {
3221
3336
  --mm-primary-color: #80cbc4;
3222
3337
  --mm-primary-color-light: #b2dfdb;
3223
3338
  --mm-primary-color-dark: #4db6ac;
3339
+ --mm-range-value-text: #000000;
3224
3340
  --mm-secondary-color: #ffa726;
3225
3341
  --mm-secondary-color-light: #ffcc02;
3226
3342
  --mm-secondary-color-dark: #ff8f00;
@@ -3231,6 +3347,7 @@ body {
3231
3347
  --mm-text-secondary: rgba(255, 255, 255, 0.6);
3232
3348
  --mm-text-disabled: rgba(255, 255, 255, 0.38);
3233
3349
  --mm-text-hint: rgba(255, 255, 255, 0.38);
3350
+ --mm-error-color: #ef5350;
3234
3351
  --mm-border-color: rgba(255, 255, 255, 0.12);
3235
3352
  --mm-divider-color: rgba(255, 255, 255, 0.12);
3236
3353
  --mm-input-background: #2d2d2d;
@@ -3256,6 +3373,9 @@ body {
3256
3373
  --mm-switch-disabled-track: rgba(255, 255, 255, 0.2);
3257
3374
  --mm-switch-disabled-thumb: #424242;
3258
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);
3259
3379
  }
3260
3380
  }
3261
3381
  .timeline {
@@ -4543,6 +4663,13 @@ nav .theme-toggle:focus {
4543
4663
  flex-shrink: 0;
4544
4664
  }
4545
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
+
4546
4673
  .m-badge {
4547
4674
  position: absolute;
4548
4675
  display: flex;