@nebutra/theme 0.2.1 → 0.2.2
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/brand-package-surface.d.ts +1 -0
- package/dist/brand-package-surface.js +34 -0
- package/dist/brand-package-surface.js.map +1 -0
- package/dist/chunk-YJGDBU5Y.js +215 -0
- package/dist/chunk-YJGDBU5Y.js.map +1 -0
- package/dist/chunk-ZSOVG5W4.js +89 -0
- package/dist/chunk-ZSOVG5W4.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.js +43 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/languages.d.ts +54 -0
- package/dist/languages.js +19 -0
- package/dist/languages.js.map +1 -0
- package/package.json +37 -10
- package/skins.css +207 -834
- package/.turbo/turbo-build.log +0 -10
- package/.turbo/turbo-typecheck.log +0 -4
- package/AGENTS.md +0 -28
- package/DESIGN.md +0 -124
- package/scripts/sync-languages.mjs +0 -189
- package/scripts/sync-skins.mjs +0 -83
- package/scripts/sync-themes.mjs +0 -40
- package/src/__tests__/apply-language.test.ts +0 -70
- package/src/__tests__/languages.test.ts +0 -100
- package/src/__tests__/theme-registry.test.ts +0 -27
- package/src/apply-language.ts +0 -87
- package/src/brand-package-surface.ts +0 -30
- package/src/built-in-packages.generated.ts +0 -39
- package/src/built-in-packages.ts +0 -14
- package/src/client.ts +0 -35
- package/src/index.ts +0 -53
- package/src/languages.meta.json +0 -62
- package/src/languages.ts +0 -70
- package/src/registry.json +0 -7
- package/tsconfig.json +0 -10
- package/turbo.json +0 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BRAND_STORAGE_KEY, BrandPackage, BrandPackageInput, BrandRecipe, BrandRecipeInput, CompileResult, EmitBrandCssMode, EmitBrandCssOptions, ValidationResult, applyBrandCss, applyBrandPackage, applyBrandToIframe, clearBrand, compileReferoTokens, emitBrandCss, emitGlobalSkinSelector, getActiveBrandId, normalizeBrandPackage, restorePersistedBrand, useBrand, useBrandIframePreview, validateBrandPackage } from '@nebutra/tokens/brand-package';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/brand-package-surface.ts
|
|
2
|
+
import {
|
|
3
|
+
applyBrandCss,
|
|
4
|
+
applyBrandPackage,
|
|
5
|
+
applyBrandToIframe,
|
|
6
|
+
BRAND_STORAGE_KEY,
|
|
7
|
+
clearBrand,
|
|
8
|
+
compileReferoTokens,
|
|
9
|
+
emitBrandCss,
|
|
10
|
+
emitGlobalSkinSelector,
|
|
11
|
+
getActiveBrandId,
|
|
12
|
+
normalizeBrandPackage,
|
|
13
|
+
restorePersistedBrand,
|
|
14
|
+
useBrand,
|
|
15
|
+
useBrandIframePreview,
|
|
16
|
+
validateBrandPackage
|
|
17
|
+
} from "@nebutra/tokens/brand-package";
|
|
18
|
+
export {
|
|
19
|
+
BRAND_STORAGE_KEY,
|
|
20
|
+
applyBrandCss,
|
|
21
|
+
applyBrandPackage,
|
|
22
|
+
applyBrandToIframe,
|
|
23
|
+
clearBrand,
|
|
24
|
+
compileReferoTokens,
|
|
25
|
+
emitBrandCss,
|
|
26
|
+
emitGlobalSkinSelector,
|
|
27
|
+
getActiveBrandId,
|
|
28
|
+
normalizeBrandPackage,
|
|
29
|
+
restorePersistedBrand,
|
|
30
|
+
useBrand,
|
|
31
|
+
useBrandIframePreview,
|
|
32
|
+
validateBrandPackage
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=brand-package-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/brand-package-surface.ts"],"sourcesContent":["/**\n * Tooling / Create Center surface — compile + iframe preview + emit.\n * Prefer `@nebutra/tokens/brand-package` in new code; this re-export keeps\n * historical `@nebutra/theme` compile entry points without bloating the root.\n */\n\nexport {\n applyBrandCss,\n applyBrandPackage,\n applyBrandToIframe,\n BRAND_STORAGE_KEY,\n type BrandPackage,\n type BrandPackageInput,\n type BrandRecipe,\n type BrandRecipeInput,\n type CompileResult,\n clearBrand,\n compileReferoTokens,\n type EmitBrandCssMode,\n type EmitBrandCssOptions,\n emitBrandCss,\n emitGlobalSkinSelector,\n getActiveBrandId,\n normalizeBrandPackage,\n restorePersistedBrand,\n useBrand,\n useBrandIframePreview,\n type ValidationResult,\n validateBrandPackage,\n} from \"@nebutra/tokens/brand-package\";\n"],"mappings":";AAMA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// src/languages.json
|
|
2
|
+
var languages_default = {
|
|
3
|
+
$schema: "https://nebutra.com/schemas/design-language-registry.json",
|
|
4
|
+
version: "2026.07",
|
|
5
|
+
defaultLanguage: "factory",
|
|
6
|
+
description: "Design-language catalog for global product chrome swap (Create Center / SaaS theme). Not color moods \u2014 full Brand Packages (roles + recipe + elev + zones).",
|
|
7
|
+
languages: [
|
|
8
|
+
{
|
|
9
|
+
id: "factory",
|
|
10
|
+
name: "Nebutra Factory",
|
|
11
|
+
kind: "design-language",
|
|
12
|
+
description: "Default product chrome from @nebutra/tokens (no skin). Clear data-brand to restore.",
|
|
13
|
+
proves: ["factory HSL SSOT", "recipe defaults", "action\u2261brand-mark until skin"],
|
|
14
|
+
darkDefault: true,
|
|
15
|
+
brandPath: null,
|
|
16
|
+
skinPath: null,
|
|
17
|
+
install: {
|
|
18
|
+
command: "nebutra theme use factory",
|
|
19
|
+
cssImport: null
|
|
20
|
+
},
|
|
21
|
+
compatibility: {
|
|
22
|
+
tailwind: "4",
|
|
23
|
+
cssVariables: true,
|
|
24
|
+
brandPackage: true,
|
|
25
|
+
dataBrand: true
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "gsap",
|
|
30
|
+
name: "GSAP",
|
|
31
|
+
kind: "design-language",
|
|
32
|
+
description: "Dark cream-on-void; shockingly-green is accent \u2014 CTA is gradient-stroke/outline, not solid green fill.",
|
|
33
|
+
proves: [
|
|
34
|
+
"outline / gradient-stroke recipe",
|
|
35
|
+
"category extensions",
|
|
36
|
+
"marketing display zone"
|
|
37
|
+
],
|
|
38
|
+
darkDefault: true,
|
|
39
|
+
brandPath: "brands/gsap/brand.json",
|
|
40
|
+
skinPath: "skins/gsap.css",
|
|
41
|
+
install: {
|
|
42
|
+
command: "nebutra theme use gsap",
|
|
43
|
+
cssImport: "@nebutra/tokens/skins/gsap.css"
|
|
44
|
+
},
|
|
45
|
+
compatibility: {
|
|
46
|
+
tailwind: "4",
|
|
47
|
+
cssVariables: true,
|
|
48
|
+
brandPackage: true,
|
|
49
|
+
dataBrand: true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "linear",
|
|
54
|
+
name: "Linear",
|
|
55
|
+
kind: "design-language",
|
|
56
|
+
description: "Dual-mode: dark void default + light paper; solid acid-lime CTA, compact density.",
|
|
57
|
+
proves: ["chromatic solid action", "dark product chrome", "dual-mode light/dark palettes"],
|
|
58
|
+
darkDefault: true,
|
|
59
|
+
brandPath: "brands/linear/brand.json",
|
|
60
|
+
skinPath: "skins/linear.css",
|
|
61
|
+
install: {
|
|
62
|
+
command: "nebutra theme use linear",
|
|
63
|
+
cssImport: "@nebutra/tokens/skins/linear.css"
|
|
64
|
+
},
|
|
65
|
+
compatibility: {
|
|
66
|
+
tailwind: "4",
|
|
67
|
+
cssVariables: true,
|
|
68
|
+
brandPackage: true,
|
|
69
|
+
dataBrand: true
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "notion",
|
|
74
|
+
name: "Notion",
|
|
75
|
+
kind: "design-language",
|
|
76
|
+
description: "Warm paper notebook; Notion Blue sole filled CTA \u2260 Ink brand-mark; 8px buttons / 12px cards; elev=none + hairline; accent hues decorative only.",
|
|
77
|
+
proves: [
|
|
78
|
+
"action \u2260 brand-mark (blue vs ink)",
|
|
79
|
+
"canvas\u2260card (paper-warmth vs pure-white)",
|
|
80
|
+
"elevation=none content cards + raised nav shadow slot",
|
|
81
|
+
"table radius priority (8/12 over tertiary 4px)",
|
|
82
|
+
"decorative accents never product CTA"
|
|
83
|
+
],
|
|
84
|
+
darkDefault: false,
|
|
85
|
+
brandPath: "brands/notion/brand.json",
|
|
86
|
+
skinPath: "skins/notion.css",
|
|
87
|
+
install: {
|
|
88
|
+
command: "nebutra theme use notion",
|
|
89
|
+
cssImport: "@nebutra/tokens/skins/notion.css"
|
|
90
|
+
},
|
|
91
|
+
compatibility: {
|
|
92
|
+
tailwind: "4",
|
|
93
|
+
cssVariables: true,
|
|
94
|
+
brandPackage: true,
|
|
95
|
+
dataBrand: true
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "raycast",
|
|
100
|
+
name: "Raycast",
|
|
101
|
+
kind: "design-language",
|
|
102
|
+
description: "Neutral Mist/Iron filled CTA; Coral is brand-mark only. Key elevation stack.",
|
|
103
|
+
proves: ["action \u2260 brand-mark", "elevation=key free CSS"],
|
|
104
|
+
darkDefault: true,
|
|
105
|
+
brandPath: "brands/raycast/brand.json",
|
|
106
|
+
skinPath: "skins/raycast.css",
|
|
107
|
+
install: {
|
|
108
|
+
command: "nebutra theme use raycast",
|
|
109
|
+
cssImport: "@nebutra/tokens/skins/raycast.css"
|
|
110
|
+
},
|
|
111
|
+
compatibility: {
|
|
112
|
+
tailwind: "4",
|
|
113
|
+
cssVariables: true,
|
|
114
|
+
brandPackage: true,
|
|
115
|
+
dataBrand: true
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "stripe",
|
|
120
|
+
name: "Stripe",
|
|
121
|
+
kind: "design-language",
|
|
122
|
+
description: "Indigo-ink ledger on frost glass; Indigo action \u2260 Midnight brand-mark; 4px controls; elevation=none (tint + frost rules).",
|
|
123
|
+
proves: [
|
|
124
|
+
"action \u2260 brand-mark (chromatic indigo vs midnight)",
|
|
125
|
+
"elevation=none tint-ladder depth",
|
|
126
|
+
"4px squared controls (not pill)",
|
|
127
|
+
"whisper heading weight 300"
|
|
128
|
+
],
|
|
129
|
+
darkDefault: false,
|
|
130
|
+
brandPath: "brands/stripe/brand.json",
|
|
131
|
+
skinPath: "skins/stripe.css",
|
|
132
|
+
install: {
|
|
133
|
+
command: "nebutra theme use stripe",
|
|
134
|
+
cssImport: "@nebutra/tokens/skins/stripe.css"
|
|
135
|
+
},
|
|
136
|
+
compatibility: {
|
|
137
|
+
tailwind: "4",
|
|
138
|
+
cssVariables: true,
|
|
139
|
+
brandPackage: true,
|
|
140
|
+
dataBrand: true
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "vanta",
|
|
145
|
+
name: "Vanta",
|
|
146
|
+
kind: "design-language",
|
|
147
|
+
description: "Editorial violet on parchment; Vivid Violet action \u2260 Indigo Ink brand-mark; full pills; elevation=none (carbon hairlines).",
|
|
148
|
+
proves: [
|
|
149
|
+
"action \u2260 brand-mark (chromatic)",
|
|
150
|
+
"elevation=none border-only",
|
|
151
|
+
"999px pill controls",
|
|
152
|
+
"serif display + sans UI zones"
|
|
153
|
+
],
|
|
154
|
+
darkDefault: false,
|
|
155
|
+
brandPath: "brands/vanta/brand.json",
|
|
156
|
+
skinPath: "skins/vanta.css",
|
|
157
|
+
install: {
|
|
158
|
+
command: "nebutra theme use vanta",
|
|
159
|
+
cssImport: "@nebutra/tokens/skins/vanta.css"
|
|
160
|
+
},
|
|
161
|
+
compatibility: {
|
|
162
|
+
tailwind: "4",
|
|
163
|
+
cssVariables: true,
|
|
164
|
+
brandPackage: true,
|
|
165
|
+
dataBrand: true
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: "vercel",
|
|
170
|
+
name: "Vercel",
|
|
171
|
+
kind: "design-language",
|
|
172
|
+
description: "Monochrome dual-mode: light paper + Obsidian CTA; dark carbon + white CTA; hairline elevation (no chromatic CTA).",
|
|
173
|
+
proves: ["light monochrome action", "elevation=hairline", "dual-mode light/dark palettes"],
|
|
174
|
+
darkDefault: false,
|
|
175
|
+
brandPath: "brands/vercel/brand.json",
|
|
176
|
+
skinPath: "skins/vercel.css",
|
|
177
|
+
install: {
|
|
178
|
+
command: "nebutra theme use vercel",
|
|
179
|
+
cssImport: "@nebutra/tokens/skins/vercel.css"
|
|
180
|
+
},
|
|
181
|
+
compatibility: {
|
|
182
|
+
tailwind: "4",
|
|
183
|
+
cssVariables: true,
|
|
184
|
+
brandPackage: true,
|
|
185
|
+
dataBrand: true
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
// src/languages.ts
|
|
192
|
+
var LANGUAGE_REGISTRY = languages_default;
|
|
193
|
+
var LANGUAGE_IDS = LANGUAGE_REGISTRY.languages.map((l) => l.id);
|
|
194
|
+
var DEFAULT_LANGUAGE = LANGUAGE_REGISTRY.defaultLanguage;
|
|
195
|
+
var BUILT_IN_LANGUAGE_IDS = LANGUAGE_IDS;
|
|
196
|
+
function isLanguageId(id) {
|
|
197
|
+
return LANGUAGE_IDS.includes(id);
|
|
198
|
+
}
|
|
199
|
+
function getLanguageById(id) {
|
|
200
|
+
return LANGUAGE_REGISTRY.languages.find((l) => l.id === id);
|
|
201
|
+
}
|
|
202
|
+
function listSkinLanguages() {
|
|
203
|
+
return LANGUAGE_REGISTRY.languages.filter((l) => l.brandPath != null);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export {
|
|
207
|
+
LANGUAGE_REGISTRY,
|
|
208
|
+
LANGUAGE_IDS,
|
|
209
|
+
DEFAULT_LANGUAGE,
|
|
210
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
211
|
+
isLanguageId,
|
|
212
|
+
getLanguageById,
|
|
213
|
+
listSkinLanguages
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=chunk-YJGDBU5Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/languages.json","../src/languages.ts"],"sourcesContent":["{\n \"$schema\": \"https://nebutra.com/schemas/design-language-registry.json\",\n \"version\": \"2026.07\",\n \"defaultLanguage\": \"factory\",\n \"description\": \"Design-language catalog for global product chrome swap (Create Center / SaaS theme). Not color moods — full Brand Packages (roles + recipe + elev + zones).\",\n \"languages\": [\n {\n \"id\": \"factory\",\n \"name\": \"Nebutra Factory\",\n \"kind\": \"design-language\",\n \"description\": \"Default product chrome from @nebutra/tokens (no skin). Clear data-brand to restore.\",\n \"proves\": [\"factory HSL SSOT\", \"recipe defaults\", \"action≡brand-mark until skin\"],\n \"darkDefault\": true,\n \"brandPath\": null,\n \"skinPath\": null,\n \"install\": {\n \"command\": \"nebutra theme use factory\",\n \"cssImport\": null\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"gsap\",\n \"name\": \"GSAP\",\n \"kind\": \"design-language\",\n \"description\": \"Dark cream-on-void; shockingly-green is accent — CTA is gradient-stroke/outline, not solid green fill.\",\n \"proves\": [\n \"outline / gradient-stroke recipe\",\n \"category extensions\",\n \"marketing display zone\"\n ],\n \"darkDefault\": true,\n \"brandPath\": \"brands/gsap/brand.json\",\n \"skinPath\": \"skins/gsap.css\",\n \"install\": {\n \"command\": \"nebutra theme use gsap\",\n \"cssImport\": \"@nebutra/tokens/skins/gsap.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"linear\",\n \"name\": \"Linear\",\n \"kind\": \"design-language\",\n \"description\": \"Dual-mode: dark void default + light paper; solid acid-lime CTA, compact density.\",\n \"proves\": [\"chromatic solid action\", \"dark product chrome\", \"dual-mode light/dark palettes\"],\n \"darkDefault\": true,\n \"brandPath\": \"brands/linear/brand.json\",\n \"skinPath\": \"skins/linear.css\",\n \"install\": {\n \"command\": \"nebutra theme use linear\",\n \"cssImport\": \"@nebutra/tokens/skins/linear.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"notion\",\n \"name\": \"Notion\",\n \"kind\": \"design-language\",\n \"description\": \"Warm paper notebook; Notion Blue sole filled CTA ≠ Ink brand-mark; 8px buttons / 12px cards; elev=none + hairline; accent hues decorative only.\",\n \"proves\": [\n \"action ≠ brand-mark (blue vs ink)\",\n \"canvas≠card (paper-warmth vs pure-white)\",\n \"elevation=none content cards + raised nav shadow slot\",\n \"table radius priority (8/12 over tertiary 4px)\",\n \"decorative accents never product CTA\"\n ],\n \"darkDefault\": false,\n \"brandPath\": \"brands/notion/brand.json\",\n \"skinPath\": \"skins/notion.css\",\n \"install\": {\n \"command\": \"nebutra theme use notion\",\n \"cssImport\": \"@nebutra/tokens/skins/notion.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"raycast\",\n \"name\": \"Raycast\",\n \"kind\": \"design-language\",\n \"description\": \"Neutral Mist/Iron filled CTA; Coral is brand-mark only. Key elevation stack.\",\n \"proves\": [\"action ≠ brand-mark\", \"elevation=key free CSS\"],\n \"darkDefault\": true,\n \"brandPath\": \"brands/raycast/brand.json\",\n \"skinPath\": \"skins/raycast.css\",\n \"install\": {\n \"command\": \"nebutra theme use raycast\",\n \"cssImport\": \"@nebutra/tokens/skins/raycast.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"stripe\",\n \"name\": \"Stripe\",\n \"kind\": \"design-language\",\n \"description\": \"Indigo-ink ledger on frost glass; Indigo action ≠ Midnight brand-mark; 4px controls; elevation=none (tint + frost rules).\",\n \"proves\": [\n \"action ≠ brand-mark (chromatic indigo vs midnight)\",\n \"elevation=none tint-ladder depth\",\n \"4px squared controls (not pill)\",\n \"whisper heading weight 300\"\n ],\n \"darkDefault\": false,\n \"brandPath\": \"brands/stripe/brand.json\",\n \"skinPath\": \"skins/stripe.css\",\n \"install\": {\n \"command\": \"nebutra theme use stripe\",\n \"cssImport\": \"@nebutra/tokens/skins/stripe.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"vanta\",\n \"name\": \"Vanta\",\n \"kind\": \"design-language\",\n \"description\": \"Editorial violet on parchment; Vivid Violet action ≠ Indigo Ink brand-mark; full pills; elevation=none (carbon hairlines).\",\n \"proves\": [\n \"action ≠ brand-mark (chromatic)\",\n \"elevation=none border-only\",\n \"999px pill controls\",\n \"serif display + sans UI zones\"\n ],\n \"darkDefault\": false,\n \"brandPath\": \"brands/vanta/brand.json\",\n \"skinPath\": \"skins/vanta.css\",\n \"install\": {\n \"command\": \"nebutra theme use vanta\",\n \"cssImport\": \"@nebutra/tokens/skins/vanta.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n },\n {\n \"id\": \"vercel\",\n \"name\": \"Vercel\",\n \"kind\": \"design-language\",\n \"description\": \"Monochrome dual-mode: light paper + Obsidian CTA; dark carbon + white CTA; hairline elevation (no chromatic CTA).\",\n \"proves\": [\"light monochrome action\", \"elevation=hairline\", \"dual-mode light/dark palettes\"],\n \"darkDefault\": false,\n \"brandPath\": \"brands/vercel/brand.json\",\n \"skinPath\": \"skins/vercel.css\",\n \"install\": {\n \"command\": \"nebutra theme use vercel\",\n \"cssImport\": \"@nebutra/tokens/skins/vercel.css\"\n },\n \"compatibility\": {\n \"tailwind\": \"4\",\n \"cssVariables\": true,\n \"brandPackage\": true,\n \"dataBrand\": true\n }\n }\n ]\n}\n","/**\n * Design-language catalog — the real product surface of @nebutra/theme.\n *\n * A \"language\" is a full Brand Package (roles + recipe + elev), proven by\n * external DS stress tests (Linear / GSAP / Raycast / Vercel / Vanta / Stripe / Notion).\n * Swapping `html[data-brand]` (or applyLanguage) recolors product chrome without\n * call-site edits.\n *\n * Multi-mood oklch catalog was removed. Use LANGUAGE_REGISTRY / isLanguageId only.\n */\n\n/** Generated by scripts/sync-languages.mjs from brands + languages.meta.json */\nimport languagesJson from \"./languages.json\" with { type: \"json\" };\n\nexport interface DesignLanguageInstall {\n command: string;\n /** Single-skin import for demos; null for factory */\n cssImport: string | null;\n}\n\nexport interface DesignLanguageCompatibility {\n tailwind: \"4\";\n cssVariables: boolean;\n brandPackage: boolean;\n dataBrand: boolean;\n}\n\nexport interface DesignLanguageEntry {\n id: string;\n name: string;\n kind: \"design-language\";\n description: string;\n /** Contract proofs this fixture exercises */\n proves: string[];\n darkDefault: boolean;\n /** Relative to @nebutra/tokens package root; null = factory (no override) */\n brandPath: string | null;\n skinPath: string | null;\n install: DesignLanguageInstall;\n compatibility: DesignLanguageCompatibility;\n}\n\nexport interface DesignLanguageRegistry {\n $schema: string;\n version: string;\n defaultLanguage: string;\n description: string;\n languages: DesignLanguageEntry[];\n}\n\nexport const LANGUAGE_REGISTRY = languagesJson as DesignLanguageRegistry;\nexport const LANGUAGE_IDS = LANGUAGE_REGISTRY.languages.map((l) => l.id);\nexport const DEFAULT_LANGUAGE = LANGUAGE_REGISTRY.defaultLanguage;\n/** Alias — “theme” in product speak = design language */\nexport const BUILT_IN_LANGUAGE_IDS = LANGUAGE_IDS;\n\nexport type LanguageId = string;\n\nexport function isLanguageId(id: string): boolean {\n return LANGUAGE_IDS.includes(id);\n}\n\nexport function getLanguageById(id: string): DesignLanguageEntry | undefined {\n return LANGUAGE_REGISTRY.languages.find((l) => l.id === id);\n}\n\n/** Fixture languages that ship a Brand Package (excludes factory). */\nexport function listSkinLanguages(): DesignLanguageEntry[] {\n return LANGUAGE_REGISTRY.languages.filter((l) => l.brandPath != null);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getLanguageById
|
|
3
|
+
} from "./chunk-YJGDBU5Y.js";
|
|
4
|
+
|
|
5
|
+
// src/built-in-packages.generated.ts
|
|
6
|
+
import { normalizeBrandPackage } from "@nebutra/tokens/brand-package";
|
|
7
|
+
import gsap from "@nebutra/tokens/brands/gsap/brand.json";
|
|
8
|
+
import linear from "@nebutra/tokens/brands/linear/brand.json";
|
|
9
|
+
import notion from "@nebutra/tokens/brands/notion/brand.json";
|
|
10
|
+
import raycast from "@nebutra/tokens/brands/raycast/brand.json";
|
|
11
|
+
import stripe from "@nebutra/tokens/brands/stripe/brand.json";
|
|
12
|
+
import vanta from "@nebutra/tokens/brands/vanta/brand.json";
|
|
13
|
+
import vercel from "@nebutra/tokens/brands/vercel/brand.json";
|
|
14
|
+
var RAW_BUILT_IN = {
|
|
15
|
+
gsap,
|
|
16
|
+
linear,
|
|
17
|
+
notion,
|
|
18
|
+
raycast,
|
|
19
|
+
stripe,
|
|
20
|
+
vanta,
|
|
21
|
+
vercel
|
|
22
|
+
};
|
|
23
|
+
function getBuiltInBrandPackage(id) {
|
|
24
|
+
const raw = RAW_BUILT_IN[id];
|
|
25
|
+
if (!raw) return void 0;
|
|
26
|
+
return normalizeBrandPackage({ ...raw, id });
|
|
27
|
+
}
|
|
28
|
+
function listBuiltInBrandIds() {
|
|
29
|
+
return Object.keys(RAW_BUILT_IN);
|
|
30
|
+
}
|
|
31
|
+
function hasBuiltInBrandPackage(id) {
|
|
32
|
+
return id in RAW_BUILT_IN;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/apply-language.ts
|
|
36
|
+
import {
|
|
37
|
+
applyBrandPackage,
|
|
38
|
+
clearBrand,
|
|
39
|
+
getActiveBrandId,
|
|
40
|
+
normalizeBrandPackage as normalizeBrandPackage2,
|
|
41
|
+
validateBrandPackage
|
|
42
|
+
} from "@nebutra/tokens/brand-package";
|
|
43
|
+
function applyLanguage(languageId, options = {}) {
|
|
44
|
+
const entry = getLanguageById(languageId);
|
|
45
|
+
if (!entry || entry.id === "factory" || entry.brandPath == null) {
|
|
46
|
+
if (options.package) {
|
|
47
|
+
const v2 = validateBrandPackage(options.package);
|
|
48
|
+
if (!v2.ok) {
|
|
49
|
+
throw new Error(`Invalid Brand Package: ${v2.errors.join("; ")}`);
|
|
50
|
+
}
|
|
51
|
+
applyBrandPackage(normalizeBrandPackage2(options.package), options);
|
|
52
|
+
return entry ?? null;
|
|
53
|
+
}
|
|
54
|
+
clearBrand(options);
|
|
55
|
+
return entry ?? getLanguageById("factory") ?? null;
|
|
56
|
+
}
|
|
57
|
+
const pkg = options.package ?? getBuiltInBrandPackage(languageId);
|
|
58
|
+
if (!pkg) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`Language "${languageId}" has no built-in Brand Package and no options.package. Load @nebutra/tokens/${entry.brandPath} or compileReferoTokens(), then applyLanguage("${languageId}", { package }). Or import the single skin CSS: ${entry.install.cssImport ?? "(none)"}.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
const v = validateBrandPackage(pkg);
|
|
64
|
+
if (!v.ok) {
|
|
65
|
+
throw new Error(`Invalid Brand Package for ${languageId}: ${v.errors.join("; ")}`);
|
|
66
|
+
}
|
|
67
|
+
const normalized = normalizeBrandPackage2({
|
|
68
|
+
...pkg,
|
|
69
|
+
id: languageId
|
|
70
|
+
});
|
|
71
|
+
applyBrandPackage(normalized, options);
|
|
72
|
+
return entry;
|
|
73
|
+
}
|
|
74
|
+
function clearLanguage(options = {}) {
|
|
75
|
+
clearBrand(options);
|
|
76
|
+
}
|
|
77
|
+
function getActiveLanguageId(doc) {
|
|
78
|
+
return getActiveBrandId(doc) ?? "factory";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export {
|
|
82
|
+
getBuiltInBrandPackage,
|
|
83
|
+
listBuiltInBrandIds,
|
|
84
|
+
hasBuiltInBrandPackage,
|
|
85
|
+
applyLanguage,
|
|
86
|
+
clearLanguage,
|
|
87
|
+
getActiveLanguageId
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=chunk-ZSOVG5W4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/built-in-packages.generated.ts","../src/apply-language.ts"],"sourcesContent":["/**\n * AUTO-GENERATED by scripts/sync-languages.mjs — DO NOT EDIT.\n * Built-in Brand Packages for applyLanguage(id) without manual JSON import.\n * Source: packages/design/tokens/brands/<id>/brand.json\n */\n\nimport { type BrandPackage, normalizeBrandPackage } from \"@nebutra/tokens/brand-package\";\nimport gsap from \"@nebutra/tokens/brands/gsap/brand.json\" with { type: \"json\" };\nimport linear from \"@nebutra/tokens/brands/linear/brand.json\" with { type: \"json\" };\nimport notion from \"@nebutra/tokens/brands/notion/brand.json\" with { type: \"json\" };\nimport raycast from \"@nebutra/tokens/brands/raycast/brand.json\" with { type: \"json\" };\nimport stripe from \"@nebutra/tokens/brands/stripe/brand.json\" with { type: \"json\" };\nimport vanta from \"@nebutra/tokens/brands/vanta/brand.json\" with { type: \"json\" };\nimport vercel from \"@nebutra/tokens/brands/vercel/brand.json\" with { type: \"json\" };\n\nconst RAW_BUILT_IN: Record<string, BrandPackage> = {\n gsap: gsap as BrandPackage,\n linear: linear as BrandPackage,\n notion: notion as BrandPackage,\n raycast: raycast as BrandPackage,\n stripe: stripe as BrandPackage,\n vanta: vanta as BrandPackage,\n vercel: vercel as BrandPackage,\n};\n\n/** Normalized package for a shipped design-language id, or undefined. */\nexport function getBuiltInBrandPackage(id: string): BrandPackage | undefined {\n const raw = RAW_BUILT_IN[id];\n if (!raw) return undefined;\n return normalizeBrandPackage({ ...raw, id });\n}\n\nexport function listBuiltInBrandIds(): string[] {\n return Object.keys(RAW_BUILT_IN);\n}\n\nexport function hasBuiltInBrandPackage(id: string): boolean {\n return id in RAW_BUILT_IN;\n}\n","/**\n * Runtime design-language switch — Create Center / SaaS global theme swap.\n *\n * Light/dark remains class=\"dark\" on @nebutra/tokens ThemeProvider.\n * Design language is html[data-brand] + Brand Package CSS inject.\n *\n * Built-in languages load Brand Packages automatically; pass `package` only for\n * custom / compile-time packages (Create Center preview).\n */\n\nimport {\n type ApplyBrandOptions,\n applyBrandPackage,\n type BrandPackage,\n clearBrand,\n getActiveBrandId,\n normalizeBrandPackage,\n validateBrandPackage,\n} from \"@nebutra/tokens/brand-package\";\nimport { getBuiltInBrandPackage } from \"./built-in-packages\";\nimport { type DesignLanguageEntry, getLanguageById } from \"./languages\";\n\nexport type { ApplyBrandOptions };\n\nexport interface ApplyLanguageOptions extends ApplyBrandOptions {\n /**\n * Preloaded Brand Package (Create Center compile result or override).\n * When omitted, built-in languages resolve from brands/<id>/brand.json.\n */\n package?: BrandPackage;\n}\n\n/**\n * Apply a design language by id.\n * - `factory` / unknown without package → clearBrand (tokens SSOT)\n * - built-in id without package → load shipped Brand Package\n * - with `package` → applyBrandPackage (full carrier swap)\n */\nexport function applyLanguage(\n languageId: string,\n options: ApplyLanguageOptions = {},\n): DesignLanguageEntry | null {\n const entry = getLanguageById(languageId);\n\n if (!entry || entry.id === \"factory\" || entry.brandPath == null) {\n if (options.package) {\n const v = validateBrandPackage(options.package);\n if (!v.ok) {\n throw new Error(`Invalid Brand Package: ${v.errors.join(\"; \")}`);\n }\n applyBrandPackage(normalizeBrandPackage(options.package), options);\n return entry ?? null;\n }\n clearBrand(options);\n return entry ?? getLanguageById(\"factory\") ?? null;\n }\n\n const pkg = options.package ?? getBuiltInBrandPackage(languageId);\n if (!pkg) {\n throw new Error(\n `Language \"${languageId}\" has no built-in Brand Package and no options.package. ` +\n `Load @nebutra/tokens/${entry.brandPath} or compileReferoTokens(), then ` +\n `applyLanguage(\"${languageId}\", { package }). ` +\n `Or import the single skin CSS: ${entry.install.cssImport ?? \"(none)\"}.`,\n );\n }\n\n const v = validateBrandPackage(pkg);\n if (!v.ok) {\n throw new Error(`Invalid Brand Package for ${languageId}: ${v.errors.join(\"; \")}`);\n }\n const normalized = normalizeBrandPackage({\n ...pkg,\n id: languageId,\n });\n applyBrandPackage(normalized, options);\n return entry;\n}\n\n/** Restore factory product chrome (clear data-brand + injected skin). */\nexport function clearLanguage(options: ApplyBrandOptions = {}): void {\n clearBrand(options);\n}\n\nexport function getActiveLanguageId(doc?: Document): string {\n return getActiveBrandId(doc) ?? \"factory\";\n}\n"],"mappings":";;;;;AAMA,SAA4B,6BAA6B;AACzD,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,OAAO,aAAa;AACpB,OAAO,YAAY;AACnB,OAAO,WAAW;AAClB,OAAO,YAAY;AAEnB,IAAM,eAA6C;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,uBAAuB,IAAsC;AAC3E,QAAM,MAAM,aAAa,EAAE;AAC3B,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,sBAAsB,EAAE,GAAG,KAAK,GAAG,CAAC;AAC7C;AAEO,SAAS,sBAAgC;AAC9C,SAAO,OAAO,KAAK,YAAY;AACjC;AAEO,SAAS,uBAAuB,IAAqB;AAC1D,SAAO,MAAM;AACf;;;AC5BA;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA,yBAAAA;AAAA,EACA;AAAA,OACK;AAoBA,SAAS,cACd,YACA,UAAgC,CAAC,GACL;AAC5B,QAAM,QAAQ,gBAAgB,UAAU;AAExC,MAAI,CAAC,SAAS,MAAM,OAAO,aAAa,MAAM,aAAa,MAAM;AAC/D,QAAI,QAAQ,SAAS;AACnB,YAAMC,KAAI,qBAAqB,QAAQ,OAAO;AAC9C,UAAI,CAACA,GAAE,IAAI;AACT,cAAM,IAAI,MAAM,0BAA0BA,GAAE,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MACjE;AACA,wBAAkBC,uBAAsB,QAAQ,OAAO,GAAG,OAAO;AACjE,aAAO,SAAS;AAAA,IAClB;AACA,eAAW,OAAO;AAClB,WAAO,SAAS,gBAAgB,SAAS,KAAK;AAAA,EAChD;AAEA,QAAM,MAAM,QAAQ,WAAW,uBAAuB,UAAU;AAChE,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR,aAAa,UAAU,gFACG,MAAM,SAAS,kDACrB,UAAU,mDACM,MAAM,QAAQ,aAAa,QAAQ;AAAA,IACzE;AAAA,EACF;AAEA,QAAM,IAAI,qBAAqB,GAAG;AAClC,MAAI,CAAC,EAAE,IAAI;AACT,UAAM,IAAI,MAAM,6BAA6B,UAAU,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,EACnF;AACA,QAAM,aAAaA,uBAAsB;AAAA,IACvC,GAAG;AAAA,IACH,IAAI;AAAA,EACN,CAAC;AACD,oBAAkB,YAAY,OAAO;AACrC,SAAO;AACT;AAGO,SAAS,cAAc,UAA6B,CAAC,GAAS;AACnE,aAAW,OAAO;AACpB;AAEO,SAAS,oBAAoB,KAAwB;AAC1D,SAAO,iBAAiB,GAAG,KAAK;AAClC;","names":["normalizeBrandPackage","v","normalizeBrandPackage"]}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { BrandPackage, applyBrandPackage, clearBrand, normalizeBrandPackage } from '@nebutra/tokens/brand-package';
|
|
2
|
+
export { ApplyLanguageOptions, applyLanguage, clearLanguage, getActiveLanguageId, getBuiltInBrandPackage, hasBuiltInBrandPackage, listBuiltInBrandIds } from './index.js';
|
|
3
|
+
export { BUILT_IN_LANGUAGE_IDS, DEFAULT_LANGUAGE, DesignLanguageEntry, DesignLanguageRegistry, LANGUAGE_IDS, LANGUAGE_REGISTRY, getLanguageById, isLanguageId, listSkinLanguages } from './languages.js';
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyLanguage,
|
|
3
|
+
clearLanguage,
|
|
4
|
+
getActiveLanguageId,
|
|
5
|
+
getBuiltInBrandPackage,
|
|
6
|
+
hasBuiltInBrandPackage,
|
|
7
|
+
listBuiltInBrandIds
|
|
8
|
+
} from "./chunk-ZSOVG5W4.js";
|
|
9
|
+
import {
|
|
10
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
11
|
+
DEFAULT_LANGUAGE,
|
|
12
|
+
LANGUAGE_IDS,
|
|
13
|
+
LANGUAGE_REGISTRY,
|
|
14
|
+
getLanguageById,
|
|
15
|
+
isLanguageId,
|
|
16
|
+
listSkinLanguages
|
|
17
|
+
} from "./chunk-YJGDBU5Y.js";
|
|
18
|
+
|
|
19
|
+
// src/client.ts
|
|
20
|
+
import {
|
|
21
|
+
applyBrandPackage,
|
|
22
|
+
clearBrand,
|
|
23
|
+
normalizeBrandPackage
|
|
24
|
+
} from "@nebutra/tokens/brand-package";
|
|
25
|
+
export {
|
|
26
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
27
|
+
DEFAULT_LANGUAGE,
|
|
28
|
+
LANGUAGE_IDS,
|
|
29
|
+
LANGUAGE_REGISTRY,
|
|
30
|
+
applyBrandPackage,
|
|
31
|
+
applyLanguage,
|
|
32
|
+
clearBrand,
|
|
33
|
+
clearLanguage,
|
|
34
|
+
getActiveLanguageId,
|
|
35
|
+
getBuiltInBrandPackage,
|
|
36
|
+
getLanguageById,
|
|
37
|
+
hasBuiltInBrandPackage,
|
|
38
|
+
isLanguageId,
|
|
39
|
+
listBuiltInBrandIds,
|
|
40
|
+
listSkinLanguages,
|
|
41
|
+
normalizeBrandPackage
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"sourcesContent":["/**\n * Explicit client entry — same lean surface as package root.\n * Use: `import { applyLanguage } from \"@nebutra/theme/client\"`\n *\n * Light/dark: `import { ThemeProvider, useTheme } from \"@nebutra/tokens\"`\n */\n\nexport {\n applyBrandPackage,\n type BrandPackage,\n clearBrand,\n normalizeBrandPackage,\n} from \"@nebutra/tokens/brand-package\";\nexport {\n type ApplyLanguageOptions,\n applyLanguage,\n clearLanguage,\n getActiveLanguageId,\n} from \"./apply-language\";\nexport {\n getBuiltInBrandPackage,\n hasBuiltInBrandPackage,\n listBuiltInBrandIds,\n} from \"./built-in-packages\";\nexport {\n BUILT_IN_LANGUAGE_IDS,\n DEFAULT_LANGUAGE,\n type DesignLanguageEntry,\n type DesignLanguageRegistry,\n getLanguageById,\n isLanguageId,\n LANGUAGE_IDS,\n LANGUAGE_REGISTRY,\n listSkinLanguages,\n} from \"./languages\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAOA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OACK;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ApplyBrandOptions, BrandPackage } from '@nebutra/tokens/brand-package';
|
|
2
|
+
export { ApplyBrandOptions, BrandPackage, ValidationResult, applyBrandPackage, clearBrand, getActiveBrandId, normalizeBrandPackage, validateBrandPackage } from '@nebutra/tokens/brand-package';
|
|
3
|
+
import { DesignLanguageEntry } from './languages.js';
|
|
4
|
+
export { BUILT_IN_LANGUAGE_IDS, DEFAULT_LANGUAGE, DesignLanguageCompatibility, DesignLanguageInstall, DesignLanguageRegistry, LANGUAGE_IDS, LANGUAGE_REGISTRY, LanguageId, getLanguageById, isLanguageId, listSkinLanguages } from './languages.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Runtime design-language switch — Create Center / SaaS global theme swap.
|
|
8
|
+
*
|
|
9
|
+
* Light/dark remains class="dark" on @nebutra/tokens ThemeProvider.
|
|
10
|
+
* Design language is html[data-brand] + Brand Package CSS inject.
|
|
11
|
+
*
|
|
12
|
+
* Built-in languages load Brand Packages automatically; pass `package` only for
|
|
13
|
+
* custom / compile-time packages (Create Center preview).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
interface ApplyLanguageOptions extends ApplyBrandOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Preloaded Brand Package (Create Center compile result or override).
|
|
19
|
+
* When omitted, built-in languages resolve from brands/<id>/brand.json.
|
|
20
|
+
*/
|
|
21
|
+
package?: BrandPackage;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Apply a design language by id.
|
|
25
|
+
* - `factory` / unknown without package → clearBrand (tokens SSOT)
|
|
26
|
+
* - built-in id without package → load shipped Brand Package
|
|
27
|
+
* - with `package` → applyBrandPackage (full carrier swap)
|
|
28
|
+
*/
|
|
29
|
+
declare function applyLanguage(languageId: string, options?: ApplyLanguageOptions): DesignLanguageEntry | null;
|
|
30
|
+
/** Restore factory product chrome (clear data-brand + injected skin). */
|
|
31
|
+
declare function clearLanguage(options?: ApplyBrandOptions): void;
|
|
32
|
+
declare function getActiveLanguageId(doc?: Document): string;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* AUTO-GENERATED by scripts/sync-languages.mjs — DO NOT EDIT.
|
|
36
|
+
* Built-in Brand Packages for applyLanguage(id) without manual JSON import.
|
|
37
|
+
* Source: packages/design/tokens/brands/<id>/brand.json
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/** Normalized package for a shipped design-language id, or undefined. */
|
|
41
|
+
declare function getBuiltInBrandPackage(id: string): BrandPackage | undefined;
|
|
42
|
+
declare function listBuiltInBrandIds(): string[];
|
|
43
|
+
declare function hasBuiltInBrandPackage(id: string): boolean;
|
|
44
|
+
|
|
45
|
+
export { type ApplyLanguageOptions, DesignLanguageEntry, applyLanguage, clearLanguage, getActiveLanguageId, getBuiltInBrandPackage, hasBuiltInBrandPackage, listBuiltInBrandIds };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyLanguage,
|
|
3
|
+
clearLanguage,
|
|
4
|
+
getActiveLanguageId,
|
|
5
|
+
getBuiltInBrandPackage,
|
|
6
|
+
hasBuiltInBrandPackage,
|
|
7
|
+
listBuiltInBrandIds
|
|
8
|
+
} from "./chunk-ZSOVG5W4.js";
|
|
9
|
+
import {
|
|
10
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
11
|
+
DEFAULT_LANGUAGE,
|
|
12
|
+
LANGUAGE_IDS,
|
|
13
|
+
LANGUAGE_REGISTRY,
|
|
14
|
+
getLanguageById,
|
|
15
|
+
isLanguageId,
|
|
16
|
+
listSkinLanguages
|
|
17
|
+
} from "./chunk-YJGDBU5Y.js";
|
|
18
|
+
|
|
19
|
+
// src/index.ts
|
|
20
|
+
import {
|
|
21
|
+
applyBrandPackage,
|
|
22
|
+
clearBrand,
|
|
23
|
+
getActiveBrandId,
|
|
24
|
+
normalizeBrandPackage,
|
|
25
|
+
validateBrandPackage
|
|
26
|
+
} from "@nebutra/tokens/brand-package";
|
|
27
|
+
export {
|
|
28
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
29
|
+
DEFAULT_LANGUAGE,
|
|
30
|
+
LANGUAGE_IDS,
|
|
31
|
+
LANGUAGE_REGISTRY,
|
|
32
|
+
applyBrandPackage,
|
|
33
|
+
applyLanguage,
|
|
34
|
+
clearBrand,
|
|
35
|
+
clearLanguage,
|
|
36
|
+
getActiveBrandId,
|
|
37
|
+
getActiveLanguageId,
|
|
38
|
+
getBuiltInBrandPackage,
|
|
39
|
+
getLanguageById,
|
|
40
|
+
hasBuiltInBrandPackage,
|
|
41
|
+
isLanguageId,
|
|
42
|
+
listBuiltInBrandIds,
|
|
43
|
+
listSkinLanguages,
|
|
44
|
+
normalizeBrandPackage,
|
|
45
|
+
validateBrandPackage
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @nebutra/theme — Design-language switch surface (client-safe root)\n *\n * Root exports are intentionally lean for app bundles:\n * applyLanguage / LANGUAGE_REGISTRY / built-in packages\n *\n * Light/dark ThemeProvider: import from `@nebutra/tokens` only (not here).\n *\n * Compile & Create Center tooling:\n * @nebutra/tokens/brand-package (preferred)\n * @nebutra/theme/brand-package (re-export alias)\n *\n * Layers:\n * @nebutra/tokens product chrome SSOT (styles.css + recipe.css + ThemeProvider)\n * @nebutra/theme LANGUAGE_REGISTRY + applyLanguage + skins.css\n */\n\n// Re-export apply helpers used with applyLanguage({ package })\nexport {\n type ApplyBrandOptions,\n applyBrandPackage,\n type BrandPackage,\n clearBrand,\n getActiveBrandId,\n normalizeBrandPackage,\n type ValidationResult,\n validateBrandPackage,\n} from \"@nebutra/tokens/brand-package\";\nexport {\n type ApplyLanguageOptions,\n applyLanguage,\n clearLanguage,\n getActiveLanguageId,\n} from \"./apply-language\";\nexport {\n getBuiltInBrandPackage,\n hasBuiltInBrandPackage,\n listBuiltInBrandIds,\n} from \"./built-in-packages\";\nexport {\n BUILT_IN_LANGUAGE_IDS,\n DEFAULT_LANGUAGE,\n type DesignLanguageCompatibility,\n type DesignLanguageEntry,\n type DesignLanguageInstall,\n type DesignLanguageRegistry,\n getLanguageById,\n isLanguageId,\n LANGUAGE_IDS,\n LANGUAGE_REGISTRY,\n type LanguageId,\n listSkinLanguages,\n} from \"./languages\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design-language catalog — the real product surface of @nebutra/theme.
|
|
3
|
+
*
|
|
4
|
+
* A "language" is a full Brand Package (roles + recipe + elev), proven by
|
|
5
|
+
* external DS stress tests (Linear / GSAP / Raycast / Vercel / Vanta / Stripe / Notion).
|
|
6
|
+
* Swapping `html[data-brand]` (or applyLanguage) recolors product chrome without
|
|
7
|
+
* call-site edits.
|
|
8
|
+
*
|
|
9
|
+
* Multi-mood oklch catalog was removed. Use LANGUAGE_REGISTRY / isLanguageId only.
|
|
10
|
+
*/
|
|
11
|
+
interface DesignLanguageInstall {
|
|
12
|
+
command: string;
|
|
13
|
+
/** Single-skin import for demos; null for factory */
|
|
14
|
+
cssImport: string | null;
|
|
15
|
+
}
|
|
16
|
+
interface DesignLanguageCompatibility {
|
|
17
|
+
tailwind: "4";
|
|
18
|
+
cssVariables: boolean;
|
|
19
|
+
brandPackage: boolean;
|
|
20
|
+
dataBrand: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface DesignLanguageEntry {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
kind: "design-language";
|
|
26
|
+
description: string;
|
|
27
|
+
/** Contract proofs this fixture exercises */
|
|
28
|
+
proves: string[];
|
|
29
|
+
darkDefault: boolean;
|
|
30
|
+
/** Relative to @nebutra/tokens package root; null = factory (no override) */
|
|
31
|
+
brandPath: string | null;
|
|
32
|
+
skinPath: string | null;
|
|
33
|
+
install: DesignLanguageInstall;
|
|
34
|
+
compatibility: DesignLanguageCompatibility;
|
|
35
|
+
}
|
|
36
|
+
interface DesignLanguageRegistry {
|
|
37
|
+
$schema: string;
|
|
38
|
+
version: string;
|
|
39
|
+
defaultLanguage: string;
|
|
40
|
+
description: string;
|
|
41
|
+
languages: DesignLanguageEntry[];
|
|
42
|
+
}
|
|
43
|
+
declare const LANGUAGE_REGISTRY: DesignLanguageRegistry;
|
|
44
|
+
declare const LANGUAGE_IDS: string[];
|
|
45
|
+
declare const DEFAULT_LANGUAGE: string;
|
|
46
|
+
/** Alias — “theme” in product speak = design language */
|
|
47
|
+
declare const BUILT_IN_LANGUAGE_IDS: string[];
|
|
48
|
+
type LanguageId = string;
|
|
49
|
+
declare function isLanguageId(id: string): boolean;
|
|
50
|
+
declare function getLanguageById(id: string): DesignLanguageEntry | undefined;
|
|
51
|
+
/** Fixture languages that ship a Brand Package (excludes factory). */
|
|
52
|
+
declare function listSkinLanguages(): DesignLanguageEntry[];
|
|
53
|
+
|
|
54
|
+
export { BUILT_IN_LANGUAGE_IDS, DEFAULT_LANGUAGE, type DesignLanguageCompatibility, type DesignLanguageEntry, type DesignLanguageInstall, type DesignLanguageRegistry, LANGUAGE_IDS, LANGUAGE_REGISTRY, type LanguageId, getLanguageById, isLanguageId, listSkinLanguages };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
3
|
+
DEFAULT_LANGUAGE,
|
|
4
|
+
LANGUAGE_IDS,
|
|
5
|
+
LANGUAGE_REGISTRY,
|
|
6
|
+
getLanguageById,
|
|
7
|
+
isLanguageId,
|
|
8
|
+
listSkinLanguages
|
|
9
|
+
} from "./chunk-YJGDBU5Y.js";
|
|
10
|
+
export {
|
|
11
|
+
BUILT_IN_LANGUAGE_IDS,
|
|
12
|
+
DEFAULT_LANGUAGE,
|
|
13
|
+
LANGUAGE_IDS,
|
|
14
|
+
LANGUAGE_REGISTRY,
|
|
15
|
+
getLanguageById,
|
|
16
|
+
isLanguageId,
|
|
17
|
+
listSkinLanguages
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=languages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|