@putdotio/design 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/DESIGN.md CHANGED
@@ -76,7 +76,9 @@ Dark app surfaces are the default product mode, but the token contract includes
76
76
 
77
77
  Use GT America for product UI and display. Berkeley Mono is the single mono face: numerics, timestamps, file sizes, ETAs, counts, code, logs, identifiers, hashes, magnet URIs, and filenames. Its tabular figures keep metadata columns aligned, so pair it with `font-variant-numeric: tabular-nums` wherever numbers sit in a column.
78
78
 
79
- The mono role is web and mobile only. TV surfaces have no mono face — 10-foot numerics render in GT America with tabular figures.
79
+ The mono role is web and mobile only. TV surfaces have no mono face — 10-foot numerics render in GT America, and should ask for its tabular figures wherever a number ticks or sits in a column. GT America Standard carries `tnum`, so any platform that can select OpenType features can honour this: web through `font-variant-numeric: tabular-nums`, React Native through the same font feature settings. Platforms that cannot select features get the default proportional figures, where `1` is 399/1000 em against `0` at 636, so a running timecode visibly reflows. Roku is the current example — its SceneGraph `Font` node accepts only a `uri` and a `size` — so budget 10-foot numeric layouts for proportional figures rather than assuming the columns line up.
80
+
81
+ GT America is a Latin face: 523 codepoints covering Western and Central European Latin plus Turkish, with no Cyrillic, Greek, CJK, Arabic, Hebrew, Thai, or Hangul, and no dingbats — no `U+2713 ✓`, `U+2714`, `U+25B6 ▶`, or `U+2605 ★`. Two rules follow. Symbols are always icons, never text glyphs, because a checkmark typed as text renders as nothing. And because put.io shows raw filenames, user content routinely arrives outside that coverage: keep a fallback family behind GT America for any text that can hold a filename. Web gets this for free — `"GT America", sans-serif` falls back per glyph — so the gap is invisible there and shows up on platforms that resolve one font per label with no per-glyph fallback, where uncovered characters become `.notdef` boxes. Treat a platform's fallback story for content text as part of adopting the face, not an afterthought.
80
82
 
81
83
  Body UI text should stay readable and dense. Use medium weight for labels and controls, bold weight only where the hierarchy earns it, and black weight for deliberate display moments.
82
84
 
@@ -102,7 +104,15 @@ TV is the exception: every 10-foot surface — list rows, buttons, sheets, cards
102
104
 
103
105
  ## Components
104
106
 
105
- Buttons use yellow only for primary commands. Primary buttons use `--button-primary-bg` at rest and `--button-primary-bg-hover` on hover so the CTA never feels inert. Secondary buttons should feel quiet and tokenized against the active surface. File rows are the core component: preserve raw names, keep metadata compact, and make hover/focus states obvious without inflating row height.
107
+ Buttons have three tiers on one axis: emphasis. **Primary** is the brand fill — `--button-primary-bg` at rest, `--button-primary-bg-hover` on hover so the CTA never feels inert, label `--button-primary-fg`. Yellow is reserved for primary commands, and an action group carries at most one. **Secondary** is a quiet fill: `--button-default-bg` (aliased as `--button-secondary-bg`) plus a border at `--border`, with hover stepping both (`--button-default-bg-hover`, `--border-hover`). Because it fills, it reads to a hard edge exactly like the primary, so the two compare safely side by side. **Ghost** is text only — no fill, no border. `--button-ghost-fg` at rest; hover paints `--button-ghost-bg-hover` behind the label and lifts it to `--button-ghost-fg-hover`. The label lift is mandatory: the faint fill is never the only hover cue. Disabled drops the colour to `--solid` at full opacity rather than fading the box. Use ghost for anything quieter than a filled secondary — a header `Log in`, toolbar text actions, `Cancel` beside a filled confirm. An icon-only ghost is the quiet icon button, on the same tokens.
108
+
109
+ Outline is not a tier. The system ships no transparent-background bordered button, and consumers must not hand-roll one. The pairing rule behind that: never place a border-only button in the same action group as a solid fill. At identical box heights the outlined shape reads smaller, because a solid resolves to a hard edge while a low-contrast hairline resolves to a soft one, and the eye compares the two extents differently. It is worst on dark surfaces, where a 15%-white hairline is barely visible at all. If a bordered treatment must sit near a fill, it must itself fill — the secondary tier — and carry its border at `--border`-step contrast, never a sub-20% hairline on transparent.
110
+
111
+ Button geometry is tokenized so every tier and variant of a given size shares an identical box; tiers change colour only, which makes cross-variant comparison safe by construction. There are four sizes and no others. The default is `36px` tall with `12px` of horizontal padding, an `--fs-sm` uppercase label and `1px` of tracking; `md` is `32px` at `0.8px` tracking, `sm` is `28px` at `0.6px`, and `xs` is `24px` with `8px` padding, an `--fs-xs` label and `0.3px` tracking. Read them from `--button-height` (`-md`, `-sm`, `-xs`), `--button-padding-x` (`-xs`), `--button-label-size` (`-xs`), `--button-tracking` (`-md`, `-sm`, `-xs`), `--button-icon-size` and `--button-gap` rather than restating the numbers. Every button token aliases the neutral scale, which carries both modes, so a dark bar on a light page is a `.dark`-scoped region and never hand-picked dark literals. The sticky site top bar is `--nav-height` (`56px`), or `--nav-height-compact` (`52px`) on narrow viewports, and its CTA is the `md` box via `--nav-cta-height`.
112
+
113
+ TV needs no carve-out here: TV buttons keep the `tv` scale box and `--radius-tv`, and TV focus restores a visible box (`--component-bg-active` plus a border step), so the ghost tier stays legible in the 10-foot focus model.
114
+
115
+ File rows are the core component: preserve raw names, keep metadata compact, and make hover/focus states obvious without inflating row height.
106
116
 
107
117
  Form fields use the shared `--field-*` aliases: `--field-bg` for the fill, `--field-border` for the resting border, and `--field-ring` for focus. Invalid fields opt in with `aria-invalid="true"` and use red border/text only; do not add red fill. Raised panels use the shared `--panel-*` aliases instead of auth- or screen-specific panel variables.
108
118
 
@@ -11,6 +11,7 @@
11
11
  --button-primary-bg-hover: hsl(45, 89%, 58%);
12
12
  --button-secondary-bg: hsl(0, 0%, 95.1%);
13
13
  --button-secondary-fg: hsl(0, 0%, 9.0%);
14
+ --button-secondary-bg-hover: hsl(0, 0%, 93.0%);
14
15
  --button-success-bg: hsl(151, 55%, 41.5%);
15
16
  --button-success-bg-hover: hsl(151, 58%, 37%);
