@putdotio/design 3.8.0 → 3.10.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
@@ -89,7 +89,7 @@ Tier 1, 3, and 4 cards are Components (put.io owns the recipe); tier 2 cards are
89
89
  - Berkeley Mono is the one mono face: numerics, timestamps, sizes, ETAs, counts, code, logs, identifiers, hashes, magnet URIs, filenames. Columns of numbers add `font-variant-numeric: tabular-nums`.
90
90
  - TV product UI has no mono face (a debug overlay may use the platform's system monospace): 10-foot numerics use GT America `tnum`. Platforms without OpenType feature selection (Roku: `Font` takes only `uri` and `size`) get proportional figures, so budget timecodes for reflow (`1` is 399/1000 em, `0` is 636).
91
91
  - GT America is Latin only (523 codepoints, Western and Central European plus Turkish, no dingbats such as `✓` `▶` `★`). Symbols are icons. Text that can hold a filename keeps a fallback family; web falls back per glyph, while one-font-per-label platforms must ship a fallback or render `.notdef` boxes.
92
- - Root font-size is 14px, 15px from `--bp-lg`. Body, labels, inputs: `--fs-base`. Captions, button labels: `--fs-sm`. `--fs-2xl`, `--fs-3xl`, `--fs-display` are fixed pixels.
92
+ - Root font-size is 14px, 15px from `--bp-lg`. Body, labels, inputs: `--fs-base`. Captions, button labels: `--fs-sm`. Screen titles and one-time-code digits: `--fs-title`, the fixed-pixel sibling of H2's `--fs-lg`, which scales with the root. Titles sit on a 30px line with `--tracking-snug`; the code separator is 18px. `--fs-title`, `--fs-2xl`, `--fs-3xl`, `--fs-display` are fixed pixels.
93
93
 
94
94
  ## Layout & Spacing
95
95
 
@@ -126,7 +126,7 @@ Default radius `6px`; `4px` for tight controls, `8px` or `10px` for panels, pill
126
126
  ### Rows, fields, and panels
127
127
 
128
128
  - File rows are the core component: raw names, compact metadata, obvious hover and focus at the same row height.
129
- - Fields read `--field-bg`, `--field-border`, and `--field-ring` (focus). `aria-invalid="true"` turns border and text red; the fill stays.
129
+ - Fields read `--field-bg`, `--field-border`, and `--field-ring` (focus). They are filled: `--bg-secondary` on a `--line` border, so they read on the page as well as in panels. Hover steps the border to `--border-hover`; focus steps it to `--solid-hover` with a matching 1px ring, at least 3:1 against the fill, the page, and panels in both modes (WCAG 1.4.11). Disabled fields take `--component-bg`. `--bg-secondary` is the field fill, so fields never sit on it. `aria-invalid="true"` turns border and text red; the fill stays.
130
130
  - Raised panels read `--panel-*`.
131
131
  - Feedback uses `.form-callout`: `--alert-*` colours, `data-state` `info`, `success`, or `error`; `.inline` drops surface and border. It holds a message only. `.form-group` (`6px` gap) spaces a control and its feedback.
132
132
  - Every field and form error eases in through `.form-reveal`: `grid-template-rows` `0fr` to `1fr` plus opacity, over `--dur-reveal` (`180ms`) with `--ease-out`, so whatever sits below slides instead of jumping. A field error sits under its field inside `.form-group`, where the row absorbs the group gap; a form error sits above the submit button. `data-state="open"` shows it. Keep the `role="alert"` message mounted and rendered; empty it once a closed row has collapsed. An `aria-invalid` field or code fades its border red over the same `--dur-reveal`. Under `prefers-reduced-motion` nothing animates.
@@ -137,8 +137,8 @@ Default radius `6px`; `4px` for tight controls, `8px` or `10px` for panels, pill
137
137
  - The logo sits top-left in the header, in a `30.33px` box (26px ink × 7/6). The top right stays empty by default.
138
138
  - One left-aligned column, up to `340px`, is centred horizontally and vertically.
139
139
  - A quiet centred footer links Terms of Service, Privacy Policy, and Help in muted `--fs-sm`.
140
- - One title per screen: `22px`, medium, `-0.01em` tracking. No subtitles, taglines, or marketing lines; copy stays short.
141
- - Fields are filled: the page points `--field-bg` at `--bg-secondary` and `--field-border` at `--line`. Fields and buttons in the column are `44px`.
140
+ - One title per screen: `--fs-title` (`22px`), medium, `--tracking-snug` (`-0.01em`). No subtitles, taglines, or marketing lines; copy stays short.
141
+ - Fields are the standard filled field. Fields and buttons in the column are `44px`.
142
142
  - Labels are small, muted, and above the field.
143
143
  - The primary button is full-width yellow. Secondary actions sit under the form as muted text links: “Forgot password?”, “New to put.io? Sign up”, “Wrong account? Sign out”.
144
144
  - Tab order runs fields, submit, then secondary links; DOM order follows visual order, with no positive `tabindex`. Two-factor runs the code, Verify, then its links. The reveal-password toggle takes `tabindex="-1"` and keeps its accessible name: keyboard-only users can't toggle visibility, screen-reader users still can in browse mode. No link leaves the tab order.
@@ -25,21 +25,21 @@
25
25
  --button-ghost-fg: hsl(0, 0%, 43.5%);
26
26
  --button-ghost-fg-hover: hsl(0, 0%, 9.0%);
27
27
  --button-ghost-bg-hover: hsl(0, 0%, 93.0%);
28
- --input-bg: hsl(0, 0%, 100%); /* deprecated: use --field-bg */
29
- --input-border: hsl(0, 0%, 85.8%); /* deprecated: use --field-border */
28
+ --input-bg: hsl(0, 0%, 97.3%); /* deprecated: use --field-bg */
29
+ --input-border: hsl(0, 0%, 88.7%); /* deprecated: use --field-border */
30
30
  --input-border-hover: hsl(0, 0%, 78.0%); /* deprecated: use --field-border-hover */
31
- --input-border-focus: hsl(0, 0%, 78.0%); /* deprecated: use --field-border-focus */
32
- --input-ring: 0 0 0 1px hsl(0, 0%, 78.0%); /* deprecated: use --field-ring */
31
+ --input-border-focus: hsl(0, 0%, 52.3%); /* deprecated: use --field-border-focus */
32
+ --input-ring: 0 0 0 1px hsl(0, 0%, 52.3%); /* deprecated: use --field-ring */
33
33
  --input-text: hsl(0, 0%, 9.0%); /* deprecated: use --field-text */
34
34
  --input-placeholder: hsl(0, 0%, 43.5%); /* deprecated: use --field-placeholder */
35
- --field-bg: hsl(0, 0%, 100%);
36
- --field-bg-disabled: hsl(0, 0%, 97.3%);
37
- --field-border: hsl(0, 0%, 85.8%);
35
+ --field-bg: hsl(0, 0%, 97.3%);
36
+ --field-bg-disabled: hsl(0, 0%, 95.1%);
37
+ --field-border: hsl(0, 0%, 88.7%);
38
38
  --field-border-hover: hsl(0, 0%, 78.0%);
39
- --field-border-focus: hsl(0, 0%, 78.0%);
39
+ --field-border-focus: hsl(0, 0%, 52.3%);
40
40
  --field-text: hsl(0, 0%, 9.0%);
41
41
  --field-placeholder: hsl(0, 0%, 43.5%);
42
- --field-ring: 0 0 0 1px hsl(0, 0%, 78.0%);
42
+ --field-ring: 0 0 0 1px hsl(0, 0%, 52.3%);
43
43
  --panel-bg: hsl(0, 0%, 95.1%);
44
44
  --panel-border: hsl(0, 0%, 88.7%);
45
45
  --panel-shadow: 0 4px 12px hsla(0, 0%, 0%, 0.08);
@@ -58,7 +58,7 @@
58
58
  --card-foreground: hsl(0, 0%, 9.0%);
59
59
  --popover: hsl(0, 0%, 95.1%);
60
60
  --popover-foreground: hsl(0, 0%, 9.0%);
61
- --input: hsl(0, 0%, 85.8%);
61
+ --input: hsl(0, 0%, 88.7%);
62
62
  --file-row-bg: hsla(0, 0%, 0%, 0);
63
63
  --file-row-bg-hover: hsl(0, 0%, 97.3%);
64
64
  --file-row-bg-active: hsl(0, 0%, 97.3%);
@@ -265,6 +265,7 @@
265
265
  --fs-base: 1rem;
266
266
  --fs-md: 1.125rem;
267
267
  --fs-lg: 1.5rem;
268
+ --fs-title: 22px;
268
269
  --fs-xl: 2rem;
269
270
  --fs-2xl: 48px;
270
271
  --fs-3xl: 64px;
@@ -279,6 +280,7 @@
279
280
  --fw-bold: 700;
280
281
  --fw-black: 900;
281
282
  --tracking-tight: -0.02em;
283
+ --tracking-snug: -0.01em;
282
284
  --tracking-normal: 0;
283
285
  --tracking-wide: 0.02em;
284
286
  --tracking-uppercase: 0.08em;
@@ -333,21 +335,21 @@
333
335
  --button-ghost-fg: hsl(0, 0%, 62.8%);
334
336
  --button-ghost-fg-hover: hsl(0, 0%, 93.0%);
335
337
  --button-ghost-bg-hover: hsl(0, 0%, 15.8%);
336
- --input-bg: hsl(0, 0%, 8.5%); /* deprecated: use --field-bg */
337
- --input-border: hsl(0, 0%, 24.3%); /* deprecated: use --field-border */
338
+ --input-bg: hsl(0, 0%, 11.0%); /* deprecated: use --field-bg */
339
+ --input-border: hsl(0, 0%, 20.5%); /* deprecated: use --field-border */
338
340
  --input-border-hover: hsl(0, 0%, 31.2%); /* deprecated: use --field-border-hover */
339
- --input-border-focus: hsl(0, 0%, 31.2%); /* deprecated: use --field-border-focus */
340
- --input-ring: 0 0 0 1px hsl(0, 0%, 31.2%); /* deprecated: use --field-ring */
341
+ --input-border-focus: hsl(0, 0%, 49.4%); /* deprecated: use --field-border-focus */
342
+ --input-ring: 0 0 0 1px hsl(0, 0%, 49.4%); /* deprecated: use --field-ring */
341
343
  --input-text: hsl(0, 0%, 93.0%); /* deprecated: use --field-text */
342
344
  --input-placeholder: hsl(0, 0%, 62.8%); /* deprecated: use --field-placeholder */
343
- --field-bg: hsl(0, 0%, 8.5%);
344
- --field-bg-disabled: hsl(0, 0%, 11.0%);
345
- --field-border: hsl(0, 0%, 24.3%);
345
+ --field-bg: hsl(0, 0%, 11.0%);
346
+ --field-bg-disabled: hsl(0, 0%, 13.6%);
347
+ --field-border: hsl(0, 0%, 20.5%);
346
348
  --field-border-hover: hsl(0, 0%, 31.2%);
347
- --field-border-focus: hsl(0, 0%, 31.2%);
349
+ --field-border-focus: hsl(0, 0%, 49.4%);
348
350
  --field-text: hsl(0, 0%, 93.0%);
349
351
  --field-placeholder: hsl(0, 0%, 62.8%);
350
- --field-ring: 0 0 0 1px hsl(0, 0%, 31.2%);
352
+ --field-ring: 0 0 0 1px hsl(0, 0%, 49.4%);
351
353
  --panel-bg: hsl(0, 0%, 13.6%);
352
354
  --panel-border: hsl(0, 0%, 20.5%);
353
355
  --panel-shadow: 0 4px 12px hsla(0, 0%, 0%, 0.5);
@@ -366,7 +368,7 @@
366
368
  --card-foreground: hsl(0, 0%, 93.0%);
367
369
  --popover: hsl(0, 0%, 13.6%);
368
370
  --popover-foreground: hsl(0, 0%, 93.0%);
369
- --input: hsl(0, 0%, 24.3%);
371
+ --input: hsl(0, 0%, 20.5%);
370
372
  --file-row-bg: hsla(0, 0%, 0%, 0);
371
373
  --file-row-bg-hover: hsl(0, 0%, 11.0%);
372
374
  --file-row-bg-active: hsl(0, 0%, 11.0%);
@@ -218,12 +218,12 @@
218
218
  "input": {
219
219
  "background": {
220
220
  "$type": "color",
221
- "$value": "hsl(0, 0%, 100%)",
221
+ "$value": "hsl(0, 0%, 97.3%)",
222
222
  "$description": "Deprecated alias. Use --field-bg (component.field.background)."
223
223
  },
224
224
  "border": {
225
225
  "$type": "color",
226
- "$value": "hsl(0, 0%, 85.8%)",
226
+ "$value": "hsl(0, 0%, 88.7%)",
227
227
  "$description": "Deprecated alias. Use --field-border (component.field.border)."
228
228
  },
229
229
  "radius": {
@@ -238,7 +238,7 @@
238
238
  },
239
239
  "borderFocus": {
240
240
  "$type": "color",
241
- "$value": "hsl(0, 0%, 78.0%)",
241
+ "$value": "hsl(0, 0%, 52.3%)",
242
242
  "$description": "Deprecated alias. Use --field-border-focus (component.field.borderFocus)."
243
243
  },
244
244
  "text": {
@@ -912,6 +912,11 @@
912
912
  "$value": "1.5rem",
913
913
  "$description": "Heading."
914
914
  },
915
+ "title": {
916
+ "$type": "dimension",
917
+ "$value": "22px",
918
+ "$description": "Screen titles and one-time-code digits. The fixed-pixel sibling of fontSize.lg (H2), which scales with the root."
919
+ },
915
920
  "xl": {
916
921
  "$type": "dimension",
917
922
  "$value": "2rem",
@@ -979,6 +984,11 @@
979
984
  "$type": "dimension",
980
985
  "$value": "-0.02em"
981
986
  },
987
+ "snug": {
988
+ "$type": "dimension",
989
+ "$value": "-0.01em",
990
+ "$description": "Slight negative tracking for screen titles."
991
+ },
982
992
  "normal": {
983
993
  "$type": "number",
984
994
  "$value": "0"
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.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.notification.badgeBackground" | "component.notification.badgeForeground" | "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" | "component.avatar.yellow" | "component.avatar.green" | "component.avatar.red" | "component.avatar.blue" | "component.avatar.purple" | "component.avatar.teal" | "component.avatar.orange" | "component.avatar.foreground" | "component.avatar.foregroundWarm" | "component.alert.radius" | "component.alert.infoBackground" | "component.alert.infoBackgroundDark" | "component.alert.infoBorder" | "component.alert.infoBorderDark" | "component.alert.infoText" | "component.alert.infoTextDark" | "component.alert.infoBody" | "component.alert.infoBodyDark" | "component.alert.infoIcon" | "component.alert.infoIconDark" | "component.alert.brandBackground" | "component.alert.brandBackgroundDark" | "component.alert.brandBorder" | "component.alert.brandBorderDark" | "component.alert.brandText" | "component.alert.brandTextDark" | "component.alert.brandBody" | "component.alert.brandBodyDark" | "component.alert.brandIcon" | "component.alert.brandIconDark" | "component.alert.successBackground" | "component.alert.successBackgroundDark" | "component.alert.successBorder" | "component.alert.successBorderDark" | "component.alert.successText" | "component.alert.successTextDark" | "component.alert.successBody" | "component.alert.successBodyDark" | "component.alert.successIcon" | "component.alert.successIconDark" | "component.alert.dangerBackground" | "component.alert.dangerBackgroundDark" | "component.alert.dangerBorder" | "component.alert.dangerBorderDark" | "component.alert.dangerText" | "component.alert.dangerTextDark" | "component.alert.dangerBody" | "component.alert.dangerBodyDark" | "component.alert.dangerIcon" | "component.alert.dangerIconDark" | "component.slider.track" | "component.slider.trackDark" | "component.slider.buffer" | "component.slider.bufferDark" | "component.slider.fill" | "component.slider.knob" | "component.slider.fillDisabled" | "component.slider.fillDisabledDark" | "component.slider.trackHeight" | "component.slider.knobSize" | "component.slider.hitHeight" | "component.pagination.itemSize" | "component.pagination.itemText" | "component.pagination.itemTextDark" | "component.pagination.itemTextActive" | "component.pagination.itemTextActiveDark" | "component.pagination.itemBackgroundHover" | "component.pagination.itemBackgroundHoverDark" | "component.pagination.itemBackgroundActive" | "component.pagination.itemBackgroundActiveDark" | "component.pagination.itemBorderActive" | "component.pagination.itemBorderActiveDark" | "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.nightly.background" | "context.tv.channelArt.nightly.accent" | "context.tv.channelArt.nightly.star" | "context.tv.channelArt.nightly.moon" | "context.tv.channelArt.nightly.moonCrater" | "context.tv.channelArt.lab.background" | "context.tv.channelArt.lab.foreground" | "context.tv.channelArt.lab.accent" | "tv.video.background" | "tv.video.heroScrimTop" | "tv.video.heroScrimBottom" | "tv.video.textOnVideo" | "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.focus.borderWidth" | "tv.focus.row.background" | "tv.focus.row.backgroundFocused" | "tv.focus.control.background" | "tv.focus.control.backgroundFocused" | "tv.focus.control.border" | "tv.focus.control.borderFocused" | "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" | "elevation.focusDark" | "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.reveal" | "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.notification.badgeBackground" | "component.notification.badgeForeground" | "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" | "component.avatar.yellow" | "component.avatar.green" | "component.avatar.red" | "component.avatar.blue" | "component.avatar.purple" | "component.avatar.teal" | "component.avatar.orange" | "component.avatar.foreground" | "component.avatar.foregroundWarm" | "component.alert.radius" | "component.alert.infoBackground" | "component.alert.infoBackgroundDark" | "component.alert.infoBorder" | "component.alert.infoBorderDark" | "component.alert.infoText" | "component.alert.infoTextDark" | "component.alert.infoBody" | "component.alert.infoBodyDark" | "component.alert.infoIcon" | "component.alert.infoIconDark" | "component.alert.brandBackground" | "component.alert.brandBackgroundDark" | "component.alert.brandBorder" | "component.alert.brandBorderDark" | "component.alert.brandText" | "component.alert.brandTextDark" | "component.alert.brandBody" | "component.alert.brandBodyDark" | "component.alert.brandIcon" | "component.alert.brandIconDark" | "component.alert.successBackground" | "component.alert.successBackgroundDark" | "component.alert.successBorder" | "component.alert.successBorderDark" | "component.alert.successText" | "component.alert.successTextDark" | "component.alert.successBody" | "component.alert.successBodyDark" | "component.alert.successIcon" | "component.alert.successIconDark" | "component.alert.dangerBackground" | "component.alert.dangerBackgroundDark" | "component.alert.dangerBorder" | "component.alert.dangerBorderDark" | "component.alert.dangerText" | "component.alert.dangerTextDark" | "component.alert.dangerBody" | "component.alert.dangerBodyDark" | "component.alert.dangerIcon" | "component.alert.dangerIconDark" | "component.slider.track" | "component.slider.trackDark" | "component.slider.buffer" | "component.slider.bufferDark" | "component.slider.fill" | "component.slider.knob" | "component.slider.fillDisabled" | "component.slider.fillDisabledDark" | "component.slider.trackHeight" | "component.slider.knobSize" | "component.slider.hitHeight" | "component.pagination.itemSize" | "component.pagination.itemText" | "component.pagination.itemTextDark" | "component.pagination.itemTextActive" | "component.pagination.itemTextActiveDark" | "component.pagination.itemBackgroundHover" | "component.pagination.itemBackgroundHoverDark" | "component.pagination.itemBackgroundActive" | "component.pagination.itemBackgroundActiveDark" | "component.pagination.itemBorderActive" | "component.pagination.itemBorderActiveDark" | "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.nightly.background" | "context.tv.channelArt.nightly.accent" | "context.tv.channelArt.nightly.star" | "context.tv.channelArt.nightly.moon" | "context.tv.channelArt.nightly.moonCrater" | "context.tv.channelArt.lab.background" | "context.tv.channelArt.lab.foreground" | "context.tv.channelArt.lab.accent" | "tv.video.background" | "tv.video.heroScrimTop" | "tv.video.heroScrimBottom" | "tv.video.textOnVideo" | "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.focus.borderWidth" | "tv.focus.row.background" | "tv.focus.row.backgroundFocused" | "tv.focus.control.background" | "tv.focus.control.backgroundFocused" | "tv.focus.control.border" | "tv.focus.control.borderFocused" | "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" | "elevation.focusDark" | "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.title" | "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.snug" | "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.reveal" | "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;
@@ -828,8 +828,8 @@
828
828
  "field": {
829
829
  "background": {
830
830
  "$type": "color",
831
- "$value": "{surface.light.appBg}",
832
- "$description": "Form-control fill. Fields stay on the app background surface, even inside a raised panel.",
831
+ "$value": "{color.neutral.light.bgSecondary}",
832
+ "$description": "Form-control fill. Fields are filled so they read on the page background as well as inside panels.",
833
833
  "$extensions": {
834
834
  "putio": {
835
835
  "cssName": "field-bg",
@@ -840,7 +840,7 @@
840
840
  },
841
841
  "backgroundDark": {
842
842
  "$type": "color",
843
- "$value": "{surface.dark.appBg}",
843
+ "$value": "{color.neutral.dark.bgSecondary}",
844
844
  "$description": "Dark-mode form-control fill.",
845
845
  "$extensions": {
846
846
  "putio": {
@@ -852,8 +852,8 @@
852
852
  },
853
853
  "backgroundDisabled": {
854
854
  "$type": "color",
855
- "$value": "{color.neutral.light.bgSecondary}",
856
- "$description": "Disabled form-control fill.",
855
+ "$value": "{color.neutral.light.componentBg}",
856
+ "$description": "Disabled form-control fill, a step off the resting fill.",
857
857
  "$extensions": {
858
858
  "putio": {
859
859
  "cssName": "field-bg-disabled",
@@ -864,7 +864,7 @@
864
864
  },
865
865
  "backgroundDisabledDark": {
866
866
  "$type": "color",
867
- "$value": "{color.neutral.dark.bgSecondary}",
867
+ "$value": "{color.neutral.dark.componentBg}",
868
868
  "$description": "Dark-mode disabled form-control fill.",
869
869
  "$extensions": {
870
870
  "putio": {
@@ -876,7 +876,7 @@
876
876
  },
877
877
  "border": {
878
878
  "$type": "color",
879
- "$value": "{color.neutral.light.border}",
879
+ "$value": "{color.neutral.light.line}",
880
880
  "$description": "Resting form-control border.",
881
881
  "$extensions": {
882
882
  "putio": {
@@ -888,7 +888,7 @@
888
888
  },
889
889
  "borderDark": {
890
890
  "$type": "color",
891
- "$value": "{color.neutral.dark.border}",
891
+ "$value": "{color.neutral.dark.line}",
892
892
  "$description": "Dark-mode resting form-control border.",
893
893
  "$extensions": {
894
894
  "putio": {
@@ -924,8 +924,8 @@
924
924
  },
925
925
  "borderFocus": {
926
926
  "$type": "color",
927
- "$value": "{color.neutral.light.borderHover}",
928
- "$description": "Focused form-control border. Focus matches hover and does not use the yellow focus shadow.",
927
+ "$value": "{color.neutral.light.solidHover}",
928
+ "$description": "Focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels. Does not use the yellow focus shadow.",
929
929
  "$extensions": {
930
930
  "putio": {
931
931
  "cssName": "field-border-focus",
@@ -936,8 +936,8 @@
936
936
  },
937
937
  "borderFocusDark": {
938
938
  "$type": "color",
939
- "$value": "{color.neutral.dark.borderHover}",
940
- "$description": "Dark-mode focused form-control border. Focus matches hover and does not use the yellow focus shadow.",
939
+ "$value": "{color.neutral.dark.solidHover}",
940
+ "$description": "Dark-mode focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels.",
941
941
  "$extensions": {
942
942
  "putio": {
943
943
  "cssName": "field-border-focus",
@@ -1008,8 +1008,8 @@
1008
1008
  },
1009
1009
  "ring": {
1010
1010
  "$type": "string",
1011
- "$value": "0 0 0 1px {color.neutral.light.borderHover}",
1012
- "$description": "Quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus.",
1011
+ "$value": "0 0 0 1px {color.neutral.light.solidHover}",
1012
+ "$description": "Quiet field focus ring in the focus border colour. Buttons, links, and nav focus with --shadow-focus instead.",
1013
1013
  "$extensions": {
1014
1014
  "putio": {
1015
1015
  "cssName": "field-ring",
@@ -1020,8 +1020,8 @@
1020
1020
  },
1021
1021
  "ringDark": {
1022
1022
  "$type": "string",
1023
- "$value": "0 0 0 1px {color.neutral.dark.borderHover}",
1024
- "$description": "Dark-mode quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus.",
1023
+ "$value": "0 0 0 1px {color.neutral.dark.solidHover}",
1024
+ "$description": "Dark-mode quiet field focus ring. Buttons, links, and nav focus with --shadow-focus instead.",
1025
1025
  "$extensions": {
1026
1026
  "putio": {
1027
1027
  "cssName": "field-ring",
@@ -1500,7 +1500,7 @@
1500
1500
  },
1501
1501
  "input": {
1502
1502
  "$type": "color",
1503
- "$value": "{color.neutral.light.border}",
1503
+ "$value": "{component.field.border}",
1504
1504
  "$extensions": {
1505
1505
  "putio": {
1506
1506
  "cssName": "input",
@@ -1511,7 +1511,7 @@
1511
1511
  },
1512
1512
  "inputDark": {
1513
1513
  "$type": "color",
1514
- "$value": "{color.neutral.dark.border}",
1514
+ "$value": "{component.field.borderDark}",
1515
1515
  "$extensions": {
1516
1516
  "putio": {
1517
1517
  "cssName": "input",
@@ -4866,6 +4866,18 @@
4866
4866
  }
4867
4867
  }
4868
4868
  },
4869
+ "title": {
4870
+ "$type": "dimension",
4871
+ "$value": "22px",
4872
+ "$description": "Screen titles and one-time-code digits. The fixed-pixel sibling of fontSize.lg (H2), which scales with the root.",
4873
+ "$extensions": {
4874
+ "putio": {
4875
+ "cssName": "fs-title",
4876
+ "mode": "global",
4877
+ "figma": true
4878
+ }
4879
+ }
4880
+ },
4869
4881
  "xl": {
4870
4882
  "$type": "dimension",
4871
4883
  "$value": "2rem",
@@ -5031,6 +5043,18 @@
5031
5043
  }
5032
5044
  }
5033
5045
  },
5046
+ "snug": {
5047
+ "$type": "dimension",
5048
+ "$value": "-0.01em",
5049
+ "$description": "Slight negative tracking for screen titles.",
5050
+ "$extensions": {
5051
+ "putio": {
5052
+ "cssName": "tracking-snug",
5053
+ "mode": "global",
5054
+ "figma": true
5055
+ }
5056
+ }
5057
+ },
5034
5058
  "normal": {
5035
5059
  "$type": "number",
5036
5060
  "$value": "0",
@@ -454,7 +454,7 @@
454
454
  "cssName": "--input-bg",
455
455
  "type": "color",
456
456
  "mode": "light",
457
- "value": "hsl(0, 0%, 100%)",
457
+ "value": "hsl(0, 0%, 97.3%)",
458
458
  "originalValue": "{component.field.background}",
459
459
  "description": "Deprecated alias. Use --field-bg (component.field.background).",
460
460
  "deprecated": true
@@ -463,7 +463,7 @@
463
463
  "cssName": "--input-bg",
464
464
  "type": "color",
465
465
  "mode": "dark",
466
- "value": "hsl(0, 0%, 8.5%)",
466
+ "value": "hsl(0, 0%, 11.0%)",
467
467
  "originalValue": "{component.field.backgroundDark}",
468
468
  "description": "Deprecated alias. Use --field-bg (component.field.backgroundDark).",
469
469
  "deprecated": true
@@ -472,7 +472,7 @@
472
472
  "cssName": "--input-border",
473
473
  "type": "color",
474
474
  "mode": "light",
475
- "value": "hsl(0, 0%, 85.8%)",
475
+ "value": "hsl(0, 0%, 88.7%)",
476
476
  "originalValue": "{component.field.border}",
477
477
  "description": "Deprecated alias. Use --field-border (component.field.border).",
478
478
  "deprecated": true
@@ -481,7 +481,7 @@
481
481
  "cssName": "--input-border",
482
482
  "type": "color",
483
483
  "mode": "dark",
484
- "value": "hsl(0, 0%, 24.3%)",
484
+ "value": "hsl(0, 0%, 20.5%)",
485
485
  "originalValue": "{component.field.borderDark}",
486
486
  "description": "Deprecated alias. Use --field-border (component.field.borderDark).",
487
487
  "deprecated": true
@@ -517,7 +517,7 @@
517
517
  "cssName": "--input-border-focus",
518
518
  "type": "color",
519
519
  "mode": "light",
520
- "value": "hsl(0, 0%, 78.0%)",
520
+ "value": "hsl(0, 0%, 52.3%)",
521
521
  "originalValue": "{component.field.borderFocus}",
522
522
  "description": "Deprecated alias. Use --field-border-focus (component.field.borderFocus).",
523
523
  "deprecated": true
@@ -526,7 +526,7 @@
526
526
  "cssName": "--input-border-focus",
527
527
  "type": "color",
528
528
  "mode": "dark",
529
- "value": "hsl(0, 0%, 31.2%)",
529
+ "value": "hsl(0, 0%, 49.4%)",
530
530
  "originalValue": "{component.field.borderFocusDark}",
531
531
  "description": "Deprecated alias. Use --field-border-focus (component.field.borderFocusDark).",
532
532
  "deprecated": true
@@ -535,7 +535,7 @@
535
535
  "cssName": "--input-ring",
536
536
  "type": "string",
537
537
  "mode": "light",
538
- "value": "0 0 0 1px hsl(0, 0%, 78.0%)",
538
+ "value": "0 0 0 1px hsl(0, 0%, 52.3%)",
539
539
  "originalValue": "{component.field.ring}",
540
540
  "description": "Deprecated alias. Use --field-ring (component.field.ring).",
541
541
  "deprecated": true
@@ -544,7 +544,7 @@
544
544
  "cssName": "--input-ring",
545
545
  "type": "string",
546
546
  "mode": "dark",
547
- "value": "0 0 0 1px hsl(0, 0%, 31.2%)",
547
+ "value": "0 0 0 1px hsl(0, 0%, 49.4%)",
548
548
  "originalValue": "{component.field.ringDark}",
549
549
  "description": "Deprecated alias. Use --field-ring (component.field.ringDark).",
550
550
  "deprecated": true
@@ -589,48 +589,48 @@
589
589
  "cssName": "--field-bg",
590
590
  "type": "color",
591
591
  "mode": "light",
592
- "value": "hsl(0, 0%, 100%)",
593
- "originalValue": "{surface.light.appBg}",
594
- "description": "Form-control fill. Fields stay on the app background surface, even inside a raised panel."
592
+ "value": "hsl(0, 0%, 97.3%)",
593
+ "originalValue": "{color.neutral.light.bgSecondary}",
594
+ "description": "Form-control fill. Fields are filled so they read on the page background as well as inside panels."
595
595
  },
596
596
  "component.field.backgroundDark": {
597
597
  "cssName": "--field-bg",
598
598
  "type": "color",
599
599
  "mode": "dark",
600
- "value": "hsl(0, 0%, 8.5%)",
601
- "originalValue": "{surface.dark.appBg}",
600
+ "value": "hsl(0, 0%, 11.0%)",
601
+ "originalValue": "{color.neutral.dark.bgSecondary}",
602
602
  "description": "Dark-mode form-control fill."
603
603
  },
604
604
  "component.field.backgroundDisabled": {
605
605
  "cssName": "--field-bg-disabled",
606
606
  "type": "color",
607
607
  "mode": "light",
608
- "value": "hsl(0, 0%, 97.3%)",
609
- "originalValue": "{color.neutral.light.bgSecondary}",
610
- "description": "Disabled form-control fill."
608
+ "value": "hsl(0, 0%, 95.1%)",
609
+ "originalValue": "{color.neutral.light.componentBg}",
610
+ "description": "Disabled form-control fill, a step off the resting fill."
611
611
  },
612
612
  "component.field.backgroundDisabledDark": {
613
613
  "cssName": "--field-bg-disabled",
614
614
  "type": "color",
615
615
  "mode": "dark",
616
- "value": "hsl(0, 0%, 11.0%)",
617
- "originalValue": "{color.neutral.dark.bgSecondary}",
616
+ "value": "hsl(0, 0%, 13.6%)",
617
+ "originalValue": "{color.neutral.dark.componentBg}",
618
618
  "description": "Dark-mode disabled form-control fill."
619
619
  },
620
620
  "component.field.border": {
621
621
  "cssName": "--field-border",
622
622
  "type": "color",
623
623
  "mode": "light",
624
- "value": "hsl(0, 0%, 85.8%)",
625
- "originalValue": "{color.neutral.light.border}",
624
+ "value": "hsl(0, 0%, 88.7%)",
625
+ "originalValue": "{color.neutral.light.line}",
626
626
  "description": "Resting form-control border."
627
627
  },
628
628
  "component.field.borderDark": {
629
629
  "cssName": "--field-border",
630
630
  "type": "color",
631
631
  "mode": "dark",
632
- "value": "hsl(0, 0%, 24.3%)",
633
- "originalValue": "{color.neutral.dark.border}",
632
+ "value": "hsl(0, 0%, 20.5%)",
633
+ "originalValue": "{color.neutral.dark.line}",
634
634
  "description": "Dark-mode resting form-control border."
635
635
  },
636
636
  "component.field.borderHover": {
@@ -653,17 +653,17 @@
653
653
  "cssName": "--field-border-focus",
654
654
  "type": "color",
655
655
  "mode": "light",
656
- "value": "hsl(0, 0%, 78.0%)",
657
- "originalValue": "{color.neutral.light.borderHover}",
658
- "description": "Focused form-control border. Focus matches hover and does not use the yellow focus shadow."
656
+ "value": "hsl(0, 0%, 52.3%)",
657
+ "originalValue": "{color.neutral.light.solidHover}",
658
+ "description": "Focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels. Does not use the yellow focus shadow."
659
659
  },
660
660
  "component.field.borderFocusDark": {
661
661
  "cssName": "--field-border-focus",
662
662
  "type": "color",
663
663
  "mode": "dark",
664
- "value": "hsl(0, 0%, 31.2%)",
665
- "originalValue": "{color.neutral.dark.borderHover}",
666
- "description": "Dark-mode focused form-control border. Focus matches hover and does not use the yellow focus shadow."
664
+ "value": "hsl(0, 0%, 49.4%)",
665
+ "originalValue": "{color.neutral.dark.solidHover}",
666
+ "description": "Dark-mode focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels."
667
667
  },
668
668
  "component.field.text": {
669
669
  "cssName": "--field-text",
@@ -709,17 +709,17 @@
709
709
  "cssName": "--field-ring",
710
710
  "type": "string",
711
711
  "mode": "light",
712
- "value": "0 0 0 1px hsl(0, 0%, 78.0%)",
713
- "originalValue": "0 0 0 1px {color.neutral.light.borderHover}",
714
- "description": "Quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus."
712
+ "value": "0 0 0 1px hsl(0, 0%, 52.3%)",
713
+ "originalValue": "0 0 0 1px {color.neutral.light.solidHover}",
714
+ "description": "Quiet field focus ring in the focus border colour. Buttons, links, and nav focus with --shadow-focus instead."
715
715
  },
716
716
  "component.field.ringDark": {
717
717
  "cssName": "--field-ring",
718
718
  "type": "string",
719
719
  "mode": "dark",
720
- "value": "0 0 0 1px hsl(0, 0%, 31.2%)",
721
- "originalValue": "0 0 0 1px {color.neutral.dark.borderHover}",
722
- "description": "Dark-mode quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus."
720
+ "value": "0 0 0 1px hsl(0, 0%, 49.4%)",
721
+ "originalValue": "0 0 0 1px {color.neutral.dark.solidHover}",
722
+ "description": "Dark-mode quiet field focus ring. Buttons, links, and nav focus with --shadow-focus instead."
723
723
  },
724
724
  "component.panel.background": {
725
725
  "cssName": "--panel-bg",
@@ -1025,15 +1025,15 @@
1025
1025
  "cssName": "--input",
1026
1026
  "type": "color",
1027
1027
  "mode": "light",
1028
- "value": "hsl(0, 0%, 85.8%)",
1029
- "originalValue": "{color.neutral.light.border}"
1028
+ "value": "hsl(0, 0%, 88.7%)",
1029
+ "originalValue": "{component.field.border}"
1030
1030
  },
1031
1031
  "component.alias.inputDark": {
1032
1032
  "cssName": "--input",
1033
1033
  "type": "color",
1034
1034
  "mode": "dark",
1035
- "value": "hsl(0, 0%, 24.3%)",
1036
- "originalValue": "{color.neutral.dark.border}"
1035
+ "value": "hsl(0, 0%, 20.5%)",
1036
+ "originalValue": "{component.field.borderDark}"
1037
1037
  },
1038
1038
  "component.alias.ring": {
1039
1039
  "cssName": "--ring",
@@ -3308,6 +3308,14 @@
3308
3308
  "originalValue": "1.5rem",
3309
3309
  "description": "Heading."
3310
3310
  },
3311
+ "typography.fontSize.title": {
3312
+ "cssName": "--fs-title",
3313
+ "type": "dimension",
3314
+ "mode": "global",
3315
+ "value": "22px",
3316
+ "originalValue": "22px",
3317
+ "description": "Screen titles and one-time-code digits. The fixed-pixel sibling of fontSize.lg (H2), which scales with the root."
3318
+ },
3311
3319
  "typography.fontSize.xl": {
3312
3320
  "cssName": "--fs-xl",
3313
3321
  "type": "dimension",
@@ -3411,6 +3419,14 @@
3411
3419
  "value": "-0.02em",
3412
3420
  "originalValue": "-0.02em"
3413
3421
  },
3422
+ "typography.letterSpacing.snug": {
3423
+ "cssName": "--tracking-snug",
3424
+ "type": "dimension",
3425
+ "mode": "global",
3426
+ "value": "-0.01em",
3427
+ "originalValue": "-0.01em",
3428
+ "description": "Slight negative tracking for screen titles."
3429
+ },
3414
3430
  "typography.letterSpacing.normal": {
3415
3431
  "cssName": "--tracking-normal",
3416
3432
  "type": "number",
package/dist/tokens.js CHANGED
@@ -456,7 +456,7 @@ export const tokens = {
456
456
  "cssName": "--input-bg",
457
457
  "type": "color",
458
458
  "mode": "light",
459
- "value": "hsl(0, 0%, 100%)",
459
+ "value": "hsl(0, 0%, 97.3%)",
460
460
  "originalValue": "{component.field.background}",
461
461
  "description": "Deprecated alias. Use --field-bg (component.field.background).",
462
462
  "deprecated": true
@@ -465,7 +465,7 @@ export const tokens = {
465
465
  "cssName": "--input-bg",
466
466
  "type": "color",
467
467
  "mode": "dark",
468
- "value": "hsl(0, 0%, 8.5%)",
468
+ "value": "hsl(0, 0%, 11.0%)",
469
469
  "originalValue": "{component.field.backgroundDark}",
470
470
  "description": "Deprecated alias. Use --field-bg (component.field.backgroundDark).",
471
471
  "deprecated": true
@@ -474,7 +474,7 @@ export const tokens = {
474
474
  "cssName": "--input-border",
475
475
  "type": "color",
476
476
  "mode": "light",
477
- "value": "hsl(0, 0%, 85.8%)",
477
+ "value": "hsl(0, 0%, 88.7%)",
478
478
  "originalValue": "{component.field.border}",
479
479
  "description": "Deprecated alias. Use --field-border (component.field.border).",
480
480
  "deprecated": true
@@ -483,7 +483,7 @@ export const tokens = {
483
483
  "cssName": "--input-border",
484
484
  "type": "color",
485
485
  "mode": "dark",
486
- "value": "hsl(0, 0%, 24.3%)",
486
+ "value": "hsl(0, 0%, 20.5%)",
487
487
  "originalValue": "{component.field.borderDark}",
488
488
  "description": "Deprecated alias. Use --field-border (component.field.borderDark).",
489
489
  "deprecated": true
@@ -519,7 +519,7 @@ export const tokens = {
519
519
  "cssName": "--input-border-focus",
520
520
  "type": "color",
521
521
  "mode": "light",
522
- "value": "hsl(0, 0%, 78.0%)",
522
+ "value": "hsl(0, 0%, 52.3%)",
523
523
  "originalValue": "{component.field.borderFocus}",
524
524
  "description": "Deprecated alias. Use --field-border-focus (component.field.borderFocus).",
525
525
  "deprecated": true
@@ -528,7 +528,7 @@ export const tokens = {
528
528
  "cssName": "--input-border-focus",
529
529
  "type": "color",
530
530
  "mode": "dark",
531
- "value": "hsl(0, 0%, 31.2%)",
531
+ "value": "hsl(0, 0%, 49.4%)",
532
532
  "originalValue": "{component.field.borderFocusDark}",
533
533
  "description": "Deprecated alias. Use --field-border-focus (component.field.borderFocusDark).",
534
534
  "deprecated": true
@@ -537,7 +537,7 @@ export const tokens = {
537
537
  "cssName": "--input-ring",
538
538
  "type": "string",
539
539
  "mode": "light",
540
- "value": "0 0 0 1px hsl(0, 0%, 78.0%)",
540
+ "value": "0 0 0 1px hsl(0, 0%, 52.3%)",
541
541
  "originalValue": "{component.field.ring}",
542
542
  "description": "Deprecated alias. Use --field-ring (component.field.ring).",
543
543
  "deprecated": true
@@ -546,7 +546,7 @@ export const tokens = {
546
546
  "cssName": "--input-ring",
547
547
  "type": "string",
548
548
  "mode": "dark",
549
- "value": "0 0 0 1px hsl(0, 0%, 31.2%)",
549
+ "value": "0 0 0 1px hsl(0, 0%, 49.4%)",
550
550
  "originalValue": "{component.field.ringDark}",
551
551
  "description": "Deprecated alias. Use --field-ring (component.field.ringDark).",
552
552
  "deprecated": true
@@ -591,48 +591,48 @@ export const tokens = {
591
591
  "cssName": "--field-bg",
592
592
  "type": "color",
593
593
  "mode": "light",
594
- "value": "hsl(0, 0%, 100%)",
595
- "originalValue": "{surface.light.appBg}",
596
- "description": "Form-control fill. Fields stay on the app background surface, even inside a raised panel."
594
+ "value": "hsl(0, 0%, 97.3%)",
595
+ "originalValue": "{color.neutral.light.bgSecondary}",
596
+ "description": "Form-control fill. Fields are filled so they read on the page background as well as inside panels."
597
597
  },
598
598
  "component.field.backgroundDark": {
599
599
  "cssName": "--field-bg",
600
600
  "type": "color",
601
601
  "mode": "dark",
602
- "value": "hsl(0, 0%, 8.5%)",
603
- "originalValue": "{surface.dark.appBg}",
602
+ "value": "hsl(0, 0%, 11.0%)",
603
+ "originalValue": "{color.neutral.dark.bgSecondary}",
604
604
  "description": "Dark-mode form-control fill."
605
605
  },
606
606
  "component.field.backgroundDisabled": {
607
607
  "cssName": "--field-bg-disabled",
608
608
  "type": "color",
609
609
  "mode": "light",
610
- "value": "hsl(0, 0%, 97.3%)",
611
- "originalValue": "{color.neutral.light.bgSecondary}",
612
- "description": "Disabled form-control fill."
610
+ "value": "hsl(0, 0%, 95.1%)",
611
+ "originalValue": "{color.neutral.light.componentBg}",
612
+ "description": "Disabled form-control fill, a step off the resting fill."
613
613
  },
614
614
  "component.field.backgroundDisabledDark": {
615
615
  "cssName": "--field-bg-disabled",
616
616
  "type": "color",
617
617
  "mode": "dark",
618
- "value": "hsl(0, 0%, 11.0%)",
619
- "originalValue": "{color.neutral.dark.bgSecondary}",
618
+ "value": "hsl(0, 0%, 13.6%)",
619
+ "originalValue": "{color.neutral.dark.componentBg}",
620
620
  "description": "Dark-mode disabled form-control fill."
621
621
  },
622
622
  "component.field.border": {
623
623
  "cssName": "--field-border",
624
624
  "type": "color",
625
625
  "mode": "light",
626
- "value": "hsl(0, 0%, 85.8%)",
627
- "originalValue": "{color.neutral.light.border}",
626
+ "value": "hsl(0, 0%, 88.7%)",
627
+ "originalValue": "{color.neutral.light.line}",
628
628
  "description": "Resting form-control border."
629
629
  },
630
630
  "component.field.borderDark": {
631
631
  "cssName": "--field-border",
632
632
  "type": "color",
633
633
  "mode": "dark",
634
- "value": "hsl(0, 0%, 24.3%)",
635
- "originalValue": "{color.neutral.dark.border}",
634
+ "value": "hsl(0, 0%, 20.5%)",
635
+ "originalValue": "{color.neutral.dark.line}",
636
636
  "description": "Dark-mode resting form-control border."
637
637
  },
638
638
  "component.field.borderHover": {
@@ -655,17 +655,17 @@ export const tokens = {
655
655
  "cssName": "--field-border-focus",
656
656
  "type": "color",
657
657
  "mode": "light",
658
- "value": "hsl(0, 0%, 78.0%)",
659
- "originalValue": "{color.neutral.light.borderHover}",
660
- "description": "Focused form-control border. Focus matches hover and does not use the yellow focus shadow."
658
+ "value": "hsl(0, 0%, 52.3%)",
659
+ "originalValue": "{color.neutral.light.solidHover}",
660
+ "description": "Focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels. Does not use the yellow focus shadow."
661
661
  },
662
662
  "component.field.borderFocusDark": {
663
663
  "cssName": "--field-border-focus",
664
664
  "type": "color",
665
665
  "mode": "dark",
666
- "value": "hsl(0, 0%, 31.2%)",
667
- "originalValue": "{color.neutral.dark.borderHover}",
668
- "description": "Dark-mode focused form-control border. Focus matches hover and does not use the yellow focus shadow."
666
+ "value": "hsl(0, 0%, 49.4%)",
667
+ "originalValue": "{color.neutral.dark.solidHover}",
668
+ "description": "Dark-mode focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels."
669
669
  },
670
670
  "component.field.text": {
671
671
  "cssName": "--field-text",
@@ -711,17 +711,17 @@ export const tokens = {
711
711
  "cssName": "--field-ring",
712
712
  "type": "string",
713
713
  "mode": "light",
714
- "value": "0 0 0 1px hsl(0, 0%, 78.0%)",
715
- "originalValue": "0 0 0 1px {color.neutral.light.borderHover}",
716
- "description": "Quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus."
714
+ "value": "0 0 0 1px hsl(0, 0%, 52.3%)",
715
+ "originalValue": "0 0 0 1px {color.neutral.light.solidHover}",
716
+ "description": "Quiet field focus ring in the focus border colour. Buttons, links, and nav focus with --shadow-focus instead."
717
717
  },
718
718
  "component.field.ringDark": {
719
719
  "cssName": "--field-ring",
720
720
  "type": "string",
721
721
  "mode": "dark",
722
- "value": "0 0 0 1px hsl(0, 0%, 31.2%)",
723
- "originalValue": "0 0 0 1px {color.neutral.dark.borderHover}",
724
- "description": "Dark-mode quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus."
722
+ "value": "0 0 0 1px hsl(0, 0%, 49.4%)",
723
+ "originalValue": "0 0 0 1px {color.neutral.dark.solidHover}",
724
+ "description": "Dark-mode quiet field focus ring. Buttons, links, and nav focus with --shadow-focus instead."
725
725
  },
726
726
  "component.panel.background": {
727
727
  "cssName": "--panel-bg",
@@ -1027,15 +1027,15 @@ export const tokens = {
1027
1027
  "cssName": "--input",
1028
1028
  "type": "color",
1029
1029
  "mode": "light",
1030
- "value": "hsl(0, 0%, 85.8%)",
1031
- "originalValue": "{color.neutral.light.border}"
1030
+ "value": "hsl(0, 0%, 88.7%)",
1031
+ "originalValue": "{component.field.border}"
1032
1032
  },
1033
1033
  "component.alias.inputDark": {
1034
1034
  "cssName": "--input",
1035
1035
  "type": "color",
1036
1036
  "mode": "dark",
1037
- "value": "hsl(0, 0%, 24.3%)",
1038
- "originalValue": "{color.neutral.dark.border}"
1037
+ "value": "hsl(0, 0%, 20.5%)",
1038
+ "originalValue": "{component.field.borderDark}"
1039
1039
  },
1040
1040
  "component.alias.ring": {
1041
1041
  "cssName": "--ring",
@@ -3310,6 +3310,14 @@ export const tokens = {
3310
3310
  "originalValue": "1.5rem",
3311
3311
  "description": "Heading."
3312
3312
  },
3313
+ "typography.fontSize.title": {
3314
+ "cssName": "--fs-title",
3315
+ "type": "dimension",
3316
+ "mode": "global",
3317
+ "value": "22px",
3318
+ "originalValue": "22px",
3319
+ "description": "Screen titles and one-time-code digits. The fixed-pixel sibling of fontSize.lg (H2), which scales with the root."
3320
+ },
3313
3321
  "typography.fontSize.xl": {
3314
3322
  "cssName": "--fs-xl",
3315
3323
  "type": "dimension",
@@ -3413,6 +3421,14 @@ export const tokens = {
3413
3421
  "value": "-0.02em",
3414
3422
  "originalValue": "-0.02em"
3415
3423
  },
3424
+ "typography.letterSpacing.snug": {
3425
+ "cssName": "--tracking-snug",
3426
+ "type": "dimension",
3427
+ "mode": "global",
3428
+ "value": "-0.01em",
3429
+ "originalValue": "-0.01em",
3430
+ "description": "Slight negative tracking for screen titles."
3431
+ },
3416
3432
  "typography.letterSpacing.normal": {
3417
3433
  "cssName": "--tracking-normal",
3418
3434
  "type": "number",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@putdotio/design",
3
- "version": "3.8.0",
3
+ "version": "3.10.0",
4
4
  "description": "Public put.io design tokens, brand assets, and design-system guidance.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/system/README.md CHANGED
@@ -139,7 +139,7 @@ own, so the two name systems cannot drift.
139
139
  | `--accent` / `--accent-foreground` | `--component-bg` / `--text` |
140
140
  | `--card` / `--card-foreground` | `--component-bg` / `--text` |
141
141
  | `--popover` / `--popover-foreground` | `--component-bg` / `--text` |
142
- | `--input` | `--border` |
142
+ | `--input` | `--field-border` |
143
143
  | `--ring` | `--shadow-focus-color` |
144
144
  | `--background` / `--foreground` | `--bg` / `--text` |
145
145
 
@@ -265,11 +265,12 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
265
265
  now they all inherit from here. To override per-screen, change
266
266
  geometry (height/padding) — not the surface tokens.
267
267
 
268
- Surface contract:
269
- bg → --field-bg (= --app-bg)
270
- border → --field-border (= --border)
271
- border:hover → --field-border-hover
272
- focus ring → --field-ring (1px border-hover, NOT yellow)
268
+ Surface contract (filled, so a field reads on any surface):
269
+ bg → --field-bg (= --bg-secondary)
270
+ border → --field-border (= --line)
271
+ border:hover → --field-border-hover (= --border-hover)
272
+ border:focus → --field-border-focus (= --solid-hover, ≥3:1 on fill, page, panel)
273
+ focus ring → --field-ring (1px in the focus colour, NOT yellow)
273
274
  placeholder → --field-placeholder
274
275
  disabled bg → --field-bg-disabled
275
276
 
@@ -506,7 +507,7 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
506
507
  background: var(--field-bg);
507
508
  color: var(--field-text);
508
509
  font-family: var(--font-mono);
509
- font-size: 22px;
510
+ font-size: var(--fs-title);
510
511
  font-variant-numeric: tabular-nums;
511
512
  line-height: 1;
512
513
  pointer-events: none;
@@ -567,18 +568,11 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
567
568
 
568
569
  Card-less: the form sits on the page background. Logo top-left
569
570
  in .auth-header, one left-aligned 340px column centred in
570
- .auth-main, a quiet link row in .auth-footer. The page re-points
571
- --field-bg / --field-border, so .field and .otp-slot render filled
572
- without a variant. Controls are 44px; the title is the only
573
- heading. Under 640px the gutters drop to 24px so the logo lines
571
+ .auth-main, a quiet link row in .auth-footer. Controls are 44px;
572
+ the title is the only heading. Under 640px the gutters drop to 24px so the logo lines
574
573
  up with the column.
575
574
  =========================================================== */
576
575
  .auth-page {
577
- --field-bg: var(--bg-secondary);
578
- --field-border: var(--line);
579
- /* Focus a step past hover, so it holds 3:1 against the filled field. */
580
- --field-border-focus: var(--solid-hover);
581
- --field-ring: 0 0 0 1px var(--solid-hover);
582
576
  box-sizing: border-box;
583
577
  min-height: 100dvh;
584
578
  display: flex;
@@ -609,10 +603,10 @@ input, textarea, select { text-transform: none; letter-spacing: normal; }
609
603
  }
610
604
  .auth-title {
611
605
  margin: 0 0 28px;
612
- font-size: 22px;
606
+ font-size: var(--fs-title);
613
607
  line-height: 30px;
614
608
  font-weight: var(--fw-medium);
615
- letter-spacing: -0.01em;
609
+ letter-spacing: var(--tracking-snug);
616
610
  color: var(--text);
617
611
  }
618
612
  .auth-column .form-stack { gap: 16px; }
@@ -828,8 +828,8 @@
828
828
  "field": {
829
829
  "background": {
830
830
  "$type": "color",
831
- "$value": "{surface.light.appBg}",
832
- "$description": "Form-control fill. Fields stay on the app background surface, even inside a raised panel.",
831
+ "$value": "{color.neutral.light.bgSecondary}",
832
+ "$description": "Form-control fill. Fields are filled so they read on the page background as well as inside panels.",
833
833
  "$extensions": {
834
834
  "putio": {
835
835
  "cssName": "field-bg",
@@ -840,7 +840,7 @@
840
840
  },
841
841
  "backgroundDark": {
842
842
  "$type": "color",
843
- "$value": "{surface.dark.appBg}",
843
+ "$value": "{color.neutral.dark.bgSecondary}",
844
844
  "$description": "Dark-mode form-control fill.",
845
845
  "$extensions": {
846
846
  "putio": {
@@ -852,8 +852,8 @@
852
852
  },
853
853
  "backgroundDisabled": {
854
854
  "$type": "color",
855
- "$value": "{color.neutral.light.bgSecondary}",
856
- "$description": "Disabled form-control fill.",
855
+ "$value": "{color.neutral.light.componentBg}",
856
+ "$description": "Disabled form-control fill, a step off the resting fill.",
857
857
  "$extensions": {
858
858
  "putio": {
859
859
  "cssName": "field-bg-disabled",
@@ -864,7 +864,7 @@
864
864
  },
865
865
  "backgroundDisabledDark": {
866
866
  "$type": "color",
867
- "$value": "{color.neutral.dark.bgSecondary}",
867
+ "$value": "{color.neutral.dark.componentBg}",
868
868
  "$description": "Dark-mode disabled form-control fill.",
869
869
  "$extensions": {
870
870
  "putio": {
@@ -876,7 +876,7 @@
876
876
  },
877
877
  "border": {
878
878
  "$type": "color",
879
- "$value": "{color.neutral.light.border}",
879
+ "$value": "{color.neutral.light.line}",
880
880
  "$description": "Resting form-control border.",
881
881
  "$extensions": {
882
882
  "putio": {
@@ -888,7 +888,7 @@
888
888
  },
889
889
  "borderDark": {
890
890
  "$type": "color",
891
- "$value": "{color.neutral.dark.border}",
891
+ "$value": "{color.neutral.dark.line}",
892
892
  "$description": "Dark-mode resting form-control border.",
893
893
  "$extensions": {
894
894
  "putio": {
@@ -924,8 +924,8 @@
924
924
  },
925
925
  "borderFocus": {
926
926
  "$type": "color",
927
- "$value": "{color.neutral.light.borderHover}",
928
- "$description": "Focused form-control border. Focus matches hover and does not use the yellow focus shadow.",
927
+ "$value": "{color.neutral.light.solidHover}",
928
+ "$description": "Focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels. Does not use the yellow focus shadow.",
929
929
  "$extensions": {
930
930
  "putio": {
931
931
  "cssName": "field-border-focus",
@@ -936,8 +936,8 @@
936
936
  },
937
937
  "borderFocusDark": {
938
938
  "$type": "color",
939
- "$value": "{color.neutral.dark.borderHover}",
940
- "$description": "Dark-mode focused form-control border. Focus matches hover and does not use the yellow focus shadow.",
939
+ "$value": "{color.neutral.dark.solidHover}",
940
+ "$description": "Dark-mode focused form-control border, a step past hover; at least 3:1 against the fill, the page, and panels.",
941
941
  "$extensions": {
942
942
  "putio": {
943
943
  "cssName": "field-border-focus",
@@ -1008,8 +1008,8 @@
1008
1008
  },
1009
1009
  "ring": {
1010
1010
  "$type": "string",
1011
- "$value": "0 0 0 1px {color.neutral.light.borderHover}",
1012
- "$description": "Quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus.",
1011
+ "$value": "0 0 0 1px {color.neutral.light.solidHover}",
1012
+ "$description": "Quiet field focus ring in the focus border colour. Buttons, links, and nav focus with --shadow-focus instead.",
1013
1013
  "$extensions": {
1014
1014
  "putio": {
1015
1015
  "cssName": "field-ring",
@@ -1020,8 +1020,8 @@
1020
1020
  },
1021
1021
  "ringDark": {
1022
1022
  "$type": "string",
1023
- "$value": "0 0 0 1px {color.neutral.dark.borderHover}",
1024
- "$description": "Dark-mode quiet field focus ring. Brand-yellow shadow focus is reserved for buttons, links, nav, and TV focus.",
1023
+ "$value": "0 0 0 1px {color.neutral.dark.solidHover}",
1024
+ "$description": "Dark-mode quiet field focus ring. Buttons, links, and nav focus with --shadow-focus instead.",
1025
1025
  "$extensions": {
1026
1026
  "putio": {
1027
1027
  "cssName": "field-ring",
@@ -1500,7 +1500,7 @@
1500
1500
  },
1501
1501
  "input": {
1502
1502
  "$type": "color",
1503
- "$value": "{color.neutral.light.border}",
1503
+ "$value": "{component.field.border}",
1504
1504
  "$extensions": {
1505
1505
  "putio": {
1506
1506
  "cssName": "input",
@@ -1511,7 +1511,7 @@
1511
1511
  },
1512
1512
  "inputDark": {
1513
1513
  "$type": "color",
1514
- "$value": "{color.neutral.dark.border}",
1514
+ "$value": "{component.field.borderDark}",
1515
1515
  "$extensions": {
1516
1516
  "putio": {
1517
1517
  "cssName": "input",
@@ -206,6 +206,18 @@
206
206
  }
207
207
  }
208
208
  },
209
+ "title": {
210
+ "$type": "dimension",
211
+ "$value": "22px",
212
+ "$description": "Screen titles and one-time-code digits. The fixed-pixel sibling of fontSize.lg (H2), which scales with the root.",
213
+ "$extensions": {
214
+ "putio": {
215
+ "cssName": "fs-title",
216
+ "mode": "global",
217
+ "figma": true
218
+ }
219
+ }
220
+ },
209
221
  "xl": {
210
222
  "$type": "dimension",
211
223
  "$value": "2rem",
@@ -371,6 +383,18 @@
371
383
  }
372
384
  }
373
385
  },
386
+ "snug": {
387
+ "$type": "dimension",
388
+ "$value": "-0.01em",
389
+ "$description": "Slight negative tracking for screen titles.",
390
+ "$extensions": {
391
+ "putio": {
392
+ "cssName": "tracking-snug",
393
+ "mode": "global",
394
+ "figma": true
395
+ }
396
+ }
397
+ },
374
398
  "normal": {
375
399
  "$type": "number",
376
400
  "$value": "0",