@loworbitstudio/visor-theme-engine 0.15.1 → 0.16.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.
@@ -1,4 +1,4 @@
1
- import { g as GeneratedPrimitives, m as SemanticTokens, R as ResolvedThemeConfig } from '../types-zug1_eLX.js';
1
+ import { k as GeneratedPrimitives, r as SemanticTokens, R as ResolvedThemeConfig } from '../types-BstIS9rL.js';
2
2
 
3
3
  /**
4
4
  * Adapter types for the Visor theme engine.
package/dist/fowt.d.ts CHANGED
@@ -33,5 +33,50 @@ declare function generateFowtScript(options?: FowtOptions): string;
33
33
  * <script>...paste FOWT_SCRIPT value...</script>
34
34
  */
35
35
  declare const FOWT_SCRIPT: string;
36
+ /**
37
+ * Options for the theme-identity (palette) FOWT script.
38
+ *
39
+ * This axis is orthogonal to the dark/light MODE axis covered by
40
+ * {@link generateFowtScript}: it selects one of N registered themes (palettes)
41
+ * persisted in localStorage, rather than toggling a light/dark class. Consumers
42
+ * that switch BOTH axes at runtime can place both scripts in the same <head>.
43
+ */
44
+ interface ThemeFowtOptions {
45
+ /**
46
+ * Allowlist of registered theme names. The stored value is validated against
47
+ * this list; anything not present (including a missing or corrupt value)
48
+ * falls back to {@link ThemeFowtOptions.defaultTheme}.
49
+ */
50
+ themes: string[];
51
+ /** Theme name to use when no valid preference is stored. */
52
+ defaultTheme: string;
53
+ /** localStorage key to read (default: "visor-theme-name"). */
54
+ storageKey?: string;
55
+ /**
56
+ * Attribute stamped on <html> with the resolved theme name, for the runtime
57
+ * switcher and tests to read (default: "data-theme-name").
58
+ */
59
+ attribute?: string;
60
+ }
61
+ /**
62
+ * Generate a pre-paint script for the theme-identity (palette) axis.
63
+ *
64
+ * The emitted script, run before first paint as a blocking <script> in <head>:
65
+ * 1. Reads the stored theme name from localStorage.
66
+ * 2. Validates it against the registered-theme allowlist; falls back to the
67
+ * default when the stored value is unknown, absent, or unreadable.
68
+ * 3. Stamps the resolved name on <html> via the configured attribute.
69
+ * 4. Toggles `disabled` across every inlined `style[data-theme-css]` element,
70
+ * enabling exactly the one matching the resolved theme.
71
+ *
72
+ * Place the inlined `style[data-theme-css="<name>"]` elements in <head> BEFORE
73
+ * this script so they exist when it runs.
74
+ *
75
+ * The output is ES5-safe (no arrow functions, no template literals) since it
76
+ * runs before any polyfills load. It mirrors the existing FOWT conventions:
77
+ * self-invoking, parser-blocking, try/catch-wrapped, allowlist-validated with a
78
+ * default fallback.
79
+ */
80
+ declare function generateThemeFowtScript(options: ThemeFowtOptions): string;
36
81
 
37
- export { FOWT_SCRIPT, type FowtOptions, generateFowtScript };
82
+ export { FOWT_SCRIPT, type FowtOptions, type ThemeFowtOptions, generateFowtScript, generateThemeFowtScript };
package/dist/fowt.js CHANGED
@@ -17,7 +17,28 @@ function generateFowtScript(options) {
17
17
  ].join("\n");
18
18
  }
19
19
  var FOWT_SCRIPT = generateFowtScript();
