@neo-ui-kit/react 1.0.0 → 1.0.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 (55) hide show
  1. package/README.md +12 -2
  2. package/dist/components/artwork/DatabaseArt/styles.css +58 -58
  3. package/dist/components/artwork/Landscape/styles.css +79 -79
  4. package/dist/components/artwork/Planet/styles.css +52 -52
  5. package/dist/components/artwork/QuantumField/UPSTREAM-LICENSE.txt +21 -21
  6. package/dist/components/artwork/ServerArt/styles.css +43 -43
  7. package/dist/components/artwork/Spectrum/styles.css +35 -35
  8. package/dist/components/controls/Autocomplete/styles.css +1 -1
  9. package/dist/components/controls/Checkbox/styles.css +58 -58
  10. package/dist/components/controls/InputBase/styles.css +374 -374
  11. package/dist/components/controls/Link/styles.css +50 -50
  12. package/dist/components/controls/SegmentedControl/styles.css +9 -9
  13. package/dist/components/controls/Switch/styles.css +54 -54
  14. package/dist/components/controls/Tabs/styles.css +239 -239
  15. package/dist/components/controls/ToggleButton/styles.css +49 -49
  16. package/dist/components/controls/shared.css +694 -694
  17. package/dist/components/editor/shared.css +1 -1
  18. package/dist/components/effects/Beacon/styles.css +38 -38
  19. package/dist/components/effects/Equalizer/styles.css +34 -34
  20. package/dist/components/effects/GlowText/styles.css +56 -56
  21. package/dist/components/effects/Marquee/styles.css +46 -46
  22. package/dist/components/effects/Reveal/styles.css +25 -25
  23. package/dist/components/effects/Shimmer/styles.css +48 -48
  24. package/dist/components/effects/Sparkles/styles.css +28 -28
  25. package/dist/components/effects/Spotlight/styles.css +45 -45
  26. package/dist/components/effects/Tilt/styles.css +67 -67
  27. package/dist/components/feedback/CollapsibleSection/styles.css +76 -76
  28. package/dist/components/feedback/DataTable/styles.css +522 -522
  29. package/dist/components/feedback/EmptyState/styles.css +80 -80
  30. package/dist/components/feedback/KeyValueList/styles.css +51 -51
  31. package/dist/components/feedback/MenuItem/styles.css +71 -71
  32. package/dist/components/feedback/Popover/styles.css +44 -44
  33. package/dist/components/feedback/Steps/styles.css +152 -152
  34. package/dist/components/feedback/Toast/styles.css +89 -89
  35. package/dist/components/forms/FormFields/styles.css +21 -21
  36. package/dist/components/foundation/ThemeProvider/styles.css +31 -31
  37. package/dist/components/layout/Avatar/styles.css +151 -151
  38. package/dist/components/layout/Card/styles.css +37 -37
  39. package/dist/components/layout/DialogActions/styles.css +31 -31
  40. package/dist/components/layout/DialogBody/styles.css +17 -17
  41. package/dist/components/layout/Illustration/styles.css +104 -104
  42. package/dist/components/layout/ScrollArea/styles.css +61 -61
  43. package/dist/components/layout/TabPanel/styles.css +16 -16
  44. package/dist/components/layout/shared.css +65 -65
  45. package/dist/components/media/AudioPlayer/styles.css +86 -86
  46. package/dist/components/media/LevelMeter/styles.css +30 -30
  47. package/dist/components/media/MelodyRoll/styles.css +196 -196
  48. package/dist/components/media/RotaryKnob/styles.css +319 -319
  49. package/dist/components/media/Sparkline/styles.css +69 -69
  50. package/dist/components/media/WaveDecoration/styles.css +1 -1
  51. package/dist/components/media/shared.css +7 -7
  52. package/dist/fonts/melodix.css +123 -123
  53. package/dist/index.js +2101 -2101
  54. package/dist/theme/base.css +210 -210
  55. package/package.json +1 -1
