@twentyfirstmedia/halo 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/scoped.css CHANGED
@@ -335,6 +335,11 @@
335
335
  --chart-lilac: var(--lilac);
336
336
  --chart-butter: var(--butter);
337
337
  --chart-blush: var(--blush);
338
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
339
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
340
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
341
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
342
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
338
343
  --ok: #2f5d16;
339
344
  --ok-bg: #d6efc3;
340
345
  --info: #1f4f8a;
@@ -483,6 +488,11 @@
483
488
  --chart-lilac: var(--lilac-ink);
484
489
  --chart-butter: var(--butter-ink);
485
490
  --chart-blush: var(--blush-ink);
491
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
492
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
493
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
494
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
495
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
486
496
  --ok: #a8db86;
487
497
  --ok-bg: #24401a;
488
498
  --info: #9cc6f7;
@@ -632,6 +642,11 @@
632
642
  --chart-lilac: var(--lilac-ink);
633
643
  --chart-butter: var(--butter-ink);
634
644
  --chart-blush: var(--blush-ink);
645
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
646
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
647
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
648
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
649
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
635
650
  --ok: #a8db86;
636
651
  --ok-bg: #24401a;
637
652
  --info: #9cc6f7;
@@ -781,6 +796,11 @@
781
796
  --chart-lilac: var(--lilac);
782
797
  --chart-butter: var(--butter);
783
798
  --chart-blush: var(--blush);
799
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
800
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
801
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
802
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
803
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
784
804
  --ok: #2f5d16;
785
805
  --ok-bg: #d6efc3;
786
806
  --info: #1f4f8a;
@@ -929,6 +949,11 @@
929
949
  --chart-lilac: var(--lilac-ink);
930
950
  --chart-butter: var(--butter-ink);
931
951
  --chart-blush: var(--blush-ink);
952
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
953
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
954
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
955
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
956
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
932
957
  --ok: #a8db86;
933
958
  --ok-bg: #24401a;
934
959
  --info: #9cc6f7;
@@ -1076,6 +1101,11 @@
1076
1101
  --chart-lilac: var(--lilac);
1077
1102
  --chart-butter: var(--butter);
1078
1103
  --chart-blush: var(--blush);
1104
+ --ramp-1: color-mix(in oklab, var(--chart-1) 12%, var(--background));
1105
+ --ramp-2: color-mix(in oklab, var(--chart-1) 28%, var(--background));
1106
+ --ramp-3: color-mix(in oklab, var(--chart-1) 46%, var(--background));
1107
+ --ramp-4: color-mix(in oklab, var(--chart-1) 66%, var(--background));
1108
+ --ramp-5: color-mix(in oklab, var(--chart-1) 88%, var(--background));
1079
1109
  --ok: #2f5d16;
1080
1110
  --ok-bg: #d6efc3;
1081
1111
  --info: #1f4f8a;
@@ -1620,7 +1650,8 @@
1620
1650
  border-radius: var(--radius-pill);
1621
1651
  background: var(--surface-sunken);
1622
1652
  color: var(--ink-muted);
1623
- min-width: 220px;
1653
+ min-width: min(220px, 100%);
1654
+ box-sizing: border-box;
1624
1655
  }
1625
1656
  :where([data-kit="halo"]) .tf-search input {
1626
1657
  border: 0;
@@ -1629,6 +1660,7 @@
1629
1660
  font: 500 14px/20px var(--font-sans);
1630
1661
  color: var(--ink);
1631
1662
  width: 100%;
1663
+ min-width: 0;
1632
1664
  }
1633
1665
  :where([data-kit="halo"]) .tf-search input::placeholder {
1634
1666
  color: var(--ink-subtle);
@@ -1710,7 +1742,7 @@
1710
1742
  display: flex;
1711
1743
  }
1712
1744
  :where([data-kit="halo"]) .tf-tabs-block .tf-tab {
1713
- flex: 1;
1745
+ flex: 1 1 0;
1714
1746
  }
1715
1747
 
1716
1748
  /* StatTile */
@@ -2027,6 +2059,36 @@
2027
2059
  background: var(--accent);
2028
2060
  color: var(--accent-foreground);
2029
2061
  }
2062
+ /* expanded: names next to the icons (the sheet's first column follows the rail's width) */
2063
+ :where([data-kit="halo"]) .tf-rail {
2064
+ transition: width var(--dur-base) var(--ease-out);
2065
+ }
2066
+ :where([data-kit="halo"]) .tf-rail.expanded {
2067
+ width: 200px;
2068
+ }
2069
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-rail-group {
2070
+ align-items: stretch;
2071
+ }
2072
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-rail-btn {
2073
+ display: flex;
2074
+ align-items: center;
2075
+ gap: 12px;
2076
+ width: 100%;
2077
+ padding: 0 10px;
2078
+ box-sizing: border-box;
2079
+ border-radius: var(--radius-pill);
2080
+ }
2081
+ :where([data-kit="halo"]) .tf-rail-label {
2082
+ min-width: 0;
2083
+ overflow: hidden;
2084
+ text-overflow: ellipsis;
2085
+ white-space: nowrap;
2086
+ font: 600 13px/18px var(--font-sans);
2087
+ }
2088
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-dotcount {
2089
+ position: static;
2090
+ margin-left: auto;
2091
+ }
2030
2092
  :where([data-kit="halo"]) .tf-rail-btn[aria-current="page"] {
2031
2093
  background: var(--primary);
2032
2094
  color: var(--primary-foreground);
@@ -2176,9 +2238,28 @@
2176
2238
  :where([data-kit="halo"]) .tf-shell .tf-topbar {
2177
2239
  padding: 0 var(--space-6);
2178
2240
  }
2241
+ /* AppShell with navigation="sidebar": the labelled sidebar on the frame, the sheet beside it */
2242
+ :where([data-kit="halo"]) .tf-shell.tf-shell-sidebar {
2243
+ display: grid;
2244
+ grid-template-columns: auto minmax(0, 1fr);
2245
+ align-items: stretch;
2246
+ padding: 8px;
2247
+ }
2248
+ :where([data-kit="halo"]) .tf-shell-tools {
2249
+ display: flex;
2250
+ justify-content: flex-end;
2251
+ flex-wrap: wrap;
2252
+ gap: 8px;
2253
+ }
2254
+ :where([data-kit="halo"]) .tf-sheet.tf-sheet-norail {
2255
+ grid-template-columns: minmax(0, 1fr) 300px;
2256
+ }
2257
+ :where([data-kit="halo"]) .tf-sheet.tf-sheet-norail.tf-sheet-2 {
2258
+ grid-template-columns: minmax(0, 1fr);
2259
+ }
2179
2260
  :where([data-kit="halo"]) .tf-sheet {
2180
2261
  display: grid;
2181
- grid-template-columns: 44px 1fr 300px;
2262
+ grid-template-columns: auto 1fr 300px;
2182
2263
  gap: var(--space-6);
2183
2264
  padding: var(--space-6);
2184
2265
  background: var(--canvas);
@@ -2695,6 +2776,64 @@
2695
2776
  background: var(--accent);
2696
2777
  color: var(--accent-foreground);
2697
2778
  }
2779
+ :where([data-kit="halo"]) a.tf-row-item {
2780
+ text-decoration: none;
2781
+ }
2782
+ :where([data-kit="halo"]) .tf-row-text {
2783
+ min-width: 0;
2784
+ }
2785
+ /* not interactive: no hover, no pointer */
2786
+ :where([data-kit="halo"]) .tf-row-item.static {
2787
+ cursor: default;
2788
+ }
2789
+ :where([data-kit="halo"]) .tf-row-item.static:hover {
2790
+ background: transparent;
2791
+ color: var(--ink);
2792
+ }
2793
+ /* own buttons: the title is the link or button and its hit area stretches over the row */
2794
+ :where([data-kit="halo"]) .tf-row-item.has-hit {
2795
+ position: relative;
2796
+ }
2797
+ :where([data-kit="halo"]) .tf-row-item.has-hit:hover {
2798
+ background: transparent;
2799
+ color: var(--ink);
2800
+ }
2801
+ :where([data-kit="halo"]) .tf-row-item.has-hit:has(.tf-row-hit:hover) {
2802
+ background: var(--accent);
2803
+ color: var(--accent-foreground);
2804
+ }
2805
+ :where([data-kit="halo"]) .tf-row-item.has-hit:has(.tf-row-hit:focus-visible) {
2806
+ outline: 2px solid var(--focus);
2807
+ outline-offset: 2px;
2808
+ }
2809
+ :where([data-kit="halo"]) .tf-row-hit {
2810
+ display: block;
2811
+ padding: 0;
2812
+ border: 0;
2813
+ background: none;
2814
+ color: inherit;
2815
+ font: inherit;
2816
+ text-align: left;
2817
+ text-decoration: none;
2818
+ cursor: pointer;
2819
+ outline: none;
2820
+ }
2821
+ :where([data-kit="halo"]) .tf-row-hit::after {
2822
+ content: "";
2823
+ position: absolute;
2824
+ inset: 0;
2825
+ border-radius: inherit;
2826
+ }
2827
+ :where([data-kit="halo"]) .tf-row-item.has-actions {
2828
+ grid-template-columns: auto 1fr auto auto;
2829
+ }
2830
+ :where([data-kit="halo"]) .tf-row-actions {
2831
+ position: relative;
2832
+ z-index: 1;
2833
+ display: flex;
2834
+ align-items: center;
2835
+ gap: 4px;
2836
+ }
2698
2837
  :where([data-kit="halo"]) .tf-row-item[aria-current="true"] {
2699
2838
  background: var(--surface);
2700
2839
  box-shadow: var(--shadow-card);
@@ -2706,12 +2845,27 @@
2706
2845
  gap: 8px;
2707
2846
  }
2708
2847
  :where([data-kit="halo"]) .tf-row-sub {
2848
+ display: block;
2709
2849
  font: 500 13px/18px var(--font-sans);
2710
2850
  color: var(--ink-muted);
2711
2851
  white-space: nowrap;
2712
2852
  overflow: hidden;
2713
2853
  text-overflow: ellipsis;
2714
2854
  }
2855
+ /* titleLines / subtitleLines: wrap, then end in an ellipsis after that many lines */
2856
+ :where([data-kit="halo"]) .tf-row-sub.clamp,
2857
+ :where([data-kit="halo"]) .tf-row-clamp {
2858
+ display: -webkit-box;
2859
+ -webkit-box-orient: vertical;
2860
+ -webkit-line-clamp: var(--lines, 2);
2861
+ line-clamp: var(--lines, 2);
2862
+ white-space: normal;
2863
+ overflow: hidden;
2864
+ min-width: 0;
2865
+ }
2866
+ :where([data-kit="halo"]) .tf-row-title.clamp {
2867
+ align-items: flex-start;
2868
+ }
2715
2869
  :where([data-kit="halo"]) .tf-row-meta {
2716
2870
  font: 600 12px/16px var(--font-sans);
2717
2871
  color: var(--ink-muted);
@@ -2898,6 +3052,13 @@
2898
3052
  font: 600 13px/1 var(--font-sans);
2899
3053
  cursor: pointer;
2900
3054
  }
3055
+ :where([data-kit="halo"]) a.tf-page {
3056
+ display: inline-flex;
3057
+ align-items: center;
3058
+ justify-content: center;
3059
+ box-sizing: border-box;
3060
+ text-decoration: none;
3061
+ }
2901
3062
  :where([data-kit="halo"]) .tf-page:hover {
2902
3063
  background: var(--accent);
2903
3064
  color: var(--ink);
@@ -2908,18 +3069,42 @@
2908
3069
  }
2909
3070
  :where([data-kit="halo"]) .tf-crumbs {
2910
3071
  display: flex;
3072
+ flex-wrap: wrap;
2911
3073
  align-items: center;
2912
3074
  gap: 6px;
3075
+ min-width: 0;
2913
3076
  font: 600 13px/18px var(--font-sans);
2914
3077
  color: var(--ink-muted);
2915
3078
  }
2916
- :where([data-kit="halo"]) .tf-crumbs a {
3079
+ /* links and buttons get a 24px target without moving the text */
3080
+ :where([data-kit="halo"]) .tf-crumb {
3081
+ display: inline-flex;
3082
+ align-items: center;
3083
+ min-height: 24px;
3084
+ max-width: 100%;
3085
+ padding: 0 4px;
3086
+ /* the target grows to 24px around the 18px line without moving the text */
3087
+ margin: -3px -4px;
3088
+ border: 0;
3089
+ border-radius: var(--radius-sm);
3090
+ background: none;
2917
3091
  color: inherit;
3092
+ font: inherit;
2918
3093
  text-decoration: none;
3094
+ overflow-wrap: anywhere;
3095
+ }
3096
+ :where([data-kit="halo"]) a.tf-crumb,
3097
+ :where([data-kit="halo"]) button.tf-crumb {
3098
+ cursor: pointer;
2919
3099
  }
2920
- :where([data-kit="halo"]) .tf-crumbs a:hover {
3100
+ :where([data-kit="halo"]) a.tf-crumb:hover,
3101
+ :where([data-kit="halo"]) button.tf-crumb:hover {
2921
3102
  color: var(--ink);
2922
3103
  }
3104
+ :where([data-kit="halo"]) .tf-crumb:focus-visible {
3105
+ outline: 2px solid var(--focus);
3106
+ outline-offset: 0;
3107
+ }
2923
3108
  :where([data-kit="halo"]) .tf-crumbs [aria-current] {
2924
3109
  color: var(--ink);
2925
3110
  }
@@ -2961,7 +3146,7 @@
2961
3146
  cursor: pointer;
2962
3147
  }
2963
3148
  :where([data-kit="halo"]) .tf-sheet-2 {
2964
- grid-template-columns: 44px 1fr;
3149
+ grid-template-columns: auto 1fr;
2965
3150
  }
2966
3151
  :where([data-kit="halo"]) .tf-main {
2967
3152
  display: flex;
@@ -3034,6 +3219,26 @@
3034
3219
  justify-content: center;
3035
3220
  }
3036
3221
  }
3222
+ /* the TopBar measured that the labels do not fit: icons only, at any width */
3223
+ :where([data-kit="halo"]) .tf-nav.tight .tf-nav-label {
3224
+ display: none;
3225
+ }
3226
+ :where([data-kit="halo"]) .tf-nav.tight .tf-nav-item {
3227
+ position: relative;
3228
+ width: 36px;
3229
+ padding: 0;
3230
+ justify-content: center;
3231
+ }
3232
+ :where([data-kit="halo"]) .tf-nav.tight .tf-nav-item .tf-nav-count {
3233
+ position: absolute;
3234
+ top: -2px;
3235
+ right: -4px;
3236
+ min-width: 16px;
3237
+ height: 16px;
3238
+ padding: 0 4px;
3239
+ font-size: 10px;
3240
+ line-height: 16px;
3241
+ }
3037
3242
  :where([data-kit="halo"]) .tf-main {
3038
3243
  animation: none;
3039
3244
  }
@@ -3159,6 +3364,19 @@
3159
3364
  :where([data-kit="halo"]) .tf-user-text {
3160
3365
  display: flex;
3161
3366
  flex-direction: column;
3367
+ min-width: 0;
3368
+ max-width: 200px;
3369
+ }
3370
+ /* a long name or address ends in an ellipsis instead of pushing the nav out (title has it whole) */
3371
+ :where([data-kit="halo"]) .tf-user-name,
3372
+ :where([data-kit="halo"]) .tf-user-mail {
3373
+ overflow: hidden;
3374
+ text-overflow: ellipsis;
3375
+ white-space: nowrap;
3376
+ }
3377
+ :where([data-kit="halo"]) .tf-user {
3378
+ min-width: 0;
3379
+ flex-shrink: 1;
3162
3380
  }
3163
3381
 
3164
3382
  /* Checkbox: real box + SVG check (no pseudo-elements on the input) */
@@ -3171,9 +3389,12 @@
3171
3389
  }
3172
3390
  :where([data-kit="halo"]) .tf-checkbox input {
3173
3391
  position: absolute;
3174
- inset: 0;
3175
- width: 100%;
3176
- height: 100%;
3392
+ /* the box keeps its size; the hit area is at least 24px (WCAG 2.2 target size) */
3393
+ top: 50%;
3394
+ left: 50%;
3395
+ translate: -50% -50%;
3396
+ width: max(24px, 100%);
3397
+ height: max(24px, 100%);
3177
3398
  margin: 0;
3178
3399
  opacity: 0;
3179
3400
  cursor: pointer;
@@ -4247,6 +4468,23 @@
4247
4468
  font: 600 13px/18px var(--font-sans);
4248
4469
  pointer-events: none;
4249
4470
  }
4471
+ /* an interactive control at the end (reveal password, clear, copy) */
4472
+ :where([data-kit="halo"]) .tf-input-action {
4473
+ position: absolute;
4474
+ right: 4px;
4475
+ top: 50%;
4476
+ transform: translateY(-50%);
4477
+ display: inline-flex;
4478
+ }
4479
+ :where([data-kit="halo"]) .tf-inputwrap.has-action .tf-input {
4480
+ padding-right: 44px;
4481
+ }
4482
+ :where([data-kit="halo"]) .tf-inputwrap.has-action.has-suffix .tf-input {
4483
+ padding-right: 72px;
4484
+ }
4485
+ :where([data-kit="halo"]) .tf-inputwrap.has-action .tf-input-suffix {
4486
+ right: 44px;
4487
+ }
4250
4488
  :where([data-kit="halo"]) .tf-input-suffix.err {
4251
4489
  color: var(--blush-ink);
4252
4490
  }
