@terrazzo/token-tools 0.7.3 → 0.8.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.
Files changed (119) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/css.d.ts +158 -0
  3. package/dist/css.d.ts.map +1 -0
  4. package/dist/css.js +351 -0
  5. package/dist/css.js.map +1 -0
  6. package/dist/index.d.ts +69 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +55 -29
  9. package/dist/index.js.map +1 -1
  10. package/dist/js.d.ts +23 -0
  11. package/dist/js.d.ts.map +1 -0
  12. package/dist/js.js +13 -0
  13. package/dist/js.js.map +1 -0
  14. package/dist/string-BZ5Le1WD.js +259 -0
  15. package/dist/string-BZ5Le1WD.js.map +1 -0
  16. package/dist/types-C68LbU3N.d.ts +403 -0
  17. package/dist/types-C68LbU3N.d.ts.map +1 -0
  18. package/package.json +9 -11
  19. package/rolldown.config.ts +17 -0
  20. package/dist/color.d.ts +0 -26
  21. package/dist/color.d.ts.map +0 -1
  22. package/dist/color.js +0 -149
  23. package/dist/color.js.map +0 -1
  24. package/dist/css/boolean.d.ts +0 -5
  25. package/dist/css/boolean.d.ts.map +0 -1
  26. package/dist/css/boolean.js +0 -9
  27. package/dist/css/boolean.js.map +0 -1
  28. package/dist/css/border.d.ts +0 -10
  29. package/dist/css/border.d.ts.map +0 -1
  30. package/dist/css/border.js +0 -31
  31. package/dist/css/border.js.map +0 -1
  32. package/dist/css/color.d.ts +0 -11
  33. package/dist/css/color.d.ts.map +0 -1
  34. package/dist/css/color.js +0 -54
  35. package/dist/css/color.js.map +0 -1
  36. package/dist/css/css-types.d.ts +0 -13
  37. package/dist/css/css-types.d.ts.map +0 -1
  38. package/dist/css/css-types.js +0 -2
  39. package/dist/css/css-types.js.map +0 -1
  40. package/dist/css/cubic-bezier.d.ts +0 -5
  41. package/dist/css/cubic-bezier.d.ts.map +0 -1
  42. package/dist/css/cubic-bezier.js +0 -12
  43. package/dist/css/cubic-bezier.js.map +0 -1
  44. package/dist/css/dimension.d.ts +0 -5
  45. package/dist/css/dimension.d.ts.map +0 -1
  46. package/dist/css/dimension.js +0 -10
  47. package/dist/css/dimension.js.map +0 -1
  48. package/dist/css/duration.d.ts +0 -5
  49. package/dist/css/duration.d.ts.map +0 -1
  50. package/dist/css/duration.js +0 -10
  51. package/dist/css/duration.js.map +0 -1
  52. package/dist/css/font-family.d.ts +0 -4
  53. package/dist/css/font-family.d.ts.map +0 -1
  54. package/dist/css/font-family.js +0 -10
  55. package/dist/css/font-family.js.map +0 -1
  56. package/dist/css/font-weight.d.ts +0 -5
  57. package/dist/css/font-weight.d.ts.map +0 -1
  58. package/dist/css/font-weight.js +0 -10
  59. package/dist/css/font-weight.js.map +0 -1
  60. package/dist/css/gradient.d.ts +0 -6
  61. package/dist/css/gradient.d.ts.map +0 -1
  62. package/dist/css/gradient.js +0 -37
  63. package/dist/css/gradient.js.map +0 -1
  64. package/dist/css/index.d.ts +0 -24
  65. package/dist/css/index.d.ts.map +0 -1
  66. package/dist/css/index.js +0 -97
  67. package/dist/css/index.js.map +0 -1
  68. package/dist/css/lib.d.ts +0 -24
  69. package/dist/css/lib.d.ts.map +0 -1
  70. package/dist/css/lib.js +0 -35
  71. package/dist/css/lib.js.map +0 -1
  72. package/dist/css/link.d.ts +0 -5
  73. package/dist/css/link.d.ts.map +0 -1
  74. package/dist/css/link.js +0 -10
  75. package/dist/css/link.js.map +0 -1
  76. package/dist/css/number.d.ts +0 -5
  77. package/dist/css/number.d.ts.map +0 -1
  78. package/dist/css/number.js +0 -10
  79. package/dist/css/number.js.map +0 -1
  80. package/dist/css/shadow.d.ts +0 -10
  81. package/dist/css/shadow.d.ts.map +0 -1
  82. package/dist/css/shadow.js +0 -51
  83. package/dist/css/shadow.js.map +0 -1
  84. package/dist/css/string.d.ts +0 -5
  85. package/dist/css/string.d.ts.map +0 -1
  86. package/dist/css/string.js +0 -12
  87. package/dist/css/string.js.map +0 -1
  88. package/dist/css/stroke-style.d.ts +0 -5
  89. package/dist/css/stroke-style.d.ts.map +0 -1
  90. package/dist/css/stroke-style.js +0 -10
  91. package/dist/css/stroke-style.js.map +0 -1
  92. package/dist/css/transition.d.ts +0 -5
  93. package/dist/css/transition.d.ts.map +0 -1
  94. package/dist/css/transition.js +0 -21
  95. package/dist/css/transition.js.map +0 -1
  96. package/dist/css/typography.d.ts +0 -5
  97. package/dist/css/typography.d.ts.map +0 -1
  98. package/dist/css/typography.js +0 -55
  99. package/dist/css/typography.js.map +0 -1
  100. package/dist/id.d.ts +0 -16
  101. package/dist/id.d.ts.map +0 -1
  102. package/dist/id.js +0 -46
  103. package/dist/id.js.map +0 -1
  104. package/dist/js/index.d.ts +0 -13
  105. package/dist/js/index.d.ts.map +0 -1
  106. package/dist/js/index.js +0 -16
  107. package/dist/js/index.js.map +0 -1
  108. package/dist/string.d.ts +0 -7
  109. package/dist/string.d.ts.map +0 -1
  110. package/dist/string.js +0 -47
  111. package/dist/string.js.map +0 -1
  112. package/dist/transform.d.ts +0 -7
  113. package/dist/transform.d.ts.map +0 -1
  114. package/dist/transform.js +0 -17
  115. package/dist/transform.js.map +0 -1
  116. package/dist/types.d.ts +0 -397
  117. package/dist/types.d.ts.map +0 -1
  118. package/dist/types.js +0 -2
  119. package/dist/types.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,6 +1,70 @@
