uraniyum 1.0.5 → 1.0.7

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 CHANGED
@@ -1,39 +1,104 @@
1
- function state(initial) {
2
- let value = initial;
3
- const listeners = [];
4
- const set = (newValue) => {
5
- value = newValue;
6
- listeners.forEach(fn => fn(value));
7
- };
8
- const get = () => value;
9
- const subscribe = (fn) => {
10
- listeners.push(fn);
11
- return () => {
12
- const index = listeners.indexOf(fn);
13
- if (index > -1)
14
- listeners.splice(index, 1);
15
- };
1
+ let currentEffect = null;
2
+ function track(st) {
3
+ if (currentEffect) {
4
+ st.subs.add(currentEffect);
5
+ currentEffect.deps.add(st);
6
+ }
7
+ }
8
+ function cleanup(effect) {
9
+ for (const d of effect.deps)
10
+ d.subs.delete(effect);
11
+ effect.deps.clear();
12
+ }
13
+ function state(v) {
14
+ const st = {
15
+ subs: new Set(),
16
+ get val() {
17
+ track(st);
18
+ return v;
19
+ },
20
+ set val(nv) {
21
+ if (nv === v)
22
+ return;
23
+ v = nv;
24
+ for (const fn of Array.from(st.subs)) {
25
+ fn();
26
+ }
27
+ }
16
28
  };
17
- return { get, set, subscribe };
29
+ return st;
30
+ }
31
+ function derive(fn) {
32
+ const effect = (() => {
33
+ cleanup(effect);
34
+ currentEffect = effect;
35
+ try {
36
+ fn();
37
+ }
38
+ finally {
39
+ currentEffect = null;
40
+ }
41
+ });
42
+ effect.deps = new Set();
43
+ effect();
44
+ return effect;
18
45
  }
19
46
 
47
+ function isState(x) {
48
+ return (x &&
49
+ typeof x === "object" &&
50
+ "subs" in x &&
51
+ Object.prototype.hasOwnProperty.call(x, "val"));
52
+ }
20
53
  const tags = new Proxy({}, {
21
54
  get(_, tag) {
22
55
  return (attrsOrChild, ...children) => {
23
56
  const el = document.createElement(tag);
24
- if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {
57
+ // Handle attributes
58
+ if (attrsOrChild &&
59
+ typeof attrsOrChild === "object" &&
60
+ !(attrsOrChild instanceof Node) &&
61
+ !isState(attrsOrChild) &&
62
+ typeof attrsOrChild !== "function") {
25
63
  for (const [k, v] of Object.entries(attrsOrChild)) {
26
- el.setAttribute(k, v);
64
+ el.setAttribute(k, String(v));
27
65
  }
28
66
  }
29
67
  else if (attrsOrChild != null) {
30
68
  children.unshift(attrsOrChild);
31
69
  }
32
- for (const child of children.flat()) {
33
- if (child instanceof Node)
70
+ // Handle children
71
+ for (let child of children.flat()) {
72
+ // Reactive function child
73
+ if (typeof child === "function") {
74
+ let node = document.createTextNode("");
75
+ el.appendChild(node);
76
+ derive(() => {
77
+ const value = child();
78
+ const newNode = value instanceof Node
79
+ ? value
80
+ : document.createTextNode(String(value ?? ""));
81
+ node.parentNode?.replaceChild(newNode, node);
82
+ node = newNode;
83
+ });
84
+ continue;
85
+ }
86
+ // Reactive state child
87
+ if (isState(child)) {
88
+ const node = document.createTextNode(String(child.val));
89
+ el.appendChild(node);
90
+ child.subs.add(() => {
91
+ node.textContent = String(child.val);
92
+ });
93
+ continue;
94
+ }
95
+ // DOM Node
96
+ if (child instanceof Node) {
34
97
  el.appendChild(child);
35
- else
36
- el.appendChild(document.createTextNode(String(child)));
98
+ continue;
99
+ }
100
+ // Text fallback
101
+ el.appendChild(document.createTextNode(String(child)));
37
102
  }
38
103
  return el;
39
104
  };
@@ -229,5 +294,5 @@ function mergeStyleSets(...sets) {
229
294
  return makeStyles(merged)();
230
295
  }
231
296
 
232
- export { add, makeStyles, mergeClasses, mergeStyleSets, router, state, tags };
297
+ export { add, derive, makeStyles, mergeClasses, mergeStyleSets, router, state, tags };
233
298
  //# sourceMappingURL=index.esm.js.map
@@ -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 function state<T>(initial: T) {\r\n let value = initial\r\n const listeners: Function[] = []\r\n\r\n const set = (newValue: T) => {\r\n value = newValue\r\n listeners.forEach(fn => fn(value))\r\n }\r\n\r\n const get = () => value\r\n\r\n const subscribe = (fn: Function) => {\r\n listeners.push(fn)\r\n return () => {\r\n const index = listeners.indexOf(fn)\r\n if (index > -1) listeners.splice(index, 1)\r\n }\r\n }\r\n\r\n return { get, set, subscribe }\r\n}","export 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 if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, v as string)\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild)\r\n }\r\n\r\n for (const child of children.flat()) {\r\n if (child instanceof Node) el.appendChild(child)\r\n else el.appendChild(document.createTextNode(String(child)))\r\n }\r\n return el\r\n }\r\n }\r\n})","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\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 = 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","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\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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"}
package/dist/index.js CHANGED
@@ -2,42 +2,107 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- function state(initial) {
6
- let value = initial;
7
- const listeners = [];
8
- const set = (newValue) => {
9
- value = newValue;
10
- listeners.forEach(fn => fn(value));
11
- };
12
- const get = () => value;
13
- const subscribe = (fn) => {
14
- listeners.push(fn);
15
- return () => {
16
- const index = listeners.indexOf(fn);
17
- if (index > -1)
18
- listeners.splice(index, 1);
19
- };
5
+ let currentEffect = null;
6
+ function track(st) {
7
+ if (currentEffect) {
8
+ st.subs.add(currentEffect);
9
+ currentEffect.deps.add(st);
10
+ }
11
+ }
12
+ function cleanup(effect) {
13
+ for (const d of effect.deps)
14
+ d.subs.delete(effect);
15
+ effect.deps.clear();
16
+ }
17
+ function state(v) {
18
+ const st = {
19
+ subs: new Set(),
20
+ get val() {
21
+ track(st);
22
+ return v;
23
+ },
24
+ set val(nv) {
25
+ if (nv === v)
26
+ return;
27
+ v = nv;
28
+ for (const fn of Array.from(st.subs)) {
29
+ fn();
30
+ }
31
+ }
20
32
  };
21
- return { get, set, subscribe };
33
+ return st;
34
+ }
35
+ function derive(fn) {
36
+ const effect = (() => {
37
+ cleanup(effect);
38
+ currentEffect = effect;
39
+ try {
40
+ fn();
41
+ }
42
+ finally {
43
+ currentEffect = null;
44
+ }
45
+ });
46
+ effect.deps = new Set();
47
+ effect();
48
+ return effect;
22
49
  }
23
50
 
51
+ function isState(x) {
52
+ return (x &&
53
+ typeof x === "object" &&
54
+ "subs" in x &&
55
+ Object.prototype.hasOwnProperty.call(x, "val"));
56
+ }
24
57
  const tags = new Proxy({}, {
25
58
  get(_, tag) {
26
59
  return (attrsOrChild, ...children) => {
27
60
  const el = document.createElement(tag);
28
- if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {
61
+ // Handle attributes
62
+ if (attrsOrChild &&
63
+ typeof attrsOrChild === "object" &&
64
+ !(attrsOrChild instanceof Node) &&
65
+ !isState(attrsOrChild) &&
66
+ typeof attrsOrChild !== "function") {
29
67
  for (const [k, v] of Object.entries(attrsOrChild)) {
30
- el.setAttribute(k, v);
68
+ el.setAttribute(k, String(v));
31
69
  }
32
70
  }
33
71
  else if (attrsOrChild != null) {
34
72
  children.unshift(attrsOrChild);
35
73
  }
36
- for (const child of children.flat()) {
37
- if (child instanceof Node)
74
+ // Handle children
75
+ for (let child of children.flat()) {
76
+ // Reactive function child
77
+ if (typeof child === "function") {
78
+ let node = document.createTextNode("");
79
+ el.appendChild(node);
80
+ derive(() => {
81
+ const value = child();
82
+ const newNode = value instanceof Node
83
+ ? value
84
+ : document.createTextNode(String(value ?? ""));
85
+ node.parentNode?.replaceChild(newNode, node);
86
+ node = newNode;
87
+ });
88
+ continue;
89
+ }
90
+ // Reactive state child
91
+ if (isState(child)) {
92
+ const node = document.createTextNode(String(child.val));
93
+ el.appendChild(node);
94
+ child.subs.add(() => {
95
+ node.textContent = String(child.val);
96
+ });
97
+ continue;
98
+ }
99
+ // DOM Node
100
+ if (child instanceof Node) {
38
101
  el.appendChild(child);
39
- else
40
- el.appendChild(document.createTextNode(String(child)));
102
+ continue;
103
+ }
104
+ // Text fallback
105
+ el.appendChild(document.createTextNode(String(child)));
41
106
  }
42
107
  return el;
43
108
  };
@@ -234,6 +299,7 @@ function mergeStyleSets(...sets) {
234
299
  }
235
300
 
236
301
  exports.add = add;
302
+ exports.derive = derive;
237
303
  exports.makeStyles = makeStyles;
238
304
  exports.mergeClasses = mergeClasses;
239
305
  exports.mergeStyleSets = mergeStyleSets;
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 function state<T>(initial: T) {\r\n let value = initial\r\n const listeners: Function[] = []\r\n\r\n const set = (newValue: T) => {\r\n value = newValue\r\n listeners.forEach(fn => fn(value))\r\n }\r\n\r\n const get = () => value\r\n\r\n const subscribe = (fn: Function) => {\r\n listeners.push(fn)\r\n return () => {\r\n const index = listeners.indexOf(fn)\r\n if (index > -1) listeners.splice(index, 1)\r\n }\r\n }\r\n\r\n return { get, set, subscribe }\r\n}","export 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 if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, v as string)\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild)\r\n }\r\n\r\n for (const child of children.flat()) {\r\n if (child instanceof Node) el.appendChild(child)\r\n else el.appendChild(document.createTextNode(String(child)))\r\n }\r\n return el\r\n }\r\n }\r\n})","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\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 = 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","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\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,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE;IAC9B,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;;AAGvC,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;;YAGD,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;;AAG/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;;AAGD,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;;AAGD,gBAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACvB,oBAAA,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACtB,SAAS;iBACZ;;AAGD,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;;AC/EK,SAAU,MAAM,CAAC,MAAoC,EAAA;IACvD,MAAM,aAAa,GAIb,EAAE,CAAC;AAET,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;QACvB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI;AACf,aAAA,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,KAAI;YAC7B,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;QAC1B,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,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;YAChC,IAAI,KAAK,EAAE;gBACP,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAC1C,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;AACH,gBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;aAC1B;SACJ;AAED,QAAA,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE;AACb,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;SACxB;AAED,QAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AACjE,KAAC,CAAC;IAEF,MAAM,UAAU,GAAG,MAAK;AACpB,QAAA,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;AACzB,QAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AAC7B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAClC,KAAC,CAAC;AACF,IAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAEhD,IAAA,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AAChC,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAErC,OAAO;AACH,QAAA,MAAM,EAAE,UAAU;KACrB,CAAC;AACN;;ACnDM,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 CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MiniUI={})}(this,function(e){"use strict";const t=new Proxy({},{get:(e,t)=>(e,...n)=>{const o=document.createElement(t);if(!e||"object"!=typeof e||Array.isArray(e)||e instanceof Node)null!=e&&n.unshift(e);else for(const[t,n]of Object.entries(e))o.setAttribute(t,n);for(const e of n.flat())e instanceof Node?o.appendChild(e):o.appendChild(document.createTextNode(String(e)));return o}});const n=new Map,o=new Map;let r=null;const s=["root","button","icon","text","container","wrapper","card","header","section"];function c(){return r||(r=document.createElement("style"),r.id="styles",document.head.appendChild(r)),r}function i(e){let t=5381;for(let n=0;n<e.length;n++)t=33*t^e.charCodeAt(n);return(t>>>0).toString(36)}const f=new Map;function a(e){return f.has(e)||f.set(e,e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),f.get(e)}function d(e,t){const n=[];for(const[o,r]of Object.entries(e)){if(null==r||"object"==typeof r)continue;let e="function"==typeof r?r():r;if("string"==typeof e)for(const[n,o]of t)e=e.replaceAll(`$${n}`,o);n.push(`${a(o)}:${e}`)}return n.join(";")}const u=/^@keyframes /;function l(e,t){const n=`${e}-${i(e+JSON.stringify(t))}`;if(o.has(n))return n;const r=Object.entries(t).map(([e,t])=>`${e}{${d(t,new Map)}}`).join("");return c().appendChild(document.createTextNode(`@keyframes ${n}{${r}}\n`)),o.set(n,n),n}function p(e,t,n){const o=[],r={};for(const[s,c]of Object.entries(t))if(!u.test(s))if(s.startsWith(":")&&"object"==typeof c)o.push(`.${e}${s}{${d(c,n)}}`);else if(s.startsWith("@media")&&"object"==typeof c)o.push(`${s}{.${e}{${d(c,n)}}}`);else if(s.includes("&")&&"object"==typeof c){const t=s.replaceAll("&",`.${e}`);o.push(`${t}{${d(c,n)}}`)}else s.startsWith("@")||(r[s]=c);return Object.keys(r).length>0&&o.push(`.${e}{${d(r,n)}}`),o}function h(e){return()=>{const t={},o=[],r=new Map;for(const[t,n]of Object.entries(e))if(u.test(t)){const e=t.replace("@keyframes ",""),o=l(e,n);r.set(e,o)}for(const[c,f]of Object.entries(e)){if(u.test(c))continue;const e=i(JSON.stringify(f)),a=s.includes(c)?`${c}-${e}`:`css-${e}`;if(!n.has(a)){const e=p(a,f,r);o.push(...e),n.set(a,a)}t[c]=a}if(o.length){const e=c();for(const t of o)e.appendChild(document.createTextNode(t+"\n"))}return t}}e.add=function(e){if("function"==typeof e){const t=e();if(!(t instanceof HTMLElement))throw new Error("Component function must return an HTMLElement");return void document.body.appendChild(t)}if("render"in e&&"function"==typeof e.render){if(!(e.element instanceof HTMLElement))throw new Error("Component object must have an HTMLElement in .element");return document.body.appendChild(e.element),void e.render()}throw new Error("Invalid component passed to add()")},e.makeStyles=h,e.mergeClasses=(...e)=>e.filter(Boolean).join(" "),e.mergeStyleSets=function(...e){const t={};for(const n of e)if(n)for(const e in n)t[e]={...t[e]||{},...n[e]};return h(t)()},e.router=function(e){const t=[];for(const n in e){const o=[],r=n.replace(/\/:[^\/]+/g,e=>(o.push(e.slice(2)),"/([^/]+)")).replace(/\*/g,".*"),s=new RegExp(`^${r}$`);t.push({regex:s,keys:o,handler:e[n]})}const n=()=>{const n=window.location.pathname;for(const{regex:e,keys:o,handler:r}of t){const t=n.match(e);if(t){const e={};return o.forEach((n,o)=>{e[n]=t[o+1]}),r(e)}}if(e["*"])return e["*"]();throw new Error("No route matched and no fallback provided")},o=()=>{const e=n();document.body.innerHTML="",document.body.appendChild(e)};window.addEventListener("popstate",o);const r=n();return document.body.appendChild(r),{render:o}},e.state=function(e){let t=e;const n=[];return{get:()=>t,set:e=>{t=e,n.forEach(e=>e(t))},subscribe:e=>(n.push(e),()=>{const t=n.indexOf(e);t>-1&&n.splice(t,1)})}},e.tags=t,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MiniUI={})}(this,function(e){"use strict";let t=null;function n(e){const n=()=>{!function(e){for(const t of e.deps)t.subs.delete(e);e.deps.clear()}(n),t=n;try{e()}finally{t=null}};return n.deps=new Set,n(),n}function o(e){return e&&"object"==typeof e&&"subs"in e&&Object.prototype.hasOwnProperty.call(e,"val")}const r=new Proxy({},{get:(e,t)=>(e,...r)=>{const s=document.createElement(t);if(!e||"object"!=typeof e||e instanceof Node||o(e)||"function"==typeof e)null!=e&&r.unshift(e);else for(const[t,n]of Object.entries(e))s.setAttribute(t,String(n));for(let e of r.flat()){if("function"==typeof e){let t=document.createTextNode("");s.appendChild(t),n(()=>{const n=e(),o=n instanceof Node?n:document.createTextNode(String(n??""));t.parentNode?.replaceChild(o,t),t=o});continue}if(o(e)){const t=document.createTextNode(String(e.val));s.appendChild(t),e.subs.add(()=>{t.textContent=String(e.val)});continue}e instanceof Node?s.appendChild(e):s.appendChild(document.createTextNode(String(e)))}return s}});const s=new Map,c=new Map;let i=null;const f=["root","button","icon","text","container","wrapper","card","header","section"];function d(){return i||(i=document.createElement("style"),i.id="styles",document.head.appendChild(i)),i}function a(e){let t=5381;for(let n=0;n<e.length;n++)t=33*t^e.charCodeAt(n);return(t>>>0).toString(36)}const u=new Map;function l(e){return u.has(e)||u.set(e,e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),u.get(e)}function p(e,t){const n=[];for(const[o,r]of Object.entries(e)){if(null==r||"object"==typeof r)continue;let e="function"==typeof r?r():r;if("string"==typeof e)for(const[n,o]of t)e=e.replaceAll(`$${n}`,o);n.push(`${l(o)}:${e}`)}return n.join(";")}const h=/^@keyframes /;function m(e,t){const n=`${e}-${a(e+JSON.stringify(t))}`;if(c.has(n))return n;const o=Object.entries(t).map(([e,t])=>`${e}{${p(t,new Map)}}`).join("");return d().appendChild(document.createTextNode(`@keyframes ${n}{${o}}\n`)),c.set(n,n),n}function y(e,t,n){const o=[],r={};for(const[s,c]of Object.entries(t))if(!h.test(s))if(s.startsWith(":")&&"object"==typeof c)o.push(`.${e}${s}{${p(c,n)}}`);else if(s.startsWith("@media")&&"object"==typeof c)o.push(`${s}{.${e}{${p(c,n)}}}`);else if(s.includes("&")&&"object"==typeof c){const t=s.replaceAll("&",`.${e}`);o.push(`${t}{${p(c,n)}}`)}else s.startsWith("@")||(r[s]=c);return Object.keys(r).length>0&&o.push(`.${e}{${p(r,n)}}`),o}function b(e){return()=>{const t={},n=[],o=new Map;for(const[t,n]of Object.entries(e))if(h.test(t)){const e=t.replace("@keyframes ",""),r=m(e,n);o.set(e,r)}for(const[r,c]of Object.entries(e)){if(h.test(r))continue;const e=a(JSON.stringify(c)),i=f.includes(r)?`${r}-${e}`:`css-${e}`;if(!s.has(i)){const e=y(i,c,o);n.push(...e),s.set(i,i)}t[r]=i}if(n.length){const e=d();for(const t of n)e.appendChild(document.createTextNode(t+"\n"))}return t}}e.add=function(e){if("function"==typeof e){const t=e();if(!(t instanceof HTMLElement))throw new Error("Component function must return an HTMLElement");return void document.body.appendChild(t)}if("render"in e&&"function"==typeof e.render){if(!(e.element instanceof HTMLElement))throw new Error("Component object must have an HTMLElement in .element");return document.body.appendChild(e.element),void e.render()}throw new Error("Invalid component passed to add()")},e.derive=n,e.makeStyles=b,e.mergeClasses=(...e)=>e.filter(Boolean).join(" "),e.mergeStyleSets=function(...e){const t={};for(const n of e)if(n)for(const e in n)t[e]={...t[e]||{},...n[e]};return b(t)()},e.router=function(e){const t=[];for(const n in e){const o=[],r=n.replace(/\/:[^\/]+/g,e=>(o.push(e.slice(2)),"/([^/]+)")).replace(/\*/g,".*"),s=new RegExp(`^${r}$`);t.push({regex:s,keys:o,handler:e[n]})}const n=()=>{const n=window.location.pathname;for(const{regex:e,keys:o,handler:r}of t){const t=n.match(e);if(t){const e={};return o.forEach((n,o)=>{e[n]=t[o+1]}),r(e)}}if(e["*"])return e["*"]();throw new Error("No route matched and no fallback provided")},o=()=>{const e=n();document.body.innerHTML="",document.body.appendChild(e)};window.addEventListener("popstate",o);const r=n();return document.body.appendChild(r),{render:o}},e.state=function(e){const n={subs:new Set,get val(){return function(e){t&&(e.subs.add(t),t.deps.add(e))}(n),e},set val(t){if(t!==e){e=t;for(const e of Array.from(n.subs))e()}}};return n},e.tags=r,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.min.js","sources":["../src/tags.ts","../src/styles.ts","../src/helpers.ts","../src/router.ts","../src/state.ts"],"sourcesContent":["export 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 if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {\r\n for (const [k, v] of Object.entries(attrsOrChild)) {\r\n el.setAttribute(k, v as string)\r\n }\r\n } else if (attrsOrChild != null) {\r\n children.unshift(attrsOrChild)\r\n }\r\n\r\n for (const child of children.flat()) {\r\n if (child instanceof Node) el.appendChild(child)\r\n else el.appendChild(document.createTextNode(String(child)))\r\n }\r\n return el\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","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\r\n };\r\n}","export function state<T>(initial: T) {\r\n let value = initial\r\n const listeners: Function[] = []\r\n\r\n const set = (newValue: T) => {\r\n value = newValue\r\n listeners.forEach(fn => fn(value))\r\n }\r\n\r\n const get = () => value\r\n\r\n const subscribe = (fn: Function) => {\r\n listeners.push(fn)\r\n return () => {\r\n const index = listeners.indexOf(fn)\r\n if (index > -1) listeners.splice(index, 1)\r\n }\r\n }\r\n\r\n return { get, set, subscribe }\r\n}"],"names":["tags","Proxy","get","_","tag","attrsOrChild","children","el","document","createElement","Array","isArray","Node","unshift","k","v","Object","entries","setAttribute","child","flat","appendChild","createTextNode","String","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","val","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","renderRoute","window","location","pathname","params","forEach","onPopState","innerHTML","addEventListener","initialEl","initial","value","listeners","newValue","fn","subscribe","index","indexOf","splice"],"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 = 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","type RouteHandler = (params?: Record<string, string>) => HTMLElement;\r\n\r\nexport function router(routes: Record<string, RouteHandler>) {\r\n const routePatterns: {\r\n regex: RegExp;\r\n keys: string[];\r\n handler: RouteHandler;\r\n }[] = [];\r\n\r\n for (const path in routes) {\r\n const keys: string[] = [];\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 const regex = new RegExp(`^${pattern}$`);\r\n routePatterns.push({ regex, keys, handler: routes[path] });\r\n }\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 if (match) {\r\n const params: Record<string, string> = {};\r\n keys.forEach((key, i) => {\r\n params[key] = match[i + 1];\r\n });\r\n return handler(params);\r\n }\r\n }\r\n\r\n if (routes[\"*\"]) {\r\n return routes[\"*\"]();\r\n }\r\n\r\n throw new Error(\"No route matched and no fallback provided\");\r\n };\r\n\r\n const onPopState = () => {\r\n const el = renderRoute();\r\n document.body.innerHTML = \"\";\r\n document.body.appendChild(el);\r\n };\r\n window.addEventListener(\"popstate\", onPopState);\r\n\r\n const initialEl = renderRoute();\r\n document.body.appendChild(initialEl);\r\n\r\n return {\r\n render: onPopState\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","renderRoute","window","location","pathname","params","forEach","onPopState","innerHTML","addEventListener","initialEl","st","track","nv","Array","from"],"mappings":"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"}
package/dist/state.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- export declare function state<T>(initial: T): {
2
- get: () => T;
3
- set: (newValue: T) => void;
4
- subscribe: (fn: Function) => () => void;
1
+ export type Effect = (() => void) & {
2
+ deps: Set<State<any>>;
5
3
  };
4
+ export interface State<T> {
5
+ subs: Set<Effect | (() => void)>;
6
+ val: T;
7
+ }
8
+ export declare function state<T>(v: T): State<T>;
9
+ export declare function derive(fn: () => void): Effect;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uraniyum",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.esm.js",
6
6
  "browser": "dist/index.min.js",
package/src/state.ts CHANGED
@@ -1,21 +1,62 @@
1
- export function state<T>(initial: T) {
2
- let value = initial
3
- const listeners: Function[] = []
1
+ export type Effect = (() => void) & { deps: Set<State<any>> };
4
2
 
5
- const set = (newValue: T) => {
6
- value = newValue
7
- listeners.forEach(fn => fn(value))
3
+ export interface State<T> {
4
+ subs: Set<Effect | (() => void)>;
5
+ val: T;
6
+ }
7
+
8
+ function isState<T = any>(x: unknown): x is State<T> {
9
+ return typeof x === "object" && x !== null && "subs" in x && "val" in x;
10
+ }
11
+
12
+ let currentEffect: Effect | null = null;
13
+
14
+ function track<T>(st: State<T>): void {
15
+ if (currentEffect) {
16
+ st.subs.add(currentEffect);
17
+ currentEffect.deps.add(st);
8
18
  }
19
+ }
20
+
21
+ function cleanup(effect: Effect): void {
22
+ for (const d of effect.deps) d.subs.delete(effect);
23
+ effect.deps.clear();
24
+ }
25
+
26
+ export function state<T>(v: T): State<T> {
27
+ const st = {
28
+ subs: new Set<Effect | (() => void)>(),
9
29
 
10
- const get = () => value
30
+ get val() {
31
+ track(st);
32
+ return v;
33
+ },
11
34
 
12
- const subscribe = (fn: Function) => {
13
- listeners.push(fn)
14
- return () => {
15
- const index = listeners.indexOf(fn)
16
- if (index > -1) listeners.splice(index, 1)
35
+ set val(nv: T) {
36
+ if (nv === v) return;
37
+ v = nv;
38
+ for (const fn of Array.from(st.subs)) {
39
+ (fn as (() => void))();
40
+ }
17
41
  }
18
- }
42
+ } as State<T>;
43
+
44
+ return st;
45
+ }
46
+
47
+ export function derive(fn: () => void): Effect {
48
+ const effect = (() => {
49
+ cleanup(effect);
50
+ currentEffect = effect;
51
+
52
+ try {
53
+ fn();
54
+ } finally {
55
+ currentEffect = null;
56
+ }
57
+ }) as Effect;
19
58
 
20
- return { get, set, subscribe }
21
- }
59
+ effect.deps = new Set();
60
+ effect();
61
+ return effect;
62
+ }
package/src/tags.ts CHANGED
@@ -1,20 +1,82 @@
1
+ import { derive, state, State } from "./state";
2
+
3
+ function isState(x: any): x is State<any> {
4
+ return (
5
+ x &&
6
+ typeof x === "object" &&
7
+ "subs" in x &&
8
+ Object.prototype.hasOwnProperty.call(x, "val")
9
+ );
10
+ }
11
+
1
12
  export const tags = new Proxy({}, {
2
13
  get(_, tag: string) {
3
14
  return (attrsOrChild?: any, ...children: any[]) => {
4
- const el = document.createElement(tag)
5
- if (attrsOrChild && typeof attrsOrChild === 'object' && !Array.isArray(attrsOrChild) && !(attrsOrChild instanceof Node)) {
15
+ const el = document.createElement(tag);
16
+
17
+ // Handle attributes
18
+ if (
19
+ attrsOrChild &&
20
+ typeof attrsOrChild === "object" &&
21
+ !(attrsOrChild instanceof Node) &&
22
+ !isState(attrsOrChild) &&
23
+ typeof attrsOrChild !== "function"
24
+ ) {
6
25
  for (const [k, v] of Object.entries(attrsOrChild)) {
7
- el.setAttribute(k, v as string)
26
+ el.setAttribute(k, String(v));
8
27
  }
9
28
  } else if (attrsOrChild != null) {
10
- children.unshift(attrsOrChild)
29
+ children.unshift(attrsOrChild);
11
30
  }
12
31
 
13
- for (const child of children.flat()) {
14
- if (child instanceof Node) el.appendChild(child)
15
- else el.appendChild(document.createTextNode(String(child)))
32
+ // Handle children
33
+ for (let child of children.flat()) {
34
+
35
+ // Reactive function child
36
+ if (typeof child === "function") {
37
+ let node: Node = document.createTextNode("");
38
+ el.appendChild(node);
39
+
40
+ derive(() => {
41
+ const value = child();
42
+
43
+ const newNode: Node =
44
+ value instanceof Node
45
+ ? value
46
+ : document.createTextNode(String(value ?? ""));
47
+
48
+ node.parentNode?.replaceChild(newNode, node);
49
+ node = newNode;
50
+ });
51
+
52
+ continue;
53
+ }
54
+
55
+ // Reactive state child
56
+ if (isState(child)) {
57
+ const node = document.createTextNode(String(child.val));
58
+ el.appendChild(node);
59
+
60
+ child.subs.add(() => {
61
+ node.textContent = String(child.val);
62
+ });
63
+
64
+ continue;
65
+ }
66
+
67
+ // DOM Node
68
+ if (child instanceof Node) {
69
+ el.appendChild(child);
70
+ continue;
71
+ }
72
+
73
+ // Text fallback
74
+ el.appendChild(
75
+ document.createTextNode(String(child))
76
+ );
16
77
  }
17
- return el
18
- }
78
+
79
+ return el;
80
+ };
19
81
  }
20
- })
82
+ });