@tempoxyz/ds 0.3.11 → 0.3.13

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 (212) hide show
  1. package/README.md +7 -6
  2. package/dist/docs/AGENTS.md +8 -5
  3. package/dist/docs/index.md +143 -135
  4. package/dist/docs/marketing/introduction/getting-started.md +241 -0
  5. package/dist/docs/{components → product/components}/accordion.md +8 -8
  6. package/dist/docs/{components → product/components}/address-card.md +5 -5
  7. package/dist/docs/{components → product/components}/agent-logo.md +5 -5
  8. package/dist/docs/{components → product/components}/alert-dialog.md +11 -11
  9. package/dist/docs/{components → product/components}/alert.md +11 -11
  10. package/dist/docs/{components → product/components}/amount-input.md +13 -13
  11. package/dist/docs/{components → product/components}/amount.md +8 -8
  12. package/dist/docs/{components → product/components}/app-shell.md +13 -13
  13. package/dist/docs/{components → product/components}/asset-chip.md +11 -11
  14. package/dist/docs/{components → product/components}/autocomplete.md +10 -9
  15. package/dist/docs/{components → product/components}/avatar.md +8 -8
  16. package/dist/docs/{components → product/components}/badge.md +9 -9
  17. package/dist/docs/{components → product/components}/badged-logo.md +6 -6
  18. package/dist/docs/{components → product/components}/banner.md +8 -8
  19. package/dist/docs/{components → product/components}/bar-chart.md +7 -7
  20. package/dist/docs/{components → product/components}/breadcrumbs.md +8 -8
  21. package/dist/docs/{components → product/components}/button-group.md +8 -8
  22. package/dist/docs/{components → product/components}/button.md +17 -17
  23. package/dist/docs/{components → product/components}/calendar.md +8 -8
  24. package/dist/docs/{components → product/components}/callout.md +5 -5
  25. package/dist/docs/{components → product/components}/checkbox-group.md +13 -13
  26. package/dist/docs/{components → product/components}/checkbox.md +12 -12
  27. package/dist/docs/{components → product/components}/choice-group.md +14 -14
  28. package/dist/docs/{components → product/components}/choicebox.md +9 -9
  29. package/dist/docs/{components → product/components}/code.md +5 -5
  30. package/dist/docs/{components → product/components}/combobox.md +9 -9
  31. package/dist/docs/{components → product/components}/container.md +7 -7
  32. package/dist/docs/{components → product/components}/copy-button.md +13 -13
  33. package/dist/docs/{components → product/components}/date-picker.md +11 -11
  34. package/dist/docs/{components → product/components}/dialog.md +17 -17
  35. package/dist/docs/{components → product/components}/drawer.md +11 -11
  36. package/dist/docs/{components → product/components}/empty.md +9 -9
  37. package/dist/docs/{components → product/components}/field.md +14 -14
  38. package/dist/docs/{components → product/components}/fieldset.md +6 -6
  39. package/dist/docs/{components → product/components}/frame.md +9 -9
  40. package/dist/docs/{components → product/components}/gauge.md +7 -7
  41. package/dist/docs/{components → product/components}/get-started-visual.md +4 -4
  42. package/dist/docs/{components → product/components}/grid.md +7 -7
  43. package/dist/docs/{components → product/components}/hero-visual.md +4 -4
  44. package/dist/docs/{components → product/components}/hex.md +9 -9
  45. package/dist/docs/{components → product/components}/icon-tile.md +8 -8
  46. package/dist/docs/{components → product/components}/identicon.md +7 -7
  47. package/dist/docs/{components → product/components}/inline.md +7 -7
  48. package/dist/docs/{components → product/components}/inset.md +8 -8
  49. package/dist/docs/{components → product/components}/kbd.md +8 -8
  50. package/dist/docs/{components → product/components}/list-group.md +24 -24
  51. package/dist/docs/{components → product/components}/loading-dots.md +8 -8
  52. package/dist/docs/{components → product/components}/menu.md +14 -14
  53. package/dist/docs/{components → product/components}/native-select.md +7 -7
  54. package/dist/docs/{components → product/components}/network-logo.md +7 -7
  55. package/dist/docs/{components → product/components}/number-field.md +8 -8
  56. package/dist/docs/{components → product/components}/otp-field.md +9 -9
  57. package/dist/docs/{components → product/components}/pagination.md +8 -8
  58. package/dist/docs/{components → product/components}/popover.md +11 -11
  59. package/dist/docs/{components → product/components}/progress.md +10 -10
  60. package/dist/docs/{components → product/components}/qr.md +8 -8
  61. package/dist/docs/{components → product/components}/radio-group.md +10 -10
  62. package/dist/docs/{components → product/components}/secret-value.md +8 -8
  63. package/dist/docs/{components → product/components}/select.md +13 -13
  64. package/dist/docs/{components → product/components}/separator.md +7 -7
  65. package/dist/docs/{components → product/components}/sidebar-menu.md +11 -11
  66. package/dist/docs/{components → product/components}/skeleton.md +9 -9
  67. package/dist/docs/{components → product/components}/slider.md +8 -8
  68. package/dist/docs/{components → product/components}/snippet.md +10 -10
  69. package/dist/docs/{components → product/components}/spinner.md +12 -12
  70. package/dist/docs/{components → product/components}/split-bar.md +5 -5
  71. package/dist/docs/{components → product/components}/split-button.md +11 -11
  72. package/dist/docs/{components → product/components}/stack.md +8 -8
  73. package/dist/docs/{components → product/components}/status-chip.md +7 -7
  74. package/dist/docs/{components → product/components}/status-indicator.md +6 -6
  75. package/dist/docs/{components → product/components}/status-row.md +7 -7
  76. package/dist/docs/{components → product/components}/stepper.md +9 -9
  77. package/dist/docs/{components → product/components}/success-hero.md +5 -5
  78. package/dist/docs/{components → product/components}/surface.md +11 -11
  79. package/dist/docs/{components → product/components}/switch.md +11 -11
  80. package/dist/docs/{components → product/components}/table.md +16 -16
  81. package/dist/docs/{components → product/components}/tabs.md +11 -11
  82. package/dist/docs/{components → product/components}/tempo-logo.md +4 -4
  83. package/dist/docs/{components → product/components}/text-input.md +14 -14
  84. package/dist/docs/{components → product/components}/textarea.md +7 -7
  85. package/dist/docs/{components → product/components}/toast.md +11 -11
  86. package/dist/docs/{components → product/components}/token-logo.md +16 -16
  87. package/dist/docs/{components → product/components}/token.md +10 -10
  88. package/dist/docs/{components → product/components}/tooltip.md +11 -11
  89. package/dist/docs/{components → product/components}/verification-code.md +4 -4
  90. package/dist/docs/{components → product/components}/visual.md +5 -5
  91. package/dist/docs/product/components.md +203 -0
  92. package/dist/docs/{foundations → product/foundations}/accessibility.md +16 -16
  93. package/dist/docs/{foundations → product/foundations}/agents.md +17 -17
  94. package/dist/docs/{foundations → product/foundations}/color.md +7 -7
  95. package/dist/docs/{foundations → product/foundations}/content/tone.md +7 -7
  96. package/dist/docs/{foundations → product/foundations}/content/voice.md +2 -2
  97. package/dist/docs/{foundations → product/foundations}/content/writing-style.md +8 -8
  98. package/dist/docs/{foundations → product/foundations}/iconography.md +11 -11
  99. package/dist/docs/{foundations → product/foundations}/intent.md +28 -28
  100. package/dist/docs/{foundations → product/foundations}/layout.md +22 -22
  101. package/dist/docs/product/foundations/linter.md +496 -0
  102. package/dist/docs/{foundations → product/foundations}/motion.md +7 -7
  103. package/dist/docs/{foundations → product/foundations}/radius-and-padding.md +3 -3
  104. package/dist/docs/{foundations → product/foundations}/typography.md +4 -4
  105. package/dist/docs/{introduction → product/introduction}/faq.md +22 -21
  106. package/dist/docs/{introduction → product/introduction}/getting-started.md +4 -4
  107. package/dist/docs/{patterns → product/patterns}/blockchain-values.md +20 -20
  108. package/dist/docs/{patterns → product/patterns}/dashboards.md +28 -28
  109. package/dist/docs/{patterns → product/patterns}/destructive-actions.md +16 -16
  110. package/dist/docs/{patterns → product/patterns}/empty-states.md +14 -14
  111. package/dist/docs/{patterns → product/patterns}/errors-and-validation.md +23 -23
  112. package/dist/docs/{patterns → product/patterns}/feedback-and-status.md +31 -31
  113. package/dist/docs/{patterns → product/patterns}/forms.md +24 -24
  114. package/dist/docs/{patterns → product/patterns}/loading.md +19 -19
  115. package/dist/docs/{patterns → product/patterns}/navigation.md +23 -23
  116. package/dist/docs/{patterns → product/patterns}/payments.md +20 -20
  117. package/dist/docs/{patterns → product/patterns}/responsive-layout.md +23 -23
  118. package/dist/docs/{patterns → product/patterns}/tables-and-lists.md +19 -19
  119. package/dist/docs/{products → product/products}/tempo-console.md +12 -12
  120. package/dist/docs/{products → product/products}/tempo-performance.md +11 -11
  121. package/dist/docs/{products → product/products}/tempo-wallet.md +12 -12
  122. package/dist/marketing/index.d.ts +4 -0
  123. package/dist/marketing/index.d.ts.map +1 -0
  124. package/dist/marketing/index.js +4 -0
  125. package/dist/marketing/index.js.map +1 -0
  126. package/dist/marketing/index.js.zyzz.json +1 -0
  127. package/dist/marketing/vars.d.ts +907 -0
  128. package/dist/marketing/vars.d.ts.map +1 -0
  129. package/dist/marketing/vars.js +15 -0
  130. package/dist/marketing/vars.js.map +1 -0
  131. package/dist/marketing/vars.js.zyzz.json +1 -0
  132. package/dist/marketing/zyzz.config.d.ts +4512 -0
  133. package/dist/marketing/zyzz.config.d.ts.map +1 -0
  134. package/dist/marketing/zyzz.config.js +63 -0
  135. package/dist/marketing/zyzz.config.js.map +1 -0
  136. package/dist/marketing/zyzz.config.js.zyzz.json +1 -0
  137. package/dist/oxlint/index.d.ts +12 -1
  138. package/dist/oxlint/index.d.ts.map +1 -1
  139. package/dist/oxlint/index.js +39 -1
  140. package/dist/oxlint/index.js.map +1 -1
  141. package/dist/oxlint/internal/Docs.d.ts +9 -0
  142. package/dist/oxlint/internal/Docs.d.ts.map +1 -0
  143. package/dist/oxlint/internal/Docs.js +15 -0
  144. package/dist/oxlint/internal/Docs.js.map +1 -0
  145. package/dist/oxlint/internal/Imports.d.ts +1 -1
  146. package/dist/oxlint/internal/Imports.d.ts.map +1 -1
  147. package/dist/oxlint/internal/Imports.js +2 -0
  148. package/dist/oxlint/internal/Imports.js.map +1 -1
  149. package/dist/oxlint/internal/Styles.d.ts +40 -0
  150. package/dist/oxlint/internal/Styles.d.ts.map +1 -0
  151. package/dist/oxlint/internal/Styles.js +194 -0
  152. package/dist/oxlint/internal/Styles.js.map +1 -0
  153. package/dist/oxlint/internal/Tokens.d.ts +16 -0
  154. package/dist/oxlint/internal/Tokens.d.ts.map +1 -0
  155. package/dist/oxlint/internal/Tokens.js +39 -0
  156. package/dist/oxlint/internal/Tokens.js.map +1 -0
  157. package/dist/oxlint/rules/NoCrossSurface.d.ts +2 -2
  158. package/dist/oxlint/rules/NoCrossSurface.js +3 -3
  159. package/dist/oxlint/rules/NoCrossSurface.js.map +1 -1
  160. package/dist/oxlint/rules/NoCustomValues.d.ts +11 -0
  161. package/dist/oxlint/rules/NoCustomValues.d.ts.map +1 -0
  162. package/dist/oxlint/rules/NoCustomValues.js +150 -0
  163. package/dist/oxlint/rules/NoCustomValues.js.map +1 -0
  164. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts +11 -0
  165. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts.map +1 -0
  166. package/dist/oxlint/rules/NoSingleKeyShortcuts.js +158 -0
  167. package/dist/oxlint/rules/NoSingleKeyShortcuts.js.map +1 -0
  168. package/dist/oxlint/rules/PreferComponent.d.ts +3 -2
  169. package/dist/oxlint/rules/PreferComponent.d.ts.map +1 -1
  170. package/dist/oxlint/rules/PreferComponent.js +11 -4
  171. package/dist/oxlint/rules/PreferComponent.js.map +1 -1
  172. package/dist/oxlint/rules/PreferLayout.d.ts +9 -0
  173. package/dist/oxlint/rules/PreferLayout.d.ts.map +1 -0
  174. package/dist/oxlint/rules/PreferLayout.js +90 -0
  175. package/dist/oxlint/rules/PreferLayout.js.map +1 -0
  176. package/dist/oxlint/rules/PreferProgress.d.ts +9 -0
  177. package/dist/oxlint/rules/PreferProgress.d.ts.map +1 -0
  178. package/dist/oxlint/rules/PreferProgress.js +43 -0
  179. package/dist/oxlint/rules/PreferProgress.js.map +1 -0
  180. package/dist/oxlint/rules/PreferSurface.d.ts +9 -0
  181. package/dist/oxlint/rules/PreferSurface.d.ts.map +1 -0
  182. package/dist/oxlint/rules/PreferSurface.js +55 -0
  183. package/dist/oxlint/rules/PreferSurface.js.map +1 -0
  184. package/dist/oxlint/rules/RequireAccessibleName.d.ts.map +1 -1
  185. package/dist/oxlint/rules/RequireAccessibleName.js +3 -1
  186. package/dist/oxlint/rules/RequireAccessibleName.js.map +1 -1
  187. package/dist/oxlint/rules/RequireScrollRegion.d.ts +11 -0
  188. package/dist/oxlint/rules/RequireScrollRegion.d.ts.map +1 -0
  189. package/dist/oxlint/rules/RequireScrollRegion.js +71 -0
  190. package/dist/oxlint/rules/RequireScrollRegion.js.map +1 -0
  191. package/dist/web/icons/index.js.zyzz.json +1 -0
  192. package/package.json +6 -1
  193. package/src/marketing/README.md +21 -0
  194. package/src/marketing/index.ts +3 -0
  195. package/src/marketing/vars.ts +751 -0
  196. package/src/marketing/zyzz.config.ts +376 -0
  197. package/src/oxlint/index.ts +40 -1
  198. package/src/oxlint/internal/Docs.ts +18 -0
  199. package/src/oxlint/internal/Imports.ts +2 -1
  200. package/src/oxlint/internal/Styles.ts +240 -0
  201. package/src/oxlint/internal/Tokens.ts +43 -0
  202. package/src/oxlint/rules/NoCrossSurface.ts +3 -3
  203. package/src/oxlint/rules/NoCustomValues.ts +170 -0
  204. package/src/oxlint/rules/NoSingleKeyShortcuts.ts +190 -0
  205. package/src/oxlint/rules/PreferComponent.ts +11 -4
  206. package/src/oxlint/rules/PreferLayout.ts +96 -0
  207. package/src/oxlint/rules/PreferProgress.ts +49 -0
  208. package/src/oxlint/rules/PreferSurface.ts +70 -0
  209. package/src/oxlint/rules/RequireAccessibleName.ts +3 -1
  210. package/src/oxlint/rules/RequireScrollRegion.ts +92 -0
  211. package/dist/docs/components.md +0 -203
  212. package/dist/docs/foundations/linter.md +0 -296
