@putdotio/design 3.4.0 → 3.5.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 +2 -2
- package/dist/tokens.d.ts +1 -1
- package/dist/tokens.dtcg.json +86 -0
- package/dist/tokens.flat.json +56 -0
- package/dist/tokens.js +56 -0
- package/package.json +1 -1
- package/tokens/context.tokens.json +51 -0
package/DESIGN.md
CHANGED
|
@@ -175,9 +175,9 @@ to narrow Auth cards without horizontal scrolling.
|
|
|
175
175
|
|
|
176
176
|
TV components are list-first and focus-first. A TV app is still a file browser, not a poster wall. Roku, native Apple, Android, and web TV repos should consume the generic tokens and generate their own platform bindings.
|
|
177
177
|
|
|
178
|
-
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. These focus and material rules bind the web TV and Roku surfaces; a native TV binding follows its platform's own control conventions where the platform owns focus. Apple tvOS buttons use the system focus treatment (adopted 2026-08) while non-control TV surfaces stay solid everywhere.
|
|
178
|
+
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 web TV buttons step both their fill and their border at one fixed edge width. The `tv.focus` group carries every value: `tv.focus.row.*` for the row fill that web TV and Roku share, `tv.focus.control.*` for the web TV fill and border step, and `tv.focus.borderWidth` (`3px`) for the edge. Roku dialog buttons are borderless and follow their primary, secondary, or danger variant instead. 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. These focus and material rules bind the web TV and Roku surfaces; a native TV binding follows its platform's own control conventions where the platform owns focus. Apple tvOS buttons use the system focus treatment (adopted 2026-08) while non-control TV surfaces stay solid everywhere.
|
|
179
179
|
|
|
180
|
-
The 10-foot scale (type steps, spacing ramp, overscan ratios, radius, and z-indices) lives in the `tv` token group, 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.
|
|
180
|
+
The 10-foot scale (type steps, spacing ramp, overscan ratios, radius, focus, and z-indices) lives in the `tv` token group, 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.
|
|
181
181
|
|
|
182
182
|
## Do's and Don'ts
|
|
183
183
|
|
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.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.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" | "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;
|
package/dist/tokens.dtcg.json
CHANGED
|
@@ -3510,6 +3510,92 @@
|
|
|
3510
3510
|
}
|
|
3511
3511
|
}
|
|
3512
3512
|
},
|
|
3513
|
+
"focus": {
|
|
3514
|
+
"$description": "Focus for web TV (tv.put.io, Tizen, webOS) and Roku: a fill, never a lift. Roku reads the row pair only. No scale, shadow, halo, or white invert; label and icon stay context.tv.text.primary. Each pair is the resting value and its focused step. Native tvOS and Android TV keep their platform focus engines and do not read this group.",
|
|
3515
|
+
"borderWidth": {
|
|
3516
|
+
"$type": "dimension",
|
|
3517
|
+
"$value": "3px",
|
|
3518
|
+
"$description": "Control edge at rest and in focus. The width never changes with focus, so focus never shifts layout. 3px because a 1px edge vanishes at three metres and Roku snaps every FHD position to a 3px grid.",
|
|
3519
|
+
"$extensions": {
|
|
3520
|
+
"putio": {
|
|
3521
|
+
"cssName": "tv-focus-border-width",
|
|
3522
|
+
"mode": "tv"
|
|
3523
|
+
}
|
|
3524
|
+
}
|
|
3525
|
+
},
|
|
3526
|
+
"row": {
|
|
3527
|
+
"$description": "List rows, modal options, and track-menu rows on web TV and Roku. Rows carry no border, so focus is the fill alone; Roku draws it as a tinted FocusBackground nine-patch.",
|
|
3528
|
+
"background": {
|
|
3529
|
+
"$type": "color",
|
|
3530
|
+
"$value": "{surface.dark.listItemBg}",
|
|
3531
|
+
"$description": "Resting row: transparent.",
|
|
3532
|
+
"$extensions": {
|
|
3533
|
+
"putio": {
|
|
3534
|
+
"cssName": "tv-focus-row-bg",
|
|
3535
|
+
"mode": "tv"
|
|
3536
|
+
}
|
|
3537
|
+
}
|
|
3538
|
+
},
|
|
3539
|
+
"backgroundFocused": {
|
|
3540
|
+
"$type": "color",
|
|
3541
|
+
"$value": "{color.neutral.dark.componentBgActive}",
|
|
3542
|
+
"$description": "Focused row fill.",
|
|
3543
|
+
"$extensions": {
|
|
3544
|
+
"putio": {
|
|
3545
|
+
"cssName": "tv-focus-row-bg-focused",
|
|
3546
|
+
"mode": "tv"
|
|
3547
|
+
}
|
|
3548
|
+
}
|
|
3549
|
+
}
|
|
3550
|
+
},
|
|
3551
|
+
"control": {
|
|
3552
|
+
"$description": "Web TV buttons, the search field, and other chrome that carry a border at rest. Focus steps both the fill and the border. On-screen keyboard keys and Roku dialog buttons, whose focus follows their primary, secondary, or danger variant, sit outside this group.",
|
|
3553
|
+
"background": {
|
|
3554
|
+
"$type": "color",
|
|
3555
|
+
"$value": "{color.neutral.dark.componentBg}",
|
|
3556
|
+
"$description": "Resting control fill.",
|
|
3557
|
+
"$extensions": {
|
|
3558
|
+
"putio": {
|
|
3559
|
+
"cssName": "tv-focus-control-bg",
|
|
3560
|
+
"mode": "tv"
|
|
3561
|
+
}
|
|
3562
|
+
}
|
|
3563
|
+
},
|
|
3564
|
+
"backgroundFocused": {
|
|
3565
|
+
"$type": "color",
|
|
3566
|
+
"$value": "{color.neutral.dark.componentBgActive}",
|
|
3567
|
+
"$description": "Focused control fill, the same fill a focused row takes.",
|
|
3568
|
+
"$extensions": {
|
|
3569
|
+
"putio": {
|
|
3570
|
+
"cssName": "tv-focus-control-bg-focused",
|
|
3571
|
+
"mode": "tv"
|
|
3572
|
+
}
|
|
3573
|
+
}
|
|
3574
|
+
},
|
|
3575
|
+
"border": {
|
|
3576
|
+
"$type": "color",
|
|
3577
|
+
"$value": "{color.neutral.dark.border}",
|
|
3578
|
+
"$description": "Resting control edge, drawn at tv.focus.borderWidth.",
|
|
3579
|
+
"$extensions": {
|
|
3580
|
+
"putio": {
|
|
3581
|
+
"cssName": "tv-focus-control-border",
|
|
3582
|
+
"mode": "tv"
|
|
3583
|
+
}
|
|
3584
|
+
}
|
|
3585
|
+
},
|
|
3586
|
+
"borderFocused": {
|
|
3587
|
+
"$type": "color",
|
|
3588
|
+
"$value": "{color.neutral.dark.borderHover}",
|
|
3589
|
+
"$description": "Focused control edge, drawn at tv.focus.borderWidth.",
|
|
3590
|
+
"$extensions": {
|
|
3591
|
+
"putio": {
|
|
3592
|
+
"cssName": "tv-focus-control-border-focused",
|
|
3593
|
+
"mode": "tv"
|
|
3594
|
+
}
|
|
3595
|
+
}
|
|
3596
|
+
}
|
|
3597
|
+
}
|
|
3598
|
+
},
|
|
3513
3599
|
"z": {
|
|
3514
3600
|
"$description": "zIndices. NOT the web --z-* order: on TV, overlay sits ABOVE toast. Emit the two scales separately and never fold TV into the web stack order.",
|
|
3515
3601
|
"modal": {
|
package/dist/tokens.flat.json
CHANGED
|
@@ -2395,6 +2395,62 @@
|
|
|
2395
2395
|
"originalValue": "{radius.tv}",
|
|
2396
2396
|
"description": "radii.default — one radius for every 10-foot surface."
|
|
2397
2397
|
},
|
|
2398
|
+
"tv.focus.borderWidth": {
|
|
2399
|
+
"cssName": "--tv-focus-border-width",
|
|
2400
|
+
"type": "dimension",
|
|
2401
|
+
"mode": "tv",
|
|
2402
|
+
"value": "3px",
|
|
2403
|
+
"originalValue": "3px",
|
|
2404
|
+
"description": "Control edge at rest and in focus. The width never changes with focus, so focus never shifts layout. 3px because a 1px edge vanishes at three metres and Roku snaps every FHD position to a 3px grid."
|
|
2405
|
+
},
|
|
2406
|
+
"tv.focus.row.background": {
|
|
2407
|
+
"cssName": "--tv-focus-row-bg",
|
|
2408
|
+
"type": "color",
|
|
2409
|
+
"mode": "tv",
|
|
2410
|
+
"value": "hsla(0, 0%, 0%, 0)",
|
|
2411
|
+
"originalValue": "{surface.dark.listItemBg}",
|
|
2412
|
+
"description": "Resting row: transparent."
|
|
2413
|
+
},
|
|
2414
|
+
"tv.focus.row.backgroundFocused": {
|
|
2415
|
+
"cssName": "--tv-focus-row-bg-focused",
|
|
2416
|
+
"type": "color",
|
|
2417
|
+
"mode": "tv",
|
|
2418
|
+
"value": "hsl(0, 0%, 17.9%)",
|
|
2419
|
+
"originalValue": "{color.neutral.dark.componentBgActive}",
|
|
2420
|
+
"description": "Focused row fill."
|
|
2421
|
+
},
|
|
2422
|
+
"tv.focus.control.background": {
|
|
2423
|
+
"cssName": "--tv-focus-control-bg",
|
|
2424
|
+
"type": "color",
|
|
2425
|
+
"mode": "tv",
|
|
2426
|
+
"value": "hsl(0, 0%, 13.6%)",
|
|
2427
|
+
"originalValue": "{color.neutral.dark.componentBg}",
|
|
2428
|
+
"description": "Resting control fill."
|
|
2429
|
+
},
|
|
2430
|
+
"tv.focus.control.backgroundFocused": {
|
|
2431
|
+
"cssName": "--tv-focus-control-bg-focused",
|
|
2432
|
+
"type": "color",
|
|
2433
|
+
"mode": "tv",
|
|
2434
|
+
"value": "hsl(0, 0%, 17.9%)",
|
|
2435
|
+
"originalValue": "{color.neutral.dark.componentBgActive}",
|
|
2436
|
+
"description": "Focused control fill, the same fill a focused row takes."
|
|
2437
|
+
},
|
|
2438
|
+
"tv.focus.control.border": {
|
|
2439
|
+
"cssName": "--tv-focus-control-border",
|
|
2440
|
+
"type": "color",
|
|
2441
|
+
"mode": "tv",
|
|
2442
|
+
"value": "hsl(0, 0%, 24.3%)",
|
|
2443
|
+
"originalValue": "{color.neutral.dark.border}",
|
|
2444
|
+
"description": "Resting control edge, drawn at tv.focus.borderWidth."
|
|
2445
|
+
},
|
|
2446
|
+
"tv.focus.control.borderFocused": {
|
|
2447
|
+
"cssName": "--tv-focus-control-border-focused",
|
|
2448
|
+
"type": "color",
|
|
2449
|
+
"mode": "tv",
|
|
2450
|
+
"value": "hsl(0, 0%, 31.2%)",
|
|
2451
|
+
"originalValue": "{color.neutral.dark.borderHover}",
|
|
2452
|
+
"description": "Focused control edge, drawn at tv.focus.borderWidth."
|
|
2453
|
+
},
|
|
2398
2454
|
"tv.z.modal": {
|
|
2399
2455
|
"cssName": "--tv-z-modal",
|
|
2400
2456
|
"type": "number",
|
package/dist/tokens.js
CHANGED
|
@@ -2397,6 +2397,62 @@ export const tokens = {
|
|
|
2397
2397
|
"originalValue": "{radius.tv}",
|
|
2398
2398
|
"description": "radii.default — one radius for every 10-foot surface."
|
|
2399
2399
|
},
|
|
2400
|
+
"tv.focus.borderWidth": {
|
|
2401
|
+
"cssName": "--tv-focus-border-width",
|
|
2402
|
+
"type": "dimension",
|
|
2403
|
+
"mode": "tv",
|
|
2404
|
+
"value": "3px",
|
|
2405
|
+
"originalValue": "3px",
|
|
2406
|
+
"description": "Control edge at rest and in focus. The width never changes with focus, so focus never shifts layout. 3px because a 1px edge vanishes at three metres and Roku snaps every FHD position to a 3px grid."
|
|
2407
|
+
},
|
|
2408
|
+
"tv.focus.row.background": {
|
|
2409
|
+
"cssName": "--tv-focus-row-bg",
|
|
2410
|
+
"type": "color",
|
|
2411
|
+
"mode": "tv",
|
|
2412
|
+
"value": "hsla(0, 0%, 0%, 0)",
|
|
2413
|
+
"originalValue": "{surface.dark.listItemBg}",
|
|
2414
|
+
"description": "Resting row: transparent."
|
|
2415
|
+
},
|
|
2416
|
+
"tv.focus.row.backgroundFocused": {
|
|
2417
|
+
"cssName": "--tv-focus-row-bg-focused",
|
|
2418
|
+
"type": "color",
|
|
2419
|
+
"mode": "tv",
|
|
2420
|
+
"value": "hsl(0, 0%, 17.9%)",
|
|
2421
|
+
"originalValue": "{color.neutral.dark.componentBgActive}",
|
|
2422
|
+
"description": "Focused row fill."
|
|
2423
|
+
},
|
|
2424
|
+
"tv.focus.control.background": {
|
|
2425
|
+
"cssName": "--tv-focus-control-bg",
|
|
2426
|
+
"type": "color",
|
|
2427
|
+
"mode": "tv",
|
|
2428
|
+
"value": "hsl(0, 0%, 13.6%)",
|
|
2429
|
+
"originalValue": "{color.neutral.dark.componentBg}",
|
|
2430
|
+
"description": "Resting control fill."
|
|
2431
|
+
},
|
|
2432
|
+
"tv.focus.control.backgroundFocused": {
|
|
2433
|
+
"cssName": "--tv-focus-control-bg-focused",
|
|
2434
|
+
"type": "color",
|
|
2435
|
+
"mode": "tv",
|
|
2436
|
+
"value": "hsl(0, 0%, 17.9%)",
|
|
2437
|
+
"originalValue": "{color.neutral.dark.componentBgActive}",
|
|
2438
|
+
"description": "Focused control fill, the same fill a focused row takes."
|
|
2439
|
+
},
|
|
2440
|
+
"tv.focus.control.border": {
|
|
2441
|
+
"cssName": "--tv-focus-control-border",
|
|
2442
|
+
"type": "color",
|
|
2443
|
+
"mode": "tv",
|
|
2444
|
+
"value": "hsl(0, 0%, 24.3%)",
|
|
2445
|
+
"originalValue": "{color.neutral.dark.border}",
|
|
2446
|
+
"description": "Resting control edge, drawn at tv.focus.borderWidth."
|
|
2447
|
+
},
|
|
2448
|
+
"tv.focus.control.borderFocused": {
|
|
2449
|
+
"cssName": "--tv-focus-control-border-focused",
|
|
2450
|
+
"type": "color",
|
|
2451
|
+
"mode": "tv",
|
|
2452
|
+
"value": "hsl(0, 0%, 31.2%)",
|
|
2453
|
+
"originalValue": "{color.neutral.dark.borderHover}",
|
|
2454
|
+
"description": "Focused control edge, drawn at tv.focus.borderWidth."
|
|
2455
|
+
},
|
|
2400
2456
|
"tv.z.modal": {
|
|
2401
2457
|
"cssName": "--tv-z-modal",
|
|
2402
2458
|
"type": "number",
|
package/package.json
CHANGED
|
@@ -321,6 +321,57 @@
|
|
|
321
321
|
"$description": "radii.default — one radius for every 10-foot surface.",
|
|
322
322
|
"$extensions": { "putio": { "cssName": "tv-radius", "mode": "tv" } }
|
|
323
323
|
},
|
|
324
|
+
"focus": {
|
|
325
|
+
"$description": "Focus for web TV (tv.put.io, Tizen, webOS) and Roku: a fill, never a lift. Roku reads the row pair only. No scale, shadow, halo, or white invert; label and icon stay context.tv.text.primary. Each pair is the resting value and its focused step. Native tvOS and Android TV keep their platform focus engines and do not read this group.",
|
|
326
|
+
"borderWidth": {
|
|
327
|
+
"$type": "dimension",
|
|
328
|
+
"$value": "3px",
|
|
329
|
+
"$description": "Control edge at rest and in focus. The width never changes with focus, so focus never shifts layout. 3px because a 1px edge vanishes at three metres and Roku snaps every FHD position to a 3px grid.",
|
|
330
|
+
"$extensions": { "putio": { "cssName": "tv-focus-border-width", "mode": "tv" } }
|
|
331
|
+
},
|
|
332
|
+
"row": {
|
|
333
|
+
"$description": "List rows, modal options, and track-menu rows on web TV and Roku. Rows carry no border, so focus is the fill alone; Roku draws it as a tinted FocusBackground nine-patch.",
|
|
334
|
+
"background": {
|
|
335
|
+
"$type": "color",
|
|
336
|
+
"$value": "{surface.dark.listItemBg}",
|
|
337
|
+
"$description": "Resting row: transparent.",
|
|
338
|
+
"$extensions": { "putio": { "cssName": "tv-focus-row-bg", "mode": "tv" } }
|
|
339
|
+
},
|
|
340
|
+
"backgroundFocused": {
|
|
341
|
+
"$type": "color",
|
|
342
|
+
"$value": "{color.neutral.dark.componentBgActive}",
|
|
343
|
+
"$description": "Focused row fill.",
|
|
344
|
+
"$extensions": { "putio": { "cssName": "tv-focus-row-bg-focused", "mode": "tv" } }
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
"control": {
|
|
348
|
+
"$description": "Web TV buttons, the search field, and other chrome that carry a border at rest. Focus steps both the fill and the border. On-screen keyboard keys and Roku dialog buttons, whose focus follows their primary, secondary, or danger variant, sit outside this group.",
|
|
349
|
+
"background": {
|
|
350
|
+
"$type": "color",
|
|
351
|
+
"$value": "{color.neutral.dark.componentBg}",
|
|
352
|
+
"$description": "Resting control fill.",
|
|
353
|
+
"$extensions": { "putio": { "cssName": "tv-focus-control-bg", "mode": "tv" } }
|
|
354
|
+
},
|
|
355
|
+
"backgroundFocused": {
|
|
356
|
+
"$type": "color",
|
|
357
|
+
"$value": "{color.neutral.dark.componentBgActive}",
|
|
358
|
+
"$description": "Focused control fill, the same fill a focused row takes.",
|
|
359
|
+
"$extensions": { "putio": { "cssName": "tv-focus-control-bg-focused", "mode": "tv" } }
|
|
360
|
+
},
|
|
361
|
+
"border": {
|
|
362
|
+
"$type": "color",
|
|
363
|
+
"$value": "{color.neutral.dark.border}",
|
|
364
|
+
"$description": "Resting control edge, drawn at tv.focus.borderWidth.",
|
|
365
|
+
"$extensions": { "putio": { "cssName": "tv-focus-control-border", "mode": "tv" } }
|
|
366
|
+
},
|
|
367
|
+
"borderFocused": {
|
|
368
|
+
"$type": "color",
|
|
369
|
+
"$value": "{color.neutral.dark.borderHover}",
|
|
370
|
+
"$description": "Focused control edge, drawn at tv.focus.borderWidth.",
|
|
371
|
+
"$extensions": { "putio": { "cssName": "tv-focus-control-border-focused", "mode": "tv" } }
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
},
|
|
324
375
|
"z": {
|
|
325
376
|
"$description": "zIndices. NOT the web --z-* order: on TV, overlay sits ABOVE toast. Emit the two scales separately and never fold TV into the web stack order.",
|
|
326
377
|
"modal": {
|