@@ -4406,7 +4644,7 @@
4406
4644
  display: flex;
4407
4645
  }
4408
4646
  :where([data-kit="halo"]) .tf-seg.block .tf-seg-item {
4409
- flex: 1;
4647
+ flex: 1 1 0;
4410
4648
  }
4411
4649
  :where([data-kit="halo"]) .tf-seg-item {
4412
4650
  position: relative;
@@ -5018,6 +5256,10 @@
5018
5256
  border-color var(--dur-fast) ease,
5019
5257
  background-color var(--dur-fast) ease;
5020
5258
  }
5259
+ :where([data-kit="halo"]) .tf-drop.disabled {
5260
+ opacity: 0.5;
5261
+ cursor: not-allowed;
5262
+ }
5021
5263
  :where([data-kit="halo"]) .tf-drop b {
5022
5264
  font: 600 14px/20px var(--font-sans);
5023
5265
  margin-top: 4px;
@@ -5080,6 +5322,7 @@
5080
5322
  /* Alert, confirm, toaster */
5081
5323
  :where([data-kit="halo"]) .tf-alert {
5082
5324
  display: flex;
5325
+ flex-wrap: wrap;
5083
5326
  align-items: flex-start;
5084
5327
  gap: 12px;
5085
5328
  padding: 12px 12px 12px 16px;
@@ -5123,7 +5366,8 @@
5123
5366
  color: var(--lilac-ink);
5124
5367
  }
5125
5368
  :where([data-kit="halo"]) .tf-alert-body {
5126
- flex: 1;
5369
+ /* when the alert is too narrow for text and actions, the actions move to their own line */
5370
+ flex: 1 1 200px;
5127
5371
  min-width: 0;
5128
5372
  display: flex;
5129
5373
  flex-direction: column;
@@ -5139,8 +5383,11 @@
5139
5383
  :where([data-kit="halo"]) .tf-alert-actions {
5140
5384
  flex: none;
5141
5385
  display: flex;
5386
+ flex-wrap: wrap;
5142
5387
  align-items: center;
5143
5388
  gap: 4px;
5389
+ max-width: 100%;
5390
+ margin-left: auto;
5144
5391
  }
5145
5392
  :where([data-kit="halo"]) .tf-alert .tf-iconbtn-ghost {
5146
5393
  background: transparent;
@@ -6149,14 +6396,29 @@
6149
6396
  display: inline-flex;
6150
6397
  align-items: center;
6151
6398
  gap: 8px;
6152
- height: 32px;
6153
- padding: 0 12px 0 4px;
6399
+ /* grows with a long title (two lines at most) instead of spilling over */
6400
+ min-height: 32px;
6401
+ box-sizing: border-box;
6402
+ padding: 4px 12px 4px 4px;
6154
6403
  border-radius: var(--radius-pill);
6155
6404
  background: var(--surface-sunken);
6156
6405
  color: var(--ink);
6157
6406
  text-decoration: none;
6158
6407
  font: 600 12px/16px var(--font-sans);
6159
- max-width: 260px;
6408
+ max-width: min(260px, 100%);
6409
+ }
6410
+ :where([data-kit="halo"]) .tf-source-title {
6411
+ min-width: 0;
6412
+ display: -webkit-box;
6413
+ -webkit-box-orient: vertical;
6414
+ -webkit-line-clamp: 2;
6415
+ line-clamp: 2;
6416
+ overflow: hidden;
6417
+ overflow-wrap: anywhere;
6418
+ }
6419
+ :where([data-kit="halo"]) .tf-source > .tf-ico,
6420
+ :where([data-kit="halo"]) .tf-source-n {
6421
+ flex: none;
6160
6422
  }
6161
6423
  :where([data-kit="halo"]) .tf-source:hover {
6162
6424
  background: var(--line);
@@ -7279,17 +7541,25 @@
7279
7541
  color: var(--ink-muted);
7280
7542
  }
7281
7543
  :where([data-kit="halo"]) .tf-csteps {
7544
+ /* one row at every width: steps shrink to their numbers instead of wrapping */
7545
+ container: tf-csteps / inline-size;
7282
7546
  display: flex;
7283
7547
  gap: 8px;
7284
7548
  margin: 0;
7285
7549
  padding: 0;
7286
7550
  list-style: none;
7287
- flex-wrap: wrap;
7288
7551
  }
7289
7552
  :where([data-kit="halo"]) .tf-csteps li {
7290
7553
  display: flex;
7291
7554
  align-items: center;
7292
7555
  gap: 8px;
7556
+ min-width: 0;
7557
+ }
7558
+ :where([data-kit="halo"]) .tf-cstep-label {
7559
+ min-width: 0;
7560
+ overflow: hidden;
7561
+ text-overflow: ellipsis;
7562
+ white-space: nowrap;
7293
7563
  }
7294
7564
  :where([data-kit="halo"]) .tf-csteps li + li::before {
7295
7565
  content: "";
@@ -7318,6 +7588,40 @@
7318
7588
  :where([data-kit="halo"]) .tf-csteps button:disabled {
7319
7589
  cursor: default;
7320
7590
  }
7591
+ :where([data-kit="halo"]) .tf-csteps button {
7592
+ min-width: 0;
7593
+ max-width: 100%;
7594
+ }
7595
+ :where([data-kit="halo"]) .tf-csteps.compact li:not(.cur) .tf-cstep-label {
7596
+ position: absolute;
7597
+ width: 1px;
7598
+ height: 1px;
7599
+ overflow: hidden;
7600
+ clip-path: inset(50%);
7601
+ white-space: nowrap;
7602
+ }
7603
+ :where([data-kit="halo"]) .tf-csteps.compact li:not(.cur) button {
7604
+ padding: 0 4px;
7605
+ }
7606
+ :where([data-kit="halo"]) .tf-csteps.compact li + li::before {
7607
+ width: 12px;
7608
+ }
7609
+ @container tf-csteps (max-width: 560px) {
7610
+ :where([data-kit="halo"]) .tf-csteps li:not(.cur) .tf-cstep-label {
7611
+ position: absolute;
7612
+ width: 1px;
7613
+ height: 1px;
7614
+ overflow: hidden;
7615
+ clip-path: inset(50%);
7616
+ white-space: nowrap;
7617
+ }
7618
+ :where([data-kit="halo"]) .tf-csteps li:not(.cur) button {
7619
+ padding: 0 4px;
7620
+ }
7621
+ :where([data-kit="halo"]) .tf-csteps li + li::before {
7622
+ width: 12px;
7623
+ }
7624
+ }
7321
7625
  :where([data-kit="halo"]) .tf-csteps li.cur button {
7322
7626
  background: var(--surface);
7323
7627
  color: var(--ink);
@@ -7484,7 +7788,7 @@
7484
7788
  color: var(--on-frame);
7485
7789
  box-shadow: var(--shadow-float);
7486
7790
  }
7487
- :where([data-kit="halo"]) .tf-plan.featured .tf-plan-head span,
7791
+ :where([data-kit="halo"]) .tf-plan.featured .tf-plan-head span:not(.tf-badge),
7488
7792
  :where([data-kit="halo"]) .tf-plan.featured .tf-plan-price span,
7489
7793
  :where([data-kit="halo"]) .tf-plan.featured .tf-plan-price s,
7490
7794
  :where([data-kit="halo"]) .tf-plan.featured .tf-plan-feats li.no {
@@ -7515,10 +7819,22 @@
7515
7819
  :where([data-kit="halo"]) .tf-plan-head b {
7516
7820
  font: 700 20px/26px var(--font-sans);
7517
7821
  }
7518
- :where([data-kit="halo"]) .tf-plan-head span {
7822
+ :where([data-kit="halo"]) .tf-plan-head span:not(.tf-badge) {
7519
7823
  font: 500 13px/18px var(--font-sans);
7520
7824
  color: var(--ink-muted);
7521
7825
  }
7826
+ /* "Current plan" next to the name, and the note under the price */
7827
+ :where([data-kit="halo"]) .tf-plan-head .tf-plan-current {
7828
+ align-self: flex-start;
7829
+ }
7830
+ :where([data-kit="halo"]) .tf-plan-note {
7831
+ margin: -4px 0 0;
7832
+ font: 500 12px/16px var(--font-sans);
7833
+ color: var(--ink-muted);
7834
+ }
7835
+ :where([data-kit="halo"]) a.tf-plan-cta {
7836
+ text-decoration: none;
7837
+ }
7522
7838
  :where([data-kit="halo"]) .tf-plan-price {
7523
7839
  display: flex;
7524
7840
  align-items: baseline;
@@ -9623,7 +9939,7 @@
9623
9939
  :where([data-kit="halo"]) .tf-tabbar {
9624
9940
  display: grid;
9625
9941
  grid-auto-flow: column;
9626
- grid-auto-columns: 1fr;
9942
+ grid-auto-columns: minmax(0, 1fr);
9627
9943
  padding: 4px 8px calc(4px + env(safe-area-inset-bottom, 0px));
9628
9944
  background: var(--frame);
9629
9945
  border-radius: 24px 24px 0 0;
@@ -9642,6 +9958,17 @@
9642
9958
  cursor: pointer;
9643
9959
  border-radius: 16px;
9644
9960
  }
9961
+ :where([data-kit="halo"]) .tf-tabbar-item {
9962
+ min-width: 0;
9963
+ }
9964
+ :where([data-kit="halo"]) .tf-tabbar-label {
9965
+ max-width: 100%;
9966
+ padding: 0 4px;
9967
+ box-sizing: border-box;
9968
+ overflow: hidden;
9969
+ text-overflow: ellipsis;
9970
+ white-space: nowrap;
9971
+ }
9645
9972
  :where([data-kit="halo"]) .tf-tabbar-item.on {
9646
9973
  color: var(--on-frame);
9647
9974
  background: var(--frame-hover);
@@ -9953,6 +10280,22 @@
9953
10280
  padding-bottom: 10px;
9954
10281
  color: var(--ink-muted);
9955
10282
  }
10283
+ /* in a narrow column (a filter sidebar) the number fields give their padding to the digits */
10284
+ :where([data-kit="halo"]) .tf-range {
10285
+ container: tf-range / inline-size;
10286
+ }
10287
+ @container tf-range (max-width: 280px) {
10288
+ :where([data-kit="halo"]) .tf-range-inputs {
10289
+ gap: 4px;
10290
+ }
10291
+ :where([data-kit="halo"]) .tf-range-num .tf-input {
10292
+ padding-left: 10px;
10293
+ padding-right: 24px;
10294
+ }
10295
+ :where([data-kit="halo"]) .tf-range-num > span {
10296
+ right: 10px;
10297
+ }
10298
+ }
9956
10299
  :where([data-kit="halo"]) .tf-range-vals {
9957
10300
  display: flex;
9958
10301
  justify-content: space-between;
@@ -10106,6 +10449,31 @@
10106
10449
  font: 500 12px/16px var(--font-sans);
10107
10450
  color: var(--ink-muted);
10108
10451
  }
10452
+ /* layout="list": compact rows */
10453
+ :where([data-kit="halo"]) .tf-tiles.list {
10454
+ grid-template-columns: minmax(0, 1fr);
10455
+ gap: 8px;
10456
+ }
10457
+ :where([data-kit="halo"]) .tf-tiles.list .tf-tile {
10458
+ flex-direction: row;
10459
+ align-items: center;
10460
+ gap: 12px;
10461
+ padding: 8px 44px 8px 8px;
10462
+ }
10463
+ :where([data-kit="halo"]) .tf-tiles.list .tf-tile-art {
10464
+ flex: none;
10465
+ width: 40px;
10466
+ height: 40px;
10467
+ aspect-ratio: auto;
10468
+ }
10469
+ :where([data-kit="halo"]) .tf-tiles.list .tf-tile-label {
10470
+ min-width: 0;
10471
+ padding: 0;
10472
+ }
10473
+ :where([data-kit="halo"]) .tf-tiles.list .tf-tile-check {
10474
+ top: 50%;
10475
+ translate: 0 -50%;
10476
+ }
10109
10477
  :where([data-kit="halo"]) .tf-tile-check {
10110
10478
  position: absolute;
10111
10479
  top: 14px;
@@ -11215,6 +11583,16 @@
11215
11583
  color: var(--paper-ink);
11216
11584
  box-shadow: inset 0 0 0 1px var(--line);
11217
11585
  }
11586
+ /* QrCode: dark modules on paper, in every theme (scanners expect dark on light) */
11587
+ :where([data-kit="halo"]) .tf-qr {
11588
+ display: block;
11589
+ width: 100%;
11590
+ height: auto;
11591
+ color: var(--paper-ink);
11592
+ }
11593
+ :where([data-kit="halo"]) .tf-qr-bg {
11594
+ fill: var(--paper);
11595
+ }
11218
11596
  :where([data-kit="halo"]) .tf-2fa-qr > * {
11219
11597
  max-width: 100%;
11220
11598
  max-height: 100%;
@@ -11466,7 +11844,8 @@
11466
11844
  border-radius: var(--radius-md);
11467
11845
  overflow: hidden;
11468
11846
  background: var(--surface-sunken);
11469
- touch-action: none;
11847
+ /* sideways drags move the divider; the page still scrolls up and down over it */
11848
+ touch-action: pan-y;
11470
11849
  user-select: none;
11471
11850
  cursor: ew-resize;
11472
11851
  }
@@ -12369,6 +12748,14 @@
12369
12748
  :where([data-kit="halo"]) .tf-togglegroup .tf-toggle {
12370
12749
  height: 32px;
12371
12750
  }
12751
+ :where([data-kit="halo"]) .tf-togglegroup.block {
12752
+ display: flex;
12753
+ flex-wrap: nowrap;
12754
+ width: auto;
12755
+ }
12756
+ :where([data-kit="halo"]) .tf-togglegroup.block .tf-toggle {
12757
+ flex: 1 1 0;
12758
+ }
12372
12759
  :where([data-kit="halo"]) .tf-togglegroup .tf-toggle.icon {
12373
12760
  width: 32px;
12374
12761
  }
@@ -12579,6 +12966,11 @@
12579
12966
  text-align: left;
12580
12967
  cursor: pointer;
12581
12968
  }
12969
+ :where([data-kit="halo"]) .tf-selectmenu.sm {
12970
+ height: 32px;
12971
+ padding: 0 12px;
12972
+ font-size: 13px;
12973
+ }
12582
12974
  :where([data-kit="halo"]) .tf-selectmenu.empty .tf-selectmenu-value {
12583
12975
  color: var(--ink-subtle);
12584
12976
  }
@@ -12855,26 +13247,44 @@
12855
13247
  outline-offset: -2px;
12856
13248
  }
12857
13249
 
12858
- /* Sidebar */
13250
+ /* Sidebar: floating (a card), attached (flush with the screen's edge) or on the AppShell frame */
12859
13251
  :where([data-kit="halo"]) .tf-sidebar {
12860
13252
  display: flex;
12861
13253
  flex-direction: column;
12862
- gap: 16px;
13254
+ flex: none;
13255
+ gap: 12px;
12863
13256
  width: 248px;
12864
13257
  padding: 12px;
12865
13258
  box-sizing: border-box;
12866
13259
  border-radius: var(--radius-lg);
12867
13260
  background: var(--surface);
12868
13261
  box-shadow: var(--shadow-card);
13262
+ color: var(--ink);
12869
13263
  transition: width var(--dur-base) var(--ease-out);
12870
13264
  }
12871
13265
  :where([data-kit="halo"]) .tf-sidebar.collapsed {
12872
13266
  width: 64px;
12873
13267
  }
13268
+ :where([data-kit="halo"]) .tf-sidebar.attached {
13269
+ align-self: stretch;
13270
+ min-height: 100%;
13271
+ border-radius: 0;
13272
+ box-shadow: none;
13273
+ background: var(--sidebar);
13274
+ border-right: 1px solid var(--sidebar-border);
13275
+ }
13276
+ :where([data-kit="halo"]) .tf-sidebar-head {
13277
+ display: flex;
13278
+ align-items: center;
13279
+ gap: 8px;
13280
+ min-height: 40px;
13281
+ padding: 0 4px;
13282
+ }
12874
13283
  :where([data-kit="halo"]) .tf-sidebar-body {
12875
13284
  display: flex;
12876
13285
  flex-direction: column;
12877
- gap: 16px;
13286
+ /* groups sit clearly apart; a label sits close to its own items */
13287
+ gap: 20px;
12878
13288
  flex: 1;
12879
13289
  min-height: 0;
12880
13290
  overflow-y: auto;
@@ -12887,13 +13297,49 @@
12887
13297
  padding: 0;
12888
13298
  list-style: none;
12889
13299
  }
13300
+ :where([data-kit="halo"]) .tf-sidebar-grouphead {
13301
+ display: flex;
13302
+ align-items: center;
13303
+ gap: 4px;
13304
+ min-height: 24px;
13305
+ margin-bottom: 8px;
13306
+ padding: 0 4px 0 12px;
13307
+ }
12890
13308
  :where([data-kit="halo"]) .tf-sidebar-grouplabel {
12891
- padding: 0 12px 6px;
13309
+ display: flex;
13310
+ align-items: center;
13311
+ gap: 4px;
13312
+ flex: 1;
13313
+ min-width: 0;
13314
+ padding: 0;
13315
+ border: 0;
13316
+ background: none;
12892
13317
  font: 600 11px/14px var(--font-sans);
12893
13318
  letter-spacing: 0.06em;
12894
13319
  text-transform: uppercase;
13320
+ text-align: left;
12895
13321
  color: var(--ink-muted);
12896
13322
  }
13323
+ :where([data-kit="halo"]) button.tf-sidebar-grouplabel {
13324
+ cursor: pointer;
13325
+ }
13326
+ :where([data-kit="halo"]) button.tf-sidebar-grouplabel:hover {
13327
+ color: var(--ink);
13328
+ }
13329
+ :where([data-kit="halo"]) button.tf-sidebar-grouplabel:focus-visible {
13330
+ outline: 2px solid var(--focus);
13331
+ outline-offset: 2px;
13332
+ }
13333
+ :where([data-kit="halo"]) .tf-sidebar-grouplabel[aria-expanded="false"] .tf-sidebar-chev {
13334
+ transform: rotate(-90deg);
13335
+ }
13336
+ :where([data-kit="halo"]) .tf-sidebar-groupaction {
13337
+ flex: none;
13338
+ margin-left: auto;
13339
+ }
13340
+ :where([data-kit="halo"]) .tf-sidebar-li {
13341
+ position: relative;
13342
+ }
12897
13343
  :where([data-kit="halo"]) .tf-sidebar-item {
12898
13344
  display: flex;
12899
13345
  align-items: center;
@@ -12901,15 +13347,86 @@
12901
13347
  width: 100%;
12902
13348
  height: 40px;
12903
13349
  padding: 0 12px;
13350
+ box-sizing: border-box;
12904
13351
  border: 0;
12905
13352
  border-radius: var(--radius-pill);
12906
13353
  background: transparent;
12907
13354
  color: var(--ink-muted);
12908
13355
  font: 600 13px/18px var(--font-sans);
12909
13356
  text-align: left;
13357
+ text-decoration: none;
12910
13358
  cursor: pointer;
12911
13359
  }
12912
- :where([data-kit="halo"]) .tf-sidebar-item:hover {
13360
+ /* Filter options (Sidebar as="aside"): a checkbox or radio mark, the label and a count */
13361
+ :where([data-kit="halo"]) .tf-sidebar-option {
13362
+ position: relative;
13363
+ }
13364
+ :where([data-kit="halo"]) .tf-sidebar-option.disabled {
13365
+ opacity: 0.45;
13366
+ cursor: default;
13367
+ }
13368
+ :where([data-kit="halo"]) .tf-sidebar-input {
13369
+ position: absolute;
13370
+ width: 1px;
13371
+ height: 1px;
13372
+ margin: 0;
13373
+ opacity: 0;
13374
+ pointer-events: none;
13375
+ }
13376
+ :where([data-kit="halo"]) .tf-sidebar-mark {
13377
+ display: grid;
13378
+ place-items: center;
13379
+ flex: none;
13380
+ width: 18px;
13381
+ height: 18px;
13382
+ box-sizing: border-box;
13383
+ border-radius: 6px;
13384
+ border: 1.5px solid var(--line-strong);
13385
+ background: var(--surface);
13386
+ color: var(--primary-foreground);
13387
+ transition:
13388
+ background-color var(--dur-fast) var(--ease-out),
13389
+ border-color var(--dur-fast) var(--ease-out);
13390
+ }
13391
+ :where([data-kit="halo"]) .tf-sidebar-mark.radio {
13392
+ border-radius: 50%;
13393
+ }
13394
+ :where([data-kit="halo"]) .tf-sidebar-mark svg {
13395
+ opacity: 0;
13396
+ }
13397
+ :where([data-kit="halo"]) .tf-sidebar-input:checked + .tf-sidebar-mark {
13398
+ background: var(--primary);
13399
+ border-color: var(--primary);
13400
+ }
13401
+ :where([data-kit="halo"]) .tf-sidebar-input:checked + .tf-sidebar-mark.radio {
13402
+ box-shadow: inset 0 0 0 3px var(--surface);
13403
+ }
13404
+ :where([data-kit="halo"]) .tf-sidebar-input:checked + .tf-sidebar-mark svg {
13405
+ opacity: 1;
13406
+ }
13407
+ :where([data-kit="halo"]) .tf-sidebar-input:focus-visible + .tf-sidebar-mark {
13408
+ outline: 2px solid var(--focus);
13409
+ outline-offset: 2px;
13410
+ }
13411
+ :where([data-kit="halo"]) .tf-sidebar-option:has(.tf-sidebar-input:checked) {
13412
+ color: var(--ink);
13413
+ }
13414
+ /* free content in a group (sliders, date fields, chips) */
13415
+ :where([data-kit="halo"]) .tf-sidebar-content {
13416
+ display: flex;
13417
+ flex-direction: column;
13418
+ gap: 12px;
13419
+ padding: 4px 12px 0;
13420
+ min-width: 0;
13421
+ }
13422
+ :where([data-kit="halo"]) .tf-sidebar-groupbody {
13423
+ display: flex;
13424
+ flex-direction: column;
13425
+ gap: 2px;
13426
+ min-width: 0;
13427
+ }
13428
+ :where([data-kit="halo"]) .tf-sidebar-item:hover,
13429
+ :where([data-kit="halo"]) .tf-sidebar-item.flying {
12913
13430
  background: var(--sidebar-accent);
12914
13431
  color: var(--ink);
12915
13432
  }
@@ -12924,10 +13441,21 @@
12924
13441
  outline: 2px solid var(--focus);
12925
13442
  outline-offset: 2px;
12926
13443
  }
13444
+ :where([data-kit="halo"]) .tf-sidebar-item:disabled {
13445
+ opacity: 0.45;
13446
+ cursor: not-allowed;
13447
+ }
13448
+ :where([data-kit="halo"]) .tf-sidebar-item:disabled:hover {
13449
+ background: transparent;
13450
+ color: var(--ink-muted);
13451
+ }
12927
13452
  :where([data-kit="halo"]) .tf-sidebar-item.nested {
12928
13453
  height: 32px;
12929
13454
  padding-left: 40px;
12930
13455
  }
13456
+ :where([data-kit="halo"]) .tf-sidebar-sub {
13457
+ margin-top: 2px !important;
13458
+ }
12931
13459
  :where([data-kit="halo"]) .tf-sidebar-label {
12932
13460
  flex: 1;
12933
13461
  min-width: 0;
@@ -12936,22 +13464,107 @@
12936
13464
  white-space: nowrap;
12937
13465
  }
12938
13466
  :where([data-kit="halo"]) .tf-sidebar-chev {
13467
+ flex: none;
12939
13468
  transition: transform var(--dur-base) var(--ease-out);
12940
13469
  }
12941
13470
  :where([data-kit="halo"]) .tf-sidebar-item[aria-expanded="true"] .tf-sidebar-chev {
12942
13471
  transform: rotate(180deg);
12943
13472
  }
13473
+ :where([data-kit="halo"]) .tf-sidebar-ext {
13474
+ flex: none;
13475
+ opacity: 0.7;
13476
+ }
13477
+ :where([data-kit="halo"]) .tf-sidebar-count {
13478
+ flex: none;
13479
+ min-width: 20px;
13480
+ height: 20px;
13481
+ padding: 0 6px;
13482
+ box-sizing: border-box;
13483
+ border-radius: var(--radius-pill);
13484
+ background: var(--count);
13485
+ color: var(--on-count);
13486
+ font: 700 11px/20px var(--font-sans);
13487
+ text-align: center;
13488
+ }
13489
+ :where([data-kit="halo"]) .tf-sidebar-badge {
13490
+ flex: none;
13491
+ height: 20px;
13492
+ padding: 0 8px;
13493
+ box-sizing: border-box;
13494
+ border-radius: var(--radius-pill);
13495
+ background: var(--count);
13496
+ color: var(--on-count);
13497
+ font: 700 10px/20px var(--font-sans);
13498
+ letter-spacing: 0.04em;
13499
+ text-transform: uppercase;
13500
+ }
13501
+ :where([data-kit="halo"]) .tf-sidebar-dot {
13502
+ flex: none;
13503
+ width: 8px;
13504
+ height: 8px;
13505
+ border-radius: 50%;
13506
+ background: var(--count);
13507
+ }
13508
+ :where([data-kit="halo"]) .tf-sidebar-sr {
13509
+ position: absolute;
13510
+ width: 1px;
13511
+ height: 1px;
13512
+ overflow: hidden;
13513
+ clip-path: inset(50%);
13514
+ white-space: nowrap;
13515
+ }
13516
+ /* the "…" menu of an item shows on hover and focus */
13517
+ :where([data-kit="halo"]) .tf-sidebar-li.with-actions > .tf-sidebar-item {
13518
+ padding-right: 40px;
13519
+ }
13520
+ :where([data-kit="halo"]) .tf-sidebar-more {
13521
+ position: absolute;
13522
+ top: 4px;
13523
+ right: 4px;
13524
+ opacity: 0;
13525
+ transition: opacity var(--dur-fast) var(--ease-out);
13526
+ }
13527
+ :where([data-kit="halo"]) .tf-sidebar-li:hover > .tf-sidebar-more,
13528
+ :where([data-kit="halo"]) .tf-sidebar-more:focus-visible,
13529
+ :where([data-kit="halo"]) .tf-sidebar-more[aria-expanded="true"] {
13530
+ opacity: 1;
13531
+ }
12944
13532
  :where([data-kit="halo"]) .tf-sidebar-foot {
12945
13533
  display: flex;
12946
13534
  align-items: center;
12947
- justify-content: space-between;
12948
13535
  gap: 8px;
12949
13536
  padding-top: 12px;
12950
13537
  border-top: 1px solid var(--sidebar-border);
12951
13538
  }
13539
+ :where([data-kit="halo"]) .tf-sidebar-foot > :not(.tf-sidebar-toggle) {
13540
+ flex: 1;
13541
+ min-width: 0;
13542
+ }
13543
+ :where([data-kit="halo"]) .tf-sidebar-toggle {
13544
+ flex: none;
13545
+ margin-left: auto;
13546
+ }
13547
+ :where([data-kit="halo"]) .tf-sidebar-head .tf-pop-anchor,
13548
+ :where([data-kit="halo"]) .tf-sidebar-foot .tf-pop-anchor {
13549
+ display: block;
13550
+ min-width: 0;
13551
+ }
13552
+ :where([data-kit="halo"]) .tf-sidebar-head .tf-wssw {
13553
+ width: 100%;
13554
+ }
13555
+ :where([data-kit="halo"]) .tf-sidebar-head .tf-wssw .tf-option-text {
13556
+ flex: 1;
13557
+ min-width: 0;
13558
+ }
13559
+
13560
+ /* collapsed: icons only; labels stay the accessible names, tooltips and flyouts show them */
13561
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-body {
13562
+ gap: 12px;
13563
+ }
12952
13564
  :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-label,
12953
13565
  :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-chev,
12954
- :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-grouplabel {
13566
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-ext,
13567
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-grouphead {
12955
13568
  position: absolute;
12956
13569
  width: 1px;
12957
13570
  height: 1px;
@@ -12959,12 +13572,19 @@
12959
13572
  clip-path: inset(50%);
12960
13573
  white-space: nowrap;
12961
13574
  }
13575
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-group + .tf-sidebar-group {
13576
+ padding-top: 12px;
13577
+ border-top: 1px solid var(--sidebar-border);
13578
+ }
12962
13579
  :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-item {
12963
13580
  position: relative;
12964
13581
  justify-content: center;
12965
13582
  padding: 0;
12966
13583
  }
12967
- :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-subnav-count {
13584
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-item.has-current {
13585
+ background: var(--sidebar-accent);
13586
+ }
13587
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-count {
12968
13588
  position: absolute;
12969
13589
  top: -2px;
12970
13590
  right: -2px;
@@ -12974,57 +13594,317 @@
12974
13594
  font-size: 10px;
12975
13595
  line-height: 16px;
12976
13596
  }
13597
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-dot,
13598
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-badge {
13599
+ position: absolute;
13600
+ top: 6px;
13601
+ right: 8px;
13602
+ width: 8px;
13603
+ height: 8px;
13604
+ padding: 0;
13605
+ font-size: 0;
13606
+ }
13607
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-head {
13608
+ justify-content: center;
13609
+ padding: 0;
13610
+ }
12977
13611
  :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-foot {
12978
13612
  flex-direction: column;
12979
13613
  }
12980
- @media (max-width: 760px) {
12981
- :where([data-kit="halo"]) .tf-sidebar {
12982
- width: 100%;
12983
- }
12984
- :where([data-kit="halo"]) .tf-navmenu-panel.with-feature {
12985
- grid-template-columns: minmax(0, 1fr);
12986
- }
12987
- :where([data-kit="halo"]) .tf-navmenu-feature {
12988
- min-height: 0;
12989
- }
12990
- :where([data-kit="halo"]) .tf-navmenu-list {
12991
- flex-wrap: wrap;
12992
- }
12993
- :where([data-kit="halo"]) .tf-menubar {
12994
- flex-wrap: wrap;
12995
- border-radius: var(--radius-lg);
12996
- }
13614
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-foot > :not(.tf-sidebar-toggle) {
13615
+ flex: none;
13616
+ }
13617
+ :where([data-kit="halo"]) .tf-sidebar.collapsed .tf-sidebar-toggle {
13618
+ margin-left: 0;
12997
13619
  }
12998
13620
 
12999
- /* Drawer (sheet) sides */
13000
- :where([data-kit="halo"]) .tf-drawer.side-left {
13001
- right: auto;
13002
- left: 0;
13003
- animation-name: tf-halo-sheet-left;
13621
+ /* tooltips, flyouts and item menus float in the portal, so the scrolling body does not clip them */
13622
+ :where([data-kit="halo"]) .tf-sidebar-layer {
13623
+ position: fixed;
13624
+ z-index: var(--z-palette);
13004
13625
  }
13005
- :where([data-kit="halo"]) .tf-drawer.side-top,
13006
- :where([data-kit="halo"]) .tf-drawer.side-bottom {
13007
- left: 0;
13008
- right: 0;
13009
- width: 100%;
13010
- max-height: min(80%, 640px);
13626
+ :where([data-kit="halo"]) .tf-sidebar-tip {
13627
+ display: inline-flex;
13628
+ align-items: center;
13629
+ gap: 8px;
13630
+ padding: 4px 8px;
13631
+ border-radius: var(--radius-sm);
13632
+ background: var(--frame);
13633
+ color: var(--on-frame);
13634
+ font: 600 12px/16px var(--font-sans);
13635
+ white-space: nowrap;
13636
+ pointer-events: none;
13637
+ animation: tf-halo-fade var(--dur-fast) var(--ease-out) both;
13011
13638
  }
13012
- :where([data-kit="halo"]) .tf-drawer.side-top {
13013
- bottom: auto;
13014
- animation-name: tf-halo-sheet-top;
13639
+ :where([data-kit="halo"]) .tf-sidebar-tipcount {
13640
+ color: var(--on-frame-muted);
13015
13641
  }
13016
- :where([data-kit="halo"]) .tf-drawer.side-bottom {
13017
- top: auto;
13018
- border-radius: var(--radius-xl) var(--radius-xl) 0 0;
13019
- animation-name: tf-halo-sheet-bottom;
13642
+ :where([data-kit="halo"]) .tf-sidebar-flyout {
13643
+ min-width: 200px;
13644
+ padding: 6px;
13645
+ border-radius: var(--radius-md);
13646
+ background: var(--surface);
13647
+ color: var(--ink);
13648
+ box-shadow: var(--shadow-float);
13649
+ animation: tf-halo-fade var(--dur-fast) var(--ease-out) both;
13020
13650
  }
13021
- @keyframes tf-halo-sheet-left {
13022
- from {
13023
- opacity: 0;
13024
- transform: translateX(calc(-24px * var(--motion-travel)));
13025
- }
13651
+ :where([data-kit="halo"]) .tf-sidebar-flyout ul {
13652
+ display: flex;
13653
+ flex-direction: column;
13654
+ gap: 2px;
13655
+ margin: 0;
13656
+ padding: 0;
13657
+ list-style: none;
13026
13658
  }
13027
- @keyframes tf-halo-sheet-top {
13659
+ :where([data-kit="halo"]) .tf-sidebar-flytitle {
13660
+ padding: 6px 12px 8px;
13661
+ font: 600 11px/14px var(--font-sans);
13662
+ letter-spacing: 0.06em;
13663
+ text-transform: uppercase;
13664
+ color: var(--ink-muted);
13665
+ }
13666
+ :where([data-kit="halo"]) .tf-sidebar-flyout .tf-sidebar-item.nested {
13667
+ padding-left: 12px;
13668
+ }
13669
+
13670
+ /* on the AppShell frame */
13671
+ :where([data-kit="halo"]) .tf-sidebar.shell {
13672
+ align-self: stretch;
13673
+ padding: 16px 8px 8px;
13674
+ border-radius: 0;
13675
+ background: transparent;
13676
+ box-shadow: none;
13677
+ color: var(--on-frame);
13678
+ }
13679
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item,
13680
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-grouplabel {
13681
+ color: var(--on-frame-muted);
13682
+ }
13683
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item:hover,
13684
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item.flying,
13685
+ :where([data-kit="halo"]) .tf-sidebar.shell.collapsed .tf-sidebar-item.has-current {
13686
+ background: var(--frame-hover);
13687
+ color: var(--on-frame);
13688
+ }
13689
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item.has-current,
13690
+ :where([data-kit="halo"]) .tf-sidebar.shell button.tf-sidebar-grouplabel:hover {
13691
+ color: var(--on-frame);
13692
+ }
13693
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item[aria-current="page"] {
13694
+ background: var(--frame-active);
13695
+ color: var(--on-frame);
13696
+ }
13697
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-item:disabled:hover {
13698
+ background: transparent;
13699
+ color: var(--on-frame-muted);
13700
+ }
13701
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-foot,
13702
+ :where([data-kit="halo"]) .tf-sidebar.shell.collapsed .tf-sidebar-group + .tf-sidebar-group {
13703
+ border-color: var(--frame-hover);
13704
+ }
13705
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-iconbtn-ghost {
13706
+ color: var(--on-frame-muted);
13707
+ }
13708
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-iconbtn-ghost:hover {
13709
+ background: var(--frame-hover);
13710
+ color: var(--on-frame);
13711
+ }
13712
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-sidebar-head {
13713
+ min-height: 44px;
13714
+ }
13715
+
13716
+ /* UserMenu: the signed-in person, opening their account menu */
13717
+ :where([data-kit="halo"]) .tf-usermenu {
13718
+ display: flex;
13719
+ align-items: center;
13720
+ gap: 10px;
13721
+ width: 100%;
13722
+ min-height: 44px;
13723
+ padding: 4px 8px 4px 4px;
13724
+ box-sizing: border-box;
13725
+ border: 0;
13726
+ border-radius: var(--radius-pill);
13727
+ background: transparent;
13728
+ color: var(--ink);
13729
+ font: inherit;
13730
+ text-align: left;
13731
+ cursor: pointer;
13732
+ }
13733
+ :where([data-kit="halo"]) .tf-usermenu.compact {
13734
+ width: auto;
13735
+ padding: 4px;
13736
+ }
13737
+ :where([data-kit="halo"]) .tf-usermenu:hover,
13738
+ :where([data-kit="halo"]) .tf-usermenu[aria-expanded="true"] {
13739
+ background: var(--sidebar-accent);
13740
+ }
13741
+ :where([data-kit="halo"]) .tf-usermenu:focus-visible {
13742
+ outline: 2px solid var(--focus);
13743
+ outline-offset: 2px;
13744
+ }
13745
+ :where([data-kit="halo"]) .tf-usermenu-avatar {
13746
+ display: inline-flex;
13747
+ flex: none;
13748
+ }
13749
+ :where([data-kit="halo"]) .tf-usermenu-text {
13750
+ display: flex;
13751
+ flex-direction: column;
13752
+ flex: 1;
13753
+ min-width: 0;
13754
+ }
13755
+ :where([data-kit="halo"]) .tf-usermenu-name {
13756
+ font: 600 13px/18px var(--font-sans);
13757
+ overflow: hidden;
13758
+ text-overflow: ellipsis;
13759
+ white-space: nowrap;
13760
+ }
13761
+ :where([data-kit="halo"]) .tf-usermenu-mail {
13762
+ font: 500 11px/14px var(--font-sans);
13763
+ color: var(--ink-muted);
13764
+ overflow: hidden;
13765
+ text-overflow: ellipsis;
13766
+ white-space: nowrap;
13767
+ }
13768
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-usermenu {
13769
+ color: var(--on-frame);
13770
+ }
13771
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-usermenu:hover,
13772
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-usermenu[aria-expanded="true"] {
13773
+ background: var(--frame-hover);
13774
+ }
13775
+ :where([data-kit="halo"]) .tf-sidebar.shell .tf-usermenu-mail {
13776
+ color: var(--on-frame-muted);
13777
+ }
13778
+ :where([data-kit="halo"]) .tf-wssw.compact {
13779
+ padding: 4px;
13780
+ }
13781
+
13782
+ /* the bar that opens the sidebar as a drawer on phones */
13783
+ :where([data-kit="halo"]) .tf-sidebar-bar,
13784
+ :where([data-kit="halo"]) .tf-sidebar-scrim {
13785
+ display: none;
13786
+ }
13787
+ @media (max-width: 760px) {
13788
+ :where([data-kit="halo"]) .tf-sidebar-bar {
13789
+ display: flex;
13790
+ align-items: center;
13791
+ gap: 8px;
13792
+ min-height: 52px;
13793
+ padding: 6px 12px 6px 6px;
13794
+ box-sizing: border-box;
13795
+ border-radius: var(--radius-lg);
13796
+ background: var(--surface);
13797
+ box-shadow: var(--shadow-card);
13798
+ color: var(--ink);
13799
+ }
13800
+ :where([data-kit="halo"]) .tf-sidebar-bar.attached {
13801
+ border-radius: 0;
13802
+ box-shadow: none;
13803
+ background: var(--sidebar);
13804
+ border-bottom: 1px solid var(--sidebar-border);
13805
+ }
13806
+ :where([data-kit="halo"]) .tf-sidebar-bar.shell {
13807
+ min-height: 56px;
13808
+ padding: 8px 8px 8px 0;
13809
+ border-radius: 0;
13810
+ box-shadow: none;
13811
+ background: transparent;
13812
+ color: var(--on-frame);
13813
+ }
13814
+ :where([data-kit="halo"]) .tf-sidebar-bar.shell .tf-iconbtn-ghost {
13815
+ color: var(--on-frame);
13816
+ }
13817
+ :where([data-kit="halo"]) .tf-sidebar-bar > :not(.tf-iconbtn) {
13818
+ min-width: 0;
13819
+ }
13820
+ :where([data-kit="halo"]) .tf-sidebar,
13821
+ :where([data-kit="halo"]) .tf-sidebar.attached,
13822
+ :where([data-kit="halo"]) .tf-sidebar.shell {
13823
+ position: fixed;
13824
+ top: 0;
13825
+ bottom: 0;
13826
+ left: 0;
13827
+ z-index: var(--z-overlay);
13828
+ width: min(300px, 86vw);
13829
+ min-height: 0;
13830
+ padding: 12px;
13831
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
13832
+ box-shadow: var(--shadow-float);
13833
+ transform: translateX(-105%);
13834
+ visibility: hidden;
13835
+ transition:
13836
+ transform var(--dur-base) var(--ease-out),
13837
+ visibility 0s linear var(--dur-base);
13838
+ }
13839
+ :where([data-kit="halo"]) .tf-sidebar.shell {
13840
+ background: var(--frame);
13841
+ }
13842
+ :where([data-kit="halo"]) .tf-sidebar.attached {
13843
+ background: var(--sidebar);
13844
+ }
13845
+ :where([data-kit="halo"]) .tf-sidebar.open {
13846
+ transform: none;
13847
+ visibility: visible;
13848
+ transition: transform var(--dur-base) var(--ease-out);
13849
+ }
13850
+ :where([data-kit="halo"]) .tf-sidebar-toggle {
13851
+ display: none;
13852
+ }
13853
+ :where([data-kit="halo"]) .tf-sidebar-scrim {
13854
+ display: block;
13855
+ position: fixed;
13856
+ inset: 0;
13857
+ z-index: var(--z-overlay);
13858
+ background: var(--scrim-strong);
13859
+ animation: tf-halo-fade var(--dur-base) var(--ease-out) both;
13860
+ }
13861
+ }
13862
+
13863
+ @media (max-width: 760px) {
13864
+ :where([data-kit="halo"]) .tf-navmenu-panel.with-feature {
13865
+ grid-template-columns: minmax(0, 1fr);
13866
+ }
13867
+ :where([data-kit="halo"]) .tf-navmenu-feature {
13868
+ min-height: 0;
13869
+ }
13870
+ :where([data-kit="halo"]) .tf-navmenu-list {
13871
+ flex-wrap: wrap;
13872
+ }
13873
+ :where([data-kit="halo"]) .tf-menubar {
13874
+ flex-wrap: wrap;
13875
+ border-radius: var(--radius-lg);
13876
+ }
13877
+ }
13878
+
13879
+ /* Drawer (sheet) sides */
13880
+ :where([data-kit="halo"]) .tf-drawer.side-left {
13881
+ right: auto;
13882
+ left: 0;
13883
+ animation-name: tf-halo-sheet-left;
13884
+ }
13885
+ :where([data-kit="halo"]) .tf-drawer.side-top,
13886
+ :where([data-kit="halo"]) .tf-drawer.side-bottom {
13887
+ left: 0;
13888
+ right: 0;
13889
+ width: 100%;
13890
+ max-height: min(80%, 640px);
13891
+ }
13892
+ :where([data-kit="halo"]) .tf-drawer.side-top {
13893
+ bottom: auto;
13894
+ animation-name: tf-halo-sheet-top;
13895
+ }
13896
+ :where([data-kit="halo"]) .tf-drawer.side-bottom {
13897
+ top: auto;
13898
+ border-radius: var(--radius-xl) var(--radius-xl) 0 0;
13899
+ animation-name: tf-halo-sheet-bottom;
13900
+ }
13901
+ @keyframes tf-halo-sheet-left {
13902
+ from {
13903
+ opacity: 0;
13904
+ transform: translateX(calc(-24px * var(--motion-travel)));
13905
+ }
13906
+ }
13907
+ @keyframes tf-halo-sheet-top {
13028
13908
  from {
13029
13909
  opacity: 0;
13030
13910
  transform: translateY(calc(-24px * var(--motion-travel)));
@@ -13162,7 +14042,7 @@
13162
14042
  /* Tablet: asides move below the main column, nav labels and the page nav shrink to icons */
13163
14043
  @container tf-shell (max-width: 1180px) {
13164
14044
  :where([data-kit="halo"]) .tf-sheet:not(.tf-sheet-2):not(.tf-sheet-nav) {
13165
- grid-template-columns: 44px minmax(0, 1fr);
14045
+ grid-template-columns: auto minmax(0, 1fr);
13166
14046
  }
13167
14047
  :where([data-kit="halo"]) .tf-sheet-nav.tf-sheet-aside {
13168
14048
  grid-template-columns: 208px minmax(0, 1fr);
@@ -13170,6 +14050,13 @@
13170
14050
  :where([data-kit="halo"]) .tf-sheet > .tf-main ~ :not(.tf-dock-float) {
13171
14051
  grid-column: 2;
13172
14052
  }
14053
+ /* with the sidebar there is no rail column: asides go below the main column */
14054
+ :where([data-kit="halo"]) .tf-sheet.tf-sheet-norail:not(.tf-sheet-2) {
14055
+ grid-template-columns: minmax(0, 1fr);
14056
+ }
14057
+ :where([data-kit="halo"]) .tf-sheet-norail > .tf-main ~ :not(.tf-dock-float) {
14058
+ grid-column: 1;
14059
+ }
13173
14060
  /* the dock floats over the end of the sheet, not of the main column (asides follow it) */
13174
14061
  :where([data-kit="halo"]) .tf-main-dock {
13175
14062
  padding-bottom: 0;
@@ -13200,7 +14087,7 @@
13200
14087
  @container tf-shell (max-width: 1040px) {
13201
14088
  :where([data-kit="halo"]) .tf-sheet-nav,
13202
14089
  :where([data-kit="halo"]) .tf-sheet-nav.tf-sheet-aside {
13203
- grid-template-columns: 44px minmax(0, 1fr);
14090
+ grid-template-columns: auto minmax(0, 1fr);
13204
14091
  }
13205
14092
  :where([data-kit="halo"]) .tf-subnav-eyebrow {
13206
14093
  display: none;
@@ -13297,6 +14184,21 @@
13297
14184
  :where([data-kit="halo"]) .tf-rail-group {
13298
14185
  flex-direction: row;
13299
14186
  }
14187
+ /* on phones the rail is a row of icons, expanded or not */
14188
+ :where([data-kit="halo"]) .tf-rail.expanded {
14189
+ width: auto;
14190
+ }
14191
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-rail-btn {
14192
+ display: grid;
14193
+ width: 40px;
14194
+ padding: 0;
14195
+ }
14196
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-rail-label {
14197
+ display: none;
14198
+ }
14199
+ :where([data-kit="halo"]) .tf-rail.expanded .tf-dotcount {
14200
+ position: absolute;
14201
+ }
13300
14202
  :where([data-kit="halo"]) .tf-main {
13301
14203
  gap: var(--space-4);
13302
14204
  }
@@ -13388,6 +14290,56 @@
13388
14290
  max-width: 100%;
13389
14291
  overflow-x: auto;
13390
14292
  }
14293
+ /* Table stack: narrow boxes show every row as a card, each cell with its column label */
14294
+ :where([data-kit="halo"]) .tf-table-stackbox {
14295
+ container: tf-table / inline-size;
14296
+ }
14297
+ @container tf-table (max-width: 600px) {
14298
+ :where([data-kit="halo"]) .tf-table.stack thead {
14299
+ position: absolute;
14300
+ width: 1px;
14301
+ height: 1px;
14302
+ overflow: hidden;
14303
+ clip-path: inset(50%);
14304
+ }
14305
+ :where([data-kit="halo"]) .tf-table.stack,
14306
+ :where([data-kit="halo"]) .tf-table.stack tbody,
14307
+ :where([data-kit="halo"]) .tf-table.stack tr {
14308
+ display: block;
14309
+ }
14310
+ :where([data-kit="halo"]) .tf-table.stack tr {
14311
+ padding: 8px 0;
14312
+ border-bottom: 1px solid var(--line);
14313
+ }
14314
+ :where([data-kit="halo"]) .tf-table.stack tr:last-child {
14315
+ border-bottom: 0;
14316
+ }
14317
+ :where([data-kit="halo"]) .tf-table.stack td {
14318
+ display: flex;
14319
+ align-items: center;
14320
+ justify-content: space-between;
14321
+ gap: 16px;
14322
+ height: auto;
14323
+ min-height: 32px;
14324
+ padding: 4px 0;
14325
+ border-bottom: 0;
14326
+ text-align: right;
14327
+ white-space: normal;
14328
+ }
14329
+ :where([data-kit="halo"]) .tf-table.stack td::before {
14330
+ content: attr(data-label);
14331
+ flex: none;
14332
+ max-width: 50%;
14333
+ text-align: left;
14334
+ font: 600 11px/14px var(--font-sans);
14335
+ letter-spacing: 0.06em;
14336
+ text-transform: uppercase;
14337
+ color: var(--ink-muted);
14338
+ }
14339
+ :where([data-kit="halo"]) .tf-table.stack tbody tr:hover td {
14340
+ background: transparent;
14341
+ }
14342
+ }
13391
14343
 
13392
14344
  /* ── Phone: components ── */
13393
14345
  @media (max-width: 760px) {
@@ -13422,15 +14374,15 @@
13422
14374
  height: 52px;
13423
14375
  }
13424
14376
 
13425
- /* segmented controls and tabs scroll sideways when the labels do not fit */
13426
- :where([data-kit="halo"]) .tf-seg,
13427
- :where([data-kit="halo"]) .tf-tabs {
14377
+ /* segmented controls and tabs scroll sideways when the labels do not fit (block ones shrink) */
14378
+ :where([data-kit="halo"]) .tf-seg:not(.block),
14379
+ :where([data-kit="halo"]) .tf-tabs:not(.tf-tabs-block) {
13428
14380
  max-width: 100%;
13429
14381
  overflow-x: auto;
13430
14382
  scrollbar-width: none;
13431
14383
  }
13432
- :where([data-kit="halo"]) .tf-seg-item,
13433
- :where([data-kit="halo"]) .tf-tab {
14384
+ :where([data-kit="halo"]) .tf-seg:not(.block) .tf-seg-item,
14385
+ :where([data-kit="halo"]) .tf-tabs:not(.tf-tabs-block) .tf-tab {
13434
14386
  flex: none;
13435
14387
  }
13436
14388
  :where([data-kit="halo"]) .tf-seg,
@@ -13579,6 +14531,71 @@
13579
14531
  }
13580
14532
  }
13581
14533
 
14534
+ /* AppShell with a sidebar on phones: the sidebar's bar on top of the frame, the sheet below */
14535
+ @media (max-width: 760px) {
14536
+ :where([data-kit="halo"]) .tf-shell.tf-shell-sidebar {
14537
+ grid-template-columns: minmax(0, 1fr);
14538
+ padding: 0 8px 8px;
14539
+ }
14540
+ }
14541
+
14542
+ /* Fluid at every width: segmented controls, tabs and toggle groups never push past their
14543
+ container. When space runs short the items shrink and their labels end in an ellipsis. */
14544
+ :where([data-kit="halo"]) .tf-tabs {
14545
+ max-width: 100%;
14546
+ box-sizing: border-box;
14547
+ }
14548
+ :where([data-kit="halo"]) .tf-seg-item,
14549
+ :where([data-kit="halo"]) .tf-tab,
14550
+ :where([data-kit="halo"]) .tf-togglegroup .tf-toggle {
14551
+ min-width: 0;
14552
+ }
14553
+ :where([data-kit="halo"]) .tf-seg-label,
14554
+ :where([data-kit="halo"]) .tf-tab,
14555
+ :where([data-kit="halo"]) .tf-toggle-label {
14556
+ overflow: hidden;
14557
+ text-overflow: ellipsis;
14558
+ white-space: nowrap;
14559
+ }
14560
+
14561
+ /* key hints mean nothing on touch screens */
14562
+ @media (pointer: coarse) {
14563
+ :where([data-kit="halo"]) .tf-search .tf-kbd {
14564
+ display: none;
14565
+ }
14566
+ }
14567
+
14568
+ /* Fluid actions: an action row measures itself, so its buttons answer to the box it sits in (a
14569
+ thin card, a side panel, a phone) instead of the window. When the row is narrow it wraps and
14570
+ its buttons share the full width; when it is very narrow each button takes a line. The rows are
14571
+ the kit's own footers and action bars, and plain `.tf-row`s of buttons placed directly in a
14572
+ column box (panel, card, dialog, form …), where they always span the box. */
14573
+ :where([data-kit="halo"]) :is(
14574
+ .tf-modal-foot,
14575
+ .tf-card-foot,
14576
+ .tf-approval-foot,
14577
+ .tf-review-actions,
14578
+ .tf-cookie-actions,
14579
+ .tf-push-actions,
14580
+ .tf-insight-actions,
14581
+ .tf-journal-foot,
14582
+ :is(.tf-panel, .tf-card, .tf-modal, .tf-drawer, .tf-popover, .tf-form, .tf-col)
14583
+ > .tf-row:not(:has(> :not(.tf-btn, .tf-iconbtn)))
14584
+ ) {
14585
+ container: tf-actions / inline-size;
14586
+ flex-wrap: wrap;
14587
+ }
14588
+ @container tf-actions (max-width: 400px) {
14589
+ :where([data-kit="halo"]) .tf-btn {
14590
+ flex: 1 1 auto;
14591
+ }
14592
+ }
14593
+ @container tf-actions (max-width: 240px) {
14594
+ :where([data-kit="halo"]) .tf-btn {
14595
+ flex-basis: 100%;
14596
+ }
14597
+ }
14598
+
13582
14599
  /* 07-polish.css */
13583
14600
  /* ───────────── Polish ─────────────
13584
14601
  Small consistency fixes found by auditing every preview in both kits and themes. Zero
@@ -13786,10 +14803,17 @@
13786
14803
  .tf-card,
13787
14804
  .tf-stat,
13788
14805
  .tf-dock,
13789
- .tf-sidebar,
14806
+ .tf-sidebar:not(.shell),
13790
14807
  .tf-map-legend,
13791
14808
  .tf-map-ctl,
13792
- .tf-map-pop
14809
+ .tf-map-pop,
14810
+ .tf-vital,
14811
+ .tf-journal,
14812
+ .tf-goal,
14813
+ .tf-insight,
14814
+ .tf-consent-item,
14815
+ .tf-nw,
14816
+ .tf-policy
13793
14817
  ):not(
13794
14818
  :is(
13795
14819
  .tf-panel,
@@ -13805,6 +14829,13 @@
13805
14829
  .tf-palette,
13806
14830
  .tf-modal,
13807
14831
  .tf-drawer,
14832
+ .tf-vital,
14833
+ .tf-journal,
14834
+ .tf-goal,
14835
+ .tf-insight,
14836
+ .tf-consent-item,
14837
+ .tf-nw,
14838
+ .tf-policy,
13808
14839
  .tf-glass
13809
14840
  )
13810
14841
  *
@@ -13815,10 +14846,17 @@
13815
14846
  .tf-card,
13816
14847
  .tf-stat,
13817
14848
  .tf-dock,
13818
- .tf-sidebar,
14849
+ .tf-sidebar:not(.shell),
13819
14850
  .tf-map-legend,
13820
14851
  .tf-map-ctl,
13821
- .tf-map-pop
14852
+ .tf-map-pop,
14853
+ .tf-vital,
14854
+ .tf-journal,
14855
+ .tf-goal,
14856
+ .tf-insight,
14857
+ .tf-consent-item,
14858
+ .tf-nw,
14859
+ .tf-policy
13822
14860
  ):not(
13823
14861
  :is(
13824
14862
  .tf-panel,
@@ -13834,6 +14872,13 @@
13834
14872
  .tf-palette,
13835
14873
  .tf-modal,
13836
14874
  .tf-drawer,
14875
+ .tf-vital,
14876
+ .tf-journal,
14877
+ .tf-goal,
14878
+ .tf-insight,
14879
+ .tf-consent-item,
14880
+ .tf-nw,
14881
+ .tf-policy,
13837
14882
  .tf-glass
13838
14883
  )
13839
14884
  *
@@ -13950,6 +14995,10 @@
13950
14995
  .tf-modal,
13951
14996
  .tf-drawer,
13952
14997
  .tf-glass,
14998
+ .tf-insight,
14999
+ .tf-policy,
15000
+ .tf-consent-item,
15001
+ .tf-journal,
13953
15002
  .tf-btngroup,
13954
15003
  .tf-map-ctl,
13955
15004
  .tf-topbar
@@ -13979,6 +15028,10 @@
13979
15028
  .tf-modal,
13980
15029
  .tf-drawer,
13981
15030
  .tf-glass,
15031
+ .tf-insight,
15032
+ .tf-policy,
15033
+ .tf-consent-item,
15034
+ .tf-journal,
13982
15035
  .tf-btngroup,
13983
15036
  .tf-map-ctl,
13984
15037
  .tf-topbar
@@ -14004,10 +15057,38 @@
14004
15057
  }
14005
15058
  :where([data-kit="halo"])[data-surface="glass"]
14006
15059
  :is(.tf-iconbtn-soft, .tf-iconbtn-outline, .tf-btn-secondary, .tf-chip):not(
14007
- :is(.tf-panel, .tf-card, .tf-dock, .tf-popover, .tf-menu, .tf-modal, .tf-drawer, .tf-glass) *
15060
+ :is(
15061
+ .tf-panel,
15062
+ .tf-card,
15063
+ .tf-dock,
15064
+ .tf-popover,
15065
+ .tf-menu,
15066
+ .tf-modal,
15067
+ .tf-drawer,
15068
+ .tf-insight,
15069
+ .tf-policy,
15070
+ .tf-consent-item,
15071
+ .tf-journal,
15072
+ .tf-glass
15073
+ )
15074
+ *
14008
15075
  ):not(.tf-solid):not([aria-pressed="true"]):hover, :where([data-kit="halo"]) [data-surface="glass"]
14009
15076
  :is(.tf-iconbtn-soft, .tf-iconbtn-outline, .tf-btn-secondary, .tf-chip):not(
14010
- :is(.tf-panel, .tf-card, .tf-dock, .tf-popover, .tf-menu, .tf-modal, .tf-drawer, .tf-glass) *
15077
+ :is(
15078
+ .tf-panel,
15079
+ .tf-card,
15080
+ .tf-dock,
15081
+ .tf-popover,
15082
+ .tf-menu,
15083
+ .tf-modal,
15084
+ .tf-drawer,
15085
+ .tf-insight,
15086
+ .tf-policy,
15087
+ .tf-consent-item,
15088
+ .tf-journal,
15089
+ .tf-glass
15090
+ )
15091
+ *
14011
15092
  ):not(.tf-solid):not([aria-pressed="true"]):hover {
14012
15093
  background:
14013
15094
  linear-gradient(var(--glass-hover), var(--glass-hover)) border-box,
@@ -14059,10 +15140,17 @@
14059
15140
  .tf-card,
14060
15141
  .tf-stat,
14061
15142
  .tf-dock,
14062
- .tf-sidebar,
15143
+ .tf-sidebar:not(.shell),
14063
15144
  .tf-map-legend,
14064
15145
  .tf-map-ctl,
14065
- .tf-map-pop
15146
+ .tf-map-pop,
15147
+ .tf-vital,
15148
+ .tf-journal,
15149
+ .tf-goal,
15150
+ .tf-insight,
15151
+ .tf-consent-item,
15152
+ .tf-nw,
15153
+ .tf-policy
14066
15154
  ),
14067
15155
  :where([data-kit="halo"]) [data-surface="glass"]
14068
15156
  :is(
@@ -14070,10 +15158,17 @@
14070
15158
  .tf-card,
14071
15159
  .tf-stat,
14072
15160
  .tf-dock,
14073
- .tf-sidebar,
15161
+ .tf-sidebar:not(.shell),
14074
15162
  .tf-map-legend,
14075
15163
  .tf-map-ctl,
14076
- .tf-map-pop
15164
+ .tf-map-pop,
15165
+ .tf-vital,
15166
+ .tf-journal,
15167
+ .tf-goal,
15168
+ .tf-insight,
15169
+ .tf-consent-item,
15170
+ .tf-nw,
15171
+ .tf-policy
14077
15172
  ) {
14078
15173
  outline: 1px solid CanvasText;
14079
15174
  outline-offset: -1px;
@@ -14102,11 +15197,13 @@
14102
15197
  inset: 0;
14103
15198
  z-index: 1;
14104
15199
  display: grid;
14105
- grid-template-columns: minmax(0, 320px) minmax(0, 1fr) minmax(0, 340px);
15200
+ grid-template-columns:
15201
+ minmax(0, var(--floating-start, 320px)) minmax(0, 1fr)
15202
+ minmax(0, var(--floating-end, 340px));
14106
15203
  grid-template-rows: auto minmax(0, 1fr) auto;
14107
15204
  grid-template-areas:
14108
15205
  "top top top"
14109
- "start . end"
15206
+ "start controls end"
14110
15207
  "bottom bottom bottom";
14111
15208
  gap: var(--space-4);
14112
15209
  padding: var(--space-4);
@@ -14137,16 +15234,42 @@
14137
15234
  grid-area: bottom;
14138
15235
  justify-self: center;
14139
15236
  }
14140
- :where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) {
15237
+ /* background controls and source notes: the free corner, clear of the panels and the dock */
15238
+ :where([data-kit="halo"]) .tf-floating-ui > .tf-floating-controls {
15239
+ grid-area: controls;
15240
+ align-self: end;
15241
+ justify-self: end;
15242
+ display: flex;
15243
+ flex-direction: column;
15244
+ align-items: flex-end;
15245
+ gap: var(--space-2);
14141
15246
  pointer-events: none;
14142
15247
  }
14143
- :where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) > * {
15248
+ :where([data-kit="halo"]) .tf-floating-controls > * {
14144
15249
  pointer-events: auto;
14145
15250
  }
14146
- @container tf-floating (max-width: 720px) {
14147
- /* on a phone the layout grows with its slots and the background fills behind them */
14148
- :where([data-kit="halo"]) .tf-floating-ui {
14149
- position: relative;
15251
+ :where([data-kit="halo"]) .tf-floating-attribution {
15252
+ max-width: 100%;
15253
+ padding: 2px 8px;
15254
+ border-radius: var(--radius-sm);
15255
+ background: var(--surface);
15256
+ color: var(--ink-muted);
15257
+ font: 500 11px/16px var(--font-sans);
15258
+ overflow-wrap: anywhere;
15259
+ }
15260
+ :where([data-kit="halo"]) .tf-floating-handle {
15261
+ display: none;
15262
+ }
15263
+ :where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) {
15264
+ pointer-events: none;
15265
+ }
15266
+ :where([data-kit="halo"]) .tf-floating-ui > :is(.tf-floating-top, .tf-floating-bottom) > * {
15267
+ pointer-events: auto;
15268
+ }
15269
+ @container tf-floating (max-width: 720px) {
15270
+ /* on a phone the layout grows with its slots and the background fills behind them */
15271
+ :where([data-kit="halo"]) .tf-floating-ui {
15272
+ position: relative;
14150
15273
  /* the padding counts into the height it inherits, so the bottom slot stays inside */
14151
15274
  box-sizing: border-box;
14152
15275
  min-height: inherit;
@@ -14162,6 +15285,75 @@
14162
15285
  gap: var(--space-3);
14163
15286
  padding: var(--space-3);
14164
15287
  }
15288
+ :where([data-kit="halo"]) .tf-floating-ui > .tf-floating-controls {
15289
+ grid-area: auto;
15290
+ grid-row: 3;
15291
+ }
15292
+ /* the end slot as a bottom sheet over the background: a peek, or most of the height */
15293
+ :where([data-kit="halo"]) .tf-floating.has-sheet .tf-floating-ui {
15294
+ grid-template-rows: auto auto minmax(120px, 1fr) auto;
15295
+ grid-template-areas:
15296
+ "top"
15297
+ "start"
15298
+ "."
15299
+ "bottom";
15300
+ padding-bottom: calc(var(--space-3) + 96px);
15301
+ }
15302
+ :where([data-kit="halo"]) .tf-floating.has-sheet .tf-floating-end {
15303
+ position: absolute;
15304
+ left: var(--space-3);
15305
+ right: var(--space-3);
15306
+ bottom: 0;
15307
+ z-index: 2;
15308
+ max-height: 96px;
15309
+ overflow: hidden;
15310
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
15311
+ background: var(--surface);
15312
+ box-shadow: var(--shadow-card);
15313
+ transition: max-height var(--dur-base) var(--ease-out);
15314
+ }
15315
+ :where([data-kit="halo"])[data-surface="glass"].tf-floating.has-sheet .tf-floating-end, :where([data-kit="halo"]) [data-surface="glass"].tf-floating.has-sheet .tf-floating-end {
15316
+ background: var(--glass);
15317
+ -webkit-backdrop-filter: var(--glass-filter);
15318
+ backdrop-filter: var(--glass-filter);
15319
+ }
15320
+ :where([data-kit="halo"]) .tf-floating.has-sheet.sheet-full .tf-floating-end {
15321
+ max-height: 75%;
15322
+ overflow-y: auto;
15323
+ }
15324
+ :where([data-kit="halo"]) .tf-floating.has-sheet .tf-floating-handle {
15325
+ display: block;
15326
+ position: sticky;
15327
+ top: 0;
15328
+ z-index: 1;
15329
+ width: 100%;
15330
+ height: 24px;
15331
+ margin: 0;
15332
+ padding: 0;
15333
+ border: 0;
15334
+ background: transparent;
15335
+ cursor: pointer;
15336
+ }
15337
+ :where([data-kit="halo"]) .tf-floating.has-sheet .tf-floating-handle::before {
15338
+ content: "";
15339
+ display: block;
15340
+ width: 40px;
15341
+ height: 4px;
15342
+ margin: 10px auto;
15343
+ border-radius: var(--radius-pill);
15344
+ background: var(--line-strong);
15345
+ }
15346
+ :where([data-kit="halo"]) .tf-floating.has-sheet .tf-floating-handle:focus-visible {
15347
+ outline: 2px solid var(--focus);
15348
+ outline-offset: -2px;
15349
+ }
15350
+ }
15351
+
15352
+ /* in a glass layout the attribution is glass too */
15353
+ :where([data-kit="halo"])[data-surface="glass"] .tf-floating-attribution, :where([data-kit="halo"]) [data-surface="glass"] .tf-floating-attribution {
15354
+ background: var(--glass);
15355
+ -webkit-backdrop-filter: var(--glass-filter);
15356
+ backdrop-filter: var(--glass-filter);
14165
15357
  }
14166
15358
 
14167
15359
  /* 09-motion.css */
@@ -14368,3 +15560,1373 @@
14368
15560
  :where([data-kit="halo"])[data-motion="off"] .tf-ambient-field, :where([data-kit="halo"]) [data-motion="off"] .tf-ambient-field {
14369
15561
  animation: none;
14370
15562
  }
15563
+
15564
+ /* 11-life.css */
15565
+ /* Life: habits, mood, vitals, activity rings, sleep, medication, journal, goals, insights, consent */
15566
+
15567
+ /* HabitTracker */
15568
+ :where([data-kit="halo"]) .tf-habits {
15569
+ container: tf-habits / inline-size;
15570
+ display: grid;
15571
+ gap: 4px;
15572
+ min-width: 0;
15573
+ }
15574
+ :where([data-kit="halo"]) .tf-habit-days,
15575
+ :where([data-kit="halo"]) .tf-habit-marks {
15576
+ display: grid;
15577
+ grid-auto-flow: column;
15578
+ grid-auto-columns: 24px;
15579
+ gap: 6px;
15580
+ }
15581
+ :where([data-kit="halo"]) .tf-habit-days {
15582
+ justify-self: end;
15583
+ padding-right: 12px;
15584
+ font: 600 11px/16px var(--font-sans);
15585
+ color: var(--ink-muted);
15586
+ text-align: center;
15587
+ }
15588
+ :where([data-kit="halo"]) .tf-habit {
15589
+ display: grid;
15590
+ grid-template-columns: auto minmax(0, 1fr) auto;
15591
+ align-items: center;
15592
+ gap: 12px;
15593
+ padding: 8px 12px;
15594
+ border-radius: var(--radius-md);
15595
+ }
15596
+ :where([data-kit="halo"]) .tf-habit:hover {
15597
+ background: var(--surface-sunken);
15598
+ }
15599
+ :where([data-kit="halo"]) .tf-habit-text {
15600
+ display: flex;
15601
+ flex-direction: column;
15602
+ min-width: 0;
15603
+ }
15604
+ :where([data-kit="halo"]) .tf-habit-text b {
15605
+ overflow: hidden;
15606
+ text-overflow: ellipsis;
15607
+ white-space: nowrap;
15608
+ font: 600 14px/20px var(--font-sans);
15609
+ }
15610
+ :where([data-kit="halo"]) .tf-habit-text small {
15611
+ display: flex;
15612
+ flex-wrap: wrap;
15613
+ gap: 4px 10px;
15614
+ font: 500 12px/16px var(--font-sans);
15615
+ color: var(--ink-muted);
15616
+ }
15617
+ :where([data-kit="halo"]) .tf-habit-streak {
15618
+ display: inline-flex;
15619
+ align-items: center;
15620
+ gap: 4px;
15621
+ color: var(--butter-ink);
15622
+ }
15623
+ :where([data-kit="halo"]) .tf-habit-mark {
15624
+ display: grid;
15625
+ place-items: center;
15626
+ width: 24px;
15627
+ height: 24px;
15628
+ box-sizing: border-box;
15629
+ padding: 0;
15630
+ border: 1.5px solid var(--line-strong);
15631
+ border-radius: 50%;
15632
+ background: transparent;
15633
+ color: var(--primary-foreground);
15634
+ }
15635
+ :where([data-kit="halo"]) .tf-habit-mark.done {
15636
+ border-color: var(--mint-ink);
15637
+ background: var(--mint-ink);
15638
+ }
15639
+ /* missed: an empty ring with a small cross; no entry: a faint dashed ring */
15640
+ :where([data-kit="halo"]) .tf-habit-mark.missed {
15641
+ color: var(--ink-subtle);
15642
+ }
15643
+ :where([data-kit="halo"]) .tf-habit-mark:not(.done):not(.missed) {
15644
+ border-style: dashed;
15645
+ border-color: var(--line);
15646
+ }
15647
+ :where([data-kit="halo"]) .tf-habit-mark.today {
15648
+ box-shadow:
15649
+ 0 0 0 2px var(--surface),
15650
+ 0 0 0 4px var(--line-strong);
15651
+ }
15652
+ /* narrow: the marks go under the name, the day labels line up with them */
15653
+ @container tf-habits (max-width: 400px) {
15654
+ :where([data-kit="halo"]) .tf-habit {
15655
+ grid-template-columns: auto minmax(0, 1fr);
15656
+ row-gap: 8px;
15657
+ }
15658
+ :where([data-kit="halo"]) .tf-habit-marks {
15659
+ grid-column: 1 / -1;
15660
+ }
15661
+ :where([data-kit="halo"]) .tf-habit-days {
15662
+ justify-self: start;
15663
+ padding: 0 0 0 12px;
15664
+ }
15665
+ }
15666
+ @container tf-habits (max-width: 240px) {
15667
+ :where([data-kit="halo"]) .tf-habit-days,
15668
+ :where([data-kit="halo"]) .tf-habit-marks {
15669
+ gap: 2px;
15670
+ }
15671
+ }
15672
+ :where([data-kit="halo"]) button.tf-habit-mark {
15673
+ cursor: pointer;
15674
+ }
15675
+ :where([data-kit="halo"]) button.tf-habit-mark:focus-visible {
15676
+ outline: 2px solid var(--focus);
15677
+ outline-offset: 4px;
15678
+ }
15679
+
15680
+ /* MoodPicker */
15681
+ :where([data-kit="halo"]) .tf-mood {
15682
+ min-width: 0;
15683
+ margin: 0;
15684
+ padding: 0;
15685
+ border: 0;
15686
+ }
15687
+ :where([data-kit="halo"]) .tf-mood-q {
15688
+ padding: 0;
15689
+ margin-bottom: 12px;
15690
+ font: 600 14px/20px var(--font-sans);
15691
+ }
15692
+ :where([data-kit="halo"]) .tf-mood-scale {
15693
+ container: tf-mood / inline-size;
15694
+ display: grid;
15695
+ grid-template-columns: repeat(5, minmax(0, 1fr));
15696
+ gap: 8px;
15697
+ }
15698
+ :where([data-kit="halo"]) .tf-mood-opt {
15699
+ position: relative;
15700
+ display: flex;
15701
+ flex-direction: column;
15702
+ align-items: center;
15703
+ justify-content: center;
15704
+ gap: 4px;
15705
+ min-width: 0;
15706
+ min-height: 72px;
15707
+ padding: 8px 4px;
15708
+ box-sizing: border-box;
15709
+ border-radius: var(--radius-md);
15710
+ color: var(--ink-muted);
15711
+ font: 600 12px/16px var(--font-sans);
15712
+ cursor: pointer;
15713
+ }
15714
+ /* the picked level keeps the tint its tf-t-* class gives it */
15715
+ :where([data-kit="halo"]) .tf-mood-opt:not(.on) {
15716
+ background: var(--surface-sunken);
15717
+ }
15718
+ :where([data-kit="halo"]) .tf-mood.compact .tf-mood-opt {
15719
+ min-height: 48px;
15720
+ }
15721
+ :where([data-kit="halo"]) .tf-mood-opt span {
15722
+ max-width: 100%;
15723
+ overflow: hidden;
15724
+ text-overflow: ellipsis;
15725
+ white-space: nowrap;
15726
+ }
15727
+ /* narrow: tighter cells so every word still fits */
15728
+ @container tf-mood (max-width: 300px) {
15729
+ :where([data-kit="halo"]) .tf-mood-opt {
15730
+ padding: 8px 2px;
15731
+ font-size: 11px;
15732
+ }
15733
+ }
15734
+ :where([data-kit="halo"]) .tf-mood-opt input {
15735
+ position: absolute;
15736
+ inset: 0;
15737
+ margin: 0;
15738
+ opacity: 0;
15739
+ cursor: pointer;
15740
+ }
15741
+ :where([data-kit="halo"]) .tf-mood-opt:hover {
15742
+ color: var(--ink);
15743
+ }
15744
+ :where([data-kit="halo"]) .tf-mood-opt.on {
15745
+ box-shadow: inset 0 0 0 2px currentColor;
15746
+ }
15747
+ :where([data-kit="halo"]) .tf-mood-opt:has(input:focus-visible) {
15748
+ outline: 2px solid var(--focus);
15749
+ outline-offset: 2px;
15750
+ }
15751
+
15752
+ /* VitalTile */
15753
+ :where([data-kit="halo"]) .tf-vital {
15754
+ display: flex;
15755
+ flex-direction: column;
15756
+ gap: 12px;
15757
+ min-width: 0;
15758
+ padding: 16px;
15759
+ border-radius: var(--radius-lg);
15760
+ background: var(--surface);
15761
+ box-shadow: var(--shadow-card);
15762
+ }
15763
+ :where([data-kit="halo"]) .tf-vital-head {
15764
+ display: flex;
15765
+ align-items: center;
15766
+ justify-content: space-between;
15767
+ gap: 8px;
15768
+ }
15769
+ :where([data-kit="halo"]) .tf-vital-head .tf-badge {
15770
+ flex: none;
15771
+ white-space: nowrap;
15772
+ }
15773
+ :where([data-kit="halo"]) .tf-vital-label {
15774
+ display: inline-flex;
15775
+ align-items: center;
15776
+ gap: 6px;
15777
+ min-width: 0;
15778
+ font: 600 13px/18px var(--font-sans);
15779
+ color: var(--ink-muted);
15780
+ }
15781
+ :where([data-kit="halo"]) .tf-vital-main {
15782
+ display: flex;
15783
+ align-items: flex-end;
15784
+ justify-content: space-between;
15785
+ gap: 12px;
15786
+ }
15787
+ :where([data-kit="halo"]) .tf-vital-value {
15788
+ font: 700 28px/34px var(--font-sans);
15789
+ letter-spacing: -0.02em;
15790
+ font-variant-numeric: tabular-nums;
15791
+ }
15792
+ :where([data-kit="halo"]) .tf-vital-value small {
15793
+ margin-left: 4px;
15794
+ font: 600 13px/18px var(--font-sans);
15795
+ letter-spacing: 0;
15796
+ color: var(--ink-muted);
15797
+ }
15798
+ :where([data-kit="halo"]) .tf-vital-band {
15799
+ position: relative;
15800
+ height: 8px;
15801
+ border-radius: var(--radius-pill);
15802
+ background: var(--surface-sunken);
15803
+ }
15804
+ :where([data-kit="halo"]) .tf-vital-normal {
15805
+ position: absolute;
15806
+ top: 0;
15807
+ bottom: 0;
15808
+ border-radius: var(--radius-pill);
15809
+ background: var(--mint);
15810
+ }
15811
+ :where([data-kit="halo"]) .tf-vital-dot {
15812
+ position: absolute;
15813
+ top: 50%;
15814
+ width: 14px;
15815
+ height: 14px;
15816
+ box-sizing: border-box;
15817
+ border: 3px solid var(--surface);
15818
+ border-radius: 50%;
15819
+ background: var(--mint-ink);
15820
+ translate: -50% -50%;
15821
+ }
15822
+ :where([data-kit="halo"]) .tf-vital.is-low .tf-vital-dot,
15823
+ :where([data-kit="halo"]) .tf-vital.is-high .tf-vital-dot {
15824
+ background: var(--butter-ink);
15825
+ }
15826
+ :where([data-kit="halo"]) .tf-vital-foot {
15827
+ display: flex;
15828
+ flex-wrap: wrap;
15829
+ justify-content: space-between;
15830
+ gap: 4px 12px;
15831
+ font: 500 12px/16px var(--font-sans);
15832
+ color: var(--ink-muted);
15833
+ }
15834
+
15835
+ /* ActivityRings */
15836
+ :where([data-kit="halo"]) .tf-rings {
15837
+ display: flex;
15838
+ flex-wrap: wrap;
15839
+ align-items: center;
15840
+ gap: 20px;
15841
+ min-width: 0;
15842
+ }
15843
+ :where([data-kit="halo"]) .tf-rings svg {
15844
+ flex: none;
15845
+ }
15846
+ :where([data-kit="halo"]) .tf-rings-legend {
15847
+ display: flex;
15848
+ flex-direction: column;
15849
+ gap: 8px;
15850
+ min-width: 0;
15851
+ margin: 0;
15852
+ padding: 0;
15853
+ list-style: none;
15854
+ }
15855
+ :where([data-kit="halo"]) .tf-rings-legend li {
15856
+ display: grid;
15857
+ grid-template-columns: auto minmax(0, 1fr);
15858
+ align-items: center;
15859
+ column-gap: 8px;
15860
+ }
15861
+ :where([data-kit="halo"]) .tf-rings-key {
15862
+ width: 10px;
15863
+ height: 10px;
15864
+ border-radius: 50%;
15865
+ }
15866
+ :where([data-kit="halo"]) .tf-rings-name {
15867
+ font: 600 12px/16px var(--font-sans);
15868
+ color: var(--ink-muted);
15869
+ }
15870
+ :where([data-kit="halo"]) .tf-rings-legend b {
15871
+ grid-column: 2;
15872
+ font: 700 14px/20px var(--font-sans);
15873
+ font-variant-numeric: tabular-nums;
15874
+ }
15875
+
15876
+ /* SleepChart */
15877
+ :where([data-kit="halo"]) .tf-sleep {
15878
+ display: flex;
15879
+ flex-direction: column;
15880
+ gap: 16px;
15881
+ min-width: 0;
15882
+ }
15883
+ :where([data-kit="halo"]) .tf-sleep-chart {
15884
+ display: flex;
15885
+ flex-direction: column;
15886
+ gap: 6px;
15887
+ }
15888
+ :where([data-kit="halo"]) .tf-sleep-lane {
15889
+ display: grid;
15890
+ grid-template-columns: 52px minmax(0, 1fr);
15891
+ align-items: center;
15892
+ gap: 12px;
15893
+ }
15894
+ :where([data-kit="halo"]) .tf-sleep-name {
15895
+ font: 600 12px/16px var(--font-sans);
15896
+ color: var(--ink-muted);
15897
+ }
15898
+ :where([data-kit="halo"]) .tf-sleep-track {
15899
+ position: relative;
15900
+ height: 20px;
15901
+ border-radius: var(--radius-sm);
15902
+ background: var(--surface-sunken);
15903
+ }
15904
+ :where([data-kit="halo"]) .tf-sleep-seg {
15905
+ position: absolute;
15906
+ top: 2px;
15907
+ bottom: 2px;
15908
+ min-width: 2px;
15909
+ border-radius: var(--radius-sm);
15910
+ }
15911
+ :where([data-kit="halo"]) .tf-sleep-axis {
15912
+ display: flex;
15913
+ justify-content: space-between;
15914
+ margin-left: 64px;
15915
+ font: 500 11px/16px var(--font-sans);
15916
+ color: var(--ink-muted);
15917
+ font-variant-numeric: tabular-nums;
15918
+ }
15919
+ :where([data-kit="halo"]) .tf-sleep-sum {
15920
+ display: flex;
15921
+ flex-wrap: wrap;
15922
+ align-items: center;
15923
+ justify-content: space-between;
15924
+ gap: 8px 16px;
15925
+ }
15926
+ :where([data-kit="halo"]) .tf-sleep-sum b {
15927
+ font: 700 14px/20px var(--font-sans);
15928
+ }
15929
+ :where([data-kit="halo"]) .tf-sleep-sum ul {
15930
+ display: flex;
15931
+ flex-wrap: wrap;
15932
+ gap: 4px 14px;
15933
+ margin: 0;
15934
+ padding: 0;
15935
+ list-style: none;
15936
+ }
15937
+ :where([data-kit="halo"]) .tf-sleep-sum li {
15938
+ display: inline-flex;
15939
+ align-items: center;
15940
+ gap: 6px;
15941
+ font: 500 12px/16px var(--font-sans);
15942
+ color: var(--ink-muted);
15943
+ }
15944
+ :where([data-kit="halo"]) .tf-sleep-sum li span:last-child {
15945
+ color: var(--ink);
15946
+ font-weight: 600;
15947
+ font-variant-numeric: tabular-nums;
15948
+ }
15949
+
15950
+ /* MedicationList */
15951
+ :where([data-kit="halo"]) .tf-meds {
15952
+ container: tf-meds / inline-size;
15953
+ display: flex;
15954
+ flex-direction: column;
15955
+ gap: 4px;
15956
+ min-width: 0;
15957
+ margin: 0;
15958
+ padding: 0;
15959
+ list-style: none;
15960
+ }
15961
+ :where([data-kit="halo"]) .tf-med {
15962
+ display: grid;
15963
+ grid-template-columns: 48px auto minmax(0, 1fr) auto;
15964
+ align-items: center;
15965
+ gap: 12px;
15966
+ padding: 8px 12px;
15967
+ border-radius: var(--radius-md);
15968
+ }
15969
+ :where([data-kit="halo"]) .tf-med.is-due {
15970
+ background: var(--surface-sunken);
15971
+ }
15972
+ :where([data-kit="halo"]) .tf-med-time {
15973
+ font: 600 13px/18px var(--font-sans);
15974
+ font-variant-numeric: tabular-nums;
15975
+ color: var(--ink-muted);
15976
+ }
15977
+ :where([data-kit="halo"]) .tf-med-text {
15978
+ display: flex;
15979
+ flex-direction: column;
15980
+ min-width: 0;
15981
+ }
15982
+ :where([data-kit="halo"]) .tf-med-text b {
15983
+ font: 600 14px/20px var(--font-sans);
15984
+ overflow-wrap: break-word;
15985
+ }
15986
+ :where([data-kit="halo"]) .tf-med-text small {
15987
+ font: 500 12px/16px var(--font-sans);
15988
+ color: var(--ink-muted);
15989
+ }
15990
+ :where([data-kit="halo"]) .tf-med.is-taken .tf-med-text b {
15991
+ color: var(--ink-muted);
15992
+ }
15993
+ :where([data-kit="halo"]) .tf-med-act {
15994
+ display: inline-flex;
15995
+ align-items: center;
15996
+ gap: 8px;
15997
+ }
15998
+ /* narrow: time, name and status; the icon gives way */
15999
+ @container tf-meds (max-width: 400px) {
16000
+ :where([data-kit="halo"]) .tf-med {
16001
+ grid-template-columns: 44px minmax(0, 1fr) auto;
16002
+ gap: 8px;
16003
+ padding: 8px;
16004
+ }
16005
+ :where([data-kit="halo"]) .tf-med > .tf-tinticon {
16006
+ display: none;
16007
+ }
16008
+ }
16009
+
16010
+ /* JournalEntry */
16011
+ :where([data-kit="halo"]) .tf-journal {
16012
+ display: flex;
16013
+ flex-direction: column;
16014
+ gap: 8px;
16015
+ min-width: 0;
16016
+ padding: 20px;
16017
+ border-radius: var(--radius-lg);
16018
+ background: var(--surface);
16019
+ box-shadow: var(--shadow-card);
16020
+ }
16021
+ :where([data-kit="halo"]) .tf-journal-head {
16022
+ display: flex;
16023
+ flex-wrap: wrap;
16024
+ align-items: center;
16025
+ justify-content: space-between;
16026
+ gap: 8px;
16027
+ font: 600 12px/16px var(--font-sans);
16028
+ color: var(--ink-muted);
16029
+ }
16030
+ :where([data-kit="halo"]) .tf-journal-mood {
16031
+ display: inline-flex;
16032
+ align-items: center;
16033
+ gap: 4px;
16034
+ padding: 2px 8px;
16035
+ border-radius: var(--radius-pill);
16036
+ }
16037
+ :where([data-kit="halo"]) .tf-journal-title {
16038
+ margin: 0;
16039
+ font: 700 16px/22px var(--font-sans);
16040
+ }
16041
+ :where([data-kit="halo"]) .tf-journal-body {
16042
+ font: 500 14px/22px var(--font-sans);
16043
+ color: var(--ink);
16044
+ overflow-wrap: anywhere;
16045
+ }
16046
+ :where([data-kit="halo"]) .tf-journal-body p {
16047
+ margin: 0 0 8px;
16048
+ }
16049
+ :where([data-kit="halo"]) .tf-journal-foot {
16050
+ display: flex;
16051
+ flex-wrap: wrap;
16052
+ align-items: center;
16053
+ justify-content: space-between;
16054
+ gap: 8px;
16055
+ padding-top: 4px;
16056
+ }
16057
+ :where([data-kit="halo"]) .tf-journal-tags {
16058
+ display: flex;
16059
+ flex-wrap: wrap;
16060
+ gap: 6px;
16061
+ }
16062
+
16063
+ /* GoalCard */
16064
+ :where([data-kit="halo"]) .tf-goal {
16065
+ display: flex;
16066
+ flex-direction: column;
16067
+ gap: 12px;
16068
+ min-width: 0;
16069
+ padding: 20px;
16070
+ border-radius: var(--radius-lg);
16071
+ background: var(--surface);
16072
+ box-shadow: var(--shadow-card);
16073
+ }
16074
+ /* narrow: the icon steps aside so the title keeps whole words */
16075
+ @container tf-goal (max-width: 280px) {
16076
+ :where([data-kit="halo"]) .tf-goal-head > .tf-tinticon {
16077
+ display: none;
16078
+ }
16079
+ }
16080
+ :where([data-kit="halo"]) .tf-goal-head {
16081
+ container: tf-goal / inline-size;
16082
+ display: flex;
16083
+ align-items: center;
16084
+ gap: 12px;
16085
+ }
16086
+ :where([data-kit="halo"]) .tf-goal-head .tf-option-text {
16087
+ flex: 1;
16088
+ padding: 0;
16089
+ }
16090
+ :where([data-kit="halo"]) .tf-goal-head b {
16091
+ font: 700 14px/20px var(--font-sans);
16092
+ }
16093
+ :where([data-kit="halo"]) .tf-goal-pct {
16094
+ font: 700 20px/26px var(--font-sans);
16095
+ font-variant-numeric: tabular-nums;
16096
+ }
16097
+ :where([data-kit="halo"]) .tf-goal-bar {
16098
+ height: 10px;
16099
+ overflow: hidden;
16100
+ border-radius: var(--radius-pill);
16101
+ background: var(--surface-sunken);
16102
+ }
16103
+ :where([data-kit="halo"]) .tf-goal-bar > span {
16104
+ display: block;
16105
+ height: 100%;
16106
+ border-radius: var(--radius-pill);
16107
+ }
16108
+ :where([data-kit="halo"]) .tf-goal-meta,
16109
+ :where([data-kit="halo"]) .tf-goal-note {
16110
+ margin: 0;
16111
+ font: 500 12px/16px var(--font-sans);
16112
+ color: var(--ink-muted);
16113
+ }
16114
+ :where([data-kit="halo"]) .tf-goal-steps {
16115
+ display: flex;
16116
+ flex-direction: column;
16117
+ gap: 6px;
16118
+ margin: 0;
16119
+ padding: 0;
16120
+ list-style: none;
16121
+ font: 500 13px/18px var(--font-sans);
16122
+ }
16123
+ :where([data-kit="halo"]) .tf-goal-steps li {
16124
+ display: flex;
16125
+ align-items: center;
16126
+ gap: 8px;
16127
+ }
16128
+ :where([data-kit="halo"]) .tf-goal-steps li.done {
16129
+ color: var(--ink-muted);
16130
+ }
16131
+ :where([data-kit="halo"]) .tf-goal-step {
16132
+ display: grid;
16133
+ place-items: center;
16134
+ flex: none;
16135
+ width: 16px;
16136
+ height: 16px;
16137
+ box-sizing: border-box;
16138
+ border: 1.5px solid var(--line-strong);
16139
+ border-radius: 50%;
16140
+ color: var(--primary-foreground);
16141
+ }
16142
+ :where([data-kit="halo"]) .tf-goal-steps li.done .tf-goal-step {
16143
+ border-color: var(--primary);
16144
+ background: var(--primary);
16145
+ }
16146
+
16147
+ /* InsightCard */
16148
+ :where([data-kit="halo"]) .tf-insight {
16149
+ display: flex;
16150
+ flex-direction: column;
16151
+ gap: 12px;
16152
+ min-width: 0;
16153
+ padding: 16px 16px 16px 20px;
16154
+ border-radius: var(--radius-lg);
16155
+ background: var(--surface);
16156
+ box-shadow:
16157
+ var(--shadow-card),
16158
+ inset 3px 0 0 var(--sky-ink);
16159
+ /* on glass the card takes a faint wash of its tone */
16160
+ --tint: var(--sky);
16161
+ }
16162
+ :where([data-kit="halo"]) .tf-insight.is-success {
16163
+ --tint: var(--mint);
16164
+ box-shadow:
16165
+ var(--shadow-card),
16166
+ inset 3px 0 0 var(--mint-ink);
16167
+ }
16168
+ :where([data-kit="halo"]) .tf-insight.is-warning {
16169
+ --tint: var(--butter);
16170
+ box-shadow:
16171
+ var(--shadow-card),
16172
+ inset 3px 0 0 var(--butter-ink);
16173
+ }
16174
+ :where([data-kit="halo"]) .tf-insight.is-highlight {
16175
+ --tint: var(--lilac);
16176
+ box-shadow:
16177
+ var(--shadow-card),
16178
+ inset 3px 0 0 var(--lilac-ink);
16179
+ }
16180
+ :where([data-kit="halo"]) .tf-insight-head {
16181
+ display: flex;
16182
+ align-items: flex-start;
16183
+ gap: 12px;
16184
+ }
16185
+ :where([data-kit="halo"]) .tf-insight-titles {
16186
+ display: flex;
16187
+ flex: 1;
16188
+ flex-direction: column;
16189
+ min-width: 0;
16190
+ }
16191
+ :where([data-kit="halo"]) .tf-insight-titles small {
16192
+ font: 600 12px/16px var(--font-sans);
16193
+ color: var(--ink-muted);
16194
+ }
16195
+ :where([data-kit="halo"]) .tf-insight-titles b {
16196
+ font: 700 15px/22px var(--font-sans);
16197
+ overflow-wrap: anywhere;
16198
+ }
16199
+ :where([data-kit="halo"]) .tf-insight-body {
16200
+ font: 500 14px/20px var(--font-sans);
16201
+ color: var(--ink);
16202
+ }
16203
+ :where([data-kit="halo"]) .tf-insight-why button {
16204
+ display: inline-flex;
16205
+ align-items: center;
16206
+ gap: 6px;
16207
+ min-height: 24px;
16208
+ padding: 0;
16209
+ border: 0;
16210
+ background: none;
16211
+ color: var(--ink-muted);
16212
+ font: 600 12px/16px var(--font-sans);
16213
+ cursor: pointer;
16214
+ }
16215
+ :where([data-kit="halo"]) .tf-insight-why button:hover {
16216
+ color: var(--ink);
16217
+ }
16218
+ :where([data-kit="halo"]) .tf-insight-why button:focus-visible {
16219
+ outline: 2px solid var(--focus);
16220
+ outline-offset: 2px;
16221
+ border-radius: var(--radius-sm);
16222
+ }
16223
+ :where([data-kit="halo"]) .tf-insight-why button[aria-expanded="true"] .tf-insight-chev {
16224
+ rotate: 180deg;
16225
+ }
16226
+ :where([data-kit="halo"]) .tf-insight-whytext {
16227
+ margin-top: 8px;
16228
+ padding: 12px;
16229
+ border-radius: var(--radius-md);
16230
+ background: var(--surface-sunken);
16231
+ font: 500 13px/18px var(--font-sans);
16232
+ color: var(--ink-muted);
16233
+ }
16234
+ :where([data-kit="halo"]) .tf-insight-actions {
16235
+ display: flex;
16236
+ flex-wrap: wrap;
16237
+ justify-content: flex-end;
16238
+ gap: 8px;
16239
+ }
16240
+
16241
+ /* ConsentList */
16242
+ :where([data-kit="halo"]) .tf-consent {
16243
+ display: flex;
16244
+ flex-direction: column;
16245
+ gap: 12px;
16246
+ min-width: 0;
16247
+ }
16248
+ :where([data-kit="halo"]) .tf-consent-item {
16249
+ display: flex;
16250
+ flex-direction: column;
16251
+ gap: 12px;
16252
+ padding: 16px;
16253
+ border-radius: var(--radius-lg);
16254
+ background: var(--surface);
16255
+ box-shadow: var(--shadow-card);
16256
+ }
16257
+ :where([data-kit="halo"]) .tf-consent-head {
16258
+ display: flex;
16259
+ flex-wrap: wrap;
16260
+ align-items: center;
16261
+ gap: 12px;
16262
+ }
16263
+ :where([data-kit="halo"]) .tf-consent-head .tf-option-text {
16264
+ flex: 1;
16265
+ min-width: 140px;
16266
+ padding: 0;
16267
+ }
16268
+ :where([data-kit="halo"]) .tf-consent-purpose {
16269
+ margin: 0;
16270
+ font: 500 13px/18px var(--font-sans);
16271
+ color: var(--ink-muted);
16272
+ }
16273
+ :where([data-kit="halo"]) .tf-consent-scopes {
16274
+ display: flex;
16275
+ flex-direction: column;
16276
+ margin: 0;
16277
+ padding: 0;
16278
+ list-style: none;
16279
+ }
16280
+ :where([data-kit="halo"]) .tf-consent-scopes li {
16281
+ display: flex;
16282
+ align-items: center;
16283
+ justify-content: space-between;
16284
+ gap: 12px;
16285
+ padding: 10px 0;
16286
+ border-top: 1px solid var(--line);
16287
+ }
16288
+ :where([data-kit="halo"]) .tf-consent-scopes .tf-option-text {
16289
+ min-width: 0;
16290
+ padding: 0;
16291
+ }
16292
+ :where([data-kit="halo"]) .tf-consent-req {
16293
+ flex: none;
16294
+ font: 600 12px/16px var(--font-sans);
16295
+ color: var(--ink-muted);
16296
+ }
16297
+
16298
+ /* 12-household.css */
16299
+ /* Life: budgets, subscriptions, net worth, deadlines, policies, coverage, claims, documents */
16300
+
16301
+ /* BudgetList */
16302
+ :where([data-kit="halo"]) .tf-budgets,
16303
+ :where([data-kit="halo"]) .tf-subs ul,
16304
+ :where([data-kit="halo"]) .tf-deadlines,
16305
+ :where([data-kit="halo"]) .tf-docs,
16306
+ :where([data-kit="halo"]) .tf-claim-steps,
16307
+ :where([data-kit="halo"]) .tf-nw-side ul {
16308
+ margin: 0;
16309
+ padding: 0;
16310
+ list-style: none;
16311
+ }
16312
+ :where([data-kit="halo"]) .tf-budgets {
16313
+ display: flex;
16314
+ flex-direction: column;
16315
+ gap: 4px;
16316
+ min-width: 0;
16317
+ }
16318
+ :where([data-kit="halo"]) .tf-budget {
16319
+ container: tf-budget / inline-size;
16320
+ display: flex;
16321
+ align-items: center;
16322
+ gap: 12px;
16323
+ width: 100%;
16324
+ padding: 10px 12px;
16325
+ box-sizing: border-box;
16326
+ border: 0;
16327
+ border-radius: var(--radius-md);
16328
+ background: transparent;
16329
+ color: var(--ink);
16330
+ font: inherit;
16331
+ text-align: left;
16332
+ }
16333
+ :where([data-kit="halo"]) button.tf-budget {
16334
+ cursor: pointer;
16335
+ }
16336
+ :where([data-kit="halo"]) button.tf-budget:hover {
16337
+ background: var(--accent);
16338
+ }
16339
+ :where([data-kit="halo"]) button.tf-budget:focus-visible {
16340
+ outline: 2px solid var(--focus);
16341
+ outline-offset: 2px;
16342
+ }
16343
+ :where([data-kit="halo"]) .tf-budget-main {
16344
+ display: flex;
16345
+ flex: 1;
16346
+ flex-direction: column;
16347
+ gap: 6px;
16348
+ min-width: 0;
16349
+ }
16350
+ :where([data-kit="halo"]) .tf-budget-top {
16351
+ display: flex;
16352
+ flex-wrap: wrap;
16353
+ align-items: baseline;
16354
+ justify-content: space-between;
16355
+ gap: 0 12px;
16356
+ }
16357
+ /* narrow: the icon steps aside so the category keeps its name */
16358
+ @container tf-budget (max-width: 300px) {
16359
+ :where([data-kit="halo"]) .tf-budget > .tf-tinticon {
16360
+ display: none;
16361
+ }
16362
+ }
16363
+ :where([data-kit="halo"]) .tf-budget-top b {
16364
+ min-width: 0;
16365
+ overflow: hidden;
16366
+ text-overflow: ellipsis;
16367
+ white-space: nowrap;
16368
+ font: 600 14px/20px var(--font-sans);
16369
+ }
16370
+ :where([data-kit="halo"]) .tf-budget-nums {
16371
+ flex: none;
16372
+ font: 700 13px/18px var(--font-sans);
16373
+ font-variant-numeric: tabular-nums;
16374
+ }
16375
+ :where([data-kit="halo"]) .tf-budget-nums small {
16376
+ font-weight: 500;
16377
+ color: var(--ink-muted);
16378
+ }
16379
+ :where([data-kit="halo"]) .tf-budget-bar {
16380
+ display: block;
16381
+ height: 8px;
16382
+ overflow: hidden;
16383
+ border-radius: var(--radius-pill);
16384
+ background: var(--surface-sunken);
16385
+ }
16386
+ :where([data-kit="halo"]) .tf-budget-bar > span {
16387
+ display: block;
16388
+ height: 100%;
16389
+ border-radius: var(--radius-pill);
16390
+ }
16391
+ :where([data-kit="halo"]) .tf-budget-left {
16392
+ font: 500 12px/16px var(--font-sans);
16393
+ color: var(--ink-muted);
16394
+ }
16395
+ :where([data-kit="halo"]) .tf-budget-left.over {
16396
+ color: var(--blush-ink);
16397
+ font-weight: 600;
16398
+ }
16399
+
16400
+ /* SubscriptionList */
16401
+ :where([data-kit="halo"]) .tf-subs {
16402
+ display: flex;
16403
+ flex-direction: column;
16404
+ gap: 8px;
16405
+ min-width: 0;
16406
+ }
16407
+ :where([data-kit="halo"]) .tf-subs ul {
16408
+ container: tf-subs / inline-size;
16409
+ display: flex;
16410
+ flex-direction: column;
16411
+ }
16412
+ :where([data-kit="halo"]) .tf-sub {
16413
+ display: flex;
16414
+ align-items: center;
16415
+ gap: 12px;
16416
+ padding: 10px 4px;
16417
+ border-bottom: 1px solid var(--line);
16418
+ }
16419
+ :where([data-kit="halo"]) .tf-sub:last-child {
16420
+ border-bottom: 0;
16421
+ }
16422
+ :where([data-kit="halo"]) .tf-sub-text {
16423
+ display: flex;
16424
+ flex: 1;
16425
+ flex-direction: column;
16426
+ min-width: 0;
16427
+ }
16428
+ :where([data-kit="halo"]) .tf-sub-text b {
16429
+ overflow: hidden;
16430
+ text-overflow: ellipsis;
16431
+ white-space: nowrap;
16432
+ font: 600 14px/20px var(--font-sans);
16433
+ }
16434
+ :where([data-kit="halo"]) .tf-sub-text small {
16435
+ font: 500 12px/16px var(--font-sans);
16436
+ color: var(--ink-muted);
16437
+ }
16438
+ :where([data-kit="halo"]) .tf-sub-amount {
16439
+ flex: none;
16440
+ font: 700 14px/20px var(--font-sans);
16441
+ font-variant-numeric: tabular-nums;
16442
+ text-align: right;
16443
+ }
16444
+ :where([data-kit="halo"]) .tf-sub-amount small {
16445
+ margin-left: 2px;
16446
+ font-weight: 500;
16447
+ color: var(--ink-muted);
16448
+ }
16449
+ /* narrow: amount and trial badge go under the name, the menu stays at the end */
16450
+ @container tf-subs (max-width: 380px) {
16451
+ :where([data-kit="halo"]) .tf-sub {
16452
+ display: grid;
16453
+ grid-template-columns: auto minmax(0, 1fr) auto;
16454
+ gap: 4px 12px;
16455
+ align-items: center;
16456
+ }
16457
+ :where([data-kit="halo"]) .tf-sub > :first-child {
16458
+ grid-row: 1 / span 2;
16459
+ align-self: start;
16460
+ }
16461
+ :where([data-kit="halo"]) .tf-sub > .tf-sub-text,
16462
+ :where([data-kit="halo"]) .tf-sub > .tf-badge,
16463
+ :where([data-kit="halo"]) .tf-sub > .tf-sub-amount {
16464
+ grid-column: 2;
16465
+ justify-self: start;
16466
+ text-align: left;
16467
+ }
16468
+ :where([data-kit="halo"]) .tf-sub > :last-child:not(.tf-sub-amount) {
16469
+ grid-column: 3;
16470
+ grid-row: 1;
16471
+ }
16472
+ }
16473
+ :where([data-kit="halo"]) .tf-sub.is-cancelled .tf-sub-text b,
16474
+ :where([data-kit="halo"]) .tf-sub.is-cancelled .tf-sub-amount {
16475
+ color: var(--ink-muted);
16476
+ text-decoration: line-through;
16477
+ }
16478
+ :where([data-kit="halo"]) .tf-subs-total {
16479
+ display: flex;
16480
+ flex-wrap: wrap;
16481
+ align-items: baseline;
16482
+ justify-content: space-between;
16483
+ gap: 4px 12px;
16484
+ padding: 12px;
16485
+ border-radius: var(--radius-md);
16486
+ background: var(--surface-sunken);
16487
+ font: 500 13px/18px var(--font-sans);
16488
+ color: var(--ink-muted);
16489
+ }
16490
+ :where([data-kit="halo"]) .tf-subs-total b {
16491
+ color: var(--ink);
16492
+ font: 700 15px/20px var(--font-sans);
16493
+ }
16494
+
16495
+ /* NetWorthCard */
16496
+ :where([data-kit="halo"]) .tf-nw {
16497
+ display: flex;
16498
+ flex-direction: column;
16499
+ gap: 16px;
16500
+ min-width: 0;
16501
+ padding: 20px;
16502
+ border-radius: var(--radius-lg);
16503
+ background: var(--surface);
16504
+ box-shadow: var(--shadow-card);
16505
+ }
16506
+ :where([data-kit="halo"]) .tf-nw-head {
16507
+ display: flex;
16508
+ flex-wrap: wrap;
16509
+ align-items: flex-end;
16510
+ justify-content: space-between;
16511
+ gap: 12px;
16512
+ }
16513
+ :where([data-kit="halo"]) .tf-nw-head > :first-child {
16514
+ flex: 1 1 200px;
16515
+ }
16516
+ :where([data-kit="halo"]) .tf-nw-head > :last-child:not(:first-child) {
16517
+ flex: none;
16518
+ max-width: 45%;
16519
+ }
16520
+ :where([data-kit="halo"]) .tf-nw-title {
16521
+ font: 600 13px/18px var(--font-sans);
16522
+ color: var(--ink-muted);
16523
+ }
16524
+ :where([data-kit="halo"]) .tf-nw-total {
16525
+ font: 700 32px/38px var(--font-sans);
16526
+ letter-spacing: -0.02em;
16527
+ font-variant-numeric: tabular-nums;
16528
+ }
16529
+ :where([data-kit="halo"]) .tf-nw-change {
16530
+ display: inline-flex;
16531
+ align-items: center;
16532
+ gap: 4px;
16533
+ font: 600 12px/16px var(--font-sans);
16534
+ color: var(--mint-ink);
16535
+ }
16536
+ :where([data-kit="halo"]) .tf-nw-change.down {
16537
+ color: var(--blush-ink);
16538
+ }
16539
+ :where([data-kit="halo"]) .tf-nw-change.down .tf-ico {
16540
+ rotate: 180deg;
16541
+ }
16542
+ :where([data-kit="halo"]) .tf-nw-change span {
16543
+ font-weight: 500;
16544
+ color: var(--ink-muted);
16545
+ }
16546
+ :where([data-kit="halo"]) .tf-nw-sides {
16547
+ display: grid;
16548
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
16549
+ gap: 16px;
16550
+ }
16551
+ :where([data-kit="halo"]) .tf-nw-side {
16552
+ display: flex;
16553
+ flex-direction: column;
16554
+ gap: 8px;
16555
+ min-width: 0;
16556
+ }
16557
+ :where([data-kit="halo"]) .tf-nw-sidehead {
16558
+ display: flex;
16559
+ justify-content: space-between;
16560
+ gap: 8px;
16561
+ padding-bottom: 8px;
16562
+ border-bottom: 1px solid var(--line);
16563
+ font: 600 12px/16px var(--font-sans);
16564
+ color: var(--ink-muted);
16565
+ }
16566
+ :where([data-kit="halo"]) .tf-nw-sidehead b {
16567
+ color: var(--ink);
16568
+ font-variant-numeric: tabular-nums;
16569
+ }
16570
+ :where([data-kit="halo"]) .tf-nw-side li {
16571
+ display: flex;
16572
+ justify-content: space-between;
16573
+ gap: 8px;
16574
+ padding: 4px 0;
16575
+ font: 500 13px/18px var(--font-sans);
16576
+ }
16577
+ :where([data-kit="halo"]) .tf-nw-side li span:first-child {
16578
+ display: inline-flex;
16579
+ align-items: center;
16580
+ gap: 6px;
16581
+ min-width: 0;
16582
+ color: var(--ink-muted);
16583
+ }
16584
+ :where([data-kit="halo"]) .tf-nw-side li span:last-child {
16585
+ font-variant-numeric: tabular-nums;
16586
+ }
16587
+
16588
+ /* DeadlineList */
16589
+ :where([data-kit="halo"]) .tf-deadlines {
16590
+ display: flex;
16591
+ flex-direction: column;
16592
+ gap: 4px;
16593
+ min-width: 0;
16594
+ }
16595
+ :where([data-kit="halo"]) .tf-deadline {
16596
+ display: flex;
16597
+ flex-wrap: wrap;
16598
+ align-items: center;
16599
+ gap: 8px 12px;
16600
+ padding: 8px 12px;
16601
+ border-radius: var(--radius-md);
16602
+ }
16603
+ :where([data-kit="halo"]) .tf-deadline.is-overdue {
16604
+ background: var(--blush);
16605
+ }
16606
+ :where([data-kit="halo"]) .tf-deadline.is-soon {
16607
+ background: var(--surface-sunken);
16608
+ }
16609
+ :where([data-kit="halo"]) .tf-deadline-date {
16610
+ display: flex;
16611
+ flex: none;
16612
+ flex-direction: column;
16613
+ align-items: center;
16614
+ width: 40px;
16615
+ padding: 4px 0;
16616
+ border-radius: var(--radius-sm);
16617
+ background: var(--surface);
16618
+ box-shadow: inset 0 0 0 1px var(--line);
16619
+ }
16620
+ :where([data-kit="halo"]) .tf-deadline-date b {
16621
+ font: 700 16px/20px var(--font-sans);
16622
+ font-variant-numeric: tabular-nums;
16623
+ }
16624
+ :where([data-kit="halo"]) .tf-deadline-date small {
16625
+ font: 600 10px/12px var(--font-sans);
16626
+ text-transform: uppercase;
16627
+ color: var(--ink-muted);
16628
+ }
16629
+ :where([data-kit="halo"]) .tf-deadline-text {
16630
+ display: flex;
16631
+ flex: 1 1 160px;
16632
+ flex-direction: column;
16633
+ min-width: 0;
16634
+ }
16635
+ :where([data-kit="halo"]) .tf-deadline-text b {
16636
+ font: 600 14px/20px var(--font-sans);
16637
+ overflow-wrap: break-word;
16638
+ }
16639
+ :where([data-kit="halo"]) .tf-deadline-text small {
16640
+ font: 500 12px/16px var(--font-sans);
16641
+ color: var(--ink-muted);
16642
+ }
16643
+ :where([data-kit="halo"]) .tf-deadline-amount {
16644
+ font: 700 13px/18px var(--font-sans);
16645
+ font-variant-numeric: tabular-nums;
16646
+ }
16647
+ :where([data-kit="halo"]) .tf-deadline.is-done .tf-deadline-text b {
16648
+ color: var(--ink-muted);
16649
+ text-decoration: line-through;
16650
+ }
16651
+ :where([data-kit="halo"]) .tf-deadline-done {
16652
+ color: var(--mint-ink);
16653
+ }
16654
+
16655
+ /* PolicyCard */
16656
+ :where([data-kit="halo"]) .tf-policy {
16657
+ display: flex;
16658
+ flex-direction: column;
16659
+ gap: 16px;
16660
+ min-width: 0;
16661
+ padding: 20px;
16662
+ border-radius: var(--radius-lg);
16663
+ background: var(--surface);
16664
+ box-shadow: var(--shadow-card);
16665
+ }
16666
+ :where([data-kit="halo"]) .tf-policy-head {
16667
+ display: flex;
16668
+ flex-wrap: wrap;
16669
+ align-items: center;
16670
+ gap: 12px;
16671
+ }
16672
+ :where([data-kit="halo"]) .tf-policy-head .tf-option-text {
16673
+ flex: 1;
16674
+ min-width: 120px;
16675
+ padding: 0;
16676
+ }
16677
+ :where([data-kit="halo"]) .tf-policy-head b {
16678
+ font: 700 15px/20px var(--font-sans);
16679
+ }
16680
+ :where([data-kit="halo"]) .tf-policy-facts {
16681
+ display: grid;
16682
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
16683
+ gap: 12px;
16684
+ margin: 0;
16685
+ }
16686
+ :where([data-kit="halo"]) .tf-policy-facts div {
16687
+ min-width: 0;
16688
+ }
16689
+ :where([data-kit="halo"]) .tf-policy-facts dt {
16690
+ font: 600 11px/14px var(--font-sans);
16691
+ letter-spacing: 0.04em;
16692
+ text-transform: uppercase;
16693
+ color: var(--ink-muted);
16694
+ }
16695
+ :where([data-kit="halo"]) .tf-policy-facts dd {
16696
+ margin: 2px 0 0;
16697
+ font: 700 15px/20px var(--font-sans);
16698
+ font-variant-numeric: tabular-nums;
16699
+ overflow-wrap: break-word;
16700
+ }
16701
+ :where([data-kit="halo"]) .tf-policy-foot {
16702
+ display: flex;
16703
+ flex-wrap: wrap;
16704
+ align-items: center;
16705
+ justify-content: space-between;
16706
+ gap: 8px;
16707
+ padding-top: 12px;
16708
+ border-top: 1px solid var(--line);
16709
+ font: 500 12px/16px var(--font-sans);
16710
+ color: var(--ink-muted);
16711
+ }
16712
+ :where([data-kit="halo"]) .tf-policy-actions {
16713
+ display: inline-flex;
16714
+ flex-wrap: wrap;
16715
+ gap: 8px;
16716
+ }
16717
+
16718
+ /* CoverageMatrix */
16719
+ :where([data-kit="halo"]) .tf-coverage {
16720
+ display: flex;
16721
+ flex-direction: column;
16722
+ gap: 12px;
16723
+ min-width: 0;
16724
+ }
16725
+ :where([data-kit="halo"]) .tf-coverage-sum {
16726
+ display: flex;
16727
+ flex-wrap: wrap;
16728
+ gap: 8px 16px;
16729
+ }
16730
+ :where([data-kit="halo"]) .tf-coverage-box {
16731
+ container: tf-coverage / inline-size;
16732
+ }
16733
+ :where([data-kit="halo"]) .tf-coverage-table {
16734
+ width: 100%;
16735
+ border-collapse: collapse;
16736
+ }
16737
+ :where([data-kit="halo"]) .tf-coverage-table th,
16738
+ :where([data-kit="halo"]) .tf-coverage-table td {
16739
+ padding: 10px 8px;
16740
+ border-top: 1px solid var(--line);
16741
+ text-align: left;
16742
+ vertical-align: middle;
16743
+ }
16744
+ :where([data-kit="halo"]) .tf-coverage-table th {
16745
+ font-weight: inherit;
16746
+ }
16747
+ :where([data-kit="halo"]) .tf-coverage-table th b {
16748
+ display: block;
16749
+ font: 600 14px/20px var(--font-sans);
16750
+ }
16751
+ :where([data-kit="halo"]) .tf-coverage-table th small {
16752
+ font: 500 12px/16px var(--font-sans);
16753
+ color: var(--ink-muted);
16754
+ }
16755
+ :where([data-kit="halo"]) .tf-coverage-table td:nth-child(2) {
16756
+ white-space: nowrap;
16757
+ }
16758
+ :where([data-kit="halo"]) .tf-coverage-note {
16759
+ font: 500 13px/18px var(--font-sans);
16760
+ color: var(--ink-muted);
16761
+ }
16762
+ :where([data-kit="halo"]) .tf-coverage-table tr.is-none th b {
16763
+ color: var(--blush-ink);
16764
+ }
16765
+ /* narrow: each risk becomes a block, its status top right, the note underneath */
16766
+ @container tf-coverage (max-width: 440px) {
16767
+ :where([data-kit="halo"]) .tf-coverage-table,
16768
+ :where([data-kit="halo"]) .tf-coverage-table tbody {
16769
+ display: block;
16770
+ }
16771
+ :where([data-kit="halo"]) .tf-coverage-table tr {
16772
+ display: grid;
16773
+ grid-template-columns: minmax(0, 1fr) auto;
16774
+ gap: 4px 12px;
16775
+ padding: 10px 4px;
16776
+ border-top: 1px solid var(--line);
16777
+ }
16778
+ :where([data-kit="halo"]) .tf-coverage-table th,
16779
+ :where([data-kit="halo"]) .tf-coverage-table td {
16780
+ padding: 0;
16781
+ border-top: 0;
16782
+ }
16783
+ :where([data-kit="halo"]) .tf-coverage-table td.tf-coverage-note {
16784
+ grid-column: 1 / -1;
16785
+ }
16786
+ }
16787
+
16788
+ /* ClaimTimeline */
16789
+ :where([data-kit="halo"]) .tf-claim {
16790
+ display: flex;
16791
+ flex-direction: column;
16792
+ gap: 16px;
16793
+ min-width: 0;
16794
+ }
16795
+ :where([data-kit="halo"]) .tf-claim-head {
16796
+ display: flex;
16797
+ flex-wrap: wrap;
16798
+ align-items: flex-start;
16799
+ justify-content: space-between;
16800
+ gap: 12px;
16801
+ }
16802
+ :where([data-kit="halo"]) .tf-claim-head .tf-option-text {
16803
+ padding: 0;
16804
+ }
16805
+ :where([data-kit="halo"]) .tf-claim-head b {
16806
+ font: 700 15px/20px var(--font-sans);
16807
+ }
16808
+ :where([data-kit="halo"]) .tf-claim-amount {
16809
+ display: flex;
16810
+ flex-direction: column;
16811
+ align-items: flex-end;
16812
+ font: 700 18px/24px var(--font-sans);
16813
+ font-variant-numeric: tabular-nums;
16814
+ }
16815
+ :where([data-kit="halo"]) .tf-claim-amount small {
16816
+ font: 600 11px/14px var(--font-sans);
16817
+ color: var(--ink-muted);
16818
+ }
16819
+ :where([data-kit="halo"]) .tf-claim-steps {
16820
+ display: flex;
16821
+ flex-direction: column;
16822
+ }
16823
+ :where([data-kit="halo"]) .tf-claim-steps li {
16824
+ position: relative;
16825
+ display: flex;
16826
+ gap: 12px;
16827
+ padding-bottom: 16px;
16828
+ }
16829
+ :where([data-kit="halo"]) .tf-claim-steps li:last-child {
16830
+ padding-bottom: 0;
16831
+ }
16832
+ :where([data-kit="halo"]) .tf-claim-steps li:not(:last-child)::before {
16833
+ content: "";
16834
+ position: absolute;
16835
+ top: 20px;
16836
+ bottom: 0;
16837
+ left: 9px;
16838
+ width: 2px;
16839
+ background: var(--line);
16840
+ }
16841
+ :where([data-kit="halo"]) .tf-claim-steps li.is-done:not(:last-child)::before {
16842
+ background: var(--mint-ink);
16843
+ }
16844
+ :where([data-kit="halo"]) .tf-claim-dot {
16845
+ position: relative;
16846
+ display: grid;
16847
+ place-items: center;
16848
+ flex: none;
16849
+ width: 20px;
16850
+ height: 20px;
16851
+ box-sizing: border-box;
16852
+ border: 2px solid var(--line-strong);
16853
+ border-radius: 50%;
16854
+ background: var(--surface);
16855
+ color: var(--primary-foreground);
16856
+ }
16857
+ :where([data-kit="halo"]) .tf-claim-steps li.is-done .tf-claim-dot {
16858
+ border-color: var(--mint-ink);
16859
+ background: var(--mint-ink);
16860
+ }
16861
+ :where([data-kit="halo"]) .tf-claim-steps li.is-current .tf-claim-dot {
16862
+ border-color: var(--primary);
16863
+ box-shadow: 0 0 0 4px var(--accent);
16864
+ }
16865
+ :where([data-kit="halo"]) .tf-claim-steps li.is-failed .tf-claim-dot {
16866
+ border-color: var(--blush-ink);
16867
+ background: var(--blush-ink);
16868
+ }
16869
+ :where([data-kit="halo"]) .tf-claim-text {
16870
+ display: flex;
16871
+ flex-direction: column;
16872
+ min-width: 0;
16873
+ }
16874
+ :where([data-kit="halo"]) .tf-claim-text b {
16875
+ font: 600 14px/20px var(--font-sans);
16876
+ }
16877
+ :where([data-kit="halo"]) .tf-claim-steps li.is-todo .tf-claim-text b {
16878
+ color: var(--ink-muted);
16879
+ font-weight: 500;
16880
+ }
16881
+ :where([data-kit="halo"]) .tf-claim-text small {
16882
+ font: 500 12px/16px var(--font-sans);
16883
+ color: var(--ink-muted);
16884
+ }
16885
+
16886
+ /* DocumentList */
16887
+ :where([data-kit="halo"]) .tf-docs {
16888
+ display: flex;
16889
+ flex-direction: column;
16890
+ gap: 4px;
16891
+ min-width: 0;
16892
+ }
16893
+ :where([data-kit="halo"]) .tf-doc {
16894
+ display: flex;
16895
+ flex-wrap: wrap;
16896
+ align-items: center;
16897
+ gap: 8px 12px;
16898
+ width: 100%;
16899
+ padding: 10px 12px;
16900
+ box-sizing: border-box;
16901
+ border: 0;
16902
+ border-radius: var(--radius-md);
16903
+ background: transparent;
16904
+ color: var(--ink);
16905
+ font: inherit;
16906
+ text-align: left;
16907
+ }
16908
+ :where([data-kit="halo"]) button.tf-doc {
16909
+ cursor: pointer;
16910
+ }
16911
+ :where([data-kit="halo"]) button.tf-doc:hover {
16912
+ background: var(--accent);
16913
+ }
16914
+ :where([data-kit="halo"]) button.tf-doc:focus-visible {
16915
+ outline: 2px solid var(--focus);
16916
+ outline-offset: 2px;
16917
+ }
16918
+ :where([data-kit="halo"]) .tf-doc-text {
16919
+ display: flex;
16920
+ flex: 1 1 160px;
16921
+ flex-direction: column;
16922
+ min-width: 0;
16923
+ }
16924
+ :where([data-kit="halo"]) .tf-doc-text b {
16925
+ font: 600 14px/20px var(--font-sans);
16926
+ overflow-wrap: break-word;
16927
+ }
16928
+ :where([data-kit="halo"]) .tf-doc-text small,
16929
+ :where([data-kit="halo"]) .tf-doc-valid {
16930
+ font: 500 12px/16px var(--font-sans);
16931
+ color: var(--ink-muted);
16932
+ }