@twentyfirstmedia/pro 0.5.0 → 0.7.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/dist/styles.css CHANGED
@@ -303,6 +303,11 @@
303
303
  --chart-lilac: var(--fg-300);
304
304
  --chart-butter: var(--fg-200);
305
305
  --chart-blush: var(--line-300);
306
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
307
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
308
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
309
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
310
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
306
311
  --ok: #5cc28f;
307
312
  --ok-bg: rgba(92,194,143,0.12);
308
313
  --info: #7aa7f5;
@@ -451,6 +456,11 @@
451
456
  --chart-lilac: var(--fg-300);
452
457
  --chart-butter: var(--fg-200);
453
458
  --chart-blush: var(--line-300);
459
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
460
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
461
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
462
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
463
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
454
464
  --ok: #5cc28f;
455
465
  --ok-bg: rgba(92,194,143,0.12);
456
466
  --info: #7aa7f5;
@@ -600,6 +610,11 @@
600
610
  --chart-lilac: var(--fg-300);
601
611
  --chart-butter: var(--fg-200);
602
612
  --chart-blush: var(--line-300);
613
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
614
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
615
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
616
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
617
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
603
618
  --ok: #177447;
604
619
  --ok-bg: rgba(23,116,71,0.09);
605
620
  --info: #2856b0;
@@ -748,6 +763,11 @@
748
763
  --chart-lilac: var(--fg-300);
749
764
  --chart-butter: var(--fg-200);
750
765
  --chart-blush: var(--line-300);
766
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
767
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
768
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
769
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
770
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
751
771
  --ok: #5cc28f;
752
772
  --ok-bg: rgba(92,194,143,0.12);
753
773
  --info: #7aa7f5;
@@ -895,6 +915,11 @@
895
915
  --chart-lilac: var(--fg-300);
896
916
  --chart-butter: var(--fg-200);
897
917
  --chart-blush: var(--line-300);
918
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
919
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
920
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
921
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
922
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
898
923
  --ok: #177447;
899
924
  --ok-bg: rgba(23,116,71,0.09);
900
925
  --info: #2856b0;
@@ -1450,7 +1475,8 @@ select.tf-input {
1450
1475
  border-radius: var(--radius-pill);
1451
1476
  background: var(--surface-sunken);
1452
1477
  color: var(--ink-muted);
1453
- min-width: 220px;
1478
+ min-width: min(220px, 100%);
1479
+ box-sizing: border-box;
1454
1480
  }