@@ -0,0 +1,751 @@
1
+ import { Vars } from 'zyzz'
2
+
3
+ /**
4
+ * The Marketing variable set. It starts as a copy of the Web variables, so marketing pages
5
+ * share the TDS 1.0 Core primitives and the Platform token names, and diverges as the
6
+ * Marketing designs define their own values. Marketing never imports the Web surface, so a
7
+ * change here does not reach product interfaces. Extend it to add page tokens.
8
+ *
9
+ * @example
10
+ * export const { style, vars } = Config.create({
11
+ * id: 'site',
12
+ * vars: Vars.extend(variables, { spacing: { section: '7.5rem' } }, { id: 'site/vars' }),
13
+ * })
14
+ */
15
+ export const variables = Vars.define(
16
+ {
17
+ aspect: {
18
+ video: '16 / 9',
19
+ },
20
+ blur: {
21
+ '4': '4px',
22
+ '8': '8px',
23
+ '12': '12px',
24
+ '16': '16px',
25
+ '24': '24px',
26
+ '40': '40px',
27
+ '64': '64px',
28
+ },
29
+ breakpoint: {
30
+ '640': '40rem',
31
+ '768': '48rem',
32
+ '1024': '64rem',
33
+ '1280': '80rem',
34
+ '1536': '96rem',
35
+ },
36
+ // TDS 1.0 Core `Tempo` colors. Each accent `background` pairs Core's light-mode and dark-mode
37
+ // steps, and its `foreground` pairs Core's text step with the dark-mode step, so accent text
38
+ // keeps 4.5:1 on the page in both schemes. Solid neutral steps name a percentage of black, and `shade` and `tint` steps are black
39
+ // and white at that opacity. Core no longer publishes `shade`, `tint`, or the accent alphas, but
40
+ // Platform tokens still alias them, so they keep the values Platform resolves.
41
+ color: {
42
+ accent: {
43
+ // `regular` is the light accent at 8% (100) and the dark accent at 16% (200). `strong`
44
+ // doubles both.
45
+ alpha: {
46
+ regular: {
47
+ blue: { '100': 'rgb(68 113 237 / 0.08)', '200': 'rgb(116 152 251 / 0.16)' },
48
+ green: { '100': 'rgb(19 169 99 / 0.08)', '200': 'rgb(89 229 164 / 0.16)' },
49
+ orange: { '100': 'rgb(224 111 18 / 0.08)', '200': 'rgb(250 142 54 / 0.16)' },
50
+ red: { '100': 'rgb(235 52 23 / 0.08)', '200': 'rgb(245 92 69 / 0.16)' },
51
+ },
52
+ strong: {
53
+ blue: { '100': 'rgb(68 113 237 / 0.16)', '200': 'rgb(116 152 251 / 0.32)' },
54
+ green: { '100': 'rgb(19 169 99 / 0.16)', '200': 'rgb(89 229 164 / 0.32)' },
55
+ orange: { '100': 'rgb(224 111 18 / 0.16)', '200': 'rgb(250 142 54 / 0.32)' },
56
+ red: { '100': 'rgb(235 52 23 / 0.16)', '200': 'rgb(245 92 69 / 0.32)' },
57
+ },
58
+ },
59
+ blue: {
60
+ background: { dark: '#7498fb', light: '#4471ed' },
61
+ foreground: { dark: '#7498fb', light: '#3059d3' },
62
+ },
63
+ cyan: {
64
+ background: { dark: '#48cce6', light: '#00aacb' },
65
+ foreground: { dark: '#48cce6', light: '#056e85' },
66
+ },
67
+ green: {
68
+ background: { dark: '#59e5a4', light: '#13a963' },
69
+ foreground: { dark: '#59e5a4', light: '#007441' },
70
+ },
71
+ magenta: {
72
+ background: { dark: '#e54088', light: '#cc055b' },
73
+ foreground: { dark: '#e54088', light: '#ba0352' },
74
+ },
75
+ olive: {
76
+ background: { dark: '#c4dc65', light: '#95b226' },
77
+ foreground: { dark: '#c4dc65', light: '#596d01' },
78
+ },
79
+ orange: {
80
+ background: { dark: '#fa8e36', light: '#e06f12' },
81
+ foreground: { dark: '#fa8e36', light: '#a14d04' },
82
+ },
83
+ purple: {
84
+ background: { dark: '#cf79ef', light: '#ba59dd' },
85
+ foreground: { dark: '#cf79ef', light: '#9835ba' },
86
+ },
87
+ red: {
88
+ background: { dark: '#f55c45', light: '#eb3417' },
89
+ foreground: { dark: '#f55c45', light: '#bf1d00' },
90
+ },
91
+ violet: {
92
+ background: { dark: '#9877f1', light: '#7e59e4' },
93
+ foreground: { dark: '#9877f1', light: '#6f47d1' },
94
+ },
95
+ },
96
+ neutral: {
97
+ '000': '#fff',
98
+ '003': '#f7f7f7',
99
+ '004': '#f5f5f5',
100
+ '006': '#f0f0f0',
101
+ '008': '#ebebeb',
102
+ '012': '#e0e0e0',
103
+ '016': '#d6d6d6',
104
+ '020': '#ccc',
105
+ '024': '#c2c2c2',
106
+ '028': '#b8b8b8',
107
+ '032': '#adadad',
108
+ '036': '#a3a3a3',
109
+ '040': '#999',
110
+ '044': '#8f8f8f',
111
+ '048': '#858585',
112
+ '052': '#7a7a7a',
113
+ '056': '#707070',
114
+ '060': '#666',
115
+ '064': '#5c5c5c',
116
+ '068': '#525252',
117
+ '072': '#474747',
118
+ '076': '#3d3d3d',
119
+ '080': '#333',
120
+ '084': '#292929',
121
+ '088': '#1f1f1f',
122
+ '092': '#141414',
123
+ '096': '#0a0a0a',
124
+ '100': '#000',
125
+ shade: {
126
+ '000': '#00000000',
127
+ '003': '#00000008',
128
+ '004': '#0000000a',
129
+ '006': '#0000000f',
130
+ '008': '#00000014',
131
+ '012': '#0000001f',
132
+ '016': '#00000029',
133
+ '020': '#00000033',
134
+ '032': '#00000052',
135
+ '040': '#00000066',
136
+ '056': '#0000008f',
137
+ '060': '#00000099',
138
+ '080': '#000000cc',
139
+ },
140
+ tint: {
141
+ '000': '#ffffff00',
142
+ '004': '#ffffff0a',
143
+ '006': '#ffffff0f',
144
+ '008': '#ffffff14',
145
+ '012': '#ffffff1f',
146
+ '016': '#ffffff29',
147
+ '020': '#ffffff33',
148
+ '024': '#ffffff3d',
149
+ '040': '#ffffff66',
150
+ '048': '#ffffff7a',
151
+ '052': '#ffffff85',
152
+ '056': '#ffffff8f',
153
+ '064': '#ffffffa3',
154
+ '080': '#ffffffcc',
155
+ },
156
+ },
157
+ },
158
+ container: {
159
+ '256': '16rem',
160
+ '288': '18rem',
161
+ '320': '20rem',
162
+ '384': '24rem',
163
+ '448': '28rem',
164
+ '512': '32rem',
165
+ '576': '36rem',
166
+ '672': '42rem',
167
+ '768': '48rem',
168
+ '896': '56rem',
169
+ '1024': '64rem',
170
+ '1152': '72rem',
171
+ '1280': '80rem',
172
+ },
173
+ dropShadow: {
174
+ '1': '0 1px 1px rgb(0 0 0 / 0.05)',
175
+ '2': '0 1px 2px rgb(0 0 0 / 0.15)',
176
+ '3': '0 3px 3px rgb(0 0 0 / 0.12)',
177
+ '4': '0 4px 4px rgb(0 0 0 / 0.15)',
178
+ '7': '0 9px 7px rgb(0 0 0 / 0.1)',
179
+ '25': '0 25px 25px rgb(0 0 0 / 0.15)',
180
+ },
181
+ // `snappy` is a quint ease-out for state changes, `overshoot` adds physical feedback to presses
182
+ // and thumbs, and `spring` moves surfaces and indicators.
183
+ ease: {
184
+ in: 'cubic-bezier(0.4, 0, 1, 1)',
185
+ 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
186
+ out: 'cubic-bezier(0, 0, 0.2, 1)',
187
+ overshoot: 'cubic-bezier(0.34, 1.36, 0.64, 1)',
188
+ snappy: 'cubic-bezier(0.23, 1, 0.32, 1)',
189
+ spring: 'cubic-bezier(0.32, 0.72, 0, 1)',
190
+ },
191
+ // The Platform text styles set copy in Inter, titles, display copy, and values in Pilat, and code
192
+ // in JetBrains Mono. The Web contracts ship all three. The `display` stack keeps HB Set, which
193
+ // falls back to Pilat, for callers that still name it.
194
+ fontFamily: {
195
+ body: 'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',
196
+ display:
197
+ '"HB Set v0.96", Pilat, Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif',
198
+ heading:
199
+ 'Pilat, Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif',
200
+ mono: '"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',
201
+ },
202
+ fontSize: {
203
+ '12': '0.75rem',
204
+ '14': '0.875rem',
205
+ '16': '1rem',
206
+ '18': '1.125rem',
207
+ '20': '1.25rem',
208
+ '24': '1.5rem',
209
+ '30': '1.875rem',
210
+ '36': '2.25rem',
211
+ '48': '3rem',
212
+ '60': '3.75rem',
213
+ '72': '4.5rem',
214
+ '96': '6rem',
215
+ '128': '8rem',
216
+ },
217
+ insetShadow: {
218
+ '0': 'inset 0 1px rgb(0 0 0 / 0.05)',
219
+ '1': 'inset 0 1px 1px rgb(0 0 0 / 0.05)',
220
+ '4': 'inset 0 2px 4px rgb(0 0 0 / 0.05)',
221
+ },
222
+ // `disabled` dims an unavailable control, and `hover` dims a filled control under the pointer.
223
+ opacity: {
224
+ disabled: 0.32,
225
+ hover: 0.86,
226
+ },
227
+ outlineOffset: {
228
+ '-2': '-2px',
229
+ '0': '0px',
230
+ '2': '2px',
231
+ },
232
+ outlineWidth: {
233
+ '1': '1px',
234
+ '2': '2px',
235
+ },
236
+ perspective: {
237
+ '100': '100px',
238
+ '300': '300px',
239
+ '500': '500px',
240
+ '800': '800px',
241
+ '1200': '1200px',
242
+ },
243
+ // `enter` is the start scale of a popup transition, and `press` shrinks a pressed control.
244
+ scale: {
245
+ enter: 0.96,
246
+ press: 0.98,
247
+ },
248
+ // The Platform `Shadow` effect styles.
249
+ shadow: {
250
+ large: '0 24px 64px #00000014, 0 8px 48px #00000014, 0 2px 8px #0000000a',
251
+ regular: '0 8px 48px #0000000a, 0 4px 16px #0000000a, 0 2px 8px #0000000a',
252
+ small: '0 4px 12px #0000000a, 0 2px 8px #0000000a, 0 0 2px #0000000a',
253
+ },
254
+ // TDS 1.0 Core `Values`, keyed by px at the default 16px root. Values stay in rem, so the scale
255
+ // follows the root size, except the sub-2px hairlines. Negative keys pull an element into its
256
+ // container's padding.
257
+ spacing: {
258
+ '-24': '-1.5rem',
259
+ '-20': '-1.25rem',
260
+ '-16': '-1rem',
261
+ '-12': '-0.75rem',
262
+ '-10': '-0.625rem',
263
+ '-8': '-0.5rem',
264
+ '-6': '-0.375rem',
265
+ '-4': '-0.25rem',
266
+ '0': '0rem',
267
+ '0-5': '0.5px',
268
+ '1': '1px',
269
+ '1-5': '1.5px',
270
+ '2': '0.125rem',
271
+ '3': '0.1875rem',
272
+ '4': '0.25rem',
273
+ '6': '0.375rem',
274
+ '8': '0.5rem',
275
+ '10': '0.625rem',
276
+ '12': '0.75rem',
277
+ '16': '1rem',
278
+ '20': '1.25rem',
279
+ '24': '1.5rem',
280
+ '28': '1.75rem',
281
+ '32': '2rem',
282
+ '36': '2.25rem',
283
+ '40': '2.5rem',
284
+ '44': '2.75rem',
285
+ '48': '3rem',
286
+ '52': '3.25rem',
287
+ '56': '3.5rem',
288
+ '60': '3.75rem',
289
+ '64': '4rem',
290
+ '72': '4.5rem',
291
+ '80': '5rem',
292
+ '100': '6.25rem',
293
+ '120': '7.5rem',
294
+ '140': '8.75rem',
295
+ '160': '10rem',
296
+ '180': '11.25rem',
297
+ '200': '12.5rem',
298
+ '240': '15rem',
299
+ '280': '17.5rem',
300
+ '320': '20rem',
301
+ '360': '22.5rem',
302
+ '999': '62.4375rem',
303
+ },
304
+ textShadow: {
305
+ '0': '0px 1px 0px rgb(0 0 0 / 0.15)',
306
+ '1': '0px 1px 1px rgb(0 0 0 / 0.2)',
307
+ '2': '0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075)',
308
+ '4': '0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1)',
309
+ '8': '0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1)',
310
+ },
311
+ // Keys are durations in ms.
312
+ transitionDuration: {
313
+ '0': '0ms',
314
+ '100': '100ms',
315
+ '120': '120ms',
316
+ '140': '140ms',
317
+ '150': '150ms',
318
+ '160': '160ms',
319
+ '180': '180ms',
320
+ '200': '200ms',
321
+ '220': '220ms',
322
+ '240': '240ms',
323
+ '280': '280ms',
324
+ '320': '320ms',
325
+ },
326
+ // Layers from the app shell overlay up to toasts.
327
+ zIndex: {
328
+ modal: 60,
329
+ overlay: 40,
330
+ popover: 50,
331
+ toast: 1000,
332
+ },
333
+ },
334
+ // TPDS 1.0 Platform `Base`, `Attributes`, and text styles, and the pressed action colors of
335
+ // `Working / Platform / Semantic` that the Platform Button paints. Base tokens that
336
+ // alias other Base tokens, such as `component.button.secondary.fill`, point at the same
337
+ // primitives instead.
338
+ (vars) => ({
339
+ borderWidth: {
340
+ none: vars.spacing['0'],
341
+ regular: vars.spacing['1'],
342
+ thick: vars.spacing['2'],
343
+ thin: vars.spacing['0-5'],
344
+ },
345
+ color: {
346
+ action: {
347
+ danger: {
348
+ fill: {
349
+ hover: '#eb3417',
350
+ rest: '#eb3417',
351
+ },
352
+ label: { rest: vars.color.neutral['000'] },
353
+ },
354
+ focusRing: { dark: vars.color.neutral.tint['056'], light: vars.color.neutral.shade['056'] },
355
+ primary: {
356
+ fill: {
357
+ hover: { dark: vars.color.neutral.tint['080'], light: vars.color.neutral.shade['080'] },
358
+ pressed: {
359
+ dark: vars.color.neutral.tint['064'],
360
+ light: vars.color.neutral.shade['060'],
361
+ },
362
+ },
363
+ },
364
+ secondary: {
365
+ fill: {
366
+ hover: { dark: vars.color.neutral.tint['006'], light: vars.color.neutral.shade['006'] },
367
+ pressed: {
368
+ dark: vars.color.neutral.tint['024'],
369
+ light: vars.color.neutral.shade['016'],
370
+ },
371
+ },
372
+ },
373
+ tertiary: {
374
+ fill: {
375
+ hover: { dark: vars.color.neutral.tint['004'], light: vars.color.neutral.shade['004'] },
376
+ pressed: {
377
+ dark: vars.color.neutral.tint['006'],
378
+ light: vars.color.neutral.shade['006'],
379
+ },
380
+ },
381
+ },
382
+ },
383
+ // Dark mode lifts the page to 92% black, and the elevated and menu fills step lighter from
384
+ // it, at the Platform primitive solid steps 090 and 087, which TDS 1.0 Core has no step for.
385
+ background: {
386
+ elevated: { dark: '#1a1a1a', light: vars.color.neutral['000'] },
387
+ menu: { dark: '#222', light: vars.color.neutral['000'] },
388
+ primary: { dark: vars.color.neutral['092'], light: vars.color.neutral['004'] },
389
+ secondary: { dark: vars.color.neutral['092'], light: vars.color.neutral['000'] },
390
+ // The layouts fill the sidebar a step lighter than the page in light mode, and with the page
391
+ // in dark mode.
392
+ sidebar: { dark: vars.color.neutral['092'], light: '#fafafa' },
393
+ },
394
+ border: {
395
+ focus: { dark: vars.color.neutral.tint['052'], light: vars.color.neutral.shade['040'] },
396
+ negative: {
397
+ dark: vars.color.accent.alpha.strong.red['200'],
398
+ light: vars.color.accent.alpha.strong.red['100'],
399
+ },
400
+ positive: {
401
+ dark: vars.color.accent.alpha.strong.green['200'],
402
+ light: vars.color.accent.alpha.strong.green['100'],
403
+ },
404
+ warning: {
405
+ dark: vars.color.accent.alpha.strong.orange['200'],
406
+ light: vars.color.accent.alpha.strong.orange['100'],
407
+ },
408
+ },
409
+ component: {
410
+ button: {
411
+ primary: {
412
+ border: {
413
+ dark: vars.color.neutral.tint['000'],
414
+ light: vars.color.neutral.shade['000'],
415
+ },
416
+ fill: { dark: vars.color.neutral['000'], light: vars.color.neutral['100'] },
417
+ },
418
+ secondary: {
419
+ border: {
420
+ dark: vars.color.neutral.tint['016'],
421
+ light: vars.color.neutral.shade['008'],
422
+ },
423
+ fill: { dark: vars.color.neutral.tint['012'], light: vars.color.neutral.shade['004'] },
424
+ },
425
+ tertiary: {
426
+ border: {
427
+ dark: vars.color.neutral.tint['000'],
428
+ light: vars.color.neutral.shade['000'],
429
+ },
430
+ fill: { dark: vars.color.neutral.tint['000'], light: vars.color.neutral.shade['000'] },
431
+ },
432
+ },
433
+ input: {
434
+ overlay: {
435
+ border: {
436
+ dark: vars.color.neutral.tint['000'],
437
+ light: vars.color.neutral.shade['000'],
438
+ },
439
+ fill: { dark: vars.color.neutral.tint['024'], light: vars.color.neutral.shade['020'] },
440
+ },
441
+ primary: {
442
+ border: {
443
+ dark: vars.color.neutral.tint['000'],
444
+ light: vars.color.neutral.shade['000'],
445
+ },
446
+ fill: { dark: vars.color.neutral.tint['012'], light: vars.color.neutral.shade['004'] },
447
+ },
448
+ secondary: {
449
+ border: {
450
+ dark: vars.color.neutral.tint['024'],
451
+ light: vars.color.neutral.shade['016'],
452
+ },
453
+ fill: { dark: vars.color.neutral.tint['000'], light: vars.color.neutral.shade['000'] },
454
+ },
455
+ },
456
+ pullTab: { dark: vars.color.neutral.tint['024'], light: vars.color.neutral.shade['012'] },
457
+ },
458
+ container: {
459
+ accent: vars.color.accent.alpha.regular.blue['100'],
460
+ // The quiet fill of inputs and other controls.
461
+ control: { dark: vars.color.neutral.tint['004'], light: vars.color.neutral.shade['004'] },
462
+ negative: {
463
+ dark: vars.color.accent.alpha.regular.red['200'],
464
+ light: vars.color.accent.alpha.regular.red['100'],
465
+ },
466
+ positive: {
467
+ dark: vars.color.accent.alpha.regular.green['200'],
468
+ light: vars.color.accent.alpha.regular.green['100'],
469
+ },
470
+ // Dark mode fills the regular container at 8% white, dimmer than Figma's 12%, so badges and
471
+ // other soft fills recede on the dark page.
472
+ regular: { dark: vars.color.neutral.tint['008'], light: vars.color.neutral.shade['004'] },
473
+ // The fill of a selected option, such as a picker row.
474
+ selected: { dark: vars.color.neutral.tint['012'], light: vars.color.neutral['000'] },
475
+ // An opaque fill at the Platform primitive solid steps 079 and 010.
476
+ solid: { dark: '#353535', light: '#e6e6e6' },
477
+ strong: { dark: vars.color.neutral.tint['016'], light: vars.color.neutral.shade['008'] },
478
+ special: 'rgb(126 89 228 / 0.08)',
479
+ subtle: { dark: vars.color.neutral.tint['008'], light: vars.color.neutral.shade['003'] },
480
+ warning: {
481
+ dark: vars.color.accent.alpha.regular.orange['200'],
482
+ light: vars.color.accent.alpha.regular.orange['100'],
483
+ },
484
+ },
485
+ content: {
486
+ accent: '#4471ed',
487
+ negative: vars.color.accent.red.background,
488
+ positive: vars.color.accent.green.background,
489
+ primary: { dark: vars.color.neutral['000'], light: vars.color.neutral['100'] },
490
+ secondary: { dark: vars.color.neutral.tint['064'], light: vars.color.neutral.shade['056'] },
491
+ special: '#7e59e4',
492
+ subtle: { dark: vars.color.neutral.tint['020'], light: vars.color.neutral.shade['020'] },
493
+ tertiary: { dark: vars.color.neutral.tint['052'], light: vars.color.neutral.shade['040'] },
494
+ warning: vars.color.accent.orange.background,
495
+ },
496
+ inverse: {
497
+ background: {
498
+ primary: { dark: vars.color.neutral['004'], light: vars.color.neutral['100'] },
499
+ secondary: { dark: vars.color.neutral['000'], light: vars.color.neutral['092'] },
500
+ },
501
+ container: {
502
+ regular: { dark: vars.color.neutral.shade['004'], light: vars.color.neutral.tint['012'] },
503
+ },
504
+ content: {
505
+ primary: { dark: vars.color.neutral['100'], light: vars.color.neutral['000'] },
506
+ },
507
+ },
508
+ line: {
509
+ // The border of a card, at 5% white in dark mode.
510
+ card: { dark: '#ffffff0d', light: vars.color.neutral.shade['008'] },
511
+ primary: { dark: vars.color.neutral.tint['024'], light: vars.color.neutral.shade['016'] },
512
+ // Dark mode draws the secondary line at 8% white, dimmer than Figma's 16%, so the borders
513
+ // and dividers recede on the dark fills.
514
+ secondary: { dark: vars.color.neutral.tint['008'], light: vars.color.neutral.shade['008'] },
515
+ tertiary: { dark: vars.color.neutral.tint['008'], light: vars.color.neutral.shade['004'] },
516
+ },
517
+ material: {
518
+ regular: { dark: vars.color.neutral.tint['048'], light: vars.color.neutral.shade['040'] },
519
+ // The grain over a material, at 7%.
520
+ texture: { dark: '#ffffff12', light: '#00000012' },
521
+ thick: { dark: vars.color.neutral.tint['064'], light: vars.color.neutral.shade['060'] },
522
+ thin: { dark: vars.color.neutral.tint['024'], light: vars.color.neutral.shade['020'] },
523
+ ultrathick: {
524
+ dark: vars.color.neutral.tint['080'],
525
+ light: vars.color.neutral.shade['080'],
526
+ },
527
+ ultrathin: { dark: vars.color.neutral.tint['016'], light: vars.color.neutral.shade['008'] },
528
+ },
529
+ // The fills and text of controls over an image or video, the same in both schemes.
530
+ overlay: {
531
+ action: {
532
+ secondary: { fill: { hover: '#70707047' } },
533
+ tertiary: { fill: { hover: vars.color.neutral.tint['012'] } },
534
+ },
535
+ container: { regular: '#70707052' },
536
+ content: {
537
+ primary: vars.color.neutral['000'],
538
+ secondary: vars.color.neutral.tint['064'],
539
+ tertiary: vars.color.neutral.tint['052'],
540
+ },
541
+ },
542
+ scrim: {
543
+ regular: vars.color.neutral.shade['016'],
544
+ strong: vars.color.neutral.shade['032'],
545
+ },
546
+ shadow: {
547
+ // The shadow under elevated fills, such as menus and modals.
548
+ elevated: { dark: '#0000003d', light: vars.color.neutral.shade['012'] },
549
+ primary: { dark: vars.color.neutral.shade['032'], light: vars.color.neutral.shade['008'] },
550
+ secondary: {
551
+ dark: vars.color.neutral.shade['016'],
552
+ light: vars.color.neutral.shade['004'],
553
+ },
554
+ },
555
+ },
556
+ // The Platform corner radii at their Figma values: 4, 8, 12, 16, 24, 32, 40, and 64px. The
557
+ // designs smooth each corner fully, which stretches its curve past the radius. A squircle at 1.84
558
+ // times the radius traces that curve, so the global `corner-shape` rule raises
559
+ // `--tds-corner-scale` where browsers draw squircles, and other browsers keep the round radius.
560
+ // `full` stays round, so circles and pills keep their shape.
561
+ radius: {
562
+ '2xl': 'calc(4rem * var(--tds-corner-scale, 1))',
563
+ '2xs': 'calc(0.5rem * var(--tds-corner-scale, 1))',
564
+ '3xs': 'calc(0.25rem * var(--tds-corner-scale, 1))',
565
+ full: vars.spacing['999'],
566
+ lg: 'calc(2rem * var(--tds-corner-scale, 1))',
567
+ md: 'calc(1.5rem * var(--tds-corner-scale, 1))',
568
+ none: vars.spacing['0'],
569
+ sm: 'calc(1rem * var(--tds-corner-scale, 1))',
570
+ xl: 'calc(2.5rem * var(--tds-corner-scale, 1))',
571
+ xs: 'calc(0.75rem * var(--tds-corner-scale, 1))',
572
+ },
573
+ // Section and page steps use the Mobile mode of the responsive Platform attributes.
574
+ spacing: {
575
+ none: vars.spacing['0'],
576
+ page: { gutter: vars.spacing['12'], margin: vars.spacing['24'] },
577
+ section: {
578
+ lg: vars.spacing['120'],
579
+ md: vars.spacing['80'],
580
+ none: vars.spacing['0'],
581
+ sm: vars.spacing['40'],
582
+ xl: vars.spacing['180'],
583
+ xs: vars.spacing['24'],
584
+ },
585
+ },
586
+ // Figma's percentage tracking is converted to px. Body tracking instead follows Inter's dynamic
587
+ // metrics, -0.0223 + 0.185 * e^(-0.1745 * size) em, rounded to 0.01px. The `utility` styles are
588
+ // uppercase in Figma, which a component applies with `textTransform`.
589
+ typography: {
590
+ body: {
591
+ b1: {
592
+ fontFamily: vars.fontFamily.body,
593
+ fontSize: '16px',
594
+ fontWeight: 400,
595
+ letterSpacing: '-.18px',
596
+ lineHeight: '22px',
597
+ },
598
+ b1Strong: {
599
+ fontFamily: vars.fontFamily.body,
600
+ fontSize: '16px',
601
+ fontWeight: 500,
602
+ letterSpacing: '-.18px',
603
+ lineHeight: '22px',
604
+ },
605
+ b2: {
606
+ fontFamily: vars.fontFamily.body,
607
+ fontSize: '14px',
608
+ fontWeight: 400,
609
+ letterSpacing: '-.09px',
610
+ lineHeight: '20px',
611
+ },
612
+ b2Strong: {
613
+ fontFamily: vars.fontFamily.body,
614
+ fontSize: '14px',
615
+ fontWeight: 500,
616
+ letterSpacing: '-.09px',
617
+ lineHeight: '20px',
618
+ },
619
+ b3: {
620
+ fontFamily: vars.fontFamily.body,
621
+ fontSize: '12px',
622
+ fontWeight: 400,
623
+ letterSpacing: '.01px',
624
+ lineHeight: '16px',
625
+ },
626
+ b3Strong: {
627
+ fontFamily: vars.fontFamily.body,
628
+ fontSize: '12px',
629
+ fontWeight: 500,
630
+ letterSpacing: '.01px',
631
+ lineHeight: '16px',
632
+ },
633
+ },
634
+ // Pilat Light is weight 300, and Pilat Regular is 400.
635
+ display: {
636
+ d1: {
637
+ fontFamily: vars.fontFamily.heading,
638
+ fontSize: '44px',
639
+ fontWeight: 300,
640
+ letterSpacing: '-1.76px',
641
+ lineHeight: '41.8px',
642
+ },
643
+ d2: {
644
+ fontFamily: vars.fontFamily.heading,
645
+ fontSize: '36px',
646
+ fontWeight: 400,
647
+ letterSpacing: '-1.44px',
648
+ lineHeight: '34.2px',
649
+ },
650
+ },
651
+ // Pilat Book is weight 500.
652
+ heading: {
653
+ h1: {
654
+ fontFamily: vars.fontFamily.heading,
655
+ fontSize: '32px',
656
+ fontWeight: 500,
657
+ letterSpacing: '-.48px',
658
+ lineHeight: '36.8px',
659
+ },
660
+ h2: {
661
+ fontFamily: vars.fontFamily.heading,
662
+ fontSize: '24px',
663
+ fontWeight: 500,
664
+ letterSpacing: '-.36px',
665
+ lineHeight: '27.6px',
666
+ },
667
+ h3: {
668
+ fontFamily: vars.fontFamily.heading,
669
+ fontSize: '20px',
670
+ fontWeight: 500,
671
+ letterSpacing: '-.3px',
672
+ lineHeight: '23px',
673
+ },
674
+ h4: {
675
+ fontFamily: vars.fontFamily.heading,
676
+ fontSize: '18px',
677
+ fontWeight: 500,
678
+ letterSpacing: '-.27px',
679
+ lineHeight: '20.7px',
680
+ },
681
+ },
682
+ // Labels set Pilat at the size and weight of B2 Strong and B3 Strong, tracked by 1% as the
683
+ // Platform Tab and Toast draw them.
684
+ label: {
685
+ l2: {
686
+ fontFamily: vars.fontFamily.heading,
687
+ fontSize: '14px',
688
+ fontWeight: 500,
689
+ letterSpacing: '.14px',
690
+ lineHeight: '20px',
691
+ },
692
+ l3: {
693
+ fontFamily: vars.fontFamily.heading,
694
+ fontSize: '12px',
695
+ fontWeight: 500,
696
+ letterSpacing: '.15px',
697
+ lineHeight: '16px',
698
+ },
699
+ },
700
+ mono: {
701
+ m1: {
702
+ fontFamily: vars.fontFamily.mono,
703
+ fontSize: '12px',
704
+ fontWeight: 400,
705
+ letterSpacing: '0px',
706
+ lineHeight: '16px',
707
+ },
708
+ },
709
+ utility: {
710
+ m1: {
711
+ fontFamily: vars.fontFamily.mono,
712
+ fontSize: '12px',
713
+ fontWeight: 400,
714
+ letterSpacing: '.72px',
715
+ lineHeight: '16px',
716
+ },
717
+ m2: {
718
+ fontFamily: vars.fontFamily.mono,
719
+ fontSize: '10px',
720
+ fontWeight: 400,
721
+ letterSpacing: '.6px',
722
+ lineHeight: '12px',
723
+ },
724
+ },
725
+ value: {
726
+ v1: {
727
+ fontFamily: vars.fontFamily.heading,
728
+ fontSize: '80px',
729
+ fontWeight: 400,
730
+ letterSpacing: '-2.4px',
731
+ lineHeight: 'normal',
732
+ },
733
+ v2: {
734
+ fontFamily: vars.fontFamily.heading,
735
+ fontSize: '52px',
736
+ fontWeight: 400,
737
+ letterSpacing: '-1.56px',
738
+ lineHeight: 'normal',
739
+ },
740
+ v3: {
741
+ fontFamily: vars.fontFamily.heading,
742
+ fontSize: '40px',
743
+ fontWeight: 400,
744
+ letterSpacing: '-1.2px',
745
+ lineHeight: 'normal',
746
+ },
747
+ },
748
+ },
749
+ }),
750
+ { id: 'tds/marketing/variables' },
751
+ )