@techfides/ui-library-design 0.1.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.
Files changed (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -0
  3. package/assets/brands/digital-boost-group.svg +1 -0
  4. package/assets/brands/rtsg.svg +1 -0
  5. package/assets/brands/tech-it-out.svg +1 -0
  6. package/assets/brands/techfides.svg +1 -0
  7. package/css/index.css +8 -0
  8. package/css/theme.css +1640 -0
  9. package/dist/brands.d.ts +39 -0
  10. package/dist/brands.js +41 -0
  11. package/dist/brands.js.map +1 -0
  12. package/dist/charts/animation.js +14 -0
  13. package/dist/charts/animation.js.map +1 -0
  14. package/dist/charts/bars.d.ts +22 -0
  15. package/dist/charts/bars.js +61 -0
  16. package/dist/charts/bars.js.map +1 -0
  17. package/dist/charts/groupedBars.d.ts +20 -0
  18. package/dist/charts/groupedBars.js +82 -0
  19. package/dist/charts/groupedBars.js.map +1 -0
  20. package/dist/charts/paint.js +19 -0
  21. package/dist/charts/paint.js.map +1 -0
  22. package/dist/charts/spark.d.ts +17 -0
  23. package/dist/charts/spark.js +159 -0
  24. package/dist/charts/spark.js.map +1 -0
  25. package/dist/charts/tooltip.js +41 -0
  26. package/dist/charts/tooltip.js.map +1 -0
  27. package/dist/cn.d.ts +6 -0
  28. package/dist/cn.js +178 -0
  29. package/dist/cn.js.map +1 -0
  30. package/dist/control.d.ts +15 -0
  31. package/dist/control.js +13 -0
  32. package/dist/control.js.map +1 -0
  33. package/dist/index.d.ts +65 -0
  34. package/dist/index.js +65 -0
  35. package/dist/mark.d.ts +7 -0
  36. package/dist/mark.js +11 -0
  37. package/dist/mark.js.map +1 -0
  38. package/dist/parts/control.js +55 -0
  39. package/dist/parts/control.js.map +1 -0
  40. package/dist/parts/eyebrow.js +8 -0
  41. package/dist/parts/eyebrow.js.map +1 -0
  42. package/dist/parts/mark.js +52 -0
  43. package/dist/parts/mark.js.map +1 -0
  44. package/dist/parts/reveal.js +35 -0
  45. package/dist/parts/reveal.js.map +1 -0
  46. package/dist/parts/rouse.js +25 -0
  47. package/dist/parts/rouse.js.map +1 -0
  48. package/dist/parts/rule.js +12 -0
  49. package/dist/parts/rule.js.map +1 -0
  50. package/dist/parts/scroll.js +10 -0
  51. package/dist/parts/scroll.js.map +1 -0
  52. package/dist/parts/shell.js +23 -0
  53. package/dist/parts/shell.js.map +1 -0
  54. package/dist/parts/surface.js +15 -0
  55. package/dist/parts/surface.js.map +1 -0
  56. package/dist/parts/tone.js +13 -0
  57. package/dist/parts/tone.js.map +1 -0
  58. package/dist/parts/travel.js +11 -0
  59. package/dist/parts/travel.js.map +1 -0
  60. package/dist/recipes/accordion.d.ts +13 -0
  61. package/dist/recipes/accordion.js +42 -0
  62. package/dist/recipes/accordion.js.map +1 -0
  63. package/dist/recipes/alert.d.ts +16 -0
  64. package/dist/recipes/alert.js +21 -0
  65. package/dist/recipes/alert.js.map +1 -0
  66. package/dist/recipes/band.d.ts +8 -0
  67. package/dist/recipes/band.js +22 -0
  68. package/dist/recipes/band.js.map +1 -0
  69. package/dist/recipes/bars.d.ts +17 -0
  70. package/dist/recipes/bars.js +27 -0
  71. package/dist/recipes/bars.js.map +1 -0
  72. package/dist/recipes/brandMark.d.ts +5 -0
  73. package/dist/recipes/brandMark.js +7 -0
  74. package/dist/recipes/brandMark.js.map +1 -0
  75. package/dist/recipes/button.d.ts +23 -0
  76. package/dist/recipes/button.js +229 -0
  77. package/dist/recipes/button.js.map +1 -0
  78. package/dist/recipes/cardHeader.d.ts +10 -0
  79. package/dist/recipes/cardHeader.js +11 -0
  80. package/dist/recipes/cardHeader.js.map +1 -0
  81. package/dist/recipes/checkbox.d.ts +26 -0
  82. package/dist/recipes/checkbox.js +103 -0
  83. package/dist/recipes/checkbox.js.map +1 -0
  84. package/dist/recipes/chip.d.ts +26 -0
  85. package/dist/recipes/chip.js +123 -0
  86. package/dist/recipes/chip.js.map +1 -0
  87. package/dist/recipes/codeEditor.d.ts +74 -0
  88. package/dist/recipes/codeEditor.js +71 -0
  89. package/dist/recipes/codeEditor.js.map +1 -0
  90. package/dist/recipes/datePicker.d.ts +39 -0
  91. package/dist/recipes/datePicker.js +166 -0
  92. package/dist/recipes/datePicker.js.map +1 -0
  93. package/dist/recipes/dialog.d.ts +37 -0
  94. package/dist/recipes/dialog.js +116 -0
  95. package/dist/recipes/dialog.js.map +1 -0
  96. package/dist/recipes/feature.d.ts +15 -0
  97. package/dist/recipes/feature.js +48 -0
  98. package/dist/recipes/feature.js.map +1 -0
  99. package/dist/recipes/field.d.ts +26 -0
  100. package/dist/recipes/field.js +129 -0
  101. package/dist/recipes/field.js.map +1 -0
  102. package/dist/recipes/findings.d.ts +11 -0
  103. package/dist/recipes/findings.js +16 -0
  104. package/dist/recipes/findings.js.map +1 -0
  105. package/dist/recipes/heading.d.ts +17 -0
  106. package/dist/recipes/heading.js +37 -0
  107. package/dist/recipes/heading.js.map +1 -0
  108. package/dist/recipes/heartbeat.d.ts +23 -0
  109. package/dist/recipes/heartbeat.js +43 -0
  110. package/dist/recipes/heartbeat.js.map +1 -0
  111. package/dist/recipes/input.d.ts +17 -0
  112. package/dist/recipes/input.js +90 -0
  113. package/dist/recipes/input.js.map +1 -0
  114. package/dist/recipes/listItem.d.ts +6 -0
  115. package/dist/recipes/listItem.js +8 -0
  116. package/dist/recipes/listItem.js.map +1 -0
  117. package/dist/recipes/listbox.d.ts +12 -0
  118. package/dist/recipes/listbox.js +29 -0
  119. package/dist/recipes/listbox.js.map +1 -0
  120. package/dist/recipes/marquee.d.ts +19 -0
  121. package/dist/recipes/marquee.js +36 -0
  122. package/dist/recipes/marquee.js.map +1 -0
  123. package/dist/recipes/menu.d.ts +26 -0
  124. package/dist/recipes/menu.js +86 -0
  125. package/dist/recipes/menu.js.map +1 -0
  126. package/dist/recipes/metaRow.d.ts +14 -0
  127. package/dist/recipes/metaRow.js +19 -0
  128. package/dist/recipes/metaRow.js.map +1 -0
  129. package/dist/recipes/meter.d.ts +23 -0
  130. package/dist/recipes/meter.js +39 -0
  131. package/dist/recipes/meter.js.map +1 -0
  132. package/dist/recipes/motion.d.ts +6 -0
  133. package/dist/recipes/motion.js +34 -0
  134. package/dist/recipes/motion.js.map +1 -0
  135. package/dist/recipes/nebula.d.ts +9 -0
  136. package/dist/recipes/nebula.js +15 -0
  137. package/dist/recipes/nebula.js.map +1 -0
  138. package/dist/recipes/numberRange.d.ts +15 -0
  139. package/dist/recipes/numberRange.js +109 -0
  140. package/dist/recipes/numberRange.js.map +1 -0
  141. package/dist/recipes/paper.d.ts +22 -0
  142. package/dist/recipes/paper.js +42 -0
  143. package/dist/recipes/paper.js.map +1 -0
  144. package/dist/recipes/progressBar.d.ts +7 -0
  145. package/dist/recipes/progressBar.js +11 -0
  146. package/dist/recipes/progressBar.js.map +1 -0
  147. package/dist/recipes/queue.d.ts +16 -0
  148. package/dist/recipes/queue.js +27 -0
  149. package/dist/recipes/queue.js.map +1 -0
  150. package/dist/recipes/radioGroup.d.ts +27 -0
  151. package/dist/recipes/radioGroup.js +68 -0
  152. package/dist/recipes/radioGroup.js.map +1 -0
  153. package/dist/recipes/scopeSwitcher.d.ts +26 -0
  154. package/dist/recipes/scopeSwitcher.js +80 -0
  155. package/dist/recipes/scopeSwitcher.js.map +1 -0
  156. package/dist/recipes/scrollArea.d.ts +19 -0
  157. package/dist/recipes/scrollArea.js +43 -0
  158. package/dist/recipes/scrollArea.js.map +1 -0
  159. package/dist/recipes/searchPalette.d.ts +19 -0
  160. package/dist/recipes/searchPalette.js +63 -0
  161. package/dist/recipes/searchPalette.js.map +1 -0
  162. package/dist/recipes/sectionHeader.d.ts +9 -0
  163. package/dist/recipes/sectionHeader.js +10 -0
  164. package/dist/recipes/sectionHeader.js.map +1 -0
  165. package/dist/recipes/segmentedControl.d.ts +9 -0
  166. package/dist/recipes/segmentedControl.js +29 -0
  167. package/dist/recipes/segmentedControl.js.map +1 -0
  168. package/dist/recipes/select.d.ts +9 -0
  169. package/dist/recipes/select.js +21 -0
  170. package/dist/recipes/select.js.map +1 -0
  171. package/dist/recipes/separator.d.ts +14 -0
  172. package/dist/recipes/separator.js +59 -0
  173. package/dist/recipes/separator.js.map +1 -0
  174. package/dist/recipes/sidebar.d.ts +40 -0
  175. package/dist/recipes/sidebar.js +128 -0
  176. package/dist/recipes/sidebar.js.map +1 -0
  177. package/dist/recipes/sky.d.ts +20 -0
  178. package/dist/recipes/sky.js +127 -0
  179. package/dist/recipes/sky.js.map +1 -0
  180. package/dist/recipes/slider.d.ts +20 -0
  181. package/dist/recipes/slider.js +62 -0
  182. package/dist/recipes/slider.js.map +1 -0
  183. package/dist/recipes/stat.d.ts +30 -0
  184. package/dist/recipes/stat.js +52 -0
  185. package/dist/recipes/stat.js.map +1 -0
  186. package/dist/recipes/switch.d.ts +20 -0
  187. package/dist/recipes/switch.js +60 -0
  188. package/dist/recipes/switch.js.map +1 -0
  189. package/dist/recipes/table.d.ts +74 -0
  190. package/dist/recipes/table.js +182 -0
  191. package/dist/recipes/table.js.map +1 -0
  192. package/dist/recipes/tableFilter.d.ts +14 -0
  193. package/dist/recipes/tableFilter.js +28 -0
  194. package/dist/recipes/tableFilter.js.map +1 -0
  195. package/dist/recipes/tablePaging.d.ts +15 -0
  196. package/dist/recipes/tablePaging.js +50 -0
  197. package/dist/recipes/tablePaging.js.map +1 -0
  198. package/dist/recipes/tail.d.ts +20 -0
  199. package/dist/recipes/tail.js +48 -0
  200. package/dist/recipes/tail.js.map +1 -0
  201. package/dist/recipes/text.d.ts +25 -0
  202. package/dist/recipes/text.js +94 -0
  203. package/dist/recipes/text.js.map +1 -0
  204. package/dist/recipes/textarea.d.ts +13 -0
  205. package/dist/recipes/textarea.js +48 -0
  206. package/dist/recipes/textarea.js.map +1 -0
  207. package/dist/recipes/tile.d.ts +18 -0
  208. package/dist/recipes/tile.js +85 -0
  209. package/dist/recipes/tile.js.map +1 -0
  210. package/dist/recipes/tooltip.d.ts +12 -0
  211. package/dist/recipes/tooltip.js +26 -0
  212. package/dist/recipes/tooltip.js.map +1 -0
  213. package/dist/recipes/topBar.d.ts +15 -0
  214. package/dist/recipes/topBar.js +35 -0
  215. package/dist/recipes/topBar.js.map +1 -0
  216. package/dist/recipes/trail.d.ts +27 -0
  217. package/dist/recipes/trail.js +66 -0
  218. package/dist/recipes/trail.js.map +1 -0
  219. package/dist/recipes/userMenu.d.ts +11 -0
  220. package/dist/recipes/userMenu.js +38 -0
  221. package/dist/recipes/userMenu.js.map +1 -0
  222. package/dist/tally.d.ts +17 -0
  223. package/dist/tally.js +75 -0
  224. package/dist/tally.js.map +1 -0
  225. package/dist/tone.d.ts +26 -0
  226. package/dist/tone.js +26 -0
  227. package/dist/tone.js.map +1 -0
  228. package/dist/words.d.ts +116 -0
  229. package/dist/words.js +93 -0
  230. package/dist/words.js.map +1 -0
  231. package/package.json +72 -0
package/css/theme.css ADDED
@@ -0,0 +1,1640 @@
1
+ :root,
2
+ [data-brand='techfides'] {
3
+ --tf-accent: #0075c9;
4
+ --tf-accent-ceiling: 0.169;
5
+ }
6
+
7
+ [data-brand='tech-it-out'] {
8
+ --tf-accent: #84bd23;
9
+ --tf-accent-ceiling: 0.158;
10
+ }
11
+
12
+ [data-brand='rtsg'] {
13
+ --tf-accent: #eb7500;
14
+ --tf-accent-ceiling: 0.152;
15
+ }
16
+
17
+ [data-brand='digital-boost-group'] {
18
+ --tf-accent: #995fd2;
19
+ --tf-accent-ceiling: 0.275;
20
+ }
21
+
22
+ @layer base {
23
+ html {
24
+ background-color: var(--color-tf-bg);
25
+ color: var(--color-tf-fg);
26
+ color-scheme: dark;
27
+ font-family: var(--font-tf-body);
28
+ scrollbar-gutter: stable;
29
+ }
30
+ }
31
+
32
+ @theme static inline {
33
+ --ceiling-tf-accent: var(--tf-accent-ceiling);
34
+
35
+ --color-tf-accent: var(--tf-accent);
36
+ --color-tf-accent-hi: oklch(from var(--tf-accent) 0.73 c h);
37
+ --color-tf-accent-surface: oklch(from var(--tf-accent) 0.55 c h);
38
+ --color-tf-accent-deep: oklch(from var(--tf-accent) 0.45 c h);
39
+ --color-tf-on-accent: #ffffff;
40
+
41
+ --color-tf-accent-tint: color-mix(
42
+ in oklab,
43
+ var(--tf-accent) var(--tf-tint),
44
+ var(--color-tf-surface)
45
+ );
46
+ --color-tf-accent-edge: color-mix(
47
+ in oklab,
48
+ var(--tf-accent) var(--tf-edge),
49
+ var(--color-tf-surface)
50
+ );
51
+ }
52
+
53
+ @theme static {
54
+ --color-tf-bg: #08090e;
55
+ --color-tf-surface: #14161d;
56
+ --color-tf-panel: rgb(255 255 255 / 6.5%);
57
+ --color-tf-panel-2: rgb(255 255 255 / 3%);
58
+ --color-tf-panel-hi: rgb(255 255 255 / 8.5%);
59
+ --color-tf-glass: rgb(255 255 255 / 6.5%);
60
+
61
+ --color-tf-sunken: rgb(0 0 0 / 26%);
62
+ --color-tf-sunken-hi: rgb(0 0 0 / 20%);
63
+ --color-tf-sunken-quiet: rgb(0 0 0 / 34%);
64
+ --color-tf-control: rgb(255 255 255 / 9%);
65
+ --color-tf-control-hi: rgb(255 255 255 / 12%);
66
+
67
+ --color-tf-surface-hi: color-mix(in oklab, #fff 4.5%, var(--color-tf-surface));
68
+ --color-tf-surface-quiet: color-mix(in oklab, var(--color-tf-bg) 55%, var(--color-tf-surface));
69
+ --color-tf-shade-under: color-mix(in oklab, var(--color-tf-bg) 38%, transparent);
70
+ --color-tf-shade-deep: color-mix(in oklab, var(--color-tf-bg) 62%, transparent);
71
+ --color-tf-scrim: color-mix(in oklab, var(--color-tf-bg) 54%, transparent);
72
+ --color-tf-line: rgb(255 255 255 / 11%);
73
+ --color-tf-line-2: rgb(255 255 255 / 6.5%);
74
+ --color-tf-line-hi: rgb(255 255 255 / 18%);
75
+ --color-tf-fg: #eef1f6;
76
+ --color-tf-fg-held: color-mix(in oklab, #eef1f6 82%, var(--color-tf-bg));
77
+ --color-tf-muted: #98a1b2;
78
+
79
+ --color-tf-success: oklch(0.55 0.19 133);
80
+ --color-tf-success-hi: oklch(0.73 0.195 133);
81
+ --color-tf-warning: oklch(0.6 0.13 70);
82
+ --color-tf-warning-hi: oklch(0.73 0.158 70);
83
+ --color-tf-info: oklch(0.55 0.196 243);
84
+ --color-tf-info-hi: oklch(0.73 0.156 243);
85
+ --color-tf-danger: oklch(0.55 0.241 27);
86
+ --color-tf-danger-hi: oklch(0.73 0.17 27);
87
+ --color-tf-on-semantic: #ffffff;
88
+
89
+ --ceiling-tf-success: 0.169;
90
+ --ceiling-tf-warning: 0.13;
91
+ --ceiling-tf-info: 0.145;
92
+ --ceiling-tf-danger: 0.244;
93
+
94
+ --tf-tint: 15%;
95
+ --tf-edge: 32%;
96
+ --tf-edge-rest: 32%;
97
+
98
+ --tf-rest-angle: 110deg;
99
+ --tf-rest-waist: 33%;
100
+ --tf-mixed-angle: 150deg;
101
+ --tf-mixed-waist: 24%;
102
+ --tf-milk-reach: 34%;
103
+ --tf-pressed-angle: 124deg;
104
+ --tf-fall-angle: 180deg;
105
+
106
+ --tf-glass-flat:
107
+ linear-gradient(var(--color-tf-glass), var(--color-tf-glass)), var(--color-tf-bg);
108
+ --tf-rise-angle: 290deg;
109
+
110
+ --color-tf-success-tint: color-mix(
111
+ in oklab,
112
+ var(--color-tf-success) var(--tf-tint),
113
+ var(--color-tf-surface)
114
+ );
115
+ --color-tf-success-edge: color-mix(
116
+ in oklab,
117
+ var(--color-tf-success) var(--tf-edge),
118
+ var(--color-tf-surface)
119
+ );
120
+ --color-tf-warning-tint: color-mix(
121
+ in oklab,
122
+ var(--color-tf-warning) var(--tf-tint),
123
+ var(--color-tf-surface)
124
+ );
125
+ --color-tf-warning-edge: color-mix(
126
+ in oklab,
127
+ var(--color-tf-warning) var(--tf-edge),
128
+ var(--color-tf-surface)
129
+ );
130
+ --color-tf-info-tint: color-mix(
131
+ in oklab,
132
+ var(--color-tf-info) var(--tf-tint),
133
+ var(--color-tf-surface)
134
+ );
135
+ --color-tf-info-edge: color-mix(
136
+ in oklab,
137
+ var(--color-tf-info) var(--tf-edge),
138
+ var(--color-tf-surface)
139
+ );
140
+ --color-tf-danger-tint: color-mix(
141
+ in oklab,
142
+ var(--color-tf-danger) var(--tf-tint),
143
+ var(--color-tf-surface)
144
+ );
145
+ --color-tf-danger-wash: color-mix(in oklab, var(--color-tf-danger) var(--tf-tint), transparent);
146
+ --color-tf-danger-edge: color-mix(
147
+ in oklab,
148
+ var(--color-tf-danger) var(--tf-edge),
149
+ var(--color-tf-surface)
150
+ );
151
+
152
+ --font-tf-display: 'Poppins', system-ui, sans-serif;
153
+ --font-tf-body: 'Inter Variable', 'Inter', system-ui, sans-serif;
154
+
155
+ --text-tf-display: clamp(38px, 4.5vw, 54px);
156
+ --text-tf-display--line-height: 1.04;
157
+ --text-tf-h1: clamp(32px, 4vw, 44px);
158
+ --text-tf-h1--line-height: 1.05;
159
+ --text-tf-h2: 28px;
160
+ --text-tf-h2--line-height: 1.08;
161
+ --text-tf-h3: 23px;
162
+ --text-tf-h3--line-height: 1.12;
163
+ --text-tf-h4: 20px;
164
+ --text-tf-h4--line-height: 1.2;
165
+ --text-tf-figure: clamp(22px, 9cqw, 31px);
166
+ --text-tf-figure--line-height: 1.15;
167
+ --text-tf-unit: clamp(14px, 5cqw, 17px);
168
+ --text-tf-unit--line-height: 1.4;
169
+ --text-tf-lead: 18px;
170
+ --text-tf-lead--line-height: 1.65;
171
+ --text-tf-body: 15px;
172
+ --text-tf-body--line-height: 1.7;
173
+ --text-tf-body-sm: 14px;
174
+ --text-tf-body-sm--line-height: 1.7;
175
+ --text-tf-caption: 13px;
176
+ --text-tf-caption--line-height: 1.6;
177
+ --text-tf-caption-sm: 12px;
178
+ --text-tf-caption-sm--line-height: 1.6;
179
+
180
+ --tracking-tf-tight: -0.022em;
181
+ --tracking-tf-eyebrow: 0.12em;
182
+
183
+ --breakpoint-*: initial;
184
+ --breakpoint-sm: 40rem;
185
+ --breakpoint-md: 48rem;
186
+ --breakpoint-lg: 64rem;
187
+ --breakpoint-xl: 80rem;
188
+
189
+ --container-*: initial;
190
+ --max-width-*: initial;
191
+ --container-tf-panel: 24rem;
192
+ --container-tf-list: 26rem;
193
+ --container-tf-measure: 65ch;
194
+ --container-tf-page: 56rem;
195
+ --container-tf-canvas: 100rem;
196
+
197
+ --spacing-tf-hairline: 1px;
198
+
199
+ --spacing-tf-control-2xs: 1.5rem;
200
+ --spacing-tf-control-xs: 2rem;
201
+ --spacing-tf-control-sm: 2.5rem;
202
+ --spacing-tf-control-md: 3rem;
203
+ --spacing-tf-control-lg: 3.5rem;
204
+
205
+ --spacing-tf-row: 2.25rem;
206
+ --spacing-tf-chip-sm: 1.5rem;
207
+ --spacing-tf-target: 3rem;
208
+
209
+ --spacing-tf-menu: 12rem;
210
+ --spacing-tf-sidebar: 17rem;
211
+ --spacing-tf-rail: 5rem;
212
+
213
+ --spacing-tf-icon-2xs: 0.875rem;
214
+ --spacing-tf-icon-xs: 1rem;
215
+ --spacing-tf-icon-sm: 1.125rem;
216
+ --spacing-tf-icon-md: 1.25rem;
217
+ --spacing-tf-icon-lg: 1.375rem;
218
+
219
+ --spacing-tf-icon-solo-xs: 1rem;
220
+ --spacing-tf-icon-solo-sm: 1.25rem;
221
+ --spacing-tf-icon-solo-md: 1.375rem;
222
+ --spacing-tf-icon-solo-lg: 1.5rem;
223
+
224
+ --spacing-tf-mark-glyph: 0.875rem;
225
+ --spacing-tf-mark-dot: 0.625rem;
226
+ --spacing-tf-mark-track: 0.375rem;
227
+ --spacing-tf-mark-inset: 0.1875rem;
228
+
229
+ --tf-mark-path: 23;
230
+ --tf-icon-stroke: 2.75;
231
+ --tf-icon-stroke-solo: 3;
232
+
233
+ --blur-tf-panel: 16px;
234
+ --blur-tf-glass: 16px;
235
+ --blur-tf-scrim: 6px;
236
+ --blur-tf-cloud-md: 14px;
237
+ --blur-tf-cloud-tight: 10px;
238
+ --blur-tf-cloud-wide: 32px;
239
+
240
+ --radius-tf-none: 0;
241
+ --radius-tf-inline: 0.375rem;
242
+ --radius-tf-control: 0.625rem;
243
+ --radius-tf-block: 0.75rem;
244
+ --radius-tf-card: 1rem;
245
+ --radius-tf-pill: 9999px;
246
+
247
+ --shadow-tf-float: 0 18px 44px -18px rgb(0 0 0 / 88%);
248
+ --shadow-tf-mark: 0 1px 2px rgb(0 0 0 / 40%);
249
+
250
+ --ease-tf: cubic-bezier(0.16, 0.8, 0.3, 1);
251
+ --ease-tf-spring: cubic-bezier(0.34, 1.56, 0.5, 1);
252
+ --ease-tf-glide: cubic-bezier(0.45, 0.05, 0.35, 1);
253
+ --ease-tf-settle: cubic-bezier(0.32, 1.36, 0.58, 1);
254
+
255
+ --tf-z-raised: 10;
256
+ --tf-z-dropdown: 20;
257
+ --tf-z-tooltip: 30;
258
+ --tf-z-modal: 40;
259
+ --tf-z-toast: 50;
260
+
261
+ --tf-duration-1: 140ms;
262
+ --tf-duration-2: 240ms;
263
+ --tf-duration-3: 600ms;
264
+ --tf-duration-4: 700ms;
265
+
266
+ --tf-marquee-pace: calc(var(--spacing-tf-icon-solo-lg) * (1s / var(--tf-duration-3)));
267
+
268
+ --tf-sweep-duration: calc(var(--tf-duration-3) * 30);
269
+ --tf-twinkle-duration: calc(var(--tf-duration-3) * 26);
270
+ --tf-pulse-duration: calc(var(--tf-duration-3) * 3);
271
+
272
+ --tf-timing-quick: var(--tf-duration-1) var(--ease-tf);
273
+ --tf-timing-glide: var(--tf-duration-2) var(--ease-tf-glide);
274
+ --tf-timing-drift: var(--tf-duration-3) var(--ease-tf-glide);
275
+ --tf-timing-trail: var(--tf-duration-4) var(--ease-tf-glide);
276
+ --tf-timing-spring: var(--tf-duration-2) var(--ease-tf-spring);
277
+ --tf-timing-settle: var(--tf-duration-2) var(--ease-tf-settle);
278
+
279
+ --tf-blend-timing: var(--tf-timing-glide);
280
+ --tf-shadow-timing: var(--tf-timing-glide);
281
+ --tf-move-timing: var(--tf-timing-quick);
282
+ --tf-weather-timing: var(--tf-timing-drift);
283
+ --tf-ink-timing: var(--tf-timing-quick);
284
+
285
+ --tf-cloud-blur: var(--blur-tf-cloud-md);
286
+
287
+ --animate-tf-blend-in: tf-blend-in var(--tf-duration-2) var(--ease-tf-glide);
288
+ --animate-tf-arrive: tf-arrive var(--tf-duration-2) var(--ease-tf) both;
289
+ --animate-tf-depart: tf-depart var(--tf-duration-1) var(--ease-tf) both;
290
+ --animate-tf-in: tf-in var(--tf-duration-2) var(--ease-tf) both;
291
+ --animate-tf-out: tf-out var(--tf-duration-1) var(--ease-tf) both;
292
+ --animate-tf-chip-in: tf-chip-in var(--tf-duration-2) var(--ease-tf-glide) both;
293
+ --animate-tf-chip-out: tf-chip-out var(--tf-duration-2) var(--ease-tf-glide) both;
294
+ --animate-tf-chip-out-auto: tf-chip-out-auto var(--tf-duration-2) var(--ease-tf-glide) both;
295
+ --animate-tf-rewind: tf-back var(--tf-duration-2) var(--ease-tf) reverse both;
296
+ --animate-tf-lift: tf-lift var(--tf-duration-2) var(--ease-tf) both;
297
+ --animate-tf-lift-rewind: tf-lift-back var(--tf-duration-2) var(--ease-tf) reverse both;
298
+ --animate-tf-drawer: tf-drawer var(--tf-duration-2) var(--ease-tf) both;
299
+ --animate-tf-drawer-rewind: tf-drawer-back var(--tf-duration-2) var(--ease-tf) reverse both;
300
+ --animate-tf-expand: tf-expand var(--tf-duration-2) var(--ease-tf) both;
301
+ --animate-tf-collapse: tf-collapse var(--tf-duration-1) var(--ease-tf) both;
302
+ --animate-tf-shake: tf-shake var(--tf-duration-2) var(--ease-tf);
303
+ --animate-tf-pop: tf-pop var(--tf-duration-2) var(--ease-tf-spring) both;
304
+ --animate-tf-nudge: tf-nudge var(--tf-duration-2) var(--ease-tf-spring);
305
+ --animate-tf-fade-in: tf-fade-in var(--tf-duration-2) var(--ease-tf) both;
306
+ --animate-tf-fade-out: tf-fade-out var(--tf-duration-1) var(--ease-tf) both;
307
+ --animate-tf-fade-rewind: tf-fade-back var(--tf-duration-2) var(--ease-tf) reverse both;
308
+ --animate-tf-rise: tf-rise var(--tf-duration-2) var(--ease-tf-glide);
309
+ --animate-tf-draw: tf-draw var(--tf-duration-2) var(--ease-tf-glide);
310
+ --animate-tf-page: tf-page var(--tf-duration-2) var(--ease-tf-glide);
311
+ --animate-tf-page-again: tf-page-again var(--tf-duration-2) var(--ease-tf-glide);
312
+ }
313
+
314
+ @keyframes tf-blend-in {
315
+ 0% {
316
+ --tf-blend-lead: var(--tf-rest-lead);
317
+ --tf-blend-mid: var(--tf-rest-mid);
318
+ --tf-blend-trail: var(--tf-rest-trail);
319
+ --tf-blend-angle: var(--tf-rest-angle);
320
+ --tf-blend-waist: var(--tf-rest-waist);
321
+ --tf-milk: transparent;
322
+ }
323
+
324
+ 30% {
325
+ --tf-blend-lead: color-mix(in oklab, var(--tf-flare) 30%, var(--tf-rest-lead));
326
+ --tf-blend-mid: color-mix(in oklab, var(--tf-vivid) 42%, var(--tf-rest-mid));
327
+ --tf-blend-trail: color-mix(in oklab, var(--tf-abyss) 30%, var(--tf-rest-trail));
328
+ }
329
+
330
+ 65% {
331
+ --tf-blend-lead: color-mix(in oklab, var(--tf-flare) 72%, var(--tf-rest-lead));
332
+ --tf-blend-mid: color-mix(in oklab, var(--tf-vivid) 80%, var(--tf-rest-mid));
333
+ --tf-blend-trail: color-mix(in oklab, var(--tf-abyss) 72%, var(--tf-rest-trail));
334
+ }
335
+
336
+ 100% {
337
+ --tf-blend-lead: var(--tf-flare);
338
+ --tf-blend-mid: var(--tf-vivid);
339
+ --tf-blend-trail: var(--tf-abyss);
340
+ --tf-blend-angle: var(--tf-mixed-angle);
341
+ --tf-blend-waist: var(--tf-mixed-waist);
342
+ }
343
+ }
344
+
345
+ @keyframes tf-sweep {
346
+ to {
347
+ --tf-sweep: 360deg;
348
+ }
349
+ }
350
+
351
+ @keyframes tf-twinkle {
352
+ 50% {
353
+ opacity: 0.5;
354
+ }
355
+ }
356
+
357
+ @keyframes tf-marquee {
358
+ to {
359
+ translate: var(--marquee-translate);
360
+ }
361
+ }
362
+
363
+ @keyframes tf-breathe {
364
+ 50% {
365
+ opacity: 0.5;
366
+ }
367
+ }
368
+
369
+ @keyframes tf-ring-ping {
370
+ 0% {
371
+ scale: 1;
372
+ opacity: 0.55;
373
+ }
374
+
375
+ 70%,
376
+ 100% {
377
+ scale: 2.6;
378
+ opacity: 0;
379
+ }
380
+ }
381
+
382
+ @keyframes tf-edge-pulse {
383
+ 50% {
384
+ opacity: var(--tf-edge-rest);
385
+ }
386
+ }
387
+
388
+ @keyframes tf-in {
389
+ from {
390
+ opacity: 0;
391
+ scale: 0.96;
392
+ }
393
+ }
394
+
395
+ @keyframes tf-back {
396
+ 0% {
397
+ opacity: 0;
398
+ scale: 0.96;
399
+ }
400
+ }
401
+
402
+ @keyframes tf-lift {
403
+ from {
404
+ opacity: 0;
405
+ scale: 0.96;
406
+ translate: 0 calc(var(--spacing) * 3);
407
+ }
408
+ }
409
+
410
+ @keyframes tf-lift-back {
411
+ 0% {
412
+ opacity: 0;
413
+ scale: 0.96;
414
+ translate: 0 calc(var(--spacing) * 3);
415
+ }
416
+ }
417
+
418
+ @keyframes tf-drawer {
419
+ from {
420
+ opacity: 0;
421
+ translate: -100% 0;
422
+ }
423
+ }
424
+
425
+ @keyframes tf-drawer-back {
426
+ 0% {
427
+ opacity: 0;
428
+ translate: -100% 0;
429
+ }
430
+ }
431
+
432
+ @keyframes tf-arrive {
433
+ from {
434
+ opacity: 0;
435
+ scale: 0.96;
436
+ translate: var(--tf-arrive, 0);
437
+ }
438
+ }
439
+
440
+ @keyframes tf-depart {
441
+ to {
442
+ opacity: 0;
443
+ scale: 0.96;
444
+ translate: var(--tf-arrive, 0);
445
+ }
446
+ }
447
+
448
+ @keyframes tf-out {
449
+ to {
450
+ opacity: 0;
451
+ scale: 0.96;
452
+ }
453
+ }
454
+
455
+ @keyframes tf-chip-in {
456
+ from {
457
+ width: 0;
458
+ padding-inline: 0;
459
+ margin-inline-end: calc(var(--tf-chip-gap, 0px) * -1);
460
+ opacity: 0;
461
+ scale: 0.96;
462
+ overflow: hidden;
463
+ }
464
+
465
+ 99% {
466
+ overflow: hidden;
467
+ }
468
+ }
469
+
470
+ @keyframes tf-chip-out {
471
+ from {
472
+ width: var(--tf-chip-width);
473
+ }
474
+
475
+ to {
476
+ width: 0;
477
+ padding-inline: 0;
478
+ margin-inline-end: calc(var(--tf-chip-gap, 0px) * -1);
479
+ opacity: 0;
480
+ scale: 0.96;
481
+ }
482
+ }
483
+
484
+ @keyframes tf-chip-out-auto {
485
+ from {
486
+ width: auto;
487
+ }
488
+
489
+ to {
490
+ width: 0;
491
+ padding-inline: 0;
492
+ margin-inline-end: calc(var(--tf-chip-gap, 0px) * -1);
493
+ opacity: 0;
494
+ scale: 0.96;
495
+ }
496
+ }
497
+
498
+ @keyframes tf-expand {
499
+ from {
500
+ height: 0;
501
+ opacity: 0;
502
+ }
503
+
504
+ to {
505
+ height: var(--height);
506
+ opacity: 1;
507
+ }
508
+ }
509
+
510
+ @keyframes tf-collapse {
511
+ from {
512
+ height: var(--height);
513
+ opacity: 1;
514
+ }
515
+
516
+ to {
517
+ height: 0;
518
+ opacity: 0;
519
+ }
520
+ }
521
+
522
+ @keyframes tf-pop {
523
+ from {
524
+ scale: 0.88;
525
+ }
526
+ }
527
+
528
+ @keyframes tf-rise {
529
+ from {
530
+ translate: 0 calc(var(--spacing) * 1.5);
531
+ }
532
+ }
533
+
534
+ @keyframes tf-draw {
535
+ from {
536
+ scale: 0 1;
537
+ }
538
+ }
539
+
540
+ @keyframes tf-page {
541
+ from {
542
+ opacity: 0;
543
+ translate: var(--tf-page-from, 0) 0;
544
+ }
545
+ }
546
+
547
+ @keyframes tf-page-again {
548
+ from {
549
+ opacity: 0;
550
+ translate: var(--tf-page-from, 0) 0;
551
+ }
552
+ }
553
+
554
+ @keyframes tf-tally {
555
+ from {
556
+ --tf-tally: 0;
557
+ }
558
+ }
559
+
560
+ @keyframes tf-nudge {
561
+ 40% {
562
+ scale: 1.08;
563
+ }
564
+ }
565
+
566
+ @keyframes tf-shake {
567
+ 20% {
568
+ translate: -6px 0;
569
+ }
570
+
571
+ 40% {
572
+ translate: 5px 0;
573
+ }
574
+
575
+ 60% {
576
+ translate: -3px 0;
577
+ }
578
+
579
+ 80% {
580
+ translate: 2px 0;
581
+ }
582
+ }
583
+
584
+ @keyframes tf-fade-in {
585
+ from {
586
+ opacity: 0;
587
+ }
588
+ }
589
+
590
+ @keyframes tf-fade-back {
591
+ 0% {
592
+ opacity: 0;
593
+ }
594
+ }
595
+
596
+ @keyframes tf-fade-out {
597
+ to {
598
+ opacity: 0;
599
+ }
600
+ }
601
+
602
+ @media (prefers-reduced-motion: reduce) {
603
+ :root {
604
+ --tf-duration-1: 0.01ms;
605
+ --tf-duration-2: 0.01ms;
606
+ --tf-duration-3: 0.01ms;
607
+ --tf-duration-4: 0.01ms;
608
+ }
609
+ }
610
+
611
+ @custom-variant interactive (&:not(:disabled):not([aria-disabled='true']):not([data-disabled]));
612
+
613
+ @custom-variant hovered (&:hover, &[data-hover]);
614
+
615
+ @custom-variant pressed (&:active, &[data-active]);
616
+
617
+ @custom-variant focused (&:focus-visible, &[data-focus-visible]);
618
+
619
+ @custom-variant reached (&:focus-within, &[data-reached]);
620
+
621
+ @custom-variant asleep (
622
+ &:has(:placeholder-shown, [data-placeholder-shown]):not(:focus-within):not([data-reached]):not([data-state='open'])
623
+ );
624
+
625
+ @property --tf-blend-lead {
626
+ syntax: '<color>';
627
+ initial-value: transparent;
628
+ inherits: true;
629
+ }
630
+
631
+ @property --tf-blend-mid {
632
+ syntax: '<color>';
633
+ initial-value: transparent;
634
+ inherits: true;
635
+ }
636
+
637
+ @property --tf-blend-trail {
638
+ syntax: '<color>';
639
+ initial-value: transparent;
640
+ inherits: true;
641
+ }
642
+
643
+ @property --tf-blend-angle {
644
+ syntax: '<angle>';
645
+ initial-value: 0deg;
646
+ inherits: true;
647
+ }
648
+
649
+ @property --tf-blend-waist {
650
+ syntax: '<percentage>';
651
+ initial-value: 50%;
652
+ inherits: true;
653
+ }
654
+
655
+ @property --tf-weather-near {
656
+ syntax: '<color>';
657
+ initial-value: transparent;
658
+ inherits: true;
659
+ }
660
+
661
+ @property --tf-weather-far {
662
+ syntax: '<color>';
663
+ initial-value: transparent;
664
+ inherits: true;
665
+ }
666
+
667
+ @property --tf-weather-angle {
668
+ syntax: '<angle>';
669
+ initial-value: 0deg;
670
+ inherits: true;
671
+ }
672
+
673
+ @property --tf-weather-x {
674
+ syntax: '<percentage>';
675
+ initial-value: 50%;
676
+ inherits: true;
677
+ }
678
+
679
+ @property --tf-weather-y {
680
+ syntax: '<percentage>';
681
+ initial-value: 50%;
682
+ inherits: true;
683
+ }
684
+
685
+ @property --tf-milk {
686
+ syntax: '<color>';
687
+ inherits: false;
688
+ initial-value: transparent;
689
+ }
690
+
691
+ @property --tf-label-lead {
692
+ syntax: '<color>';
693
+ inherits: true;
694
+ initial-value: transparent;
695
+ }
696
+
697
+ @property --tf-label-mid {
698
+ syntax: '<color>';
699
+ inherits: true;
700
+ initial-value: transparent;
701
+ }
702
+
703
+ @property --tf-label-trail {
704
+ syntax: '<color>';
705
+ inherits: true;
706
+ initial-value: transparent;
707
+ }
708
+
709
+ @property --tf-nudge {
710
+ syntax: '<length>';
711
+ inherits: true;
712
+ initial-value: 0px;
713
+ }
714
+
715
+ @property --tf-tally {
716
+ syntax: '<number>';
717
+ inherits: false;
718
+ initial-value: 1;
719
+ }
720
+
721
+ @property --tf-plate {
722
+ syntax: '<color>';
723
+ inherits: true;
724
+ initial-value: transparent;
725
+ }
726
+
727
+ @property --tf-ring-base {
728
+ syntax: '<color>';
729
+ inherits: true;
730
+ initial-value: transparent;
731
+ }
732
+
733
+ @property --tf-ring-bloom {
734
+ syntax: '<color>';
735
+ inherits: true;
736
+ initial-value: transparent;
737
+ }
738
+
739
+ @property --tf-sweep {
740
+ syntax: '<angle>';
741
+ initial-value: 0deg;
742
+ inherits: false;
743
+ }
744
+
745
+ @property --tf-ceiling {
746
+ syntax: '<number>';
747
+ initial-value: 0.145;
748
+ inherits: true;
749
+ }
750
+
751
+ @property --tf-marquee-run {
752
+ syntax: '<length>';
753
+ initial-value: 0px;
754
+ inherits: true;
755
+ }
756
+
757
+ @property --tf-marquee-pace {
758
+ syntax: '<length>';
759
+ initial-value: 0px;
760
+ inherits: true;
761
+ }
762
+
763
+ @property --tf-fade-head {
764
+ syntax: '<length>';
765
+ initial-value: 0px;
766
+ inherits: false;
767
+ }
768
+
769
+ @property --tf-fade-foot {
770
+ syntax: '<length>';
771
+ initial-value: 0px;
772
+ inherits: false;
773
+ }
774
+
775
+ @property --tf-marquee-rate {
776
+ syntax: '<number>';
777
+ initial-value: 1;
778
+ inherits: true;
779
+ }
780
+
781
+ @utility tf-transition {
782
+ transition:
783
+ var(--tf-widen, color var(--tf-ink-timing)),
784
+ background-color var(--tf-timing-quick),
785
+ border-color var(--tf-timing-quick),
786
+ outline-color var(--tf-timing-quick),
787
+ box-shadow var(--tf-shadow-timing),
788
+ transform var(--tf-move-timing),
789
+ scale var(--tf-move-timing),
790
+ translate var(--tf-slide-timing, var(--tf-move-timing)),
791
+ rotate var(--tf-move-timing),
792
+ var(--tf-travel, opacity var(--tf-timing-quick)),
793
+ --tf-label-lead var(--tf-move-timing),
794
+ --tf-label-mid var(--tf-move-timing),
795
+ --tf-label-trail var(--tf-move-timing),
796
+ --tf-blend-lead var(--tf-blend-timing),
797
+ --tf-blend-mid var(--tf-blend-timing),
798
+ --tf-blend-trail var(--tf-blend-timing),
799
+ --tf-blend-angle var(--tf-blend-timing),
800
+ --tf-blend-waist var(--tf-blend-timing),
801
+ --tf-weather-near var(--tf-weather-timing),
802
+ --tf-weather-far var(--tf-weather-timing),
803
+ --tf-weather-angle var(--tf-weather-timing),
804
+ --tf-weather-x var(--tf-weather-timing),
805
+ --tf-weather-y var(--tf-weather-timing),
806
+ --tf-nudge var(--tf-timing-quick),
807
+ --tf-plate var(--tf-timing-glide),
808
+ --tf-ring-base var(--tf-blend-timing),
809
+ --tf-ring-bloom var(--tf-blend-timing),
810
+ --tf-milk var(--tf-blend-timing);
811
+ }
812
+
813
+ @utility blend-tf-* {
814
+ --tf-base: --value(--color-tf-*);
815
+ --tf-ceiling: --value(--ceiling-tf-*);
816
+ }
817
+
818
+ @utility tf-ramp {
819
+ --tf-blend-lead: var(--tf-rest-lead);
820
+ --tf-blend-mid: var(--tf-rest-mid);
821
+ --tf-blend-trail: var(--tf-rest-trail);
822
+ --tf-blend-angle: var(--tf-rest-angle);
823
+ --tf-blend-waist: var(--tf-rest-waist);
824
+
825
+ background-image:
826
+ linear-gradient(var(--tf-blend-angle), var(--tf-milk) 0%, transparent var(--tf-milk-reach)),
827
+ linear-gradient(
828
+ var(--tf-blend-angle),
829
+ var(--tf-blend-lead) 0%,
830
+ var(--tf-blend-mid) var(--tf-blend-waist),
831
+ var(--tf-blend-trail) 100%
832
+ );
833
+ }
834
+
835
+ @utility tf-fill-scale {
836
+ --tf-lift: oklch(from var(--tf-base) 0.6 min(calc(var(--tf-c, c) * 1.1), var(--tf-ceiling)) h);
837
+ --tf-vivid: oklch(
838
+ from var(--tf-base) 0.51 min(calc(var(--tf-c, c) * 1.05), calc(var(--tf-ceiling) * 0.85)) h
839
+ );
840
+ --tf-deep: oklch(from var(--tf-base) 0.42 min(c, calc(var(--tf-ceiling) * 0.7)) h);
841
+ --tf-flare: oklch(
842
+ from var(--tf-base) 0.68 min(calc(var(--tf-c, c) * 1.1), calc(var(--tf-ceiling) * 0.77)) h
843
+ );
844
+ --tf-abyss: oklch(from var(--tf-base) 0.33 min(c, calc(var(--tf-ceiling) * 0.55)) h);
845
+ }
846
+
847
+ @utility bg-tf-blend {
848
+ @apply tf-fill-scale;
849
+
850
+ --tf-rest-lead: var(--tf-lift);
851
+ --tf-rest-mid: color-mix(in oklab, var(--tf-lift) 62%, var(--tf-deep));
852
+ --tf-rest-trail: var(--tf-deep);
853
+
854
+ @apply tf-ramp;
855
+ }
856
+
857
+ @utility bg-tf-blend-rise {
858
+ @apply bg-tf-blend;
859
+
860
+ --tf-blend-angle: var(--tf-rise-angle);
861
+ }
862
+
863
+ @utility tf-ink-scale {
864
+ --tf-lift: oklch(from var(--tf-base) 0.88 calc(var(--tf-c, c) * 1.1) h);
865
+ --tf-vivid: oklch(from var(--tf-base) 0.82 calc(var(--tf-c, c) * 1.3) h);
866
+ --tf-deep: oklch(from var(--tf-base) 0.7 c h);
867
+ --tf-flare: oklch(from var(--tf-base) 0.92 calc(var(--tf-c, c) * 1.15) h);
868
+ --tf-abyss: oklch(from var(--tf-base) 0.66 calc(var(--tf-c, c) * 1.05) h);
869
+ }
870
+
871
+ @utility text-tf-blend {
872
+ @apply tf-ink-scale;
873
+
874
+ --tf-rest-lead: var(--color-tf-fg);
875
+ --tf-rest-mid: var(--color-tf-fg);
876
+ --tf-rest-trail: var(--color-tf-fg);
877
+
878
+ @apply tf-ramp;
879
+ background-clip: text;
880
+ color: transparent;
881
+ text-box-trim: trim-start;
882
+ }
883
+
884
+ @utility tf-label-ramp {
885
+ --tf-blend-angle: var(--tf-rest-angle);
886
+ --tf-blend-waist: var(--tf-rest-waist);
887
+
888
+ background-image: linear-gradient(
889
+ var(--tf-blend-angle),
890
+ var(--tf-label-lead) 0%,
891
+ var(--tf-label-mid) var(--tf-blend-waist),
892
+ var(--tf-label-trail) 100%
893
+ );
894
+ background-clip: text;
895
+ color: transparent;
896
+ text-box-trim: trim-start;
897
+ }
898
+
899
+ @utility tf-label-quiet {
900
+ --tf-label-lead: var(--color-tf-muted);
901
+ --tf-label-mid: var(--color-tf-muted);
902
+ --tf-label-trail: var(--color-tf-muted);
903
+ }
904
+
905
+ @utility tf-label-lit {
906
+ --tf-label-lead: var(--tf-label-ink, oklch(from var(--tf-base) 0.73 c h));
907
+ --tf-label-mid: var(--tf-label-ink, oklch(from var(--tf-base) 0.73 c h));
908
+ --tf-label-trail: var(--tf-label-ink, oklch(from var(--tf-base) 0.73 c h));
909
+ }
910
+
911
+ @utility tf-label-failed {
912
+ --tf-label-ink: var(--color-tf-danger-hi);
913
+ }
914
+
915
+ @utility tf-label-inked {
916
+ @apply tf-ink-scale;
917
+
918
+ --tf-label-lead: var(--tf-flare);
919
+ --tf-label-mid: var(--tf-vivid);
920
+ --tf-label-trail: var(--tf-abyss);
921
+ --tf-blend-angle: var(--tf-mixed-angle);
922
+ --tf-blend-waist: var(--tf-mixed-waist);
923
+ }
924
+
925
+ @utility tf-moves-glide {
926
+ --tf-move-timing: var(--tf-timing-glide);
927
+ }
928
+
929
+ @utility tf-moves-spring {
930
+ --tf-move-timing: var(--tf-timing-spring);
931
+ }
932
+
933
+ @utility tf-slides-spring {
934
+ --tf-slide-timing: var(--tf-timing-spring);
935
+ }
936
+
937
+ @utility tf-slides-settle {
938
+ --tf-slide-timing: var(--tf-timing-settle);
939
+ }
940
+
941
+ @utility tf-crossfades {
942
+ transition:
943
+ opacity var(--tf-timing-glide),
944
+ visibility var(--tf-timing-glide);
945
+ }
946
+
947
+ @utility tf-grows {
948
+ transition: grid-template-rows var(--tf-timing-glide);
949
+ }
950
+
951
+ @utility tf-arrives {
952
+ transition: opacity var(--tf-timing-glide);
953
+
954
+ @starting-style {
955
+ opacity: 0;
956
+ }
957
+ }
958
+
959
+ @utility tf-resizes {
960
+ transition: height var(--tf-timing-glide);
961
+ }
962
+
963
+ @utility tf-unfolds {
964
+ display: grid;
965
+ grid-template-rows: minmax(0, 1fr);
966
+ overflow: hidden;
967
+ transition: grid-template-rows var(--tf-timing-glide);
968
+
969
+ & > * {
970
+ min-height: 0;
971
+ }
972
+
973
+ @starting-style {
974
+ grid-template-rows: minmax(0, 0fr);
975
+ }
976
+ }
977
+
978
+ @utility tf-rails {
979
+ --tf-widen:
980
+ width var(--tf-timing-glide), height var(--tf-timing-glide),
981
+ inset-inline-start var(--tf-timing-glide), inset-inline-end var(--tf-timing-glide),
982
+ padding-inline-start var(--tf-timing-glide), padding-inline-end var(--tf-timing-glide),
983
+ column-gap var(--tf-timing-glide), row-gap var(--tf-timing-glide),
984
+ flex-grow var(--tf-timing-glide), color var(--tf-ink-timing);
985
+ }
986
+
987
+ @utility tf-travels {
988
+ --tf-travel:
989
+ opacity var(--tf-timing-quick), inset-inline-start var(--tf-move-timing),
990
+ left var(--tf-move-timing), right var(--tf-move-timing);
991
+ }
992
+
993
+ @utility tf-ink-glide {
994
+ --tf-ink-timing: var(--tf-timing-glide);
995
+ }
996
+
997
+ @utility text-tf-unit {
998
+ @apply text-tf-blend;
999
+
1000
+ --tf-rest-lead: var(--color-tf-muted);
1001
+ --tf-rest-mid: var(--color-tf-muted);
1002
+ --tf-rest-trail: var(--color-tf-muted);
1003
+ }
1004
+
1005
+ @utility tf-ink-well {
1006
+ @apply tf-ink-scale;
1007
+
1008
+ position: absolute;
1009
+ width: 0;
1010
+ height: 0;
1011
+ }
1012
+
1013
+ @utility stroke-tf-ink {
1014
+ & svg :is(path, circle, rect, line, polyline, polygon, ellipse) {
1015
+ stroke: var(--tf-ink);
1016
+ }
1017
+ }
1018
+
1019
+ @utility tf-blend-outline {
1020
+ @apply tf-ink-scale;
1021
+
1022
+ @apply tf-ring-scale;
1023
+
1024
+ --tf-outline-lift: var(--tf-ring-lit-bloom);
1025
+
1026
+ &::before {
1027
+ content: '';
1028
+ position: absolute;
1029
+ inset: 0;
1030
+ padding: 1px;
1031
+ border-radius: inherit;
1032
+ background-image: linear-gradient(
1033
+ var(--tf-blend-angle),
1034
+ var(--tf-outline-lift) 0%,
1035
+ color-mix(in oklab, var(--tf-outline-lift) 83%, var(--tf-deep)) var(--tf-blend-waist),
1036
+ color-mix(in oklab, var(--tf-outline-lift) 67%, var(--tf-deep)) 100%
1037
+ );
1038
+ mask:
1039
+ linear-gradient(#000 0 0) content-box,
1040
+ linear-gradient(#000 0 0);
1041
+ mask-composite: exclude;
1042
+ opacity: var(--tf-edge-rest);
1043
+ transition: opacity var(--tf-duration-3) var(--ease-tf);
1044
+ pointer-events: none;
1045
+ }
1046
+ }
1047
+
1048
+ @utility tf-scroll-hidden {
1049
+ scrollbar-width: none;
1050
+
1051
+ &::-webkit-scrollbar {
1052
+ width: 0;
1053
+ height: 0;
1054
+ }
1055
+ }
1056
+
1057
+ @utility tf-chip-arrives {
1058
+ animation: var(--animate-tf-in);
1059
+
1060
+ @supports (interpolate-size: allow-keywords) {
1061
+ interpolate-size: allow-keywords;
1062
+ animation: var(--animate-tf-chip-in);
1063
+ }
1064
+ }
1065
+
1066
+ @utility tf-chip-departs {
1067
+ animation: var(--animate-tf-chip-out);
1068
+
1069
+ @supports (interpolate-size: allow-keywords) {
1070
+ interpolate-size: allow-keywords;
1071
+ animation: var(--animate-tf-chip-out-auto);
1072
+ }
1073
+ }
1074
+
1075
+ @utility tf-scroll-faded {
1076
+ mask-image: linear-gradient(
1077
+ to bottom,
1078
+ transparent 0,
1079
+ transparent var(--tf-fade-head, 0px),
1080
+ #000 calc(var(--tf-fade-head, 0px) + var(--spacing)),
1081
+ #000 calc(100% - var(--tf-fade-foot, 0px)),
1082
+ transparent 100%
1083
+ );
1084
+ }
1085
+
1086
+ @utility tf-fades {
1087
+ transition:
1088
+ --tf-fade-head var(--tf-timing-glide),
1089
+ --tf-fade-foot var(--tf-timing-glide);
1090
+ }
1091
+
1092
+ @utility tf-scroll-thin {
1093
+ scrollbar-width: thin;
1094
+ scrollbar-color: var(--color-tf-line-hi) transparent;
1095
+
1096
+ &::-webkit-scrollbar {
1097
+ width: calc(var(--spacing) * 1);
1098
+ height: calc(var(--spacing) * 1);
1099
+ }
1100
+
1101
+ &::-webkit-scrollbar-thumb {
1102
+ border-radius: var(--radius-tf-inline);
1103
+ background-color: var(--color-tf-line-hi);
1104
+ }
1105
+
1106
+ &::-webkit-scrollbar-track {
1107
+ background-color: transparent;
1108
+ }
1109
+ }
1110
+
1111
+ @utility tf-menu-width {
1112
+ min-width: max(var(--reference-width, 0px), var(--spacing-tf-menu));
1113
+ }
1114
+
1115
+ @utility tf-glass-plate {
1116
+ background-color: color-mix(in oklab, var(--tf-base) 26%, transparent);
1117
+ }
1118
+
1119
+ @utility tf-glass-plate-lit {
1120
+ background-color: color-mix(in oklab, var(--tf-base) 38%, transparent);
1121
+ }
1122
+
1123
+ @utility tf-tinted {
1124
+ background-color: color-mix(in oklab, var(--tf-base) var(--tf-tint), var(--color-tf-surface));
1125
+ }
1126
+
1127
+ @utility tf-glow {
1128
+ box-shadow:
1129
+ var(--tf-inner-light, 0 0 #0000),
1130
+ var(--tf-cast-shadow, 0 0 #0000),
1131
+ 0 0 18px -2px color-mix(in oklab, var(--tf-flare) var(--tf-glow-strength, 42%), transparent);
1132
+ }
1133
+
1134
+ @utility tf-lit-inside {
1135
+ --tf-inner-light: inset 0 1px 0 rgb(255 255 255 / 20%);
1136
+ }
1137
+
1138
+ @utility tf-inner-lit {
1139
+ @apply tf-lit-rest;
1140
+
1141
+ box-shadow: var(--tf-inner-light);
1142
+ }
1143
+
1144
+ @utility tf-raised {
1145
+ --tf-cast-shadow: 0 7px 16px -7px color-mix(in oklab, var(--tf-flare) 55%, transparent);
1146
+ --tf-glow-strength: 30%;
1147
+ }
1148
+
1149
+ @utility tf-lit-rest {
1150
+ --tf-inner-light: inset 0 1px 0 rgb(255 255 255 / 12%);
1151
+ }
1152
+
1153
+ @utility tf-settled {
1154
+ --tf-cast-shadow: 0 1px 2px rgb(0 0 0 / 34%), 0 6px 14px -6px rgb(0 0 0 / 46%);
1155
+ --tf-glow-strength: 0%;
1156
+ }
1157
+
1158
+ @utility tf-settled-quiet {
1159
+ --tf-cast-shadow: 0 1px 2px rgb(0 0 0 / 28%);
1160
+ --tf-glow-strength: 0%;
1161
+ }
1162
+
1163
+ @utility tf-lifted {
1164
+ --tf-cast-shadow: 0 2px 4px rgb(0 0 0 / 32%), 0 12px 26px -10px rgb(0 0 0 / 50%);
1165
+ --tf-glow-strength: 0%;
1166
+ }
1167
+
1168
+ @utility tf-pressed {
1169
+ --tf-cast-shadow: 0 1px 1px rgb(0 0 0 / 34%);
1170
+ --tf-glow-strength: 6%;
1171
+ }
1172
+
1173
+ @utility tf-tilted {
1174
+ --tf-blend-angle: var(--tf-pressed-angle);
1175
+ }
1176
+
1177
+ @utility tf-ring-scale {
1178
+ --tf-ring-dim: oklch(from var(--tf-base) 0.34 calc(var(--tf-c, c) * 0.34) h);
1179
+ --tf-ring-dim-bloom: oklch(from var(--tf-base) 0.45 calc(var(--tf-c, c) * 0.42) h);
1180
+ --tf-ring-lit: oklch(from var(--tf-base) 0.6 calc(var(--tf-c, c) * 0.85) h);
1181
+ --tf-ring-lit-bloom: oklch(from var(--tf-base) 0.78 c h);
1182
+ }
1183
+
1184
+ @utility tf-ring-rest {
1185
+ @apply tf-ring-scale;
1186
+
1187
+ --tf-ring-base: var(--tf-ring-dim);
1188
+ --tf-ring-bloom: var(--tf-ring-dim-bloom);
1189
+ }
1190
+
1191
+ @utility tf-edge-sweep {
1192
+ @apply tf-ring-rest;
1193
+
1194
+ &::before {
1195
+ content: '';
1196
+ position: absolute;
1197
+ inset: 0;
1198
+ padding: 1px;
1199
+ border-radius: inherit;
1200
+ background-image: conic-gradient(
1201
+ from var(--tf-sweep),
1202
+ var(--tf-ring-base) 0%,
1203
+ var(--tf-ring-bloom) 50%,
1204
+ var(--tf-ring-base) 100%
1205
+ );
1206
+ mask:
1207
+ linear-gradient(#000 0 0) content-box,
1208
+ linear-gradient(#000 0 0);
1209
+ mask-composite: exclude;
1210
+ pointer-events: none;
1211
+ }
1212
+ }
1213
+
1214
+ @utility tf-edge-plain {
1215
+ --tf-ring-base: var(--color-tf-line);
1216
+ --tf-ring-bloom: var(--color-tf-line);
1217
+ }
1218
+
1219
+ @utility tf-edge-lit {
1220
+ @apply tf-ring-scale;
1221
+
1222
+ --tf-ring-base: var(--tf-ring-lit);
1223
+ --tf-ring-bloom: var(--tf-ring-lit-bloom);
1224
+ }
1225
+
1226
+ @utility tf-edge-milk {
1227
+ --tf-ring-base: rgb(255 255 255 / 6%);
1228
+ --tf-ring-bloom: rgb(255 255 255 / 26%);
1229
+ }
1230
+
1231
+ @utility tf-swept-top {
1232
+ &::before {
1233
+ --tf-sweep: 180deg;
1234
+ }
1235
+ }
1236
+
1237
+ @utility tf-writes {
1238
+ caret-color: var(--color-tf-accent-hi);
1239
+
1240
+ &::placeholder {
1241
+ transition: opacity var(--tf-timing-quick);
1242
+ }
1243
+
1244
+ &::selection {
1245
+ background-color: var(--color-tf-accent-surface);
1246
+ color: var(--color-tf-on-accent);
1247
+ }
1248
+
1249
+ &:-webkit-autofill {
1250
+ -webkit-text-fill-color: var(--color-tf-fg);
1251
+ caret-color: var(--color-tf-accent-hi);
1252
+ box-shadow: inset 0 0 0 1000px var(--color-tf-surface);
1253
+ }
1254
+ }
1255
+
1256
+ @utility tf-mark-edge {
1257
+ --tf-mark-rest: var(--color-tf-line);
1258
+ --tf-mark-bloom: var(--color-tf-line-hi);
1259
+
1260
+ box-shadow: inset 0 0 0 var(--spacing-tf-hairline) var(--tf-mark-ink, var(--tf-mark-rest));
1261
+ }
1262
+
1263
+ @utility tf-mark-lit {
1264
+ @apply tf-ring-scale;
1265
+
1266
+ --tf-mark-rest: var(--tf-ring-lit);
1267
+ --tf-mark-bloom: var(--tf-ring-lit-bloom);
1268
+ }
1269
+
1270
+ @utility tf-mark-draws {
1271
+ transition: display var(--tf-timing-glide) allow-discrete;
1272
+
1273
+ & svg path {
1274
+ stroke-dasharray: var(--tf-mark-path);
1275
+ stroke-dashoffset: 0;
1276
+ transition: stroke-dashoffset var(--tf-timing-glide);
1277
+ }
1278
+
1279
+ & [data-part='dash'] {
1280
+ transform-origin: left center;
1281
+ scale: 1 1;
1282
+ transition: scale var(--tf-timing-glide);
1283
+ }
1284
+
1285
+ &[hidden] {
1286
+ transition: display var(--tf-timing-quick) allow-discrete;
1287
+ }
1288
+
1289
+ &[hidden] svg path {
1290
+ stroke-dashoffset: calc(var(--tf-mark-path) * -1);
1291
+ transition: stroke-dashoffset var(--tf-timing-quick);
1292
+ }
1293
+
1294
+ &[hidden] [data-part='dash'] {
1295
+ scale: 0 1;
1296
+ transition: scale var(--tf-timing-quick);
1297
+ }
1298
+
1299
+ @starting-style {
1300
+ & svg path {
1301
+ stroke-dashoffset: calc(var(--tf-mark-path) * -1);
1302
+ }
1303
+
1304
+ & [data-part='dash'] {
1305
+ scale: 0 1;
1306
+ }
1307
+ }
1308
+ }
1309
+
1310
+ @utility tf-mark-bloomed {
1311
+ --tf-mark-ink: var(--tf-mark-bloom);
1312
+ }
1313
+
1314
+ @utility tf-mark-glowing {
1315
+ --tf-inner-light: inset 0 0 0 var(--spacing-tf-hairline) var(--tf-mark-ink, var(--tf-mark-rest));
1316
+
1317
+ @apply tf-glow;
1318
+ }
1319
+
1320
+ @utility tf-mark-failed {
1321
+ --tf-mark-rest: var(--color-tf-danger-hi);
1322
+ --tf-mark-bloom: var(--color-tf-danger-hi);
1323
+ }
1324
+
1325
+ @utility tf-rule {
1326
+ @apply tf-edge-lit;
1327
+
1328
+ --tf-rest-lead: var(--tf-ring-base);
1329
+ --tf-rest-mid: oklch(from var(--tf-ring-base) l c h / calc(100% - var(--tf-blend-waist)));
1330
+ --tf-rest-trail: oklch(from var(--tf-ring-base) l c h / 0);
1331
+
1332
+ @apply tf-ramp;
1333
+ }
1334
+
1335
+ @utility tf-rule-quiet {
1336
+ background-image: linear-gradient(
1337
+ var(--tf-rest-angle),
1338
+ transparent 0%,
1339
+ var(--color-tf-line) 50%,
1340
+ transparent 100%
1341
+ );
1342
+ }
1343
+
1344
+ @utility tf-rule-filled {
1345
+ @apply bg-tf-blend;
1346
+ }
1347
+
1348
+ @utility tf-rule-fall {
1349
+ @apply tf-rule;
1350
+
1351
+ --tf-blend-angle: var(--tf-fall-angle);
1352
+ }
1353
+
1354
+ @utility tf-rule-filled-fall {
1355
+ @apply tf-rule-filled;
1356
+
1357
+ --tf-blend-angle: var(--tf-fall-angle);
1358
+ }
1359
+
1360
+ @utility tf-nebula {
1361
+ --tf-cloud-near: color-mix(in oklab, var(--tf-base) 34%, var(--color-tf-bg));
1362
+ --tf-cloud-far: color-mix(in oklab, var(--tf-base) 17%, var(--color-tf-bg));
1363
+
1364
+ background-image: conic-gradient(
1365
+ from var(--tf-sweep),
1366
+ transparent 0deg,
1367
+ var(--tf-cloud-far) 55deg,
1368
+ var(--tf-cloud-near) 105deg,
1369
+ transparent 165deg,
1370
+ transparent 215deg,
1371
+ var(--tf-cloud-far) 275deg,
1372
+ transparent 335deg
1373
+ );
1374
+ filter: blur(60px);
1375
+ }
1376
+
1377
+ @utility tf-blend-drift {
1378
+ --tf-blend-timing: var(--tf-timing-drift);
1379
+ }
1380
+
1381
+ @utility tf-cloud-scale {
1382
+ --tf-haze: oklch(from var(--tf-base) 0.85 c h);
1383
+ --tf-haze-lit: oklch(from var(--tf-base) 0.92 c h);
1384
+ --tf-haze-quiet: oklch(from var(--tf-base) 0.6 c h);
1385
+ }
1386
+
1387
+ @utility tf-cloud-brand {
1388
+ @apply tf-cloud-scale;
1389
+
1390
+ --tf-cloud-dim: var(--tf-haze);
1391
+ --tf-cloud-lit: var(--tf-haze-lit);
1392
+ }
1393
+
1394
+ @utility tf-cloud-ink {
1395
+ @apply tf-cloud-scale;
1396
+
1397
+ --tf-cloud-dim: var(--tf-haze-quiet);
1398
+ --tf-cloud-lit: var(--tf-haze-quiet);
1399
+ }
1400
+
1401
+ @utility tf-cloud-quiet {
1402
+ --tf-cloud-dim: var(--tf-flare);
1403
+ --tf-cloud-lit: var(--tf-flare);
1404
+ }
1405
+
1406
+ @utility tf-clouded {
1407
+ --tf-weather-near: color-mix(in oklab, var(--tf-cloud-dim) 26%, transparent);
1408
+ --tf-weather-far: color-mix(in oklab, var(--tf-cloud-dim) 10%, transparent);
1409
+ --tf-weather-angle: 0deg;
1410
+ --tf-weather-x: 50%;
1411
+ --tf-weather-y: 50%;
1412
+ }
1413
+
1414
+ @utility tf-clouding {
1415
+ --tf-weather-near: color-mix(in oklab, var(--tf-cloud-lit) 58%, transparent);
1416
+ --tf-weather-far: color-mix(in oklab, var(--tf-cloud-lit) 26%, transparent);
1417
+ --tf-weather-angle: 52deg;
1418
+ --tf-weather-x: 33%;
1419
+ --tf-weather-y: 64%;
1420
+ }
1421
+
1422
+ @utility tf-clouded-lifted {
1423
+ --tf-weather-near: color-mix(in oklab, var(--tf-cloud-dim) 26%, transparent);
1424
+ --tf-weather-far: color-mix(in oklab, var(--tf-cloud-dim) 10%, transparent);
1425
+ --tf-weather-angle: 24deg;
1426
+ --tf-weather-x: 22%;
1427
+ --tf-weather-y: 78%;
1428
+ }
1429
+
1430
+ @utility tf-cloud-* {
1431
+ --tf-cloud-blur: --value(--blur-tf-cloud-*);
1432
+ }
1433
+
1434
+ @utility tf-cloud-hidden {
1435
+ --tf-weather-near: transparent;
1436
+ --tf-weather-far: transparent;
1437
+ --tf-weather-angle: 0deg;
1438
+ --tf-weather-x: 50%;
1439
+ --tf-weather-y: 50%;
1440
+ }
1441
+
1442
+ @utility tf-pops {
1443
+ animation: tf-pop var(--tf-duration-2) var(--ease-tf-spring) var(--tf-land, 0ms) both;
1444
+ }
1445
+
1446
+ @utility tf-lands {
1447
+ animation: tf-in var(--tf-duration-2) var(--ease-tf) var(--tf-land, 0ms) both;
1448
+ }
1449
+
1450
+ @utility tf-tallies {
1451
+ display: inline-grid;
1452
+ grid-template-areas: 'figure';
1453
+ align-items: baseline;
1454
+ animation: tf-tally var(--tf-duration-4) var(--ease-tf) var(--tf-land, 0ms) both;
1455
+
1456
+ &::before {
1457
+ content: attr(data-tally);
1458
+ grid-area: figure;
1459
+ visibility: hidden;
1460
+ }
1461
+
1462
+ & > * {
1463
+ grid-area: figure;
1464
+ justify-self: start;
1465
+ }
1466
+ }
1467
+
1468
+ @utility tf-reveals {
1469
+ transition:
1470
+ width var(--tf-timing-quick),
1471
+ opacity var(--tf-timing-quick),
1472
+ scale var(--tf-timing-quick);
1473
+ }
1474
+
1475
+ @utility tf-nudged {
1476
+ --tf-nudge: var(--spacing);
1477
+ }
1478
+
1479
+ @utility tf-weather-trail {
1480
+ --tf-weather-timing: var(--tf-timing-trail);
1481
+ }
1482
+
1483
+ @utility tf-nudge-follow {
1484
+ translate: var(--tf-nudge);
1485
+ }
1486
+
1487
+ @utility tf-plated {
1488
+ --tf-plate: var(--color-tf-panel-hi);
1489
+ }
1490
+
1491
+ @utility tf-plated-quiet {
1492
+ --tf-plate: var(--color-tf-panel-2);
1493
+ }
1494
+
1495
+ @utility tf-nebula-veil {
1496
+ position: absolute;
1497
+ inset: 0;
1498
+ z-index: -1;
1499
+ overflow: hidden;
1500
+ border-radius: inherit;
1501
+ background-color: var(--tf-plate);
1502
+ pointer-events: none;
1503
+ }
1504
+
1505
+ @utility tf-cloud-low {
1506
+ mask-image: linear-gradient(to top, #000 10%, rgb(0 0 0 / 45%) 34%, transparent 66%);
1507
+ }
1508
+
1509
+ @utility tf-faded-x {
1510
+ mask-image: linear-gradient(to right, transparent 0%, #000 8%, #000 92%, transparent 100%);
1511
+ }
1512
+
1513
+ @utility tf-nebula-cloud {
1514
+ position: absolute;
1515
+ inset: -70%;
1516
+ background-image: conic-gradient(
1517
+ from var(--tf-weather-angle) at var(--tf-weather-x) var(--tf-weather-y),
1518
+ transparent 0deg,
1519
+ var(--tf-weather-far) 55deg,
1520
+ var(--tf-weather-near) 105deg,
1521
+ transparent 165deg,
1522
+ transparent 215deg,
1523
+ var(--tf-weather-far) 275deg,
1524
+ transparent 335deg
1525
+ );
1526
+ filter: blur(var(--tf-cloud-blur));
1527
+ }
1528
+
1529
+ @utility tf-turning {
1530
+ @variant motion-safe {
1531
+ animation: tf-sweep var(--tf-sweep-duration) linear infinite;
1532
+ }
1533
+ }
1534
+
1535
+ @utility tf-breathing {
1536
+ @variant motion-safe {
1537
+ animation: tf-breathe var(--tf-pulse-duration) var(--ease-tf-glide) infinite;
1538
+ }
1539
+ }
1540
+
1541
+ @utility tf-pinging {
1542
+ @variant motion-safe {
1543
+ animation: tf-ring-ping var(--tf-pulse-duration) var(--ease-tf-glide) infinite;
1544
+ }
1545
+ }
1546
+
1547
+ @utility tf-cloud-breathing {
1548
+ @apply tf-breathing;
1549
+ }
1550
+
1551
+ @utility tf-twinkling {
1552
+ @variant motion-safe {
1553
+ animation: tf-twinkle var(--tf-twinkle-duration) var(--ease-tf-glide) infinite;
1554
+ }
1555
+ }
1556
+
1557
+ @utility tf-looping {
1558
+ @variant motion-safe {
1559
+ animation: tf-marquee calc(var(--tf-marquee-run) / var(--tf-marquee-pace) * 1s) linear
1560
+ var(--marquee-delay) var(--marquee-loop-count);
1561
+ }
1562
+ }
1563
+
1564
+ @utility tf-slows {
1565
+ @variant motion-safe {
1566
+ transition: --tf-marquee-rate var(--tf-timing-drift);
1567
+ }
1568
+ }
1569
+
1570
+ @utility tf-swept {
1571
+ @variant motion-safe {
1572
+ &::before {
1573
+ animation:
1574
+ tf-sweep var(--tf-sweep-duration) linear infinite,
1575
+ var(--tf-edge-pulse, none) var(--tf-pulse-duration) var(--ease-tf-glide) infinite;
1576
+ }
1577
+ }
1578
+ }
1579
+
1580
+ @utility tf-pulsing {
1581
+ --tf-edge-pulse: tf-edge-pulse;
1582
+ }
1583
+
1584
+ @utility tf-milked {
1585
+ --tf-milk: rgb(255 255 255 / 22%);
1586
+ }
1587
+
1588
+ @utility tf-shaken {
1589
+ animation: var(--animate-tf-lift), var(--animate-tf-shake);
1590
+ }
1591
+
1592
+ @utility tf-blend-hushed {
1593
+ animation: var(--animate-tf-blend-in);
1594
+
1595
+ --tf-blend-lead: var(--tf-vivid);
1596
+ --tf-blend-mid: var(--tf-deep);
1597
+ --tf-blend-trail: var(--tf-abyss);
1598
+ --tf-blend-angle: var(--tf-mixed-angle);
1599
+ --tf-blend-waist: var(--tf-mixed-waist);
1600
+ }
1601
+
1602
+ @utility tf-blended {
1603
+ animation: var(--animate-tf-blend-in);
1604
+
1605
+ --tf-blend-lead: var(--tf-flare);
1606
+ --tf-blend-mid: var(--tf-vivid);
1607
+ --tf-blend-trail: var(--tf-abyss);
1608
+ --tf-blend-angle: var(--tf-mixed-angle);
1609
+ --tf-blend-waist: var(--tf-mixed-waist);
1610
+
1611
+ &::before {
1612
+ opacity: 1;
1613
+ }
1614
+ }
1615
+
1616
+ @utility duration-tf-* {
1617
+ transition-duration: --value(--tf-duration-*);
1618
+ }
1619
+
1620
+ @utility z-tf-* {
1621
+ z-index: --value(--tf-z-*);
1622
+ }
1623
+
1624
+ @utility tf-icons-solo {
1625
+ & svg :is(path, line, polyline, polygon, circle, ellipse, rect) {
1626
+ stroke-width: var(--tf-icon-stroke-solo);
1627
+ }
1628
+ }
1629
+
1630
+ @utility tf-icons {
1631
+ & svg :is(path, line, polyline, polygon, circle, ellipse, rect) {
1632
+ stroke-width: var(--tf-icon-stroke);
1633
+ }
1634
+ }
1635
+
1636
+ @utility tf-text-trim {
1637
+ @supports (text-box: trim-both text text) {
1638
+ text-box: trim-both text text;
1639
+ }
1640
+ }