@loworbitstudio/visor-theme-engine 0.21.0 → 0.22.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/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/{chunk-LY5LXQYE.js → chunk-L5DQDEZV.js} +264 -5
- package/dist/index.d.ts +53 -3
- package/dist/index.js +60 -4
- package/dist/{types-BG-YT4JW.d.ts → types-Wy5n0W9F.d.ts} +8 -0
- package/package.json +1 -1
- package/src/visor-theme.schema.json +48 -1
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { k as GeneratedPrimitives, s as SemanticTokens, R as ResolvedThemeConfig } from '../types-
|
|
1
|
+
import { k as GeneratedPrimitives, s as SemanticTokens, R as ResolvedThemeConfig } from '../types-Wy5n0W9F.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Adapter types for the Visor theme engine.
|
package/dist/adapters/index.js
CHANGED
|
@@ -1260,9 +1260,23 @@ var TABS = "components/ui/tabs/tabs.module.css";
|
|
|
1260
1260
|
var SKELETON = "components/ui/skeleton/skeleton.module.css";
|
|
1261
1261
|
var SPINNER = "components/ui/spinner/spinner.module.css";
|
|
1262
1262
|
var CHECKBOX = "components/ui/checkbox/checkbox.module.css";
|
|
1263
|
+
var INPUT = "components/ui/input/input.module.css";
|
|
1264
|
+
var TEXTAREA = "components/ui/textarea/textarea.module.css";
|
|
1265
|
+
var SELECT = "components/ui/select/select.module.css";
|
|
1266
|
+
var SWITCH = "components/ui/switch/switch.module.css";
|
|
1267
|
+
var TAG_INPUT = "components/ui/tag-input/tag-input.module.css";
|
|
1268
|
+
var FILE_UPLOAD = "components/ui/file-upload/file-upload.module.css";
|
|
1269
|
+
var BUTTON = "components/ui/button/button.module.css";
|
|
1270
|
+
var FIELD = "components/ui/field/field.module.css";
|
|
1271
|
+
var TEXT = "components/ui/text/text.module.css";
|
|
1272
|
+
var INLINE_EDIT = "components/ui/inline-edit/inline-edit.module.css";
|
|
1273
|
+
var SAVE_STATUS = "components/ui/save-status/save-status.module.css";
|
|
1263
1274
|
function at(file, fallback) {
|
|
1264
1275
|
return [{ file, fallback }];
|
|
1265
1276
|
}
|
|
1277
|
+
function each(files, fallback) {
|
|
1278
|
+
return files.map((file) => ({ file, fallback }));
|
|
1279
|
+
}
|
|
1266
1280
|
var tableFamily = {
|
|
1267
1281
|
family: "table",
|
|
1268
1282
|
prefix: "table",
|
|
@@ -1343,7 +1357,12 @@ var chipFamily = {
|
|
|
1343
1357
|
description: "Chip / filter-pill treatment. The retro found the same mono status chip at 8.5 / 9 / 9.5 / 10 / 11px with tracking .03\u2013.14em across nine implementations; this family is the single dial.",
|
|
1344
1358
|
tokens: [
|
|
1345
1359
|
{ key: "radius", property: "border-radius", description: "Chip corner rounding.", consumers: at(CHIP, "var(--radius-full, 9999px)") },
|
|
1346
|
-
{
|
|
1360
|
+
{
|
|
1361
|
+
key: "border",
|
|
1362
|
+
property: "outline-color (outlined variant, on ::after)",
|
|
1363
|
+
description: "Outlined-chip edge colour. Width and style come from the shared `control` edge, so `control.edge-width: 0` turns it off.",
|
|
1364
|
+
consumers: at(CHIP, "var(--control-edge-color, var(--border-default, #e5e7eb))")
|
|
1365
|
+
},
|
|
1347
1366
|
{ key: "bg", property: "background-color", description: "Resting chip fill.", consumers: at(CHIP, "var(--surface-card, #ffffff)") },
|
|
1348
1367
|
{ key: "text-color", property: "color", description: "Chip label colour.", consumers: at(CHIP, "var(--text-primary, #111827)") },
|
|
1349
1368
|
{ key: "font-family", property: "font-family", description: "Chip label family \u2014 bind a mono face for token/ID chips.", consumers: at(CHIP, "var(--font-body, inherit)") },
|
|
@@ -1360,7 +1379,7 @@ var chipFamily = {
|
|
|
1360
1379
|
{ key: "lg-padding-x", property: "padding", description: "Large chip horizontal padding.", consumers: at(CHIP, "var(--spacing-4, 1rem)") },
|
|
1361
1380
|
{ key: "lg-font-size", property: "font-size", description: "Large chip type size.", consumers: at(CHIP, "var(--font-size-base, 1rem)") },
|
|
1362
1381
|
{ key: "selected-bg", property: "background-color", description: "Selected chip fill.", consumers: at(CHIP, "var(--surface-accent-subtle, #eff6ff)") },
|
|
1363
|
-
{ key: "selected-border-color", property: "
|
|
1382
|
+
{ key: "selected-border-color", property: "outline-color (on ::after)", description: "Selected chip edge colour.", consumers: at(CHIP, "var(--surface-accent-default, #3b82f6)") },
|
|
1364
1383
|
{ key: "selected-text-color", property: "color", description: "Selected chip label colour.", consumers: at(CHIP, "var(--text-link, #2563eb)") }
|
|
1365
1384
|
]
|
|
1366
1385
|
};
|
|
@@ -1458,7 +1477,12 @@ var emptyStateFamily = {
|
|
|
1458
1477
|
{ key: "gap", property: "gap", description: "Placard stack rhythm.", consumers: at(EMPTY_STATE, "var(--spacing-2, 0.5rem)") },
|
|
1459
1478
|
{ key: "padding", property: "padding", description: "Default-size placard inset.", consumers: at(EMPTY_STATE, "var(--spacing-8, 2rem) var(--spacing-5, 1.25rem)") },
|
|
1460
1479
|
{ key: "bg", property: "background-color", description: "Default-tone fill.", consumers: at(EMPTY_STATE, "var(--surface-muted, #f9fafb)") },
|
|
1461
|
-
{
|
|
1480
|
+
{
|
|
1481
|
+
key: "border",
|
|
1482
|
+
property: "outline-color",
|
|
1483
|
+
description: "Default-tone dashed-edge colour. Width and style come from the shared `control` drop edge, so `control.edge-width: 0` turns it off.",
|
|
1484
|
+
consumers: at(EMPTY_STATE, "var(--control-edge-color, var(--border-default, #e5e7eb))")
|
|
1485
|
+
},
|
|
1462
1486
|
{ key: "icon-size", property: "width / height", description: "Icon-chip diameter.", consumers: at(EMPTY_STATE, "72px") },
|
|
1463
1487
|
{ key: "icon-radius", property: "border-radius", description: "Icon-chip rounding.", consumers: at(EMPTY_STATE, "var(--radius-full, 9999px)") },
|
|
1464
1488
|
{ key: "icon-bg", property: "background-color", description: "Icon-chip fill.", consumers: at(EMPTY_STATE, "var(--surface-subtle, #f5f5f6)") },
|
|
@@ -1606,9 +1630,238 @@ var checkboxFamily = {
|
|
|
1606
1630
|
{ key: "size", property: "width / height", description: "Checkbox box size.", consumers: at(CHECKBOX, "1rem") },
|
|
1607
1631
|
{ key: "radius", property: "border-radius", description: "Checkbox corner rounding \u2014 square it for the editorial admin look.", consumers: at(CHECKBOX, "var(--radius-sm, 0.25rem)") },
|
|
1608
1632
|
{ key: "bg", property: "background-color", description: "Unchecked fill.", consumers: at(CHECKBOX, "transparent") },
|
|
1609
|
-
{
|
|
1633
|
+
{
|
|
1634
|
+
key: "border",
|
|
1635
|
+
property: "outline-color",
|
|
1636
|
+
description: "Unchecked edge colour. Width and style come from the shared `control` edge, so `control.edge-width: 0` turns it off.",
|
|
1637
|
+
consumers: at(CHECKBOX, "var(--control-edge-color, var(--border-default, #e5e7eb))")
|
|
1638
|
+
},
|
|
1639
|
+
{
|
|
1640
|
+
key: "edgeless-bg",
|
|
1641
|
+
property: "background-image",
|
|
1642
|
+
description: "Unchecked fill shown only while the shared edge is off (`control.edge-width: 0`), so the box still reads as a control.",
|
|
1643
|
+
consumers: at(CHECKBOX, "var(--control-edge-color, var(--border-default, #e5e7eb))")
|
|
1644
|
+
},
|
|
1610
1645
|
{ key: "bg-checked", property: "background-color", description: "Checked fill.", consumers: at(CHECKBOX, "var(--interactive-primary-bg, var(--primary, #111827))") },
|
|
1611
|
-
{ key: "border-checked", property: "
|
|
1646
|
+
{ key: "border-checked", property: "outline-color", description: "Checked edge colour.", consumers: at(CHECKBOX, "var(--interactive-primary-bg, var(--primary, #111827))") }
|
|
1647
|
+
]
|
|
1648
|
+
};
|
|
1649
|
+
var EDGE_CONTROLS = [INPUT, TEXTAREA, SELECT, CHECKBOX, SWITCH, TAG_INPUT, BUTTON];
|
|
1650
|
+
var controlFamily = {
|
|
1651
|
+
family: "control",
|
|
1652
|
+
prefix: "control",
|
|
1653
|
+
description: "The one switch for form-control edges (VI-655). Every form control draws its resting edge from these, so `edge-width: 0` removes every resting edge at once, dashed edges included, with no layout shift.",
|
|
1654
|
+
tokens: [
|
|
1655
|
+
{
|
|
1656
|
+
key: "edge-width",
|
|
1657
|
+
property: "outline-width",
|
|
1658
|
+
description: "THE switch. Resting-edge weight for every form control; `0` turns every resting edge off.",
|
|
1659
|
+
consumers: [
|
|
1660
|
+
...each(EDGE_CONTROLS, "1px"),
|
|
1661
|
+
{ file: CHIP, fallback: "var(--stroke-width-thin, 1px)" },
|
|
1662
|
+
{ file: FILE_UPLOAD, fallback: "1px" },
|
|
1663
|
+
{ file: EMPTY_STATE, fallback: "1px" }
|
|
1664
|
+
]
|
|
1665
|
+
},
|
|
1666
|
+
{
|
|
1667
|
+
key: "edge-color",
|
|
1668
|
+
property: "outline-color",
|
|
1669
|
+
description: "Resting-edge colour. A component's own `--<component>-border` override still wins over it.",
|
|
1670
|
+
consumers: each([INPUT, TEXTAREA, SELECT, CHECKBOX, TAG_INPUT, CHIP, FILE_UPLOAD, EMPTY_STATE, BUTTON], "var(--border-default, #e5e7eb)")
|
|
1671
|
+
},
|
|
1672
|
+
{
|
|
1673
|
+
key: "edge-style",
|
|
1674
|
+
property: "outline-style",
|
|
1675
|
+
description: "Resting-edge style for solid edges.",
|
|
1676
|
+
consumers: each([...EDGE_CONTROLS, CHIP], "solid")
|
|
1677
|
+
},
|
|
1678
|
+
{
|
|
1679
|
+
key: "drop-edge-width",
|
|
1680
|
+
property: "outline-width",
|
|
1681
|
+
description: "Dashed-edge weight (file-upload draws it at 2\xD7). Follows `edge-width` unless set \u2014 set it alone to keep dashed edges while solid edges are off.",
|
|
1682
|
+
consumers: each([FILE_UPLOAD, EMPTY_STATE], "var(--control-edge-width, 1px)")
|
|
1683
|
+
},
|
|
1684
|
+
{
|
|
1685
|
+
key: "drop-edge-style",
|
|
1686
|
+
property: "outline-style",
|
|
1687
|
+
description: "Dashed-edge style for drop targets and empty states.",
|
|
1688
|
+
consumers: each([FILE_UPLOAD, EMPTY_STATE], "dashed")
|
|
1689
|
+
},
|
|
1690
|
+
{
|
|
1691
|
+
key: "state-edge-width",
|
|
1692
|
+
property: "outline-width",
|
|
1693
|
+
description: "Focus and invalid edge weight. Independent of `edge-width`, so focus and invalid stay visible with edges off.",
|
|
1694
|
+
consumers: each([INPUT, TEXTAREA, SELECT, CHECKBOX, SWITCH, TAG_INPUT], "1px")
|
|
1695
|
+
}
|
|
1696
|
+
]
|
|
1697
|
+
};
|
|
1698
|
+
var fieldFamily = {
|
|
1699
|
+
family: "field",
|
|
1700
|
+
prefix: "field",
|
|
1701
|
+
description: "Field label treatment \u2014 size, case, tracking and colour of `FieldLabel`, in both densities.",
|
|
1702
|
+
tokens: [
|
|
1703
|
+
{
|
|
1704
|
+
key: "label-font-size",
|
|
1705
|
+
property: "font-size",
|
|
1706
|
+
description: "Label type size. Drives both the standard and editorial-density steps.",
|
|
1707
|
+
consumers: [
|
|
1708
|
+
{ file: FIELD, fallback: "var(--font-size-sm, 0.875rem)" },
|
|
1709
|
+
{ file: FIELD, fallback: "13px" }
|
|
1710
|
+
]
|
|
1711
|
+
},
|
|
1712
|
+
{ key: "label-text-transform", property: "text-transform", description: "Label casing.", consumers: at(FIELD, "revert-layer") },
|
|
1713
|
+
{ key: "label-letter-spacing", property: "letter-spacing", description: "Label tracking.", consumers: at(FIELD, "revert-layer") },
|
|
1714
|
+
{
|
|
1715
|
+
key: "label-color",
|
|
1716
|
+
property: "color",
|
|
1717
|
+
description: "Label colour. Drives both the standard and editorial-density steps.",
|
|
1718
|
+
consumers: [
|
|
1719
|
+
{ file: FIELD, fallback: "var(--text-primary, currentColor)" },
|
|
1720
|
+
{ file: FIELD, fallback: "var(--text-secondary)" }
|
|
1721
|
+
]
|
|
1722
|
+
}
|
|
1723
|
+
]
|
|
1724
|
+
};
|
|
1725
|
+
var BUTTON_SIZES = [
|
|
1726
|
+
{ size: "sm", fontSize: ["var(--font-size-xs, 0.75rem)", "0.8125rem"], radius: "var(--radius-md, 0.375rem)" },
|
|
1727
|
+
{ size: "md", fontSize: ["var(--font-size-sm, 0.875rem)"], radius: "var(--radius-md, 0.375rem)" },
|
|
1728
|
+
{ size: "lg", fontSize: ["var(--font-size-base, 1rem)"], radius: "var(--radius-md, 0.375rem)" },
|
|
1729
|
+
{ size: "dlg", fontSize: ["var(--font-size-2xs, 0.6875rem)"], radius: "var(--radius-lg, 0.5rem)" }
|
|
1730
|
+
];
|
|
1731
|
+
var buttonFamily = {
|
|
1732
|
+
family: "button",
|
|
1733
|
+
prefix: "button",
|
|
1734
|
+
description: "Button type treatment and rounding. The unprefixed keys set every size at once; a size key (`dlg-radius`) overrides one size.",
|
|
1735
|
+
tokens: [
|
|
1736
|
+
{
|
|
1737
|
+
key: "text-transform",
|
|
1738
|
+
property: "text-transform",
|
|
1739
|
+
description: "Casing for every size.",
|
|
1740
|
+
consumers: BUTTON_SIZES.map(() => ({ file: BUTTON, fallback: "revert-layer" }))
|
|
1741
|
+
},
|
|
1742
|
+
{
|
|
1743
|
+
key: "letter-spacing",
|
|
1744
|
+
property: "letter-spacing",
|
|
1745
|
+
description: "Tracking for every size.",
|
|
1746
|
+
consumers: BUTTON_SIZES.map(() => ({ file: BUTTON, fallback: "revert-layer" }))
|
|
1747
|
+
},
|
|
1748
|
+
{
|
|
1749
|
+
key: "radius",
|
|
1750
|
+
property: "border-radius",
|
|
1751
|
+
description: "Corner rounding for every size (`999px` for a pill).",
|
|
1752
|
+
consumers: [
|
|
1753
|
+
...BUTTON_SIZES.map(({ radius }) => ({ file: BUTTON, fallback: radius })),
|
|
1754
|
+
{ file: BUTTON, fallback: "var(--radius-md, 0.375rem)" }
|
|
1755
|
+
]
|
|
1756
|
+
},
|
|
1757
|
+
...BUTTON_SIZES.flatMap(({ size, fontSize, radius }) => [
|
|
1758
|
+
{
|
|
1759
|
+
key: `${size}-font-size`,
|
|
1760
|
+
property: "font-size",
|
|
1761
|
+
description: fontSize.length > 1 ? `\`${size}\` type size. Drives both the standard and editorial-density steps.` : `\`${size}\` type size.`,
|
|
1762
|
+
consumers: fontSize.map((fallback) => ({ file: BUTTON, fallback }))
|
|
1763
|
+
},
|
|
1764
|
+
{
|
|
1765
|
+
key: `${size}-text-transform`,
|
|
1766
|
+
property: "text-transform",
|
|
1767
|
+
description: `\`${size}\` casing.`,
|
|
1768
|
+
consumers: at(BUTTON, "var(--button-text-transform, revert-layer)")
|
|
1769
|
+
},
|
|
1770
|
+
{
|
|
1771
|
+
key: `${size}-letter-spacing`,
|
|
1772
|
+
property: "letter-spacing",
|
|
1773
|
+
description: `\`${size}\` tracking.`,
|
|
1774
|
+
consumers: at(BUTTON, "var(--button-letter-spacing, revert-layer)")
|
|
1775
|
+
},
|
|
1776
|
+
{
|
|
1777
|
+
key: `${size}-radius`,
|
|
1778
|
+
property: "border-radius",
|
|
1779
|
+
description: `\`${size}\` corner rounding.`,
|
|
1780
|
+
consumers: at(BUTTON, `var(--button-radius, ${radius})`)
|
|
1781
|
+
}
|
|
1782
|
+
]),
|
|
1783
|
+
// VI-659: the icon-only size. A square box of glyph + 2 × pad.
|
|
1784
|
+
// VI-658: InlineEdit's pencil is the same mark, so it reads the same size,
|
|
1785
|
+
// pad and ink.
|
|
1786
|
+
{
|
|
1787
|
+
key: "icon-size",
|
|
1788
|
+
property: "width / height / font-size",
|
|
1789
|
+
description: 'Icon-only (`size="icon"`) glyph size. The square box is this plus `icon-pad` on every side. Also sizes the InlineEdit pencil and the SaveStatus retry mark.',
|
|
1790
|
+
consumers: [...each(Array(5).fill(BUTTON), "1rem"), ...each(Array(3).fill(INLINE_EDIT), "1rem"), ...each(Array(3).fill(SAVE_STATUS), "1rem")]
|
|
1791
|
+
},
|
|
1792
|
+
{
|
|
1793
|
+
key: "icon-pad",
|
|
1794
|
+
property: "width / height",
|
|
1795
|
+
description: "Icon-only hit-target pad around the glyph, on every side. Also the hit target of the InlineEdit pencil and the SaveStatus retry mark.",
|
|
1796
|
+
consumers: [...each([BUTTON, BUTTON], "var(--spacing-2, 0.5rem)"), ...at(INLINE_EDIT, "var(--spacing-2, 0.5rem)"), ...at(SAVE_STATUS, "var(--spacing-2, 0.5rem)")]
|
|
1797
|
+
},
|
|
1798
|
+
{
|
|
1799
|
+
key: "icon-radius",
|
|
1800
|
+
property: "border-radius",
|
|
1801
|
+
description: "Icon-only corner rounding (`999px` for a round mark).",
|
|
1802
|
+
consumers: at(BUTTON, "var(--button-radius, var(--radius-md, 0.375rem))")
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
key: "icon-ghost-color",
|
|
1806
|
+
property: "color",
|
|
1807
|
+
description: "Icon-only ghost ink at rest. Hover comes up to `--text-primary`. Also the ink of the InlineEdit pencil and the SaveStatus retry mark.",
|
|
1808
|
+
consumers: [...at(BUTTON, "var(--text-secondary, #6b7280)"), ...at(INLINE_EDIT, "var(--text-secondary, #6b7280)"), ...at(SAVE_STATUS, "var(--text-secondary, #6b7280)")]
|
|
1809
|
+
}
|
|
1810
|
+
]
|
|
1811
|
+
};
|
|
1812
|
+
var TEXT_SIZES = [
|
|
1813
|
+
{ size: "xs", fontSize: "var(--font-size-xs, 0.75rem)" },
|
|
1814
|
+
{ size: "sm", fontSize: "var(--font-size-sm, 0.875rem)" },
|
|
1815
|
+
{ size: "md", fontSize: "var(--font-size-base, 1rem)" },
|
|
1816
|
+
{ size: "lg", fontSize: "var(--font-size-lg, 1.125rem)" },
|
|
1817
|
+
{ size: "xl", fontSize: "var(--font-size-xl, 1.25rem)" }
|
|
1818
|
+
];
|
|
1819
|
+
var textFamily = {
|
|
1820
|
+
family: "text",
|
|
1821
|
+
prefix: "text",
|
|
1822
|
+
description: "Text type treatment, per size \u2014 set `sm-font-size: 13px` for a 13px step, or caps and tracking on `xs` for a state tag. Every key begins with a size.",
|
|
1823
|
+
tokens: TEXT_SIZES.flatMap(({ size, fontSize }) => [
|
|
1824
|
+
{ key: `${size}-font-size`, property: "font-size", description: `\`${size}\` type size.`, consumers: at(TEXT, fontSize) },
|
|
1825
|
+
{ key: `${size}-text-transform`, property: "text-transform", description: `\`${size}\` casing.`, consumers: at(TEXT, "revert-layer") },
|
|
1826
|
+
{ key: `${size}-letter-spacing`, property: "letter-spacing", description: `\`${size}\` tracking.`, consumers: at(TEXT, "revert-layer") }
|
|
1827
|
+
])
|
|
1828
|
+
};
|
|
1829
|
+
var switchFamily = {
|
|
1830
|
+
family: "switch",
|
|
1831
|
+
prefix: "switch",
|
|
1832
|
+
description: 'Switch track and knob dimensions (default size; `size="sm"` keeps its own). Set `knob-inset` to size the knob from the track: it sits that far from the track\'s outer edge on every side.',
|
|
1833
|
+
tokens: [
|
|
1834
|
+
{ key: "track-width", property: "width", description: "Track width.", consumers: at(SWITCH, "2rem") },
|
|
1835
|
+
{
|
|
1836
|
+
key: "track-height",
|
|
1837
|
+
property: "height",
|
|
1838
|
+
description: "Track height. With `knob-inset` set, the knob is the track height less the inset on both sides.",
|
|
1839
|
+
consumers: at(SWITCH, "1.15rem")
|
|
1840
|
+
},
|
|
1841
|
+
{
|
|
1842
|
+
key: "knob-inset",
|
|
1843
|
+
property: "width / height / transform (knob)",
|
|
1844
|
+
description: "Gap between the knob and the track's outer edge, on every side. Unset, the knob keeps its shipped 1rem size and position.",
|
|
1845
|
+
consumers: at(SWITCH, null)
|
|
1846
|
+
},
|
|
1847
|
+
{ key: "track-bg", property: "background-color", description: "Unchecked track fill.", consumers: at(SWITCH, "var(--border-default, #e5e7eb)") },
|
|
1848
|
+
{
|
|
1849
|
+
key: "edge-color",
|
|
1850
|
+
property: "outline-color",
|
|
1851
|
+
description: "Track edge colour \u2014 transparent by default. Width and style come from the shared `control` edge, so `control.edge-width: 0` turns it off.",
|
|
1852
|
+
consumers: at(SWITCH, "transparent")
|
|
1853
|
+
}
|
|
1854
|
+
]
|
|
1855
|
+
};
|
|
1856
|
+
var saveStatusFamily = {
|
|
1857
|
+
family: "save-status",
|
|
1858
|
+
prefix: "save-status",
|
|
1859
|
+
description: "SaveStatus readout \u2014 the fixed-width slot and its type, so the readout never reflows its row.",
|
|
1860
|
+
tokens: [
|
|
1861
|
+
{ key: "width", property: "width", description: "Slot width. Fixed, so the row never reflows between states.", consumers: at(SAVE_STATUS, "7.5rem") },
|
|
1862
|
+
{ key: "font-family", property: "font-family", description: "Readout family (e.g. the theme's mono).", consumers: at(SAVE_STATUS, "revert-layer") },
|
|
1863
|
+
{ key: "text-transform", property: "text-transform", description: "Readout casing.", consumers: at(SAVE_STATUS, "revert-layer") },
|
|
1864
|
+
{ key: "letter-spacing", property: "letter-spacing", description: "Readout tracking.", consumers: at(SAVE_STATUS, "revert-layer") }
|
|
1612
1865
|
]
|
|
1613
1866
|
};
|
|
1614
1867
|
var adminUiFamily = {
|
|
@@ -1639,6 +1892,12 @@ var COMPONENT_TOKEN_FAMILIES = [
|
|
|
1639
1892
|
skeletonFamily,
|
|
1640
1893
|
spinnerFamily,
|
|
1641
1894
|
checkboxFamily,
|
|
1895
|
+
controlFamily,
|
|
1896
|
+
fieldFamily,
|
|
1897
|
+
buttonFamily,
|
|
1898
|
+
textFamily,
|
|
1899
|
+
switchFamily,
|
|
1900
|
+
saveStatusFamily,
|
|
1642
1901
|
adminUiFamily
|
|
1643
1902
|
];
|
|
1644
1903
|
var COMPONENT_TOKEN_FAMILY_BY_NAME = new Map(
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { F as FontResolveOptions, a as FontResolution, V as VisorTypography, b as FontDisplayStrategy, T as ThemeFontResult, G as GoogleFontEntry, c as VisorBrand, B as BrandSlot, d as BrandSource, e as BrandResolution, C as ColorScheme, f as ThemeBrandResult, g as BrandStrategy, h as BrandStrategyContext, i as BrandStrategyIssue, j as BrandStrategyValidationResult, S as SerializedBrandStrategy, R as ResolvedThemeConfig, k as GeneratedPrimitives, l as ThemeOutput, m as ThemeData, n as VisorThemeConfig, o as FullShadeScale, p as ColorRole, q as SelectiveShadeScale, r as RGB, P as ParsedColor, O as OKLCH, s as SemanticTokens, t as ShadeStep } from './types-
|
|
2
|
-
export { u as BRAND_VARIANTS, v as BRAND_VISIBILITIES, w as BrandAccessibility, x as BrandArchetype, y as BrandBoilerplate, z as BrandColorPairing, A as BrandColorUsage, D as BrandContrastTarget, E as BrandGoverns, H as BrandLexiconEntry, I as BrandMessaging, J as BrandPersonalityTrait, K as BrandPillar, L as BrandPositioning, M as BrandStrategyIssueSeverity, N as BrandToneEntry, Q as BrandVariant, U as BrandVisibility, W as BrandVoice, X as BrandVoiceTrait, Y as COMPONENT_TOKEN_FAMILIES, Z as COMPONENT_TOKEN_FAMILY_BY_NAME, _ as ColorFormat, $ as ComponentTokenBinding, a0 as ComponentTokenBindings, a1 as ComponentTokenConsumer, a2 as ComponentTokenFamily, a3 as ComponentTokenSpec, a4 as DEFAULT_BRAND_STRATEGY_SURFACES, a5 as DEFAULT_BRAND_STRATEGY_TONE_STATES, a6 as FontSource, a7 as GOVERNS_WILDCARD, a8 as RGBA, a9 as ResolvedComponentTokens, aa as SemanticTokenValue, ab as allComponentTokenNames, ac as componentTokenName, ad as hasComponentBindings, ae as resolveComponentBindings, af as validateComponentBindings } from './types-
|
|
1
|
+
import { F as FontResolveOptions, a as FontResolution, V as VisorTypography, b as FontDisplayStrategy, T as ThemeFontResult, G as GoogleFontEntry, c as VisorBrand, B as BrandSlot, d as BrandSource, e as BrandResolution, C as ColorScheme, f as ThemeBrandResult, g as BrandStrategy, h as BrandStrategyContext, i as BrandStrategyIssue, j as BrandStrategyValidationResult, S as SerializedBrandStrategy, R as ResolvedThemeConfig, k as GeneratedPrimitives, l as ThemeOutput, m as ThemeData, n as VisorThemeConfig, o as FullShadeScale, p as ColorRole, q as SelectiveShadeScale, r as RGB, P as ParsedColor, O as OKLCH, s as SemanticTokens, t as ShadeStep } from './types-Wy5n0W9F.js';
|
|
2
|
+
export { u as BRAND_VARIANTS, v as BRAND_VISIBILITIES, w as BrandAccessibility, x as BrandArchetype, y as BrandBoilerplate, z as BrandColorPairing, A as BrandColorUsage, D as BrandContrastTarget, E as BrandGoverns, H as BrandLexiconEntry, I as BrandMessaging, J as BrandPersonalityTrait, K as BrandPillar, L as BrandPositioning, M as BrandStrategyIssueSeverity, N as BrandToneEntry, Q as BrandVariant, U as BrandVisibility, W as BrandVoice, X as BrandVoiceTrait, Y as COMPONENT_TOKEN_FAMILIES, Z as COMPONENT_TOKEN_FAMILY_BY_NAME, _ as ColorFormat, $ as ComponentTokenBinding, a0 as ComponentTokenBindings, a1 as ComponentTokenConsumer, a2 as ComponentTokenFamily, a3 as ComponentTokenSpec, a4 as DEFAULT_BRAND_STRATEGY_SURFACES, a5 as DEFAULT_BRAND_STRATEGY_TONE_STATES, a6 as FontSource, a7 as GOVERNS_WILDCARD, a8 as RGBA, a9 as ResolvedComponentTokens, aa as SemanticTokenValue, ab as allComponentTokenNames, ac as componentTokenName, ad as hasComponentBindings, ae as resolveComponentBindings, af as validateComponentBindings } from './types-Wy5n0W9F.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Font resolver — maps font family names to loadable font resources.
|
|
@@ -400,6 +400,14 @@ var properties = {
|
|
|
400
400
|
],
|
|
401
401
|
description: "Brand constraint declaring which color modes the theme supports. 'dark-only'/'light-only' lock the brand to a single mode; 'adaptive' supports both. Complements 'default-mode' (the runtime default) — 'color-scheme' is authoritative for the brand-lock. Defaults to 'adaptive' when omitted. Optional."
|
|
402
402
|
},
|
|
403
|
+
edges: {
|
|
404
|
+
type: "string",
|
|
405
|
+
"enum": [
|
|
406
|
+
"on",
|
|
407
|
+
"off"
|
|
408
|
+
],
|
|
409
|
+
description: "The one switch for form-control edges (VI-655). 'off' removes the resting edge of every form control, dashed drop-target and empty-state edges included, with no layout shift; focus and invalid stay visible. Shorthand for components.control.edge-width: \"0\" (an explicit binding there wins). Defaults to 'on'. Optional."
|
|
410
|
+
},
|
|
403
411
|
colors: {
|
|
404
412
|
type: "object",
|
|
405
413
|
description: "Color definitions for light mode. Only primary is required — all others have sensible defaults.",
|
|
@@ -1123,7 +1131,14 @@ var properties = {
|
|
|
1123
1131
|
},
|
|
1124
1132
|
checkbox: {
|
|
1125
1133
|
type: "object",
|
|
1126
|
-
description: "Control sizing — the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, bg-checked, border-checked.",
|
|
1134
|
+
description: "Control sizing — the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, edgeless-bg, bg-checked, border-checked.",
|
|
1135
|
+
additionalProperties: {
|
|
1136
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1137
|
+
}
|
|
1138
|
+
},
|
|
1139
|
+
control: {
|
|
1140
|
+
type: "object",
|
|
1141
|
+
description: "The one switch for form-control edges (VI-655). Every form control draws its resting edge from these, so `edge-width: 0` removes every resting edge at once, dashed edges included, with no layout shift. Keys: edge-width, edge-color, edge-style, drop-edge-width, drop-edge-style, state-edge-width.",
|
|
1127
1142
|
additionalProperties: {
|
|
1128
1143
|
$ref: "#/$defs/componentTokenBinding"
|
|
1129
1144
|
}
|
|
@@ -1135,6 +1150,41 @@ var properties = {
|
|
|
1135
1150
|
$ref: "#/$defs/componentTokenBinding"
|
|
1136
1151
|
}
|
|
1137
1152
|
},
|
|
1153
|
+
field: {
|
|
1154
|
+
type: "object",
|
|
1155
|
+
description: "Field label treatment — size, case, tracking and colour of `FieldLabel`, in both densities. Keys: label-font-size, label-text-transform, label-letter-spacing, label-color.",
|
|
1156
|
+
additionalProperties: {
|
|
1157
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1158
|
+
}
|
|
1159
|
+
},
|
|
1160
|
+
button: {
|
|
1161
|
+
type: "object",
|
|
1162
|
+
description: "Button type treatment and rounding. The unprefixed keys set every size at once; a size key (`dlg-radius`) overrides one size. Keys: text-transform, letter-spacing, radius, sm-font-size, sm-text-transform, sm-letter-spacing, sm-radius, md-font-size, md-text-transform, md-letter-spacing, md-radius, lg-font-size, lg-text-transform, lg-letter-spacing, lg-radius, dlg-font-size, dlg-text-transform, dlg-letter-spacing, dlg-radius, icon-size, icon-pad, icon-radius, icon-ghost-color.",
|
|
1163
|
+
additionalProperties: {
|
|
1164
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1165
|
+
}
|
|
1166
|
+
},
|
|
1167
|
+
text: {
|
|
1168
|
+
type: "object",
|
|
1169
|
+
description: "Text type treatment, per size — set `sm-font-size: 13px` for a 13px step, or caps and tracking on `xs` for a state tag. Every key begins with a size. Keys: xs-font-size, xs-text-transform, xs-letter-spacing, sm-font-size, sm-text-transform, sm-letter-spacing, md-font-size, md-text-transform, md-letter-spacing, lg-font-size, lg-text-transform, lg-letter-spacing, xl-font-size, xl-text-transform, xl-letter-spacing.",
|
|
1170
|
+
additionalProperties: {
|
|
1171
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1172
|
+
}
|
|
1173
|
+
},
|
|
1174
|
+
"switch": {
|
|
1175
|
+
type: "object",
|
|
1176
|
+
description: "Switch track and knob dimensions (default size; `size=\"sm\"` keeps its own). Set `knob-inset` to size the knob from the track: it sits that far from the track's outer edge on every side. Keys: track-width, track-height, knob-inset, track-bg, edge-color.",
|
|
1177
|
+
additionalProperties: {
|
|
1178
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1179
|
+
}
|
|
1180
|
+
},
|
|
1181
|
+
"save-status": {
|
|
1182
|
+
type: "object",
|
|
1183
|
+
description: "SaveStatus readout — the fixed-width slot and its type, so the readout never reflows its row. Keys: width, font-family, text-transform, letter-spacing.",
|
|
1184
|
+
additionalProperties: {
|
|
1185
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1186
|
+
}
|
|
1187
|
+
},
|
|
1138
1188
|
"admin-ui": {
|
|
1139
1189
|
type: "object",
|
|
1140
1190
|
description: "Structural roles the admin-ui pattern owns. `marquee-family` is the display face for KPI hero figures and marquee page titles — the role the admin-ui portability audit named as the one piece of ENTR brand coupling a new theme must rebind. Keys: marquee-family.",
|
package/dist/index.js
CHANGED
|
@@ -63,7 +63,7 @@ import {
|
|
|
63
63
|
rgbToOklch,
|
|
64
64
|
serializeColor,
|
|
65
65
|
validateComponentBindings
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-L5DQDEZV.js";
|
|
67
67
|
|
|
68
68
|
// src/fonts/validate-coverage.ts
|
|
69
69
|
var FONT_VAR_RE = /--font-(heading|display|body|sans|mono)\s*:\s*([^;]+);/g;
|
|
@@ -650,6 +650,11 @@ var visor_theme_schema_default = {
|
|
|
650
650
|
enum: ["dark-only", "light-only", "adaptive"],
|
|
651
651
|
description: "Brand constraint declaring which color modes the theme supports. 'dark-only'/'light-only' lock the brand to a single mode; 'adaptive' supports both. Complements 'default-mode' (the runtime default) \u2014 'color-scheme' is authoritative for the brand-lock. Defaults to 'adaptive' when omitted. Optional."
|
|
652
652
|
},
|
|
653
|
+
edges: {
|
|
654
|
+
type: "string",
|
|
655
|
+
enum: ["on", "off"],
|
|
656
|
+
description: `The one switch for form-control edges (VI-655). 'off' removes the resting edge of every form control, dashed drop-target and empty-state edges included, with no layout shift; focus and invalid stay visible. Shorthand for components.control.edge-width: "0" (an explicit binding there wins). Defaults to 'on'. Optional.`
|
|
657
|
+
},
|
|
653
658
|
colors: {
|
|
654
659
|
type: "object",
|
|
655
660
|
description: "Color definitions for light mode. Only primary is required \u2014 all others have sensible defaults.",
|
|
@@ -1165,7 +1170,14 @@ var visor_theme_schema_default = {
|
|
|
1165
1170
|
},
|
|
1166
1171
|
checkbox: {
|
|
1167
1172
|
type: "object",
|
|
1168
|
-
description: "Control sizing \u2014 the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, bg-checked, border-checked.",
|
|
1173
|
+
description: "Control sizing \u2014 the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, edgeless-bg, bg-checked, border-checked.",
|
|
1174
|
+
additionalProperties: {
|
|
1175
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1176
|
+
}
|
|
1177
|
+
},
|
|
1178
|
+
control: {
|
|
1179
|
+
type: "object",
|
|
1180
|
+
description: "The one switch for form-control edges (VI-655). Every form control draws its resting edge from these, so `edge-width: 0` removes every resting edge at once, dashed edges included, with no layout shift. Keys: edge-width, edge-color, edge-style, drop-edge-width, drop-edge-style, state-edge-width.",
|
|
1169
1181
|
additionalProperties: {
|
|
1170
1182
|
$ref: "#/$defs/componentTokenBinding"
|
|
1171
1183
|
}
|
|
@@ -1177,6 +1189,41 @@ var visor_theme_schema_default = {
|
|
|
1177
1189
|
$ref: "#/$defs/componentTokenBinding"
|
|
1178
1190
|
}
|
|
1179
1191
|
},
|
|
1192
|
+
field: {
|
|
1193
|
+
type: "object",
|
|
1194
|
+
description: "Field label treatment \u2014 size, case, tracking and colour of `FieldLabel`, in both densities. Keys: label-font-size, label-text-transform, label-letter-spacing, label-color.",
|
|
1195
|
+
additionalProperties: {
|
|
1196
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1197
|
+
}
|
|
1198
|
+
},
|
|
1199
|
+
button: {
|
|
1200
|
+
type: "object",
|
|
1201
|
+
description: "Button type treatment and rounding. The unprefixed keys set every size at once; a size key (`dlg-radius`) overrides one size. Keys: text-transform, letter-spacing, radius, sm-font-size, sm-text-transform, sm-letter-spacing, sm-radius, md-font-size, md-text-transform, md-letter-spacing, md-radius, lg-font-size, lg-text-transform, lg-letter-spacing, lg-radius, dlg-font-size, dlg-text-transform, dlg-letter-spacing, dlg-radius, icon-size, icon-pad, icon-radius, icon-ghost-color.",
|
|
1202
|
+
additionalProperties: {
|
|
1203
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1204
|
+
}
|
|
1205
|
+
},
|
|
1206
|
+
text: {
|
|
1207
|
+
type: "object",
|
|
1208
|
+
description: "Text type treatment, per size \u2014 set `sm-font-size: 13px` for a 13px step, or caps and tracking on `xs` for a state tag. Every key begins with a size. Keys: xs-font-size, xs-text-transform, xs-letter-spacing, sm-font-size, sm-text-transform, sm-letter-spacing, md-font-size, md-text-transform, md-letter-spacing, lg-font-size, lg-text-transform, lg-letter-spacing, xl-font-size, xl-text-transform, xl-letter-spacing.",
|
|
1209
|
+
additionalProperties: {
|
|
1210
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1211
|
+
}
|
|
1212
|
+
},
|
|
1213
|
+
switch: {
|
|
1214
|
+
type: "object",
|
|
1215
|
+
description: 'Switch track and knob dimensions (default size; `size="sm"` keeps its own). Set `knob-inset` to size the knob from the track: it sits that far from the track\'s outer edge on every side. Keys: track-width, track-height, knob-inset, track-bg, edge-color.',
|
|
1216
|
+
additionalProperties: {
|
|
1217
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1218
|
+
}
|
|
1219
|
+
},
|
|
1220
|
+
"save-status": {
|
|
1221
|
+
type: "object",
|
|
1222
|
+
description: "SaveStatus readout \u2014 the fixed-width slot and its type, so the readout never reflows its row. Keys: width, font-family, text-transform, letter-spacing.",
|
|
1223
|
+
additionalProperties: {
|
|
1224
|
+
$ref: "#/$defs/componentTokenBinding"
|
|
1225
|
+
}
|
|
1226
|
+
},
|
|
1180
1227
|
"admin-ui": {
|
|
1181
1228
|
type: "object",
|
|
1182
1229
|
description: "Structural roles the admin-ui pattern owns. `marquee-family` is the display face for KPI hero figures and marquee page titles \u2014 the role the admin-ui portability audit named as the one piece of ENTR brand coupling a new theme must rebind. Keys: marquee-family.",
|
|
@@ -1461,7 +1508,8 @@ var KNOWN_TOP_LEVEL_KEYS = /* @__PURE__ */ new Set([
|
|
|
1461
1508
|
"strokeWidths",
|
|
1462
1509
|
"motion",
|
|
1463
1510
|
"overrides",
|
|
1464
|
-
"components"
|
|
1511
|
+
"components",
|
|
1512
|
+
"edges"
|
|
1465
1513
|
]);
|
|
1466
1514
|
var KNOWN_COLOR_KEYS = /* @__PURE__ */ new Set([
|
|
1467
1515
|
"primary",
|
|
@@ -1740,6 +1788,9 @@ function validateConfig(config) {
|
|
|
1740
1788
|
errors.push("'color-scheme' must be one of: dark-only, light-only, adaptive");
|
|
1741
1789
|
}
|
|
1742
1790
|
}
|
|
1791
|
+
if (obj.edges !== void 0 && obj.edges !== "on" && obj.edges !== "off") {
|
|
1792
|
+
errors.push("'edges' must be either 'on' or 'off'");
|
|
1793
|
+
}
|
|
1743
1794
|
if (typeof obj.colors !== "object" || obj.colors === null) {
|
|
1744
1795
|
errors.push("'colors' is required and must be an object");
|
|
1745
1796
|
return { valid: false, errors };
|
|
@@ -2120,7 +2171,12 @@ function resolveConfig(config) {
|
|
|
2120
2171
|
overrides: config.overrides,
|
|
2121
2172
|
// VI-625: component bindings pass through untouched — the contract in
|
|
2122
2173
|
// component-tokens.ts owns their shape, there is nothing to default.
|
|
2123
|
-
|
|
2174
|
+
// VI-655: `edges: off` folds in here as `control.edge-width: 0`, so every
|
|
2175
|
+
// adapter emits the switch through the same component-token path.
|
|
2176
|
+
components: config.edges === "off" ? {
|
|
2177
|
+
...config.components,
|
|
2178
|
+
control: { "edge-width": "0", ...config.components?.control }
|
|
2179
|
+
} : config.components,
|
|
2124
2180
|
originalColors,
|
|
2125
2181
|
colorFormats
|
|
2126
2182
|
};
|
|
@@ -830,6 +830,14 @@ interface VisorThemeConfig {
|
|
|
830
830
|
* did before the contract existed.
|
|
831
831
|
*/
|
|
832
832
|
components?: ComponentTokenBindings;
|
|
833
|
+
/**
|
|
834
|
+
* VI-655: the one switch for form-control edges. `off` removes the resting
|
|
835
|
+
* edge of every form control — dashed drop-target and empty-state edges
|
|
836
|
+
* included — with no layout shift; focus and invalid stay visible. It is
|
|
837
|
+
* shorthand for `components.control.edge-width: "0"`, and an explicit
|
|
838
|
+
* `components.control.edge-width` wins over it. Default: `on`.
|
|
839
|
+
*/
|
|
840
|
+
edges?: "on" | "off";
|
|
833
841
|
/**
|
|
834
842
|
* Migration metadata — optional, additive, consumed by `visor migrate` commands.
|
|
835
843
|
* Does not affect CSS generation or theme application.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loworbitstudio/visor-theme-engine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Theme engine for the Visor design system — shade generation, token mapping, font resolution, and import/export for .visor.yaml themes.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
"enum": ["dark-only", "light-only", "adaptive"],
|
|
35
35
|
"description": "Brand constraint declaring which color modes the theme supports. 'dark-only'/'light-only' lock the brand to a single mode; 'adaptive' supports both. Complements 'default-mode' (the runtime default) — 'color-scheme' is authoritative for the brand-lock. Defaults to 'adaptive' when omitted. Optional."
|
|
36
36
|
},
|
|
37
|
+
"edges": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"enum": ["on", "off"],
|
|
40
|
+
"description": "The one switch for form-control edges (VI-655). 'off' removes the resting edge of every form control, dashed drop-target and empty-state edges included, with no layout shift; focus and invalid stay visible. Shorthand for components.control.edge-width: \"0\" (an explicit binding there wins). Defaults to 'on'. Optional."
|
|
41
|
+
},
|
|
37
42
|
"colors": {
|
|
38
43
|
"type": "object",
|
|
39
44
|
"description": "Color definitions for light mode. Only primary is required — all others have sensible defaults.",
|
|
@@ -549,7 +554,14 @@
|
|
|
549
554
|
},
|
|
550
555
|
"checkbox": {
|
|
551
556
|
"type": "object",
|
|
552
|
-
"description": "Control sizing — the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, bg-checked, border-checked.",
|
|
557
|
+
"description": "Control sizing — the D3 Tier-2 `--checkbox-size` / `-radius` / `-bg` / `-border` set, promoted from the admin-ui audit to a bindable contract. Keys: size, radius, bg, border, edgeless-bg, bg-checked, border-checked.",
|
|
558
|
+
"additionalProperties": {
|
|
559
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"control": {
|
|
563
|
+
"type": "object",
|
|
564
|
+
"description": "The one switch for form-control edges (VI-655). Every form control draws its resting edge from these, so `edge-width: 0` removes every resting edge at once, dashed edges included, with no layout shift. Keys: edge-width, edge-color, edge-style, drop-edge-width, drop-edge-style, state-edge-width.",
|
|
553
565
|
"additionalProperties": {
|
|
554
566
|
"$ref": "#/$defs/componentTokenBinding"
|
|
555
567
|
}
|
|
@@ -561,6 +573,41 @@
|
|
|
561
573
|
"$ref": "#/$defs/componentTokenBinding"
|
|
562
574
|
}
|
|
563
575
|
},
|
|
576
|
+
"field": {
|
|
577
|
+
"type": "object",
|
|
578
|
+
"description": "Field label treatment — size, case, tracking and colour of `FieldLabel`, in both densities. Keys: label-font-size, label-text-transform, label-letter-spacing, label-color.",
|
|
579
|
+
"additionalProperties": {
|
|
580
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
"button": {
|
|
584
|
+
"type": "object",
|
|
585
|
+
"description": "Button type treatment and rounding. The unprefixed keys set every size at once; a size key (`dlg-radius`) overrides one size. Keys: text-transform, letter-spacing, radius, sm-font-size, sm-text-transform, sm-letter-spacing, sm-radius, md-font-size, md-text-transform, md-letter-spacing, md-radius, lg-font-size, lg-text-transform, lg-letter-spacing, lg-radius, dlg-font-size, dlg-text-transform, dlg-letter-spacing, dlg-radius, icon-size, icon-pad, icon-radius, icon-ghost-color.",
|
|
586
|
+
"additionalProperties": {
|
|
587
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
588
|
+
}
|
|
589
|
+
},
|
|
590
|
+
"text": {
|
|
591
|
+
"type": "object",
|
|
592
|
+
"description": "Text type treatment, per size — set `sm-font-size: 13px` for a 13px step, or caps and tracking on `xs` for a state tag. Every key begins with a size. Keys: xs-font-size, xs-text-transform, xs-letter-spacing, sm-font-size, sm-text-transform, sm-letter-spacing, md-font-size, md-text-transform, md-letter-spacing, lg-font-size, lg-text-transform, lg-letter-spacing, xl-font-size, xl-text-transform, xl-letter-spacing.",
|
|
593
|
+
"additionalProperties": {
|
|
594
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
595
|
+
}
|
|
596
|
+
},
|
|
597
|
+
"switch": {
|
|
598
|
+
"type": "object",
|
|
599
|
+
"description": "Switch track and knob dimensions (default size; `size=\"sm\"` keeps its own). Set `knob-inset` to size the knob from the track: it sits that far from the track's outer edge on every side. Keys: track-width, track-height, knob-inset, track-bg, edge-color.",
|
|
600
|
+
"additionalProperties": {
|
|
601
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
602
|
+
}
|
|
603
|
+
},
|
|
604
|
+
"save-status": {
|
|
605
|
+
"type": "object",
|
|
606
|
+
"description": "SaveStatus readout — the fixed-width slot and its type, so the readout never reflows its row. Keys: width, font-family, text-transform, letter-spacing.",
|
|
607
|
+
"additionalProperties": {
|
|
608
|
+
"$ref": "#/$defs/componentTokenBinding"
|
|
609
|
+
}
|
|
610
|
+
},
|
|
564
611
|
"admin-ui": {
|
|
565
612
|
"type": "object",
|
|
566
613
|
"description": "Structural roles the admin-ui pattern owns. `marquee-family` is the display face for KPI hero figures and marquee page titles — the role the admin-ui portability audit named as the one piece of ENTR brand coupling a new theme must rebind. Keys: marquee-family.",
|