16
17
  --button-danger-bg: hsl(358, 75%, 59%);
@@ -21,6 +22,9 @@
21
22
  --button-default-bg: hsl(0, 0%, 95.1%);
22
23
  --button-default-bg-hover: hsl(0, 0%, 93.0%);
23
24
  --button-default-fg: hsl(0, 0%, 9.0%);
25
+ --button-ghost-fg: hsl(0, 0%, 43.5%);
26
+ --button-ghost-fg-hover: hsl(0, 0%, 9.0%);
27
+ --button-ghost-bg-hover: hsl(0, 0%, 93.0%);
24
28
  --input-bg: hsl(0, 0%, 100%);
25
29
  --input-border: hsl(0, 0%, 85.8%);
26
30
  --input-border-hover: hsl(0, 0%, 78.0%);
@@ -166,6 +170,24 @@
166
170
  --button-radius: 6px;
167
171
  --button-success-fg: hsl(0, 0%, 100%);
168
172
  --button-danger-fg: hsl(0, 0%, 100%);
173
+ --button-ghost-bg: hsla(0, 0%, 0%, 0);
174
+ --button-height: 36px;
175
+ --button-height-md: 32px;
176
+ --button-height-sm: 28px;
177
+ --button-height-xs: 24px;
178
+ --button-padding-x: 12px;
179
+ --button-padding-x-xs: 8px;
180
+ --button-label-size: 0.875rem;
181
+ --button-label-size-xs: 0.75rem;
182
+ --button-tracking: 1px;
183
+ --button-tracking-md: 0.8px;
184
+ --button-tracking-sm: 0.6px;
185
+ --button-tracking-xs: 0.3px;
186
+ --button-icon-size: 14px;
187
+ --button-gap: 8px;
188
+ --nav-height: 56px;
189
+ --nav-height-compact: 52px;
190
+ --nav-cta-height: 32px;
169
191
  --input-radius: 6px;
170
192
  --field-radius: 6px;
171
193
  --panel-radius: 10px;
@@ -250,6 +272,7 @@
250
272
  --button-primary-bg-hover: hsl(45, 89%, 58%);
251
273
  --button-secondary-bg: hsl(0, 0%, 13.6%);
252
274
  --button-secondary-fg: hsl(0, 0%, 93.0%);
275
+ --button-secondary-bg-hover: hsl(0, 0%, 15.8%);
253
276
  --button-success-bg: hsl(151, 55%, 41.5%);
254
277
  --button-success-bg-hover: hsl(151, 68%, 35%);
255
278
  --button-danger-bg: hsl(358, 75%, 59%);
@@ -260,6 +283,9 @@
260
283
  --button-default-bg: hsl(0, 0%, 13.6%);
261
284
  --button-default-bg-hover: hsl(0, 0%, 15.8%);
262
285
  --button-default-fg: hsl(0, 0%, 93.0%);
286
+ --button-ghost-fg: hsl(0, 0%, 62.8%);
287
+ --button-ghost-fg-hover: hsl(0, 0%, 93.0%);
288
+ --button-ghost-bg-hover: hsl(0, 0%, 15.8%);
263
289
  --input-bg: hsl(0, 0%, 8.5%);
264
290
  --input-border: hsl(0, 0%, 24.3%);
265
291
  --input-border-hover: hsl(0, 0%, 31.2%);
@@ -30,6 +30,11 @@
30
30
  "foreground": {
31
31
  "$type": "color",
32
32
  "$value": "hsl(0, 0%, 9.0%)"
33
+ },
34
+ "backgroundHover": {
35
+ "$type": "color",
36
+ "$value": "hsl(0, 0%, 93.0%)",
37
+ "$description": "Secondary quiet-fill hover in light mode."
33
38
  }
34
39
  },
35
40
  "success": {
@@ -99,6 +104,115 @@
99
104
  "$value": "hsl(0, 0%, 9.0%)",
100
105
  "$description": "Default button label in light mode."
101
106
  }
107
+ },
108
+ "ghost": {
109
+ "background": {
110
+ "$type": "color",
111
+ "$value": "hsla(0, 0%, 0%, 0)",
112
+ "$description": "Ghost tier rests with no fill and no border."
113
+ },
114
+ "foreground": {
115
+ "$type": "color",
116
+ "$value": "hsl(0, 0%, 43.5%)",
117
+ "$description": "Ghost label at rest in light mode."
118
+ },
119
+ "foregroundHover": {
120
+ "$type": "color",
121
+ "$value": "hsl(0, 0%, 9.0%)",
122
+ "$description": "Ghost label on hover in light mode. The lift is mandatory."
123
+ },
124
+ "backgroundHover": {
125
+ "$type": "color",
126
+ "$value": "hsl(0, 0%, 93.0%)",
127
+ "$description": "Shared quiet-fill hover step in light mode."
128
+ }
129
+ },
130
+ "height": {
131
+ "$type": "dimension",
132
+ "$value": "36px",
133
+ "$description": "Default (lg) button box."
134
+ },
135
+ "heightMd": {
136
+ "$type": "dimension",
137
+ "$value": "32px",
138
+ "$description": "Medium button box. The site top-bar CTA size."
139
+ },
140
+ "heightSm": {
141
+ "$type": "dimension",
142
+ "$value": "28px",
143
+ "$description": "Small button box."
144
+ },
145
+ "heightXs": {
146
+ "$type": "dimension",
147
+ "$value": "24px",
148
+ "$description": "Extra-small button box."
149
+ },
150
+ "paddingX": {
151
+ "$type": "dimension",
152
+ "$value": "12px",
153
+ "$description": "Horizontal padding for lg, md and sm."
154
+ },
155
+ "paddingXXs": {
156
+ "$type": "dimension",
157
+ "$value": "8px",
158
+ "$description": "Horizontal padding at xs."
159
+ },
160
+ "labelSize": {
161
+ "$type": "dimension",
162
+ "$value": "0.875rem",
163
+ "$description": "Uppercase label size."
164
+ },
165
+ "labelSizeXs": {
166
+ "$type": "dimension",
167
+ "$value": "0.75rem",
168
+ "$description": "Uppercase label size at xs."
169
+ },
170
+ "tracking": {
171
+ "$type": "dimension",
172
+ "$value": "1px",
173
+ "$description": "Letter-spacing at lg."
174
+ },
175
+ "trackingMd": {
176
+ "$type": "dimension",
177
+ "$value": "0.8px",
178
+ "$description": "Letter-spacing at md."
179
+ },
180
+ "trackingSm": {
181
+ "$type": "dimension",
182
+ "$value": "0.6px",
183
+ "$description": "Letter-spacing at sm."
184
+ },
185
+ "trackingXs": {
186
+ "$type": "dimension",
187
+ "$value": "0.3px",
188
+ "$description": "Letter-spacing at xs."
189
+ },
190
+ "iconSize": {
191
+ "$type": "dimension",
192
+ "$value": "14px",
193
+ "$description": "Glyph size inside a button."
194
+ },
195
+ "gap": {
196
+ "$type": "dimension",
197
+ "$value": "8px",
198
+ "$description": "Gap between glyph and label."
199
+ }
200
+ },
201
+ "nav": {
202
+ "height": {
203
+ "$type": "dimension",
204
+ "$value": "56px",
205
+ "$description": "Sticky top bar height."
206
+ },
207
+ "heightCompact": {
208
+ "$type": "dimension",
209
+ "$value": "52px",
210
+ "$description": "Sticky top bar height on narrow viewports."
211
+ },
212
+ "ctaHeight": {
213
+ "$type": "dimension",
214
+ "$value": "32px",
215
+ "$description": "The top-bar CTA box. Always the md button."
102
216
  }
103
217
  },
