Mercurial
comparison design_system/src/styles/components.css @ 258:60a876c4587a
[ui] Add semantic primitive ownership
Build a layered Zenbu token and sizing system, make authored controls use native-underneath primitives, migrate mrjunejune without imposing visual surfaces, and document/enforce HTML ownership in the catalog and wiki.
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Wed, 05 Aug 2026 05:25:40 -0700 |
| parents | 2b6e732087ff |
| children |
comparison
equal
deleted
inserted
replaced
| 257:609d3c6aff4e | 258:60a876c4587a |
|---|---|
| 1 @import url("./shadcn.css"); | 1 @import url("./elements.css"); |
| 2 | 2 |
| 3 :where( | 3 :where( |
| 4 zen-button, | 4 zen-button, |
| 5 zen-card, | 5 zen-card, |
| 6 zen-alert, | 6 zen-alert, |
| 7 zen-field, | 7 zen-field, |
| 8 zen-stack, | 8 zen-stack, |
| 9 zen-notifications | 9 zen-notifications |
| 10 ) { | 10 ) { |
| 11 box-sizing: border-box; | 11 box-sizing: border-box; |
| 12 font-family: var(--zen-font-sans); | 12 font-family: var(--zenbu-sys-font-family-ui); |
| 13 color: var(--zen-color-text); | 13 color: var(--zenbu-sys-color-text-primary); |
| 14 } | 14 } |
| 15 | 15 |
| 16 zen-button { | 16 zen-button { |
| 17 display: inline-flex; | 17 display: inline-flex; |
| 18 } | 18 } |
| 19 | 19 |
| 20 zen-button > :where(button, a) { | 20 zen-button:not([appearance="plain"]) > :where(button, a) { |
| 21 --zenbu-button-background: | |
| 22 var(--zenbu-sys-color-action-primary-background); | |
| 23 --zenbu-button-background-hover: | |
| 24 var(--zenbu-sys-color-action-primary-background-hover); | |
| 25 --zenbu-button-background-pressed: | |
| 26 var(--zenbu-sys-color-action-primary-background-pressed); | |
| 27 --zenbu-button-border: | |
| 28 var(--zenbu-sys-color-action-primary-border); | |
| 29 --zenbu-button-foreground: | |
| 30 var(--zenbu-sys-color-action-primary-foreground); | |
| 21 appearance: none; | 31 appearance: none; |
| 32 box-sizing: border-box; | |
| 22 display: inline-flex; | 33 display: inline-flex; |
| 23 align-items: center; | 34 align-items: center; |
| 24 justify-content: center; | 35 justify-content: center; |
| 25 gap: var(--zen-space-2); | 36 gap: var(--zenbu-control-gap); |
| 26 min-height: 2.75rem; | 37 min-height: var(--zenbu-control-height); |
| 27 padding: var(--zen-space-2) var(--zen-space-4); | 38 padding: |
| 28 border: var(--zen-border-width) solid var(--zen-color-border); | 39 var(--zenbu-control-padding-block) |
| 29 border-radius: var(--zen-radius-md); | 40 var(--zenbu-control-padding-inline); |
| 30 box-shadow: var(--zen-shadow-sm); | 41 border: var(--zenbu-sys-stroke-width) solid var(--zenbu-button-border); |
| 31 background: var(--zen-color-accent); | 42 border-radius: var(--zenbu-sys-radius-control); |
| 32 color: var(--zen-color-on-accent); | 43 box-shadow: var(--zenbu-sys-shadow-subtle); |
| 33 font: 700 var(--zen-font-size-md)/1 var(--zen-font-sans); | 44 background: var(--zenbu-button-background); |
| 45 color: var(--zenbu-button-foreground); | |
| 46 font: | |
| 47 var(--zenbu-sys-font-weight-strong) | |
| 48 var(--zenbu-control-font-size) / | |
| 49 var(--zenbu-control-line-height) | |
| 50 var(--zenbu-sys-font-family-ui); | |
| 34 text-decoration: none; | 51 text-decoration: none; |
| 35 cursor: pointer; | 52 cursor: pointer; |
| 36 transition: | 53 transition: |
| 37 background var(--zen-motion-fast) ease, | 54 background var(--zenbu-sys-motion-duration-state) |
| 38 box-shadow var(--zen-motion-fast) ease, | 55 var(--zenbu-sys-motion-ease-state), |
| 39 transform var(--zen-motion-fast) ease; | 56 border-color var(--zenbu-sys-motion-duration-state) |
| 40 } | 57 var(--zenbu-sys-motion-ease-state), |
| 41 | 58 box-shadow var(--zenbu-sys-motion-duration-feedback) |
| 42 zen-button > :where(button, a):hover { | 59 var(--zenbu-sys-motion-ease-state), |
| 43 background: var(--zen-color-accent-hover); | 60 transform var(--zenbu-sys-motion-duration-feedback) |
| 61 var(--zenbu-sys-motion-ease-state); | |
| 62 } | |
| 63 | |
| 64 zen-button:not([appearance="plain"]) > :where(button, a):hover:not( | |
| 65 :disabled, | |
| 66 [aria-disabled="true"] | |
| 67 ) { | |
| 68 background: var(--zenbu-button-background-hover); | |
| 44 transform: translate(-1px, -1px); | 69 transform: translate(-1px, -1px); |
| 45 box-shadow: var(--zen-shadow-hover); | 70 box-shadow: var(--zenbu-sys-shadow-raised); |
| 46 } | 71 } |
| 47 | 72 |
| 48 zen-button > :where(button, a):active { | 73 zen-button:not([appearance="plain"]) > :where(button, a):active:not( |
| 74 :disabled, | |
| 75 [aria-disabled="true"] | |
| 76 ) { | |
| 77 background: var(--zenbu-button-background-pressed); | |
| 49 transform: translate(2px, 2px); | 78 transform: translate(2px, 2px); |
| 50 box-shadow: none; | 79 box-shadow: none; |
| 51 } | 80 } |
| 52 | 81 |
| 53 zen-button > :where(button, a):focus-visible, | 82 zen-button:not([appearance="plain"]) > :where(button, a):focus-visible, |
| 54 zen-alert [data-zen-dismiss]:focus-visible { | 83 zen-alert [data-zen-dismiss]:focus-visible { |
| 55 outline: 3px solid var(--zen-color-focus); | 84 outline: var(--zenbu-sys-focus-width) solid |
| 56 outline-offset: 3px; | 85 var(--zenbu-sys-color-focus-outer); |
| 57 } | 86 outline-offset: var(--zenbu-sys-focus-offset); |
| 58 | 87 } |
| 59 zen-field :where(input, select, textarea):focus-visible { | 88 |
| 89 zen-field:not([appearance="plain"]) :where( | |
| 90 input, | |
| 91 select, | |
| 92 textarea | |
| 93 ):focus-visible { | |
| 60 outline: none; | 94 outline: none; |
| 61 } | 95 } |
| 62 | 96 |
| 63 zen-button[variant="quiet"] > :where(button, a) { | 97 zen-button:not([appearance="plain"])[variant="quiet"] > :where(button, a) { |
| 64 background: var(--zen-color-surface); | 98 --zenbu-button-background: |
| 65 color: var(--zen-color-text); | 99 var(--zenbu-sys-color-action-neutral-background); |
| 66 } | 100 --zenbu-button-background-hover: |
| 67 | 101 var(--zenbu-sys-color-action-neutral-background-hover); |
| 68 zen-button[variant="danger"] > :where(button, a) { | 102 --zenbu-button-background-pressed: |
| 69 background: var(--zen-color-danger); | 103 var(--zenbu-sys-color-action-neutral-background-pressed); |
| 70 color: var(--zen-color-on-danger); | 104 --zenbu-button-border: |
| 71 } | 105 var(--zenbu-sys-color-action-neutral-border); |
| 72 | 106 --zenbu-button-foreground: |
| 73 zen-button[disabled] > :where(button, a), | 107 var(--zenbu-sys-color-action-neutral-foreground); |
| 74 zen-button[loading] > :where(button, a) { | 108 } |
| 75 opacity: 0.55; | 109 |
| 110 zen-button:not([appearance="plain"])[variant="danger"] > :where(button, a) { | |
| 111 --zenbu-button-background: | |
| 112 var(--zenbu-sys-color-action-danger-background); | |
| 113 --zenbu-button-background-hover: | |
| 114 var(--zenbu-sys-color-action-danger-background-hover); | |
| 115 --zenbu-button-background-pressed: | |
| 116 var(--zenbu-sys-color-action-danger-background-pressed); | |
| 117 --zenbu-button-border: | |
| 118 var(--zenbu-sys-color-action-danger-border); | |
| 119 --zenbu-button-foreground: | |
| 120 var(--zenbu-sys-color-action-danger-foreground); | |
| 121 } | |
| 122 | |
| 123 zen-button:not([appearance="plain"])[disabled] > :where(button, a), | |
| 124 zen-button:not([appearance="plain"])[loading] > :where(button, a) { | |
| 125 opacity: var(--zenbu-sys-opacity-disabled); | |
| 76 box-shadow: none; | 126 box-shadow: none; |
| 77 cursor: not-allowed; | 127 cursor: not-allowed; |
| 78 transform: none; | 128 transform: none; |
| 79 } | 129 } |
| 80 | 130 |
| 81 zen-button[loading] > :where(button, a)::before { | 131 zen-button:not([appearance="plain"])[loading] > :where(button, a)::before { |
| 82 width: 0.85rem; | 132 width: var(--zenbu-control-icon-size); |
| 83 height: 0.85rem; | 133 height: var(--zenbu-control-icon-size); |
| 84 border: 2px solid currentColor; | 134 border: 2px solid currentColor; |
| 85 border-right-color: transparent; | 135 border-right-color: transparent; |
| 86 border-radius: 50%; | 136 border-radius: 50%; |
| 87 content: ""; | 137 content: ""; |
| 88 animation: zen-spin 700ms linear infinite; | 138 animation: zen-spin 700ms linear infinite; |
| 94 | 144 |
| 95 zen-card { | 145 zen-card { |
| 96 display: block; | 146 display: block; |
| 97 } | 147 } |
| 98 | 148 |
| 99 zen-card > :where(article, section) { | 149 zen-card:not([appearance="plain"]) > :where(article, section) { |
| 150 --zenbu-card-background: var(--zenbu-sys-color-surface-raised); | |
| 151 --zenbu-card-border: var(--zenbu-sys-color-border-subtle); | |
| 152 --zenbu-card-foreground: var(--zenbu-sys-color-text-primary); | |
| 100 height: 100%; | 153 height: 100%; |
| 101 padding: var(--zen-space-5); | 154 padding: var(--zenbu-sys-padding-lg); |
| 102 border: var(--zen-border-width) solid var(--zen-color-border); | 155 border: var(--zenbu-sys-stroke-width) solid var(--zenbu-card-border); |
| 103 border-radius: var(--zen-radius-lg); | 156 border-radius: var(--zenbu-sys-radius-container); |
| 104 box-shadow: var(--zen-shadow-md); | 157 box-shadow: var(--zenbu-sys-shadow-raised); |
| 105 background: var(--zen-color-surface-raised); | 158 background: var(--zenbu-card-background); |
| 106 } | 159 color: var(--zenbu-card-foreground); |
| 107 | 160 } |
| 108 zen-card[interactive] > :where(article, section) { | 161 |
| 162 zen-card:not([appearance="plain"])[interactive] > :where(article, section) { | |
| 109 transition: | 163 transition: |
| 110 box-shadow var(--zen-motion-fast) ease, | 164 box-shadow var(--zenbu-sys-motion-duration-state) |
| 111 transform var(--zen-motion-fast) ease; | 165 var(--zenbu-sys-motion-ease-state), |
| 112 } | 166 transform var(--zenbu-sys-motion-duration-state) |
| 113 | 167 var(--zenbu-sys-motion-ease-state); |
| 114 zen-card[interactive] > :where(article, section):hover { | 168 } |
| 169 | |
| 170 zen-card:not([appearance="plain"])[interactive] > :where(article, section):hover { | |
| 115 transform: translate(-2px, -2px); | 171 transform: translate(-2px, -2px); |
| 116 box-shadow: var(--zen-shadow-lifted); | 172 box-shadow: var(--zenbu-sys-shadow-overlay); |
| 117 } | 173 } |
| 118 | 174 |
| 119 zen-card :where(h2, h3, p) { | 175 zen-card :where(h2, h3, p) { |
| 120 margin-top: 0; | 176 margin-top: 0; |
| 121 } | 177 } |
| 122 | 178 |
| 123 zen-alert { | 179 zen-alert { |
| 180 --zenbu-alert-background: var(--zenbu-sys-color-info-background); | |
| 181 --zenbu-alert-border: var(--zenbu-sys-color-info-border); | |
| 182 --zenbu-alert-foreground: var(--zenbu-sys-color-info-foreground); | |
| 124 display: grid; | 183 display: grid; |
| 125 grid-template-columns: 0.35rem minmax(0, 1fr) auto; | 184 --zenbu-alert-indicator-width: var(--zenbu-ref-space-1-5); |
| 185 grid-template-columns: | |
| 186 var(--zenbu-alert-indicator-width) | |
| 187 minmax(0, 1fr) | |
| 188 auto; | |
| 126 align-items: start; | 189 align-items: start; |
| 127 gap: var(--zen-space-3); | 190 gap: var(--zenbu-sys-space-control); |
| 128 padding: var(--zen-space-4); | 191 padding: var(--zenbu-sys-padding-md); |
| 129 border: var(--zen-border-width) solid var(--zen-color-border); | 192 border: var(--zenbu-sys-stroke-width) solid var(--zenbu-alert-border); |
| 130 border-radius: var(--zen-radius-md); | 193 border-radius: var(--zenbu-sys-radius-container); |
| 131 background: var(--zen-color-surface-raised); | 194 background: var(--zenbu-alert-background); |
| 195 color: var(--zenbu-alert-foreground); | |
| 132 } | 196 } |
| 133 | 197 |
| 134 zen-alert::before { | 198 zen-alert::before { |
| 135 align-self: stretch; | 199 align-self: stretch; |
| 136 border-radius: 999px; | 200 border-radius: var(--zenbu-sys-radius-pill); |
| 137 background: var(--zen-color-info); | 201 background: var(--zenbu-alert-border); |
| 138 content: ""; | 202 content: ""; |
| 139 } | 203 } |
| 140 | 204 |
| 141 zen-alert[tone="success"]::before { background: var(--zen-color-success); } | 205 zen-alert[tone="success"] { |
| 142 zen-alert[tone="warning"]::before { background: var(--zen-color-warning); } | 206 --zenbu-alert-background: var(--zenbu-sys-color-success-background); |
| 143 zen-alert[tone="danger"]::before { background: var(--zen-color-danger); } | 207 --zenbu-alert-border: var(--zenbu-sys-color-success-border); |
| 208 --zenbu-alert-foreground: var(--zenbu-sys-color-success-foreground); | |
| 209 } | |
| 210 zen-alert[tone="warning"] { | |
| 211 --zenbu-alert-background: var(--zenbu-sys-color-warning-background); | |
| 212 --zenbu-alert-border: var(--zenbu-sys-color-warning-border); | |
| 213 --zenbu-alert-foreground: var(--zenbu-sys-color-warning-foreground); | |
| 214 } | |
| 215 zen-alert[tone="danger"] { | |
| 216 --zenbu-alert-background: var(--zenbu-sys-color-danger-background); | |
| 217 --zenbu-alert-border: var(--zenbu-sys-color-danger-border); | |
| 218 --zenbu-alert-foreground: var(--zenbu-sys-color-danger-foreground); | |
| 219 } | |
| 144 | 220 |
| 145 zen-alert > :where(p, div) { | 221 zen-alert > :where(p, div) { |
| 146 margin: 0; | 222 margin: 0; |
| 147 } | 223 } |
| 148 | 224 |
| 149 zen-alert [data-zen-dismiss] { | 225 zen-alert [data-zen-dismiss] { |
| 150 min-width: 2rem; | 226 min-width: var(--zenbu-sys-control-height-xs); |
| 151 min-height: 2rem; | 227 min-height: var(--zenbu-sys-control-height-xs); |
| 152 padding: 0; | 228 padding: 0; |
| 153 border: 0; | 229 border: 0; |
| 154 border-radius: 50%; | 230 border-radius: var(--zenbu-sys-radius-pill); |
| 155 background: transparent; | 231 background: transparent; |
| 156 color: inherit; | 232 color: inherit; |
| 157 font: 700 1.2rem/1 var(--zen-font-sans); | 233 font: |
| 234 var(--zenbu-sys-font-weight-bold) | |
| 235 var(--zenbu-sys-font-size-lg) / 1 | |
| 236 var(--zenbu-sys-font-family-ui); | |
| 158 cursor: pointer; | 237 cursor: pointer; |
| 159 } | 238 } |
| 160 | 239 |
| 161 zen-field { | 240 zen-field { |
| 241 --zenbu-field-textarea-min-height: | |
| 242 calc(var(--zenbu-ref-space-24) + var(--zenbu-ref-space-4)); | |
| 162 display: grid; | 243 display: grid; |
| 163 gap: var(--zen-space-2); | 244 gap: var(--zenbu-sys-space-icon-label); |
| 164 } | 245 } |
| 165 | 246 |
| 166 zen-field > label { | 247 zen-field[appearance="plain"] { |
| 167 font-weight: 750; | 248 display: contents; |
| 168 } | 249 } |
| 169 | 250 |
| 170 zen-field > :where(input, select, textarea) { | 251 zen-field:not([appearance="plain"]) > label { |
| 252 font-family: var(--zenbu-sys-type-label-family); | |
| 253 font-size: var(--zenbu-sys-type-label-size); | |
| 254 font-weight: var(--zenbu-sys-type-label-weight); | |
| 255 line-height: var(--zenbu-sys-type-label-line-height); | |
| 256 } | |
| 257 | |
| 258 zen-field:not([appearance="plain"]) > :where(input, select, textarea) { | |
| 171 width: 100%; | 259 width: 100%; |
| 172 min-height: 2.75rem; | 260 min-height: var(--zenbu-control-height); |
| 173 box-sizing: border-box; | 261 box-sizing: border-box; |
| 174 padding: var(--zen-space-3); | 262 padding: |
| 175 border: var(--zen-border-width) solid var(--zen-color-border); | 263 var(--zenbu-control-padding-block) |
| 176 border-radius: var(--zen-radius-md); | 264 var(--zenbu-control-padding-inline); |
| 177 background: var(--zen-color-surface); | 265 border: var(--zenbu-sys-stroke-width) solid |
| 178 color: var(--zen-color-text); | 266 var(--zenbu-sys-color-border-default); |
| 179 font: inherit; | 267 border-radius: var(--zenbu-sys-radius-control); |
| 180 } | 268 background: var(--zenbu-sys-color-surface-default); |
| 181 | 269 color: var(--zenbu-sys-color-text-primary); |
| 182 zen-field > textarea { | 270 font-family: inherit; |
| 183 min-height: 7rem; | 271 font-size: var(--zenbu-control-font-size); |
| 272 line-height: var(--zenbu-control-line-height); | |
| 273 } | |
| 274 | |
| 275 zen-field:not([appearance="plain"]) > textarea { | |
| 276 min-height: var(--zenbu-field-textarea-min-height); | |
| 184 resize: vertical; | 277 resize: vertical; |
| 185 } | 278 } |
| 186 | 279 |
| 187 zen-field > :where(small, [data-help]) { | 280 zen-field:not([appearance="plain"]) > :where(small, [data-help]) { |
| 188 color: var(--zen-color-text-muted); | 281 color: var(--zenbu-sys-color-text-secondary); |
| 189 } | 282 } |
| 190 | 283 |
| 191 zen-field[data-invalid] > :where(input, select, textarea) { | 284 zen-field:not([appearance="plain"])[data-invalid] > :where(input, select, textarea) { |
| 192 border-color: var(--zen-color-danger); | 285 border-color: var(--zenbu-sys-color-danger-border); |
| 193 } | 286 } |
| 194 | 287 |
| 195 zen-field[data-invalid] > :where(small, [data-help]) { | 288 zen-field:not([appearance="plain"])[data-invalid] > :where(small, [data-help]) { |
| 196 color: var(--zen-color-danger); | 289 color: var(--zenbu-sys-color-danger-foreground); |
| 197 } | 290 } |
| 198 | 291 |
| 199 zen-stack { | 292 zen-stack { |
| 293 --zenbu-stack-gap: var(--zenbu-sys-space-group); | |
| 200 display: flex; | 294 display: flex; |
| 201 flex-direction: column; | 295 flex-direction: column; |
| 202 gap: var(--zen-stack-gap, var(--zen-space-4)); | 296 gap: var(--zenbu-stack-gap); |
| 203 } | 297 } |
| 204 | 298 |
| 205 zen-stack[direction="row"] { | 299 zen-stack[direction="row"] { |
| 206 flex-flow: row wrap; | 300 flex-flow: row wrap; |
| 207 align-items: center; | 301 align-items: center; |
| 208 } | 302 } |
| 209 | 303 |
| 210 zen-stack[gap="tight"] { --zen-stack-gap: var(--zen-space-2); } | 304 zen-stack[gap="tight"] { |
| 211 zen-stack[gap="loose"] { --zen-stack-gap: var(--zen-space-6); } | 305 --zenbu-stack-gap: var(--zenbu-sys-space-related); |
| 306 } | |
| 307 zen-stack[gap="loose"] { | |
| 308 --zenbu-stack-gap: var(--zenbu-sys-space-container); | |
| 309 } | |
| 212 | 310 |
| 213 zen-notifications > [data-zen-notification-stack] { | 311 zen-notifications > [data-zen-notification-stack] { |
| 312 --zenbu-notification-z-index: var(--zenbu-sys-z-notification); | |
| 313 --zenbu-notification-inset: var(--zenbu-sys-padding-md); | |
| 314 --zenbu-notification-bottom-inset: var(--zenbu-sys-padding-md); | |
| 315 --zenbu-notification-collapsed-height: 0; | |
| 316 --zenbu-notification-expanded-height: 0; | |
| 214 position: fixed; | 317 position: fixed; |
| 215 z-index: var(--zen-notification-z-index, 1000); | 318 z-index: var( |
| 216 inset-inline-end: var(--zen-notification-inset, var(--zen-space-4)); | 319 --zenbu-notification-z-index, |
| 320 var(--zenbu-sys-z-notification) | |
| 321 ); | |
| 322 inset-inline-end: var( | |
| 323 --zenbu-notification-inset, | |
| 324 var(--zenbu-sys-padding-md) | |
| 325 ); | |
| 217 inset-block-end: var( | 326 inset-block-end: var( |
| 218 --zen-notification-bottom-inset, | 327 --zenbu-notification-bottom-inset, |
| 219 var(--zen-space-4) | 328 var(--zenbu-sys-padding-md) |
| 220 ); | 329 ); |
| 221 inline-size: min(24rem, calc(100vi - 2rem)); | 330 inline-size: min(24rem, calc(100vi - 2rem)); |
| 222 height: var(--zen-notification-collapsed-height, 0); | 331 height: var(--zenbu-notification-collapsed-height, 0); |
| 223 --zen-notification-gap: 12px; | 332 --zenbu-notification-gap: var(--zenbu-sys-space-control); |
| 224 pointer-events: auto; | 333 pointer-events: auto; |
| 225 isolation: isolate; | 334 isolation: isolate; |
| 226 transition: height 220ms cubic-bezier(0.2, 0.8, 0.2, 1); | 335 transition: |
| 336 height var(--zenbu-sys-motion-duration-layout) | |
| 337 var(--zenbu-sys-motion-ease-layout); | |
| 227 } | 338 } |
| 228 | 339 |
| 229 zen-notifications > [data-zen-notification-stack]:is( | 340 zen-notifications > [data-zen-notification-stack]:is( |
| 230 :hover, | 341 :hover, |
| 231 :focus-within | 342 :focus-within |
| 232 ) { | 343 ) { |
| 233 height: var(--zen-notification-expanded-height, 0); | 344 height: var(--zenbu-notification-expanded-height, 0); |
| 234 } | 345 } |
| 235 | 346 |
| 236 zen-notifications > [data-zen-notification-stack] > article { | 347 zen-notifications > [data-zen-notification-stack] > article { |
| 348 --zenbu-notification-collapsed-opacity: 1; | |
| 349 --zenbu-notification-collapsed-offset: 0; | |
| 350 --zenbu-notification-offset: 0; | |
| 351 --zenbu-notification-scale: 1; | |
| 352 --zenbu-notification-background: | |
| 353 var(--zenbu-sys-color-surface-raised); | |
| 354 --zenbu-notification-border: | |
| 355 var(--zenbu-sys-color-border-subtle); | |
| 356 --zenbu-notification-foreground: | |
| 357 var(--zenbu-sys-color-text-primary); | |
| 237 position: absolute; | 358 position: absolute; |
| 238 inset-inline: 0; | 359 inset-inline: 0; |
| 239 inset-block-end: 0; | 360 inset-block-end: 0; |
| 240 display: grid; | 361 display: grid; |
| 241 grid-template-columns: 1.75rem minmax(0, 1fr) 2rem; | 362 grid-template-columns: 1.75rem minmax(0, 1fr) 2rem; |
| 242 align-items: start; | 363 align-items: start; |
| 243 gap: var(--zen-space-3); | 364 gap: var(--zenbu-sys-space-control); |
| 244 padding: var(--zen-space-4); | 365 padding: var(--zenbu-sys-padding-md); |
| 245 border: var(--zen-border-width) solid var(--zen-color-border); | 366 border: var(--zenbu-sys-stroke-width) solid |
| 246 border-radius: var(--zen-radius-lg); | 367 var(--zenbu-notification-border); |
| 247 box-shadow: var(--zen-shadow-md); | 368 border-radius: var(--zenbu-sys-radius-container); |
| 248 background: var(--zen-color-surface-raised); | 369 box-shadow: var(--zenbu-sys-shadow-overlay); |
| 249 color: var(--zen-color-text); | 370 background: var(--zenbu-notification-background); |
| 250 opacity: var(--zen-notification-collapsed-opacity, 1); | 371 color: var(--zenbu-notification-foreground); |
| 372 opacity: var(--zenbu-notification-collapsed-opacity, 1); | |
| 251 pointer-events: none; | 373 pointer-events: none; |
| 252 transform: | 374 transform: |
| 253 translate3d( | 375 translate3d( |
| 254 0, | 376 0, |
| 255 var(--zen-notification-collapsed-offset, 0), | 377 var(--zenbu-notification-collapsed-offset, 0), |
| 256 0 | 378 0 |
| 257 ) | 379 ) |
| 258 scale(var(--zen-notification-scale, 1)); | 380 scale(var(--zenbu-notification-scale, 1)); |
| 259 transform-origin: center bottom; | 381 transform-origin: center bottom; |
| 260 transition: | 382 transition: |
| 261 opacity 180ms ease, | 383 opacity var(--zenbu-sys-motion-duration-exit) |
| 262 transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1); | 384 var(--zenbu-sys-motion-ease-exit), |
| 385 transform var(--zenbu-sys-motion-duration-layout) | |
| 386 var(--zenbu-sys-motion-ease-layout); | |
| 263 will-change: transform; | 387 will-change: transform; |
| 264 animation: zen-notification-enter 160ms ease-out; | 388 animation: zen-notification-enter 160ms ease-out; |
| 265 } | 389 } |
| 266 | 390 |
| 267 zen-notifications > [data-zen-notification-stack] > article[data-depth="0"] { | 391 zen-notifications > [data-zen-notification-stack] > article[data-depth="0"] { |
| 275 opacity: 1; | 399 opacity: 1; |
| 276 pointer-events: auto; | 400 pointer-events: auto; |
| 277 transform: | 401 transform: |
| 278 translate3d( | 402 translate3d( |
| 279 0, | 403 0, |
| 280 var(--zen-notification-offset, 0px), | 404 var(--zenbu-notification-offset, 0px), |
| 281 0 | 405 0 |
| 282 ) | 406 ) |
| 283 scale(1); | 407 scale(1); |
| 284 } | 408 } |
| 285 | 409 |
| 288 pointer-events: none; | 412 pointer-events: none; |
| 289 transform: translate3d(110%, 0, 0) scale(0.96); | 413 transform: translate3d(110%, 0, 0) scale(0.96); |
| 290 } | 414 } |
| 291 | 415 |
| 292 .zen-notification-tone { | 416 .zen-notification-tone { |
| 417 --zenbu-notification-tone-background: | |
| 418 var(--zenbu-sys-color-info-foreground); | |
| 419 --zenbu-notification-tone-foreground: | |
| 420 var(--zenbu-sys-color-text-inverse); | |
| 293 display: grid; | 421 display: grid; |
| 294 width: 1.75rem; | 422 width: 1.75rem; |
| 295 height: 1.75rem; | 423 height: 1.75rem; |
| 296 place-items: center; | 424 place-items: center; |
| 297 border-radius: 50%; | 425 border-radius: var(--zenbu-sys-radius-pill); |
| 298 background: var(--zen-color-info); | 426 background: var(--zenbu-notification-tone-background); |
| 299 color: var(--zen-color-on-info); | 427 color: var(--zenbu-notification-tone-foreground); |
| 300 font-weight: 900; | 428 font-weight: var(--zenbu-sys-font-weight-bold); |
| 301 } | 429 } |
| 302 | 430 |
| 303 [data-tone="success"] > .zen-notification-tone { | 431 [data-tone="success"] > .zen-notification-tone { |
| 304 background: var(--zen-color-success); | 432 --zenbu-notification-tone-background: |
| 305 color: var(--zen-color-on-success); | 433 var(--zenbu-sys-color-success-foreground); |
| 306 } | 434 } |
| 307 | 435 |
| 308 [data-tone="warning"] > .zen-notification-tone { | 436 [data-tone="warning"] > .zen-notification-tone { |
| 309 background: var(--zen-color-warning); | 437 --zenbu-notification-tone-background: |
| 310 color: var(--zen-color-on-warning); | 438 var(--zenbu-sys-color-warning-foreground); |
| 311 } | 439 } |
| 312 | 440 |
| 313 [data-tone="error"] > .zen-notification-tone { | 441 [data-tone="error"] > .zen-notification-tone { |
| 314 background: var(--zen-color-danger); | 442 --zenbu-notification-tone-background: |
| 315 color: var(--zen-color-on-danger); | 443 var(--zenbu-sys-color-danger-foreground); |
| 316 } | 444 } |
| 317 | 445 |
| 318 .zen-notification-content { | 446 .zen-notification-content { |
| 319 display: grid; | 447 display: grid; |
| 320 gap: var(--zen-space-1); | 448 gap: var(--zenbu-sys-space-icon-label); |
| 321 } | 449 } |
| 322 | 450 |
| 323 .zen-notification-message, | 451 .zen-notification-message, |
| 324 .zen-notification-description { | 452 .zen-notification-description { |
| 325 margin: 0; | 453 margin: 0; |
| 326 } | 454 } |
| 327 | 455 |
| 328 .zen-notification-message { | 456 .zen-notification-message { |
| 329 font-weight: 800; | 457 font-weight: var(--zenbu-sys-font-weight-bold); |
| 330 } | 458 } |
| 331 | 459 |
| 332 .zen-notification-description { | 460 .zen-notification-description { |
| 333 color: var(--zen-color-text-muted); | 461 color: var(--zenbu-sys-color-text-secondary); |
| 334 font-size: var(--zen-font-size-sm); | 462 font-size: var(--zenbu-sys-font-size-sm); |
| 335 } | 463 } |
| 336 | 464 |
| 337 .zen-notification-action, | 465 .zen-notification-action, |
| 338 .zen-notification-dismiss { | 466 .zen-notification-dismiss { |
| 339 border: 0; | 467 border: 0; |
| 342 cursor: pointer; | 470 cursor: pointer; |
| 343 } | 471 } |
| 344 | 472 |
| 345 .zen-notification-action { | 473 .zen-notification-action { |
| 346 justify-self: start; | 474 justify-self: start; |
| 347 margin-top: var(--zen-space-2); | 475 margin-top: var(--zenbu-sys-space-related); |
| 348 padding: 0; | 476 padding: 0; |
| 349 color: var(--zen-color-info); | 477 color: var(--zenbu-sys-color-text-link); |
| 350 font-weight: 800; | 478 font-weight: var(--zenbu-sys-font-weight-bold); |
| 351 text-decoration: underline; | 479 text-decoration: underline; |
| 352 text-underline-offset: 0.2em; | 480 text-underline-offset: 0.2em; |
| 353 } | 481 } |
| 354 | 482 |
| 355 .zen-notification-dismiss { | 483 .zen-notification-dismiss { |
| 356 width: 2rem; | 484 width: 2rem; |
| 357 height: 2rem; | 485 height: 2rem; |
| 358 padding: 0; | 486 padding: 0; |
| 359 border-radius: 50%; | 487 border-radius: var(--zenbu-sys-radius-pill); |
| 360 font-size: 1.25rem; | 488 font-size: var(--zenbu-sys-font-size-xl); |
| 361 } | 489 } |
| 362 | 490 |
| 363 .zen-notification-action:focus-visible, | 491 .zen-notification-action:focus-visible, |
| 364 .zen-notification-dismiss:focus-visible { | 492 .zen-notification-dismiss:focus-visible { |
| 365 outline: 3px solid var(--zen-color-focus); | 493 outline: var(--zenbu-sys-focus-width) solid |
| 366 outline-offset: 2px; | 494 var(--zenbu-sys-color-focus-outer); |
| 495 outline-offset: var(--zenbu-sys-focus-offset); | |
| 367 } | 496 } |
| 368 | 497 |
| 369 .zen-visually-hidden { | 498 .zen-visually-hidden { |
| 370 position: absolute; | 499 position: absolute; |
| 371 width: 1px; | 500 width: 1px; |