11---
2- title : Patterns - Multi-Brand Architecture
2+ title : Patterns: Multi-Brand Architecture
33---
44
55# Multi-Brand Architecture
66
7- Complete example of multi-brand variable architecture using Variable Design Standard (VDS).
7+ This pattern specifies a multi-brand architecture that keeps one semantic name set across brands.
8+
9+ Failure if ignored: brand values leak across outputs or require a mapped layer to resolve.
810
911## Architecture overview
1012
@@ -24,6 +26,84 @@ tokens/
2426 typography.json
2527```
2628
29+ ## File structure is the API
30+
31+ Semantic names are the API. Consumers request ` color.surface.brand ` . The build selects the brand folder that defines that name.
32+
33+ This replaces a mapped collection with file selection.
34+
35+ JSON files are the contract input. The folder path is the selector. The semantic names stay the same across brands.
36+
37+ Rules:
38+
39+ - The semantic name set MUST match across brand folders.
40+ - Build config MUST select exactly one brand folder at a time.
41+ - Mapped variables MUST NOT exist in the contract graph.
42+
43+ ## File selection rule
44+
45+ File selection rule is shorthand for this model.
46+
47+ - The files are the contract input.
48+ - The folder path and file name are the selector.
49+ - The build or import list is the switch.
50+
51+ JSON-as-API: the file set is the interface and the selector.
52+
53+ This keeps brand choice out of a mapped layer and out of tool panels.
54+
55+ This is a file selection rule. It is not a hosted service.
56+
57+ Example selector:
58+
59+ ```
60+ tokens/brand-a/color.json
61+ tokens/brand-b/color.json
62+ ```
63+
64+ Pick one folder. The semantic names stay the same. The values change.
65+
66+ If you can select files, you can switch brands. No map required.
67+
68+ Example build selection:
69+
70+ ``` json
71+ {
72+ "source" : [" tokens/base/**/*.json" , " tokens/brand-a/**/*.json" ]
73+ }
74+ ```
75+
76+ Example CSS selection:
77+
78+ ``` css
79+ @layer base, brand;
80+ @import " variables-base.css" layer(base);
81+ @import " variables-brand-a.css" layer(brand);
82+ ```
83+
84+ ## Decision surface
85+
86+ Decisions live in files and build inputs, not in a mapped collection.
87+
88+ - Choose the brand by the source list or by CSS imports.
89+ - Use alias modes in tools for preview. Do not store brand logic in a variables panel.
90+ - Use one decision point. Do not add a second map.
91+
92+ Example preview:
93+
94+ ```
95+ Alias collection
96+ Mode: brand-a
97+ color.surface.brand -> {color.brand.primary}
98+ Mode: brand-b
99+ color.surface.brand -> {color.brand.primary}
100+ ```
101+
102+ ## Governance note
103+
104+ - The file list is the only switch.
105+ - Changes to brand folders follow the contract review gate.
106+
27107### Shared base
28108
29109All brands share base scales:
@@ -93,10 +173,7 @@ Each brand has specific variables:
93173
94174``` json
95175{
96- "source" : [
97- " tokens/base/**/*.json" ,
98- " tokens/brand-a/**/*.json"
99- ],
176+ "source" : [" tokens/base/**/*.json" , " tokens/brand-a/**/*.json" ],
100177 "platforms" : {
101178 "css" : {
102179 "transformGroup" : " css" ,
@@ -116,10 +193,7 @@ Each brand has specific variables:
116193
117194``` json
118195{
119- "source" : [
120- " tokens/base/**/*.json" ,
121- " tokens/brand-b/**/*.json"
122- ],
196+ "source" : [" tokens/base/**/*.json" , " tokens/brand-b/**/*.json" ],
123197 "platforms" : {
124198 "css" : {
125199 "transformGroup" : " css" ,
@@ -174,21 +248,23 @@ Consume brand-specific variables:
1742481 . Share base scales across brands
1752492 . Keep brand-specific variables minimal
1762503 . Reference base variables in brand variables
177- 4 . Use consistent naming across brands
251+ 4 . Use the same semantic name set across brand folders
1782525 . Document brand differences
179253
180254## Failure modes
181255
182256If multi-brand architecture is wrong:
183257
184258- Duplication of shared variables
185- - Inconsistent branding
259+ - Brand A values appear in Brand B output
186260- Maintenance burden
187261- Build complexity
262+ - Mapped variables appear as a shadow layer
263+ - Brand selection leaks into token names
264+ - All brands end up in one output bundle
188265
189266## Out of scope
190267
191268- Brand management tools (use existing tools)
192269- Brand switching at runtime (handle in consumption layer)
193270- Brand-specific design decisions (focus on structure)
194-
0 commit comments