104
218
  "input": {
package/dist/tokens.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // Do not edit directly. Generated from tokens/**/*.tokens.json.
2
2
 
3
- export type PutioTokenName = "component.button.primary.background" | "component.button.primary.backgroundHover" | "component.button.primary.backgroundHoverDark" | "component.button.primary.foreground" | "component.button.primary.radius" | "component.button.secondary.background" | "component.button.secondary.backgroundDark" | "component.button.secondary.foreground" | "component.button.secondary.foregroundDark" | "component.button.success.background" | "component.button.success.backgroundDark" | "component.button.success.backgroundHover" | "component.button.success.backgroundHoverDark" | "component.button.success.foreground" | "component.button.danger.background" | "component.button.danger.backgroundDark" | "component.button.danger.backgroundHover" | "component.button.danger.backgroundHoverDark" | "component.button.danger.foreground" | "component.button.info.background" | "component.button.info.backgroundDark" | "component.button.info.backgroundHover" | "component.button.info.backgroundHoverDark" | "component.button.info.foreground" | "component.button.info.foregroundDark" | "component.button.default.background" | "component.button.default.backgroundDark" | "component.button.default.backgroundHover" | "component.button.default.backgroundHoverDark" | "component.button.default.foreground" | "component.button.default.foregroundDark" | "component.input.background" | "component.input.backgroundDark" | "component.input.border" | "component.input.borderDark" | "component.input.radius" | "component.input.borderHover" | "component.input.borderHoverDark" | "component.input.borderFocus" | "component.input.borderFocusDark" | "component.input.ring" | "component.input.ringDark" | "component.input.text" | "component.input.textDark" | "component.input.placeholder" | "component.input.placeholderDark" | "component.field.background" | "component.field.backgroundDark" | "component.field.backgroundDisabled" | "component.field.backgroundDisabledDark" | "component.field.border" | "component.field.borderDark" | "component.field.borderHover" | "component.field.borderHoverDark" | "component.field.borderFocus" | "component.field.borderFocusDark" | "component.field.text" | "component.field.textDark" | "component.field.placeholder" | "component.field.placeholderDark" | "component.field.radius" | "component.field.ring" | "component.field.ringDark" | "component.panel.background" | "component.panel.backgroundDark" | "component.panel.border" | "component.panel.borderDark" | "component.panel.radius" | "component.panel.shadow" | "component.panel.shadowDark" | "component.alias.background" | "component.alias.backgroundDark" | "component.alias.foreground" | "component.alias.foregroundDark" | "component.alias.foregroundMuted" | "component.alias.foregroundMutedDark" | "component.alias.primary" | "component.alias.primaryForeground" | "component.alias.success" | "component.alias.successDark" | "component.alias.successForeground" | "component.alias.destructive" | "component.alias.destructiveDark" | "component.alias.destructiveForeground" | "component.alias.invertForeground" | "component.alias.invertForegroundDark" | "component.alias.solidForeground" | "component.alias.solidForegroundDark" | "component.alias.muted" | "component.alias.mutedDark" | "component.alias.mutedForeground" | "component.alias.mutedForegroundDark" | "component.alias.accent" | "component.alias.accentDark" | "component.alias.accentForeground" | "component.alias.accentForegroundDark" | "component.alias.card" | "component.alias.cardDark" | "component.alias.cardForeground" | "component.alias.cardForegroundDark" | "component.alias.popover" | "component.alias.popoverDark" | "component.alias.popoverForeground" | "component.alias.popoverForegroundDark" | "component.alias.input" | "component.alias.inputDark" | "component.alias.ring" | "component.fileRow.background" | "component.fileRow.backgroundDark" | "component.fileRow.hoverBackground" | "component.fileRow.hoverBackgroundDark" | "component.fileRow.activeBackground" | "component.fileRow.activeBackgroundDark" | "component.fileRow.border" | "component.fileRow.borderDark" | "component.fileRow.icon" | "component.notification.infoBackground" | "component.notification.infoBackgroundDark" | "component.notification.dangerBackground" | "component.notification.dangerBackgroundDark" | "component.notification.background" | "component.notification.backgroundDark" | "component.notification.border" | "component.notification.borderDark" | "component.notification.foreground" | "component.notification.foregroundDark" | "component.notification.icon" | "component.notification.iconDark" | "component.notification.successBackground" | "component.notification.successBackgroundDark" | "component.notification.successBorder" | "component.notification.successBorderDark" | "component.notification.successForeground" | "component.notification.successForegroundDark" | "component.notification.dangerBorder" | "component.notification.dangerBorderDark" | "component.notification.dangerForeground" | "component.notification.dangerForegroundDark" | "component.menu.background" | "component.menu.backgroundDark" | "component.menu.border" | "component.menu.borderDark" | "component.menu.radius" | "component.menu.shadow" | "component.menu.shadowDark" | "component.menu.itemBackgroundHover" | "component.menu.itemBackgroundHoverDark" | "component.menu.itemText" | "component.menu.itemTextDark" | "component.menu.itemIcon" | "component.menu.itemIconDark" | "component.menu.itemShortcut" | "component.menu.itemShortcutDark" | "component.menu.itemDangerText" | "component.menu.itemDangerTextDark" | "component.menu.itemDangerBackgroundHover" | "component.menu.itemDangerBackgroundHoverDark" | "component.menu.itemHeight" | "component.menu.separator" | "component.menu.separatorDark" | "component.menu.label" | "component.menu.labelDark" | "component.palette.background" | "component.palette.backgroundDark" | "component.palette.border" | "component.palette.borderDark" | "component.palette.shadow" | "component.palette.shadowDark" | "component.palette.scrim" | "component.palette.scrimDark" | "component.palette.width" | "component.palette.inputHeight" | "component.palette.itemHeight" | "component.palette.itemBackgroundActive" | "component.palette.itemBackgroundActiveDark" | "component.palette.groupLabel" | "component.palette.groupLabelDark" | "component.palette.itemMeta" | "component.palette.itemMetaDark" | "component.sheet.background" | "component.sheet.backgroundDark" | "component.sheet.border" | "component.sheet.borderDark" | "component.sheet.shadow" | "component.sheet.shadowDark" | "component.sheet.scrim" | "component.sheet.scrimDark" | "component.sheet.width" | "context.tv.text.primary" | "context.tv.text.secondary" | "context.tv.text.tertiary" | "context.tv.channelArt.production.posterBackground" | "context.tv.channelArt.production.splashBackground" | "context.tv.channelArt.development.background" | "context.tv.channelArt.development.accent" | "context.tv.channelArt.development.grid" | "context.tv.channelArt.lab.background" | "context.tv.channelArt.lab.foreground" | "context.tv.channelArt.lab.accent" | "tv.text.heading" | "tv.text.label" | "tv.text.body" | "tv.text.caption" | "tv.text.smol" | "tv.fontWeight.regular" | "tv.fontWeight.medium" | "tv.space.xxs" | "tv.space.xs" | "tv.space.sm" | "tv.space.md" | "tv.space.lg" | "tv.space.xl" | "tv.space.xxl" | "tv.overscan.x" | "tv.overscan.y" | "tv.radius" | "tv.z.modal" | "tv.z.toast" | "tv.z.overlay" | "color.brand.yellow" | "color.neutral.light.bg" | "color.neutral.light.bgSecondary" | "color.neutral.light.componentBg" | "color.neutral.light.componentBgHover" | "color.neutral.light.componentBgActive" | "color.neutral.light.line" | "color.neutral.light.border" | "color.neutral.light.borderHover" | "color.neutral.light.solid" | "color.neutral.light.solidHover" | "color.neutral.light.textSecondary" | "color.neutral.light.text" | "color.neutral.dark.bg" | "color.neutral.dark.bgSecondary" | "color.neutral.dark.componentBg" | "color.neutral.dark.componentBgHover" | "color.neutral.dark.componentBgActive" | "color.neutral.dark.line" | "color.neutral.dark.border" | "color.neutral.dark.borderHover" | "color.neutral.dark.solid" | "color.neutral.dark.solidHover" | "color.neutral.dark.textSecondary" | "color.neutral.dark.text" | "color.green.light.bg" | "color.green.light.bgSecondary" | "color.green.light.componentBg" | "color.green.light.componentBgHover" | "color.green.light.componentBgActive" | "color.green.light.line" | "color.green.light.border" | "color.green.light.borderHover" | "color.green.light.solid" | "color.green.light.solidHover" | "color.green.light.textSecondary" | "color.green.light.text" | "color.green.dark.bg" | "color.green.dark.bgSecondary" | "color.green.dark.componentBg" | "color.green.dark.componentBgHover" | "color.green.dark.componentBgActive" | "color.green.dark.line" | "color.green.dark.border" | "color.green.dark.borderHover" | "color.green.dark.solid" | "color.green.dark.solidHover" | "color.green.dark.textSecondary" | "color.green.dark.text" | "color.red.light.bg" | "color.red.light.bgSecondary" | "color.red.light.componentBg" | "color.red.light.componentBgHover" | "color.red.light.componentBgActive" | "color.red.light.line" | "color.red.light.border" | "color.red.light.borderHover" | "color.red.light.solid" | "color.red.light.solidHover" | "color.red.light.textSecondary" | "color.red.light.text" | "color.red.dark.bg" | "color.red.dark.bgSecondary" | "color.red.dark.componentBg" | "color.red.dark.componentBgHover" | "color.red.dark.componentBgActive" | "color.red.dark.line" | "color.red.dark.border" | "color.red.dark.borderHover" | "color.red.dark.solid" | "color.red.dark.solidHover" | "color.red.dark.textSecondary" | "color.red.dark.text" | "color.yellow.light.bg" | "color.yellow.light.bgSecondary" | "color.yellow.light.componentBg" | "color.yellow.light.componentBgHover" | "color.yellow.light.componentBgActive" | "color.yellow.light.line" | "color.yellow.light.border" | "color.yellow.light.borderHover" | "color.yellow.light.solidHover" | "color.yellow.light.textSecondary" | "color.yellow.light.text" | "color.yellow.dark.bg" | "color.yellow.dark.bgSecondary" | "color.yellow.dark.componentBg" | "color.yellow.dark.componentBgHover" | "color.yellow.dark.componentBgActive" | "color.yellow.dark.line" | "color.yellow.dark.border" | "color.yellow.dark.borderHover" | "color.yellow.dark.solidHover" | "color.yellow.dark.textSecondary" | "color.yellow.dark.text" | "color.transfer.light.lime3" | "color.transfer.dark.lime3" | "elevation.shadowColor" | "elevation.color" | "elevation.sm" | "elevation.md" | "elevation.lg" | "elevation.focusColor" | "elevation.focus" | "typography.fontFamily.sans" | "typography.fontFamily.display" | "typography.fontFamily.mono" | "typography.fontSize.xs" | "typography.fontSize.sm" | "typography.fontSize.base" | "typography.fontSize.md" | "typography.fontSize.lg" | "typography.fontSize.xl" | "typography.fontSize.2xl" | "typography.fontSize.3xl" | "typography.fontSize.4xl" | "typography.fontSize.display" | "typography.lineHeight.tight" | "typography.lineHeight.snug" | "typography.lineHeight.normal" | "typography.lineHeight.loose" | "typography.fontWeight.regular" | "typography.fontWeight.medium" | "typography.fontWeight.bold" | "typography.fontWeight.black" | "typography.letterSpacing.tight" | "typography.letterSpacing.normal" | "typography.letterSpacing.wide" | "typography.letterSpacing.uppercase" | "spacing.0" | "spacing.1" | "spacing.2" | "spacing.3" | "spacing.4" | "spacing.5" | "spacing.6" | "spacing.7" | "spacing.8" | "radius.sm" | "radius.default" | "radius.md" | "radius.lg" | "radius.pill" | "radius.tv" | "border.width" | "motion.easing.out" | "motion.easing.inOut" | "motion.duration.fast" | "motion.duration.base" | "motion.duration.slow" | "z.dropdown" | "z.sticky" | "z.modal" | "z.notification" | "z.tooltip" | "breakpoint.sm" | "breakpoint.md" | "breakpoint.lg" | "surface.light.htmlBg" | "surface.light.appBg" | "surface.light.navBg" | "surface.light.navItemBg" | "surface.light.navItemBgHover" | "surface.light.navItemBgActive" | "surface.light.listItemBg" | "surface.light.listItemBgHover" | "surface.light.listItemBgActive" | "surface.light.listItemBorder" | "surface.light.segmentedControlBg" | "surface.light.segmentedControlBgActive" | "surface.light.transferListItemCompletingBg" | "surface.light.transferListItemDownloadingBg" | "surface.light.transferListItemFinishedBg" | "surface.light.transferListItemPassiveBg" | "surface.light.hiContrast" | "surface.light.loContrast" | "surface.light.transparent" | "surface.light.overlayInline" | "surface.light.overlayFull" | "surface.dark.htmlBg" | "surface.dark.appBg" | "surface.dark.navBg" | "surface.dark.navItemBg" | "surface.dark.navItemBgHover" | "surface.dark.navItemBgActive" | "surface.dark.listItemBg" | "surface.dark.listItemBgHover" | "surface.dark.listItemBgActive" | "surface.dark.listItemBorder" | "surface.dark.segmentedControlBg" | "surface.dark.segmentedControlBgActive" | "surface.dark.transferListItemCompletingBg" | "surface.dark.transferListItemDownloadingBg" | "surface.dark.transferListItemFinishedBg" | "surface.dark.transferListItemPassiveBg" | "surface.dark.hiContrast" | "surface.dark.loContrast" | "surface.dark.overlayInline" | "surface.dark.overlayFull" | "surface.dark.shadowColor" | "surface.dark.shadow" | "surface.dark.shadowSm" | "surface.dark.shadowMd" | "surface.dark.shadowLg";
3
+ export type PutioTokenName = "component.button.primary.background" | "component.button.primary.backgroundHover" | "component.button.primary.backgroundHoverDark" | "component.button.primary.foreground" | "component.button.primary.radius" | "component.button.secondary.background" | "component.button.secondary.backgroundDark" | "component.button.secondary.foreground" | "component.button.secondary.foregroundDark" | "component.button.secondary.backgroundHover" | "component.button.secondary.backgroundHoverDark" | "component.button.success.background" | "component.button.success.backgroundDark" | "component.button.success.backgroundHover" | "component.button.success.backgroundHoverDark" | "component.button.success.foreground" | "component.button.danger.background" | "component.button.danger.backgroundDark" | "component.button.danger.backgroundHover" | "component.button.danger.backgroundHoverDark" | "component.button.danger.foreground" | "component.button.info.background" | "component.button.info.backgroundDark" | "component.button.info.backgroundHover" | "component.button.info.backgroundHoverDark" | "component.button.info.foreground" | "component.button.info.foregroundDark" | "component.button.default.background" | "component.button.default.backgroundDark" | "component.button.default.backgroundHover" | "component.button.default.backgroundHoverDark" | "component.button.default.foreground" | "component.button.default.foregroundDark" | "component.button.ghost.background" | "component.button.ghost.foreground" | "component.button.ghost.foregroundDark" | "component.button.ghost.foregroundHover" | "component.button.ghost.foregroundHoverDark" | "component.button.ghost.backgroundHover" | "component.button.ghost.backgroundHoverDark" | "component.button.height" | "component.button.heightMd" | "component.button.heightSm" | "component.button.heightXs" | "component.button.paddingX" | "component.button.paddingXXs" | "component.button.labelSize" | "component.button.labelSizeXs" | "component.button.tracking" | "component.button.trackingMd" | "component.button.trackingSm" | "component.button.trackingXs" | "component.button.iconSize" | "component.button.gap" | "component.nav.height" | "component.nav.heightCompact" | "component.nav.ctaHeight" | "component.input.background" | "component.input.backgroundDark" | "component.input.border" | "component.input.borderDark" | "component.input.radius" | "component.input.borderHover" | "component.input.borderHoverDark" | "component.input.borderFocus" | "component.input.borderFocusDark" | "component.input.ring" | "component.input.ringDark" | "component.input.text" | "component.input.textDark" | "component.input.placeholder" | "component.input.placeholderDark" | "component.field.background" | "component.field.backgroundDark" | "component.field.backgroundDisabled" | "component.field.backgroundDisabledDark" | "component.field.border" | "component.field.borderDark" | "component.field.borderHover" | "component.field.borderHoverDark" | "component.field.borderFocus" | "component.field.borderFocusDark" | "component.field.text" | "component.field.textDark" | "component.field.placeholder" | "component.field.placeholderDark" | "component.field.radius" | "component.field.ring" | "component.field.ringDark" | "component.panel.background" | "component.panel.backgroundDark" | "component.panel.border" | "component.panel.borderDark" | "component.panel.radius" | "component.panel.shadow" | "component.panel.shadowDark" | "component.alias.background" | "component.alias.backgroundDark" | "component.alias.foreground" | "component.alias.foregroundDark" | "component.alias.foregroundMuted" | "component.alias.foregroundMutedDark" | "component.alias.primary" | "component.alias.primaryForeground" | "component.alias.success" | "component.alias.successDark" | "component.alias.successForeground" | "component.alias.destructive" | "component.alias.destructiveDark" | "component.alias.destructiveForeground" | "component.alias.invertForeground" | "component.alias.invertForegroundDark" | "component.alias.solidForeground" | "component.alias.solidForegroundDark" | "component.alias.muted" | "component.alias.mutedDark" | "component.alias.mutedForeground" | "component.alias.mutedForegroundDark" | "component.alias.accent" | "component.alias.accentDark" | "component.alias.accentForeground" | "component.alias.accentForegroundDark" | "component.alias.card" | "component.alias.cardDark" | "component.alias.cardForeground" | "component.alias.cardForegroundDark" | "component.alias.popover" | "component.alias.popoverDark" | "component.alias.popoverForeground" | "component.alias.popoverForegroundDark" | "component.alias.input" | "component.alias.inputDark" | "component.alias.ring" | "component.fileRow.background" | "component.fileRow.backgroundDark" | "component.fileRow.hoverBackground" | "component.fileRow.hoverBackgroundDark" | "component.fileRow.activeBackground" | "component.fileRow.activeBackgroundDark" | "component.fileRow.border" | "component.fileRow.borderDark" | "component.fileRow.icon" | "component.notification.infoBackground" | "component.notification.infoBackgroundDark" | "component.notification.dangerBackground" | "component.notification.dangerBackgroundDark" | "component.notification.background" | "component.notification.backgroundDark" | "component.notification.border" | "component.notification.borderDark" | "component.notification.foreground" | "component.notification.foregroundDark" | "component.notification.icon" | "component.notification.iconDark" | "component.notification.successBackground" | "component.notification.successBackgroundDark" | "component.notification.successBorder" | "component.notification.successBorderDark" | "component.notification.successForeground" | "component.notification.successForegroundDark" | "component.notification.dangerBorder" | "component.notification.dangerBorderDark" | "component.notification.dangerForeground" | "component.notification.dangerForegroundDark" | "component.menu.background" | "component.menu.backgroundDark" | "component.menu.border" | "component.menu.borderDark" | "component.menu.radius" | "component.menu.shadow" | "component.menu.shadowDark" | "component.menu.itemBackgroundHover" | "component.menu.itemBackgroundHoverDark" | "component.menu.itemText" | "component.menu.itemTextDark" | "component.menu.itemIcon" | "component.menu.itemIconDark" | "component.menu.itemShortcut" | "component.menu.itemShortcutDark" | "component.menu.itemDangerText" | "component.menu.itemDangerTextDark" | "component.menu.itemDangerBackgroundHover" | "component.menu.itemDangerBackgroundHoverDark" | "component.menu.itemHeight" | "component.menu.separator" | "component.menu.separatorDark" | "component.menu.label" | "component.menu.labelDark" | "component.palette.background" | "component.palette.backgroundDark" | "component.palette.border" | "component.palette.borderDark" | "component.palette.shadow" | "component.palette.shadowDark" | "component.palette.scrim" | "component.palette.scrimDark" | "component.palette.width" | "component.palette.inputHeight" | "component.palette.itemHeight" | "component.palette.itemBackgroundActive" | "component.palette.itemBackgroundActiveDark" | "component.palette.groupLabel" | "component.palette.groupLabelDark" | "component.palette.itemMeta" | "component.palette.itemMetaDark" | "component.sheet.background" | "component.sheet.backgroundDark" | "component.sheet.border" | "component.sheet.borderDark" | "component.sheet.shadow" | "component.sheet.shadowDark" | "component.sheet.scrim" | "component.sheet.scrimDark" | "component.sheet.width" | "context.tv.text.primary" | "context.tv.text.secondary" | "context.tv.text.tertiary" | "context.tv.channelArt.production.posterBackground" | "context.tv.channelArt.production.splashBackground" | "context.tv.channelArt.development.background" | "context.tv.channelArt.development.accent" | "context.tv.channelArt.development.grid" | "context.tv.channelArt.lab.background" | "context.tv.channelArt.lab.foreground" | "context.tv.channelArt.lab.accent" | "tv.text.heading" | "tv.text.label" | "tv.text.body" | "tv.text.caption" | "tv.text.smol" | "tv.fontWeight.regular" | "tv.fontWeight.medium" | "tv.space.xxs" | "tv.space.xs" | "tv.space.sm" | "tv.space.md" | "tv.space.lg" | "tv.space.xl" | "tv.space.xxl" | "tv.overscan.x" | "tv.overscan.y" | "tv.radius" | "tv.z.modal" | "tv.z.toast" | "tv.z.overlay" | "color.brand.yellow" | "color.neutral.light.bg" | "color.neutral.light.bgSecondary" | "color.neutral.light.componentBg" | "color.neutral.light.componentBgHover" | "color.neutral.light.componentBgActive" | "color.neutral.light.line" | "color.neutral.light.border" | "color.neutral.light.borderHover" | "color.neutral.light.solid" | "color.neutral.light.solidHover" | "color.neutral.light.textSecondary" | "color.neutral.light.text" | "color.neutral.dark.bg" | "color.neutral.dark.bgSecondary" | "color.neutral.dark.componentBg" | "color.neutral.dark.componentBgHover" | "color.neutral.dark.componentBgActive" | "color.neutral.dark.line" | "color.neutral.dark.border" | "color.neutral.dark.borderHover" | "color.neutral.dark.solid" | "color.neutral.dark.solidHover" | "color.neutral.dark.textSecondary" | "color.neutral.dark.text" | "color.green.light.bg" | "color.green.light.bgSecondary" | "color.green.light.componentBg" | "color.green.light.componentBgHover" | "color.green.light.componentBgActive" | "color.green.light.line" | "color.green.light.border" | "color.green.light.borderHover" | "color.green.light.solid" | "color.green.light.solidHover" | "color.green.light.textSecondary" | "color.green.light.text" | "color.green.dark.bg" | "color.green.dark.bgSecondary" | "color.green.dark.componentBg" | "color.green.dark.componentBgHover" | "color.green.dark.componentBgActive" | "color.green.dark.line" | "color.green.dark.border" | "color.green.dark.borderHover" | "color.green.dark.solid" | "color.green.dark.solidHover" | "color.green.dark.textSecondary" | "color.green.dark.text" | "color.red.light.bg" | "color.red.light.bgSecondary" | "color.red.light.componentBg" | "color.red.light.componentBgHover" | "color.red.light.componentBgActive" | "color.red.light.line" | "color.red.light.border" | "color.red.light.borderHover" | "color.red.light.solid" | "color.red.light.solidHover" | "color.red.light.textSecondary" | "color.red.light.text" | "color.red.dark.bg" | "color.red.dark.bgSecondary" | "color.red.dark.componentBg" | "color.red.dark.componentBgHover" | "color.red.dark.componentBgActive" | "color.red.dark.line" | "color.red.dark.border" | "color.red.dark.borderHover" | "color.red.dark.solid" | "color.red.dark.solidHover" | "color.red.dark.textSecondary" | "color.red.dark.text" | "color.yellow.light.bg" | "color.yellow.light.bgSecondary" | "color.yellow.light.componentBg" | "color.yellow.light.componentBgHover" | "color.yellow.light.componentBgActive" | "color.yellow.light.line" | "color.yellow.light.border" | "color.yellow.light.borderHover" | "color.yellow.light.solidHover" | "color.yellow.light.textSecondary" | "color.yellow.light.text" | "color.yellow.dark.bg" | "color.yellow.dark.bgSecondary" | "color.yellow.dark.componentBg" | "color.yellow.dark.componentBgHover" | "color.yellow.dark.componentBgActive" | "color.yellow.dark.line" | "color.yellow.dark.border" | "color.yellow.dark.borderHover" | "color.yellow.dark.solidHover" | "color.yellow.dark.textSecondary" | "color.yellow.dark.text" | "color.transfer.light.lime3" | "color.transfer.dark.lime3" | "elevation.shadowColor" | "elevation.color" | "elevation.sm" | "elevation.md" | "elevation.lg" | "elevation.focusColor" | "elevation.focus" | "typography.fontFamily.sans" | "typography.fontFamily.display" | "typography.fontFamily.mono" | "typography.fontSize.xs" | "typography.fontSize.sm" | "typography.fontSize.base" | "typography.fontSize.md" | "typography.fontSize.lg" | "typography.fontSize.xl" | "typography.fontSize.2xl" | "typography.fontSize.3xl" | "typography.fontSize.4xl" | "typography.fontSize.display" | "typography.lineHeight.tight" | "typography.lineHeight.snug" | "typography.lineHeight.normal" | "typography.lineHeight.loose" | "typography.fontWeight.regular" | "typography.fontWeight.medium" | "typography.fontWeight.bold" | "typography.fontWeight.black" | "typography.letterSpacing.tight" | "typography.letterSpacing.normal" | "typography.letterSpacing.wide" | "typography.letterSpacing.uppercase" | "spacing.0" | "spacing.1" | "spacing.2" | "spacing.3" | "spacing.4" | "spacing.5" | "spacing.6" | "spacing.7" | "spacing.8" | "radius.sm" | "radius.default" | "radius.md" | "radius.lg" | "radius.pill" | "radius.tv" | "border.width" | "motion.easing.out" | "motion.easing.inOut" | "motion.duration.fast" | "motion.duration.base" | "motion.duration.slow" | "z.dropdown" | "z.sticky" | "z.modal" | "z.notification" | "z.tooltip" | "breakpoint.sm" | "breakpoint.md" | "breakpoint.lg" | "surface.light.htmlBg" | "surface.light.appBg" | "surface.light.navBg" | "surface.light.navItemBg" | "surface.light.navItemBgHover" | "surface.light.navItemBgActive" | "surface.light.listItemBg" | "surface.light.listItemBgHover" | "surface.light.listItemBgActive" | "surface.light.listItemBorder" | "surface.light.segmentedControlBg" | "surface.light.segmentedControlBgActive" | "surface.light.transferListItemCompletingBg" | "surface.light.transferListItemDownloadingBg" | "surface.light.transferListItemFinishedBg" | "surface.light.transferListItemPassiveBg" | "surface.light.hiContrast" | "surface.light.loContrast" | "surface.light.transparent" | "surface.light.overlayInline" | "surface.light.overlayFull" | "surface.dark.htmlBg" | "surface.dark.appBg" | "surface.dark.navBg" | "surface.dark.navItemBg" | "surface.dark.navItemBgHover" | "surface.dark.navItemBgActive" | "surface.dark.listItemBg" | "surface.dark.listItemBgHover" | "surface.dark.listItemBgActive" | "surface.dark.listItemBorder" | "surface.dark.segmentedControlBg" | "surface.dark.segmentedControlBgActive" | "surface.dark.transferListItemCompletingBg" | "surface.dark.transferListItemDownloadingBg" | "surface.dark.transferListItemFinishedBg" | "surface.dark.transferListItemPassiveBg" | "surface.dark.hiContrast" | "surface.dark.loContrast" | "surface.dark.overlayInline" | "surface.dark.overlayFull" | "surface.dark.shadowColor" | "surface.dark.shadow" | "surface.dark.shadowSm" | "surface.dark.shadowMd" | "surface.dark.shadowLg";
4
4
 
5
5
  export type PutioToken = {
6
6
  readonly cssName: string;
@@ -98,6 +98,28 @@
98
98
  "mode": "dark"
99
99
  }
100
100
  }
