@codecademy/variance 0.19.1-alpha.a809e8.0 → 0.20.1-alpha.cdc086.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 (77) hide show
  1. package/CHANGELOG.md +14 -1
  2. package/dist/core.d.ts +10 -0
  3. package/dist/core.js +189 -0
  4. package/dist/core.js.map +1 -0
  5. package/dist/createTheme/createTheme.d.ts +55 -0
  6. package/dist/createTheme/createTheme.js +94 -0
  7. package/dist/createTheme/createTheme.js.map +1 -0
  8. package/dist/createTheme/createTheme.test.d.ts +1 -0
  9. package/dist/createTheme/createTheme.test.js +167 -0
  10. package/dist/createTheme/createTheme.test.js.map +1 -0
  11. package/dist/createTheme/index.d.ts +3 -0
  12. package/dist/createTheme/index.js +4 -0
  13. package/dist/createTheme/index.js.map +1 -0
  14. package/dist/createTheme/types.d.ts +42 -0
  15. package/dist/createTheme/types.js +2 -0
  16. package/dist/createTheme/types.js.map +1 -0
  17. package/dist/index.d.ts +5 -0
  18. package/dist/index.js +6 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/scales/createScale.d.ts +3 -0
  21. package/dist/scales/createScale.js +2 -0
  22. package/dist/scales/createScale.js.map +1 -0
  23. package/dist/scales/createScaleLookup.d.ts +5 -0
  24. package/dist/scales/createScaleLookup.js +14 -0
  25. package/dist/scales/createScaleLookup.js.map +1 -0
  26. package/dist/src/core.d.ts +10 -0
  27. package/dist/src/core.js +189 -0
  28. package/dist/src/core.js.map +1 -0
  29. package/dist/src/createTheme/createTheme.test.d.ts +1 -0
  30. package/dist/src/createTheme/createTheme.test.js +167 -0
  31. package/dist/src/createTheme/createTheme.test.js.map +1 -0
  32. package/dist/src/index.d.ts +5 -0
  33. package/dist/src/index.js +6 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/utils/__fixtures__/testConfig.d.ts +153 -0
  36. package/dist/src/utils/__fixtures__/testConfig.js +94 -0
  37. package/dist/src/utils/__fixtures__/testConfig.js.map +1 -0
  38. package/dist/transforms/index.d.ts +1 -0
  39. package/dist/transforms/index.js +2 -0
  40. package/dist/transforms/index.js.map +1 -0
  41. package/dist/transforms/transformSize.d.ts +2 -0
  42. package/dist/transforms/transformSize.js +26 -0
  43. package/dist/transforms/transformSize.js.map +1 -0
  44. package/dist/types/config.d.ts +71 -0
  45. package/dist/types/config.js +2 -0
  46. package/dist/types/config.js.map +1 -0
  47. package/dist/types/properties.d.ts +22 -0
  48. package/dist/types/properties.js +2 -0
  49. package/dist/types/properties.js.map +1 -0
  50. package/dist/types/props.d.ts +47 -0
  51. package/dist/types/props.js +2 -0
  52. package/dist/types/props.js.map +1 -0
  53. package/dist/types/theme.d.ts +17 -0
  54. package/dist/types/theme.js +2 -0
  55. package/dist/types/theme.js.map +1 -0
  56. package/dist/types/utils.d.ts +3 -0
  57. package/dist/types/utils.js +2 -0
  58. package/dist/types/utils.js.map +1 -0
  59. package/dist/utils/__fixtures__/testConfig.d.ts +153 -0
  60. package/dist/utils/__fixtures__/testConfig.js +94 -0
  61. package/dist/utils/__fixtures__/testConfig.js.map +1 -0
  62. package/dist/utils/flattenScale.d.ts +20 -0
  63. package/dist/utils/flattenScale.js +18 -0
  64. package/dist/utils/flattenScale.js.map +1 -0
  65. package/dist/utils/getStaticProperties.d.ts +1 -0
  66. package/dist/utils/getStaticProperties.js +3 -0
  67. package/dist/utils/getStaticProperties.js.map +1 -0
  68. package/dist/utils/propNames.d.ts +6 -0
  69. package/dist/utils/propNames.js +66 -0
  70. package/dist/utils/propNames.js.map +1 -0
  71. package/dist/utils/responsive.d.ts +16 -0
  72. package/dist/utils/responsive.js +65 -0
  73. package/dist/utils/responsive.js.map +1 -0
  74. package/dist/utils/serializeTokens.d.ts +18 -0
  75. package/dist/utils/serializeTokens.js +33 -0
  76. package/dist/utils/serializeTokens.js.map +1 -0
  77. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -3,7 +3,7 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ### [0.19.1-alpha.a809e8.0](https://github.com/Codecademy/gamut/compare/@codecademy/variance@0.19.0...@codecademy/variance@0.19.1-alpha.a809e8.0) (2022-01-06)