@@ -1,694 +1,694 @@
1
- /* Shared control sizing + canonical premium button system. */
2
- /* One size scale for every control; data-ad-size picks a step. */
3
- :is(
4
- .ad-button,
5
- .ad-icon-button,
6
- .ad-toggle-button,
7
- .ad-split-button,
8
- .ad-input-base,
9
- .ad-text-field-shell,
10
- .ad-text-area,
11
- .ad-number-field,
12
- .ad-select,
13
- .ad-switch,
14
- .ad-checkbox,
15
- .ad-slider,
16
- .ad-file-picker,
17
- .ad-tabs,
18
- .ad-tab,
19
- .ad-segmented-control
20
- ) {
21
- --ad-size-h: var(--ad-control-height);
22
- --ad-size-font: 0.8125rem;
23
- --ad-size-radius: var(--ad-radius);
24
- --ad-size-pad-x: 0.6875rem;
25
- --ad-size-gap: 0.625rem;
26
- }
27
- :is(
28
- .ad-button,
29
- .ad-icon-button,
30
- .ad-toggle-button,
31
- .ad-split-button,
32
- .ad-input-base,
33
- .ad-text-field-shell,
34
- .ad-text-area,
35
- .ad-number-field,
36
- .ad-select,
37
- .ad-switch,
38
- .ad-checkbox,
39
- .ad-slider,
40
- .ad-file-picker,
41
- .ad-tabs,
42
- .ad-tab,
43
- .ad-segmented-control
44
- )[data-ad-size="xs"] {
45
- --ad-size-h: 1.8rem;
46
- --ad-size-font: 0.6875rem;
47
- --ad-size-radius: 0.52rem;
48
- --ad-size-pad-x: 0.52rem;
49
- --ad-size-gap: 0.42rem;
50
- }
51
- :is(
52
- .ad-button,
53
- .ad-icon-button,
54
- .ad-toggle-button,
55
- .ad-split-button,
56
- .ad-input-base,
57
- .ad-text-field-shell,
58
- .ad-text-area,
59
- .ad-number-field,
60
- .ad-select,
61
- .ad-switch,
62
- .ad-checkbox,
63
- .ad-slider,
64
- .ad-file-picker,
65
- .ad-tabs,
66
- .ad-tab,
67
- .ad-segmented-control
68
- )[data-ad-size="sm"] {
69
- --ad-size-h: 2.15rem;
70
- --ad-size-font: 0.75rem;
71
- --ad-size-radius: 0.64rem;
72
- --ad-size-pad-x: 0.64rem;
73
- --ad-size-gap: 0.5rem;
74
- }
75
- :is(
76
- .ad-button,
77
- .ad-icon-button,
78
- .ad-toggle-button,
79
- .ad-split-button,
80
- .ad-input-base,
81
- .ad-text-field-shell,
82
- .ad-text-area,
83
- .ad-number-field,
84
- .ad-select,
85
- .ad-switch,
86
- .ad-checkbox,
87
- .ad-slider,
88
- .ad-file-picker,
89
- .ad-tabs,
90
- .ad-tab,
91
- .ad-segmented-control
92
- )[data-ad-size="md"] {
93
- --ad-size-h: 2.65rem;
94
- --ad-size-font: 0.825rem;
95
- --ad-size-radius: 0.78rem;
96
- --ad-size-pad-x: 0.76rem;
97
- --ad-size-gap: 0.6rem;
98
- }
99
- :is(
100
- .ad-button,
101
- .ad-icon-button,
102
- .ad-toggle-button,
103
- .ad-split-button,
104
- .ad-input-base,
105
- .ad-text-field-shell,
106
- .ad-text-area,
107
- .ad-number-field,
108
- .ad-select,
109
- .ad-switch,
110
- .ad-checkbox,
111
- .ad-slider,
112
- .ad-file-picker,
113
- .ad-tabs,
114
- .ad-tab,
115
- .ad-segmented-control
116
- )[data-ad-size="lg"] {
117
- --ad-size-h: 3.08rem;
118
- --ad-size-font: 0.94rem;
119
- --ad-size-radius: 0.9rem;
120
- --ad-size-pad-x: 0.95rem;
121
- --ad-size-gap: 0.72rem;
122
- }
123
-
124
- @keyframes ad-btn-breathe {
125
- 50% {
126
- opacity: 1;
127
- }
128
- }
129
- @keyframes ad-btn-sheen {
130
- 0%,
131
- 60% {
132
- transform: translateX(-190%) rotate(14deg);
133
- opacity: 0;
134
- }
135
- 68% {
136
- opacity: 0.18;
137
- }
138
- 76% {
139
- opacity: 0.85;
140
- }
141
- 92%,
142
- 100% {
143
- transform: translateX(255%) rotate(14deg);
144
- opacity: 0;
145
- }
146
- }
147
-
148
- /* Shared visual contract. */
149
- .ad-button,
150
- .ad-icon-button,
151
- .ad-toggle-button {
152
- /* Pill buttons, as in music players. */
153
- --ad-btn-radius: 999rem;
154
- --ad-btn-bg-top: var(--ad-neutral-700);
155
- --ad-btn-bg-mid: var(--ad-neutral-850);
156
- --ad-btn-bg-bottom: var(--ad-neutral-900);
157
- --ad-btn-border-a: rgb(from var(--ad-secondary-100) r g b / 0.65);
158
- --ad-btn-border-b: rgb(from var(--ad-primary-600) r g b / 0.43);
159
- --ad-btn-edge: rgb(from var(--ad-secondary) r g b / 0.21);
160
- --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.16);
161
- --ad-btn-inner: #ffffff3d;
162
- --ad-btn-bottom: #000a;
163
- --ad-button-x: 50%;
164
- --ad-button-y: 20%;
165
- position: relative;
166
- display: inline-flex;
167
- align-items: center;
168
- justify-content: center;
169
- min-inline-size: 0;
170
- max-inline-size: 100%;
171
- height: var(--ad-size-h);
172
- gap: var(--ad-size-gap);
173
- padding-inline: calc(var(--ad-size-pad-x) * 1.55);
174
- border: 0.0625rem solid transparent;
175
- border-radius: var(--ad-btn-radius);
176
- color: var(--ad-neutral-200);
177
- font-size: var(--ad-size-font);
178
- font-weight: 700;
179
- letter-spacing: 0.01em;
180
- line-height: 1;
181
- white-space: nowrap;
182
- background:
183
- linear-gradient(
184
- 180deg,
185
- var(--ad-btn-bg-top),
186
- var(--ad-btn-bg-mid) 58%,
187
- var(--ad-btn-bg-bottom)
188
- )
189
- padding-box,
190
- linear-gradient(
191
- 135deg,
192
- var(--ad-btn-border-a),
193
- #ffffff18 18%,
194
- var(--ad-btn-border-b) 56%,
195
- rgb(from var(--ad-primary-800) r g b / 0.31) 100%
196
- )
197
- border-box;
198
- box-shadow:
199
- inset 0 0.08rem 0.15rem var(--ad-btn-inner),
200
- inset 0 -0.48rem 0.95rem var(--ad-btn-bottom),
201
- inset 0 0 0 0.03125rem #ffffff09,
202
- 0 0.42rem 1rem #0009,
203
- 0 0 1rem var(--ad-btn-glow);
204
- isolation: isolate;
205
- overflow: hidden;
206
- -webkit-tap-highlight-color: transparent;
207
- transition:
208
- transform 0.22s cubic-bezier(0.2, 0.78, 0.24, 1),
209
- filter 0.22s,
210
- box-shadow 0.22s,
211
- border-color 0.22s,
212
- opacity 0.22s;
213
- }
214
- .ad-button::before,
215
- .ad-icon-button::before,
216
- .ad-toggle-button::before {
217
- content: "";
218
- position: absolute;
219
- inset: 0.0625rem;
220
- z-index: -1;
221
- border-radius: calc(var(--ad-btn-radius) - 0.0625rem);
222
- pointer-events: none;
223
- background:
224
- radial-gradient(
225
- 70% 105% at var(--ad-button-x) var(--ad-button-y),
226
- #ffffff3f 0%,
227
- rgb(from var(--ad-neutral-200) r g b / 0.14) 24%,
228
- rgb(from var(--ad-secondary-200) r g b / 0.08) 48%,
229
- transparent 72%
230
- ),
231
- linear-gradient(180deg, #ffffff2f 0%, #ffffff10 18%, transparent 36%),
232
- linear-gradient(180deg, #ffffff12 0%, transparent 24%, transparent 100%),
233
- radial-gradient(88% 48% at 50% 112%, var(--ad-btn-edge) 0%, transparent 74%);
234
- opacity: 0.96;
235
- transition:
236
- opacity 0.22s,
237
- filter 0.22s;
238
- }
239
- .ad-button::after,
240
- .ad-icon-button::after,
241
- .ad-toggle-button::after {
242
- content: "";
243
- position: absolute;
244
- top: -72%;
245
- bottom: -72%;
246
- left: -18%;
247
- width: 34%;
248
- pointer-events: none;
249
- background: linear-gradient(
250
- 90deg,
251
- transparent,
252
- rgb(from var(--ad-neutral-200) r g b / 0.08) 18%,
253
- #fffefecf 48%,
254
- rgb(from var(--ad-secondary-100) r g b / 0.3) 62%,
255
- transparent 80%
256
- );
257
- filter: blur(0.08rem);
258
- transform: translateX(-190%) rotate(14deg);
259
- opacity: 0;
260
- }
261
- .ad-button:hover:not(:disabled),
262
- .ad-icon-button:hover:not(:disabled),
263
- .ad-toggle-button:hover:not(:disabled) {
264
- transform: translateY(-0.09rem);
265
- filter: brightness(1.07) saturate(1.08);
266
- box-shadow:
267
- inset 0 0.09rem 0.18rem #ffffff61,
268
- inset 0 -0.54rem 1.05rem var(--ad-btn-bottom),
269
- inset 0 0 0 0.03125rem #ffffff14,
270
- 0 0.58rem 1.15rem #000a,
271
- 0 0 1.35rem color-mix(in srgb, var(--ad-btn-glow) 92%, transparent);
272
- }
273
- .ad-button:hover:not(:disabled)::before,
274
- .ad-icon-button:hover:not(:disabled)::before,
275
- .ad-toggle-button:hover:not(:disabled)::before {
276
- opacity: 1;
277
- filter: brightness(1.04);
278
- }
279
- .ad-button:hover:not(:disabled)::after,
280
- .ad-icon-button:hover:not(:disabled)::after,
281
- .ad-toggle-button:hover:not(:disabled)::after {
282
- animation: ad-btn-sheen 1.05s ease-out 1;
283
- }
284
- .ad-button:active:not(:disabled),
285
- .ad-icon-button:active:not(:disabled),
286
- .ad-toggle-button:active:not(:disabled) {
287
- transform: translateY(0.03rem) scale(0.987);
288
- filter: brightness(0.96);
289
- box-shadow:
290
- inset 0 0.26rem 0.64rem #000b,
291
- inset 0 0 0.4rem var(--ad-btn-edge),
292
- 0 0.1rem 0.24rem #0008;
293
- }
294
- .ad-button:focus-visible,
295
- .ad-icon-button:focus-visible,
296
- .ad-toggle-button:focus-visible {
297
- outline: 0.125rem solid var(--ad-neutral-200);
298
- outline-offset: 0.18rem;
299
- }
300
-
301
- /* Semantic variants: one source for Button, IconButton, SplitButton and ToggleButton. */
302
- .ad-button[data-ad-variant="primary"],
303
- .ad-icon-button[data-ad-variant="primary"],
304
- .ad-split-button[data-ad-variant="primary"],
305
- .ad-toggle-button[aria-pressed="true"] {
306
- --ad-btn-bg-top: var(--ad-primary);
307
- --ad-btn-bg-mid: var(--ad-primary-600);
308
- --ad-btn-bg-bottom: var(--ad-primary-900);
309
- --ad-btn-border-a: var(--ad-neutral-200);
310
- --ad-btn-border-b: rgb(from var(--ad-secondary) r g b / 0.86);
311
- --ad-btn-edge: rgb(from var(--ad-primary) r g b / 0.44);
312
- --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.42);
313
- --ad-btn-inner: #fffafca3;
314
- --ad-btn-bottom: rgb(from var(--ad-primary-800) r g b / 0.42);
315
- color: var(--ad-on-accent);
316
- }
317
- .ad-button[data-ad-variant="primary"]::after,
318
- .ad-icon-button[data-ad-variant="primary"]::after,
319
- .ad-toggle-button[aria-pressed="true"]::after {
320
- animation: ad-btn-sheen 4.6s ease-in-out infinite;
321
- }
322
-
323
- .ad-button[data-ad-variant="secondary"],
324
- .ad-icon-button[data-ad-variant="secondary"],
325
- .ad-split-button[data-ad-variant="secondary"],
326
- .ad-toggle-button[aria-pressed="false"] {
327
- --ad-btn-bg-top: var(--ad-neutral-700);
328
- --ad-btn-bg-mid: var(--ad-neutral-850);
329
- --ad-btn-bg-bottom: var(--ad-neutral-900);
330
- --ad-btn-border-a: rgb(from var(--ad-neutral-300) r g b / 0.66);
331
- --ad-btn-border-b: rgb(from var(--ad-neutral-600) r g b / 0.36);
332
- --ad-btn-edge: rgb(from var(--ad-secondary) r g b / 0.17);
333
- --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.11);
334
- --ad-btn-inner: #ffffff35;
335
- --ad-btn-bottom: #000a;
336
- }
337
-
338
- .ad-button[data-ad-variant="ghost"],
339
- .ad-icon-button[data-ad-variant="ghost"],
340
- .ad-split-button[data-ad-variant="ghost"] {
341
- --ad-btn-bg-top: #ffffff05;
342
- --ad-btn-bg-mid: #ffffff02;
343
- --ad-btn-bg-bottom: #0000000b;
344
- --ad-btn-border-a: rgb(from var(--ad-secondary-200) r g b / 0.18);
345
- --ad-btn-border-b: rgb(from var(--ad-primary-600) r g b / 0.13);
346
- --ad-btn-edge: rgb(from var(--ad-secondary-200) r g b / 0.05);
347
- --ad-btn-glow: transparent;
348
- --ad-btn-inner: #ffffff08;
349
- --ad-btn-bottom: #00000018;
350
- color: var(--ad-neutral-300);
351
- }
352
-
353
- .ad-button[data-ad-variant="danger"],
354
- .ad-icon-button[data-ad-variant="danger"],
355
- .ad-split-button[data-ad-variant="danger"] {
356
- --ad-btn-bg-top: var(--ad-primary-600);
357
- --ad-btn-bg-mid: var(--ad-primary-800);
358
- --ad-btn-bg-bottom: var(--ad-primary-900);
359
- --ad-btn-border-a: rgb(from var(--ad-secondary-200) r g b / 0.83);
360
- --ad-btn-border-b: rgb(from var(--ad-primary) r g b / 0.43);
361
- --ad-btn-edge: rgb(from var(--ad-primary) r g b / 0.3);
362
- --ad-btn-glow: rgb(from var(--ad-primary-600) r g b / 0.22);
363
- --ad-btn-inner: rgb(from var(--ad-secondary-100) r g b / 0.37);
364
- --ad-btn-bottom: rgb(from var(--ad-primary-900) r g b / 0.47);
365
- color: var(--ad-on-accent);
366
- }
367
- .ad-button:disabled,
368
- .ad-icon-button:disabled,
369
- .ad-toggle-button:disabled {
370
- opacity: 0.42;
371
- filter: saturate(0.2) brightness(0.88);
372
- cursor: not-allowed;
373
- animation: none;
374
- transform: none;
375
- }
376
- .ad-button:disabled::after,
377
- .ad-icon-button:disabled::after,
378
- .ad-toggle-button:disabled::after {
379
- display: none;
380
- }
381
-
382
- .ad-button > .ad-icon,
383
- .ad-toggle-button > .ad-icon {
384
- --ad-icon-size: calc(var(--ad-size-font) * 1.45);
385
- flex: 0 0 auto;
386
- filter: drop-shadow(0 0 0.24rem rgb(from var(--ad-secondary-100) r g b / 0.42));
387
- }
388
- .ad-button-label {
389
- display: block;
390
- min-inline-size: 0;
391
- max-inline-size: 100%;
392
- overflow: hidden;
393
- text-overflow: ellipsis;
394
- white-space: nowrap;
395
- }
396
- .ad-button > .ad-spinner {
397
- flex: 0 0 auto;
398
- }
399
-
400
- .ad-icon-button {
401
- aspect-ratio: 1/1;
402
- width: var(--ad-size-h);
403
- min-width: var(--ad-size-h);
404
- padding: 0;
405
- border-radius: var(--ad-btn-radius);
406
- }
407
- .ad-icon-button[data-ad-round],
408
- .ad-button[data-ad-round] {
409
- width: var(--ad-size-h);
410
- height: var(--ad-size-h);
411
- padding: 0;
412
- border-radius: 50%;
413
- }
414
- /* Icons scale with the control: text buttons follow the font, icon-only buttons the height. */
415
- .ad-icon-button > .ad-icon {
416
- --ad-icon-size: calc(var(--ad-size-h) * 0.44);
417
- filter: drop-shadow(0 0 0.2rem rgb(from var(--ad-secondary-100) r g b / 0.49));
418
- }
419
-
420
- .ad-switch,
421
- .ad-checkbox {
422
- display: inline-flex;
423
- align-items: center;
424
- gap: var(--ad-size-gap);
425
- cursor: pointer;
426
- font-size: var(--ad-size-font);
427
- position: relative;
428
- }
429
- .ad-switch input,
430
- .ad-checkbox input {
431
- position: absolute;
432
- opacity: 0;
433
- width: 0.0625rem;
434
- height: 0.0625rem;
435
- }
436
- .ad-toggle-track {
437
- --ad-track-h: calc(var(--ad-size-h) * 0.64);
438
- --ad-track-w: calc(var(--ad-track-h) * 1.82);
439
- width: var(--ad-track-w);
440
- height: var(--ad-track-h);
441
- position: relative;
442
- border-radius: 999rem;
443
- border: 0.0625rem solid rgb(from var(--ad-primary) r g b / 0.55);
444
- background: linear-gradient(180deg, var(--ad-neutral-800), var(--ad-neutral-900));
445
- box-shadow: inset 0 0 0.3125rem #000b;
446
- flex: none;
447
- }
448
- .ad-toggle-track i {
449
- --ad-thumb-inset: calc(var(--ad-track-h) * 0.08);
450
- position: absolute;
451
- left: var(--ad-thumb-inset);
452
- top: var(--ad-thumb-inset);
453
- width: calc(var(--ad-track-h) - var(--ad-thumb-inset) * 2);
454
- height: calc(var(--ad-track-h) - var(--ad-thumb-inset) * 2);
455
- border: 0.125rem solid var(--ad-neutral-300);
456
- border-radius: 50%;
457
- background: linear-gradient(135deg, var(--ad-neutral-700), var(--ad-neutral-850));
458
- box-shadow: 0 0 0.1875rem rgb(from var(--ad-secondary-200) r g b / 0.25);
459
- transition:
460
- transform 0.42s cubic-bezier(0.34, 1.56, 0.5, 1),
461
- scale 0.18s ease-out,
462
- background 0.25s,
463
- border-color 0.25s,
464
- box-shadow 0.25s;
465
- }
466
- .ad-switch input:focus-visible + .ad-toggle-track,
467
- .ad-checkbox input:focus-visible + .ad-toggle-track {
468
- outline: 0.125rem solid var(--ad-secondary-100);
469
- outline-offset: 0.1875rem;
470
- }
471
- .ad-tab-shape {
472
- position: absolute;
473
- inset: 0;
474
- width: 100%;
475
- height: 100%;
476
- overflow: visible;
477
- z-index: -1;
478
- pointer-events: none;
479
- }
480
- .ad-tab-shape .tab-shape__glow {
481
- stroke: var(--ad-primary);
482
- stroke-width: 6.5;
483
- opacity: 0.72;
484
- filter: blur(0.25rem);
485
- }
486
- .ad-tab-shape .tab-shape__edge {
487
- stroke: var(--ad-secondary);
488
- stroke-width: 1.15;
489
- }
490
- .ad-tab-shape .tab-shape__glint {
491
- stroke: var(--ad-neutral-200);
492
- stroke-width: 1.2;
493
- stroke-linecap: round;
494
- stroke-dasharray: 8 92;
495
- animation: ad-tab-glint 6s linear infinite;
496
- }
497
- /* The glint's glow: two faint wider dashes under it, in step with it, instead of a live filter. */
498
- .ad-tab-shape .tab-shape__glint[data-part="wide"] {
499
- stroke: var(--ad-secondary);
500
- stroke-width: 7.2;
501
- opacity: 0.1;
502
- }
503
- .ad-tab-shape .tab-shape__glint[data-part="near"] {
504
- stroke: var(--ad-secondary);
505
- stroke-width: 4.2;
506
- opacity: 0.25;
507
- }
508
- .ad-tab-shape-glint {
509
- will-change: transform;
510
- }
511
- .ad-tab-shape .tab-shape__floor {
512
- stroke: var(--ad-secondary);
513
- stroke-width: 1.85;
514
- filter: drop-shadow(0 0 0.25rem var(--ad-primary));
515
- }
516
-
517
- @media (prefers-reduced-motion: reduce) {
518
- .ad-button,
519
- .ad-icon-button,
520
- .ad-toggle-button {
521
- animation: none !important;
522
- transition: none !important;
523
- }
524
- .ad-button::after,
525
- .ad-icon-button::after,
526
- .ad-toggle-button::after {
527
- animation: none !important;
528
- display: none !important;
529
- }
530
- }
531
-
532
- /* Ghost is a subtle button (Fluent "subtle", MUI "text"): no surface until hovered. */
533
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] {
534
- border-color: transparent;
535
- background: transparent;
536
- box-shadow: none;
537
- color: var(--ad-neutral-300);
538
- animation: none;
539
- }
540
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]::before,
541
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]::after {
542
- display: none;
543
- }
544
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] > .ad-icon {
545
- filter: none;
546
- }
547
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]:hover:not(:disabled) {
548
- background: rgb(from var(--ad-primary) r g b / 0.08);
549
- box-shadow: none;
550
- color: var(--ad-text);
551
- filter: none;
552
- transform: none;
553
- }
554
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]:active:not(
555
- :disabled
556
- ) {
557
- background: rgb(from var(--ad-primary) r g b / 0.14);
558
- box-shadow: none;
559
- transform: scale(0.98);
560
- }
561
-
562
- /* Living plasma inside the button, a soft breath of light, and a comet running round its edge.
563
- Accent buttons always show them; quieter variants reveal them on hover. Everything moves by
564
- transform and opacity only, and only while it is visible, so a screen of buttons stays light. */
565
- .ad-button-fx {
566
- position: absolute;
567
- inset: 0;
568
- z-index: -1;
569
- border-radius: inherit;
570
- overflow: hidden;
571
- pointer-events: none;
572
- }
573
- .ad-button-fx::before {
574
- content: "";
575
- position: absolute;
576
- inset: -40% -10% -40% 30%;
577
- background:
578
- radial-gradient(circle at 72% 30%, #fff 0 1.2%, transparent 2.6%),
579
- radial-gradient(circle at 86% 68%, var(--ad-secondary-100) 0 1.4%, transparent 3.2%),
580
- radial-gradient(circle at 58% 74%, var(--ad-secondary-200) 0 1.8%, transparent 4%),
581
- repeating-conic-gradient(
582
- from 20deg at 80% 50%,
583
- transparent 0 7deg,
584
- #ffffff24 8deg 10deg,
585
- transparent 12deg 19deg
586
- ),
587
- radial-gradient(ellipse at 80% 50%, rgb(from var(--ad-secondary) r g b / 0.44), transparent 65%);
588
- mask-image: linear-gradient(90deg, transparent, #000 40%);
589
- filter: saturate(1.35);
590
- opacity: 0;
591
- transition: opacity 0.4s;
592
- will-change: transform;
593
- }
594
- /* The breath: a faint light over the face that swells and settles. */
595
- .ad-button-fx::after {
596
- content: "";
597
- position: absolute;
598
- inset: 0;
599
- background: radial-gradient(ellipse at 50% 30%, rgb(from var(--ad-secondary-100) r g b / 0.14), transparent 70%);
600
- opacity: 0;
601
- }
602
- /* The comet: a ring-shaped window onto a conic light that turns behind it. */
603
- .ad-button-orbit {
604
- position: absolute;
605
- inset: 0;
606
- z-index: 0;
607
- border-radius: inherit;
608
- padding: 0.0625rem;
609
- overflow: hidden;
610
- mask:
611
- linear-gradient(#000 0 0) content-box exclude,
612
- linear-gradient(#000 0 0);
613
- opacity: 0;
614
- transition: opacity 0.4s;
615
- pointer-events: none;
616
- }
617
- .ad-button-orbit::before {
618
- content: "";
619
- position: absolute;
620
- top: 50%;
621
- left: 50%;
622
- width: max(130%, 6rem);
623
- aspect-ratio: 1;
624
- translate: -50% -50%;
625
- background: conic-gradient(
626
- transparent 0 76%,
627
- var(--ad-secondary) 84%,
628
- #fff 88%,
629
- transparent 93%
630
- );
631
- will-change: transform;
632
- }
633
- :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-fx::before,
634
- .ad-toggle-button[aria-pressed="true"] > .ad-button-fx::before {
635
- opacity: 0.85;
636
- animation: ad-btn-plasma 7s ease-in-out infinite alternate;
637
- }
638
- :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-fx::after,
639
- .ad-toggle-button[aria-pressed="true"] > .ad-button-fx::after {
640
- animation: ad-btn-breathe 3.1s ease-in-out infinite;
641
- }
642
- :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-orbit,
643
- .ad-toggle-button[aria-pressed="true"] > .ad-button-orbit {
644
- opacity: 1;
645
- }
646
- :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-orbit::before,
647
- .ad-toggle-button[aria-pressed="true"] > .ad-button-orbit::before {
648
- animation: ad-btn-orbit 4.5s linear infinite;
649
- }
650
- :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-fx::before {
651
- opacity: 0.9;
652
- animation: ad-btn-plasma 7s ease-in-out infinite alternate;
653
- }
654
- :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-orbit {
655
- opacity: 1;
656
- }
657
- :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-orbit::before {
658
- animation: ad-btn-orbit 1.6s linear infinite;
659
- }
660
- :is(.ad-button, .ad-icon-button):disabled > :is(.ad-button-fx, .ad-button-orbit) {
661
- display: none;
662
- }
663
- /* Icon-only buttons are small: the plasma centres on them instead of the right side. */
664
- .ad-icon-button > .ad-button-fx::before {
665
- inset: -30%;
666
- mask-image: radial-gradient(closest-side, #000 40%, transparent);
667
- }
668
- /* Ghost buttons stay subtle: only the comet, no plasma. */
669
- :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] > .ad-button-fx::before {
670
- display: none;
671
- }
672
- @keyframes ad-btn-plasma {
673
- from {
674
- transform: translate3d(-3%, -2%, 0) scale(1.02) rotate(0deg);
675
- }
676
- to {
677
- transform: translate3d(3%, 2%, 0) scale(1.14) rotate(8deg);
678
- }
679
- }
680
- @keyframes ad-btn-orbit {
681
- to {
682
- rotate: 360deg;
683
- }
684
- }
685
- /* Buttons that live inside other controls stay plain. */
686
- :is(.ad-input-adornment, .ad-split-button) :is(.ad-button-fx, .ad-button-orbit) {
687
- display: none;
688
- }
689
-
690
- @keyframes ad-tab-glint {
691
- to {
692
- stroke-dashoffset: -100;
693
- }
694
- }
1
+ /* Shared control sizing + canonical premium button system. */
2
+ /* One size scale for every control; data-ad-size picks a step. */
3
+ :is(
4
+ .ad-button,
5
+ .ad-icon-button,
6
+ .ad-toggle-button,
7
+ .ad-split-button,
8
+ .ad-input-base,
9
+ .ad-text-field-shell,
10
+ .ad-text-area,
11
+ .ad-number-field,
12
+ .ad-select,
13
+ .ad-switch,
14
+ .ad-checkbox,
15
+ .ad-slider,
16
+ .ad-file-picker,
17
+ .ad-tabs,
18
+ .ad-tab,
19
+ .ad-segmented-control
20
+ ) {
21
+ --ad-size-h: var(--ad-control-height);
22
+ --ad-size-font: 0.8125rem;
23
+ --ad-size-radius: var(--ad-radius);
24
+ --ad-size-pad-x: 0.6875rem;
25
+ --ad-size-gap: 0.625rem;
26
+ }
27
+ :is(
28
+ .ad-button,
29
+ .ad-icon-button,
30
+ .ad-toggle-button,
31
+ .ad-split-button,
32
+ .ad-input-base,
33
+ .ad-text-field-shell,
34
+ .ad-text-area,
35
+ .ad-number-field,
36
+ .ad-select,
37
+ .ad-switch,
38
+ .ad-checkbox,
39
+ .ad-slider,
40
+ .ad-file-picker,
41
+ .ad-tabs,
42
+ .ad-tab,
43
+ .ad-segmented-control
44
+ )[data-ad-size="xs"] {
45
+ --ad-size-h: 1.8rem;
46
+ --ad-size-font: 0.6875rem;
47
+ --ad-size-radius: 0.52rem;
48
+ --ad-size-pad-x: 0.52rem;
49
+ --ad-size-gap: 0.42rem;
50
+ }
51
+ :is(
52
+ .ad-button,
53
+ .ad-icon-button,
54
+ .ad-toggle-button,
55
+ .ad-split-button,
56
+ .ad-input-base,
57
+ .ad-text-field-shell,
58
+ .ad-text-area,
59
+ .ad-number-field,
60
+ .ad-select,
61
+ .ad-switch,
62
+ .ad-checkbox,
63
+ .ad-slider,
64
+ .ad-file-picker,
65
+ .ad-tabs,
66
+ .ad-tab,
67
+ .ad-segmented-control
68
+ )[data-ad-size="sm"] {
69
+ --ad-size-h: 2.15rem;
70
+ --ad-size-font: 0.75rem;
71
+ --ad-size-radius: 0.64rem;
72
+ --ad-size-pad-x: 0.64rem;
73
+ --ad-size-gap: 0.5rem;
74
+ }
75
+ :is(
76
+ .ad-button,
77
+ .ad-icon-button,
78
+ .ad-toggle-button,
79
+ .ad-split-button,
80
+ .ad-input-base,
81
+ .ad-text-field-shell,
82
+ .ad-text-area,
83
+ .ad-number-field,
84
+ .ad-select,
85
+ .ad-switch,
86
+ .ad-checkbox,
87
+ .ad-slider,
88
+ .ad-file-picker,
89
+ .ad-tabs,
90
+ .ad-tab,
91
+ .ad-segmented-control
92
+ )[data-ad-size="md"] {
93
+ --ad-size-h: 2.65rem;
94
+ --ad-size-font: 0.825rem;
95
+ --ad-size-radius: 0.78rem;
96
+ --ad-size-pad-x: 0.76rem;
97
+ --ad-size-gap: 0.6rem;
98
+ }
99
+ :is(
100
+ .ad-button,
101
+ .ad-icon-button,
102
+ .ad-toggle-button,
103
+ .ad-split-button,
104
+ .ad-input-base,
105
+ .ad-text-field-shell,
106
+ .ad-text-area,
107
+ .ad-number-field,
108
+ .ad-select,
109
+ .ad-switch,
110
+ .ad-checkbox,
111
+ .ad-slider,
112
+ .ad-file-picker,
113
+ .ad-tabs,
114
+ .ad-tab,
115
+ .ad-segmented-control
116
+ )[data-ad-size="lg"] {
117
+ --ad-size-h: 3.08rem;
118
+ --ad-size-font: 0.94rem;
119
+ --ad-size-radius: 0.9rem;
120
+ --ad-size-pad-x: 0.95rem;
121
+ --ad-size-gap: 0.72rem;
122
+ }
123
+
124
+ @keyframes ad-btn-breathe {
125
+ 50% {
126
+ opacity: 1;
127
+ }
128
+ }
129
+ @keyframes ad-btn-sheen {
130
+ 0%,
131
+ 60% {
132
+ transform: translateX(-190%) rotate(14deg);
133
+ opacity: 0;
134
+ }
135
+ 68% {
136
+ opacity: 0.18;
137
+ }
138
+ 76% {
139
+ opacity: 0.85;
140
+ }
141
+ 92%,
142
+ 100% {
143
+ transform: translateX(255%) rotate(14deg);
144
+ opacity: 0;
145
+ }
146
+ }
147
+
148
+ /* Shared visual contract. */
149
+ .ad-button,
150
+ .ad-icon-button,
151
+ .ad-toggle-button {
152
+ /* Pill buttons, as in music players. */
153
+ --ad-btn-radius: 999rem;
154
+ --ad-btn-bg-top: var(--ad-neutral-700);
155
+ --ad-btn-bg-mid: var(--ad-neutral-850);
156
+ --ad-btn-bg-bottom: var(--ad-neutral-900);
157
+ --ad-btn-border-a: rgb(from var(--ad-secondary-100) r g b / 0.65);
158
+ --ad-btn-border-b: rgb(from var(--ad-primary-600) r g b / 0.43);
159
+ --ad-btn-edge: rgb(from var(--ad-secondary) r g b / 0.21);
160
+ --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.16);
161
+ --ad-btn-inner: #ffffff3d;
162
+ --ad-btn-bottom: #000a;
163
+ --ad-button-x: 50%;
164
+ --ad-button-y: 20%;
165
+ position: relative;
166
+ display: inline-flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ min-inline-size: 0;
170
+ max-inline-size: 100%;
171
+ height: var(--ad-size-h);
172
+ gap: var(--ad-size-gap);
173
+ padding-inline: calc(var(--ad-size-pad-x) * 1.55);
174
+ border: 0.0625rem solid transparent;
175
+ border-radius: var(--ad-btn-radius);
176
+ color: var(--ad-neutral-200);
177
+ font-size: var(--ad-size-font);
178
+ font-weight: 700;
179
+ letter-spacing: 0.01em;
180
+ line-height: 1;
181
+ white-space: nowrap;
182
+ background:
183
+ linear-gradient(
184
+ 180deg,
185
+ var(--ad-btn-bg-top),
186
+ var(--ad-btn-bg-mid) 58%,
187
+ var(--ad-btn-bg-bottom)
188
+ )
189
+ padding-box,
190
+ linear-gradient(
191
+ 135deg,
192
+ var(--ad-btn-border-a),
193
+ #ffffff18 18%,
194
+ var(--ad-btn-border-b) 56%,
195
+ rgb(from var(--ad-primary-800) r g b / 0.31) 100%
196
+ )
197
+ border-box;
198
+ box-shadow:
199
+ inset 0 0.08rem 0.15rem var(--ad-btn-inner),
200
+ inset 0 -0.48rem 0.95rem var(--ad-btn-bottom),
201
+ inset 0 0 0 0.03125rem #ffffff09,
202
+ 0 0.42rem 1rem #0009,
203
+ 0 0 1rem var(--ad-btn-glow);
204
+ isolation: isolate;
205
+ overflow: hidden;
206
+ -webkit-tap-highlight-color: transparent;
207
+ transition:
208
+ transform 0.22s cubic-bezier(0.2, 0.78, 0.24, 1),
209
+ filter 0.22s,
210
+ box-shadow 0.22s,
211
+ border-color 0.22s,
212
+ opacity 0.22s;
213
+ }
214
+ .ad-button::before,
215
+ .ad-icon-button::before,
216
+ .ad-toggle-button::before {
217
+ content: "";
218
+ position: absolute;
219
+ inset: 0.0625rem;
220
+ z-index: -1;
221
+ border-radius: calc(var(--ad-btn-radius) - 0.0625rem);
222
+ pointer-events: none;
223
+ background:
224
+ radial-gradient(
225
+ 70% 105% at var(--ad-button-x) var(--ad-button-y),
226
+ #ffffff3f 0%,
227
+ rgb(from var(--ad-neutral-200) r g b / 0.14) 24%,
228
+ rgb(from var(--ad-secondary-200) r g b / 0.08) 48%,
229
+ transparent 72%
230
+ ),
231
+ linear-gradient(180deg, #ffffff2f 0%, #ffffff10 18%, transparent 36%),
232
+ linear-gradient(180deg, #ffffff12 0%, transparent 24%, transparent 100%),
233
+ radial-gradient(88% 48% at 50% 112%, var(--ad-btn-edge) 0%, transparent 74%);
234
+ opacity: 0.96;
235
+ transition:
236
+ opacity 0.22s,
237
+ filter 0.22s;
238
+ }
239
+ .ad-button::after,
240
+ .ad-icon-button::after,
241
+ .ad-toggle-button::after {
242
+ content: "";
243
+ position: absolute;
244
+ top: -72%;
245
+ bottom: -72%;
246
+ left: -18%;
247
+ width: 34%;
248
+ pointer-events: none;
249
+ background: linear-gradient(
250
+ 90deg,
251
+ transparent,
252
+ rgb(from var(--ad-neutral-200) r g b / 0.08) 18%,
253
+ #fffefecf 48%,
254
+ rgb(from var(--ad-secondary-100) r g b / 0.3) 62%,
255
+ transparent 80%
256
+ );
257
+ filter: blur(0.08rem);
258
+ transform: translateX(-190%) rotate(14deg);
259
+ opacity: 0;
260
+ }
261
+ .ad-button:hover:not(:disabled),
262
+ .ad-icon-button:hover:not(:disabled),
263
+ .ad-toggle-button:hover:not(:disabled) {
264
+ transform: translateY(-0.09rem);
265
+ filter: brightness(1.07) saturate(1.08);
266
+ box-shadow:
267
+ inset 0 0.09rem 0.18rem #ffffff61,
268
+ inset 0 -0.54rem 1.05rem var(--ad-btn-bottom),
269
+ inset 0 0 0 0.03125rem #ffffff14,
270
+ 0 0.58rem 1.15rem #000a,
271
+ 0 0 1.35rem color-mix(in srgb, var(--ad-btn-glow) 92%, transparent);
272
+ }
273
+ .ad-button:hover:not(:disabled)::before,
274
+ .ad-icon-button:hover:not(:disabled)::before,
275
+ .ad-toggle-button:hover:not(:disabled)::before {
276
+ opacity: 1;
277
+ filter: brightness(1.04);
278
+ }
279
+ .ad-button:hover:not(:disabled)::after,
280
+ .ad-icon-button:hover:not(:disabled)::after,
281
+ .ad-toggle-button:hover:not(:disabled)::after {
282
+ animation: ad-btn-sheen 1.05s ease-out 1;
283
+ }
284
+ .ad-button:active:not(:disabled),
285
+ .ad-icon-button:active:not(:disabled),
286
+ .ad-toggle-button:active:not(:disabled) {
287
+ transform: translateY(0.03rem) scale(0.987);
288
+ filter: brightness(0.96);
289
+ box-shadow:
290
+ inset 0 0.26rem 0.64rem #000b,
291
+ inset 0 0 0.4rem var(--ad-btn-edge),
292
+ 0 0.1rem 0.24rem #0008;
293
+ }
294
+ .ad-button:focus-visible,
295
+ .ad-icon-button:focus-visible,
296
+ .ad-toggle-button:focus-visible {
297
+ outline: 0.125rem solid var(--ad-neutral-200);
298
+ outline-offset: 0.18rem;
299
+ }
300
+
301
+ /* Semantic variants: one source for Button, IconButton, SplitButton and ToggleButton. */
302
+ .ad-button[data-ad-variant="primary"],
303
+ .ad-icon-button[data-ad-variant="primary"],
304
+ .ad-split-button[data-ad-variant="primary"],
305
+ .ad-toggle-button[aria-pressed="true"] {
306
+ --ad-btn-bg-top: var(--ad-primary);
307
+ --ad-btn-bg-mid: var(--ad-primary-600);
308
+ --ad-btn-bg-bottom: var(--ad-primary-900);
309
+ --ad-btn-border-a: var(--ad-neutral-200);
310
+ --ad-btn-border-b: rgb(from var(--ad-secondary) r g b / 0.86);
311
+ --ad-btn-edge: rgb(from var(--ad-primary) r g b / 0.44);
312
+ --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.42);
313
+ --ad-btn-inner: #fffafca3;
314
+ --ad-btn-bottom: rgb(from var(--ad-primary-800) r g b / 0.42);
315
+ color: var(--ad-on-accent);
316
+ }
317
+ .ad-button[data-ad-variant="primary"]::after,
318
+ .ad-icon-button[data-ad-variant="primary"]::after,
319
+ .ad-toggle-button[aria-pressed="true"]::after {
320
+ animation: ad-btn-sheen 4.6s ease-in-out infinite;
321
+ }
322
+
323
+ .ad-button[data-ad-variant="secondary"],
324
+ .ad-icon-button[data-ad-variant="secondary"],
325
+ .ad-split-button[data-ad-variant="secondary"],
326
+ .ad-toggle-button[aria-pressed="false"] {
327
+ --ad-btn-bg-top: var(--ad-neutral-700);
328
+ --ad-btn-bg-mid: var(--ad-neutral-850);
329
+ --ad-btn-bg-bottom: var(--ad-neutral-900);
330
+ --ad-btn-border-a: rgb(from var(--ad-neutral-300) r g b / 0.66);
331
+ --ad-btn-border-b: rgb(from var(--ad-neutral-600) r g b / 0.36);
332
+ --ad-btn-edge: rgb(from var(--ad-secondary) r g b / 0.17);
333
+ --ad-btn-glow: rgb(from var(--ad-primary) r g b / 0.11);
334
+ --ad-btn-inner: #ffffff35;
335
+ --ad-btn-bottom: #000a;
336
+ }
337
+
338
+ .ad-button[data-ad-variant="ghost"],
339
+ .ad-icon-button[data-ad-variant="ghost"],
340
+ .ad-split-button[data-ad-variant="ghost"] {
341
+ --ad-btn-bg-top: #ffffff05;
342
+ --ad-btn-bg-mid: #ffffff02;
343
+ --ad-btn-bg-bottom: #0000000b;
344
+ --ad-btn-border-a: rgb(from var(--ad-secondary-200) r g b / 0.18);
345
+ --ad-btn-border-b: rgb(from var(--ad-primary-600) r g b / 0.13);
346
+ --ad-btn-edge: rgb(from var(--ad-secondary-200) r g b / 0.05);
347
+ --ad-btn-glow: transparent;
348
+ --ad-btn-inner: #ffffff08;
349
+ --ad-btn-bottom: #00000018;
350
+ color: var(--ad-neutral-300);
351
+ }
352
+
353
+ .ad-button[data-ad-variant="danger"],
354
+ .ad-icon-button[data-ad-variant="danger"],
355
+ .ad-split-button[data-ad-variant="danger"] {
356
+ --ad-btn-bg-top: var(--ad-primary-600);
357
+ --ad-btn-bg-mid: var(--ad-primary-800);
358
+ --ad-btn-bg-bottom: var(--ad-primary-900);
359
+ --ad-btn-border-a: rgb(from var(--ad-secondary-200) r g b / 0.83);
360
+ --ad-btn-border-b: rgb(from var(--ad-primary) r g b / 0.43);
361
+ --ad-btn-edge: rgb(from var(--ad-primary) r g b / 0.3);
362
+ --ad-btn-glow: rgb(from var(--ad-primary-600) r g b / 0.22);
363
+ --ad-btn-inner: rgb(from var(--ad-secondary-100) r g b / 0.37);
364
+ --ad-btn-bottom: rgb(from var(--ad-primary-900) r g b / 0.47);
365
+ color: var(--ad-on-accent);
366
+ }
367
+ .ad-button:disabled,
368
+ .ad-icon-button:disabled,
369
+ .ad-toggle-button:disabled {
370
+ opacity: 0.42;
371
+ filter: saturate(0.2) brightness(0.88);
372
+ cursor: not-allowed;
373
+ animation: none;
374
+ transform: none;
375
+ }
376
+ .ad-button:disabled::after,
377
+ .ad-icon-button:disabled::after,
378
+ .ad-toggle-button:disabled::after {
379
+ display: none;
380
+ }
381
+
382
+ .ad-button > .ad-icon,
383
+ .ad-toggle-button > .ad-icon {
384
+ --ad-icon-size: calc(var(--ad-size-font) * 1.45);
385
+ flex: 0 0 auto;
386
+ filter: drop-shadow(0 0 0.24rem rgb(from var(--ad-secondary-100) r g b / 0.42));
387
+ }
388
+ .ad-button-label {
389
+ display: block;
390
+ min-inline-size: 0;
391
+ max-inline-size: 100%;
392
+ overflow: hidden;
393
+ text-overflow: ellipsis;
394
+ white-space: nowrap;
395
+ }
396
+ .ad-button > .ad-spinner {
397
+ flex: 0 0 auto;
398
+ }
399
+
400
+ .ad-icon-button {
401
+ aspect-ratio: 1/1;
402
+ width: var(--ad-size-h);
403
+ min-width: var(--ad-size-h);
404
+ padding: 0;
405
+ border-radius: var(--ad-btn-radius);
406
+ }
407
+ .ad-icon-button[data-ad-round],
408
+ .ad-button[data-ad-round] {
409
+ width: var(--ad-size-h);
410
+ height: var(--ad-size-h);
411
+ padding: 0;
412
+ border-radius: 50%;
413
+ }
414
+ /* Icons scale with the control: text buttons follow the font, icon-only buttons the height. */
415
+ .ad-icon-button > .ad-icon {
416
+ --ad-icon-size: calc(var(--ad-size-h) * 0.44);
417
+ filter: drop-shadow(0 0 0.2rem rgb(from var(--ad-secondary-100) r g b / 0.49));
418
+ }
419
+
420
+ .ad-switch,
421
+ .ad-checkbox {
422
+ display: inline-flex;
423
+ align-items: center;
424
+ gap: var(--ad-size-gap);
425
+ cursor: pointer;
426
+ font-size: var(--ad-size-font);
427
+ position: relative;
428
+ }
429
+ .ad-switch input,
430
+ .ad-checkbox input {
431
+ position: absolute;
432
+ opacity: 0;
433
+ width: 0.0625rem;
434
+ height: 0.0625rem;
435
+ }
436
+ .ad-toggle-track {
437
+ --ad-track-h: calc(var(--ad-size-h) * 0.64);
438
+ --ad-track-w: calc(var(--ad-track-h) * 1.82);
439
+ width: var(--ad-track-w);
440
+ height: var(--ad-track-h);
441
+ position: relative;
442
+ border-radius: 999rem;
443
+ border: 0.0625rem solid rgb(from var(--ad-primary) r g b / 0.55);
444
+ background: linear-gradient(180deg, var(--ad-neutral-800), var(--ad-neutral-900));
445
+ box-shadow: inset 0 0 0.3125rem #000b;
446
+ flex: none;
447
+ }
448
+ .ad-toggle-track i {
449
+ --ad-thumb-inset: calc(var(--ad-track-h) * 0.08);
450
+ position: absolute;
451
+ left: var(--ad-thumb-inset);
452
+ top: var(--ad-thumb-inset);
453
+ width: calc(var(--ad-track-h) - var(--ad-thumb-inset) * 2);
454
+ height: calc(var(--ad-track-h) - var(--ad-thumb-inset) * 2);
455
+ border: 0.125rem solid var(--ad-neutral-300);
456
+ border-radius: 50%;
457
+ background: linear-gradient(135deg, var(--ad-neutral-700), var(--ad-neutral-850));
458
+ box-shadow: 0 0 0.1875rem rgb(from var(--ad-secondary-200) r g b / 0.25);
459
+ transition:
460
+ transform 0.42s cubic-bezier(0.34, 1.56, 0.5, 1),
461
+ scale 0.18s ease-out,
462
+ background 0.25s,
463
+ border-color 0.25s,
464
+ box-shadow 0.25s;
465
+ }
466
+ .ad-switch input:focus-visible + .ad-toggle-track,
467
+ .ad-checkbox input:focus-visible + .ad-toggle-track {
468
+ outline: 0.125rem solid var(--ad-secondary-100);
469
+ outline-offset: 0.1875rem;
470
+ }
471
+ .ad-tab-shape {
472
+ position: absolute;
473
+ inset: 0;
474
+ width: 100%;
475
+ height: 100%;
476
+ overflow: visible;
477
+ z-index: -1;
478
+ pointer-events: none;
479
+ }
480
+ .ad-tab-shape .tab-shape__glow {
481
+ stroke: var(--ad-primary);
482
+ stroke-width: 6.5;
483
+ opacity: 0.72;
484
+ filter: blur(0.25rem);
485
+ }
486
+ .ad-tab-shape .tab-shape__edge {
487
+ stroke: var(--ad-secondary);
488
+ stroke-width: 1.15;
489
+ }
490
+ .ad-tab-shape .tab-shape__glint {
491
+ stroke: var(--ad-neutral-200);
492
+ stroke-width: 1.2;
493
+ stroke-linecap: round;
494
+ stroke-dasharray: 8 92;
495
+ animation: ad-tab-glint 6s linear infinite;
496
+ }
497
+ /* The glint's glow: two faint wider dashes under it, in step with it, instead of a live filter. */
498
+ .ad-tab-shape .tab-shape__glint[data-part="wide"] {
499
+ stroke: var(--ad-secondary);
500
+ stroke-width: 7.2;
501
+ opacity: 0.1;
502
+ }
503
+ .ad-tab-shape .tab-shape__glint[data-part="near"] {
504
+ stroke: var(--ad-secondary);
505
+ stroke-width: 4.2;
506
+ opacity: 0.25;
507
+ }
508
+ .ad-tab-shape-glint {
509
+ will-change: transform;
510
+ }
511
+ .ad-tab-shape .tab-shape__floor {
512
+ stroke: var(--ad-secondary);
513
+ stroke-width: 1.85;
514
+ filter: drop-shadow(0 0 0.25rem var(--ad-primary));
515
+ }
516
+
517
+ @media (prefers-reduced-motion: reduce) {
518
+ .ad-button,
519
+ .ad-icon-button,
520
+ .ad-toggle-button {
521
+ animation: none !important;
522
+ transition: none !important;
523
+ }
524
+ .ad-button::after,
525
+ .ad-icon-button::after,
526
+ .ad-toggle-button::after {
527
+ animation: none !important;
528
+ display: none !important;
529
+ }
530
+ }
531
+
532
+ /* Ghost is a subtle button (Fluent "subtle", MUI "text"): no surface until hovered. */
533
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] {
534
+ border-color: transparent;
535
+ background: transparent;
536
+ box-shadow: none;
537
+ color: var(--ad-neutral-300);
538
+ animation: none;
539
+ }
540
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]::before,
541
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]::after {
542
+ display: none;
543
+ }
544
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] > .ad-icon {
545
+ filter: none;
546
+ }
547
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]:hover:not(:disabled) {
548
+ background: rgb(from var(--ad-primary) r g b / 0.08);
549
+ box-shadow: none;
550
+ color: var(--ad-text);
551
+ filter: none;
552
+ transform: none;
553
+ }
554
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"]:active:not(
555
+ :disabled
556
+ ) {
557
+ background: rgb(from var(--ad-primary) r g b / 0.14);
558
+ box-shadow: none;
559
+ transform: scale(0.98);
560
+ }
561
+
562
+ /* Living plasma inside the button, a soft breath of light, and a comet running round its edge.
563
+ Accent buttons always show them; quieter variants reveal them on hover. Everything moves by
564
+ transform and opacity only, and only while it is visible, so a screen of buttons stays light. */
565
+ .ad-button-fx {
566
+ position: absolute;
567
+ inset: 0;
568
+ z-index: -1;
569
+ border-radius: inherit;
570
+ overflow: hidden;
571
+ pointer-events: none;
572
+ }
573
+ .ad-button-fx::before {
574
+ content: "";
575
+ position: absolute;
576
+ inset: -40% -10% -40% 30%;
577
+ background:
578
+ radial-gradient(circle at 72% 30%, #fff 0 1.2%, transparent 2.6%),
579
+ radial-gradient(circle at 86% 68%, var(--ad-secondary-100) 0 1.4%, transparent 3.2%),
580
+ radial-gradient(circle at 58% 74%, var(--ad-secondary-200) 0 1.8%, transparent 4%),
581
+ repeating-conic-gradient(
582
+ from 20deg at 80% 50%,
583
+ transparent 0 7deg,
584
+ #ffffff24 8deg 10deg,
585
+ transparent 12deg 19deg
586
+ ),
587
+ radial-gradient(ellipse at 80% 50%, rgb(from var(--ad-secondary) r g b / 0.44), transparent 65%);
588
+ mask-image: linear-gradient(90deg, transparent, #000 40%);
589
+ filter: saturate(1.35);
590
+ opacity: 0;
591
+ transition: opacity 0.4s;
592
+ will-change: transform;
593
+ }
594
+ /* The breath: a faint light over the face that swells and settles. */
595
+ .ad-button-fx::after {
596
+ content: "";
597
+ position: absolute;
598
+ inset: 0;
599
+ background: radial-gradient(ellipse at 50% 30%, rgb(from var(--ad-secondary-100) r g b / 0.14), transparent 70%);
600
+ opacity: 0;
601
+ }
602
+ /* The comet: a ring-shaped window onto a conic light that turns behind it. */
603
+ .ad-button-orbit {
604
+ position: absolute;
605
+ inset: 0;
606
+ z-index: 0;
607
+ border-radius: inherit;
608
+ padding: 0.0625rem;
609
+ overflow: hidden;
610
+ mask:
611
+ linear-gradient(#000 0 0) content-box exclude,
612
+ linear-gradient(#000 0 0);
613
+ opacity: 0;
614
+ transition: opacity 0.4s;
615
+ pointer-events: none;
616
+ }
617
+ .ad-button-orbit::before {
618
+ content: "";
619
+ position: absolute;
620
+ top: 50%;
621
+ left: 50%;
622
+ width: max(130%, 6rem);
623
+ aspect-ratio: 1;
624
+ translate: -50% -50%;
625
+ background: conic-gradient(
626
+ transparent 0 76%,
627
+ var(--ad-secondary) 84%,
628
+ #fff 88%,
629
+ transparent 93%
630
+ );
631
+ will-change: transform;
632
+ }
633
+ :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-fx::before,
634
+ .ad-toggle-button[aria-pressed="true"] > .ad-button-fx::before {
635
+ opacity: 0.85;
636
+ animation: ad-btn-plasma 7s ease-in-out infinite alternate;
637
+ }
638
+ :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-fx::after,
639
+ .ad-toggle-button[aria-pressed="true"] > .ad-button-fx::after {
640
+ animation: ad-btn-breathe 3.1s ease-in-out infinite;
641
+ }
642
+ :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-orbit,
643
+ .ad-toggle-button[aria-pressed="true"] > .ad-button-orbit {
644
+ opacity: 1;
645
+ }
646
+ :is(.ad-button, .ad-icon-button):is([data-ad-variant="primary"], [data-ad-variant="danger"]) > .ad-button-orbit::before,
647
+ .ad-toggle-button[aria-pressed="true"] > .ad-button-orbit::before {
648
+ animation: ad-btn-orbit 4.5s linear infinite;
649
+ }
650
+ :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-fx::before {
651
+ opacity: 0.9;
652
+ animation: ad-btn-plasma 7s ease-in-out infinite alternate;
653
+ }
654
+ :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-orbit {
655
+ opacity: 1;
656
+ }
657
+ :is(.ad-button, .ad-icon-button, .ad-toggle-button):hover:not(:disabled) > .ad-button-orbit::before {
658
+ animation: ad-btn-orbit 1.6s linear infinite;
659
+ }
660
+ :is(.ad-button, .ad-icon-button):disabled > :is(.ad-button-fx, .ad-button-orbit) {
661
+ display: none;
662
+ }
663
+ /* Icon-only buttons are small: the plasma centres on them instead of the right side. */
664
+ .ad-icon-button > .ad-button-fx::before {
665
+ inset: -30%;
666
+ mask-image: radial-gradient(closest-side, #000 40%, transparent);
667
+ }
668
+ /* Ghost buttons stay subtle: only the comet, no plasma. */
669
+ :is(.ad-button, .ad-icon-button)[data-ad-variant="ghost"] > .ad-button-fx::before {
670
+ display: none;
671
+ }
672
+ @keyframes ad-btn-plasma {
673
+ from {
674
+ transform: translate3d(-3%, -2%, 0) scale(1.02) rotate(0deg);
675
+ }
676
+ to {
677
+ transform: translate3d(3%, 2%, 0) scale(1.14) rotate(8deg);
678
+ }
679
+ }
680
+ @keyframes ad-btn-orbit {
681
+ to {
682
+ rotate: 360deg;
683
+ }
684
+ }
685
+ /* Buttons that live inside other controls stay plain. */
686
+ :is(.ad-input-adornment, .ad-split-button) :is(.ad-button-fx, .ad-button-orbit) {
687
+ display: none;
688
+ }
689
+
690
+ @keyframes ad-tab-glint {
691
+ to {
692
+ stroke-dashoffset: -100;
693
+ }
694
+ }