|
| 1 | +@use 'sass:map'; |
| 2 | + |
| 3 | +// Sorted alphabetically by component name, matching the $registry map order below. |
| 4 | +@use '../m3-app'; |
| 5 | +@use '../../autocomplete/m3-autocomplete'; |
| 6 | +@use '../../badge/m3-badge'; |
| 7 | +@use '../../bottom-sheet/m3-bottom-sheet'; |
| 8 | +@use '../../button/m3-button'; |
| 9 | +@use '../../button/m3-fab'; |
| 10 | +@use '../../button/m3-icon-button'; |
| 11 | +@use '../../button-toggle/m3-button-toggle'; |
| 12 | +@use '../../card/m3-card'; |
| 13 | +@use '../../checkbox/m3-checkbox'; |
| 14 | +@use '../../chips/m3-chip'; |
| 15 | +@use '../../datepicker/m3-datepicker'; |
| 16 | +@use '../../dialog/m3-dialog'; |
| 17 | +@use '../../divider/m3-divider'; |
| 18 | +@use '../../expansion/m3-expansion'; |
| 19 | +@use '../../form-field/m3-form-field'; |
| 20 | +@use '../../grid-list/m3-grid-list'; |
| 21 | +@use '../../icon/m3-icon'; |
| 22 | +@use '../../list/m3-list'; |
| 23 | +@use '../../menu/m3-menu'; |
| 24 | +@use '../option/m3-optgroup'; |
| 25 | +@use '../option/m3-option'; |
| 26 | +@use '../../paginator/m3-paginator'; |
| 27 | +@use '../../progress-bar/m3-progress-bar'; |
| 28 | +@use '../../progress-spinner/m3-progress-spinner'; |
| 29 | +@use '../selection/pseudo-checkbox/m3-pseudo-checkbox'; |
| 30 | +@use '../../radio/m3-radio'; |
| 31 | +@use '../ripple/m3-ripple'; |
| 32 | +@use '../../select/m3-select'; |
| 33 | +@use '../../sidenav/m3-sidenav'; |
| 34 | +@use '../../slide-toggle/m3-slide-toggle'; |
| 35 | +@use '../../slider/m3-slider'; |
| 36 | +@use '../../snack-bar/m3-snack-bar'; |
| 37 | +@use '../../sort/m3-sort'; |
| 38 | +@use '../../stepper/m3-stepper'; |
| 39 | +@use '../../table/m3-table'; |
| 40 | +@use '../../tabs/m3-tabs'; |
| 41 | +@use '../../timepicker/m3-timepicker'; |
| 42 | +@use '../../toolbar/m3-toolbar'; |
| 43 | +@use '../../tooltip/m3-tooltip'; |
| 44 | +@use '../../tree/m3-tree'; |
| 45 | + |
| 46 | +@use './token-utils'; |
| 47 | + |
| 48 | +// Note: `input` is intentionally absent from the registry — it has no M3 tokens |
| 49 | +// of its own and delegates all theming to `form-field`. |
| 50 | + |
| 51 | +// Registry maps each component namespace to its overrides map. |
| 52 | +// The overrides map has an `all` key containing token-name → default-value entries. |
| 53 | +// Token names have the component prefix removed |
| 54 | +// (e.g. `container-color` not `snack-bar-container-color`, |
| 55 | +// and `filled-container-color` not `button-filled-container-color`). |
| 56 | +$_registry: ( |
| 57 | + app: token-utils.get-overrides(m3-app.get-tokens(), app), |
| 58 | + autocomplete: token-utils.get-overrides(m3-autocomplete.get-tokens(), autocomplete), |
| 59 | + badge: token-utils.get-overrides(m3-badge.get-tokens(), badge), |
| 60 | + bottom-sheet: token-utils.get-overrides(m3-bottom-sheet.get-tokens(), bottom-sheet), |
| 61 | + button: token-utils.get-overrides(m3-button.get-tokens(), button), |
| 62 | + button-toggle: token-utils.get-overrides(m3-button-toggle.get-tokens(), button-toggle), |
| 63 | + card: token-utils.get-overrides(m3-card.get-tokens(), card), |
| 64 | + checkbox: token-utils.get-overrides(m3-checkbox.get-tokens(), checkbox), |
| 65 | + chip: token-utils.get-overrides(m3-chip.get-tokens(), chip), |
| 66 | + datepicker: token-utils.get-overrides(m3-datepicker.get-tokens(), datepicker), |
| 67 | + dialog: token-utils.get-overrides(m3-dialog.get-tokens(), dialog), |
| 68 | + divider: token-utils.get-overrides(m3-divider.get-tokens(), divider), |
| 69 | + expansion: token-utils.get-overrides(m3-expansion.get-tokens(), expansion), |
| 70 | + fab: token-utils.get-overrides(m3-fab.get-tokens(), fab), |
| 71 | + form-field: token-utils.get-overrides(m3-form-field.get-tokens(), form-field), |
| 72 | + grid-list: token-utils.get-overrides(m3-grid-list.get-tokens(), grid-list), |
| 73 | + icon: token-utils.get-overrides(m3-icon.get-tokens(), icon), |
| 74 | + icon-button: token-utils.get-overrides(m3-icon-button.get-tokens(), icon-button), |
| 75 | + list: token-utils.get-overrides(m3-list.get-tokens(), list), |
| 76 | + menu: token-utils.get-overrides(m3-menu.get-tokens(), menu), |
| 77 | + optgroup: token-utils.get-overrides(m3-optgroup.get-tokens(), optgroup), |
| 78 | + option: token-utils.get-overrides(m3-option.get-tokens(), option), |
| 79 | + paginator: token-utils.get-overrides(m3-paginator.get-tokens(), paginator), |
| 80 | + progress-bar: token-utils.get-overrides(m3-progress-bar.get-tokens(), progress-bar), |
| 81 | + progress-spinner: token-utils.get-overrides(m3-progress-spinner.get-tokens(), progress-spinner), |
| 82 | + pseudo-checkbox: token-utils.get-overrides(m3-pseudo-checkbox.get-tokens(), pseudo-checkbox), |
| 83 | + radio: token-utils.get-overrides(m3-radio.get-tokens(), radio), |
| 84 | + ripple: token-utils.get-overrides(m3-ripple.get-tokens(), ripple), |
| 85 | + select: token-utils.get-overrides(m3-select.get-tokens(), select), |
| 86 | + sidenav: token-utils.get-overrides(m3-sidenav.get-tokens(), sidenav), |
| 87 | + slide-toggle: token-utils.get-overrides(m3-slide-toggle.get-tokens(), slide-toggle), |
| 88 | + slider: token-utils.get-overrides(m3-slider.get-tokens(), slider), |
| 89 | + snack-bar: token-utils.get-overrides(m3-snack-bar.get-tokens(), snack-bar), |
| 90 | + sort: token-utils.get-overrides(m3-sort.get-tokens(), sort), |
| 91 | + stepper: token-utils.get-overrides(m3-stepper.get-tokens(), stepper), |
| 92 | + table: token-utils.get-overrides(m3-table.get-tokens(), table), |
| 93 | + tabs: token-utils.get-overrides(m3-tabs.get-tokens(), tabs), |
| 94 | + timepicker: token-utils.get-overrides(m3-timepicker.get-tokens(), timepicker), |
| 95 | + toolbar: token-utils.get-overrides(m3-toolbar.get-tokens(), toolbar), |
| 96 | + tooltip: token-utils.get-overrides(m3-tooltip.get-tokens(), tooltip), |
| 97 | + tree: token-utils.get-overrides(m3-tree.get-tokens(), tree), |
| 98 | +); |
| 99 | + |
| 100 | +/// Returns a CSS variable reference for a Material Design token. |
| 101 | +/// Throws a Sass compile error if the component or token name is invalid. |
| 102 | +/// |
| 103 | +/// Token names are the CSS variable name with the `--mat-{component}-` prefix removed. |
| 104 | +/// Components with sub-variants retain those prefixes in the token name. For example, |
| 105 | +/// `--mat-button-filled-container-color` → token `filled-container-color`, not |
| 106 | +/// `container-color`. Use `mat.{component}-overrides()` documentation to discover |
| 107 | +/// the exact token names for a given component. |
| 108 | +/// |
| 109 | +/// @param {String} $component - Component namespace (e.g. `snack-bar`, `button`) |
| 110 | +/// @param {String} $token - Token name without component prefix (e.g. `container-color`, |
| 111 | +/// `filled-container-color`) |
| 112 | +/// @param {*} $fallback - Optional CSS fallback value |
| 113 | +/// @return CSS var() expression |
| 114 | +@function token-var($component, $token, $fallback: null) { |
| 115 | + @if not map.has-key($_registry, $component) { |
| 116 | + @error 'Unknown component `#{$component}` in mat.token-var(). ' + |
| 117 | + 'Valid components are: #{map.keys($_registry)}'; |
| 118 | + } |
| 119 | + |
| 120 | + $all: map.get(map.get($_registry, $component), all); |
| 121 | + |
| 122 | + @if not map.has-key($all, $token) { |
| 123 | + @error 'Unknown token `#{$token}` for component `#{$component}` in mat.token-var(). ' + |
| 124 | + 'Valid tokens are: #{map.keys($all)}'; |
| 125 | + } |
| 126 | + |
| 127 | + @if $fallback != null { |
| 128 | + @return var(--mat-#{$component}-#{$token}, #{$fallback}); |
| 129 | + } |
| 130 | + |
| 131 | + @return var(--mat-#{$component}-#{$token}); |
| 132 | +} |
| 133 | + |
| 134 | +/// Returns the list of component names registered in the token registry. |
| 135 | +/// Not forwarded through `_index.scss` — available only to consumers that |
| 136 | +/// directly `@use` this module, such as the token-var completeness tests. |
| 137 | +@function registry-keys() { |
| 138 | + @return map.keys($_registry); |
| 139 | +} |
0 commit comments