@synapsly/tokens 0.1.0 → 0.2.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/index.js CHANGED
@@ -682,7 +682,60 @@ function getThemeSelector(name) {
682
682
  return `[${themeAttribute}="${name}"]`;
683
683
  }
684
684
 
685
- // src/semanticTokens.ts
685
+ // src/createThemeTokens.ts
686
+ function createThemeTokens(base, overrides = {}) {
687
+ return mergeTokens(base, overrides);
688
+ }
689
+ function mergeTokens(base, overrides) {
690
+ if (!isRecord(base) || !isRecord(overrides)) {
691
+ return overrides ?? base;
692
+ }
693
+ const merged = { ...base };
694
+ for (const key of Reflect.ownKeys(overrides)) {
695
+ merged[key] = mergeTokens(base[key], overrides[key]);
696
+ }
697
+ return merged;
698
+ }
699
+ function isRecord(value) {
700
+ return typeof value === "object" && value !== null && !Array.isArray(value);
701
+ }
702
+
703
+ // src/resolveTokenReferences.ts
704
+ function resolveTokenReferences(value, source) {
705
+ if (typeof value === "string") {
706
+ const match = value.match(/^\{(.+)\}$/);
707
+ if (!match) {
708
+ return value;
709
+ }
710
+ const referencePath = match[1];
711
+ if (!referencePath) {
712
+ return value;
713
+ }
714
+ return getPath(source, referencePath);
715
+ }
716
+ if (Array.isArray(value)) {
717
+ return value.map((item) => resolveTokenReferences(item, source));
718
+ }
719
+ if (typeof value === "object" && value !== null) {
720
+ return Object.fromEntries(
721
+ Object.entries(value).map(([key, childValue]) => [
722
+ key,
723
+ resolveTokenReferences(childValue, source)
724
+ ])
725
+ );
726
+ }
727
+ return value;
728
+ }
729
+ function getPath(source, path) {
730
+ return path.split(".").reduce((current, segment) => {
731
+ if (typeof current !== "object" || current === null || !(segment in current)) {
732
+ throw new Error(`Unable to resolve token reference: {${path}}`);
733
+ }
734
+ return current[segment];
735
+ }, source);
736
+ }
737
+
738
+ // src/semanticTokenReferences.ts
686
739
  var defaultLightSemanticTokenReferences = {
687
740
  color: {
688
741
  bg: {
@@ -1214,6 +1267,8 @@ var defaultDarkSemanticTokenReferences = {
1214
1267
  }
1215
1268
  }
1216
1269
  };
1270
+
1271
+ // src/semanticTokens.ts
1217
1272
  var defaultLightSemanticTokens = resolveTokenReferences(
1218
1273
  defaultLightSemanticTokenReferences,
1219
1274
  { primitive: primitiveVars }
@@ -1261,39 +1316,6 @@ var defaultTokenReferences = {
1261
1316
  primitive: primitiveTokens,
1262
1317
  semantic: defaultSemanticTokenReferences
1263
1318
  };
1264
- function resolveTokenReferences(value, source) {
1265
- if (typeof value === "string") {
1266
- const match = value.match(/^\{(.+)\}$/);
1267
- if (!match) {
1268
- return value;
1269
- }
1270
- const referencePath = match[1];
1271
- if (!referencePath) {
1272
- return value;
1273
- }
1274
- return getPath(source, referencePath);
1275
- }
1276
- if (Array.isArray(value)) {
1277
- return value.map((item) => resolveTokenReferences(item, source));
1278
- }
1279
- if (typeof value === "object" && value !== null) {
1280
- return Object.fromEntries(
1281
- Object.entries(value).map(([key, childValue]) => [
1282
- key,
1283
- resolveTokenReferences(childValue, source)
1284
- ])
1285
- );
1286
- }
1287
- return value;
1288
- }
1289
- function getPath(source, path) {
1290
- return path.split(".").reduce((current, segment) => {
1291
- if (typeof current !== "object" || current === null || !(segment in current)) {
1292
- throw new Error(`Unable to resolve token reference: {${path}}`);
1293
- }
1294
- return current[segment];
1295
- }, source);
1296
- }
1297
1319
 
1298
1320
  // src/createTheme.ts
1299
1321
  function createTheme(options) {
@@ -1312,25 +1334,96 @@ function createTheme(options) {
1312
1334
  selector
1313
1335
  };
1314
1336
  }
1315
- function createThemeTokens(base, overrides = {}) {
1316
- return mergeTokens(base, overrides);
1337
+ var createVanillaThemeForSemantic = createTheme$1;
1338
+ var createGlobalThemeForSemantic = createGlobalTheme;
1339
+ var themeContractForTheme = themeContract;
1340
+
1341
+ // src/cssVars.ts
1342
+ var cssVarPrefix = "synapsly";
1343
+ var defaultResolvedLightCssTokens = resolveTokenReferences(
1344
+ defaultLightSemanticTokenReferences,
1345
+ {
1346
+ primitive: primitiveTokens
1347
+ }
1348
+ );
1349
+ var defaultResolvedDarkCssTokens = resolveTokenReferences(
1350
+ defaultDarkSemanticTokenReferences,
1351
+ {
1352
+ primitive: primitiveTokens
1353
+ }
1354
+ );
1355
+ var defaultResolvedCssTokens = defaultResolvedLightCssTokens;
1356
+ var cssVars = createCssVarReferences(defaultResolvedLightCssTokens);
1357
+ function createCssThemeTokens(base, overrides = {}) {
1358
+ return createThemeTokens(base, overrides);
1317
1359
  }
1318
- function mergeTokens(base, overrides) {
1319
- if (!isRecord(base) || !isRecord(overrides)) {
1320
- return overrides ?? base;
1360
+ function createCssTheme(options) {
1361
+ const tokens = createCssThemeTokens(
1362
+ options.tokens ?? defaultResolvedLightCssTokens,
1363
+ options.overrides ?? {}
1364
+ );
1365
+ const selector = options.selector ?? getThemeSelector(options.name);
1366
+ return {
1367
+ attributes: {
1368
+ [themeAttribute]: options.name
1369
+ },
1370
+ cssText: createCssThemeRule(selector, tokens),
1371
+ name: options.name,
1372
+ selector
1373
+ };
1374
+ }
1375
+ function createCssThemeRule(selector, tokens) {
1376
+ const declarations = flattenTokenEntries(tokens).map(([path, value]) => ` ${getCssVarName(path)}: ${value};`).join("\n");
1377
+ return `${selector} {
1378
+ ${declarations}
1379
+ }`;
1380
+ }
1381
+ function createDefaultCssThemes() {
1382
+ return [
1383
+ createCssThemeRule(
1384
+ `:root, ${getThemeSelector(themeNames.light)}`,
1385
+ defaultResolvedLightCssTokens
1386
+ ),
1387
+ createCssThemeRule(getThemeSelector(themeNames.dark), defaultResolvedDarkCssTokens)
1388
+ ].join("\n\n");
1389
+ }
1390
+ function getCssVarName(path) {
1391
+ return `--${[cssVarPrefix, ...path.map(toKebabCase)].join("-")}`;
1392
+ }
1393
+ function createCssVarReferences(tokens) {
1394
+ return mapTokenLeaves(tokens, (path) => `var(${getCssVarName(path)})`);
1395
+ }
1396
+ function mapTokenLeaves(value, mapper, path = []) {
1397
+ if (typeof value === "string") {
1398
+ return mapper(path);
1321
1399
  }
1322
- const merged = { ...base };
1323
- for (const key of Reflect.ownKeys(overrides)) {
1324
- merged[key] = mergeTokens(base[key], overrides[key]);
1400
+ if (isRecord2(value)) {
1401
+ return Object.fromEntries(
1402
+ Object.entries(value).map(([key, childValue]) => [
1403
+ key,
1404
+ mapTokenLeaves(childValue, mapper, [...path, key])
1405
+ ])
1406
+ );
1325
1407
  }
1326
- return merged;
1408
+ return value;
1327
1409
  }
1328
- function isRecord(value) {
1410
+ function flattenTokenEntries(value, path = []) {
1411
+ if (typeof value === "string") {
1412
+ return [[path, value]];
1413
+ }
1414
+ if (isRecord2(value)) {
1415
+ return Object.entries(value).flatMap(
1416
+ ([key, childValue]) => flattenTokenEntries(childValue, [...path, key])
1417
+ );
1418
+ }
1419
+ return [];
1420
+ }
1421
+ function toKebabCase(value) {
1422
+ return value.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[^a-zA-Z0-9-]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase();
1423
+ }
1424
+ function isRecord2(value) {
1329
1425
  return typeof value === "object" && value !== null && !Array.isArray(value);
1330
1426
  }
1331
- var createVanillaThemeForSemantic = createTheme$1;
1332
- var createGlobalThemeForSemantic = createGlobalTheme;
1333
- var themeContractForTheme = themeContract;
1334
1427
 
1335
1428
  // src/defaultTheme.css.ts
1336
1429
  var defaultDarkTheme = { attributes: { "data-theme": "dark" }, className: "defaultTheme__eb1mul1", name: "dark", selector: '[data-theme="dark"]' };
@@ -1339,6 +1432,6 @@ var defaultLightTheme = { attributes: { "data-theme": "light" }, className: "def
1339
1432
  var defaultLightThemeClass = "defaultTheme__eb1mul0";
1340
1433
  var defaultThemeClass = "defaultTheme__eb1mul0";
1341
1434
 
1342
- export { createTheme, createThemeTokens, defaultDarkSemanticTokenReferences, defaultDarkSemanticTokens, defaultDarkTheme, defaultDarkThemeClass, defaultDarkTokenReferences, defaultDarkTokens, defaultLightSemanticTokenReferences, defaultLightSemanticTokens, defaultLightTheme, defaultLightThemeClass, defaultLightTokenReferences, defaultLightTokens, defaultResolvedDarkSemanticTokens, defaultResolvedLightSemanticTokens, defaultResolvedSemanticTokens, defaultSemanticTokenReferences, defaultSemanticTokens, defaultThemeClass, defaultTokenReferences, defaultTokens, getThemeSelector, primitiveTokens, primitiveVars, semanticContract, semanticVars, themeAttribute, themeNames, vars };
1435
+ export { createCssTheme, createCssThemeRule, createCssThemeTokens, createDefaultCssThemes, createTheme, createThemeTokens, cssVarPrefix, cssVars, defaultDarkSemanticTokenReferences, defaultDarkSemanticTokens, defaultDarkTheme, defaultDarkThemeClass, defaultDarkTokenReferences, defaultDarkTokens, defaultLightSemanticTokenReferences, defaultLightSemanticTokens, defaultLightTheme, defaultLightThemeClass, defaultLightTokenReferences, defaultLightTokens, defaultResolvedCssTokens, defaultResolvedDarkCssTokens, defaultResolvedDarkSemanticTokens, defaultResolvedLightCssTokens, defaultResolvedLightSemanticTokens, defaultResolvedSemanticTokens, defaultSemanticTokenReferences, defaultSemanticTokens, defaultThemeClass, defaultTokenReferences, defaultTokens, getCssVarName, getThemeSelector, primitiveTokens, primitiveVars, semanticContract, semanticVars, themeAttribute, themeNames, vars };
1343
1436
  //# sourceMappingURL=index.js.map
1344
1437
  //# sourceMappingURL=index.js.map