uraniyum 1.0.8 → 1.0.9
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/dist/index.esm.js +0 -6
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +0 -6
- package/dist/index.js.map +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/tags.d.ts +1 -1
- package/package.json +1 -1
- package/src/tags.ts +52 -57
package/dist/index.esm.js
CHANGED
|
@@ -54,7 +54,6 @@ const tags = new Proxy({}, {
|
|
|
54
54
|
get(_, tag) {
|
|
55
55
|
return (attrsOrChild, ...children) => {
|
|
56
56
|
const el = document.createElement(tag);
|
|
57
|
-
// Handle attributes
|
|
58
57
|
if (attrsOrChild &&
|
|
59
58
|
typeof attrsOrChild === "object" &&
|
|
60
59
|
!(attrsOrChild instanceof Node) &&
|
|
@@ -67,9 +66,7 @@ const tags = new Proxy({}, {
|
|
|
67
66
|
else if (attrsOrChild != null) {
|
|
68
67
|
children.unshift(attrsOrChild);
|
|
69
68
|
}
|
|
70
|
-
// Handle children
|
|
71
69
|
for (let child of children.flat()) {
|
|
72
|
-
// Reactive function child
|
|
73
70
|
if (typeof child === "function") {
|
|
74
71
|
let node = document.createTextNode("");
|
|
75
72
|
el.appendChild(node);
|
|
@@ -83,7 +80,6 @@ const tags = new Proxy({}, {
|
|
|
83
80
|
});
|
|
84
81
|
continue;
|
|
85
82
|
}
|
|
86
|
-
// Reactive state child
|
|
87
83
|
if (isState(child)) {
|
|
88
84
|
const node = document.createTextNode(String(child.val));
|
|
89
85
|
el.appendChild(node);
|
|
@@ -92,12 +88,10 @@ const tags = new Proxy({}, {
|
|
|
92
88
|
});
|
|
93
89
|
continue;
|
|
94
90
|
}
|
|
95
|
-
// DOM Node
|
|
96
91
|
if (child instanceof Node) {
|
|
97
92
|
el.appendChild(child);
|
|
98
93
|
continue;
|
|
99
94
|
}
|
|
100
|
-
// Text fallback
|
|
101
95
|
el.appendChild(document.createTextNode(String(child)));
|
|
102
96
|
}
|
|
103
97
|
return el;
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts","../src/styles.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags = new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n // Handle attributes\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n // Handle children\r\n for (let child of children.flat()) {\r\n\r\n // Reactive function child\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // Reactive state child\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // DOM Node\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n // Text fallback\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n});\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts","../src/styles.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags: Record<string, (attrs?: any, ...children: any[]) => HTMLElement> =\r\n new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n for (let child of children.flat()) {\r\n\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n });\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}"],"names":[],"mappings":"AAWA,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,SAAS,KAAK,CAAI,EAAY,EAAA;IAC1B,IAAI,aAAa,EAAE;AACf,QAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC3B,QAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAC9B;AACL,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAA;AAC3B,IAAA,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AAAE,QAAA,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnD,IAAA,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAEK,SAAU,KAAK,CAAI,CAAI,EAAA;AACzB,IAAA,MAAM,EAAE,GAAG;QACP,IAAI,EAAE,IAAI,GAAG,EAAyB;AAEtC,QAAA,IAAI,GAAG,GAAA;YACH,KAAK,CAAC,EAAE,CAAC,CAAC;AACV,YAAA,OAAO,CAAC,CAAC;SACZ;QAED,IAAI,GAAG,CAAC,EAAK,EAAA;YACT,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO;YACrB,CAAC,GAAG,EAAE,CAAC;AACP,YAAA,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;AACjC,gBAAA,EAAmB,EAAE,CAAC;aAC1B;SACJ;KACQ,CAAC;AAEd,IAAA,OAAO,EAAE,CAAC;AACd,CAAC;AAEK,SAAU,MAAM,CAAC,EAAc,EAAA;AACjC,IAAA,MAAM,MAAM,IAAI,MAAK;QACjB,OAAO,CAAC,MAAM,CAAC,CAAC;QAChB,aAAa,GAAG,MAAM,CAAC;AAEvB,QAAA,IAAI;AACA,YAAA,EAAE,EAAE,CAAC;SACR;gBAAS;YACN,aAAa,GAAG,IAAI,CAAC;SACxB;AACL,KAAC,CAAW,CAAC;AAEb,IAAA,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,OAAO,MAAM,CAAC;AAClB;;AC3DA,SAAS,OAAO,CAAC,CAAM,EAAA;AACnB,IAAA,QACI,CAAC;QACD,OAAO,CAAC,KAAK,QAAQ;AACrB,QAAA,MAAM,IAAI,CAAC;AACX,QAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAChD;AACN,CAAC;MAEY,IAAI,GACb,IAAI,KAAK,CAAC,EAAE,EAAE;IACV,GAAG,CAAC,CAAC,EAAE,GAAW,EAAA;AACd,QAAA,OAAO,CAAC,YAAkB,EAAE,GAAG,QAAe,KAAI;YAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAEvC,YAAA,IACI,YAAY;gBACZ,OAAO,YAAY,KAAK,QAAQ;AAChC,gBAAA,EAAE,YAAY,YAAY,IAAI,CAAC;gBAC/B,CAAC,OAAO,CAAC,YAAY,CAAC;AACtB,gBAAA,OAAO,YAAY,KAAK,UAAU,EACpC;AACE,gBAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAC/C,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC;aACJ;AAAM,iBAAA,IAAI,YAAY,IAAI,IAAI,EAAE;AAC7B,gBAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aAClC;YAED,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;AAE/B,gBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;oBAC7B,IAAI,IAAI,GAAS,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AAC7C,oBAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAErB,MAAM,CAAC,MAAK;AACR,wBAAA,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC;AAEtB,wBAAA,MAAM,OAAO,GACT,KAAK,YAAY,IAAI;AACjB,8BAAE,KAAK;AACP,8BAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;wBAEvD,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC7C,IAAI,GAAG,OAAO,CAAC;AACnB,qBAAC,CAAC,CAAC;oBAEH,SAAS;iBACZ;AAED,gBAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAChB,oBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,oBAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAErB,oBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;wBAChB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzC,qBAAC,CAAC,CAAC;oBAEH,SAAS;iBACZ;AAED,gBAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACvB,oBAAA,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtB,SAAS;iBACZ;AAED,gBAAA,EAAE,CAAC,WAAW,CACV,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACzC,CAAC;aACL;AAED,YAAA,OAAO,EAAE,CAAC;AACd,SAAC,CAAC;KACL;AACJ,CAAA;;AC1EC,SAAU,MAAM,CAAC,MAAoC,EAAA;IAOvD,MAAM,aAAa,GAAmB,EAAE,CAAC;AAEzC,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;QACvB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI;AACf,aAAA,OAAO,CAAC,YAAY,EAAE,KAAK,IAAG;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,OAAO,UAAU,CAAC;AACtB,SAAC,CAAC;AACD,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE1B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAI,CAAA,EAAA,OAAO,CAAG,CAAA,CAAA,CAAC,CAAC;AACzC,QAAA,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC9D;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAkB;AAClC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAEtC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEhC,IAAI,KAAK,EAAE;gBACP,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAE1C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;oBACpB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,iBAAC,CAAC,CAAC;AAEH,gBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;aAC1B;SACJ;QAED,IAAI,MAAM,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAEtC,QAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;AACxE,KAAC,CAAC;IAEF,MAAM,UAAU,GAAG,MAAK;AACpB,QAAA,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACzB,KAAC,CAAC;AAEF,IAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;AAEhC,IAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEhD,OAAO;AACH,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,MAAM,EAAE,UAAU;KACrB,CAAC;AACN;;AC3DM,SAAU,GAAG,CAAC,SAAoB,EAAA;AACpC,IAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACjC,QAAA,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;AACvB,QAAA,IAAI,EAAE,EAAE,YAAY,WAAW,CAAC,EAAE;AAC9B,YAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SACpE;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO;KACV;IAED,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE;QACjE,IAAI,EAAE,SAAS,CAAC,OAAO,YAAY,WAAW,CAAC,EAAE;AAC7C,YAAA,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;SAC5E;QACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;KACV;AAED,IAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACzD;;ACRA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAChD,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD,MAAM,gBAAgB,GAAG;IACrB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS;IACxD,MAAM,EAAE,QAAQ,EAAE,SAAS;CAC9B,CAAC;AAEF,SAAS,kBAAkB,GAAA;IACvB,IAAI,CAAC,YAAY,EAAE;AACf,QAAA,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC/C,QAAA,YAAY,CAAC,EAAE,GAAG,QAAQ,CAAC;AAC3B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;KAC3C;AACD,IAAA,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAA;IAC3B,IAAI,IAAI,GAAG,IAAI,CAAC;AAChB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,SAAS,YAAY,CAAC,GAAW,EAAA;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACjF;AACD,IAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB,EAAE,SAA8B,EAAA;IACxE,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC5C,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;AACrD,QAAA,IAAI,GAAG,GAAG,OAAO,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;AAElD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YACzB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE;gBAClC,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,EAAE,IAAI,CAAC,CAAC;aAC1C;SACJ;AACD,QAAA,GAAG,CAAC,IAAI,CAAC,CAAA,EAAG,YAAY,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,GAAG,CAAE,CAAA,CAAC,CAAC;KAC3C;AACD,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAqC,EAAA;AAC1E,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,IAAA,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;AAEjC,IAAA,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC;AAE7C,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC;SACxE,IAAI,CAAC,EAAE,CAAC,CAAC;AAEd,IAAA,kBAAkB,EAAE,CAAC,WAAW,CAC5B,QAAQ,CAAC,cAAc,CAAC,CAAA,WAAA,EAAc,MAAM,CAAI,CAAA,EAAA,KAAK,CAAK,GAAA,CAAA,CAAC,CAC9D,CAAC;AACF,IAAA,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,IAAe,EAAE,SAA8B,EAAA;IAClF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAkB,EAAE,CAAC;AAE/B,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC3C,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;AAExC,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAChD,YAAA,KAAK,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,SAAS,GAAG,GAAG,CAAA,CAAA,EAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;SACxE;AACI,aAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC1D,YAAA,KAAK,CAAC,IAAI,CAAC,CAAG,EAAA,GAAG,KAAK,SAAS,CAAA,CAAA,EAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,EAAA,CAAI,CAAC,CAAC;SAC1E;AACI,aAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACnD,YAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAI,CAAA,EAAA,SAAS,CAAE,CAAA,CAAC,CAAC;AACtD,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;SAChE;aACI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;SACnB;KACJ;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAI,CAAA,EAAA,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;KACnE;AAED,IAAA,OAAO,KAAK,CAAC;AACjB,CAAC;AAEK,SAAU,UAAU,CAAsB,MAAS,EAAA;AACrD,IAAA,OAAO,MAAK;QACR,MAAM,UAAU,GAAG,EAAmB,CAAC;QACvC,MAAM,cAAc,GAAa,EAAE,CAAC;AACpC,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE/C,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC7C,YAAA,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAU,CAAC,CAAC;AACnD,gBAAA,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAClC;SACJ;AAED,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC/C,YAAA,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,MAAM,SAAS,GACX,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,GAAG,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAC;YAExE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,IAAiB,EAAE,YAAY,CAAC,CAAC;AACrE,gBAAA,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9B,gBAAA,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACxC;AAED,YAAA,UAAU,CAAC,IAAe,CAAC,GAAG,SAAS,CAAC;SAC3C;AAED,QAAA,IAAI,cAAc,CAAC,MAAM,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,cAAc;AAAE,gBAAA,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;SACrF;AAED,QAAA,OAAO,UAAU,CAAC;AACtB,KAAC,CAAC;AACN,CAAC;MAEY,YAAY,GAAG,CAAC,GAAG,OAA8C,KAC1E,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;AAEtB,SAAA,cAAc,CAAsB,GAAG,IAAuB,EAAA;IAC1E,MAAM,MAAM,GAAQ,EAAE,CAAC;AACvB,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,GAAG;YAAE,SAAS;AACnB,QAAA,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;YACjB,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD;KACJ;AACD,IAAA,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAChC;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,6 @@ const tags = new Proxy({}, {
|
|
|
58
58
|
get(_, tag) {
|
|
59
59
|
return (attrsOrChild, ...children) => {
|
|
60
60
|
const el = document.createElement(tag);
|
|
61
|
-
// Handle attributes
|
|
62
61
|
if (attrsOrChild &&
|
|
63
62
|
typeof attrsOrChild === "object" &&
|
|
64
63
|
!(attrsOrChild instanceof Node) &&
|
|
@@ -71,9 +70,7 @@ const tags = new Proxy({}, {
|
|
|
71
70
|
else if (attrsOrChild != null) {
|
|
72
71
|
children.unshift(attrsOrChild);
|
|
73
72
|
}
|
|
74
|
-
// Handle children
|
|
75
73
|
for (let child of children.flat()) {
|
|
76
|
-
// Reactive function child
|
|
77
74
|
if (typeof child === "function") {
|
|
78
75
|
let node = document.createTextNode("");
|
|
79
76
|
el.appendChild(node);
|
|
@@ -87,7 +84,6 @@ const tags = new Proxy({}, {
|
|
|
87
84
|
});
|
|
88
85
|
continue;
|
|
89
86
|
}
|
|
90
|
-
// Reactive state child
|
|
91
87
|
if (isState(child)) {
|
|
92
88
|
const node = document.createTextNode(String(child.val));
|
|
93
89
|
el.appendChild(node);
|
|
@@ -96,12 +92,10 @@ const tags = new Proxy({}, {
|
|
|
96
92
|
});
|
|
97
93
|
continue;
|
|
98
94
|
}
|
|
99
|
-
// DOM Node
|
|
100
95
|
if (child instanceof Node) {
|
|
101
96
|
el.appendChild(child);
|
|
102
97
|
continue;
|
|
103
98
|
}
|
|
104
|
-
// Text fallback
|
|
105
99
|
el.appendChild(document.createTextNode(String(child)));
|
|
106
100
|
}
|
|
107
101
|
return el;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts","../src/styles.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags = new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n // Handle attributes\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n // Handle children\r\n for (let child of children.flat()) {\r\n\r\n // Reactive function child\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // Reactive state child\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // DOM Node\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n // Text fallback\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n});\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/state.ts","../src/tags.ts","../src/router.ts","../src/helpers.ts","../src/styles.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags: Record<string, (attrs?: any, ...children: any[]) => HTMLElement> =\r\n new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n for (let child of children.flat()) {\r\n\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n });\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}"],"names":[],"mappings":";;;;AAWA,IAAI,aAAa,GAAkB,IAAI,CAAC;AAExC,SAAS,KAAK,CAAI,EAAY,EAAA;IAC1B,IAAI,aAAa,EAAE;AACf,QAAA,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC3B,QAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAC9B;AACL,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAA;AAC3B,IAAA,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AAAE,QAAA,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnD,IAAA,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAEK,SAAU,KAAK,CAAI,CAAI,EAAA;AACzB,IAAA,MAAM,EAAE,GAAG;QACP,IAAI,EAAE,IAAI,GAAG,EAAyB;AAEtC,QAAA,IAAI,GAAG,GAAA;YACH,KAAK,CAAC,EAAE,CAAC,CAAC;AACV,YAAA,OAAO,CAAC,CAAC;SACZ;QAED,IAAI,GAAG,CAAC,EAAK,EAAA;YACT,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO;YACrB,CAAC,GAAG,EAAE,CAAC;AACP,YAAA,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;AACjC,gBAAA,EAAmB,EAAE,CAAC;aAC1B;SACJ;KACQ,CAAC;AAEd,IAAA,OAAO,EAAE,CAAC;AACd,CAAC;AAEK,SAAU,MAAM,CAAC,EAAc,EAAA;AACjC,IAAA,MAAM,MAAM,IAAI,MAAK;QACjB,OAAO,CAAC,MAAM,CAAC,CAAC;QAChB,aAAa,GAAG,MAAM,CAAC;AAEvB,QAAA,IAAI;AACA,YAAA,EAAE,EAAE,CAAC;SACR;gBAAS;YACN,aAAa,GAAG,IAAI,CAAC;SACxB;AACL,KAAC,CAAW,CAAC;AAEb,IAAA,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,OAAO,MAAM,CAAC;AAClB;;AC3DA,SAAS,OAAO,CAAC,CAAM,EAAA;AACnB,IAAA,QACI,CAAC;QACD,OAAO,CAAC,KAAK,QAAQ;AACrB,QAAA,MAAM,IAAI,CAAC;AACX,QAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAChD;AACN,CAAC;MAEY,IAAI,GACb,IAAI,KAAK,CAAC,EAAE,EAAE;IACV,GAAG,CAAC,CAAC,EAAE,GAAW,EAAA;AACd,QAAA,OAAO,CAAC,YAAkB,EAAE,GAAG,QAAe,KAAI;YAC9C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAEvC,YAAA,IACI,YAAY;gBACZ,OAAO,YAAY,KAAK,QAAQ;AAChC,gBAAA,EAAE,YAAY,YAAY,IAAI,CAAC;gBAC/B,CAAC,OAAO,CAAC,YAAY,CAAC;AACtB,gBAAA,OAAO,YAAY,KAAK,UAAU,EACpC;AACE,gBAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAC/C,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjC;aACJ;AAAM,iBAAA,IAAI,YAAY,IAAI,IAAI,EAAE;AAC7B,gBAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aAClC;YAED,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;AAE/B,gBAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;oBAC7B,IAAI,IAAI,GAAS,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AAC7C,oBAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAErB,MAAM,CAAC,MAAK;AACR,wBAAA,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC;AAEtB,wBAAA,MAAM,OAAO,GACT,KAAK,YAAY,IAAI;AACjB,8BAAE,KAAK;AACP,8BAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;wBAEvD,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBAC7C,IAAI,GAAG,OAAO,CAAC;AACnB,qBAAC,CAAC,CAAC;oBAEH,SAAS;iBACZ;AAED,gBAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAChB,oBAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,oBAAA,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAErB,oBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;wBAChB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACzC,qBAAC,CAAC,CAAC;oBAEH,SAAS;iBACZ;AAED,gBAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACvB,oBAAA,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtB,SAAS;iBACZ;AAED,gBAAA,EAAE,CAAC,WAAW,CACV,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACzC,CAAC;aACL;AAED,YAAA,OAAO,EAAE,CAAC;AACd,SAAC,CAAC;KACL;AACJ,CAAA;;AC1EC,SAAU,MAAM,CAAC,MAAoC,EAAA;IAOvD,MAAM,aAAa,GAAmB,EAAE,CAAC;AAEzC,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;QACvB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,IAAI;AACf,aAAA,OAAO,CAAC,YAAY,EAAE,KAAK,IAAG;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1B,YAAA,OAAO,UAAU,CAAC;AACtB,SAAC,CAAC;AACD,aAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAE1B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,CAAI,CAAA,EAAA,OAAO,CAAG,CAAA,CAAA,CAAC,CAAC;AACzC,QAAA,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC9D;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAkB;AAClC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAEtC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEhC,IAAI,KAAK,EAAE;gBACP,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAE1C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;oBACpB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,iBAAC,CAAC,CAAC;AAEH,gBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;aAC1B;SACJ;QAED,IAAI,MAAM,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAEtC,QAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;AACxE,KAAC,CAAC;IAEF,MAAM,UAAU,GAAG,MAAK;AACpB,QAAA,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AACzB,KAAC,CAAC;AAEF,IAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;AAEhC,IAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEhD,OAAO;AACH,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,MAAM,EAAE,UAAU;KACrB,CAAC;AACN;;AC3DM,SAAU,GAAG,CAAC,SAAoB,EAAA;AACpC,IAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACjC,QAAA,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;AACvB,QAAA,IAAI,EAAE,EAAE,YAAY,WAAW,CAAC,EAAE;AAC9B,YAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SACpE;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO;KACV;IAED,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE;QACjE,IAAI,EAAE,SAAS,CAAC,OAAO,YAAY,WAAW,CAAC,EAAE;AAC7C,YAAA,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;SAC5E;QACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC7C,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;KACV;AAED,IAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACzD;;ACRA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAChD,IAAI,YAAY,GAA4B,IAAI,CAAC;AAEjD,MAAM,gBAAgB,GAAG;IACrB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS;IACxD,MAAM,EAAE,QAAQ,EAAE,SAAS;CAC9B,CAAC;AAEF,SAAS,kBAAkB,GAAA;IACvB,IAAI,CAAC,YAAY,EAAE;AACf,QAAA,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC/C,QAAA,YAAY,CAAC,EAAE,GAAG,QAAQ,CAAC;AAC3B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;KAC3C;AACD,IAAA,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAA;IAC3B,IAAI,IAAI,GAAG,IAAI,CAAC;AAChB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC7C,SAAS,YAAY,CAAC,GAAW,EAAA;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACjF;AACD,IAAA,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB,EAAE,SAA8B,EAAA;IACxE,MAAM,GAAG,GAAa,EAAE,CAAC;AACzB,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC5C,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;AACrD,QAAA,IAAI,GAAG,GAAG,OAAO,GAAG,KAAK,UAAU,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;AAElD,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YACzB,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE;gBAClC,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,EAAE,IAAI,CAAC,CAAC;aAC1C;SACJ;AACD,QAAA,GAAG,CAAC,IAAI,CAAC,CAAA,EAAG,YAAY,CAAC,GAAG,CAAC,CAAI,CAAA,EAAA,GAAG,CAAE,CAAA,CAAC,CAAC;KAC3C;AACD,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAqC,EAAA;AAC1E,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,IAAA,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;AAEjC,IAAA,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC;AAE7C,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA,CAAA,CAAG,CAAC;SACxE,IAAI,CAAC,EAAE,CAAC,CAAC;AAEd,IAAA,kBAAkB,EAAE,CAAC,WAAW,CAC5B,QAAQ,CAAC,cAAc,CAAC,CAAA,WAAA,EAAc,MAAM,CAAI,CAAA,EAAA,KAAK,CAAK,GAAA,CAAA,CAAC,CAC9D,CAAC;AACF,IAAA,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClC,IAAA,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB,EAAE,IAAe,EAAE,SAA8B,EAAA;IAClF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAkB,EAAE,CAAC;AAE/B,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC3C,QAAA,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;AAExC,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAChD,YAAA,KAAK,CAAC,IAAI,CAAC,CAAI,CAAA,EAAA,SAAS,GAAG,GAAG,CAAA,CAAA,EAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;SACxE;AACI,aAAA,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC1D,YAAA,KAAK,CAAC,IAAI,CAAC,CAAG,EAAA,GAAG,KAAK,SAAS,CAAA,CAAA,EAAI,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,EAAA,CAAI,CAAC,CAAC;SAC1E;AACI,aAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACnD,YAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAI,CAAA,EAAA,SAAS,CAAE,CAAA,CAAC,CAAC;AACtD,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;SAChE;aACI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;SACnB;KACJ;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAI,CAAA,EAAA,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;KACnE;AAED,IAAA,OAAO,KAAK,CAAC;AACjB,CAAC;AAEK,SAAU,UAAU,CAAsB,MAAS,EAAA;AACrD,IAAA,OAAO,MAAK;QACR,MAAM,UAAU,GAAG,EAAmB,CAAC;QACvC,MAAM,cAAc,GAAa,EAAE,CAAC;AACpC,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE/C,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC7C,YAAA,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,GAAU,CAAC,CAAC;AACnD,gBAAA,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aAClC;SACJ;AAED,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC/C,YAAA,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9C,MAAM,SAAS,GACX,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,GAAG,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAC;YAExE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;gBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,EAAE,IAAiB,EAAE,YAAY,CAAC,CAAC;AACrE,gBAAA,cAAc,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAC9B,gBAAA,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aACxC;AAED,YAAA,UAAU,CAAC,IAAe,CAAC,GAAG,SAAS,CAAC;SAC3C;AAED,QAAA,IAAI,cAAc,CAAC,MAAM,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,cAAc;AAAE,gBAAA,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;SACrF;AAED,QAAA,OAAO,UAAU,CAAC;AACtB,KAAC,CAAC;AACN,CAAC;MAEY,YAAY,GAAG,CAAC,GAAG,OAA8C,KAC1E,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;AAEtB,SAAA,cAAc,CAAsB,GAAG,IAAuB,EAAA;IAC1E,MAAM,MAAM,GAAQ,EAAE,CAAC;AACvB,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,GAAG;YAAE,SAAS;AACnB,QAAA,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;YACjB,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD;KACJ;AACD,IAAA,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAChC;;;;;;;;;;;"}
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../src/state.ts","../src/tags.ts","../src/styles.ts","../src/helpers.ts","../src/router.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags = new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n // Handle attributes\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n // Handle children\r\n for (let child of children.flat()) {\r\n\r\n // Reactive function child\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // Reactive state child\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n // DOM Node\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n // Text fallback\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n});\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}"],"names":["currentEffect","derive","fn","effect","d","deps","subs","delete","clear","cleanup","Set","isState","x","Object","prototype","hasOwnProperty","call","tags","Proxy","get","_","tag","attrsOrChild","children","el","document","createElement","Node","unshift","k","v","entries","setAttribute","String","child","flat","node","createTextNode","appendChild","value","newNode","parentNode","replaceChild","val","add","textContent","styleCache","Map","keyframeCache","styleElement","ALLOWED_PREFIXES","ensureStyleElement","id","head","hashString","str","hash","i","length","charCodeAt","toString","kebabCache","camelToKebab","has","set","replace","toLowerCase","stringifyDecls","props","keyframes","out","key","raw","orig","uniq","replaceAll","push","join","KEYFRAMES_REGEX","registerKeyframes","name","frames","unique","JSON","stringify","rules","map","step","styles","buildRules","className","rule","base","test","startsWith","includes","selector","keys","makeStyles","classNames","collectedRules","keyframesMap","slot","r","component","HTMLElement","Error","body","render","element","classes","filter","Boolean","sets","merged","routes","routePatterns","path","pattern","match","slice","regex","RegExp","handler","root","renderRoute","window","location","pathname","params","forEach","updateRoot","innerHTML","addEventListener","st","track","nv","Array","from"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../src/state.ts","../src/tags.ts","../src/styles.ts","../src/helpers.ts","../src/router.ts"],"sourcesContent":["export type Effect = (() => void) & { deps: Set<State<any>> };\r\n\r\nexport interface State<T> {\r\n subs: Set<Effect | (() => void)>;\r\n val: T;\r\n}\r\n\r\nfunction isState<T = any>(x: unknown): x is State<T> {\r\n return typeof x === \"object\" && x !== null && \"subs\" in x && \"val\" in x;\r\n}\r\n\r\nlet currentEffect: Effect | null = null;\r\n\r\nfunction track<T>(st: State<T>): void {\r\n if (currentEffect) {\r\n st.subs.add(currentEffect);\r\n currentEffect.deps.add(st);\r\n }\r\n}\r\n\r\nfunction cleanup(effect: Effect): void {\r\n for (const d of effect.deps) d.subs.delete(effect);\r\n effect.deps.clear();\r\n}\r\n\r\nexport function state<T>(v: T): State<T> {\r\n const st = {\r\n subs: new Set<Effect | (() => void)>(),\r\n\r\n get val() {\r\n track(st);\r\n return v;\r\n },\r\n\r\n set val(nv: T) {\r\n if (nv === v) return;\r\n v = nv;\r\n for (const fn of Array.from(st.subs)) {\r\n (fn as (() => void))();\r\n }\r\n }\r\n } as State<T>;\r\n\r\n return st;\r\n}\r\n\r\nexport function derive(fn: () => void): Effect {\r\n const effect = (() => {\r\n cleanup(effect);\r\n currentEffect = effect;\r\n\r\n try {\r\n fn();\r\n } finally {\r\n currentEffect = null;\r\n }\r\n }) as Effect;\r\n\r\n effect.deps = new Set();\r\n effect();\r\n return effect;\r\n}\r\n","import { derive, state, State } from \"./state\";\r\n\r\nfunction isState(x: any): x is State<any> {\r\n return (\r\n x &&\r\n typeof x === \"object\" &&\r\n \"subs\" in x &&\r\n Object.prototype.hasOwnProperty.call(x, \"val\")\r\n );\r\n}\r\n\r\nexport const tags: Record<string, (attrs?: any, ...children: any[]) => HTMLElement> =\r\n new Proxy({}, {\r\n get(_, tag: string) {\r\n return (attrsOrChild?: any, ...children: any[]) => {\r\n const el = document.createElement(tag);\r\n\r\n if (\r\n attrsOrChild &&\r\n typeof attrsOrChild === \"object\" &&\r\n !(attrsOrChild instanceof Node) &&\r\n !isState(attrsOrChild) &&\r\n typeof attrsOrChild !== \"function\"\r\n ) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, String(v));\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild);\r\n }\r\n\r\n for (let child of children.flat()) {\r\n\r\n if (typeof child === \"function\") {\r\n let node: Node = document.createTextNode(\"\");\r\n el.appendChild(node);\r\n\r\n derive(() => {\r\n const value = child();\r\n\r\n const newNode: Node =\r\n value instanceof Node\r\n ? value\r\n : document.createTextNode(String(value ?? \"\"));\r\n\r\n node.parentNode?.replaceChild(newNode, node);\r\n node = newNode;\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (isState(child)) {\r\n const node = document.createTextNode(String(child.val));\r\n el.appendChild(node);\r\n\r\n child.subs.add(() => {\r\n node.textContent = String(child.val);\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (child instanceof Node) {\r\n el.appendChild(child);\r\n continue;\r\n }\r\n\r\n el.appendChild(\r\n document.createTextNode(String(child))\r\n );\r\n }\r\n\r\n return el;\r\n };\r\n }\r\n });\r\n","export type CSSValue = string | number | (() => string | number);\r\nexport interface CSSProperties {\r\n [key: string]: CSSValue | CSSProperties;\r\n}\r\nexport type StyleRule = CSSProperties & {\r\n ':hover'?: CSSProperties;\r\n ':focus'?: CSSProperties;\r\n ':active'?: CSSProperties;\r\n ':disabled'?: CSSProperties;\r\n [key: string]: any;\r\n};\r\nexport type StylesMap<T extends Record<string, any> = {}> = {\r\n [K in keyof T]: StyleRule;\r\n};\r\nexport type ClassNames<T extends Record<string, any>> = { [K in keyof T]: string };\r\n\r\nconst styleCache = new Map<string, string>();\r\nconst keyframeCache = new Map<string, string>();\r\nlet styleElement: HTMLStyleElement | null = null;\r\n\r\nconst ALLOWED_PREFIXES = [\r\n 'root', 'button', 'icon', 'text', 'container', 'wrapper',\r\n 'card', 'header', 'section'\r\n];\r\n\r\nfunction ensureStyleElement() {\r\n if (!styleElement) {\r\n styleElement = document.createElement('style');\r\n styleElement.id = 'styles';\r\n document.head.appendChild(styleElement);\r\n }\r\n return styleElement;\r\n}\r\n\r\nfunction hashString(str: string): string {\r\n let hash = 5381;\r\n for (let i = 0; i < str.length; i++) hash = (hash * 33) ^ str.charCodeAt(i);\r\n return (hash >>> 0).toString(36);\r\n}\r\n\r\nconst kebabCache = new Map<string, string>();\r\nfunction camelToKebab(str: string): string {\r\n if (!kebabCache.has(str)) {\r\n kebabCache.set(str, str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase());\r\n }\r\n return kebabCache.get(str)!;\r\n}\r\n\r\nfunction stringifyDecls(props: CSSProperties, keyframes: Map<string, string>): string {\r\n const out: string[] = [];\r\n for (const [key, raw] of Object.entries(props)) {\r\n if (raw == null || typeof raw === \"object\") continue;\r\n let val = typeof raw === \"function\" ? raw() : raw;\r\n\r\n if (typeof val === \"string\") {\r\n for (const [orig, uniq] of keyframes) {\r\n val = val.replaceAll(`$${orig}`, uniq);\r\n }\r\n }\r\n out.push(`${camelToKebab(key)}:${val}`);\r\n }\r\n return out.join(\";\");\r\n}\r\n\r\nconst KEYFRAMES_REGEX = /^@keyframes /;\r\n\r\nfunction registerKeyframes(name: string, frames: Record<string, CSSProperties>): string {\r\n const hash = hashString(name + JSON.stringify(frames));\r\n const unique = `${name}-${hash}`;\r\n\r\n if (keyframeCache.has(unique)) return unique;\r\n\r\n const rules = Object.entries(frames)\r\n .map(([step, styles]) => `${step}{${stringifyDecls(styles, new Map())}}`)\r\n .join(\"\");\r\n\r\n ensureStyleElement().appendChild(\r\n document.createTextNode(`@keyframes ${unique}{${rules}}\\n`)\r\n );\r\n keyframeCache.set(unique, unique);\r\n return unique;\r\n}\r\n\r\nfunction buildRules(className: string, rule: StyleRule, keyframes: Map<string, string>): string[] {\r\n const rules: string[] = [];\r\n const base: CSSProperties = {};\r\n\r\n for (const [key, val] of Object.entries(rule)) {\r\n if (KEYFRAMES_REGEX.test(key)) continue;\r\n\r\n if (key.startsWith(':') && typeof val === \"object\") {\r\n rules.push(`.${className}${key}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (key.startsWith('@media') && typeof val === \"object\") {\r\n rules.push(`${key}{.${className}{${stringifyDecls(val, keyframes)}}}`);\r\n }\r\n else if (key.includes('&') && typeof val === \"object\") {\r\n const selector = key.replaceAll(\"&\", `.${className}`);\r\n rules.push(`${selector}{${stringifyDecls(val, keyframes)}}`);\r\n }\r\n else if (!key.startsWith('@')) {\r\n base[key] = val;\r\n }\r\n }\r\n\r\n if (Object.keys(base).length > 0) {\r\n rules.push(`.${className}{${stringifyDecls(base, keyframes)}}`);\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function makeStyles<T extends StylesMap>(styles: T) {\r\n return () => {\r\n const classNames = {} as ClassNames<T>;\r\n const collectedRules: string[] = [];\r\n const keyframesMap = new Map<string, string>();\r\n\r\n for (const [key, val] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(key)) {\r\n const name = key.replace('@keyframes ', '');\r\n const unique = registerKeyframes(name, val as any);\r\n keyframesMap.set(name, unique);\r\n }\r\n }\r\n\r\n for (const [slot, rule] of Object.entries(styles)) {\r\n if (KEYFRAMES_REGEX.test(slot)) continue;\r\n\r\n const hash = hashString(JSON.stringify(rule));\r\n const className =\r\n ALLOWED_PREFIXES.includes(slot) ? `${slot}-${hash}` : `css-${hash}`;\r\n\r\n if (!styleCache.has(className)) {\r\n const rules = buildRules(className, rule as StyleRule, keyframesMap);\r\n collectedRules.push(...rules);\r\n styleCache.set(className, className);\r\n }\r\n\r\n classNames[slot as keyof T] = className;\r\n }\r\n\r\n if (collectedRules.length) {\r\n const el = ensureStyleElement();\r\n for (const r of collectedRules) el.appendChild(document.createTextNode(r + \"\\n\"));\r\n }\r\n\r\n return classNames;\r\n };\r\n}\r\n\r\nexport const mergeClasses = (...classes: (string | undefined | null | false)[]) =>\r\n classes.filter(Boolean).join(\" \");\r\n\r\nexport function mergeStyleSets<T extends StylesMap>(...sets: (T | undefined)[]) {\r\n const merged: any = {};\r\n for (const set of sets) {\r\n if (!set) continue;\r\n for (const k in set) {\r\n merged[k] = { ...(merged[k] || {}), ...set[k] };\r\n }\r\n }\r\n return makeStyles(merged)();\r\n}","type Component =\r\n | (() => HTMLElement)\r\n | { render: () => void; element: HTMLElement };\r\n\r\nexport function add(component: Component) {\r\n if (typeof component === \"function\") {\r\n const el = component();\r\n if (!(el instanceof HTMLElement)) {\r\n throw new Error(\"Component function must return an HTMLElement\");\r\n }\r\n document.body.appendChild(el);\r\n return;\r\n }\r\n\r\n if (\"render\" in component && typeof component.render === \"function\") {\r\n if (!(component.element instanceof HTMLElement)) {\r\n throw new Error(\"Component object must have an HTMLElement in .element\");\r\n }\r\n document.body.appendChild(component.element);\r\n component.render();\r\n return;\r\n }\r\n\r\n throw new Error(\"Invalid component passed to add()\");\r\n}\r\n","export type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n type RoutePattern = {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n };\r\n\r\n const routePatterns: RoutePattern[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\r\n\r\n const pattern = path\r\n .replace(/\\/:[^\\/]+/g, match => {\r\n keys.push(match.slice(2));\r\n return \"/([^/]+)\";\r\n })\r\n .replace(/\\*/g, \".*\");\r\n\r\n const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\r\n\r\n const root = document.createElement(\"div\");\r\n\r\n const renderRoute = (): HTMLElement => {\r\n const path = window.location.pathname;\r\n\r\n for (const { regex, keys, handler } of routePatterns) {\r\n const match = path.match(regex);\r\n\r\n if (match) {\r\n const params: Record<string, string> = {};\r\n\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) return routes[\"*\"]();\r\n\r\n throw new Error(\"No matching route and no wildcard route provided\");\r\n };\r\n\r\n const updateRoot = () => {\r\n const el = renderRoute();\r\n root.innerHTML = \"\";\r\n root.appendChild(el);\r\n };\r\n\r\n root.appendChild(renderRoute());\r\n\r\n window.addEventListener(\"popstate\", updateRoot);\r\n\r\n return {\r\n element: root,\r\n render: updateRoot\r\n };\r\n}"],"names":["currentEffect","derive","fn","effect","d","deps","subs","delete","clear","cleanup","Set","isState","x","Object","prototype","hasOwnProperty","call","tags","Proxy","get","_","tag","attrsOrChild","children","el","document","createElement","Node","unshift","k","v","entries","setAttribute","String","child","flat","node","createTextNode","appendChild","value","newNode","parentNode","replaceChild","val","add","textContent","styleCache","Map","keyframeCache","styleElement","ALLOWED_PREFIXES","ensureStyleElement","id","head","hashString","str","hash","i","length","charCodeAt","toString","kebabCache","camelToKebab","has","set","replace","toLowerCase","stringifyDecls","props","keyframes","out","key","raw","orig","uniq","replaceAll","push","join","KEYFRAMES_REGEX","registerKeyframes","name","frames","unique","JSON","stringify","rules","map","step","styles","buildRules","className","rule","base","test","startsWith","includes","selector","keys","makeStyles","classNames","collectedRules","keyframesMap","slot","r","component","HTMLElement","Error","body","render","element","classes","filter","Boolean","sets","merged","routes","routePatterns","path","pattern","match","slice","regex","RegExp","handler","root","renderRoute","window","location","pathname","params","forEach","updateRoot","innerHTML","addEventListener","st","track","nv","Array","from"],"mappings":"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"}
|
package/dist/tags.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const tags:
|
|
1
|
+
export declare const tags: Record<string, (attrs?: any, ...children: any[]) => HTMLElement>;
|
package/package.json
CHANGED
package/src/tags.ts
CHANGED
|
@@ -9,74 +9,69 @@ function isState(x: any): x is State<any> {
|
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export const tags
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export const tags: Record<string, (attrs?: any, ...children: any[]) => HTMLElement> =
|
|
13
|
+
new Proxy({}, {
|
|
14
|
+
get(_, tag: string) {
|
|
15
|
+
return (attrsOrChild?: any, ...children: any[]) => {
|
|
16
|
+
const el = document.createElement(tag);
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
if (
|
|
19
|
+
attrsOrChild &&
|
|
20
|
+
typeof attrsOrChild === "object" &&
|
|
21
|
+
!(attrsOrChild instanceof Node) &&
|
|
22
|
+
!isState(attrsOrChild) &&
|
|
23
|
+
typeof attrsOrChild !== "function"
|
|
24
|
+
) {
|
|
25
|
+
for (const [k, v] of Object.entries(attrsOrChild)) {
|
|
26
|
+
el.setAttribute(k, String(v));
|
|
27
|
+
}
|
|
28
|
+
} else if (attrsOrChild != null) {
|
|
29
|
+
children.unshift(attrsOrChild);
|
|
27
30
|
}
|
|
28
|
-
} else if (attrsOrChild != null) {
|
|
29
|
-
children.unshift(attrsOrChild);
|
|
30
|
-
}
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
for (let child of children.flat()) {
|
|
32
|
+
for (let child of children.flat()) {
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
el.appendChild(node);
|
|
34
|
+
if (typeof child === "function") {
|
|
35
|
+
let node: Node = document.createTextNode("");
|
|
36
|
+
el.appendChild(node);
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
derive(() => {
|
|
39
|
+
const value = child();
|
|
42
40
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
const newNode: Node =
|
|
42
|
+
value instanceof Node
|
|
43
|
+
? value
|
|
44
|
+
: document.createTextNode(String(value ?? ""));
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
node.parentNode?.replaceChild(newNode, node);
|
|
47
|
+
node = newNode;
|
|
48
|
+
});
|
|
51
49
|
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
el.appendChild(node);
|
|
53
|
+
if (isState(child)) {
|
|
54
|
+
const node = document.createTextNode(String(child.val));
|
|
55
|
+
el.appendChild(node);
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
child.subs.add(() => {
|
|
58
|
+
node.textContent = String(child.val);
|
|
59
|
+
});
|
|
63
60
|
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
66
63
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
64
|
+
if (child instanceof Node) {
|
|
65
|
+
el.appendChild(child);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
72
68
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
69
|
+
el.appendChild(
|
|
70
|
+
document.createTextNode(String(child))
|
|
71
|
+
);
|
|
72
|
+
}
|
|
78
73
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
});
|
|
74
|
+
return el;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|