chaincss 1.13.3 → 2.0.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.
- package/CHANGELOG.md +81 -0
- package/LICENSE +2 -3
- package/README.md +238 -105
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/compile.d.ts +3 -0
- package/dist/cli/commands/compile.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +5 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/timeline.d.ts +2 -0
- package/dist/cli/commands/timeline.d.ts.map +1 -0
- package/dist/cli/commands/watch.d.ts +6 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +5960 -0
- package/dist/cli/types.d.ts +51 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/utils/config-loader.d.ts +8 -0
- package/dist/cli/utils/config-loader.d.ts.map +1 -0
- package/dist/cli/utils/file-utils.d.ts +9 -0
- package/dist/cli/utils/file-utils.d.ts.map +1 -0
- package/dist/cli/utils/logger.d.ts +17 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/compiler/atomic-optimizer.d.ts +76 -0
- package/dist/compiler/atomic-optimizer.d.ts.map +1 -0
- package/dist/compiler/btt.d.ts +138 -0
- package/dist/compiler/btt.d.ts.map +1 -0
- package/dist/compiler/cache-manager.d.ts +20 -0
- package/dist/compiler/cache-manager.d.ts.map +1 -0
- package/dist/compiler/commonProps.d.ts +2 -0
- package/dist/compiler/commonProps.d.ts.map +1 -0
- package/dist/compiler/index.d.ts +12 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +5177 -0
- package/dist/compiler/prefixer.d.ts +42 -0
- package/dist/compiler/prefixer.d.ts.map +1 -0
- package/dist/compiler/theme-contract.d.ts +61 -0
- package/dist/compiler/theme-contract.d.ts.map +1 -0
- package/dist/compiler/tokens.d.ts +52 -0
- package/dist/compiler/tokens.d.ts.map +1 -0
- package/dist/compiler/types.d.ts +57 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/core/compiler.d.ts +32 -0
- package/dist/core/compiler.d.ts.map +1 -0
- package/dist/core/constants.d.ts +129 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/types.d.ts +88 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/utils.d.ts +37 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5667 -0
- package/dist/plugins/vite.d.ts +11 -0
- package/dist/plugins/vite.d.ts.map +1 -0
- package/dist/plugins/vite.js +25839 -0
- package/dist/plugins/webpack.d.ts +45 -0
- package/dist/plugins/webpack.d.ts.map +1 -0
- package/dist/plugins/webpack.js +107 -0
- package/dist/runtime/hmr.d.ts +3 -0
- package/dist/runtime/hmr.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +15 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +552 -0
- package/dist/runtime/injector.d.ts +85 -0
- package/dist/runtime/injector.d.ts.map +1 -0
- package/dist/runtime/react.d.ts +54 -0
- package/dist/runtime/react.d.ts.map +1 -0
- package/dist/runtime/react.js +270 -0
- package/dist/runtime/types.d.ts +45 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/utils.d.ts +62 -0
- package/dist/runtime/utils.d.ts.map +1 -0
- package/dist/runtime/vue.d.ts +52 -0
- package/dist/runtime/vue.d.ts.map +1 -0
- package/dist/runtime/vue.js +232 -0
- package/package.json +90 -119
- package/browser/commonProps.js +0 -14
- package/browser/index.js +0 -3
- package/browser/react-hooks.js +0 -162
- package/browser/rtt.js +0 -400
- package/browser/vue-composables.js +0 -200
- package/node/atomic-optimizer.js +0 -526
- package/node/btt.js +0 -1009
- package/node/cache-manager.js +0 -56
- package/node/chaincss.js +0 -642
- package/node/index.js +0 -2
- package/node/loaders/chaincss-loader.js +0 -62
- package/node/plugins/next-plugin.js +0 -120
- package/node/plugins/vite-plugin.js +0 -383
- package/node/plugins/webpack-plugin.js +0 -41
- package/node/prefixer.js +0 -237
- package/node/strVal.js +0 -92
- package/node/theme-validator.js +0 -32
- package/shared/theme-contract.js +0 -98
- package/shared/tokens.cjs +0 -256
- package/shared/tokens.mjs +0 -320
- package/types.d.ts +0 -325
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
// src/runtime/injector.ts
|
|
2
|
+
var StyleInjector = class {
|
|
3
|
+
styleElement = null;
|
|
4
|
+
stylesCache = /* @__PURE__ */ new Map();
|
|
5
|
+
injectedStyles = /* @__PURE__ */ new Set();
|
|
6
|
+
constructor() {
|
|
7
|
+
this.initStyleElement();
|
|
8
|
+
}
|
|
9
|
+
initStyleElement() {
|
|
10
|
+
if (typeof document === "undefined")
|
|
11
|
+
return;
|
|
12
|
+
const existing = document.getElementById("chaincss-runtime-styles");
|
|
13
|
+
if (existing) {
|
|
14
|
+
this.styleElement = existing;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const style = document.createElement("style");
|
|
18
|
+
style.id = "chaincss-runtime-styles";
|
|
19
|
+
style.setAttribute("data-chaincss", "runtime");
|
|
20
|
+
document.head.appendChild(style);
|
|
21
|
+
this.styleElement = style;
|
|
22
|
+
}
|
|
23
|
+
generateClassName(styleId) {
|
|
24
|
+
let hash = 0;
|
|
25
|
+
for (let i = 0; i < styleId.length; i++) {
|
|
26
|
+
hash = (hash << 5) - hash + styleId.charCodeAt(i);
|
|
27
|
+
hash |= 0;
|
|
28
|
+
}
|
|
29
|
+
return `c_${Math.abs(hash).toString(36)}`;
|
|
30
|
+
}
|
|
31
|
+
generateCSS(style, className) {
|
|
32
|
+
let css = "";
|
|
33
|
+
const selector = `.${className}`;
|
|
34
|
+
let normalStyles = "";
|
|
35
|
+
for (const [key, value] of Object.entries(style)) {
|
|
36
|
+
if (key === "selectors" || key === "hover")
|
|
37
|
+
continue;
|
|
38
|
+
const kebabKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
39
|
+
normalStyles += ` ${kebabKey}: ${value};
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
if (normalStyles) {
|
|
43
|
+
css += `${selector} {
|
|
44
|
+
${normalStyles}}
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
if (style.hover && typeof style.hover === "object") {
|
|
48
|
+
let hoverStyles = "";
|
|
49
|
+
for (const [key, value] of Object.entries(style.hover)) {
|
|
50
|
+
const kebabKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
51
|
+
hoverStyles += ` ${kebabKey}: ${value};
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
if (hoverStyles) {
|
|
55
|
+
css += `${selector}:hover {
|
|
56
|
+
${hoverStyles}}
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return css;
|
|
61
|
+
}
|
|
62
|
+
inject(styleId, style) {
|
|
63
|
+
if (this.stylesCache.has(styleId)) {
|
|
64
|
+
return this.stylesCache.get(styleId);
|
|
65
|
+
}
|
|
66
|
+
const className = this.generateClassName(styleId);
|
|
67
|
+
const css = this.generateCSS(style, className);
|
|
68
|
+
this.stylesCache.set(styleId, className);
|
|
69
|
+
if (!this.injectedStyles.has(styleId) && this.styleElement && css) {
|
|
70
|
+
this.styleElement.textContent += css;
|
|
71
|
+
this.injectedStyles.add(styleId);
|
|
72
|
+
}
|
|
73
|
+
return className;
|
|
74
|
+
}
|
|
75
|
+
injectMultiple(styles) {
|
|
76
|
+
const result = {};
|
|
77
|
+
let allCSS = "";
|
|
78
|
+
for (const [styleId, style] of Object.entries(styles)) {
|
|
79
|
+
if (this.stylesCache.has(styleId)) {
|
|
80
|
+
result[styleId] = this.stylesCache.get(styleId);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const className = this.generateClassName(styleId);
|
|
84
|
+
const css = this.generateCSS(style, className);
|
|
85
|
+
this.stylesCache.set(styleId, className);
|
|
86
|
+
result[styleId] = className;
|
|
87
|
+
allCSS += css;
|
|
88
|
+
}
|
|
89
|
+
if (allCSS && this.styleElement) {
|
|
90
|
+
this.styleElement.textContent += allCSS;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
update(styleId, style) {
|
|
95
|
+
this.injectedStyles.delete(styleId);
|
|
96
|
+
const className = this.generateClassName(styleId);
|
|
97
|
+
const css = this.generateCSS(style, className);
|
|
98
|
+
this.stylesCache.set(styleId, className);
|
|
99
|
+
if (this.styleElement) {
|
|
100
|
+
let allCSS = "";
|
|
101
|
+
for (const [id, className2] of this.stylesCache) {
|
|
102
|
+
}
|
|
103
|
+
this.styleElement.textContent = allCSS;
|
|
104
|
+
this.injectedStyles.add(styleId);
|
|
105
|
+
}
|
|
106
|
+
return className;
|
|
107
|
+
}
|
|
108
|
+
remove(styleId) {
|
|
109
|
+
this.injectedStyles.delete(styleId);
|
|
110
|
+
this.stylesCache.delete(styleId);
|
|
111
|
+
if (this.styleElement) {
|
|
112
|
+
let allCSS = "";
|
|
113
|
+
for (const [id, className] of this.stylesCache) {
|
|
114
|
+
}
|
|
115
|
+
this.styleElement.textContent = allCSS;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
getStyleElement() {
|
|
119
|
+
return this.styleElement;
|
|
120
|
+
}
|
|
121
|
+
clear() {
|
|
122
|
+
this.stylesCache.clear();
|
|
123
|
+
this.injectedStyles.clear();
|
|
124
|
+
if (this.styleElement) {
|
|
125
|
+
this.styleElement.textContent = "";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
var styleInjector = new StyleInjector();
|
|
130
|
+
function chainRuntime(useTokens = true) {
|
|
131
|
+
const catcher = {};
|
|
132
|
+
const handler = {
|
|
133
|
+
get: (target, prop) => {
|
|
134
|
+
if (prop === "$el") {
|
|
135
|
+
return (...selectors) => {
|
|
136
|
+
if (selectors.length === 0) {
|
|
137
|
+
const result2 = { ...catcher };
|
|
138
|
+
Object.keys(catcher).forEach((key) => delete catcher[key]);
|
|
139
|
+
return result2;
|
|
140
|
+
}
|
|
141
|
+
const result = {
|
|
142
|
+
selectors,
|
|
143
|
+
...catcher
|
|
144
|
+
};
|
|
145
|
+
Object.keys(catcher).forEach((key) => delete catcher[key]);
|
|
146
|
+
return result;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (prop === "hover") {
|
|
150
|
+
return () => {
|
|
151
|
+
const hoverCatcher = {};
|
|
152
|
+
const hoverHandler = {
|
|
153
|
+
get: (_, hoverProp) => {
|
|
154
|
+
if (hoverProp === "end") {
|
|
155
|
+
return () => {
|
|
156
|
+
catcher.hover = { ...hoverCatcher };
|
|
157
|
+
Object.keys(hoverCatcher).forEach((key) => delete hoverCatcher[key]);
|
|
158
|
+
return proxy;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return (value) => {
|
|
162
|
+
hoverCatcher[hoverProp] = value;
|
|
163
|
+
return hoverProxy;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
const hoverProxy = new Proxy({}, hoverHandler);
|
|
168
|
+
return hoverProxy;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (prop === "end") {
|
|
172
|
+
return () => proxy;
|
|
173
|
+
}
|
|
174
|
+
return (value) => {
|
|
175
|
+
catcher[prop] = value;
|
|
176
|
+
return proxy;
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const proxy = new Proxy({}, handler);
|
|
181
|
+
return proxy;
|
|
182
|
+
}
|
|
183
|
+
function compileRuntime(styles) {
|
|
184
|
+
return styleInjector.injectMultiple(styles);
|
|
185
|
+
}
|
|
186
|
+
function runRuntime(...styles) {
|
|
187
|
+
let css = "";
|
|
188
|
+
for (const style of styles) {
|
|
189
|
+
if (style.selectors) {
|
|
190
|
+
let normalStyles = "";
|
|
191
|
+
let hoverStyles = "";
|
|
192
|
+
for (const [key, value] of Object.entries(style)) {
|
|
193
|
+
if (key === "selectors")
|
|
194
|
+
continue;
|
|
195
|
+
if (key === "hover" && typeof value === "object") {
|
|
196
|
+
hoverStyles = `${style.selectors.join(", ")}:hover {
|
|
197
|
+
`;
|
|
198
|
+
for (const [hoverKey, hoverValue] of Object.entries(value)) {
|
|
199
|
+
const kebabKey = hoverKey.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
200
|
+
hoverStyles += ` ${kebabKey}: ${hoverValue};
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
203
|
+
hoverStyles += `}
|
|
204
|
+
`;
|
|
205
|
+
} else {
|
|
206
|
+
const kebabKey = key.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
207
|
+
normalStyles += ` ${kebabKey}: ${value};
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (normalStyles) {
|
|
212
|
+
css += `${style.selectors.join(", ")} {
|
|
213
|
+
${normalStyles}}
|
|
214
|
+
`;
|
|
215
|
+
}
|
|
216
|
+
if (hoverStyles) {
|
|
217
|
+
css += hoverStyles;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (css && styleInjector.getStyleElement()) {
|
|
222
|
+
styleInjector.getStyleElement().textContent += css;
|
|
223
|
+
}
|
|
224
|
+
return css;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// src/runtime/react.tsx
|
|
228
|
+
import React, { useMemo, useEffect, useRef, useState } from "react";
|
|
229
|
+
import { jsx } from "react/jsx-runtime";
|
|
230
|
+
var styleCache = /* @__PURE__ */ new Map();
|
|
231
|
+
function useChainStyles(styles, deps = [], options = {}) {
|
|
232
|
+
const { cache = true, namespace = "chain", watch: watch2 = false } = options;
|
|
233
|
+
const id = useRef(`chain-${Math.random().toString(36).substr(2, 9)}`);
|
|
234
|
+
const [classNames, setClassNames] = useState({});
|
|
235
|
+
const processed = useMemo(() => {
|
|
236
|
+
const resolvedStyles = typeof styles === "function" ? styles() : styles;
|
|
237
|
+
if (!resolvedStyles || Object.keys(resolvedStyles).length === 0) {
|
|
238
|
+
return { classNames: {}, css: "" };
|
|
239
|
+
}
|
|
240
|
+
const cacheKey = JSON.stringify(resolvedStyles);
|
|
241
|
+
if (cache && styleCache.has(cacheKey)) {
|
|
242
|
+
return { classNames: styleCache.get(cacheKey), css: "" };
|
|
243
|
+
}
|
|
244
|
+
const compiledStyles = {};
|
|
245
|
+
const newClassNames = {};
|
|
246
|
+
for (const [key, styleDef] of Object.entries(resolvedStyles)) {
|
|
247
|
+
const className = `${namespace}-${key}-${id.current}`;
|
|
248
|
+
const styleObj = typeof styleDef === "function" ? styleDef() : styleDef;
|
|
249
|
+
newClassNames[key] = className;
|
|
250
|
+
compiledStyles[`${key}_${id.current}`] = {
|
|
251
|
+
selectors: [`.${className}`],
|
|
252
|
+
...styleObj
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const result = compileRuntime(compiledStyles);
|
|
256
|
+
if (cache) {
|
|
257
|
+
styleCache.set(cacheKey, result);
|
|
258
|
+
}
|
|
259
|
+
return { classNames: result, css: "" };
|
|
260
|
+
}, [styles, namespace, id.current, ...deps]);
|
|
261
|
+
useEffect(() => {
|
|
262
|
+
setClassNames(processed.classNames);
|
|
263
|
+
return () => {
|
|
264
|
+
if (!watch2) {
|
|
265
|
+
for (const key of Object.keys(processed.classNames)) {
|
|
266
|
+
styleInjector.remove(`${namespace}-${key}-${id.current}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}, [processed.classNames, watch2]);
|
|
271
|
+
return classNames;
|
|
272
|
+
}
|
|
273
|
+
function useDynamicChainStyles(styleFactory, deps = [], options) {
|
|
274
|
+
const styles = useMemo(() => styleFactory(), deps);
|
|
275
|
+
return useChainStyles(styles, deps, options);
|
|
276
|
+
}
|
|
277
|
+
function useThemeChainStyles(styles, theme, options) {
|
|
278
|
+
const themedStyles = useMemo(() => {
|
|
279
|
+
if (typeof styles === "function")
|
|
280
|
+
return styles(theme);
|
|
281
|
+
return styles;
|
|
282
|
+
}, [styles, theme]);
|
|
283
|
+
return useChainStyles(themedStyles, [], options);
|
|
284
|
+
}
|
|
285
|
+
function ChainCSSGlobal({ styles }) {
|
|
286
|
+
useChainStyles(styles, [], { watch: true });
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
function cx(...classes) {
|
|
290
|
+
return classes.filter(Boolean).join(" ");
|
|
291
|
+
}
|
|
292
|
+
var debugEnabled = false;
|
|
293
|
+
function enableChainCSSDebug() {
|
|
294
|
+
if (typeof window !== "undefined") {
|
|
295
|
+
debugEnabled = true;
|
|
296
|
+
window.__CHAINCSS_DEBUG__ = true;
|
|
297
|
+
console.log("\u{1F50D} ChainCSS Debug Mode Enabled");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function disableChainCSSDebug() {
|
|
301
|
+
if (typeof window !== "undefined") {
|
|
302
|
+
debugEnabled = false;
|
|
303
|
+
window.__CHAINCSS_DEBUG__ = false;
|
|
304
|
+
console.log("\u{1F50D} ChainCSS Debug Mode Disabled");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function isDebugEnabled() {
|
|
308
|
+
return debugEnabled || typeof window !== "undefined" && window.__CHAINCSS_DEBUG__;
|
|
309
|
+
}
|
|
310
|
+
function withChainStyles(styles, options) {
|
|
311
|
+
return function WrappedComponent(props) {
|
|
312
|
+
const classNames = useChainStyles(
|
|
313
|
+
typeof styles === "function" ? styles(props) : styles,
|
|
314
|
+
[],
|
|
315
|
+
// ← Add empty deps array
|
|
316
|
+
options
|
|
317
|
+
);
|
|
318
|
+
const Component = props.component || props.wrappedComponent;
|
|
319
|
+
return /* @__PURE__ */ jsx(Component, { ...props, chainStyles: classNames });
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
function createStyledComponent(elementType, styles, options) {
|
|
323
|
+
const StyledComponent = (props) => {
|
|
324
|
+
const { className: additionalClassName, ...rest } = props;
|
|
325
|
+
const classNames = useChainStyles(styles, [], options);
|
|
326
|
+
const combinedClassName = [classNames.root, additionalClassName].filter(Boolean).join(" ");
|
|
327
|
+
return React.createElement(elementType, {
|
|
328
|
+
...rest,
|
|
329
|
+
className: combinedClassName
|
|
330
|
+
});
|
|
331
|
+
};
|
|
332
|
+
const displayName = typeof elementType === "string" ? elementType : elementType.displayName || "Component";
|
|
333
|
+
StyledComponent.displayName = `ChainCSS.${displayName}`;
|
|
334
|
+
return StyledComponent;
|
|
335
|
+
}
|
|
336
|
+
function useComputedStyles(styles, props, deps = [], options) {
|
|
337
|
+
const computedStyles = useMemo(() => styles(props), [props, ...deps]);
|
|
338
|
+
return useChainStyles(computedStyles, deps, options);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// src/runtime/vue.ts
|
|
342
|
+
import { ref, computed, inject, provide, h } from "vue";
|
|
343
|
+
var CHAIN_CSS_KEY = Symbol("chaincss");
|
|
344
|
+
function useAtomicClasses(styles, options = {}) {
|
|
345
|
+
const { atomic = true, global = false } = options;
|
|
346
|
+
const id = `chain-${Math.random().toString(36).substr(2, 9)}`;
|
|
347
|
+
const classes = computed(() => {
|
|
348
|
+
const resolvedStyles = typeof styles === "function" ? styles() : styles?.value || styles;
|
|
349
|
+
if (!resolvedStyles)
|
|
350
|
+
return {};
|
|
351
|
+
const compiledStyles = {};
|
|
352
|
+
const classNames = {};
|
|
353
|
+
for (const [key, styleDef] of Object.entries(resolvedStyles)) {
|
|
354
|
+
const className = `${key}-${id}`;
|
|
355
|
+
const styleObj = typeof styleDef === "function" ? styleDef() : styleDef;
|
|
356
|
+
classNames[key] = className;
|
|
357
|
+
compiledStyles[`${key}_${id}`] = {
|
|
358
|
+
selectors: [`.${className}`],
|
|
359
|
+
...styleObj
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return compileRuntime(compiledStyles);
|
|
363
|
+
});
|
|
364
|
+
return {
|
|
365
|
+
classes,
|
|
366
|
+
cx: (name) => classes.value[name],
|
|
367
|
+
cn: (...names) => names.map((name) => classes.value[name]).filter(Boolean).join(" ")
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
var ChainCSSGlobal2 = {
|
|
371
|
+
name: "ChainCSSGlobal",
|
|
372
|
+
props: {
|
|
373
|
+
styles: {
|
|
374
|
+
type: Object,
|
|
375
|
+
required: true
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
setup(props) {
|
|
379
|
+
useAtomicClasses(props.styles);
|
|
380
|
+
return () => null;
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
function createStyledComponent2(styles, tag = "div") {
|
|
384
|
+
return {
|
|
385
|
+
name: "ChainCSSStyledComponent",
|
|
386
|
+
props: {
|
|
387
|
+
className: { type: String, default: "" }
|
|
388
|
+
},
|
|
389
|
+
setup(props, { slots, attrs }) {
|
|
390
|
+
const resolvedStyles = typeof styles === "function" ? styles() : styles;
|
|
391
|
+
const { classes } = useAtomicClasses({ root: resolvedStyles });
|
|
392
|
+
const combinedClass = computed(() => {
|
|
393
|
+
const rootClass = classes.value?.root || "";
|
|
394
|
+
return [rootClass, props.className].filter(Boolean).join(" ");
|
|
395
|
+
});
|
|
396
|
+
return () => {
|
|
397
|
+
return h(tag, {
|
|
398
|
+
class: combinedClass.value,
|
|
399
|
+
...attrs
|
|
400
|
+
}, slots.default?.());
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function createStyledComponents(components) {
|
|
406
|
+
const result = {};
|
|
407
|
+
for (const [name, config] of Object.entries(components)) {
|
|
408
|
+
const { element = "div", styles } = config;
|
|
409
|
+
result[name] = createStyledComponent2(styles, element);
|
|
410
|
+
}
|
|
411
|
+
return result;
|
|
412
|
+
}
|
|
413
|
+
function useComputedStyles2(styles, props) {
|
|
414
|
+
const computedStyles = computed(() => ({ root: styles(props) }));
|
|
415
|
+
const { classes } = useAtomicClasses(computedStyles);
|
|
416
|
+
return {
|
|
417
|
+
classes,
|
|
418
|
+
rootClass: computed(() => classes.value?.root || "")
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
function provideStyleContext(theme) {
|
|
422
|
+
const themeRef = ref(theme);
|
|
423
|
+
provide(CHAIN_CSS_KEY, themeRef);
|
|
424
|
+
return themeRef;
|
|
425
|
+
}
|
|
426
|
+
function injectStyleContext() {
|
|
427
|
+
return inject(CHAIN_CSS_KEY, ref({}));
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// src/runtime/hmr.ts
|
|
431
|
+
function setupHMR() {
|
|
432
|
+
if (typeof window === "undefined")
|
|
433
|
+
return;
|
|
434
|
+
if (import.meta.hot) {
|
|
435
|
+
import.meta.hot.on("chaincss:update", (payload) => {
|
|
436
|
+
console.log(`[HMR] Updating styles for ${payload.file}`);
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
function registerForHMR(moduleId, styles) {
|
|
441
|
+
if (typeof window === "undefined")
|
|
442
|
+
return;
|
|
443
|
+
if (import.meta.hot) {
|
|
444
|
+
import.meta.hot.accept((newModule) => {
|
|
445
|
+
console.log(`[HMR] Accepting update for ${moduleId}`);
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// src/runtime/utils.ts
|
|
451
|
+
function generateStyleId(prefix = "chain") {
|
|
452
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
453
|
+
const timestamp = Date.now().toString(36);
|
|
454
|
+
return `${prefix}-${timestamp}-${random}`;
|
|
455
|
+
}
|
|
456
|
+
function hashString(str) {
|
|
457
|
+
let hash = 0;
|
|
458
|
+
for (let i = 0; i < str.length; i++) {
|
|
459
|
+
hash = (hash << 5) - hash + str.charCodeAt(i);
|
|
460
|
+
hash |= 0;
|
|
461
|
+
}
|
|
462
|
+
return Math.abs(hash).toString(36);
|
|
463
|
+
}
|
|
464
|
+
function kebabCase(str) {
|
|
465
|
+
return str.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
466
|
+
}
|
|
467
|
+
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
468
|
+
var isDevelopment = true;
|
|
469
|
+
var isProduction = false;
|
|
470
|
+
function debounce(fn, delay) {
|
|
471
|
+
let timeoutId;
|
|
472
|
+
return (...args) => {
|
|
473
|
+
clearTimeout(timeoutId);
|
|
474
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
function memoize(fn) {
|
|
478
|
+
const cache = /* @__PURE__ */ new Map();
|
|
479
|
+
const memoized = (...args) => {
|
|
480
|
+
const key = JSON.stringify(args);
|
|
481
|
+
if (cache.has(key)) {
|
|
482
|
+
return cache.get(key);
|
|
483
|
+
}
|
|
484
|
+
const result = fn(...args);
|
|
485
|
+
cache.set(key, result);
|
|
486
|
+
return result;
|
|
487
|
+
};
|
|
488
|
+
memoized.cache = cache;
|
|
489
|
+
return memoized;
|
|
490
|
+
}
|
|
491
|
+
function cn(...classes) {
|
|
492
|
+
return classes.filter(Boolean).join(" ");
|
|
493
|
+
}
|
|
494
|
+
function devWarn(message, ...args) {
|
|
495
|
+
if (isDevelopment) {
|
|
496
|
+
console.warn(`[ChainCSS] ${message}`, ...args);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
function devLog(message, ...args) {
|
|
500
|
+
if (isDevelopment) {
|
|
501
|
+
console.log(`[ChainCSS] ${message}`, ...args);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
function logError(message, error) {
|
|
505
|
+
console.error(`[ChainCSS] ${message}`, error || "");
|
|
506
|
+
}
|
|
507
|
+
function createDebugger(module) {
|
|
508
|
+
return {
|
|
509
|
+
log: (...args) => devLog(`[${module}]`, ...args),
|
|
510
|
+
warn: (...args) => devWarn(`[${module}]`, ...args),
|
|
511
|
+
error: (...args) => logError(`[${module}]`, ...args)
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
export {
|
|
515
|
+
chainRuntime as $,
|
|
516
|
+
ChainCSSGlobal,
|
|
517
|
+
ChainCSSGlobal2 as ChainCSSGlobalVue,
|
|
518
|
+
cn as cnUtils,
|
|
519
|
+
compileRuntime as compile,
|
|
520
|
+
createDebugger,
|
|
521
|
+
createStyledComponent,
|
|
522
|
+
createStyledComponent2 as createStyledVueComponent,
|
|
523
|
+
createStyledComponents as createStyledVueComponents,
|
|
524
|
+
cx,
|
|
525
|
+
debounce,
|
|
526
|
+
devLog,
|
|
527
|
+
devWarn,
|
|
528
|
+
disableChainCSSDebug,
|
|
529
|
+
enableChainCSSDebug,
|
|
530
|
+
generateStyleId,
|
|
531
|
+
hashString,
|
|
532
|
+
injectStyleContext,
|
|
533
|
+
isBrowser,
|
|
534
|
+
isDebugEnabled,
|
|
535
|
+
isDevelopment,
|
|
536
|
+
isProduction,
|
|
537
|
+
kebabCase,
|
|
538
|
+
logError,
|
|
539
|
+
memoize,
|
|
540
|
+
provideStyleContext,
|
|
541
|
+
registerForHMR,
|
|
542
|
+
runRuntime as run,
|
|
543
|
+
setupHMR,
|
|
544
|
+
styleInjector,
|
|
545
|
+
useAtomicClasses,
|
|
546
|
+
useChainStyles,
|
|
547
|
+
useComputedStyles,
|
|
548
|
+
useComputedStyles2 as useComputedStylesVue,
|
|
549
|
+
useDynamicChainStyles,
|
|
550
|
+
useThemeChainStyles,
|
|
551
|
+
withChainStyles
|
|
552
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChainCSS Runtime Style Injector
|
|
3
|
+
* This is the core 3.2KB runtime that users opt into
|
|
4
|
+
*/
|
|
5
|
+
export interface StyleDefinition {
|
|
6
|
+
selectors: string[];
|
|
7
|
+
hover?: Record<string, string | number>;
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}
|
|
10
|
+
export interface CompiledStyle {
|
|
11
|
+
className: string;
|
|
12
|
+
css: string;
|
|
13
|
+
}
|
|
14
|
+
declare class StyleInjector {
|
|
15
|
+
private styleElement;
|
|
16
|
+
private stylesCache;
|
|
17
|
+
private injectedStyles;
|
|
18
|
+
constructor();
|
|
19
|
+
private initStyleElement;
|
|
20
|
+
private generateClassName;
|
|
21
|
+
private generateCSS;
|
|
22
|
+
inject(styleId: string, style: StyleDefinition): string;
|
|
23
|
+
injectMultiple(styles: Record<string, StyleDefinition>): Record<string, string>;
|
|
24
|
+
update(styleId: string, style: StyleDefinition): string;
|
|
25
|
+
remove(styleId: string): void;
|
|
26
|
+
getStyleElement(): HTMLStyleElement | null;
|
|
27
|
+
clear(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare const styleInjector: StyleInjector;
|
|
30
|
+
export declare function chainRuntime(useTokens?: boolean): {};
|
|
31
|
+
export declare function compileRuntime(styles: Record<string, StyleDefinition>): Record<string, string>;
|
|
32
|
+
export declare function runRuntime(...styles: StyleDefinition[]): string;
|
|
33
|
+
/**
|
|
34
|
+
* Add animation presets to runtime
|
|
35
|
+
*/
|
|
36
|
+
export declare const runtimeAnimations: {
|
|
37
|
+
fadeIn: {
|
|
38
|
+
'0%': {
|
|
39
|
+
opacity: number;
|
|
40
|
+
};
|
|
41
|
+
'100%': {
|
|
42
|
+
opacity: number;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
fadeOut: {
|
|
46
|
+
'0%': {
|
|
47
|
+
opacity: number;
|
|
48
|
+
};
|
|
49
|
+
'100%': {
|
|
50
|
+
opacity: number;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
slideInUp: {
|
|
54
|
+
'0%': {
|
|
55
|
+
transform: string;
|
|
56
|
+
opacity: number;
|
|
57
|
+
};
|
|
58
|
+
'100%': {
|
|
59
|
+
transform: string;
|
|
60
|
+
opacity: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
pulse: {
|
|
64
|
+
'0%, 100%': {
|
|
65
|
+
transform: string;
|
|
66
|
+
};
|
|
67
|
+
'50%': {
|
|
68
|
+
transform: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
spin: {
|
|
72
|
+
'0%': {
|
|
73
|
+
transform: string;
|
|
74
|
+
};
|
|
75
|
+
'100%': {
|
|
76
|
+
transform: string;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Add animation to runtime style
|
|
82
|
+
*/
|
|
83
|
+
export declare function withAnimation(style: Record<string, any>, animationName: keyof typeof runtimeAnimations, duration?: string, timing?: string): Record<string, any>;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../src/runtime/injector.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,cAAc,CAAqB;;IAM3C,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,WAAW;IA+BnB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM;IAqBvD,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAyB/E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM;IAwBvD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAc7B,eAAe,IAAI,gBAAgB,GAAG,IAAI;IAI1C,KAAK,IAAI,IAAI;CAOd;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAGjD,wBAAgB,YAAY,CAAC,SAAS,UAAO,MA0D5C;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE9F;AAGD,wBAAgB,UAAU,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAqC/D;AAID;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,aAAa,EAAE,MAAM,OAAO,iBAAiB,EAC7C,QAAQ,SAAS,EACjB,MAAM,SAAS,GACd,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMrB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface UseChainStylesOptions {
|
|
3
|
+
cache?: boolean;
|
|
4
|
+
namespace?: string;
|
|
5
|
+
watch?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* React hook for ChainCSS runtime styles
|
|
9
|
+
* WARNING: This adds ~3.2KB to your bundle. For production, use build-time compilation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useChainStyles(styles: Record<string, any> | (() => Record<string, any>), deps?: any[], options?: UseChainStylesOptions): Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Dynamic styles hook - re-runs when deps change
|
|
14
|
+
*/
|
|
15
|
+
export declare function useDynamicChainStyles(styleFactory: () => Record<string, any>, deps?: any[], options?: UseChainStylesOptions): Record<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Theme-aware styles hook
|
|
18
|
+
*/
|
|
19
|
+
export declare function useThemeChainStyles(styles: Record<string, any> | ((theme: any) => Record<string, any>), theme: any, options?: UseChainStylesOptions): Record<string, string>;
|
|
20
|
+
/**
|
|
21
|
+
* Global style injection component
|
|
22
|
+
*/
|
|
23
|
+
export declare function ChainCSSGlobal({ styles }: {
|
|
24
|
+
styles: Record<string, any>;
|
|
25
|
+
}): null;
|
|
26
|
+
/**
|
|
27
|
+
* Class name utility (like clsx)
|
|
28
|
+
*/
|
|
29
|
+
export declare function cx(...classes: (string | undefined | null | false)[]): string;
|
|
30
|
+
export declare function enableChainCSSDebug(): void;
|
|
31
|
+
export declare function disableChainCSSDebug(): void;
|
|
32
|
+
export declare function isDebugEnabled(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* HOC for class components
|
|
35
|
+
*/
|
|
36
|
+
export declare function withChainStyles<P extends object>(styles: Record<string, any> | ((props: P) => Record<string, any>), options?: UseChainStylesOptions): (props: P & {
|
|
37
|
+
chainStyles?: Record<string, string>;
|
|
38
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* Create a styled component (React)
|
|
41
|
+
* Similar to .component() in build-time, but for runtime
|
|
42
|
+
*/
|
|
43
|
+
export declare function createStyledComponent<T extends keyof JSX.IntrinsicElements = 'div'>(elementType: T, styles: Record<string, any> | (() => Record<string, any>), options?: UseChainStylesOptions): React.FC<React.ComponentProps<T> & {
|
|
44
|
+
className?: string;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Create multiple styled components at once
|
|
48
|
+
*/
|
|
49
|
+
export declare function createStyledComponents(components: Record<string, any>): Record<string, React.FC>;
|
|
50
|
+
/**
|
|
51
|
+
* CSS-in-JS hook with computed styles
|
|
52
|
+
*/
|
|
53
|
+
export declare function useComputedStyles<T extends Record<string, any>>(styles: (props: T) => Record<string, any>, props: T, deps?: any[], options?: UseChainStylesOptions): Record<string, string>;
|
|
54
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/runtime/react.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAGpE,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACzD,IAAI,GAAE,GAAG,EAAO,EAChB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsDxB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvC,IAAI,GAAE,GAAG,EAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACnE,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,QAGzE;AAED;;GAEG;AACH,wBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,MAAM,CAE5E;AAKD,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACjE,OAAO,CAAC,EAAE,qBAAqB,IAEE,OAAO,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,6CASrF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,iBAAiB,GAAG,KAAK,EACjF,WAAW,EAAE,CAAC,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EACzD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAShG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7D,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE,CAAC,EACR,IAAI,GAAE,GAAG,EAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB"}
|