6
+ ### [0.20.1-alpha.cdc086.0](https://github.com/Codecademy/gamut/compare/@codecademy/variance@0.20.0...@codecademy/variance@0.20.1-alpha.cdc086.0) (2022-01-31)
7
7
 
8
8
  **Note:** Version bump only for package @codecademy/variance
9
9
 
@@ -11,6 +11,19 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
11
11
 
12
12
 
13
13
 
14
+ ## [0.20.0](https://github.com/Codecademy/gamut/compare/@codecademy/variance@0.19.0...@codecademy/variance@0.20.0) (2022-01-25)
15
+
16
+
17
+ ### ⚠ BREAKING CHANGES
18
+
19
+ * bumped React to 17
20
+
21
+ ### Features
22
+
23
+ * bumped React to 17 ([c074ecb](https://github.com/Codecademy/gamut/commit/c074ecbfa026ed8e37cf41e874d345574a46e5e4))
24
+
25
+
26
+
14
27
  ## 0.19.0 (2021-10-26)
15
28
 
16
29
 
package/dist/core.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { AbstractParser, AbstractPropTransformer, Compose, CSS, Parser, Prop, PropTransformer, States, TransformerMap, Variant } from './types/config';
2
+ export declare const variance: {
3
+ createParser<Config extends Record<string, AbstractPropTransformer>>(config: Config): Parser<Config>;
4
+ createTransform<P extends string, Config_1 extends Prop>(prop: P, config: Config_1): PropTransformer<P, Config_1>;
5
+ compose<Args extends AbstractParser[]>(...parsers: Args): Parser<Compose<Args>>;
6
+ createCss<Config_2 extends Record<string, Prop>, P_1 extends Parser<TransformerMap<Config_2>>>(config: Config_2): CSS<P_1>;
7
+ createVariant<Config_3 extends Record<string, Prop>, P_2 extends Parser<TransformerMap<Config_3>>>(config: Config_3): Variant<P_2>;
8
+ createStates<Config_4 extends Record<string, Prop>, P_3 extends Parser<TransformerMap<Config_4>>>(config: Config_4): States<P_3>;
9
+ create<Config_5 extends Record<string, Prop>>(config: Config_5): Parser<TransformerMap<Config_5>>;
10
+ };
package/dist/core.js ADDED
@@ -0,0 +1,189 @@
1
+ import { get, identity, isArray, isObject, isUndefined, merge } from 'lodash';
2
+ import { createScaleLookup } from './scales/createScaleLookup';
3
+ import { getStaticCss } from './utils/getStaticProperties';
4
+ import { orderPropNames } from './utils/propNames';
5
+ import { arrayParser, isMediaArray, isMediaMap, objectParser, orderBreakpoints, parseBreakpoints, } from './utils/responsive';
6
+ export const variance = {
7
+ // Parser to handle any set of configured props
8
+ createParser(config) {
9
+ const propNames = orderPropNames(config);
10
+ let breakpoints;
11
+ const parser = (props) => {
12
+ const styles = {};
13
+ const { theme } = props;
14
+ // Attempt to cache the breakpoints if we have not yet or if theme has become available.
15
+ if (breakpoints === undefined ||
16
+ (breakpoints === null && theme?.breakpoints)) {
17
+ // Save the breakpoints if we can
18
+ breakpoints = parseBreakpoints(theme?.breakpoints);
19
+ }
20
+ // Loops over all prop names on the configured config to check for configured styles
21
+ propNames.forEach((prop) => {
22
+ const property = config[prop];
23
+ const value = get(props, prop);
24
+ switch (typeof value) {
25
+ case 'string':
26
+ case 'number':
27
+ case 'function':
28
+ return Object.assign(styles, property.styleFn(value, prop, props));
29
+ // handle any props configured with the responsive notation
30
+ case 'object':
31
+ if (!breakpoints) {
32
+ return;
33
+ }
34
+ // If it is an array the order of values is smallest to largest: [_, xs, ...]
35
+ if (isMediaArray(value)) {
36
+ return merge(styles, arrayParser(value, props, property, breakpoints.array));
37
+ }
38
+ // Check to see if value is an object matching the responsive syntax and generate the styles.
39
+ if (isMediaMap(value)) {
40
+ return merge(styles, objectParser(value, props, property, breakpoints.map));
41
+ }
42
+ }
43
+ });
44
+ return breakpoints ? orderBreakpoints(styles, breakpoints.array) : styles;
45
+ };
46
+ // return the parser function with the resulting meta information for further composition
47
+ return Object.assign(parser, { propNames, config });
48
+ },
49
+ // Given a single property configuration enrich the config with a transform function
50
+ // that traverses the properties the function is responsible for.
51
+ createTransform(prop, config) {
52
+ const { transform = identity, property, properties = [property], scale, } = config;
53
+ const getScaleValue = createScaleLookup(scale);
54
+ const alwaysTransform = scale === undefined || isArray(scale);
55
+ return {
56
+ ...config,
57
+ prop,
58
+ styleFn: (value, prop, props) => {
59
+ const styles = {};
60
+ if (isUndefined(value)) {
61
+ return styles;
62
+ }
63
+ let useTransform = false;
64
+ let intermediateValue;
65
+ let scaleValue;
66
+ switch (typeof value) {
67
+ case 'number':
68
+ case 'string':
69
+ scaleValue = getScaleValue(value, props);
70
+ useTransform = scaleValue !== undefined || alwaysTransform;
71
+ intermediateValue = scaleValue ?? value;
72
+ break;
73
+ case 'function':
74
+ if (props.theme) {
75
+ intermediateValue = value(props.theme);
76
+ }
77
+ break;
78
+ default:
79
+ return styles;
80
+ }
81
+ // for each property look up the scale value from theme if passed and apply any
82
+ // final transforms to the value
83
+ properties.forEach((property) => {
84
+ let styleValue = intermediateValue;
85
+ if (useTransform && !isUndefined(styleValue)) {
86
+ styleValue = transform(styleValue, property, props);
87
+ }
88
+ switch (typeof styleValue) {
89
+ case 'number':
90
+ case 'string':
91
+ return (styles[property] = styleValue);
92
+ case 'object':
93
+ return Object.assign(styles, styleValue);
94
+ default:
95
+ }
96
+ });
97
+ // return the resulting styles object
98
+ return styles;
99
+ },
100
+ };
101
+ },
102
+ compose(...parsers) {
103
+ return this.createParser(parsers.reduce((carry, parser) => ({ ...carry, ...parser.config }), {}));
104
+ },
105
+ createCss(config) {
106
+ const parser = this.create(config);
107
+ const filteredProps = parser.propNames;
108
+ return (cssProps) => {
109
+ let cache;
110
+ const allKeys = Object.keys(cssProps);
111
+ /** Any key of the CSSProps that is not a System Prop or a Static CSS Property is treated as a nested selector */
112
+ const selectors = allKeys.filter((key) => !filteredProps.includes(key) && isObject(cssProps[key]));
113
+ /** Static CSS Properties get extracted if they match neither syntax */
114
+ const staticCss = getStaticCss(cssProps, [
115
+ 'theme',
116
+ ...selectors,
117
+ ...filteredProps,
118
+ ]);
119
+ return ({ theme }) => {
120
+ if (cache)
121
+ return cache;
122
+ const css = parser({ ...cssProps, theme });
123
+ selectors.forEach((selector) => {
124
+ const selectorConfig = cssProps[selector] ?? {};
125
+ css[selector] = {
126
+ ...getStaticCss(selectorConfig, filteredProps),
127
+ ...parser({ ...selectorConfig, theme }),
128
+ };
129
+ });
130
+ /** Merge the static and generated css and save it to the cache */
131
+ cache = {
132
+ ...staticCss,
133
+ ...css,
134
+ };
135
+ return cache;
136
+ };
137
+ };
138
+ },
139
+ createVariant(config) {
140
+ const css = this.createCss(config);
141
+ return ({ prop = 'variant', defaultVariant, base = {}, variants }) => {
142
+ const baseFn = css(base);
143
+ const variantFns = {};
144
+ Object.keys(variants).forEach((key) => {
145
+ const variantKey = key;
146
+ const cssProps = variants[variantKey];
147
+ variantFns[variantKey] = css(cssProps);
148
+ });
149
+ return (props) => {
150
+ const { [prop]: selected = defaultVariant } = props;
151
+ const styles = {};
152
+ if (!selected)
153
+ return styles;
154
+ return merge(styles, baseFn(props), variantFns?.[selected]?.(props));
155
+ };
156
+ };
157
+ },
158
+ createStates(config) {
159
+ const css = this.createCss(config);
160
+ return (states) => {
161
+ const orderedStates = Object.keys(states);
162
+ const stateFns = {};
163
+ orderedStates.forEach((key) => {
164
+ const stateKey = key;
165
+ const cssProps = states[stateKey];
166
+ stateFns[stateKey] = css(cssProps);
167
+ });
168
+ return (props) => {
169
+ const styles = {};
170
+ orderedStates.forEach((state) => {
171
+ merge(styles, props[state] && stateFns[state](props));
172
+ });
173
+ return styles;
174
+ };
175
+ };
176
+ },
177
+ create(config) {
178
+ const transforms = {};
179
+ // Create a transform function for each of the props
180
+ for (const prop in config) {
181
+ if (typeof prop === 'string') {
182
+ transforms[prop] = this.createTransform(prop, config[prop]);
183
+ }
184
+ }
185
+ // Create a parser that handles all the props within the config
186
+ return this.createParser(transforms);
187
+ },
188
+ };
189
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAc/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,+CAA+C;IAC/C,YAAY,CACV,MAAc;QAEd,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,WAA+C,CAAC;QAEpD,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;YACxB,wFAAwF;YACxF,IACE,WAAW,KAAK,SAAS;gBACzB,CAAC,WAAW,KAAK,IAAI,IAAI,KAAK,EAAE,WAAW,CAAC,EAC5C;gBACA,iCAAiC;gBACjC,WAAW,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;aACpD;YAED,oFAAoF;YACpF,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAE/B,QAAQ,OAAO,KAAK,EAAE;oBACpB,KAAK,QAAQ,CAAC;oBACd,KAAK,QAAQ,CAAC;oBACd,KAAK,UAAU;wBACb,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;oBACrE,2DAA2D;oBAC3D,KAAK,QAAQ;wBACX,IAAI,CAAC,WAAW,EAAE;4BAChB,OAAO;yBACR;wBACD,6EAA6E;wBAC7E,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;4BACvB,OAAO,KAAK,CACV,MAAM,EACN,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CACvD,CAAC;yBACH;wBACD,6FAA6F;wBAC7F,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;4BACrB,OAAO,KAAK,CACV,MAAM,EACN,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CACtD,CAAC;yBACH;iBACJ;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5E,CAAC,CAAC;QACF,yFAAyF;QACzF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,oFAAoF;IACpF,iEAAiE;IACjE,eAAe,CACb,IAAO,EACP,MAAc;QAEd,MAAM,EACJ,SAAS,GAAG,QAAQ,EACpB,QAAQ,EACR,UAAU,GAAG,CAAC,QAAQ,CAAC,EACvB,KAAK,GACN,GAAG,MAAM,CAAC;QACX,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9D,OAAO;YACL,GAAG,MAAM;YACT,IAAI;YACJ,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC9B,MAAM,MAAM,GAAc,EAAE,CAAC;gBAE7B,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;oBACtB,OAAO,MAAM,CAAC;iBACf;gBAED,IAAI,YAAY,GAAG,KAAK,CAAC;gBACzB,IAAI,iBAA8C,CAAC;gBACnD,IAAI,UAAuC,CAAC;gBAE5C,QAAQ,OAAO,KAAK,EAAE;oBACpB,KAAK,QAAQ,CAAC;oBACd,KAAK,QAAQ;wBACX,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;wBACzC,YAAY,GAAG,UAAU,KAAK,SAAS,IAAI,eAAe,CAAC;wBAC3D,iBAAiB,GAAG,UAAU,IAAI,KAAK,CAAC;wBACxC,MAAM;oBACR,KAAK,UAAU;wBACb,IAAI,KAAK,CAAC,KAAK,EAAE;4BACf,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAGxB,CAAC;yBACf;wBACD,MAAM;oBACR;wBACE,OAAO,MAAM,CAAC;iBACjB;gBAED,+EAA+E;gBAC/E,gCAAgC;gBAChC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC9B,IAAI,UAAU,GAAiC,iBAAiB,CAAC;oBAEjE,IAAI,YAAY,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;wBAC5C,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;qBACrD;oBACD,QAAQ,OAAO,UAAU,EAAE;wBACzB,KAAK,QAAQ,CAAC;wBACd,KAAK,QAAQ;4BACX,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC;wBACzC,KAAK,QAAQ;4BACX,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;wBAC3C,QAAQ;qBACT;gBACH,CAAC,CAAC,CAAC;gBACH,qCAAqC;gBACrC,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;IACD,OAAO,CAAgC,GAAG,OAAa;QACrD,OAAO,IAAI,CAAC,YAAY,CACtB,OAAO,CAAC,MAAM,CACZ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EACnD,EAAE,CACc,CACnB,CAAC;IACJ,CAAC;IACD,SAAS,CAGP,MAAc;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,aAAa,GAAa,MAAM,CAAC,SAAS,CAAC;QACjD,OAAO,CAAC,QAAQ,EAAE,EAAE;YAClB,IAAI,KAAgB,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,iHAAiH;YACjH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACjE,CAAC;YAEF,uEAAuE;YACvE,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE;gBACvC,OAAO;gBACP,GAAG,SAAS;gBACZ,GAAG,aAAa;aACjB,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACnB,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAS,CAAC,CAAC;gBAClD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBAC7B,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAChD,GAAG,CAAC,QAAQ,CAAC,GAAG;wBACd,GAAG,YAAY,CAAC,cAAc,EAAE,aAAa,CAAC;wBAC9C,GAAG,MAAM,CAAC,EAAE,GAAG,cAAc,EAAE,KAAK,EAAS,CAAC;qBAC/C,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,kEAAkE;gBAClE,KAAK,GAAG;oBACN,GAAG,SAAS;oBACZ,GAAG,GAAG;iBACP,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IACD,aAAa,CAGX,MAAc;QACd,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE3C,OAAO,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,cAAc,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAEnE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,UAAU,GAAG,EAAoD,CAAC;YAExE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpC,MAAM,UAAU,GAAG,GAAW,CAAC;gBAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACtC,UAAU,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,QAAe,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC;gBACpD,MAAM,MAAM,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ;oBAAE,OAAO,MAAM,CAAC;gBAE7B,OAAO,KAAK,CACV,MAAM,EACN,MAAM,CAAC,KAAK,CAAC,EACb,UAAU,EAAE,CAAC,QAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,CACxC,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IACD,YAAY,CAGV,MAAc;QACd,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE3C,OAAO,CAAC,MAAM,EAAE,EAAE;YAChB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,QAAQ,GAAG,EAAoD,CAAC;YAEtE,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC5B,MAAM,QAAQ,GAAG,GAAW,CAAC;gBAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAClC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAe,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,MAAM,GAAG,EAAE,CAAC;gBAClB,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC9B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxD,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IACD,MAAM,CAAsC,MAAc;QACxD,MAAM,UAAU,GAAG,EAA4B,CAAC;QAEhD,oDAAoD;QACpD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;YACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aAC7D;SACF;QAED,+DAA+D;QAC/D,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;CACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { CSSObject } from '../types/props';
2
+ import { AbstractTheme } from '../types/theme';
3
+ import { LiteralPaths } from '../utils/flattenScale';
4
+ import { KeyAsVariable } from '../utils/serializeTokens';
5
+ import { ColorModeConfig, Merge, MergeTheme, PrivateThemeKeys } from './types';
6
+ declare class ThemeBuilder<T extends AbstractTheme> {
7
+ #private;
8
+ constructor(baseTheme: T);
9
+ /**
10
+ *
11
+ * @param key A key of the current theme to transform into CSS Variables and Variable References
12
+ * @example .createScaleVariables('fontSize')
13
+ */
14
+ createScaleVariables<Key extends keyof Omit<T, 'breakpoints'> & string>(key: Key): ThemeBuilder<MergeTheme<T, PrivateThemeKeys, Record<Key, Record<Key, KeyAsVariable<T[Key], Key>>>>>;
15
+ /**
16
+ *
17
+ * @param colors A map of color tokens to add to the theme. These tokens are immediately converted to CSS Variables `--color-${key}`.
18
+ * @example .addColors({ navy: 'navy', hyper: 'purple' })
19
+ */
20
+ addColors<Colors extends Record<string, string | number | CSSObject>, NextColors extends LiteralPaths<Colors, '-'>>(colors: Colors): ThemeBuilder<MergeTheme<T & PrivateThemeKeys, Record<'colors', KeyAsVariable<NextColors, 'color'>>>>;
21
+ /**
22
+ *
23
+ * @param initialMode A key of the object passed for modes. This sets the default state for the theme and transforms the correct variables.
24
+ * @param modes A map of color modes with keys of each possible mode with a value of alias to color keys. This must be called after `addColors`
25
+ * @example .addColorModes('light', { light: { primary: 'hyper' }, { dark: { primary: 'navy' } } })
26
+ */
27
+ addColorModes<Modes extends string, InitialMode extends keyof Config, Colors extends keyof T['colors'], ModeColors extends ColorModeConfig<Colors>, Config extends Record<Modes, ModeColors>, ColorAliases extends {
28
+ [K in keyof Config]: LiteralPaths<Config[K], '-', '_'>;
29
+ }>(initialMode: InitialMode, modeConfig: Config): ThemeBuilder<MergeTheme<T & PrivateThemeKeys, {
30
+ colors: KeyAsVariable<LiteralPaths<Config[keyof Config], '-', '_'>, 'colors'> & T['colors'];
31
+ modes: Merge<T['modes'], ColorAliases>;
32
+ mode: keyof Config;
33
+ _getColorValue: (color: keyof T['colors']) => string;
34
+ }>>;
35
+ /**
36
+ *
37
+ * @param key A new key of theme
38
+ * @param createScale A function that accepts the current theme and returns a new object of scale values.
39
+ * @example .addScale('fonts', () => ({ basic: 'Gotham', cool: 'Wingdings' }))
40
+ */
41
+ addScale<Key extends string, Fn extends (theme: T) => Record<string | number, string | number | Record<string, string | number>>, NewScale extends LiteralPaths<ReturnType<Fn>, '-'>>(key: Key, createScale: Fn): ThemeBuilder<MergeTheme<T, Record<Key, NewScale>>>;
42
+ /**
43
+ *
44
+ * @param key A current key of theme to be updated with new or computed values
45
+ * @param updateFn A function that accepts an argument of the current values at the specified keys an returns a map of new values to merge.
46
+ * @example .updateScale('fonts', ({ basic }) => ({ basicFallback: `{basic}, Montserrat` }))
47
+ */
48
+ updateScale<Key extends keyof T, Fn extends (tokens: T[Key]) => Record<string | number, unknown>>(key: Key, updateFn: Fn): ThemeBuilder<T & Record<Key, T[Key] & ReturnType<Fn>>>;
49
+ /**
50
+ * This finalizes the theme build and returns the final theme and variables to be provided.
51
+ */
52
+ build(): T & PrivateThemeKeys;
53
+ }
54
+ export declare function createTheme<T extends AbstractTheme>(base: T): ThemeBuilder<T>;
55
+ export {};
@@ -0,0 +1,94 @@
1
+ import { mapValues, merge } from 'lodash';
2
+ import { flattenScale } from '../utils/flattenScale';
3
+ import { serializeTokens } from '../utils/serializeTokens';
4
+ class ThemeBuilder {
5
+ #theme = {};
6
+ constructor(baseTheme) {
7
+ this.#theme = baseTheme;
8
+ }
9
+ /**
10
+ *
11
+ * @param key A key of the current theme to transform into CSS Variables and Variable References
12
+ * @example .createScaleVariables('fontSize')
13
+ */
14
+ createScaleVariables(key) {
15
+ const { variables, tokens } = serializeTokens(this.#theme[key], key, this.#theme);
16
+ this.#theme = merge({}, this.#theme, {
17
+ [key]: tokens,
18
+ _variables: { root: variables },
19
+ _tokens: {
20
+ [key]: this.#theme[key],
21
+ },
22
+ });
23
+ return this;
24
+ }
25
+ /**
26
+ *
27
+ * @param colors A map of color tokens to add to the theme. These tokens are immediately converted to CSS Variables `--color-${key}`.
28
+ * @example .addColors({ navy: 'navy', hyper: 'purple' })
29
+ */
30
+ addColors(colors) {
31
+ const flatColors = flattenScale(colors);
32
+ const { variables, tokens } = serializeTokens(flatColors, 'color', this.#theme);
33
+ this.#theme = merge({}, this.#theme, {
34
+ colors: tokens,
35
+ _variables: { root: variables },
36
+ _tokens: { colors: flatColors },
37
+ });
38
+ return this;
39
+ }
40
+ /**
41
+ *
42
+ * @param initialMode A key of the object passed for modes. This sets the default state for the theme and transforms the correct variables.
43
+ * @param modes A map of color modes with keys of each possible mode with a value of alias to color keys. This must be called after `addColors`
44
+ * @example .addColorModes('light', { light: { primary: 'hyper' }, { dark: { primary: 'navy' } } })
45
+ */
46
+ addColorModes(initialMode, modeConfig) {
47
+ const modes = mapValues(modeConfig, (mode) => flattenScale(mode));
48
+ const { tokens: colors, variables } = serializeTokens(mapValues(merge({}, this.#theme.modes?.[initialMode], modes[initialMode]), (color) => this.#theme.colors[color]), 'color', this.#theme);
49
+ const getColorValue = (color) => this.#theme._tokens?.colors?.[color];
50
+ this.#theme = merge({}, this.#theme, {
51
+ colors,
52
+ modes,
53
+ mode: initialMode,
54
+ _getColorValue: getColorValue,
55
+ _variables: { mode: variables },
56
+ _tokens: {
57
+ modes: mapValues(modes, (mode) => mapValues(mode, getColorValue)),
58
+ },
59
+ });
60
+ return this;
61
+ }
62
+ /**
63
+ *
64
+ * @param key A new key of theme
65
+ * @param createScale A function that accepts the current theme and returns a new object of scale values.
66
+ * @example .addScale('fonts', () => ({ basic: 'Gotham', cool: 'Wingdings' }))
67
+ */
68
+ addScale(key, createScale) {
69
+ this.#theme = merge({}, this.#theme, {
70
+ [key]: flattenScale(createScale(this.#theme)),
71
+ });
72
+ return this;
73
+ }
74
+ /**
75
+ *
76
+ * @param key A current key of theme to be updated with new or computed values
77
+ * @param updateFn A function that accepts an argument of the current values at the specified keys an returns a map of new values to merge.
78
+ * @example .updateScale('fonts', ({ basic }) => ({ basicFallback: `{basic}, Montserrat` }))
79
+ */
80
+ updateScale(key, updateFn) {
81
+ this.#theme = merge({}, this.#theme, { [key]: updateFn(this.#theme[key]) });
82
+ return this;
83
+ }
84
+ /**
85
+ * This finalizes the theme build and returns the final theme and variables to be provided.
86
+ */
87
+ build() {
88
+ return merge({}, this.#theme, { _variables: {}, _tokens: {} });
89
+ }
90
+ }
91
+ export function createTheme(base) {
92
+ return new ThemeBuilder(base);
93
+ }
94
+ //# sourceMappingURL=createTheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTheme.js","sourceRoot":"","sources":["../../src/createTheme/createTheme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,167 @@
1
+ import { mapValues } from 'lodash';
2
+ import { createTheme } from './createTheme';
3
+ describe('createTheme', () => {
4
+ const base = {
5
+ breakpoints: { xs: '1', sm: '2', md: '3', lg: '4', xl: '5' },
6
+ };
7
+ it('works', () => {
8
+ expect(createTheme(base).build()).toEqual({
9
+ ...base,
10
+ _variables: {},
11
+ _tokens: {},
12
+ });
13
+ });
14
+ it('adds a scale', () => {
15
+ const theme = createTheme(base)
16
+ .addScale('test', () => ({
17
+ test: 1,
18
+ test2: 2,
19
+ }))
20
+ .build();
21
+ expect(theme.test).toEqual({ test: 1, test2: 2 });
22
+ });
23
+ it('updates a scale', () => {
24
+ const builder = createTheme(base).addScale('test', () => ({
25
+ test: 1,
26
+ test2: 2,
27
+ }));
28
+ expect(builder.build().test).toEqual({ test: 1, test2: 2 });
29
+ builder.updateScale('test', () => ({ test3: 3 }));
30
+ expect(builder.build().test).toEqual({ test: 1, test2: 2, test3: 3 });
31
+ });
32
+ it('serializes variables', () => {
33
+ const theme = createTheme(base)
34
+ .addScale('test', () => ({
35
+ test: 1,
36
+ test2: 2,
37
+ }))
38
+ .createScaleVariables('test')
39
+ .build();
40
+ expect(theme.test).toEqual({
41
+ test: 'var(--test-test)',
42
+ test2: 'var(--test-test2)',
43
+ });
44
+ expect(theme._variables.root).toEqual({
45
+ '--test-test': 1,
46
+ '--test-test2': 2,
47
+ });
48
+ });
49
+ describe('colors', () => {
50
+ const staticColors = {
51
+ white: 'white',
52
+ black: 'black',
53
+ blue: 'blue',
54
+ green: 'green',
55
+ red: 'red',
56
+ };
57
+ const cssVariableReferences = mapValues(staticColors, (val) => `var(--color-${val})`);
58
+ const builder = createTheme(base);
59
+ it('creates color variables', () => {
60
+ const theme = builder.addColors(staticColors).build();
61
+ expect(theme.colors).toEqual(cssVariableReferences);
62
+ });
63
+ it('adds colorModes', () => {
64
+ const theme = builder
65
+ .addColors(staticColors)
66
+ .addColorModes('light', {
67
+ light: {
68
+ primary: 'red',
69
+ },
70
+ dark: {
71
+ primary: 'blue',
72
+ },
73
+ })
74
+ .build();
75
+ expect(theme.colors).toEqual({
76
+ ...mapValues(staticColors, (val) => `var(--color-${val})`),
77
+ primary: 'var(--color-primary)',
78
+ });
79
+ expect(theme._variables.mode).toEqual({
80
+ '--color-primary': 'var(--color-red)',
81
+ });
82
+ });
83
+ it('returns value checker for colors', () => {
84
+ const theme = builder
85
+ .addColors({
86
+ black: '#000000',
87
+ white: '#FFFFFF',
88
+ })
89
+ .addColorModes('light', {
90
+ light: {
91
+ primary: 'black',
92
+ },
93
+ dark: {
94
+ primary: 'white',
95
+ },
96
+ })
97
+ .build();
98
+ expect(theme._getColorValue('white')).toEqual('#FFFFFF');
99
+ expect(theme._getColorValue(theme.modes.light.primary)).toEqual('#000000');
100
+ });
101
+ it('returns value checker for colors with deep values', () => {
102
+ const theme = builder
103
+ .addColors({
104
+ black: '#000000',
105
+ white: '#FFFFFF',
106
+ gray: { 200: '#eeeeee', 300: '#666666' },
107
+ })
108
+ .addColorModes('light', {
109
+ light: {
110
+ primary: {
111
+ default: 'gray-200',
112
+ cool: { _: 'gray-300', town: 'black' },
113
+ },
114
+ },
115
+ })
116
+ .build();
117
+ expect(theme._getColorValue('gray-300')).toEqual('#666666');
118
+ expect(theme._getColorValue(theme.modes.light['primary-default'])).toEqual('#eeeeee');
119
+ });
120
+ it('merges color mode configurations when overriden', () => {
121
+ const theme = builder
122
+ .addColors({
123
+ black: '#000000',
124
+ white: '#FFFFFF',
125
+ })
126
+ .addColorModes('light', {
127
+ light: {
128
+ primary: {
129
+ _: 'black',
130
+ hover: 'white',
131
+ },
132
+ },
133
+ })
134
+ .build();
135
+ const override = createTheme(theme)
136
+ .addColorModes('light', {
137
+ light: {
138
+ primary: {
139
+ _: 'white',
140
+ hover: 'black',
141
+ },
142
+ },
143
+ })
144
+ .build();
145
+ expect(override.modes.light.primary).toEqual('white');
146
+ });
147
+ it('returns the raw values of color mode colors on the tokens object', () => {
148
+ const theme = createTheme(base)
149
+ .addColors({
150
+ black: '#000000',
151
+ gray: { 300: '#666666' },
152
+ })
153
+ .addColorModes('light', {
154
+ light: {
155
+ primary: {
156
+ cool: { _: 'gray-300', town: 'black' },
157
+ },
158
+ },
159
+ })
160
+ .build();
161
+ expect(theme._tokens.modes).toEqual({
162
+ light: { 'primary-cool': '#666666', 'primary-cool-town': '#000000' },
163
+ });
164
+ });
165
+ });
166
+ });
167
+ //# sourceMappingURL=createTheme.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTheme.test.js","sourceRoot":"","sources":["../../src/createTheme/createTheme.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './createTheme';
2
+ export * from '../utils/serializeTokens';
3
+ export * from '../utils/flattenScale';
@@ -0,0 +1,4 @@
1
+ export * from './createTheme';
2
+ export * from '../utils/serializeTokens';
3
+ export * from '../utils/flattenScale';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/createTheme/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { CSSObject } from '../types/props';
2
+ import { AbstractTheme } from '../types/theme';
3
+ /**
4
+ * This is a custom generic that ensures the safety of adding additional values to a theme object without accidentally wiping out
5
+ * required keys like `breakpoints`. It works by creating a new mapped type and merging the values of the union of Base & Next:
6
+ * 1. If the key exists on both Base and Next return the intersection of both values
7
+ * 2. If the key exists on next use the value on next.
8
+ * 3. If the key exists on base but nothing else use the value on base.
9
+ *
10
+ * The resulting type is then rejoined with keys that cannot be mutated (breakpoints) as the next version of Theme
11
+ */
12
+ export declare type MergeTheme<Base extends AbstractTheme, Next, Unmergable = Record<'breakpoints', Base['breakpoints']>> = Unmergable & Merge<Base, Next>;
13
+ /** This merges at 2 levels of depth */
14
+ export declare type Merge<A, B> = {
15
+ [K in keyof (A & B)]: K extends keyof B ? K extends keyof A ? AssignValueIfUnmergable<A[K], B[K]> : B[K] : K extends keyof A ? A[K] : never;
16
+ };
17
+ /** Extract mergable objects */
18
+ export declare type Mergable<T> = Exclude<T, ((...args: any) => any) | string | boolean | symbol | number | any[]>;
19
+ /** Return B if either A or B is unmergable */
20
+ export declare type AssignValueIfUnmergable<A, B> = Mergable<A> extends never ? B : Mergable<B> extends never ? B : Assign<A, B>;
21
+ /** Prefer all values from B */
22
+ export declare type Assign<A, B> = {
23
+ [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
24
+ };
25
+ /** These are keys that are consistent for all theme builds - they are loosely typed as they are not meant to be accessed directly */
26
+ export declare type PrivateThemeKeys = {
27
+ _variables: Record<string, CSSObject>;
28
+ _tokens: Record<string | number, any>;
29
+ };
30
+ /** This allows 3 layers of color aliases to be constructed when adding colorModes
31
+ * @example
32
+ * {
33
+ * button: {
34
+ * bg: {
35
+ * hover: 'someAlias'
36
+ * }
37
+ * }
38
+ * }
39
+ *
40
+ * `button-bg-hover`
41
+ * */
42
+ export declare type ColorModeConfig<Colors> = Record<string, Colors | Record<string, Colors> | Record<string, Colors | Record<string, Colors>>>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/createTheme/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export { variance } from './core';
2
+ export * from './createTheme';
3
+ export * from './types/props';
4
+ export * from './transforms';
5
+ export * from './scales/createScale';