1
- export * from './color.js';
2
- export * from './id.js';
3
- export * from './string.js';
4
- export * from './transform.js';
5
- export * from './types.js';
1
+ import { AliasToken, AliasValue, BooleanToken, BooleanTokenNormalized, BooleanValue, BorderToken, BorderTokenNormalized, BorderValue, BorderValueNormalized, ColorSpace, ColorToken, ColorTokenNormalized, ColorValue, ColorValueNormalized, CubicBezierToken, CubicBezierTokenNormalized, CubicBezierValue, DimensionToken, DimensionTokenNormalized, DimensionValue, DurationToken, DurationTokenNormalized, DurationValue, FontFamilyToken, FontFamilyTokenNormalized, FontFamilyValue, FontFamilyValueNormalized, FontWeightToken, FontWeightTokenNormalized, FontWeightValue, FontWeightValueNormalized, GradientStop, GradientStopNormalized, GradientToken, GradientTokenNormalized, GradientValue, GradientValueNormalized, Group, GroupCore, GroupOrToken, LinkToken, LinkTokenNormalized, LinkValue, ModeMap, NumberToken, NumberTokenNormalized, NumberValue, ShadowToken, ShadowTokenNormalized, ShadowValue, ShadowValueNormalized, StringToken, StringTokenNormalized, StringValue, StrokeStyleToken, StrokeStyleTokenNormalized, StrokeStyleValue, StrokeStyleValueExpanded, Token, TokenCore, TokenMode, TokenNormalized, TokenNormalizedCore, TokenNormalizedSet, TokensSet, TransitionToken, TransitionTokenNormalized, TransitionValue, TransitionValueNormalized, TypographyToken, TypographyTokenNormalized, TypographyValue, TypographyValueNormalized } from "./types-C68LbU3N.js";
2
+ import "culori/css";
3
+ import { Color } from "culori/fn";
4
+
5
+ //#region src/color.d.ts
6
+ declare const CULORI_TO_CSS: Record<Extract<Color['mode'], 'a98' | 'lab' | 'lch' | 'oklab' | 'oklch' | 'hsl' | 'hsv' | 'hwb' | 'lrgb' | 'p3' | 'prophoto' | 'rec2020' | 'rgb' | 'xyz50' | 'xyz65'>, ColorSpace>;
7
+ declare const CSS_TO_CULORI: {
8
+ readonly a98: "a98";
9
+ readonly 'display-p3': "p3";
10
+ readonly hsl: "hsl";
11
+ readonly hsv: "hsv";
12
+ readonly hwb: "hwb";
13
+ readonly lab: "lab";
14
+ readonly lch: "lch";
15
+ readonly oklab: "oklab";
16
+ readonly oklch: "oklch";
17
+ readonly 'prophoto-rgb': "prophoto";
18
+ readonly rec2020: "rec2020";
19
+ readonly srgb: "rgb";
20
+ readonly 'srgb-linear': "lrgb";
21
+ readonly 'xyz-d50': "xyz50";
22
+ readonly 'xyz-d65': "xyz65";
23
+ };
24
+ /** Parse any color */
25
+ declare function parseColor(color: string): ColorValueNormalized;
26
+ /** Convert a color token to a Culori color */
27
+ declare function tokenToCulori(value: ColorValueNormalized): Color | undefined;
28
+ //# sourceMappingURL=color.d.ts.map
29
+ //#endregion
30
+ //#region src/id.d.ts
31
+ /** Is this token an alias of another? */
32
+ declare function isAlias(value: string): boolean;
33
+ /** Match token against globs */
34
+ declare function isTokenMatch(tokenID: string, globPatterns: string[]): boolean;
35
+ /** Same as isTokenMatch but returns the matching pattern */
36
+ declare function getTokenMatch(tokenId: string, globPatterns: string[]): string | undefined;
37
+ /** Make an alias */
38
+ declare function makeAlias(input: string): string;
39
+ /** Parse an alias */
40
+ declare function parseAlias(input: string): string;
41
+ /** split a token ID into a local ID and group ID */
42
+ declare function splitID(id: string): {
43
+ local: string;
44
+ group?: string;
45
+ };
46
+ //# sourceMappingURL=id.d.ts.map
47
+ //#endregion
48
+ //#region src/string.d.ts
49
+ /** Pad string lengths */
50
+ declare function padStr(input: string, length: number, alignment?: 'left' | 'center' | 'right'): string;
51
+ /** Pluralize strings */
52
+ declare function pluralize<T = string>(count: number, singular: T, plural: T): T;
53
+ /** Turn a string into kebab-case */
54
+ declare function kebabCase(str: string): string;
55
+ //# sourceMappingURL=string.d.ts.map
56
+ //#endregion
57
+ //#region src/transform.d.ts
58
+ interface CustomTransformOptions {
59
+ /** Token $type */
60
+ $type: string;
61
+ }
62
+ /** Give a user pertinent feedback if they override a transform incorrectly */
63
+ declare function validateCustomTransform(value: unknown, {
64
+ $type
65
+ }: CustomTransformOptions): void;
66
+ //# sourceMappingURL=transform.d.ts.map
67
+
68
+ //#endregion
69
+ export { AliasToken, AliasValue, BooleanToken, BooleanTokenNormalized, BooleanValue, BorderToken, BorderTokenNormalized, BorderValue, BorderValueNormalized, CSS_TO_CULORI, CULORI_TO_CSS, ColorSpace, ColorToken, ColorTokenNormalized, ColorValue, ColorValueNormalized, CubicBezierToken, CubicBezierTokenNormalized, CubicBezierValue, CustomTransformOptions, DimensionToken, DimensionTokenNormalized, DimensionValue, DurationToken, DurationTokenNormalized, DurationValue, FontFamilyToken, FontFamilyTokenNormalized, FontFamilyValue, FontFamilyValueNormalized, FontWeightToken, FontWeightTokenNormalized, FontWeightValue, FontWeightValueNormalized, GradientStop, GradientStopNormalized, GradientToken, GradientTokenNormalized, GradientValue, GradientValueNormalized, Group, GroupCore, GroupOrToken, LinkToken, LinkTokenNormalized, LinkValue, ModeMap, NumberToken, NumberTokenNormalized, NumberValue, ShadowToken, ShadowTokenNormalized, ShadowValue, ShadowValueNormalized, StringToken, StringTokenNormalized, StringValue, StrokeStyleToken, StrokeStyleTokenNormalized, StrokeStyleValue, StrokeStyleValueExpanded, Token, TokenCore, TokenMode, TokenNormalized, TokenNormalizedCore, TokenNormalizedSet, TokensSet, TransitionToken, TransitionTokenNormalized, TransitionValue, TransitionValueNormalized, TypographyToken, TypographyTokenNormalized, TypographyValue, TypographyValueNormalized, getTokenMatch, isAlias, isTokenMatch, kebabCase, makeAlias, padStr, parseAlias, parseColor, pluralize, splitID, tokenToCulori, validateCustomTransform };
6
70
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/color.ts","../src/id.ts","../src/string.ts","../src/transform.ts"],"sourcesContent":[],"mappings":";;;;;cAMa,eAAe,OAC1B,QACE,wJAiBF;cAmBW;EAtCA,SAAA,GAAA,EAAA,KAoCH;EAAA,SAAA,YAAA,EAAA,IAAA;EAAA,SAlCN,GAAA,EAAA,KAAA;EAAK,SADP,GAAA,EAAA,KAAA;EAAO,SAkBP,GAAA,EAAA,KAAA;EAAU,SAnBgB,GAAA,EAAA,KAAA;EAAM,SAAA,GAAA,EAAA,KAAA;EAsCrB,SAAA,KAAA,EAgBH,OAAA;EAGM,SAAA,KAAU,EAAA,OAAA;EA8DV,SAAA,cAAa,EAAA,UAAA;EAAA,SAAA,OAAA,EAAA,SAAA;EAAA,SAAQ,IAAA,EAAA,KAAA;EAAoB,SAAG,aAAA,EAAA,MAAA;EAAK,SAAA,SAAA,EAAA,OAAA;;;;ACxHjD,iBD0DA,UAAA,CC1DO,KAAA,EAAA,MAAA,CAAA,ED0DoB,oBC1DpB;AAKvB;AAKgB,iBD8GA,aAAA,CC9Ga,KAAA,ED8GQ,oBC9GR,CAAA,ED8G+B,KC9G/B,GAAA,SAAA;AAS7B;;;;iBAnBgB,OAAA;;iBAKA,YAAA;;ADJH,iBCSG,aAAA,CD2BN,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;AAlCN,iBCgBY,SAAA,CDhBZ,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAiBF,iBCIc,UAAA,CDJd,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAnBgC,iBCsClB,OAAA,CDtCkB,EAAA,EAAA,MAAA,CAAA,EAAA;EAsCrB,KAAA,EAAA,MAAA;EAmBG,KAAA,CAAA,EAAA,MAAU;AA8D1B,CAAA;;;;;iBE5HgB,MAAA;;iBAuBA,+CAA+C,WAAW,IAAI;;AFlBjE,iBEuBG,SAAA,CFaN,GAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;UG1CO,sBAAA;;;;;AHMJ,iBGAG,uBAAA,CHoCN,KAAA,EAAA,OAAA,EAAA;EAAA;AAAA,CAAA,EGpCyD,sBHoCzD,CAAA,EAAA,IAAA"}
package/dist/index.js CHANGED
@@ -1,30 +1,56 @@
1
- /**
2
- * @module @terrazzo/token-tools
3
- * @license MIT License
4
- *
5
- * Copyright (c) 2021 Drew Powers
6
- *
7
- * Permission is hereby granted, free of charge, to any person obtaining a copy
8
- * of this software and associated documentation files (the "Software"), to deal
9
- * in the Software without restriction, including without limitation the rights
10
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- * copies of the Software, and to permit persons to whom the Software is
12
- * furnished to do so, subject to the following conditions:
13
- *
14
- * The above copyright notice and this permission notice shall be included in all
15
- * copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
- * SOFTWARE.
24
- */
25
- export * from './color.js';
26
- export * from './id.js';
27
- export * from './string.js';
28
- export * from './transform.js';
29
- export * from './types.js';
1
+ import { CSS_TO_CULORI, CULORI_TO_CSS, kebabCase, padStr, parseColor, pluralize, tokenToCulori } from "./string-BZ5Le1WD.js";
2
+ import wcmatch from "wildcard-match";
3
+
4
+ //#region src/id.ts
5
+ const ALIAS_RE = /^\{([^}]+)\}$/;
6
+ /** Is this token an alias of another? */
7
+ function isAlias(value) {
8
+ return ALIAS_RE.test(value);
9
+ }
10
+ /** Match token against globs */
11
+ function isTokenMatch(tokenID, globPatterns) {
12
+ return wcmatch(globPatterns)(tokenID);
13
+ }
14
+ /** Same as isTokenMatch but returns the matching pattern */
15
+ function getTokenMatch(tokenId, globPatterns) {
16
+ for (const pattern of globPatterns) if (wcmatch(pattern)(tokenId)) return pattern;
17
+ }
18
+ /** Make an alias */
19
+ function makeAlias(input) {
20
+ return input.replace(/^\{?([^}]+)\}?$/, "{$1}");
21
+ }
22
+ /** Parse an alias */
23
+ function parseAlias(input) {
24
+ if (input.includes("#")) throw new Error("Mode aliases (# character) are no longer supported as of v0.6.0. Alias the root token instead, and apply modes in plugins.");
25
+ const match = input.match(ALIAS_RE);
26
+ if (!match) return input;
27
+ return match[1] ?? match[0];
28
+ }
29
+ /** split a token ID into a local ID and group ID */
30
+ function splitID(id) {
31
+ const lastSeparatorI = id.lastIndexOf(".");
32
+ if (lastSeparatorI === -1) return { local: id };
33
+ return {
34
+ local: id.substring(lastSeparatorI + 1),
35
+ group: id.substring(0, lastSeparatorI)
36
+ };
37
+ }
38
+
39
+ //#endregion
40
+ //#region src/transform.ts
41
+ /** Give a user pertinent feedback if they override a transform incorrectly */
42
+ function validateCustomTransform(value, { $type }) {
43
+ if (value) {
44
+ if (typeof value !== "string" && typeof value !== "object" || Array.isArray(value)) throw new Error(`transform(): expected string or Object of strings, received ${Array.isArray(value) ? "Array" : typeof value}`);
45
+ switch ($type) {
46
+ case "typography": {
47
+ if (typeof value !== "object") throw new Error("transform(): typography tokens must be an object of keys");
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ //#endregion
55
+ export { CSS_TO_CULORI, CULORI_TO_CSS, getTokenMatch, isAlias, isTokenMatch, kebabCase, makeAlias, padStr, parseAlias, parseColor, pluralize, splitID, tokenToCulori, validateCustomTransform };
30
56
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","names":["value: string","tokenID: string","globPatterns: string[]","tokenId: string","input: string","id: string","value: unknown"],"sources":["../src/id.ts","../src/transform.ts"],"sourcesContent":["import wcmatch from 'wildcard-match';\n\nconst ALIAS_RE = /^\\{([^}]+)\\}$/;\n\n/** Is this token an alias of another? */\nexport function isAlias(value: string): boolean {\n return ALIAS_RE.test(value);\n}\n\n/** Match token against globs */\nexport function isTokenMatch(tokenID: string, globPatterns: string[]): boolean {\n return wcmatch(globPatterns)(tokenID);\n}\n\n/** Same as isTokenMatch but returns the matching pattern */\nexport function getTokenMatch(tokenId: string, globPatterns: string[]): string | undefined {\n for (const pattern of globPatterns) {\n if (wcmatch(pattern)(tokenId)) {\n return pattern;\n }\n }\n}\n\n/** Make an alias */\nexport function makeAlias(input: string): string {\n return input.replace(/^\\{?([^}]+)\\}?$/, '{$1}');\n}\n\n/** Parse an alias */\nexport function parseAlias(input: string): string {\n // TODO: deprecate in future\n if (input.includes('#')) {\n throw new Error(\n 'Mode aliases (# character) are no longer supported as of v0.6.0. Alias the root token instead, and apply modes in plugins.',\n );\n }\n const match = input.match(ALIAS_RE);\n if (!match) {\n return input;\n }\n return match[1] ?? match[0];\n}\n\n/** split a token ID into a local ID and group ID */\nexport function splitID(id: string): { local: string; group?: string } {\n const lastSeparatorI = id.lastIndexOf('.');\n if (lastSeparatorI === -1) {\n return { local: id };\n }\n return {\n local: id.substring(lastSeparatorI + 1),\n group: id.substring(0, lastSeparatorI),\n };\n}\n","export interface CustomTransformOptions {\n /** Token $type */\n $type: string;\n}\n\n/** Give a user pertinent feedback if they override a transform incorrectly */\nexport function validateCustomTransform(value: unknown, { $type }: CustomTransformOptions) {\n if (value) {\n if ((typeof value !== 'string' && typeof value !== 'object') || Array.isArray(value)) {\n throw new Error(\n `transform(): expected string or Object of strings, received ${Array.isArray(value) ? 'Array' : typeof value}`,\n );\n }\n switch ($type) {\n case 'typography': {\n if (typeof value !== 'object') {\n throw new Error('transform(): typography tokens must be an object of keys');\n }\n break;\n }\n }\n }\n}\n"],"mappings":";;;;AAEA,MAAM,WAAW;;AAGjB,SAAgB,QAAQA,OAAwB;AAC9C,QAAO,SAAS,KAAK,MAAM;AAC5B;;AAGD,SAAgB,aAAaC,SAAiBC,cAAiC;AAC7E,QAAO,QAAQ,aAAa,CAAC,QAAQ;AACtC;;AAGD,SAAgB,cAAcC,SAAiBD,cAA4C;AACzF,MAAK,MAAM,WAAW,aACpB,KAAI,QAAQ,QAAQ,CAAC,QAAQ,CAC3B,QAAO;AAGZ;;AAGD,SAAgB,UAAUE,OAAuB;AAC/C,QAAO,MAAM,QAAQ,mBAAmB,OAAO;AAChD;;AAGD,SAAgB,WAAWA,OAAuB;AAEhD,KAAI,MAAM,SAAS,IAAI,CACrB,OAAM,IAAI,MACR;CAGJ,MAAM,QAAQ,MAAM,MAAM,SAAS;AACnC,MAAK,MACH,QAAO;AAET,QAAO,MAAM,MAAM,MAAM;AAC1B;;AAGD,SAAgB,QAAQC,IAA+C;CACrE,MAAM,iBAAiB,GAAG,YAAY,IAAI;AAC1C,KAAI,mBAAmB,GACrB,QAAO,EAAE,OAAO,GAAI;AAEtB,QAAO;EACL,OAAO,GAAG,UAAU,iBAAiB,EAAE;EACvC,OAAO,GAAG,UAAU,GAAG,eAAe;CACvC;AACF;;;;;AC/CD,SAAgB,wBAAwBC,OAAgB,EAAE,OAA+B,EAAE;AACzF,KAAI,OAAO;AACT,aAAY,UAAU,mBAAmB,UAAU,YAAa,MAAM,QAAQ,MAAM,CAClF,OAAM,IAAI,OACP,8DAA8D,MAAM,QAAQ,MAAM,GAAG,iBAAiB,MAAM;AAGjH,UAAQ,OAAR;GACE,KAAK,cAAc;AACjB,eAAW,UAAU,SACnB,OAAM,IAAI,MAAM;AAElB;GACD;EACF;CACF;AACF"}
package/dist/js.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { TokenNormalized } from "./types-C68LbU3N.js";
2
+
3
+ //#region src/js/index.d.ts
4
+ interface TransformJSValueOptions {
5
+ mode: string;
6
+ /** indent space count */
7
+ indent?: number;
8
+ /** initial indent level */
9
+ startingIndent?: number;
10
+ }
11
+ /**
12
+ * Convert token value to a JS string via acorn/astring.
13
+ */
14
+ declare function transformJSValue<T extends TokenNormalized>(token: T, {
15
+ mode,
16
+ indent,
17
+ startingIndent
18
+ }: TransformJSValueOptions): string | undefined;
19
+ //# sourceMappingURL=index.d.ts.map
20
+
21
+ //#endregion
22
+ export { TransformJSValueOptions, transformJSValue };
23
+ //# sourceMappingURL=js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.d.ts","names":[],"sources":["../src/js/index.ts"],"sourcesContent":[],"mappings":";;;UAEiB,uBAAA;;EAAA;EAWD,MAAA,CAAA,EAAA,MAAA;EAAgB;EAAA,cAAW,CAAA,EAAA,MAAA;;;;;AAEC,iBAF5B,gBAE4B,CAAA,UAFD,eAEC,CAAA,CAAA,KAAA,EADnC,CACmC,EAAA;EAAA,IAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAAA,uBAAA,CAAA,EAAA,MAAA,GAAA,SAAA;AAAuB"}
package/dist/js.js ADDED
@@ -0,0 +1,13 @@
1
+ //#region src/js/index.ts
2
+ /**
3
+ * Convert token value to a JS string via acorn/astring.
4
+ */
5
+ function transformJSValue(token, { mode, indent = 2, startingIndent = 0 }) {
6
+ if (!(mode in token.mode)) return;
7
+ const indentStart = startingIndent > 0 ? " ".repeat(startingIndent ?? 2) : "";
8
+ return JSON.stringify(token.mode[mode].$value, void 0, indent).replace(/\n/g, `\n${indentStart}`);
9
+ }
10
+
11
+ //#endregion
12
+ export { transformJSValue };
13
+ //# sourceMappingURL=js.js.map
package/dist/js.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.js","names":["token: T"],"sources":["../src/js/index.ts"],"sourcesContent":["import type { TokenNormalized } from '../types.js';\n\nexport interface TransformJSValueOptions {\n mode: string;\n /** indent space count */\n indent?: number;\n /** initial indent level */\n startingIndent?: number;\n}\n\n/**\n * Convert token value to a JS string via acorn/astring.\n */\nexport function transformJSValue<T extends TokenNormalized>(\n token: T,\n { mode, indent = 2, startingIndent = 0 }: TransformJSValueOptions,\n) {\n if (!(mode in token.mode)) {\n return;\n }\n const indentStart = startingIndent > 0 ? ' '.repeat(startingIndent ?? 2) : '';\n\n // note: since tokens are JSON-serializable to begin with, using\n // JSON.stringify generates the same output as an AST parser/generator would\n // but faster and without the added overhead (even acorn/astring leave object\n // keys quoted).\n\n // TODO: use @biomejs/js-api when it’s stable for pretty formatting\n\n return JSON.stringify(token.mode[mode]!.$value, undefined, indent).replace(/\\n/g, `\\n${indentStart}`);\n}\n"],"mappings":";;;;AAaA,SAAgB,iBACdA,OACA,EAAE,MAAM,SAAS,GAAG,iBAAiB,GAA4B,EACjE;AACA,OAAM,QAAQ,MAAM,MAClB;CAEF,MAAM,cAAc,iBAAiB,IAAI,IAAI,OAAO,kBAAkB,EAAE,GAAG;AAS3E,QAAO,KAAK,UAAU,MAAM,KAAK,MAAO,gBAAmB,OAAO,CAAC,QAAQ,QAAQ,IAAI,YAAY,EAAE;AACtG"}
@@ -0,0 +1,259 @@
1
+ import "culori/css";
2
+ import { formatHex, parse } from "culori/fn";
3
+
4
+ //#region src/color.ts
5
+ const HEX_RE = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;
6
+ const CULORI_TO_CSS = {
7
+ a98: "a98",
8
+ hsl: "hsl",
9
+ hsv: "hsv",
10
+ hwb: "hwb",
11
+ lab: "lab",
12
+ lch: "lch",
13
+ lrgb: "srgb-linear",
14
+ oklab: "oklab",
15
+ oklch: "oklch",
16
+ p3: "display-p3",
17
+ prophoto: "prophoto-rgb",
18
+ rec2020: "rec2020",
19
+ rgb: "srgb",
20
+ xyz50: "xyz-d50",
21
+ xyz65: "xyz-d65"
22
+ };
23
+ const CSS_TO_CULORI = {
24
+ a98: "a98",
25
+ "display-p3": "p3",
26
+ hsl: "hsl",
27
+ hsv: "hsv",
28
+ hwb: "hwb",
29
+ lab: "lab",
30
+ lch: "lch",
31
+ oklab: "oklab",
32
+ oklch: "oklch",
33
+ "prophoto-rgb": "prophoto",
34
+ rec2020: "rec2020",
35
+ srgb: "rgb",
36
+ "srgb-linear": "lrgb",
37
+ "xyz-d50": "xyz50",
38
+ "xyz-d65": "xyz65"
39
+ };
40
+ /** Parse any color */
41
+ function parseColor(color) {
42
+ const result = parse(color);
43
+ if (!result) throw new Error(`Unable to parse color "${color}"`);
44
+ if (!(result.mode in CULORI_TO_CSS)) throw new Error(`Unsupported color space: ${result.mode}`);
45
+ const colorSpace = CULORI_TO_CSS[result.mode];
46
+ let components = [
47
+ 0,
48
+ 0,
49
+ 0
50
+ ];
51
+ switch (result.mode) {
52
+ case "a98":
53
+ case "rec2020":
54
+ case "p3":
55
+ case "prophoto":
56
+ case "lrgb":
57
+ case "rgb": {
58
+ components = [
59
+ result.r,
60
+ result.g,
61
+ result.b
62
+ ];
63
+ break;
64
+ }
65
+ case "hsl": {
66
+ components = [
67
+ result.h ?? 0,
68
+ result.s,
69
+ result.l
70
+ ];
71
+ break;
72
+ }
73
+ case "hsv": {
74
+ components = [
75
+ result.h ?? 0,
76
+ result.s,
77
+ result.v
78
+ ];
79
+ break;
80
+ }
81
+ case "hwb": {
82
+ components = [
83
+ result.h ?? 0,
84
+ result.w,
85
+ result.b
86
+ ];
87
+ break;
88
+ }
89
+ case "lab":
90
+ case "oklab": {
91
+ components = [
92
+ result.l,
93
+ result.a,
94
+ result.b
95
+ ];
96
+ break;
97
+ }
98
+ case "lch":
99
+ case "oklch": {
100
+ components = [
101
+ result.l,
102
+ result.c,
103
+ result.h ?? 0
104
+ ];
105
+ break;
106
+ }
107
+ case "xyz50":
108
+ case "xyz65": {
109
+ components = [
110
+ result.x,
111
+ result.y,
112
+ result.z
113
+ ];
114
+ break;
115
+ }
116
+ }
117
+ const value = {
118
+ colorSpace,
119
+ components,
120
+ alpha: result.alpha ?? 1
121
+ };
122
+ if (HEX_RE.test(color)) value.hex = formatHex(result);
123
+ return value;
124
+ }
125
+ /** Convert a color token to a Culori color */
126
+ function tokenToCulori(value) {
127
+ switch (value.colorSpace) {
128
+ case "a98":
129
+ case "display-p3":
130
+ case "prophoto-rgb":
131
+ case "rec2020":
132
+ case "srgb":
133
+ case "srgb-linear": {
134
+ const [r, g, b] = value.components;
135
+ return {
136
+ mode: CSS_TO_CULORI[value.colorSpace] || value.colorSpace,
137
+ r,
138
+ g,
139
+ b,
140
+ alpha: value.alpha
141
+ };
142
+ }
143
+ case "hsl": {
144
+ const [h, s, l] = value.components;
145
+ return {
146
+ mode: "hsl",
147
+ h,
148
+ s,
149
+ l,
150
+ alpha: value.alpha
151
+ };
152
+ }
153
+ case "hsv": {
154
+ const [h, s, v] = value.components;
155
+ return {
156
+ mode: "hsv",
157
+ h,
158
+ s,
159
+ v,
160
+ alpha: value.alpha
161
+ };
162
+ }
163
+ case "hwb": {
164
+ const [h, w, b] = value.components;
165
+ return {
166
+ mode: "hwb",
167
+ h,
168
+ w,
169
+ b,
170
+ alpha: value.alpha
171
+ };
172
+ }
173
+ case "lab":
174
+ case "oklab": {
175
+ const [l, a, b] = value.components;
176
+ return {
177
+ mode: value.colorSpace,
178
+ l,
179
+ a,
180
+ b,
181
+ alpha: value.alpha
182
+ };
183
+ }
184
+ case "lch":
185
+ case "oklch": {
186
+ const [l, c, h] = value.components;
187
+ return {
188
+ mode: value.colorSpace,
189
+ l,
190
+ c,
191
+ h,
192
+ alpha: value.alpha
193
+ };
194
+ }
195
+ case "xyz-d50": {
196
+ const [x, y, z] = value.components;
197
+ return {
198
+ mode: "xyz50",
199
+ x,
200
+ y,
201
+ z,
202
+ alpha: value.alpha
203
+ };
204
+ }
205
+ case "xyz-d65": {
206
+ const [x, y, z] = value.components;
207
+ return {
208
+ mode: "xyz65",
209
+ x,
210
+ y,
211
+ z,
212
+ alpha: value.alpha
213
+ };
214
+ }
215
+ }
216
+ }
217
+
218
+ //#endregion
219
+ //#region src/string.ts
220
+ /** Pad string lengths */
221
+ function padStr(input, length, alignment = "left") {
222
+ const d = Math.min(length || 0, 1e3) - input.length;
223
+ if (d > 0) switch (alignment) {
224
+ case "left": return `${input}${" ".repeat(d)}`;
225
+ case "right": return `${" ".repeat(d)}${input}`;
226
+ case "center": {
227
+ const left = Math.floor(d / 2);
228
+ const right = d - left;
229
+ return `${" ".repeat(left)}${input}${" ".repeat(right)}`;
230
+ }
231
+ }
232
+ return input;
233
+ }
234
+ /** Pluralize strings */
235
+ function pluralize(count, singular, plural) {
236
+ return count === 1 ? singular : plural;
237
+ }
238
+ /** Turn a string into kebab-case */
239
+ function kebabCase(str) {
240
+ let output = "";
241
+ for (const c of str.split("")) {
242
+ if (c === ".") {
243
+ output += "-";
244
+ continue;
245
+ }
246
+ let isFirstUppercase = true;
247
+ if (isFirstUppercase && /\p{Uppercase_Letter}/u.test(c)) {
248
+ output += `-${c.toLocaleLowerCase()}`;
249
+ isFirstUppercase = false;
250
+ continue;
251
+ } else isFirstUppercase = true;
252
+ output += c;
253
+ }
254
+ return output;
255
+ }
256
+
257
+ //#endregion
258
+ export { CSS_TO_CULORI, CULORI_TO_CSS, kebabCase, padStr, parseColor, pluralize, tokenToCulori };
259
+ //# sourceMappingURL=string-BZ5Le1WD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-BZ5Le1WD.js","names":["CULORI_TO_CSS: Record<\n Extract<\n Color['mode'],\n | 'a98'\n | 'lab'\n | 'lch'\n | 'oklab'\n | 'oklch'\n | 'hsl'\n | 'hsv'\n | 'hwb'\n | 'lrgb'\n | 'p3'\n | 'prophoto'\n | 'rec2020'\n | 'rgb'\n | 'xyz50'\n | 'xyz65'\n >,\n ColorSpace\n>","color: string","components: [number, number, number]","value: ColorValueNormalized","input: string","length: number","alignment: 'left' | 'center' | 'right'","count: number","singular: T","plural: T","str: string"],"sources":["../src/color.ts","../src/string.ts"],"sourcesContent":["import 'culori/css';\nimport { type Color, formatHex, parse } from 'culori/fn';\nimport type { ColorSpace, ColorValueNormalized } from './types.js';\n\nconst HEX_RE = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\nexport const CULORI_TO_CSS: Record<\n Extract<\n Color['mode'],\n | 'a98'\n | 'lab'\n | 'lch'\n | 'oklab'\n | 'oklch'\n | 'hsl'\n | 'hsv'\n | 'hwb'\n | 'lrgb'\n | 'p3'\n | 'prophoto'\n | 'rec2020'\n | 'rgb'\n | 'xyz50'\n | 'xyz65'\n >,\n ColorSpace\n> = {\n a98: 'a98',\n hsl: 'hsl',\n hsv: 'hsv',\n hwb: 'hwb',\n lab: 'lab',\n lch: 'lch',\n lrgb: 'srgb-linear',\n oklab: 'oklab',\n oklch: 'oklch',\n p3: 'display-p3',\n prophoto: 'prophoto-rgb',\n rec2020: 'rec2020',\n rgb: 'srgb',\n xyz50: 'xyz-d50',\n xyz65: 'xyz-d65',\n} as const;\n\nexport const CSS_TO_CULORI = {\n a98: 'a98',\n 'display-p3': 'p3',\n hsl: 'hsl',\n hsv: 'hsv',\n hwb: 'hwb',\n lab: 'lab',\n lch: 'lch',\n oklab: 'oklab',\n oklch: 'oklch',\n 'prophoto-rgb': 'prophoto',\n rec2020: 'rec2020',\n srgb: 'rgb',\n 'srgb-linear': 'lrgb',\n 'xyz-d50': 'xyz50',\n 'xyz-d65': 'xyz65',\n} as const;\n\n/** Parse any color */\nexport function parseColor(color: string): ColorValueNormalized {\n const result = parse(color);\n if (!result) {\n throw new Error(`Unable to parse color \"${color}\"`);\n }\n if (!(result.mode in CULORI_TO_CSS)) {\n throw new Error(`Unsupported color space: ${result.mode}`);\n }\n const colorSpace = CULORI_TO_CSS[result.mode as keyof typeof CULORI_TO_CSS]!;\n let components: [number, number, number] = [0, 0, 0];\n switch (result.mode) {\n case 'a98':\n case 'rec2020':\n case 'p3':\n case 'prophoto':\n case 'lrgb':\n case 'rgb': {\n components = [result.r, result.g, result.b];\n break;\n }\n case 'hsl': {\n components = [result.h ?? 0, result.s, result.l];\n break;\n }\n case 'hsv': {\n components = [result.h ?? 0, result.s, result.v];\n break;\n }\n case 'hwb': {\n components = [result.h ?? 0, result.w, result.b];\n break;\n }\n case 'lab':\n case 'oklab': {\n components = [result.l, result.a, result.b];\n break;\n }\n case 'lch':\n case 'oklch': {\n components = [result.l, result.c, result.h ?? 0];\n break;\n }\n case 'xyz50':\n case 'xyz65': {\n components = [result.x, result.y, result.z];\n break;\n }\n }\n const value: ColorValueNormalized = {\n colorSpace,\n components,\n alpha: result.alpha ?? 1,\n };\n if (HEX_RE.test(color)) {\n // Note: this intentionally does NOT include alpha; it’s already in alpha.\n // Always use formatHex (not formatHex8).\n value.hex = formatHex(result);\n }\n return value;\n}\n\n/** Convert a color token to a Culori color */\nexport function tokenToCulori(value: ColorValueNormalized): Color | undefined {\n switch (value.colorSpace) {\n case 'a98':\n case 'display-p3':\n case 'prophoto-rgb':\n case 'rec2020':\n case 'srgb':\n case 'srgb-linear': {\n const [r, g, b] = value.components;\n return {\n mode: CSS_TO_CULORI[value.colorSpace] || value.colorSpace,\n r,\n g,\n b,\n alpha: value.alpha,\n } as Color;\n }\n case 'hsl': {\n const [h, s, l] = value.components;\n return { mode: 'hsl', h, s, l, alpha: value.alpha };\n }\n case 'hsv': {\n const [h, s, v] = value.components;\n return { mode: 'hsv', h, s, v, alpha: value.alpha };\n }\n case 'hwb': {\n const [h, w, b] = value.components;\n return { mode: 'hwb', h, w, b, alpha: value.alpha };\n }\n case 'lab':\n case 'oklab': {\n const [l, a, b] = value.components;\n return { mode: value.colorSpace, l, a, b, alpha: value.alpha };\n }\n case 'lch':\n case 'oklch': {\n const [l, c, h] = value.components;\n return { mode: value.colorSpace, l, c, h, alpha: value.alpha };\n }\n case 'xyz-d50': {\n const [x, y, z] = value.components;\n return { mode: 'xyz50', x, y, z, alpha: value.alpha };\n }\n case 'xyz-d65': {\n const [x, y, z] = value.components;\n return { mode: 'xyz65', x, y, z, alpha: value.alpha };\n }\n }\n}\n","/** Pad string lengths */\nexport function padStr(input: string, length: number, alignment: 'left' | 'center' | 'right' = 'left'): string {\n const d =\n Math.min(length || 0, 1000) - // guard against NaNs and Infinity\n input.length;\n if (d > 0) {\n switch (alignment) {\n case 'left': {\n return `${input}${' '.repeat(d)}`;\n }\n case 'right': {\n return `${' '.repeat(d)}${input}`;\n }\n case 'center': {\n const left = Math.floor(d / 2);\n const right = d - left;\n return `${' '.repeat(left)}${input}${' '.repeat(right)}`;\n }\n }\n }\n return input;\n}\n\n/** Pluralize strings */\nexport function pluralize<T = string>(count: number, singular: T, plural: T): T {\n return count === 1 ? singular : plural;\n}\n\n/** Turn a string into kebab-case */\nexport function kebabCase(str: string): string {\n let output = '';\n for (const c of str.split('')) {\n if (c === '.') {\n output += '-';\n continue;\n }\n let isFirstUppercase = true;\n if (isFirstUppercase && /\\p{Uppercase_Letter}/u.test(c)) {\n output += `-${c.toLocaleLowerCase()}`;\n isFirstUppercase = false; // don’t break apart multiple consecutive uppercase letters\n continue;\n } else {\n isFirstUppercase = true; // reset\n }\n\n output += c;\n }\n return output;\n}\n"],"mappings":"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"}