@symbo.ls/scratch 3.4.5 → 3.4.6

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 (85) hide show
  1. package/dist/cjs/defaultConfig/animation.js +24 -0
  2. package/dist/cjs/defaultConfig/cases.js +24 -0
  3. package/dist/cjs/defaultConfig/class.js +25 -0
  4. package/dist/cjs/defaultConfig/color.js +31 -0
  5. package/dist/cjs/defaultConfig/document.js +24 -0
  6. package/dist/cjs/defaultConfig/font-family.js +38 -0
  7. package/dist/cjs/defaultConfig/font.js +33 -0
  8. package/dist/cjs/defaultConfig/grid.js +25 -0
  9. package/dist/cjs/defaultConfig/icons.js +26 -0
  10. package/dist/cjs/defaultConfig/index.js +45 -0
  11. package/dist/cjs/defaultConfig/media.js +29 -0
  12. package/dist/cjs/defaultConfig/responsive.js +50 -0
  13. package/dist/cjs/defaultConfig/sequence.js +49 -0
  14. package/dist/cjs/defaultConfig/shadow.js +29 -0
  15. package/dist/cjs/defaultConfig/spacing.js +38 -0
  16. package/dist/cjs/defaultConfig/svg.js +26 -0
  17. package/dist/cjs/defaultConfig/templates.js +24 -0
  18. package/dist/cjs/defaultConfig/theme.js +36 -0
  19. package/dist/cjs/defaultConfig/timing.js +37 -0
  20. package/dist/cjs/defaultConfig/typography.js +41 -0
  21. package/dist/cjs/defaultConfig/unit.js +26 -0
  22. package/dist/cjs/system/color.js +203 -0
  23. package/dist/cjs/system/document.js +36 -0
  24. package/dist/cjs/system/font.js +64 -0
  25. package/dist/cjs/system/index.js +27 -0
  26. package/dist/cjs/system/reset.js +87 -0
  27. package/dist/cjs/system/shadow.js +107 -0
  28. package/dist/cjs/system/spacing.js +134 -0
  29. package/dist/cjs/system/svg.js +97 -0
  30. package/dist/cjs/system/theme.js +234 -0
  31. package/dist/cjs/system/timing.js +48 -0
  32. package/dist/cjs/system/typography.js +99 -0
  33. package/dist/cjs/tests/index.js +28 -0
  34. package/dist/cjs/transforms/index.js +219 -0
  35. package/dist/cjs/utils/color.js +206 -0
  36. package/dist/cjs/utils/font.js +89 -0
  37. package/dist/cjs/utils/index.js +24 -0
  38. package/dist/cjs/utils/sequence.js +323 -0
  39. package/dist/cjs/utils/sprite.js +85 -0
  40. package/dist/cjs/utils/theme.js +29 -0
  41. package/dist/cjs/utils/unit.js +79 -0
  42. package/dist/cjs/utils/var.js +102 -0
  43. package/dist/esm/defaultConfig/animation.js +4 -0
  44. package/dist/esm/defaultConfig/cases.js +4 -0
  45. package/dist/esm/defaultConfig/class.js +5 -0
  46. package/dist/esm/defaultConfig/color.js +11 -0
  47. package/dist/esm/defaultConfig/document.js +4 -0
  48. package/dist/esm/defaultConfig/font-family.js +18 -0
  49. package/dist/esm/defaultConfig/font.js +13 -0
  50. package/dist/esm/defaultConfig/grid.js +5 -0
  51. package/dist/esm/defaultConfig/icons.js +6 -0
  52. package/dist/esm/defaultConfig/index.js +24 -0
  53. package/dist/esm/defaultConfig/media.js +9 -0
  54. package/dist/esm/defaultConfig/responsive.js +30 -0
  55. package/dist/esm/defaultConfig/sequence.js +29 -0
  56. package/dist/esm/defaultConfig/shadow.js +9 -0
  57. package/dist/esm/defaultConfig/spacing.js +18 -0
  58. package/dist/esm/defaultConfig/svg.js +6 -0
  59. package/dist/esm/defaultConfig/templates.js +4 -0
  60. package/dist/esm/defaultConfig/theme.js +16 -0
  61. package/dist/esm/defaultConfig/timing.js +17 -0
  62. package/dist/esm/defaultConfig/typography.js +21 -0
  63. package/dist/esm/defaultConfig/unit.js +6 -0
  64. package/dist/esm/system/color.js +188 -0
  65. package/dist/esm/system/document.js +16 -0
  66. package/dist/esm/system/font.js +50 -0
  67. package/dist/esm/system/index.js +10 -0
  68. package/dist/esm/system/reset.js +67 -0
  69. package/dist/esm/system/shadow.js +91 -0
  70. package/dist/esm/system/spacing.js +121 -0
  71. package/dist/esm/system/svg.js +77 -0
  72. package/dist/esm/system/theme.js +219 -0
  73. package/dist/esm/system/timing.js +32 -0
  74. package/dist/esm/system/typography.js +85 -0
  75. package/dist/esm/tests/index.js +8 -0
  76. package/dist/esm/transforms/index.js +216 -0
  77. package/dist/esm/utils/color.js +192 -0
  78. package/dist/esm/utils/font.js +69 -0
  79. package/dist/esm/utils/index.js +7 -0
  80. package/dist/esm/utils/sequence.js +303 -0
  81. package/dist/esm/utils/sprite.js +65 -0
  82. package/dist/esm/utils/theme.js +9 -0
  83. package/dist/esm/utils/unit.js +59 -0
  84. package/dist/esm/utils/var.js +82 -0
  85. package/package.json +7 -7