101
+ },
102
+ "backgroundHover": {
103
+ "$type": "color",
104
+ "$value": "{color.neutral.light.componentBgHover}",
105
+ "$description": "Secondary quiet-fill hover in light mode.",
106
+ "$extensions": {
107
+ "putio": {
108
+ "cssName": "button-secondary-bg-hover",
109
+ "mode": "light"
110
+ }
111
+ }
112
+ },
113
+ "backgroundHoverDark": {
114
+ "$type": "color",
115
+ "$value": "{color.neutral.dark.componentBgHover}",
116
+ "$description": "Secondary quiet-fill hover in dark mode.",
117
+ "$extensions": {
118
+ "putio": {
119
+ "cssName": "button-secondary-bg-hover",
120
+ "mode": "dark"
121
+ }
122
+ }
101
123
  }
102
124
  },
103
125
  "success": {
@@ -349,6 +371,275 @@
349
371
  }
350
372
  }
351
373
  }
374
+ },
375
+ "ghost": {
376
+ "background": {
377
+ "$type": "color",
378
+ "$value": "hsla(0, 0%, 0%, 0)",
379
+ "$description": "Ghost tier rests with no fill and no border.",
380
+ "$extensions": {
381
+ "putio": {
382
+ "cssName": "button-ghost-bg",
383
+ "mode": "global"
384
+ }
385
+ }
386
+ },
387
+ "foreground": {
388
+ "$type": "color",
389
+ "$value": "{color.neutral.light.textSecondary}",
390
+ "$description": "Ghost label at rest in light mode.",
391
+ "$extensions": {
392
+ "putio": {
393
+ "cssName": "button-ghost-fg",
394
+ "mode": "light"
395
+ }
396
+ }
397
+ },
398
+ "foregroundDark": {
399
+ "$type": "color",
400
+ "$value": "{color.neutral.dark.textSecondary}",
401
+ "$description": "Ghost label at rest in dark mode.",
402
+ "$extensions": {
403
+ "putio": {
404
+ "cssName": "button-ghost-fg",
405
+ "mode": "dark"
406
+ }
407
+ }
408
+ },
409
+ "foregroundHover": {
410
+ "$type": "color",
411
+ "$value": "{color.neutral.light.text}",
412
+ "$description": "Ghost label on hover in light mode. The lift is mandatory.",
413
+ "$extensions": {
414
+ "putio": {
415
+ "cssName": "button-ghost-fg-hover",
416
+ "mode": "light"
417
+ }
418
+ }
419
+ },
420
+ "foregroundHoverDark": {
421
+ "$type": "color",
422
+ "$value": "{color.neutral.dark.text}",
423
+ "$description": "Ghost label on hover in dark mode. The lift is mandatory.",
424
+ "$extensions": {
425
+ "putio": {
426
+ "cssName": "button-ghost-fg-hover",
427
+ "mode": "dark"
428
+ }
429
+ }
430
+ },
431
+ "backgroundHover": {
432
+ "$type": "color",
433
+ "$value": "{color.neutral.light.componentBgHover}",
434
+ "$description": "Shared quiet-fill hover step in light mode.",
435
+ "$extensions": {
436
+ "putio": {
437
+ "cssName": "button-ghost-bg-hover",
438
+ "mode": "light"
439
+ }
440
+ }
441
+ },
442
+ "backgroundHoverDark": {
443
+ "$type": "color",
444
+ "$value": "{color.neutral.dark.componentBgHover}",
445
+ "$description": "Shared quiet-fill hover step in dark mode.",
446
+ "$extensions": {
447
+ "putio": {
448
+ "cssName": "button-ghost-bg-hover",
449
+ "mode": "dark"
450
+ }
451
+ }
452
+ }
453
+ },
454
+ "height": {
455
+ "$type": "dimension",
456
+ "$value": "36px",
457
+ "$description": "Default (lg) button box.",
458
+ "$extensions": {
459
+ "putio": {
460
+ "cssName": "button-height",
461
+ "mode": "global"
462
+ }
463
+ }
464
+ },
465
+ "heightMd": {
466
+ "$type": "dimension",
467
+ "$value": "32px",
468
+ "$description": "Medium button box. The site top-bar CTA size.",
469
+ "$extensions": {
470
+ "putio": {
471
+ "cssName": "button-height-md",
472
+ "mode": "global"
473
+ }
474
+ }
475
+ },
476
+ "heightSm": {
477
+ "$type": "dimension",
478
+ "$value": "28px",
479
+ "$description": "Small button box.",
480
+ "$extensions": {
481
+ "putio": {
482
+ "cssName": "button-height-sm",
483
+ "mode": "global"
484
+ }
485
+ }
486
+ },
487
+ "heightXs": {
488
+ "$type": "dimension",
489
+ "$value": "24px",
490
+ "$description": "Extra-small button box.",
491
+ "$extensions": {
492
+ "putio": {
493
+ "cssName": "button-height-xs",
494
+ "mode": "global"
495
+ }
496
+ }
497
+ },
498
+ "paddingX": {
499
+ "$type": "dimension",
500
+ "$value": "12px",
501
+ "$description": "Horizontal padding for lg, md and sm.",
502
+ "$extensions": {
503
+ "putio": {
504
+ "cssName": "button-padding-x",
505
+ "mode": "global"
506
+ }
507
+ }
508
+ },
509
+ "paddingXXs": {
510
+ "$type": "dimension",
511
+ "$value": "8px",
512
+ "$description": "Horizontal padding at xs.",
513
+ "$extensions": {
514
+ "putio": {
515
+ "cssName": "button-padding-x-xs",
516
+ "mode": "global"
517
+ }
518
+ }
519
+ },
520
+ "labelSize": {
521
+ "$type": "dimension",
522
+ "$value": "{typography.fontSize.sm}",
523
+ "$description": "Uppercase label size.",
524
+ "$extensions": {
525
+ "putio": {
526
+ "cssName": "button-label-size",
527
+ "mode": "global"
528
+ }
529
+ }
530
+ },
531
+ "labelSizeXs": {
532
+ "$type": "dimension",
533
+ "$value": "{typography.fontSize.xs}",
534
+ "$description": "Uppercase label size at xs.",
535
+ "$extensions": {
536
+ "putio": {
537
+ "cssName": "button-label-size-xs",
538
+ "mode": "global"
539
+ }
540
+ }
541
+ },
542
+ "tracking": {
543
+ "$type": "dimension",
544
+ "$value": "1px",
545
+ "$description": "Letter-spacing at lg.",
546
+ "$extensions": {
547
+ "putio": {
548
+ "cssName": "button-tracking",
549
+ "mode": "global"
550
+ }
551
+ }
552
+ },
553
+ "trackingMd": {
554
+ "$type": "dimension",
555
+ "$value": "0.8px",
556
+ "$description": "Letter-spacing at md.",
557
+ "$extensions": {
558
+ "putio": {
559
+ "cssName": "button-tracking-md",
560
+ "mode": "global"
561
+ }
562
+ }
563
+ },
564
+ "trackingSm": {
565
+ "$type": "dimension",
566
+ "$value": "0.6px",
567
+ "$description": "Letter-spacing at sm.",
568
+ "$extensions": {
569
+ "putio": {
570
+ "cssName": "button-tracking-sm",
571
+ "mode": "global"
572
+ }
573
+ }
574
+ },
575
+ "trackingXs": {
576
+ "$type": "dimension",
577
+ "$value": "0.3px",
578
+ "$description": "Letter-spacing at xs.",
579
+ "$extensions": {
580
+ "putio": {
581
+ "cssName": "button-tracking-xs",
582
+ "mode": "global"
583
+ }
584
+ }
585
+ },
586
+ "iconSize": {
587
+ "$type": "dimension",
588
+ "$value": "14px",
589
+ "$description": "Glyph size inside a button.",
590
+ "$extensions": {
591
+ "putio": {
592
+ "cssName": "button-icon-size",
593
+ "mode": "global"
594
+ }
595
+ }
596
+ },
597
+ "gap": {
598
+ "$type": "dimension",
599
+ "$value": "8px",
600
+ "$description": "Gap between glyph and label.",
601
+ "$extensions": {
602
+ "putio": {
603
+ "cssName": "button-gap",
604
+ "mode": "global"
605
+ }
606
+ }
607
+ }
608
+ },
609
+ "nav": {
610
+ "$description": "Sticky site/marketing top bar. Colours live in semantic surface.*.nav*.",
611
+ "height": {
612
+ "$type": "dimension",
613
+ "$value": "56px",
614
+ "$description": "Sticky top bar height.",
615
+ "$extensions": {
616
+ "putio": {
617
+ "cssName": "nav-height",
618
+ "mode": "global"
619
+ }
620
+ }
621
+ },
622
+ "heightCompact": {
623
+ "$type": "dimension",
624
+ "$value": "52px",
625
+ "$description": "Sticky top bar height on narrow viewports.",
626
+ "$extensions": {
627
+ "putio": {
628
+ "cssName": "nav-height-compact",
629
+ "mode": "global"
630
+ }
631
+ }
632
+ },
633
+ "ctaHeight": {
634
+ "$type": "dimension",
635
+ "$value": "{component.button.heightMd}",
636
+ "$description": "The top-bar CTA box. Always the md button.",
637
+ "$extensions": {
638
+ "putio": {
639
+ "cssName": "nav-cta-height",
640
+ "mode": "global"
641
+ }
642
+ }
352
643
  }
353
644
  },
354
645
  "input": {
@@ -2203,7 +2494,7 @@
2203
2494
  "caption": {
2204
2495
  "$type": "dimension",
2205
2496
  "$value": "32px",
2206
- "$description": "text.caption · GTAmerica-Rg. Row subline and button icons. TV has no mono face — the size subline renders in GT America with tabular figures, so the Berkeley Mono numeric rule is web and mobile only.",
2497
+ "$description": "text.caption · GTAmerica-Rg. Row subline and button icons. TV has no mono face, so the Berkeley Mono numeric rule is web and mobile only: the size subline renders in GT America, asking for its tnum tabular figures where the platform can select OpenType features and accepting proportional figures where it cannot.",
2207
2498
  "$extensions": {
2208
2499
  "putio": {
2209
2500
  "cssName": "tv-text-caption",