@arbor-css/modes 0.0.1

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.
@@ -0,0 +1,48 @@
1
+ import { Token, TokenPurpose } from '@arbor-css/tokens';
2
+ import { TrackedValue } from './tracking.js';
3
+ export type ModePropertyType = TokenPurpose;
4
+ export type ModeSchemaProperty = ModePropertyType | {
5
+ type: ModePropertyType;
6
+ fallback: string;
7
+ };
8
+ export type ModeSchemaLevel = {
9
+ [Key: string]: ModeSchemaProperty | ModeSchemaLevel;
10
+ };
11
+ export type ModeSchema<TSchema extends ModeSchemaLevel = ModeSchemaLevel> = {
12
+ definition: TSchema;
13
+ tag: string;
14
+ $tokens: AsPropertyDefinitions<TSchema>;
15
+ createBase: (def: ModeValues<TSchema>) => ModeInstance<TSchema>;
16
+ createPartial: (name: string, def: DeepPartial<ModeValues<TSchema>>) => PartialModeInstance<TSchema>;
17
+ extend: <TExtensionSchema extends ModeSchemaLevel>(extension: TExtensionSchema) => ModeSchema<TSchema & TExtensionSchema>;
18
+ extraCss?: string;
19
+ };
20
+ export declare function createModeSchema<T extends ModeSchemaLevel>(input: T, { tag, extraCss }?: {
21
+ tag?: string;
22
+ extraCss?: string;
23
+ }): ModeSchema<T>;
24
+ export type DeepPartial<T> = {
25
+ [P in keyof T]?: DeepPartial<T[P]> | undefined;
26
+ };
27
+ export type ModeValue = string | number | Token | TrackedValue;
28
+ export declare function isModeValue(value: any): value is ModeValue;
29
+ export type ModeValues<T extends ModeSchemaLevel> = {
30
+ [P in keyof T]: T[P] extends ModeSchemaProperty ? ModeValue : T[P] extends ModeSchemaLevel ? ModeValues<T[P]> : never;
31
+ };
32
+ export interface ModeConfig {
33
+ name: string;
34
+ }
35
+ export type ModeInstance<T extends ModeSchemaLevel> = {
36
+ values: ModeValues<T>;
37
+ schema: ModeSchema<T>;
38
+ config: ModeConfig;
39
+ };
40
+ export type PartialModeInstance<T extends ModeSchemaLevel> = Omit<ModeInstance<T>, 'values'> & {
41
+ values: DeepPartial<ModeValues<T>>;
42
+ };
43
+ type AsPropertyDefinitions<T> = T extends object ? {
44
+ [P in keyof T]: T[P] extends string ? Token : T[P] extends object ? AsPropertyDefinitions<T[P]> : never;
45
+ } : never;
46
+ export declare function flattenToPropsList(obj: any): Token[];
47
+ export {};
48
+ //# sourceMappingURL=createModeSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createModeSchema.d.ts","sourceRoot":"","sources":["../src/createModeSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { createToken, isToken } from '@arbor-css/tokens';
2
+ import { isTrackedValue } from './tracking.js';
3
+ function isModeSchemaProperty(value) {
4
+ return (typeof value === 'string' ||
5
+ (typeof value === 'object' &&
6
+ value !== null &&
7
+ 'type' in value &&
8
+ value.type !== undefined));
9
+ }
10
+ function getModeSchemaPropertyAsPropertyDefinition(name, prop, group) {
11
+ if (typeof prop === 'string') {
12
+ return createToken(name, { purpose: prop, group });
13
+ }
14
+ else {
15
+ return createToken(name, {
16
+ purpose: prop.type,
17
+ fallback: prop.fallback,
18
+ group,
19
+ });
20
+ }
21
+ }
22
+ export function createModeSchema(input, { tag = 'Ⓜ️', extraCss } = {}) {
23
+ const PROPS = createModeTokens(input, tag);
24
+ const schema = {
25
+ definition: input,
26
+ tag,
27
+ $tokens: PROPS,
28
+ extraCss,
29
+ createBase: (def) => {
30
+ return {
31
+ values: def,
32
+ schema,
33
+ config: {
34
+ name: 'base',
35
+ },
36
+ };
37
+ },
38
+ createPartial: (name, def) => {
39
+ return {
40
+ values: def,
41
+ schema,
42
+ config: {
43
+ name,
44
+ },
45
+ };
46
+ },
47
+ extend: (extension) => {
48
+ const extendedDefinition = {
49
+ ...schema.definition,
50
+ ...extension,
51
+ };
52
+ return createModeSchema(extendedDefinition, {
53
+ tag: schema.tag,
54
+ });
55
+ },
56
+ };
57
+ return schema;
58
+ }
59
+ export function isModeValue(value) {
60
+ return (isTrackedValue(value) ||
61
+ isToken(value) ||
62
+ typeof value === 'string' ||
63
+ typeof value === 'number');
64
+ }
65
+ function createModeTokens(root, tag) {
66
+ function generatePropsForSchemaLevel(schemaLevel, propPrefix) {
67
+ const propsLevel = {};
68
+ for (const key in schemaLevel) {
69
+ const value = schemaLevel[key];
70
+ const currentPrefix = `${propPrefix}-${key.toLowerCase()}`;
71
+ if (isModeSchemaProperty(value)) {
72
+ const propertyDefinition = getModeSchemaPropertyAsPropertyDefinition(currentPrefix, value, propPrefix);
73
+ propsLevel[key] = propertyDefinition;
74
+ }
75
+ else if (typeof value === 'object' && value !== null) {
76
+ propsLevel[key] = generatePropsForSchemaLevel(value, currentPrefix);
77
+ }
78
+ }
79
+ return propsLevel;
80
+ }
81
+ return generatePropsForSchemaLevel(root, tag);
82
+ }
83
+ export function flattenToPropsList(obj) {
84
+ const propsList = [];
85
+ for (const key in obj) {
86
+ if (isToken(obj[key])) {
87
+ propsList.push(obj[key]);
88
+ }
89
+ else if (typeof obj[key] === 'object' && obj[key] !== null) {
90
+ propsList.push(...flattenToPropsList(obj[key]));
91
+ }
92
+ }
93
+ return propsList;
94
+ }
95
+ //# sourceMappingURL=createModeSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createModeSchema.js","sourceRoot":"","sources":["../src/createModeSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ export declare const arborModeSchema: import("./createModeSchema.js").ModeSchema<{
2
+ mainColor: {
3
+ paper: "color";
4
+ wash: "color";
5
+ lighter: "color";
6
+ light: "color";
7
+ mid: "color";
8
+ heavy: "color";
9
+ heavier: "color";
10
+ ink: "color";
11
+ };
12
+ neutralColor: {
13
+ paper: "color";
14
+ wash: "color";
15
+ lighter: "color";
16
+ light: "color";
17
+ mid: "color";
18
+ heavy: "color";
19
+ heavier: "color";
20
+ ink: "color";
21
+ };
22
+ action: {
23
+ primary: {
24
+ fg: "color";
25
+ bg: "color";
26
+ border: "color";
27
+ };
28
+ secondary: {
29
+ fg: "color";
30
+ bg: "color";
31
+ border: "color";
32
+ };
33
+ ambient: {
34
+ fg: "color";
35
+ bg: "color";
36
+ border: "color";
37
+ };
38
+ };
39
+ control: {
40
+ fg: "color";
41
+ bg: "color";
42
+ border: "color";
43
+ };
44
+ surface: {
45
+ primary: {
46
+ fg: "color";
47
+ bg: "color";
48
+ border: "color";
49
+ };
50
+ secondary: {
51
+ fg: "color";
52
+ bg: "color";
53
+ border: "color";
54
+ };
55
+ ambient: {
56
+ fg: "color";
57
+ bg: "color";
58
+ border: "color";
59
+ };
60
+ };
61
+ text: {
62
+ primary: {
63
+ size: "font-size";
64
+ weight: "font-weight";
65
+ lineHeight: "line-height";
66
+ font: "other";
67
+ };
68
+ secondary: {
69
+ size: "font-size";
70
+ weight: "font-weight";
71
+ lineHeight: "line-height";
72
+ font: "other";
73
+ };
74
+ ambient: {
75
+ size: "font-size";
76
+ weight: "font-weight";
77
+ lineHeight: "line-height";
78
+ font: "other";
79
+ };
80
+ };
81
+ density: "other";
82
+ spacing: {
83
+ xs: "spacing";
84
+ sm: "spacing";
85
+ md: "spacing";
86
+ lg: "spacing";
87
+ xl: "spacing";
88
+ };
89
+ }>;
90
+ //# sourceMappingURL=defaultModeSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultModeSchema.d.ts","sourceRoot":"","sources":["../src/defaultModeSchema.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkD1B,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { createModeSchema } from './createModeSchema.js';
2
+ const colorIntents = {
3
+ fg: 'color',
4
+ bg: 'color',
5
+ border: 'color',
6
+ };
7
+ const textIntents = {
8
+ size: 'font-size',
9
+ weight: 'font-weight',
10
+ lineHeight: 'line-height',
11
+ font: 'other',
12
+ };
13
+ export const arborModeSchema = createModeSchema({
14
+ // colors
15
+ mainColor: {
16
+ paper: 'color',
17
+ wash: 'color',
18
+ lighter: 'color',
19
+ light: 'color',
20
+ mid: 'color',
21
+ heavy: 'color',
22
+ heavier: 'color',
23
+ ink: 'color',
24
+ },
25
+ neutralColor: {
26
+ paper: 'color',
27
+ wash: 'color',
28
+ lighter: 'color',
29
+ light: 'color',
30
+ mid: 'color',
31
+ heavy: 'color',
32
+ heavier: 'color',
33
+ ink: 'color',
34
+ },
35
+ // intents
36
+ action: {
37
+ primary: colorIntents,
38
+ secondary: colorIntents,
39
+ ambient: colorIntents,
40
+ },
41
+ control: colorIntents,
42
+ surface: {
43
+ primary: colorIntents,
44
+ secondary: colorIntents,
45
+ ambient: colorIntents,
46
+ },
47
+ text: {
48
+ primary: textIntents,
49
+ secondary: textIntents,
50
+ ambient: textIntents,
51
+ },
52
+ // density
53
+ density: 'other',
54
+ spacing: {
55
+ xs: 'spacing',
56
+ sm: 'spacing',
57
+ md: 'spacing',
58
+ lg: 'spacing',
59
+ xl: 'spacing',
60
+ },
61
+ });
62
+ //# sourceMappingURL=defaultModeSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultModeSchema.js","sourceRoot":"","sources":["../src/defaultModeSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAE1E,MAAM,YAAY,GAAG;IACpB,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,OAAO;CACW,CAAC;AAE5B,MAAM,WAAW,GAAG;IACnB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,OAAO;CACa,CAAC;AAE5B,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;IAC/C,SAAS;IACT,SAAS,EAAE;QACV,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,OAAO;KACZ;IACD,YAAY,EAAE;QACb,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,OAAO;KACZ;IAED,UAAU;IACV,MAAM,EAAE;QACP,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,YAAY;KACrB;IACD,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,YAAY;KACrB;IACD,IAAI,EAAE;QACL,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,WAAW;KACpB;IAED,UAAU;IACV,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE;QACR,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;QACb,EAAE,EAAE,SAAS;KACb;CACD,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './createModeSchema.js';
2
+ export * from './modeToCss.js';
3
+ export * from './tracking.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './createModeSchema.js';
2
+ export * from './modeToCss.js';
3
+ export * from './tracking.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ModeInstance, ModeSchemaLevel, PartialModeInstance } from './createModeSchema.js';
2
+ export declare function modeToCss<TModeShape extends ModeSchemaLevel>(mode: PartialModeInstance<TModeShape>, baseMode: ModeInstance<TModeShape>): string;
3
+ //# sourceMappingURL=modeToCss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeToCss.d.ts","sourceRoot":"","sources":["../src/modeToCss.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,YAAY,EACZ,eAAe,EAEf,mBAAmB,EACnB,MAAM,uBAAuB,CAAC;AA8C/B,wBAAgB,SAAS,CAAC,UAAU,SAAS,eAAe,EAC3D,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACrC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAChC,MAAM,CAyCR"}
@@ -0,0 +1,76 @@
1
+ import { isToken } from '@arbor-css/tokens';
2
+ import { toFlatKeys } from '@arbor-css/util';
3
+ import { isModeValue, } from './createModeSchema.js';
4
+ import { isTrackedValue } from './tracking.js';
5
+ /**
6
+ * For a given Token, returns which values in the base mode depend on it.
7
+ * When any mode defines a value, we check the corresponding token with
8
+ * this function to decide if we need to interpolate any base values that
9
+ * must be recomputed alongside it since CSS custom properties are eagerly
10
+ * evaluated at declaration and won't update due to downstream changes to
11
+ * properties they derive from.
12
+ */
13
+ function getBaseModeDependents(baseMode, token, seen = new Set()) {
14
+ if (seen.has(token)) {
15
+ throw new Error(`Circular dependency detected for token ${token.name} in mode ${baseMode.config.name}`);
16
+ }
17
+ seen.add(token);
18
+ const dependents = {};
19
+ const flatBase = toFlatKeys(baseMode.values, isModeValue, { separator: '-' });
20
+ const flatTokens = toFlatKeys(baseMode.schema.$tokens, isToken, {
21
+ separator: '-',
22
+ });
23
+ for (const key in flatBase) {
24
+ const value = flatBase[key];
25
+ if (isTrackedValue(value)) {
26
+ if (value.dependencies.some((dep) => dep.name === token.name)) {
27
+ const tokenForKey = flatTokens[key];
28
+ dependents[tokenForKey.name] = value.value;
29
+ // recurse to find any values that depend on this dependent as well
30
+ if (tokenForKey) {
31
+ Object.assign(dependents, getBaseModeDependents(baseMode, tokenForKey, seen));
32
+ }
33
+ }
34
+ }
35
+ }
36
+ return dependents;
37
+ }
38
+ export function modeToCss(mode, baseMode) {
39
+ const flatValues = toFlatKeys(mode.values, isModeValue, {
40
+ separator: '-',
41
+ });
42
+ const flatTokens = toFlatKeys(mode.schema.$tokens, isToken, {
43
+ separator: '-',
44
+ });
45
+ const cssVars = {};
46
+ const lowPriorityVars = {};
47
+ for (const key in flatValues) {
48
+ const value = flatValues[key];
49
+ const tokenVar = flatTokens[key];
50
+ if (!tokenVar) {
51
+ // ignore values which don't align with schema
52
+ continue;
53
+ }
54
+ if (isToken(value)) {
55
+ cssVars[tokenVar.name] = value.var;
56
+ }
57
+ else if (isTrackedValue(value)) {
58
+ cssVars[tokenVar.name] = value.value;
59
+ }
60
+ else if (typeof value === 'string' || typeof value === 'number') {
61
+ cssVars[tokenVar.name] = value.toString();
62
+ }
63
+ else {
64
+ throw new Error(`Invalid value for token ${tokenVar.name}: ${value}. Must be a string, number, or $token (in mode ${mode.config.name})`);
65
+ }
66
+ // If this value corresponds to a token in the base mode, we need to check if any other base mode values depend on it and include them as well since CSS custom properties are eagerly evaluated.
67
+ const baseDeps = getBaseModeDependents(baseMode, tokenVar);
68
+ Object.assign(lowPriorityVars, baseDeps);
69
+ }
70
+ const valuesCss = Object.entries({
71
+ ...lowPriorityVars,
72
+ ...cssVars,
73
+ }).reduce((acc, [key, value]) => `${acc}${key}: ${value};\n`, '');
74
+ return [valuesCss, mode.schema.extraCss].filter(Boolean).join('\n');
75
+ }
76
+ //# sourceMappingURL=modeToCss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeToCss.js","sourceRoot":"","sources":["../src/modeToCss.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=modeToCss.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeToCss.test.d.ts","sourceRoot":"","sources":["../src/modeToCss.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { expect, it } from 'vitest';
2
+ import { createModeSchema } from './createModeSchema.js';
3
+ import { modeToCss } from './modeToCss.js';
4
+ import { derive } from './tracking.js';
5
+ const testSchema = createModeSchema({
6
+ value: 'color',
7
+ derived: {
8
+ once: 'color',
9
+ twice: 'color',
10
+ again: 'color',
11
+ },
12
+ });
13
+ const baseMode = testSchema.createBase({
14
+ value: 'red',
15
+ derived: {
16
+ once: derive `color-mix(in hsl, ${testSchema.$tokens.value}, black)`,
17
+ twice: derive `color-mix(in hsl, ${testSchema.$tokens.derived.once}, transparent)`,
18
+ again: derive `color-mix(in hsl, ${testSchema.$tokens.value}, red)`,
19
+ },
20
+ });
21
+ const partialMode = testSchema.createPartial('partial', {
22
+ value: 'blue',
23
+ });
24
+ const underivedMode = testSchema.createPartial('underived', {
25
+ derived: {
26
+ once: 'green',
27
+ },
28
+ });
29
+ it('prints a base mode with derived values', () => {
30
+ const css = modeToCss(baseMode, baseMode);
31
+ expect(css).toMatchInlineSnapshot(`
32
+ "--Ⓜ️-derived-once: color-mix(in hsl, var(--Ⓜ️-value), black);
33
+ --Ⓜ️-derived-twice: color-mix(in hsl, var(--Ⓜ️-derived-once), transparent);
34
+ --Ⓜ️-derived-again: color-mix(in hsl, var(--Ⓜ️-value), red);
35
+ --Ⓜ️-value: red;
36
+ "
37
+ `);
38
+ });
39
+ it('prints a partial mode with derived dependencies it doesnt declare', () => {
40
+ const css = modeToCss(partialMode, baseMode);
41
+ expect(css).toMatchInlineSnapshot(`
42
+ "--Ⓜ️-derived-once: color-mix(in hsl, var(--Ⓜ️-value), black);
43
+ --Ⓜ️-derived-twice: color-mix(in hsl, var(--Ⓜ️-derived-once), transparent);
44
+ --Ⓜ️-derived-again: color-mix(in hsl, var(--Ⓜ️-value), red);
45
+ --Ⓜ️-value: blue;
46
+ "
47
+ `);
48
+ });
49
+ it('prints a partial mode which overrides derived dependencies from base and doesnt go upstream from there, but does go downstream to further derivations', () => {
50
+ const css = modeToCss(underivedMode, baseMode);
51
+ expect(css).toMatchInlineSnapshot(`
52
+ "--Ⓜ️-derived-twice: color-mix(in hsl, var(--Ⓜ️-derived-once), transparent);
53
+ --Ⓜ️-derived-once: green;
54
+ "
55
+ `);
56
+ });
57
+ //# sourceMappingURL=modeToCss.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modeToCss.test.js","sourceRoot":"","sources":["../src/modeToCss.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACnC,KAAK,EAAE,OAAO;IACd,OAAO,EAAE;QACR,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;KACd;CACD,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC;IACtC,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,CAAA,qBAAqB,UAAU,CAAC,OAAO,CAAC,KAAK,UAAU;QACnE,KAAK,EAAE,MAAM,CAAA,qBAAqB,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,gBAAgB;QACjF,KAAK,EAAE,MAAM,CAAA,qBAAqB,UAAU,CAAC,OAAO,CAAC,KAAK,QAAQ;KAClE;CACD,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE;IACvD,KAAK,EAAE,MAAM;CACb,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,WAAW,EAAE;IAC3D,OAAO,EAAE;QACR,IAAI,EAAE,OAAO;KACb;CACD,CAAC,CAAC;AAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACjD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC;;;;;;EAMjC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;IAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC;;;;;;EAMjC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,uJAAuJ,EAAE,GAAG,EAAE;IAChK,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC;;;;EAIjC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Token } from '@arbor-css/tokens';
2
+ export type TrackedValue = {
3
+ '@@TRACKED': true;
4
+ dependencies: Token[];
5
+ value: string;
6
+ };
7
+ export declare function isTrackedValue(value: any): value is TrackedValue;
8
+ export type DeriveEntry = Token | {
9
+ value: Token;
10
+ fallback: DeriveEntry;
11
+ };
12
+ /**
13
+ * A tagged template literal which interpolates Tokens and
14
+ * tracks them as dependencies.
15
+ */
16
+ export declare const derive: (strings: TemplateStringsArray, ...values: DeriveEntry[]) => TrackedValue;
17
+ //# sourceMappingURL=tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,KAAK,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,YAAY,CAEhE;AAED,MAAM,MAAM,WAAW,GACpB,KAAK,GACL;IACA,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;CACrB,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,MAAM,GAClB,SAAS,oBAAoB,EAC7B,GAAG,QAAQ,WAAW,EAAE,KACtB,YAkBF,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { isToken } from '@arbor-css/tokens';
2
+ export function isTrackedValue(value) {
3
+ return value && typeof value === 'object' && '@@TRACKED' in value;
4
+ }
5
+ /**
6
+ * A tagged template literal which interpolates Tokens and
7
+ * tracks them as dependencies.
8
+ */
9
+ export const derive = (strings, ...values) => {
10
+ const dependencies = [];
11
+ const result = strings.reduce((acc, str, i) => {
12
+ const value = values[i - 1];
13
+ if (value) {
14
+ if (isToken(value)) {
15
+ dependencies.push(value);
16
+ acc += value.var;
17
+ }
18
+ else {
19
+ const flattened = flattenDeriveEntry(value);
20
+ dependencies.push(...flattened);
21
+ acc += writeVarFallbacks(flattened);
22
+ }
23
+ }
24
+ acc += str;
25
+ return acc;
26
+ }, '');
27
+ return { value: result, dependencies, '@@TRACKED': true };
28
+ };
29
+ function flattenDeriveEntry(entry) {
30
+ if (isToken(entry)) {
31
+ return [entry];
32
+ }
33
+ else {
34
+ return [entry.value, ...flattenDeriveEntry(entry.fallback)];
35
+ }
36
+ }
37
+ function writeVarFallbacks(tokens) {
38
+ const copy = [...tokens];
39
+ let latest = copy.pop()?.var;
40
+ if (!latest)
41
+ return '';
42
+ while (copy.length > 0) {
43
+ const next = copy.pop();
44
+ latest = next.varFallback(latest);
45
+ }
46
+ return latest;
47
+ }
48
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../src/tracking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,mBAAmB,CAAC;AAQnD,MAAM,UAAU,cAAc,CAAC,KAAU;IACxC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,IAAI,KAAK,CAAC;AACnE,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACrB,OAA6B,EAC7B,GAAG,MAAqB,EACT,EAAE;IACjB,MAAM,YAAY,GAAY,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,KAAK,EAAE,CAAC;YACX,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACP,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;gBAChC,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;QACD,GAAG,IAAI,GAAG,CAAC;QACX,OAAO,GAAG,CAAC;IACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC,CAAC;AAEF,SAAS,kBAAkB,CAAC,KAAkB;IAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAe;IACzC,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACzB,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAG,CAAC;QACzB,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tracking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.test.d.ts","sourceRoot":"","sources":["../src/tracking.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import { createToken } from '@arbor-css/tokens';
2
+ import { expect, it } from 'vitest';
3
+ import { derive } from './tracking.js';
4
+ const a = createToken('a', {});
5
+ const b = createToken('b', {});
6
+ const c = createToken('c', {});
7
+ it('tracks simple token values', () => {
8
+ expect(derive `${a}`).toEqual({
9
+ value: a.var,
10
+ dependencies: [a],
11
+ '@@TRACKED': true,
12
+ });
13
+ });
14
+ it('interpolates tokens into other things', () => {
15
+ expect(derive `calc(${a} + 1px)`).toEqual({
16
+ value: `calc(${a.var} + 1px)`,
17
+ dependencies: [a],
18
+ '@@TRACKED': true,
19
+ });
20
+ });
21
+ it('handles fallbacks', () => {
22
+ expect(derive `${{ value: a, fallback: b }}`).toEqual({
23
+ value: a.varFallback(b.var),
24
+ dependencies: [a, b],
25
+ '@@TRACKED': true,
26
+ });
27
+ });
28
+ it('handles nested fallbacks', () => {
29
+ expect(derive `${{ value: a, fallback: { value: b, fallback: c } }}`).toEqual({
30
+ value: a.varFallback(b.varFallback(c.var)),
31
+ dependencies: [a, b, c],
32
+ '@@TRACKED': true,
33
+ });
34
+ });
35
+ //# sourceMappingURL=tracking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.test.js","sourceRoot":"","sources":["../src/tracking.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE/B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACrC,MAAM,CAAC,MAAM,CAAA,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;QAC5B,KAAK,EAAE,CAAC,CAAC,GAAG;QACZ,YAAY,EAAE,CAAC,CAAC,CAAC;QACjB,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;IAChD,MAAM,CAAC,MAAM,CAAA,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;QACxC,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,SAAS;QAC7B,YAAY,EAAE,CAAC,CAAC,CAAC;QACjB,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC5B,MAAM,CAAC,MAAM,CAAA,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;QACpD,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3B,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACnC,MAAM,CAAC,MAAM,CAAA,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;QAC5E,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1C,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvB,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@arbor-css/modes",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "development": "./src/index.ts",
14
+ "import": "./dist/index.js",
15
+ "node": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "sideEffects": false,
21
+ "devDependencies": {
22
+ "typescript": "^6.0.3",
23
+ "vitest": "^4.1.5"
24
+ },
25
+ "dependencies": {
26
+ "@arbor-css/tokens": "0.0.1",
27
+ "@arbor-css/util": "0.0.1"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc",
31
+ "dev": "tsc -w --preserveWatchOutput",
32
+ "test": "vitest"
33
+ }
34
+ }