@twentyfirstmedia/halo 0.1.0 → 0.2.0
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.
- package/README.md +1 -1
- package/dist/scoped.css +917 -51
- package/dist/styles.css +786 -36
- package/dist/tailwind.css +15 -0
- package/dist/tokens.css +169 -0
- package/dist/tokens.json +177 -0
- package/package.json +2 -2
package/dist/scoped.css
CHANGED
|
@@ -94,6 +94,10 @@
|
|
|
94
94
|
--dur-enter: 520ms;
|
|
95
95
|
--dur-slow: 900ms;
|
|
96
96
|
--stagger-step: 55ms;
|
|
97
|
+
--dur-exit: 160ms;
|
|
98
|
+
--motion-time: 1;
|
|
99
|
+
--motion-travel: 1;
|
|
100
|
+
--motion-blur: 0px;
|
|
97
101
|
--ease-out: cubic-bezier(0.22, 1, 0.36, 1);
|
|
98
102
|
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
99
103
|
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
@@ -300,6 +304,20 @@
|
|
|
300
304
|
--on-frame-danger: #f2a8a0;
|
|
301
305
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
302
306
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
307
|
+
--glass: color-mix(in srgb, var(--card) 72%, transparent);
|
|
308
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
309
|
+
--glass-control: color-mix(in srgb, var(--card) 62%, transparent);
|
|
310
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
311
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 8%, transparent);
|
|
312
|
+
--glass-border: rgba(255, 255, 255, 0.6);
|
|
313
|
+
--glass-highlight: rgba(255, 255, 255, 0.95);
|
|
314
|
+
--glass-sheen: rgba(255, 255, 255, 0.5);
|
|
315
|
+
--ambient-base: var(--background);
|
|
316
|
+
--ambient-1: color-mix(in oklab, var(--sky) 72%, var(--sky-ink));
|
|
317
|
+
--ambient-2: color-mix(in oklab, var(--mint) 72%, var(--mint-ink));
|
|
318
|
+
--ambient-3: color-mix(in oklab, var(--lilac) 72%, var(--lilac-ink));
|
|
319
|
+
--ambient-4: color-mix(in oklab, var(--butter) 72%, var(--butter-ink));
|
|
320
|
+
--ambient-scrim: rgba(255, 255, 255, 0.28);
|
|
303
321
|
--bg-000: var(--canvas);
|
|
304
322
|
--bg-100: var(--surface);
|
|
305
323
|
--bg-200: var(--surface-sunken);
|
|
@@ -357,6 +375,7 @@
|
|
|
357
375
|
--shadow-lift: 0 2px 4px rgba(20,20,20,0.06), 0 14px 32px rgba(20,20,20,0.10);
|
|
358
376
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.22);
|
|
359
377
|
--shadow-overlay: var(--shadow-float);
|
|
378
|
+
--shadow-glass: 0 1px 2px rgba(20, 20, 40, 0.06), 0 12px 40px rgba(20, 20, 40, 0.14);
|
|
360
379
|
--button-radius: var(--radius-pill);
|
|
361
380
|
--field-radius: var(--radius-pill);
|
|
362
381
|
--badge-radius: var(--radius-pill);
|
|
@@ -366,6 +385,8 @@
|
|
|
366
385
|
--panel-shadow: var(--shadow-card);
|
|
367
386
|
--panel-pad: var(--space-6);
|
|
368
387
|
--panel-gap: var(--space-4);
|
|
388
|
+
--glass-filter: blur(24px) saturate(180%) brightness(1.05);
|
|
389
|
+
--glass-tint: 62%;
|
|
369
390
|
color-scheme: light;
|
|
370
391
|
}
|
|
371
392
|
@media (prefers-color-scheme: dark) {
|
|
@@ -431,6 +452,20 @@
|
|
|
431
452
|
--on-frame-danger: #f2a8a0;
|
|
432
453
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
433
454
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
455
|
+
--glass: color-mix(in srgb, var(--card) 70%, transparent);
|
|
456
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
457
|
+
--glass-control: color-mix(in srgb, var(--foreground) 10%, transparent);
|
|
458
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
459
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 12%, transparent);
|
|
460
|
+
--glass-border: rgba(255, 255, 255, 0.1);
|
|
461
|
+
--glass-highlight: rgba(255, 255, 255, 0.18);
|
|
462
|
+
--glass-sheen: rgba(255, 255, 255, 0.05);
|
|
463
|
+
--ambient-base: var(--background);
|
|
464
|
+
--ambient-1: var(--sky);
|
|
465
|
+
--ambient-2: var(--mint);
|
|
466
|
+
--ambient-3: var(--lilac);
|
|
467
|
+
--ambient-4: var(--butter);
|
|
468
|
+
--ambient-scrim: rgba(10, 10, 10, 0.45);
|
|
434
469
|
--bg-000: var(--canvas);
|
|
435
470
|
--bg-100: var(--surface);
|
|
436
471
|
--bg-200: var(--surface-sunken);
|
|
@@ -488,6 +523,7 @@
|
|
|
488
523
|
--shadow-lift: 0 2px 6px rgba(0,0,0,0.5), 0 14px 32px rgba(0,0,0,0.45);
|
|
489
524
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.6);
|
|
490
525
|
--shadow-overlay: var(--shadow-float);
|
|
526
|
+
--shadow-glass: 0 1px 2px rgba(0, 0, 0, 0.3), 0 16px 48px rgba(0, 0, 0, 0.45);
|
|
491
527
|
--button-radius: var(--radius-pill);
|
|
492
528
|
--field-radius: var(--radius-pill);
|
|
493
529
|
--badge-radius: var(--radius-pill);
|
|
@@ -497,6 +533,8 @@
|
|
|
497
533
|
--panel-shadow: var(--shadow-card);
|
|
498
534
|
--panel-pad: var(--space-6);
|
|
499
535
|
--panel-gap: var(--space-4);
|
|
536
|
+
--glass-filter: blur(24px) saturate(160%) brightness(0.85);
|
|
537
|
+
--glass-tint: 62%;
|
|
500
538
|
color-scheme: dark;
|
|
501
539
|
}
|
|
502
540
|
}
|
|
@@ -563,6 +601,20 @@
|
|
|
563
601
|
--on-frame-danger: #f2a8a0;
|
|
564
602
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
565
603
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
604
|
+
--glass: color-mix(in srgb, var(--card) 70%, transparent);
|
|
605
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
606
|
+
--glass-control: color-mix(in srgb, var(--foreground) 10%, transparent);
|
|
607
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
608
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 12%, transparent);
|
|
609
|
+
--glass-border: rgba(255, 255, 255, 0.1);
|
|
610
|
+
--glass-highlight: rgba(255, 255, 255, 0.18);
|
|
611
|
+
--glass-sheen: rgba(255, 255, 255, 0.05);
|
|
612
|
+
--ambient-base: var(--background);
|
|
613
|
+
--ambient-1: var(--sky);
|
|
614
|
+
--ambient-2: var(--mint);
|
|
615
|
+
--ambient-3: var(--lilac);
|
|
616
|
+
--ambient-4: var(--butter);
|
|
617
|
+
--ambient-scrim: rgba(10, 10, 10, 0.45);
|
|
566
618
|
--bg-000: var(--canvas);
|
|
567
619
|
--bg-100: var(--surface);
|
|
568
620
|
--bg-200: var(--surface-sunken);
|
|
@@ -620,6 +672,7 @@
|
|
|
620
672
|
--shadow-lift: 0 2px 6px rgba(0,0,0,0.5), 0 14px 32px rgba(0,0,0,0.45);
|
|
621
673
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.6);
|
|
622
674
|
--shadow-overlay: var(--shadow-float);
|
|
675
|
+
--shadow-glass: 0 1px 2px rgba(0, 0, 0, 0.3), 0 16px 48px rgba(0, 0, 0, 0.45);
|
|
623
676
|
--button-radius: var(--radius-pill);
|
|
624
677
|
--field-radius: var(--radius-pill);
|
|
625
678
|
--badge-radius: var(--radius-pill);
|
|
@@ -629,6 +682,8 @@
|
|
|
629
682
|
--panel-shadow: var(--shadow-card);
|
|
630
683
|
--panel-pad: var(--space-6);
|
|
631
684
|
--panel-gap: var(--space-4);
|
|
685
|
+
--glass-filter: blur(24px) saturate(160%) brightness(0.85);
|
|
686
|
+
--glass-tint: 62%;
|
|
632
687
|
color-scheme: dark;
|
|
633
688
|
}
|
|
634
689
|
}
|
|
@@ -695,6 +750,20 @@
|
|
|
695
750
|
--on-frame-danger: #f2a8a0;
|
|
696
751
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
697
752
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
753
|
+
--glass: color-mix(in srgb, var(--card) 72%, transparent);
|
|
754
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
755
|
+
--glass-control: color-mix(in srgb, var(--card) 62%, transparent);
|
|
756
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
757
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 8%, transparent);
|
|
758
|
+
--glass-border: rgba(255, 255, 255, 0.6);
|
|
759
|
+
--glass-highlight: rgba(255, 255, 255, 0.95);
|
|
760
|
+
--glass-sheen: rgba(255, 255, 255, 0.5);
|
|
761
|
+
--ambient-base: var(--background);
|
|
762
|
+
--ambient-1: color-mix(in oklab, var(--sky) 72%, var(--sky-ink));
|
|
763
|
+
--ambient-2: color-mix(in oklab, var(--mint) 72%, var(--mint-ink));
|
|
764
|
+
--ambient-3: color-mix(in oklab, var(--lilac) 72%, var(--lilac-ink));
|
|
765
|
+
--ambient-4: color-mix(in oklab, var(--butter) 72%, var(--butter-ink));
|
|
766
|
+
--ambient-scrim: rgba(255, 255, 255, 0.28);
|
|
698
767
|
--bg-000: var(--canvas);
|
|
699
768
|
--bg-100: var(--surface);
|
|
700
769
|
--bg-200: var(--surface-sunken);
|
|
@@ -752,6 +821,7 @@
|
|
|
752
821
|
--shadow-lift: 0 2px 4px rgba(20,20,20,0.06), 0 14px 32px rgba(20,20,20,0.10);
|
|
753
822
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.22);
|
|
754
823
|
--shadow-overlay: var(--shadow-float);
|
|
824
|
+
--shadow-glass: 0 1px 2px rgba(20, 20, 40, 0.06), 0 12px 40px rgba(20, 20, 40, 0.14);
|
|
755
825
|
--button-radius: var(--radius-pill);
|
|
756
826
|
--field-radius: var(--radius-pill);
|
|
757
827
|
--badge-radius: var(--radius-pill);
|
|
@@ -761,6 +831,8 @@
|
|
|
761
831
|
--panel-shadow: var(--shadow-card);
|
|
762
832
|
--panel-pad: var(--space-6);
|
|
763
833
|
--panel-gap: var(--space-4);
|
|
834
|
+
--glass-filter: blur(24px) saturate(180%) brightness(1.05);
|
|
835
|
+
--glass-tint: 62%;
|
|
764
836
|
color-scheme: light;
|
|
765
837
|
}
|
|
766
838
|
}
|
|
@@ -826,6 +898,20 @@
|
|
|
826
898
|
--on-frame-danger: #f2a8a0;
|
|
827
899
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
828
900
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
901
|
+
--glass: color-mix(in srgb, var(--card) 70%, transparent);
|
|
902
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
903
|
+
--glass-control: color-mix(in srgb, var(--foreground) 10%, transparent);
|
|
904
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
905
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 12%, transparent);
|
|
906
|
+
--glass-border: rgba(255, 255, 255, 0.1);
|
|
907
|
+
--glass-highlight: rgba(255, 255, 255, 0.18);
|
|
908
|
+
--glass-sheen: rgba(255, 255, 255, 0.05);
|
|
909
|
+
--ambient-base: var(--background);
|
|
910
|
+
--ambient-1: var(--sky);
|
|
911
|
+
--ambient-2: var(--mint);
|
|
912
|
+
--ambient-3: var(--lilac);
|
|
913
|
+
--ambient-4: var(--butter);
|
|
914
|
+
--ambient-scrim: rgba(10, 10, 10, 0.45);
|
|
829
915
|
--bg-000: var(--canvas);
|
|
830
916
|
--bg-100: var(--surface);
|
|
831
917
|
--bg-200: var(--surface-sunken);
|
|
@@ -883,6 +969,7 @@
|
|
|
883
969
|
--shadow-lift: 0 2px 6px rgba(0,0,0,0.5), 0 14px 32px rgba(0,0,0,0.45);
|
|
884
970
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.6);
|
|
885
971
|
--shadow-overlay: var(--shadow-float);
|
|
972
|
+
--shadow-glass: 0 1px 2px rgba(0, 0, 0, 0.3), 0 16px 48px rgba(0, 0, 0, 0.45);
|
|
886
973
|
--button-radius: var(--radius-pill);
|
|
887
974
|
--field-radius: var(--radius-pill);
|
|
888
975
|
--badge-radius: var(--radius-pill);
|
|
@@ -892,6 +979,8 @@
|
|
|
892
979
|
--panel-shadow: var(--shadow-card);
|
|
893
980
|
--panel-pad: var(--space-6);
|
|
894
981
|
--panel-gap: var(--space-4);
|
|
982
|
+
--glass-filter: blur(24px) saturate(160%) brightness(0.85);
|
|
983
|
+
--glass-tint: 62%;
|
|
895
984
|
color-scheme: dark;
|
|
896
985
|
}
|
|
897
986
|
:where([data-kit="halo"][data-theme="light"], [data-kit="halo"] [data-theme="light"], [data-kit="halo"].light, [data-kit="halo"] .light) {
|
|
@@ -956,6 +1045,20 @@
|
|
|
956
1045
|
--on-frame-danger: #f2a8a0;
|
|
957
1046
|
--scrim: rgba(10, 10, 10, 0.32);
|
|
958
1047
|
--scrim-strong: rgba(10, 10, 10, 0.38);
|
|
1048
|
+
--glass: color-mix(in srgb, var(--card) 72%, transparent);
|
|
1049
|
+
--glass-strong: color-mix(in srgb, var(--card) 86%, transparent);
|
|
1050
|
+
--glass-control: color-mix(in srgb, var(--card) 62%, transparent);
|
|
1051
|
+
--glass-well: color-mix(in srgb, var(--foreground) 6%, transparent);
|
|
1052
|
+
--glass-hover: color-mix(in srgb, var(--foreground) 8%, transparent);
|
|
1053
|
+
--glass-border: rgba(255, 255, 255, 0.6);
|
|
1054
|
+
--glass-highlight: rgba(255, 255, 255, 0.95);
|
|
1055
|
+
--glass-sheen: rgba(255, 255, 255, 0.5);
|
|
1056
|
+
--ambient-base: var(--background);
|
|
1057
|
+
--ambient-1: color-mix(in oklab, var(--sky) 72%, var(--sky-ink));
|
|
1058
|
+
--ambient-2: color-mix(in oklab, var(--mint) 72%, var(--mint-ink));
|
|
1059
|
+
--ambient-3: color-mix(in oklab, var(--lilac) 72%, var(--lilac-ink));
|
|
1060
|
+
--ambient-4: color-mix(in oklab, var(--butter) 72%, var(--butter-ink));
|
|
1061
|
+
--ambient-scrim: rgba(255, 255, 255, 0.28);
|
|
959
1062
|
--bg-000: var(--canvas);
|
|
960
1063
|
--bg-100: var(--surface);
|
|
961
1064
|
--bg-200: var(--surface-sunken);
|
|
@@ -1013,6 +1116,7 @@
|
|
|
1013
1116
|
--shadow-lift: 0 2px 4px rgba(20,20,20,0.06), 0 14px 32px rgba(20,20,20,0.10);
|
|
1014
1117
|
--shadow-float: 0 16px 40px rgba(0,0,0,0.22);
|
|
1015
1118
|
--shadow-overlay: var(--shadow-float);
|
|
1119
|
+
--shadow-glass: 0 1px 2px rgba(20, 20, 40, 0.06), 0 12px 40px rgba(20, 20, 40, 0.14);
|
|
1016
1120
|
--button-radius: var(--radius-pill);
|
|
1017
1121
|
--field-radius: var(--radius-pill);
|
|
1018
1122
|
--badge-radius: var(--radius-pill);
|
|
@@ -1022,6 +1126,8 @@
|
|
|
1022
1126
|
--panel-shadow: var(--shadow-card);
|
|
1023
1127
|
--panel-pad: var(--space-6);
|
|
1024
1128
|
--panel-gap: var(--space-4);
|
|
1129
|
+
--glass-filter: blur(24px) saturate(180%) brightness(1.05);
|
|
1130
|
+
--glass-tint: 62%;
|
|
1025
1131
|
color-scheme: light;
|
|
1026
1132
|
}
|
|
1027
1133
|
:where([data-kit="halo"][data-density="compact"], [data-kit="halo"] [data-density="compact"]) {
|
|
@@ -1038,6 +1144,69 @@
|
|
|
1038
1144
|
--density-font-size: 14px;
|
|
1039
1145
|
--density-line-height: 20px;
|
|
1040
1146
|
}
|
|
1147
|
+
:where([data-kit="halo"][data-motion="expressive"], [data-kit="halo"] [data-motion="expressive"]) {
|
|
1148
|
+
--dur-enter: 760ms;
|
|
1149
|
+
--dur-slow: 1300ms;
|
|
1150
|
+
--dur-exit: 220ms;
|
|
1151
|
+
--stagger-step: 90ms;
|
|
1152
|
+
--motion-time: 1.4;
|
|
1153
|
+
--motion-travel: 1.7;
|
|
1154
|
+
--motion-blur: 8px;
|
|
1155
|
+
}
|
|
1156
|
+
:where([data-kit="halo"][data-motion="off"], [data-kit="halo"] [data-motion="off"]) {
|
|
1157
|
+
--duration-fast: 0ms;
|
|
1158
|
+
--duration-base: 0ms;
|
|
1159
|
+
--dur-fast: 0ms;
|
|
1160
|
+
--dur-base: 0ms;
|
|
1161
|
+
--dur-enter: 0ms;
|
|
1162
|
+
--dur-slow: 0ms;
|
|
1163
|
+
--dur-exit: 0ms;
|
|
1164
|
+
--stagger-step: 0ms;
|
|
1165
|
+
--motion-time: 0;
|
|
1166
|
+
--motion-travel: 0;
|
|
1167
|
+
--motion-blur: 0px;
|
|
1168
|
+
}
|
|
1169
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1170
|
+
:where([data-kit="halo"], [data-kit="halo"][data-motion], [data-kit="halo"] [data-motion], [data-kit="halo"][data-theme], [data-kit="halo"] [data-theme]) {
|
|
1171
|
+
--duration-fast: 0ms;
|
|
1172
|
+
--duration-base: 0ms;
|
|
1173
|
+
--dur-fast: 0ms;
|
|
1174
|
+
--dur-base: 0ms;
|
|
1175
|
+
--dur-enter: 0ms;
|
|
1176
|
+
--dur-slow: 0ms;
|
|
1177
|
+
--dur-exit: 0ms;
|
|
1178
|
+
--stagger-step: 0ms;
|
|
1179
|
+
--motion-time: 0;
|
|
1180
|
+
--motion-travel: 0;
|
|
1181
|
+
--motion-blur: 0px;
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
1185
|
+
:where([data-kit="halo"], [data-kit="halo"][data-theme], [data-kit="halo"] [data-theme], [data-kit="halo"].dark, [data-kit="halo"] .dark, [data-kit="halo"].light, [data-kit="halo"] .light) {
|
|
1186
|
+
--glass: var(--glass-strong);
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
@media (prefers-contrast: more) {
|
|
1190
|
+
:where([data-kit="halo"], [data-kit="halo"][data-theme], [data-kit="halo"] [data-theme], [data-kit="halo"].dark, [data-kit="halo"] .dark, [data-kit="halo"].light, [data-kit="halo"] .light) {
|
|
1191
|
+
--glass: var(--glass-strong);
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
1195
|
+
:where([data-kit="halo"], [data-kit="halo"][data-theme], [data-kit="halo"] [data-theme], [data-kit="halo"].dark, [data-kit="halo"] .dark, [data-kit="halo"].light, [data-kit="halo"] .light) {
|
|
1196
|
+
--glass: var(--card);
|
|
1197
|
+
--glass-strong: var(--popover);
|
|
1198
|
+
--glass-sheen: transparent;
|
|
1199
|
+
--glass-filter: none;
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
@media (forced-colors: active) {
|
|
1203
|
+
:where([data-kit="halo"], [data-kit="halo"][data-theme], [data-kit="halo"] [data-theme], [data-kit="halo"].dark, [data-kit="halo"] .dark, [data-kit="halo"].light, [data-kit="halo"] .light) {
|
|
1204
|
+
--glass: var(--card);
|
|
1205
|
+
--glass-strong: var(--popover);
|
|
1206
|
+
--glass-sheen: transparent;
|
|
1207
|
+
--glass-filter: none;
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1041
1210
|
|
|
1042
1211
|
/* 01-foundation.css */
|
|
1043
1212
|
/* Halo components, ported from reference/halo/source/halo.css (ha- → tf-). Every value comes from the tokens. */
|
|
@@ -1583,18 +1752,23 @@
|
|
|
1583
1752
|
box-shadow: none;
|
|
1584
1753
|
}
|
|
1585
1754
|
:where([data-kit="halo"]) .tf-bg-sky {
|
|
1755
|
+
--tint: var(--sky);
|
|
1586
1756
|
background: var(--sky);
|
|
1587
1757
|
}
|
|
1588
1758
|
:where([data-kit="halo"]) .tf-bg-mint {
|
|
1759
|
+
--tint: var(--mint);
|
|
1589
1760
|
background: var(--mint);
|
|
1590
1761
|
}
|
|
1591
1762
|
:where([data-kit="halo"]) .tf-bg-lilac {
|
|
1763
|
+
--tint: var(--lilac);
|
|
1592
1764
|
background: var(--lilac);
|
|
1593
1765
|
}
|
|
1594
1766
|
:where([data-kit="halo"]) .tf-bg-butter {
|
|
1767
|
+
--tint: var(--butter);
|
|
1595
1768
|
background: var(--butter);
|
|
1596
1769
|
}
|
|
1597
1770
|
:where([data-kit="halo"]) .tf-bg-blush {
|
|
1771
|
+
--tint: var(--blush);
|
|
1598
1772
|
background: var(--blush);
|
|
1599
1773
|
}
|
|
1600
1774
|
:where([data-kit="halo"]) .tf-bg-surface {
|
|
@@ -2016,7 +2190,7 @@
|
|
|
2016
2190
|
@keyframes tf-halo-rise {
|
|
2017
2191
|
from {
|
|
2018
2192
|
opacity: 0;
|
|
2019
|
-
transform: translateY(14px) scale(0.985);
|
|
2193
|
+
transform: translateY(calc(14px * var(--motion-travel))) scale(0.985);
|
|
2020
2194
|
}
|
|
2021
2195
|
to {
|
|
2022
2196
|
opacity: 1;
|
|
@@ -2034,7 +2208,7 @@
|
|
|
2034
2208
|
@keyframes tf-halo-drop {
|
|
2035
2209
|
from {
|
|
2036
2210
|
opacity: 0;
|
|
2037
|
-
transform: translateY(-10px);
|
|
2211
|
+
transform: translateY(calc(-10px * var(--motion-travel)));
|
|
2038
2212
|
}
|
|
2039
2213
|
to {
|
|
2040
2214
|
opacity: 1;
|
|
@@ -2044,7 +2218,7 @@
|
|
|
2044
2218
|
@keyframes tf-halo-slide-in {
|
|
2045
2219
|
from {
|
|
2046
2220
|
opacity: 0;
|
|
2047
|
-
transform: translateX(24px);
|
|
2221
|
+
transform: translateX(calc(24px * var(--motion-travel)));
|
|
2048
2222
|
}
|
|
2049
2223
|
to {
|
|
2050
2224
|
opacity: 1;
|
|
@@ -2054,7 +2228,8 @@
|
|
|
2054
2228
|
@keyframes tf-halo-slide-up {
|
|
2055
2229
|
from {
|
|
2056
2230
|
opacity: 0;
|
|
2057
|
-
transform: translate(
|
|
2231
|
+
transform: translate(calc(0px * var(--motion-travel)), calc(28px * var(--motion-travel)))
|
|
2232
|
+
scale(0.9);
|
|
2058
2233
|
}
|
|
2059
2234
|
to {
|
|
2060
2235
|
opacity: 1;
|
|
@@ -2113,47 +2288,60 @@
|
|
|
2113
2288
|
}
|
|
2114
2289
|
|
|
2115
2290
|
:where([data-kit="halo"]) .tf-in {
|
|
2291
|
+
--enter-delay: var(--d, 0ms);
|
|
2116
2292
|
animation: tf-halo-rise var(--dur-enter) var(--ease-out) both;
|
|
2117
|
-
animation-delay: var(--
|
|
2293
|
+
animation-delay: var(--enter-delay);
|
|
2118
2294
|
}
|
|
2119
2295
|
:where([data-kit="halo"]) .tf-stagger > * {
|
|
2120
2296
|
animation: tf-halo-rise var(--dur-enter) var(--ease-out) both;
|
|
2121
2297
|
}
|
|
2122
2298
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(1) {
|
|
2123
|
-
|
|
2299
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 0);
|
|
2300
|
+
animation-delay: var(--enter-delay);
|
|
2124
2301
|
}
|
|
2125
2302
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(2) {
|
|
2126
|
-
|
|
2303
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 1);
|
|
2304
|
+
animation-delay: var(--enter-delay);
|
|
2127
2305
|
}
|
|
2128
2306
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(3) {
|
|
2129
|
-
|
|
2307
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 2);
|
|
2308
|
+
animation-delay: var(--enter-delay);
|
|
2130
2309
|
}
|
|
2131
2310
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(4) {
|
|
2132
|
-
|
|
2311
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 3);
|
|
2312
|
+
animation-delay: var(--enter-delay);
|
|
2133
2313
|
}
|
|
2134
2314
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(5) {
|
|
2135
|
-
|
|
2315
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 4);
|
|
2316
|
+
animation-delay: var(--enter-delay);
|
|
2136
2317
|
}
|
|
2137
2318
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(6) {
|
|
2138
|
-
|
|
2319
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 5);
|
|
2320
|
+
animation-delay: var(--enter-delay);
|
|
2139
2321
|
}
|
|
2140
2322
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(7) {
|
|
2141
|
-
|
|
2323
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 6);
|
|
2324
|
+
animation-delay: var(--enter-delay);
|
|
2142
2325
|
}
|
|
2143
2326
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(8) {
|
|
2144
|
-
|
|
2327
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 7);
|
|
2328
|
+
animation-delay: var(--enter-delay);
|
|
2145
2329
|
}
|
|
2146
2330
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(9) {
|
|
2147
|
-
|
|
2331
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 8);
|
|
2332
|
+
animation-delay: var(--enter-delay);
|
|
2148
2333
|
}
|
|
2149
2334
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(10) {
|
|
2150
|
-
|
|
2335
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 9);
|
|
2336
|
+
animation-delay: var(--enter-delay);
|
|
2151
2337
|
}
|
|
2152
2338
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(11) {
|
|
2153
|
-
|
|
2339
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 10);
|
|
2340
|
+
animation-delay: var(--enter-delay);
|
|
2154
2341
|
}
|
|
2155
2342
|
:where([data-kit="halo"]) .tf-stagger > :nth-child(n + 12) {
|
|
2156
|
-
|
|
2343
|
+
--enter-delay: calc(var(--base, 0ms) + var(--stagger-step) * 11);
|
|
2344
|
+
animation-delay: var(--enter-delay);
|
|
2157
2345
|
}
|
|
2158
2346
|
:where([data-kit="halo"]) .tf-topbar {
|
|
2159
2347
|
animation: tf-halo-drop var(--dur-enter) var(--ease-out) both;
|
|
@@ -2163,32 +2351,32 @@
|
|
|
2163
2351
|
}
|
|
2164
2352
|
:where([data-kit="halo"]) .tf-panel.tf-side {
|
|
2165
2353
|
animation: tf-halo-slide-in var(--dur-enter) var(--ease-out) both;
|
|
2166
|
-
animation-delay: 160ms;
|
|
2354
|
+
animation-delay: calc(160ms * var(--motion-time));
|
|
2167
2355
|
}
|
|
2168
2356
|
:where([data-kit="halo"]) .tf-dock {
|
|
2169
2357
|
animation: tf-halo-slide-up var(--dur-enter) var(--ease-spring) both;
|
|
2170
|
-
animation-delay: 420ms;
|
|
2358
|
+
animation-delay: calc(420ms * var(--motion-time));
|
|
2171
2359
|
}
|
|
2172
2360
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn {
|
|
2173
2361
|
animation: tf-halo-pop var(--dur-base) var(--ease-spring) both;
|
|
2174
2362
|
}
|
|
2175
2363
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(1) {
|
|
2176
|
-
animation-delay: 520ms;
|
|
2364
|
+
animation-delay: calc(520ms * var(--motion-time));
|
|
2177
2365
|
}
|
|
2178
2366
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(2) {
|
|
2179
|
-
animation-delay: 570ms;
|
|
2367
|
+
animation-delay: calc(570ms * var(--motion-time));
|
|
2180
2368
|
}
|
|
2181
2369
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(3) {
|
|
2182
|
-
animation-delay: 620ms;
|
|
2370
|
+
animation-delay: calc(620ms * var(--motion-time));
|
|
2183
2371
|
}
|
|
2184
2372
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(4) {
|
|
2185
|
-
animation-delay: 670ms;
|
|
2373
|
+
animation-delay: calc(670ms * var(--motion-time));
|
|
2186
2374
|
}
|
|
2187
2375
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(5) {
|
|
2188
|
-
animation-delay: 720ms;
|
|
2376
|
+
animation-delay: calc(720ms * var(--motion-time));
|
|
2189
2377
|
}
|
|
2190
2378
|
:where([data-kit="halo"]) .tf-dock .tf-dock-btn:nth-child(n + 6) {
|
|
2191
|
-
animation-delay: 770ms;
|
|
2379
|
+
animation-delay: calc(770ms * var(--motion-time));
|
|
2192
2380
|
}
|
|
2193
2381
|
:where([data-kit="halo"]) .tf-rail-btn {
|
|
2194
2382
|
animation: tf-halo-pop var(--dur-base) var(--ease-spring) both;
|
|
@@ -2225,7 +2413,7 @@
|
|
|
2225
2413
|
:where([data-kit="halo"]) .tf-progress > span {
|
|
2226
2414
|
transform-origin: left;
|
|
2227
2415
|
animation: tf-halo-grow-x var(--dur-slow) var(--ease-out) both;
|
|
2228
|
-
animation-delay: 200ms;
|
|
2416
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(200ms * var(--motion-time)));
|
|
2229
2417
|
}
|
|
2230
2418
|
|
|
2231
2419
|
/* Sliding tab indicator */
|
|
@@ -2304,6 +2492,7 @@
|
|
|
2304
2492
|
transform-box: fill-box;
|
|
2305
2493
|
transform-origin: bottom;
|
|
2306
2494
|
animation: tf-halo-grow-y var(--dur-slow) var(--ease-out) both;
|
|
2495
|
+
animation-delay: var(--enter-delay, 0ms);
|
|
2307
2496
|
}
|
|
2308
2497
|
:where([data-kit="halo"]) .tf-bar-ink {
|
|
2309
2498
|
fill: var(--primary);
|
|
@@ -2331,7 +2520,7 @@
|
|
|
2331
2520
|
stroke-dasharray: 1;
|
|
2332
2521
|
stroke-dashoffset: 1;
|
|
2333
2522
|
animation: tf-halo-draw var(--dur-slow) var(--ease-out) forwards;
|
|
2334
|
-
animation-delay: 150ms;
|
|
2523
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(150ms * var(--motion-time)));
|
|
2335
2524
|
}
|
|
2336
2525
|
:where([data-kit="halo"]) .tf-line-ink {
|
|
2337
2526
|
stroke: var(--primary);
|
|
@@ -2354,7 +2543,7 @@
|
|
|
2354
2543
|
:where([data-kit="halo"]) .tf-area {
|
|
2355
2544
|
opacity: 0;
|
|
2356
2545
|
animation: tf-halo-fade var(--dur-slow) var(--ease-out) forwards;
|
|
2357
|
-
animation-delay: 500ms;
|
|
2546
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(500ms * var(--motion-time)));
|
|
2358
2547
|
}
|
|
2359
2548
|
:where([data-kit="halo"]) .tf-area-sky {
|
|
2360
2549
|
fill: var(--sky);
|
|
@@ -2375,7 +2564,7 @@
|
|
|
2375
2564
|
fill: var(--surface);
|
|
2376
2565
|
stroke-width: 2.5;
|
|
2377
2566
|
animation: tf-halo-pop var(--dur-base) var(--ease-spring) both;
|
|
2378
|
-
animation-delay: 900ms;
|
|
2567
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(900ms * var(--motion-time)));
|
|
2379
2568
|
transform-box: fill-box;
|
|
2380
2569
|
transform-origin: center;
|
|
2381
2570
|
}
|
|
@@ -2804,6 +2993,22 @@
|
|
|
2804
2993
|
}
|
|
2805
2994
|
}
|
|
2806
2995
|
|
|
2996
|
+
/* the same for an app that turns motion off: data-motion="off" */
|
|
2997
|
+
:where([data-kit="halo"])[data-motion="off"] *,
|
|
2998
|
+
:where([data-kit="halo"]) [data-motion="off"] *,
|
|
2999
|
+
:where([data-kit="halo"])[data-motion="off"] *::before,
|
|
3000
|
+
:where([data-kit="halo"]) [data-motion="off"] *::before,
|
|
3001
|
+
:where([data-kit="halo"])[data-motion="off"] *::after,
|
|
3002
|
+
:where([data-kit="halo"]) [data-motion="off"] *::after {
|
|
3003
|
+
animation-duration: 1ms !important;
|
|
3004
|
+
animation-delay: 0ms !important;
|
|
3005
|
+
animation-iteration-count: 1 !important;
|
|
3006
|
+
transition-duration: 1ms !important;
|
|
3007
|
+
}
|
|
3008
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-line, :where([data-kit="halo"]) [data-motion="off"] .tf-line {
|
|
3009
|
+
stroke-dashoffset: 0;
|
|
3010
|
+
}
|
|
3011
|
+
|
|
2807
3012
|
/* ───────── Refinements ───────── */
|
|
2808
3013
|
:where([data-kit="halo"]) .tf-nav-label {
|
|
2809
3014
|
white-space: nowrap;
|
|
@@ -2835,7 +3040,7 @@
|
|
|
2835
3040
|
:where([data-kit="halo"]) .tf-area {
|
|
2836
3041
|
opacity: 0;
|
|
2837
3042
|
animation: tf-halo-area-in var(--dur-slow) var(--ease-out) forwards;
|
|
2838
|
-
animation-delay: 500ms;
|
|
3043
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(500ms * var(--motion-time)));
|
|
2839
3044
|
}
|
|
2840
3045
|
@keyframes tf-halo-area-in {
|
|
2841
3046
|
to {
|
|
@@ -3397,7 +3602,7 @@
|
|
|
3397
3602
|
}
|
|
3398
3603
|
@keyframes tf-halo-drawer-in {
|
|
3399
3604
|
from {
|
|
3400
|
-
transform: translateX(40px);
|
|
3605
|
+
transform: translateX(calc(40px * var(--motion-travel)));
|
|
3401
3606
|
opacity: 0;
|
|
3402
3607
|
}
|
|
3403
3608
|
to {
|
|
@@ -4271,7 +4476,7 @@
|
|
|
4271
4476
|
box-shadow:
|
|
4272
4477
|
var(--shadow-float),
|
|
4273
4478
|
0 0 0 1px var(--line);
|
|
4274
|
-
animation: tf-pop var(--dur-base) var(--ease-spring) both;
|
|
4479
|
+
animation: tf-halo-pop var(--dur-base) var(--ease-spring) both;
|
|
4275
4480
|
transform-origin: top left;
|
|
4276
4481
|
}
|
|
4277
4482
|
:where([data-kit="halo"]) .tf-popover.tf-pop-end {
|
|
@@ -5271,7 +5476,7 @@
|
|
|
5271
5476
|
color: var(--on-frame);
|
|
5272
5477
|
box-shadow: var(--shadow-float);
|
|
5273
5478
|
font: 600 13px/18px var(--font-sans);
|
|
5274
|
-
animation: tf-slide-up var(--dur-base) var(--ease-spring) both;
|
|
5479
|
+
animation: tf-halo-slide-up var(--dur-base) var(--ease-spring) both;
|
|
5275
5480
|
margin-bottom: 8px;
|
|
5276
5481
|
}
|
|
5277
5482
|
:where([data-kit="halo"]) .tf-bulkbar > b {
|
|
@@ -5371,7 +5576,8 @@
|
|
|
5371
5576
|
:where([data-kit="halo"]) .tf-seg-bar {
|
|
5372
5577
|
transform-box: fill-box;
|
|
5373
5578
|
transform-origin: bottom;
|
|
5374
|
-
animation: tf-grow-y var(--dur-slow) var(--ease-out) both;
|
|
5579
|
+
animation: tf-halo-grow-y var(--dur-slow) var(--ease-out) both;
|
|
5580
|
+
animation-delay: var(--enter-delay, 0ms);
|
|
5375
5581
|
transition: opacity var(--dur-fast);
|
|
5376
5582
|
}
|
|
5377
5583
|
:where([data-kit="halo"]) .tf-chart g.dim .tf-seg-bar {
|
|
@@ -5417,7 +5623,7 @@
|
|
|
5417
5623
|
:where([data-kit="halo"]) .tf-area2 {
|
|
5418
5624
|
opacity: 0;
|
|
5419
5625
|
animation: tf-halo-area2-in var(--dur-slow) var(--ease-out) forwards;
|
|
5420
|
-
animation-delay: 400ms;
|
|
5626
|
+
animation-delay: calc(var(--enter-delay, 0ms) + calc(400ms * var(--motion-time)));
|
|
5421
5627
|
}
|
|
5422
5628
|
@keyframes tf-halo-area2-in {
|
|
5423
5629
|
to {
|
|
@@ -5479,7 +5685,7 @@
|
|
|
5479
5685
|
height: 20px;
|
|
5480
5686
|
border-radius: 4px;
|
|
5481
5687
|
background: var(--surface-sunken);
|
|
5482
|
-
animation: tf-fade var(--dur-base) var(--ease-out) both;
|
|
5688
|
+
animation: tf-halo-fade var(--dur-base) var(--ease-out) both;
|
|
5483
5689
|
transition: box-shadow var(--dur-fast);
|
|
5484
5690
|
}
|
|
5485
5691
|
:where([data-kit="halo"]) .tf-heat-cell.l1 {
|
|
@@ -5654,6 +5860,23 @@
|
|
|
5654
5860
|
display: none;
|
|
5655
5861
|
}
|
|
5656
5862
|
}
|
|
5863
|
+
/* the same for an app that turns motion off: data-motion="off" */
|
|
5864
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-seg-bar,
|
|
5865
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-seg-bar,
|
|
5866
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-area2,
|
|
5867
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-area2,
|
|
5868
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-heat-cell,
|
|
5869
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-heat-cell,
|
|
5870
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-tooltip,
|
|
5871
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-tooltip,
|
|
5872
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-popover,
|
|
5873
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-popover {
|
|
5874
|
+
animation: none !important;
|
|
5875
|
+
opacity: 1;
|
|
5876
|
+
}
|
|
5877
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-toast-timer, :where([data-kit="halo"]) [data-motion="off"] .tf-toast-timer {
|
|
5878
|
+
display: none;
|
|
5879
|
+
}
|
|
5657
5880
|
@media (max-width: 640px) {
|
|
5658
5881
|
:where([data-kit="halo"]) .tf-dp {
|
|
5659
5882
|
flex-direction: column;
|
|
@@ -5815,7 +6038,7 @@
|
|
|
5815
6038
|
gap: 12px;
|
|
5816
6039
|
align-items: flex-start;
|
|
5817
6040
|
min-width: 0;
|
|
5818
|
-
animation: tf-rise var(--dur-base) var(--ease-out) both;
|
|
6041
|
+
animation: tf-halo-rise var(--dur-base) var(--ease-out) both;
|
|
5819
6042
|
}
|
|
5820
6043
|
:where([data-kit="halo"]) .tf-msg.me {
|
|
5821
6044
|
flex-direction: row-reverse;
|
|
@@ -6031,7 +6254,7 @@
|
|
|
6031
6254
|
border-radius: 50%;
|
|
6032
6255
|
background: var(--mint-ink);
|
|
6033
6256
|
box-shadow: 0 0 0 2px var(--surface);
|
|
6034
|
-
animation: tf-pulse 1.8s ease-out infinite;
|
|
6257
|
+
animation: tf-halo-pulse 1.8s ease-out infinite;
|
|
6035
6258
|
}
|
|
6036
6259
|
|
|
6037
6260
|
/* Tool calls, reasoning, approvals */
|
|
@@ -6178,7 +6401,7 @@
|
|
|
6178
6401
|
:where([data-kit="halo"]) .tf-reason.live .tf-reason-head {
|
|
6179
6402
|
background: linear-gradient(90deg, var(--surface-sunken), var(--line), var(--surface-sunken));
|
|
6180
6403
|
background-size: 200% 100%;
|
|
6181
|
-
animation: tf-shimmer 1.6s linear infinite;
|
|
6404
|
+
animation: tf-halo-shimmer 1.6s linear infinite;
|
|
6182
6405
|
}
|
|
6183
6406
|
:where([data-kit="halo"]) .tf-reason-head:focus-visible {
|
|
6184
6407
|
outline: 2px solid var(--focus);
|
|
@@ -6556,7 +6779,7 @@
|
|
|
6556
6779
|
}
|
|
6557
6780
|
:where([data-kit="halo"]) .tf-trace-row.is-running .tf-trace-bar i {
|
|
6558
6781
|
background: var(--sky-ink);
|
|
6559
|
-
animation: tf-pulse 1.4s ease-in-out infinite;
|
|
6782
|
+
animation: tf-halo-pulse 1.4s ease-in-out infinite;
|
|
6560
6783
|
}
|
|
6561
6784
|
:where([data-kit="halo"]) .tf-trace-bar em {
|
|
6562
6785
|
position: absolute;
|
|
@@ -7422,6 +7645,19 @@
|
|
|
7422
7645
|
animation: none !important;
|
|
7423
7646
|
}
|
|
7424
7647
|
}
|
|
7648
|
+
/* the same for an app that turns motion off: data-motion="off" */
|
|
7649
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-msg,
|
|
7650
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-msg,
|
|
7651
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-caret,
|
|
7652
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-caret,
|
|
7653
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-typing i,
|
|
7654
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-typing i,
|
|
7655
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-spin,
|
|
7656
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-spin,
|
|
7657
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-reason.live .tf-reason-head,
|
|
7658
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-reason.live .tf-reason-head {
|
|
7659
|
+
animation: none !important;
|
|
7660
|
+
}
|
|
7425
7661
|
|
|
7426
7662
|
/* 04-status-agents-operations.css */
|
|
7427
7663
|
/* ════════ Kit 4: status shapes, approvals A–D, foundations, agent & operations ════════ */
|
|
@@ -7438,7 +7674,7 @@
|
|
|
7438
7674
|
border-radius: 50%;
|
|
7439
7675
|
}
|
|
7440
7676
|
:where([data-kit="halo"]) .tf-shape-pulse {
|
|
7441
|
-
animation: tf-pulse 1.8s ease-out infinite;
|
|
7677
|
+
animation: tf-halo-pulse 1.8s ease-out infinite;
|
|
7442
7678
|
}
|
|
7443
7679
|
:where([data-kit="halo"]) .tf-shape-diamond {
|
|
7444
7680
|
width: 7px;
|
|
@@ -7819,7 +8055,7 @@
|
|
|
7819
8055
|
border-radius: 50%;
|
|
7820
8056
|
border: 2px solid var(--line-strong);
|
|
7821
8057
|
border-top-color: var(--ink);
|
|
7822
|
-
animation: tf-spin 0.8s linear infinite;
|
|
8058
|
+
animation: tf-halo-spin 0.8s linear infinite;
|
|
7823
8059
|
flex: none;
|
|
7824
8060
|
}
|
|
7825
8061
|
:where([data-kit="halo"]) .tf-spinner.lg {
|
|
@@ -8995,7 +9231,7 @@
|
|
|
8995
9231
|
}
|
|
8996
9232
|
:where([data-kit="halo"]) .tf-stage.st-running::after {
|
|
8997
9233
|
background: var(--info);
|
|
8998
|
-
animation: tf-pulse 1.4s ease-in-out infinite;
|
|
9234
|
+
animation: tf-halo-pulse 1.4s ease-in-out infinite;
|
|
8999
9235
|
}
|
|
9000
9236
|
:where([data-kit="halo"]) .tf-stage.st-danger::after {
|
|
9001
9237
|
background: var(--danger);
|
|
@@ -9592,6 +9828,17 @@
|
|
|
9592
9828
|
animation: none !important;
|
|
9593
9829
|
}
|
|
9594
9830
|
}
|
|
9831
|
+
/* the same for an app that turns motion off: data-motion="off" */
|
|
9832
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-shape-pulse,
|
|
9833
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-shape-pulse,
|
|
9834
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-voice-wave i,
|
|
9835
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-voice-wave i,
|
|
9836
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-stage.st-running::after,
|
|
9837
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-stage.st-running::after,
|
|
9838
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-log-line.fresh,
|
|
9839
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-log-line.fresh {
|
|
9840
|
+
animation: none !important;
|
|
9841
|
+
}
|
|
9595
9842
|
:where([data-kit="halo"]) .tf-approval-mail {
|
|
9596
9843
|
padding: 12px 16px;
|
|
9597
9844
|
border-radius: var(--radius-md);
|
|
@@ -9946,7 +10193,7 @@
|
|
|
9946
10193
|
@keyframes tf-halo-fresh {
|
|
9947
10194
|
0% {
|
|
9948
10195
|
background: var(--surface-sunken);
|
|
9949
|
-
transform: translateY(-4px);
|
|
10196
|
+
transform: translateY(calc(-4px * var(--motion-travel)));
|
|
9950
10197
|
opacity: 0;
|
|
9951
10198
|
}
|
|
9952
10199
|
15% {
|
|
@@ -11675,7 +11922,7 @@
|
|
|
11675
11922
|
background: var(--surface);
|
|
11676
11923
|
box-shadow: var(--shadow-float);
|
|
11677
11924
|
overflow: hidden;
|
|
11678
|
-
animation: tf-pop var(--dur-base) var(--ease-spring) both;
|
|
11925
|
+
animation: tf-halo-pop var(--dur-base) var(--ease-spring) both;
|
|
11679
11926
|
transform-origin: bottom right;
|
|
11680
11927
|
}
|
|
11681
11928
|
:where([data-kit="halo"]) .tf-launch-head {
|
|
@@ -11850,6 +12097,17 @@
|
|
|
11850
12097
|
animation: none;
|
|
11851
12098
|
}
|
|
11852
12099
|
}
|
|
12100
|
+
/* the same for an app that turns motion off: data-motion="off" */
|
|
12101
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-live-dot,
|
|
12102
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-live-dot,
|
|
12103
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-map-bubble.pulse::after,
|
|
12104
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-map-bubble.pulse::after,
|
|
12105
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-map-pin.pulse::after,
|
|
12106
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-map-pin.pulse::after,
|
|
12107
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-livefeed-row.fresh,
|
|
12108
|
+
:where([data-kit="halo"]) [data-motion="off"] .tf-livefeed-row.fresh {
|
|
12109
|
+
animation: none;
|
|
12110
|
+
}
|
|
11853
12111
|
:where([data-kit="halo"]) .tf-map-world {
|
|
11854
12112
|
position: absolute;
|
|
11855
12113
|
inset: 0;
|
|
@@ -11966,7 +12224,7 @@
|
|
|
11966
12224
|
padding: 0 20px 20px;
|
|
11967
12225
|
font: 500 14px/22px var(--font-sans);
|
|
11968
12226
|
color: var(--ink-muted);
|
|
11969
|
-
animation: tf-fade var(--dur-base) var(--ease-out) both;
|
|
12227
|
+
animation: tf-halo-fade var(--dur-base) var(--ease-out) both;
|
|
11970
12228
|
}
|
|
11971
12229
|
:where([data-kit="halo"]) .tf-accordion.flush {
|
|
11972
12230
|
gap: 0;
|
|
@@ -12099,6 +12357,8 @@
|
|
|
12099
12357
|
}
|
|
12100
12358
|
:where([data-kit="halo"]) .tf-togglegroup {
|
|
12101
12359
|
display: inline-flex;
|
|
12360
|
+
flex-wrap: wrap;
|
|
12361
|
+
width: fit-content;
|
|
12102
12362
|
align-items: center;
|
|
12103
12363
|
gap: 4px;
|
|
12104
12364
|
padding: 4px;
|
|
@@ -12221,7 +12481,7 @@
|
|
|
12221
12481
|
box-shadow:
|
|
12222
12482
|
var(--shadow-float),
|
|
12223
12483
|
0 0 0 1px var(--line);
|
|
12224
|
-
animation: tf-fade var(--dur-base) var(--ease-out) both;
|
|
12484
|
+
animation: tf-halo-fade var(--dur-base) var(--ease-out) both;
|
|
12225
12485
|
}
|
|
12226
12486
|
:where([data-kit="halo"]) .tf-hovercard.tf-hc-top {
|
|
12227
12487
|
top: auto;
|
|
@@ -12546,7 +12806,7 @@
|
|
|
12546
12806
|
box-shadow:
|
|
12547
12807
|
var(--shadow-float),
|
|
12548
12808
|
0 0 0 1px var(--line);
|
|
12549
|
-
animation: tf-drop var(--dur-base) var(--ease-out) both;
|
|
12809
|
+
animation: tf-halo-drop var(--dur-base) var(--ease-out) both;
|
|
12550
12810
|
}
|
|
12551
12811
|
:where([data-kit="halo"]) .tf-navmenu-panel.with-feature {
|
|
12552
12812
|
grid-template-columns: 200px minmax(0, 1fr);
|
|
@@ -12761,19 +13021,19 @@
|
|
|
12761
13021
|
@keyframes tf-halo-sheet-left {
|
|
12762
13022
|
from {
|
|
12763
13023
|
opacity: 0;
|
|
12764
|
-
transform: translateX(-24px);
|
|
13024
|
+
transform: translateX(calc(-24px * var(--motion-travel)));
|
|
12765
13025
|
}
|
|
12766
13026
|
}
|
|
12767
13027
|
@keyframes tf-halo-sheet-top {
|
|
12768
13028
|
from {
|
|
12769
13029
|
opacity: 0;
|
|
12770
|
-
transform: translateY(-24px);
|
|
13030
|
+
transform: translateY(calc(-24px * var(--motion-travel)));
|
|
12771
13031
|
}
|
|
12772
13032
|
}
|
|
12773
13033
|
@keyframes tf-halo-sheet-bottom {
|
|
12774
13034
|
from {
|
|
12775
13035
|
opacity: 0;
|
|
12776
|
-
transform: translateY(24px);
|
|
13036
|
+
transform: translateY(calc(24px * var(--motion-travel)));
|
|
12777
13037
|
}
|
|
12778
13038
|
}
|
|
12779
13039
|
|
|
@@ -13500,3 +13760,609 @@
|
|
|
13500
13760
|
:where([data-kit="halo"]) .tf-tabs {
|
|
13501
13761
|
box-sizing: border-box;
|
|
13502
13762
|
}
|
|
13763
|
+
|
|
13764
|
+
/* 08-glass.css */
|
|
13765
|
+
/* Glass: translucent surfaces for UI that floats over content (maps, 3D scenes, video, photos).
|
|
13766
|
+
*
|
|
13767
|
+
* A glass surface shows a blurred, colour-lifted view of what is behind it, with a light edge on
|
|
13768
|
+
* top. What sits on it reads the glass tokens too (inputs, chips, tab tracks, hover highlights,
|
|
13769
|
+
* nested cards), so the surface stays one piece of glass instead of opaque blocks on glass.
|
|
13770
|
+
*
|
|
13771
|
+
* - `.tf-glass` (the `surface="glass"` prop) makes one surface glass.
|
|
13772
|
+
* - `[data-surface="glass"]` (`<UIProvider surface="glass">`) makes every top-level surface and
|
|
13773
|
+
* every floating layer inside it glass. Surfaces nested in a surface stay clear instead of
|
|
13774
|
+
* stacking glass on glass; `.tf-solid` (`surface="solid"`) opts one surface out.
|
|
13775
|
+
*
|
|
13776
|
+
* Floating layers (menus, popovers, dialogs, drawers) use the stronger `--glass-strong` fill: they
|
|
13777
|
+
* carry more text. The fills are opaque enough for 4.5:1 body text over any backdrop; reduced
|
|
13778
|
+
* transparency, high contrast and forced colours fall back to solid surfaces.
|
|
13779
|
+
*/
|
|
13780
|
+
|
|
13781
|
+
/* the surface itself */
|
|
13782
|
+
:where([data-kit="halo"]) .tf-glass:not(.tf-solid),
|
|
13783
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
13784
|
+
:is(
|
|
13785
|
+
.tf-panel,
|
|
13786
|
+
.tf-card,
|
|
13787
|
+
.tf-stat,
|
|
13788
|
+
.tf-dock,
|
|
13789
|
+
.tf-sidebar,
|
|
13790
|
+
.tf-map-legend,
|
|
13791
|
+
.tf-map-ctl,
|
|
13792
|
+
.tf-map-pop
|
|
13793
|
+
):not(
|
|
13794
|
+
:is(
|
|
13795
|
+
.tf-panel,
|
|
13796
|
+
.tf-card,
|
|
13797
|
+
.tf-stat,
|
|
13798
|
+
.tf-dock,
|
|
13799
|
+
.tf-sidebar,
|
|
13800
|
+
.tf-popover,
|
|
13801
|
+
.tf-menu,
|
|
13802
|
+
.tf-hovercard,
|
|
13803
|
+
.tf-selectmenu-list,
|
|
13804
|
+
.tf-navmenu-panel,
|
|
13805
|
+
.tf-palette,
|
|
13806
|
+
.tf-modal,
|
|
13807
|
+
.tf-drawer,
|
|
13808
|
+
.tf-glass
|
|
13809
|
+
)
|
|
13810
|
+
*
|
|
13811
|
+
):not(.tf-solid),
|
|
13812
|
+
:where([data-kit="halo"]) [data-surface="glass"]
|
|
13813
|
+
:is(
|
|
13814
|
+
.tf-panel,
|
|
13815
|
+
.tf-card,
|
|
13816
|
+
.tf-stat,
|
|
13817
|
+
.tf-dock,
|
|
13818
|
+
.tf-sidebar,
|
|
13819
|
+
.tf-map-legend,
|
|
13820
|
+
.tf-map-ctl,
|
|
13821
|
+
.tf-map-pop
|
|
13822
|
+
):not(
|
|
13823
|
+
:is(
|
|
13824
|
+
.tf-panel,
|
|
13825
|
+
.tf-card,
|
|
13826
|
+
.tf-stat,
|
|
13827
|
+
.tf-dock,
|
|
13828
|
+
.tf-sidebar,
|
|
13829
|
+
.tf-popover,
|
|
13830
|
+
.tf-menu,
|
|
13831
|
+
.tf-hovercard,
|
|
13832
|
+
.tf-selectmenu-list,
|
|
13833
|
+
.tf-navmenu-panel,
|
|
13834
|
+
.tf-palette,
|
|
13835
|
+
.tf-modal,
|
|
13836
|
+
.tf-drawer,
|
|
13837
|
+
.tf-glass
|
|
13838
|
+
)
|
|
13839
|
+
*
|
|
13840
|
+
):not(.tf-solid),
|
|
13841
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
13842
|
+
:is(
|
|
13843
|
+
.tf-popover,
|
|
13844
|
+
.tf-menu:not(.tf-menu-static),
|
|
13845
|
+
.tf-hovercard,
|
|
13846
|
+
.tf-selectmenu-list,
|
|
13847
|
+
.tf-navmenu-panel,
|
|
13848
|
+
.tf-palette,
|
|
13849
|
+
.tf-modal,
|
|
13850
|
+
.tf-drawer
|
|
13851
|
+
):not(.tf-solid),
|
|
13852
|
+
:where([data-kit="halo"]) [data-surface="glass"]
|
|
13853
|
+
:is(
|
|
13854
|
+
.tf-popover,
|
|
13855
|
+
.tf-menu:not(.tf-menu-static),
|
|
13856
|
+
.tf-hovercard,
|
|
13857
|
+
.tf-selectmenu-list,
|
|
13858
|
+
.tf-navmenu-panel,
|
|
13859
|
+
.tf-palette,
|
|
13860
|
+
.tf-modal,
|
|
13861
|
+
.tf-drawer
|
|
13862
|
+
):not(.tf-solid) {
|
|
13863
|
+
--glass-fill: var(--glass);
|
|
13864
|
+
background:
|
|
13865
|
+
linear-gradient(to bottom, var(--glass-sheen), transparent 56px) border-box,
|
|
13866
|
+
linear-gradient(var(--glass-tinted), var(--glass-tinted)) border-box,
|
|
13867
|
+
var(--glass-fill);
|
|
13868
|
+
--glass-tinted: color-mix(in srgb, var(--tint, transparent) var(--glass-tint), transparent);
|
|
13869
|
+
-webkit-backdrop-filter: var(--glass-filter);
|
|
13870
|
+
backdrop-filter: var(--glass-filter);
|
|
13871
|
+
border-color: var(--glass-border);
|
|
13872
|
+
box-shadow:
|
|
13873
|
+
inset 0 1px 0 0 var(--glass-highlight),
|
|
13874
|
+
inset 0 0 0 1px var(--glass-border),
|
|
13875
|
+
var(--shadow-glass);
|
|
13876
|
+
color: var(--foreground);
|
|
13877
|
+
/* what sits on the glass */
|
|
13878
|
+
--surface: var(--glass-control);
|
|
13879
|
+
--secondary: var(--glass-control);
|
|
13880
|
+
--bg-100: var(--glass-control);
|
|
13881
|
+
--surface-sunken: var(--glass-well);
|
|
13882
|
+
--muted: var(--glass-well);
|
|
13883
|
+
--canvas: var(--glass-well);
|
|
13884
|
+
--bg-200: var(--glass-well);
|
|
13885
|
+
--accent: var(--glass-hover);
|
|
13886
|
+
--bg-300: var(--glass-hover);
|
|
13887
|
+
/* the faintest text steps up one shade: glass gives up some contrast to what is behind */
|
|
13888
|
+
--ink-subtle: var(--muted-foreground);
|
|
13889
|
+
--fg-300: var(--muted-foreground);
|
|
13890
|
+
}
|
|
13891
|
+
|
|
13892
|
+
/* floating layers carry more text: a stronger fill */
|
|
13893
|
+
:where([data-kit="halo"]) :is(
|
|
13894
|
+
.tf-popover,
|
|
13895
|
+
.tf-menu,
|
|
13896
|
+
.tf-hovercard,
|
|
13897
|
+
.tf-selectmenu-list,
|
|
13898
|
+
.tf-navmenu-panel,
|
|
13899
|
+
.tf-palette,
|
|
13900
|
+
.tf-modal,
|
|
13901
|
+
.tf-drawer
|
|
13902
|
+
).tf-glass,
|
|
13903
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
13904
|
+
:is(
|
|
13905
|
+
.tf-popover,
|
|
13906
|
+
.tf-menu:not(.tf-menu-static),
|
|
13907
|
+
.tf-hovercard,
|
|
13908
|
+
.tf-selectmenu-list,
|
|
13909
|
+
.tf-navmenu-panel,
|
|
13910
|
+
.tf-palette,
|
|
13911
|
+
.tf-modal,
|
|
13912
|
+
.tf-drawer
|
|
13913
|
+
):not(.tf-solid),
|
|
13914
|
+
:where([data-kit="halo"]) [data-surface="glass"]
|
|
13915
|
+
:is(
|
|
13916
|
+
.tf-popover,
|
|
13917
|
+
.tf-menu:not(.tf-menu-static),
|
|
13918
|
+
.tf-hovercard,
|
|
13919
|
+
.tf-selectmenu-list,
|
|
13920
|
+
.tf-navmenu-panel,
|
|
13921
|
+
.tf-palette,
|
|
13922
|
+
.tf-modal,
|
|
13923
|
+
.tf-drawer
|
|
13924
|
+
):not(.tf-solid) {
|
|
13925
|
+
--glass-fill: var(--glass-strong);
|
|
13926
|
+
}
|
|
13927
|
+
|
|
13928
|
+
/* Controls floating on their own (not on a surface) become small glass pills: a search field or
|
|
13929
|
+
zoom buttons over a map */
|
|
13930
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
13931
|
+
:is(
|
|
13932
|
+
.tf-search,
|
|
13933
|
+
.tf-seg,
|
|
13934
|
+
.tf-btngroup,
|
|
13935
|
+
.tf-iconbtn-soft,
|
|
13936
|
+
.tf-iconbtn-outline,
|
|
13937
|
+
.tf-btn-secondary,
|
|
13938
|
+
.tf-chip:not([aria-pressed="true"])
|
|
13939
|
+
):not(
|
|
13940
|
+
:is(
|
|
13941
|
+
.tf-panel,
|
|
13942
|
+
.tf-card,
|
|
13943
|
+
.tf-dock,
|
|
13944
|
+
.tf-popover,
|
|
13945
|
+
.tf-menu,
|
|
13946
|
+
.tf-hovercard,
|
|
13947
|
+
.tf-selectmenu-list,
|
|
13948
|
+
.tf-navmenu-panel,
|
|
13949
|
+
.tf-palette,
|
|
13950
|
+
.tf-modal,
|
|
13951
|
+
.tf-drawer,
|
|
13952
|
+
.tf-glass,
|
|
13953
|
+
.tf-btngroup,
|
|
13954
|
+
.tf-map-ctl,
|
|
13955
|
+
.tf-topbar
|
|
13956
|
+
)
|
|
13957
|
+
*
|
|
13958
|
+
):not(.tf-solid),
|
|
13959
|
+
:where([data-kit="halo"]) [data-surface="glass"]
|
|
13960
|
+
:is(
|
|
13961
|
+
.tf-search,
|
|
13962
|
+
.tf-seg,
|
|
13963
|
+
.tf-btngroup,
|
|
13964
|
+
.tf-iconbtn-soft,
|
|
13965
|
+
.tf-iconbtn-outline,
|
|
13966
|
+
.tf-btn-secondary,
|
|
13967
|
+
.tf-chip:not([aria-pressed="true"])
|
|
13968
|
+
):not(
|
|
13969
|
+
:is(
|
|
13970
|
+
.tf-panel,
|
|
13971
|
+
.tf-card,
|
|
13972
|
+
.tf-dock,
|
|
13973
|
+
.tf-popover,
|
|
13974
|
+
.tf-menu,
|
|
13975
|
+
.tf-hovercard,
|
|
13976
|
+
.tf-selectmenu-list,
|
|
13977
|
+
.tf-navmenu-panel,
|
|
13978
|
+
.tf-palette,
|
|
13979
|
+
.tf-modal,
|
|
13980
|
+
.tf-drawer,
|
|
13981
|
+
.tf-glass,
|
|
13982
|
+
.tf-btngroup,
|
|
13983
|
+
.tf-map-ctl,
|
|
13984
|
+
.tf-topbar
|
|
13985
|
+
)
|
|
13986
|
+
*
|
|
13987
|
+
):not(.tf-solid) {
|
|
13988
|
+
background:
|
|
13989
|
+
linear-gradient(to bottom, var(--glass-sheen), transparent) border-box,
|
|
13990
|
+
var(--glass);
|
|
13991
|
+
-webkit-backdrop-filter: var(--glass-filter);
|
|
13992
|
+
backdrop-filter: var(--glass-filter);
|
|
13993
|
+
box-shadow:
|
|
13994
|
+
inset 0 1px 0 0 var(--glass-highlight),
|
|
13995
|
+
inset 0 0 0 1px var(--glass-border),
|
|
13996
|
+
var(--shadow-glass);
|
|
13997
|
+
color: var(--foreground);
|
|
13998
|
+
--surface: var(--glass-control);
|
|
13999
|
+
--secondary: var(--glass-control);
|
|
14000
|
+
--surface-sunken: var(--glass-well);
|
|
14001
|
+
--bg-200: var(--glass-well);
|
|
14002
|
+
--accent: var(--glass-hover);
|
|
14003
|
+
--bg-300: var(--glass-hover);
|
|
14004
|
+
}
|
|
14005
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
14006
|
+
:is(.tf-iconbtn-soft, .tf-iconbtn-outline, .tf-btn-secondary, .tf-chip):not(
|
|
14007
|
+
:is(.tf-panel, .tf-card, .tf-dock, .tf-popover, .tf-menu, .tf-modal, .tf-drawer, .tf-glass) *
|
|
14008
|
+
):not(.tf-solid):not([aria-pressed="true"]):hover, :where([data-kit="halo"]) [data-surface="glass"]
|
|
14009
|
+
:is(.tf-iconbtn-soft, .tf-iconbtn-outline, .tf-btn-secondary, .tf-chip):not(
|
|
14010
|
+
:is(.tf-panel, .tf-card, .tf-dock, .tf-popover, .tf-menu, .tf-modal, .tf-drawer, .tf-glass) *
|
|
14011
|
+
):not(.tf-solid):not([aria-pressed="true"]):hover {
|
|
14012
|
+
background:
|
|
14013
|
+
linear-gradient(var(--glass-hover), var(--glass-hover)) border-box,
|
|
14014
|
+
var(--glass);
|
|
14015
|
+
}
|
|
14016
|
+
|
|
14017
|
+
/* AppShell on glass: the same layout as the solid shell, the frame turned to glass. Top bar and
|
|
14018
|
+
rail sit on it without a fill of their own, the sheet clears so the backdrop shows through,
|
|
14019
|
+
and everything drawn on the frame (nav, user, rail) reads the glass colours */
|
|
14020
|
+
:where([data-kit="halo"])[data-surface="glass"] .tf-shell, :where([data-kit="halo"]) [data-surface="glass"] .tf-shell {
|
|
14021
|
+
background:
|
|
14022
|
+
linear-gradient(to bottom, var(--glass-sheen), transparent 56px) border-box,
|
|
14023
|
+
var(--glass);
|
|
14024
|
+
-webkit-backdrop-filter: var(--glass-filter);
|
|
14025
|
+
backdrop-filter: var(--glass-filter);
|
|
14026
|
+
box-shadow:
|
|
14027
|
+
inset 0 1px 0 0 var(--glass-highlight),
|
|
14028
|
+
inset 0 0 0 1px var(--glass-border),
|
|
14029
|
+
var(--shadow-glass);
|
|
14030
|
+
--frame: var(--glass);
|
|
14031
|
+
--frame-hover: var(--glass-hover);
|
|
14032
|
+
--frame-active: var(--glass-hover);
|
|
14033
|
+
--frame-strong: var(--glass-control);
|
|
14034
|
+
--on-frame: var(--foreground);
|
|
14035
|
+
--on-frame-muted: var(--muted-foreground);
|
|
14036
|
+
}
|
|
14037
|
+
:where([data-kit="halo"])[data-surface="glass"] .tf-shell .tf-sheet, :where([data-kit="halo"]) [data-surface="glass"] .tf-shell .tf-sheet {
|
|
14038
|
+
background: transparent;
|
|
14039
|
+
}
|
|
14040
|
+
:where([data-kit="halo"])[data-surface="glass"] .tf-shell .tf-topbar, :where([data-kit="halo"]) [data-surface="glass"] .tf-shell .tf-topbar {
|
|
14041
|
+
background: transparent;
|
|
14042
|
+
}
|
|
14043
|
+
|
|
14044
|
+
/* switch knobs stay solid on glass */
|
|
14045
|
+
:where([data-kit="halo"]) .tf-glass .tf-switch::after,
|
|
14046
|
+
:where([data-kit="halo"])[data-surface="glass"] .tf-switch::after,
|
|
14047
|
+
:where([data-kit="halo"]) [data-surface="glass"] .tf-switch::after {
|
|
14048
|
+
background: var(--card);
|
|
14049
|
+
}
|
|
14050
|
+
|
|
14051
|
+
/* Reduced transparency, more contrast, forced colours and browsers without backdrop blur switch
|
|
14052
|
+
the glass tokens themselves (see tokens.css). Forced colours drop shadows, so glass keeps an
|
|
14053
|
+
edge there. */
|
|
14054
|
+
@media (forced-colors: active) {
|
|
14055
|
+
:where([data-kit="halo"]) .tf-glass,
|
|
14056
|
+
:where([data-kit="halo"])[data-surface="glass"]
|
|
14057
|
+
:is(
|
|
14058
|
+
.tf-panel,
|
|
14059
|
+
.tf-card,
|
|
14060
|
+
.tf-stat,
|
|
14061
|
+
.tf-dock,
|
|
14062
|
+
.tf-sidebar,
|
|
14063
|
+
.tf-map-legend,
|
|
14064
|
+
.tf-map-ctl,
|
|
14065
|
+
.tf-map-pop
|
|
14066
|
+
),
|
|
14067
|
+
:where([data-kit="halo"]) [data-surface="glass"]
|
|
14068
|
+
:is(
|
|
14069
|
+
.tf-panel,
|
|
14070
|
+
.tf-card,
|
|
14071
|
+
.tf-stat,
|
|
14072
|
+
.tf-dock,
|
|
14073
|
+
.tf-sidebar,
|
|
14074
|
+
.tf-map-legend,
|
|
14075
|
+
.tf-map-ctl,
|
|
14076
|
+
.tf-map-pop
|
|
14077
|
+
) {
|
|
14078
|
+
outline: 1px solid CanvasText;
|
|
14079
|
+
outline-offset: -1px;
|
|
14080
|
+
}
|
|
14081
|
+
}
|
|
14082
|
+
|
|
14083
|
+
/* FloatingLayout: UI along the edges of a full-bleed background */
|
|
14084
|
+
:where([data-kit="halo"]) .tf-floating {
|
|
14085
|
+
position: relative;
|
|
14086
|
+
overflow: hidden;
|
|
14087
|
+
isolation: isolate;
|
|
14088
|
+
border-radius: var(--radius-lg);
|
|
14089
|
+
background: var(--surface-sunken);
|
|
14090
|
+
container: tf-floating / inline-size;
|
|
14091
|
+
}
|
|
14092
|
+
:where([data-kit="halo"]) .tf-floating-bg {
|
|
14093
|
+
position: absolute;
|
|
14094
|
+
inset: 0;
|
|
14095
|
+
}
|
|
14096
|
+
:where([data-kit="halo"]) .tf-floating-bg > * {
|
|
14097
|
+
width: 100%;
|
|
14098
|
+
height: 100%;
|
|
14099
|
+
}
|
|
14100
|
+
:where([data-kit="halo"]) .tf-floating-ui {
|
|
14101
|
+
position: absolute;
|
|
14102
|
+
inset: 0;
|
|
14103
|
+
z-index: 1;
|
|
14104
|
+
display: grid;
|
|
14105
|
+
grid-template-columns: minmax(0, 320px) minmax(0, 1fr) minmax(0, 340px);
|
|
14106
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
14107
|
+
grid-template-areas:
|
|
14108
|
+
"top top top"
|
|
14109
|
+
"start . end"
|
|
14110
|
+
"bottom bottom bottom";
|
|
14111
|
+
gap: var(--space-4);
|
|
14112
|
+
padding: var(--space-4);
|
|
14113
|
+
overflow-y: auto;
|
|
14114
|
+
/* the background stays usable between the slots */
|
|
14115
|
+
pointer-events: none;
|
|
14116
|
+
}
|
|
14117
|
+
:where([data-kit="halo"]) .tf-floating-ui > * {
|
|
14118
|
+
pointer-events: auto;
|
|
14119
|
+
min-width: 0;
|
|
14120
|
+
}
|
|
14121
|
+
:where([data-kit="halo"]) .tf-floating-top {
|
|
14122
|
+
grid-area: top;
|
|
14123
|
+
display: flex;
|
|
14124
|
+
flex-wrap: wrap;
|
|
14125
|
+
align-items: center;
|
|
14126
|
+
gap: var(--space-2);
|
|
14127
|
+
}
|
|
14128
|
+
:where([data-kit="halo"]) .tf-floating-start {
|
|
14129
|
+
grid-area: start;
|
|
14130
|
+
align-self: start;
|
|
14131
|
+
}
|
|
14132
|
+
:where([data-kit="halo"]) .tf-floating-end {
|
|
14133
|
+
grid-area: end;
|
|
14134
|
+
align-self: start;
|
|
14135
|
+
}
|
|
14136
|
+
:where([data-kit="halo"]) .tf-floating-bottom {
|
|
14137
|
+
grid-area: bottom;
|
|
14138
|
+
justify-self: center;
|
|
14139
|
+
}
|
|
14140
|
+
:where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) {
|
|
14141
|
+
pointer-events: none;
|
|
14142
|
+
}
|
|
14143
|
+
:where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) > * {
|
|
14144
|
+
pointer-events: auto;
|
|
14145
|
+
}
|
|
14146
|
+
@container tf-floating (max-width: 720px) {
|
|
14147
|
+
/* on a phone the layout grows with its slots and the background fills behind them */
|
|
14148
|
+
:where([data-kit="halo"]) .tf-floating-ui {
|
|
14149
|
+
position: relative;
|
|
14150
|
+
min-height: inherit;
|
|
14151
|
+
overflow: visible;
|
|
14152
|
+
grid-template-columns: minmax(0, 1fr);
|
|
14153
|
+
grid-template-rows: auto auto minmax(120px, 1fr) auto auto;
|
|
14154
|
+
grid-template-areas:
|
|
14155
|
+
"top"
|
|
14156
|
+
"start"
|
|
14157
|
+
"."
|
|
14158
|
+
"end"
|
|
14159
|
+
"bottom";
|
|
14160
|
+
gap: var(--space-3);
|
|
14161
|
+
padding: var(--space-3);
|
|
14162
|
+
}
|
|
14163
|
+
}
|
|
14164
|
+
|
|
14165
|
+
/* 09-motion.css */
|
|
14166
|
+
/* Motion: leaving layers, reveal on scroll, page transitions, the expressive level.
|
|
14167
|
+
*
|
|
14168
|
+
* Levels come from `data-motion` (tokens.css): "standard", "expressive" (longer, staggered page
|
|
14169
|
+
* entrances, more travel) and "off". The reader's reduced-motion setting always means off. Only
|
|
14170
|
+
* transform, opacity and (expressive Halo) a short blur move; everything else stays put.
|
|
14171
|
+
*/
|
|
14172
|
+
|
|
14173
|
+
/* ── Leaving: layers animate out for --dur-exit, then unmount (usePresence) ── */
|
|
14174
|
+
@keyframes tf-halo-out {
|
|
14175
|
+
to {
|
|
14176
|
+
opacity: 0;
|
|
14177
|
+
translate: 0 calc(6px * var(--motion-travel));
|
|
14178
|
+
scale: 0.98;
|
|
14179
|
+
}
|
|
14180
|
+
}
|
|
14181
|
+
@keyframes tf-halo-out-fade {
|
|
14182
|
+
to {
|
|
14183
|
+
opacity: 0;
|
|
14184
|
+
}
|
|
14185
|
+
}
|
|
14186
|
+
@keyframes tf-halo-out-right {
|
|
14187
|
+
to {
|
|
14188
|
+
opacity: 0;
|
|
14189
|
+
translate: calc(40px * var(--motion-travel)) 0;
|
|
14190
|
+
}
|
|
14191
|
+
}
|
|
14192
|
+
@keyframes tf-halo-out-left {
|
|
14193
|
+
to {
|
|
14194
|
+
opacity: 0;
|
|
14195
|
+
translate: calc(-40px * var(--motion-travel)) 0;
|
|
14196
|
+
}
|
|
14197
|
+
}
|
|
14198
|
+
@keyframes tf-halo-out-up {
|
|
14199
|
+
to {
|
|
14200
|
+
opacity: 0;
|
|
14201
|
+
translate: 0 calc(-40px * var(--motion-travel));
|
|
14202
|
+
}
|
|
14203
|
+
}
|
|
14204
|
+
@keyframes tf-halo-out-down {
|
|
14205
|
+
to {
|
|
14206
|
+
opacity: 0;
|
|
14207
|
+
translate: 0 calc(16px * var(--motion-travel));
|
|
14208
|
+
}
|
|
14209
|
+
}
|
|
14210
|
+
:where([data-kit="halo"])[data-closing], :where([data-kit="halo"]) [data-closing] {
|
|
14211
|
+
pointer-events: none;
|
|
14212
|
+
}
|
|
14213
|
+
:where([data-kit="halo"]) .tf-popover[data-closing],
|
|
14214
|
+
:where([data-kit="halo"]) .tf-hovercard[data-closing],
|
|
14215
|
+
:where([data-kit="halo"]) .tf-modal-wrap[data-closing] .tf-modal,
|
|
14216
|
+
:where([data-kit="halo"]) .tf-overlay[data-closing] :is(.tf-modal, .tf-confirm),
|
|
14217
|
+
:where([data-kit="halo"]) .tf-palette-wrap[data-closing] .tf-palette {
|
|
14218
|
+
animation: tf-halo-out var(--dur-exit) var(--ease-in-out) forwards;
|
|
14219
|
+
}
|
|
14220
|
+
:where([data-kit="halo"]) .tf-tooltip[data-closing],
|
|
14221
|
+
:where([data-kit="halo"]) .tf-modal-wrap[data-closing] .tf-backdrop,
|
|
14222
|
+
:where([data-kit="halo"]) .tf-overlay[data-closing] .tf-backdrop,
|
|
14223
|
+
:where([data-kit="halo"]) .tf-palette-wrap[data-closing],
|
|
14224
|
+
:where([data-kit="halo"]) .tf-drawer-wrap[data-closing] {
|
|
14225
|
+
animation: tf-halo-out-fade var(--dur-exit) var(--ease-in-out) forwards;
|
|
14226
|
+
}
|
|
14227
|
+
:where([data-kit="halo"]) .tf-drawer-wrap[data-closing] .tf-drawer {
|
|
14228
|
+
animation: tf-halo-out-right var(--dur-exit) var(--ease-in-out) forwards;
|
|
14229
|
+
}
|
|
14230
|
+
:where([data-kit="halo"]) .tf-drawer-wrap[data-closing] .tf-drawer.side-left {
|
|
14231
|
+
animation-name: tf-halo-out-left;
|
|
14232
|
+
}
|
|
14233
|
+
:where([data-kit="halo"]) .tf-drawer-wrap[data-closing] .tf-drawer.side-top {
|
|
14234
|
+
animation-name: tf-halo-out-up;
|
|
14235
|
+
}
|
|
14236
|
+
:where([data-kit="halo"]) .tf-drawer-wrap[data-closing] .tf-drawer.side-bottom,
|
|
14237
|
+
:where([data-kit="halo"]) .tf-toast[data-closing] {
|
|
14238
|
+
animation: tf-halo-out-down var(--dur-exit) var(--ease-in-out) forwards;
|
|
14239
|
+
}
|
|
14240
|
+
|
|
14241
|
+
/* ── Reveal: a Stagger below the fold waits until it scrolls into view ── */
|
|
14242
|
+
:where([data-kit="halo"]) .tf-stagger[data-reveal="waiting"] > *,
|
|
14243
|
+
:where([data-kit="halo"]) .tf-stagger[data-reveal="waiting"] > * * {
|
|
14244
|
+
animation-play-state: paused;
|
|
14245
|
+
}
|
|
14246
|
+
|
|
14247
|
+
/* ── Page transitions (startViewTransition, Next.js and React view transitions) ── */
|
|
14248
|
+
@keyframes tf-halo-vt-out {
|
|
14249
|
+
to {
|
|
14250
|
+
opacity: 0;
|
|
14251
|
+
translate: 0 calc(-6px * var(--motion-travel));
|
|
14252
|
+
}
|
|
14253
|
+
}
|
|
14254
|
+
@keyframes tf-halo-vt-in {
|
|
14255
|
+
from {
|
|
14256
|
+
opacity: 0;
|
|
14257
|
+
translate: 0 calc(10px * var(--motion-travel));
|
|
14258
|
+
}
|
|
14259
|
+
}
|
|
14260
|
+
:where([data-kit="halo"])::view-transition-old(root) {
|
|
14261
|
+
animation: tf-halo-vt-out var(--dur-base) var(--ease-in-out) both;
|
|
14262
|
+
}
|
|
14263
|
+
:where([data-kit="halo"])::view-transition-new(root) {
|
|
14264
|
+
animation: tf-halo-vt-in var(--dur-enter) var(--ease-out) both;
|
|
14265
|
+
}
|
|
14266
|
+
|
|
14267
|
+
/* ── Expressive: things come into focus as they rise (Halo; Pro keeps a blur of 0) ── */
|
|
14268
|
+
@keyframes tf-halo-focus-in {
|
|
14269
|
+
from {
|
|
14270
|
+
filter: blur(var(--motion-blur));
|
|
14271
|
+
}
|
|
14272
|
+
to {
|
|
14273
|
+
filter: none;
|
|
14274
|
+
}
|
|
14275
|
+
}
|
|
14276
|
+
:where([data-kit="halo"])[data-motion="expressive"] :is(.tf-stagger > *, .tf-in), :where([data-kit="halo"]) [data-motion="expressive"] :is(.tf-stagger > *, .tf-in) {
|
|
14277
|
+
animation-name: tf-halo-rise, tf-halo-focus-in;
|
|
14278
|
+
}
|
|
14279
|
+
:where([data-kit="halo"])[data-motion="expressive"] .tf-topbar, :where([data-kit="halo"]) [data-motion="expressive"] .tf-topbar {
|
|
14280
|
+
animation-name: tf-halo-drop, tf-halo-focus-in;
|
|
14281
|
+
}
|
|
14282
|
+
|
|
14283
|
+
/* 10-ambient.css */
|
|
14284
|
+
/* Ambient: a calm, living background for glass UI. Soft colour fields from the kit (pastels in
|
|
14285
|
+
* Halo, a faint aurora in Pro) drift slowly; a photo or video can take their place under a scrim.
|
|
14286
|
+
* The drift only moves (transform), stops with motion off and pauses off screen.
|
|
14287
|
+
*/
|
|
14288
|
+
:where([data-kit="halo"]) :where(:has(> .tf-ambient:not(.fixed))) {
|
|
14289
|
+
position: relative;
|
|
14290
|
+
isolation: isolate;
|
|
14291
|
+
}
|
|
14292
|
+
:where([data-kit="halo"]) .tf-ambient {
|
|
14293
|
+
position: absolute;
|
|
14294
|
+
inset: 0;
|
|
14295
|
+
z-index: -1;
|
|
14296
|
+
overflow: hidden;
|
|
14297
|
+
background: var(--ambient-base);
|
|
14298
|
+
pointer-events: none;
|
|
14299
|
+
}
|
|
14300
|
+
:where([data-kit="halo"]) .tf-ambient.fixed {
|
|
14301
|
+
position: fixed;
|
|
14302
|
+
}
|
|
14303
|
+
:where([data-kit="halo"]) .tf-ambient-field {
|
|
14304
|
+
position: absolute;
|
|
14305
|
+
width: 75%;
|
|
14306
|
+
aspect-ratio: 1;
|
|
14307
|
+
border-radius: 50%;
|
|
14308
|
+
background: radial-gradient(closest-side, var(--field), transparent);
|
|
14309
|
+
animation: tf-halo-ambient-drift 34s var(--ease-in-out) infinite alternate;
|
|
14310
|
+
}
|
|
14311
|
+
:where([data-kit="halo"]) .tf-ambient-field:nth-child(1) {
|
|
14312
|
+
top: -30%;
|
|
14313
|
+
left: -15%;
|
|
14314
|
+
}
|
|
14315
|
+
:where([data-kit="halo"]) .tf-ambient-field:nth-child(2) {
|
|
14316
|
+
top: -10%;
|
|
14317
|
+
right: -25%;
|
|
14318
|
+
animation-duration: 41s;
|
|
14319
|
+
animation-direction: alternate-reverse;
|
|
14320
|
+
}
|
|
14321
|
+
:where([data-kit="halo"]) .tf-ambient-field:nth-child(3) {
|
|
14322
|
+
bottom: -35%;
|
|
14323
|
+
left: 10%;
|
|
14324
|
+
animation-duration: 47s;
|
|
14325
|
+
}
|
|
14326
|
+
:where([data-kit="halo"]) .tf-ambient-field:nth-child(4) {
|
|
14327
|
+
bottom: -25%;
|
|
14328
|
+
right: -10%;
|
|
14329
|
+
animation-duration: 38s;
|
|
14330
|
+
animation-direction: alternate-reverse;
|
|
14331
|
+
}
|
|
14332
|
+
:where([data-kit="halo"]) .tf-ambient-field:nth-child(n + 5) {
|
|
14333
|
+
top: 20%;
|
|
14334
|
+
left: 30%;
|
|
14335
|
+
width: 55%;
|
|
14336
|
+
animation-duration: 52s;
|
|
14337
|
+
}
|
|
14338
|
+
@keyframes tf-halo-ambient-drift {
|
|
14339
|
+
to {
|
|
14340
|
+
translate: 12% 9%;
|
|
14341
|
+
scale: 1.15;
|
|
14342
|
+
}
|
|
14343
|
+
}
|
|
14344
|
+
:where([data-kit="halo"]) .tf-ambient.still .tf-ambient-field,
|
|
14345
|
+
:where([data-kit="halo"]) .tf-ambient[data-paused] .tf-ambient-field {
|
|
14346
|
+
animation-play-state: paused;
|
|
14347
|
+
}
|
|
14348
|
+
:where([data-kit="halo"]) .tf-ambient-media {
|
|
14349
|
+
position: absolute;
|
|
14350
|
+
inset: 0;
|
|
14351
|
+
width: 100%;
|
|
14352
|
+
height: 100%;
|
|
14353
|
+
object-fit: cover;
|
|
14354
|
+
}
|
|
14355
|
+
:where([data-kit="halo"]) .tf-ambient.media::after {
|
|
14356
|
+
content: "";
|
|
14357
|
+
position: absolute;
|
|
14358
|
+
inset: 0;
|
|
14359
|
+
background: var(--ambient-scrim);
|
|
14360
|
+
}
|
|
14361
|
+
@media (prefers-reduced-motion: reduce) {
|
|
14362
|
+
:where([data-kit="halo"]) .tf-ambient-field {
|
|
14363
|
+
animation: none;
|
|
14364
|
+
}
|
|
14365
|
+
}
|
|
14366
|
+
:where([data-kit="halo"])[data-motion="off"] .tf-ambient-field, :where([data-kit="halo"]) [data-motion="off"] .tf-ambient-field {
|
|
14367
|
+
animation: none;
|
|
14368
|
+
}
|