20
+ function generateThemeFowtScript(options) {
21
+ const key = options.storageKey ?? "visor-theme-name";
22
+ const attr = options.attribute ?? "data-theme-name";
23
+ const names = JSON.stringify(options.themes);
24
+ const fallback = JSON.stringify(options.defaultTheme);
25
+ return [
26
+ "(function() {",
27
+ " try {",
28
+ " var themes = " + names + ";",
29
+ ' var stored = localStorage.getItem("' + key + '");',
30
+ " var active = themes.indexOf(stored) !== -1 ? stored : " + fallback + ";",
31
+ ' document.documentElement.setAttribute("' + attr + '", active);',
32
+ ' var styles = document.querySelectorAll("style[data-theme-css]");',
33
+ " for (var i = 0; i < styles.length; i++) {",
34
+ ' styles[i].disabled = styles[i].getAttribute("data-theme-css") !== active;',
35
+ " }",
36
+ " } catch(e) {}",
37
+ "})();"
38
+ ].join("\n");
39
+ }
20
40
  export {
21
41
  FOWT_SCRIPT,
22
- generateFowtScript
42
+ generateFowtScript,
43
+ generateThemeFowtScript
23
44
  };
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, f as ThemeBrandResult, R as ResolvedThemeConfig, g as GeneratedPrimitives, h as ThemeOutput, i as ThemeData, j as VisorThemeConfig, k as FullShadeScale, C as ColorRole, S as SelectiveShadeScale, l as RGB, P as ParsedColor, O as OKLCH, m as SemanticTokens, n as ShadeStep } from './types-zug1_eLX.js';
2
- export { o as BRAND_VARIANTS, p as BrandVariant, q as ColorFormat, r as FontSource, s as RGBA, t as SemanticTokenValue } from './types-zug1_eLX.js';
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, 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, C as ColorRole, p as SelectiveShadeScale, q as RGB, P as ParsedColor, O as OKLCH, r as SemanticTokens, s as ShadeStep } from './types-BstIS9rL.js';
2
+ export { t as BRAND_VARIANTS, u as BRAND_VISIBILITIES, v as BrandArchetype, w as BrandGoverns, x as BrandLexiconEntry, y as BrandPersonalityTrait, z as BrandPillar, A as BrandPositioning, D as BrandStrategyIssueSeverity, E as BrandToneEntry, H as BrandVariant, I as BrandVisibility, J as BrandVoice, K as BrandVoiceTrait, L as ColorFormat, M as DEFAULT_BRAND_STRATEGY_SURFACES, N as DEFAULT_BRAND_STRATEGY_TONE_STATES, Q as FontSource, U as GOVERNS_WILDCARD, W as RGBA, X as SemanticTokenValue } from './types-BstIS9rL.js';
3
3
 
