uraniyum 1.0.7 → 1.0.8

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