@@ -0,0 +1,216 @@
1
+ import { isString, isObject, exec } from "@domql/utils";
2
+ import { getActiveConfig } from "../factory";
3
+ import {
4
+ getSpacingByKey,
5
+ getColor,
6
+ getShadow,
7
+ getMediaColor,
8
+ getTimingByKey,
9
+ getTimingFunction,
10
+ getSpacingBasedOnRatio,
11
+ checkIfBoxSize,
12
+ splitSpacedValue
13
+ } from "../system";
14
+ import {
15
+ getFnPrefixAndValue,
16
+ isResolvedColor,
17
+ isCSSVar,
18
+ CSS_NATIVE_COLOR_REGEX,
19
+ splitTopLevelCommas,
20
+ parseColorToken
21
+ } from "../utils";
22
+ const BORDER_STYLES = /* @__PURE__ */ new Set([
23
+ "none",
24
+ "hidden",
25
+ "dotted",
26
+ "dashed",
27
+ "solid",
28
+ "double",
29
+ "groove",
30
+ "ridge",
31
+ "inset",
32
+ "outset",
33
+ "initial"
34
+ ]);
35
+ const GRADIENT_KEYWORDS = /* @__PURE__ */ new Set([
36
+ "to",
37
+ "top",
38
+ "bottom",
39
+ "left",
40
+ "right",
41
+ "center",
42
+ "at",
43
+ "circle",
44
+ "ellipse",
45
+ "closest-side",
46
+ "farthest-side",
47
+ "closest-corner",
48
+ "farthest-corner"
49
+ ]);
50
+ const isBorderStyle = (str) => BORDER_STYLES.has(str);
51
+ const transformBorder = (border) => {
52
+ const str = border + "";
53
+ if (CSS_NATIVE_COLOR_REGEX.test(str)) return str;
54
+ const trimmed = str.trim();
55
+ if (trimmed === "none" || trimmed === "0" || trimmed === "initial" || trimmed === "inherit" || trimmed === "unset") return str;
56
+ const tokens = str.split(/\s+/);
57
+ return tokens.map((v) => {
58
+ v = v.trim();
59
+ if (!v) return "";
60
+ if (isCSSVar(v)) return `var(${v})`;
61
+ if (isBorderStyle(v)) return v;
62
+ if (/^\d/.test(v) || v === "0") return v;
63
+ const color = getColor(v);
64
+ if (isResolvedColor(color)) return color;
65
+ const spacing = getSpacingByKey(v, "border");
66
+ if (spacing && spacing.border) return spacing.border;
67
+ return v;
68
+ }).join(" ");
69
+ };
70
+ const transformTextStroke = (stroke) => {
71
+ if (CSS_NATIVE_COLOR_REGEX.test(stroke)) return stroke;
72
+ return stroke.split(/\s+/).map((v) => {
73
+ v = v.trim();
74
+ if (!v) return "";
75
+ if (isCSSVar(v)) return `var(${v})`;
76
+ if (/^\d/.test(v) || v.includes("px") || v === "0") return v;
77
+ const color = getColor(v);
78
+ if (isResolvedColor(color)) return color;
79
+ return v;
80
+ }).join(" ");
81
+ };
82
+ const transformShadow = (sh, globalTheme) => getShadow(sh, globalTheme);
83
+ const transformBoxShadow = (shadows, globalTheme) => {
84
+ if (CSS_NATIVE_COLOR_REGEX.test(shadows)) return shadows;
85
+ return splitTopLevelCommas(shadows).map((shadow) => {
86
+ shadow = shadow.trim();
87
+ if (!shadow) return "";
88
+ return shadow.split(/\s+/).map((v) => {
89
+ v = v.trim();
90
+ if (!v) return "";
91
+ if (isCSSVar(v)) return `var(${v})`;
92
+ if (v === "inset" || v === "none") return v;
93
+ const color = getColor(v);
94
+ if (isResolvedColor(color)) {
95
+ const mediaColor = getMediaColor(v, globalTheme);
96
+ if (isObject(mediaColor))
97
+ return Object.values(mediaColor).filter(
98
+ (c) => c.includes(": " + globalTheme)
99
+ )[0];
100
+ return mediaColor;
101
+ }
102
+ if (/^\d/.test(v) || v === "0" || v.includes("px") || v.slice(-2) === "em") return v;
103
+ const spacing = getSpacingByKey(v, "shadow");
104
+ if (spacing && spacing.shadow) return spacing.shadow;
105
+ return v;
106
+ }).join(" ");
107
+ }).join(", ");
108
+ };
109
+ const resolveColorsInGradient = (gradient, globalTheme) => {
110
+ const parenStart = gradient.indexOf("(");
111
+ if (parenStart === -1) return gradient;
112
+ const prefix = gradient.slice(0, parenStart + 1);
113
+ const inner = gradient.slice(parenStart + 1, gradient.lastIndexOf(")"));
114
+ const suffix = ")";
115
+ const segments = splitTopLevelCommas(inner);
116
+ const resolved = segments.map((segment) => {
117
+ segment = segment.trim();
118
+ const tokens = segment.split(/\s+/);
119
+ return tokens.map((token) => {
120
+ if (!token) return token;
121
+ if (/^\d/.test(token) || token === "0") return token;
122
+ if (GRADIENT_KEYWORDS.has(token)) return token;
123
+ if (token === "transparent") return token;
124
+ if (CSS_NATIVE_COLOR_REGEX.test(token)) return token;
125
+ const color = getColor(token);
126
+ if (isResolvedColor(color)) return color;
127
+ return token;
128
+ }).join(" ");
129
+ });
130
+ return prefix + resolved.join(", ") + suffix;
131
+ };
132
+ const transformBackgroundImage = (backgroundImage, globalTheme) => {
133
+ const CONFIG = getActiveConfig();
134
+ return backgroundImage.split(", ").map((v) => {
135
+ if (isCSSVar(v)) return `var(${v})`;
136
+ if (v.includes("url")) return v;
137
+ if (v.includes("gradient")) return resolveColorsInGradient(v, globalTheme);
138
+ else if (CONFIG.GRADIENT[backgroundImage]) {
139
+ return {
140
+ backgroundImage: getMediaColor(
141
+ backgroundImage,
142
+ globalTheme || CONFIG.globalTheme
143
+ )
144
+ };
145
+ } else if (v.includes("/") || v.startsWith("http") || v.includes(".") && !parseColorToken(v))
146
+ return `url(${v})`;
147
+ return v;
148
+ }).join(" ");
149
+ };
150
+ const transfromGap = (gap) => isString(gap) && gap.split(" ").map((v) => getSpacingByKey(v, "gap").gap).join(" ");
151
+ const transformTransition = (transition) => {
152
+ const arr = transition.split(" ");
153
+ if (!arr.length) return transition;
154
+ return arr.map((v) => {
155
+ if (isCSSVar(v)) return `var(${v})`;
156
+ if (v.length < 3 || v.includes("ms")) {
157
+ const mapWithSequence = getTimingByKey(v);
158
+ return mapWithSequence.timing || v;
159
+ }
160
+ if (getTimingFunction(v)) return getTimingFunction(v);
161
+ return v;
162
+ }).join(" ");
163
+ };
164
+ const transformDuration = (duration, props, propertyName) => {
165
+ if (!isString(duration)) return;
166
+ return duration.split(",").map((v) => getTimingByKey(v).timing || v).join(",");
167
+ };
168
+ const splitTransition = (transition) => {
169
+ const arr = transition.split(",");
170
+ if (!arr.length) return;
171
+ return arr.map(transformTransition).join(",");
172
+ };
173
+ function transformSize(propertyName, val, props = {}, opts = {}) {
174
+ let value = exec.call(this, val || props[propertyName]);
175
+ if (value === void 0 || value === null) return;
176
+ let fnPrefix;
177
+ if (isString(value)) {
178
+ if (value.includes("(")) {
179
+ const fnArr = getFnPrefixAndValue(value);
180
+ fnPrefix = fnArr[0];
181
+ value = fnArr[1];
182
+ }
183
+ const shouldScaleBoxSize = props.scaleBoxSize;
184
+ const isBoxSize = checkIfBoxSize(propertyName);
185
+ if (!shouldScaleBoxSize && isBoxSize) {
186
+ value = splitSpacedValue(value);
187
+ }
188
+ }
189
+ return opts.ratio ? getSpacingBasedOnRatio(props, propertyName, value, fnPrefix) : getSpacingByKey(value, propertyName, void 0, fnPrefix);
190
+ }
191
+ const transformSizeRatio = (propertyName, val = null, props) => {
192
+ return transformSize(propertyName, val, props, {
193
+ ratio: true
194
+ });
195
+ };
196
+ const transformBorderRadius = (radius, props, propertyName) => {
197
+ if (!isString(radius)) return;
198
+ return {
199
+ borderRadius: radius.split(" ").map((v, k) => getSpacingBasedOnRatio(props, propertyName, v)[propertyName]).join(" ")
200
+ };
201
+ };
202
+ export {
203
+ resolveColorsInGradient,
204
+ splitTransition,
205
+ transformBackgroundImage,
206
+ transformBorder,
207
+ transformBorderRadius,
208
+ transformBoxShadow,
209
+ transformDuration,
210
+ transformShadow,
211
+ transformSize,
212
+ transformSizeRatio,
213
+ transformTextStroke,
214
+ transformTransition,
215
+ transfromGap
216
+ };
@@ -0,0 +1,192 @@
1
+ import {
2
+ document,
3
+ window,
4
+ isString,
5
+ isNumber,
6
+ isNotProduction
7
+ } from "@domql/utils";
8
+ const colorStringToRgbaArray = (color) => {
9
+ if (color === "") return [0, 0, 0, 0];
10
+ if (color.toLowerCase() === "transparent") return [0, 0, 0, 0];
11
+ if (color[0] === "#") {
12
+ if (color.length < 7) {
13
+ color = "#" + color[1] + color[1] + color[2] + color[2] + color[3] + color[3] + (color.length > 4 ? color[4] + color[4] : "");
14
+ }
15
+ return [
16
+ parseInt(color.substr(1, 2), 16),
17
+ parseInt(color.substr(3, 2), 16),
18
+ parseInt(color.substr(5, 2), 16),
19
+ color.length > 7 ? parseInt(color.substr(7, 2), 16) / 255 : 1
20
+ ];
21
+ }
22
+ if (color.indexOf("rgb") === -1) {
23
+ if (document && window) {
24
+ const elem = document.body.appendChild(document.createElement("fictum"));
25
+ const flag = "rgb(1, 2, 3)";
26
+ elem.style.color = flag;
27
+ if (elem.style.color !== flag) {
28
+ document.body.removeChild(elem);
29
+ return;
30
+ }
31
+ elem.style.color = color;
32
+ if (elem.style.color === flag || elem.style.color === "") {
33
+ document.body.removeChild(elem);
34
+ return [0, 0, 0, 0];
35
+ }
36
+ color = window.getComputedStyle(elem).color;
37
+ document.body.removeChild(elem);
38
+ }
39
+ }
40
+ if (color.indexOf("rgb") === 0) {
41
+ if (color.indexOf("rgba") === -1) color = `${color}, 1`;
42
+ return color.match(/[\.\d]+/g).map((a) => +a);
43
+ }
44
+ return [0, 0, 0, 0];
45
+ };
46
+ const mixTwoColors = (colorA, colorB, range = 0.5) => {
47
+ colorA = colorStringToRgbaArray(colorA);
48
+ colorB = colorStringToRgbaArray(colorB);
49
+ return mixTwoRgba(colorA, colorB, range);
50
+ };
51
+ const hexToRgb = (hex, alpha = 1) => {
52
+ const [r, g, b] = hex.match(/\w\w/g).map((x) => parseInt(x, 16));
53
+ return `rgb(${r},${g},${b})`;
54
+ };
55
+ const hexToRgbArray = (hex, alpha = 1) => {
56
+ const [r, g, b] = hex.match(/\w\w/g).map((x) => parseInt(x, 16));
57
+ return [r, g, b];
58
+ };
59
+ const rgbToHex = (r, g, b) => {
60
+ return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);
61
+ };
62
+ const rgbArrayToHex = ([r, g, b]) => {
63
+ return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
64
+ };
65
+ const hexToRgba = (hex, alpha = 1) => {
66
+ const [r, g, b] = hex.match(/\w\w/g).map((x) => parseInt(x, 16));
67
+ return `rgba(${r},${g},${b},${alpha})`;
68
+ };
69
+ const mixTwoRgb = (colorA, colorB, range = 0.5) => {
70
+ const arr = [];
71
+ for (let i = 0; i < 3; i++) {
72
+ arr[i] = ~~(colorA[i] + (colorB[i] - colorA[i]) * range);
73
+ }
74
+ return `rgb(${arr})`;
75
+ };
76
+ const changeLightness = (delta, hsl) => {
77
+ const [hue, saturation, lightness] = hsl;
78
+ const newLightness = Math.max(0, Math.min(100, lightness + parseFloat(delta)));
79
+ return [hue, saturation, newLightness];
80
+ };
81
+ const rgbToHSL = (r, g, b) => {
82
+ const a = Math.max(r, g, b);
83
+ const n = a - Math.min(r, g, b);
84
+ const f = 1 - Math.abs(a + a - n - 1);
85
+ const h = n && (a == r ? (g - b) / n : a == g ? 2 + (b - r) / n : 4 + (r - g) / n);
86
+ return [60 * (h < 0 ? h + 6 : h), f ? n / f : 0, (a + a - n) / 2];
87
+ };
88
+ const hslToRgb = (h, s, l, a = s * Math.min(l, 1 - l), f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)) => [f(0), f(8), f(4)];
89
+ const getColorShade = (col, amt) => {
90
+ const num = parseInt(col, 16);
91
+ let r = (num >> 16) + amt;
92
+ if (r > 255) r = 255;
93
+ else if (r < 0) r = 0;
94
+ let b = (num >> 8 & 255) + amt;
95
+ if (b > 255) b = 255;
96
+ else if (b < 0) b = 0;
97
+ let g = (num & 255) + amt;
98
+ if (g > 255) g = 255;
99
+ else if (g < 0) g = 0;
100
+ return ((g | b << 8 | r << 16) + 16777216).toString(16).slice(1);
101
+ };
102
+ const mixTwoRgba = (colorA, colorB, range = 0.5) => {
103
+ const arr = [];
104
+ for (let i = 0; i < 4; i++) {
105
+ const round = i === 3 ? (x) => x : Math.round;
106
+ arr[i] = round(colorA[i] + (colorB[i] - colorA[i]) * range);
107
+ }
108
+ return `rgba(${arr})`;
109
+ };
110
+ const opacify = (color, opacity) => {
111
+ const arr = colorStringToRgbaArray(color);
112
+ if (!arr) {
113
+ if (isNotProduction()) console.warn(color + " color is not rgba");
114
+ return;
115
+ }
116
+ arr[3] = opacity;
117
+ return `rgba(${arr})`;
118
+ };
119
+ const isCSSVar = (v) => v.charCodeAt(0) === 45 && v.charCodeAt(1) === 45;
120
+ const CSS_NATIVE_COLOR_REGEX = /(?:rgba?\(|hsla?\(|#[0-9a-fA-F]{3,8}\b)/;
121
+ const COLOR_TOKEN_REGEX = /^([a-zA-Z]\w*)(?:\.(\d+))?(?:([+-]\d+|=\d+))?$/;
122
+ const parseColorToken = (value) => {
123
+ if (!isString(value)) return null;
124
+ if (CSS_NATIVE_COLOR_REGEX.test(value)) return { passthrough: value };
125
+ if (isCSSVar(value)) return { cssVar: value };
126
+ const match = value.match(COLOR_TOKEN_REGEX);
127
+ if (!match) return null;
128
+ const [, name, alphaDigits, rawTone] = match;
129
+ const alpha = alphaDigits !== void 0 ? `0.${alphaDigits}` : void 0;
130
+ const tone = rawTone && rawTone[0] === "=" ? rawTone.slice(1) : rawTone;
131
+ return { name, alpha, tone };
132
+ };
133
+ const isResolvedColor = (result) => {
134
+ return isString(result) && (result.includes("rgb") || result.includes("var(") || result.includes("#"));
135
+ };
136
+ const splitTopLevelCommas = (value) => {
137
+ const result = [];
138
+ let current = "";
139
+ let depth = 0;
140
+ for (const char of value) {
141
+ if (char === "(") depth += 1;
142
+ else if (char === ")" && depth > 0) depth -= 1;
143
+ if (char === "," && depth === 0) {
144
+ result.push(current);
145
+ current = "";
146
+ continue;
147
+ }
148
+ current += char;
149
+ }
150
+ if (current.length || !result.length) result.push(current);
151
+ return result;
152
+ };
153
+ const getRgbTone = (rgb, tone) => {
154
+ if (isString(rgb) && rgb.includes("rgb"))
155
+ rgb = colorStringToRgbaArray(rgb).join(", ");
156
+ if (isString(rgb)) rgb = rgb.split(",").map((v) => parseFloat(v.trim()));
157
+ if (isNumber(tone)) tone += "";
158
+ const toHex = rgbArrayToHex(rgb);
159
+ const abs = tone.slice(0, 1);
160
+ if (abs === "-" || abs === "+") {
161
+ const colorShade = getColorShade(toHex, parseFloat(tone));
162
+ return hexToRgbArray(colorShade).join(", ");
163
+ } else {
164
+ const [r, g, b] = rgb;
165
+ const hsl = rgbToHSL(r, g, b);
166
+ const [h, s, l] = hsl;
167
+ const newRgb = hslToRgb(h, s, parseFloat(tone) / 100 * 255);
168
+ return newRgb;
169
+ }
170
+ };
171
+ export {
172
+ CSS_NATIVE_COLOR_REGEX,
173
+ changeLightness,
174
+ colorStringToRgbaArray,
175
+ getColorShade,
176
+ getRgbTone,
177
+ hexToRgb,
178
+ hexToRgbArray,
179
+ hexToRgba,
180
+ hslToRgb,
181
+ isCSSVar,
182
+ isResolvedColor,
183
+ mixTwoColors,
184
+ mixTwoRgb,
185
+ mixTwoRgba,
186
+ opacify,
187
+ parseColorToken,
188
+ rgbArrayToHex,
189
+ rgbToHSL,
190
+ rgbToHex,
191
+ splitTopLevelCommas
192
+ };
@@ -0,0 +1,69 @@
1
+ const getDefaultOrFirstKey = (LIBRARY, key) => {
2
+ if (LIBRARY[key]) return LIBRARY[key].value;
3
+ if (LIBRARY.default) return LIBRARY[LIBRARY.default].value;
4
+ const hasValue = Object.keys(LIBRARY)[0];
5
+ return hasValue && LIBRARY[hasValue] && LIBRARY[hasValue].value;
6
+ };
7
+ const getFontFormat = (url) => {
8
+ const ext = url.split(/[#?]/)[0].split(".").pop().trim();
9
+ if (["woff2", "woff", "ttf", "otf", "eot"].includes(ext)) return ext;
10
+ return null;
11
+ };
12
+ const isGoogleFontsUrl = (url) => url && (url.includes("fonts.googleapis.com") || url.includes("fonts.gstatic.com"));
13
+ const setFontImport = (url) => `@import url('${url}');`;
14
+ const setInCustomFontMedia = (str) => `@font-face { ${str} }`;
15
+ const setCustomFont = (name, url, weight, options = {}) => {
16
+ const format = getFontFormat(url);
17
+ const formatStr = format ? ` format('${format}')` : "";
18
+ return `
19
+ font-family: '${name}';
20
+ font-style: normal;${weight ? `
21
+ font-weight: ${weight};` : ""}${options.fontStretch ? `
22
+ font-stretch: ${options.fontStretch};` : ""}${options.fontDisplay ? `
23
+ font-display: ${options.fontDisplay};` : ""}
24
+ src: url('${url}')${formatStr};`;
25
+ };
26
+ const setCustomFontMedia = (name, url, weight, options) => `@font-face {${setCustomFont(name, url, weight, options)}
27
+ }`;
28
+ const getFontFaceEach = (name, weights) => {
29
+ const keys = Object.keys(weights);
30
+ return keys.map((key) => {
31
+ const { url, fontWeight } = weights[key];
32
+ return setCustomFont(name, url, fontWeight);
33
+ });
34
+ };
35
+ const getFontFace = (LIBRARY) => {
36
+ const keys = Object.keys(LIBRARY);
37
+ return keys.map((key) => getFontFaceEach(key, LIBRARY[key].value));
38
+ };
39
+ const getFontFaceEachString = (name, weights) => {
40
+ if (weights && weights.isVariable) {
41
+ if (isGoogleFontsUrl(weights.url)) {
42
+ return setFontImport(weights.url);
43
+ }
44
+ return setCustomFontMedia(name, weights.url, weights.fontWeight, {
45
+ fontStretch: weights.fontStretch,
46
+ fontDisplay: weights.fontDisplay || "swap"
47
+ });
48
+ }
49
+ const isArr = weights[0];
50
+ if (isArr) return getFontFaceEach(name, weights).map(setInCustomFontMedia);
51
+ return setCustomFontMedia(name, weights.url);
52
+ };
53
+ const getFontFaceString = (LIBRARY) => {
54
+ const keys = Object.keys(LIBRARY);
55
+ return keys.map((key) => getFontFaceEachString(key, LIBRARY[key].value));
56
+ };
57
+ export {
58
+ getDefaultOrFirstKey,
59
+ getFontFace,
60
+ getFontFaceEach,
61
+ getFontFaceEachString,
62
+ getFontFaceString,
63
+ getFontFormat,
64
+ isGoogleFontsUrl,
65
+ setCustomFont,
66
+ setCustomFontMedia,
67
+ setFontImport,
68
+ setInCustomFontMedia
69
+ };
@@ -0,0 +1,7 @@
1
+ export * from "./unit.js";
2
+ export * from "./color.js";
3
+ export * from "./theme.js";
4
+ export * from "./font.js";
5
+ export * from "./sequence.js";
6
+ export * from "./var.js";
7
+ export * from "./sprite.js";