1455
1481
  .tf-search input {
1456
1482
  border: 0;
@@ -1459,6 +1485,7 @@ select.tf-input {
1459
1485
  font: 500 14px/20px var(--font-sans);
1460
1486
  color: var(--ink);
1461
1487
  width: 100%;
1488
+ min-width: 0;
1462
1489
  }
1463
1490
  .tf-search input::placeholder {
1464
1491
  color: var(--ink-subtle);
@@ -1540,7 +1567,7 @@ select.tf-input {
1540
1567
  display: flex;
1541
1568
  }
1542
1569
  .tf-tabs-block .tf-tab {
1543
- flex: 1;
1570
+ flex: 1 1 0;
1544
1571
  }
1545
1572
 
1546
1573
  /* StatTile */
@@ -1857,6 +1884,36 @@ select.tf-input {
1857
1884
  background: var(--accent);
1858
1885
  color: var(--accent-foreground);
1859
1886
  }
1887
+ /* expanded: names next to the icons (the sheet's first column follows the rail's width) */
1888
+ .tf-rail {
1889
+ transition: width var(--dur-base) var(--ease-out);
1890
+ }
1891
+ .tf-rail.expanded {
1892
+ width: 200px;
1893
+ }
1894
+ .tf-rail.expanded .tf-rail-group {
1895
+ align-items: stretch;
1896
+ }
1897
+ .tf-rail.expanded .tf-rail-btn {
1898
+ display: flex;
1899
+ align-items: center;
1900
+ gap: 12px;
1901
+ width: 100%;
1902
+ padding: 0 10px;
1903
+ box-sizing: border-box;
1904
+ border-radius: var(--radius-pill);
1905
+ }
1906
+ .tf-rail-label {
1907
+ min-width: 0;
1908
+ overflow: hidden;
1909
+ text-overflow: ellipsis;
1910
+ white-space: nowrap;
1911
+ font: 500 13px/18px var(--font-sans);
1912
+ }
1913
+ .tf-rail.expanded .tf-dotcount {
1914
+ position: static;
1915
+ margin-left: auto;
1916
+ }
1860
1917
  .tf-rail-btn[aria-current="page"] {
1861
1918
  background: var(--primary);
1862
1919
  color: var(--primary-foreground);
@@ -2006,9 +2063,28 @@ select.tf-input {
2006
2063
  .tf-shell .tf-topbar {
2007
2064
  padding: 0 var(--space-6);
2008
2065
  }
2066
+ /* AppShell with navigation="sidebar": the labelled sidebar on the frame, the sheet beside it */
2067
+ .tf-shell.tf-shell-sidebar {
2068
+ display: grid;
2069
+ grid-template-columns: auto minmax(0, 1fr);
2070
+ align-items: stretch;
2071
+ padding: 8px;
2072
+ }
2073
+ .tf-shell-tools {
2074
+ display: flex;
2075
+ justify-content: flex-end;
2076
+ flex-wrap: wrap;
2077
+ gap: 8px;
2078
+ }
2079
+ .tf-sheet.tf-sheet-norail {
2080
+ grid-template-columns: minmax(0, 1fr) 300px;
2081
+ }
2082
+ .tf-sheet.tf-sheet-norail.tf-sheet-2 {
2083
+ grid-template-columns: minmax(0, 1fr);
2084
+ }
2009
2085
  .tf-sheet {
2010
2086
  display: grid;
2011
- grid-template-columns: 44px 1fr 300px;
2087
+ grid-template-columns: auto 1fr 300px;
2012
2088
  gap: var(--space-6);
2013
2089
  padding: var(--space-6);
2014
2090
  background: var(--canvas);
@@ -2525,6 +2601,64 @@ select.tf-input {
2525
2601
  background: var(--accent);
2526
2602
  color: var(--accent-foreground);
2527
2603
  }
2604
+ a.tf-row-item {
2605
+ text-decoration: none;
2606
+ }
2607
+ .tf-row-text {
2608
+ min-width: 0;
2609
+ }
2610
+ /* not interactive: no hover, no pointer */
2611
+ .tf-row-item.static {
2612
+ cursor: default;
2613
+ }
2614
+ .tf-row-item.static:hover {
2615
+ background: transparent;
2616
+ color: var(--ink);
2617
+ }
2618
+ /* own buttons: the title is the link or button and its hit area stretches over the row */
2619
+ .tf-row-item.has-hit {
2620
+ position: relative;
2621
+ }
2622
+ .tf-row-item.has-hit:hover {
2623
+ background: transparent;
2624
+ color: var(--ink);
2625
+ }
2626
+ .tf-row-item.has-hit:has(.tf-row-hit:hover) {
2627
+ background: var(--accent);
2628
+ color: var(--accent-foreground);
2629
+ }
2630
+ .tf-row-item.has-hit:has(.tf-row-hit:focus-visible) {
2631
+ outline: 2px solid var(--focus);
2632
+ outline-offset: 2px;
2633
+ }
2634
+ .tf-row-hit {
2635
+ display: block;
2636
+ padding: 0;
2637
+ border: 0;
2638
+ background: none;
2639
+ color: inherit;
2640
+ font: inherit;
2641
+ text-align: left;
2642
+ text-decoration: none;
2643
+ cursor: pointer;
2644
+ outline: none;
2645
+ }
2646
+ .tf-row-hit::after {
2647
+ content: "";
2648
+ position: absolute;
2649
+ inset: 0;
2650
+ border-radius: inherit;
2651
+ }
2652
+ .tf-row-item.has-actions {
2653
+ grid-template-columns: auto 1fr auto auto;
2654
+ }
2655
+ .tf-row-actions {
2656
+ position: relative;
2657
+ z-index: 1;
2658
+ display: flex;
2659
+ align-items: center;
2660
+ gap: 4px;
2661
+ }
2528
2662
  .tf-row-item[aria-current="true"] {
2529
2663
  background: var(--surface);
2530
2664
  box-shadow: 0 0 0 var(--line-width) var(--line);
@@ -2536,12 +2670,27 @@ select.tf-input {
2536
2670
  gap: 8px;
2537
2671
  }
2538
2672
  .tf-row-sub {
2673
+ display: block;
2539
2674
  font: 500 13px/18px var(--font-sans);
2540
2675
  color: var(--ink-muted);
2541
2676
  white-space: nowrap;
2542
2677
  overflow: hidden;
2543
2678
  text-overflow: ellipsis;
2544
2679
  }
2680
+ /* titleLines / subtitleLines: wrap, then end in an ellipsis after that many lines */
2681
+ .tf-row-sub.clamp,
2682
+ .tf-row-clamp {
2683
+ display: -webkit-box;
2684
+ -webkit-box-orient: vertical;
2685
+ -webkit-line-clamp: var(--lines, 2);
2686
+ line-clamp: var(--lines, 2);
2687
+ white-space: normal;
2688
+ overflow: hidden;
2689
+ min-width: 0;
2690
+ }
2691
+ .tf-row-title.clamp {
2692
+ align-items: flex-start;
2693
+ }
2545
2694
  .tf-row-meta {
2546
2695
  font: 500 12px/16px var(--font-sans);
2547
2696
  color: var(--ink-muted);
@@ -2728,6 +2877,13 @@ select.tf-input {
2728
2877
  font: 500 13px/1 var(--font-sans);
2729
2878
  cursor: pointer;
2730
2879
  }
2880
+ a.tf-page {
2881
+ display: inline-flex;
2882
+ align-items: center;
2883
+ justify-content: center;
2884
+ box-sizing: border-box;
2885
+ text-decoration: none;
2886
+ }
2731
2887
  .tf-page:hover {
2732
2888
  background: var(--accent);
2733
2889
  color: var(--ink);
@@ -2738,18 +2894,42 @@ select.tf-input {
2738
2894
  }
2739
2895
  .tf-crumbs {
2740
2896
  display: flex;
2897
+ flex-wrap: wrap;
2741
2898
  align-items: center;
2742
2899
  gap: 6px;
2900
+ min-width: 0;
2743
2901
  font: 500 13px/18px var(--font-sans);
2744
2902
  color: var(--ink-muted);
2745
2903
  }
2746
- .tf-crumbs a {
2904
+ /* links and buttons get a 24px target without moving the text */
2905
+ .tf-crumb {
2906
+ display: inline-flex;
2907
+ align-items: center;
2908
+ min-height: 24px;
2909
+ max-width: 100%;
2910
+ padding: 0 4px;
2911
+ /* the target grows to 24px around the 18px line without moving the text */
2912
+ margin: -3px -4px;
2913
+ border: 0;
2914
+ border-radius: var(--radius-sm);
2915
+ background: none;
2747
2916
  color: inherit;
2917
+ font: inherit;
2748
2918
  text-decoration: none;
2919
+ overflow-wrap: anywhere;
2920
+ }
2921
+ a.tf-crumb,
2922
+ button.tf-crumb {
2923
+ cursor: pointer;
2749
2924
  }
2750
- .tf-crumbs a:hover {
2925
+ a.tf-crumb:hover,
2926
+ button.tf-crumb:hover {
2751
2927
  color: var(--ink);
2752
2928
  }
2929
+ .tf-crumb:focus-visible {
2930
+ outline: 2px solid var(--focus);
2931
+ outline-offset: 0;
2932
+ }
2753
2933
  .tf-crumbs [aria-current] {
2754
2934
  color: var(--ink);
2755
2935
  }
@@ -2791,7 +2971,7 @@ select.tf-input {
2791
2971
  cursor: pointer;
2792
2972
  }
2793
2973
  .tf-sheet-2 {
2794
- grid-template-columns: 44px 1fr;
2974
+ grid-template-columns: auto 1fr;
2795
2975
  }
2796
2976
  .tf-main {
2797
2977
  display: flex;
@@ -2861,6 +3041,26 @@ select.tf-input {
2861
3041
  justify-content: center;
2862
3042
  }
2863
3043
  }
3044
+ /* the TopBar measured that the labels do not fit: icons only, at any width */
3045
+ .tf-nav.tight .tf-nav-label {
3046
+ display: none;
3047
+ }
3048
+ .tf-nav.tight .tf-nav-item {
3049
+ position: relative;
3050
+ width: 36px;
3051
+ padding: 0;
3052
+ justify-content: center;
3053
+ }
3054
+ .tf-nav.tight .tf-nav-item .tf-nav-count {
3055
+ position: absolute;
3056
+ top: -2px;
3057
+ right: -4px;
3058
+ min-width: 16px;
3059
+ height: 16px;
3060
+ padding: 0 4px;
3061
+ font-size: 10px;
3062
+ line-height: 16px;
3063
+ }
2864
3064
  .tf-main {
2865
3065
  animation: none;
2866
3066
  }
@@ -2986,6 +3186,19 @@ select.tf-input {
2986
3186
  .tf-user-text {
2987
3187
  display: flex;
2988
3188
  flex-direction: column;
3189
+ min-width: 0;
3190
+ max-width: 200px;
3191
+ }
3192
+ /* a long name or address ends in an ellipsis instead of pushing the nav out (title has it whole) */
3193
+ .tf-user-name,
3194
+ .tf-user-mail {
3195
+ overflow: hidden;
3196
+ text-overflow: ellipsis;
3197
+ white-space: nowrap;
3198
+ }
3199
+ .tf-user {
3200
+ min-width: 0;
3201
+ flex-shrink: 1;
2989
3202
  }
2990
3203
 
2991
3204
  /* Checkbox: real box + SVG check (no pseudo-elements on the input) */
@@ -2998,9 +3211,12 @@ select.tf-input {
2998
3211
  }
2999
3212
  .tf-checkbox input {
3000
3213
  position: absolute;
3001
- inset: 0;
3002
- width: 100%;
3003
- height: 100%;
3214
+ /* the box keeps its size; the hit area is at least 24px (WCAG 2.2 target size) */
3215
+ top: 50%;
3216
+ left: 50%;
3217
+ translate: -50% -50%;
3218
+ width: max(24px, 100%);
3219
+ height: max(24px, 100%);
3004
3220
  margin: 0;
3005
3221
  opacity: 0;
3006
3222
  cursor: pointer;
@@ -4075,6 +4291,23 @@ select.tf-input {
4075
4291
  font: 500 13px/18px var(--font-sans);
4076
4292
  pointer-events: none;
4077
4293
  }
4294
+ /* an interactive control at the end (reveal password, clear, copy) */
4295
+ .tf-input-action {
4296
+ position: absolute;
4297
+ right: 4px;
4298
+ top: 50%;
4299
+ transform: translateY(-50%);
4300
+ display: inline-flex;
4301
+ }
4302
+ .tf-inputwrap.has-action .tf-input {
4303
+ padding-right: 44px;
4304
+ }
4305
+ .tf-inputwrap.has-action.has-suffix .tf-input {
4306
+ padding-right: 72px;
4307
+ }
4308
+ .tf-inputwrap.has-action .tf-input-suffix {
4309
+ right: 44px;
4310
+ }
4078
4311
  .tf-input-suffix.err {
4079
4312
  color: var(--blush-ink);
4080
4313
  }
@@ -4234,7 +4467,7 @@ select.tf-input {
4234
4467
  display: flex;
4235
4468
  }
4236
4469
  .tf-seg.block .tf-seg-item {
4237
- flex: 1;
4470
+ flex: 1 1 0;
4238
4471
  }
4239
4472
  .tf-seg-item {
4240
4473
  position: relative;
@@ -4846,6 +5079,10 @@ label.tf-menu-item {
4846
5079
  border-color var(--dur-fast) ease,
4847
5080
  background-color var(--dur-fast) ease;
4848
5081
  }
5082
+ .tf-drop.disabled {
5083
+ opacity: 0.5;
5084
+ cursor: not-allowed;
5085
+ }
4849
5086
  .tf-drop b {
4850
5087
  font: 500 14px/20px var(--font-sans);
4851
5088
  margin-top: 4px;
@@ -4908,6 +5145,7 @@ label.tf-menu-item {
4908
5145
  /* Alert, confirm, toaster */
4909
5146
  .tf-alert {
4910
5147
  display: flex;
5148
+ flex-wrap: wrap;
4911
5149
  align-items: flex-start;
4912
5150
  gap: 12px;
4913
5151
  padding: 12px 12px 12px 16px;
@@ -4951,7 +5189,8 @@ label.tf-menu-item {
4951
5189
  color: var(--lilac-ink);
4952
5190
  }
4953
5191
  .tf-alert-body {
4954
- flex: 1;
5192
+ /* when the alert is too narrow for text and actions, the actions move to their own line */
5193
+ flex: 1 1 200px;
4955
5194
  min-width: 0;
4956
5195
  display: flex;
4957
5196
  flex-direction: column;
@@ -4967,8 +5206,11 @@ label.tf-menu-item {
4967
5206
  .tf-alert-actions {
4968
5207
  flex: none;
4969
5208
  display: flex;
5209
+ flex-wrap: wrap;
4970
5210
  align-items: center;
4971
5211
  gap: 4px;
5212
+ max-width: 100%;
5213
+ margin-left: auto;
4972
5214
  }
4973
5215
  .tf-alert .tf-iconbtn-ghost {
4974
5216
  background: transparent;
@@ -5973,14 +6215,29 @@ label.tf-menu-item {
5973
6215
  display: inline-flex;
5974
6216
  align-items: center;
5975
6217
  gap: 8px;
5976
- height: var(--control-sm);
5977
- padding: 0 12px 0 4px;
6218
+ /* grows with a long title (two lines at most) instead of spilling over */
6219
+ min-height: var(--control-sm);
6220
+ box-sizing: border-box;
6221
+ padding: 4px 12px 4px 4px;
5978
6222
  border-radius: var(--radius-pill);
5979
6223
  background: var(--surface-sunken);
5980
6224
  color: var(--ink);
5981
6225
  text-decoration: none;
5982
6226
  font: 500 12px/16px var(--font-sans);
5983
- max-width: 260px;
6227
+ max-width: min(260px, 100%);
6228
+ }
6229
+ .tf-source-title {
6230
+ min-width: 0;
6231
+ display: -webkit-box;
6232
+ -webkit-box-orient: vertical;
6233
+ -webkit-line-clamp: 2;
6234
+ line-clamp: 2;
6235
+ overflow: hidden;
6236
+ overflow-wrap: anywhere;
6237
+ }
6238
+ .tf-source > .tf-ico,
6239
+ .tf-source-n {
6240
+ flex: none;
5984
6241
  }
5985
6242
  .tf-source:hover {
5986
6243
  background: var(--line);
@@ -7103,17 +7360,25 @@ label.tf-menu-item {
7103
7360
  color: var(--ink-muted);
7104
7361
  }
7105
7362
  .tf-csteps {
7363
+ /* one row at every width: steps shrink to their numbers instead of wrapping */
7364
+ container: tf-csteps / inline-size;
7106
7365
  display: flex;
7107
7366
  gap: 8px;
7108
7367
  margin: 0;
7109
7368
  padding: 0;
7110
7369
  list-style: none;
7111
- flex-wrap: wrap;
7112
7370
  }
7113
7371
  .tf-csteps li {
7114
7372
  display: flex;
7115
7373
  align-items: center;
7116
7374
  gap: 8px;
7375
+ min-width: 0;
7376
+ }
7377
+ .tf-cstep-label {
7378
+ min-width: 0;
7379
+ overflow: hidden;
7380
+ text-overflow: ellipsis;
7381
+ white-space: nowrap;
7117
7382
  }
7118
7383
  .tf-csteps li + li::before {
7119
7384
  content: "";
@@ -7142,6 +7407,40 @@ label.tf-menu-item {
7142
7407
  .tf-csteps button:disabled {
7143
7408
  cursor: default;
7144
7409
  }
7410
+ .tf-csteps button {
7411
+ min-width: 0;
7412
+ max-width: 100%;
7413
+ }
7414
+ .tf-csteps.compact li:not(.cur) .tf-cstep-label {
7415
+ position: absolute;
7416
+ width: 1px;
7417
+ height: 1px;
7418
+ overflow: hidden;
7419
+ clip-path: inset(50%);
7420
+ white-space: nowrap;
7421
+ }
7422
+ .tf-csteps.compact li:not(.cur) button {
7423
+ padding: 0 4px;
7424
+ }
7425
+ .tf-csteps.compact li + li::before {
7426
+ width: 12px;
7427
+ }
7428
+ @container tf-csteps (max-width: 560px) {
7429
+ .tf-csteps li:not(.cur) .tf-cstep-label {
7430
+ position: absolute;
7431
+ width: 1px;
7432
+ height: 1px;
7433
+ overflow: hidden;
7434
+ clip-path: inset(50%);
7435
+ white-space: nowrap;
7436
+ }
7437
+ .tf-csteps li:not(.cur) button {
7438
+ padding: 0 4px;
7439
+ }
7440
+ .tf-csteps li + li::before {
7441
+ width: 12px;
7442
+ }
7443
+ }
7145
7444
  .tf-csteps li.cur button {
7146
7445
  background: var(--surface);
7147
7446
  color: var(--ink);
@@ -7308,7 +7607,7 @@ label.tf-menu-item {
7308
7607
  color: var(--on-frame);
7309
7608
  box-shadow: var(--shadow-float), 0 0 0 var(--line-width) var(--line);
7310
7609
  }
7311
- .tf-plan.featured .tf-plan-head span,
7610
+ .tf-plan.featured .tf-plan-head span:not(.tf-badge),
7312
7611
  .tf-plan.featured .tf-plan-price span,
7313
7612
  .tf-plan.featured .tf-plan-price s,
7314
7613
  .tf-plan.featured .tf-plan-feats li.no {
@@ -7339,10 +7638,22 @@ label.tf-menu-item {
7339
7638
  .tf-plan-head b {
7340
7639
  font: 600 18px/24px var(--font-sans);
7341
7640
  }
7342
- .tf-plan-head span {
7641
+ .tf-plan-head span:not(.tf-badge) {
7343
7642
  font: 500 13px/18px var(--font-sans);
7344
7643
  color: var(--ink-muted);
7345
7644
  }
7645
+ /* "Current plan" next to the name, and the note under the price */
7646
+ .tf-plan-head .tf-plan-current {
7647
+ align-self: flex-start;
7648
+ }
7649
+ .tf-plan-note {
7650
+ margin: -4px 0 0;
7651
+ font: 500 12px/16px var(--font-sans);
7652
+ color: var(--ink-muted);
7653
+ }
7654
+ a.tf-plan-cta {
7655
+ text-decoration: none;
7656
+ }
7346
7657
  .tf-plan-price {
7347
7658
  display: flex;
7348
7659
  align-items: baseline;
@@ -9443,7 +9754,7 @@ label.tf-menu-item {
9443
9754
  .tf-tabbar {
9444
9755
  display: grid;
9445
9756
  grid-auto-flow: column;
9446
- grid-auto-columns: 1fr;
9757
+ grid-auto-columns: minmax(0, 1fr);
9447
9758
  padding: 4px 8px calc(4px + env(safe-area-inset-bottom, 0px));
9448
9759
  background: var(--frame);
9449
9760
  border-radius: var(--radius-1) var(--radius-1) 0 0;
@@ -9462,6 +9773,17 @@ label.tf-menu-item {
9462
9773
  cursor: pointer;
9463
9774
  border-radius: var(--radius-1);
9464
9775
  }
9776
+ .tf-tabbar-item {
9777
+ min-width: 0;
9778
+ }
9779
+ .tf-tabbar-label {
9780
+ max-width: 100%;
9781
+ padding: 0 4px;
9782
+ box-sizing: border-box;
9783
+ overflow: hidden;
9784
+ text-overflow: ellipsis;
9785
+ white-space: nowrap;
9786
+ }
9465
9787
  .tf-tabbar-item.on {
9466
9788
  color: var(--on-frame);
9467
9789
  background: var(--frame-hover);
@@ -9770,6 +10092,22 @@ label.tf-menu-item {
9770
10092
  padding-bottom: 10px;
9771
10093
  color: var(--ink-muted);
9772
10094
  }
10095
+ /* in a narrow column (a filter sidebar) the number fields give their padding to the digits */
10096
+ .tf-range {
10097
+ container: tf-range / inline-size;
10098
+ }
10099
+ @container tf-range (max-width: 280px) {
10100
+ .tf-range-inputs {
10101
+ gap: 4px;
10102
+ }
10103
+ .tf-range-num .tf-input {
10104
+ padding-left: 10px;
10105
+ padding-right: 24px;
10106
+ }
10107
+ .tf-range-num > span {
10108
+ right: 10px;
10109
+ }
10110
+ }
9773
10111
  .tf-range-vals {
9774
10112
  display: flex;
9775
10113
  justify-content: space-between;
@@ -9923,6 +10261,31 @@ label.tf-menu-item {
9923
10261
  font: 500 12px/16px var(--font-sans);
9924
10262
  color: var(--ink-muted);
9925
10263
  }
10264
+ /* layout="list": compact rows */
10265
+ .tf-tiles.list {
10266
+ grid-template-columns: minmax(0, 1fr);
10267
+ gap: 8px;
10268
+ }
10269
+ .tf-tiles.list .tf-tile {
10270
+ flex-direction: row;
10271
+ align-items: center;
10272
+ gap: 12px;
10273
+ padding: 8px 44px 8px 8px;
10274
+ }
10275
+ .tf-tiles.list .tf-tile-art {
10276
+ flex: none;
10277
+ width: 40px;
10278
+ height: var(--density-control);
10279
+ aspect-ratio: auto;
10280
+ }
10281
+ .tf-tiles.list .tf-tile-label {
10282
+ min-width: 0;
10283
+ padding: 0;
10284
+ }
10285
+ .tf-tiles.list .tf-tile-check {
10286
+ top: 50%;
10287
+ translate: 0 -50%;
10288
+ }
9926
10289
  .tf-tile-check {
9927
10290
  position: absolute;
9928
10291
  top: 14px;
@@ -11032,6 +11395,16 @@ button.tf-runs-main[aria-expanded]:hover {
11032
11395
  color: var(--paper-ink);
11033
11396
  box-shadow: inset 0 0 0 1px var(--line);
11034
11397
  }
11398
+ /* QrCode: dark modules on paper, in every theme (scanners expect dark on light) */
11399
+ .tf-qr {
11400
+ display: block;
11401
+ width: 100%;
11402
+ height: auto;
11403
+ color: var(--paper-ink);
11404
+ }
11405
+ .tf-qr-bg {
11406
+ fill: var(--paper);
11407
+ }
11035
11408
  .tf-2fa-qr > * {
11036
11409
  max-width: 100%;
11037
11410
  max-height: 100%;
@@ -11283,7 +11656,8 @@ button.tf-runs-main[aria-expanded]:hover {
11283
11656
  border-radius: var(--radius-md);
11284
11657
  overflow: hidden;
11285
11658
  background: var(--surface-sunken);
11286
- touch-action: none;
11659
+ /* sideways drags move the divider; the page still scrolls up and down over it */
11660
+ touch-action: pan-y;
11287
11661
  user-select: none;
11288
11662
  cursor: ew-resize;
11289
11663
  }
@@ -12183,6 +12557,14 @@ button.tf-runs-main[aria-expanded]:hover {
12183
12557
  .tf-togglegroup .tf-toggle {
12184
12558
  height: var(--control-sm);
12185
12559
  }
12560
+ .tf-togglegroup.block {
12561
+ display: flex;
12562
+ flex-wrap: nowrap;
12563
+ width: auto;
12564
+ }
12565
+ .tf-togglegroup.block .tf-toggle {
12566
+ flex: 1 1 0;
12567
+ }
12186
12568
  .tf-togglegroup .tf-toggle.icon {
12187
12569
  width: 32px;
12188
12570
  }
@@ -12393,6 +12775,11 @@ button.tf-runs-main[aria-expanded]:hover {
12393
12775
  text-align: left;
12394
12776
  cursor: pointer;
12395
12777
  }
12778
+ .tf-selectmenu.sm {
12779
+ height: var(--control-sm);
12780
+ padding: 0 12px;
12781
+ font-size: 13px;
12782
+ }
12396
12783
  .tf-selectmenu.empty .tf-selectmenu-value {
12397
12784
  color: var(--ink-subtle);
12398
12785
  }
@@ -12669,26 +13056,44 @@ button.tf-runs-main[aria-expanded]:hover {
12669
13056
  outline-offset: -2px;
12670
13057
  }
12671
13058
 
12672
- /* Sidebar */
13059
+ /* Sidebar: floating (a card), attached (flush with the screen's edge) or on the AppShell frame */
12673
13060
  .tf-sidebar {
12674
13061
  display: flex;
12675
13062
  flex-direction: column;
12676
- gap: 16px;
13063
+ flex: none;
13064
+ gap: 12px;
12677
13065
  width: 248px;
12678
13066
  padding: 12px;
12679
13067
  box-sizing: border-box;
12680
13068
  border-radius: var(--radius-lg);
12681
13069
  background: var(--surface);
12682
13070
  box-shadow: 0 0 0 var(--line-width) var(--line);
13071
+ color: var(--ink);
12683
13072
  transition: width var(--dur-base) var(--ease-out);
12684
13073
  }
12685
13074
  .tf-sidebar.collapsed {
12686
13075
  width: 64px;
12687
13076
  }
13077
+ .tf-sidebar.attached {
13078
+ align-self: stretch;
13079
+ min-height: 100%;
13080
+ border-radius: 0;
13081
+ box-shadow: none;
13082
+ background: var(--sidebar);
13083
+ border-right: 1px solid var(--sidebar-border);
13084
+ }
13085
+ .tf-sidebar-head {
13086
+ display: flex;
13087
+ align-items: center;
13088
+ gap: 8px;
13089
+ min-height: var(--density-control);
13090
+ padding: 0 4px;
13091
+ }
12688
13092
  .tf-sidebar-body {
12689
13093
  display: flex;
12690
13094
  flex-direction: column;
12691
- gap: 16px;
13095
+ /* groups sit clearly apart; a label sits close to its own items */
13096
+ gap: 20px;
12692
13097
  flex: 1;
12693
13098
  min-height: 0;
12694
13099
  overflow-y: auto;
@@ -12701,13 +13106,49 @@ button.tf-runs-main[aria-expanded]:hover {
12701
13106
  padding: 0;
12702
13107
  list-style: none;
12703
13108
  }
13109
+ .tf-sidebar-grouphead {
13110
+ display: flex;
13111
+ align-items: center;
13112
+ gap: 4px;
13113
+ min-height: 24px;
13114
+ margin-bottom: 8px;
13115
+ padding: 0 4px 0 12px;
13116
+ }
12704
13117
  .tf-sidebar-grouplabel {
12705
- padding: 0 12px 6px;
13118
+ display: flex;
13119
+ align-items: center;
13120
+ gap: 4px;
13121
+ flex: 1;
13122
+ min-width: 0;
13123
+ padding: 0;
13124
+ border: 0;
13125
+ background: none;
12706
13126
  font: 500 11px/14px var(--font-sans);
12707
13127
  letter-spacing: 0.06em;
12708
13128
  text-transform: uppercase;
13129
+ text-align: left;
12709
13130
  color: var(--ink-muted);
12710
13131
  }
13132
+ button.tf-sidebar-grouplabel {
13133
+ cursor: pointer;
13134
+ }
13135
+ button.tf-sidebar-grouplabel:hover {
13136
+ color: var(--ink);
13137
+ }
13138
+ button.tf-sidebar-grouplabel:focus-visible {
13139
+ outline: 2px solid var(--focus);
13140
+ outline-offset: 2px;
13141
+ }
13142
+ .tf-sidebar-grouplabel[aria-expanded="false"] .tf-sidebar-chev {
13143
+ transform: rotate(-90deg);
13144
+ }
13145
+ .tf-sidebar-groupaction {
13146
+ flex: none;
13147
+ margin-left: auto;
13148
+ }
13149
+ .tf-sidebar-li {
13150
+ position: relative;
13151
+ }
12711
13152
  .tf-sidebar-item {
12712
13153
  display: flex;
12713
13154
  align-items: center;
@@ -12715,15 +13156,86 @@ button.tf-runs-main[aria-expanded]:hover {
12715
13156
  width: 100%;
12716
13157
  height: var(--density-control);
12717
13158
  padding: 0 12px;
13159
+ box-sizing: border-box;
12718
13160
  border: 0;
12719
13161
  border-radius: var(--radius-pill);
12720
13162
  background: transparent;
12721
13163
  color: var(--ink-muted);
12722
13164
  font: 500 13px/18px var(--font-sans);
12723
13165
  text-align: left;
13166
+ text-decoration: none;
12724
13167
  cursor: pointer;
12725
13168
  }
12726
- .tf-sidebar-item:hover {
13169
+ /* Filter options (Sidebar as="aside"): a checkbox or radio mark, the label and a count */
13170
+ .tf-sidebar-option {
13171
+ position: relative;
13172
+ }
13173
+ .tf-sidebar-option.disabled {
13174
+ opacity: 0.45;
13175
+ cursor: default;
13176
+ }
13177
+ .tf-sidebar-input {
13178
+ position: absolute;
13179
+ width: 1px;
13180
+ height: 1px;
13181
+ margin: 0;
13182
+ opacity: 0;
13183
+ pointer-events: none;
13184
+ }
13185
+ .tf-sidebar-mark {
13186
+ display: grid;
13187
+ place-items: center;
13188
+ flex: none;
13189
+ width: 18px;
13190
+ height: 18px;
13191
+ box-sizing: border-box;
13192
+ border-radius: var(--radius-1);
13193
+ border: 1.5px solid var(--line-strong);
13194
+ background: var(--surface);
13195
+ color: var(--primary-foreground);
13196
+ transition:
13197
+ background-color var(--dur-fast) var(--ease-out),
13198
+ border-color var(--dur-fast) var(--ease-out);
13199
+ }
13200
+ .tf-sidebar-mark.radio {
13201
+ border-radius: var(--radius-full);
13202
+ }
13203
+ .tf-sidebar-mark svg {
13204
+ opacity: 0;
13205
+ }
13206
+ .tf-sidebar-input:checked + .tf-sidebar-mark {
13207
+ background: var(--primary);
13208
+ border-color: var(--primary);
13209
+ }
13210
+ .tf-sidebar-input:checked + .tf-sidebar-mark.radio {
13211
+ box-shadow: inset 0 0 0 3px var(--surface);
13212
+ }
13213
+ .tf-sidebar-input:checked + .tf-sidebar-mark svg {
13214
+ opacity: 1;
13215
+ }
13216
+ .tf-sidebar-input:focus-visible + .tf-sidebar-mark {
13217
+ outline: 2px solid var(--focus);
13218
+ outline-offset: 2px;
13219
+ }
13220
+ .tf-sidebar-option:has(.tf-sidebar-input:checked) {
13221
+ color: var(--ink);
13222
+ }
13223
+ /* free content in a group (sliders, date fields, chips) */
13224
+ .tf-sidebar-content {
13225
+ display: flex;
13226
+ flex-direction: column;
13227
+ gap: 12px;
13228
+ padding: 4px 12px 0;
13229
+ min-width: 0;
13230
+ }
13231
+ .tf-sidebar-groupbody {
13232
+ display: flex;
13233
+ flex-direction: column;
13234
+ gap: 2px;
13235
+ min-width: 0;
13236
+ }
13237
+ .tf-sidebar-item:hover,
13238
+ .tf-sidebar-item.flying {
12727
13239
  background: var(--sidebar-accent);
12728
13240
  color: var(--ink);
12729
13241
  }
@@ -12738,10 +13250,21 @@ button.tf-runs-main[aria-expanded]:hover {
12738
13250
  outline: 2px solid var(--focus);
12739
13251
  outline-offset: 2px;
12740
13252
  }
13253
+ .tf-sidebar-item:disabled {
13254
+ opacity: 0.45;
13255
+ cursor: not-allowed;
13256
+ }
13257
+ .tf-sidebar-item:disabled:hover {
13258
+ background: transparent;
13259
+ color: var(--ink-muted);
13260
+ }
12741
13261
  .tf-sidebar-item.nested {
12742
13262
  height: var(--control-sm);
12743
13263
  padding-left: 40px;
12744
13264
  }
13265
+ .tf-sidebar-sub {
13266
+ margin-top: 2px !important;
13267
+ }
12745
13268
  .tf-sidebar-label {
12746
13269
  flex: 1;
12747
13270
  min-width: 0;
@@ -12750,22 +13273,107 @@ button.tf-runs-main[aria-expanded]:hover {
12750
13273
  white-space: nowrap;
12751
13274
  }
12752
13275
  .tf-sidebar-chev {
13276
+ flex: none;
12753
13277
  transition: transform var(--dur-base) var(--ease-out);
12754
13278
  }
12755
13279
  .tf-sidebar-item[aria-expanded="true"] .tf-sidebar-chev {
12756
13280
  transform: rotate(180deg);
12757
13281
  }
13282
+ .tf-sidebar-ext {
13283
+ flex: none;
13284
+ opacity: 0.7;
13285
+ }
13286
+ .tf-sidebar-count {
13287
+ flex: none;
13288
+ min-width: 20px;
13289
+ height: 20px;
13290
+ padding: 0 6px;
13291
+ box-sizing: border-box;
13292
+ border-radius: var(--radius-pill);
13293
+ background: var(--count);
13294
+ color: var(--on-count);
13295
+ font: 600 11px/20px var(--font-sans);
13296
+ text-align: center;
13297
+ }
13298
+ .tf-sidebar-badge {
13299
+ flex: none;
13300
+ height: 20px;
13301
+ padding: 0 8px;
13302
+ box-sizing: border-box;
13303
+ border-radius: var(--radius-pill);
13304
+ background: var(--count);
13305
+ color: var(--on-count);
13306
+ font: 600 10px/20px var(--font-sans);
13307
+ letter-spacing: 0.04em;
13308
+ text-transform: uppercase;
13309
+ }
13310
+ .tf-sidebar-dot {
13311
+ flex: none;
13312
+ width: 8px;
13313
+ height: 8px;
13314
+ border-radius: var(--radius-full);
13315
+ background: var(--count);
13316
+ }
13317
+ .tf-sidebar-sr {
13318
+ position: absolute;
13319
+ width: 1px;
13320
+ height: 1px;
13321
+ overflow: hidden;
13322
+ clip-path: inset(50%);
13323
+ white-space: nowrap;
13324
+ }
13325
+ /* the "…" menu of an item shows on hover and focus */
13326
+ .tf-sidebar-li.with-actions > .tf-sidebar-item {
13327
+ padding-right: 40px;
13328
+ }
13329
+ .tf-sidebar-more {
13330
+ position: absolute;
13331
+ top: 4px;
13332
+ right: 4px;
13333
+ opacity: 0;
13334
+ transition: opacity var(--dur-fast) var(--ease-out);
13335
+ }
13336
+ .tf-sidebar-li:hover > .tf-sidebar-more,
13337
+ .tf-sidebar-more:focus-visible,
13338
+ .tf-sidebar-more[aria-expanded="true"] {
13339
+ opacity: 1;
13340
+ }
12758
13341
  .tf-sidebar-foot {
12759
13342
  display: flex;
12760
13343
  align-items: center;
12761
- justify-content: space-between;
12762
13344
  gap: 8px;
12763
13345
  padding-top: 12px;
12764
13346
  border-top: 1px solid var(--sidebar-border);
12765
13347
  }
13348
+ .tf-sidebar-foot > :not(.tf-sidebar-toggle) {
13349
+ flex: 1;
13350
+ min-width: 0;
13351
+ }
13352
+ .tf-sidebar-toggle {
13353
+ flex: none;
13354
+ margin-left: auto;
13355
+ }
13356
+ .tf-sidebar-head .tf-pop-anchor,
13357
+ .tf-sidebar-foot .tf-pop-anchor {
13358
+ display: block;
13359
+ min-width: 0;
13360
+ }
13361
+ .tf-sidebar-head .tf-wssw {
13362
+ width: 100%;
13363
+ }
13364
+ .tf-sidebar-head .tf-wssw .tf-option-text {
13365
+ flex: 1;
13366
+ min-width: 0;
13367
+ }
13368
+
13369
+ /* collapsed: icons only; labels stay the accessible names, tooltips and flyouts show them */
13370
+ .tf-sidebar.collapsed .tf-sidebar-body {
13371
+ gap: 12px;
13372
+ }
12766
13373
  .tf-sidebar.collapsed .tf-sidebar-label,
12767
13374
  .tf-sidebar.collapsed .tf-sidebar-chev,
12768
- .tf-sidebar.collapsed .tf-sidebar-grouplabel {
13375
+ .tf-sidebar.collapsed .tf-sidebar-ext,
13376
+ .tf-sidebar.collapsed .tf-sidebar-grouphead {
12769
13377
  position: absolute;
12770
13378
  width: 1px;
12771
13379
  height: 1px;
@@ -12773,12 +13381,19 @@ button.tf-runs-main[aria-expanded]:hover {
12773
13381
  clip-path: inset(50%);
12774
13382
  white-space: nowrap;
12775
13383
  }
13384
+ .tf-sidebar.collapsed .tf-sidebar-group + .tf-sidebar-group {
13385
+ padding-top: 12px;
13386
+ border-top: 1px solid var(--sidebar-border);
13387
+ }
12776
13388
  .tf-sidebar.collapsed .tf-sidebar-item {
12777
13389
  position: relative;
12778
13390
  justify-content: center;
12779
13391
  padding: 0;
12780
13392
  }
12781
- .tf-sidebar.collapsed .tf-subnav-count {
13393
+ .tf-sidebar.collapsed .tf-sidebar-item.has-current {
13394
+ background: var(--sidebar-accent);
13395
+ }
13396
+ .tf-sidebar.collapsed .tf-sidebar-count {
12782
13397
  position: absolute;
12783
13398
  top: -2px;
12784
13399
  right: -2px;
@@ -12788,57 +13403,317 @@ button.tf-runs-main[aria-expanded]:hover {
12788
13403
  font-size: 10px;
12789
13404
  line-height: 16px;
12790
13405
  }
13406
+ .tf-sidebar.collapsed .tf-sidebar-dot,
13407
+ .tf-sidebar.collapsed .tf-sidebar-badge {
13408
+ position: absolute;
13409
+ top: 6px;
13410
+ right: 8px;
13411
+ width: 8px;
13412
+ height: 8px;
13413
+ padding: 0;
13414
+ font-size: 0;
13415
+ }
13416
+ .tf-sidebar.collapsed .tf-sidebar-head {
13417
+ justify-content: center;
13418
+ padding: 0;
13419
+ }
12791
13420
  .tf-sidebar.collapsed .tf-sidebar-foot {
12792
13421
  flex-direction: column;
12793
13422
  }
12794
- @media (max-width: 760px) {
12795
- .tf-sidebar {
12796
- width: 100%;
12797
- }
12798
- .tf-navmenu-panel.with-feature {
12799
- grid-template-columns: minmax(0, 1fr);
12800
- }
12801
- .tf-navmenu-feature {
12802
- min-height: 0;
12803
- }
12804
- .tf-navmenu-list {
12805
- flex-wrap: wrap;
12806
- }
12807
- .tf-menubar {
12808
- flex-wrap: wrap;
12809
- border-radius: var(--radius-lg);
12810
- }
13423
+ .tf-sidebar.collapsed .tf-sidebar-foot > :not(.tf-sidebar-toggle) {
13424
+ flex: none;
13425
+ }
13426
+ .tf-sidebar.collapsed .tf-sidebar-toggle {
13427
+ margin-left: 0;
12811
13428
  }
12812
13429
 
12813
- /* Drawer (sheet) sides */
12814
- .tf-drawer.side-left {
12815
- right: auto;
12816
- left: 0;
12817
- animation-name: tf-sheet-left;
13430
+ /* tooltips, flyouts and item menus float in the portal, so the scrolling body does not clip them */
13431
+ .tf-sidebar-layer {
13432
+ position: fixed;
13433
+ z-index: var(--z-palette);
12818
13434
  }
12819
- .tf-drawer.side-top,
12820
- .tf-drawer.side-bottom {
12821
- left: 0;
12822
- right: 0;
12823
- width: 100%;
12824
- max-height: min(80%, 640px);
13435
+ .tf-sidebar-tip {
13436
+ display: inline-flex;
13437
+ align-items: center;
13438
+ gap: 8px;
13439
+ padding: 4px 8px;
13440
+ border-radius: var(--radius-sm);
13441
+ background: var(--frame);
13442
+ color: var(--on-frame);
13443
+ font: 500 12px/16px var(--font-sans);
13444
+ white-space: nowrap;
13445
+ pointer-events: none;
13446
+ animation: tf-fade var(--dur-fast) var(--ease-out) both;
12825
13447
  }
12826
- .tf-drawer.side-top {
12827
- bottom: auto;
12828
- animation-name: tf-sheet-top;
13448
+ .tf-sidebar-tipcount {
13449
+ color: var(--on-frame-muted);
12829
13450
  }
12830
- .tf-drawer.side-bottom {
12831
- top: auto;
12832
- border-radius: var(--radius-xl) var(--radius-xl) 0 0;
12833
- animation-name: tf-sheet-bottom;
13451
+ .tf-sidebar-flyout {
13452
+ min-width: 200px;
13453
+ padding: 6px;
13454
+ border-radius: var(--radius-md);
13455
+ background: var(--surface);
13456
+ color: var(--ink);
13457
+ box-shadow: var(--shadow-float), 0 0 0 var(--line-width) var(--line);
13458
+ animation: tf-fade var(--dur-fast) var(--ease-out) both;
12834
13459
  }
12835
- @keyframes tf-sheet-left {
12836
- from {
12837
- opacity: 0;
12838
- transform: translateX(calc(-24px * var(--motion-travel)));
12839
- }
13460
+ .tf-sidebar-flyout ul {
13461
+ display: flex;
13462
+ flex-direction: column;
13463
+ gap: 2px;
13464
+ margin: 0;
13465
+ padding: 0;
13466
+ list-style: none;
12840
13467
  }
12841
- @keyframes tf-sheet-top {
13468
+ .tf-sidebar-flytitle {
13469
+ padding: 6px 12px 8px;
13470
+ font: 500 11px/14px var(--font-sans);
13471
+ letter-spacing: 0.06em;
13472
+ text-transform: uppercase;
13473
+ color: var(--ink-muted);
13474
+ }
13475
+ .tf-sidebar-flyout .tf-sidebar-item.nested {
13476
+ padding-left: 12px;
13477
+ }
13478
+
13479
+ /* on the AppShell frame */
13480
+ .tf-sidebar.shell {
13481
+ align-self: stretch;
13482
+ padding: 16px 8px 8px;
13483
+ border-radius: 0;
13484
+ background: transparent;
13485
+ box-shadow: none;
13486
+ color: var(--on-frame);
13487
+ }
13488
+ .tf-sidebar.shell .tf-sidebar-item,
13489
+ .tf-sidebar.shell .tf-sidebar-grouplabel {
13490
+ color: var(--on-frame-muted);
13491
+ }
13492
+ .tf-sidebar.shell .tf-sidebar-item:hover,
13493
+ .tf-sidebar.shell .tf-sidebar-item.flying,
13494
+ .tf-sidebar.shell.collapsed .tf-sidebar-item.has-current {
13495
+ background: var(--frame-hover);
13496
+ color: var(--on-frame);
13497
+ }
13498
+ .tf-sidebar.shell .tf-sidebar-item.has-current,
13499
+ .tf-sidebar.shell button.tf-sidebar-grouplabel:hover {
13500
+ color: var(--on-frame);
13501
+ }
13502
+ .tf-sidebar.shell .tf-sidebar-item[aria-current="page"] {
13503
+ background: var(--frame-active);
13504
+ color: var(--on-frame);
13505
+ }
13506
+ .tf-sidebar.shell .tf-sidebar-item:disabled:hover {
13507
+ background: transparent;
13508
+ color: var(--on-frame-muted);
13509
+ }
13510
+ .tf-sidebar.shell .tf-sidebar-foot,
13511
+ .tf-sidebar.shell.collapsed .tf-sidebar-group + .tf-sidebar-group {
13512
+ border-color: var(--frame-hover);
13513
+ }
13514
+ .tf-sidebar.shell .tf-iconbtn-ghost {
13515
+ color: var(--on-frame-muted);
13516
+ }
13517
+ .tf-sidebar.shell .tf-iconbtn-ghost:hover {
13518
+ background: var(--frame-hover);
13519
+ color: var(--on-frame);
13520
+ }
13521
+ .tf-sidebar.shell .tf-sidebar-head {
13522
+ min-height: 44px;
13523
+ }
13524
+
13525
+ /* UserMenu: the signed-in person, opening their account menu */
13526
+ .tf-usermenu {
13527
+ display: flex;
13528
+ align-items: center;
13529
+ gap: 10px;
13530
+ width: 100%;
13531
+ min-height: 44px;
13532
+ padding: 4px 8px 4px 4px;
13533
+ box-sizing: border-box;
13534
+ border: 0;
13535
+ border-radius: var(--radius-pill);
13536
+ background: transparent;
13537
+ color: var(--ink);
13538
+ font: inherit;
13539
+ text-align: left;
13540
+ cursor: pointer;
13541
+ }
13542
+ .tf-usermenu.compact {
13543
+ width: auto;
13544
+ padding: 4px;
13545
+ }
13546
+ .tf-usermenu:hover,
13547
+ .tf-usermenu[aria-expanded="true"] {
13548
+ background: var(--sidebar-accent);
13549
+ }
13550
+ .tf-usermenu:focus-visible {
13551
+ outline: 2px solid var(--focus);
13552
+ outline-offset: 2px;
13553
+ }
13554
+ .tf-usermenu-avatar {
13555
+ display: inline-flex;
13556
+ flex: none;
13557
+ }
13558
+ .tf-usermenu-text {
13559
+ display: flex;
13560
+ flex-direction: column;
13561
+ flex: 1;
13562
+ min-width: 0;
13563
+ }
13564
+ .tf-usermenu-name {
13565
+ font: 500 13px/18px var(--font-sans);
13566
+ overflow: hidden;
13567
+ text-overflow: ellipsis;
13568
+ white-space: nowrap;
13569
+ }
13570
+ .tf-usermenu-mail {
13571
+ font: 500 11px/14px var(--font-sans);
13572
+ color: var(--ink-muted);
13573
+ overflow: hidden;
13574
+ text-overflow: ellipsis;
13575
+ white-space: nowrap;
13576
+ }
13577
+ .tf-sidebar.shell .tf-usermenu {
13578
+ color: var(--on-frame);
13579
+ }
13580
+ .tf-sidebar.shell .tf-usermenu:hover,
13581
+ .tf-sidebar.shell .tf-usermenu[aria-expanded="true"] {
13582
+ background: var(--frame-hover);
13583
+ }
13584
+ .tf-sidebar.shell .tf-usermenu-mail {
13585
+ color: var(--on-frame-muted);
13586
+ }
13587
+ .tf-wssw.compact {
13588
+ padding: 4px;
13589
+ }
13590
+
13591
+ /* the bar that opens the sidebar as a drawer on phones */
13592
+ .tf-sidebar-bar,
13593
+ .tf-sidebar-scrim {
13594
+ display: none;
13595
+ }
13596
+ @media (max-width: 760px) {
13597
+ .tf-sidebar-bar {
13598
+ display: flex;
13599
+ align-items: center;
13600
+ gap: 8px;
13601
+ min-height: 52px;
13602
+ padding: 6px 12px 6px 6px;
13603
+ box-sizing: border-box;
13604
+ border-radius: var(--radius-lg);
13605
+ background: var(--surface);
13606
+ box-shadow: 0 0 0 var(--line-width) var(--line);
13607
+ color: var(--ink);
13608
+ }
13609
+ .tf-sidebar-bar.attached {
13610
+ border-radius: 0;
13611
+ box-shadow: none;
13612
+ background: var(--sidebar);
13613
+ border-bottom: 1px solid var(--sidebar-border);
13614
+ }
13615
+ .tf-sidebar-bar.shell {
13616
+ min-height: 56px;
13617
+ padding: 8px 8px 8px 0;
13618
+ border-radius: 0;
13619
+ box-shadow: none;
13620
+ background: transparent;
13621
+ color: var(--on-frame);
13622
+ }
13623
+ .tf-sidebar-bar.shell .tf-iconbtn-ghost {
13624
+ color: var(--on-frame);
13625
+ }
13626
+ .tf-sidebar-bar > :not(.tf-iconbtn) {
13627
+ min-width: 0;
13628
+ }
13629
+ .tf-sidebar,
13630
+ .tf-sidebar.attached,
13631
+ .tf-sidebar.shell {
13632
+ position: fixed;
13633
+ top: 0;
13634
+ bottom: 0;
13635
+ left: 0;
13636
+ z-index: var(--z-overlay);
13637
+ width: min(300px, 86vw);
13638
+ min-height: 0;
13639
+ padding: 12px;
13640
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
13641
+ box-shadow: var(--shadow-float), 0 0 0 var(--line-width) var(--line);
13642
+ transform: translateX(-105%);
13643
+ visibility: hidden;
13644
+ transition:
13645
+ transform var(--dur-base) var(--ease-out),
13646
+ visibility 0s linear var(--dur-base);
13647
+ }
13648
+ .tf-sidebar.shell {
13649
+ background: var(--frame);
13650
+ }
13651
+ .tf-sidebar.attached {
13652
+ background: var(--sidebar);
13653
+ }
13654
+ .tf-sidebar.open {
13655
+ transform: none;
13656
+ visibility: visible;
13657
+ transition: transform var(--dur-base) var(--ease-out);
13658
+ }
13659
+ .tf-sidebar-toggle {
13660
+ display: none;
13661
+ }
13662
+ .tf-sidebar-scrim {
13663
+ display: block;
13664
+ position: fixed;
13665
+ inset: 0;
13666
+ z-index: var(--z-overlay);
13667
+ background: var(--scrim-strong);
13668
+ animation: tf-fade var(--dur-base) var(--ease-out) both;
13669
+ }
13670
+ }
13671
+
13672
+ @media (max-width: 760px) {
13673
+ .tf-navmenu-panel.with-feature {
13674
+ grid-template-columns: minmax(0, 1fr);
13675
+ }
13676
+ .tf-navmenu-feature {
13677
+ min-height: 0;
13678
+ }
13679
+ .tf-navmenu-list {
13680
+ flex-wrap: wrap;
13681
+ }
13682
+ .tf-menubar {
13683
+ flex-wrap: wrap;
13684
+ border-radius: var(--radius-lg);
13685
+ }
13686
+ }
13687
+
13688
+ /* Drawer (sheet) sides */
13689
+ .tf-drawer.side-left {
13690
+ right: auto;
13691
+ left: 0;
13692
+ animation-name: tf-sheet-left;
13693
+ }
13694
+ .tf-drawer.side-top,
13695
+ .tf-drawer.side-bottom {
13696
+ left: 0;
13697
+ right: 0;
13698
+ width: 100%;
13699
+ max-height: min(80%, 640px);
13700
+ }
13701
+ .tf-drawer.side-top {
13702
+ bottom: auto;
13703
+ animation-name: tf-sheet-top;
13704
+ }
13705
+ .tf-drawer.side-bottom {
13706
+ top: auto;
13707
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
13708
+ animation-name: tf-sheet-bottom;
13709
+ }
13710
+ @keyframes tf-sheet-left {
13711
+ from {
13712
+ opacity: 0;
13713
+ transform: translateX(calc(-24px * var(--motion-travel)));
13714
+ }
13715
+ }
13716
+ @keyframes tf-sheet-top {
12842
13717
  from {
12843
13718
  opacity: 0;
12844
13719
  transform: translateY(calc(-24px * var(--motion-travel)));
@@ -12977,7 +13852,7 @@ a.tf-iconbtn {
12977
13852
  /* Tablet: asides move below the main column, nav labels and the page nav shrink to icons */
12978
13853
  @container tf-shell (max-width: 1180px) {
12979
13854
  .tf-sheet:not(.tf-sheet-2):not(.tf-sheet-nav) {
12980
- grid-template-columns: 44px minmax(0, 1fr);
13855
+ grid-template-columns: auto minmax(0, 1fr);
12981
13856
  }
12982
13857
  .tf-sheet-nav.tf-sheet-aside {
12983
13858
  grid-template-columns: 208px minmax(0, 1fr);
@@ -12985,6 +13860,13 @@ a.tf-iconbtn {
12985
13860
  .tf-sheet > .tf-main ~ :not(.tf-dock-float) {
12986
13861
  grid-column: 2;
12987
13862
  }
13863
+ /* with the sidebar there is no rail column: asides go below the main column */
13864
+ .tf-sheet.tf-sheet-norail:not(.tf-sheet-2) {
13865
+ grid-template-columns: minmax(0, 1fr);
13866
+ }
13867
+ .tf-sheet-norail > .tf-main ~ :not(.tf-dock-float) {
13868
+ grid-column: 1;
13869
+ }
12988
13870
  /* the dock floats over the end of the sheet, not of the main column (asides follow it) */
12989
13871
  .tf-main-dock {
12990
13872
  padding-bottom: 0;
@@ -13015,7 +13897,7 @@ a.tf-iconbtn {
13015
13897
  @container tf-shell (max-width: 1040px) {
13016
13898
  .tf-sheet-nav,
13017
13899
  .tf-sheet-nav.tf-sheet-aside {
13018
- grid-template-columns: 44px minmax(0, 1fr);
13900
+ grid-template-columns: auto minmax(0, 1fr);
13019
13901
  }
13020
13902
  .tf-subnav-eyebrow {
13021
13903
  display: none;
@@ -13112,6 +13994,21 @@ a.tf-iconbtn {
13112
13994
  .tf-rail-group {
13113
13995
  flex-direction: row;
13114
13996
  }
13997
+ /* on phones the rail is a row of icons, expanded or not */
13998
+ .tf-rail.expanded {
13999
+ width: auto;
14000
+ }
14001
+ .tf-rail.expanded .tf-rail-btn {
14002
+ display: grid;
14003
+ width: 40px;
14004
+ padding: 0;
14005
+ }
14006
+ .tf-rail.expanded .tf-rail-label {
14007
+ display: none;
14008
+ }
14009
+ .tf-rail.expanded .tf-dotcount {
14010
+ position: absolute;
14011
+ }
13115
14012
  .tf-main {
13116
14013
  gap: var(--space-4);
13117
14014
  }
@@ -13203,6 +14100,56 @@ a.tf-iconbtn {
13203
14100
  max-width: 100%;
13204
14101
  overflow-x: auto;
13205
14102
  }
14103
+ /* Table stack: narrow boxes show every row as a card, each cell with its column label */
14104
+ .tf-table-stackbox {
14105
+ container: tf-table / inline-size;
14106
+ }
14107
+ @container tf-table (max-width: 600px) {
14108
+ .tf-table.stack thead {
14109
+ position: absolute;
14110
+ width: 1px;
14111
+ height: 1px;
14112
+ overflow: hidden;
14113
+ clip-path: inset(50%);
14114
+ }
14115
+ .tf-table.stack,
14116
+ .tf-table.stack tbody,
14117
+ .tf-table.stack tr {
14118
+ display: block;
14119
+ }
14120
+ .tf-table.stack tr {
14121
+ padding: 8px 0;
14122
+ border-bottom: 1px solid var(--line);
14123
+ }
14124
+ .tf-table.stack tr:last-child {
14125
+ border-bottom: 0;
14126
+ }
14127
+ .tf-table.stack td {
14128
+ display: flex;
14129
+ align-items: center;
14130
+ justify-content: space-between;
14131
+ gap: 16px;
14132
+ height: auto;
14133
+ min-height: var(--control-sm);
14134
+ padding: 4px 0;
14135
+ border-bottom: 0;
14136
+ text-align: right;
14137
+ white-space: normal;
14138
+ }
14139
+ .tf-table.stack td::before {
14140
+ content: attr(data-label);
14141
+ flex: none;
14142
+ max-width: 50%;
14143
+ text-align: left;
14144
+ font: 500 11px/14px var(--font-sans);
14145
+ letter-spacing: 0.06em;
14146
+ text-transform: uppercase;
14147
+ color: var(--ink-muted);
14148
+ }
14149
+ .tf-table.stack tbody tr:hover td {
14150
+ background: transparent;
14151
+ }
14152
+ }
13206
14153
 
13207
14154
  /* ── Phone: components ── */
13208
14155
  @media (max-width: 760px) {
@@ -13237,15 +14184,15 @@ a.tf-iconbtn {
13237
14184
  height: 52px;
13238
14185
  }
13239
14186
 
13240
- /* segmented controls and tabs scroll sideways when the labels do not fit */
13241
- .tf-seg,
13242
- .tf-tabs {
14187
+ /* segmented controls and tabs scroll sideways when the labels do not fit (block ones shrink) */
14188
+ .tf-seg:not(.block),
14189
+ .tf-tabs:not(.tf-tabs-block) {
13243
14190
  max-width: 100%;
13244
14191
  overflow-x: auto;
13245
14192
  scrollbar-width: none;
13246
14193
  }
13247
- .tf-seg-item,
13248
- .tf-tab {
14194
+ .tf-seg:not(.block) .tf-seg-item,
14195
+ .tf-tabs:not(.tf-tabs-block) .tf-tab {
13249
14196
  flex: none;
13250
14197
  }
13251
14198
  .tf-seg,
@@ -13394,6 +14341,71 @@ a.tf-iconbtn {
13394
14341
  }
13395
14342
  }
13396
14343
 
14344
+ /* AppShell with a sidebar on phones: the sidebar's bar on top of the frame, the sheet below */
14345
+ @media (max-width: 760px) {
14346
+ .tf-shell.tf-shell-sidebar {
14347
+ grid-template-columns: minmax(0, 1fr);
14348
+ padding: 0 8px 8px;
14349
+ }
14350
+ }
14351
+
14352
+ /* Fluid at every width: segmented controls, tabs and toggle groups never push past their
14353
+ container. When space runs short the items shrink and their labels end in an ellipsis. */
14354
+ .tf-tabs {
14355
+ max-width: 100%;
14356
+ box-sizing: border-box;
14357
+ }
14358
+ .tf-seg-item,
14359
+ .tf-tab,
14360
+ .tf-togglegroup .tf-toggle {
14361
+ min-width: 0;
14362
+ }
14363
+ .tf-seg-label,
14364
+ .tf-tab,
14365
+ .tf-toggle-label {
14366
+ overflow: hidden;
14367
+ text-overflow: ellipsis;
14368
+ white-space: nowrap;
14369
+ }
14370
+
14371
+ /* key hints mean nothing on touch screens */
14372
+ @media (pointer: coarse) {
14373
+ .tf-search .tf-kbd {
14374
+ display: none;
14375
+ }
14376
+ }
14377
+
14378
+ /* Fluid actions: an action row measures itself, so its buttons answer to the box it sits in (a
14379
+ thin card, a side panel, a phone) instead of the window. When the row is narrow it wraps and
14380
+ its buttons share the full width; when it is very narrow each button takes a line. The rows are
14381
+ the kit's own footers and action bars, and plain `.tf-row`s of buttons placed directly in a
14382
+ column box (panel, card, dialog, form …), where they always span the box. */
14383
+ :is(
14384
+ .tf-modal-foot,
14385
+ .tf-card-foot,
14386
+ .tf-approval-foot,
14387
+ .tf-review-actions,
14388
+ .tf-cookie-actions,
14389
+ .tf-push-actions,
14390
+ .tf-insight-actions,
14391
+ .tf-journal-foot,
14392
+ :is(.tf-panel, .tf-card, .tf-modal, .tf-drawer, .tf-popover, .tf-form, .tf-col)
14393
+ > .tf-row:not(:has(> :not(.tf-btn, .tf-iconbtn)))
14394
+ ) {
14395
+ container: tf-actions / inline-size;
14396
+ flex-wrap: wrap;
14397
+ }
14398
+ @container tf-actions (max-width: 400px) {
14399
+ .tf-btn {
14400
+ flex: 1 1 auto;
14401
+ }
14402
+ }
14403
+ @container tf-actions (max-width: 240px) {
14404
+ .tf-btn {
14405
+ flex-basis: 100%;
14406
+ }
14407
+ }
14408
+
13397
14409
  /* 07-polish.css */
13398
14410
  /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
13399
14411
  /* ───────────── Polish ─────────────
@@ -13604,10 +14616,17 @@ textarea.tf-input,
13604
14616
  .tf-card,
13605
14617
  .tf-stat,
13606
14618
  .tf-dock,
13607
- .tf-sidebar,
14619
+ .tf-sidebar:not(.shell),
13608
14620
  .tf-map-legend,
13609
14621
  .tf-map-ctl,
13610
- .tf-map-pop
14622
+ .tf-map-pop,
14623
+ .tf-vital,
14624
+ .tf-journal,
14625
+ .tf-goal,
14626
+ .tf-insight,
14627
+ .tf-consent-item,
14628
+ .tf-nw,
14629
+ .tf-policy
13611
14630
  ):not(
13612
14631
  :is(
13613
14632
  .tf-panel,
@@ -13623,6 +14642,13 @@ textarea.tf-input,
13623
14642
  .tf-palette,
13624
14643
  .tf-modal,
13625
14644
  .tf-drawer,
14645
+ .tf-vital,
14646
+ .tf-journal,
14647
+ .tf-goal,
14648
+ .tf-insight,
14649
+ .tf-consent-item,
14650
+ .tf-nw,
14651
+ .tf-policy,
13626
14652
  .tf-glass
13627
14653
  )
13628
14654
  *
@@ -13717,6 +14743,10 @@ textarea.tf-input,
13717
14743
  .tf-modal,
13718
14744
  .tf-drawer,
13719
14745
  .tf-glass,
14746
+ .tf-insight,
14747
+ .tf-policy,
14748
+ .tf-consent-item,
14749
+ .tf-journal,
13720
14750
  .tf-btngroup,
13721
14751
  .tf-map-ctl,
13722
14752
  .tf-topbar
@@ -13742,7 +14772,21 @@ textarea.tf-input,
13742
14772
  }
13743
14773
  [data-surface="glass"]
13744
14774
  :is(.tf-iconbtn-soft, .tf-iconbtn-outline, .tf-btn-secondary, .tf-chip):not(
13745
- :is(.tf-panel, .tf-card, .tf-dock, .tf-popover, .tf-menu, .tf-modal, .tf-drawer, .tf-glass) *
14775
+ :is(
14776
+ .tf-panel,
14777
+ .tf-card,
14778
+ .tf-dock,
14779
+ .tf-popover,
14780
+ .tf-menu,
14781
+ .tf-modal,
14782
+ .tf-drawer,
14783
+ .tf-insight,
14784
+ .tf-policy,
14785
+ .tf-consent-item,
14786
+ .tf-journal,
14787
+ .tf-glass
14788
+ )
14789
+ *
13746
14790
  ):not(.tf-solid):not([aria-pressed="true"]):hover {
13747
14791
  background:
13748
14792
  linear-gradient(var(--glass-hover), var(--glass-hover)) border-box,
@@ -13793,10 +14837,17 @@ textarea.tf-input,
13793
14837
  .tf-card,
13794
14838
  .tf-stat,
13795
14839
  .tf-dock,
13796
- .tf-sidebar,
14840
+ .tf-sidebar:not(.shell),
13797
14841
  .tf-map-legend,
13798
14842
  .tf-map-ctl,
13799
- .tf-map-pop
14843
+ .tf-map-pop,
14844
+ .tf-vital,
14845
+ .tf-journal,
14846
+ .tf-goal,
14847
+ .tf-insight,
14848
+ .tf-consent-item,
14849
+ .tf-nw,
14850
+ .tf-policy
13800
14851
  ) {
13801
14852
  outline: 1px solid CanvasText;
13802
14853
  outline-offset: -1px;
@@ -13825,11 +14876,13 @@ textarea.tf-input,
13825
14876
  inset: 0;
13826
14877
  z-index: 1;
13827
14878
  display: grid;
13828
- grid-template-columns: minmax(0, 320px) minmax(0, 1fr) minmax(0, 340px);
14879
+ grid-template-columns:
14880
+ minmax(0, var(--floating-start, 320px)) minmax(0, 1fr)
14881
+ minmax(0, var(--floating-end, 340px));
13829
14882
  grid-template-rows: auto minmax(0, 1fr) auto;
13830
14883
  grid-template-areas:
13831
14884
  "top top top"
13832
- "start . end"
14885
+ "start controls end"
13833
14886
  "bottom bottom bottom";
13834
14887
  gap: var(--space-4);
13835
14888
  padding: var(--space-4);
@@ -13860,6 +14913,32 @@ textarea.tf-input,
13860
14913
  grid-area: bottom;
13861
14914
  justify-self: center;
13862
14915
  }
14916
+ /* background controls and source notes: the free corner, clear of the panels and the dock */
14917
+ .tf-floating-ui > .tf-floating-controls {
14918
+ grid-area: controls;
14919
+ align-self: end;
14920
+ justify-self: end;
14921
+ display: flex;
14922
+ flex-direction: column;
14923
+ align-items: flex-end;
14924
+ gap: var(--space-2);
14925
+ pointer-events: none;
14926
+ }
14927
+ .tf-floating-controls > * {
14928
+ pointer-events: auto;
14929
+ }
14930
+ .tf-floating-attribution {
14931
+ max-width: 100%;
14932
+ padding: 2px 8px;
14933
+ border-radius: var(--radius-sm);
14934
+ background: var(--surface);
14935
+ color: var(--ink-muted);
14936
+ font: 500 11px/16px var(--font-sans);
14937
+ overflow-wrap: anywhere;
14938
+ }
14939
+ .tf-floating-handle {
14940
+ display: none;
14941
+ }
13863
14942
  .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) {
13864
14943
  pointer-events: none;
13865
14944
  }
@@ -13885,7 +14964,76 @@ textarea.tf-input,
13885
14964
  gap: var(--space-3);
13886
14965
  padding: var(--space-3);
13887
14966
  }
13888
- }
14967
+ .tf-floating-ui > .tf-floating-controls {
14968
+ grid-area: auto;
14969
+ grid-row: 3;
14970
+ }
14971
+ /* the end slot as a bottom sheet over the background: a peek, or most of the height */
14972
+ .tf-floating.has-sheet .tf-floating-ui {
14973
+ grid-template-rows: auto auto minmax(120px, 1fr) auto;
14974
+ grid-template-areas:
14975
+ "top"
14976
+ "start"
14977
+ "."
14978
+ "bottom";
14979
+ padding-bottom: calc(var(--space-3) + 96px);
14980
+ }
14981
+ .tf-floating.has-sheet .tf-floating-end {
14982
+ position: absolute;
14983
+ left: var(--space-3);
14984
+ right: var(--space-3);
14985
+ bottom: 0;
14986
+ z-index: 2;
14987
+ max-height: 96px;
14988
+ overflow: hidden;
14989
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
14990
+ background: var(--surface);
14991
+ box-shadow: 0 0 0 var(--line-width) var(--line);
14992
+ transition: max-height var(--dur-base) var(--ease-out);
14993
+ }
14994
+ [data-surface="glass"].tf-floating.has-sheet .tf-floating-end {
14995
+ background: var(--glass);
14996
+ -webkit-backdrop-filter: var(--glass-filter);
14997
+ backdrop-filter: var(--glass-filter);
14998
+ }
14999
+ .tf-floating.has-sheet.sheet-full .tf-floating-end {
15000
+ max-height: 75%;
15001
+ overflow-y: auto;
15002
+ }
15003
+ .tf-floating.has-sheet .tf-floating-handle {
15004
+ display: block;
15005
+ position: sticky;
15006
+ top: 0;
15007
+ z-index: 1;
15008
+ width: 100%;
15009
+ height: 24px;
15010
+ margin: 0;
15011
+ padding: 0;
15012
+ border: 0;
15013
+ background: transparent;
15014
+ cursor: pointer;
15015
+ }
15016
+ .tf-floating.has-sheet .tf-floating-handle::before {
15017
+ content: "";
15018
+ display: block;
15019
+ width: 40px;
15020
+ height: 4px;
15021
+ margin: 10px auto;
15022
+ border-radius: var(--radius-pill);
15023
+ background: var(--line-strong);
15024
+ }
15025
+ .tf-floating.has-sheet .tf-floating-handle:focus-visible {
15026
+ outline: 2px solid var(--focus);
15027
+ outline-offset: -2px;
15028
+ }
15029
+ }
15030
+
15031
+ /* in a glass layout the attribution is glass too */
15032
+ [data-surface="glass"] .tf-floating-attribution {
15033
+ background: var(--glass);
15034
+ -webkit-backdrop-filter: var(--glass-filter);
15035
+ backdrop-filter: var(--glass-filter);
15036
+ }
13889
15037
 
13890
15038
  /* 09-motion.css */
13891
15039
  /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
@@ -13915,183 +15063,1555 @@ textarea.tf-input,
13915
15063
  translate: calc(40px * var(--motion-travel)) 0;
13916
15064
  }
13917
15065
  }
13918
- @keyframes tf-out-left {
13919
- to {
13920
- opacity: 0;
13921
- translate: calc(-40px * var(--motion-travel)) 0;
13922
- }
15066
+ @keyframes tf-out-left {
15067
+ to {
15068
+ opacity: 0;
15069
+ translate: calc(-40px * var(--motion-travel)) 0;
15070
+ }
15071
+ }
15072
+ @keyframes tf-out-up {
15073
+ to {
15074
+ opacity: 0;
15075
+ translate: 0 calc(-40px * var(--motion-travel));
15076
+ }
15077
+ }
15078
+ @keyframes tf-out-down {
15079
+ to {
15080
+ opacity: 0;
15081
+ translate: 0 calc(16px * var(--motion-travel));
15082
+ }
15083
+ }
15084
+ [data-closing] {
15085
+ pointer-events: none;
15086
+ }
15087
+ .tf-popover[data-closing],
15088
+ .tf-hovercard[data-closing],
15089
+ .tf-modal-wrap[data-closing] .tf-modal,
15090
+ .tf-overlay[data-closing] :is(.tf-modal, .tf-confirm),
15091
+ .tf-palette-wrap[data-closing] .tf-palette {
15092
+ animation: tf-out var(--dur-exit) var(--ease-in-out) forwards;
15093
+ }
15094
+ .tf-tooltip[data-closing],
15095
+ .tf-modal-wrap[data-closing] .tf-backdrop,
15096
+ .tf-overlay[data-closing] .tf-backdrop,
15097
+ .tf-palette-wrap[data-closing],
15098
+ .tf-drawer-wrap[data-closing] {
15099
+ animation: tf-out-fade var(--dur-exit) var(--ease-in-out) forwards;
15100
+ }
15101
+ .tf-drawer-wrap[data-closing] .tf-drawer {
15102
+ animation: tf-out-right var(--dur-exit) var(--ease-in-out) forwards;
15103
+ }
15104
+ .tf-drawer-wrap[data-closing] .tf-drawer.side-left {
15105
+ animation-name: tf-out-left;
15106
+ }
15107
+ .tf-drawer-wrap[data-closing] .tf-drawer.side-top {
15108
+ animation-name: tf-out-up;
15109
+ }
15110
+ .tf-drawer-wrap[data-closing] .tf-drawer.side-bottom,
15111
+ .tf-toast[data-closing] {
15112
+ animation: tf-out-down var(--dur-exit) var(--ease-in-out) forwards;
15113
+ }
15114
+
15115
+ /* ── Reveal: a Stagger below the fold waits until it scrolls into view ── */
15116
+ .tf-stagger[data-reveal="waiting"] > *,
15117
+ .tf-stagger[data-reveal="waiting"] > * * {
15118
+ animation-play-state: paused;
15119
+ }
15120
+
15121
+ /* ── Page transitions (startViewTransition, Next.js and React view transitions) ── */
15122
+ @keyframes tf-vt-out {
15123
+ to {
15124
+ opacity: 0;
15125
+ translate: 0 calc(-6px * var(--motion-travel));
15126
+ }
15127
+ }
15128
+ @keyframes tf-vt-in {
15129
+ from {
15130
+ opacity: 0;
15131
+ translate: 0 calc(10px * var(--motion-travel));
15132
+ }
15133
+ }
15134
+ :root::view-transition-old(root) {
15135
+ animation: tf-vt-out var(--dur-base) var(--ease-in-out) both;
15136
+ }
15137
+ :root::view-transition-new(root) {
15138
+ animation: tf-vt-in var(--dur-enter) var(--ease-out) both;
15139
+ }
15140
+
15141
+ /* ── Expressive: things come into focus as they rise (Halo; Pro keeps a blur of 0) ── */
15142
+ @keyframes tf-focus-in {
15143
+ from {
15144
+ filter: blur(var(--motion-blur));
15145
+ }
15146
+ to {
15147
+ filter: none;
15148
+ }
15149
+ }
15150
+ [data-motion="expressive"] :is(.tf-stagger > *, .tf-in) {
15151
+ animation-name: tf-rise, tf-focus-in;
15152
+ }
15153
+ [data-motion="expressive"] .tf-topbar {
15154
+ animation-name: tf-drop, tf-focus-in;
15155
+ }
15156
+
15157
+ /* 10-ambient.css */
15158
+ /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
15159
+ /* Ambient: a calm, living background for glass UI. Soft colour fields from the kit (pastels in
15160
+ * Halo, a faint aurora in Pro) drift slowly; a photo or video can take their place under a scrim.
15161
+ * The drift only moves (transform), stops with motion off and pauses off screen.
15162
+ */
15163
+ :where(:has(> .tf-ambient:not(.fixed))) {
15164
+ position: relative;
15165
+ isolation: isolate;
15166
+ }
15167
+ .tf-ambient {
15168
+ position: absolute;
15169
+ inset: 0;
15170
+ z-index: -1;
15171
+ overflow: hidden;
15172
+ background: var(--ambient-base);
15173
+ pointer-events: none;
15174
+ }
15175
+ .tf-ambient.fixed {
15176
+ position: fixed;
15177
+ }
15178
+ .tf-ambient-field {
15179
+ position: absolute;
15180
+ width: 75%;
15181
+ aspect-ratio: 1;
15182
+ border-radius: var(--radius-1);
15183
+ background: radial-gradient(closest-side, var(--field), transparent);
15184
+ animation: tf-ambient-drift 34s var(--ease-in-out) infinite alternate;
15185
+ }
15186
+ .tf-ambient-field:nth-child(1) {
15187
+ top: -30%;
15188
+ left: -15%;
15189
+ }
15190
+ .tf-ambient-field:nth-child(2) {
15191
+ top: -10%;
15192
+ right: -25%;
15193
+ animation-duration: 41s;
15194
+ animation-direction: alternate-reverse;
15195
+ }
15196
+ .tf-ambient-field:nth-child(3) {
15197
+ bottom: -35%;
15198
+ left: 10%;
15199
+ animation-duration: 47s;
15200
+ }
15201
+ .tf-ambient-field:nth-child(4) {
15202
+ bottom: -25%;
15203
+ right: -10%;
15204
+ animation-duration: 38s;
15205
+ animation-direction: alternate-reverse;
15206
+ }
15207
+ .tf-ambient-field:nth-child(n + 5) {
15208
+ top: 20%;
15209
+ left: 30%;
15210
+ width: 55%;
15211
+ animation-duration: 52s;
15212
+ }
15213
+ @keyframes tf-ambient-drift {
15214
+ to {
15215
+ translate: 12% 9%;
15216
+ scale: 1.15;
15217
+ }
15218
+ }
15219
+ .tf-ambient.still .tf-ambient-field,
15220
+ .tf-ambient[data-paused] .tf-ambient-field {
15221
+ animation-play-state: paused;
15222
+ }
15223
+ .tf-ambient-media {
15224
+ position: absolute;
15225
+ inset: 0;
15226
+ width: 100%;
15227
+ height: 100%;
15228
+ object-fit: cover;
15229
+ }
15230
+ .tf-ambient.media::after {
15231
+ content: "";
15232
+ position: absolute;
15233
+ inset: 0;
15234
+ background: var(--ambient-scrim);
15235
+ }
15236
+ @media (prefers-reduced-motion: reduce) {
15237
+ .tf-ambient-field {
15238
+ animation: none;
15239
+ }
15240
+ }
15241
+ [data-motion="off"] .tf-ambient-field {
15242
+ animation: none;
15243
+ }
15244
+
15245
+ /* 11-life.css */
15246
+ /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
15247
+ /* Life: habits, mood, vitals, activity rings, sleep, medication, journal, goals, insights, consent */
15248
+
15249
+ /* HabitTracker */
15250
+ .tf-habits {
15251
+ container: tf-habits / inline-size;
15252
+ display: grid;
15253
+ gap: 4px;
15254
+ min-width: 0;
15255
+ }
15256
+ .tf-habit-days,
15257
+ .tf-habit-marks {
15258
+ display: grid;
15259
+ grid-auto-flow: column;
15260
+ grid-auto-columns: 24px;
15261
+ gap: 6px;
15262
+ }
15263
+ .tf-habit-days {
15264
+ justify-self: end;
15265
+ padding-right: 12px;
15266
+ font: 500 11px/16px var(--font-sans);
15267
+ color: var(--ink-muted);
15268
+ text-align: center;
15269
+ }
15270
+ .tf-habit {
15271
+ display: grid;
15272
+ grid-template-columns: auto minmax(0, 1fr) auto;
15273
+ align-items: center;
15274
+ gap: 12px;
15275
+ padding: 8px 12px;
15276
+ border-radius: var(--radius-md);
15277
+ }
15278
+ .tf-habit:hover {
15279
+ background: var(--surface-sunken);
15280
+ }
15281
+ .tf-habit-text {
15282
+ display: flex;
15283
+ flex-direction: column;
15284
+ min-width: 0;
15285
+ }
15286
+ .tf-habit-text b {
15287
+ overflow: hidden;
15288
+ text-overflow: ellipsis;
15289
+ white-space: nowrap;
15290
+ font: 500 14px/20px var(--font-sans);
15291
+ }
15292
+ .tf-habit-text small {
15293
+ display: flex;
15294
+ flex-wrap: wrap;
15295
+ gap: 4px 10px;
15296
+ font: 500 12px/16px var(--font-sans);
15297
+ color: var(--ink-muted);
15298
+ }
15299
+ .tf-habit-streak {
15300
+ display: inline-flex;
15301
+ align-items: center;
15302
+ gap: 4px;
15303
+ color: var(--butter-ink);
15304
+ }
15305
+ .tf-habit-mark {
15306
+ display: grid;
15307
+ place-items: center;
15308
+ width: 24px;
15309
+ height: 24px;
15310
+ box-sizing: border-box;
15311
+ padding: 0;
15312
+ border: 1.5px solid var(--line-strong);
15313
+ border-radius: var(--radius-1);
15314
+ background: transparent;
15315
+ color: var(--primary-foreground);
15316
+ }
15317
+ .tf-habit-mark.done {
15318
+ border-color: var(--mint-ink);
15319
+ background: var(--mint-ink);
15320
+ }
15321
+ /* missed: an empty ring with a small cross; no entry: a faint dashed ring */
15322
+ .tf-habit-mark.missed {
15323
+ color: var(--ink-subtle);
15324
+ }
15325
+ .tf-habit-mark:not(.done):not(.missed) {
15326
+ border-style: dashed;
15327
+ border-color: var(--line);
15328
+ }
15329
+ .tf-habit-mark.today {
15330
+ box-shadow:
15331
+ 0 0 0 2px var(--surface),
15332
+ 0 0 0 4px var(--line-strong);
15333
+ }
15334
+ /* narrow: the marks go under the name, the day labels line up with them */
15335
+ @container tf-habits (max-width: 400px) {
15336
+ .tf-habit {
15337
+ grid-template-columns: auto minmax(0, 1fr);
15338
+ row-gap: 8px;
15339
+ }
15340
+ .tf-habit-marks {
15341
+ grid-column: 1 / -1;
15342
+ }
15343
+ .tf-habit-days {
15344
+ justify-self: start;
15345
+ padding: 0 0 0 12px;
15346
+ }
15347
+ }
15348
+ @container tf-habits (max-width: 240px) {
15349
+ .tf-habit-days,
15350
+ .tf-habit-marks {
15351
+ gap: 2px;
15352
+ }
15353
+ }
15354
+ button.tf-habit-mark {
15355
+ cursor: pointer;
15356
+ }
15357
+ button.tf-habit-mark:focus-visible {
15358
+ outline: 2px solid var(--focus);
15359
+ outline-offset: 4px;
15360
+ }
15361
+
15362
+ /* MoodPicker */
15363
+ .tf-mood {
15364
+ min-width: 0;
15365
+ margin: 0;
15366
+ padding: 0;
15367
+ border: 0;
15368
+ }
15369
+ .tf-mood-q {
15370
+ padding: 0;
15371
+ margin-bottom: 12px;
15372
+ font: 500 14px/20px var(--font-sans);
15373
+ }
15374
+ .tf-mood-scale {
15375
+ container: tf-mood / inline-size;
15376
+ display: grid;
15377
+ grid-template-columns: repeat(5, minmax(0, 1fr));
15378
+ gap: 8px;
15379
+ }
15380
+ .tf-mood-opt {
15381
+ position: relative;
15382
+ display: flex;
15383
+ flex-direction: column;
15384
+ align-items: center;
15385
+ justify-content: center;
15386
+ gap: 4px;
15387
+ min-width: 0;
15388
+ min-height: 72px;
15389
+ padding: 8px 4px;
15390
+ box-sizing: border-box;
15391
+ border-radius: var(--radius-md);
15392
+ color: var(--ink-muted);
15393
+ font: 500 12px/16px var(--font-sans);
15394
+ cursor: pointer;
15395
+ }
15396
+ /* the picked level keeps the tint its tf-t-* class gives it */
15397
+ .tf-mood-opt:not(.on) {
15398
+ background: var(--surface-sunken);
15399
+ }
15400
+ .tf-mood.compact .tf-mood-opt {
15401
+ min-height: 48px;
15402
+ }
15403
+ .tf-mood-opt span {
15404
+ max-width: 100%;
15405
+ overflow: hidden;
15406
+ text-overflow: ellipsis;
15407
+ white-space: nowrap;
15408
+ }
15409
+ /* narrow: tighter cells so every word still fits */
15410
+ @container tf-mood (max-width: 300px) {
15411
+ .tf-mood-opt {
15412
+ padding: 8px 2px;
15413
+ font-size: 11px;
15414
+ }
15415
+ }
15416
+ .tf-mood-opt input {
15417
+ position: absolute;
15418
+ inset: 0;
15419
+ margin: 0;
15420
+ opacity: 0;
15421
+ cursor: pointer;
15422
+ }
15423
+ .tf-mood-opt:hover {
15424
+ color: var(--ink);
15425
+ }
15426
+ .tf-mood-opt.on {
15427
+ box-shadow: inset 0 0 0 2px currentColor;
15428
+ }
15429
+ .tf-mood-opt:has(input:focus-visible) {
15430
+ outline: 2px solid var(--focus);
15431
+ outline-offset: 2px;
15432
+ }
15433
+
15434
+ /* VitalTile */
15435
+ .tf-vital {
15436
+ display: flex;
15437
+ flex-direction: column;
15438
+ gap: 12px;
15439
+ min-width: 0;
15440
+ padding: 16px;
15441
+ border-radius: var(--radius-lg);
15442
+ background: var(--surface);
15443
+ box-shadow: 0 0 0 var(--line-width) var(--line);
15444
+ }
15445
+ .tf-vital-head {
15446
+ display: flex;
15447
+ align-items: center;
15448
+ justify-content: space-between;
15449
+ gap: 8px;
15450
+ }
15451
+ .tf-vital-head .tf-badge {
15452
+ flex: none;
15453
+ white-space: nowrap;
15454
+ }
15455
+ .tf-vital-label {
15456
+ display: inline-flex;
15457
+ align-items: center;
15458
+ gap: 6px;
15459
+ min-width: 0;
15460
+ font: 500 13px/18px var(--font-sans);
15461
+ color: var(--ink-muted);
15462
+ }
15463
+ .tf-vital-main {
15464
+ display: flex;
15465
+ align-items: flex-end;
15466
+ justify-content: space-between;
15467
+ gap: 12px;
15468
+ }
15469
+ .tf-vital-value {
15470
+ font: 600 22px/28px var(--font-sans);
15471
+ letter-spacing: -0.02em;
15472
+ font-variant-numeric: tabular-nums;
15473
+ }
15474
+ .tf-vital-value small {
15475
+ margin-left: 4px;
15476
+ font: 500 13px/18px var(--font-sans);
15477
+ letter-spacing: 0;
15478
+ color: var(--ink-muted);
15479
+ }
15480
+ .tf-vital-band {
15481
+ position: relative;
15482
+ height: 8px;
15483
+ border-radius: var(--radius-pill);
15484
+ background: var(--surface-sunken);
15485
+ }
15486
+ .tf-vital-normal {
15487
+ position: absolute;
15488
+ top: 0;
15489
+ bottom: 0;
15490
+ border-radius: var(--radius-pill);
15491
+ background: var(--mint);
15492
+ }
15493
+ .tf-vital-dot {
15494
+ position: absolute;
15495
+ top: 50%;
15496
+ width: 14px;
15497
+ height: 14px;
15498
+ box-sizing: border-box;
15499
+ border: 3px solid var(--surface);
15500
+ border-radius: var(--radius-full);
15501
+ background: var(--mint-ink);
15502
+ translate: -50% -50%;
15503
+ }
15504
+ .tf-vital.is-low .tf-vital-dot,
15505
+ .tf-vital.is-high .tf-vital-dot {
15506
+ background: var(--butter-ink);
15507
+ }
15508
+ .tf-vital-foot {
15509
+ display: flex;
15510
+ flex-wrap: wrap;
15511
+ justify-content: space-between;
15512
+ gap: 4px 12px;
15513
+ font: 500 12px/16px var(--font-sans);
15514
+ color: var(--ink-muted);
15515
+ }
15516
+
15517
+ /* ActivityRings */
15518
+ .tf-rings {
15519
+ display: flex;
15520
+ flex-wrap: wrap;
15521
+ align-items: center;
15522
+ gap: 20px;
15523
+ min-width: 0;
15524
+ }
15525
+ .tf-rings svg {
15526
+ flex: none;
15527
+ }
15528
+ .tf-rings-legend {
15529
+ display: flex;
15530
+ flex-direction: column;
15531
+ gap: 8px;
15532
+ min-width: 0;
15533
+ margin: 0;
15534
+ padding: 0;
15535
+ list-style: none;
15536
+ }
15537
+ .tf-rings-legend li {
15538
+ display: grid;
15539
+ grid-template-columns: auto minmax(0, 1fr);
15540
+ align-items: center;
15541
+ column-gap: 8px;
15542
+ }
15543
+ .tf-rings-key {
15544
+ width: 10px;
15545
+ height: 10px;
15546
+ border-radius: var(--radius-1);
15547
+ }
15548
+ .tf-rings-name {
15549
+ font: 500 12px/16px var(--font-sans);
15550
+ color: var(--ink-muted);
15551
+ }
15552
+ .tf-rings-legend b {
15553
+ grid-column: 2;
15554
+ font: 600 14px/20px var(--font-sans);
15555
+ font-variant-numeric: tabular-nums;
15556
+ }
15557
+
15558
+ /* SleepChart */
15559
+ .tf-sleep {
15560
+ display: flex;
15561
+ flex-direction: column;
15562
+ gap: 16px;
15563
+ min-width: 0;
15564
+ }
15565
+ .tf-sleep-chart {
15566
+ display: flex;
15567
+ flex-direction: column;
15568
+ gap: 6px;
15569
+ }
15570
+ .tf-sleep-lane {
15571
+ display: grid;
15572
+ grid-template-columns: 52px minmax(0, 1fr);
15573
+ align-items: center;
15574
+ gap: 12px;
15575
+ }
15576
+ .tf-sleep-name {
15577
+ font: 500 12px/16px var(--font-sans);
15578
+ color: var(--ink-muted);
15579
+ }
15580
+ .tf-sleep-track {
15581
+ position: relative;
15582
+ height: 20px;
15583
+ border-radius: var(--radius-sm);
15584
+ background: var(--surface-sunken);
15585
+ }
15586
+ .tf-sleep-seg {
15587
+ position: absolute;
15588
+ top: 2px;
15589
+ bottom: 2px;
15590
+ min-width: 2px;
15591
+ border-radius: var(--radius-sm);
15592
+ }
15593
+ .tf-sleep-axis {
15594
+ display: flex;
15595
+ justify-content: space-between;
15596
+ margin-left: 64px;
15597
+ font: 500 11px/16px var(--font-sans);
15598
+ color: var(--ink-muted);
15599
+ font-variant-numeric: tabular-nums;
15600
+ }
15601
+ .tf-sleep-sum {
15602
+ display: flex;
15603
+ flex-wrap: wrap;
15604
+ align-items: center;
15605
+ justify-content: space-between;
15606
+ gap: 8px 16px;
15607
+ }
15608
+ .tf-sleep-sum b {
15609
+ font: 600 14px/20px var(--font-sans);
15610
+ }
15611
+ .tf-sleep-sum ul {
15612
+ display: flex;
15613
+ flex-wrap: wrap;
15614
+ gap: 4px 14px;
15615
+ margin: 0;
15616
+ padding: 0;
15617
+ list-style: none;
15618
+ }
15619
+ .tf-sleep-sum li {
15620
+ display: inline-flex;
15621
+ align-items: center;
15622
+ gap: 6px;
15623
+ font: 500 12px/16px var(--font-sans);
15624
+ color: var(--ink-muted);
15625
+ }
15626
+ .tf-sleep-sum li span:last-child {
15627
+ color: var(--ink);
15628
+ font-weight: 500;
15629
+ font-variant-numeric: tabular-nums;
15630
+ }
15631
+
15632
+ /* MedicationList */
15633
+ .tf-meds {
15634
+ container: tf-meds / inline-size;
15635
+ display: flex;
15636
+ flex-direction: column;
15637
+ gap: 4px;
15638
+ min-width: 0;
15639
+ margin: 0;
15640
+ padding: 0;
15641
+ list-style: none;
15642
+ }
15643
+ .tf-med {
15644
+ display: grid;
15645
+ grid-template-columns: 48px auto minmax(0, 1fr) auto;
15646
+ align-items: center;
15647
+ gap: 12px;
15648
+ padding: 8px 12px;
15649
+ border-radius: var(--radius-md);
15650
+ }
15651
+ .tf-med.is-due {
15652
+ background: var(--surface-sunken);
15653
+ }
15654
+ .tf-med-time {
15655
+ font: 500 13px/18px var(--font-sans);
15656
+ font-variant-numeric: tabular-nums;
15657
+ color: var(--ink-muted);
15658
+ }
15659
+ .tf-med-text {
15660
+ display: flex;
15661
+ flex-direction: column;
15662
+ min-width: 0;
15663
+ }
15664
+ .tf-med-text b {
15665
+ font: 500 14px/20px var(--font-sans);
15666
+ overflow-wrap: break-word;
15667
+ }
15668
+ .tf-med-text small {
15669
+ font: 500 12px/16px var(--font-sans);
15670
+ color: var(--ink-muted);
15671
+ }
15672
+ .tf-med.is-taken .tf-med-text b {
15673
+ color: var(--ink-muted);
15674
+ }
15675
+ .tf-med-act {
15676
+ display: inline-flex;
15677
+ align-items: center;
15678
+ gap: 8px;
15679
+ }
15680
+ /* narrow: time, name and status; the icon gives way */
15681
+ @container tf-meds (max-width: 400px) {
15682
+ .tf-med {
15683
+ grid-template-columns: 44px minmax(0, 1fr) auto;
15684
+ gap: 8px;
15685
+ padding: 8px;
15686
+ }
15687
+ .tf-med > .tf-tinticon {
15688
+ display: none;
15689
+ }
15690
+ }
15691
+
15692
+ /* JournalEntry */
15693
+ .tf-journal {
15694
+ display: flex;
15695
+ flex-direction: column;
15696
+ gap: 8px;
15697
+ min-width: 0;
15698
+ padding: 20px;
15699
+ border-radius: var(--radius-lg);
15700
+ background: var(--surface);
15701
+ box-shadow: 0 0 0 var(--line-width) var(--line);
15702
+ }
15703
+ .tf-journal-head {
15704
+ display: flex;
15705
+ flex-wrap: wrap;
15706
+ align-items: center;
15707
+ justify-content: space-between;
15708
+ gap: 8px;
15709
+ font: 500 12px/16px var(--font-sans);
15710
+ color: var(--ink-muted);
15711
+ }
15712
+ .tf-journal-mood {
15713
+ display: inline-flex;
15714
+ align-items: center;
15715
+ gap: 4px;
15716
+ padding: 2px 8px;
15717
+ border-radius: var(--radius-pill);
15718
+ }
15719
+ .tf-journal-title {
15720
+ margin: 0;
15721
+ font: 600 14px/20px var(--font-sans);
15722
+ }
15723
+ .tf-journal-body {
15724
+ font: 500 14px/20px var(--font-sans);
15725
+ color: var(--ink);
15726
+ overflow-wrap: anywhere;
15727
+ }
15728
+ .tf-journal-body p {
15729
+ margin: 0 0 8px;
15730
+ }
15731
+ .tf-journal-foot {
15732
+ display: flex;
15733
+ flex-wrap: wrap;
15734
+ align-items: center;
15735
+ justify-content: space-between;
15736
+ gap: 8px;
15737
+ padding-top: 4px;
15738
+ }
15739
+ .tf-journal-tags {
15740
+ display: flex;
15741
+ flex-wrap: wrap;
15742
+ gap: 6px;
15743
+ }
15744
+
15745
+ /* GoalCard */
15746
+ .tf-goal {
15747
+ display: flex;
15748
+ flex-direction: column;
15749
+ gap: 12px;
15750
+ min-width: 0;
15751
+ padding: 20px;
15752
+ border-radius: var(--radius-lg);
15753
+ background: var(--surface);
15754
+ box-shadow: 0 0 0 var(--line-width) var(--line);
15755
+ }
15756
+ /* narrow: the icon steps aside so the title keeps whole words */
15757
+ @container tf-goal (max-width: 280px) {
15758
+ .tf-goal-head > .tf-tinticon {
15759
+ display: none;
15760
+ }
15761
+ }
15762
+ .tf-goal-head {
15763
+ container: tf-goal / inline-size;
15764
+ display: flex;
15765
+ align-items: center;
15766
+ gap: 12px;
15767
+ }
15768
+ .tf-goal-head .tf-option-text {
15769
+ flex: 1;
15770
+ padding: 0;
15771
+ }
15772
+ .tf-goal-head b {
15773
+ font: 600 14px/20px var(--font-sans);
15774
+ }
15775
+ .tf-goal-pct {
15776
+ font: 600 18px/24px var(--font-sans);
15777
+ font-variant-numeric: tabular-nums;
15778
+ }
15779
+ .tf-goal-bar {
15780
+ height: 10px;
15781
+ overflow: hidden;
15782
+ border-radius: var(--radius-pill);
15783
+ background: var(--surface-sunken);
15784
+ }
15785
+ .tf-goal-bar > span {
15786
+ display: block;
15787
+ height: 100%;
15788
+ border-radius: var(--radius-pill);
15789
+ }
15790
+ .tf-goal-meta,
15791
+ .tf-goal-note {
15792
+ margin: 0;
15793
+ font: 500 12px/16px var(--font-sans);
15794
+ color: var(--ink-muted);
15795
+ }
15796
+ .tf-goal-steps {
15797
+ display: flex;
15798
+ flex-direction: column;
15799
+ gap: 6px;
15800
+ margin: 0;
15801
+ padding: 0;
15802
+ list-style: none;
15803
+ font: 500 13px/18px var(--font-sans);
15804
+ }
15805
+ .tf-goal-steps li {
15806
+ display: flex;
15807
+ align-items: center;
15808
+ gap: 8px;
15809
+ }
15810
+ .tf-goal-steps li.done {
15811
+ color: var(--ink-muted);
15812
+ }
15813
+ .tf-goal-step {
15814
+ display: grid;
15815
+ place-items: center;
15816
+ flex: none;
15817
+ width: 16px;
15818
+ height: 16px;
15819
+ box-sizing: border-box;
15820
+ border: 1.5px solid var(--line-strong);
15821
+ border-radius: var(--radius-1);
15822
+ color: var(--primary-foreground);
15823
+ }
15824
+ .tf-goal-steps li.done .tf-goal-step {
15825
+ border-color: var(--primary);
15826
+ background: var(--primary);
15827
+ }
15828
+
15829
+ /* InsightCard */
15830
+ .tf-insight {
15831
+ display: flex;
15832
+ flex-direction: column;
15833
+ gap: 12px;
15834
+ min-width: 0;
15835
+ padding: 16px 16px 16px 20px;
15836
+ border-radius: var(--radius-lg);
15837
+ background: var(--surface);
15838
+ box-shadow:
15839
+ 0 0 0 var(--line-width) var(--line),
15840
+ inset 3px 0 0 var(--sky-ink);
15841
+ /* on glass the card takes a faint wash of its tone */
15842
+ --tint: var(--sky);
15843
+ }
15844
+ .tf-insight.is-success {
15845
+ --tint: var(--mint);
15846
+ box-shadow:
15847
+ 0 0 0 var(--line-width) var(--line),
15848
+ inset 3px 0 0 var(--mint-ink);
15849
+ }
15850
+ .tf-insight.is-warning {
15851
+ --tint: var(--butter);
15852
+ box-shadow:
15853
+ 0 0 0 var(--line-width) var(--line),
15854
+ inset 3px 0 0 var(--butter-ink);
15855
+ }
15856
+ .tf-insight.is-highlight {
15857
+ --tint: var(--lilac);
15858
+ box-shadow:
15859
+ 0 0 0 var(--line-width) var(--line),
15860
+ inset 3px 0 0 var(--lilac-ink);
15861
+ }
15862
+ .tf-insight-head {
15863
+ display: flex;
15864
+ align-items: flex-start;
15865
+ gap: 12px;
15866
+ }
15867
+ .tf-insight-titles {
15868
+ display: flex;
15869
+ flex: 1;
15870
+ flex-direction: column;
15871
+ min-width: 0;
15872
+ }
15873
+ .tf-insight-titles small {
15874
+ font: 500 12px/16px var(--font-sans);
15875
+ color: var(--ink-muted);
15876
+ }
15877
+ .tf-insight-titles b {
15878
+ font: 600 15px/20px var(--font-sans);
15879
+ overflow-wrap: anywhere;
15880
+ }
15881
+ .tf-insight-body {
15882
+ font: 500 14px/20px var(--font-sans);
15883
+ color: var(--ink);
15884
+ }
15885
+ .tf-insight-why button {
15886
+ display: inline-flex;
15887
+ align-items: center;
15888
+ gap: 6px;
15889
+ min-height: 24px;
15890
+ padding: 0;
15891
+ border: 0;
15892
+ background: none;
15893
+ color: var(--ink-muted);
15894
+ font: 500 12px/16px var(--font-sans);
15895
+ cursor: pointer;
15896
+ }
15897
+ .tf-insight-why button:hover {
15898
+ color: var(--ink);
15899
+ }
15900
+ .tf-insight-why button:focus-visible {
15901
+ outline: 2px solid var(--focus);
15902
+ outline-offset: 2px;
15903
+ border-radius: var(--radius-sm);
15904
+ }
15905
+ .tf-insight-why button[aria-expanded="true"] .tf-insight-chev {
15906
+ rotate: 180deg;
15907
+ }
15908
+ .tf-insight-whytext {
15909
+ margin-top: 8px;
15910
+ padding: 12px;
15911
+ border-radius: var(--radius-md);
15912
+ background: var(--surface-sunken);
15913
+ font: 500 13px/18px var(--font-sans);
15914
+ color: var(--ink-muted);
15915
+ }
15916
+ .tf-insight-actions {
15917
+ display: flex;
15918
+ flex-wrap: wrap;
15919
+ justify-content: flex-end;
15920
+ gap: 8px;
15921
+ }
15922
+
15923
+ /* ConsentList */
15924
+ .tf-consent {
15925
+ display: flex;
15926
+ flex-direction: column;
15927
+ gap: 12px;
15928
+ min-width: 0;
15929
+ }
15930
+ .tf-consent-item {
15931
+ display: flex;
15932
+ flex-direction: column;
15933
+ gap: 12px;
15934
+ padding: 16px;
15935
+ border-radius: var(--radius-lg);
15936
+ background: var(--surface);
15937
+ box-shadow: 0 0 0 var(--line-width) var(--line);
15938
+ }
15939
+ .tf-consent-head {
15940
+ display: flex;
15941
+ flex-wrap: wrap;
15942
+ align-items: center;
15943
+ gap: 12px;
15944
+ }
15945
+ .tf-consent-head .tf-option-text {
15946
+ flex: 1;
15947
+ min-width: 140px;
15948
+ padding: 0;
15949
+ }
15950
+ .tf-consent-purpose {
15951
+ margin: 0;
15952
+ font: 500 13px/18px var(--font-sans);
15953
+ color: var(--ink-muted);
15954
+ }
15955
+ .tf-consent-scopes {
15956
+ display: flex;
15957
+ flex-direction: column;
15958
+ margin: 0;
15959
+ padding: 0;
15960
+ list-style: none;
15961
+ }
15962
+ .tf-consent-scopes li {
15963
+ display: flex;
15964
+ align-items: center;
15965
+ justify-content: space-between;
15966
+ gap: 12px;
15967
+ padding: 10px 0;
15968
+ border-top: 1px solid var(--line);
15969
+ }
15970
+ .tf-consent-scopes .tf-option-text {
15971
+ min-width: 0;
15972
+ padding: 0;
15973
+ }
15974
+ .tf-consent-req {
15975
+ flex: none;
15976
+ font: 500 12px/16px var(--font-sans);
15977
+ color: var(--ink-muted);
15978
+ }
15979
+
15980
+ /* 12-household.css */
15981
+ /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
15982
+ /* Life: budgets, subscriptions, net worth, deadlines, policies, coverage, claims, documents */
15983
+
15984
+ /* BudgetList */
15985
+ .tf-budgets,
15986
+ .tf-subs ul,
15987
+ .tf-deadlines,
15988
+ .tf-docs,
15989
+ .tf-claim-steps,
15990
+ .tf-nw-side ul {
15991
+ margin: 0;
15992
+ padding: 0;
15993
+ list-style: none;
15994
+ }
15995
+ .tf-budgets {
15996
+ display: flex;
15997
+ flex-direction: column;
15998
+ gap: 4px;
15999
+ min-width: 0;
16000
+ }
16001
+ .tf-budget {
16002
+ container: tf-budget / inline-size;
16003
+ display: flex;
16004
+ align-items: center;
16005
+ gap: 12px;
16006
+ width: 100%;
16007
+ padding: 10px 12px;
16008
+ box-sizing: border-box;
16009
+ border: 0;
16010
+ border-radius: var(--radius-md);
16011
+ background: transparent;
16012
+ color: var(--ink);
16013
+ font: inherit;
16014
+ text-align: left;
16015
+ }
16016
+ button.tf-budget {
16017
+ cursor: pointer;
16018
+ }
16019
+ button.tf-budget:hover {
16020
+ background: var(--accent);
16021
+ }
16022
+ button.tf-budget:focus-visible {
16023
+ outline: 2px solid var(--focus);
16024
+ outline-offset: 2px;
16025
+ }
16026
+ .tf-budget-main {
16027
+ display: flex;
16028
+ flex: 1;
16029
+ flex-direction: column;
16030
+ gap: 6px;
16031
+ min-width: 0;
16032
+ }
16033
+ .tf-budget-top {
16034
+ display: flex;
16035
+ flex-wrap: wrap;
16036
+ align-items: baseline;
16037
+ justify-content: space-between;
16038
+ gap: 0 12px;
16039
+ }
16040
+ /* narrow: the icon steps aside so the category keeps its name */
16041
+ @container tf-budget (max-width: 300px) {
16042
+ .tf-budget > .tf-tinticon {
16043
+ display: none;
16044
+ }
16045
+ }
16046
+ .tf-budget-top b {
16047
+ min-width: 0;
16048
+ overflow: hidden;
16049
+ text-overflow: ellipsis;
16050
+ white-space: nowrap;
16051
+ font: 500 14px/20px var(--font-sans);
16052
+ }
16053
+ .tf-budget-nums {
16054
+ flex: none;
16055
+ font: 600 13px/18px var(--font-sans);
16056
+ font-variant-numeric: tabular-nums;
16057
+ }
16058
+ .tf-budget-nums small {
16059
+ font-weight: 500;
16060
+ color: var(--ink-muted);
16061
+ }
16062
+ .tf-budget-bar {
16063
+ display: block;
16064
+ height: 8px;
16065
+ overflow: hidden;
16066
+ border-radius: var(--radius-pill);
16067
+ background: var(--surface-sunken);
16068
+ }
16069
+ .tf-budget-bar > span {
16070
+ display: block;
16071
+ height: 100%;
16072
+ border-radius: var(--radius-pill);
16073
+ }
16074
+ .tf-budget-left {
16075
+ font: 500 12px/16px var(--font-sans);
16076
+ color: var(--ink-muted);
16077
+ }
16078
+ .tf-budget-left.over {
16079
+ color: var(--blush-ink);
16080
+ font-weight: 500;
16081
+ }
16082
+
16083
+ /* SubscriptionList */
16084
+ .tf-subs {
16085
+ display: flex;
16086
+ flex-direction: column;
16087
+ gap: 8px;
16088
+ min-width: 0;
16089
+ }
16090
+ .tf-subs ul {
16091
+ container: tf-subs / inline-size;
16092
+ display: flex;
16093
+ flex-direction: column;
16094
+ }
16095
+ .tf-sub {
16096
+ display: flex;
16097
+ align-items: center;
16098
+ gap: 12px;
16099
+ padding: 10px 4px;
16100
+ border-bottom: 1px solid var(--line);
16101
+ }
16102
+ .tf-sub:last-child {
16103
+ border-bottom: 0;
16104
+ }
16105
+ .tf-sub-text {
16106
+ display: flex;
16107
+ flex: 1;
16108
+ flex-direction: column;
16109
+ min-width: 0;
16110
+ }
16111
+ .tf-sub-text b {
16112
+ overflow: hidden;
16113
+ text-overflow: ellipsis;
16114
+ white-space: nowrap;
16115
+ font: 500 14px/20px var(--font-sans);
16116
+ }
16117
+ .tf-sub-text small {
16118
+ font: 500 12px/16px var(--font-sans);
16119
+ color: var(--ink-muted);
16120
+ }
16121
+ .tf-sub-amount {
16122
+ flex: none;
16123
+ font: 600 14px/20px var(--font-sans);
16124
+ font-variant-numeric: tabular-nums;
16125
+ text-align: right;
16126
+ }
16127
+ .tf-sub-amount small {
16128
+ margin-left: 2px;
16129
+ font-weight: 500;
16130
+ color: var(--ink-muted);
16131
+ }
16132
+ /* narrow: amount and trial badge go under the name, the menu stays at the end */
16133
+ @container tf-subs (max-width: 380px) {
16134
+ .tf-sub {
16135
+ display: grid;
16136
+ grid-template-columns: auto minmax(0, 1fr) auto;
16137
+ gap: 4px 12px;
16138
+ align-items: center;
16139
+ }
16140
+ .tf-sub > :first-child {
16141
+ grid-row: 1 / span 2;
16142
+ align-self: start;
16143
+ }
16144
+ .tf-sub > .tf-sub-text,
16145
+ .tf-sub > .tf-badge,
16146
+ .tf-sub > .tf-sub-amount {
16147
+ grid-column: 2;
16148
+ justify-self: start;
16149
+ text-align: left;
16150
+ }
16151
+ .tf-sub > :last-child:not(.tf-sub-amount) {
16152
+ grid-column: 3;
16153
+ grid-row: 1;
16154
+ }
16155
+ }
16156
+ .tf-sub.is-cancelled .tf-sub-text b,
16157
+ .tf-sub.is-cancelled .tf-sub-amount {
16158
+ color: var(--ink-muted);
16159
+ text-decoration: line-through;
16160
+ }
16161
+ .tf-subs-total {
16162
+ display: flex;
16163
+ flex-wrap: wrap;
16164
+ align-items: baseline;
16165
+ justify-content: space-between;
16166
+ gap: 4px 12px;
16167
+ padding: 12px;
16168
+ border-radius: var(--radius-md);
16169
+ background: var(--surface-sunken);
16170
+ font: 500 13px/18px var(--font-sans);
16171
+ color: var(--ink-muted);
16172
+ }
16173
+ .tf-subs-total b {
16174
+ color: var(--ink);
16175
+ font: 600 15px/20px var(--font-sans);
16176
+ }
16177
+
16178
+ /* NetWorthCard */
16179
+ .tf-nw {
16180
+ display: flex;
16181
+ flex-direction: column;
16182
+ gap: 16px;
16183
+ min-width: 0;
16184
+ padding: 20px;
16185
+ border-radius: var(--radius-lg);
16186
+ background: var(--surface);
16187
+ box-shadow: 0 0 0 var(--line-width) var(--line);
16188
+ }
16189
+ .tf-nw-head {
16190
+ display: flex;
16191
+ flex-wrap: wrap;
16192
+ align-items: flex-end;
16193
+ justify-content: space-between;
16194
+ gap: 12px;
16195
+ }
16196
+ .tf-nw-head > :first-child {
16197
+ flex: 1 1 200px;
16198
+ }
16199
+ .tf-nw-head > :last-child:not(:first-child) {
16200
+ flex: none;
16201
+ max-width: 45%;
16202
+ }
16203
+ .tf-nw-title {
16204
+ font: 500 13px/18px var(--font-sans);
16205
+ color: var(--ink-muted);
16206
+ }
16207
+ .tf-nw-total {
16208
+ font: 600 24px/38px var(--font-sans);
16209
+ letter-spacing: -0.02em;
16210
+ font-variant-numeric: tabular-nums;
16211
+ }
16212
+ .tf-nw-change {
16213
+ display: inline-flex;
16214
+ align-items: center;
16215
+ gap: 4px;
16216
+ font: 500 12px/16px var(--font-sans);
16217
+ color: var(--mint-ink);
16218
+ }
16219
+ .tf-nw-change.down {
16220
+ color: var(--blush-ink);
16221
+ }
16222
+ .tf-nw-change.down .tf-ico {
16223
+ rotate: 180deg;
16224
+ }
16225
+ .tf-nw-change span {
16226
+ font-weight: 500;
16227
+ color: var(--ink-muted);
16228
+ }
16229
+ .tf-nw-sides {
16230
+ display: grid;
16231
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
16232
+ gap: 16px;
16233
+ }
16234
+ .tf-nw-side {
16235
+ display: flex;
16236
+ flex-direction: column;
16237
+ gap: 8px;
16238
+ min-width: 0;
16239
+ }
16240
+ .tf-nw-sidehead {
16241
+ display: flex;
16242
+ justify-content: space-between;
16243
+ gap: 8px;
16244
+ padding-bottom: 8px;
16245
+ border-bottom: 1px solid var(--line);
16246
+ font: 500 12px/16px var(--font-sans);
16247
+ color: var(--ink-muted);
16248
+ }
16249
+ .tf-nw-sidehead b {
16250
+ color: var(--ink);
16251
+ font-variant-numeric: tabular-nums;
16252
+ }
16253
+ .tf-nw-side li {
16254
+ display: flex;
16255
+ justify-content: space-between;
16256
+ gap: 8px;
16257
+ padding: 4px 0;
16258
+ font: 500 13px/18px var(--font-sans);
16259
+ }
16260
+ .tf-nw-side li span:first-child {
16261
+ display: inline-flex;
16262
+ align-items: center;
16263
+ gap: 6px;
16264
+ min-width: 0;
16265
+ color: var(--ink-muted);
16266
+ }
16267
+ .tf-nw-side li span:last-child {
16268
+ font-variant-numeric: tabular-nums;
16269
+ }
16270
+
16271
+ /* DeadlineList */
16272
+ .tf-deadlines {
16273
+ display: flex;
16274
+ flex-direction: column;
16275
+ gap: 4px;
16276
+ min-width: 0;
16277
+ }
16278
+ .tf-deadline {
16279
+ display: flex;
16280
+ flex-wrap: wrap;
16281
+ align-items: center;
16282
+ gap: 8px 12px;
16283
+ padding: 8px 12px;
16284
+ border-radius: var(--radius-md);
16285
+ }
16286
+ .tf-deadline.is-overdue {
16287
+ background: var(--blush);
16288
+ }
16289
+ .tf-deadline.is-soon {
16290
+ background: var(--surface-sunken);
16291
+ }
16292
+ .tf-deadline-date {
16293
+ display: flex;
16294
+ flex: none;
16295
+ flex-direction: column;
16296
+ align-items: center;
16297
+ width: 40px;
16298
+ padding: 4px 0;
16299
+ border-radius: var(--radius-sm);
16300
+ background: var(--surface);
16301
+ box-shadow: inset 0 0 0 1px var(--line);
16302
+ }
16303
+ .tf-deadline-date b {
16304
+ font: 600 14px/20px var(--font-sans);
16305
+ font-variant-numeric: tabular-nums;
16306
+ }
16307
+ .tf-deadline-date small {
16308
+ font: 500 10px/12px var(--font-sans);
16309
+ text-transform: uppercase;
16310
+ color: var(--ink-muted);
16311
+ }
16312
+ .tf-deadline-text {
16313
+ display: flex;
16314
+ flex: 1 1 160px;
16315
+ flex-direction: column;
16316
+ min-width: 0;
16317
+ }
16318
+ .tf-deadline-text b {
16319
+ font: 500 14px/20px var(--font-sans);
16320
+ overflow-wrap: break-word;
16321
+ }
16322
+ .tf-deadline-text small {
16323
+ font: 500 12px/16px var(--font-sans);
16324
+ color: var(--ink-muted);
16325
+ }
16326
+ .tf-deadline-amount {
16327
+ font: 600 13px/18px var(--font-sans);
16328
+ font-variant-numeric: tabular-nums;
16329
+ }
16330
+ .tf-deadline.is-done .tf-deadline-text b {
16331
+ color: var(--ink-muted);
16332
+ text-decoration: line-through;
16333
+ }
16334
+ .tf-deadline-done {
16335
+ color: var(--mint-ink);
16336
+ }
16337
+
16338
+ /* PolicyCard */
16339
+ .tf-policy {
16340
+ display: flex;
16341
+ flex-direction: column;
16342
+ gap: 16px;
16343
+ min-width: 0;
16344
+ padding: 20px;
16345
+ border-radius: var(--radius-lg);
16346
+ background: var(--surface);
16347
+ box-shadow: 0 0 0 var(--line-width) var(--line);
16348
+ }
16349
+ .tf-policy-head {
16350
+ display: flex;
16351
+ flex-wrap: wrap;
16352
+ align-items: center;
16353
+ gap: 12px;
16354
+ }
16355
+ .tf-policy-head .tf-option-text {
16356
+ flex: 1;
16357
+ min-width: 120px;
16358
+ padding: 0;
16359
+ }
16360
+ .tf-policy-head b {
16361
+ font: 600 15px/20px var(--font-sans);
16362
+ }
16363
+ .tf-policy-facts {
16364
+ display: grid;
16365
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
16366
+ gap: 12px;
16367
+ margin: 0;
16368
+ }
16369
+ .tf-policy-facts div {
16370
+ min-width: 0;
16371
+ }
16372
+ .tf-policy-facts dt {
16373
+ font: 500 11px/14px var(--font-sans);
16374
+ letter-spacing: 0.04em;
16375
+ text-transform: uppercase;
16376
+ color: var(--ink-muted);
16377
+ }
16378
+ .tf-policy-facts dd {
16379
+ margin: 2px 0 0;
16380
+ font: 600 15px/20px var(--font-sans);
16381
+ font-variant-numeric: tabular-nums;
16382
+ overflow-wrap: break-word;
16383
+ }
16384
+ .tf-policy-foot {
16385
+ display: flex;
16386
+ flex-wrap: wrap;
16387
+ align-items: center;
16388
+ justify-content: space-between;
16389
+ gap: 8px;
16390
+ padding-top: 12px;
16391
+ border-top: 1px solid var(--line);
16392
+ font: 500 12px/16px var(--font-sans);
16393
+ color: var(--ink-muted);
16394
+ }
16395
+ .tf-policy-actions {
16396
+ display: inline-flex;
16397
+ flex-wrap: wrap;
16398
+ gap: 8px;
16399
+ }
16400
+
16401
+ /* CoverageMatrix */
16402
+ .tf-coverage {
16403
+ display: flex;
16404
+ flex-direction: column;
16405
+ gap: 12px;
16406
+ min-width: 0;
16407
+ }
16408
+ .tf-coverage-sum {
16409
+ display: flex;
16410
+ flex-wrap: wrap;
16411
+ gap: 8px 16px;
13923
16412
  }
13924
- @keyframes tf-out-up {
13925
- to {
13926
- opacity: 0;
13927
- translate: 0 calc(-40px * var(--motion-travel));
13928
- }
16413
+ .tf-coverage-box {
16414
+ container: tf-coverage / inline-size;
13929
16415
  }
13930
- @keyframes tf-out-down {
13931
- to {
13932
- opacity: 0;
13933
- translate: 0 calc(16px * var(--motion-travel));
13934
- }
16416
+ .tf-coverage-table {
16417
+ width: 100%;
16418
+ border-collapse: collapse;
13935
16419
  }
13936
- [data-closing] {
13937
- pointer-events: none;
16420
+ .tf-coverage-table th,
16421
+ .tf-coverage-table td {
16422
+ padding: 10px 8px;
16423
+ border-top: 1px solid var(--line);
16424
+ text-align: left;
16425
+ vertical-align: middle;
13938
16426
  }
13939
- .tf-popover[data-closing],
13940
- .tf-hovercard[data-closing],
13941
- .tf-modal-wrap[data-closing] .tf-modal,
13942
- .tf-overlay[data-closing] :is(.tf-modal, .tf-confirm),
13943
- .tf-palette-wrap[data-closing] .tf-palette {
13944
- animation: tf-out var(--dur-exit) var(--ease-in-out) forwards;
16427
+ .tf-coverage-table th {
16428
+ font-weight: inherit;
13945
16429
  }
13946
- .tf-tooltip[data-closing],
13947
- .tf-modal-wrap[data-closing] .tf-backdrop,
13948
- .tf-overlay[data-closing] .tf-backdrop,
13949
- .tf-palette-wrap[data-closing],
13950
- .tf-drawer-wrap[data-closing] {
13951
- animation: tf-out-fade var(--dur-exit) var(--ease-in-out) forwards;
16430
+ .tf-coverage-table th b {
16431
+ display: block;
16432
+ font: 500 14px/20px var(--font-sans);
13952
16433
  }
13953
- .tf-drawer-wrap[data-closing] .tf-drawer {
13954
- animation: tf-out-right var(--dur-exit) var(--ease-in-out) forwards;
16434
+ .tf-coverage-table th small {
16435
+ font: 500 12px/16px var(--font-sans);
16436
+ color: var(--ink-muted);
13955
16437
  }
13956
- .tf-drawer-wrap[data-closing] .tf-drawer.side-left {
13957
- animation-name: tf-out-left;
16438
+ .tf-coverage-table td:nth-child(2) {
16439
+ white-space: nowrap;
13958
16440
  }
13959
- .tf-drawer-wrap[data-closing] .tf-drawer.side-top {
13960
- animation-name: tf-out-up;
16441
+ .tf-coverage-note {
16442
+ font: 500 13px/18px var(--font-sans);
16443
+ color: var(--ink-muted);
13961
16444
  }
13962
- .tf-drawer-wrap[data-closing] .tf-drawer.side-bottom,
13963
- .tf-toast[data-closing] {
13964
- animation: tf-out-down var(--dur-exit) var(--ease-in-out) forwards;
16445
+ .tf-coverage-table tr.is-none th b {
16446
+ color: var(--blush-ink);
13965
16447
  }
13966
-
13967
- /* ── Reveal: a Stagger below the fold waits until it scrolls into view ── */
13968
- .tf-stagger[data-reveal="waiting"] > *,
13969
- .tf-stagger[data-reveal="waiting"] > * * {
13970
- animation-play-state: paused;
16448
+ /* narrow: each risk becomes a block, its status top right, the note underneath */
16449
+ @container tf-coverage (max-width: 440px) {
16450
+ .tf-coverage-table,
16451
+ .tf-coverage-table tbody {
16452
+ display: block;
16453
+ }
16454
+ .tf-coverage-table tr {
16455
+ display: grid;
16456
+ grid-template-columns: minmax(0, 1fr) auto;
16457
+ gap: 4px 12px;
16458
+ padding: 10px 4px;
16459
+ border-top: 1px solid var(--line);
16460
+ }
16461
+ .tf-coverage-table th,
16462
+ .tf-coverage-table td {
16463
+ padding: 0;
16464
+ border-top: 0;
16465
+ }
16466
+ .tf-coverage-table td.tf-coverage-note {
16467
+ grid-column: 1 / -1;
16468
+ }
13971
16469
  }
13972
16470
 
13973
- /* ── Page transitions (startViewTransition, Next.js and React view transitions) ── */
13974
- @keyframes tf-vt-out {
13975
- to {
13976
- opacity: 0;
13977
- translate: 0 calc(-6px * var(--motion-travel));
13978
- }
16471
+ /* ClaimTimeline */
16472
+ .tf-claim {
16473
+ display: flex;
16474
+ flex-direction: column;
16475
+ gap: 16px;
16476
+ min-width: 0;
13979
16477
  }
13980
- @keyframes tf-vt-in {
13981
- from {
13982
- opacity: 0;
13983
- translate: 0 calc(10px * var(--motion-travel));
13984
- }
16478
+ .tf-claim-head {
16479
+ display: flex;
16480
+ flex-wrap: wrap;
16481
+ align-items: flex-start;
16482
+ justify-content: space-between;
16483
+ gap: 12px;
13985
16484
  }
13986
- :root::view-transition-old(root) {
13987
- animation: tf-vt-out var(--dur-base) var(--ease-in-out) both;
16485
+ .tf-claim-head .tf-option-text {
16486
+ padding: 0;
13988
16487
  }
13989
- :root::view-transition-new(root) {
13990
- animation: tf-vt-in var(--dur-enter) var(--ease-out) both;
16488
+ .tf-claim-head b {
16489
+ font: 600 15px/20px var(--font-sans);
13991
16490
  }
13992
-
13993
- /* ── Expressive: things come into focus as they rise (Halo; Pro keeps a blur of 0) ── */
13994
- @keyframes tf-focus-in {
13995
- from {
13996
- filter: blur(var(--motion-blur));
13997
- }
13998
- to {
13999
- filter: none;
14000
- }
16491
+ .tf-claim-amount {
16492
+ display: flex;
16493
+ flex-direction: column;
16494
+ align-items: flex-end;
16495
+ font: 600 18px/24px var(--font-sans);
16496
+ font-variant-numeric: tabular-nums;
14001
16497
  }
14002
- [data-motion="expressive"] :is(.tf-stagger > *, .tf-in) {
14003
- animation-name: tf-rise, tf-focus-in;
16498
+ .tf-claim-amount small {
16499
+ font: 500 11px/14px var(--font-sans);
16500
+ color: var(--ink-muted);
14004
16501
  }
14005
- [data-motion="expressive"] .tf-topbar {
14006
- animation-name: tf-drop, tf-focus-in;
16502
+ .tf-claim-steps {
16503
+ display: flex;
16504
+ flex-direction: column;
14007
16505
  }
14008
-
14009
- /* 10-ambient.css */
14010
- /* Generated by scripts/pro-css.ts from packages/halo/css. Do not edit; the Pro look lives in 90-pro-look.css. */
14011
- /* Ambient: a calm, living background for glass UI. Soft colour fields from the kit (pastels in
14012
- * Halo, a faint aurora in Pro) drift slowly; a photo or video can take their place under a scrim.
14013
- * The drift only moves (transform), stops with motion off and pauses off screen.
14014
- */
14015
- :where(:has(> .tf-ambient:not(.fixed))) {
16506
+ .tf-claim-steps li {
14016
16507
  position: relative;
14017
- isolation: isolate;
16508
+ display: flex;
16509
+ gap: 12px;
16510
+ padding-bottom: 16px;
14018
16511
  }
14019
- .tf-ambient {
16512
+ .tf-claim-steps li:last-child {
16513
+ padding-bottom: 0;
16514
+ }
16515
+ .tf-claim-steps li:not(:last-child)::before {
16516
+ content: "";
14020
16517
  position: absolute;
14021
- inset: 0;
14022
- z-index: -1;
14023
- overflow: hidden;
14024
- background: var(--ambient-base);
14025
- pointer-events: none;
16518
+ top: 20px;
16519
+ bottom: 0;
16520
+ left: 9px;
16521
+ width: 2px;
16522
+ background: var(--line);
14026
16523
  }
14027
- .tf-ambient.fixed {
14028
- position: fixed;
16524
+ .tf-claim-steps li.is-done:not(:last-child)::before {
16525
+ background: var(--mint-ink);
14029
16526
  }
14030
- .tf-ambient-field {
14031
- position: absolute;
14032
- width: 75%;
14033
- aspect-ratio: 1;
14034
- border-radius: var(--radius-1);
14035
- background: radial-gradient(closest-side, var(--field), transparent);
14036
- animation: tf-ambient-drift 34s var(--ease-in-out) infinite alternate;
16527
+ .tf-claim-dot {
16528
+ position: relative;
16529
+ display: grid;
16530
+ place-items: center;
16531
+ flex: none;
16532
+ width: 20px;
16533
+ height: 20px;
16534
+ box-sizing: border-box;
16535
+ border: 2px solid var(--line-strong);
16536
+ border-radius: var(--radius-full);
16537
+ background: var(--surface);
16538
+ color: var(--primary-foreground);
14037
16539
  }
14038
- .tf-ambient-field:nth-child(1) {
14039
- top: -30%;
14040
- left: -15%;
16540
+ .tf-claim-steps li.is-done .tf-claim-dot {
16541
+ border-color: var(--mint-ink);
16542
+ background: var(--mint-ink);
14041
16543
  }
14042
- .tf-ambient-field:nth-child(2) {
14043
- top: -10%;
14044
- right: -25%;
14045
- animation-duration: 41s;
14046
- animation-direction: alternate-reverse;
16544
+ .tf-claim-steps li.is-current .tf-claim-dot {
16545
+ border-color: var(--primary);
16546
+ box-shadow: 0 0 0 4px var(--accent);
14047
16547
  }
14048
- .tf-ambient-field:nth-child(3) {
14049
- bottom: -35%;
14050
- left: 10%;
14051
- animation-duration: 47s;
16548
+ .tf-claim-steps li.is-failed .tf-claim-dot {
16549
+ border-color: var(--blush-ink);
16550
+ background: var(--blush-ink);
14052
16551
  }
14053
- .tf-ambient-field:nth-child(4) {
14054
- bottom: -25%;
14055
- right: -10%;
14056
- animation-duration: 38s;
14057
- animation-direction: alternate-reverse;
16552
+ .tf-claim-text {
16553
+ display: flex;
16554
+ flex-direction: column;
16555
+ min-width: 0;
14058
16556
  }
14059
- .tf-ambient-field:nth-child(n + 5) {
14060
- top: 20%;
14061
- left: 30%;
14062
- width: 55%;
14063
- animation-duration: 52s;
16557
+ .tf-claim-text b {
16558
+ font: 500 14px/20px var(--font-sans);
14064
16559
  }
14065
- @keyframes tf-ambient-drift {
14066
- to {
14067
- translate: 12% 9%;
14068
- scale: 1.15;
14069
- }
16560
+ .tf-claim-steps li.is-todo .tf-claim-text b {
16561
+ color: var(--ink-muted);
16562
+ font-weight: 500;
14070
16563
  }
14071
- .tf-ambient.still .tf-ambient-field,
14072
- .tf-ambient[data-paused] .tf-ambient-field {
14073
- animation-play-state: paused;
16564
+ .tf-claim-text small {
16565
+ font: 500 12px/16px var(--font-sans);
16566
+ color: var(--ink-muted);
14074
16567
  }
14075
- .tf-ambient-media {
14076
- position: absolute;
14077
- inset: 0;
16568
+
16569
+ /* DocumentList */
16570
+ .tf-docs {
16571
+ display: flex;
16572
+ flex-direction: column;
16573
+ gap: 4px;
16574
+ min-width: 0;
16575
+ }
16576
+ .tf-doc {
16577
+ display: flex;
16578
+ flex-wrap: wrap;
16579
+ align-items: center;
16580
+ gap: 8px 12px;
14078
16581
  width: 100%;
14079
- height: 100%;
14080
- object-fit: cover;
16582
+ padding: 10px 12px;
16583
+ box-sizing: border-box;
16584
+ border: 0;
16585
+ border-radius: var(--radius-md);
16586
+ background: transparent;
16587
+ color: var(--ink);
16588
+ font: inherit;
16589
+ text-align: left;
14081
16590
  }
14082
- .tf-ambient.media::after {
14083
- content: "";
14084
- position: absolute;
14085
- inset: 0;
14086
- background: var(--ambient-scrim);
16591
+ button.tf-doc {
16592
+ cursor: pointer;
14087
16593
  }
14088
- @media (prefers-reduced-motion: reduce) {
14089
- .tf-ambient-field {
14090
- animation: none;
14091
- }
16594
+ button.tf-doc:hover {
16595
+ background: var(--accent);
14092
16596
  }
14093
- [data-motion="off"] .tf-ambient-field {
14094
- animation: none;
16597
+ button.tf-doc:focus-visible {
16598
+ outline: 2px solid var(--focus);
16599
+ outline-offset: 2px;
16600
+ }
16601
+ .tf-doc-text {
16602
+ display: flex;
16603
+ flex: 1 1 160px;
16604
+ flex-direction: column;
16605
+ min-width: 0;
16606
+ }
16607
+ .tf-doc-text b {
16608
+ font: 500 14px/20px var(--font-sans);
16609
+ overflow-wrap: break-word;
16610
+ }
16611
+ .tf-doc-text small,
16612
+ .tf-doc-valid {
16613
+ font: 500 12px/16px var(--font-sans);
16614
+ color: var(--ink-muted);
14095
16615
  }
14096
16616
 
14097
16617
  /* 90-pro-look.css */
@@ -14510,6 +17030,14 @@ select.tf-input {
14510
17030
  gap: var(--line-width);
14511
17031
  box-shadow: 0 0 0 var(--line-width) var(--line);
14512
17032
  }
17033
+ /* with the sidebar, the sidebar and the sheet sit side by side on the same hairline */
17034
+ .tf-shell.tf-shell-sidebar {
17035
+ padding: 0;
17036
+ gap: var(--line-width);
17037
+ }
17038
+ .tf-shell-sidebar > .tf-sidebar.shell {
17039
+ border-radius: 0;
17040
+ }
14513
17041
  .tf-topbar,
14514
17042
  .tf-shell .tf-topbar {
14515
17043
  border-radius: 0;