4
4
  /**
5
5
  * Font resolver — maps font family names to loadable font resources.
@@ -236,6 +236,66 @@ declare function resolveThemeBrand(brand: VisorBrand | undefined, options?: {
236
236
  scope?: string;
237
237
  }): ThemeBrandResult;
238
238
 
239
+ /**
240
+ * Brand-strategy validation (VI-505) — pure, engine-decoupled (D4).
241
+ *
242
+ * Two layers:
243
+ * - {@link checkBrandStrategyStructure}: shape, types, required fields, enums.
244
+ * No external context — catches malformed records.
245
+ * - {@link checkBrandStrategyCoherence}: the D2 links — every `governs` target
246
+ * resolves to a real token/component/surface, and every `tone` key maps to a
247
+ * real UI state. The real-world sets are INJECTED via {@link BrandStrategyContext}
248
+ * so this file never imports the engine's token map (keeps it liftable).
249
+ *
250
+ * {@link validateBrandStrategy} composes both into a structured result.
251
+ */
252
+
253
+ /**
254
+ * Validate the shape of a `brand-strategy` block. Returns an error per problem
255
+ * (empty array = structurally valid). All ten top-level fields are required.
256
+ */
257
+ declare function checkBrandStrategyStructure(block: unknown): BrandStrategyIssue[];
258
+ /**
259
+ * Check the D2 links of a structurally-valid strategy: every `governs` target
260
+ * resolves to a real token/component/surface, and every `tone` key maps to a
261
+ * real UI state. Unknown links are errors — coherence drift fails the build the
262
+ * way token drift does.
263
+ *
264
+ * Each namespace is checked only when the caller supplies the matching set:
265
+ * - `ctx.tokens` absent → token refs are not checked (the engine always
266
+ * supplies it; a bare structural caller may not).
267
+ * - `ctx.components` absent → only `"*"` is accepted for components (the engine
268
+ * has no registry access; tests inject a set to exercise the named path).
269
+ * - `ctx.surfaces` / `ctx.states` default to the recognized sets.
270
+ */
271
+ declare function checkBrandStrategyCoherence(strategy: BrandStrategy, ctx?: BrandStrategyContext): BrandStrategyIssue[];
272
+ /**
273
+ * Validate a `brand-strategy` block end to end: structure first, then (only if
274
+ * structurally valid) coherence against the injected context. Coherence
275
+ * findings inherit their severity (errors block; warnings don't).
276
+ */
277
+ declare function validateBrandStrategy(block: unknown, ctx?: BrandStrategyContext): BrandStrategyValidationResult;
278
+
279
+ /**
280
+ * Brand-strategy serialization (VI-505, D3).
281
+ *
282
+ * Projects a validated strategy into its agent-manifest form
283
+ * (`visor-manifest.json` → `brand_strategy`). The projection mirrors the
284
+ * authored shape so an agent reads `voice.traits` / `tone.error` the way it
285
+ * reads a component's `when_to_use`.
286
+ *
287
+ * PRIVACY: a `private` strategy (client brands) returns `null` and is never
288
+ * written to the public manifest. The caller omits the field when null.
289
+ */
290
+
291
+ /**
292
+ * Serialize a validated brand strategy for the manifest. Returns `null` when
293
+ * `visibility: private`. Optional fields (`archetype.secondary`,
294
+ * `voice.traits[].example`, absent `governs` lists) are emitted only when
295
+ * present, so the agent reads a clean, predictable object.
296
+ */
297
+ declare function serializeBrandStrategy(strategy: BrandStrategy): SerializedBrandStrategy | null;
298
+
239
299
  /**
240
300
  * Import Pipeline
241
301
  *
@@ -317,7 +377,7 @@ var properties = {
317
377
  },
318
378
  label: {
319
379
  type: "string",
320
- description: "Human-readable display name for the theme (e.g. 'Blacklight Pro'). Overrides the name-derived label in the docs theme switcher. Optional."
380
+ description: "Human-readable display name for the theme (e.g. 'My Brand Pro'). Overrides the name-derived label in the docs theme switcher. Optional."
321
381
  },
322
382
  "default-mode": {
323
383
  type: "string",
@@ -704,6 +764,101 @@ var properties = {
704
764
  ]
705
765
  }
706
766
  },
767
+ "brand-strategy": {
768
+ type: "object",
769
+ description: "Brand-strategy block (VI-505) — positioning, personality, pillars, voice, and tone as validated, serializable data. Sibling to `brand` (assets): different lifecycle and consumer. NOT expanded into derived CSS values; coherence-checked (pillars govern real tokens/components/surfaces; tone keys map to real UI states) and serialized to the agent manifest under `brand_strategy`.",
770
+ additionalProperties: false,
771
+ required: [
772
+ "positioning",
773
+ "essence",
774
+ "personality",
775
+ "archetype",
776
+ "pillars",
777
+ "voice",
778
+ "tone",
779
+ "lexicon",
780
+ "core",
781
+ "visibility"
782
+ ],
783
+ properties: {
784
+ positioning: {
785
+ $ref: "#/$defs/brandPositioning"
786
+ },
787
+ essence: {
788
+ type: "array",
789
+ items: {
790
+ type: "string"
791
+ },
792
+ minItems: 1,
793
+ description: "2–3 internal-facing core words (Aaker essence)."
794
+ },
795
+ personality: {
796
+ type: "array",
797
+ items: {
798
+ $ref: "#/$defs/brandPersonalityTrait"
799
+ },
800
+ minItems: 1,
801
+ description: "Brand-as-person traits, each sharpened by its antonym."
802
+ },
803
+ archetype: {
804
+ $ref: "#/$defs/brandArchetype"
805
+ },
806
+ pillars: {
807
+ type: "array",
808
+ items: {
809
+ $ref: "#/$defs/brandPillar"
810
+ },
811
+ minItems: 1,
812
+ description: "Strategic pillars — essence words made operational, each governing real tokens/components/surfaces."
813
+ },
814
+ voice: {
815
+ $ref: "#/$defs/brandVoice"
816
+ },
817
+ tone: {
818
+ type: "object",
819
+ description: "Voice flexed per UI state. Keys must be recognized UI states.",
820
+ minProperties: 1,
821
+ propertyNames: {
822
+ "enum": [
823
+ "error",
824
+ "success",
825
+ "warning",
826
+ "info",
827
+ "empty",
828
+ "loading",
829
+ "validation-warning"
830
+ ]
831
+ },
832
+ additionalProperties: {
833
+ $ref: "#/$defs/brandToneEntry"
834
+ }
835
+ },
836
+ lexicon: {
837
+ type: "array",
838
+ items: {
839
+ $ref: "#/$defs/brandLexiconEntry"
840
+ },
841
+ minItems: 1,
842
+ description: "Words to use and the ones to avoid."
843
+ },
844
+ core: {
845
+ type: "array",
846
+ items: {
847
+ type: "string"
848
+ },
849
+ minItems: 1,
850
+ description: "Aaker core/extended — the immutable subset, as section names."
851
+ },
852
+ visibility: {
853
+ type: "string",
854
+ "enum": [
855
+ "public",
856
+ "private"
857
+ ],
858
+ description: "Client brands are private and are omitted from the public agent manifest."
859
+ }
860
+ }
861
+ },
707
862
  spacing: {
708
863
  type: "object",
709
864
  description: "Spacing configuration.",
@@ -925,6 +1080,224 @@ var $defs = {
925
1080
  description: "Letter spacing in logical pixels (Flutter TextStyle.letterSpacing). Material defaults include negative values, e.g. -0.25 for displayLarge."
926
1081
  }
927
1082
  }
1083
+ },
1084
+ brandPositioning: {
1085
+ type: "object",
1086
+ description: "Positioning — the onliness, category, and differentiation wedge.",
1087
+ additionalProperties: false,
1088
+ required: [
1089
+ "onliness",
1090
+ "category",
1091
+ "differentiation"
1092
+ ],
1093
+ properties: {
1094
+ onliness: {
1095
+ type: "string",
1096
+ minLength: 1,
1097
+ description: "The single sentence that passes Neumeier's \"only\" test."
1098
+ },
1099
+ category: {
1100
+ type: "string",
1101
+ minLength: 1,
1102
+ description: "The category the brand competes in (e.g. \"design system\")."
1103
+ },
1104
+ differentiation: {
1105
+ type: "string",
1106
+ minLength: 1,
1107
+ description: "What sets the brand apart within that category."
1108
+ }
1109
+ }
1110
+ },
1111
+ brandPersonalityTrait: {
1112
+ type: "object",
1113
+ description: "A personality trait sharpened by its antonym (brand-as-person).",
1114
+ additionalProperties: false,
1115
+ required: [
1116
+ "trait",
1117
+ "not"
1118
+ ],
1119
+ properties: {
1120
+ trait: {
1121
+ type: "string",
1122
+ minLength: 1
1123
+ },
1124
+ not: {
1125
+ type: "string",
1126
+ minLength: 1,
1127
+ description: "The antonym — what the trait is not."
1128
+ }
1129
+ }
1130
+ },
1131
+ brandArchetype: {
1132
+ type: "object",
1133
+ description: "Brand archetype assignment (Pearson & Mark). Primary required; secondary/tertiary optional.",
1134
+ additionalProperties: false,
1135
+ required: [
1136
+ "primary"
1137
+ ],
1138
+ properties: {
1139
+ primary: {
1140
+ type: "string",
1141
+ minLength: 1
1142
+ },
1143
+ secondary: {
1144
+ type: "string",
1145
+ minLength: 1
1146
+ },
1147
+ tertiary: {
1148
+ type: "string",
1149
+ minLength: 1
1150
+ }
1151
+ }
1152
+ },
1153
+ brandGoverns: {
1154
+ type: "object",
1155
+ description: "What a pillar governs — design tokens, registry components, and/or meta-surfaces. At least one list is expected; use \"*\" for all of a namespace.",
1156
+ additionalProperties: false,
1157
+ minProperties: 1,
1158
+ properties: {
1159
+ tokens: {
1160
+ type: "array",
1161
+ items: {
1162
+ type: "string"
1163
+ },
1164
+ minItems: 1,
1165
+ description: "Semantic token refs (with or without the leading --), or \"*\"."
1166
+ },
1167
+ components: {
1168
+ type: "array",
1169
+ items: {
1170
+ type: "string"
1171
+ },
1172
+ minItems: 1,
1173
+ description: "Registry component names, or \"*\" for all."
1174
+ },
1175
+ surfaces: {
1176
+ type: "array",
1177
+ items: {
1178
+ type: "string",
1179
+ "enum": [
1180
+ "manifest",
1181
+ "cli",
1182
+ "component-metadata"
1183
+ ]
1184
+ },
1185
+ minItems: 1,
1186
+ description: "Meta-surfaces a pillar may govern."
1187
+ }
1188
+ }
1189
+ },
1190
+ brandPillar: {
1191
+ type: "object",
1192
+ description: "A strategic pillar — an essence word made operational.",
1193
+ additionalProperties: false,
1194
+ required: [
1195
+ "id",
1196
+ "statement",
1197
+ "governs"
1198
+ ],
1199
+ properties: {
1200
+ id: {
1201
+ type: "string",
1202
+ minLength: 1
1203
+ },
1204
+ statement: {
1205
+ type: "string",
1206
+ minLength: 1,
1207
+ description: "The pillar's claim in one line."
1208
+ },
1209
+ governs: {
1210
+ $ref: "#/$defs/brandGoverns"
1211
+ }
1212
+ }
1213
+ },
1214
+ brandVoice: {
1215
+ type: "object",
1216
+ description: "Voice — fixed across the brand; never flexes.",
1217
+ additionalProperties: false,
1218
+ required: [
1219
+ "traits"
1220
+ ],
1221
+ properties: {
1222
+ traits: {
1223
+ type: "array",
1224
+ items: {
1225
+ $ref: "#/$defs/brandVoiceTrait"
1226
+ },
1227
+ minItems: 1
1228
+ }
1229
+ }
1230
+ },
1231
+ brandVoiceTrait: {
1232
+ type: "object",
1233
+ description: "A fixed voice trait with a worked example.",
1234
+ additionalProperties: false,
1235
+ required: [
1236
+ "name",
1237
+ "do",
1238
+ "dont"
1239
+ ],
1240
+ properties: {
1241
+ name: {
1242
+ type: "string",
1243
+ minLength: 1
1244
+ },
1245
+ "do": {
1246
+ type: "string",
1247
+ minLength: 1,
1248
+ description: "What to do."
1249
+ },
1250
+ dont: {
1251
+ type: "string",
1252
+ minLength: 1,
1253
+ description: "What not to do."
1254
+ },
1255
+ example: {
1256
+ type: "string",
1257
+ minLength: 1,
1258
+ description: "A worked example sentence."
1259
+ }
1260
+ }
1261
+ },
1262
+ brandToneEntry: {
1263
+ type: "object",
1264
+ description: "A single tone entry, keyed (in `tone`) to a recognized UI state.",
1265
+ additionalProperties: false,
1266
+ required: [
1267
+ "feeling",
1268
+ "example"
1269
+ ],
1270
+ properties: {
1271
+ feeling: {
1272
+ type: "string",
1273
+ minLength: 1,
1274
+ description: "The feeling the copy should evoke in this state."
1275
+ },
1276
+ example: {
1277
+ type: "string",
1278
+ minLength: 1,
1279
+ description: "A worked example message for this state."
1280
+ }
1281
+ }
1282
+ },
1283
+ brandLexiconEntry: {
1284
+ type: "object",
1285
+ description: "A lexicon pairing — the word to use and the one to avoid.",
1286
+ additionalProperties: false,
1287
+ required: [
1288
+ "use",
1289
+ "avoid"
1290
+ ],
1291
+ properties: {
1292
+ use: {
1293
+ type: "string",
1294
+ minLength: 1
1295
+ },
1296
+ avoid: {
1297
+ type: "string",
1298
+ minLength: 1
1299
+ }
1300
+ }
928
1301
  }
929
1302
  };
930
1303
  var visorTheme_schema = {
@@ -1178,6 +1551,19 @@ declare const SEMANTIC_MAP: {
1178
1551
  intent: Record<string, SemanticMapping>;
1179
1552
  hairline: Record<string, SemanticMapping>;
1180
1553
  };
1554
+ /**
1555
+ * The full set of emitted semantic token names, WITHOUT the leading `--`,
1556
+ * spanning all six groups. The prefixed groups emit as `--{group}-{key}`; the
1557
+ * bare intent aliases emit as `--{key}` (e.g. `--primary`); hairlines emit as
1558
+ * `--hairline` / `--hairline-strong`.
1559
+ *
1560
+ * Used by brand-strategy coherence (VI-505) to verify a pillar governs a real
1561
+ * token. Distinct from validate.ts's `KNOWN_SEMANTIC_TOKENS` (the four prefixed
1562
+ * groups only, used for override-key validation) — this set additionally
1563
+ * includes the bare intent aliases and hairlines, which a `brand-strategy`
1564
+ * pillar may legitimately govern (Visor's own record governs `--primary`).
1565
+ */
1566
+ declare function getKnownTokenRefs(): Set<string>;
1181
1567
 
