@ng-matero/extensions 17.1.4 → 17.2.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 (70) hide show
  1. package/_index.scss +2 -0
  2. package/alert/_alert-theme.scss +10 -5
  3. package/alert/alert.scss +4 -1
  4. package/colorpicker/_colorpicker-theme.scss +9 -5
  5. package/colorpicker/colorpicker.d.ts +5 -11
  6. package/core/style/_sass-utils.scss +19 -0
  7. package/core/theming/_inspection.scss +38 -0
  8. package/core/theming/_validation.scss +5 -0
  9. package/core/tokens/_token-utils.scss +140 -0
  10. package/core/tokens/m2/_index.scss +23 -2
  11. package/core/tokens/m2/mtx/_alert.scss +1 -0
  12. package/core/tokens/m2/mtx/_datetimepicker.scss +11 -6
  13. package/core/tokens/m2/mtx/_grid.scss +3 -2
  14. package/core/tokens/m2/mtx/_popover.scss +1 -1
  15. package/core/tokens/m2/mtx/_select.scss +1 -1
  16. package/datetimepicker/_datetimepicker-theme.scss +14 -12
  17. package/datetimepicker/calendar.scss +13 -0
  18. package/datetimepicker/clock.scss +5 -5
  19. package/datetimepicker/datetimepicker-content.scss +9 -2
  20. package/datetimepicker/datetimepicker.d.ts +5 -11
  21. package/datetimepicker/time.scss +10 -8
  22. package/drawer/_drawer-theme.scss +10 -5
  23. package/esm2022/alert/alert.mjs +2 -2
  24. package/esm2022/colorpicker/colorpicker.mjs +10 -16
  25. package/esm2022/datetimepicker/calendar.mjs +3 -3
  26. package/esm2022/datetimepicker/clock.mjs +3 -3
  27. package/esm2022/datetimepicker/datetimepicker.mjs +11 -16
  28. package/esm2022/datetimepicker/time.mjs +3 -3
  29. package/esm2022/grid/grid.mjs +3 -3
  30. package/esm2022/popover/popover.mjs +3 -3
  31. package/esm2022/select/select.mjs +3 -3
  32. package/esm2022/split/split.mjs +7 -14
  33. package/experimental/_index.scss +5 -0
  34. package/experimental/theming/_color-api-back-compat.scss +46 -0
  35. package/experimental/theming/_config-validation.scss +166 -0
  36. package/experimental/theming/_custom-tokens.scss +315 -0
  37. package/experimental/theming/_definition.scss +104 -0
  38. package/experimental/theming/_format-tokens.scss +5 -0
  39. package/experimental/theming/_m3-density.scss +50 -0
  40. package/experimental/theming/_m3-tokens.scss +308 -0
  41. package/fesm2022/mtxAlert.mjs +2 -2
  42. package/fesm2022/mtxAlert.mjs.map +1 -1
  43. package/fesm2022/mtxColorpicker.mjs +10 -16
  44. package/fesm2022/mtxColorpicker.mjs.map +1 -1
  45. package/fesm2022/mtxDatetimepicker.mjs +16 -21
  46. package/fesm2022/mtxDatetimepicker.mjs.map +1 -1
  47. package/fesm2022/mtxGrid.mjs +2 -2
  48. package/fesm2022/mtxGrid.mjs.map +1 -1
  49. package/fesm2022/mtxPopover.mjs +2 -2
  50. package/fesm2022/mtxPopover.mjs.map +1 -1
  51. package/fesm2022/mtxSelect.mjs +2 -2
  52. package/fesm2022/mtxSelect.mjs.map +1 -1
  53. package/fesm2022/mtxSplit.mjs +6 -13
  54. package/fesm2022/mtxSplit.mjs.map +1 -1
  55. package/grid/_grid-theme.scss +9 -5
  56. package/grid/grid.scss +18 -8
  57. package/loader/_loader-theme.scss +10 -5
  58. package/package.json +12 -12
  59. package/popover/_popover-theme.scss +10 -5
  60. package/popover/popover.scss +1 -1
  61. package/prebuilt-themes/deeppurple-amber.css +1 -1
  62. package/prebuilt-themes/indigo-pink.css +1 -1
  63. package/prebuilt-themes/pink-bluegrey.css +1 -1
  64. package/prebuilt-themes/purple-green.css +1 -1
  65. package/progress/_progress-theme.scss +10 -5
  66. package/select/_select-theme.scss +14 -12
  67. package/select/select.scss +1 -1
  68. package/split/_split-theme.scss +15 -12
  69. package/split/split.d.ts +3 -9
  70. package/tooltip/_tooltip-theme.scss +9 -5
