|
1 | 1 | /* state.css */ |
2 | | -@layer props, state, engine; |
| 2 | +@layer props, api, engine; |
3 | 3 |
|
4 | 4 | /* ----------------------------------------------------------------------------- |
5 | 5 | * PROPS |
|
36 | 36 | /* ----------------------------------------------------------------------------- |
37 | 37 | * STATE (only sets --state) |
38 | 38 | * -------------------------------------------------------------------------- */ |
39 | | -@layer state { |
40 | | - /** |
41 | | - * IMPORTANT: avoid unscoped :hover/:active/:focus rules. |
42 | | - * Only apply to the component root, otherwise everything on the page can inherit it. |
43 | | - */ |
| 39 | +@layer api { |
| 40 | + [data-compose-ui] { |
| 41 | + /* disabled wins */ |
| 42 | + &.disabled, |
| 43 | + &:disabled, |
| 44 | + &[disabled] { |
| 45 | + --state: disabled; |
| 46 | + } |
| 47 | + |
| 48 | + /* interactive states only when not disabled */ |
| 49 | + /* No need for `base` as it's the fallback */ |
| 50 | + &:not([disabled]):not(.disabled) { |
| 51 | + &.focus, |
| 52 | + &.focus-visible, |
| 53 | + &:focus, |
| 54 | + &:focus-visible { |
| 55 | + --state: focus; |
| 56 | + } |
| 57 | + |
| 58 | + &.active, |
| 59 | + &:active { |
| 60 | + --state: active; |
| 61 | + } |
| 62 | + |
| 63 | + &.hover, |
| 64 | + &:hover { |
| 65 | + --state: hover; |
| 66 | + } |
| 67 | + } |
| 68 | + } |
| 69 | +} |
44 | 70 |
|
| 71 | +/* |
45 | 72 | [data-compose-ui]:not([disabled]):not(.disabled):not(:hover):not(:active):not(:focus):not( |
46 | 73 | :focus-visible |
47 | 74 | ), |
|
70 | 97 | [data-compose-ui]:disabled, |
71 | 98 | [data-compose-ui].disabled { |
72 | 99 | --state: disabled; |
73 | | - } |
| 100 | + } */ |
74 | 101 |
|
75 | | - /** |
| 102 | +/** |
76 | 103 | * If you REALLY need “child is hovered/focused sets parent state”, keep :has() |
77 | 104 | * but scope it to the root only: |
78 | 105 | */ |
79 | | - [data-compose-ui]:has(:hover, .hover) { |
80 | | - --state: hover; |
81 | | - } |
82 | | - [data-compose-ui]:has(:active, .active) { |
83 | | - --state: active; |
84 | | - } |
85 | | - [data-compose-ui]:has(:focus-visible, :focus, .focus-visible, .focus) { |
86 | | - --state: focus; |
87 | | - } |
88 | | - [data-compose-ui]:has(.disabled, :disabled, [disabled]) { |
89 | | - --state: disabled; |
90 | | - } |
91 | | -} |
92 | | - |
| 106 | +/* [data-compose-ui]:has(:hover, .hover) { |
| 107 | + --state: hover; |
| 108 | + } |
| 109 | + [data-compose-ui]:has(:active, .active) { |
| 110 | + --state: active; |
| 111 | + } |
| 112 | + [data-compose-ui]:has(:focus-visible, :focus, .focus-visible, .focus) { |
| 113 | + --state: focus; |
| 114 | + } |
| 115 | + [data-compose-ui]:has(.disabled, :disabled, [disabled]) { |
| 116 | + --state: disabled; |
| 117 | + } */ |
| 118 | +/* } |
| 119 | +} */ |
93 | 120 | /* ----------------------------------------------------------------------------- |
94 | 121 | * ENGINE (grind -> bits, map -> s-* deltas) |
95 | 122 | * -------------------------------------------------------------------------- */ |
|
113 | 140 | --_state-disabled-else-0: var(--state); |
114 | 141 | --is-state-disabled: var(--_state-disabled-else-0); |
115 | 142 |
|
| 143 | + --_component-transform-depth: calc( |
| 144 | + var(--_component-transform-base) * var(--is-state-base) + var(--_component-transform-hover) * |
| 145 | + var(--is-state-hover) + var(--_component-transform-active) * var(--is-state-active) + |
| 146 | + var(--_component-transform-focus) * var(--is-state-focus) + |
| 147 | + var(--_component-transform-disabled) * var(--is-state-disabled) |
| 148 | + ); |
| 149 | + |
| 150 | + --component-shadow-depth: calc( |
| 151 | + var(--is-state-base) * var(--_component-shadow-base) + var(--is-state-hover) * |
| 152 | + var(--_component-shadow-hover) + var(--is-state-active) * var(--_component-shadow-active) + |
| 153 | + var(--is-state-focus) * var(--_component-shadow-focus) + var(--is-state-disabled) * |
| 154 | + var(--_component-shadow-disabled) - 1 * var(--_component-transform-depth) |
| 155 | + ); |
116 | 156 | /** |
117 | 157 | * 2) Map state deltas (weighted sums) |
118 | 158 | * Uses your existing state token names. |
|
0 commit comments