1182
1568
  /**
1183
1569
  * Per-theme font-family aliasing — substrate fix for VI-354.
@@ -1298,4 +1684,4 @@ declare function cleanFontValue(val: string): string;
1298
1684
  */
1299
1685
  declare function extractFromCSS(files: CSSFile[], name?: string): ExtractionResult;
1300
1686
 
1301
- export { type BrandPassthrough, BrandResolution, BrandSlot, BrandSource, type CSSFile, ColorRole, type Confidence, DEFAULT_VISOR_BRAND, type ExtractedToken, type ExtractionResult, FONT_WEIGHT_ALIASES, type FontCoverageError, type FontCoverageResult, FontDisplayStrategy, type FontFaceDeclaration, FontResolution, FontResolveOptions, FullShadeScale, GeneratedPrimitives, GoogleFontEntry, OKLCH, ParsedColor, RGB, ResolvedThemeConfig, SEMANTIC_MAP, SelectiveShadeScale, SemanticTokens, ShadeStep, TAILWIND_GRAY, ThemeBrandResult, ThemeData, ThemeFontResult, ThemeOutput, type ThemeValidationResult, VISOR_BRANDS_CDN, VISOR_DEFAULT_BRAND_PATH, VISOR_FONTS_CDN, type ValidateOptions, type ValidationIssue, type ValidationSeverity, VisorBrand, VisorThemeConfig, VisorTypography, applyOverrides, assignSemanticTokens, buildVisorBrandUrl, buildVisorFontUrl, clampToSrgb, cleanFontValue, collectBrandPassthrough, compositeOverBackground, exportTheme, extractFromCSS, formatFontCoverageError, generateDarkCss, generateFullBundleCss, generateLightCss, generatePreloadLinks, generatePrimitives, generatePrimitivesCss, generateSemanticCss, generateShadeScale, generateStylesheetLinks, generateTheme, generateThemeData, generateThemeDataFromConfig, generateThemeFromConfig, getContrastRatio, googleFontsCatalog, hasBrandPassthrough, hexToOklch, hexToRgb, isValidColor, isValidHex, isVisorThemeConfig, lookupFontWeightAlias, lookupGoogleFont, normalizeHex, oklchToHex, parseCSSDeclarations, parseColor, parseConfig, parseFontFaceDeclarations, parseHex, parseHsla, parseOklch, parseRgba, resolveBrandSlot, resolveBrandSource, resolveConfig, resolveFont, resolveThemeBrand, resolveThemeFonts, rgbToHex, serializeColor, validate, validateConfig, validateFontCoverage, visorTheme_schema as visorThemeSchema };
1687
+ export { type BrandPassthrough, BrandResolution, BrandSlot, BrandSource, BrandStrategy, BrandStrategyContext, BrandStrategyIssue, BrandStrategyValidationResult, type CSSFile, ColorRole, type Confidence, DEFAULT_VISOR_BRAND, type ExtractedToken, type ExtractionResult, FONT_WEIGHT_ALIASES, type FontCoverageError, type FontCoverageResult, FontDisplayStrategy, type FontFaceDeclaration, FontResolution, FontResolveOptions, FullShadeScale, GeneratedPrimitives, GoogleFontEntry, OKLCH, ParsedColor, RGB, ResolvedThemeConfig, SEMANTIC_MAP, SelectiveShadeScale, SemanticTokens, SerializedBrandStrategy, ShadeStep, TAILWIND_GRAY, ThemeBrandResult, ThemeData, ThemeFontResult, ThemeOutput, type ThemeValidationResult, VISOR_BRANDS_CDN, VISOR_DEFAULT_BRAND_PATH, VISOR_FONTS_CDN, type ValidateOptions, type ValidationIssue, type ValidationSeverity, VisorBrand, VisorThemeConfig, VisorTypography, applyOverrides, assignSemanticTokens, buildVisorBrandUrl, buildVisorFontUrl, checkBrandStrategyCoherence, checkBrandStrategyStructure, clampToSrgb, cleanFontValue, collectBrandPassthrough, compositeOverBackground, exportTheme, extractFromCSS, formatFontCoverageError, generateDarkCss, generateFullBundleCss, generateLightCss, generatePreloadLinks, generatePrimitives, generatePrimitivesCss, generateSemanticCss, generateShadeScale, generateStylesheetLinks, generateTheme, generateThemeData, generateThemeDataFromConfig, generateThemeFromConfig, getContrastRatio, getKnownTokenRefs, googleFontsCatalog, hasBrandPassthrough, hexToOklch, hexToRgb, isValidColor, isValidHex, isVisorThemeConfig, lookupFontWeightAlias, lookupGoogleFont, normalizeHex, oklchToHex, parseCSSDeclarations, parseColor, parseConfig, parseFontFaceDeclarations, parseHex, parseHsla, parseOklch, parseRgba, resolveBrandSlot, resolveBrandSource, resolveConfig, resolveFont, resolveThemeBrand, resolveThemeFonts, rgbToHex, serializeBrandStrategy, serializeColor, validate, validateBrandStrategy, validateConfig, validateFontCoverage, visorTheme_schema as visorThemeSchema };