@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.
- package/dist/adapters/index.d.ts +1 -1
- package/dist/fowt.d.ts +46 -1
- package/dist/fowt.js +22 -1
- package/dist/index.d.ts +390 -4
- package/dist/index.js +465 -1
- package/dist/{types-zug1_eLX.d.ts → types-BstIS9rL.d.ts} +175 -1
- package/package.json +1 -1
- package/src/visor-theme.schema.json +149 -1
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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,
|
|
2
|
-
export {
|
|
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. '
|
|
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 };
|