sc-theme-builder/lib/tokenSchema.js
2026-07-01 20:07:28 -05:00

43 lines
2.7 KiB
JavaScript

// The single server-side source of truth for HOW a token maps to CSS. Kept
// structurally parallel to the SPA TokenManifest. Pure data + caps; no imports.
//
// kind:"bsvar" -> :root { --bs-<cssVar>: <value>; } (+ optional --bs-<x>-rgb companion)
// kind:"rule" -> a targeted selector { prop: value; } for things --bs-* can't reach
// kind:"ignore" -> known-but-not-emitted (forward-compat)
//
// Keys are the FLATTENED, kebab-case token names (see compile.flattenTokens,
// which camel->kebab maps the nested tokens object onto these keys).
const TOKEN_SCHEMA = {
primary: { kind: "bsvar", cssVar: "primary", derive: ["primary-rgb"] },
secondary: { kind: "bsvar", cssVar: "secondary", derive: ["secondary-rgb"] },
success: { kind: "bsvar", cssVar: "success", derive: ["success-rgb"] },
info: { kind: "bsvar", cssVar: "info", derive: ["info-rgb"] },
warning: { kind: "bsvar", cssVar: "warning", derive: ["warning-rgb"] },
danger: { kind: "bsvar", cssVar: "danger", derive: ["danger-rgb"] },
light: { kind: "bsvar", cssVar: "light", derive: ["light-rgb"] },
dark: { kind: "bsvar", cssVar: "dark", derive: ["dark-rgb"] },
"body-bg": { kind: "bsvar", cssVar: "body-bg", derive: ["body-bg-rgb"] },
"body-color": { kind: "bsvar", cssVar: "body-color", derive: ["body-color-rgb"] },
"font-sans-serif": { kind: "bsvar", cssVar: "font-sans-serif" },
"font-monospace": { kind: "bsvar", cssVar: "font-monospace" },
"root-font-size": { kind: "bsvar", cssVar: "root-font-size" },
"body-font-size": { kind: "bsvar", cssVar: "body-font-size" },
"body-font-weight":{ kind: "bsvar", cssVar: "body-font-weight" },
"body-line-height":{ kind: "bsvar", cssVar: "body-line-height" },
"headings-font-family": { kind: "bsvar", cssVar: "headings-font-family" },
"border-radius": { kind: "bsvar", cssVar: "border-radius" },
"border-width": { kind: "bsvar", cssVar: "border-width" },
"border-color": { kind: "bsvar", cssVar: "border-color" },
"link-color": { kind: "bsvar", cssVar: "link-color", derive: ["link-color-rgb"] },
"link-hover-color":{ kind: "bsvar", cssVar: "link-hover-color" },
"navbar-bg": { kind: "rule", selector: ".navbar", prop: "--bs-navbar-bg" },
"card-bg": { kind: "rule", selector: ".card", prop: "--bs-card-bg" },
"sidebar-bg": { kind: "rule", selector: ".sidebar, #accordionSidebar", prop: "background-color" },
};
const TOKEN_KEY_RE = /^[-a-zA-Z0-9_]{1,64}$/;
const MAX_VALUE_LEN = 2048;
const MAX_CSS_BYTES = 512 * 1024;
module.exports = { TOKEN_SCHEMA, TOKEN_KEY_RE, MAX_VALUE_LEN, MAX_CSS_BYTES };