@@ -0,0 +1,166 @@
1
+ @use 'sass:list';
2
+ @use 'sass:map';
3
+ @use 'sass:meta';
4
+ @use 'sass:string';
5
+ @use '@angular/material' as mat;
6
+ @use '@angular/material-experimental' as matx;
7
+
8
+ /// Creates an error message by finding `$config` in the existing message and appending a suffix to
9
+ /// it.
10
+ /// @param {List|String} $err The error message.
11
+ /// @param {String} $suffix The suffix to add.
12
+ /// @return {List|String} The updated error message.
13
+ @function _create-dollar-config-error-message($err, $suffix) {
14
+ @if meta.type-of($err) == 'list' {
15
+ @for $i from 1 through list.length($err) {
16
+ $err: list.set-nth($err, $i,
17
+ _create-dollar-config-error-message(list.nth($err, $i), $suffix));
18
+ }
19
+ }
20
+ @else if meta.type-of($err) == 'string' {
21
+ $start: string.index($err, '$config');
22
+ @if $start {
23
+ $err: string.insert($err, $suffix, $start + 7);
24
+ }
25
+ }
26
+ @return $err;
27
+ }
28
+
29
+ /// Validates that the given object is an M3 palette.
30
+ /// @param {*} $palette The object to test
31
+ /// @return {Boolean|null} null if it is a valid M3 palette, else true.
32
+ @function _validate-palette($palette) {
33
+ @if not meta.type-of($palette) == 'map' {
34
+ @return true;
35
+ }
36
+ $keys: map.keys($palette);
37
+ $expected-keys: map.keys(matx.$m3-red-palette);
38
+ @if mat.private-validate-allowed-values($keys, $expected-keys...) or
39
+ mat.private-validate-required-values($keys, $expected-keys...) {
40
+ @return true;
41
+ }
42
+ $nv-keys: map.keys(map.get($palette, neutral-variant));
43
+ $expected-nv-keys: map.keys(map.get(matx.$m3-red-palette, neutral-variant));
44
+ @if mat.private-validate-allowed-values($nv-keys, $expected-nv-keys...) or
45
+ mat.private-validate-required-values($nv-keys, $expected-nv-keys...) {
46
+ @return true;
47
+ }
48
+ @return null;
49
+ }
50
+
51
+ /// Validates a theme config.
52
+ /// @param {Map} $config The config to test.
53
+ /// @return {List} null if no error, else the error message
54
+ @function validate-theme-config($config) {
55
+ $err: mat.private-validate-type($config, 'map', 'null');
56
+ @if $err {
57
+ @return (#{'$config should be a configuration object. Got:'} $config);
58
+ }
59
+ $allowed: (color, typography, density);
60
+ $err: mat.private-validate-allowed-values(map.keys($config or ()), $allowed...);
61
+ @if $err {
62
+ @return (
63
+ #{'$config has unexpected properties. Valid properties are'}
64
+ #{'#{$allowed}.'}
65
+ #{'Found:'}
66
+ $err
67
+ );
68
+ }
69
+ $err: validate-color-config(map.get($config, color));
70
+ @if $err {
71
+ @return _create-dollar-config-error-message($err, '.color');
72
+ }
73
+ $err: validate-typography-config(map.get($config, typography));
74
+ @if $err {
75
+ @return _create-dollar-config-error-message($err, '.typography');
76
+ }
77
+ $err: validate-density-config(map.get($config, density));
78
+ @if $err {
79
+ @return _create-dollar-config-error-message($err, '.density');
80
+ }
81
+ @return null;
82
+ }
83
+
84
+ /// Validates a theme color config.
85
+ /// @param {Map} $config The config to test.
86
+ /// @return {List} null if no error, else the error message
87
+ @function validate-color-config($config) {
88
+ $err: mat.private-validate-type($config, 'map', 'null');
89
+ @if $err {
90
+ @return (#{'$config should be a color configuration object. Got:'} $config);
91
+ }
92
+ $allowed: (theme-type, primary, tertiary);
93
+ $err: mat.private-validate-allowed-values(map.keys($config or ()), $allowed...);
94
+ @if $err {
95
+ @return (
96
+ #{'$config has unexpected properties. Valid properties are'}
97
+ #{'#{$allowed}.'}
98
+ #{'Found:'}
99
+ $err
100
+ );
101
+ }
102
+ @if $config and map.has-key($config, theme-type) and
103
+ not list.index((light, dark), map.get($config, theme-type)) {
104
+ @return (
105
+ #{'Expected $config.theme-type to be one of: light, dark. Got:'}
106
+ map.get($config, theme-type)
107
+ );
108
+ }
109
+ @each $palette in (primary, secondary, tertiary) {
110
+ @if $config and map.has-key($config, $palette) {
111
+ $err: _validate-palette(map.get($config, $palette));
112
+ @if $err {
113
+ @return (
114
+ #{'Expected $config.#{$palette} to be a valid M3 palette. Got:'}
115
+ map.get($config, $palette)
116
+ );
117
+ }
118
+ }
119
+ }
120
+ @return null;
121
+ }
122
+
123
+ /// Validates a theme typography config.
124
+ /// @param {Map} $config The config to test.
125
+ /// @return {List} null if no error, else the error message
126
+ @function validate-typography-config($config) {
127
+ $err: mat.private-validate-type($config, 'map', 'null');
128
+ @if $err {
129
+ @return (#{'$config should be a typography configuration object. Got:'} $config);
130
+ }
131
+ $allowed: (brand-family, plain-family, bold-weight, medium-weight, regular-weight);
132
+ $err: mat.private-validate-allowed-values(map.keys($config or ()), $allowed...);
133
+ @if $err {
134
+ @return (
135
+ #{'$config has unexpected properties. Valid properties are'}
136
+ #{'#{$allowed}.'}
137
+ #{'Found:'}
138
+ $err
139
+ );
140
+ }
141
+ @return null;
142
+ }
143
+
144
+ /// Validates a theme density config.
145
+ /// @param {Map} $config The config to test.
146
+ /// @return {List} null if no error, else the error message
147
+ @function validate-density-config($config) {
148
+ $err: mat.private-validate-type($config, 'map', 'null');
149
+ @if $err {
150
+ @return (#{'$config should be a density configuration object. Got:'} $config);
151
+ }
152
+ $err: mat.private-validate-allowed-values(map.keys($config or ()), scale);
153
+ @if $err {
154
+ @return (#{'$config has unexpected properties. Valid properties are: scale. Found:'} $err);
155
+ }
156
+ @if $config and map.has-key($config, scale) {
157
+ $allowed-scales: (0, -1, -2, -3, -4, -5, minimum, maximum);
158
+ @if mat.private-validate-allowed-values(map.get($config, scale), $allowed-scales...) {
159
+ @return (
160
+ #{'Expected $config.scale to be one of: #{$allowed-scales}. Got:'}
161
+ map.get($config, scale)
162
+ );
163
+ }
164
+ }
165
+ @return null;
166
+ }
@@ -0,0 +1,315 @@
1
+ @use 'sass:map';
2
+ @use '@angular/material' as mat;
3
+ @use '@angular/material-experimental' as matx;
4
+ @use '@material/elevation/elevation-theme' as mdc-elevation;
5
+
6
+ /// Hardcode the given value, or null if hardcoded values are excluded.
7
+ @function _hardcode($value, $exclude-hardcoded) {
8
+ @return if($exclude-hardcoded, null, $value);
9
+ }
10
+
11
+ /// Sets all of the standard typography tokens for the given token base name to the given typography
12
+ /// level.
13
+ /// @param {Map} $systems The MDC system tokens
14
+ /// @param {String} $base-name The token base name to get the typography tokens for
15
+ /// @param {String} $typography-level The typography level to base the token values on
16
+ /// @return {Map} A map containing the typography tokens for the given base token name
17
+ @function _generate-typography-tokens($systems, $base-name, $typography-level) {
18
+ $result: ();
19
+ @each $prop in (font, line-height, size, tracking, weight) {
20
+ $result: map.set($result, #{$base-name}-#{$prop},
21
+ map.get($systems, md-sys-typescale, #{$typography-level}-#{$prop}));
22
+ }
23
+ @return $result;
24
+ }
25
+
26
+ @function alert($systems, $exclude-hardcoded) {
27
+ @return (
28
+ container-shape: map.get($systems, md-sys-shape, corner-small),
29
+
30
+ outline-color: _hardcode(transparent, $exclude-hardcoded),
31
+ background-color: map.get($systems, md-sys-color, surface-container),
32
+ text-color: map.get($systems, md-sys-color, on-surface),
33
+ info-background-color: map.get(matx.$m3-blue-palette, 50),
34
+ info-text-color: _hardcode(white, $exclude-hardcoded),
35
+ success-background-color: map.get(matx.$m3-green-palette, 50),
36
+ success-text-color: _hardcode(white, $exclude-hardcoded),
37
+ warning-background-color: map.get(matx.$m3-orange-palette, 50),
38
+ warning-text-color: _hardcode(white, $exclude-hardcoded),
39
+ danger-background-color: map.get(matx.$m3-red-palette, 50),
40
+ danger-text-color: _hardcode(white, $exclude-hardcoded),
41
+ );
42
+ }
43
+
44
+ @function colorpicker($systems, $exclude-hardcoded) {
45
+ @return (
46
+ toggle-active-state-icon-color: map.get($systems, md-sys-color, on-surface-variant),
47
+ toggle-icon-color: map.get($systems, md-sys-color, on-surface-variant),
48
+ );
49
+ }
50
+
51
+ @function datetimepicker($systems, $exclude-hardcoded) {
52
+ @return ((
53
+ calendar-header-background-color: _hardcode(transparent, $exclude-hardcoded),
54
+ calendar-date-selected-state-text-color: map.get($systems, md-sys-color, on-primary),
55
+ calendar-date-selected-state-background-color: map.get($systems, md-sys-color, primary),
56
+ calendar-date-selected-disabled-state-background-color: mat.private-safe-color-change(
57
+ map.get($systems, md-sys-color, on-surface),
58
+ $alpha: 0.38
59
+ ),
60
+ calendar-date-today-selected-state-outline-color: map.get($systems, md-sys-color, primary),
61
+ calendar-date-focus-state-background-color: mat.private-safe-color-change(
62
+ map.get($systems, md-sys-color, on-surface),
63
+ $alpha: map.get($systems, md-sys-state, focus-state-layer-opacity)
64
+ ),
65
+ calendar-date-hover-state-background-color: mat.private-safe-color-change(
66
+ map.get($systems, md-sys-color, on-surface),
67
+ $alpha: map.get($systems, md-sys-state, hover-state-layer-opacity)
68
+ ),
69
+ toggle-active-state-icon-color: map.get($systems, md-sys-color, on-surface-variant),
70
+ toggle-icon-color: map.get($systems, md-sys-color, on-surface-variant),
71
+ calendar-body-label-text-color: map.get($systems, md-sys-color, on-surface),
72
+ calendar-header-text-color: map.get($systems, md-sys-color, on-surface-variant),
73
+ calendar-header-divider-color: map.get($systems, md-sys-color, outline-variant),
74
+ calendar-table-header-text-color: map.get($systems, md-sys-color, on-surface),
75
+ calendar-date-today-outline-color: map.get($systems, md-sys-color, primary),
76
+ calendar-date-text-color: map.get($systems, md-sys-color, on-surface),
77
+ calendar-date-outline-color: _hardcode(transparent, $exclude-hardcoded),
78
+ calendar-date-disabled-state-text-color: mat.private-safe-color-change(
79
+ map.get($systems, md-sys-color, on-surface),
80
+ $alpha: 0.38
81
+ ),
82
+ container-background-color: map.get($systems, md-sys-color, surface-container-high),
83
+ container-text-color: map.get($systems, md-sys-color, on-surface),
84
+
85
+ clock-dial-background-color: map.get($systems, md-sys-color, surface-container-highest),
86
+ clock-cell-text-color: map.get($systems, md-sys-color, on-surface),
87
+ clock-cell-hover-state-background-color: mat.private-safe-color-change(
88
+ map.get($systems, md-sys-color, on-surface),
89
+ $alpha: map.get($systems, md-sys-state, hover-state-layer-opacity)
90
+ ),
91
+ clock-cell-disabled-state-text-color: mat.private-safe-color-change(
92
+ map.get($systems, md-sys-color, on-surface),
93
+ $alpha: 0.38
94
+ ),
95
+ clock-cell-selected-state-background-color: map.get($systems, md-sys-color, primary),
96
+ clock-hand-background-color: map.get($systems, md-sys-color, primary),
97
+ time-input-active-state-text-color: map.get($systems, md-sys-color, on-primary-container),
98
+ time-input-active-state-background-color: map.get($systems, md-sys-color, primary-container),
99
+ time-input-focus-state-outline-color: map.get($systems, md-sys-color, primary),
100
+ time-input-focus-state-placeholder-text-color: map.get($systems, md-sys-color, on-primary-container),
101
+ time-input-text-color: map.get($systems, md-sys-color, on-surface),
102
+ time-input-background-color: map.get($systems, md-sys-color, surface-container-highest),
103
+ time-input-focus-state-background-color: map.get($systems, md-sys-color, primary-container),
104
+ time-input-warn-state-outline-color: map.get($systems, md-sys-color, error),
105
+ time-ampm-text-color: map.get($systems, md-sys-color, on-surface),
106
+ time-ampm-outline-color: map.get($systems, md-sys-color, outline),
107
+ time-ampm-selected-state-text-color: map.get($systems, md-sys-color, on-tertiary-container),
108
+ time-ampm-selected-state-background-color: map.get($systems, md-sys-color, tertiary-container),
109
+
110
+ container-elevation-shadow: _hardcode(mdc-elevation.elevation-box-shadow(0), $exclude-hardcoded),
111
+ container-touch-elevation-shadow: _hardcode(mdc-elevation.elevation-box-shadow(0), $exclude-hardcoded),
112
+ container-shape: map.get($systems, md-sys-shape, corner-large),
113
+ container-touch-shape: map.get($systems, md-sys-shape, corner-extra-large),
114
+ selector-container-shape: map.get($systems, md-sys-shape, corner-small),
115
+
116
+ calendar-text-font: map.get($systems, md-sys-typescale, body-large-font),
117
+ calendar-text-size: map.get($systems, md-sys-typescale, body-large-size),
118
+ calendar-body-label-text-size: map.get($systems, md-sys-typescale, title-small-size),
119
+ calendar-body-label-text-weight: map.get($systems, md-sys-typescale, title-small-weight),
120
+ calendar-period-button-text-size: map.get($systems, md-sys-typescale, title-small-size),
121
+ calendar-period-button-text-weight: map.get($systems, md-sys-typescale, title-small-weight),
122
+ calendar-header-text-size: map.get($systems, md-sys-typescale, title-small-size),
123
+ calendar-header-text-weight: map.get($systems, md-sys-typescale, title-small-weight),
124
+ clock-text-size: map.get($systems, md-sys-typescale, title-small-size),
125
+ ), (
126
+ // Color variants:
127
+ primary: (), // Default, no overrides needed.
128
+ secondary: (
129
+ calendar-date-selected-state-text-color: map.get($systems, md-sys-color, on-secondary),
130
+ calendar-date-selected-state-background-color: map.get($systems, md-sys-color, secondary),
131
+ calendar-date-today-selected-state-outline-color: map.get($systems, md-sys-color, secondary),
132
+ calendar-date-today-outline-color: map.get($systems, md-sys-color, secondary),
133
+ clock-hand-background-color: map.get($systems, md-sys-color, secondary),
134
+ clock-cell-selected-state-background-color: map.get($systems, md-sys-color, secondary),
135
+ time-input-active-state-text-color: map.get($systems, md-sys-color, on-secondary-container),
136
+ time-input-active-state-background-color: map.get($systems, md-sys-color, secondary-container),
137
+ time-input-focus-state-outline-color: map.get($systems, md-sys-color, secondary),
138
+ time-input-focus-state-placeholder-text-color: map.get($systems, md-sys-color, on-secondary-container),
139
+ time-input-focus-state-background-color: map.get($systems, md-sys-color, secondary-container),
140
+ time-ampm-selected-state-text-color: map.get($systems, md-sys-color, on-tertiary-container),
141
+ time-ampm-selected-state-background-color: map.get($systems, md-sys-color, tertiary-container),
142
+ ),
143
+ tertiary: (
144
+ calendar-date-selected-state-text-color: map.get($systems, md-sys-color, on-tertiary),
145
+ calendar-date-selected-state-background-color: map.get($systems, md-sys-color, tertiary),
146
+ calendar-date-today-selected-state-outline-color: map.get($systems, md-sys-color, tertiary),
147
+ calendar-date-today-outline-color: map.get($systems, md-sys-color, tertiary),
148
+ clock-hand-background-color: map.get($systems, md-sys-color, tertiary),
149
+ clock-cell-selected-state-background-color: map.get($systems, md-sys-color, tertiary),
150
+ time-input-active-state-text-color: map.get($systems, md-sys-color, on-tertiary-container),
151
+ time-input-active-state-background-color: map.get($systems, md-sys-color, tertiary-container),
152
+ time-input-focus-state-outline-color: map.get($systems, md-sys-color, tertiary),
153
+ time-input-focus-state-placeholder-text-color: map.get($systems, md-sys-color, on-tertiary-container),
154
+ time-input-focus-state-background-color: map.get($systems, md-sys-color, tertiary-container),
155
+ time-ampm-selected-state-text-color: map.get($systems, md-sys-color, on-error-container),
156
+ time-ampm-selected-state-background-color: map.get($systems, md-sys-color, error-container),
157
+ ),
158
+ error: (
159
+ calendar-date-selected-state-text-color: map.get($systems, md-sys-color, on-error),
160
+ calendar-date-selected-state-background-color: map.get($systems, md-sys-color, error),
161
+ calendar-date-today-selected-state-outline-color: map.get($systems, md-sys-color, error),
162
+ calendar-date-today-outline-color: map.get($systems, md-sys-color, error),
163
+ clock-hand-background-color: map.get($systems, md-sys-color, error),
164
+ clock-cell-selected-state-background-color: map.get($systems, md-sys-color, error),
165
+ time-input-active-state-text-color: map.get($systems, md-sys-color, on-error-container),
166
+ time-input-active-state-background-color: map.get($systems, md-sys-color, error-container),
167
+ time-input-focus-state-outline-color: map.get($systems, md-sys-color, error),
168
+ time-input-focus-state-placeholder-text-color: map.get($systems, md-sys-color, on-error-container),
169
+ time-input-focus-state-background-color: map.get($systems, md-sys-color, error-container),
170
+ time-ampm-selected-state-text-color: map.get($systems, md-sys-color, on-primary-container),
171
+ time-ampm-selected-state-background-color: map.get($systems, md-sys-color, primary-container),
172
+ )
173
+ ));
174
+ }
175
+
176
+ @function drawer($systems, $exclude-hardcoded) {
177
+ @return (
178
+ container-shape: map.get($systems, md-sys-shape, corner-large),
179
+
180
+ container-background-color: map.get($systems, md-sys-color, surface),
181
+ container-text-color: map.get($systems, md-sys-color, on-surface-variant),
182
+ );
183
+ }
184
+
185
+ @function grid($systems, $exclude-hardcoded) {
186
+ @return (
187
+ container-shape: map.get($systems, md-sys-shape, corner-medium),
188
+ table-cell-min-width: _hardcode(80px, $exclude-hardcoded),
189
+
190
+ outline-color: map.get($systems, md-sys-color, outline-variant),
191
+ column-menu-text-color: map.get($systems, md-sys-color, on-surface-variant),
192
+ column-menu-divider-color: map.get($systems, md-sys-color, outline-variant),
193
+ table-footer-background-color: map.get($systems, md-sys-color, surface-container),
194
+ table-row-striped-background-color: map.get($systems, md-sys-color, surface-container),
195
+ table-row-hover-background-color: map.get($systems, md-sys-color, secondary-container),
196
+ table-row-selected-background-color: map.get($systems, md-sys-color, secondary-container),
197
+ table-row-selected-hover-background-color: map.get($systems, md-sys-color, primary-container),
198
+ table-cell-selected-outline-color: map.get($systems, md-sys-color, primary),
199
+ resizable-handle-active-background-color: map.get($systems, md-sys-color, primary),
200
+ resizable-handle-hover-background-color: map.get($systems, md-sys-color, primary),
201
+ resizable-handle-disabled-background-color: map.get($systems, md-sys-color, outline-variant),
202
+ );
203
+ }
204
+
205
+ @function loader($systems, $exclude-hardcoded) {
206
+ @return (
207
+ backdrop-background-color: mat.private-safe-color-change(
208
+ map.get($systems, md-sys-color, surface),
209
+ $alpha: 0.75
210
+ ),
211
+ );
212
+ }
213
+
214
+ @function popover($systems, $exclude-hardcoded) {
215
+ @return (
216
+ container-shape: map.get($systems, md-sys-shape, corner-extra-small),
217
+
218
+ outline-color: map.get($systems, md-sys-color, surface-container),
219
+ background-color: map.get($systems, md-sys-color, surface-container),
220
+ text-color: map.get($systems, md-sys-color, on-surface),
221
+ );
222
+ }
223
+
224
+ @function progress($systems, $exclude-hardcoded) {
225
+ @return (
226
+ container-shape: map.get($systems, md-sys-shape, corner-extra-small),
227
+
228
+ track-color: map.get($systems, md-sys-color, surface-container),
229
+ indicator-color: map.get($systems, md-sys-color, outline-variant),
230
+ text-color: map.get($systems, md-sys-color, on-surface),
231
+ info-indicator-color: map.get(matx.$m3-blue-palette, 50),
232
+ info-text-color:_hardcode(white, $exclude-hardcoded),
233
+ success-indicator-color: map.get(matx.$m3-green-palette, 50),
234
+ success-text-color:_hardcode(white, $exclude-hardcoded),
235
+ warning-indicator-color: map.get(matx.$m3-orange-palette, 50),
236
+ warning-text-color:_hardcode(white, $exclude-hardcoded),
237
+ danger-indicator-color: map.get(matx.$m3-red-palette, 50),
238
+ danger-text-color:_hardcode(white, $exclude-hardcoded),
239
+ );
240
+ }
241
+
242
+ @function select($systems, $exclude-hardcoded) {
243
+ @return ((
244
+ container-shape: map.get($systems, md-sys-shape, corner-extra-small),
245
+
246
+ container-text-color: map.get($systems, md-sys-color, on-surface),
247
+ placeholder-text-color: mat.private-safe-color-change(
248
+ map.get($systems, md-sys-color, on-surface),
249
+ $alpha: 0.38
250
+ ),
251
+ disabled-text-color: mat.private-safe-color-change(
252
+ map.get($systems, md-sys-color, on-surface),
253
+ $alpha: 0.38
254
+ ),
255
+
256
+ multiple-value-background-color: _hardcode(transparent, $exclude-hardcoded),
257
+ multiple-value-outline-color: map.get($systems, md-sys-color, outline),
258
+ multiple-value-icon-hover-background-color: map.get($systems, md-sys-color, outline-variant),
259
+
260
+ clear-icon-color: map.get($systems, md-sys-color, on-surface),
261
+ clear-icon-hover-color: map.get($systems, md-sys-color, error),
262
+
263
+ enabled-arrow-color: map.get($systems, md-sys-color, on-surface),
264
+ disabled-arrow-color: mat.private-safe-color-change(
265
+ map.get($systems, md-sys-color, on-surface),
266
+ $alpha: 0.38
267
+ ),
268
+ invalid-arrow-color: map.get($systems, md-sys-color, error),
269
+
270
+ panel-background-color: map.get($systems, md-sys-color, surface-container),
271
+ panel-divider-color: map.get($systems, md-sys-color, outline),
272
+ optgroup-label-text-color: map.get($systems, md-sys-color, on-surface),
273
+ option-label-text-color: map.get($systems, md-sys-color, on-surface),
274
+ option-selected-state-background-color: map.get($systems, md-sys-color, secondary-container),
275
+ option-selected-state-text-color: map.get($systems, md-sys-color, on-surface),
276
+ option-hover-state-background-color: mat.private-safe-color-change(
277
+ map.get($systems, md-sys-color, on-surface),
278
+ $alpha: map.get($systems, md-sys-state, hover-state-layer-opacity)
279
+ ),
280
+ option-disabled-state-text-color: mat.private-safe-color-change(
281
+ map.get($systems, md-sys-color, on-surface),
282
+ $alpha: 0.38
283
+ ),
284
+ ), (
285
+ // Color variants:
286
+ primary: (
287
+ option-selected-state-background-color: map.get($systems, md-sys-color, primary-container),
288
+ ),
289
+ secondary: (), // Default, no overrides needed.
290
+ tertiary: (
291
+ option-selected-state-background-color: map.get($systems, md-sys-color, tertiary-container),
292
+ ),
293
+ error: (
294
+ option-selected-state-background-color: map.get($systems, md-sys-color, error-container),
295
+ )
296
+ ));
297
+ }
298
+
299
+ @function split($systems, $exclude-hardcoded) {
300
+ @return ((
301
+ gutter-background-color: map.get($systems, md-sys-color, outline-variant),
302
+ gutter-hover-state-background-color: map.get($systems, md-sys-color, primary),
303
+ ), (
304
+ primary: (),
305
+ secondary: (
306
+ gutter-hover-state-background-color: map.get($systems, md-sys-color, secondary),
307
+ ),
308
+ tertiary: (
309
+ gutter-hover-state-background-color: map.get($systems, md-sys-color, tertiary),
310
+ ),
311
+ error: (
312
+ gutter-hover-state-background-color: map.get($systems, md-sys-color, error),
313
+ )
314
+ ));
315
+ }
@@ -0,0 +1,104 @@
1
+ // This file contains functions used to define Angular Material theme objects.
2
+
3
+ @use 'sass:map';
4
+ @use '@angular/material' as mat;
5
+ @use '@angular/material-experimental' as matx;
6
+ @use './m3-tokens';
7
+ @use './config-validation';
8
+
9
+ /// Map key used to store internals of theme config.
10
+ $internals: _mat-theming-internals-do-not-access;
11
+ /// The theme version of generated themes.
12
+ $theme-version: 1;
13
+
14
+ /// Defines an Angular Material theme object with color, typography, and density settings.
15
+ /// @param {Map} $config The theme configuration
16
+ /// @return {Map} A theme object
17
+ @function define-theme($config: ()) {
18
+ $err: config-validation.validate-theme-config($config);
19
+ @if $err {
20
+ @error $err;
21
+ }
22
+
23
+ @return mat.private-deep-merge-all(
24
+ define-colors(map.get($config, color) or ()),
25
+ define-typography(map.get($config, typography) or ()),
26
+ define-density(map.get($config, density) or ()),
27
+ ($internals: (base-tokens: m3-tokens.generate-base-tokens())),
28
+ );
29
+ }
30
+
31
+ /// Defines an Angular Material theme object with color settings.
32
+ /// @param {Map} $config The color configuration
33
+ /// @return {Map} A theme object
34
+ @function define-colors($config: ()) {
35
+ $err: config-validation.validate-color-config($config);
36
+ @if $err {
37
+ @error $err;
38
+ }
39
+
40
+ $type: map.get($config, theme-type) or light;
41
+ $primary: map.get($config, primary) or matx.$m3-violet-palette;
42
+ $tertiary: map.get($config, tertiary) or $primary;
43
+
44
+ @return (
45
+ $internals: (
46
+ theme-version: $theme-version,
47
+ theme-type: $type,
48
+ palettes: (
49
+ primary: map.remove($primary, neutral, neutral-variant, secondary),
50
+ secondary: map.get($primary, secondary),
51
+ tertiary: map.remove($tertiary, neutral, neutral-variant, secondary),
52
+ neutral: map.get($primary, neutral),
53
+ neutral-variant: map.get($primary, neutral-variant),
54
+ error: map.get($primary, error),
55
+ ),
56
+ color-tokens: m3-tokens.generate-color-tokens(
57
+ $type, $primary, $tertiary, map.get($primary, error))
58
+ )
59
+ );
60
+ }
61
+
62
+ /// Defines an Angular Material theme object with typography settings.
63
+ /// @param {Map} $config The typography configuration
64
+ /// @return {Map} A theme object
65
+ @function define-typography($config: ()) {
66
+ $err: config-validation.validate-typography-config($config);
67
+ @if $err {
68
+ @error $err;
69
+ }
70
+
71
+ $plain: map.get($config, plain-family) or (Roboto, sans-serif);
72
+ $brand: map.get($config, brand-family) or $plain;
73
+ $bold: map.get($config, bold-weight) or 700;
74
+ $medium: map.get($config, medium-weight) or 500;
75
+ $regular: map.get($config, regular-weight) or 400;
76
+
77
+ @return (
78
+ $internals: (
79
+ theme-version: $theme-version,
80
+ typography-tokens: m3-tokens.generate-typography-tokens(
81
+ $brand, $plain, $bold, $medium, $regular)
82
+ )
83
+ );
84
+ }
85
+
86
+ /// Defines an Angular Material theme object with density settings.
87
+ /// @param {Map} $config The density configuration
88
+ /// @return {Map} A theme object
89
+ @function define-density($config: ()) {
90
+ $err: config-validation.validate-density-config($config);
91
+ @if $err {
92
+ @error $err;
93
+ }
94
+
95
+ $density-scale: map.get($config, scale) or 0;
96
+
97
+ @return (
98
+ $internals: (
99
+ theme-version: $theme-version,
100
+ density-scale: $density-scale,
101
+ density-tokens: m3-tokens.generate-density-tokens($density-scale)
102
+ )
103
+ );
104
+ }
@@ -0,0 +1,5 @@
1
+ // DO NOT REMOVE
2
+ // This function is used internally.
3
+ @function private-format-tokens($systems) {
4
+ @return $systems;
5
+ }
@@ -0,0 +1,50 @@
1
+ @use 'sass:list';
2
+ @use 'sass:map';
3
+ @use '@angular/material' as mat;
4
+
5
+ /// Maps namespaced tokens to per-density-scale values.
6
+ /// This is used as a temporary solution for density, since Material Design currently does not have
7
+ /// systemized density.
8
+ /// Format:
9
+ /// (
10
+ /// (mdc, comp): (
11
+ /// token: (<scale 0 value>, <scale -1 value>, <scale -2 value>, ...),
12
+ /// ...
13
+ /// ),
14
+ /// ...
15
+ /// )
16
+ // TODO(mmalerba): Add density tokens for remaining components.
17
+ $_density-tokens: (
18
+ );
19
+
20
+ /// Gets the value for the given density scale from the given set of density values.
21
+ /// @param {List} $density-values The list of values for each density scale.
22
+ /// @param {Number} $scale The density scale to get the value for.
23
+ /// @return {*} The value for the given scale.
24
+ @function _get-value-for-scale($density-values, $scale) {
25
+ $scale: mat.private-clamp-density($scale, -1 * list.length($density-values) + 1);
26
+ $index: -$scale + 1;
27
+ @return list.nth($density-values, $index);
28
+ }
29
+
30
+ /// Gets a map of all density tokens for the given scale
31
+ /// @param {Number} $scale The density scale
32
+ /// @return {Map} Map of all fully qualified density tokens for the given scale.
33
+ @function get-tokens-for-scale($scale) {
34
+ $result: ();
35
+ @each $namespace, $tokens in $_density-tokens {
36
+ @each $token, $density-values in $tokens {
37
+ $tokens: map.set($tokens, $token, _get-value-for-scale($density-values, $scale));
38
+ }
39
+ $result: map.set($result, $namespace, $tokens);
40
+ }
41
+ @return $result;
42
+ }
43
+
44
+ /// Checks whether the given token is systemized by Angular Material's made up density system.
45
+ /// @param {List} $namespace The namespace of the token
46
+ /// @param {String} $token The name of the token
47
+ /// @return {Boolean} Whether the token is systemized by the density system
48
+ @function is-systemized($namespace, $token) {
49
+ @return map.get($_density-tokens, $namespace, $token) != null;
50
+ }