@putdotio/design 1.5.1 → 2.0.1

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
@@ -104,7 +104,15 @@ TV is the exception: every 10-foot surface — list rows, buttons, sheets, cards
104
104
 
105
105
  ## Components
106
106
 
107
- 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.
108
116
 
109
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.
110
118
 
@@ -112,7 +120,7 @@ TV components are list-first and focus-first. A TV app is still a file browser,
112
120
 
113
121
  TV surfaces are solid token colors — no translucent materials and no blur. Focus is expressed as a fill, never a lift: rows go transparent to `--component-bg-active`, and buttons step both their fill and their border. Navigation is a Home hub that pushes full screens onto a stack; there is no tab bar. Menus are centred modals, not popovers anchored to a trigger.
114
122
 
115
- The 10-foot scale lives in the `tv` token group — type steps, spacing ramp, overscan ratios, radius, and z-indices — carried as data for platform adapters rather than emitted into web CSS. Overscan ratios declare their viewport axis: multiply `tv.overscan.x` by viewport width and `tv.overscan.y` by viewport height, then compose screen padding locally with the spacing tokens. Two rules do not cross over: TV has no mono face, and TV stacks `--tv-z-overlay` above `--tv-z-toast`, the reverse of the web `--z-*` order. Emit the two scales separately.
123
+ The 10-foot scale lives in the `tv` token group — type steps, spacing ramp, overscan ratios, radius, and z-indices — carried as data for platform adapters rather than emitted into web CSS. Overscan ratios declare their viewport axis: multiply `tv.overscan.x` by viewport width and `tv.overscan.y` by viewport height, then compose screen padding locally with the spacing tokens. Two rules do not cross over: TV has no mono face, and TV stacks `tv.z.overlay` above `tv.z.toast`, the reverse of the web `--z-*` order. Emit the two scales separately. Cite the `tv` group by its graph path, never as `--tv-*`: those names are read from the DTCG artifacts by platform adapters and are deliberately absent from `dist/css/tokens.css`, so CSS-variable syntax would promise a `var()` that resolves to nothing.
116
124
 
117
125
  ## Do's and Don'ts
118
126
 
@@ -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": {