design-token-library 0.1.0 → 0.3.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.
@@ -1,27 +1,96 @@
1
1
  import { DesignToken } from "./design-token.js";
2
+ import { isToken } from "./utilities.js";
2
3
  /**
4
+ * Convert a library to CSS custom property declarations.
5
+ *
6
+ * @remarks
7
+ * Libraries with custom token types must provide a converter for each
8
+ * custom type, or `false` to leave tokens of that type out of the CSS.
9
+ * A converter for a standard type is used in place of the one of the library.
10
+ *
3
11
  * @public
4
12
  */
5
- export function toCSS(library) {
6
- return recurseToCss(library.tokens);
13
+ export function toCSS(library, ...[options]) {
14
+ // Converters are checked by `ToCSSArgs`; at runtime they're keyed by type.
15
+ const converters = options?.converters ?? {};
16
+ return recurseToCss(library.tokens, converters, options?.name ?? defaultName);
7
17
  }
8
18
  /**
9
- * Construct an {@link CSSPropertiesLibrary} from a {@link Library.Library<any>}.
19
+ * `$` cannot begin a CSS identifier, so a group's `$root` token is named for
20
+ * the group: `color.$root` is `--color`.
21
+ */
22
+ const defaultName = (token) => token.name.replace(/\.\$root$/, "").replaceAll(".", "-");
23
+ /**
24
+ * The values of a token's properties. A value that isn't a record, such as a
25
+ * number, which a standard type without a converter has, is written as a
26
+ * string, as it was before a converter could return a record.
27
+ */
28
+ const valuesOf = (value) => isValues(value) ? value : { "": String(value) };
29
+ // A converter's result is typed by `CSSConverter`, so an object is a record.
30
+ const isValues = (value) => typeof value === "object" && value !== null;
31
+ /**
32
+ * The custom property of a token named `name` for a key of its
33
+ * {@link CSSValues}.
34
+ */
35
+ const propertyName = (name, suffix) => suffix === "" ? `--${name}` : `--${name}-${suffix}`;
36
+ /**
37
+ * Construct an {@link CSSPropertiesLibrary} from a {@link (Library:namespace).Library}.
38
+ *
39
+ * @remarks
40
+ * Pass the same `converters` given to {@link toCSS} to leave out the tokens it does
41
+ * not write (a custom type whose converter is `false`). They are still in the
42
+ * {@link CSSPropertiesLibrary} type, but missing at runtime.
43
+ *
44
+ * A token whose type has a converter in `converters` has a property for each
45
+ * key of the {@link CSSValues} it returns, so this reads the token's value to
46
+ * call it. Its own property is `var` and `property`, as for any token, and
47
+ * the one for `hover` is at `hover`, so a converter's keys can't be `var` or
48
+ * `property`.
49
+ *
50
+ * @example
51
+ * ```ts
52
+ * const properties = toProperties(library, {
53
+ * converters: {
54
+ * states: (value: States) => ({
55
+ * "": convert("color", value.rest),
56
+ * hover: convert("color", value.hover),
57
+ * }),
58
+ * },
59
+ * });
60
+ * properties.fill.var; // "var(--fill)"
61
+ * properties.fill.hover.var; // "var(--fill-hover)"
62
+ * ```
63
+ *
10
64
  * @public
11
65
  */
12
- export function toProperties(library) {
66
+ export function toProperties(library, options = {}) {
67
+ const getName = options.name ?? defaultName;
68
+ const converters = options.converters ?? {};
13
69
  const recurse = (section, properties) => {
14
70
  for (const key in section) {
15
71
  const sectionValue = section[key];
16
72
  if (isToken(sectionValue)) {
17
- // TODO add a strategy for name conversion
18
- const property = `--${sectionValue.name.replaceAll(".", "-")}`;
19
- const propertyValue = Object.freeze({
20
- var: `var(${property})`,
21
- property,
22
- });
73
+ const converter = converters[sectionValue.$type];
74
+ // `toCSS` doesn't write a token whose type is `false`.
75
+ if (converter === false) {
76
+ continue;
77
+ }
78
+ const tokenName = getName(sectionValue);
79
+ const values = valuesOf(converter?.(sectionValue.$value, sectionValue) ?? "");
80
+ const propertyValues = {};
81
+ for (const suffix of Object.keys(values)) {
82
+ if (suffix === "var" || suffix === "property") {
83
+ throw new Error(`The converter of '${sectionValue.$type}' returns a value for '${suffix}' for token '${sectionValue.name}', which is the name of a field of its properties.`);
84
+ }
85
+ const name = propertyName(tokenName, suffix);
86
+ propertyValues[suffix] = Object.freeze({
87
+ var: `var(${name})`,
88
+ property: name,
89
+ });
90
+ }
91
+ const { "": own, ...others } = propertyValues;
23
92
  Reflect.defineProperty(properties, key, {
24
- value: propertyValue,
93
+ value: Object.freeze({ ...own, ...others }),
25
94
  enumerable: true,
26
95
  });
27
96
  }
@@ -37,37 +106,88 @@ export function toProperties(library) {
37
106
  };
38
107
  const properties = {};
39
108
  recurse(library.tokens, properties);
40
- return properties;
109
+ return Object.freeze(properties);
41
110
  }
42
- const isToken = (value) => {
43
- return "value" in value;
44
- };
45
- const recurseToCss = (librarySection) => {
111
+ const standardTypes = new Set(Object.values(DesignToken.Type));
112
+ const recurseToCss = (librarySection, customConverters, getName) => {
46
113
  let result = "";
47
114
  for (const key in librarySection) {
48
115
  const tokenOrGroup = librarySection[key];
49
116
  if (isToken(tokenOrGroup)) {
50
- let value = tokenOrGroup.value;
51
- if (tokenOrGroup.type !== undefined &&
52
- Reflect.has(TokenConverters, tokenOrGroup.type)) {
53
- value = Reflect.get(TokenConverters, tokenOrGroup.type)(value);
117
+ const { $type: type, name } = tokenOrGroup;
118
+ let value = tokenOrGroup.$value;
119
+ if (Reflect.has(customConverters, type)) {
120
+ const converter = customConverters[type];
121
+ if (converter === false) {
122
+ continue;
123
+ }
124
+ value = converter(value, tokenOrGroup);
125
+ }
126
+ else if (Reflect.has(TokenConverters, type)) {
127
+ value = Reflect.get(TokenConverters, type)(value);
128
+ }
129
+ else if (!standardTypes.has(type)) {
130
+ throw new Error(`No CSS converter provided for custom type '${type}' of token '${name}'.`);
131
+ }
132
+ const tokenName = getName(tokenOrGroup);
133
+ for (const [suffix, declared] of Object.entries(valuesOf(value))) {
134
+ result += `${propertyName(tokenName, suffix)}:${declared};`;
54
135
  }
55
- result += `--${tokenOrGroup.name}:${value};`;
56
136
  }
57
137
  else {
58
- result = recurseToCss(tokenOrGroup);
138
+ result += recurseToCss(tokenOrGroup, customConverters, getName);
59
139
  }
60
140
  }
61
141
  return result;
62
142
  };
63
- const joiner = (value) => {
64
- return value.join(" ");
143
+ const dimensionConverter = (value) => {
144
+ return `${value.value}${value.unit}`;
145
+ };
146
+ const durationConverter = (value) => {
147
+ return `${value.value}${value.unit}`;
148
+ };
149
+ const percent = (component) => {
150
+ return component === "none" ? "none" : `${component}%`;
151
+ };
152
+ const hexByte = (component) => {
153
+ const byte = Math.min(255, Math.max(0, Math.round(component * 255)));
154
+ return byte.toString(16).padStart(2, "0");
155
+ };
156
+ /**
157
+ * Convert a color to CSS. An sRGB color becomes hex, and the other color
158
+ * spaces become the CSS color function for the space.
159
+ */
160
+ const colorConverter = (value) => {
161
+ const alpha = value.alpha ?? 1;
162
+ const components = value.components;
163
+ const slash = alpha === 1 ? "" : ` / ${alpha}`;
164
+ const [a, b, c] = components;
165
+ switch (value.colorSpace) {
166
+ case "srgb":
167
+ if (components.every((component) => component !== "none")) {
168
+ return `#${components.map(hexByte).join("")}${alpha === 1 ? "" : hexByte(alpha)}`;
169
+ }
170
+ break;
171
+ case "hsl":
172
+ return `hsl(${a} ${percent(b)} ${percent(c)}${slash})`;
173
+ case "hwb":
174
+ return `hwb(${a} ${percent(b)} ${percent(c)}${slash})`;
175
+ case "lab":
176
+ case "lch":
177
+ case "oklab":
178
+ case "oklch":
179
+ return `${value.colorSpace}(${components.join(" ")}${slash})`;
180
+ }
181
+ return `color(${value.colorSpace} ${components.join(" ")}${slash})`;
65
182
  };
66
183
  /**
67
184
  * Convert a border value to CSS
68
185
  */
69
186
  const borderConverter = (value) => {
70
- return `${value.width} ${value.style} ${value.color}`;
187
+ return `${dimensionConverter(value.width)} ${strokeStyleConverter(value.style)} ${colorConverter(value.color)}`;
188
+ };
189
+ const cubicBezierConverter = (value) => {
190
+ return `cubic-bezier(${value.join(", ")})`;
71
191
  };
72
192
  const fontFamilyConverter = (value) => {
73
193
  return typeof value === "string"
@@ -82,29 +202,97 @@ const fontFamilyQuoter = (value) => {
82
202
  }
83
203
  return value.includes(" ") ? `"${value}"` : value;
84
204
  };
205
+ const fontWeights = {
206
+ thin: 100,
207
+ hairline: 100,
208
+ "extra-light": 200,
209
+ "ultra-light": 200,
210
+ light: 300,
211
+ normal: 400,
212
+ regular: 400,
213
+ book: 400,
214
+ medium: 500,
215
+ "semi-bold": 600,
216
+ "demi-bold": 600,
217
+ bold: 700,
218
+ "extra-bold": 800,
219
+ "ultra-bold": 800,
220
+ black: 900,
221
+ heavy: 900,
222
+ "extra-black": 950,
223
+ "ultra-black": 950,
224
+ };
225
+ const fontWeightConverter = (value) => {
226
+ return String(typeof value === "number" ? value : fontWeights[value]);
227
+ };
85
228
  const gradientReducer = (accumulated, value) => {
86
- return accumulated + `${value.color} ${value.position * 100}%,`;
229
+ // Round away float artifacts, e.g. 0.07 * 100 is 7.000000000000001.
230
+ const position = Number((value.position * 100).toPrecision(12));
231
+ return accumulated + `${colorConverter(value.color)} ${position}%,`;
87
232
  };
88
233
  const gradientConverter = (value) => {
89
234
  return value.reduce(gradientReducer, "").replace(/,$/, "");
90
235
  };
91
236
  const shadowConverter = (value) => {
92
- return `${value.offsetX} ${value.offsetY} ${value.blur} ${value.spread} ${value.color}`;
237
+ return (Array.isArray(value) ? value : [value])
238
+ .map((layer) => `${layer.inset ? "inset " : ""}${dimensionConverter(layer.offsetX)} ${dimensionConverter(layer.offsetY)} ${dimensionConverter(layer.blur)} ${dimensionConverter(layer.spread)} ${colorConverter(layer.color)}`)
239
+ .join(", ");
93
240
  };
94
241
  const strokeStyleConverter = (value) => {
95
242
  // CSS doesn't support customizing dashed borders at the time of authoring.
96
243
  return typeof value === "string" ? value : "dashed";
97
244
  };
98
245
  const transitionConverter = (value) => {
99
- return `${value.duration} ${value.delay} ${value.timingFunction}`;
246
+ return `${durationConverter(value.duration)} ${cubicBezierConverter(value.timingFunction)} ${durationConverter(value.delay)}`;
247
+ };
248
+ /**
249
+ * Convert typography to the CSS `font` shorthand. `letterSpacing` cannot be
250
+ * expressed in the shorthand, so it is omitted.
251
+ */
252
+ const typographyConverter = (value) => {
253
+ return `${fontWeightConverter(value.fontWeight)} ${dimensionConverter(value.fontSize)}/${value.lineHeight} ${fontFamilyConverter(value.fontFamily)}`;
100
254
  };
101
255
  const TokenConverters = {
102
256
  [DesignToken.Type.Border]: borderConverter,
103
- [DesignToken.Type.CubicBezier]: joiner,
257
+ [DesignToken.Type.Color]: colorConverter,
258
+ [DesignToken.Type.CubicBezier]: cubicBezierConverter,
259
+ [DesignToken.Type.Dimension]: dimensionConverter,
260
+ [DesignToken.Type.Duration]: durationConverter,
104
261
  [DesignToken.Type.FontFamily]: fontFamilyConverter,
262
+ [DesignToken.Type.FontWeight]: fontWeightConverter,
105
263
  [DesignToken.Type.Gradient]: gradientConverter,
106
264
  [DesignToken.Type.Shadow]: shadowConverter,
107
265
  [DesignToken.Type.StrokeStyle]: strokeStyleConverter,
108
266
  [DesignToken.Type.Transition]: transitionConverter,
267
+ [DesignToken.Type.Typography]: typographyConverter,
109
268
  };
269
+ /**
270
+ * Converts a value of a standard type to CSS, the way {@link toCSS} does for a
271
+ * token of the type, without a converter for the type in `converters`.
272
+ *
273
+ * @remarks
274
+ * A converter for a custom type that has values of standard types uses it for
275
+ * each of them, and a converter for a standard type can use it for what it
276
+ * keeps.
277
+ *
278
+ * @example
279
+ * ```ts
280
+ * toCSS(library, {
281
+ * converters: {
282
+ * elevation: (value) =>
283
+ * `${convert("dimension", value.offset)} ${convert("color", value.color)}`,
284
+ * },
285
+ * });
286
+ * ```
287
+ *
288
+ * @param type - The type, like `"color"`
289
+ * @param value - The value of a token of the type
290
+ * @returns The value as it is written to CSS
291
+ *
292
+ * @public
293
+ */
294
+ export function convert(type, value) {
295
+ const converter = TokenConverters[type];
296
+ return converter ? converter(value) : String(value);
297
+ }
110
298
  //# sourceMappingURL=css-reflector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"css-reflector.js","sourceRoot":"","sources":["../../src/lib/css-reflector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"css-reflector.js","sourceRoot":"","sources":["../../src/lib/css-reflector.ts"],"names":[],"mappings":"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"}