diff --git a/dist/sigpro-ui.esm.js b/dist/sigpro-ui.esm.js index 5df6280..af87eb6 100644 --- a/dist/sigpro-ui.esm.js +++ b/dist/sigpro-ui.esm.js @@ -1,600 +1,452 @@ var __defProp = Object.defineProperty; +var __returnValue = (v) => v; +function __exportSetter(name, newValue) { + this[name] = __returnValue.bind(null, newValue); +} var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true, configurable: true, - set: (newValue) => all[name] = () => newValue + set: __exportSetter.bind(all, name) }); }; -// src/sigpro.js -var isFunc = (f) => typeof f === "function"; -var isObj = (o) => o && typeof o === "object"; -var isArr = Array.isArray; -var doc = typeof document !== "undefined" ? document : null; -var ensureNode = (n) => n?._isRuntime ? n.container : n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n)); -var activeEffect = null; -var activeOwner = null; -var isFlushing = false; -var batchDepth = 0; -var effectQueue = new Set; -var proxyCache = new WeakMap; -var ITER = Symbol("iter"); -var MOUNTED_NODES = new WeakMap; -var dispose = (eff) => { - if (!eff || eff._disposed) - return; - eff._disposed = true; - const stack = [eff]; - while (stack.length) { - const e = stack.pop(); - if (e._cleanups) { - e._cleanups.forEach((fn) => fn()); - e._cleanups.clear(); - } - if (e._children) { - e._children.forEach((child) => stack.push(child)); - e._children.clear(); - } - if (e._deps) { - e._deps.forEach((depSet) => depSet.delete(e)); - e._deps.clear(); - } - } -}; -var onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); -}; -var onUnmount = (fn) => { - if (activeOwner) - (activeOwner._cleanups ||= new Set).add(fn); -}; -var untrack = (fn) => { - const p = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = p; - } -}; -var createEffect = (fn, isComputed = false) => { - const effect = () => { - if (effect._disposed) - return; - if (effect._deps) - effect._deps.forEach((s) => s.delete(effect)); - if (effect._cleanups) { - effect._cleanups.forEach((c) => c()); - effect._cleanups.clear(); - } - const prevEffect = activeEffect; - const prevOwner = activeOwner; - activeEffect = activeOwner = effect; - try { - return effect._result = fn(); - } catch (e) { - console.error("[SigPro]", e); - } finally { - activeEffect = prevEffect; - activeOwner = prevOwner; - } - }; - effect._deps = effect._cleanups = effect._children = null; - effect._disposed = false; - effect._isComputed = isComputed; - effect._depth = activeEffect ? activeEffect._depth + 1 : 0; - effect._mounts = []; - effect._parent = activeOwner; - if (activeOwner) - (activeOwner._children ||= new Set).add(effect); - return effect; -}; -var flush = () => { - if (isFlushing) - return; - isFlushing = true; - const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); - effectQueue.clear(); - for (const e of sorted) - if (!e._disposed) - e(); - isFlushing = false; -}; -var Batch = (fn) => { - batchDepth++; - try { - return fn(); - } finally { - batchDepth--; - if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) { - flush(); - } - } -}; -var trackUpdate = (subs, trigger = false) => { - if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect); - (activeEffect._deps ||= new Set).add(subs); - } else if (trigger) { - let hasQueue = false; - subs.forEach((e) => { - if (e === activeEffect || e._disposed) - return; - if (e._isComputed) { - e._dirty = true; - if (e._subs) - trackUpdate(e._subs, true); - } else { - effectQueue.add(e); - hasQueue = true; - } - }); - if (hasQueue && !isFlushing && batchDepth === 0) - queueMicrotask(flush); - } -}; -var $2 = (val, key = null) => { - const subs = new Set; - if (isFunc(val)) { - let cache, dirty = true; - const computed = () => { - if (dirty) { - const prev = activeEffect; - activeEffect = computed; - try { - const next = val(); - if (!Object.is(cache, next)) { - cache = next; - dirty = false; - trackUpdate(subs, true); - } - } finally { - activeEffect = prev; - } - } - trackUpdate(subs); - return cache; - }; - computed._isComputed = true; - computed._subs = subs; - computed._dirty = true; - computed._deps = null; - computed._disposed = false; - computed.markDirty = () => { - dirty = true; - }; - computed.stop = () => { - computed._disposed = true; - if (computed._deps) { - computed._deps.forEach((depSet) => depSet.delete(computed)); - computed._deps.clear(); - } - subs.clear(); - }; - if (activeOwner) - onUnmount(computed.stop); - return computed; - } - if (key) - try { - val = JSON.parse(localStorage.getItem(key)) ?? val; - } catch (e) {} - return (...args) => { - if (args.length) { - const next = isFunc(args[0]) ? args[0](val) : args[0]; - if (!Object.is(val, next)) { - val = next; - if (key) - localStorage.setItem(key, JSON.stringify(val)); - trackUpdate(subs, true); - } - } - trackUpdate(subs); - return val; - }; -}; -var $$ = (target) => { - if (!isObj(target)) - return target; - if (proxyCache.has(target)) - return proxyCache.get(target); - const subsMap = new Map; - const getSubs = (k) => { - let s = subsMap.get(k); - if (!s) - subsMap.set(k, s = new Set); - return s; - }; - const proxy = new Proxy(target, { - get(t, k) { - trackUpdate(getSubs(k)); - return $$(t[k]); - }, - set(t, k, v) { - const isNew = !(k in t); - if (!Object.is(t[k], v)) { - t[k] = v; - trackUpdate(getSubs(k), true); - if (isNew) - trackUpdate(getSubs(ITER), true); - } - return true; - }, - deleteProperty(t, k) { - const res = Reflect.deleteProperty(t, k); - if (res) { - trackUpdate(getSubs(k), true); - trackUpdate(getSubs(ITER), true); - } - return res; - }, - ownKeys(t) { - trackUpdate(getSubs(ITER)); - return Reflect.ownKeys(t); - } - }); - proxyCache.set(target, proxy); - return proxy; -}; -var Watch2 = (sources, cb) => { - if (cb === undefined) { - const effect2 = createEffect(sources); - effect2(); - return () => dispose(effect2); - } - const effect = createEffect(() => { - const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); - untrack(() => cb(vals)); - }); - effect(); - return () => dispose(effect); -}; -var cleanupNode = (node) => { - if (node._cleanups) { - node._cleanups.forEach((fn) => fn()); - node._cleanups.clear(); - } - if (node._ownerEffect) - dispose(node._ownerEffect); - if (node.childNodes) - node.childNodes.forEach(cleanupNode); -}; -var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; -var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); -var validateAttr = (key, val) => { - if (val == null || val === false) - return null; - if (isDangerousAttr(key)) { - const sVal = String(val); - if (DANGEROUS_PROTOCOL.test(sVal)) { - console.warn(`[SigPro] Bloqueado protocolo peligroso en ${key}`); - return "#"; - } - } - return val; -}; -var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || !isObj(props)) { - children = props; - props = {}; - } - if (isFunc(tag)) { - const ctx = { _mounts: [], _cleanups: new Set }; - const effect = createEffect(() => { - const result2 = tag(props, { - children, - emit: (ev, ...args) => props[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...args) - }); - effect._result = result2; - return result2; - }); - effect(); - const result = effect._result; - if (result == null) - return null; - const node = result instanceof Node || isArr(result) && result.every((n) => n instanceof Node) ? result : doc.createTextNode(String(result)); - const attach = (n) => { - if (isObj(n) && !n._isRuntime) { - n._mounts = effect._mounts || []; - n._cleanups = effect._cleanups || new Set; - n._ownerEffect = effect; - } - }; - isArr(node) ? node.forEach(attach) : attach(node); - return node; - } - const isSVG = /^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; - let v = props[k]; - if (k === "ref") { - isFunc(v) ? v(el) : v.current = el; - continue; - } - if (k.startsWith("on")) { - const ev = k.slice(2).toLowerCase(); - el.addEventListener(ev, v); - const off = () => el.removeEventListener(ev, v); - el._cleanups.add(off); - onUnmount(off); - } else if (isFunc(v)) { - const effect = createEffect(() => { - const val = validateAttr(k, v()); - if (k === "class") - el.className = val || ""; - else if (val == null) - el.removeAttribute(k); - else if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) { - const evType = k === "checked" ? "change" : "input"; - el.addEventListener(evType, (ev) => v(ev.target[k])); - } - } else { - const val = validateAttr(k, v); - if (val != null) { - if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - } - } - } - const append = (c) => { - if (isArr(c)) - return c.forEach(append); - if (isFunc(c)) { - const anchor = doc.createTextNode(""); - el.appendChild(anchor); - let currentNodes = []; - const effect = createEffect(() => { - const res = c(); - const next = (isArr(res) ? res : [res]).map(ensureNode); - currentNodes.forEach((n) => { - if (n._isRuntime) - n.destroy(); - else - cleanupNode(n); - if (n.parentNode) - n.remove(); - }); - let ref = anchor; - for (let i = next.length - 1;i >= 0; i--) { - const node = next[i]; - if (node.parentNode !== ref.parentNode) - ref.parentNode?.insertBefore(node, ref); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - ref = node; - } - currentNodes = next; - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - } else { - const node = ensureNode(c); - el.appendChild(node); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - } - }; - append(children); - return el; -}; -var Render = (renderFn) => { - const cleanups = new Set; - const mounts = []; - const previousOwner = activeOwner; - const previousEffect = activeEffect; - const container = doc.createElement("div"); - container.style.display = "contents"; - container.setAttribute("role", "presentation"); - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - activeEffect = null; - const processResult = (result) => { - if (!result) - return; - if (result._isRuntime) { - cleanups.add(result.destroy); - container.appendChild(result.container); - } else if (isArr(result)) { - result.forEach(processResult); - } else { - container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); - } - }; - try { - processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); - } finally { - activeOwner = previousOwner; - activeEffect = previousEffect; - } - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(container); - container.remove(); - } - }; -}; -var If2 = (cond, ifYes, ifNot = null) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let currentView = null; - Watch2(() => !!(isFunc(cond) ? cond() : cond), (show) => { - if (currentView) { - currentView.destroy(); - currentView = null; - } - const content = show ? ifYes : ifNot; - if (content) { - currentView = Render(() => isFunc(content) ? content() : content); - root.insertBefore(currentView.container, anchor); - } - }); - onUnmount(() => currentView?.destroy()); - return root; -}; -var For2 = (src, itemFn, keyFn) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let cache = new Map; - Watch2(() => (isFunc(src) ? src() : src) || [], (items) => { - const nextCache = new Map; - const nextOrder = []; - const newItems = items || []; - for (let i = 0;i < newItems.length; i++) { - const item = newItems[i]; - const key = keyFn ? keyFn(item, i) : item?.id ?? i; - let view = cache.get(key); - if (!view) - view = Render(() => itemFn(item, i)); - else - cache.delete(key); - nextCache.set(key, view); - nextOrder.push(view); - } - cache.forEach((view) => view.destroy()); - let lastRef = anchor; - for (let i = nextOrder.length - 1;i >= 0; i--) { - const view = nextOrder[i]; - const node = view.container; - if (node.nextSibling !== lastRef) - root.insertBefore(node, lastRef); - lastRef = node; - } - cache = nextCache; - }); - return root; -}; -var Router = (routes) => { - const getHash = () => window.location.hash.slice(1) || "/"; - const path = $2(getHash()); - const handler = () => path(getHash()); - window.addEventListener("hashchange", handler); - onUnmount(() => window.removeEventListener("hashchange", handler)); - const hook = Tag2("div", { class: "router-hook" }); - let currentView = null; - Watch2([path], () => { - const cur = path(); - const route = routes.find((r) => { - const p1 = r.path.split("/").filter(Boolean); - const p2 = cur.split("/").filter(Boolean); - return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]); - }) || routes.find((r) => r.path === "*"); - if (route) { - currentView?.destroy(); - const params = {}; - route.path.split("/").filter(Boolean).forEach((p, i) => { - if (p[0] === ":") - params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; - }); - Router.params(params); - currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); - hook.replaceChildren(currentView.container); - } - }); - return hook; -}; -Router.params = $2({}); -Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); -Router.back = () => window.history.back(); -Router.path = () => window.location.hash.replace(/^#/, "") || "/"; -var Mount2 = (comp, target) => { - const t = typeof target === "string" ? doc.querySelector(target) : target; - if (!t) - return; - if (MOUNTED_NODES.has(t)) - MOUNTED_NODES.get(t).destroy(); - const inst = Render(isFunc(comp) ? comp : () => comp); - t.replaceChildren(inst.container); - MOUNTED_NODES.set(t, inst); - return inst; -}; -var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); -if (typeof window !== "undefined") { - Object.assign(window, SigPro); - "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((t) => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)); -} - -// src/components/index.js -var exports_components = {}; -__export(exports_components, { - default: () => components_default, - Tooltip: () => Tooltip, - Toast: () => Toast, - Timeline: () => Timeline, - Tabs: () => Tabs, - Table: () => Table, - Swap: () => Swap, - Stat: () => Stat, - Stack: () => Stack, - Select: () => Select, - Rating: () => Rating, - Range: () => Range, - Radio: () => Radio, - Navbar: () => Navbar, - Modal: () => Modal, - Menu: () => Menu, - List: () => List, - Label: () => Label, - Input: () => Input, - Indicator: () => Indicator, - Fileinput: () => Fileinput, - Fieldset: () => Fieldset, - Fab: () => Fab, - Dropdown: () => Dropdown, - Drawer: () => Drawer, - Datepicker: () => Datepicker, - Colorpicker: () => Colorpicker, - Checkbox: () => Checkbox, - Button: () => Button, - Badge: () => Badge, - Autocomplete: () => Autocomplete, - Alert: () => Alert, - Accordion: () => Accordion -}); - // src/components/Accordion.js var exports_Accordion = {}; __export(exports_Accordion, { Accordion: () => Accordion }); +// node_modules/sigpro/dist/sigpro.esm.min.js +var m = (e) => typeof e === "function"; +var j = (e) => e && typeof e === "object"; +var N = Array.isArray; +var E = typeof document < "u" ? document : null; +var $2 = (e) => e?._isRuntime ? e.container : e instanceof Node ? e : E.createTextNode(e == null ? "" : String(e)); +var p = null; +var _ = null; +var C = false; +var A = 0; +var T = new Set; +var U = new WeakMap; +var L = Symbol("iter"); +var M = new WeakMap; +var v = (e) => { + if (!e || e._disposed) + return; + e._disposed = true; + let s = [e]; + while (s.length) { + let t = s.pop(); + if (t._cleanups) + t._cleanups.forEach((r) => r()), t._cleanups.clear(); + if (t._children) + t._children.forEach((r) => s.push(r)), t._children.clear(); + if (t._deps) + t._deps.forEach((r) => r.delete(t)), t._deps.clear(); + } +}; +var k = (e) => { + if (_) + (_._mounts ||= []).push(e); +}; +var g = (e) => { + if (_) + (_._cleanups ||= new Set).add(e); +}; +var q = (e) => { + let s = p; + p = null; + try { + return e(); + } finally { + p = s; + } +}; +var O = (e, s = false) => { + let t = () => { + if (t._disposed) + return; + if (t._deps) + t._deps.forEach((c) => c.delete(t)); + if (t._cleanups) + t._cleanups.forEach((c) => c()), t._cleanups.clear(); + let r = p, n = _; + p = _ = t; + try { + return t._result = e(); + } catch (c) { + console.error("[SigPro]", c); + } finally { + p = r, _ = n; + } + }; + if (t._deps = t._cleanups = t._children = null, t._disposed = false, t._isComputed = s, t._depth = p ? p._depth + 1 : 0, t._mounts = [], t._parent = _, _) + (_._children ||= new Set).add(t); + return t; +}; +var W = () => { + if (C) + return; + C = true; + let e = Array.from(T).sort((s, t) => s._depth - t._depth); + T.clear(); + for (let s of e) + if (!s._disposed) + s(); + C = false; +}; +var z = (e) => { + A++; + try { + return e(); + } finally { + if (A--, A === 0 && T.size > 0 && !C) + W(); + } +}; +var w = (e, s = false) => { + if (!s && p && !p._disposed) + e.add(p), (p._deps ||= new Set).add(e); + else if (s && e.size > 0) { + let t = false; + for (let r of e) { + if (r === p || r._disposed) + continue; + if (r._isComputed) { + if (r._dirty = true, r._subs) + w(r._subs, true); + } else + T.add(r), t = true; + } + if (t && !C && A === 0) + queueMicrotask(W); + } +}; +var B = (e, s = null) => { + let t = new Set; + if (m(e)) { + let r, n = () => { + if (n._dirty) { + let c = p; + p = n; + try { + let i = e(); + if (!Object.is(r, i)) + r = i, w(t, true); + } finally { + p = c; + } + n._dirty = false; + } + return w(t), r; + }; + if (n._isComputed = true, n._subs = t, n._dirty = true, n._deps = null, n._disposed = false, n.stop = () => {}, _) + g(n.stop); + return n; + } + if (s) + try { + e = JSON.parse(localStorage.getItem(s)) ?? e; + } catch (r) {} + return (...r) => { + if (r.length) { + let n = m(r[0]) ? r[0](e) : r[0]; + if (!Object.is(e, n)) { + if (e = n, s) + localStorage.setItem(s, JSON.stringify(e)); + w(t, true); + } + } + return w(t), e; + }; +}; +var D = (e) => { + if (!j(e)) + return e; + let s = U.get(e); + if (s) + return s; + let t = new Map, r = (n) => { + let c = t.get(n); + if (!c) + t.set(n, c = new Set); + return c; + }; + return s = new Proxy(e, { get(n, c, i) { + if (typeof c !== "symbol") + w(r(c)); + return D(Reflect.get(n, c, i)); + }, set(n, c, i, o) { + let l = !Reflect.has(n, c), a = Reflect.get(n, c, o), d = Reflect.set(n, c, i, o); + if (d && !Object.is(a, i)) { + if (w(r(c), true), l) + w(r(L), true); + } + return d; + }, deleteProperty(n, c) { + let i = Reflect.deleteProperty(n, c); + if (i) + w(r(c), true), w(r(L), true); + return i; + }, ownKeys(n) { + return w(r(L)), Reflect.ownKeys(n); + } }), U.set(e, s), s; +}; +var R = (e, s) => { + if (s === undefined) { + let r = O(e); + return r(), () => v(r); + } + let t = O(() => { + let r = Array.isArray(e) ? e.map((n) => n()) : e(); + q(() => s(r)); + }); + return t(), () => v(t); +}; +var P = (e) => { + if (e._cleanups) + e._cleanups.forEach((s) => s()), e._cleanups.clear(); + if (e._ownerEffect) + v(e._ownerEffect); + if (e.childNodes) + e.childNodes.forEach(P); +}; +var F = /^\s*(javascript|data|vbscript):/i; +var G = (e) => e === "src" || e === "href" || e.startsWith("on"); +var I = (e, s) => { + if (s == null || s === false) + return null; + if (G(e)) { + let t = String(s); + if (F.test(t)) + return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`), "#"; + } + return s; +}; +var S = (e, s = {}, t = []) => { + if (s instanceof Node || N(s) || !j(s)) + t = s, s = {}; + if (m(e)) { + let i = { _mounts: [], _cleanups: new Set }, o = O(() => { + let f = e(s, { children: t, emit: (h, ...u) => s[`on${h[0].toUpperCase()}${h.slice(1)}`]?.(...u) }); + return o._result = f, f; + }); + o(); + let l = o._result; + if (l == null) + return null; + let a = l instanceof Node || N(l) && l.every((f) => f instanceof Node) ? l : E.createTextNode(String(l)), d = (f) => { + if (j(f) && !f._isRuntime) + f._mounts = o._mounts || [], f._cleanups = o._cleanups || new Set, f._ownerEffect = o; + }; + return N(a) ? a.forEach(d) : d(a), a; + } + let r = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(e), n = r ? E.createElementNS("http://www.w3.org/2000/svg", e) : E.createElement(e); + n._cleanups = new Set; + for (let i in s) { + if (!s.hasOwnProperty(i)) + continue; + let o = s[i]; + if (i === "ref") { + m(o) ? o(n) : o.current = n; + continue; + } + if (r && i.startsWith("xlink:")) { + val == null ? n.removeAttributeNS("http://www.w3.org/1999/xlink", i.slice(6)) : n.setAttributeNS("http://www.w3.org/1999/xlink", i.slice(6), val); + continue; + } + if (i.startsWith("on")) { + let l = i.slice(2).toLowerCase(); + n.addEventListener(l, o); + let a = () => n.removeEventListener(l, o); + n._cleanups.add(a), g(a); + } else if (m(o)) { + let l = O(() => { + let a = I(i, o()); + if (i === "class") + n.className = a || ""; + else if (a == null) + n.removeAttribute(i); + else if (i in n && !r) + n[i] = a; + else + n.setAttribute(i, a === true ? "" : a); + }); + if (l(), n._cleanups.add(() => v(l)), g(() => v(l)), /^(INPUT|TEXTAREA|SELECT)$/.test(n.tagName) && (i === "value" || i === "checked")) { + let a = i === "checked" ? "change" : "input"; + n.addEventListener(a, (d) => o(d.target[i])); + } + } else { + let l = I(i, o); + if (l != null) + if (i in n && !r) + n[i] = l; + else + n.setAttribute(i, l === true ? "" : l); + } + } + let c = (i) => { + if (N(i)) + return i.forEach(c); + if (m(i)) { + let o = E.createTextNode(""); + n.appendChild(o); + let l = [], a = O(() => { + let d = i(), f = (N(d) ? d : [d]).map($2); + l.forEach((u) => { + if (u._isRuntime) + u.destroy(); + else + P(u); + if (u.parentNode) + u.remove(); + }); + let h = o; + for (let u = f.length - 1;u >= 0; u--) { + let y = f[u]; + if (y.parentNode !== h.parentNode) + h.parentNode?.insertBefore(y, h); + if (y._mounts) + y._mounts.forEach((V) => V()); + h = y; + } + l = f; + }); + a(), n._cleanups.add(() => v(a)), g(() => v(a)); + } else { + let o = $2(i); + if (n.appendChild(o), o._mounts) + o._mounts.forEach((l) => l()); + } + }; + return c(t), n; +}; +var b = (e) => { + let s = new Set, t = [], r = _, n = p, c = E.createElement("div"); + c.style.display = "contents", c.setAttribute("role", "presentation"), _ = { _cleanups: s, _mounts: t }, p = null; + let i = (o) => { + if (!o) + return; + if (o._isRuntime) + s.add(o.destroy), c.appendChild(o.container); + else if (N(o)) + o.forEach(i); + else + c.appendChild(o instanceof Node ? o : E.createTextNode(String(o == null ? "" : o))); + }; + try { + i(e({ onCleanup: (o) => s.add(o) })); + } finally { + _ = r, p = n; + } + return t.forEach((o) => o()), { _isRuntime: true, container: c, destroy: () => { + s.forEach((o) => o()), P(c), c.remove(); + } }; +}; +var J = (e, s, t = null) => { + let r = E.createTextNode(""), n = S("div", { style: "display:contents" }, [r]), c = null; + return R(() => !!(m(e) ? e() : e), (i) => { + if (c) + c.destroy(), c = null; + let o = i ? s : t; + if (o) + c = b(() => m(o) ? o() : o), n.insertBefore(c.container, r); + }), g(() => c?.destroy()), n; +}; +var K = (e, s, t) => { + let r = E.createTextNode(""), n = S("div", { style: "display:contents" }, [r]), c = new Map; + return R(() => (m(e) ? e() : e) || [], (i) => { + let o = new Map, l = [], a = i || []; + for (let f = 0;f < a.length; f++) { + let h = a[f], u = t ? t(h, f) : h?.id ?? f, y = c.get(u); + if (!y) + y = b(() => s(h, f)); + else + c.delete(u); + o.set(u, y), l.push(y); + } + c.forEach((f) => f.destroy()); + let d = r; + for (let f = l.length - 1;f >= 0; f--) { + let u = l[f].container; + if (u.nextSibling !== d) + n.insertBefore(u, d); + d = u; + } + c = o; + }), n; +}; +var x = (e) => { + let s = () => window.location.hash.slice(1) || "/", t = B(s()), r = () => t(s()); + window.addEventListener("hashchange", r), g(() => window.removeEventListener("hashchange", r)); + let n = S("div", { class: "router-hook" }), c = null; + return R([t], () => { + let i = t(), o = e.find((l) => { + let a = l.path.split("/").filter(Boolean), d = i.split("/").filter(Boolean); + return a.length === d.length && a.every((f, h) => f[0] === ":" || f === d[h]); + }) || e.find((l) => l.path === "*"); + if (o) { + c?.destroy(); + let l = {}; + o.path.split("/").filter(Boolean).forEach((a, d) => { + if (a[0] === ":") + l[a.slice(1)] = i.split("/").filter(Boolean)[d]; + }), x.params(l), c = b(() => m(o.component) ? o.component(l) : o.component), n.replaceChildren(c.container); + } + }), n; +}; +x.params = B({}); +x.to = (e) => window.location.hash = e.replace(/^#?\/?/, "#/"); +x.back = () => window.history.back(); +x.path = () => window.location.hash.replace(/^#/, "") || "/"; +var Q = (e, s, { enter: t, leave: r } = {}) => { + let n = S("div", { style: "display:contents" }), c = null, i = (o, l) => { + let a = false, d = () => !a && (a = true, l()); + if (!o) + return d(); + "transitionend animationend".split(" ").map((f) => o.addEventListener(f, d, { once: true })), setTimeout(d, 500); + }; + return R(e, (o) => { + if (o && !c) { + let l = (c = b(s)).container.firstChild; + if (n.appendChild(c.container), t && l) + l.classList.add(t), l.clientTop, l.classList.add(t + "-active"), i(l, () => l.classList.remove(t, t + "-active")); + } else if (!o && c) { + let l = c.container.firstChild, a = () => (c?.destroy(), c = null); + r && l ? (l.classList.add(r), i(l, a)) : a(); + } + }), g(() => c?.destroy()), n; +}; +var H = (e, s) => { + let t = typeof s === "string" ? E.querySelector(s) : s; + if (!t) + return; + if (M.has(t)) + M.get(t).destroy(); + let r = b(m(e) ? e : () => e); + return t.replaceChildren(r.container), M.set(t, r), r; +}; +var X = Object.freeze({ $: B, $$: D, Watch: R, Tag: S, Render: b, If: J, For: K, Router: x, Mount: H, onMount: k, onUnmount: g, Anim: Q, Batch: z }); +if (typeof window < "u") + Object.assign(window, X), "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((e) => { + let s = e[0].toUpperCase() + e.slice(1); + window[s] = (t, r) => S(e, t, r); + }); + // src/core/utils.js -var exports_utils = {}; -__export(exports_utils, { - val: () => val, - ui: () => ui, - getIcon: () => getIcon -}); -var val = (t) => typeof t === "function" ? t() : t; +var val2 = (t) => typeof t === "function" ? t() : t; var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); var getIcon = (icon) => { if (!icon) return null; if (typeof icon === "function") { - return Tag("span", { class: "mr-1" }, icon()); + return S("span", { class: "mr-1" }, icon()); } if (typeof icon === "object") { - return Tag("span", { class: "mr-1" }, icon); + return S("span", { class: "mr-1" }, icon); } if (typeof icon === "string") { const parts = icon.trim().split(/\s+/); @@ -602,27 +454,48 @@ var getIcon = (icon) => { const iconClass = hasRight ? parts.slice(0, -1).join(" ") : icon; const spacing = hasRight ? "ml-1" : "mr-1"; if (iconClass && !iconClass.startsWith("icon-[") && !iconClass.includes("--")) { - return Tag("span", { class: spacing }, iconClass); + return S("span", { class: spacing }, iconClass); } - return Tag("span", { class: `${iconClass} ${spacing}`.trim() }); + return S("span", { class: `${iconClass} ${spacing}`.trim() }); } return null; }; +var i18n = { + es: { + close: "Cerrar", + confirm: "Confirmar", + cancel: "Cancelar", + search: "Buscar...", + loading: "Cargando...", + nodata: "Sin datos" + }, + en: { + close: "Close", + confirm: "Confirm", + cancel: "Cancel", + search: "Search...", + loading: "Loading...", + nodata: "No data" + } +}; +var currentLocale = B("es"); +var Locale = (t) => currentLocale(t); +var tt = (t) => () => i18n[currentLocale()][t] || t; // src/components/Accordion.js var Accordion = (props, children) => { const { class: className, title, name, open, ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: ui("collapse collapse-arrow bg-base-200 mb-2", className) }, [ - Tag("input", { + S("input", { type: name ? "radio" : "checkbox", name, - checked: val(open) + checked: val2(open) }), - Tag("div", { class: "collapse-title text-xl font-medium" }, title), - Tag("div", { class: "collapse-content" }, children) + S("div", { class: "collapse-title text-xl font-medium" }, title), + S("div", { class: "collapse-content" }, children) ]); }; @@ -643,16 +516,16 @@ var Alert = (props, children) => { const softClass = soft ? "alert-soft" : ""; const allClasses = [typeClass, softClass, className].filter(Boolean).join(" "); const content = children || props.message; - return Tag("div", { + return S("div", { ...rest, role: "alert", class: ui("alert", allClasses) }, () => [ getIcon(iconMap[type]), - Tag("div", { class: "flex-1" }, [ - Tag("span", {}, [typeof content === "function" ? content() : content]) + S("div", { class: "flex-1" }, [ + S("span", {}, [typeof content === "function" ? content() : content]) ]), - actions ? Tag("div", { class: "flex-none" }, [ + actions ? S("div", { class: "flex-none" }, [ typeof actions === "function" ? actions() : actions ]) : null ].filter(Boolean)); @@ -664,28 +537,6 @@ __export(exports_Autocomplete, { Autocomplete: () => Autocomplete }); -// src/core/i18n.js -var i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } -}; -var currentLocale = $("es"); -var tt = (t) => () => i18n[currentLocale()][t] || t; - // src/components/Input.js var exports_Input = {}; __export(exports_Input, { @@ -747,22 +598,22 @@ var Input = (props) => { classes += " input-error"; return classes.trim(); }; - const inputElement = Tag("input", { + const inputElement = S("input", { ...rest, type: () => isPassword ? visible() ? "text" : "password" : type, placeholder: placeholder || (label ? " " : placeholder), class: inputClasses, value, oninput: handleInput, - disabled: () => val(disabled), + disabled: () => val2(disabled), "aria-invalid": () => hasError() ? "true" : "false" }); const inputContent = () => [ inputElement, - leftIcon ? Tag("div", { + leftIcon ? S("div", { class: "absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60" }, leftIcon) : null, - isPassword ? Tag("button", { + isPassword ? S("button", { type: "button", class: ui("absolute right-3 inset-y-0 flex items-center", "btn btn-ghost btn-circle opacity-50 hover:opacity-100", buttonSize()), onclick: (e) => { @@ -770,30 +621,30 @@ var Input = (props) => { visible(!visible()); } }, () => getPasswordIcon()) : null, - Tag("div", { + S("div", { class: "text-error text-xs mt-1 px-3 absolute -bottom-5 left-0" }, () => hasError() ? errorMsg() : null) ]; if (label) { - return Tag("label", { class: ui("floating-label w-full", className) }, () => [ - Tag("div", { class: "relative w-full" }, inputContent), - Tag("span", {}, val(label)) + return S("label", { class: ui("floating-label w-full", className) }, () => [ + S("div", { class: "relative w-full" }, inputContent), + S("span", {}, val2(label)) ]); } - return Tag("div", { class: "relative w-full" }, inputContent); + return S("div", { class: "relative w-full" }, inputContent); }; // src/components/Autocomplete.js var Autocomplete = (props) => { const { class: className, items = [], value, onselect, label, placeholder, ...rest } = props; - const query = $(val(value) || ""); - const isOpen = $(false); - const cursor = $(-1); - const list = $([]); + const query = B(val2(value) || ""); + const isOpen = B(false); + const cursor = B(-1); + const list = B([]); Watch(() => { - const q = String(query()).toLowerCase(); - const data = val(items) || []; - const filtered = q ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) : data; + const q2 = String(query()).toLowerCase(); + const data = val2(items) || []; + const filtered = q2 ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q2)) : data; list(filtered); }); const pick = (opt) => { @@ -822,37 +673,37 @@ var Autocomplete = (props) => { isOpen(false); } }; - return Tag("div", { class: "relative w-full" }, [ + return S("div", { class: "relative w-full" }, [ Input({ label, class: className, - placeholder: placeholder || tt("search")(), + placeholder, value: query, onfocus: () => isOpen(true), onblur: () => setTimeout(() => isOpen(false), 150), onkeydown: nav, oninput: (e) => { - const v = e.target.value; - query(v); + const v2 = e.target.value; + query(v2); if (typeof value === "function") - value(v); + value(v2); isOpen(true); cursor(-1); }, ...rest }), - Tag("ul", { + S("ul", { class: "absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", style: () => isOpen() && list().length ? "display:block" : "display:none" }, [ - For(list, (opt, i) => Tag("li", {}, [ - Tag("a", { + K(list, (opt, i) => S("li", {}, [ + S("a", { class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, onclick: () => pick(opt), onmouseenter: () => cursor(i) }, typeof opt === "string" ? opt : opt.label) ]), (opt, i) => (typeof opt === "string" ? opt : opt.value) + i), - () => list().length ? null : Tag("li", { class: "p-2 text-center opacity-50" }, tt("nodata")()) + () => list().length ? null : S("li", { class: "p-2 text-center opacity-50" }, "nodata") ]) ]); }; @@ -864,7 +715,7 @@ __export(exports_Badge, { }); var Badge = (props, children) => { const { class: className, ...rest } = props; - return Tag("span", { + return S("span", { ...rest, class: ui("badge", className) }, children); @@ -878,12 +729,12 @@ __export(exports_Button, { var Button = (props, children) => { const { class: className, loading, icon, ...rest } = props; const iconEl = getIcon(icon); - return Tag("button", { + return S("button", { ...rest, class: ui("btn", className), - disabled: () => val(loading) || val(props.disabled) + disabled: () => val2(loading) || val2(props.disabled) }, () => [ - val(loading) && Tag("span", { class: "loading loading-spinner" }), + val2(loading) && S("span", { class: "loading loading-spinner" }), iconEl, children ].filter(Boolean)); @@ -896,15 +747,15 @@ __export(exports_Checkbox, { }); var Checkbox = (props) => { const { class: className, value, toggle, label, ...rest } = props; - const checkEl = Tag("input", { + const checkEl = S("input", { ...rest, type: "checkbox", - class: () => ui(val(toggle) ? "toggle" : "checkbox", className), + class: () => ui(val2(toggle) ? "toggle" : "checkbox", className), checked: value }); - return Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ + return S("label", { class: "label cursor-pointer justify-start gap-3" }, [ checkEl, - label ? Tag("span", { class: "label-text" }, label) : null + label ? S("span", { class: "label-text" }, label) : null ]); }; @@ -915,7 +766,7 @@ __export(exports_Colorpicker, { }); var Colorpicker = (props) => { const { class: className, value, label, ...rest } = props; - const isOpen = $(false); + const isOpen = B(false); const palette = [ ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], @@ -926,9 +777,9 @@ var Colorpicker = (props) => { ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"] ]; - const getColor = () => val(value) || "#000000"; - return Tag("div", { class: ui("relative w-fit", className) }, [ - Tag("button", { + const getColor = () => val2(value) || "#000000"; + return S("div", { class: ui("relative w-fit", className) }, [ + S("button", { type: "button", class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", onclick: (e) => { @@ -937,17 +788,17 @@ var Colorpicker = (props) => { }, ...rest }, [ - Tag("div", { + S("div", { class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", style: () => `background-color: ${getColor()}` }), - label ? Tag("span", { class: "opacity-80" }, label) : null + label ? S("span", { class: "opacity-80" }, label) : null ]), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", onclick: (e) => e.stopPropagation() }, [ - Tag("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => Tag("button", { + S("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => S("button", { type: "button", style: `background-color: ${c}`, class: () => { @@ -962,7 +813,7 @@ var Colorpicker = (props) => { } }))) ])), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "fixed inset-0 z-[100]", onclick: () => isOpen(false) })) @@ -976,12 +827,12 @@ __export(exports_Datepicker, { }); var Datepicker = (props) => { const { class: className, value, range, label, placeholder, hour = false, ...rest } = props; - const isOpen = $(false); - const internalDate = $(new Date); - const hoverDate = $(null); - const startHour = $(0); - const endHour = $(0); - const isRangeMode = () => val(range) === true; + const isOpen = B(false); + const internalDate = B(new Date); + const hoverDate = B(null); + const startHour = B(0); + const endHour = B(0); + const isRangeMode = () => val2(range) === true; const now = new Date; const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; const formatDate = (d) => { @@ -992,7 +843,7 @@ var Datepicker = (props) => { }; const selectDate = (date) => { const dateStr = formatDate(date); - const current = val(value); + const current = val2(value); if (isRangeMode()) { if (!current?.start || current.start && current.end) { if (typeof value === "function") { @@ -1021,38 +872,38 @@ var Datepicker = (props) => { isOpen(false); } }; - const displayValue = $(""); + const displayValue = B(""); Watch(() => { - const v = val(value); - if (!v) { + const v2 = val2(value); + if (!v2) { displayValue(""); return; } let text = ""; - if (typeof v === "string") { - text = hour && v.includes("T") ? v.replace("T", " ") : v; - } else if (v.start && v.end) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour !== undefined ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; + if (typeof v2 === "string") { + text = hour && v2.includes("T") ? v2.replace("T", " ") : v2; + } else if (v2.start && v2.end) { + const startStr = hour && v2.startHour !== undefined ? `${v2.start} ${String(v2.startHour).padStart(2, "0")}:00` : v2.start; + const endStr = hour && v2.endHour !== undefined ? `${v2.end} ${String(v2.endHour).padStart(2, "0")}:00` : v2.end; text = `${startStr} - ${endStr}`; - } else if (v.start) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + } else if (v2.start) { + const startStr = hour && v2.startHour !== undefined ? `${v2.start} ${String(v2.startHour).padStart(2, "0")}:00` : v2.start; text = `${startStr}...`; } displayValue(text); }); - const move = (m) => { + const move = (m2) => { const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); + internalDate(new Date(d.getFullYear(), d.getMonth() + m2, 1)); }; const moveYear = (y) => { const d = internalDate(); internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); }; const HourSlider = ({ value: hVal, onChange }) => { - return Tag("div", { class: "flex-1" }, [ - Tag("div", { class: "flex gap-2 items-center" }, [ - Tag("input", { + return S("div", { class: "flex-1" }, [ + S("div", { class: "flex gap-2 items-center" }, [ + S("input", { type: "range", min: 0, max: 23, @@ -1063,11 +914,11 @@ var Datepicker = (props) => { onChange(newHour); } }), - Tag("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val(hVal)).padStart(2, "0") + ":00") + S("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val2(hVal)).padStart(2, "0") + ":00") ]) ]); }; - return Tag("div", { class: ui("relative w-full", className) }, [ + return S("div", { class: ui("relative w-full", className) }, [ Input({ label, placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), @@ -1080,25 +931,25 @@ var Datepicker = (props) => { }, ...rest }), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", onclick: (e) => e.stopPropagation() }, [ - Tag("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, getIcon("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon("icon-[lucide--chevron-left]")) + S("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ + S("div", { class: "flex gap-0.5" }, [ + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, getIcon("icon-[lucide--chevrons-left]")), + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon("icon-[lucide--chevron-left]")) ]), - Tag("span", { class: "font-bold uppercase flex-1 text-center" }, [ + S("span", { class: "font-bold uppercase flex-1 text-center" }, [ () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }) ]), - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, getIcon("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon("icon-[lucide--chevrons-right]")) + S("div", { class: "flex gap-0.5" }, [ + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, getIcon("icon-[lucide--chevron-right]")), + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon("icon-[lucide--chevrons-right]")) ]) ]), - Tag("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => Tag("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), + S("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ + ...["L", "M", "X", "J", "V", "S", "D"].map((d) => S("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), () => { const d = internalDate(); const year = d.getFullYear(); @@ -1108,24 +959,24 @@ var Datepicker = (props) => { const daysInMonth = new Date(year, month + 1, 0).getDate(); const nodes = []; for (let i = 0;i < offset; i++) - nodes.push(Tag("div")); + nodes.push(S("div")); for (let i = 1;i <= daysInMonth; i++) { const date = new Date(year, month, i); const dStr = formatDate(date); - nodes.push(Tag("button", { + nodes.push(S("button", { type: "button", class: () => { - const v = val(value); + const v2 = val2(value); const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; + const isStart = typeof v2 === "string" ? v2.split("T")[0] === dStr : v2?.start === dStr; + const isEnd = v2?.end === dStr; let inRange = false; - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { + if (isRangeMode() && v2?.start) { + const start = v2.start; + if (!v2.end && h) { inRange = dStr > start && dStr <= h || dStr < start && dStr >= h; - } else if (v.end) { - inRange = dStr > start && dStr < v.end; + } else if (v2.end) { + inRange = dStr > start && dStr < v2.end; } } const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; @@ -1143,13 +994,13 @@ var Datepicker = (props) => { return nodes; } ]), - hour ? Tag("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() ? Tag("div", { class: "flex gap-4" }, [ + hour ? S("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ + isRangeMode() ? S("div", { class: "flex gap-4" }, [ HourSlider({ value: startHour, onChange: (newHour) => { startHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal?.start) value({ ...currentVal, startHour: newHour }); } @@ -1158,7 +1009,7 @@ var Datepicker = (props) => { value: endHour, onChange: (newHour) => { endHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal?.end) value({ ...currentVal, endHour: newHour }); } @@ -1167,7 +1018,7 @@ var Datepicker = (props) => { value: startHour, onChange: (newHour) => { startHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal && typeof currentVal === "string") { value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); } @@ -1175,7 +1026,7 @@ var Datepicker = (props) => { }) ]) : null ])), - If(isOpen, () => Tag("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) + J(isOpen, () => S("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) ]); }; @@ -1187,11 +1038,11 @@ __export(exports_Drawer, { var Drawer = (props, children) => { const { class: className, id, open, side, content, ...rest } = props; const drawerId = id || `drawer-${Math.random().toString(36).slice(2, 9)}`; - return Tag("div", { + return S("div", { ...rest, class: ui("drawer", className) }, [ - Tag("input", { + S("input", { id: drawerId, type: "checkbox", class: "drawer-toggle", @@ -1201,11 +1052,11 @@ var Drawer = (props, children) => { open(e.target.checked); } }), - Tag("div", { class: "drawer-content" }, [ + S("div", { class: "drawer-content" }, [ typeof content === "function" ? content() : content ]), - Tag("div", { class: "drawer-side" }, [ - Tag("label", { + S("div", { class: "drawer-side" }, [ + S("label", { for: drawerId, class: "drawer-overlay", onclick: () => { @@ -1213,7 +1064,7 @@ var Drawer = (props, children) => { open(false); } }), - Tag("div", { class: "min-h-full bg-base-200 w-80" }, [ + S("div", { class: "min-h-full bg-base-200 w-80" }, [ typeof side === "function" ? side() : side ]) ]) @@ -1237,11 +1088,11 @@ if (typeof window !== "undefined" && !window.__dropdownHandlerRegistered) { } var Dropdown = (props) => { const { class: className, label, icon, items, ...rest } = props; - return Tag("details", { + return S("details", { ...rest, class: ui("dropdown", className) }, [ - Tag("summary", { + S("summary", { class: "btn m-1 flex items-center gap-2 list-none cursor-pointer", style: "display: inline-flex;", onclick: (e) => { @@ -1257,14 +1108,14 @@ var Dropdown = (props) => { () => icon ? typeof icon === "function" ? icon() : icon : null, () => label ? typeof label === "function" ? label() : label : null ]), - Tag("ul", { + S("ul", { tabindex: "-1", class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" }, [ () => { const currentItems = typeof items === "function" ? items() : items || []; - return currentItems.map((item) => Tag("li", {}, [ - Tag("a", { + return currentItems.map((item) => S("li", {}, [ + S("a", { class: item.class || "", onclick: (e) => { if (item.onclick) @@ -1277,8 +1128,8 @@ var Dropdown = (props) => { } } }, [ - item.icon ? Tag("span", {}, item.icon) : null, - Tag("span", {}, item.label) + item.icon ? S("span", {}, item.icon) : null, + S("span", {}, item.label) ]) ])); } @@ -1293,11 +1144,11 @@ __export(exports_Fab, { }); var Fab = (props) => { const { class: className, icon, label, actions = [], position = "bottom-6 right-6", ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: ui(`fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100]`, className) }, [ - Tag("div", { + S("div", { tabindex: 0, role: "button", class: "btn btn-lg btn-circle btn-primary shadow-2xl" @@ -1305,9 +1156,9 @@ var Fab = (props) => { icon ? getIcon(icon) : null, !icon && label ? label : null ]), - ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? Tag("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - Tag("button", { + ...val2(actions).map((act) => S("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ + act.label ? S("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, + S("button", { type: "button", class: `btn btn-circle shadow-lg ${act.class || ""}`, onclick: (e) => { @@ -1326,13 +1177,13 @@ __export(exports_Fieldset, { }); var Fieldset = (props, children) => { const { class: className, legend, ...rest } = props; - return Tag("fieldset", { + return S("fieldset", { ...rest, class: ui("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", className) }, [ () => { - const legendText = val(legend); - return legendText ? Tag("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; + const legendText = val2(legend); + return legendText ? S("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; }, children ]); @@ -1345,9 +1196,9 @@ __export(exports_Fileinput, { }); var Fileinput = (props) => { const { class: className, tooltip, max = 2, accept = "*", onselect, ...rest } = props; - const selectedFiles = $([]); - const isDragging = $(false); - const error = $(null); + const selectedFiles = B([]); + const isDragging = B(false); + const error = B(null); const MAX_BYTES = max * 1024 * 1024; const handleFiles = (files) => { const fileList = Array.from(files); @@ -1361,16 +1212,16 @@ var Fileinput = (props) => { onselect?.(selectedFiles()); }; const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); + const updated = selectedFiles().filter((_2, i) => i !== index); selectedFiles(updated); onselect?.(updated); }; - return Tag("fieldset", { ...rest, class: ui("fieldset w-full p-0", className) }, [ - Tag("div", { + return S("fieldset", { ...rest, class: ui("fieldset w-full p-0", className) }, [ + S("div", { class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, "data-tip": tooltip }, [ - Tag("label", { + S("label", { class: () => ` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer @@ -1388,12 +1239,12 @@ var Fileinput = (props) => { handleFiles(e.dataTransfer.files); } }, [ - Tag("div", { class: "flex items-center gap-3 w-full" }, [ + S("div", { class: "flex items-center gap-3 w-full" }, [ getIcon("icon-[lucide--upload]"), - Tag("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - Tag("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) + S("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), + S("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) ]), - Tag("input", { + S("input", { type: "file", multiple: true, accept, @@ -1402,15 +1253,15 @@ var Fileinput = (props) => { }) ]) ]), - () => error() ? Tag("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, - If(() => selectedFiles().length > 0, () => Tag("ul", { class: "mt-2 space-y-1" }, [ - For(selectedFiles, (file, index) => Tag("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - Tag("div", { class: "flex items-center gap-2 truncate" }, [ - Tag("span", { class: "opacity-50" }, "\uD83D\uDCC4"), - Tag("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - Tag("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) + () => error() ? S("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, + J(() => selectedFiles().length > 0, () => S("ul", { class: "mt-2 space-y-1" }, [ + K(selectedFiles, (file, index) => S("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ + S("div", { class: "flex items-center gap-2 truncate" }, [ + S("span", { class: "opacity-50" }, "\uD83D\uDCC4"), + S("span", { class: "truncate font-medium max-w-[200px]" }, file.name), + S("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) ]), - Tag("button", { + S("button", { type: "button", class: "btn btn-ghost btn-xs btn-circle", onclick: (e) => { @@ -1431,11 +1282,11 @@ __export(exports_Indicator, { }); var Indicator = (props, children) => { const { value, class: className, ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: "indicator" }, () => [ - value ? Tag("span", { + value ? S("span", { class: ui("indicator-item badge", className) }, () => typeof value === "function" ? value() : value) : null, children @@ -1450,13 +1301,13 @@ __export(exports_Label, { var Label = (props) => { const { children, value, floating = false, class: className, ...rest } = props; if (floating) { - return Tag("label", { class: ui("floating-label", className), ...rest }, () => [ + return S("label", { class: ui("floating-label", className), ...rest }, () => [ typeof children === "function" ? children() : children, - value ? Tag("span", {}, val(value)) : null + value ? S("span", {}, val2(value)) : null ]); } - return Tag("label", { class: ui("label", className), ...rest }, () => [ - value ? Tag("span", { class: "label-text" }, val(value)) : null, + return S("label", { class: ui("label", className), ...rest }, () => [ + value ? S("span", { class: "label-text" }, val2(value)) : null, typeof children === "function" ? children() : children ]); }; @@ -1468,17 +1319,17 @@ __export(exports_List, { }); var List = (props) => { const { class: className, items, header, render = (item) => item, keyFn = (item, index) => item.id ?? index, ...rest } = props; - const listItems = For(items, (item, index) => Tag("li", { + const listItems = K(items, (item, index) => S("li", { class: "list-row", style: "width: 100%; display: block;" }, [ - Tag("div", { style: "width: 100%;" }, [render(item, index)]) + S("div", { style: "width: 100%;" }, [render(item, index)]) ]), keyFn); - return Tag("ul", { + return S("ul", { ...rest, style: "display: block; width: 100%;", class: ui("list bg-base-100 rounded-box shadow-md", className) - }, header ? [If(header, () => Tag("li", { class: "p-4 pb-2 text-xs opacity-60", style: "width: 100%;" }, [val(header)])), listItems] : listItems); + }, header ? [J(header, () => S("li", { class: "p-4 pb-2 text-xs opacity-60", style: "width: 100%;" }, [val2(header)])), listItems] : listItems); }; // src/components/Menu.js @@ -1488,16 +1339,16 @@ __export(exports_Menu, { }); var Menu = (props) => { const { class: className, items, ...rest } = props; - const renderItems = (items2) => For(() => items2 || [], (it) => Tag("li", {}, [ - it.children ? Tag("details", { open: it.open }, [ - Tag("summary", {}, [it.icon && Tag("span", { class: "mr-2" }, it.icon), it.label]), - Tag("ul", {}, renderItems(it.children)) - ]) : Tag("a", { class: () => val(it.active) ? "active" : "", onclick: it.onclick }, [ - it.icon && Tag("span", { class: "mr-2" }, it.icon), + const renderItems = (items2) => K(() => items2 || [], (it) => S("li", {}, [ + it.children ? S("details", { open: it.open }, [ + S("summary", {}, [it.icon && S("span", { class: "mr-2" }, it.icon), it.label]), + S("ul", {}, renderItems(it.children)) + ]) : S("a", { class: () => val2(it.active) ? "active" : "", onclick: it.onclick }, [ + it.icon && S("span", { class: "mr-2" }, it.icon), it.label ]) ]), (it, i) => it.label || i); - return Tag("ul", { ...rest, class: ui("menu bg-base-200 rounded-box", className) }, renderItems(items)); + return S("ul", { ...rest, class: ui("menu bg-base-200 rounded-box", className) }, renderItems(items)); }; // src/components/Modal.js @@ -1520,12 +1371,12 @@ var Modal = (props, children) => { dialogElement.close(); } }; - Watch(() => handleOpen()); + R(() => handleOpen()); const close = () => { if (typeof open === "function") open(false); }; - return Tag("dialog", { + return S("dialog", { ...rest, ref: (el) => { dialogElement = el; @@ -1536,20 +1387,20 @@ var Modal = (props, children) => { onclose: close, oncancel: close }, [ - Tag("div", { class: "modal-box" }, [ - title ? Tag("h3", { class: "text-lg font-bold mb-4" }, () => typeof title === "function" ? title() : title) : null, - Tag("div", { class: "py-2" }, [ + S("div", { class: "modal-box" }, [ + title ? S("h3", { class: "text-lg font-bold mb-4" }, () => typeof title === "function" ? title() : title) : null, + S("div", { class: "py-2" }, [ typeof children === "function" ? children() : children ]), - Tag("div", { class: "modal-action" }, [ - Tag("form", { method: "dialog", class: "flex gap-2" }, [ + S("div", { class: "modal-action" }, [ + S("form", { method: "dialog", class: "flex gap-2" }, [ ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "submit" }, tt("close")()) + Button({ type: "submit" }, "close") ]) ]) ]), - Tag("form", { method: "dialog", class: "modal-backdrop" }, [ - Tag("button", {}, "close") + S("form", { method: "dialog", class: "modal-backdrop" }, [ + S("button", {}, "close") ]) ]); }; @@ -1561,7 +1412,7 @@ __export(exports_Navbar, { }); var Navbar = (props, children) => { const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("navbar bg-base-100 shadow-sm px-4", className) }, children); + return S("div", { ...rest, class: ui("navbar bg-base-100 shadow-sm px-4", className) }, children); }; // src/components/Radio.js @@ -1571,12 +1422,12 @@ __export(exports_Radio, { }); var Radio = (props) => { const { class: className, label, tooltip, value, inputValue, name, ...rest } = props; - const radioEl = Tag("input", { + const radioEl = S("input", { ...rest, type: "radio", name, class: ui("radio", className), - checked: () => val(value) === inputValue, + checked: () => val2(value) === inputValue, onclick: () => { if (typeof value === "function") value(inputValue); @@ -1584,11 +1435,11 @@ var Radio = (props) => { }); if (!label && !tooltip) return radioEl; - const layout = Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ + const layout = S("label", { class: "label cursor-pointer justify-start gap-3" }, [ radioEl, - label ? Tag("span", { class: "label-text" }, label) : null + label ? S("span", { class: "label-text" }, label) : null ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + return tooltip ? S("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; }; // src/components/Range.js @@ -1598,20 +1449,20 @@ __export(exports_Range, { }); var Range = (props) => { const { class: className, label, tooltip, value, ...rest } = props; - const rangeEl = Tag("input", { + const rangeEl = S("input", { ...rest, type: "range", class: ui("range", className), value, - disabled: () => val(props.disabled) + disabled: () => val2(props.disabled) }); if (!label && !tooltip) return rangeEl; - const layout = Tag("div", { class: "flex flex-col gap-2" }, [ - label ? Tag("span", { class: "label-text" }, label) : null, + const layout = S("div", { class: "flex flex-col gap-2" }, [ + label ? S("span", { class: "label-text" }, label) : null, rangeEl ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + return tooltip ? S("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; }; // src/components/Rating.js @@ -1622,18 +1473,18 @@ __export(exports_Rating, { var Rating = (props) => { const { class: className, value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - return Tag("div", { + return S("div", { ...rest, - class: () => ui(`rating ${val(readonly) ? "pointer-events-none" : ""}`, className) - }, Array.from({ length: val(count) }, (_, i) => { + class: () => ui(`rating ${val2(readonly) ? "pointer-events-none" : ""}`, className) + }, Array.from({ length: val2(count) }, (_2, i) => { const starValue = i + 1; - return Tag("input", { + return S("input", { type: "radio", name: ratingGroup, class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, + checked: () => Math.round(val2(value)) === starValue, onchange: () => { - if (!val(readonly)) { + if (!val2(readonly)) { if (typeof onchange === "function") { onchange(starValue); } else if (typeof value === "function") { @@ -1652,18 +1503,18 @@ __export(exports_Select, { }); var Select = (props) => { const { class: className, label, items, value, ...rest } = props; - const selectEl = Tag("select", { + const selectEl = S("select", { ...rest, class: ui("select select-bordered w-full", className), value - }, For(() => val(items) || [], (opt) => Tag("option", { + }, K(() => val2(items) || [], (opt) => S("option", { value: opt.value, - $selected: () => String(val(value)) === String(opt.value) + $selected: () => String(val2(value)) === String(opt.value) }, opt.label), (opt) => opt.value)); if (!label) return selectEl; - return Tag("label", { class: "fieldset-label flex flex-col gap-1" }, [ - Tag("span", {}, label), + return S("label", { class: "fieldset-label flex flex-col gap-1" }, [ + S("span", {}, label), selectEl ]); }; @@ -1675,7 +1526,7 @@ __export(exports_Stack, { }); var Stack = (props, children) => { const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("stack", className) }, children); + return S("div", { ...rest, class: ui("stack", className) }, children); }; // src/components/Stat.js @@ -1685,11 +1536,11 @@ __export(exports_Stat, { }); var Stat = (props) => { const { class: className, icon, label, value, desc, ...rest } = props; - return Tag("div", { ...rest, class: ui("stat", className) }, [ - icon && Tag("div", { class: "stat-figure text-secondary" }, icon), - label && Tag("div", { class: "stat-title" }, label), - Tag("div", { class: "stat-value" }, () => val(value) ?? value), - desc && Tag("div", { class: "stat-desc" }, desc) + return S("div", { ...rest, class: ui("stat", className) }, [ + icon && S("div", { class: "stat-figure text-secondary" }, icon), + label && S("div", { class: "stat-title" }, label), + S("div", { class: "stat-value" }, () => val2(value) ?? value), + desc && S("div", { class: "stat-desc" }, desc) ]); }; @@ -1700,18 +1551,18 @@ __export(exports_Swap, { }); var Swap = (props) => { const { class: className, value, on, off, ...rest } = props; - return Tag("label", { ...rest, class: ui("swap", className) }, [ - Tag("input", { + return S("label", { ...rest, class: ui("swap", className) }, [ + S("input", { type: "checkbox", - checked: () => val(value), + checked: () => val2(value), onclick: (e) => { if (typeof value === "function") { value(e.target.checked); } } }), - Tag("div", { class: "swap-on" }, on), - Tag("div", { class: "swap-off" }, off) + S("div", { class: "swap-on" }, on), + S("div", { class: "swap-off" }, off) ]); }; @@ -1721,38 +1572,38 @@ __export(exports_Table, { Table: () => Table }); var Table = (props) => { - const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = tt("nodata")(), ...rest } = props; + const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = "nodata", ...rest } = props; const tableClass = () => { - const zebraClass = val(zebra) ? "table-zebra" : ""; - const pinRowsClass = val(pinRows) ? "table-pin-rows" : ""; + const zebraClass = val2(zebra) ? "table-zebra" : ""; + const pinRowsClass = val2(pinRows) ? "table-pin-rows" : ""; return ui("table", className, zebraClass, pinRowsClass); }; const getInternalKeyFn = keyFn || ((item, idx) => item.id || idx); - return Tag("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - Tag("table", { ...rest, class: tableClass }, [ - Tag("thead", {}, [ - Tag("tr", {}, columns.map((col) => Tag("th", { class: col.class || "" }, col.label))) + return S("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ + S("table", { ...rest, class: tableClass }, [ + S("thead", {}, [ + S("tr", {}, columns.map((col) => S("th", { class: col.class || "" }, col.label))) ]), - Tag("tbody", {}, [ - For(items, (item, index) => { + S("tbody", {}, [ + K(items, (item, index) => { const it = () => { - const currentItems = val(items); + const currentItems = val2(items); const key = getInternalKeyFn(item, index); return currentItems.find((u, i) => getInternalKeyFn(u, i) === key) || item; }; - return Tag("tr", { class: "hover" }, columns.map((col) => { + return S("tr", { class: "hover" }, columns.map((col) => { const cellContent = () => { const latestItem = it(); if (col.render) return col.render(latestItem, index); - return val(latestItem[col.key]); + return val2(latestItem[col.key]); }; - return Tag("td", { class: col.class || "" }, [cellContent]); + return S("td", { class: col.class || "" }, [cellContent]); })); }, getInternalKeyFn), - If(() => val(items).length === 0, () => Tag("tr", {}, [ - Tag("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) + J(() => val2(items).length === 0, () => S("tr", {}, [ + S("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ + val2(empty) ]) ])) ]) @@ -1768,10 +1619,10 @@ __export(exports_Tabs, { var Tabs = (props) => { const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $2(0); - Watch2(() => { + const activeIndex = B(0); + R(() => { const list = itemsSignal(); - const idx = list.findIndex((it) => val(it.active) === true); + const idx = list.findIndex((it) => val2(it.active) === true); if (idx !== -1 && activeIndex() !== idx) { activeIndex(idx); } @@ -1782,7 +1633,7 @@ var Tabs = (props) => { if (onTabClose) onTabClose(item, indexToRemove); const currentItems = itemsSignal(); - const newItems = currentItems.filter((_, idx) => idx !== indexToRemove); + const newItems = currentItems.filter((_2, idx) => idx !== indexToRemove); const isWritableSignal = typeof items === "function" && !items._isComputed; if (!isWritableSignal) { console.warn("Tabs: items must be a writable signal to support closable tabs"); @@ -1798,12 +1649,12 @@ var Tabs = (props) => { newActive = Math.min(newActive, newItems.length - 1); activeIndex(newActive); }; - return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { + return S("div", { ...rest, class: ui("tabs", className) }, () => { const list = itemsSignal(); const elements = []; for (let i = 0;i < list.length; i++) { const item = list[i]; - const label = val(item.label); + const label = val2(item.label); const labelNode = label instanceof Node ? label : document.createTextNode(String(label)); const buttonChildren = []; if (item.closable) { @@ -1813,26 +1664,26 @@ var Tabs = (props) => { e.stopPropagation(); removeTab(i, item); }; - const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); + const wrapper = S("span", { class: "flex items-center" }, [labelNode, closeIcon]); buttonChildren.push(wrapper); } else { buttonChildren.push(labelNode); } - const buttonBase = Tag2("button", { + const buttonBase = S("button", { class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); - if (!val(item.disabled)) { + if (!val2(item.disabled)) { if (item.onclick) item.onclick(); activeIndex(i); } } }, buttonChildren); - const button = item.tip ? Tag2("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) : buttonBase; + const button = item.tip ? S("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) : buttonBase; elements.push(button); let contentNode; - const rawContent = val(item.content); + const rawContent = val2(item.content); if (typeof rawContent === "function") { contentNode = rawContent(); } else if (rawContent instanceof Node) { @@ -1840,8 +1691,8 @@ var Tabs = (props) => { } else { contentNode = document.createTextNode(String(rawContent)); } - const inner = Tag2("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag2("div", { + const inner = S("div", { class: "tab-content-inner" }, contentNode); + const panel = S("div", { class: "tab-content bg-base-100 border-base-300 p-6", style: () => activeIndex() === i ? "display: block" : "display: none" }, inner); @@ -1864,26 +1715,26 @@ var Timeline = (props) => { warning: "icon-[lucide--alert-triangle]", error: "icon-[lucide--alert-circle]" }; - return Tag("ul", { + return S("ul", { ...rest, - class: () => ui(`timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val(compact) ? "timeline-compact" : ""}`, className) + class: () => ui(`timeline ${val2(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val2(compact) ? "timeline-compact" : ""}`, className) }, () => { const list = (typeof items === "function" ? items() : items) || []; return list.map((item, i) => { const isFirst = i === 0; const isLast = i === list.length - 1; const itemType = item.type || "success"; - const isCompleted = () => val(item.completed); - const prevCompleted = () => i > 0 && val(list[i - 1].completed); + const isCompleted = () => val2(item.completed); + const prevCompleted = () => i > 0 && val2(list[i - 1].completed); const renderSlot = (content) => typeof content === "function" ? content() : content; - return Tag("li", { class: "flex-1" }, [ - !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, - Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), - Tag("div", { class: "timeline-middle" }, [ + return S("li", { class: "flex-1" }, [ + !isFirst ? S("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, + S("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), + S("div", { class: "timeline-middle" }, [ () => item.icon ? getIcon(item.icon) : getIcon(iconMap[itemType] || iconMap.success) ]), - Tag("div", { class: "timeline-end timeline-box shadow-sm" }, [() => renderSlot(item.detail)]), - !isLast ? Tag("hr", { class: () => isCompleted() ? "bg-primary" : "" }) : null + S("div", { class: "timeline-end timeline-box shadow-sm" }, [() => renderSlot(item.detail)]), + !isLast ? S("hr", { class: () => isCompleted() ? "bg-primary" : "" }) : null ]); }); }); @@ -1897,13 +1748,13 @@ __export(exports_Toast, { var Toast = (message, type = "alert-success", duration = 3500) => { let container = document.getElementById("sigpro-toast-container"); if (!container) { - container = Tag("div", { + container = S("div", { id: "sigpro-toast-container", class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none" }); document.body.appendChild(container); } - const toastHost = Tag("div", { style: "display: contents" }); + const toastHost = S("div", { style: "display: contents" }); container.appendChild(toastHost); let timeoutId; const close = () => { @@ -1924,10 +1775,10 @@ var Toast = (message, type = "alert-success", duration = 3500) => { }; const ToastComponent = () => { const closeIcon = getIcon("icon-[lucide--x]"); - const el = Tag("div", { + const el = S("div", { class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto` }, [ - Tag("span", {}, [typeof message === "function" ? message() : message]), + S("span", {}, [typeof message === "function" ? message() : message]), Button({ class: "btn-xs btn-circle btn-ghost", onclick: close @@ -1936,7 +1787,7 @@ var Toast = (message, type = "alert-success", duration = 3500) => { requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); return el; }; - const instance = Mount(ToastComponent, toastHost); + const instance = H(ToastComponent, toastHost); if (duration > 0) { timeoutId = setTimeout(close, duration); } @@ -1948,13 +1799,13 @@ var exports_Tooltip = {}; __export(exports_Tooltip, { Tooltip: () => Tooltip }); -var Tooltip = (props, children) => Tag("div", { +var Tooltip = (props, children) => S("div", { ...props, class: () => ui("tooltip w-full", props.class), "data-tip": props.tip }, children); -// src/components/index.js +// index.js var Components = { ...exports_Accordion, ...exports_Alert, @@ -1989,89 +1840,22 @@ var Components = { ...exports_Toast, ...exports_Tooltip }; -var components_default = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("\uD83D\uDE80 SigproUI"); - } +var Utils = { + Locale, + tt }; -// index.js if (typeof window !== "undefined") { - Object.entries(exports_components).forEach(([name, component]) => { + Object.entries({ ...Components, ...Utils }).forEach(([name, value]) => { Object.defineProperty(window, name, { - value: component, + value, writable: false, configurable: true, enumerable: true }); }); - Object.entries(exports_utils).forEach(([name, fn]) => { - Object.defineProperty(window, name, { - value: fn, - writable: false, - configurable: true, - enumerable: true - }); - }); - Object.defineProperty(window, "tt", { - value: tt, - writable: false, - configurable: true, - enumerable: true - }); - Object.defineProperty(window, "SigProUI", { - value: { ...exports_components, Utils: exports_utils, tt }, - writable: false, - configurable: true, - enumerable: true - }); - console.log("\uD83C\uDFA8 SigProUI ready"); + console.log("SigProUI installed"); } export { - val, - ui, - tt, - getIcon, - Watch2 as Watch, - Tooltip, - Toast, - Timeline, - Tag2 as Tag, - Tabs, - Table, - Swap, - Stat, - Stack, - Select, - Router, - Rating, - Range, - Radio, - Navbar, - Mount2 as Mount, - Modal, - Menu, - List, - Label, - Input, - Indicator, - If2 as If, - For2 as For, - Fileinput, - Fieldset, - Fab, - Dropdown, - Drawer, - Datepicker, - Colorpicker, - Checkbox, - Button, - Badge, - Autocomplete, - Alert, - Accordion, - $2 as $ + Utils, + Components }; diff --git a/dist/sigpro-ui.esm.min.js b/dist/sigpro-ui.esm.min.js index 4bb09f9..44f1c51 100644 --- a/dist/sigpro-ui.esm.min.js +++ b/dist/sigpro-ui.esm.min.js @@ -1,7 +1,7 @@ -var I_=Object.defineProperty;var R=(f,M)=>{for(var _ in M)I_(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var y=(f)=>typeof f==="function",Bf=(f)=>f&&typeof f==="object",o=Array.isArray,x=typeof document<"u"?document:null,sf=(f)=>f?._isRuntime?f.container:f instanceof Node?f:x.createTextNode(f==null?"":String(f)),O=null,V=null,t=!1,ff=0,_f=new Set,Jf=new WeakMap,Qf=Symbol("iter"),Tf=new WeakMap,c=(f)=>{if(!f||f._disposed)return;f._disposed=!0;let M=[f];while(M.length){let _=M.pop();if(_._cleanups)_._cleanups.forEach((E)=>E()),_._cleanups.clear();if(_._children)_._children.forEach((E)=>M.push(E)),_._children.clear();if(_._deps)_._deps.forEach((E)=>E.delete(_)),_._deps.clear()}},u_=(f)=>{if(V)(V._mounts||=[]).push(f)},p=(f)=>{if(V)(V._cleanups||=new Set).add(f)},m_=(f)=>{let M=O;O=null;try{return f()}finally{O=M}},a=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((A)=>A.delete(_));if(_._cleanups)_._cleanups.forEach((A)=>A()),_._cleanups.clear();let E=O,L=V;O=V=_;try{return _._result=f()}catch(A){console.error("[SigPro]",A)}finally{O=E,V=L}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=O?O._depth+1:0,_._mounts=[],_._parent=V,V)(V._children||=new Set).add(_);return _},af=()=>{if(t)return;t=!0;let f=Array.from(_f).sort((M,_)=>M._depth-_._depth);_f.clear();for(let M of f)if(!M._disposed)M();t=!1},v_=(f)=>{ff++;try{return f()}finally{if(ff--,ff===0&&_f.size>0&&!t)af()}},w=(f,M=!1)=>{if(!M&&O&&!O._disposed)f.add(O),(O._deps||=new Set).add(f);else if(M){let _=!1;if(f.forEach((E)=>{if(E===O||E._disposed)return;if(E._isComputed){if(E._dirty=!0,E._subs)w(E._subs,!0)}else _f.add(E),_=!0}),_&&!t&&ff===0)queueMicrotask(af)}},i=(f,M=null)=>{let _=new Set;if(y(f)){let E,L=!0,A=()=>{if(L){let P=O;O=A;try{let W=f();if(!Object.is(E,W))E=W,L=!1,w(_,!0)}finally{O=P}}return w(_),E};if(A._isComputed=!0,A._subs=_,A._dirty=!0,A._deps=null,A._disposed=!1,A.markDirty=()=>{L=!0},A.stop=()=>{if(A._disposed=!0,A._deps)A._deps.forEach((P)=>P.delete(A)),A._deps.clear();_.clear()},V)p(A.stop);return A}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let L=y(E[0])?E[0](f):E[0];if(!Object.is(f,L)){if(f=L,M)localStorage.setItem(M,JSON.stringify(f));w(_,!0)}}return w(_),f}},ef=(f)=>{if(!Bf(f))return f;if(Jf.has(f))return Jf.get(f);let M=new Map,_=(L)=>{let A=M.get(L);if(!A)M.set(L,A=new Set);return A},E=new Proxy(f,{get(L,A){return w(_(A)),ef(L[A])},set(L,A,P){let W=!(A in L);if(!Object.is(L[A],P)){if(L[A]=P,w(_(A),!0),W)w(_(Qf),!0)}return!0},deleteProperty(L,A){let P=Reflect.deleteProperty(L,A);if(P)w(_(A),!0),w(_(Qf),!0);return P},ownKeys(L){return w(_(Qf)),Reflect.ownKeys(L)}});return Jf.set(f,E),E},b=(f,M)=>{if(M===void 0){let E=a(f);return E(),()=>c(E)}let _=a(()=>{let E=Array.isArray(f)?f.map((L)=>L()):f();m_(()=>M(E))});return _(),()=>c(_)},Gf=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)c(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Gf)},g_=/^\s*(javascript|data|vbscript):/i,c_=(f)=>f==="src"||f==="href"||f.startsWith("on"),lf=(f,M)=>{if(M==null||M===!1)return null;if(c_(f)){let _=String(M);if(g_.test(_))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return M},k=(f,M={},_=[])=>{if(M instanceof Node||o(M)||!Bf(M))_=M,M={};if(y(f)){let P={_mounts:[],_cleanups:new Set},W=a(()=>{let T=f(M,{children:_,emit:(Y,...K)=>M[`on${Y[0].toUpperCase()}${Y.slice(1)}`]?.(...K)});return W._result=T,T});W();let J=W._result;if(J==null)return null;let Q=J instanceof Node||o(J)&&J.every((T)=>T instanceof Node)?J:x.createTextNode(String(J)),X=(T)=>{if(Bf(T)&&!T._isRuntime)T._mounts=W._mounts||[],T._cleanups=W._cleanups||new Set,T._ownerEffect=W};return o(Q)?Q.forEach(X):X(Q),Q}let E=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(f),L=E?x.createElementNS("http://www.w3.org/2000/svg",f):x.createElement(f);L._cleanups=new Set;for(let P in M){if(!M.hasOwnProperty(P))continue;let W=M[P];if(P==="ref"){y(W)?W(L):W.current=L;continue}if(P.startsWith("on")){let J=P.slice(2).toLowerCase();L.addEventListener(J,W);let Q=()=>L.removeEventListener(J,W);L._cleanups.add(Q),p(Q)}else if(y(W)){let J=a(()=>{let Q=lf(P,W());if(P==="class")L.className=Q||"";else if(Q==null)L.removeAttribute(P);else if(P in L&&!E)L[P]=Q;else L.setAttribute(P,Q===!0?"":Q)});if(J(),L._cleanups.add(()=>c(J)),p(()=>c(J)),/^(INPUT|TEXTAREA|SELECT)$/.test(L.tagName)&&(P==="value"||P==="checked")){let Q=P==="checked"?"change":"input";L.addEventListener(Q,(X)=>W(X.target[P]))}}else{let J=lf(P,W);if(J!=null)if(P in L&&!E)L[P]=J;else L.setAttribute(P,J===!0?"":J)}}let A=(P)=>{if(o(P))return P.forEach(A);if(y(P)){let W=x.createTextNode("");L.appendChild(W);let J=[],Q=a(()=>{let X=P(),T=(o(X)?X:[X]).map(sf);J.forEach((K)=>{if(K._isRuntime)K.destroy();else Gf(K);if(K.parentNode)K.remove()});let Y=W;for(let K=T.length-1;K>=0;K--){let G=T[K];if(G.parentNode!==Y.parentNode)Y.parentNode?.insertBefore(G,Y);if(G._mounts)G._mounts.forEach((C)=>C());Y=G}J=T});Q(),L._cleanups.add(()=>c(Q)),p(()=>c(Q))}else{let W=sf(P);if(L.appendChild(W),W._mounts)W._mounts.forEach((J)=>J())}};return A(_),L},e=(f)=>{let M=new Set,_=[],E=V,L=O,A=x.createElement("div");A.style.display="contents",A.setAttribute("role","presentation"),V={_cleanups:M,_mounts:_},O=null;let P=(W)=>{if(!W)return;if(W._isRuntime)M.add(W.destroy),A.appendChild(W.container);else if(o(W))W.forEach(P);else A.appendChild(W instanceof Node?W:x.createTextNode(String(W==null?"":W)))};try{P(f({onCleanup:(W)=>M.add(W)}))}finally{V=E,O=L}return _.forEach((W)=>W()),{_isRuntime:!0,container:A,destroy:()=>{M.forEach((W)=>W()),Gf(A),A.remove()}}},f_=(f,M,_=null)=>{let E=x.createTextNode(""),L=k("div",{style:"display:contents"},[E]),A=null;return b(()=>!!(y(f)?f():f),(P)=>{if(A)A.destroy(),A=null;let W=P?M:_;if(W)A=e(()=>y(W)?W():W),L.insertBefore(A.container,E)}),p(()=>A?.destroy()),L},__=(f,M,_)=>{let E=x.createTextNode(""),L=k("div",{style:"display:contents"},[E]),A=new Map;return b(()=>(y(f)?f():f)||[],(P)=>{let W=new Map,J=[],Q=P||[];for(let T=0;TM(Y,T));else A.delete(K);W.set(K,G),J.push(G)}A.forEach((T)=>T.destroy());let X=E;for(let T=J.length-1;T>=0;T--){let K=J[T].container;if(K.nextSibling!==X)L.insertBefore(K,X);X=K}A=W}),L},r=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=i(M()),E=()=>_(M());window.addEventListener("hashchange",E),p(()=>window.removeEventListener("hashchange",E));let L=k("div",{class:"router-hook"}),A=null;return b([_],()=>{let P=_(),W=f.find((J)=>{let Q=J.path.split("/").filter(Boolean),X=P.split("/").filter(Boolean);return Q.length===X.length&&Q.every((T,Y)=>T[0]===":"||T===X[Y])})||f.find((J)=>J.path==="*");if(W){A?.destroy();let J={};W.path.split("/").filter(Boolean).forEach((Q,X)=>{if(Q[0]===":")J[Q.slice(1)]=P.split("/").filter(Boolean)[X]}),r.params(J),A=e(()=>y(W.component)?W.component(J):W.component),L.replaceChildren(A.container)}}),L};r.params=i({});r.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");r.back=()=>window.history.back();r.path=()=>window.location.hash.replace(/^#/,"")||"/";var M_=(f,M)=>{let _=typeof M==="string"?x.querySelector(M):M;if(!_)return;if(Tf.has(_))Tf.get(_).destroy();let E=e(y(f)?f:()=>f);return _.replaceChildren(E.container),Tf.set(_,E),E},tf=Object.freeze({$:i,$$:ef,Watch:b,Tag:k,Render:e,If:f_,For:__,Router:r,Mount:M_,onMount:u_,onUnmount:p,Batch:v_});if(typeof window<"u")Object.assign(window,tf),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((f)=>window[f[0].toUpperCase()+f.slice(1)]=(M,_)=>tf.Tag(f,M,_));var Ef={};R(Ef,{default:()=>r_,Tooltip:()=>j_,Toast:()=>H_,Timeline:()=>k_,Tabs:()=>F_,Table:()=>V_,Swap:()=>U_,Stat:()=>O_,Stack:()=>N_,Select:()=>D_,Rating:()=>h_,Range:()=>z_,Radio:()=>R_,Navbar:()=>q_,Modal:()=>C_,Menu:()=>Y_,List:()=>S_,Label:()=>K_,Input:()=>s,Indicator:()=>Z_,Fileinput:()=>X_,Fieldset:()=>G_,Fab:()=>B_,Dropdown:()=>T_,Drawer:()=>Q_,Datepicker:()=>J_,Colorpicker:()=>P_,Checkbox:()=>W_,Button:()=>l,Badge:()=>A_,Autocomplete:()=>L_,Alert:()=>$_,Accordion:()=>E_});var Xf={};R(Xf,{Accordion:()=>E_});var Mf={};R(Mf,{val:()=>B,ui:()=>Z,getIcon:()=>z});var B=(f)=>typeof f==="function"?f():f,Z=(f,M)=>typeof M==="function"?()=>`${f} ${M()||""}`.trim():`${f} ${M||""}`.trim(),z=(f)=>{if(!f)return null;if(typeof f==="function")return Tag("span",{class:"mr-1"},f());if(typeof f==="object")return Tag("span",{class:"mr-1"},f);if(typeof f==="string"){let M=f.trim().split(/\s+/),_=M[M.length-1]==="right",E=_?M.slice(0,-1).join(" "):f,L=_?"ml-1":"mr-1";if(E&&!E.startsWith("icon-[")&&!E.includes("--"))return Tag("span",{class:L},E);return Tag("span",{class:`${E} ${L}`.trim()})}return null};var E_=(f,M)=>{let{class:_,title:E,name:L,open:A,...P}=f;return Tag("div",{...P,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:L?"radio":"checkbox",name:L,checked:B(A)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Zf={};R(Zf,{Alert:()=>$_});var $_=(f,M)=>{let{class:_,actions:E,type:L="info",soft:A=!0,...P}=f,W={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},X=[`alert-${L}`,A?"alert-soft":"",_].filter(Boolean).join(" "),T=M||f.message;return Tag("div",{...P,role:"alert",class:Z("alert",X)},()=>[z(W[L]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof T==="function"?T():T])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var Sf={};R(Sf,{Autocomplete:()=>L_});var p_={es:{close:"Cerrar",confirm:"Confirmar",cancel:"Cancelar",search:"Buscar...",loading:"Cargando...",nodata:"Sin datos"},en:{close:"Close",confirm:"Confirm",cancel:"Cancel",search:"Search...",loading:"Loading...",nodata:"No data"}},b_=$("es");var I=(f)=>()=>p_[b_()][f]||f;var Kf={};R(Kf,{Input:()=>s});var s=(f)=>{let{class:M,value:_,type:E="text",icon:L,oninput:A,placeholder:P,disabled:W,validate:J,label:Q,...X}=f,T=E==="password",Y=$(!1),K=$(null),G={text:"icon-[lucide--text]",password:"icon-[lucide--lock]",date:"icon-[lucide--calendar]",number:"icon-[lucide--hash]",email:"icon-[lucide--mail]",search:"icon-[lucide--search]",tel:"icon-[lucide--phone]",url:"icon-[lucide--link]"},C=L?z(L):G[E]?z(G[E]):null,h=()=>z(Y()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),U=C?"pl-10":"",H=T?"pr-10":"",d=()=>{if(M?.includes("input-xs"))return"btn-xs";if(M?.includes("input-sm"))return"btn-sm";if(M?.includes("input-lg"))return"btn-lg";return"btn-md"},n=(D)=>{let v=D.target.value;if(J){let $f=J(v);K($f||null)}A?.(D)},F=()=>K()&&K()!=="",S=()=>{let D=`input w-full ${U} ${H}`;if(M)D+=` ${M}`;if(F())D+=" input-error";return D.trim()},q=Tag("input",{...X,type:()=>T?Y()?"text":"password":E,placeholder:P||(Q?" ":P),class:S,value:_,oninput:n,disabled:()=>B(W),"aria-invalid":()=>F()?"true":"false"}),N=()=>[q,C?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},C):null,T?Tag("button",{type:"button",class:Z("absolute right-3 inset-y-0 flex items-center","btn btn-ghost btn-circle opacity-50 hover:opacity-100",d()),onclick:(D)=>{D.preventDefault(),Y(!Y())}},()=>h()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>F()?K():null)];if(Q)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},N),Tag("span",{},B(Q))]);return Tag("div",{class:"relative w-full"},N)};var L_=(f)=>{let{class:M,items:_=[],value:E,onselect:L,label:A,placeholder:P,...W}=f,J=$(B(E)||""),Q=$(!1),X=$(-1),T=$([]);Watch(()=>{let G=String(J()).toLowerCase(),C=B(_)||[],h=G?C.filter((U)=>(typeof U==="string"?U:U.label).toLowerCase().includes(G)):C;T(h)});let Y=(G)=>{let C=typeof G==="string"?G:G.value,h=typeof G==="string"?G:G.label;if(J(h),typeof E==="function")E(C);L?.(G),Q(!1),X(-1)},K=(G)=>{let C=T();if(G.key==="ArrowDown")G.preventDefault(),Q(!0),X(Math.min(X()+1,C.length-1));else if(G.key==="ArrowUp")G.preventDefault(),X(Math.max(X()-1,0));else if(G.key==="Enter"&&X()>=0)G.preventDefault(),Y(C[X()]);else if(G.key==="Escape")Q(!1)};return Tag("div",{class:"relative w-full"},[s({label:A,class:M,placeholder:P||I("search")(),value:J,onfocus:()=>Q(!0),onblur:()=>setTimeout(()=>Q(!1),150),onkeydown:K,oninput:(G)=>{let C=G.target.value;if(J(C),typeof E==="function")E(C);Q(!0),X(-1)},...W}),Tag("ul",{class:"absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50",style:()=>Q()&&T().length?"display:block":"display:none"},[For(T,(G,C)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${X()===C?"active bg-primary text-primary-content":""}`,onclick:()=>Y(G),onmouseenter:()=>X(C)},typeof G==="string"?G:G.label)]),(G,C)=>(typeof G==="string"?G:G.value)+C),()=>T().length?null:Tag("li",{class:"p-2 text-center opacity-50"},I("nodata")())])])};var Yf={};R(Yf,{Badge:()=>A_});var A_=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Cf={};R(Cf,{Button:()=>l});var l=(f,M)=>{let{class:_,loading:E,icon:L,...A}=f,P=z(L);return Tag("button",{...A,class:Z("btn",_),disabled:()=>B(E)||B(f.disabled)},()=>[B(E)&&Tag("span",{class:"loading loading-spinner"}),P,M].filter(Boolean))};var qf={};R(qf,{Checkbox:()=>W_});var W_=(f)=>{let{class:M,value:_,toggle:E,label:L,...A}=f,P=Tag("input",{...A,type:"checkbox",class:()=>Z(B(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[P,L?Tag("span",{class:"label-text"},L):null])};var Rf={};R(Rf,{Colorpicker:()=>P_});var P_=(f)=>{let{class:M,value:_,label:E,...L}=f,A=$(!1),P=["#000","#1A1A1A","#333","#4D4D4D","#666","#808080","#B3B3B3","#FFF","#450a0a","#7f1d1d","#991b1b","#b91c1c","#dc2626","#ef4444","#f87171","#fca5a5","#431407","#7c2d12","#9a3412","#c2410c","#ea580c","#f97316","#fb923c","#ffedd5","#713f12","#a16207","#ca8a04","#eab308","#facc15","#fde047","#fef08a","#fff9c4","#064e3b","#065f46","#059669","#10b981","#34d399","#4ade80","#84cc16","#d9f99d","#082f49","#075985","#0284c7","#0ea5e9","#38bdf8","#7dd3fc","#22d3ee","#cffafe","#1e1b4b","#312e81","#4338ca","#4f46e5","#6366f1","#818cf8","#a5b4fc","#e0e7ff","#2e1065","#4c1d95","#6d28d9","#7c3aed","#8b5cf6","#a855f7","#d946ef","#fae8ff"],W=()=>B(_)||"#000000";return Tag("div",{class:Z("relative w-fit",M)},[Tag("button",{type:"button",class:"btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case",onclick:(J)=>{J.stopPropagation(),A(!A())},...L},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${W()}`}),E?Tag("span",{class:"opacity-80"},E):null]),If(A,()=>Tag("div",{class:"absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none",onclick:(J)=>J.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},P.map((J)=>Tag("button",{type:"button",style:`background-color: ${J}`,class:()=>{return`size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${W().toLowerCase()===J.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(J);A(!1)}})))])),If(A,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>A(!1)}))])};var zf={};R(zf,{Datepicker:()=>J_});var J_=(f)=>{let{class:M,value:_,range:E,label:L,placeholder:A,hour:P=!1,...W}=f,J=$(!1),Q=$(new Date),X=$(null),T=$(0),Y=$(0),K=()=>B(E)===!0,G=new Date,C=`${G.getFullYear()}-${String(G.getMonth()+1).padStart(2,"0")}-${String(G.getDate()).padStart(2,"0")}`,h=(S)=>{let q=S.getFullYear(),N=String(S.getMonth()+1).padStart(2,"0"),D=String(S.getDate()).padStart(2,"0");return`${q}-${N}-${D}`},U=(S)=>{let q=h(S),N=B(_);if(K())if(!N?.start||N.start&&N.end){if(typeof _==="function")_({start:q,end:null,...P&&{startHour:T()}})}else{let D=N.start;if(typeof _==="function"){let v=q{let S=B(_);if(!S){H("");return}let q="";if(typeof S==="string")q=P&&S.includes("T")?S.replace("T"," "):S;else if(S.start&&S.end){let N=P&&S.startHour!==void 0?`${S.start} ${String(S.startHour).padStart(2,"0")}:00`:S.start,D=P&&S.endHour!==void 0?`${S.end} ${String(S.endHour).padStart(2,"0")}:00`:S.end;q=`${N} - ${D}`}else if(S.start)q=`${P&&S.startHour!==void 0?`${S.start} ${String(S.startHour).padStart(2,"0")}:00`:S.start}...`;H(q)});let d=(S)=>{let q=Q();Q(new Date(q.getFullYear(),q.getMonth()+S,1))},n=(S)=>{let q=Q();Q(new Date(q.getFullYear()+S,q.getMonth(),1))},F=({value:S,onChange:q})=>{return Tag("div",{class:"flex-1"},[Tag("div",{class:"flex gap-2 items-center"},[Tag("input",{type:"range",min:0,max:23,value:S,class:"range range-xs flex-1",oninput:(N)=>{let D=parseInt(N.target.value);q(D)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(B(S)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[s({label:L,placeholder:A||(K()?"Seleccionar rango...":"Seleccionar fecha..."),value:H,readonly:!0,icon:z("icon-[lucide--calendar]"),onclick:(S)=>{S.stopPropagation(),J(!J())},...W}),If(J,()=>Tag("div",{class:"absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none",onclick:(S)=>S.stopPropagation()},[Tag("div",{class:"flex justify-between items-center mb-4 gap-1"},[Tag("div",{class:"flex gap-0.5"},[Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>n(-1)},z("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>d(-1)},z("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>Q().toLocaleString("es-ES",{month:"short",year:"numeric"})]),Tag("div",{class:"flex gap-0.5"},[Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>d(1)},z("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>n(1)},z("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>X(null)},[...["L","M","X","J","V","S","D"].map((S)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},S)),()=>{let S=Q(),q=S.getFullYear(),N=S.getMonth(),D=new Date(q,N,1).getDay(),v=D===0?6:D-1,$f=new Date(q,N+1,0).getDate(),Lf=[];for(let g=0;g{let m=B(_),Af=X(),y_=typeof m==="string"?m.split("T")[0]===j:m?.start===j,x_=m?.end===j,Wf=!1;if(K()&&m?.start){let Pf=m.start;if(!m.end&&Af)Wf=j>Pf&&j<=Af||j=Af;else if(m.end)Wf=j>Pf&&j{if(K())X(j)},onclick:()=>U(of)},[g.toString()]))}return Lf}]),P?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[K()?Tag("div",{class:"flex gap-4"},[F({value:T,onChange:(S)=>{T(S);let q=B(_);if(q?.start)_({...q,startHour:S})}}),F({value:Y,onChange:(S)=>{Y(S);let q=B(_);if(q?.end)_({...q,endHour:S})}})]):F({value:T,onChange:(S)=>{T(S);let q=B(_);if(q&&typeof q==="string")_(q.split("T")[0]+"T"+String(S).padStart(2,"0")+":00:00")}})]):null])),If(J,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>J(!1)}))])};var hf={};R(hf,{Drawer:()=>Q_});var Q_=(f,M)=>{let{class:_,id:E,open:L,side:A,content:P,...W}=f,J=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...W,class:Z("drawer",_)},[Tag("input",{id:J,type:"checkbox",class:"drawer-toggle",checked:()=>typeof L==="function"?L():L,onchange:(Q)=>{if(typeof L==="function")L(Q.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof P==="function"?P():P]),Tag("div",{class:"drawer-side"},[Tag("label",{for:J,class:"drawer-overlay",onclick:()=>{if(typeof L==="function")L(!1)}}),Tag("div",{class:"min-h-full bg-base-200 w-80"},[typeof A==="function"?A():A])])])};var Df={};R(Df,{Dropdown:()=>T_});var u=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(u&&!u.contains(f.target))u.open=!1,u=null}),window.__dropdownHandlerRegistered=!0;var T_=(f)=>{let{class:M,label:_,icon:E,items:L,...A}=f;return Tag("details",{...A,class:Z("dropdown",M)},[Tag("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(P)=>{let W=P.currentTarget.closest("details");if(u&&u!==W)u.open=!1;setTimeout(()=>{u=W.open?W:null},0)}},[()=>E?typeof E==="function"?E():E:null,()=>_?typeof _==="function"?_():_:null]),Tag("ul",{tabindex:"-1",class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[()=>{return(typeof L==="function"?L():L||[]).map((W)=>Tag("li",{},[Tag("a",{class:W.class||"",onclick:(J)=>{if(W.onclick)W.onclick(J);let Q=J.currentTarget.closest("details");if(Q){if(Q.open=!1,u===Q)u=null}}},[W.icon?Tag("span",{},W.icon):null,Tag("span",{},W.label)])]))}])])};var Nf={};R(Nf,{Fab:()=>B_});var B_=(f)=>{let{class:M,icon:_,label:E,actions:L=[],position:A="bottom-6 right-6",...P}=f;return Tag("div",{...P,class:Z(`fab absolute ${A} flex flex-col-reverse items-end gap-3 z-[100]`,M)},[Tag("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[_?z(_):null,!_&&E?E:null]),...B(L).map((W)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[W.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},W.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${W.class||""}`,onclick:(J)=>{J.stopPropagation(),W.onclick?.(J)}},[W.icon?z(W.icon):W.text||""])]))])};var Of={};R(Of,{Fieldset:()=>G_});var G_=(f,M)=>{let{class:_,legend:E,...L}=f;return Tag("fieldset",{...L,class:Z("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",_)},[()=>{let A=B(E);return A?Tag("legend",{class:"fieldset-legend font-bold"},[A]):null},M])};var Uf={};R(Uf,{Fileinput:()=>X_});var X_=(f)=>{let{class:M,tooltip:_,max:E=2,accept:L="*",onselect:A,...P}=f,W=$([]),J=$(!1),Q=$(null),X=E*1024*1024,T=(K)=>{let G=Array.from(K);if(Q(null),G.find((h)=>h.size>X)){Q(`Máx ${E}MB`);return}W([...W(),...G]),A?.(W())},Y=(K)=>{let G=W().filter((C,h)=>h!==K);W(G),A?.(G)};return Tag("fieldset",{...P,class:Z("fieldset w-full p-0",M)},[Tag("div",{class:()=>`w-full ${_?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":_},[Tag("label",{class:()=>` +var L_=Object.defineProperty;var W_=(_)=>_;function $_(_,W){this[_]=W_.bind(null,W)}var U=(_,W)=>{for(var E in W)L_(_,E,{get:W[E],enumerable:!0,configurable:!0,set:$_.bind(W,E)})};var Zf={};U(Zf,{Accordion:()=>B_});var T=(_)=>typeof _==="function",Xf=(_)=>_&&typeof _==="object",l=Array.isArray,u=typeof document<"u"?document:null,rf=(_)=>_?._isRuntime?_.container:_ instanceof Node?_:u.createTextNode(_==null?"":String(_)),k=null,y=null,o=!1,_f=0,Ef=new Set,lf=new WeakMap,Af=Symbol("iter"),Qf=new WeakMap,n=(_)=>{if(!_||_._disposed)return;_._disposed=!0;let W=[_];while(W.length){let E=W.pop();if(E._cleanups)E._cleanups.forEach((L)=>L()),E._cleanups.clear();if(E._children)E._children.forEach((L)=>W.push(L)),E._children.clear();if(E._deps)E._deps.forEach((L)=>L.delete(E)),E._deps.clear()}},J_=(_)=>{if(y)(y._mounts||=[]).push(_)},p=(_)=>{if(y)(y._cleanups||=new Set).add(_)},P_=(_)=>{let W=k;k=null;try{return _()}finally{k=W}},a=(_,W=!1)=>{let E=()=>{if(E._disposed)return;if(E._deps)E._deps.forEach((Q)=>Q.delete(E));if(E._cleanups)E._cleanups.forEach((Q)=>Q()),E._cleanups.clear();let L=k,J=y;k=y=E;try{return E._result=_()}catch(Q){console.error("[SigPro]",Q)}finally{k=L,y=J}};if(E._deps=E._cleanups=E._children=null,E._disposed=!1,E._isComputed=W,E._depth=k?k._depth+1:0,E._mounts=[],E._parent=y,y)(y._children||=new Set).add(E);return E},sf=()=>{if(o)return;o=!0;let _=Array.from(Ef).sort((W,E)=>W._depth-E._depth);Ef.clear();for(let W of _)if(!W._disposed)W();o=!1},A_=(_)=>{_f++;try{return _()}finally{if(_f--,_f===0&&Ef.size>0&&!o)sf()}},v=(_,W=!1)=>{if(!W&&k&&!k._disposed)_.add(k),(k._deps||=new Set).add(_);else if(W&&_.size>0){let E=!1;for(let L of _){if(L===k||L._disposed)continue;if(L._isComputed){if(L._dirty=!0,L._subs)v(L._subs,!0)}else Ef.add(L),E=!0}if(E&&!o&&_f===0)queueMicrotask(sf)}},V=(_,W=null)=>{let E=new Set;if(T(_)){let L,J=()=>{if(J._dirty){let Q=k;k=J;try{let P=_();if(!Object.is(L,P))L=P,v(E,!0)}finally{k=Q}J._dirty=!1}return v(E),L};if(J._isComputed=!0,J._subs=E,J._dirty=!0,J._deps=null,J._disposed=!1,J.stop=()=>{},y)p(J.stop);return J}if(W)try{_=JSON.parse(localStorage.getItem(W))??_}catch(L){}return(...L)=>{if(L.length){let J=T(L[0])?L[0](_):L[0];if(!Object.is(_,J)){if(_=J,W)localStorage.setItem(W,JSON.stringify(_));v(E,!0)}}return v(E),_}},of=(_)=>{if(!Xf(_))return _;let W=lf.get(_);if(W)return W;let E=new Map,L=(J)=>{let Q=E.get(J);if(!Q)E.set(J,Q=new Set);return Q};return W=new Proxy(_,{get(J,Q,P){if(typeof Q!=="symbol")v(L(Q));return of(Reflect.get(J,Q,P))},set(J,Q,P,A){let X=!Reflect.has(J,Q),G=Reflect.get(J,Q,A),Z=Reflect.set(J,Q,P,A);if(Z&&!Object.is(G,P)){if(v(L(Q),!0),X)v(L(Af),!0)}return Z},deleteProperty(J,Q){let P=Reflect.deleteProperty(J,Q);if(P)v(L(Q),!0),v(L(Af),!0);return P},ownKeys(J){return v(L(Af)),Reflect.ownKeys(J)}}),lf.set(_,W),W},b=(_,W)=>{if(W===void 0){let L=a(_);return L(),()=>n(L)}let E=a(()=>{let L=Array.isArray(_)?_.map((J)=>J()):_();P_(()=>W(L))});return E(),()=>n(E)},Gf=(_)=>{if(_._cleanups)_._cleanups.forEach((W)=>W()),_._cleanups.clear();if(_._ownerEffect)n(_._ownerEffect);if(_.childNodes)_.childNodes.forEach(Gf)},Q_=/^\s*(javascript|data|vbscript):/i,X_=(_)=>_==="src"||_==="href"||_.startsWith("on"),tf=(_,W)=>{if(W==null||W===!1)return null;if(X_(_)){let E=String(W);if(Q_.test(E))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${_}`),"#"}return W},f=(_,W={},E=[])=>{if(W instanceof Node||l(W)||!Xf(W))E=W,W={};if(T(_)){let P={_mounts:[],_cleanups:new Set},A=a(()=>{let K=_(W,{children:E,emit:(R,...z)=>W[`on${R[0].toUpperCase()}${R.slice(1)}`]?.(...z)});return A._result=K,K});A();let X=A._result;if(X==null)return null;let G=X instanceof Node||l(X)&&X.every((K)=>K instanceof Node)?X:u.createTextNode(String(X)),Z=(K)=>{if(Xf(K)&&!K._isRuntime)K._mounts=A._mounts||[],K._cleanups=A._cleanups||new Set,K._ownerEffect=A};return l(G)?G.forEach(Z):Z(G),G}let L=/^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(_),J=L?u.createElementNS("http://www.w3.org/2000/svg",_):u.createElement(_);J._cleanups=new Set;for(let P in W){if(!W.hasOwnProperty(P))continue;let A=W[P];if(P==="ref"){T(A)?A(J):A.current=J;continue}if(L&&P.startsWith("xlink:")){val==null?J.removeAttributeNS("http://www.w3.org/1999/xlink",P.slice(6)):J.setAttributeNS("http://www.w3.org/1999/xlink",P.slice(6),val);continue}if(P.startsWith("on")){let X=P.slice(2).toLowerCase();J.addEventListener(X,A);let G=()=>J.removeEventListener(X,A);J._cleanups.add(G),p(G)}else if(T(A)){let X=a(()=>{let G=tf(P,A());if(P==="class")J.className=G||"";else if(G==null)J.removeAttribute(P);else if(P in J&&!L)J[P]=G;else J.setAttribute(P,G===!0?"":G)});if(X(),J._cleanups.add(()=>n(X)),p(()=>n(X)),/^(INPUT|TEXTAREA|SELECT)$/.test(J.tagName)&&(P==="value"||P==="checked")){let G=P==="checked"?"change":"input";J.addEventListener(G,(Z)=>A(Z.target[P]))}}else{let X=tf(P,A);if(X!=null)if(P in J&&!L)J[P]=X;else J.setAttribute(P,X===!0?"":X)}}let Q=(P)=>{if(l(P))return P.forEach(Q);if(T(P)){let A=u.createTextNode("");J.appendChild(A);let X=[],G=a(()=>{let Z=P(),K=(l(Z)?Z:[Z]).map(rf);X.forEach((z)=>{if(z._isRuntime)z.destroy();else Gf(z);if(z.parentNode)z.remove()});let R=A;for(let z=K.length-1;z>=0;z--){let B=K[z];if(B.parentNode!==R.parentNode)R.parentNode?.insertBefore(B,R);if(B._mounts)B._mounts.forEach((S)=>S());R=B}X=K});G(),J._cleanups.add(()=>n(G)),p(()=>n(G))}else{let A=rf(P);if(J.appendChild(A),A._mounts)A._mounts.forEach((X)=>X())}};return Q(E),J},t=(_)=>{let W=new Set,E=[],L=y,J=k,Q=u.createElement("div");Q.style.display="contents",Q.setAttribute("role","presentation"),y={_cleanups:W,_mounts:E},k=null;let P=(A)=>{if(!A)return;if(A._isRuntime)W.add(A.destroy),Q.appendChild(A.container);else if(l(A))A.forEach(P);else Q.appendChild(A instanceof Node?A:u.createTextNode(String(A==null?"":A)))};try{P(_({onCleanup:(A)=>W.add(A)}))}finally{y=L,k=J}return E.forEach((A)=>A()),{_isRuntime:!0,container:Q,destroy:()=>{W.forEach((A)=>A()),Gf(Q),Q.remove()}}},j=(_,W,E=null)=>{let L=u.createTextNode(""),J=f("div",{style:"display:contents"},[L]),Q=null;return b(()=>!!(T(_)?_():_),(P)=>{if(Q)Q.destroy(),Q=null;let A=P?W:E;if(A)Q=t(()=>T(A)?A():A),J.insertBefore(Q.container,L)}),p(()=>Q?.destroy()),J},w=(_,W,E)=>{let L=u.createTextNode(""),J=f("div",{style:"display:contents"},[L]),Q=new Map;return b(()=>(T(_)?_():_)||[],(P)=>{let A=new Map,X=[],G=P||[];for(let K=0;KW(R,K));else Q.delete(z);A.set(z,B),X.push(B)}Q.forEach((K)=>K.destroy());let Z=L;for(let K=X.length-1;K>=0;K--){let R=X[K].container;if(R.nextSibling!==Z)J.insertBefore(R,Z);Z=R}Q=A}),J},s=(_)=>{let W=()=>window.location.hash.slice(1)||"/",E=V(W()),L=()=>E(W());window.addEventListener("hashchange",L),p(()=>window.removeEventListener("hashchange",L));let J=f("div",{class:"router-hook"}),Q=null;return b([E],()=>{let P=E(),A=_.find((X)=>{let G=X.path.split("/").filter(Boolean),Z=P.split("/").filter(Boolean);return G.length===Z.length&&G.every((K,R)=>K[0]===":"||K===Z[R])})||_.find((X)=>X.path==="*");if(A){Q?.destroy();let X={};A.path.split("/").filter(Boolean).forEach((G,Z)=>{if(G[0]===":")X[G.slice(1)]=P.split("/").filter(Boolean)[Z]}),s.params(X),Q=t(()=>T(A.component)?A.component(X):A.component),J.replaceChildren(Q.container)}}),J};s.params=V({});s.to=(_)=>window.location.hash=_.replace(/^#?\/?/,"#/");s.back=()=>window.history.back();s.path=()=>window.location.hash.replace(/^#/,"")||"/";var G_=(_,W,{enter:E,leave:L}={})=>{let J=f("div",{style:"display:contents"}),Q=null,P=(A,X)=>{let G=!1,Z=()=>!G&&(G=!0,X());if(!A)return Z();"transitionend animationend".split(" ").map((K)=>A.addEventListener(K,Z,{once:!0})),setTimeout(Z,500)};return b(_,(A)=>{if(A&&!Q){let X=(Q=t(W)).container.firstChild;if(J.appendChild(Q.container),E&&X)X.classList.add(E),X.clientTop,X.classList.add(E+"-active"),P(X,()=>X.classList.remove(E,E+"-active"))}else if(!A&&Q){let X=Q.container.firstChild,G=()=>(Q?.destroy(),Q=null);L&&X?(X.classList.add(L),P(X,G)):G()}}),p(()=>Q?.destroy()),J},Kf=(_,W)=>{let E=typeof W==="string"?u.querySelector(W):W;if(!E)return;if(Qf.has(E))Qf.get(E).destroy();let L=t(T(_)?_:()=>_);return E.replaceChildren(L.container),Qf.set(E,L),L},K_=Object.freeze({$:V,$$:of,Watch:b,Tag:f,Render:t,If:j,For:w,Router:s,Mount:Kf,onMount:J_,onUnmount:p,Anim:G_,Batch:A_});if(typeof window<"u")Object.assign(window,K_),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((_)=>{let W=_[0].toUpperCase()+_.slice(1);window[W]=(E,L)=>f(_,E,L)});var Y=(_)=>typeof _==="function"?_():_,q=(_,W)=>typeof W==="function"?()=>`${_} ${W()||""}`.trim():`${_} ${W||""}`.trim(),h=(_)=>{if(!_)return null;if(typeof _==="function")return f("span",{class:"mr-1"},_());if(typeof _==="object")return f("span",{class:"mr-1"},_);if(typeof _==="string"){let W=_.trim().split(/\s+/),E=W[W.length-1]==="right",L=E?W.slice(0,-1).join(" "):_,J=E?"ml-1":"mr-1";if(L&&!L.startsWith("icon-[")&&!L.includes("--"))return f("span",{class:J},L);return f("span",{class:`${L} ${J}`.trim()})}return null},Z_={es:{close:"Cerrar",confirm:"Confirmar",cancel:"Cancelar",search:"Buscar...",loading:"Cargando...",nodata:"Sin datos"},en:{close:"Close",confirm:"Confirm",cancel:"Cancel",search:"Search...",loading:"Loading...",nodata:"No data"}},af=V("es"),ef=(_)=>af(_),f_=(_)=>()=>Z_[af()][_]||_;var B_=(_,W)=>{let{class:E,title:L,name:J,open:Q,...P}=_;return f("div",{...P,class:q("collapse collapse-arrow bg-base-200 mb-2",E)},[f("input",{type:J?"radio":"checkbox",name:J,checked:Y(Q)}),f("div",{class:"collapse-title text-xl font-medium"},L),f("div",{class:"collapse-content"},W)])};var Bf={};U(Bf,{Alert:()=>Y_});var Y_=(_,W)=>{let{class:E,actions:L,type:J="info",soft:Q=!0,...P}=_,A={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},Z=[`alert-${J}`,Q?"alert-soft":"",E].filter(Boolean).join(" "),K=W||_.message;return f("div",{...P,role:"alert",class:q("alert",Z)},()=>[h(A[J]),f("div",{class:"flex-1"},[f("span",{},[typeof K==="function"?K():K])]),L?f("div",{class:"flex-none"},[typeof L==="function"?L():L]):null].filter(Boolean))};var qf={};U(qf,{Autocomplete:()=>q_});var Yf={};U(Yf,{Input:()=>e});var e=(_)=>{let{class:W,value:E,type:L="text",icon:J,oninput:Q,placeholder:P,disabled:A,validate:X,label:G,...Z}=_,K=L==="password",R=$(!1),z=$(null),B={text:"icon-[lucide--text]",password:"icon-[lucide--lock]",date:"icon-[lucide--calendar]",number:"icon-[lucide--hash]",email:"icon-[lucide--mail]",search:"icon-[lucide--search]",tel:"icon-[lucide--phone]",url:"icon-[lucide--link]"},S=J?h(J):B[L]?h(B[L]):null,D=()=>h(R()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),F=S?"pl-10":"",I=K?"pr-10":"",r=()=>{if(W?.includes("input-xs"))return"btn-xs";if(W?.includes("input-sm"))return"btn-sm";if(W?.includes("input-lg"))return"btn-lg";return"btn-md"},i=(O)=>{let g=O.target.value;if(X){let Lf=X(g);z(Lf||null)}Q?.(O)},M=()=>z()&&z()!=="",N=f("input",{...Z,type:()=>K?R()?"text":"password":L,placeholder:P||(G?" ":P),class:()=>{let O=`input w-full ${F} ${I}`;if(W)O+=` ${W}`;if(M())O+=" input-error";return O.trim()},value:E,oninput:i,disabled:()=>Y(A),"aria-invalid":()=>M()?"true":"false"}),H=()=>[N,S?f("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},S):null,K?f("button",{type:"button",class:q("absolute right-3 inset-y-0 flex items-center","btn btn-ghost btn-circle opacity-50 hover:opacity-100",r()),onclick:(O)=>{O.preventDefault(),R(!R())}},()=>D()):null,f("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>M()?z():null)];if(G)return f("label",{class:q("floating-label w-full",W)},()=>[f("div",{class:"relative w-full"},H),f("span",{},Y(G))]);return f("div",{class:"relative w-full"},H)};var q_=(_)=>{let{class:W,items:E=[],value:L,onselect:J,label:Q,placeholder:P,...A}=_,X=V(Y(L)||""),G=V(!1),Z=V(-1),K=V([]);Watch(()=>{let B=String(X()).toLowerCase(),S=Y(E)||[],D=B?S.filter((F)=>(typeof F==="string"?F:F.label).toLowerCase().includes(B)):S;K(D)});let R=(B)=>{let S=typeof B==="string"?B:B.value,D=typeof B==="string"?B:B.label;if(X(D),typeof L==="function")L(S);J?.(B),G(!1),Z(-1)};return f("div",{class:"relative w-full"},[e({label:Q,class:W,placeholder:P,value:X,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:(B)=>{let S=K();if(B.key==="ArrowDown")B.preventDefault(),G(!0),Z(Math.min(Z()+1,S.length-1));else if(B.key==="ArrowUp")B.preventDefault(),Z(Math.max(Z()-1,0));else if(B.key==="Enter"&&Z()>=0)B.preventDefault(),R(S[Z()]);else if(B.key==="Escape")G(!1)},oninput:(B)=>{let S=B.target.value;if(X(S),typeof L==="function")L(S);G(!0),Z(-1)},...A}),f("ul",{class:"absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50",style:()=>G()&&K().length?"display:block":"display:none"},[w(K,(B,S)=>f("li",{},[f("a",{class:()=>`block w-full ${Z()===S?"active bg-primary text-primary-content":""}`,onclick:()=>R(B),onmouseenter:()=>Z(S)},typeof B==="string"?B:B.label)]),(B,S)=>(typeof B==="string"?B:B.value)+S),()=>K().length?null:f("li",{class:"p-2 text-center opacity-50"},"nodata")])])};var zf={};U(zf,{Badge:()=>z_});var z_=(_,W)=>{let{class:E,...L}=_;return f("span",{...L,class:q("badge",E)},W)};var Cf={};U(Cf,{Button:()=>ff});var ff=(_,W)=>{let{class:E,loading:L,icon:J,...Q}=_,P=h(J);return f("button",{...Q,class:q("btn",E),disabled:()=>Y(L)||Y(_.disabled)},()=>[Y(L)&&f("span",{class:"loading loading-spinner"}),P,W].filter(Boolean))};var Rf={};U(Rf,{Checkbox:()=>C_});var C_=(_)=>{let{class:W,value:E,toggle:L,label:J,...Q}=_,P=f("input",{...Q,type:"checkbox",class:()=>q(Y(L)?"toggle":"checkbox",W),checked:E});return f("label",{class:"label cursor-pointer justify-start gap-3"},[P,J?f("span",{class:"label-text"},J):null])};var Sf={};U(Sf,{Colorpicker:()=>R_});var R_=(_)=>{let{class:W,value:E,label:L,...J}=_,Q=V(!1),P=["#000","#1A1A1A","#333","#4D4D4D","#666","#808080","#B3B3B3","#FFF","#450a0a","#7f1d1d","#991b1b","#b91c1c","#dc2626","#ef4444","#f87171","#fca5a5","#431407","#7c2d12","#9a3412","#c2410c","#ea580c","#f97316","#fb923c","#ffedd5","#713f12","#a16207","#ca8a04","#eab308","#facc15","#fde047","#fef08a","#fff9c4","#064e3b","#065f46","#059669","#10b981","#34d399","#4ade80","#84cc16","#d9f99d","#082f49","#075985","#0284c7","#0ea5e9","#38bdf8","#7dd3fc","#22d3ee","#cffafe","#1e1b4b","#312e81","#4338ca","#4f46e5","#6366f1","#818cf8","#a5b4fc","#e0e7ff","#2e1065","#4c1d95","#6d28d9","#7c3aed","#8b5cf6","#a855f7","#d946ef","#fae8ff"],A=()=>Y(E)||"#000000";return f("div",{class:q("relative w-fit",W)},[f("button",{type:"button",class:"btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case",onclick:(X)=>{X.stopPropagation(),Q(!Q())},...J},[f("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${A()}`}),L?f("span",{class:"opacity-80"},L):null]),j(Q,()=>f("div",{class:"absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none",onclick:(X)=>X.stopPropagation()},[f("div",{class:"grid grid-cols-8 gap-1"},P.map((X)=>f("button",{type:"button",style:`background-color: ${X}`,class:()=>{return`size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 + ${A().toLowerCase()===X.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof E==="function")E(X);Q(!1)}})))])),j(Q,()=>f("div",{class:"fixed inset-0 z-[100]",onclick:()=>Q(!1)}))])};var Nf={};U(Nf,{Datepicker:()=>S_});var S_=(_)=>{let{class:W,value:E,range:L,label:J,placeholder:Q,hour:P=!1,...A}=_,X=V(!1),G=V(new Date),Z=V(null),K=V(0),R=V(0),z=()=>Y(L)===!0,B=new Date,S=`${B.getFullYear()}-${String(B.getMonth()+1).padStart(2,"0")}-${String(B.getDate()).padStart(2,"0")}`,D=(C)=>{let N=C.getFullYear(),H=String(C.getMonth()+1).padStart(2,"0"),O=String(C.getDate()).padStart(2,"0");return`${N}-${H}-${O}`},F=(C)=>{let N=D(C),H=Y(E);if(z())if(!H?.start||H.start&&H.end){if(typeof E==="function")E({start:N,end:null,...P&&{startHour:K()}})}else{let O=H.start;if(typeof E==="function"){let g=N{let C=Y(E);if(!C){I("");return}let N="";if(typeof C==="string")N=P&&C.includes("T")?C.replace("T"," "):C;else if(C.start&&C.end){let H=P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start,O=P&&C.endHour!==void 0?`${C.end} ${String(C.endHour).padStart(2,"0")}:00`:C.end;N=`${H} - ${O}`}else if(C.start)N=`${P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start}...`;I(N)});let r=(C)=>{let N=G();G(new Date(N.getFullYear(),N.getMonth()+C,1))},i=(C)=>{let N=G();G(new Date(N.getFullYear()+C,N.getMonth(),1))},M=({value:C,onChange:N})=>{return f("div",{class:"flex-1"},[f("div",{class:"flex gap-2 items-center"},[f("input",{type:"range",min:0,max:23,value:C,class:"range range-xs flex-1",oninput:(H)=>{let O=parseInt(H.target.value);N(O)}}),f("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(Y(C)).padStart(2,"0")+":00")])])};return f("div",{class:q("relative w-full",W)},[e({label:J,placeholder:Q||(z()?"Seleccionar rango...":"Seleccionar fecha..."),value:I,readonly:!0,icon:h("icon-[lucide--calendar]"),onclick:(C)=>{C.stopPropagation(),X(!X())},...A}),j(X,()=>f("div",{class:"absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none",onclick:(C)=>C.stopPropagation()},[f("div",{class:"flex justify-between items-center mb-4 gap-1"},[f("div",{class:"flex gap-0.5"},[f("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(-1)},h("icon-[lucide--chevrons-left]")),f("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(-1)},h("icon-[lucide--chevron-left]"))]),f("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().toLocaleString("es-ES",{month:"short",year:"numeric"})]),f("div",{class:"flex gap-0.5"},[f("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(1)},h("icon-[lucide--chevron-right]")),f("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(1)},h("icon-[lucide--chevrons-right]"))])]),f("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>Z(null)},[...["L","M","X","J","V","S","D"].map((C)=>f("div",{class:"text-[10px] opacity-40 font-bold text-center"},C)),()=>{let C=G(),N=C.getFullYear(),H=C.getMonth(),O=new Date(N,H,1).getDay(),g=O===0?6:O-1,Lf=new Date(N,H+1,0).getDate(),Wf=[];for(let c=0;c{let d=Y(E),$f=Z(),__=typeof d==="string"?d.split("T")[0]===x:d?.start===x,E_=d?.end===x,Jf=!1;if(z()&&d?.start){let Pf=d.start;if(!d.end&&$f)Jf=x>Pf&&x<=$f||x=$f;else if(d.end)Jf=x>Pf&&x{if(z())Z(x)},onclick:()=>F(nf)},[c.toString()]))}return Wf}]),P?f("div",{class:"mt-3 pt-2 border-t border-base-300"},[z()?f("div",{class:"flex gap-4"},[M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N?.start)E({...N,startHour:C})}}),M({value:R,onChange:(C)=>{R(C);let N=Y(E);if(N?.end)E({...N,endHour:C})}})]):M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N&&typeof N==="string")E(N.split("T")[0]+"T"+String(C).padStart(2,"0")+":00:00")}})]):null])),j(X,()=>f("div",{class:"fixed inset-0 z-[90]",onclick:()=>X(!1)}))])};var Uf={};U(Uf,{Drawer:()=>N_});var N_=(_,W)=>{let{class:E,id:L,open:J,side:Q,content:P,...A}=_,X=L||`drawer-${Math.random().toString(36).slice(2,9)}`;return f("div",{...A,class:q("drawer",E)},[f("input",{id:X,type:"checkbox",class:"drawer-toggle",checked:()=>typeof J==="function"?J():J,onchange:(G)=>{if(typeof J==="function")J(G.target.checked)}}),f("div",{class:"drawer-content"},[typeof P==="function"?P():P]),f("div",{class:"drawer-side"},[f("label",{for:X,class:"drawer-overlay",onclick:()=>{if(typeof J==="function")J(!1)}}),f("div",{class:"min-h-full bg-base-200 w-80"},[typeof Q==="function"?Q():Q])])])};var hf={};U(hf,{Dropdown:()=>U_});var m=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(_)=>{if(m&&!m.contains(_.target))m.open=!1,m=null}),window.__dropdownHandlerRegistered=!0;var U_=(_)=>{let{class:W,label:E,icon:L,items:J,...Q}=_;return f("details",{...Q,class:q("dropdown",W)},[f("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(P)=>{let A=P.currentTarget.closest("details");if(m&&m!==A)m.open=!1;setTimeout(()=>{m=A.open?A:null},0)}},[()=>L?typeof L==="function"?L():L:null,()=>E?typeof E==="function"?E():E:null]),f("ul",{tabindex:"-1",class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[()=>{return(typeof J==="function"?J():J||[]).map((A)=>f("li",{},[f("a",{class:A.class||"",onclick:(X)=>{if(A.onclick)A.onclick(X);let G=X.currentTarget.closest("details");if(G){if(G.open=!1,m===G)m=null}}},[A.icon?f("span",{},A.icon):null,f("span",{},A.label)])]))}])])};var Vf={};U(Vf,{Fab:()=>h_});var h_=(_)=>{let{class:W,icon:E,label:L,actions:J=[],position:Q="bottom-6 right-6",...P}=_;return f("div",{...P,class:q(`fab absolute ${Q} flex flex-col-reverse items-end gap-3 z-[100]`,W)},[f("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[E?h(E):null,!E&&L?L:null]),...Y(J).map((A)=>f("div",{class:"flex items-center gap-3 transition-all duration-300"},[A.label?f("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},A.label):null,f("button",{type:"button",class:`btn btn-circle shadow-lg ${A.class||""}`,onclick:(X)=>{X.stopPropagation(),A.onclick?.(X)}},[A.icon?h(A.icon):A.text||""])]))])};var Df={};U(Df,{Fieldset:()=>V_});var V_=(_,W)=>{let{class:E,legend:L,...J}=_;return f("fieldset",{...J,class:q("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",E)},[()=>{let Q=Y(L);return Q?f("legend",{class:"fieldset-legend font-bold"},[Q]):null},W])};var Of={};U(Of,{Fileinput:()=>D_});var D_=(_)=>{let{class:W,tooltip:E,max:L=2,accept:J="*",onselect:Q,...P}=_,A=V([]),X=V(!1),G=V(null),Z=L*1024*1024,K=(z)=>{let B=Array.from(z);if(G(null),B.find((D)=>D.size>Z)){G(`Máx ${L}MB`);return}A([...A(),...B]),Q?.(A())},R=(z)=>{let B=A().filter((S,D)=>D!==z);A(B),Q?.(B)};return f("fieldset",{...P,class:q("fieldset w-full p-0",W)},[f("div",{class:()=>`w-full ${E?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":E},[f("label",{class:()=>` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-200 - ${J()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} - `,ondragover:(K)=>{K.preventDefault(),J(!0)},ondragleave:()=>J(!1),ondrop:(K)=>{K.preventDefault(),J(!1),T(K.dataTransfer.files)}},[Tag("div",{class:"flex items-center gap-3 w-full"},[z("icon-[lucide--upload]"),Tag("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),Tag("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${E}MB`)]),Tag("input",{type:"file",multiple:!0,accept:L,class:"hidden",onchange:(K)=>T(K.target.files)})])]),()=>Q()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},Q()):null,If(()=>W().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(W,(K,G)=>Tag("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[Tag("div",{class:"flex items-center gap-2 truncate"},[Tag("span",{class:"opacity-50"},"\uD83D\uDCC4"),Tag("span",{class:"truncate font-medium max-w-[200px]"},K.name),Tag("span",{class:"text-[9px] opacity-40"},`(${(K.size/1024).toFixed(0)} KB)`)]),Tag("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(C)=>{C.preventDefault(),C.stopPropagation(),Y(G)}},[z("icon-[lucide--x]")])]),(K)=>K.name+K.lastModified)]))])};var Vf={};R(Vf,{Indicator:()=>Z_});var Z_=(f,M)=>{let{value:_,class:E,...L}=f;return Tag("div",{...L,class:"indicator"},()=>[_?Tag("span",{class:Z("indicator-item badge",E)},()=>typeof _==="function"?_():_):null,M].filter(Boolean))};var Ff={};R(Ff,{Label:()=>K_});var K_=(f)=>{let{children:M,value:_,floating:E=!1,class:L,...A}=f;if(E)return Tag("label",{class:Z("floating-label",L),...A},()=>[typeof M==="function"?M():M,_?Tag("span",{},B(_)):null]);return Tag("label",{class:Z("label",L),...A},()=>[_?Tag("span",{class:"label-text"},B(_)):null,typeof M==="function"?M():M])};var kf={};R(kf,{List:()=>S_});var S_=(f)=>{let{class:M,items:_,header:E,render:L=(J)=>J,keyFn:A=(J,Q)=>J.id??Q,...P}=f,W=For(_,(J,Q)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[L(J,Q)])]),A);return Tag("ul",{...P,style:"display: block; width: 100%;",class:Z("list bg-base-100 rounded-box shadow-md",M)},E?[If(E,()=>Tag("li",{class:"p-4 pb-2 text-xs opacity-60",style:"width: 100%;"},[B(E)])),W]:W)};var Hf={};R(Hf,{Menu:()=>Y_});var Y_=(f)=>{let{class:M,items:_,...E}=f,L=(A)=>For(()=>A||[],(P)=>Tag("li",{},[P.children?Tag("details",{open:P.open},[Tag("summary",{},[P.icon&&Tag("span",{class:"mr-2"},P.icon),P.label]),Tag("ul",{},L(P.children))]):Tag("a",{class:()=>B(P.active)?"active":"",onclick:P.onclick},[P.icon&&Tag("span",{class:"mr-2"},P.icon),P.label])]),(P,W)=>P.label||W);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},L(_))};var jf={};R(jf,{Modal:()=>C_});var C_=(f,M)=>{let{class:_,title:E,buttons:L,open:A,...P}=f,W=null,J=()=>{let X=typeof A==="function"?A():A;if(!W)return;if(X){if(!W.open)W.showModal()}else if(W.open)W.close()};Watch(()=>J());let Q=()=>{if(typeof A==="function")A(!1)};return Tag("dialog",{...P,ref:(X)=>{if(W=X,X)J()},class:Z("modal",_),onclose:Q,oncancel:Q},[Tag("div",{class:"modal-box"},[E?Tag("h3",{class:"text-lg font-bold mb-4"},()=>typeof E==="function"?E():E):null,Tag("div",{class:"py-2"},[typeof M==="function"?M():M]),Tag("div",{class:"modal-action"},[Tag("form",{method:"dialog",class:"flex gap-2"},[...(Array.isArray(L)?L:[L]).filter(Boolean),l({type:"submit"},I("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var wf={};R(wf,{Navbar:()=>q_});var q_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var yf={};R(yf,{Radio:()=>R_});var R_=(f)=>{let{class:M,label:_,tooltip:E,value:L,inputValue:A,name:P,...W}=f,J=Tag("input",{...W,type:"radio",name:P,class:Z("radio",M),checked:()=>B(L)===A,onclick:()=>{if(typeof L==="function")L(A)}});if(!_&&!E)return J;let Q=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[J,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},Q):Q};var xf={};R(xf,{Range:()=>z_});var z_=(f)=>{let{class:M,label:_,tooltip:E,value:L,...A}=f,P=Tag("input",{...A,type:"range",class:Z("range",M),value:L,disabled:()=>B(f.disabled)});if(!_&&!E)return P;let W=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,P]);return E?Tag("div",{class:"tooltip","data-tip":E},W):W};var uf={};R(uf,{Rating:()=>h_});var h_=(f)=>{let{class:M,value:_,count:E=5,mask:L="mask-star",readonly:A=!1,onchange:P,...W}=f,J=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...W,class:()=>Z(`rating ${B(A)?"pointer-events-none":""}`,M)},Array.from({length:B(E)},(Q,X)=>{let T=X+1;return Tag("input",{type:"radio",name:J,class:`mask ${L}`,checked:()=>Math.round(B(_))===T,onchange:()=>{if(!B(A)){if(typeof P==="function")P(T);else if(typeof _==="function")_(T)}}})}))};var mf={};R(mf,{Select:()=>D_});var D_=(f)=>{let{class:M,label:_,items:E,value:L,...A}=f,P=Tag("select",{...A,class:Z("select select-bordered w-full",M),value:L},For(()=>B(E)||[],(W)=>Tag("option",{value:W.value,$selected:()=>String(B(L))===String(W.value)},W.label),(W)=>W.value));if(!_)return P;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),P])};var vf={};R(vf,{Stack:()=>N_});var N_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var gf={};R(gf,{Stat:()=>O_});var O_=(f)=>{let{class:M,icon:_,label:E,value:L,desc:A,...P}=f;return Tag("div",{...P,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>B(L)??L),A&&Tag("div",{class:"stat-desc"},A)])};var cf={};R(cf,{Swap:()=>U_});var U_=(f)=>{let{class:M,value:_,on:E,off:L,...A}=f;return Tag("label",{...A,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>B(_),onclick:(P)=>{if(typeof _==="function")_(P.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},L)])};var pf={};R(pf,{Table:()=>V_});var V_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:L,zebra:A=!1,pinRows:P=!1,empty:W=I("nodata")(),...J}=f,Q=()=>{let T=B(A)?"table-zebra":"",Y=B(P)?"table-pin-rows":"";return Z("table",M,T,Y)},X=L||((T,Y)=>T.id||Y);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...J,class:Q},[Tag("thead",{},[Tag("tr",{},E.map((T)=>Tag("th",{class:T.class||""},T.label)))]),Tag("tbody",{},[For(_,(T,Y)=>{let K=()=>{let G=B(_),C=X(T,Y);return G.find((h,U)=>X(h,U)===C)||T};return Tag("tr",{class:"hover"},E.map((G)=>{let C=()=>{let h=K();if(G.render)return G.render(h,Y);return B(h[G.key])};return Tag("td",{class:G.class||""},[C])}))},X),If(()=>B(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[B(W)])]))])])])};var bf={};R(bf,{Tabs:()=>F_});var F_=(f)=>{let{items:M,class:_,onTabClose:E,...L}=f,A=typeof M==="function"?M:()=>M||[],P=i(0);b(()=>{let Q=A().findIndex((X)=>B(X.active)===!0);if(Q!==-1&&P()!==Q)P(Q)});let W=(J,Q)=>{if(Q.onClose)Q.onClose(Q);if(E)E(Q,J);let T=A().filter((G,C)=>C!==J);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(T),T.length===0)return;let K=P();if(J{let J=A(),Q=[];for(let X=0;X{q.stopPropagation(),W(X,T)};let S=k("span",{class:"flex items-center"},[K,F]);G.push(S)}else G.push(K);let C=k("button",{class:()=>Z("tab",P()===X?"tab-active":""),onclick:(F)=>{if(F.preventDefault(),!B(T.disabled)){if(T.onclick)T.onclick();P(X)}}},G),h=T.tip?k("div",{class:"tooltip","data-tip":T.tip},C):C;Q.push(h);let U,H=B(T.content);if(typeof H==="function")U=H();else if(H instanceof Node)U=H;else U=document.createTextNode(String(H));let d=k("div",{class:"tab-content-inner"},U),n=k("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>P()===X?"display: block":"display: none"},d);Q.push(n)}return Q})};var rf={};R(rf,{Timeline:()=>k_});var k_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:L=!1,...A}=f,P={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return Tag("ul",{...A,class:()=>Z(`timeline ${B(E)?"timeline-vertical":"timeline-horizontal"} ${B(L)?"timeline-compact":""}`,M)},()=>{let W=(typeof _==="function"?_():_)||[];return W.map((J,Q)=>{let X=Q===0,T=Q===W.length-1,Y=J.type||"success",K=()=>B(J.completed),G=()=>Q>0&&B(W[Q-1].completed),C=(h)=>typeof h==="function"?h():h;return Tag("li",{class:"flex-1"},[!X?Tag("hr",{class:()=>G()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>C(J.title)]),Tag("div",{class:"timeline-middle"},[()=>J.icon?z(J.icon):z(P[Y]||P.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>C(J.detail)]),!T?Tag("hr",{class:()=>K()?"bg-primary":""}):null])})})};var df={};R(df,{Toast:()=>H_});var H_=(f,M="alert-success",_=3500)=>{let E=document.getElementById("sigpro-toast-container");if(!E)E=Tag("div",{id:"sigpro-toast-container",class:"fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none"}),document.body.appendChild(E);let L=Tag("div",{style:"display: contents"});E.appendChild(L);let A,P=()=>{clearTimeout(A);let Q=L.firstElementChild;if(Q&&!Q.classList.contains("opacity-0"))Q.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(J.destroy(),L.remove(),!E.hasChildNodes())E.remove()},300);else J.destroy(),L.remove()},W=()=>{let Q=z("icon-[lucide--x]"),X=Tag("div",{class:`alert alert-soft ${M} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[Tag("span",{},[typeof f==="function"?f():f]),l({class:"btn-xs btn-circle btn-ghost",onclick:P},Q)]);return requestAnimationFrame(()=>X.classList.remove("translate-x-10","opacity-0")),X},J=Mount(W,L);if(_>0)A=setTimeout(P,_);return P};var nf={};R(nf,{Tooltip:()=>j_});var j_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var w_={...Xf,...Zf,...Sf,...Yf,...Cf,...qf,...Rf,...zf,...hf,...Df,...Nf,...Of,...Uf,...Vf,...Kf,...Ff,...kf,...Hf,...jf,...wf,...yf,...xf,...uf,...mf,...vf,...gf,...cf,...pf,...bf,...rf,...df,...nf},r_={...w_,install:(f=window)=>{Object.entries(w_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(Ef).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(Mf).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.defineProperty(window,"tt",{value:I,writable:!1,configurable:!0,enumerable:!0}),Object.defineProperty(window,"SigProUI",{value:{...Ef,Utils:Mf,tt:I},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");export{B as val,Z as ui,I as tt,z as getIcon,b as Watch,j_ as Tooltip,H_ as Toast,k_ as Timeline,k as Tag,F_ as Tabs,V_ as Table,U_ as Swap,O_ as Stat,N_ as Stack,D_ as Select,r as Router,h_ as Rating,z_ as Range,R_ as Radio,q_ as Navbar,M_ as Mount,C_ as Modal,Y_ as Menu,S_ as List,K_ as Label,s as Input,Z_ as Indicator,f_ as If,__ as For,X_ as Fileinput,G_ as Fieldset,B_ as Fab,T_ as Dropdown,Q_ as Drawer,J_ as Datepicker,P_ as Colorpicker,W_ as Checkbox,l as Button,A_ as Badge,L_ as Autocomplete,$_ as Alert,E_ as Accordion,i as $}; + ${X()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(z)=>{z.preventDefault(),X(!0)},ondragleave:()=>X(!1),ondrop:(z)=>{z.preventDefault(),X(!1),K(z.dataTransfer.files)}},[f("div",{class:"flex items-center gap-3 w-full"},[h("icon-[lucide--upload]"),f("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),f("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${L}MB`)]),f("input",{type:"file",multiple:!0,accept:J,class:"hidden",onchange:(z)=>K(z.target.files)})])]),()=>G()?f("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,j(()=>A().length>0,()=>f("ul",{class:"mt-2 space-y-1"},[w(A,(z,B)=>f("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[f("div",{class:"flex items-center gap-2 truncate"},[f("span",{class:"opacity-50"},"\uD83D\uDCC4"),f("span",{class:"truncate font-medium max-w-[200px]"},z.name),f("span",{class:"text-[9px] opacity-40"},`(${(z.size/1024).toFixed(0)} KB)`)]),f("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(S)=>{S.preventDefault(),S.stopPropagation(),R(B)}},[h("icon-[lucide--x]")])]),(z)=>z.name+z.lastModified)]))])};var Hf={};U(Hf,{Indicator:()=>O_});var O_=(_,W)=>{let{value:E,class:L,...J}=_;return f("div",{...J,class:"indicator"},()=>[E?f("span",{class:q("indicator-item badge",L)},()=>typeof E==="function"?E():E):null,W].filter(Boolean))};var kf={};U(kf,{Label:()=>H_});var H_=(_)=>{let{children:W,value:E,floating:L=!1,class:J,...Q}=_;if(L)return f("label",{class:q("floating-label",J),...Q},()=>[typeof W==="function"?W():W,E?f("span",{},Y(E)):null]);return f("label",{class:q("label",J),...Q},()=>[E?f("span",{class:"label-text"},Y(E)):null,typeof W==="function"?W():W])};var Ff={};U(Ff,{List:()=>k_});var k_=(_)=>{let{class:W,items:E,header:L,render:J=(X)=>X,keyFn:Q=(X,G)=>X.id??G,...P}=_,A=w(E,(X,G)=>f("li",{class:"list-row",style:"width: 100%; display: block;"},[f("div",{style:"width: 100%;"},[J(X,G)])]),Q);return f("ul",{...P,style:"display: block; width: 100%;",class:q("list bg-base-100 rounded-box shadow-md",W)},L?[j(L,()=>f("li",{class:"p-4 pb-2 text-xs opacity-60",style:"width: 100%;"},[Y(L)])),A]:A)};var yf={};U(yf,{Menu:()=>F_});var F_=(_)=>{let{class:W,items:E,...L}=_,J=(Q)=>w(()=>Q||[],(P)=>f("li",{},[P.children?f("details",{open:P.open},[f("summary",{},[P.icon&&f("span",{class:"mr-2"},P.icon),P.label]),f("ul",{},J(P.children))]):f("a",{class:()=>Y(P.active)?"active":"",onclick:P.onclick},[P.icon&&f("span",{class:"mr-2"},P.icon),P.label])]),(P,A)=>P.label||A);return f("ul",{...L,class:q("menu bg-base-200 rounded-box",W)},J(E))};var wf={};U(wf,{Modal:()=>y_});var y_=(_,W)=>{let{class:E,title:L,buttons:J,open:Q,...P}=_,A=null,X=()=>{let Z=typeof Q==="function"?Q():Q;if(!A)return;if(Z){if(!A.open)A.showModal()}else if(A.open)A.close()};b(()=>X());let G=()=>{if(typeof Q==="function")Q(!1)};return f("dialog",{...P,ref:(Z)=>{if(A=Z,Z)X()},class:q("modal",E),onclose:G,oncancel:G},[f("div",{class:"modal-box"},[L?f("h3",{class:"text-lg font-bold mb-4"},()=>typeof L==="function"?L():L):null,f("div",{class:"py-2"},[typeof W==="function"?W():W]),f("div",{class:"modal-action"},[f("form",{method:"dialog",class:"flex gap-2"},[...(Array.isArray(J)?J:[J]).filter(Boolean),ff({type:"submit"},"close")])])]),f("form",{method:"dialog",class:"modal-backdrop"},[f("button",{},"close")])])};var Mf={};U(Mf,{Navbar:()=>w_});var w_=(_,W)=>{let{class:E,...L}=_;return f("div",{...L,class:q("navbar bg-base-100 shadow-sm px-4",E)},W)};var jf={};U(jf,{Radio:()=>M_});var M_=(_)=>{let{class:W,label:E,tooltip:L,value:J,inputValue:Q,name:P,...A}=_,X=f("input",{...A,type:"radio",name:P,class:q("radio",W),checked:()=>Y(J)===Q,onclick:()=>{if(typeof J==="function")J(Q)}});if(!E&&!L)return X;let G=f("label",{class:"label cursor-pointer justify-start gap-3"},[X,E?f("span",{class:"label-text"},E):null]);return L?f("div",{class:"tooltip","data-tip":L},G):G};var If={};U(If,{Range:()=>j_});var j_=(_)=>{let{class:W,label:E,tooltip:L,value:J,...Q}=_,P=f("input",{...Q,type:"range",class:q("range",W),value:J,disabled:()=>Y(_.disabled)});if(!E&&!L)return P;let A=f("div",{class:"flex flex-col gap-2"},[E?f("span",{class:"label-text"},E):null,P]);return L?f("div",{class:"tooltip","data-tip":L},A):A};var xf={};U(xf,{Rating:()=>I_});var I_=(_)=>{let{class:W,value:E,count:L=5,mask:J="mask-star",readonly:Q=!1,onchange:P,...A}=_,X=`rating-${Math.random().toString(36).slice(2,7)}`;return f("div",{...A,class:()=>q(`rating ${Y(Q)?"pointer-events-none":""}`,W)},Array.from({length:Y(L)},(G,Z)=>{let K=Z+1;return f("input",{type:"radio",name:X,class:`mask ${J}`,checked:()=>Math.round(Y(E))===K,onchange:()=>{if(!Y(Q)){if(typeof P==="function")P(K);else if(typeof E==="function")E(K)}}})}))};var vf={};U(vf,{Select:()=>x_});var x_=(_)=>{let{class:W,label:E,items:L,value:J,...Q}=_,P=f("select",{...Q,class:q("select select-bordered w-full",W),value:J},w(()=>Y(L)||[],(A)=>f("option",{value:A.value,$selected:()=>String(Y(J))===String(A.value)},A.label),(A)=>A.value));if(!E)return P;return f("label",{class:"fieldset-label flex flex-col gap-1"},[f("span",{},E),P])};var Tf={};U(Tf,{Stack:()=>v_});var v_=(_,W)=>{let{class:E,...L}=_;return f("div",{...L,class:q("stack",E)},W)};var uf={};U(uf,{Stat:()=>T_});var T_=(_)=>{let{class:W,icon:E,label:L,value:J,desc:Q,...P}=_;return f("div",{...P,class:q("stat",W)},[E&&f("div",{class:"stat-figure text-secondary"},E),L&&f("div",{class:"stat-title"},L),f("div",{class:"stat-value"},()=>Y(J)??J),Q&&f("div",{class:"stat-desc"},Q)])};var bf={};U(bf,{Swap:()=>u_});var u_=(_)=>{let{class:W,value:E,on:L,off:J,...Q}=_;return f("label",{...Q,class:q("swap",W)},[f("input",{type:"checkbox",checked:()=>Y(E),onclick:(P)=>{if(typeof E==="function")E(P.target.checked)}}),f("div",{class:"swap-on"},L),f("div",{class:"swap-off"},J)])};var mf={};U(mf,{Table:()=>b_});var b_=(_)=>{let{class:W,items:E=[],columns:L=[],keyFn:J,zebra:Q=!1,pinRows:P=!1,empty:A="nodata",...X}=_,G=()=>{let K=Y(Q)?"table-zebra":"",R=Y(P)?"table-pin-rows":"";return q("table",W,K,R)},Z=J||((K,R)=>K.id||R);return f("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[f("table",{...X,class:G},[f("thead",{},[f("tr",{},L.map((K)=>f("th",{class:K.class||""},K.label)))]),f("tbody",{},[w(E,(K,R)=>{let z=()=>{let B=Y(E),S=Z(K,R);return B.find((D,F)=>Z(D,F)===S)||K};return f("tr",{class:"hover"},L.map((B)=>{let S=()=>{let D=z();if(B.render)return B.render(D,R);return Y(D[B.key])};return f("td",{class:B.class||""},[S])}))},Z),j(()=>Y(E).length===0,()=>f("tr",{},[f("td",{colspan:L.length,class:"text-center p-10 opacity-50"},[Y(A)])]))])])])};var df={};U(df,{Tabs:()=>m_});var m_=(_)=>{let{items:W,class:E,onTabClose:L,...J}=_,Q=typeof W==="function"?W:()=>W||[],P=V(0);b(()=>{let G=Q().findIndex((Z)=>Y(Z.active)===!0);if(G!==-1&&P()!==G)P(G)});let A=(X,G)=>{if(G.onClose)G.onClose(G);if(L)L(G,X);let K=Q().filter((B,S)=>S!==X);if(!(typeof W==="function"&&!W._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(W(K),K.length===0)return;let z=P();if(X{let X=Q(),G=[];for(let Z=0;Z{N.stopPropagation(),A(Z,K)};let C=f("span",{class:"flex items-center"},[z,M]);B.push(C)}else B.push(z);let S=f("button",{class:()=>q("tab",P()===Z?"tab-active":""),onclick:(M)=>{if(M.preventDefault(),!Y(K.disabled)){if(K.onclick)K.onclick();P(Z)}}},B),D=K.tip?f("div",{class:"tooltip","data-tip":K.tip},S):S;G.push(D);let F,I=Y(K.content);if(typeof I==="function")F=I();else if(I instanceof Node)F=I;else F=document.createTextNode(String(I));let r=f("div",{class:"tab-content-inner"},F),i=f("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>P()===Z?"display: block":"display: none"},r);G.push(i)}return G})};var pf={};U(pf,{Timeline:()=>d_});var d_=(_)=>{let{class:W,items:E=[],vertical:L=!0,compact:J=!1,...Q}=_,P={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return f("ul",{...Q,class:()=>q(`timeline ${Y(L)?"timeline-vertical":"timeline-horizontal"} ${Y(J)?"timeline-compact":""}`,W)},()=>{let A=(typeof E==="function"?E():E)||[];return A.map((X,G)=>{let Z=G===0,K=G===A.length-1,R=X.type||"success",z=()=>Y(X.completed),B=()=>G>0&&Y(A[G-1].completed),S=(D)=>typeof D==="function"?D():D;return f("li",{class:"flex-1"},[!Z?f("hr",{class:()=>B()?"bg-primary":""}):null,f("div",{class:"timeline-start"},[()=>S(X.title)]),f("div",{class:"timeline-middle"},[()=>X.icon?h(X.icon):h(P[R]||P.success)]),f("div",{class:"timeline-end timeline-box shadow-sm"},[()=>S(X.detail)]),!K?f("hr",{class:()=>z()?"bg-primary":""}):null])})})};var gf={};U(gf,{Toast:()=>p_});var p_=(_,W="alert-success",E=3500)=>{let L=document.getElementById("sigpro-toast-container");if(!L)L=f("div",{id:"sigpro-toast-container",class:"fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none"}),document.body.appendChild(L);let J=f("div",{style:"display: contents"});L.appendChild(J);let Q,P=()=>{clearTimeout(Q);let G=J.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(X.destroy(),J.remove(),!L.hasChildNodes())L.remove()},300);else X.destroy(),J.remove()},X=Kf(()=>{let G=h("icon-[lucide--x]"),Z=f("div",{class:`alert alert-soft ${W} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[f("span",{},[typeof _==="function"?_():_]),ff({class:"btn-xs btn-circle btn-ghost",onclick:P},G)]);return requestAnimationFrame(()=>Z.classList.remove("translate-x-10","opacity-0")),Z},J);if(E>0)Q=setTimeout(P,E);return P};var cf={};U(cf,{Tooltip:()=>g_});var g_=(_,W)=>f("div",{..._,class:()=>q("tooltip w-full",_.class),"data-tip":_.tip},W);var c_={...Zf,...Bf,...qf,...zf,...Cf,...Rf,...Sf,...Nf,...Uf,...hf,...Vf,...Df,...Of,...Hf,...Yf,...kf,...Ff,...yf,...wf,...Mf,...jf,...If,...xf,...vf,...Tf,...uf,...bf,...mf,...df,...pf,...gf,...cf},n_={Locale:ef,tt:f_};if(typeof window<"u")Object.entries({...c_,...n_}).forEach(([_,W])=>{Object.defineProperty(window,_,{value:W,writable:!1,configurable:!0,enumerable:!0})}),console.log("SigProUI installed");export{n_ as Utils,c_ as Components}; diff --git a/dist/sigpro-ui.js b/dist/sigpro-ui.js index 492b668..688b0a0 100644 --- a/dist/sigpro-ui.js +++ b/dist/sigpro-ui.js @@ -3,639 +3,45 @@ var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __hasOwnProp = Object.prototype.hasOwnProperty; - var __moduleCache = /* @__PURE__ */ new WeakMap; + function __accessProp(key) { + return this[key]; + } var __toCommonJS = (from) => { - var entry = __moduleCache.get(from), desc; + var entry = (__moduleCache ??= new WeakMap).get(from), desc; if (entry) return entry; entry = __defProp({}, "__esModule", { value: true }); - if (from && typeof from === "object" || typeof from === "function") - __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, { - get: () => from[key], - enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable - })); + if (from && typeof from === "object" || typeof from === "function") { + for (var key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(entry, key)) + __defProp(entry, key, { + get: __accessProp.bind(from, key), + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } __moduleCache.set(from, entry); return entry; }; + var __moduleCache; + var __returnValue = (v) => v; + function __exportSetter(name, newValue) { + this[name] = __returnValue.bind(null, newValue); + } var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true, configurable: true, - set: (newValue) => all[name] = () => newValue + set: __exportSetter.bind(all, name) }); }; // index.js var exports_sigpro_ui = {}; __export(exports_sigpro_ui, { - val: () => val, - ui: () => ui, - tt: () => tt, - getIcon: () => getIcon, - Watch: () => Watch2, - Tooltip: () => Tooltip, - Toast: () => Toast, - Timeline: () => Timeline, - Tag: () => Tag2, - Tabs: () => Tabs, - Table: () => Table, - Swap: () => Swap, - Stat: () => Stat, - Stack: () => Stack, - Select: () => Select, - Router: () => Router, - Rating: () => Rating, - Range: () => Range, - Radio: () => Radio, - Navbar: () => Navbar, - Mount: () => Mount2, - Modal: () => Modal, - Menu: () => Menu, - List: () => List, - Label: () => Label, - Input: () => Input, - Indicator: () => Indicator, - If: () => If2, - For: () => For2, - Fileinput: () => Fileinput, - Fieldset: () => Fieldset, - Fab: () => Fab, - Dropdown: () => Dropdown, - Drawer: () => Drawer, - Datepicker: () => Datepicker, - Colorpicker: () => Colorpicker, - Checkbox: () => Checkbox, - Button: () => Button, - Badge: () => Badge, - Autocomplete: () => Autocomplete, - Alert: () => Alert, - Accordion: () => Accordion, - $: () => $2 - }); - - // src/sigpro.js - var isFunc = (f) => typeof f === "function"; - var isObj = (o) => o && typeof o === "object"; - var isArr = Array.isArray; - var doc = typeof document !== "undefined" ? document : null; - var ensureNode = (n) => n?._isRuntime ? n.container : n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n)); - var activeEffect = null; - var activeOwner = null; - var isFlushing = false; - var batchDepth = 0; - var effectQueue = new Set; - var proxyCache = new WeakMap; - var ITER = Symbol("iter"); - var MOUNTED_NODES = new WeakMap; - var dispose = (eff) => { - if (!eff || eff._disposed) - return; - eff._disposed = true; - const stack = [eff]; - while (stack.length) { - const e = stack.pop(); - if (e._cleanups) { - e._cleanups.forEach((fn) => fn()); - e._cleanups.clear(); - } - if (e._children) { - e._children.forEach((child) => stack.push(child)); - e._children.clear(); - } - if (e._deps) { - e._deps.forEach((depSet) => depSet.delete(e)); - e._deps.clear(); - } - } - }; - var onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); - }; - var onUnmount = (fn) => { - if (activeOwner) - (activeOwner._cleanups ||= new Set).add(fn); - }; - var untrack = (fn) => { - const p = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = p; - } - }; - var createEffect = (fn, isComputed = false) => { - const effect = () => { - if (effect._disposed) - return; - if (effect._deps) - effect._deps.forEach((s) => s.delete(effect)); - if (effect._cleanups) { - effect._cleanups.forEach((c) => c()); - effect._cleanups.clear(); - } - const prevEffect = activeEffect; - const prevOwner = activeOwner; - activeEffect = activeOwner = effect; - try { - return effect._result = fn(); - } catch (e) { - console.error("[SigPro]", e); - } finally { - activeEffect = prevEffect; - activeOwner = prevOwner; - } - }; - effect._deps = effect._cleanups = effect._children = null; - effect._disposed = false; - effect._isComputed = isComputed; - effect._depth = activeEffect ? activeEffect._depth + 1 : 0; - effect._mounts = []; - effect._parent = activeOwner; - if (activeOwner) - (activeOwner._children ||= new Set).add(effect); - return effect; - }; - var flush = () => { - if (isFlushing) - return; - isFlushing = true; - const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); - effectQueue.clear(); - for (const e of sorted) - if (!e._disposed) - e(); - isFlushing = false; - }; - var Batch = (fn) => { - batchDepth++; - try { - return fn(); - } finally { - batchDepth--; - if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) { - flush(); - } - } - }; - var trackUpdate = (subs, trigger = false) => { - if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect); - (activeEffect._deps ||= new Set).add(subs); - } else if (trigger) { - let hasQueue = false; - subs.forEach((e) => { - if (e === activeEffect || e._disposed) - return; - if (e._isComputed) { - e._dirty = true; - if (e._subs) - trackUpdate(e._subs, true); - } else { - effectQueue.add(e); - hasQueue = true; - } - }); - if (hasQueue && !isFlushing && batchDepth === 0) - queueMicrotask(flush); - } - }; - var $2 = (val, key = null) => { - const subs = new Set; - if (isFunc(val)) { - let cache, dirty = true; - const computed = () => { - if (dirty) { - const prev = activeEffect; - activeEffect = computed; - try { - const next = val(); - if (!Object.is(cache, next)) { - cache = next; - dirty = false; - trackUpdate(subs, true); - } - } finally { - activeEffect = prev; - } - } - trackUpdate(subs); - return cache; - }; - computed._isComputed = true; - computed._subs = subs; - computed._dirty = true; - computed._deps = null; - computed._disposed = false; - computed.markDirty = () => { - dirty = true; - }; - computed.stop = () => { - computed._disposed = true; - if (computed._deps) { - computed._deps.forEach((depSet) => depSet.delete(computed)); - computed._deps.clear(); - } - subs.clear(); - }; - if (activeOwner) - onUnmount(computed.stop); - return computed; - } - if (key) - try { - val = JSON.parse(localStorage.getItem(key)) ?? val; - } catch (e) {} - return (...args) => { - if (args.length) { - const next = isFunc(args[0]) ? args[0](val) : args[0]; - if (!Object.is(val, next)) { - val = next; - if (key) - localStorage.setItem(key, JSON.stringify(val)); - trackUpdate(subs, true); - } - } - trackUpdate(subs); - return val; - }; - }; - var $$ = (target) => { - if (!isObj(target)) - return target; - if (proxyCache.has(target)) - return proxyCache.get(target); - const subsMap = new Map; - const getSubs = (k) => { - let s = subsMap.get(k); - if (!s) - subsMap.set(k, s = new Set); - return s; - }; - const proxy = new Proxy(target, { - get(t, k) { - trackUpdate(getSubs(k)); - return $$(t[k]); - }, - set(t, k, v) { - const isNew = !(k in t); - if (!Object.is(t[k], v)) { - t[k] = v; - trackUpdate(getSubs(k), true); - if (isNew) - trackUpdate(getSubs(ITER), true); - } - return true; - }, - deleteProperty(t, k) { - const res = Reflect.deleteProperty(t, k); - if (res) { - trackUpdate(getSubs(k), true); - trackUpdate(getSubs(ITER), true); - } - return res; - }, - ownKeys(t) { - trackUpdate(getSubs(ITER)); - return Reflect.ownKeys(t); - } - }); - proxyCache.set(target, proxy); - return proxy; - }; - var Watch2 = (sources, cb) => { - if (cb === undefined) { - const effect2 = createEffect(sources); - effect2(); - return () => dispose(effect2); - } - const effect = createEffect(() => { - const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); - untrack(() => cb(vals)); - }); - effect(); - return () => dispose(effect); - }; - var cleanupNode = (node) => { - if (node._cleanups) { - node._cleanups.forEach((fn) => fn()); - node._cleanups.clear(); - } - if (node._ownerEffect) - dispose(node._ownerEffect); - if (node.childNodes) - node.childNodes.forEach(cleanupNode); - }; - var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; - var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); - var validateAttr = (key, val) => { - if (val == null || val === false) - return null; - if (isDangerousAttr(key)) { - const sVal = String(val); - if (DANGEROUS_PROTOCOL.test(sVal)) { - console.warn(`[SigPro] Bloqueado protocolo peligroso en ${key}`); - return "#"; - } - } - return val; - }; - var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || !isObj(props)) { - children = props; - props = {}; - } - if (isFunc(tag)) { - const ctx = { _mounts: [], _cleanups: new Set }; - const effect = createEffect(() => { - const result2 = tag(props, { - children, - emit: (ev, ...args) => props[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...args) - }); - effect._result = result2; - return result2; - }); - effect(); - const result = effect._result; - if (result == null) - return null; - const node = result instanceof Node || isArr(result) && result.every((n) => n instanceof Node) ? result : doc.createTextNode(String(result)); - const attach = (n) => { - if (isObj(n) && !n._isRuntime) { - n._mounts = effect._mounts || []; - n._cleanups = effect._cleanups || new Set; - n._ownerEffect = effect; - } - }; - isArr(node) ? node.forEach(attach) : attach(node); - return node; - } - const isSVG = /^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; - let v = props[k]; - if (k === "ref") { - isFunc(v) ? v(el) : v.current = el; - continue; - } - if (k.startsWith("on")) { - const ev = k.slice(2).toLowerCase(); - el.addEventListener(ev, v); - const off = () => el.removeEventListener(ev, v); - el._cleanups.add(off); - onUnmount(off); - } else if (isFunc(v)) { - const effect = createEffect(() => { - const val = validateAttr(k, v()); - if (k === "class") - el.className = val || ""; - else if (val == null) - el.removeAttribute(k); - else if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) { - const evType = k === "checked" ? "change" : "input"; - el.addEventListener(evType, (ev) => v(ev.target[k])); - } - } else { - const val = validateAttr(k, v); - if (val != null) { - if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - } - } - } - const append = (c) => { - if (isArr(c)) - return c.forEach(append); - if (isFunc(c)) { - const anchor = doc.createTextNode(""); - el.appendChild(anchor); - let currentNodes = []; - const effect = createEffect(() => { - const res = c(); - const next = (isArr(res) ? res : [res]).map(ensureNode); - currentNodes.forEach((n) => { - if (n._isRuntime) - n.destroy(); - else - cleanupNode(n); - if (n.parentNode) - n.remove(); - }); - let ref = anchor; - for (let i = next.length - 1;i >= 0; i--) { - const node = next[i]; - if (node.parentNode !== ref.parentNode) - ref.parentNode?.insertBefore(node, ref); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - ref = node; - } - currentNodes = next; - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - } else { - const node = ensureNode(c); - el.appendChild(node); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - } - }; - append(children); - return el; - }; - var Render = (renderFn) => { - const cleanups = new Set; - const mounts = []; - const previousOwner = activeOwner; - const previousEffect = activeEffect; - const container = doc.createElement("div"); - container.style.display = "contents"; - container.setAttribute("role", "presentation"); - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - activeEffect = null; - const processResult = (result) => { - if (!result) - return; - if (result._isRuntime) { - cleanups.add(result.destroy); - container.appendChild(result.container); - } else if (isArr(result)) { - result.forEach(processResult); - } else { - container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); - } - }; - try { - processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); - } finally { - activeOwner = previousOwner; - activeEffect = previousEffect; - } - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(container); - container.remove(); - } - }; - }; - var If2 = (cond, ifYes, ifNot = null) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let currentView = null; - Watch2(() => !!(isFunc(cond) ? cond() : cond), (show) => { - if (currentView) { - currentView.destroy(); - currentView = null; - } - const content = show ? ifYes : ifNot; - if (content) { - currentView = Render(() => isFunc(content) ? content() : content); - root.insertBefore(currentView.container, anchor); - } - }); - onUnmount(() => currentView?.destroy()); - return root; - }; - var For2 = (src, itemFn, keyFn) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let cache = new Map; - Watch2(() => (isFunc(src) ? src() : src) || [], (items) => { - const nextCache = new Map; - const nextOrder = []; - const newItems = items || []; - for (let i = 0;i < newItems.length; i++) { - const item = newItems[i]; - const key = keyFn ? keyFn(item, i) : item?.id ?? i; - let view = cache.get(key); - if (!view) - view = Render(() => itemFn(item, i)); - else - cache.delete(key); - nextCache.set(key, view); - nextOrder.push(view); - } - cache.forEach((view) => view.destroy()); - let lastRef = anchor; - for (let i = nextOrder.length - 1;i >= 0; i--) { - const view = nextOrder[i]; - const node = view.container; - if (node.nextSibling !== lastRef) - root.insertBefore(node, lastRef); - lastRef = node; - } - cache = nextCache; - }); - return root; - }; - var Router = (routes) => { - const getHash = () => window.location.hash.slice(1) || "/"; - const path = $2(getHash()); - const handler = () => path(getHash()); - window.addEventListener("hashchange", handler); - onUnmount(() => window.removeEventListener("hashchange", handler)); - const hook = Tag2("div", { class: "router-hook" }); - let currentView = null; - Watch2([path], () => { - const cur = path(); - const route = routes.find((r) => { - const p1 = r.path.split("/").filter(Boolean); - const p2 = cur.split("/").filter(Boolean); - return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]); - }) || routes.find((r) => r.path === "*"); - if (route) { - currentView?.destroy(); - const params = {}; - route.path.split("/").filter(Boolean).forEach((p, i) => { - if (p[0] === ":") - params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; - }); - Router.params(params); - currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); - hook.replaceChildren(currentView.container); - } - }); - return hook; - }; - Router.params = $2({}); - Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); - Router.back = () => window.history.back(); - Router.path = () => window.location.hash.replace(/^#/, "") || "/"; - var Mount2 = (comp, target) => { - const t = typeof target === "string" ? doc.querySelector(target) : target; - if (!t) - return; - if (MOUNTED_NODES.has(t)) - MOUNTED_NODES.get(t).destroy(); - const inst = Render(isFunc(comp) ? comp : () => comp); - t.replaceChildren(inst.container); - MOUNTED_NODES.set(t, inst); - return inst; - }; - var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); - if (typeof window !== "undefined") { - Object.assign(window, SigPro); - "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((t) => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)); - } - - // src/components/index.js - var exports_components = {}; - __export(exports_components, { - default: () => components_default, - Tooltip: () => Tooltip, - Toast: () => Toast, - Timeline: () => Timeline, - Tabs: () => Tabs, - Table: () => Table, - Swap: () => Swap, - Stat: () => Stat, - Stack: () => Stack, - Select: () => Select, - Rating: () => Rating, - Range: () => Range, - Radio: () => Radio, - Navbar: () => Navbar, - Modal: () => Modal, - Menu: () => Menu, - List: () => List, - Label: () => Label, - Input: () => Input, - Indicator: () => Indicator, - Fileinput: () => Fileinput, - Fieldset: () => Fieldset, - Fab: () => Fab, - Dropdown: () => Dropdown, - Drawer: () => Drawer, - Datepicker: () => Datepicker, - Colorpicker: () => Colorpicker, - Checkbox: () => Checkbox, - Button: () => Button, - Badge: () => Badge, - Autocomplete: () => Autocomplete, - Alert: () => Alert, - Accordion: () => Accordion + Utils: () => Utils, + Components: () => Components }); // src/components/Accordion.js @@ -644,23 +50,434 @@ Accordion: () => Accordion }); + // node_modules/sigpro/dist/sigpro.esm.min.js + var m = (e) => typeof e === "function"; + var j = (e) => e && typeof e === "object"; + var N = Array.isArray; + var E = typeof document < "u" ? document : null; + var $2 = (e) => e?._isRuntime ? e.container : e instanceof Node ? e : E.createTextNode(e == null ? "" : String(e)); + var p = null; + var _ = null; + var C = false; + var A = 0; + var T = new Set; + var U = new WeakMap; + var L = Symbol("iter"); + var M = new WeakMap; + var v = (e) => { + if (!e || e._disposed) + return; + e._disposed = true; + let s = [e]; + while (s.length) { + let t = s.pop(); + if (t._cleanups) + t._cleanups.forEach((r) => r()), t._cleanups.clear(); + if (t._children) + t._children.forEach((r) => s.push(r)), t._children.clear(); + if (t._deps) + t._deps.forEach((r) => r.delete(t)), t._deps.clear(); + } + }; + var k = (e) => { + if (_) + (_._mounts ||= []).push(e); + }; + var g = (e) => { + if (_) + (_._cleanups ||= new Set).add(e); + }; + var q = (e) => { + let s = p; + p = null; + try { + return e(); + } finally { + p = s; + } + }; + var O = (e, s = false) => { + let t = () => { + if (t._disposed) + return; + if (t._deps) + t._deps.forEach((c) => c.delete(t)); + if (t._cleanups) + t._cleanups.forEach((c) => c()), t._cleanups.clear(); + let r = p, n = _; + p = _ = t; + try { + return t._result = e(); + } catch (c) { + console.error("[SigPro]", c); + } finally { + p = r, _ = n; + } + }; + if (t._deps = t._cleanups = t._children = null, t._disposed = false, t._isComputed = s, t._depth = p ? p._depth + 1 : 0, t._mounts = [], t._parent = _, _) + (_._children ||= new Set).add(t); + return t; + }; + var W = () => { + if (C) + return; + C = true; + let e = Array.from(T).sort((s, t) => s._depth - t._depth); + T.clear(); + for (let s of e) + if (!s._disposed) + s(); + C = false; + }; + var z = (e) => { + A++; + try { + return e(); + } finally { + if (A--, A === 0 && T.size > 0 && !C) + W(); + } + }; + var w = (e, s = false) => { + if (!s && p && !p._disposed) + e.add(p), (p._deps ||= new Set).add(e); + else if (s && e.size > 0) { + let t = false; + for (let r of e) { + if (r === p || r._disposed) + continue; + if (r._isComputed) { + if (r._dirty = true, r._subs) + w(r._subs, true); + } else + T.add(r), t = true; + } + if (t && !C && A === 0) + queueMicrotask(W); + } + }; + var B = (e, s = null) => { + let t = new Set; + if (m(e)) { + let r, n = () => { + if (n._dirty) { + let c = p; + p = n; + try { + let i = e(); + if (!Object.is(r, i)) + r = i, w(t, true); + } finally { + p = c; + } + n._dirty = false; + } + return w(t), r; + }; + if (n._isComputed = true, n._subs = t, n._dirty = true, n._deps = null, n._disposed = false, n.stop = () => {}, _) + g(n.stop); + return n; + } + if (s) + try { + e = JSON.parse(localStorage.getItem(s)) ?? e; + } catch (r) {} + return (...r) => { + if (r.length) { + let n = m(r[0]) ? r[0](e) : r[0]; + if (!Object.is(e, n)) { + if (e = n, s) + localStorage.setItem(s, JSON.stringify(e)); + w(t, true); + } + } + return w(t), e; + }; + }; + var D = (e) => { + if (!j(e)) + return e; + let s = U.get(e); + if (s) + return s; + let t = new Map, r = (n) => { + let c = t.get(n); + if (!c) + t.set(n, c = new Set); + return c; + }; + return s = new Proxy(e, { get(n, c, i) { + if (typeof c !== "symbol") + w(r(c)); + return D(Reflect.get(n, c, i)); + }, set(n, c, i, o) { + let l = !Reflect.has(n, c), a = Reflect.get(n, c, o), d = Reflect.set(n, c, i, o); + if (d && !Object.is(a, i)) { + if (w(r(c), true), l) + w(r(L), true); + } + return d; + }, deleteProperty(n, c) { + let i = Reflect.deleteProperty(n, c); + if (i) + w(r(c), true), w(r(L), true); + return i; + }, ownKeys(n) { + return w(r(L)), Reflect.ownKeys(n); + } }), U.set(e, s), s; + }; + var R = (e, s) => { + if (s === undefined) { + let r = O(e); + return r(), () => v(r); + } + let t = O(() => { + let r = Array.isArray(e) ? e.map((n) => n()) : e(); + q(() => s(r)); + }); + return t(), () => v(t); + }; + var P = (e) => { + if (e._cleanups) + e._cleanups.forEach((s) => s()), e._cleanups.clear(); + if (e._ownerEffect) + v(e._ownerEffect); + if (e.childNodes) + e.childNodes.forEach(P); + }; + var F = /^\s*(javascript|data|vbscript):/i; + var G = (e) => e === "src" || e === "href" || e.startsWith("on"); + var I = (e, s) => { + if (s == null || s === false) + return null; + if (G(e)) { + let t = String(s); + if (F.test(t)) + return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${e}`), "#"; + } + return s; + }; + var S = (e, s = {}, t = []) => { + if (s instanceof Node || N(s) || !j(s)) + t = s, s = {}; + if (m(e)) { + let i = { _mounts: [], _cleanups: new Set }, o = O(() => { + let f = e(s, { children: t, emit: (h, ...u) => s[`on${h[0].toUpperCase()}${h.slice(1)}`]?.(...u) }); + return o._result = f, f; + }); + o(); + let l = o._result; + if (l == null) + return null; + let a = l instanceof Node || N(l) && l.every((f) => f instanceof Node) ? l : E.createTextNode(String(l)), d = (f) => { + if (j(f) && !f._isRuntime) + f._mounts = o._mounts || [], f._cleanups = o._cleanups || new Set, f._ownerEffect = o; + }; + return N(a) ? a.forEach(d) : d(a), a; + } + let r = /^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(e), n = r ? E.createElementNS("http://www.w3.org/2000/svg", e) : E.createElement(e); + n._cleanups = new Set; + for (let i in s) { + if (!s.hasOwnProperty(i)) + continue; + let o = s[i]; + if (i === "ref") { + m(o) ? o(n) : o.current = n; + continue; + } + if (r && i.startsWith("xlink:")) { + val == null ? n.removeAttributeNS("http://www.w3.org/1999/xlink", i.slice(6)) : n.setAttributeNS("http://www.w3.org/1999/xlink", i.slice(6), val); + continue; + } + if (i.startsWith("on")) { + let l = i.slice(2).toLowerCase(); + n.addEventListener(l, o); + let a = () => n.removeEventListener(l, o); + n._cleanups.add(a), g(a); + } else if (m(o)) { + let l = O(() => { + let a = I(i, o()); + if (i === "class") + n.className = a || ""; + else if (a == null) + n.removeAttribute(i); + else if (i in n && !r) + n[i] = a; + else + n.setAttribute(i, a === true ? "" : a); + }); + if (l(), n._cleanups.add(() => v(l)), g(() => v(l)), /^(INPUT|TEXTAREA|SELECT)$/.test(n.tagName) && (i === "value" || i === "checked")) { + let a = i === "checked" ? "change" : "input"; + n.addEventListener(a, (d) => o(d.target[i])); + } + } else { + let l = I(i, o); + if (l != null) + if (i in n && !r) + n[i] = l; + else + n.setAttribute(i, l === true ? "" : l); + } + } + let c = (i) => { + if (N(i)) + return i.forEach(c); + if (m(i)) { + let o = E.createTextNode(""); + n.appendChild(o); + let l = [], a = O(() => { + let d = i(), f = (N(d) ? d : [d]).map($2); + l.forEach((u) => { + if (u._isRuntime) + u.destroy(); + else + P(u); + if (u.parentNode) + u.remove(); + }); + let h = o; + for (let u = f.length - 1;u >= 0; u--) { + let y = f[u]; + if (y.parentNode !== h.parentNode) + h.parentNode?.insertBefore(y, h); + if (y._mounts) + y._mounts.forEach((V) => V()); + h = y; + } + l = f; + }); + a(), n._cleanups.add(() => v(a)), g(() => v(a)); + } else { + let o = $2(i); + if (n.appendChild(o), o._mounts) + o._mounts.forEach((l) => l()); + } + }; + return c(t), n; + }; + var b = (e) => { + let s = new Set, t = [], r = _, n = p, c = E.createElement("div"); + c.style.display = "contents", c.setAttribute("role", "presentation"), _ = { _cleanups: s, _mounts: t }, p = null; + let i = (o) => { + if (!o) + return; + if (o._isRuntime) + s.add(o.destroy), c.appendChild(o.container); + else if (N(o)) + o.forEach(i); + else + c.appendChild(o instanceof Node ? o : E.createTextNode(String(o == null ? "" : o))); + }; + try { + i(e({ onCleanup: (o) => s.add(o) })); + } finally { + _ = r, p = n; + } + return t.forEach((o) => o()), { _isRuntime: true, container: c, destroy: () => { + s.forEach((o) => o()), P(c), c.remove(); + } }; + }; + var J = (e, s, t = null) => { + let r = E.createTextNode(""), n = S("div", { style: "display:contents" }, [r]), c = null; + return R(() => !!(m(e) ? e() : e), (i) => { + if (c) + c.destroy(), c = null; + let o = i ? s : t; + if (o) + c = b(() => m(o) ? o() : o), n.insertBefore(c.container, r); + }), g(() => c?.destroy()), n; + }; + var K = (e, s, t) => { + let r = E.createTextNode(""), n = S("div", { style: "display:contents" }, [r]), c = new Map; + return R(() => (m(e) ? e() : e) || [], (i) => { + let o = new Map, l = [], a = i || []; + for (let f = 0;f < a.length; f++) { + let h = a[f], u = t ? t(h, f) : h?.id ?? f, y = c.get(u); + if (!y) + y = b(() => s(h, f)); + else + c.delete(u); + o.set(u, y), l.push(y); + } + c.forEach((f) => f.destroy()); + let d = r; + for (let f = l.length - 1;f >= 0; f--) { + let u = l[f].container; + if (u.nextSibling !== d) + n.insertBefore(u, d); + d = u; + } + c = o; + }), n; + }; + var x = (e) => { + let s = () => window.location.hash.slice(1) || "/", t = B(s()), r = () => t(s()); + window.addEventListener("hashchange", r), g(() => window.removeEventListener("hashchange", r)); + let n = S("div", { class: "router-hook" }), c = null; + return R([t], () => { + let i = t(), o = e.find((l) => { + let a = l.path.split("/").filter(Boolean), d = i.split("/").filter(Boolean); + return a.length === d.length && a.every((f, h) => f[0] === ":" || f === d[h]); + }) || e.find((l) => l.path === "*"); + if (o) { + c?.destroy(); + let l = {}; + o.path.split("/").filter(Boolean).forEach((a, d) => { + if (a[0] === ":") + l[a.slice(1)] = i.split("/").filter(Boolean)[d]; + }), x.params(l), c = b(() => m(o.component) ? o.component(l) : o.component), n.replaceChildren(c.container); + } + }), n; + }; + x.params = B({}); + x.to = (e) => window.location.hash = e.replace(/^#?\/?/, "#/"); + x.back = () => window.history.back(); + x.path = () => window.location.hash.replace(/^#/, "") || "/"; + var Q = (e, s, { enter: t, leave: r } = {}) => { + let n = S("div", { style: "display:contents" }), c = null, i = (o, l) => { + let a = false, d = () => !a && (a = true, l()); + if (!o) + return d(); + "transitionend animationend".split(" ").map((f) => o.addEventListener(f, d, { once: true })), setTimeout(d, 500); + }; + return R(e, (o) => { + if (o && !c) { + let l = (c = b(s)).container.firstChild; + if (n.appendChild(c.container), t && l) + l.classList.add(t), l.clientTop, l.classList.add(t + "-active"), i(l, () => l.classList.remove(t, t + "-active")); + } else if (!o && c) { + let l = c.container.firstChild, a = () => (c?.destroy(), c = null); + r && l ? (l.classList.add(r), i(l, a)) : a(); + } + }), g(() => c?.destroy()), n; + }; + var H = (e, s) => { + let t = typeof s === "string" ? E.querySelector(s) : s; + if (!t) + return; + if (M.has(t)) + M.get(t).destroy(); + let r = b(m(e) ? e : () => e); + return t.replaceChildren(r.container), M.set(t, r), r; + }; + var X = Object.freeze({ $: B, $$: D, Watch: R, Tag: S, Render: b, If: J, For: K, Router: x, Mount: H, onMount: k, onUnmount: g, Anim: Q, Batch: z }); + if (typeof window < "u") + Object.assign(window, X), "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((e) => { + let s = e[0].toUpperCase() + e.slice(1); + window[s] = (t, r) => S(e, t, r); + }); + // src/core/utils.js - var exports_utils = {}; - __export(exports_utils, { - val: () => val, - ui: () => ui, - getIcon: () => getIcon - }); - var val = (t) => typeof t === "function" ? t() : t; + var val2 = (t) => typeof t === "function" ? t() : t; var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); var getIcon = (icon) => { if (!icon) return null; if (typeof icon === "function") { - return Tag("span", { class: "mr-1" }, icon()); + return S("span", { class: "mr-1" }, icon()); } if (typeof icon === "object") { - return Tag("span", { class: "mr-1" }, icon); + return S("span", { class: "mr-1" }, icon); } if (typeof icon === "string") { const parts = icon.trim().split(/\s+/); @@ -668,27 +485,48 @@ const iconClass = hasRight ? parts.slice(0, -1).join(" ") : icon; const spacing = hasRight ? "ml-1" : "mr-1"; if (iconClass && !iconClass.startsWith("icon-[") && !iconClass.includes("--")) { - return Tag("span", { class: spacing }, iconClass); + return S("span", { class: spacing }, iconClass); } - return Tag("span", { class: `${iconClass} ${spacing}`.trim() }); + return S("span", { class: `${iconClass} ${spacing}`.trim() }); } return null; }; + var i18n = { + es: { + close: "Cerrar", + confirm: "Confirmar", + cancel: "Cancelar", + search: "Buscar...", + loading: "Cargando...", + nodata: "Sin datos" + }, + en: { + close: "Close", + confirm: "Confirm", + cancel: "Cancel", + search: "Search...", + loading: "Loading...", + nodata: "No data" + } + }; + var currentLocale = B("es"); + var Locale = (t) => currentLocale(t); + var tt = (t) => () => i18n[currentLocale()][t] || t; // src/components/Accordion.js var Accordion = (props, children) => { const { class: className, title, name, open, ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: ui("collapse collapse-arrow bg-base-200 mb-2", className) }, [ - Tag("input", { + S("input", { type: name ? "radio" : "checkbox", name, - checked: val(open) + checked: val2(open) }), - Tag("div", { class: "collapse-title text-xl font-medium" }, title), - Tag("div", { class: "collapse-content" }, children) + S("div", { class: "collapse-title text-xl font-medium" }, title), + S("div", { class: "collapse-content" }, children) ]); }; @@ -709,16 +547,16 @@ const softClass = soft ? "alert-soft" : ""; const allClasses = [typeClass, softClass, className].filter(Boolean).join(" "); const content = children || props.message; - return Tag("div", { + return S("div", { ...rest, role: "alert", class: ui("alert", allClasses) }, () => [ getIcon(iconMap[type]), - Tag("div", { class: "flex-1" }, [ - Tag("span", {}, [typeof content === "function" ? content() : content]) + S("div", { class: "flex-1" }, [ + S("span", {}, [typeof content === "function" ? content() : content]) ]), - actions ? Tag("div", { class: "flex-none" }, [ + actions ? S("div", { class: "flex-none" }, [ typeof actions === "function" ? actions() : actions ]) : null ].filter(Boolean)); @@ -730,28 +568,6 @@ Autocomplete: () => Autocomplete }); - // src/core/i18n.js - var i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } - }; - var currentLocale = $("es"); - var tt = (t) => () => i18n[currentLocale()][t] || t; - // src/components/Input.js var exports_Input = {}; __export(exports_Input, { @@ -813,22 +629,22 @@ classes += " input-error"; return classes.trim(); }; - const inputElement = Tag("input", { + const inputElement = S("input", { ...rest, type: () => isPassword ? visible() ? "text" : "password" : type, placeholder: placeholder || (label ? " " : placeholder), class: inputClasses, value, oninput: handleInput, - disabled: () => val(disabled), + disabled: () => val2(disabled), "aria-invalid": () => hasError() ? "true" : "false" }); const inputContent = () => [ inputElement, - leftIcon ? Tag("div", { + leftIcon ? S("div", { class: "absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60" }, leftIcon) : null, - isPassword ? Tag("button", { + isPassword ? S("button", { type: "button", class: ui("absolute right-3 inset-y-0 flex items-center", "btn btn-ghost btn-circle opacity-50 hover:opacity-100", buttonSize()), onclick: (e) => { @@ -836,30 +652,30 @@ visible(!visible()); } }, () => getPasswordIcon()) : null, - Tag("div", { + S("div", { class: "text-error text-xs mt-1 px-3 absolute -bottom-5 left-0" }, () => hasError() ? errorMsg() : null) ]; if (label) { - return Tag("label", { class: ui("floating-label w-full", className) }, () => [ - Tag("div", { class: "relative w-full" }, inputContent), - Tag("span", {}, val(label)) + return S("label", { class: ui("floating-label w-full", className) }, () => [ + S("div", { class: "relative w-full" }, inputContent), + S("span", {}, val2(label)) ]); } - return Tag("div", { class: "relative w-full" }, inputContent); + return S("div", { class: "relative w-full" }, inputContent); }; // src/components/Autocomplete.js var Autocomplete = (props) => { const { class: className, items = [], value, onselect, label, placeholder, ...rest } = props; - const query = $(val(value) || ""); - const isOpen = $(false); - const cursor = $(-1); - const list = $([]); + const query = B(val2(value) || ""); + const isOpen = B(false); + const cursor = B(-1); + const list = B([]); Watch(() => { - const q = String(query()).toLowerCase(); - const data = val(items) || []; - const filtered = q ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) : data; + const q2 = String(query()).toLowerCase(); + const data = val2(items) || []; + const filtered = q2 ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q2)) : data; list(filtered); }); const pick = (opt) => { @@ -888,37 +704,37 @@ isOpen(false); } }; - return Tag("div", { class: "relative w-full" }, [ + return S("div", { class: "relative w-full" }, [ Input({ label, class: className, - placeholder: placeholder || tt("search")(), + placeholder, value: query, onfocus: () => isOpen(true), onblur: () => setTimeout(() => isOpen(false), 150), onkeydown: nav, oninput: (e) => { - const v = e.target.value; - query(v); + const v2 = e.target.value; + query(v2); if (typeof value === "function") - value(v); + value(v2); isOpen(true); cursor(-1); }, ...rest }), - Tag("ul", { + S("ul", { class: "absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", style: () => isOpen() && list().length ? "display:block" : "display:none" }, [ - For(list, (opt, i) => Tag("li", {}, [ - Tag("a", { + K(list, (opt, i) => S("li", {}, [ + S("a", { class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, onclick: () => pick(opt), onmouseenter: () => cursor(i) }, typeof opt === "string" ? opt : opt.label) ]), (opt, i) => (typeof opt === "string" ? opt : opt.value) + i), - () => list().length ? null : Tag("li", { class: "p-2 text-center opacity-50" }, tt("nodata")()) + () => list().length ? null : S("li", { class: "p-2 text-center opacity-50" }, "nodata") ]) ]); }; @@ -930,7 +746,7 @@ }); var Badge = (props, children) => { const { class: className, ...rest } = props; - return Tag("span", { + return S("span", { ...rest, class: ui("badge", className) }, children); @@ -944,12 +760,12 @@ var Button = (props, children) => { const { class: className, loading, icon, ...rest } = props; const iconEl = getIcon(icon); - return Tag("button", { + return S("button", { ...rest, class: ui("btn", className), - disabled: () => val(loading) || val(props.disabled) + disabled: () => val2(loading) || val2(props.disabled) }, () => [ - val(loading) && Tag("span", { class: "loading loading-spinner" }), + val2(loading) && S("span", { class: "loading loading-spinner" }), iconEl, children ].filter(Boolean)); @@ -962,15 +778,15 @@ }); var Checkbox = (props) => { const { class: className, value, toggle, label, ...rest } = props; - const checkEl = Tag("input", { + const checkEl = S("input", { ...rest, type: "checkbox", - class: () => ui(val(toggle) ? "toggle" : "checkbox", className), + class: () => ui(val2(toggle) ? "toggle" : "checkbox", className), checked: value }); - return Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ + return S("label", { class: "label cursor-pointer justify-start gap-3" }, [ checkEl, - label ? Tag("span", { class: "label-text" }, label) : null + label ? S("span", { class: "label-text" }, label) : null ]); }; @@ -981,7 +797,7 @@ }); var Colorpicker = (props) => { const { class: className, value, label, ...rest } = props; - const isOpen = $(false); + const isOpen = B(false); const palette = [ ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], @@ -992,9 +808,9 @@ ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"] ]; - const getColor = () => val(value) || "#000000"; - return Tag("div", { class: ui("relative w-fit", className) }, [ - Tag("button", { + const getColor = () => val2(value) || "#000000"; + return S("div", { class: ui("relative w-fit", className) }, [ + S("button", { type: "button", class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", onclick: (e) => { @@ -1003,17 +819,17 @@ }, ...rest }, [ - Tag("div", { + S("div", { class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", style: () => `background-color: ${getColor()}` }), - label ? Tag("span", { class: "opacity-80" }, label) : null + label ? S("span", { class: "opacity-80" }, label) : null ]), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", onclick: (e) => e.stopPropagation() }, [ - Tag("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => Tag("button", { + S("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => S("button", { type: "button", style: `background-color: ${c}`, class: () => { @@ -1028,7 +844,7 @@ } }))) ])), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "fixed inset-0 z-[100]", onclick: () => isOpen(false) })) @@ -1042,12 +858,12 @@ }); var Datepicker = (props) => { const { class: className, value, range, label, placeholder, hour = false, ...rest } = props; - const isOpen = $(false); - const internalDate = $(new Date); - const hoverDate = $(null); - const startHour = $(0); - const endHour = $(0); - const isRangeMode = () => val(range) === true; + const isOpen = B(false); + const internalDate = B(new Date); + const hoverDate = B(null); + const startHour = B(0); + const endHour = B(0); + const isRangeMode = () => val2(range) === true; const now = new Date; const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; const formatDate = (d) => { @@ -1058,7 +874,7 @@ }; const selectDate = (date) => { const dateStr = formatDate(date); - const current = val(value); + const current = val2(value); if (isRangeMode()) { if (!current?.start || current.start && current.end) { if (typeof value === "function") { @@ -1087,38 +903,38 @@ isOpen(false); } }; - const displayValue = $(""); + const displayValue = B(""); Watch(() => { - const v = val(value); - if (!v) { + const v2 = val2(value); + if (!v2) { displayValue(""); return; } let text = ""; - if (typeof v === "string") { - text = hour && v.includes("T") ? v.replace("T", " ") : v; - } else if (v.start && v.end) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour !== undefined ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; + if (typeof v2 === "string") { + text = hour && v2.includes("T") ? v2.replace("T", " ") : v2; + } else if (v2.start && v2.end) { + const startStr = hour && v2.startHour !== undefined ? `${v2.start} ${String(v2.startHour).padStart(2, "0")}:00` : v2.start; + const endStr = hour && v2.endHour !== undefined ? `${v2.end} ${String(v2.endHour).padStart(2, "0")}:00` : v2.end; text = `${startStr} - ${endStr}`; - } else if (v.start) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + } else if (v2.start) { + const startStr = hour && v2.startHour !== undefined ? `${v2.start} ${String(v2.startHour).padStart(2, "0")}:00` : v2.start; text = `${startStr}...`; } displayValue(text); }); - const move = (m) => { + const move = (m2) => { const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); + internalDate(new Date(d.getFullYear(), d.getMonth() + m2, 1)); }; const moveYear = (y) => { const d = internalDate(); internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); }; const HourSlider = ({ value: hVal, onChange }) => { - return Tag("div", { class: "flex-1" }, [ - Tag("div", { class: "flex gap-2 items-center" }, [ - Tag("input", { + return S("div", { class: "flex-1" }, [ + S("div", { class: "flex gap-2 items-center" }, [ + S("input", { type: "range", min: 0, max: 23, @@ -1129,11 +945,11 @@ onChange(newHour); } }), - Tag("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val(hVal)).padStart(2, "0") + ":00") + S("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val2(hVal)).padStart(2, "0") + ":00") ]) ]); }; - return Tag("div", { class: ui("relative w-full", className) }, [ + return S("div", { class: ui("relative w-full", className) }, [ Input({ label, placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), @@ -1146,25 +962,25 @@ }, ...rest }), - If(isOpen, () => Tag("div", { + J(isOpen, () => S("div", { class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", onclick: (e) => e.stopPropagation() }, [ - Tag("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, getIcon("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon("icon-[lucide--chevron-left]")) + S("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ + S("div", { class: "flex gap-0.5" }, [ + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, getIcon("icon-[lucide--chevrons-left]")), + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon("icon-[lucide--chevron-left]")) ]), - Tag("span", { class: "font-bold uppercase flex-1 text-center" }, [ + S("span", { class: "font-bold uppercase flex-1 text-center" }, [ () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }) ]), - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, getIcon("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon("icon-[lucide--chevrons-right]")) + S("div", { class: "flex gap-0.5" }, [ + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, getIcon("icon-[lucide--chevron-right]")), + S("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon("icon-[lucide--chevrons-right]")) ]) ]), - Tag("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => Tag("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), + S("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ + ...["L", "M", "X", "J", "V", "S", "D"].map((d) => S("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), () => { const d = internalDate(); const year = d.getFullYear(); @@ -1174,24 +990,24 @@ const daysInMonth = new Date(year, month + 1, 0).getDate(); const nodes = []; for (let i = 0;i < offset; i++) - nodes.push(Tag("div")); + nodes.push(S("div")); for (let i = 1;i <= daysInMonth; i++) { const date = new Date(year, month, i); const dStr = formatDate(date); - nodes.push(Tag("button", { + nodes.push(S("button", { type: "button", class: () => { - const v = val(value); + const v2 = val2(value); const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; + const isStart = typeof v2 === "string" ? v2.split("T")[0] === dStr : v2?.start === dStr; + const isEnd = v2?.end === dStr; let inRange = false; - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { + if (isRangeMode() && v2?.start) { + const start = v2.start; + if (!v2.end && h) { inRange = dStr > start && dStr <= h || dStr < start && dStr >= h; - } else if (v.end) { - inRange = dStr > start && dStr < v.end; + } else if (v2.end) { + inRange = dStr > start && dStr < v2.end; } } const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; @@ -1209,13 +1025,13 @@ return nodes; } ]), - hour ? Tag("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() ? Tag("div", { class: "flex gap-4" }, [ + hour ? S("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ + isRangeMode() ? S("div", { class: "flex gap-4" }, [ HourSlider({ value: startHour, onChange: (newHour) => { startHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal?.start) value({ ...currentVal, startHour: newHour }); } @@ -1224,7 +1040,7 @@ value: endHour, onChange: (newHour) => { endHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal?.end) value({ ...currentVal, endHour: newHour }); } @@ -1233,7 +1049,7 @@ value: startHour, onChange: (newHour) => { startHour(newHour); - const currentVal = val(value); + const currentVal = val2(value); if (currentVal && typeof currentVal === "string") { value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); } @@ -1241,7 +1057,7 @@ }) ]) : null ])), - If(isOpen, () => Tag("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) + J(isOpen, () => S("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) ]); }; @@ -1253,11 +1069,11 @@ var Drawer = (props, children) => { const { class: className, id, open, side, content, ...rest } = props; const drawerId = id || `drawer-${Math.random().toString(36).slice(2, 9)}`; - return Tag("div", { + return S("div", { ...rest, class: ui("drawer", className) }, [ - Tag("input", { + S("input", { id: drawerId, type: "checkbox", class: "drawer-toggle", @@ -1267,11 +1083,11 @@ open(e.target.checked); } }), - Tag("div", { class: "drawer-content" }, [ + S("div", { class: "drawer-content" }, [ typeof content === "function" ? content() : content ]), - Tag("div", { class: "drawer-side" }, [ - Tag("label", { + S("div", { class: "drawer-side" }, [ + S("label", { for: drawerId, class: "drawer-overlay", onclick: () => { @@ -1279,7 +1095,7 @@ open(false); } }), - Tag("div", { class: "min-h-full bg-base-200 w-80" }, [ + S("div", { class: "min-h-full bg-base-200 w-80" }, [ typeof side === "function" ? side() : side ]) ]) @@ -1303,11 +1119,11 @@ } var Dropdown = (props) => { const { class: className, label, icon, items, ...rest } = props; - return Tag("details", { + return S("details", { ...rest, class: ui("dropdown", className) }, [ - Tag("summary", { + S("summary", { class: "btn m-1 flex items-center gap-2 list-none cursor-pointer", style: "display: inline-flex;", onclick: (e) => { @@ -1323,14 +1139,14 @@ () => icon ? typeof icon === "function" ? icon() : icon : null, () => label ? typeof label === "function" ? label() : label : null ]), - Tag("ul", { + S("ul", { tabindex: "-1", class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" }, [ () => { const currentItems = typeof items === "function" ? items() : items || []; - return currentItems.map((item) => Tag("li", {}, [ - Tag("a", { + return currentItems.map((item) => S("li", {}, [ + S("a", { class: item.class || "", onclick: (e) => { if (item.onclick) @@ -1343,8 +1159,8 @@ } } }, [ - item.icon ? Tag("span", {}, item.icon) : null, - Tag("span", {}, item.label) + item.icon ? S("span", {}, item.icon) : null, + S("span", {}, item.label) ]) ])); } @@ -1359,11 +1175,11 @@ }); var Fab = (props) => { const { class: className, icon, label, actions = [], position = "bottom-6 right-6", ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: ui(`fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100]`, className) }, [ - Tag("div", { + S("div", { tabindex: 0, role: "button", class: "btn btn-lg btn-circle btn-primary shadow-2xl" @@ -1371,9 +1187,9 @@ icon ? getIcon(icon) : null, !icon && label ? label : null ]), - ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? Tag("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - Tag("button", { + ...val2(actions).map((act) => S("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ + act.label ? S("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, + S("button", { type: "button", class: `btn btn-circle shadow-lg ${act.class || ""}`, onclick: (e) => { @@ -1392,13 +1208,13 @@ }); var Fieldset = (props, children) => { const { class: className, legend, ...rest } = props; - return Tag("fieldset", { + return S("fieldset", { ...rest, class: ui("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", className) }, [ () => { - const legendText = val(legend); - return legendText ? Tag("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; + const legendText = val2(legend); + return legendText ? S("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; }, children ]); @@ -1411,9 +1227,9 @@ }); var Fileinput = (props) => { const { class: className, tooltip, max = 2, accept = "*", onselect, ...rest } = props; - const selectedFiles = $([]); - const isDragging = $(false); - const error = $(null); + const selectedFiles = B([]); + const isDragging = B(false); + const error = B(null); const MAX_BYTES = max * 1024 * 1024; const handleFiles = (files) => { const fileList = Array.from(files); @@ -1427,16 +1243,16 @@ onselect?.(selectedFiles()); }; const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); + const updated = selectedFiles().filter((_2, i) => i !== index); selectedFiles(updated); onselect?.(updated); }; - return Tag("fieldset", { ...rest, class: ui("fieldset w-full p-0", className) }, [ - Tag("div", { + return S("fieldset", { ...rest, class: ui("fieldset w-full p-0", className) }, [ + S("div", { class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, "data-tip": tooltip }, [ - Tag("label", { + S("label", { class: () => ` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer @@ -1454,12 +1270,12 @@ handleFiles(e.dataTransfer.files); } }, [ - Tag("div", { class: "flex items-center gap-3 w-full" }, [ + S("div", { class: "flex items-center gap-3 w-full" }, [ getIcon("icon-[lucide--upload]"), - Tag("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - Tag("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) + S("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), + S("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) ]), - Tag("input", { + S("input", { type: "file", multiple: true, accept, @@ -1468,15 +1284,15 @@ }) ]) ]), - () => error() ? Tag("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, - If(() => selectedFiles().length > 0, () => Tag("ul", { class: "mt-2 space-y-1" }, [ - For(selectedFiles, (file, index) => Tag("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - Tag("div", { class: "flex items-center gap-2 truncate" }, [ - Tag("span", { class: "opacity-50" }, "\uD83D\uDCC4"), - Tag("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - Tag("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) + () => error() ? S("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, + J(() => selectedFiles().length > 0, () => S("ul", { class: "mt-2 space-y-1" }, [ + K(selectedFiles, (file, index) => S("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ + S("div", { class: "flex items-center gap-2 truncate" }, [ + S("span", { class: "opacity-50" }, "\uD83D\uDCC4"), + S("span", { class: "truncate font-medium max-w-[200px]" }, file.name), + S("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) ]), - Tag("button", { + S("button", { type: "button", class: "btn btn-ghost btn-xs btn-circle", onclick: (e) => { @@ -1497,11 +1313,11 @@ }); var Indicator = (props, children) => { const { value, class: className, ...rest } = props; - return Tag("div", { + return S("div", { ...rest, class: "indicator" }, () => [ - value ? Tag("span", { + value ? S("span", { class: ui("indicator-item badge", className) }, () => typeof value === "function" ? value() : value) : null, children @@ -1516,13 +1332,13 @@ var Label = (props) => { const { children, value, floating = false, class: className, ...rest } = props; if (floating) { - return Tag("label", { class: ui("floating-label", className), ...rest }, () => [ + return S("label", { class: ui("floating-label", className), ...rest }, () => [ typeof children === "function" ? children() : children, - value ? Tag("span", {}, val(value)) : null + value ? S("span", {}, val2(value)) : null ]); } - return Tag("label", { class: ui("label", className), ...rest }, () => [ - value ? Tag("span", { class: "label-text" }, val(value)) : null, + return S("label", { class: ui("label", className), ...rest }, () => [ + value ? S("span", { class: "label-text" }, val2(value)) : null, typeof children === "function" ? children() : children ]); }; @@ -1534,17 +1350,17 @@ }); var List = (props) => { const { class: className, items, header, render = (item) => item, keyFn = (item, index) => item.id ?? index, ...rest } = props; - const listItems = For(items, (item, index) => Tag("li", { + const listItems = K(items, (item, index) => S("li", { class: "list-row", style: "width: 100%; display: block;" }, [ - Tag("div", { style: "width: 100%;" }, [render(item, index)]) + S("div", { style: "width: 100%;" }, [render(item, index)]) ]), keyFn); - return Tag("ul", { + return S("ul", { ...rest, style: "display: block; width: 100%;", class: ui("list bg-base-100 rounded-box shadow-md", className) - }, header ? [If(header, () => Tag("li", { class: "p-4 pb-2 text-xs opacity-60", style: "width: 100%;" }, [val(header)])), listItems] : listItems); + }, header ? [J(header, () => S("li", { class: "p-4 pb-2 text-xs opacity-60", style: "width: 100%;" }, [val2(header)])), listItems] : listItems); }; // src/components/Menu.js @@ -1554,16 +1370,16 @@ }); var Menu = (props) => { const { class: className, items, ...rest } = props; - const renderItems = (items2) => For(() => items2 || [], (it) => Tag("li", {}, [ - it.children ? Tag("details", { open: it.open }, [ - Tag("summary", {}, [it.icon && Tag("span", { class: "mr-2" }, it.icon), it.label]), - Tag("ul", {}, renderItems(it.children)) - ]) : Tag("a", { class: () => val(it.active) ? "active" : "", onclick: it.onclick }, [ - it.icon && Tag("span", { class: "mr-2" }, it.icon), + const renderItems = (items2) => K(() => items2 || [], (it) => S("li", {}, [ + it.children ? S("details", { open: it.open }, [ + S("summary", {}, [it.icon && S("span", { class: "mr-2" }, it.icon), it.label]), + S("ul", {}, renderItems(it.children)) + ]) : S("a", { class: () => val2(it.active) ? "active" : "", onclick: it.onclick }, [ + it.icon && S("span", { class: "mr-2" }, it.icon), it.label ]) ]), (it, i) => it.label || i); - return Tag("ul", { ...rest, class: ui("menu bg-base-200 rounded-box", className) }, renderItems(items)); + return S("ul", { ...rest, class: ui("menu bg-base-200 rounded-box", className) }, renderItems(items)); }; // src/components/Modal.js @@ -1586,12 +1402,12 @@ dialogElement.close(); } }; - Watch(() => handleOpen()); + R(() => handleOpen()); const close = () => { if (typeof open === "function") open(false); }; - return Tag("dialog", { + return S("dialog", { ...rest, ref: (el) => { dialogElement = el; @@ -1602,20 +1418,20 @@ onclose: close, oncancel: close }, [ - Tag("div", { class: "modal-box" }, [ - title ? Tag("h3", { class: "text-lg font-bold mb-4" }, () => typeof title === "function" ? title() : title) : null, - Tag("div", { class: "py-2" }, [ + S("div", { class: "modal-box" }, [ + title ? S("h3", { class: "text-lg font-bold mb-4" }, () => typeof title === "function" ? title() : title) : null, + S("div", { class: "py-2" }, [ typeof children === "function" ? children() : children ]), - Tag("div", { class: "modal-action" }, [ - Tag("form", { method: "dialog", class: "flex gap-2" }, [ + S("div", { class: "modal-action" }, [ + S("form", { method: "dialog", class: "flex gap-2" }, [ ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "submit" }, tt("close")()) + Button({ type: "submit" }, "close") ]) ]) ]), - Tag("form", { method: "dialog", class: "modal-backdrop" }, [ - Tag("button", {}, "close") + S("form", { method: "dialog", class: "modal-backdrop" }, [ + S("button", {}, "close") ]) ]); }; @@ -1627,7 +1443,7 @@ }); var Navbar = (props, children) => { const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("navbar bg-base-100 shadow-sm px-4", className) }, children); + return S("div", { ...rest, class: ui("navbar bg-base-100 shadow-sm px-4", className) }, children); }; // src/components/Radio.js @@ -1637,12 +1453,12 @@ }); var Radio = (props) => { const { class: className, label, tooltip, value, inputValue, name, ...rest } = props; - const radioEl = Tag("input", { + const radioEl = S("input", { ...rest, type: "radio", name, class: ui("radio", className), - checked: () => val(value) === inputValue, + checked: () => val2(value) === inputValue, onclick: () => { if (typeof value === "function") value(inputValue); @@ -1650,11 +1466,11 @@ }); if (!label && !tooltip) return radioEl; - const layout = Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ + const layout = S("label", { class: "label cursor-pointer justify-start gap-3" }, [ radioEl, - label ? Tag("span", { class: "label-text" }, label) : null + label ? S("span", { class: "label-text" }, label) : null ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + return tooltip ? S("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; }; // src/components/Range.js @@ -1664,20 +1480,20 @@ }); var Range = (props) => { const { class: className, label, tooltip, value, ...rest } = props; - const rangeEl = Tag("input", { + const rangeEl = S("input", { ...rest, type: "range", class: ui("range", className), value, - disabled: () => val(props.disabled) + disabled: () => val2(props.disabled) }); if (!label && !tooltip) return rangeEl; - const layout = Tag("div", { class: "flex flex-col gap-2" }, [ - label ? Tag("span", { class: "label-text" }, label) : null, + const layout = S("div", { class: "flex flex-col gap-2" }, [ + label ? S("span", { class: "label-text" }, label) : null, rangeEl ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + return tooltip ? S("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; }; // src/components/Rating.js @@ -1688,18 +1504,18 @@ var Rating = (props) => { const { class: className, value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - return Tag("div", { + return S("div", { ...rest, - class: () => ui(`rating ${val(readonly) ? "pointer-events-none" : ""}`, className) - }, Array.from({ length: val(count) }, (_, i) => { + class: () => ui(`rating ${val2(readonly) ? "pointer-events-none" : ""}`, className) + }, Array.from({ length: val2(count) }, (_2, i) => { const starValue = i + 1; - return Tag("input", { + return S("input", { type: "radio", name: ratingGroup, class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, + checked: () => Math.round(val2(value)) === starValue, onchange: () => { - if (!val(readonly)) { + if (!val2(readonly)) { if (typeof onchange === "function") { onchange(starValue); } else if (typeof value === "function") { @@ -1718,18 +1534,18 @@ }); var Select = (props) => { const { class: className, label, items, value, ...rest } = props; - const selectEl = Tag("select", { + const selectEl = S("select", { ...rest, class: ui("select select-bordered w-full", className), value - }, For(() => val(items) || [], (opt) => Tag("option", { + }, K(() => val2(items) || [], (opt) => S("option", { value: opt.value, - $selected: () => String(val(value)) === String(opt.value) + $selected: () => String(val2(value)) === String(opt.value) }, opt.label), (opt) => opt.value)); if (!label) return selectEl; - return Tag("label", { class: "fieldset-label flex flex-col gap-1" }, [ - Tag("span", {}, label), + return S("label", { class: "fieldset-label flex flex-col gap-1" }, [ + S("span", {}, label), selectEl ]); }; @@ -1741,7 +1557,7 @@ }); var Stack = (props, children) => { const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("stack", className) }, children); + return S("div", { ...rest, class: ui("stack", className) }, children); }; // src/components/Stat.js @@ -1751,11 +1567,11 @@ }); var Stat = (props) => { const { class: className, icon, label, value, desc, ...rest } = props; - return Tag("div", { ...rest, class: ui("stat", className) }, [ - icon && Tag("div", { class: "stat-figure text-secondary" }, icon), - label && Tag("div", { class: "stat-title" }, label), - Tag("div", { class: "stat-value" }, () => val(value) ?? value), - desc && Tag("div", { class: "stat-desc" }, desc) + return S("div", { ...rest, class: ui("stat", className) }, [ + icon && S("div", { class: "stat-figure text-secondary" }, icon), + label && S("div", { class: "stat-title" }, label), + S("div", { class: "stat-value" }, () => val2(value) ?? value), + desc && S("div", { class: "stat-desc" }, desc) ]); }; @@ -1766,18 +1582,18 @@ }); var Swap = (props) => { const { class: className, value, on, off, ...rest } = props; - return Tag("label", { ...rest, class: ui("swap", className) }, [ - Tag("input", { + return S("label", { ...rest, class: ui("swap", className) }, [ + S("input", { type: "checkbox", - checked: () => val(value), + checked: () => val2(value), onclick: (e) => { if (typeof value === "function") { value(e.target.checked); } } }), - Tag("div", { class: "swap-on" }, on), - Tag("div", { class: "swap-off" }, off) + S("div", { class: "swap-on" }, on), + S("div", { class: "swap-off" }, off) ]); }; @@ -1787,38 +1603,38 @@ Table: () => Table }); var Table = (props) => { - const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = tt("nodata")(), ...rest } = props; + const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = "nodata", ...rest } = props; const tableClass = () => { - const zebraClass = val(zebra) ? "table-zebra" : ""; - const pinRowsClass = val(pinRows) ? "table-pin-rows" : ""; + const zebraClass = val2(zebra) ? "table-zebra" : ""; + const pinRowsClass = val2(pinRows) ? "table-pin-rows" : ""; return ui("table", className, zebraClass, pinRowsClass); }; const getInternalKeyFn = keyFn || ((item, idx) => item.id || idx); - return Tag("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - Tag("table", { ...rest, class: tableClass }, [ - Tag("thead", {}, [ - Tag("tr", {}, columns.map((col) => Tag("th", { class: col.class || "" }, col.label))) + return S("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ + S("table", { ...rest, class: tableClass }, [ + S("thead", {}, [ + S("tr", {}, columns.map((col) => S("th", { class: col.class || "" }, col.label))) ]), - Tag("tbody", {}, [ - For(items, (item, index) => { + S("tbody", {}, [ + K(items, (item, index) => { const it = () => { - const currentItems = val(items); + const currentItems = val2(items); const key = getInternalKeyFn(item, index); return currentItems.find((u, i) => getInternalKeyFn(u, i) === key) || item; }; - return Tag("tr", { class: "hover" }, columns.map((col) => { + return S("tr", { class: "hover" }, columns.map((col) => { const cellContent = () => { const latestItem = it(); if (col.render) return col.render(latestItem, index); - return val(latestItem[col.key]); + return val2(latestItem[col.key]); }; - return Tag("td", { class: col.class || "" }, [cellContent]); + return S("td", { class: col.class || "" }, [cellContent]); })); }, getInternalKeyFn), - If(() => val(items).length === 0, () => Tag("tr", {}, [ - Tag("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) + J(() => val2(items).length === 0, () => S("tr", {}, [ + S("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ + val2(empty) ]) ])) ]) @@ -1834,10 +1650,10 @@ var Tabs = (props) => { const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $2(0); - Watch2(() => { + const activeIndex = B(0); + R(() => { const list = itemsSignal(); - const idx = list.findIndex((it) => val(it.active) === true); + const idx = list.findIndex((it) => val2(it.active) === true); if (idx !== -1 && activeIndex() !== idx) { activeIndex(idx); } @@ -1848,7 +1664,7 @@ if (onTabClose) onTabClose(item, indexToRemove); const currentItems = itemsSignal(); - const newItems = currentItems.filter((_, idx) => idx !== indexToRemove); + const newItems = currentItems.filter((_2, idx) => idx !== indexToRemove); const isWritableSignal = typeof items === "function" && !items._isComputed; if (!isWritableSignal) { console.warn("Tabs: items must be a writable signal to support closable tabs"); @@ -1864,12 +1680,12 @@ newActive = Math.min(newActive, newItems.length - 1); activeIndex(newActive); }; - return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { + return S("div", { ...rest, class: ui("tabs", className) }, () => { const list = itemsSignal(); const elements = []; for (let i = 0;i < list.length; i++) { const item = list[i]; - const label = val(item.label); + const label = val2(item.label); const labelNode = label instanceof Node ? label : document.createTextNode(String(label)); const buttonChildren = []; if (item.closable) { @@ -1879,26 +1695,26 @@ e.stopPropagation(); removeTab(i, item); }; - const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); + const wrapper = S("span", { class: "flex items-center" }, [labelNode, closeIcon]); buttonChildren.push(wrapper); } else { buttonChildren.push(labelNode); } - const buttonBase = Tag2("button", { + const buttonBase = S("button", { class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); - if (!val(item.disabled)) { + if (!val2(item.disabled)) { if (item.onclick) item.onclick(); activeIndex(i); } } }, buttonChildren); - const button = item.tip ? Tag2("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) : buttonBase; + const button = item.tip ? S("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) : buttonBase; elements.push(button); let contentNode; - const rawContent = val(item.content); + const rawContent = val2(item.content); if (typeof rawContent === "function") { contentNode = rawContent(); } else if (rawContent instanceof Node) { @@ -1906,8 +1722,8 @@ } else { contentNode = document.createTextNode(String(rawContent)); } - const inner = Tag2("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag2("div", { + const inner = S("div", { class: "tab-content-inner" }, contentNode); + const panel = S("div", { class: "tab-content bg-base-100 border-base-300 p-6", style: () => activeIndex() === i ? "display: block" : "display: none" }, inner); @@ -1930,26 +1746,26 @@ warning: "icon-[lucide--alert-triangle]", error: "icon-[lucide--alert-circle]" }; - return Tag("ul", { + return S("ul", { ...rest, - class: () => ui(`timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val(compact) ? "timeline-compact" : ""}`, className) + class: () => ui(`timeline ${val2(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val2(compact) ? "timeline-compact" : ""}`, className) }, () => { const list = (typeof items === "function" ? items() : items) || []; return list.map((item, i) => { const isFirst = i === 0; const isLast = i === list.length - 1; const itemType = item.type || "success"; - const isCompleted = () => val(item.completed); - const prevCompleted = () => i > 0 && val(list[i - 1].completed); + const isCompleted = () => val2(item.completed); + const prevCompleted = () => i > 0 && val2(list[i - 1].completed); const renderSlot = (content) => typeof content === "function" ? content() : content; - return Tag("li", { class: "flex-1" }, [ - !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, - Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), - Tag("div", { class: "timeline-middle" }, [ + return S("li", { class: "flex-1" }, [ + !isFirst ? S("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, + S("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), + S("div", { class: "timeline-middle" }, [ () => item.icon ? getIcon(item.icon) : getIcon(iconMap[itemType] || iconMap.success) ]), - Tag("div", { class: "timeline-end timeline-box shadow-sm" }, [() => renderSlot(item.detail)]), - !isLast ? Tag("hr", { class: () => isCompleted() ? "bg-primary" : "" }) : null + S("div", { class: "timeline-end timeline-box shadow-sm" }, [() => renderSlot(item.detail)]), + !isLast ? S("hr", { class: () => isCompleted() ? "bg-primary" : "" }) : null ]); }); }); @@ -1963,13 +1779,13 @@ var Toast = (message, type = "alert-success", duration = 3500) => { let container = document.getElementById("sigpro-toast-container"); if (!container) { - container = Tag("div", { + container = S("div", { id: "sigpro-toast-container", class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none" }); document.body.appendChild(container); } - const toastHost = Tag("div", { style: "display: contents" }); + const toastHost = S("div", { style: "display: contents" }); container.appendChild(toastHost); let timeoutId; const close = () => { @@ -1990,10 +1806,10 @@ }; const ToastComponent = () => { const closeIcon = getIcon("icon-[lucide--x]"); - const el = Tag("div", { + const el = S("div", { class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto` }, [ - Tag("span", {}, [typeof message === "function" ? message() : message]), + S("span", {}, [typeof message === "function" ? message() : message]), Button({ class: "btn-xs btn-circle btn-ghost", onclick: close @@ -2002,7 +1818,7 @@ requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); return el; }; - const instance = Mount(ToastComponent, toastHost); + const instance = H(ToastComponent, toastHost); if (duration > 0) { timeoutId = setTimeout(close, duration); } @@ -2014,13 +1830,13 @@ __export(exports_Tooltip, { Tooltip: () => Tooltip }); - var Tooltip = (props, children) => Tag("div", { + var Tooltip = (props, children) => S("div", { ...props, class: () => ui("tooltip w-full", props.class), "data-tip": props.tip }, children); - // src/components/index.js + // index.js var Components = { ...exports_Accordion, ...exports_Alert, @@ -2055,45 +1871,19 @@ ...exports_Toast, ...exports_Tooltip }; - var components_default = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("\uD83D\uDE80 SigproUI"); - } + var Utils = { + Locale, + tt }; - // index.js if (typeof window !== "undefined") { - Object.entries(exports_components).forEach(([name, component]) => { + Object.entries({ ...Components, ...Utils }).forEach(([name, value]) => { Object.defineProperty(window, name, { - value: component, + value, writable: false, configurable: true, enumerable: true }); }); - Object.entries(exports_utils).forEach(([name, fn]) => { - Object.defineProperty(window, name, { - value: fn, - writable: false, - configurable: true, - enumerable: true - }); - }); - Object.defineProperty(window, "tt", { - value: tt, - writable: false, - configurable: true, - enumerable: true - }); - Object.defineProperty(window, "SigProUI", { - value: { ...exports_components, Utils: exports_utils, tt }, - writable: false, - configurable: true, - enumerable: true - }); - console.log("\uD83C\uDFA8 SigProUI ready"); + console.log("SigProUI installed"); } })(); diff --git a/dist/sigpro-ui.min.js b/dist/sigpro-ui.min.js index 8f4468b..3e51ec3 100644 --- a/dist/sigpro-ui.min.js +++ b/dist/sigpro-ui.min.js @@ -1,7 +1,7 @@ -(()=>{var{defineProperty:Jf,getOwnPropertyNames:m_,getOwnPropertyDescriptor:v_}=Object,g_=Object.prototype.hasOwnProperty;var F_=new WeakMap,c_=(f)=>{var M=F_.get(f),_;if(M)return M;if(M=Jf({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function")m_(f).map((E)=>!g_.call(M,E)&&Jf(M,E,{get:()=>f[E],enumerable:!(_=v_(f,E))||_.enumerable}));return F_.set(f,M),M};var R=(f,M)=>{for(var _ in M)Jf(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var l_={};R(l_,{val:()=>B,ui:()=>Z,tt:()=>x,getIcon:()=>z,Watch:()=>v,Tooltip:()=>O_,Toast:()=>D_,Timeline:()=>z_,Tag:()=>k,Tabs:()=>q_,Table:()=>Y_,Swap:()=>K_,Stat:()=>X_,Stack:()=>B_,Select:()=>Q_,Router:()=>g,Rating:()=>P_,Range:()=>A_,Radio:()=>$_,Navbar:()=>M_,Mount:()=>Sf,Modal:()=>f_,Menu:()=>af,List:()=>lf,Label:()=>of,Input:()=>n,Indicator:()=>df,If:()=>Zf,For:()=>Kf,Fileinput:()=>bf,Fieldset:()=>cf,Fab:()=>vf,Dropdown:()=>uf,Drawer:()=>yf,Datepicker:()=>jf,Colorpicker:()=>kf,Checkbox:()=>Vf,Button:()=>o,Badge:()=>Nf,Autocomplete:()=>hf,Alert:()=>qf,Accordion:()=>Yf,$:()=>d});var y=(f)=>typeof f==="function",Gf=(f)=>f&&typeof f==="object",l=Array.isArray,I=typeof document<"u"?document:null,k_=(f)=>f?._isRuntime?f.container:f instanceof Node?f:I.createTextNode(f==null?"":String(f)),O=null,V=null,t=!1,ff=0,_f=new Set,Qf=new WeakMap,Tf=Symbol("iter"),Bf=new WeakMap,b=(f)=>{if(!f||f._disposed)return;f._disposed=!0;let M=[f];while(M.length){let _=M.pop();if(_._cleanups)_._cleanups.forEach((E)=>E()),_._cleanups.clear();if(_._children)_._children.forEach((E)=>M.push(E)),_._children.clear();if(_._deps)_._deps.forEach((E)=>E.delete(_)),_._deps.clear()}},p_=(f)=>{if(V)(V._mounts||=[]).push(f)},r=(f)=>{if(V)(V._cleanups||=new Set).add(f)},b_=(f)=>{let M=O;O=null;try{return f()}finally{O=M}},a=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((A)=>A.delete(_));if(_._cleanups)_._cleanups.forEach((A)=>A()),_._cleanups.clear();let E=O,L=V;O=V=_;try{return _._result=f()}catch(A){console.error("[SigPro]",A)}finally{O=E,V=L}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=O?O._depth+1:0,_._mounts=[],_._parent=V,V)(V._children||=new Set).add(_);return _},w_=()=>{if(t)return;t=!0;let f=Array.from(_f).sort((M,_)=>M._depth-_._depth);_f.clear();for(let M of f)if(!M._disposed)M();t=!1},r_=(f)=>{ff++;try{return f()}finally{if(ff--,ff===0&&_f.size>0&&!t)w_()}},w=(f,M=!1)=>{if(!M&&O&&!O._disposed)f.add(O),(O._deps||=new Set).add(f);else if(M){let _=!1;if(f.forEach((E)=>{if(E===O||E._disposed)return;if(E._isComputed){if(E._dirty=!0,E._subs)w(E._subs,!0)}else _f.add(E),_=!0}),_&&!t&&ff===0)queueMicrotask(w_)}},d=(f,M=null)=>{let _=new Set;if(y(f)){let E,L=!0,A=()=>{if(L){let P=O;O=A;try{let W=f();if(!Object.is(E,W))E=W,L=!1,w(_,!0)}finally{O=P}}return w(_),E};if(A._isComputed=!0,A._subs=_,A._dirty=!0,A._deps=null,A._disposed=!1,A.markDirty=()=>{L=!0},A.stop=()=>{if(A._disposed=!0,A._deps)A._deps.forEach((P)=>P.delete(A)),A._deps.clear();_.clear()},V)r(A.stop);return A}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let L=y(E[0])?E[0](f):E[0];if(!Object.is(f,L)){if(f=L,M)localStorage.setItem(M,JSON.stringify(f));w(_,!0)}}return w(_),f}},y_=(f)=>{if(!Gf(f))return f;if(Qf.has(f))return Qf.get(f);let M=new Map,_=(L)=>{let A=M.get(L);if(!A)M.set(L,A=new Set);return A},E=new Proxy(f,{get(L,A){return w(_(A)),y_(L[A])},set(L,A,P){let W=!(A in L);if(!Object.is(L[A],P)){if(L[A]=P,w(_(A),!0),W)w(_(Tf),!0)}return!0},deleteProperty(L,A){let P=Reflect.deleteProperty(L,A);if(P)w(_(A),!0),w(_(Tf),!0);return P},ownKeys(L){return w(_(Tf)),Reflect.ownKeys(L)}});return Qf.set(f,E),E},v=(f,M)=>{if(M===void 0){let E=a(f);return E(),()=>b(E)}let _=a(()=>{let E=Array.isArray(f)?f.map((L)=>L()):f();b_(()=>M(E))});return _(),()=>b(_)},Xf=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)b(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Xf)},d_=/^\s*(javascript|data|vbscript):/i,n_=(f)=>f==="src"||f==="href"||f.startsWith("on"),H_=(f,M)=>{if(M==null||M===!1)return null;if(n_(f)){let _=String(M);if(d_.test(_))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return M},k=(f,M={},_=[])=>{if(M instanceof Node||l(M)||!Gf(M))_=M,M={};if(y(f)){let P={_mounts:[],_cleanups:new Set},W=a(()=>{let T=f(M,{children:_,emit:(Y,...K)=>M[`on${Y[0].toUpperCase()}${Y.slice(1)}`]?.(...K)});return W._result=T,T});W();let J=W._result;if(J==null)return null;let Q=J instanceof Node||l(J)&&J.every((T)=>T instanceof Node)?J:I.createTextNode(String(J)),X=(T)=>{if(Gf(T)&&!T._isRuntime)T._mounts=W._mounts||[],T._cleanups=W._cleanups||new Set,T._ownerEffect=W};return l(Q)?Q.forEach(X):X(Q),Q}let E=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(f),L=E?I.createElementNS("http://www.w3.org/2000/svg",f):I.createElement(f);L._cleanups=new Set;for(let P in M){if(!M.hasOwnProperty(P))continue;let W=M[P];if(P==="ref"){y(W)?W(L):W.current=L;continue}if(P.startsWith("on")){let J=P.slice(2).toLowerCase();L.addEventListener(J,W);let Q=()=>L.removeEventListener(J,W);L._cleanups.add(Q),r(Q)}else if(y(W)){let J=a(()=>{let Q=H_(P,W());if(P==="class")L.className=Q||"";else if(Q==null)L.removeAttribute(P);else if(P in L&&!E)L[P]=Q;else L.setAttribute(P,Q===!0?"":Q)});if(J(),L._cleanups.add(()=>b(J)),r(()=>b(J)),/^(INPUT|TEXTAREA|SELECT)$/.test(L.tagName)&&(P==="value"||P==="checked")){let Q=P==="checked"?"change":"input";L.addEventListener(Q,(X)=>W(X.target[P]))}}else{let J=H_(P,W);if(J!=null)if(P in L&&!E)L[P]=J;else L.setAttribute(P,J===!0?"":J)}}let A=(P)=>{if(l(P))return P.forEach(A);if(y(P)){let W=I.createTextNode("");L.appendChild(W);let J=[],Q=a(()=>{let X=P(),T=(l(X)?X:[X]).map(k_);J.forEach((K)=>{if(K._isRuntime)K.destroy();else Xf(K);if(K.parentNode)K.remove()});let Y=W;for(let K=T.length-1;K>=0;K--){let G=T[K];if(G.parentNode!==Y.parentNode)Y.parentNode?.insertBefore(G,Y);if(G._mounts)G._mounts.forEach((C)=>C());Y=G}J=T});Q(),L._cleanups.add(()=>b(Q)),r(()=>b(Q))}else{let W=k_(P);if(L.appendChild(W),W._mounts)W._mounts.forEach((J)=>J())}};return A(_),L},e=(f)=>{let M=new Set,_=[],E=V,L=O,A=I.createElement("div");A.style.display="contents",A.setAttribute("role","presentation"),V={_cleanups:M,_mounts:_},O=null;let P=(W)=>{if(!W)return;if(W._isRuntime)M.add(W.destroy),A.appendChild(W.container);else if(l(W))W.forEach(P);else A.appendChild(W instanceof Node?W:I.createTextNode(String(W==null?"":W)))};try{P(f({onCleanup:(W)=>M.add(W)}))}finally{V=E,O=L}return _.forEach((W)=>W()),{_isRuntime:!0,container:A,destroy:()=>{M.forEach((W)=>W()),Xf(A),A.remove()}}},Zf=(f,M,_=null)=>{let E=I.createTextNode(""),L=k("div",{style:"display:contents"},[E]),A=null;return v(()=>!!(y(f)?f():f),(P)=>{if(A)A.destroy(),A=null;let W=P?M:_;if(W)A=e(()=>y(W)?W():W),L.insertBefore(A.container,E)}),r(()=>A?.destroy()),L},Kf=(f,M,_)=>{let E=I.createTextNode(""),L=k("div",{style:"display:contents"},[E]),A=new Map;return v(()=>(y(f)?f():f)||[],(P)=>{let W=new Map,J=[],Q=P||[];for(let T=0;TM(Y,T));else A.delete(K);W.set(K,G),J.push(G)}A.forEach((T)=>T.destroy());let X=E;for(let T=J.length-1;T>=0;T--){let K=J[T].container;if(K.nextSibling!==X)L.insertBefore(K,X);X=K}A=W}),L},g=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=d(M()),E=()=>_(M());window.addEventListener("hashchange",E),r(()=>window.removeEventListener("hashchange",E));let L=k("div",{class:"router-hook"}),A=null;return v([_],()=>{let P=_(),W=f.find((J)=>{let Q=J.path.split("/").filter(Boolean),X=P.split("/").filter(Boolean);return Q.length===X.length&&Q.every((T,Y)=>T[0]===":"||T===X[Y])})||f.find((J)=>J.path==="*");if(W){A?.destroy();let J={};W.path.split("/").filter(Boolean).forEach((Q,X)=>{if(Q[0]===":")J[Q.slice(1)]=P.split("/").filter(Boolean)[X]}),g.params(J),A=e(()=>y(W.component)?W.component(J):W.component),L.replaceChildren(A.container)}}),L};g.params=d({});g.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");g.back=()=>window.history.back();g.path=()=>window.location.hash.replace(/^#/,"")||"/";var Sf=(f,M)=>{let _=typeof M==="string"?I.querySelector(M):M;if(!_)return;if(Bf.has(_))Bf.get(_).destroy();let E=e(y(f)?f:()=>f);return _.replaceChildren(E.container),Bf.set(_,E),E},j_=Object.freeze({$:d,$$:y_,Watch:v,Tag:k,Render:e,If:Zf,For:Kf,Router:g,Mount:Sf,onMount:p_,onUnmount:r,Batch:r_});if(typeof window<"u")Object.assign(window,j_),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((f)=>window[f[0].toUpperCase()+f.slice(1)]=(M,_)=>j_.Tag(f,M,_));var Ef={};R(Ef,{default:()=>s_,Tooltip:()=>O_,Toast:()=>D_,Timeline:()=>z_,Tabs:()=>q_,Table:()=>Y_,Swap:()=>K_,Stat:()=>X_,Stack:()=>B_,Select:()=>Q_,Rating:()=>P_,Range:()=>A_,Radio:()=>$_,Navbar:()=>M_,Modal:()=>f_,Menu:()=>af,List:()=>lf,Label:()=>of,Input:()=>n,Indicator:()=>df,Fileinput:()=>bf,Fieldset:()=>cf,Fab:()=>vf,Dropdown:()=>uf,Drawer:()=>yf,Datepicker:()=>jf,Colorpicker:()=>kf,Checkbox:()=>Vf,Button:()=>o,Badge:()=>Nf,Autocomplete:()=>hf,Alert:()=>qf,Accordion:()=>Yf});var Cf={};R(Cf,{Accordion:()=>Yf});var Mf={};R(Mf,{val:()=>B,ui:()=>Z,getIcon:()=>z});var B=(f)=>typeof f==="function"?f():f,Z=(f,M)=>typeof M==="function"?()=>`${f} ${M()||""}`.trim():`${f} ${M||""}`.trim(),z=(f)=>{if(!f)return null;if(typeof f==="function")return Tag("span",{class:"mr-1"},f());if(typeof f==="object")return Tag("span",{class:"mr-1"},f);if(typeof f==="string"){let M=f.trim().split(/\s+/),_=M[M.length-1]==="right",E=_?M.slice(0,-1).join(" "):f,L=_?"ml-1":"mr-1";if(E&&!E.startsWith("icon-[")&&!E.includes("--"))return Tag("span",{class:L},E);return Tag("span",{class:`${E} ${L}`.trim()})}return null};var Yf=(f,M)=>{let{class:_,title:E,name:L,open:A,...P}=f;return Tag("div",{...P,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:L?"radio":"checkbox",name:L,checked:B(A)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Rf={};R(Rf,{Alert:()=>qf});var qf=(f,M)=>{let{class:_,actions:E,type:L="info",soft:A=!0,...P}=f,W={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},X=[`alert-${L}`,A?"alert-soft":"",_].filter(Boolean).join(" "),T=M||f.message;return Tag("div",{...P,role:"alert",class:Z("alert",X)},()=>[z(W[L]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof T==="function"?T():T])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var Df={};R(Df,{Autocomplete:()=>hf});var o_={es:{close:"Cerrar",confirm:"Confirmar",cancel:"Cancelar",search:"Buscar...",loading:"Cargando...",nodata:"Sin datos"},en:{close:"Close",confirm:"Confirm",cancel:"Cancel",search:"Search...",loading:"Loading...",nodata:"No data"}},i_=$("es");var x=(f)=>()=>o_[i_()][f]||f;var zf={};R(zf,{Input:()=>n});var n=(f)=>{let{class:M,value:_,type:E="text",icon:L,oninput:A,placeholder:P,disabled:W,validate:J,label:Q,...X}=f,T=E==="password",Y=$(!1),K=$(null),G={text:"icon-[lucide--text]",password:"icon-[lucide--lock]",date:"icon-[lucide--calendar]",number:"icon-[lucide--hash]",email:"icon-[lucide--mail]",search:"icon-[lucide--search]",tel:"icon-[lucide--phone]",url:"icon-[lucide--link]"},C=L?z(L):G[E]?z(G[E]):null,h=()=>z(Y()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),U=C?"pl-10":"",H=T?"pr-10":"",i=()=>{if(M?.includes("input-xs"))return"btn-xs";if(M?.includes("input-sm"))return"btn-sm";if(M?.includes("input-lg"))return"btn-lg";return"btn-md"},s=(D)=>{let c=D.target.value;if(J){let $f=J(c);K($f||null)}A?.(D)},F=()=>K()&&K()!=="",S=()=>{let D=`input w-full ${U} ${H}`;if(M)D+=` ${M}`;if(F())D+=" input-error";return D.trim()},q=Tag("input",{...X,type:()=>T?Y()?"text":"password":E,placeholder:P||(Q?" ":P),class:S,value:_,oninput:s,disabled:()=>B(W),"aria-invalid":()=>F()?"true":"false"}),N=()=>[q,C?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},C):null,T?Tag("button",{type:"button",class:Z("absolute right-3 inset-y-0 flex items-center","btn btn-ghost btn-circle opacity-50 hover:opacity-100",i()),onclick:(D)=>{D.preventDefault(),Y(!Y())}},()=>h()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>F()?K():null)];if(Q)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},N),Tag("span",{},B(Q))]);return Tag("div",{class:"relative w-full"},N)};var hf=(f)=>{let{class:M,items:_=[],value:E,onselect:L,label:A,placeholder:P,...W}=f,J=$(B(E)||""),Q=$(!1),X=$(-1),T=$([]);Watch(()=>{let G=String(J()).toLowerCase(),C=B(_)||[],h=G?C.filter((U)=>(typeof U==="string"?U:U.label).toLowerCase().includes(G)):C;T(h)});let Y=(G)=>{let C=typeof G==="string"?G:G.value,h=typeof G==="string"?G:G.label;if(J(h),typeof E==="function")E(C);L?.(G),Q(!1),X(-1)},K=(G)=>{let C=T();if(G.key==="ArrowDown")G.preventDefault(),Q(!0),X(Math.min(X()+1,C.length-1));else if(G.key==="ArrowUp")G.preventDefault(),X(Math.max(X()-1,0));else if(G.key==="Enter"&&X()>=0)G.preventDefault(),Y(C[X()]);else if(G.key==="Escape")Q(!1)};return Tag("div",{class:"relative w-full"},[n({label:A,class:M,placeholder:P||x("search")(),value:J,onfocus:()=>Q(!0),onblur:()=>setTimeout(()=>Q(!1),150),onkeydown:K,oninput:(G)=>{let C=G.target.value;if(J(C),typeof E==="function")E(C);Q(!0),X(-1)},...W}),Tag("ul",{class:"absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50",style:()=>Q()&&T().length?"display:block":"display:none"},[For(T,(G,C)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${X()===C?"active bg-primary text-primary-content":""}`,onclick:()=>Y(G),onmouseenter:()=>X(C)},typeof G==="string"?G:G.label)]),(G,C)=>(typeof G==="string"?G:G.value)+C),()=>T().length?null:Tag("li",{class:"p-2 text-center opacity-50"},x("nodata")())])])};var Of={};R(Of,{Badge:()=>Nf});var Nf=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Uf={};R(Uf,{Button:()=>o});var o=(f,M)=>{let{class:_,loading:E,icon:L,...A}=f,P=z(L);return Tag("button",{...A,class:Z("btn",_),disabled:()=>B(E)||B(f.disabled)},()=>[B(E)&&Tag("span",{class:"loading loading-spinner"}),P,M].filter(Boolean))};var Ff={};R(Ff,{Checkbox:()=>Vf});var Vf=(f)=>{let{class:M,value:_,toggle:E,label:L,...A}=f,P=Tag("input",{...A,type:"checkbox",class:()=>Z(B(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[P,L?Tag("span",{class:"label-text"},L):null])};var Hf={};R(Hf,{Colorpicker:()=>kf});var kf=(f)=>{let{class:M,value:_,label:E,...L}=f,A=$(!1),P=["#000","#1A1A1A","#333","#4D4D4D","#666","#808080","#B3B3B3","#FFF","#450a0a","#7f1d1d","#991b1b","#b91c1c","#dc2626","#ef4444","#f87171","#fca5a5","#431407","#7c2d12","#9a3412","#c2410c","#ea580c","#f97316","#fb923c","#ffedd5","#713f12","#a16207","#ca8a04","#eab308","#facc15","#fde047","#fef08a","#fff9c4","#064e3b","#065f46","#059669","#10b981","#34d399","#4ade80","#84cc16","#d9f99d","#082f49","#075985","#0284c7","#0ea5e9","#38bdf8","#7dd3fc","#22d3ee","#cffafe","#1e1b4b","#312e81","#4338ca","#4f46e5","#6366f1","#818cf8","#a5b4fc","#e0e7ff","#2e1065","#4c1d95","#6d28d9","#7c3aed","#8b5cf6","#a855f7","#d946ef","#fae8ff"],W=()=>B(_)||"#000000";return Tag("div",{class:Z("relative w-fit",M)},[Tag("button",{type:"button",class:"btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case",onclick:(J)=>{J.stopPropagation(),A(!A())},...L},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${W()}`}),E?Tag("span",{class:"opacity-80"},E):null]),If(A,()=>Tag("div",{class:"absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none",onclick:(J)=>J.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},P.map((J)=>Tag("button",{type:"button",style:`background-color: ${J}`,class:()=>{return`size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${W().toLowerCase()===J.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(J);A(!1)}})))])),If(A,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>A(!1)}))])};var wf={};R(wf,{Datepicker:()=>jf});var jf=(f)=>{let{class:M,value:_,range:E,label:L,placeholder:A,hour:P=!1,...W}=f,J=$(!1),Q=$(new Date),X=$(null),T=$(0),Y=$(0),K=()=>B(E)===!0,G=new Date,C=`${G.getFullYear()}-${String(G.getMonth()+1).padStart(2,"0")}-${String(G.getDate()).padStart(2,"0")}`,h=(S)=>{let q=S.getFullYear(),N=String(S.getMonth()+1).padStart(2,"0"),D=String(S.getDate()).padStart(2,"0");return`${q}-${N}-${D}`},U=(S)=>{let q=h(S),N=B(_);if(K())if(!N?.start||N.start&&N.end){if(typeof _==="function")_({start:q,end:null,...P&&{startHour:T()}})}else{let D=N.start;if(typeof _==="function"){let c=q{let S=B(_);if(!S){H("");return}let q="";if(typeof S==="string")q=P&&S.includes("T")?S.replace("T"," "):S;else if(S.start&&S.end){let N=P&&S.startHour!==void 0?`${S.start} ${String(S.startHour).padStart(2,"0")}:00`:S.start,D=P&&S.endHour!==void 0?`${S.end} ${String(S.endHour).padStart(2,"0")}:00`:S.end;q=`${N} - ${D}`}else if(S.start)q=`${P&&S.startHour!==void 0?`${S.start} ${String(S.startHour).padStart(2,"0")}:00`:S.start}...`;H(q)});let i=(S)=>{let q=Q();Q(new Date(q.getFullYear(),q.getMonth()+S,1))},s=(S)=>{let q=Q();Q(new Date(q.getFullYear()+S,q.getMonth(),1))},F=({value:S,onChange:q})=>{return Tag("div",{class:"flex-1"},[Tag("div",{class:"flex gap-2 items-center"},[Tag("input",{type:"range",min:0,max:23,value:S,class:"range range-xs flex-1",oninput:(N)=>{let D=parseInt(N.target.value);q(D)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(B(S)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[n({label:L,placeholder:A||(K()?"Seleccionar rango...":"Seleccionar fecha..."),value:H,readonly:!0,icon:z("icon-[lucide--calendar]"),onclick:(S)=>{S.stopPropagation(),J(!J())},...W}),If(J,()=>Tag("div",{class:"absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none",onclick:(S)=>S.stopPropagation()},[Tag("div",{class:"flex justify-between items-center mb-4 gap-1"},[Tag("div",{class:"flex gap-0.5"},[Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>s(-1)},z("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(-1)},z("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>Q().toLocaleString("es-ES",{month:"short",year:"numeric"})]),Tag("div",{class:"flex gap-0.5"},[Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(1)},z("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>s(1)},z("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>X(null)},[...["L","M","X","J","V","S","D"].map((S)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},S)),()=>{let S=Q(),q=S.getFullYear(),N=S.getMonth(),D=new Date(q,N,1).getDay(),c=D===0?6:D-1,$f=new Date(q,N+1,0).getDate(),Lf=[];for(let p=0;p{let m=B(_),Af=X(),I_=typeof m==="string"?m.split("T")[0]===j:m?.start===j,u_=m?.end===j,Wf=!1;if(K()&&m?.start){let Pf=m.start;if(!m.end&&Af)Wf=j>Pf&&j<=Af||j=Af;else if(m.end)Wf=j>Pf&&j{if(K())X(j)},onclick:()=>U(V_)},[p.toString()]))}return Lf}]),P?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[K()?Tag("div",{class:"flex gap-4"},[F({value:T,onChange:(S)=>{T(S);let q=B(_);if(q?.start)_({...q,startHour:S})}}),F({value:Y,onChange:(S)=>{Y(S);let q=B(_);if(q?.end)_({...q,endHour:S})}})]):F({value:T,onChange:(S)=>{T(S);let q=B(_);if(q&&typeof q==="string")_(q.split("T")[0]+"T"+String(S).padStart(2,"0")+":00:00")}})]):null])),If(J,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>J(!1)}))])};var xf={};R(xf,{Drawer:()=>yf});var yf=(f,M)=>{let{class:_,id:E,open:L,side:A,content:P,...W}=f,J=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...W,class:Z("drawer",_)},[Tag("input",{id:J,type:"checkbox",class:"drawer-toggle",checked:()=>typeof L==="function"?L():L,onchange:(Q)=>{if(typeof L==="function")L(Q.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof P==="function"?P():P]),Tag("div",{class:"drawer-side"},[Tag("label",{for:J,class:"drawer-overlay",onclick:()=>{if(typeof L==="function")L(!1)}}),Tag("div",{class:"min-h-full bg-base-200 w-80"},[typeof A==="function"?A():A])])])};var mf={};R(mf,{Dropdown:()=>uf});var u=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(u&&!u.contains(f.target))u.open=!1,u=null}),window.__dropdownHandlerRegistered=!0;var uf=(f)=>{let{class:M,label:_,icon:E,items:L,...A}=f;return Tag("details",{...A,class:Z("dropdown",M)},[Tag("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(P)=>{let W=P.currentTarget.closest("details");if(u&&u!==W)u.open=!1;setTimeout(()=>{u=W.open?W:null},0)}},[()=>E?typeof E==="function"?E():E:null,()=>_?typeof _==="function"?_():_:null]),Tag("ul",{tabindex:"-1",class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[()=>{return(typeof L==="function"?L():L||[]).map((W)=>Tag("li",{},[Tag("a",{class:W.class||"",onclick:(J)=>{if(W.onclick)W.onclick(J);let Q=J.currentTarget.closest("details");if(Q){if(Q.open=!1,u===Q)u=null}}},[W.icon?Tag("span",{},W.icon):null,Tag("span",{},W.label)])]))}])])};var gf={};R(gf,{Fab:()=>vf});var vf=(f)=>{let{class:M,icon:_,label:E,actions:L=[],position:A="bottom-6 right-6",...P}=f;return Tag("div",{...P,class:Z(`fab absolute ${A} flex flex-col-reverse items-end gap-3 z-[100]`,M)},[Tag("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[_?z(_):null,!_&&E?E:null]),...B(L).map((W)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[W.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},W.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${W.class||""}`,onclick:(J)=>{J.stopPropagation(),W.onclick?.(J)}},[W.icon?z(W.icon):W.text||""])]))])};var pf={};R(pf,{Fieldset:()=>cf});var cf=(f,M)=>{let{class:_,legend:E,...L}=f;return Tag("fieldset",{...L,class:Z("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",_)},[()=>{let A=B(E);return A?Tag("legend",{class:"fieldset-legend font-bold"},[A]):null},M])};var rf={};R(rf,{Fileinput:()=>bf});var bf=(f)=>{let{class:M,tooltip:_,max:E=2,accept:L="*",onselect:A,...P}=f,W=$([]),J=$(!1),Q=$(null),X=E*1024*1024,T=(K)=>{let G=Array.from(K);if(Q(null),G.find((h)=>h.size>X)){Q(`Máx ${E}MB`);return}W([...W(),...G]),A?.(W())},Y=(K)=>{let G=W().filter((C,h)=>h!==K);W(G),A?.(G)};return Tag("fieldset",{...P,class:Z("fieldset w-full p-0",M)},[Tag("div",{class:()=>`w-full ${_?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":_},[Tag("label",{class:()=>` +(()=>{var{defineProperty:Af,getOwnPropertyNames:P_,getOwnPropertyDescriptor:A_}=Object,Q_=Object.prototype.hasOwnProperty;function X_(f){return this[f]}var G_=(f)=>{var L=(lf??=new WeakMap).get(f),E;if(L)return L;if(L=Af({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function"){for(var W of P_(f))if(!Q_.call(L,W))Af(L,W,{get:X_.bind(f,W),enumerable:!(E=A_(f,W))||E.enumerable})}return lf.set(f,L),L},lf;var K_=(f)=>f;function Z_(f,L){this[f]=K_.bind(null,L)}var U=(f,L)=>{for(var E in L)Af(f,E,{get:L[E],enumerable:!0,configurable:!0,set:Z_.bind(L,E)})};var a_={};U(a_,{Utils:()=>W_,Components:()=>L_});var Bf={};U(Bf,{Accordion:()=>U_});var T=(f)=>typeof f==="function",Gf=(f)=>f&&typeof f==="object",l=Array.isArray,u=typeof document<"u"?document:null,tf=(f)=>f?._isRuntime?f.container:f instanceof Node?f:u.createTextNode(f==null?"":String(f)),k=null,y=null,o=!1,_f=0,Ef=new Set,sf=new WeakMap,Qf=Symbol("iter"),Xf=new WeakMap,n=(f)=>{if(!f||f._disposed)return;f._disposed=!0;let L=[f];while(L.length){let E=L.pop();if(E._cleanups)E._cleanups.forEach((W)=>W()),E._cleanups.clear();if(E._children)E._children.forEach((W)=>L.push(W)),E._children.clear();if(E._deps)E._deps.forEach((W)=>W.delete(E)),E._deps.clear()}},B_=(f)=>{if(y)(y._mounts||=[]).push(f)},p=(f)=>{if(y)(y._cleanups||=new Set).add(f)},Y_=(f)=>{let L=k;k=null;try{return f()}finally{k=L}},a=(f,L=!1)=>{let E=()=>{if(E._disposed)return;if(E._deps)E._deps.forEach((Q)=>Q.delete(E));if(E._cleanups)E._cleanups.forEach((Q)=>Q()),E._cleanups.clear();let W=k,J=y;k=y=E;try{return E._result=f()}catch(Q){console.error("[SigPro]",Q)}finally{k=W,y=J}};if(E._deps=E._cleanups=E._children=null,E._disposed=!1,E._isComputed=L,E._depth=k?k._depth+1:0,E._mounts=[],E._parent=y,y)(y._children||=new Set).add(E);return E},af=()=>{if(o)return;o=!0;let f=Array.from(Ef).sort((L,E)=>L._depth-E._depth);Ef.clear();for(let L of f)if(!L._disposed)L();o=!1},q_=(f)=>{_f++;try{return f()}finally{if(_f--,_f===0&&Ef.size>0&&!o)af()}},v=(f,L=!1)=>{if(!L&&k&&!k._disposed)f.add(k),(k._deps||=new Set).add(f);else if(L&&f.size>0){let E=!1;for(let W of f){if(W===k||W._disposed)continue;if(W._isComputed){if(W._dirty=!0,W._subs)v(W._subs,!0)}else Ef.add(W),E=!0}if(E&&!o&&_f===0)queueMicrotask(af)}},V=(f,L=null)=>{let E=new Set;if(T(f)){let W,J=()=>{if(J._dirty){let Q=k;k=J;try{let P=f();if(!Object.is(W,P))W=P,v(E,!0)}finally{k=Q}J._dirty=!1}return v(E),W};if(J._isComputed=!0,J._subs=E,J._dirty=!0,J._deps=null,J._disposed=!1,J.stop=()=>{},y)p(J.stop);return J}if(L)try{f=JSON.parse(localStorage.getItem(L))??f}catch(W){}return(...W)=>{if(W.length){let J=T(W[0])?W[0](f):W[0];if(!Object.is(f,J)){if(f=J,L)localStorage.setItem(L,JSON.stringify(f));v(E,!0)}}return v(E),f}},ef=(f)=>{if(!Gf(f))return f;let L=sf.get(f);if(L)return L;let E=new Map,W=(J)=>{let Q=E.get(J);if(!Q)E.set(J,Q=new Set);return Q};return L=new Proxy(f,{get(J,Q,P){if(typeof Q!=="symbol")v(W(Q));return ef(Reflect.get(J,Q,P))},set(J,Q,P,A){let X=!Reflect.has(J,Q),G=Reflect.get(J,Q,A),Z=Reflect.set(J,Q,P,A);if(Z&&!Object.is(G,P)){if(v(W(Q),!0),X)v(W(Qf),!0)}return Z},deleteProperty(J,Q){let P=Reflect.deleteProperty(J,Q);if(P)v(W(Q),!0),v(W(Qf),!0);return P},ownKeys(J){return v(W(Qf)),Reflect.ownKeys(J)}}),sf.set(f,L),L},b=(f,L)=>{if(L===void 0){let W=a(f);return W(),()=>n(W)}let E=a(()=>{let W=Array.isArray(f)?f.map((J)=>J()):f();Y_(()=>L(W))});return E(),()=>n(E)},Kf=(f)=>{if(f._cleanups)f._cleanups.forEach((L)=>L()),f._cleanups.clear();if(f._ownerEffect)n(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Kf)},z_=/^\s*(javascript|data|vbscript):/i,C_=(f)=>f==="src"||f==="href"||f.startsWith("on"),of=(f,L)=>{if(L==null||L===!1)return null;if(C_(f)){let E=String(L);if(z_.test(E))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return L},_=(f,L={},E=[])=>{if(L instanceof Node||l(L)||!Gf(L))E=L,L={};if(T(f)){let P={_mounts:[],_cleanups:new Set},A=a(()=>{let K=f(L,{children:E,emit:(R,...z)=>L[`on${R[0].toUpperCase()}${R.slice(1)}`]?.(...z)});return A._result=K,K});A();let X=A._result;if(X==null)return null;let G=X instanceof Node||l(X)&&X.every((K)=>K instanceof Node)?X:u.createTextNode(String(X)),Z=(K)=>{if(Gf(K)&&!K._isRuntime)K._mounts=A._mounts||[],K._cleanups=A._cleanups||new Set,K._ownerEffect=A};return l(G)?G.forEach(Z):Z(G),G}let W=/^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(f),J=W?u.createElementNS("http://www.w3.org/2000/svg",f):u.createElement(f);J._cleanups=new Set;for(let P in L){if(!L.hasOwnProperty(P))continue;let A=L[P];if(P==="ref"){T(A)?A(J):A.current=J;continue}if(W&&P.startsWith("xlink:")){val==null?J.removeAttributeNS("http://www.w3.org/1999/xlink",P.slice(6)):J.setAttributeNS("http://www.w3.org/1999/xlink",P.slice(6),val);continue}if(P.startsWith("on")){let X=P.slice(2).toLowerCase();J.addEventListener(X,A);let G=()=>J.removeEventListener(X,A);J._cleanups.add(G),p(G)}else if(T(A)){let X=a(()=>{let G=of(P,A());if(P==="class")J.className=G||"";else if(G==null)J.removeAttribute(P);else if(P in J&&!W)J[P]=G;else J.setAttribute(P,G===!0?"":G)});if(X(),J._cleanups.add(()=>n(X)),p(()=>n(X)),/^(INPUT|TEXTAREA|SELECT)$/.test(J.tagName)&&(P==="value"||P==="checked")){let G=P==="checked"?"change":"input";J.addEventListener(G,(Z)=>A(Z.target[P]))}}else{let X=of(P,A);if(X!=null)if(P in J&&!W)J[P]=X;else J.setAttribute(P,X===!0?"":X)}}let Q=(P)=>{if(l(P))return P.forEach(Q);if(T(P)){let A=u.createTextNode("");J.appendChild(A);let X=[],G=a(()=>{let Z=P(),K=(l(Z)?Z:[Z]).map(tf);X.forEach((z)=>{if(z._isRuntime)z.destroy();else Kf(z);if(z.parentNode)z.remove()});let R=A;for(let z=K.length-1;z>=0;z--){let B=K[z];if(B.parentNode!==R.parentNode)R.parentNode?.insertBefore(B,R);if(B._mounts)B._mounts.forEach((S)=>S());R=B}X=K});G(),J._cleanups.add(()=>n(G)),p(()=>n(G))}else{let A=tf(P);if(J.appendChild(A),A._mounts)A._mounts.forEach((X)=>X())}};return Q(E),J},t=(f)=>{let L=new Set,E=[],W=y,J=k,Q=u.createElement("div");Q.style.display="contents",Q.setAttribute("role","presentation"),y={_cleanups:L,_mounts:E},k=null;let P=(A)=>{if(!A)return;if(A._isRuntime)L.add(A.destroy),Q.appendChild(A.container);else if(l(A))A.forEach(P);else Q.appendChild(A instanceof Node?A:u.createTextNode(String(A==null?"":A)))};try{P(f({onCleanup:(A)=>L.add(A)}))}finally{y=W,k=J}return E.forEach((A)=>A()),{_isRuntime:!0,container:Q,destroy:()=>{L.forEach((A)=>A()),Kf(Q),Q.remove()}}},j=(f,L,E=null)=>{let W=u.createTextNode(""),J=_("div",{style:"display:contents"},[W]),Q=null;return b(()=>!!(T(f)?f():f),(P)=>{if(Q)Q.destroy(),Q=null;let A=P?L:E;if(A)Q=t(()=>T(A)?A():A),J.insertBefore(Q.container,W)}),p(()=>Q?.destroy()),J},w=(f,L,E)=>{let W=u.createTextNode(""),J=_("div",{style:"display:contents"},[W]),Q=new Map;return b(()=>(T(f)?f():f)||[],(P)=>{let A=new Map,X=[],G=P||[];for(let K=0;KL(R,K));else Q.delete(z);A.set(z,B),X.push(B)}Q.forEach((K)=>K.destroy());let Z=W;for(let K=X.length-1;K>=0;K--){let R=X[K].container;if(R.nextSibling!==Z)J.insertBefore(R,Z);Z=R}Q=A}),J},s=(f)=>{let L=()=>window.location.hash.slice(1)||"/",E=V(L()),W=()=>E(L());window.addEventListener("hashchange",W),p(()=>window.removeEventListener("hashchange",W));let J=_("div",{class:"router-hook"}),Q=null;return b([E],()=>{let P=E(),A=f.find((X)=>{let G=X.path.split("/").filter(Boolean),Z=P.split("/").filter(Boolean);return G.length===Z.length&&G.every((K,R)=>K[0]===":"||K===Z[R])})||f.find((X)=>X.path==="*");if(A){Q?.destroy();let X={};A.path.split("/").filter(Boolean).forEach((G,Z)=>{if(G[0]===":")X[G.slice(1)]=P.split("/").filter(Boolean)[Z]}),s.params(X),Q=t(()=>T(A.component)?A.component(X):A.component),J.replaceChildren(Q.container)}}),J};s.params=V({});s.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");s.back=()=>window.history.back();s.path=()=>window.location.hash.replace(/^#/,"")||"/";var R_=(f,L,{enter:E,leave:W}={})=>{let J=_("div",{style:"display:contents"}),Q=null,P=(A,X)=>{let G=!1,Z=()=>!G&&(G=!0,X());if(!A)return Z();"transitionend animationend".split(" ").map((K)=>A.addEventListener(K,Z,{once:!0})),setTimeout(Z,500)};return b(f,(A)=>{if(A&&!Q){let X=(Q=t(L)).container.firstChild;if(J.appendChild(Q.container),E&&X)X.classList.add(E),X.clientTop,X.classList.add(E+"-active"),P(X,()=>X.classList.remove(E,E+"-active"))}else if(!A&&Q){let X=Q.container.firstChild,G=()=>(Q?.destroy(),Q=null);W&&X?(X.classList.add(W),P(X,G)):G()}}),p(()=>Q?.destroy()),J},Zf=(f,L)=>{let E=typeof L==="string"?u.querySelector(L):L;if(!E)return;if(Xf.has(E))Xf.get(E).destroy();let W=t(T(f)?f:()=>f);return E.replaceChildren(W.container),Xf.set(E,W),W},S_=Object.freeze({$:V,$$:ef,Watch:b,Tag:_,Render:t,If:j,For:w,Router:s,Mount:Zf,onMount:B_,onUnmount:p,Anim:R_,Batch:q_});if(typeof window<"u")Object.assign(window,S_),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((f)=>{let L=f[0].toUpperCase()+f.slice(1);window[L]=(E,W)=>_(f,E,W)});var Y=(f)=>typeof f==="function"?f():f,q=(f,L)=>typeof L==="function"?()=>`${f} ${L()||""}`.trim():`${f} ${L||""}`.trim(),h=(f)=>{if(!f)return null;if(typeof f==="function")return _("span",{class:"mr-1"},f());if(typeof f==="object")return _("span",{class:"mr-1"},f);if(typeof f==="string"){let L=f.trim().split(/\s+/),E=L[L.length-1]==="right",W=E?L.slice(0,-1).join(" "):f,J=E?"ml-1":"mr-1";if(W&&!W.startsWith("icon-[")&&!W.includes("--"))return _("span",{class:J},W);return _("span",{class:`${W} ${J}`.trim()})}return null},N_={es:{close:"Cerrar",confirm:"Confirmar",cancel:"Cancelar",search:"Buscar...",loading:"Cargando...",nodata:"Sin datos"},en:{close:"Close",confirm:"Confirm",cancel:"Cancel",search:"Search...",loading:"Loading...",nodata:"No data"}},f_=V("es"),__=(f)=>f_(f),E_=(f)=>()=>N_[f_()][f]||f;var U_=(f,L)=>{let{class:E,title:W,name:J,open:Q,...P}=f;return _("div",{...P,class:q("collapse collapse-arrow bg-base-200 mb-2",E)},[_("input",{type:J?"radio":"checkbox",name:J,checked:Y(Q)}),_("div",{class:"collapse-title text-xl font-medium"},W),_("div",{class:"collapse-content"},L)])};var Yf={};U(Yf,{Alert:()=>h_});var h_=(f,L)=>{let{class:E,actions:W,type:J="info",soft:Q=!0,...P}=f,A={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},Z=[`alert-${J}`,Q?"alert-soft":"",E].filter(Boolean).join(" "),K=L||f.message;return _("div",{...P,role:"alert",class:q("alert",Z)},()=>[h(A[J]),_("div",{class:"flex-1"},[_("span",{},[typeof K==="function"?K():K])]),W?_("div",{class:"flex-none"},[typeof W==="function"?W():W]):null].filter(Boolean))};var zf={};U(zf,{Autocomplete:()=>V_});var qf={};U(qf,{Input:()=>e});var e=(f)=>{let{class:L,value:E,type:W="text",icon:J,oninput:Q,placeholder:P,disabled:A,validate:X,label:G,...Z}=f,K=W==="password",R=$(!1),z=$(null),B={text:"icon-[lucide--text]",password:"icon-[lucide--lock]",date:"icon-[lucide--calendar]",number:"icon-[lucide--hash]",email:"icon-[lucide--mail]",search:"icon-[lucide--search]",tel:"icon-[lucide--phone]",url:"icon-[lucide--link]"},S=J?h(J):B[W]?h(B[W]):null,D=()=>h(R()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),F=S?"pl-10":"",I=K?"pr-10":"",r=()=>{if(L?.includes("input-xs"))return"btn-xs";if(L?.includes("input-sm"))return"btn-sm";if(L?.includes("input-lg"))return"btn-lg";return"btn-md"},i=(O)=>{let g=O.target.value;if(X){let Lf=X(g);z(Lf||null)}Q?.(O)},M=()=>z()&&z()!=="",N=_("input",{...Z,type:()=>K?R()?"text":"password":W,placeholder:P||(G?" ":P),class:()=>{let O=`input w-full ${F} ${I}`;if(L)O+=` ${L}`;if(M())O+=" input-error";return O.trim()},value:E,oninput:i,disabled:()=>Y(A),"aria-invalid":()=>M()?"true":"false"}),H=()=>[N,S?_("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},S):null,K?_("button",{type:"button",class:q("absolute right-3 inset-y-0 flex items-center","btn btn-ghost btn-circle opacity-50 hover:opacity-100",r()),onclick:(O)=>{O.preventDefault(),R(!R())}},()=>D()):null,_("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>M()?z():null)];if(G)return _("label",{class:q("floating-label w-full",L)},()=>[_("div",{class:"relative w-full"},H),_("span",{},Y(G))]);return _("div",{class:"relative w-full"},H)};var V_=(f)=>{let{class:L,items:E=[],value:W,onselect:J,label:Q,placeholder:P,...A}=f,X=V(Y(W)||""),G=V(!1),Z=V(-1),K=V([]);Watch(()=>{let B=String(X()).toLowerCase(),S=Y(E)||[],D=B?S.filter((F)=>(typeof F==="string"?F:F.label).toLowerCase().includes(B)):S;K(D)});let R=(B)=>{let S=typeof B==="string"?B:B.value,D=typeof B==="string"?B:B.label;if(X(D),typeof W==="function")W(S);J?.(B),G(!1),Z(-1)};return _("div",{class:"relative w-full"},[e({label:Q,class:L,placeholder:P,value:X,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:(B)=>{let S=K();if(B.key==="ArrowDown")B.preventDefault(),G(!0),Z(Math.min(Z()+1,S.length-1));else if(B.key==="ArrowUp")B.preventDefault(),Z(Math.max(Z()-1,0));else if(B.key==="Enter"&&Z()>=0)B.preventDefault(),R(S[Z()]);else if(B.key==="Escape")G(!1)},oninput:(B)=>{let S=B.target.value;if(X(S),typeof W==="function")W(S);G(!0),Z(-1)},...A}),_("ul",{class:"absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50",style:()=>G()&&K().length?"display:block":"display:none"},[w(K,(B,S)=>_("li",{},[_("a",{class:()=>`block w-full ${Z()===S?"active bg-primary text-primary-content":""}`,onclick:()=>R(B),onmouseenter:()=>Z(S)},typeof B==="string"?B:B.label)]),(B,S)=>(typeof B==="string"?B:B.value)+S),()=>K().length?null:_("li",{class:"p-2 text-center opacity-50"},"nodata")])])};var Cf={};U(Cf,{Badge:()=>D_});var D_=(f,L)=>{let{class:E,...W}=f;return _("span",{...W,class:q("badge",E)},L)};var Rf={};U(Rf,{Button:()=>ff});var ff=(f,L)=>{let{class:E,loading:W,icon:J,...Q}=f,P=h(J);return _("button",{...Q,class:q("btn",E),disabled:()=>Y(W)||Y(f.disabled)},()=>[Y(W)&&_("span",{class:"loading loading-spinner"}),P,L].filter(Boolean))};var Sf={};U(Sf,{Checkbox:()=>O_});var O_=(f)=>{let{class:L,value:E,toggle:W,label:J,...Q}=f,P=_("input",{...Q,type:"checkbox",class:()=>q(Y(W)?"toggle":"checkbox",L),checked:E});return _("label",{class:"label cursor-pointer justify-start gap-3"},[P,J?_("span",{class:"label-text"},J):null])};var Nf={};U(Nf,{Colorpicker:()=>H_});var H_=(f)=>{let{class:L,value:E,label:W,...J}=f,Q=V(!1),P=["#000","#1A1A1A","#333","#4D4D4D","#666","#808080","#B3B3B3","#FFF","#450a0a","#7f1d1d","#991b1b","#b91c1c","#dc2626","#ef4444","#f87171","#fca5a5","#431407","#7c2d12","#9a3412","#c2410c","#ea580c","#f97316","#fb923c","#ffedd5","#713f12","#a16207","#ca8a04","#eab308","#facc15","#fde047","#fef08a","#fff9c4","#064e3b","#065f46","#059669","#10b981","#34d399","#4ade80","#84cc16","#d9f99d","#082f49","#075985","#0284c7","#0ea5e9","#38bdf8","#7dd3fc","#22d3ee","#cffafe","#1e1b4b","#312e81","#4338ca","#4f46e5","#6366f1","#818cf8","#a5b4fc","#e0e7ff","#2e1065","#4c1d95","#6d28d9","#7c3aed","#8b5cf6","#a855f7","#d946ef","#fae8ff"],A=()=>Y(E)||"#000000";return _("div",{class:q("relative w-fit",L)},[_("button",{type:"button",class:"btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case",onclick:(X)=>{X.stopPropagation(),Q(!Q())},...J},[_("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${A()}`}),W?_("span",{class:"opacity-80"},W):null]),j(Q,()=>_("div",{class:"absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none",onclick:(X)=>X.stopPropagation()},[_("div",{class:"grid grid-cols-8 gap-1"},P.map((X)=>_("button",{type:"button",style:`background-color: ${X}`,class:()=>{return`size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 + ${A().toLowerCase()===X.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof E==="function")E(X);Q(!1)}})))])),j(Q,()=>_("div",{class:"fixed inset-0 z-[100]",onclick:()=>Q(!1)}))])};var Uf={};U(Uf,{Datepicker:()=>k_});var k_=(f)=>{let{class:L,value:E,range:W,label:J,placeholder:Q,hour:P=!1,...A}=f,X=V(!1),G=V(new Date),Z=V(null),K=V(0),R=V(0),z=()=>Y(W)===!0,B=new Date,S=`${B.getFullYear()}-${String(B.getMonth()+1).padStart(2,"0")}-${String(B.getDate()).padStart(2,"0")}`,D=(C)=>{let N=C.getFullYear(),H=String(C.getMonth()+1).padStart(2,"0"),O=String(C.getDate()).padStart(2,"0");return`${N}-${H}-${O}`},F=(C)=>{let N=D(C),H=Y(E);if(z())if(!H?.start||H.start&&H.end){if(typeof E==="function")E({start:N,end:null,...P&&{startHour:K()}})}else{let O=H.start;if(typeof E==="function"){let g=N{let C=Y(E);if(!C){I("");return}let N="";if(typeof C==="string")N=P&&C.includes("T")?C.replace("T"," "):C;else if(C.start&&C.end){let H=P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start,O=P&&C.endHour!==void 0?`${C.end} ${String(C.endHour).padStart(2,"0")}:00`:C.end;N=`${H} - ${O}`}else if(C.start)N=`${P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start}...`;I(N)});let r=(C)=>{let N=G();G(new Date(N.getFullYear(),N.getMonth()+C,1))},i=(C)=>{let N=G();G(new Date(N.getFullYear()+C,N.getMonth(),1))},M=({value:C,onChange:N})=>{return _("div",{class:"flex-1"},[_("div",{class:"flex gap-2 items-center"},[_("input",{type:"range",min:0,max:23,value:C,class:"range range-xs flex-1",oninput:(H)=>{let O=parseInt(H.target.value);N(O)}}),_("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(Y(C)).padStart(2,"0")+":00")])])};return _("div",{class:q("relative w-full",L)},[e({label:J,placeholder:Q||(z()?"Seleccionar rango...":"Seleccionar fecha..."),value:I,readonly:!0,icon:h("icon-[lucide--calendar]"),onclick:(C)=>{C.stopPropagation(),X(!X())},...A}),j(X,()=>_("div",{class:"absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none",onclick:(C)=>C.stopPropagation()},[_("div",{class:"flex justify-between items-center mb-4 gap-1"},[_("div",{class:"flex gap-0.5"},[_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(-1)},h("icon-[lucide--chevrons-left]")),_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(-1)},h("icon-[lucide--chevron-left]"))]),_("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().toLocaleString("es-ES",{month:"short",year:"numeric"})]),_("div",{class:"flex gap-0.5"},[_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(1)},h("icon-[lucide--chevron-right]")),_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(1)},h("icon-[lucide--chevrons-right]"))])]),_("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>Z(null)},[...["L","M","X","J","V","S","D"].map((C)=>_("div",{class:"text-[10px] opacity-40 font-bold text-center"},C)),()=>{let C=G(),N=C.getFullYear(),H=C.getMonth(),O=new Date(N,H,1).getDay(),g=O===0?6:O-1,Lf=new Date(N,H+1,0).getDate(),Wf=[];for(let c=0;c{let d=Y(E),$f=Z(),$_=typeof d==="string"?d.split("T")[0]===x:d?.start===x,J_=d?.end===x,Jf=!1;if(z()&&d?.start){let Pf=d.start;if(!d.end&&$f)Jf=x>Pf&&x<=$f||x=$f;else if(d.end)Jf=x>Pf&&x{if(z())Z(x)},onclick:()=>F(rf)},[c.toString()]))}return Wf}]),P?_("div",{class:"mt-3 pt-2 border-t border-base-300"},[z()?_("div",{class:"flex gap-4"},[M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N?.start)E({...N,startHour:C})}}),M({value:R,onChange:(C)=>{R(C);let N=Y(E);if(N?.end)E({...N,endHour:C})}})]):M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N&&typeof N==="string")E(N.split("T")[0]+"T"+String(C).padStart(2,"0")+":00:00")}})]):null])),j(X,()=>_("div",{class:"fixed inset-0 z-[90]",onclick:()=>X(!1)}))])};var hf={};U(hf,{Drawer:()=>F_});var F_=(f,L)=>{let{class:E,id:W,open:J,side:Q,content:P,...A}=f,X=W||`drawer-${Math.random().toString(36).slice(2,9)}`;return _("div",{...A,class:q("drawer",E)},[_("input",{id:X,type:"checkbox",class:"drawer-toggle",checked:()=>typeof J==="function"?J():J,onchange:(G)=>{if(typeof J==="function")J(G.target.checked)}}),_("div",{class:"drawer-content"},[typeof P==="function"?P():P]),_("div",{class:"drawer-side"},[_("label",{for:X,class:"drawer-overlay",onclick:()=>{if(typeof J==="function")J(!1)}}),_("div",{class:"min-h-full bg-base-200 w-80"},[typeof Q==="function"?Q():Q])])])};var Vf={};U(Vf,{Dropdown:()=>y_});var m=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(m&&!m.contains(f.target))m.open=!1,m=null}),window.__dropdownHandlerRegistered=!0;var y_=(f)=>{let{class:L,label:E,icon:W,items:J,...Q}=f;return _("details",{...Q,class:q("dropdown",L)},[_("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(P)=>{let A=P.currentTarget.closest("details");if(m&&m!==A)m.open=!1;setTimeout(()=>{m=A.open?A:null},0)}},[()=>W?typeof W==="function"?W():W:null,()=>E?typeof E==="function"?E():E:null]),_("ul",{tabindex:"-1",class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[()=>{return(typeof J==="function"?J():J||[]).map((A)=>_("li",{},[_("a",{class:A.class||"",onclick:(X)=>{if(A.onclick)A.onclick(X);let G=X.currentTarget.closest("details");if(G){if(G.open=!1,m===G)m=null}}},[A.icon?_("span",{},A.icon):null,_("span",{},A.label)])]))}])])};var Df={};U(Df,{Fab:()=>w_});var w_=(f)=>{let{class:L,icon:E,label:W,actions:J=[],position:Q="bottom-6 right-6",...P}=f;return _("div",{...P,class:q(`fab absolute ${Q} flex flex-col-reverse items-end gap-3 z-[100]`,L)},[_("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[E?h(E):null,!E&&W?W:null]),...Y(J).map((A)=>_("div",{class:"flex items-center gap-3 transition-all duration-300"},[A.label?_("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},A.label):null,_("button",{type:"button",class:`btn btn-circle shadow-lg ${A.class||""}`,onclick:(X)=>{X.stopPropagation(),A.onclick?.(X)}},[A.icon?h(A.icon):A.text||""])]))])};var Of={};U(Of,{Fieldset:()=>M_});var M_=(f,L)=>{let{class:E,legend:W,...J}=f;return _("fieldset",{...J,class:q("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",E)},[()=>{let Q=Y(W);return Q?_("legend",{class:"fieldset-legend font-bold"},[Q]):null},L])};var Hf={};U(Hf,{Fileinput:()=>j_});var j_=(f)=>{let{class:L,tooltip:E,max:W=2,accept:J="*",onselect:Q,...P}=f,A=V([]),X=V(!1),G=V(null),Z=W*1024*1024,K=(z)=>{let B=Array.from(z);if(G(null),B.find((D)=>D.size>Z)){G(`Máx ${W}MB`);return}A([...A(),...B]),Q?.(A())},R=(z)=>{let B=A().filter((S,D)=>D!==z);A(B),Q?.(B)};return _("fieldset",{...P,class:q("fieldset w-full p-0",L)},[_("div",{class:()=>`w-full ${E?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":E},[_("label",{class:()=>` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-200 - ${J()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} - `,ondragover:(K)=>{K.preventDefault(),J(!0)},ondragleave:()=>J(!1),ondrop:(K)=>{K.preventDefault(),J(!1),T(K.dataTransfer.files)}},[Tag("div",{class:"flex items-center gap-3 w-full"},[z("icon-[lucide--upload]"),Tag("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),Tag("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${E}MB`)]),Tag("input",{type:"file",multiple:!0,accept:L,class:"hidden",onchange:(K)=>T(K.target.files)})])]),()=>Q()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},Q()):null,If(()=>W().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(W,(K,G)=>Tag("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[Tag("div",{class:"flex items-center gap-2 truncate"},[Tag("span",{class:"opacity-50"},"\uD83D\uDCC4"),Tag("span",{class:"truncate font-medium max-w-[200px]"},K.name),Tag("span",{class:"text-[9px] opacity-40"},`(${(K.size/1024).toFixed(0)} KB)`)]),Tag("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(C)=>{C.preventDefault(),C.stopPropagation(),Y(G)}},[z("icon-[lucide--x]")])]),(K)=>K.name+K.lastModified)]))])};var nf={};R(nf,{Indicator:()=>df});var df=(f,M)=>{let{value:_,class:E,...L}=f;return Tag("div",{...L,class:"indicator"},()=>[_?Tag("span",{class:Z("indicator-item badge",E)},()=>typeof _==="function"?_():_):null,M].filter(Boolean))};var sf={};R(sf,{Label:()=>of});var of=(f)=>{let{children:M,value:_,floating:E=!1,class:L,...A}=f;if(E)return Tag("label",{class:Z("floating-label",L),...A},()=>[typeof M==="function"?M():M,_?Tag("span",{},B(_)):null]);return Tag("label",{class:Z("label",L),...A},()=>[_?Tag("span",{class:"label-text"},B(_)):null,typeof M==="function"?M():M])};var tf={};R(tf,{List:()=>lf});var lf=(f)=>{let{class:M,items:_,header:E,render:L=(J)=>J,keyFn:A=(J,Q)=>J.id??Q,...P}=f,W=For(_,(J,Q)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[L(J,Q)])]),A);return Tag("ul",{...P,style:"display: block; width: 100%;",class:Z("list bg-base-100 rounded-box shadow-md",M)},E?[If(E,()=>Tag("li",{class:"p-4 pb-2 text-xs opacity-60",style:"width: 100%;"},[B(E)])),W]:W)};var ef={};R(ef,{Menu:()=>af});var af=(f)=>{let{class:M,items:_,...E}=f,L=(A)=>For(()=>A||[],(P)=>Tag("li",{},[P.children?Tag("details",{open:P.open},[Tag("summary",{},[P.icon&&Tag("span",{class:"mr-2"},P.icon),P.label]),Tag("ul",{},L(P.children))]):Tag("a",{class:()=>B(P.active)?"active":"",onclick:P.onclick},[P.icon&&Tag("span",{class:"mr-2"},P.icon),P.label])]),(P,W)=>P.label||W);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},L(_))};var __={};R(__,{Modal:()=>f_});var f_=(f,M)=>{let{class:_,title:E,buttons:L,open:A,...P}=f,W=null,J=()=>{let X=typeof A==="function"?A():A;if(!W)return;if(X){if(!W.open)W.showModal()}else if(W.open)W.close()};Watch(()=>J());let Q=()=>{if(typeof A==="function")A(!1)};return Tag("dialog",{...P,ref:(X)=>{if(W=X,X)J()},class:Z("modal",_),onclose:Q,oncancel:Q},[Tag("div",{class:"modal-box"},[E?Tag("h3",{class:"text-lg font-bold mb-4"},()=>typeof E==="function"?E():E):null,Tag("div",{class:"py-2"},[typeof M==="function"?M():M]),Tag("div",{class:"modal-action"},[Tag("form",{method:"dialog",class:"flex gap-2"},[...(Array.isArray(L)?L:[L]).filter(Boolean),o({type:"submit"},x("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var E_={};R(E_,{Navbar:()=>M_});var M_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var L_={};R(L_,{Radio:()=>$_});var $_=(f)=>{let{class:M,label:_,tooltip:E,value:L,inputValue:A,name:P,...W}=f,J=Tag("input",{...W,type:"radio",name:P,class:Z("radio",M),checked:()=>B(L)===A,onclick:()=>{if(typeof L==="function")L(A)}});if(!_&&!E)return J;let Q=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[J,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},Q):Q};var W_={};R(W_,{Range:()=>A_});var A_=(f)=>{let{class:M,label:_,tooltip:E,value:L,...A}=f,P=Tag("input",{...A,type:"range",class:Z("range",M),value:L,disabled:()=>B(f.disabled)});if(!_&&!E)return P;let W=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,P]);return E?Tag("div",{class:"tooltip","data-tip":E},W):W};var J_={};R(J_,{Rating:()=>P_});var P_=(f)=>{let{class:M,value:_,count:E=5,mask:L="mask-star",readonly:A=!1,onchange:P,...W}=f,J=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...W,class:()=>Z(`rating ${B(A)?"pointer-events-none":""}`,M)},Array.from({length:B(E)},(Q,X)=>{let T=X+1;return Tag("input",{type:"radio",name:J,class:`mask ${L}`,checked:()=>Math.round(B(_))===T,onchange:()=>{if(!B(A)){if(typeof P==="function")P(T);else if(typeof _==="function")_(T)}}})}))};var T_={};R(T_,{Select:()=>Q_});var Q_=(f)=>{let{class:M,label:_,items:E,value:L,...A}=f,P=Tag("select",{...A,class:Z("select select-bordered w-full",M),value:L},For(()=>B(E)||[],(W)=>Tag("option",{value:W.value,$selected:()=>String(B(L))===String(W.value)},W.label),(W)=>W.value));if(!_)return P;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),P])};var G_={};R(G_,{Stack:()=>B_});var B_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var Z_={};R(Z_,{Stat:()=>X_});var X_=(f)=>{let{class:M,icon:_,label:E,value:L,desc:A,...P}=f;return Tag("div",{...P,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>B(L)??L),A&&Tag("div",{class:"stat-desc"},A)])};var S_={};R(S_,{Swap:()=>K_});var K_=(f)=>{let{class:M,value:_,on:E,off:L,...A}=f;return Tag("label",{...A,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>B(_),onclick:(P)=>{if(typeof _==="function")_(P.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},L)])};var C_={};R(C_,{Table:()=>Y_});var Y_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:L,zebra:A=!1,pinRows:P=!1,empty:W=x("nodata")(),...J}=f,Q=()=>{let T=B(A)?"table-zebra":"",Y=B(P)?"table-pin-rows":"";return Z("table",M,T,Y)},X=L||((T,Y)=>T.id||Y);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...J,class:Q},[Tag("thead",{},[Tag("tr",{},E.map((T)=>Tag("th",{class:T.class||""},T.label)))]),Tag("tbody",{},[For(_,(T,Y)=>{let K=()=>{let G=B(_),C=X(T,Y);return G.find((h,U)=>X(h,U)===C)||T};return Tag("tr",{class:"hover"},E.map((G)=>{let C=()=>{let h=K();if(G.render)return G.render(h,Y);return B(h[G.key])};return Tag("td",{class:G.class||""},[C])}))},X),If(()=>B(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[B(W)])]))])])])};var R_={};R(R_,{Tabs:()=>q_});var q_=(f)=>{let{items:M,class:_,onTabClose:E,...L}=f,A=typeof M==="function"?M:()=>M||[],P=d(0);v(()=>{let Q=A().findIndex((X)=>B(X.active)===!0);if(Q!==-1&&P()!==Q)P(Q)});let W=(J,Q)=>{if(Q.onClose)Q.onClose(Q);if(E)E(Q,J);let T=A().filter((G,C)=>C!==J);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(T),T.length===0)return;let K=P();if(J{let J=A(),Q=[];for(let X=0;X{q.stopPropagation(),W(X,T)};let S=k("span",{class:"flex items-center"},[K,F]);G.push(S)}else G.push(K);let C=k("button",{class:()=>Z("tab",P()===X?"tab-active":""),onclick:(F)=>{if(F.preventDefault(),!B(T.disabled)){if(T.onclick)T.onclick();P(X)}}},G),h=T.tip?k("div",{class:"tooltip","data-tip":T.tip},C):C;Q.push(h);let U,H=B(T.content);if(typeof H==="function")U=H();else if(H instanceof Node)U=H;else U=document.createTextNode(String(H));let i=k("div",{class:"tab-content-inner"},U),s=k("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>P()===X?"display: block":"display: none"},i);Q.push(s)}return Q})};var h_={};R(h_,{Timeline:()=>z_});var z_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:L=!1,...A}=f,P={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return Tag("ul",{...A,class:()=>Z(`timeline ${B(E)?"timeline-vertical":"timeline-horizontal"} ${B(L)?"timeline-compact":""}`,M)},()=>{let W=(typeof _==="function"?_():_)||[];return W.map((J,Q)=>{let X=Q===0,T=Q===W.length-1,Y=J.type||"success",K=()=>B(J.completed),G=()=>Q>0&&B(W[Q-1].completed),C=(h)=>typeof h==="function"?h():h;return Tag("li",{class:"flex-1"},[!X?Tag("hr",{class:()=>G()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>C(J.title)]),Tag("div",{class:"timeline-middle"},[()=>J.icon?z(J.icon):z(P[Y]||P.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>C(J.detail)]),!T?Tag("hr",{class:()=>K()?"bg-primary":""}):null])})})};var N_={};R(N_,{Toast:()=>D_});var D_=(f,M="alert-success",_=3500)=>{let E=document.getElementById("sigpro-toast-container");if(!E)E=Tag("div",{id:"sigpro-toast-container",class:"fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none"}),document.body.appendChild(E);let L=Tag("div",{style:"display: contents"});E.appendChild(L);let A,P=()=>{clearTimeout(A);let Q=L.firstElementChild;if(Q&&!Q.classList.contains("opacity-0"))Q.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(J.destroy(),L.remove(),!E.hasChildNodes())E.remove()},300);else J.destroy(),L.remove()},W=()=>{let Q=z("icon-[lucide--x]"),X=Tag("div",{class:`alert alert-soft ${M} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[Tag("span",{},[typeof f==="function"?f():f]),o({class:"btn-xs btn-circle btn-ghost",onclick:P},Q)]);return requestAnimationFrame(()=>X.classList.remove("translate-x-10","opacity-0")),X},J=Mount(W,L);if(_>0)A=setTimeout(P,_);return P};var U_={};R(U_,{Tooltip:()=>O_});var O_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var x_={...Cf,...Rf,...Df,...Of,...Uf,...Ff,...Hf,...wf,...xf,...mf,...gf,...pf,...rf,...nf,...zf,...sf,...tf,...ef,...__,...E_,...L_,...W_,...J_,...T_,...G_,...Z_,...S_,...C_,...R_,...h_,...N_,...U_},s_={...x_,install:(f=window)=>{Object.entries(x_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(Ef).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(Mf).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.defineProperty(window,"tt",{value:x,writable:!1,configurable:!0,enumerable:!0}),Object.defineProperty(window,"SigProUI",{value:{...Ef,Utils:Mf,tt:x},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");})(); + ${X()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(z)=>{z.preventDefault(),X(!0)},ondragleave:()=>X(!1),ondrop:(z)=>{z.preventDefault(),X(!1),K(z.dataTransfer.files)}},[_("div",{class:"flex items-center gap-3 w-full"},[h("icon-[lucide--upload]"),_("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),_("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${W}MB`)]),_("input",{type:"file",multiple:!0,accept:J,class:"hidden",onchange:(z)=>K(z.target.files)})])]),()=>G()?_("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,j(()=>A().length>0,()=>_("ul",{class:"mt-2 space-y-1"},[w(A,(z,B)=>_("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[_("div",{class:"flex items-center gap-2 truncate"},[_("span",{class:"opacity-50"},"\uD83D\uDCC4"),_("span",{class:"truncate font-medium max-w-[200px]"},z.name),_("span",{class:"text-[9px] opacity-40"},`(${(z.size/1024).toFixed(0)} KB)`)]),_("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(S)=>{S.preventDefault(),S.stopPropagation(),R(B)}},[h("icon-[lucide--x]")])]),(z)=>z.name+z.lastModified)]))])};var kf={};U(kf,{Indicator:()=>I_});var I_=(f,L)=>{let{value:E,class:W,...J}=f;return _("div",{...J,class:"indicator"},()=>[E?_("span",{class:q("indicator-item badge",W)},()=>typeof E==="function"?E():E):null,L].filter(Boolean))};var Ff={};U(Ff,{Label:()=>x_});var x_=(f)=>{let{children:L,value:E,floating:W=!1,class:J,...Q}=f;if(W)return _("label",{class:q("floating-label",J),...Q},()=>[typeof L==="function"?L():L,E?_("span",{},Y(E)):null]);return _("label",{class:q("label",J),...Q},()=>[E?_("span",{class:"label-text"},Y(E)):null,typeof L==="function"?L():L])};var yf={};U(yf,{List:()=>v_});var v_=(f)=>{let{class:L,items:E,header:W,render:J=(X)=>X,keyFn:Q=(X,G)=>X.id??G,...P}=f,A=w(E,(X,G)=>_("li",{class:"list-row",style:"width: 100%; display: block;"},[_("div",{style:"width: 100%;"},[J(X,G)])]),Q);return _("ul",{...P,style:"display: block; width: 100%;",class:q("list bg-base-100 rounded-box shadow-md",L)},W?[j(W,()=>_("li",{class:"p-4 pb-2 text-xs opacity-60",style:"width: 100%;"},[Y(W)])),A]:A)};var wf={};U(wf,{Menu:()=>T_});var T_=(f)=>{let{class:L,items:E,...W}=f,J=(Q)=>w(()=>Q||[],(P)=>_("li",{},[P.children?_("details",{open:P.open},[_("summary",{},[P.icon&&_("span",{class:"mr-2"},P.icon),P.label]),_("ul",{},J(P.children))]):_("a",{class:()=>Y(P.active)?"active":"",onclick:P.onclick},[P.icon&&_("span",{class:"mr-2"},P.icon),P.label])]),(P,A)=>P.label||A);return _("ul",{...W,class:q("menu bg-base-200 rounded-box",L)},J(E))};var Mf={};U(Mf,{Modal:()=>u_});var u_=(f,L)=>{let{class:E,title:W,buttons:J,open:Q,...P}=f,A=null,X=()=>{let Z=typeof Q==="function"?Q():Q;if(!A)return;if(Z){if(!A.open)A.showModal()}else if(A.open)A.close()};b(()=>X());let G=()=>{if(typeof Q==="function")Q(!1)};return _("dialog",{...P,ref:(Z)=>{if(A=Z,Z)X()},class:q("modal",E),onclose:G,oncancel:G},[_("div",{class:"modal-box"},[W?_("h3",{class:"text-lg font-bold mb-4"},()=>typeof W==="function"?W():W):null,_("div",{class:"py-2"},[typeof L==="function"?L():L]),_("div",{class:"modal-action"},[_("form",{method:"dialog",class:"flex gap-2"},[...(Array.isArray(J)?J:[J]).filter(Boolean),ff({type:"submit"},"close")])])]),_("form",{method:"dialog",class:"modal-backdrop"},[_("button",{},"close")])])};var jf={};U(jf,{Navbar:()=>b_});var b_=(f,L)=>{let{class:E,...W}=f;return _("div",{...W,class:q("navbar bg-base-100 shadow-sm px-4",E)},L)};var If={};U(If,{Radio:()=>m_});var m_=(f)=>{let{class:L,label:E,tooltip:W,value:J,inputValue:Q,name:P,...A}=f,X=_("input",{...A,type:"radio",name:P,class:q("radio",L),checked:()=>Y(J)===Q,onclick:()=>{if(typeof J==="function")J(Q)}});if(!E&&!W)return X;let G=_("label",{class:"label cursor-pointer justify-start gap-3"},[X,E?_("span",{class:"label-text"},E):null]);return W?_("div",{class:"tooltip","data-tip":W},G):G};var xf={};U(xf,{Range:()=>d_});var d_=(f)=>{let{class:L,label:E,tooltip:W,value:J,...Q}=f,P=_("input",{...Q,type:"range",class:q("range",L),value:J,disabled:()=>Y(f.disabled)});if(!E&&!W)return P;let A=_("div",{class:"flex flex-col gap-2"},[E?_("span",{class:"label-text"},E):null,P]);return W?_("div",{class:"tooltip","data-tip":W},A):A};var vf={};U(vf,{Rating:()=>p_});var p_=(f)=>{let{class:L,value:E,count:W=5,mask:J="mask-star",readonly:Q=!1,onchange:P,...A}=f,X=`rating-${Math.random().toString(36).slice(2,7)}`;return _("div",{...A,class:()=>q(`rating ${Y(Q)?"pointer-events-none":""}`,L)},Array.from({length:Y(W)},(G,Z)=>{let K=Z+1;return _("input",{type:"radio",name:X,class:`mask ${J}`,checked:()=>Math.round(Y(E))===K,onchange:()=>{if(!Y(Q)){if(typeof P==="function")P(K);else if(typeof E==="function")E(K)}}})}))};var Tf={};U(Tf,{Select:()=>g_});var g_=(f)=>{let{class:L,label:E,items:W,value:J,...Q}=f,P=_("select",{...Q,class:q("select select-bordered w-full",L),value:J},w(()=>Y(W)||[],(A)=>_("option",{value:A.value,$selected:()=>String(Y(J))===String(A.value)},A.label),(A)=>A.value));if(!E)return P;return _("label",{class:"fieldset-label flex flex-col gap-1"},[_("span",{},E),P])};var uf={};U(uf,{Stack:()=>c_});var c_=(f,L)=>{let{class:E,...W}=f;return _("div",{...W,class:q("stack",E)},L)};var bf={};U(bf,{Stat:()=>n_});var n_=(f)=>{let{class:L,icon:E,label:W,value:J,desc:Q,...P}=f;return _("div",{...P,class:q("stat",L)},[E&&_("div",{class:"stat-figure text-secondary"},E),W&&_("div",{class:"stat-title"},W),_("div",{class:"stat-value"},()=>Y(J)??J),Q&&_("div",{class:"stat-desc"},Q)])};var mf={};U(mf,{Swap:()=>r_});var r_=(f)=>{let{class:L,value:E,on:W,off:J,...Q}=f;return _("label",{...Q,class:q("swap",L)},[_("input",{type:"checkbox",checked:()=>Y(E),onclick:(P)=>{if(typeof E==="function")E(P.target.checked)}}),_("div",{class:"swap-on"},W),_("div",{class:"swap-off"},J)])};var df={};U(df,{Table:()=>i_});var i_=(f)=>{let{class:L,items:E=[],columns:W=[],keyFn:J,zebra:Q=!1,pinRows:P=!1,empty:A="nodata",...X}=f,G=()=>{let K=Y(Q)?"table-zebra":"",R=Y(P)?"table-pin-rows":"";return q("table",L,K,R)},Z=J||((K,R)=>K.id||R);return _("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[_("table",{...X,class:G},[_("thead",{},[_("tr",{},W.map((K)=>_("th",{class:K.class||""},K.label)))]),_("tbody",{},[w(E,(K,R)=>{let z=()=>{let B=Y(E),S=Z(K,R);return B.find((D,F)=>Z(D,F)===S)||K};return _("tr",{class:"hover"},W.map((B)=>{let S=()=>{let D=z();if(B.render)return B.render(D,R);return Y(D[B.key])};return _("td",{class:B.class||""},[S])}))},Z),j(()=>Y(E).length===0,()=>_("tr",{},[_("td",{colspan:W.length,class:"text-center p-10 opacity-50"},[Y(A)])]))])])])};var pf={};U(pf,{Tabs:()=>l_});var l_=(f)=>{let{items:L,class:E,onTabClose:W,...J}=f,Q=typeof L==="function"?L:()=>L||[],P=V(0);b(()=>{let G=Q().findIndex((Z)=>Y(Z.active)===!0);if(G!==-1&&P()!==G)P(G)});let A=(X,G)=>{if(G.onClose)G.onClose(G);if(W)W(G,X);let K=Q().filter((B,S)=>S!==X);if(!(typeof L==="function"&&!L._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(L(K),K.length===0)return;let z=P();if(X{let X=Q(),G=[];for(let Z=0;Z{N.stopPropagation(),A(Z,K)};let C=_("span",{class:"flex items-center"},[z,M]);B.push(C)}else B.push(z);let S=_("button",{class:()=>q("tab",P()===Z?"tab-active":""),onclick:(M)=>{if(M.preventDefault(),!Y(K.disabled)){if(K.onclick)K.onclick();P(Z)}}},B),D=K.tip?_("div",{class:"tooltip","data-tip":K.tip},S):S;G.push(D);let F,I=Y(K.content);if(typeof I==="function")F=I();else if(I instanceof Node)F=I;else F=document.createTextNode(String(I));let r=_("div",{class:"tab-content-inner"},F),i=_("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>P()===Z?"display: block":"display: none"},r);G.push(i)}return G})};var gf={};U(gf,{Timeline:()=>t_});var t_=(f)=>{let{class:L,items:E=[],vertical:W=!0,compact:J=!1,...Q}=f,P={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return _("ul",{...Q,class:()=>q(`timeline ${Y(W)?"timeline-vertical":"timeline-horizontal"} ${Y(J)?"timeline-compact":""}`,L)},()=>{let A=(typeof E==="function"?E():E)||[];return A.map((X,G)=>{let Z=G===0,K=G===A.length-1,R=X.type||"success",z=()=>Y(X.completed),B=()=>G>0&&Y(A[G-1].completed),S=(D)=>typeof D==="function"?D():D;return _("li",{class:"flex-1"},[!Z?_("hr",{class:()=>B()?"bg-primary":""}):null,_("div",{class:"timeline-start"},[()=>S(X.title)]),_("div",{class:"timeline-middle"},[()=>X.icon?h(X.icon):h(P[R]||P.success)]),_("div",{class:"timeline-end timeline-box shadow-sm"},[()=>S(X.detail)]),!K?_("hr",{class:()=>z()?"bg-primary":""}):null])})})};var cf={};U(cf,{Toast:()=>s_});var s_=(f,L="alert-success",E=3500)=>{let W=document.getElementById("sigpro-toast-container");if(!W)W=_("div",{id:"sigpro-toast-container",class:"fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none"}),document.body.appendChild(W);let J=_("div",{style:"display: contents"});W.appendChild(J);let Q,P=()=>{clearTimeout(Q);let G=J.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(X.destroy(),J.remove(),!W.hasChildNodes())W.remove()},300);else X.destroy(),J.remove()},X=Zf(()=>{let G=h("icon-[lucide--x]"),Z=_("div",{class:`alert alert-soft ${L} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[_("span",{},[typeof f==="function"?f():f]),ff({class:"btn-xs btn-circle btn-ghost",onclick:P},G)]);return requestAnimationFrame(()=>Z.classList.remove("translate-x-10","opacity-0")),Z},J);if(E>0)Q=setTimeout(P,E);return P};var nf={};U(nf,{Tooltip:()=>o_});var o_=(f,L)=>_("div",{...f,class:()=>q("tooltip w-full",f.class),"data-tip":f.tip},L);var L_={...Bf,...Yf,...zf,...Cf,...Rf,...Sf,...Nf,...Uf,...hf,...Vf,...Df,...Of,...Hf,...kf,...qf,...Ff,...yf,...wf,...Mf,...jf,...If,...xf,...vf,...Tf,...uf,...bf,...mf,...df,...pf,...gf,...cf,...nf},W_={Locale:__,tt:E_};if(typeof window<"u")Object.entries({...L_,...W_}).forEach(([f,L])=>{Object.defineProperty(window,f,{value:L,writable:!1,configurable:!0,enumerable:!0})}),console.log("SigProUI installed");})(); diff --git a/docs/index.html b/docs/index.html index d0d30d8..12be2a5 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,17 +10,7 @@ href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css" /> - - - + @@ -42,27 +32,31 @@ sidebarDisplayLevel: 1, executeScript: true, copyCode: { - buttonText: '', + buttonText: + '', errorText: "Error", - successText: '', + successText: + '', }, plugins: [ - function(hook, vm) { - hook.doneEach(function() { - // Buscamos los bloques de código JS que queremos ejecutar - const codeBlocks = document.querySelectorAll('pre[data-lang="javascript"] code'); - - codeBlocks.forEach(code => { - try { - const runDemo = new Function(code.innerText); - runDemo(); - } catch (err) { - console.error("Error en la demo de SigPro:", err); - } - }); - }); - } - ] + function (hook, vm) { + hook.doneEach(function () { + // Buscamos los bloques de código JS que queremos ejecutar + const codeBlocks = document.querySelectorAll( + 'pre[data-lang="javascript"] code', + ); + + codeBlocks.forEach((code) => { + try { + const runDemo = new Function(code.innerText); + runDemo(); + } catch (err) { + console.error("Error en la demo de SigPro:", err); + } + }); + }); + }, + ], }; @@ -70,4 +64,4 @@ - \ No newline at end of file + diff --git a/docs/sigpro-ui.min.js b/docs/sigpro-ui.min.js index 492b668..3e51ec3 100644 --- a/docs/sigpro-ui.min.js +++ b/docs/sigpro-ui.min.js @@ -1,2099 +1,7 @@ -(() => { - var __defProp = Object.defineProperty; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __moduleCache = /* @__PURE__ */ new WeakMap; - var __toCommonJS = (from) => { - var entry = __moduleCache.get(from), desc; - if (entry) - return entry; - entry = __defProp({}, "__esModule", { value: true }); - if (from && typeof from === "object" || typeof from === "function") - __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, { - get: () => from[key], - enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable - })); - __moduleCache.set(from, entry); - return entry; - }; - var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { - get: all[name], - enumerable: true, - configurable: true, - set: (newValue) => all[name] = () => newValue - }); - }; - - // index.js - var exports_sigpro_ui = {}; - __export(exports_sigpro_ui, { - val: () => val, - ui: () => ui, - tt: () => tt, - getIcon: () => getIcon, - Watch: () => Watch2, - Tooltip: () => Tooltip, - Toast: () => Toast, - Timeline: () => Timeline, - Tag: () => Tag2, - Tabs: () => Tabs, - Table: () => Table, - Swap: () => Swap, - Stat: () => Stat, - Stack: () => Stack, - Select: () => Select, - Router: () => Router, - Rating: () => Rating, - Range: () => Range, - Radio: () => Radio, - Navbar: () => Navbar, - Mount: () => Mount2, - Modal: () => Modal, - Menu: () => Menu, - List: () => List, - Label: () => Label, - Input: () => Input, - Indicator: () => Indicator, - If: () => If2, - For: () => For2, - Fileinput: () => Fileinput, - Fieldset: () => Fieldset, - Fab: () => Fab, - Dropdown: () => Dropdown, - Drawer: () => Drawer, - Datepicker: () => Datepicker, - Colorpicker: () => Colorpicker, - Checkbox: () => Checkbox, - Button: () => Button, - Badge: () => Badge, - Autocomplete: () => Autocomplete, - Alert: () => Alert, - Accordion: () => Accordion, - $: () => $2 - }); - - // src/sigpro.js - var isFunc = (f) => typeof f === "function"; - var isObj = (o) => o && typeof o === "object"; - var isArr = Array.isArray; - var doc = typeof document !== "undefined" ? document : null; - var ensureNode = (n) => n?._isRuntime ? n.container : n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n)); - var activeEffect = null; - var activeOwner = null; - var isFlushing = false; - var batchDepth = 0; - var effectQueue = new Set; - var proxyCache = new WeakMap; - var ITER = Symbol("iter"); - var MOUNTED_NODES = new WeakMap; - var dispose = (eff) => { - if (!eff || eff._disposed) - return; - eff._disposed = true; - const stack = [eff]; - while (stack.length) { - const e = stack.pop(); - if (e._cleanups) { - e._cleanups.forEach((fn) => fn()); - e._cleanups.clear(); - } - if (e._children) { - e._children.forEach((child) => stack.push(child)); - e._children.clear(); - } - if (e._deps) { - e._deps.forEach((depSet) => depSet.delete(e)); - e._deps.clear(); - } - } - }; - var onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); - }; - var onUnmount = (fn) => { - if (activeOwner) - (activeOwner._cleanups ||= new Set).add(fn); - }; - var untrack = (fn) => { - const p = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = p; - } - }; - var createEffect = (fn, isComputed = false) => { - const effect = () => { - if (effect._disposed) - return; - if (effect._deps) - effect._deps.forEach((s) => s.delete(effect)); - if (effect._cleanups) { - effect._cleanups.forEach((c) => c()); - effect._cleanups.clear(); - } - const prevEffect = activeEffect; - const prevOwner = activeOwner; - activeEffect = activeOwner = effect; - try { - return effect._result = fn(); - } catch (e) { - console.error("[SigPro]", e); - } finally { - activeEffect = prevEffect; - activeOwner = prevOwner; - } - }; - effect._deps = effect._cleanups = effect._children = null; - effect._disposed = false; - effect._isComputed = isComputed; - effect._depth = activeEffect ? activeEffect._depth + 1 : 0; - effect._mounts = []; - effect._parent = activeOwner; - if (activeOwner) - (activeOwner._children ||= new Set).add(effect); - return effect; - }; - var flush = () => { - if (isFlushing) - return; - isFlushing = true; - const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); - effectQueue.clear(); - for (const e of sorted) - if (!e._disposed) - e(); - isFlushing = false; - }; - var Batch = (fn) => { - batchDepth++; - try { - return fn(); - } finally { - batchDepth--; - if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) { - flush(); - } - } - }; - var trackUpdate = (subs, trigger = false) => { - if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect); - (activeEffect._deps ||= new Set).add(subs); - } else if (trigger) { - let hasQueue = false; - subs.forEach((e) => { - if (e === activeEffect || e._disposed) - return; - if (e._isComputed) { - e._dirty = true; - if (e._subs) - trackUpdate(e._subs, true); - } else { - effectQueue.add(e); - hasQueue = true; - } - }); - if (hasQueue && !isFlushing && batchDepth === 0) - queueMicrotask(flush); - } - }; - var $2 = (val, key = null) => { - const subs = new Set; - if (isFunc(val)) { - let cache, dirty = true; - const computed = () => { - if (dirty) { - const prev = activeEffect; - activeEffect = computed; - try { - const next = val(); - if (!Object.is(cache, next)) { - cache = next; - dirty = false; - trackUpdate(subs, true); - } - } finally { - activeEffect = prev; - } - } - trackUpdate(subs); - return cache; - }; - computed._isComputed = true; - computed._subs = subs; - computed._dirty = true; - computed._deps = null; - computed._disposed = false; - computed.markDirty = () => { - dirty = true; - }; - computed.stop = () => { - computed._disposed = true; - if (computed._deps) { - computed._deps.forEach((depSet) => depSet.delete(computed)); - computed._deps.clear(); - } - subs.clear(); - }; - if (activeOwner) - onUnmount(computed.stop); - return computed; - } - if (key) - try { - val = JSON.parse(localStorage.getItem(key)) ?? val; - } catch (e) {} - return (...args) => { - if (args.length) { - const next = isFunc(args[0]) ? args[0](val) : args[0]; - if (!Object.is(val, next)) { - val = next; - if (key) - localStorage.setItem(key, JSON.stringify(val)); - trackUpdate(subs, true); - } - } - trackUpdate(subs); - return val; - }; - }; - var $$ = (target) => { - if (!isObj(target)) - return target; - if (proxyCache.has(target)) - return proxyCache.get(target); - const subsMap = new Map; - const getSubs = (k) => { - let s = subsMap.get(k); - if (!s) - subsMap.set(k, s = new Set); - return s; - }; - const proxy = new Proxy(target, { - get(t, k) { - trackUpdate(getSubs(k)); - return $$(t[k]); - }, - set(t, k, v) { - const isNew = !(k in t); - if (!Object.is(t[k], v)) { - t[k] = v; - trackUpdate(getSubs(k), true); - if (isNew) - trackUpdate(getSubs(ITER), true); - } - return true; - }, - deleteProperty(t, k) { - const res = Reflect.deleteProperty(t, k); - if (res) { - trackUpdate(getSubs(k), true); - trackUpdate(getSubs(ITER), true); - } - return res; - }, - ownKeys(t) { - trackUpdate(getSubs(ITER)); - return Reflect.ownKeys(t); - } - }); - proxyCache.set(target, proxy); - return proxy; - }; - var Watch2 = (sources, cb) => { - if (cb === undefined) { - const effect2 = createEffect(sources); - effect2(); - return () => dispose(effect2); - } - const effect = createEffect(() => { - const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); - untrack(() => cb(vals)); - }); - effect(); - return () => dispose(effect); - }; - var cleanupNode = (node) => { - if (node._cleanups) { - node._cleanups.forEach((fn) => fn()); - node._cleanups.clear(); - } - if (node._ownerEffect) - dispose(node._ownerEffect); - if (node.childNodes) - node.childNodes.forEach(cleanupNode); - }; - var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; - var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); - var validateAttr = (key, val) => { - if (val == null || val === false) - return null; - if (isDangerousAttr(key)) { - const sVal = String(val); - if (DANGEROUS_PROTOCOL.test(sVal)) { - console.warn(`[SigPro] Bloqueado protocolo peligroso en ${key}`); - return "#"; - } - } - return val; - }; - var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || !isObj(props)) { - children = props; - props = {}; - } - if (isFunc(tag)) { - const ctx = { _mounts: [], _cleanups: new Set }; - const effect = createEffect(() => { - const result2 = tag(props, { - children, - emit: (ev, ...args) => props[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...args) - }); - effect._result = result2; - return result2; - }); - effect(); - const result = effect._result; - if (result == null) - return null; - const node = result instanceof Node || isArr(result) && result.every((n) => n instanceof Node) ? result : doc.createTextNode(String(result)); - const attach = (n) => { - if (isObj(n) && !n._isRuntime) { - n._mounts = effect._mounts || []; - n._cleanups = effect._cleanups || new Set; - n._ownerEffect = effect; - } - }; - isArr(node) ? node.forEach(attach) : attach(node); - return node; - } - const isSVG = /^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - el._cleanups = new Set; - for (let k in props) { - if (!props.hasOwnProperty(k)) - continue; - let v = props[k]; - if (k === "ref") { - isFunc(v) ? v(el) : v.current = el; - continue; - } - if (k.startsWith("on")) { - const ev = k.slice(2).toLowerCase(); - el.addEventListener(ev, v); - const off = () => el.removeEventListener(ev, v); - el._cleanups.add(off); - onUnmount(off); - } else if (isFunc(v)) { - const effect = createEffect(() => { - const val = validateAttr(k, v()); - if (k === "class") - el.className = val || ""; - else if (val == null) - el.removeAttribute(k); - else if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) { - const evType = k === "checked" ? "change" : "input"; - el.addEventListener(evType, (ev) => v(ev.target[k])); - } - } else { - const val = validateAttr(k, v); - if (val != null) { - if (k in el && !isSVG) - el[k] = val; - else - el.setAttribute(k, val === true ? "" : val); - } - } - } - const append = (c) => { - if (isArr(c)) - return c.forEach(append); - if (isFunc(c)) { - const anchor = doc.createTextNode(""); - el.appendChild(anchor); - let currentNodes = []; - const effect = createEffect(() => { - const res = c(); - const next = (isArr(res) ? res : [res]).map(ensureNode); - currentNodes.forEach((n) => { - if (n._isRuntime) - n.destroy(); - else - cleanupNode(n); - if (n.parentNode) - n.remove(); - }); - let ref = anchor; - for (let i = next.length - 1;i >= 0; i--) { - const node = next[i]; - if (node.parentNode !== ref.parentNode) - ref.parentNode?.insertBefore(node, ref); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - ref = node; - } - currentNodes = next; - }); - effect(); - el._cleanups.add(() => dispose(effect)); - onUnmount(() => dispose(effect)); - } else { - const node = ensureNode(c); - el.appendChild(node); - if (node._mounts) - node._mounts.forEach((fn) => fn()); - } - }; - append(children); - return el; - }; - var Render = (renderFn) => { - const cleanups = new Set; - const mounts = []; - const previousOwner = activeOwner; - const previousEffect = activeEffect; - const container = doc.createElement("div"); - container.style.display = "contents"; - container.setAttribute("role", "presentation"); - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - activeEffect = null; - const processResult = (result) => { - if (!result) - return; - if (result._isRuntime) { - cleanups.add(result.destroy); - container.appendChild(result.container); - } else if (isArr(result)) { - result.forEach(processResult); - } else { - container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); - } - }; - try { - processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); - } finally { - activeOwner = previousOwner; - activeEffect = previousEffect; - } - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(container); - container.remove(); - } - }; - }; - var If2 = (cond, ifYes, ifNot = null) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let currentView = null; - Watch2(() => !!(isFunc(cond) ? cond() : cond), (show) => { - if (currentView) { - currentView.destroy(); - currentView = null; - } - const content = show ? ifYes : ifNot; - if (content) { - currentView = Render(() => isFunc(content) ? content() : content); - root.insertBefore(currentView.container, anchor); - } - }); - onUnmount(() => currentView?.destroy()); - return root; - }; - var For2 = (src, itemFn, keyFn) => { - const anchor = doc.createTextNode(""); - const root = Tag2("div", { style: "display:contents" }, [anchor]); - let cache = new Map; - Watch2(() => (isFunc(src) ? src() : src) || [], (items) => { - const nextCache = new Map; - const nextOrder = []; - const newItems = items || []; - for (let i = 0;i < newItems.length; i++) { - const item = newItems[i]; - const key = keyFn ? keyFn(item, i) : item?.id ?? i; - let view = cache.get(key); - if (!view) - view = Render(() => itemFn(item, i)); - else - cache.delete(key); - nextCache.set(key, view); - nextOrder.push(view); - } - cache.forEach((view) => view.destroy()); - let lastRef = anchor; - for (let i = nextOrder.length - 1;i >= 0; i--) { - const view = nextOrder[i]; - const node = view.container; - if (node.nextSibling !== lastRef) - root.insertBefore(node, lastRef); - lastRef = node; - } - cache = nextCache; - }); - return root; - }; - var Router = (routes) => { - const getHash = () => window.location.hash.slice(1) || "/"; - const path = $2(getHash()); - const handler = () => path(getHash()); - window.addEventListener("hashchange", handler); - onUnmount(() => window.removeEventListener("hashchange", handler)); - const hook = Tag2("div", { class: "router-hook" }); - let currentView = null; - Watch2([path], () => { - const cur = path(); - const route = routes.find((r) => { - const p1 = r.path.split("/").filter(Boolean); - const p2 = cur.split("/").filter(Boolean); - return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]); - }) || routes.find((r) => r.path === "*"); - if (route) { - currentView?.destroy(); - const params = {}; - route.path.split("/").filter(Boolean).forEach((p, i) => { - if (p[0] === ":") - params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; - }); - Router.params(params); - currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); - hook.replaceChildren(currentView.container); - } - }); - return hook; - }; - Router.params = $2({}); - Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); - Router.back = () => window.history.back(); - Router.path = () => window.location.hash.replace(/^#/, "") || "/"; - var Mount2 = (comp, target) => { - const t = typeof target === "string" ? doc.querySelector(target) : target; - if (!t) - return; - if (MOUNTED_NODES.has(t)) - MOUNTED_NODES.get(t).destroy(); - const inst = Render(isFunc(comp) ? comp : () => comp); - t.replaceChildren(inst.container); - MOUNTED_NODES.set(t, inst); - return inst; - }; - var SigPro = Object.freeze({ $: $2, $$, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, Batch }); - if (typeof window !== "undefined") { - Object.assign(window, SigPro); - "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((t) => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)); - } - - // src/components/index.js - var exports_components = {}; - __export(exports_components, { - default: () => components_default, - Tooltip: () => Tooltip, - Toast: () => Toast, - Timeline: () => Timeline, - Tabs: () => Tabs, - Table: () => Table, - Swap: () => Swap, - Stat: () => Stat, - Stack: () => Stack, - Select: () => Select, - Rating: () => Rating, - Range: () => Range, - Radio: () => Radio, - Navbar: () => Navbar, - Modal: () => Modal, - Menu: () => Menu, - List: () => List, - Label: () => Label, - Input: () => Input, - Indicator: () => Indicator, - Fileinput: () => Fileinput, - Fieldset: () => Fieldset, - Fab: () => Fab, - Dropdown: () => Dropdown, - Drawer: () => Drawer, - Datepicker: () => Datepicker, - Colorpicker: () => Colorpicker, - Checkbox: () => Checkbox, - Button: () => Button, - Badge: () => Badge, - Autocomplete: () => Autocomplete, - Alert: () => Alert, - Accordion: () => Accordion - }); - - // src/components/Accordion.js - var exports_Accordion = {}; - __export(exports_Accordion, { - Accordion: () => Accordion - }); - - // src/core/utils.js - var exports_utils = {}; - __export(exports_utils, { - val: () => val, - ui: () => ui, - getIcon: () => getIcon - }); - var val = (t) => typeof t === "function" ? t() : t; - var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); - var getIcon = (icon) => { - if (!icon) - return null; - if (typeof icon === "function") { - return Tag("span", { class: "mr-1" }, icon()); - } - if (typeof icon === "object") { - return Tag("span", { class: "mr-1" }, icon); - } - if (typeof icon === "string") { - const parts = icon.trim().split(/\s+/); - const hasRight = parts[parts.length - 1] === "right"; - const iconClass = hasRight ? parts.slice(0, -1).join(" ") : icon; - const spacing = hasRight ? "ml-1" : "mr-1"; - if (iconClass && !iconClass.startsWith("icon-[") && !iconClass.includes("--")) { - return Tag("span", { class: spacing }, iconClass); - } - return Tag("span", { class: `${iconClass} ${spacing}`.trim() }); - } - return null; - }; - - // src/components/Accordion.js - var Accordion = (props, children) => { - const { class: className, title, name, open, ...rest } = props; - return Tag("div", { - ...rest, - class: ui("collapse collapse-arrow bg-base-200 mb-2", className) - }, [ - Tag("input", { - type: name ? "radio" : "checkbox", - name, - checked: val(open) - }), - Tag("div", { class: "collapse-title text-xl font-medium" }, title), - Tag("div", { class: "collapse-content" }, children) - ]); - }; - - // src/components/Alert.js - var exports_Alert = {}; - __export(exports_Alert, { - Alert: () => Alert - }); - var Alert = (props, children) => { - const { class: className, actions, type = "info", soft = true, ...rest } = props; - const iconMap = { - info: "icon-[lucide--info]", - success: "icon-[lucide--check-circle]", - warning: "icon-[lucide--alert-triangle]", - error: "icon-[lucide--alert-circle]" - }; - const typeClass = `alert-${type}`; - const softClass = soft ? "alert-soft" : ""; - const allClasses = [typeClass, softClass, className].filter(Boolean).join(" "); - const content = children || props.message; - return Tag("div", { - ...rest, - role: "alert", - class: ui("alert", allClasses) - }, () => [ - getIcon(iconMap[type]), - Tag("div", { class: "flex-1" }, [ - Tag("span", {}, [typeof content === "function" ? content() : content]) - ]), - actions ? Tag("div", { class: "flex-none" }, [ - typeof actions === "function" ? actions() : actions - ]) : null - ].filter(Boolean)); - }; - - // src/components/Autocomplete.js - var exports_Autocomplete = {}; - __export(exports_Autocomplete, { - Autocomplete: () => Autocomplete - }); - - // src/core/i18n.js - var i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } - }; - var currentLocale = $("es"); - var tt = (t) => () => i18n[currentLocale()][t] || t; - - // src/components/Input.js - var exports_Input = {}; - __export(exports_Input, { - Input: () => Input - }); - var Input = (props) => { - const { - class: className, - value, - type = "text", - icon, - oninput, - placeholder, - disabled, - validate, - label, - ...rest - } = props; - const isPassword = type === "password"; - const visible = $(false); - const errorMsg = $(null); - const iconMap = { - text: "icon-[lucide--text]", - password: "icon-[lucide--lock]", - date: "icon-[lucide--calendar]", - number: "icon-[lucide--hash]", - email: "icon-[lucide--mail]", - search: "icon-[lucide--search]", - tel: "icon-[lucide--phone]", - url: "icon-[lucide--link]" - }; - const leftIcon = icon ? getIcon(icon) : iconMap[type] ? getIcon(iconMap[type]) : null; - const getPasswordIcon = () => getIcon(visible() ? "icon-[lucide--eye-off]" : "icon-[lucide--eye]"); - const paddingLeft = leftIcon ? "pl-10" : ""; - const paddingRight = isPassword ? "pr-10" : ""; - const buttonSize = () => { - if (className?.includes("input-xs")) - return "btn-xs"; - if (className?.includes("input-sm")) - return "btn-sm"; - if (className?.includes("input-lg")) - return "btn-lg"; - return "btn-md"; - }; - const handleInput = (e) => { - const newValue = e.target.value; - if (validate) { - const result = validate(newValue); - errorMsg(result || null); - } - oninput?.(e); - }; - const hasError = () => errorMsg() && errorMsg() !== ""; - const inputClasses = () => { - let classes = `input w-full ${paddingLeft} ${paddingRight}`; - if (className) - classes += ` ${className}`; - if (hasError()) - classes += " input-error"; - return classes.trim(); - }; - const inputElement = Tag("input", { - ...rest, - type: () => isPassword ? visible() ? "text" : "password" : type, - placeholder: placeholder || (label ? " " : placeholder), - class: inputClasses, - value, - oninput: handleInput, - disabled: () => val(disabled), - "aria-invalid": () => hasError() ? "true" : "false" - }); - const inputContent = () => [ - inputElement, - leftIcon ? Tag("div", { - class: "absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60" - }, leftIcon) : null, - isPassword ? Tag("button", { - type: "button", - class: ui("absolute right-3 inset-y-0 flex items-center", "btn btn-ghost btn-circle opacity-50 hover:opacity-100", buttonSize()), - onclick: (e) => { - e.preventDefault(); - visible(!visible()); - } - }, () => getPasswordIcon()) : null, - Tag("div", { - class: "text-error text-xs mt-1 px-3 absolute -bottom-5 left-0" - }, () => hasError() ? errorMsg() : null) - ]; - if (label) { - return Tag("label", { class: ui("floating-label w-full", className) }, () => [ - Tag("div", { class: "relative w-full" }, inputContent), - Tag("span", {}, val(label)) - ]); - } - return Tag("div", { class: "relative w-full" }, inputContent); - }; - - // src/components/Autocomplete.js - var Autocomplete = (props) => { - const { class: className, items = [], value, onselect, label, placeholder, ...rest } = props; - const query = $(val(value) || ""); - const isOpen = $(false); - const cursor = $(-1); - const list = $([]); - Watch(() => { - const q = String(query()).toLowerCase(); - const data = val(items) || []; - const filtered = q ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) : data; - list(filtered); - }); - const pick = (opt) => { - const valStr = typeof opt === "string" ? opt : opt.value; - const labelStr = typeof opt === "string" ? opt : opt.label; - query(labelStr); - if (typeof value === "function") - value(valStr); - onselect?.(opt); - isOpen(false); - cursor(-1); - }; - const nav = (e) => { - const currentItems = list(); - if (e.key === "ArrowDown") { - e.preventDefault(); - isOpen(true); - cursor(Math.min(cursor() + 1, currentItems.length - 1)); - } else if (e.key === "ArrowUp") { - e.preventDefault(); - cursor(Math.max(cursor() - 1, 0)); - } else if (e.key === "Enter" && cursor() >= 0) { - e.preventDefault(); - pick(currentItems[cursor()]); - } else if (e.key === "Escape") { - isOpen(false); - } - }; - return Tag("div", { class: "relative w-full" }, [ - Input({ - label, - class: className, - placeholder: placeholder || tt("search")(), - value: query, - onfocus: () => isOpen(true), - onblur: () => setTimeout(() => isOpen(false), 150), - onkeydown: nav, - oninput: (e) => { - const v = e.target.value; - query(v); - if (typeof value === "function") - value(v); - isOpen(true); - cursor(-1); - }, - ...rest - }), - Tag("ul", { - class: "absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", - style: () => isOpen() && list().length ? "display:block" : "display:none" - }, [ - For(list, (opt, i) => Tag("li", {}, [ - Tag("a", { - class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, - onclick: () => pick(opt), - onmouseenter: () => cursor(i) - }, typeof opt === "string" ? opt : opt.label) - ]), (opt, i) => (typeof opt === "string" ? opt : opt.value) + i), - () => list().length ? null : Tag("li", { class: "p-2 text-center opacity-50" }, tt("nodata")()) - ]) - ]); - }; - - // src/components/Badge.js - var exports_Badge = {}; - __export(exports_Badge, { - Badge: () => Badge - }); - var Badge = (props, children) => { - const { class: className, ...rest } = props; - return Tag("span", { - ...rest, - class: ui("badge", className) - }, children); - }; - - // src/components/Button.js - var exports_Button = {}; - __export(exports_Button, { - Button: () => Button - }); - var Button = (props, children) => { - const { class: className, loading, icon, ...rest } = props; - const iconEl = getIcon(icon); - return Tag("button", { - ...rest, - class: ui("btn", className), - disabled: () => val(loading) || val(props.disabled) - }, () => [ - val(loading) && Tag("span", { class: "loading loading-spinner" }), - iconEl, - children - ].filter(Boolean)); - }; - - // src/components/Checkbox.js - var exports_Checkbox = {}; - __export(exports_Checkbox, { - Checkbox: () => Checkbox - }); - var Checkbox = (props) => { - const { class: className, value, toggle, label, ...rest } = props; - const checkEl = Tag("input", { - ...rest, - type: "checkbox", - class: () => ui(val(toggle) ? "toggle" : "checkbox", className), - checked: value - }); - return Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ - checkEl, - label ? Tag("span", { class: "label-text" }, label) : null - ]); - }; - - // src/components/Colorpicker.js - var exports_Colorpicker = {}; - __export(exports_Colorpicker, { - Colorpicker: () => Colorpicker - }); - var Colorpicker = (props) => { - const { class: className, value, label, ...rest } = props; - const isOpen = $(false); - const palette = [ - ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], - ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], - ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], - ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], - ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], - ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], - ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], - ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"] - ]; - const getColor = () => val(value) || "#000000"; - return Tag("div", { class: ui("relative w-fit", className) }, [ - Tag("button", { - type: "button", - class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest - }, [ - Tag("div", { - class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", - style: () => `background-color: ${getColor()}` - }), - label ? Tag("span", { class: "opacity-80" }, label) : null - ]), - If(isOpen, () => Tag("div", { - class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", - onclick: (e) => e.stopPropagation() - }, [ - Tag("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => Tag("button", { - type: "button", - style: `background-color: ${c}`, - class: () => { - const active = getColor().toLowerCase() === c.toLowerCase(); - return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; - }, - onclick: () => { - if (typeof value === "function") - value(c); - isOpen(false); - } - }))) - ])), - If(isOpen, () => Tag("div", { - class: "fixed inset-0 z-[100]", - onclick: () => isOpen(false) - })) - ]); - }; - - // src/components/Datepicker.js - var exports_Datepicker = {}; - __export(exports_Datepicker, { - Datepicker: () => Datepicker - }); - var Datepicker = (props) => { - const { class: className, value, range, label, placeholder, hour = false, ...rest } = props; - const isOpen = $(false); - const internalDate = $(new Date); - const hoverDate = $(null); - const startHour = $(0); - const endHour = $(0); - const isRangeMode = () => val(range) === true; - const now = new Date; - const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; - const formatDate = (d) => { - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, "0"); - const day = String(d.getDate()).padStart(2, "0"); - return `${year}-${month}-${day}`; - }; - const selectDate = (date) => { - const dateStr = formatDate(date); - const current = val(value); - if (isRangeMode()) { - if (!current?.start || current.start && current.end) { - if (typeof value === "function") { - value({ - start: dateStr, - end: null, - ...hour && { startHour: startHour() } - }); - } - } else { - const start = current.start; - if (typeof value === "function") { - const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; - if (hour) { - newValue.startHour = current.startHour || startHour(); - newValue.endHour = current.endHour || endHour(); - } - value(newValue); - } - isOpen(false); - } - } else { - if (typeof value === "function") { - value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); - } - isOpen(false); - } - }; - const displayValue = $(""); - Watch(() => { - const v = val(value); - if (!v) { - displayValue(""); - return; - } - let text = ""; - if (typeof v === "string") { - text = hour && v.includes("T") ? v.replace("T", " ") : v; - } else if (v.start && v.end) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour !== undefined ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; - text = `${startStr} - ${endStr}`; - } else if (v.start) { - const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - text = `${startStr}...`; - } - displayValue(text); - }); - const move = (m) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); - }; - const moveYear = (y) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); - }; - const HourSlider = ({ value: hVal, onChange }) => { - return Tag("div", { class: "flex-1" }, [ - Tag("div", { class: "flex gap-2 items-center" }, [ - Tag("input", { - type: "range", - min: 0, - max: 23, - value: hVal, - class: "range range-xs flex-1", - oninput: (e) => { - const newHour = parseInt(e.target.value); - onChange(newHour); - } - }), - Tag("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val(hVal)).padStart(2, "0") + ":00") - ]) - ]); - }; - return Tag("div", { class: ui("relative w-full", className) }, [ - Input({ - label, - placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), - value: displayValue, - readonly: true, - icon: getIcon("icon-[lucide--calendar]"), - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest - }), - If(isOpen, () => Tag("div", { - class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", - onclick: (e) => e.stopPropagation() - }, [ - Tag("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, getIcon("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon("icon-[lucide--chevron-left]")) - ]), - Tag("span", { class: "font-bold uppercase flex-1 text-center" }, [ - () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }) - ]), - Tag("div", { class: "flex gap-0.5" }, [ - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, getIcon("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon("icon-[lucide--chevrons-right]")) - ]) - ]), - Tag("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => Tag("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), - () => { - const d = internalDate(); - const year = d.getFullYear(); - const month = d.getMonth(); - const firstDay = new Date(year, month, 1).getDay(); - const offset = firstDay === 0 ? 6 : firstDay - 1; - const daysInMonth = new Date(year, month + 1, 0).getDate(); - const nodes = []; - for (let i = 0;i < offset; i++) - nodes.push(Tag("div")); - for (let i = 1;i <= daysInMonth; i++) { - const date = new Date(year, month, i); - const dStr = formatDate(date); - nodes.push(Tag("button", { - type: "button", - class: () => { - const v = val(value); - const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; - let inRange = false; - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { - inRange = dStr > start && dStr <= h || dStr < start && dStr >= h; - } else if (v.end) { - inRange = dStr > start && dStr < v.end; - } - } - const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; - const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; - const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; - return `${base} ${state} ${today}`; - }, - onmouseenter: () => { - if (isRangeMode()) - hoverDate(dStr); - }, - onclick: () => selectDate(date) - }, [i.toString()])); - } - return nodes; - } - ]), - hour ? Tag("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() ? Tag("div", { class: "flex gap-4" }, [ - HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal?.start) - value({ ...currentVal, startHour: newHour }); - } - }), - HourSlider({ - value: endHour, - onChange: (newHour) => { - endHour(newHour); - const currentVal = val(value); - if (currentVal?.end) - value({ ...currentVal, endHour: newHour }); - } - }) - ]) : HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal && typeof currentVal === "string") { - value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); - } - } - }) - ]) : null - ])), - If(isOpen, () => Tag("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) - ]); - }; - - // src/components/Drawer.js - var exports_Drawer = {}; - __export(exports_Drawer, { - Drawer: () => Drawer - }); - var Drawer = (props, children) => { - const { class: className, id, open, side, content, ...rest } = props; - const drawerId = id || `drawer-${Math.random().toString(36).slice(2, 9)}`; - return Tag("div", { - ...rest, - class: ui("drawer", className) - }, [ - Tag("input", { - id: drawerId, - type: "checkbox", - class: "drawer-toggle", - checked: () => typeof open === "function" ? open() : open, - onchange: (e) => { - if (typeof open === "function") - open(e.target.checked); - } - }), - Tag("div", { class: "drawer-content" }, [ - typeof content === "function" ? content() : content - ]), - Tag("div", { class: "drawer-side" }, [ - Tag("label", { - for: drawerId, - class: "drawer-overlay", - onclick: () => { - if (typeof open === "function") - open(false); - } - }), - Tag("div", { class: "min-h-full bg-base-200 w-80" }, [ - typeof side === "function" ? side() : side - ]) - ]) - ]); - }; - - // src/components/Dropdown.js - var exports_Dropdown = {}; - __export(exports_Dropdown, { - Dropdown: () => Dropdown - }); - var currentOpen = null; - if (typeof window !== "undefined" && !window.__dropdownHandlerRegistered) { - window.addEventListener("click", (e) => { - if (currentOpen && !currentOpen.contains(e.target)) { - currentOpen.open = false; - currentOpen = null; - } - }); - window.__dropdownHandlerRegistered = true; - } - var Dropdown = (props) => { - const { class: className, label, icon, items, ...rest } = props; - return Tag("details", { - ...rest, - class: ui("dropdown", className) - }, [ - Tag("summary", { - class: "btn m-1 flex items-center gap-2 list-none cursor-pointer", - style: "display: inline-flex;", - onclick: (e) => { - const details = e.currentTarget.closest("details"); - if (currentOpen && currentOpen !== details) { - currentOpen.open = false; - } - setTimeout(() => { - currentOpen = details.open ? details : null; - }, 0); - } - }, [ - () => icon ? typeof icon === "function" ? icon() : icon : null, - () => label ? typeof label === "function" ? label() : label : null - ]), - Tag("ul", { - tabindex: "-1", - class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" - }, [ - () => { - const currentItems = typeof items === "function" ? items() : items || []; - return currentItems.map((item) => Tag("li", {}, [ - Tag("a", { - class: item.class || "", - onclick: (e) => { - if (item.onclick) - item.onclick(e); - const details = e.currentTarget.closest("details"); - if (details) { - details.open = false; - if (currentOpen === details) - currentOpen = null; - } - } - }, [ - item.icon ? Tag("span", {}, item.icon) : null, - Tag("span", {}, item.label) - ]) - ])); - } - ]) - ]); - }; - - // src/components/Fab.js - var exports_Fab = {}; - __export(exports_Fab, { - Fab: () => Fab - }); - var Fab = (props) => { - const { class: className, icon, label, actions = [], position = "bottom-6 right-6", ...rest } = props; - return Tag("div", { - ...rest, - class: ui(`fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100]`, className) - }, [ - Tag("div", { - tabindex: 0, - role: "button", - class: "btn btn-lg btn-circle btn-primary shadow-2xl" - }, [ - icon ? getIcon(icon) : null, - !icon && label ? label : null - ]), - ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? Tag("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - Tag("button", { - type: "button", - class: `btn btn-circle shadow-lg ${act.class || ""}`, - onclick: (e) => { - e.stopPropagation(); - act.onclick?.(e); - } - }, [act.icon ? getIcon(act.icon) : act.text || ""]) - ])) - ]); - }; - - // src/components/Fieldset.js - var exports_Fieldset = {}; - __export(exports_Fieldset, { - Fieldset: () => Fieldset - }); - var Fieldset = (props, children) => { - const { class: className, legend, ...rest } = props; - return Tag("fieldset", { - ...rest, - class: ui("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", className) - }, [ - () => { - const legendText = val(legend); - return legendText ? Tag("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; - }, - children - ]); - }; - - // src/components/Fileinput.js - var exports_Fileinput = {}; - __export(exports_Fileinput, { - Fileinput: () => Fileinput - }); - var Fileinput = (props) => { - const { class: className, tooltip, max = 2, accept = "*", onselect, ...rest } = props; - const selectedFiles = $([]); - const isDragging = $(false); - const error = $(null); - const MAX_BYTES = max * 1024 * 1024; - const handleFiles = (files) => { - const fileList = Array.from(files); - error(null); - const oversized = fileList.find((f) => f.size > MAX_BYTES); - if (oversized) { - error(`Máx ${max}MB`); - return; - } - selectedFiles([...selectedFiles(), ...fileList]); - onselect?.(selectedFiles()); - }; - const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); - selectedFiles(updated); - onselect?.(updated); - }; - return Tag("fieldset", { ...rest, class: ui("fieldset w-full p-0", className) }, [ - Tag("div", { - class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, - "data-tip": tooltip - }, [ - Tag("label", { - class: () => ` +(()=>{var{defineProperty:Af,getOwnPropertyNames:P_,getOwnPropertyDescriptor:A_}=Object,Q_=Object.prototype.hasOwnProperty;function X_(f){return this[f]}var G_=(f)=>{var L=(lf??=new WeakMap).get(f),E;if(L)return L;if(L=Af({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function"){for(var W of P_(f))if(!Q_.call(L,W))Af(L,W,{get:X_.bind(f,W),enumerable:!(E=A_(f,W))||E.enumerable})}return lf.set(f,L),L},lf;var K_=(f)=>f;function Z_(f,L){this[f]=K_.bind(null,L)}var U=(f,L)=>{for(var E in L)Af(f,E,{get:L[E],enumerable:!0,configurable:!0,set:Z_.bind(L,E)})};var a_={};U(a_,{Utils:()=>W_,Components:()=>L_});var Bf={};U(Bf,{Accordion:()=>U_});var T=(f)=>typeof f==="function",Gf=(f)=>f&&typeof f==="object",l=Array.isArray,u=typeof document<"u"?document:null,tf=(f)=>f?._isRuntime?f.container:f instanceof Node?f:u.createTextNode(f==null?"":String(f)),k=null,y=null,o=!1,_f=0,Ef=new Set,sf=new WeakMap,Qf=Symbol("iter"),Xf=new WeakMap,n=(f)=>{if(!f||f._disposed)return;f._disposed=!0;let L=[f];while(L.length){let E=L.pop();if(E._cleanups)E._cleanups.forEach((W)=>W()),E._cleanups.clear();if(E._children)E._children.forEach((W)=>L.push(W)),E._children.clear();if(E._deps)E._deps.forEach((W)=>W.delete(E)),E._deps.clear()}},B_=(f)=>{if(y)(y._mounts||=[]).push(f)},p=(f)=>{if(y)(y._cleanups||=new Set).add(f)},Y_=(f)=>{let L=k;k=null;try{return f()}finally{k=L}},a=(f,L=!1)=>{let E=()=>{if(E._disposed)return;if(E._deps)E._deps.forEach((Q)=>Q.delete(E));if(E._cleanups)E._cleanups.forEach((Q)=>Q()),E._cleanups.clear();let W=k,J=y;k=y=E;try{return E._result=f()}catch(Q){console.error("[SigPro]",Q)}finally{k=W,y=J}};if(E._deps=E._cleanups=E._children=null,E._disposed=!1,E._isComputed=L,E._depth=k?k._depth+1:0,E._mounts=[],E._parent=y,y)(y._children||=new Set).add(E);return E},af=()=>{if(o)return;o=!0;let f=Array.from(Ef).sort((L,E)=>L._depth-E._depth);Ef.clear();for(let L of f)if(!L._disposed)L();o=!1},q_=(f)=>{_f++;try{return f()}finally{if(_f--,_f===0&&Ef.size>0&&!o)af()}},v=(f,L=!1)=>{if(!L&&k&&!k._disposed)f.add(k),(k._deps||=new Set).add(f);else if(L&&f.size>0){let E=!1;for(let W of f){if(W===k||W._disposed)continue;if(W._isComputed){if(W._dirty=!0,W._subs)v(W._subs,!0)}else Ef.add(W),E=!0}if(E&&!o&&_f===0)queueMicrotask(af)}},V=(f,L=null)=>{let E=new Set;if(T(f)){let W,J=()=>{if(J._dirty){let Q=k;k=J;try{let P=f();if(!Object.is(W,P))W=P,v(E,!0)}finally{k=Q}J._dirty=!1}return v(E),W};if(J._isComputed=!0,J._subs=E,J._dirty=!0,J._deps=null,J._disposed=!1,J.stop=()=>{},y)p(J.stop);return J}if(L)try{f=JSON.parse(localStorage.getItem(L))??f}catch(W){}return(...W)=>{if(W.length){let J=T(W[0])?W[0](f):W[0];if(!Object.is(f,J)){if(f=J,L)localStorage.setItem(L,JSON.stringify(f));v(E,!0)}}return v(E),f}},ef=(f)=>{if(!Gf(f))return f;let L=sf.get(f);if(L)return L;let E=new Map,W=(J)=>{let Q=E.get(J);if(!Q)E.set(J,Q=new Set);return Q};return L=new Proxy(f,{get(J,Q,P){if(typeof Q!=="symbol")v(W(Q));return ef(Reflect.get(J,Q,P))},set(J,Q,P,A){let X=!Reflect.has(J,Q),G=Reflect.get(J,Q,A),Z=Reflect.set(J,Q,P,A);if(Z&&!Object.is(G,P)){if(v(W(Q),!0),X)v(W(Qf),!0)}return Z},deleteProperty(J,Q){let P=Reflect.deleteProperty(J,Q);if(P)v(W(Q),!0),v(W(Qf),!0);return P},ownKeys(J){return v(W(Qf)),Reflect.ownKeys(J)}}),sf.set(f,L),L},b=(f,L)=>{if(L===void 0){let W=a(f);return W(),()=>n(W)}let E=a(()=>{let W=Array.isArray(f)?f.map((J)=>J()):f();Y_(()=>L(W))});return E(),()=>n(E)},Kf=(f)=>{if(f._cleanups)f._cleanups.forEach((L)=>L()),f._cleanups.clear();if(f._ownerEffect)n(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Kf)},z_=/^\s*(javascript|data|vbscript):/i,C_=(f)=>f==="src"||f==="href"||f.startsWith("on"),of=(f,L)=>{if(L==null||L===!1)return null;if(C_(f)){let E=String(L);if(z_.test(E))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return L},_=(f,L={},E=[])=>{if(L instanceof Node||l(L)||!Gf(L))E=L,L={};if(T(f)){let P={_mounts:[],_cleanups:new Set},A=a(()=>{let K=f(L,{children:E,emit:(R,...z)=>L[`on${R[0].toUpperCase()}${R.slice(1)}`]?.(...z)});return A._result=K,K});A();let X=A._result;if(X==null)return null;let G=X instanceof Node||l(X)&&X.every((K)=>K instanceof Node)?X:u.createTextNode(String(X)),Z=(K)=>{if(Gf(K)&&!K._isRuntime)K._mounts=A._mounts||[],K._cleanups=A._cleanups||new Set,K._ownerEffect=A};return l(G)?G.forEach(Z):Z(G),G}let W=/^(svg|path|circle|rect|line|poly(line|gon)|g|defs|text(path)?|tspan|use|symbol|image|marker|ellipse)$/i.test(f),J=W?u.createElementNS("http://www.w3.org/2000/svg",f):u.createElement(f);J._cleanups=new Set;for(let P in L){if(!L.hasOwnProperty(P))continue;let A=L[P];if(P==="ref"){T(A)?A(J):A.current=J;continue}if(W&&P.startsWith("xlink:")){val==null?J.removeAttributeNS("http://www.w3.org/1999/xlink",P.slice(6)):J.setAttributeNS("http://www.w3.org/1999/xlink",P.slice(6),val);continue}if(P.startsWith("on")){let X=P.slice(2).toLowerCase();J.addEventListener(X,A);let G=()=>J.removeEventListener(X,A);J._cleanups.add(G),p(G)}else if(T(A)){let X=a(()=>{let G=of(P,A());if(P==="class")J.className=G||"";else if(G==null)J.removeAttribute(P);else if(P in J&&!W)J[P]=G;else J.setAttribute(P,G===!0?"":G)});if(X(),J._cleanups.add(()=>n(X)),p(()=>n(X)),/^(INPUT|TEXTAREA|SELECT)$/.test(J.tagName)&&(P==="value"||P==="checked")){let G=P==="checked"?"change":"input";J.addEventListener(G,(Z)=>A(Z.target[P]))}}else{let X=of(P,A);if(X!=null)if(P in J&&!W)J[P]=X;else J.setAttribute(P,X===!0?"":X)}}let Q=(P)=>{if(l(P))return P.forEach(Q);if(T(P)){let A=u.createTextNode("");J.appendChild(A);let X=[],G=a(()=>{let Z=P(),K=(l(Z)?Z:[Z]).map(tf);X.forEach((z)=>{if(z._isRuntime)z.destroy();else Kf(z);if(z.parentNode)z.remove()});let R=A;for(let z=K.length-1;z>=0;z--){let B=K[z];if(B.parentNode!==R.parentNode)R.parentNode?.insertBefore(B,R);if(B._mounts)B._mounts.forEach((S)=>S());R=B}X=K});G(),J._cleanups.add(()=>n(G)),p(()=>n(G))}else{let A=tf(P);if(J.appendChild(A),A._mounts)A._mounts.forEach((X)=>X())}};return Q(E),J},t=(f)=>{let L=new Set,E=[],W=y,J=k,Q=u.createElement("div");Q.style.display="contents",Q.setAttribute("role","presentation"),y={_cleanups:L,_mounts:E},k=null;let P=(A)=>{if(!A)return;if(A._isRuntime)L.add(A.destroy),Q.appendChild(A.container);else if(l(A))A.forEach(P);else Q.appendChild(A instanceof Node?A:u.createTextNode(String(A==null?"":A)))};try{P(f({onCleanup:(A)=>L.add(A)}))}finally{y=W,k=J}return E.forEach((A)=>A()),{_isRuntime:!0,container:Q,destroy:()=>{L.forEach((A)=>A()),Kf(Q),Q.remove()}}},j=(f,L,E=null)=>{let W=u.createTextNode(""),J=_("div",{style:"display:contents"},[W]),Q=null;return b(()=>!!(T(f)?f():f),(P)=>{if(Q)Q.destroy(),Q=null;let A=P?L:E;if(A)Q=t(()=>T(A)?A():A),J.insertBefore(Q.container,W)}),p(()=>Q?.destroy()),J},w=(f,L,E)=>{let W=u.createTextNode(""),J=_("div",{style:"display:contents"},[W]),Q=new Map;return b(()=>(T(f)?f():f)||[],(P)=>{let A=new Map,X=[],G=P||[];for(let K=0;KL(R,K));else Q.delete(z);A.set(z,B),X.push(B)}Q.forEach((K)=>K.destroy());let Z=W;for(let K=X.length-1;K>=0;K--){let R=X[K].container;if(R.nextSibling!==Z)J.insertBefore(R,Z);Z=R}Q=A}),J},s=(f)=>{let L=()=>window.location.hash.slice(1)||"/",E=V(L()),W=()=>E(L());window.addEventListener("hashchange",W),p(()=>window.removeEventListener("hashchange",W));let J=_("div",{class:"router-hook"}),Q=null;return b([E],()=>{let P=E(),A=f.find((X)=>{let G=X.path.split("/").filter(Boolean),Z=P.split("/").filter(Boolean);return G.length===Z.length&&G.every((K,R)=>K[0]===":"||K===Z[R])})||f.find((X)=>X.path==="*");if(A){Q?.destroy();let X={};A.path.split("/").filter(Boolean).forEach((G,Z)=>{if(G[0]===":")X[G.slice(1)]=P.split("/").filter(Boolean)[Z]}),s.params(X),Q=t(()=>T(A.component)?A.component(X):A.component),J.replaceChildren(Q.container)}}),J};s.params=V({});s.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");s.back=()=>window.history.back();s.path=()=>window.location.hash.replace(/^#/,"")||"/";var R_=(f,L,{enter:E,leave:W}={})=>{let J=_("div",{style:"display:contents"}),Q=null,P=(A,X)=>{let G=!1,Z=()=>!G&&(G=!0,X());if(!A)return Z();"transitionend animationend".split(" ").map((K)=>A.addEventListener(K,Z,{once:!0})),setTimeout(Z,500)};return b(f,(A)=>{if(A&&!Q){let X=(Q=t(L)).container.firstChild;if(J.appendChild(Q.container),E&&X)X.classList.add(E),X.clientTop,X.classList.add(E+"-active"),P(X,()=>X.classList.remove(E,E+"-active"))}else if(!A&&Q){let X=Q.container.firstChild,G=()=>(Q?.destroy(),Q=null);W&&X?(X.classList.add(W),P(X,G)):G()}}),p(()=>Q?.destroy()),J},Zf=(f,L)=>{let E=typeof L==="string"?u.querySelector(L):L;if(!E)return;if(Xf.has(E))Xf.get(E).destroy();let W=t(T(f)?f:()=>f);return E.replaceChildren(W.container),Xf.set(E,W),W},S_=Object.freeze({$:V,$$:ef,Watch:b,Tag:_,Render:t,If:j,For:w,Router:s,Mount:Zf,onMount:B_,onUnmount:p,Anim:R_,Batch:q_});if(typeof window<"u")Object.assign(window,S_),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((f)=>{let L=f[0].toUpperCase()+f.slice(1);window[L]=(E,W)=>_(f,E,W)});var Y=(f)=>typeof f==="function"?f():f,q=(f,L)=>typeof L==="function"?()=>`${f} ${L()||""}`.trim():`${f} ${L||""}`.trim(),h=(f)=>{if(!f)return null;if(typeof f==="function")return _("span",{class:"mr-1"},f());if(typeof f==="object")return _("span",{class:"mr-1"},f);if(typeof f==="string"){let L=f.trim().split(/\s+/),E=L[L.length-1]==="right",W=E?L.slice(0,-1).join(" "):f,J=E?"ml-1":"mr-1";if(W&&!W.startsWith("icon-[")&&!W.includes("--"))return _("span",{class:J},W);return _("span",{class:`${W} ${J}`.trim()})}return null},N_={es:{close:"Cerrar",confirm:"Confirmar",cancel:"Cancelar",search:"Buscar...",loading:"Cargando...",nodata:"Sin datos"},en:{close:"Close",confirm:"Confirm",cancel:"Cancel",search:"Search...",loading:"Loading...",nodata:"No data"}},f_=V("es"),__=(f)=>f_(f),E_=(f)=>()=>N_[f_()][f]||f;var U_=(f,L)=>{let{class:E,title:W,name:J,open:Q,...P}=f;return _("div",{...P,class:q("collapse collapse-arrow bg-base-200 mb-2",E)},[_("input",{type:J?"radio":"checkbox",name:J,checked:Y(Q)}),_("div",{class:"collapse-title text-xl font-medium"},W),_("div",{class:"collapse-content"},L)])};var Yf={};U(Yf,{Alert:()=>h_});var h_=(f,L)=>{let{class:E,actions:W,type:J="info",soft:Q=!0,...P}=f,A={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},Z=[`alert-${J}`,Q?"alert-soft":"",E].filter(Boolean).join(" "),K=L||f.message;return _("div",{...P,role:"alert",class:q("alert",Z)},()=>[h(A[J]),_("div",{class:"flex-1"},[_("span",{},[typeof K==="function"?K():K])]),W?_("div",{class:"flex-none"},[typeof W==="function"?W():W]):null].filter(Boolean))};var zf={};U(zf,{Autocomplete:()=>V_});var qf={};U(qf,{Input:()=>e});var e=(f)=>{let{class:L,value:E,type:W="text",icon:J,oninput:Q,placeholder:P,disabled:A,validate:X,label:G,...Z}=f,K=W==="password",R=$(!1),z=$(null),B={text:"icon-[lucide--text]",password:"icon-[lucide--lock]",date:"icon-[lucide--calendar]",number:"icon-[lucide--hash]",email:"icon-[lucide--mail]",search:"icon-[lucide--search]",tel:"icon-[lucide--phone]",url:"icon-[lucide--link]"},S=J?h(J):B[W]?h(B[W]):null,D=()=>h(R()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),F=S?"pl-10":"",I=K?"pr-10":"",r=()=>{if(L?.includes("input-xs"))return"btn-xs";if(L?.includes("input-sm"))return"btn-sm";if(L?.includes("input-lg"))return"btn-lg";return"btn-md"},i=(O)=>{let g=O.target.value;if(X){let Lf=X(g);z(Lf||null)}Q?.(O)},M=()=>z()&&z()!=="",N=_("input",{...Z,type:()=>K?R()?"text":"password":W,placeholder:P||(G?" ":P),class:()=>{let O=`input w-full ${F} ${I}`;if(L)O+=` ${L}`;if(M())O+=" input-error";return O.trim()},value:E,oninput:i,disabled:()=>Y(A),"aria-invalid":()=>M()?"true":"false"}),H=()=>[N,S?_("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},S):null,K?_("button",{type:"button",class:q("absolute right-3 inset-y-0 flex items-center","btn btn-ghost btn-circle opacity-50 hover:opacity-100",r()),onclick:(O)=>{O.preventDefault(),R(!R())}},()=>D()):null,_("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>M()?z():null)];if(G)return _("label",{class:q("floating-label w-full",L)},()=>[_("div",{class:"relative w-full"},H),_("span",{},Y(G))]);return _("div",{class:"relative w-full"},H)};var V_=(f)=>{let{class:L,items:E=[],value:W,onselect:J,label:Q,placeholder:P,...A}=f,X=V(Y(W)||""),G=V(!1),Z=V(-1),K=V([]);Watch(()=>{let B=String(X()).toLowerCase(),S=Y(E)||[],D=B?S.filter((F)=>(typeof F==="string"?F:F.label).toLowerCase().includes(B)):S;K(D)});let R=(B)=>{let S=typeof B==="string"?B:B.value,D=typeof B==="string"?B:B.label;if(X(D),typeof W==="function")W(S);J?.(B),G(!1),Z(-1)};return _("div",{class:"relative w-full"},[e({label:Q,class:L,placeholder:P,value:X,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:(B)=>{let S=K();if(B.key==="ArrowDown")B.preventDefault(),G(!0),Z(Math.min(Z()+1,S.length-1));else if(B.key==="ArrowUp")B.preventDefault(),Z(Math.max(Z()-1,0));else if(B.key==="Enter"&&Z()>=0)B.preventDefault(),R(S[Z()]);else if(B.key==="Escape")G(!1)},oninput:(B)=>{let S=B.target.value;if(X(S),typeof W==="function")W(S);G(!0),Z(-1)},...A}),_("ul",{class:"absolute dropdown-menu left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50",style:()=>G()&&K().length?"display:block":"display:none"},[w(K,(B,S)=>_("li",{},[_("a",{class:()=>`block w-full ${Z()===S?"active bg-primary text-primary-content":""}`,onclick:()=>R(B),onmouseenter:()=>Z(S)},typeof B==="string"?B:B.label)]),(B,S)=>(typeof B==="string"?B:B.value)+S),()=>K().length?null:_("li",{class:"p-2 text-center opacity-50"},"nodata")])])};var Cf={};U(Cf,{Badge:()=>D_});var D_=(f,L)=>{let{class:E,...W}=f;return _("span",{...W,class:q("badge",E)},L)};var Rf={};U(Rf,{Button:()=>ff});var ff=(f,L)=>{let{class:E,loading:W,icon:J,...Q}=f,P=h(J);return _("button",{...Q,class:q("btn",E),disabled:()=>Y(W)||Y(f.disabled)},()=>[Y(W)&&_("span",{class:"loading loading-spinner"}),P,L].filter(Boolean))};var Sf={};U(Sf,{Checkbox:()=>O_});var O_=(f)=>{let{class:L,value:E,toggle:W,label:J,...Q}=f,P=_("input",{...Q,type:"checkbox",class:()=>q(Y(W)?"toggle":"checkbox",L),checked:E});return _("label",{class:"label cursor-pointer justify-start gap-3"},[P,J?_("span",{class:"label-text"},J):null])};var Nf={};U(Nf,{Colorpicker:()=>H_});var H_=(f)=>{let{class:L,value:E,label:W,...J}=f,Q=V(!1),P=["#000","#1A1A1A","#333","#4D4D4D","#666","#808080","#B3B3B3","#FFF","#450a0a","#7f1d1d","#991b1b","#b91c1c","#dc2626","#ef4444","#f87171","#fca5a5","#431407","#7c2d12","#9a3412","#c2410c","#ea580c","#f97316","#fb923c","#ffedd5","#713f12","#a16207","#ca8a04","#eab308","#facc15","#fde047","#fef08a","#fff9c4","#064e3b","#065f46","#059669","#10b981","#34d399","#4ade80","#84cc16","#d9f99d","#082f49","#075985","#0284c7","#0ea5e9","#38bdf8","#7dd3fc","#22d3ee","#cffafe","#1e1b4b","#312e81","#4338ca","#4f46e5","#6366f1","#818cf8","#a5b4fc","#e0e7ff","#2e1065","#4c1d95","#6d28d9","#7c3aed","#8b5cf6","#a855f7","#d946ef","#fae8ff"],A=()=>Y(E)||"#000000";return _("div",{class:q("relative w-fit",L)},[_("button",{type:"button",class:"btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case",onclick:(X)=>{X.stopPropagation(),Q(!Q())},...J},[_("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${A()}`}),W?_("span",{class:"opacity-80"},W):null]),j(Q,()=>_("div",{class:"absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none",onclick:(X)=>X.stopPropagation()},[_("div",{class:"grid grid-cols-8 gap-1"},P.map((X)=>_("button",{type:"button",style:`background-color: ${X}`,class:()=>{return`size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 + ${A().toLowerCase()===X.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof E==="function")E(X);Q(!1)}})))])),j(Q,()=>_("div",{class:"fixed inset-0 z-[100]",onclick:()=>Q(!1)}))])};var Uf={};U(Uf,{Datepicker:()=>k_});var k_=(f)=>{let{class:L,value:E,range:W,label:J,placeholder:Q,hour:P=!1,...A}=f,X=V(!1),G=V(new Date),Z=V(null),K=V(0),R=V(0),z=()=>Y(W)===!0,B=new Date,S=`${B.getFullYear()}-${String(B.getMonth()+1).padStart(2,"0")}-${String(B.getDate()).padStart(2,"0")}`,D=(C)=>{let N=C.getFullYear(),H=String(C.getMonth()+1).padStart(2,"0"),O=String(C.getDate()).padStart(2,"0");return`${N}-${H}-${O}`},F=(C)=>{let N=D(C),H=Y(E);if(z())if(!H?.start||H.start&&H.end){if(typeof E==="function")E({start:N,end:null,...P&&{startHour:K()}})}else{let O=H.start;if(typeof E==="function"){let g=N{let C=Y(E);if(!C){I("");return}let N="";if(typeof C==="string")N=P&&C.includes("T")?C.replace("T"," "):C;else if(C.start&&C.end){let H=P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start,O=P&&C.endHour!==void 0?`${C.end} ${String(C.endHour).padStart(2,"0")}:00`:C.end;N=`${H} - ${O}`}else if(C.start)N=`${P&&C.startHour!==void 0?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start}...`;I(N)});let r=(C)=>{let N=G();G(new Date(N.getFullYear(),N.getMonth()+C,1))},i=(C)=>{let N=G();G(new Date(N.getFullYear()+C,N.getMonth(),1))},M=({value:C,onChange:N})=>{return _("div",{class:"flex-1"},[_("div",{class:"flex gap-2 items-center"},[_("input",{type:"range",min:0,max:23,value:C,class:"range range-xs flex-1",oninput:(H)=>{let O=parseInt(H.target.value);N(O)}}),_("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(Y(C)).padStart(2,"0")+":00")])])};return _("div",{class:q("relative w-full",L)},[e({label:J,placeholder:Q||(z()?"Seleccionar rango...":"Seleccionar fecha..."),value:I,readonly:!0,icon:h("icon-[lucide--calendar]"),onclick:(C)=>{C.stopPropagation(),X(!X())},...A}),j(X,()=>_("div",{class:"absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none",onclick:(C)=>C.stopPropagation()},[_("div",{class:"flex justify-between items-center mb-4 gap-1"},[_("div",{class:"flex gap-0.5"},[_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(-1)},h("icon-[lucide--chevrons-left]")),_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(-1)},h("icon-[lucide--chevron-left]"))]),_("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().toLocaleString("es-ES",{month:"short",year:"numeric"})]),_("div",{class:"flex gap-0.5"},[_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(1)},h("icon-[lucide--chevron-right]")),_("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>i(1)},h("icon-[lucide--chevrons-right]"))])]),_("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>Z(null)},[...["L","M","X","J","V","S","D"].map((C)=>_("div",{class:"text-[10px] opacity-40 font-bold text-center"},C)),()=>{let C=G(),N=C.getFullYear(),H=C.getMonth(),O=new Date(N,H,1).getDay(),g=O===0?6:O-1,Lf=new Date(N,H+1,0).getDate(),Wf=[];for(let c=0;c{let d=Y(E),$f=Z(),$_=typeof d==="string"?d.split("T")[0]===x:d?.start===x,J_=d?.end===x,Jf=!1;if(z()&&d?.start){let Pf=d.start;if(!d.end&&$f)Jf=x>Pf&&x<=$f||x=$f;else if(d.end)Jf=x>Pf&&x{if(z())Z(x)},onclick:()=>F(rf)},[c.toString()]))}return Wf}]),P?_("div",{class:"mt-3 pt-2 border-t border-base-300"},[z()?_("div",{class:"flex gap-4"},[M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N?.start)E({...N,startHour:C})}}),M({value:R,onChange:(C)=>{R(C);let N=Y(E);if(N?.end)E({...N,endHour:C})}})]):M({value:K,onChange:(C)=>{K(C);let N=Y(E);if(N&&typeof N==="string")E(N.split("T")[0]+"T"+String(C).padStart(2,"0")+":00:00")}})]):null])),j(X,()=>_("div",{class:"fixed inset-0 z-[90]",onclick:()=>X(!1)}))])};var hf={};U(hf,{Drawer:()=>F_});var F_=(f,L)=>{let{class:E,id:W,open:J,side:Q,content:P,...A}=f,X=W||`drawer-${Math.random().toString(36).slice(2,9)}`;return _("div",{...A,class:q("drawer",E)},[_("input",{id:X,type:"checkbox",class:"drawer-toggle",checked:()=>typeof J==="function"?J():J,onchange:(G)=>{if(typeof J==="function")J(G.target.checked)}}),_("div",{class:"drawer-content"},[typeof P==="function"?P():P]),_("div",{class:"drawer-side"},[_("label",{for:X,class:"drawer-overlay",onclick:()=>{if(typeof J==="function")J(!1)}}),_("div",{class:"min-h-full bg-base-200 w-80"},[typeof Q==="function"?Q():Q])])])};var Vf={};U(Vf,{Dropdown:()=>y_});var m=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(m&&!m.contains(f.target))m.open=!1,m=null}),window.__dropdownHandlerRegistered=!0;var y_=(f)=>{let{class:L,label:E,icon:W,items:J,...Q}=f;return _("details",{...Q,class:q("dropdown",L)},[_("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(P)=>{let A=P.currentTarget.closest("details");if(m&&m!==A)m.open=!1;setTimeout(()=>{m=A.open?A:null},0)}},[()=>W?typeof W==="function"?W():W:null,()=>E?typeof E==="function"?E():E:null]),_("ul",{tabindex:"-1",class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[()=>{return(typeof J==="function"?J():J||[]).map((A)=>_("li",{},[_("a",{class:A.class||"",onclick:(X)=>{if(A.onclick)A.onclick(X);let G=X.currentTarget.closest("details");if(G){if(G.open=!1,m===G)m=null}}},[A.icon?_("span",{},A.icon):null,_("span",{},A.label)])]))}])])};var Df={};U(Df,{Fab:()=>w_});var w_=(f)=>{let{class:L,icon:E,label:W,actions:J=[],position:Q="bottom-6 right-6",...P}=f;return _("div",{...P,class:q(`fab absolute ${Q} flex flex-col-reverse items-end gap-3 z-[100]`,L)},[_("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[E?h(E):null,!E&&W?W:null]),...Y(J).map((A)=>_("div",{class:"flex items-center gap-3 transition-all duration-300"},[A.label?_("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},A.label):null,_("button",{type:"button",class:`btn btn-circle shadow-lg ${A.class||""}`,onclick:(X)=>{X.stopPropagation(),A.onclick?.(X)}},[A.icon?h(A.icon):A.text||""])]))])};var Of={};U(Of,{Fieldset:()=>M_});var M_=(f,L)=>{let{class:E,legend:W,...J}=f;return _("fieldset",{...J,class:q("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",E)},[()=>{let Q=Y(W);return Q?_("legend",{class:"fieldset-legend font-bold"},[Q]):null},L])};var Hf={};U(Hf,{Fileinput:()=>j_});var j_=(f)=>{let{class:L,tooltip:E,max:W=2,accept:J="*",onselect:Q,...P}=f,A=V([]),X=V(!1),G=V(null),Z=W*1024*1024,K=(z)=>{let B=Array.from(z);if(G(null),B.find((D)=>D.size>Z)){G(`Máx ${W}MB`);return}A([...A(),...B]),Q?.(A())},R=(z)=>{let B=A().filter((S,D)=>D!==z);A(B),Q?.(B)};return _("fieldset",{...P,class:q("fieldset w-full p-0",L)},[_("div",{class:()=>`w-full ${E?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":E},[_("label",{class:()=>` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-200 - ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} - `, - ondragover: (e) => { - e.preventDefault(); - isDragging(true); - }, - ondragleave: () => isDragging(false), - ondrop: (e) => { - e.preventDefault(); - isDragging(false); - handleFiles(e.dataTransfer.files); - } - }, [ - Tag("div", { class: "flex items-center gap-3 w-full" }, [ - getIcon("icon-[lucide--upload]"), - Tag("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - Tag("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) - ]), - Tag("input", { - type: "file", - multiple: true, - accept, - class: "hidden", - onchange: (e) => handleFiles(e.target.files) - }) - ]) - ]), - () => error() ? Tag("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, - If(() => selectedFiles().length > 0, () => Tag("ul", { class: "mt-2 space-y-1" }, [ - For(selectedFiles, (file, index) => Tag("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - Tag("div", { class: "flex items-center gap-2 truncate" }, [ - Tag("span", { class: "opacity-50" }, "\uD83D\uDCC4"), - Tag("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - Tag("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) - ]), - Tag("button", { - type: "button", - class: "btn btn-ghost btn-xs btn-circle", - onclick: (e) => { - e.preventDefault(); - e.stopPropagation(); - removeFile(index); - } - }, [getIcon("icon-[lucide--x]")]) - ]), (file) => file.name + file.lastModified) - ])) - ]); - }; - - // src/components/Indicator.js - var exports_Indicator = {}; - __export(exports_Indicator, { - Indicator: () => Indicator - }); - var Indicator = (props, children) => { - const { value, class: className, ...rest } = props; - return Tag("div", { - ...rest, - class: "indicator" - }, () => [ - value ? Tag("span", { - class: ui("indicator-item badge", className) - }, () => typeof value === "function" ? value() : value) : null, - children - ].filter(Boolean)); - }; - - // src/components/Label.js - var exports_Label = {}; - __export(exports_Label, { - Label: () => Label - }); - var Label = (props) => { - const { children, value, floating = false, class: className, ...rest } = props; - if (floating) { - return Tag("label", { class: ui("floating-label", className), ...rest }, () => [ - typeof children === "function" ? children() : children, - value ? Tag("span", {}, val(value)) : null - ]); - } - return Tag("label", { class: ui("label", className), ...rest }, () => [ - value ? Tag("span", { class: "label-text" }, val(value)) : null, - typeof children === "function" ? children() : children - ]); - }; - - // src/components/List.js - var exports_List = {}; - __export(exports_List, { - List: () => List - }); - var List = (props) => { - const { class: className, items, header, render = (item) => item, keyFn = (item, index) => item.id ?? index, ...rest } = props; - const listItems = For(items, (item, index) => Tag("li", { - class: "list-row", - style: "width: 100%; display: block;" - }, [ - Tag("div", { style: "width: 100%;" }, [render(item, index)]) - ]), keyFn); - return Tag("ul", { - ...rest, - style: "display: block; width: 100%;", - class: ui("list bg-base-100 rounded-box shadow-md", className) - }, header ? [If(header, () => Tag("li", { class: "p-4 pb-2 text-xs opacity-60", style: "width: 100%;" }, [val(header)])), listItems] : listItems); - }; - - // src/components/Menu.js - var exports_Menu = {}; - __export(exports_Menu, { - Menu: () => Menu - }); - var Menu = (props) => { - const { class: className, items, ...rest } = props; - const renderItems = (items2) => For(() => items2 || [], (it) => Tag("li", {}, [ - it.children ? Tag("details", { open: it.open }, [ - Tag("summary", {}, [it.icon && Tag("span", { class: "mr-2" }, it.icon), it.label]), - Tag("ul", {}, renderItems(it.children)) - ]) : Tag("a", { class: () => val(it.active) ? "active" : "", onclick: it.onclick }, [ - it.icon && Tag("span", { class: "mr-2" }, it.icon), - it.label - ]) - ]), (it, i) => it.label || i); - return Tag("ul", { ...rest, class: ui("menu bg-base-200 rounded-box", className) }, renderItems(items)); - }; - - // src/components/Modal.js - var exports_Modal = {}; - __export(exports_Modal, { - Modal: () => Modal - }); - var Modal = (props, children) => { - const { class: className, title, buttons, open, ...rest } = props; - let dialogElement = null; - const handleOpen = () => { - const isOpen = typeof open === "function" ? open() : open; - if (!dialogElement) - return; - if (isOpen) { - if (!dialogElement.open) - dialogElement.showModal(); - } else { - if (dialogElement.open) - dialogElement.close(); - } - }; - Watch(() => handleOpen()); - const close = () => { - if (typeof open === "function") - open(false); - }; - return Tag("dialog", { - ...rest, - ref: (el) => { - dialogElement = el; - if (el) - handleOpen(); - }, - class: ui("modal", className), - onclose: close, - oncancel: close - }, [ - Tag("div", { class: "modal-box" }, [ - title ? Tag("h3", { class: "text-lg font-bold mb-4" }, () => typeof title === "function" ? title() : title) : null, - Tag("div", { class: "py-2" }, [ - typeof children === "function" ? children() : children - ]), - Tag("div", { class: "modal-action" }, [ - Tag("form", { method: "dialog", class: "flex gap-2" }, [ - ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "submit" }, tt("close")()) - ]) - ]) - ]), - Tag("form", { method: "dialog", class: "modal-backdrop" }, [ - Tag("button", {}, "close") - ]) - ]); - }; - - // src/components/Navbar.js - var exports_Navbar = {}; - __export(exports_Navbar, { - Navbar: () => Navbar - }); - var Navbar = (props, children) => { - const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("navbar bg-base-100 shadow-sm px-4", className) }, children); - }; - - // src/components/Radio.js - var exports_Radio = {}; - __export(exports_Radio, { - Radio: () => Radio - }); - var Radio = (props) => { - const { class: className, label, tooltip, value, inputValue, name, ...rest } = props; - const radioEl = Tag("input", { - ...rest, - type: "radio", - name, - class: ui("radio", className), - checked: () => val(value) === inputValue, - onclick: () => { - if (typeof value === "function") - value(inputValue); - } - }); - if (!label && !tooltip) - return radioEl; - const layout = Tag("label", { class: "label cursor-pointer justify-start gap-3" }, [ - radioEl, - label ? Tag("span", { class: "label-text" }, label) : null - ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; - }; - - // src/components/Range.js - var exports_Range = {}; - __export(exports_Range, { - Range: () => Range - }); - var Range = (props) => { - const { class: className, label, tooltip, value, ...rest } = props; - const rangeEl = Tag("input", { - ...rest, - type: "range", - class: ui("range", className), - value, - disabled: () => val(props.disabled) - }); - if (!label && !tooltip) - return rangeEl; - const layout = Tag("div", { class: "flex flex-col gap-2" }, [ - label ? Tag("span", { class: "label-text" }, label) : null, - rangeEl - ]); - return tooltip ? Tag("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; - }; - - // src/components/Rating.js - var exports_Rating = {}; - __export(exports_Rating, { - Rating: () => Rating - }); - var Rating = (props) => { - const { class: className, value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; - const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - return Tag("div", { - ...rest, - class: () => ui(`rating ${val(readonly) ? "pointer-events-none" : ""}`, className) - }, Array.from({ length: val(count) }, (_, i) => { - const starValue = i + 1; - return Tag("input", { - type: "radio", - name: ratingGroup, - class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, - onchange: () => { - if (!val(readonly)) { - if (typeof onchange === "function") { - onchange(starValue); - } else if (typeof value === "function") { - value(starValue); - } - } - } - }); - })); - }; - - // src/components/Select.js - var exports_Select = {}; - __export(exports_Select, { - Select: () => Select - }); - var Select = (props) => { - const { class: className, label, items, value, ...rest } = props; - const selectEl = Tag("select", { - ...rest, - class: ui("select select-bordered w-full", className), - value - }, For(() => val(items) || [], (opt) => Tag("option", { - value: opt.value, - $selected: () => String(val(value)) === String(opt.value) - }, opt.label), (opt) => opt.value)); - if (!label) - return selectEl; - return Tag("label", { class: "fieldset-label flex flex-col gap-1" }, [ - Tag("span", {}, label), - selectEl - ]); - }; - - // src/components/Stack.js - var exports_Stack = {}; - __export(exports_Stack, { - Stack: () => Stack - }); - var Stack = (props, children) => { - const { class: className, ...rest } = props; - return Tag("div", { ...rest, class: ui("stack", className) }, children); - }; - - // src/components/Stat.js - var exports_Stat = {}; - __export(exports_Stat, { - Stat: () => Stat - }); - var Stat = (props) => { - const { class: className, icon, label, value, desc, ...rest } = props; - return Tag("div", { ...rest, class: ui("stat", className) }, [ - icon && Tag("div", { class: "stat-figure text-secondary" }, icon), - label && Tag("div", { class: "stat-title" }, label), - Tag("div", { class: "stat-value" }, () => val(value) ?? value), - desc && Tag("div", { class: "stat-desc" }, desc) - ]); - }; - - // src/components/Swap.js - var exports_Swap = {}; - __export(exports_Swap, { - Swap: () => Swap - }); - var Swap = (props) => { - const { class: className, value, on, off, ...rest } = props; - return Tag("label", { ...rest, class: ui("swap", className) }, [ - Tag("input", { - type: "checkbox", - checked: () => val(value), - onclick: (e) => { - if (typeof value === "function") { - value(e.target.checked); - } - } - }), - Tag("div", { class: "swap-on" }, on), - Tag("div", { class: "swap-off" }, off) - ]); - }; - - // src/components/Table.js - var exports_Table = {}; - __export(exports_Table, { - Table: () => Table - }); - var Table = (props) => { - const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = tt("nodata")(), ...rest } = props; - const tableClass = () => { - const zebraClass = val(zebra) ? "table-zebra" : ""; - const pinRowsClass = val(pinRows) ? "table-pin-rows" : ""; - return ui("table", className, zebraClass, pinRowsClass); - }; - const getInternalKeyFn = keyFn || ((item, idx) => item.id || idx); - return Tag("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - Tag("table", { ...rest, class: tableClass }, [ - Tag("thead", {}, [ - Tag("tr", {}, columns.map((col) => Tag("th", { class: col.class || "" }, col.label))) - ]), - Tag("tbody", {}, [ - For(items, (item, index) => { - const it = () => { - const currentItems = val(items); - const key = getInternalKeyFn(item, index); - return currentItems.find((u, i) => getInternalKeyFn(u, i) === key) || item; - }; - return Tag("tr", { class: "hover" }, columns.map((col) => { - const cellContent = () => { - const latestItem = it(); - if (col.render) - return col.render(latestItem, index); - return val(latestItem[col.key]); - }; - return Tag("td", { class: col.class || "" }, [cellContent]); - })); - }, getInternalKeyFn), - If(() => val(items).length === 0, () => Tag("tr", {}, [ - Tag("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) - ]) - ])) - ]) - ]) - ]); - }; - - // src/components/Tabs.js - var exports_Tabs = {}; - __export(exports_Tabs, { - Tabs: () => Tabs - }); - var Tabs = (props) => { - const { items, class: className, onTabClose, ...rest } = props; - const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $2(0); - Watch2(() => { - const list = itemsSignal(); - const idx = list.findIndex((it) => val(it.active) === true); - if (idx !== -1 && activeIndex() !== idx) { - activeIndex(idx); - } - }); - const removeTab = (indexToRemove, item) => { - if (item.onClose) - item.onClose(item); - if (onTabClose) - onTabClose(item, indexToRemove); - const currentItems = itemsSignal(); - const newItems = currentItems.filter((_, idx) => idx !== indexToRemove); - const isWritableSignal = typeof items === "function" && !items._isComputed; - if (!isWritableSignal) { - console.warn("Tabs: items must be a writable signal to support closable tabs"); - return; - } - items(newItems); - if (newItems.length === 0) - return; - let newActive = activeIndex(); - if (indexToRemove < newActive) - newActive--; - else if (indexToRemove === newActive) - newActive = Math.min(newActive, newItems.length - 1); - activeIndex(newActive); - }; - return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { - const list = itemsSignal(); - const elements = []; - for (let i = 0;i < list.length; i++) { - const item = list[i]; - const label = val(item.label); - const labelNode = label instanceof Node ? label : document.createTextNode(String(label)); - const buttonChildren = []; - if (item.closable) { - const closeIcon = getIcon("icon-[lucide--x]"); - closeIcon.classList.add("w-3.5", "h-3.5", "ml-2", "cursor-pointer", "hover:opacity-70"); - closeIcon.onclick = (e) => { - e.stopPropagation(); - removeTab(i, item); - }; - const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); - buttonChildren.push(wrapper); - } else { - buttonChildren.push(labelNode); - } - const buttonBase = Tag2("button", { - class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), - onclick: (e) => { - e.preventDefault(); - if (!val(item.disabled)) { - if (item.onclick) - item.onclick(); - activeIndex(i); - } - } - }, buttonChildren); - const button = item.tip ? Tag2("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) : buttonBase; - elements.push(button); - let contentNode; - const rawContent = val(item.content); - if (typeof rawContent === "function") { - contentNode = rawContent(); - } else if (rawContent instanceof Node) { - contentNode = rawContent; - } else { - contentNode = document.createTextNode(String(rawContent)); - } - const inner = Tag2("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag2("div", { - class: "tab-content bg-base-100 border-base-300 p-6", - style: () => activeIndex() === i ? "display: block" : "display: none" - }, inner); - elements.push(panel); - } - return elements; - }); - }; - - // src/components/Timeline.js - var exports_Timeline = {}; - __export(exports_Timeline, { - Timeline: () => Timeline - }); - var Timeline = (props) => { - const { class: className, items = [], vertical = true, compact = false, ...rest } = props; - const iconMap = { - info: "icon-[lucide--info]", - success: "icon-[lucide--check-circle]", - warning: "icon-[lucide--alert-triangle]", - error: "icon-[lucide--alert-circle]" - }; - return Tag("ul", { - ...rest, - class: () => ui(`timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val(compact) ? "timeline-compact" : ""}`, className) - }, () => { - const list = (typeof items === "function" ? items() : items) || []; - return list.map((item, i) => { - const isFirst = i === 0; - const isLast = i === list.length - 1; - const itemType = item.type || "success"; - const isCompleted = () => val(item.completed); - const prevCompleted = () => i > 0 && val(list[i - 1].completed); - const renderSlot = (content) => typeof content === "function" ? content() : content; - return Tag("li", { class: "flex-1" }, [ - !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, - Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), - Tag("div", { class: "timeline-middle" }, [ - () => item.icon ? getIcon(item.icon) : getIcon(iconMap[itemType] || iconMap.success) - ]), - Tag("div", { class: "timeline-end timeline-box shadow-sm" }, [() => renderSlot(item.detail)]), - !isLast ? Tag("hr", { class: () => isCompleted() ? "bg-primary" : "" }) : null - ]); - }); - }); - }; - - // src/components/Toast.js - var exports_Toast = {}; - __export(exports_Toast, { - Toast: () => Toast - }); - var Toast = (message, type = "alert-success", duration = 3500) => { - let container = document.getElementById("sigpro-toast-container"); - if (!container) { - container = Tag("div", { - id: "sigpro-toast-container", - class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none" - }); - document.body.appendChild(container); - } - const toastHost = Tag("div", { style: "display: contents" }); - container.appendChild(toastHost); - let timeoutId; - const close = () => { - clearTimeout(timeoutId); - const el = toastHost.firstElementChild; - if (el && !el.classList.contains("opacity-0")) { - el.classList.add("translate-x-full", "opacity-0"); - setTimeout(() => { - instance.destroy(); - toastHost.remove(); - if (!container.hasChildNodes()) - container.remove(); - }, 300); - } else { - instance.destroy(); - toastHost.remove(); - } - }; - const ToastComponent = () => { - const closeIcon = getIcon("icon-[lucide--x]"); - const el = Tag("div", { - class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto` - }, [ - Tag("span", {}, [typeof message === "function" ? message() : message]), - Button({ - class: "btn-xs btn-circle btn-ghost", - onclick: close - }, closeIcon) - ]); - requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); - return el; - }; - const instance = Mount(ToastComponent, toastHost); - if (duration > 0) { - timeoutId = setTimeout(close, duration); - } - return close; - }; - - // src/components/Tooltip.js - var exports_Tooltip = {}; - __export(exports_Tooltip, { - Tooltip: () => Tooltip - }); - var Tooltip = (props, children) => Tag("div", { - ...props, - class: () => ui("tooltip w-full", props.class), - "data-tip": props.tip - }, children); - - // src/components/index.js - var Components = { - ...exports_Accordion, - ...exports_Alert, - ...exports_Autocomplete, - ...exports_Badge, - ...exports_Button, - ...exports_Checkbox, - ...exports_Colorpicker, - ...exports_Datepicker, - ...exports_Drawer, - ...exports_Dropdown, - ...exports_Fab, - ...exports_Fieldset, - ...exports_Fileinput, - ...exports_Indicator, - ...exports_Input, - ...exports_Label, - ...exports_List, - ...exports_Menu, - ...exports_Modal, - ...exports_Navbar, - ...exports_Radio, - ...exports_Range, - ...exports_Rating, - ...exports_Select, - ...exports_Stack, - ...exports_Stat, - ...exports_Swap, - ...exports_Table, - ...exports_Tabs, - ...exports_Timeline, - ...exports_Toast, - ...exports_Tooltip - }; - var components_default = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("\uD83D\uDE80 SigproUI"); - } - }; - // index.js - if (typeof window !== "undefined") { - Object.entries(exports_components).forEach(([name, component]) => { - Object.defineProperty(window, name, { - value: component, - writable: false, - configurable: true, - enumerable: true - }); - }); - Object.entries(exports_utils).forEach(([name, fn]) => { - Object.defineProperty(window, name, { - value: fn, - writable: false, - configurable: true, - enumerable: true - }); - }); - Object.defineProperty(window, "tt", { - value: tt, - writable: false, - configurable: true, - enumerable: true - }); - Object.defineProperty(window, "SigProUI", { - value: { ...exports_components, Utils: exports_utils, tt }, - writable: false, - configurable: true, - enumerable: true - }); - console.log("\uD83C\uDFA8 SigProUI ready"); - } -})(); + ${X()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(z)=>{z.preventDefault(),X(!0)},ondragleave:()=>X(!1),ondrop:(z)=>{z.preventDefault(),X(!1),K(z.dataTransfer.files)}},[_("div",{class:"flex items-center gap-3 w-full"},[h("icon-[lucide--upload]"),_("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),_("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${W}MB`)]),_("input",{type:"file",multiple:!0,accept:J,class:"hidden",onchange:(z)=>K(z.target.files)})])]),()=>G()?_("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,j(()=>A().length>0,()=>_("ul",{class:"mt-2 space-y-1"},[w(A,(z,B)=>_("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[_("div",{class:"flex items-center gap-2 truncate"},[_("span",{class:"opacity-50"},"\uD83D\uDCC4"),_("span",{class:"truncate font-medium max-w-[200px]"},z.name),_("span",{class:"text-[9px] opacity-40"},`(${(z.size/1024).toFixed(0)} KB)`)]),_("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(S)=>{S.preventDefault(),S.stopPropagation(),R(B)}},[h("icon-[lucide--x]")])]),(z)=>z.name+z.lastModified)]))])};var kf={};U(kf,{Indicator:()=>I_});var I_=(f,L)=>{let{value:E,class:W,...J}=f;return _("div",{...J,class:"indicator"},()=>[E?_("span",{class:q("indicator-item badge",W)},()=>typeof E==="function"?E():E):null,L].filter(Boolean))};var Ff={};U(Ff,{Label:()=>x_});var x_=(f)=>{let{children:L,value:E,floating:W=!1,class:J,...Q}=f;if(W)return _("label",{class:q("floating-label",J),...Q},()=>[typeof L==="function"?L():L,E?_("span",{},Y(E)):null]);return _("label",{class:q("label",J),...Q},()=>[E?_("span",{class:"label-text"},Y(E)):null,typeof L==="function"?L():L])};var yf={};U(yf,{List:()=>v_});var v_=(f)=>{let{class:L,items:E,header:W,render:J=(X)=>X,keyFn:Q=(X,G)=>X.id??G,...P}=f,A=w(E,(X,G)=>_("li",{class:"list-row",style:"width: 100%; display: block;"},[_("div",{style:"width: 100%;"},[J(X,G)])]),Q);return _("ul",{...P,style:"display: block; width: 100%;",class:q("list bg-base-100 rounded-box shadow-md",L)},W?[j(W,()=>_("li",{class:"p-4 pb-2 text-xs opacity-60",style:"width: 100%;"},[Y(W)])),A]:A)};var wf={};U(wf,{Menu:()=>T_});var T_=(f)=>{let{class:L,items:E,...W}=f,J=(Q)=>w(()=>Q||[],(P)=>_("li",{},[P.children?_("details",{open:P.open},[_("summary",{},[P.icon&&_("span",{class:"mr-2"},P.icon),P.label]),_("ul",{},J(P.children))]):_("a",{class:()=>Y(P.active)?"active":"",onclick:P.onclick},[P.icon&&_("span",{class:"mr-2"},P.icon),P.label])]),(P,A)=>P.label||A);return _("ul",{...W,class:q("menu bg-base-200 rounded-box",L)},J(E))};var Mf={};U(Mf,{Modal:()=>u_});var u_=(f,L)=>{let{class:E,title:W,buttons:J,open:Q,...P}=f,A=null,X=()=>{let Z=typeof Q==="function"?Q():Q;if(!A)return;if(Z){if(!A.open)A.showModal()}else if(A.open)A.close()};b(()=>X());let G=()=>{if(typeof Q==="function")Q(!1)};return _("dialog",{...P,ref:(Z)=>{if(A=Z,Z)X()},class:q("modal",E),onclose:G,oncancel:G},[_("div",{class:"modal-box"},[W?_("h3",{class:"text-lg font-bold mb-4"},()=>typeof W==="function"?W():W):null,_("div",{class:"py-2"},[typeof L==="function"?L():L]),_("div",{class:"modal-action"},[_("form",{method:"dialog",class:"flex gap-2"},[...(Array.isArray(J)?J:[J]).filter(Boolean),ff({type:"submit"},"close")])])]),_("form",{method:"dialog",class:"modal-backdrop"},[_("button",{},"close")])])};var jf={};U(jf,{Navbar:()=>b_});var b_=(f,L)=>{let{class:E,...W}=f;return _("div",{...W,class:q("navbar bg-base-100 shadow-sm px-4",E)},L)};var If={};U(If,{Radio:()=>m_});var m_=(f)=>{let{class:L,label:E,tooltip:W,value:J,inputValue:Q,name:P,...A}=f,X=_("input",{...A,type:"radio",name:P,class:q("radio",L),checked:()=>Y(J)===Q,onclick:()=>{if(typeof J==="function")J(Q)}});if(!E&&!W)return X;let G=_("label",{class:"label cursor-pointer justify-start gap-3"},[X,E?_("span",{class:"label-text"},E):null]);return W?_("div",{class:"tooltip","data-tip":W},G):G};var xf={};U(xf,{Range:()=>d_});var d_=(f)=>{let{class:L,label:E,tooltip:W,value:J,...Q}=f,P=_("input",{...Q,type:"range",class:q("range",L),value:J,disabled:()=>Y(f.disabled)});if(!E&&!W)return P;let A=_("div",{class:"flex flex-col gap-2"},[E?_("span",{class:"label-text"},E):null,P]);return W?_("div",{class:"tooltip","data-tip":W},A):A};var vf={};U(vf,{Rating:()=>p_});var p_=(f)=>{let{class:L,value:E,count:W=5,mask:J="mask-star",readonly:Q=!1,onchange:P,...A}=f,X=`rating-${Math.random().toString(36).slice(2,7)}`;return _("div",{...A,class:()=>q(`rating ${Y(Q)?"pointer-events-none":""}`,L)},Array.from({length:Y(W)},(G,Z)=>{let K=Z+1;return _("input",{type:"radio",name:X,class:`mask ${J}`,checked:()=>Math.round(Y(E))===K,onchange:()=>{if(!Y(Q)){if(typeof P==="function")P(K);else if(typeof E==="function")E(K)}}})}))};var Tf={};U(Tf,{Select:()=>g_});var g_=(f)=>{let{class:L,label:E,items:W,value:J,...Q}=f,P=_("select",{...Q,class:q("select select-bordered w-full",L),value:J},w(()=>Y(W)||[],(A)=>_("option",{value:A.value,$selected:()=>String(Y(J))===String(A.value)},A.label),(A)=>A.value));if(!E)return P;return _("label",{class:"fieldset-label flex flex-col gap-1"},[_("span",{},E),P])};var uf={};U(uf,{Stack:()=>c_});var c_=(f,L)=>{let{class:E,...W}=f;return _("div",{...W,class:q("stack",E)},L)};var bf={};U(bf,{Stat:()=>n_});var n_=(f)=>{let{class:L,icon:E,label:W,value:J,desc:Q,...P}=f;return _("div",{...P,class:q("stat",L)},[E&&_("div",{class:"stat-figure text-secondary"},E),W&&_("div",{class:"stat-title"},W),_("div",{class:"stat-value"},()=>Y(J)??J),Q&&_("div",{class:"stat-desc"},Q)])};var mf={};U(mf,{Swap:()=>r_});var r_=(f)=>{let{class:L,value:E,on:W,off:J,...Q}=f;return _("label",{...Q,class:q("swap",L)},[_("input",{type:"checkbox",checked:()=>Y(E),onclick:(P)=>{if(typeof E==="function")E(P.target.checked)}}),_("div",{class:"swap-on"},W),_("div",{class:"swap-off"},J)])};var df={};U(df,{Table:()=>i_});var i_=(f)=>{let{class:L,items:E=[],columns:W=[],keyFn:J,zebra:Q=!1,pinRows:P=!1,empty:A="nodata",...X}=f,G=()=>{let K=Y(Q)?"table-zebra":"",R=Y(P)?"table-pin-rows":"";return q("table",L,K,R)},Z=J||((K,R)=>K.id||R);return _("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[_("table",{...X,class:G},[_("thead",{},[_("tr",{},W.map((K)=>_("th",{class:K.class||""},K.label)))]),_("tbody",{},[w(E,(K,R)=>{let z=()=>{let B=Y(E),S=Z(K,R);return B.find((D,F)=>Z(D,F)===S)||K};return _("tr",{class:"hover"},W.map((B)=>{let S=()=>{let D=z();if(B.render)return B.render(D,R);return Y(D[B.key])};return _("td",{class:B.class||""},[S])}))},Z),j(()=>Y(E).length===0,()=>_("tr",{},[_("td",{colspan:W.length,class:"text-center p-10 opacity-50"},[Y(A)])]))])])])};var pf={};U(pf,{Tabs:()=>l_});var l_=(f)=>{let{items:L,class:E,onTabClose:W,...J}=f,Q=typeof L==="function"?L:()=>L||[],P=V(0);b(()=>{let G=Q().findIndex((Z)=>Y(Z.active)===!0);if(G!==-1&&P()!==G)P(G)});let A=(X,G)=>{if(G.onClose)G.onClose(G);if(W)W(G,X);let K=Q().filter((B,S)=>S!==X);if(!(typeof L==="function"&&!L._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(L(K),K.length===0)return;let z=P();if(X{let X=Q(),G=[];for(let Z=0;Z{N.stopPropagation(),A(Z,K)};let C=_("span",{class:"flex items-center"},[z,M]);B.push(C)}else B.push(z);let S=_("button",{class:()=>q("tab",P()===Z?"tab-active":""),onclick:(M)=>{if(M.preventDefault(),!Y(K.disabled)){if(K.onclick)K.onclick();P(Z)}}},B),D=K.tip?_("div",{class:"tooltip","data-tip":K.tip},S):S;G.push(D);let F,I=Y(K.content);if(typeof I==="function")F=I();else if(I instanceof Node)F=I;else F=document.createTextNode(String(I));let r=_("div",{class:"tab-content-inner"},F),i=_("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>P()===Z?"display: block":"display: none"},r);G.push(i)}return G})};var gf={};U(gf,{Timeline:()=>t_});var t_=(f)=>{let{class:L,items:E=[],vertical:W=!0,compact:J=!1,...Q}=f,P={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return _("ul",{...Q,class:()=>q(`timeline ${Y(W)?"timeline-vertical":"timeline-horizontal"} ${Y(J)?"timeline-compact":""}`,L)},()=>{let A=(typeof E==="function"?E():E)||[];return A.map((X,G)=>{let Z=G===0,K=G===A.length-1,R=X.type||"success",z=()=>Y(X.completed),B=()=>G>0&&Y(A[G-1].completed),S=(D)=>typeof D==="function"?D():D;return _("li",{class:"flex-1"},[!Z?_("hr",{class:()=>B()?"bg-primary":""}):null,_("div",{class:"timeline-start"},[()=>S(X.title)]),_("div",{class:"timeline-middle"},[()=>X.icon?h(X.icon):h(P[R]||P.success)]),_("div",{class:"timeline-end timeline-box shadow-sm"},[()=>S(X.detail)]),!K?_("hr",{class:()=>z()?"bg-primary":""}):null])})})};var cf={};U(cf,{Toast:()=>s_});var s_=(f,L="alert-success",E=3500)=>{let W=document.getElementById("sigpro-toast-container");if(!W)W=_("div",{id:"sigpro-toast-container",class:"fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none"}),document.body.appendChild(W);let J=_("div",{style:"display: contents"});W.appendChild(J);let Q,P=()=>{clearTimeout(Q);let G=J.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(X.destroy(),J.remove(),!W.hasChildNodes())W.remove()},300);else X.destroy(),J.remove()},X=Zf(()=>{let G=h("icon-[lucide--x]"),Z=_("div",{class:`alert alert-soft ${L} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[_("span",{},[typeof f==="function"?f():f]),ff({class:"btn-xs btn-circle btn-ghost",onclick:P},G)]);return requestAnimationFrame(()=>Z.classList.remove("translate-x-10","opacity-0")),Z},J);if(E>0)Q=setTimeout(P,E);return P};var nf={};U(nf,{Tooltip:()=>o_});var o_=(f,L)=>_("div",{...f,class:()=>q("tooltip w-full",f.class),"data-tip":f.tip},L);var L_={...Bf,...Yf,...zf,...Cf,...Rf,...Sf,...Nf,...Uf,...hf,...Vf,...Df,...Of,...Hf,...kf,...qf,...Ff,...yf,...wf,...Mf,...jf,...If,...xf,...vf,...Tf,...uf,...bf,...mf,...df,...pf,...gf,...cf,...nf},W_={Locale:__,tt:E_};if(typeof window<"u")Object.entries({...L_,...W_}).forEach(([f,L])=>{Object.defineProperty(window,f,{value:L,writable:!1,configurable:!0,enumerable:!0})}),console.log("SigProUI installed");})(); diff --git a/index.js b/index.js index 52a3f59..60968b9 100644 --- a/index.js +++ b/index.js @@ -1,56 +1,85 @@ -// import './src/sigpro.js'; -import { $, Watch, Tag, If, For, Router, Mount } from './src/sigpro.js'; -import * as Components from './src/components/index.js'; -import * as Utils from './src/core/utils.js'; -import { tt } from './src/core/i18n.js'; +import * as AccordionModule from './src/components/Accordion.js'; +import * as AlertModule from './src/components/Alert.js'; +import * as AutocompleteModule from './src/components/Autocomplete.js'; +import * as BadgeModule from './src/components/Badge.js'; +import * as ButtonModule from './src/components/Button.js'; +import * as CheckboxModule from './src/components/Checkbox.js'; +import * as ColorpickerModule from './src/components/Colorpicker.js'; +import * as DatepickerModule from './src/components/Datepicker.js'; +import * as DrawerModule from './src/components/Drawer.js'; +import * as DropdownModule from './src/components/Dropdown.js'; +import * as FabModule from './src/components/Fab.js'; +import * as FieldsetModule from './src/components/Fieldset.js'; +import * as FileinputModule from './src/components/Fileinput.js'; +import * as IndicatorModule from './src/components/Indicator.js'; +import * as InputModule from './src/components/Input.js'; +import * as LabelModule from './src/components/Label.js'; +import * as ListModule from './src/components/List.js'; +import * as MenuModule from './src/components/Menu.js'; +import * as ModalModule from './src/components/Modal.js'; +import * as NavbarModule from './src/components/Navbar.js'; +import * as RadioModule from './src/components/Radio.js'; +import * as RangeModule from './src/components/Range.js'; +import * as RatingModule from './src/components/Rating.js'; +import * as SelectModule from './src/components/Select.js'; +import * as StackModule from './src/components/Stack.js'; +import * as StatModule from './src/components/Stat.js'; +import * as SwapModule from './src/components/Swap.js'; +import * as TableModule from './src/components/Table.js'; +import * as TabsModule from './src/components/Tabs.js'; +import * as TimelineModule from './src/components/Timeline.js'; +import * as ToastModule from './src/components/Toast.js'; +import * as TooltipModule from './src/components/Tooltip.js'; +import { Locale, tt } from './src/core/utils.js'; + +export const Components = { + ...AccordionModule, + ...AlertModule, + ...AutocompleteModule, + ...BadgeModule, + ...ButtonModule, + ...CheckboxModule, + ...ColorpickerModule, + ...DatepickerModule, + ...DrawerModule, + ...DropdownModule, + ...FabModule, + ...FieldsetModule, + ...FileinputModule, + ...IndicatorModule, + ...InputModule, + ...LabelModule, + ...ListModule, + ...MenuModule, + ...ModalModule, + ...NavbarModule, + ...RadioModule, + ...RangeModule, + ...RatingModule, + ...SelectModule, + ...StackModule, + ...StatModule, + ...SwapModule, + ...TableModule, + ...TabsModule, + ...TimelineModule, + ...ToastModule, + ...TooltipModule +}; + +export const Utils = { + Locale, tt +}; -export * from './src/components/index.js'; -export * from './src/core/utils.js'; -export { $, Watch, Tag, If, For, Router, Mount, tt }; if (typeof window !== 'undefined') { - // const CoreAPI = { $, $$, ender, Watch, Tag, If, For, Router, Mount } = SigPro; - - // Object.entries(CoreAPI).forEach(([name, fn]) => { - // Object.defineProperty(window, name, { - // value: fn, - // writable: false, - // configurable: false, - // enumerable: true - // }); - // }); - - Object.entries(Components).forEach(([name, component]) => { + Object.entries({ ...Components, ...Utils }).forEach(([name, value]) => { Object.defineProperty(window, name, { - value: component, + value, writable: false, configurable: true, enumerable: true }); }); - - Object.entries(Utils).forEach(([name, fn]) => { - Object.defineProperty(window, name, { - value: fn, - writable: false, - configurable: true, - enumerable: true - }); - }); - - Object.defineProperty(window, 'tt', { - value: tt, - writable: false, - configurable: true, - enumerable: true - }); - - Object.defineProperty(window, 'SigProUI', { - value: { ...Components, Utils, tt }, - writable: false, - configurable: true, - enumerable: true - }); - - console.log("🎨 SigProUI ready"); -} \ No newline at end of file + console.log("SigProUI installed"); +} diff --git a/package.json b/package.json index 74c56db..2e217aa 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,18 @@ { "name": "sigpro-ui", "version": "1.1.4", + "repository": { + "type": "git", + "url": "https://git.natxocc.com/natxocc/sigpro-ui" + }, "main": "./index.js", "module": "./index.js", "devDependencies": { - "@iconify/json": "^2.2.458", + "@iconify/json": "^2.2.463", "@iconify/tailwind4": "^1.2.3", - "@tailwindcss/cli": "^4.0.0", + "@tailwindcss/cli": "^4.2.2", "daisyui": "^5.5.19", + "sigpro": "git+http://gitea:3000/natxocc/sigpro", "tailwindcss": "^4.2.2" }, "exports": { @@ -21,17 +26,9 @@ "default": "./css/index.js" } }, - "homepage": "https://sigpro.natxocc.com/ui/#/", - "repository": { - "type": "git", - "url": "https://git.natxocc.com/natxocc/sigpro-ui" - }, "bugs": { "url": "https://git.natxocc.com/natxocc/sigpro-ui/issues" }, - "publishConfig": { - "registry": "https://git.natxocc.com/api/packages/natxocc/npm/" - }, "files": [ "index.js", "index.d.ts", @@ -40,12 +37,12 @@ "README.md", "LICENSE" ], + "homepage": "https://sigpro.natxocc.com/ui/#/", "jsdelivr": "./dist/sigpro-ui.min.js", "license": "MIT", - "sideEffects": [ - "./css/*", - "**/*.css" - ], + "publishConfig": { + "registry": "https://git.natxocc.com/api/packages/natxocc/npm/" + }, "scripts": { "clean": "rm -rf ./dist ./css/*.css ./docs/*.js ./docs/*.css", "build:cssmin": "tailwindcss -i ./src/css/sigpro.css -o ./css/sigpro.min.css --content './src/**/*.js' --minify", @@ -54,11 +51,15 @@ "build:js": "bun run build:js:iife && bun run build:js:esm", "build:js:iife": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.js --format=iife --global-name=SigProUI && bun build ./index.js --bundle --outfile=./dist/sigpro-ui.min.js --format=iife --global-name=SigProUI --minify", "build:js:esm": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.esm.js --format=esm && bun build ./index.js --bundle --outfile=./dist/sigpro-ui.esm.min.js --format=esm --minify", - "build:jsdocs": "bun build ./index.js --bundle --outfile=./docs/sigpro-ui.min.js --format=iife --global-name=SigProUI ", + "build:jsdocs": "bun build ./index.js --bundle --outfile=./docs/sigpro-ui.min.js --format=iife --global-name=SigProUI --minify", "build": "bun run clean && bun run build:css && bun run build:js && bun run build:jsdocs && bun run build:cssdocs && bun run build:cssmin", "prepublishOnly": "bun run build", "docs": "bun x serve docs" }, + "sideEffects": [ + "./css/*", + "**/*.css" + ], "type": "module", "unpkg": "./dist/sigpro-ui.min.js" } \ No newline at end of file diff --git a/sigpro-ui.code-workspace b/sigpro-ui.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/sigpro-ui.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/src/components/Accordion.js b/src/components/Accordion.js index a5ca43f..cac9280 100644 --- a/src/components/Accordion.js +++ b/src/components/Accordion.js @@ -1,5 +1,5 @@ // components/Accordion.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui, val } from "../core/utils.js"; /** diff --git a/src/components/Alert.js b/src/components/Alert.js index 26a9d4e..d988a57 100644 --- a/src/components/Alert.js +++ b/src/components/Alert.js @@ -1,5 +1,5 @@ // components/Alert.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Autocomplete.js b/src/components/Autocomplete.js index bfc447a..7da6bd0 100644 --- a/src/components/Autocomplete.js +++ b/src/components/Autocomplete.js @@ -1,7 +1,6 @@ // components/Autocomplete.js -// import { $, Tag, For } from "../sigpro.js"; +import { $, Tag, For } from "sigpro"; import { val } from "../core/utils.js"; -import { tt } from "../core/i18n.js"; import { Input } from "./Input.js"; /** @@ -69,7 +68,7 @@ export const Autocomplete = (props) => { Input({ label, class: className, - placeholder: placeholder || tt("search")(), + placeholder: placeholder, value: query, // Vinculado a la señal query onfocus: () => isOpen(true), onblur: () => setTimeout(() => isOpen(false), 150), @@ -108,7 +107,7 @@ export const Autocomplete = (props) => { (opt, i) => (typeof opt === "string" ? opt : opt.value) + i, ), // Mensaje de "no hay datos" reactivo - () => (list().length ? null : Tag("li", { class: "p-2 text-center opacity-50" }, tt("nodata")())), + () => (list().length ? null : Tag("li", { class: "p-2 text-center opacity-50" }, "nodata")), ], ), ]); diff --git a/src/components/Badge.js b/src/components/Badge.js index 9d07749..29ddb71 100644 --- a/src/components/Badge.js +++ b/src/components/Badge.js @@ -1,5 +1,5 @@ // components/Badge.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Button.js b/src/components/Button.js index 66b3c55..92c20c5 100644 --- a/src/components/Button.js +++ b/src/components/Button.js @@ -1,5 +1,5 @@ // components/Button.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui, val, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Checkbox.js b/src/components/Checkbox.js index 1368870..2c7053b 100644 --- a/src/components/Checkbox.js +++ b/src/components/Checkbox.js @@ -1,4 +1,5 @@ // components/Checkbox.js +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Colorpicker.js b/src/components/Colorpicker.js index 2f7f06a..1b44bbe 100644 --- a/src/components/Colorpicker.js +++ b/src/components/Colorpicker.js @@ -1,5 +1,5 @@ // components/Colorpicker.js -// import { $, Tag, If } from "../sigpro.js"; +import { $, Tag, If } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Datepicker.js b/src/components/Datepicker.js index 7e64355..42333c4 100644 --- a/src/components/Datepicker.js +++ b/src/components/Datepicker.js @@ -1,5 +1,5 @@ // components/Datepicker.js -// import { $, Tag, If } from "../sigpro.js"; +import { $, Tag, If } from "sigpro"; import { val, ui, getIcon } from "../core/utils.js"; import { Input } from "./Input.js"; diff --git a/src/components/Drawer.js b/src/components/Drawer.js index 18728c0..2262b16 100644 --- a/src/components/Drawer.js +++ b/src/components/Drawer.js @@ -1,5 +1,5 @@ // components/Drawer.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Dropdown.js b/src/components/Dropdown.js index 054e5a6..cdcbe2d 100644 --- a/src/components/Dropdown.js +++ b/src/components/Dropdown.js @@ -1,5 +1,5 @@ // components/Dropdown.js -// import { Tag, For, Watch } from "../sigpro.js"; +import { Tag, For, Watch } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Fab.js b/src/components/Fab.js index d818677..bd9fd47 100644 --- a/src/components/Fab.js +++ b/src/components/Fab.js @@ -1,5 +1,5 @@ // components/Fab.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Fetch.js b/src/components/Fetch.js index 628ccd3..b7abdcc 100644 --- a/src/components/Fetch.js +++ b/src/components/Fetch.js @@ -1,3 +1,4 @@ +import { $$ } from "sigpro"; export const Fetch = ({ url, options = {}, fallback = "Cargando..." }, { children }) => { const state = $$({ data: null, loading: true, error: null }); let controller = null; diff --git a/src/components/Fetch2.js b/src/components/Fetch2.js index 310bca8..bde68e8 100644 --- a/src/components/Fetch2.js +++ b/src/components/Fetch2.js @@ -1,4 +1,4 @@ -import { $$, Tag, isFunc } from "./sigpro.js"; +import { $$, Tag, isFunc } from "sigpro"; const _cache = new Map(); diff --git a/src/components/Fieldset.js b/src/components/Fieldset.js index 58dd912..cc05d11 100644 --- a/src/components/Fieldset.js +++ b/src/components/Fieldset.js @@ -1,5 +1,5 @@ // components/Fieldset.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Fileinput.js b/src/components/Fileinput.js index 3fc227c..cb98a67 100644 --- a/src/components/Fileinput.js +++ b/src/components/Fileinput.js @@ -1,5 +1,5 @@ // components/Fileinput.js -// import { $, Tag, If, For } from "../sigpro.js"; +import { $, Tag, If, For } from "sigpro"; import { ui, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Indicator.js b/src/components/Indicator.js index 7e4af80..2d18751 100644 --- a/src/components/Indicator.js +++ b/src/components/Indicator.js @@ -1,5 +1,5 @@ // components/Indicator.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Input.js b/src/components/Input.js index 8107256..e042335 100644 --- a/src/components/Input.js +++ b/src/components/Input.js @@ -1,4 +1,5 @@ // components/Input.js +import { Tag } from "sigpro"; import { val, ui, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Label.js b/src/components/Label.js index eb0530c..c43ffcd 100644 --- a/src/components/Label.js +++ b/src/components/Label.js @@ -1,4 +1,5 @@ // components/Label.js +import { Tag } from "sigpro"; import { ui, val } from "../core/utils.js"; export const Label = (props) => { diff --git a/src/components/List.js b/src/components/List.js index 678d27c..999832d 100644 --- a/src/components/List.js +++ b/src/components/List.js @@ -1,5 +1,5 @@ // components/List.js -// import { Tag, If, For } from "../sigpro.js"; +import { Tag, If, For } from "sigpro"; import { ui, val } from "../core/utils.js"; /** diff --git a/src/components/Menu.js b/src/components/Menu.js index 644deca..b20bb0f 100644 --- a/src/components/Menu.js +++ b/src/components/Menu.js @@ -1,5 +1,5 @@ // components/Menu.js -// import { Tag, For } from "../sigpro.js"; +import { Tag, For } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Modal.js b/src/components/Modal.js index df8872b..9899f62 100644 --- a/src/components/Modal.js +++ b/src/components/Modal.js @@ -1,7 +1,6 @@ // components/Modal.js -// import { Tag, Watch } from "../sigpro.js"; +import { Tag, Watch } from "sigpro"; import { ui } from "../core/utils.js"; -import { tt } from "../core/i18n.js"; import { Button } from "./Button.js"; /** @@ -54,7 +53,7 @@ export const Modal = (props, children) => { Tag("div", { class: "modal-action" }, [ Tag("form", { method: "dialog", class: "flex gap-2" }, [ ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "submit" }, tt("close")()) + Button({ type: "submit" }, "close") ]) ]) ]), diff --git a/src/components/Navbar.js b/src/components/Navbar.js index 6b131b2..190df37 100644 --- a/src/components/Navbar.js +++ b/src/components/Navbar.js @@ -1,5 +1,5 @@ // components/Navbar.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Radio.js b/src/components/Radio.js index 4651f8c..226002e 100644 --- a/src/components/Radio.js +++ b/src/components/Radio.js @@ -1,5 +1,5 @@ // components/Radio.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Range.js b/src/components/Range.js index d752f05..946a2c2 100644 --- a/src/components/Range.js +++ b/src/components/Range.js @@ -1,5 +1,5 @@ // components/Range.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Rating.js b/src/components/Rating.js index a7f61ac..138c7be 100644 --- a/src/components/Rating.js +++ b/src/components/Rating.js @@ -1,5 +1,5 @@ // components/Rating.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Select.js b/src/components/Select.js index 230ba81..0bb1c4e 100644 --- a/src/components/Select.js +++ b/src/components/Select.js @@ -1,5 +1,5 @@ // components/Select.js -// import { Tag, For } from "../sigpro.js"; +import { Tag, For } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Stack.js b/src/components/Stack.js index 1406dea..c58a35f 100644 --- a/src/components/Stack.js +++ b/src/components/Stack.js @@ -1,5 +1,5 @@ // components/Stack.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** diff --git a/src/components/Stat.js b/src/components/Stat.js index 43ae8f0..8fc3494 100644 --- a/src/components/Stat.js +++ b/src/components/Stat.js @@ -1,5 +1,5 @@ // components/Stat.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui } from "../core/utils.js"; /** diff --git a/src/components/Swap.js b/src/components/Swap.js index f48c571..64dcebf 100644 --- a/src/components/Swap.js +++ b/src/components/Swap.js @@ -1,5 +1,5 @@ // components/Swap.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui, val } from "../core/utils.js"; /** diff --git a/src/components/Table.js b/src/components/Table.js index 40e3ff5..79ba17a 100644 --- a/src/components/Table.js +++ b/src/components/Table.js @@ -1,7 +1,6 @@ // components/Table.js -// import { Tag, For, If } from "../sigpro.js"; +import { Tag, For, If } from "sigpro"; import { val, ui } from "../core/utils.js"; -import { tt } from "../core/i18n.js"; /** * Table component @@ -14,7 +13,7 @@ import { tt } from "../core/i18n.js"; * - hover, text-center, p-10, opacity-50 */ export const Table = (props) => { - const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = tt("nodata")(), ...rest } = props; + const { class: className, items = [], columns = [], keyFn, zebra = false, pinRows = false, empty = "nodata", ...rest } = props; const tableClass = () => { const zebraClass = val(zebra) ? "table-zebra" : ""; diff --git a/src/components/Tabs.js b/src/components/Tabs.js index cf575c4..50699d6 100644 --- a/src/components/Tabs.js +++ b/src/components/Tabs.js @@ -1,5 +1,5 @@ // components/Tabs.js -import { $, Tag, Watch } from "../sigpro.js"; +import { $, Tag, Watch } from "sigpro"; import { val, ui, getIcon } from "..//core/utils.js"; /** diff --git a/src/components/Timeline.js b/src/components/Timeline.js index 8b8dfee..f2764c8 100644 --- a/src/components/Timeline.js +++ b/src/components/Timeline.js @@ -1,5 +1,5 @@ // components/Timeline.js -// import { Tag, For } from "../sigpro.js"; +import { Tag } from "sigpro"; import { val, ui, getIcon } from "../core/utils.js"; /** diff --git a/src/components/Toast.js b/src/components/Toast.js index 7c0c7d8..5812029 100644 --- a/src/components/Toast.js +++ b/src/components/Toast.js @@ -1,5 +1,5 @@ // components/Toast.js -// import { Tag, Mount } from "../sigpro.js"; +import { Tag, Mount } from "sigpro"; import { getIcon } from "../core/utils.js"; import { Button } from "./Button.js"; diff --git a/src/components/Tooltip.js b/src/components/Tooltip.js index b1a53b0..d6c126a 100644 --- a/src/components/Tooltip.js +++ b/src/components/Tooltip.js @@ -1,5 +1,5 @@ // components/Tooltip.js -// import { Tag } from "../sigpro.js"; +import { Tag } from "sigpro"; import { ui } from "../core/utils.js"; /** @@ -16,4 +16,4 @@ export const Tooltip = (props, children) => ...props, class: () => ui('tooltip w-full', props.class), "data-tip": props.tip, - }, children); \ No newline at end of file + }, children) diff --git a/src/components/index.js b/src/components/index.js deleted file mode 100644 index f5aab3b..0000000 --- a/src/components/index.js +++ /dev/null @@ -1,110 +0,0 @@ -import * as AccordionModule from './Accordion.js'; -import * as AlertModule from './Alert.js'; -import * as AutocompleteModule from './Autocomplete.js'; -import * as BadgeModule from './Badge.js'; -import * as ButtonModule from './Button.js'; -import * as CheckboxModule from './Checkbox.js'; -import * as ColorpickerModule from './Colorpicker.js'; -import * as DatepickerModule from './Datepicker.js'; -import * as DrawerModule from './Drawer.js'; -import * as DropdownModule from './Dropdown.js'; -import * as FabModule from './Fab.js'; -import * as FieldsetModule from './Fieldset.js'; -import * as FileinputModule from './Fileinput.js'; -import * as IndicatorModule from './Indicator.js'; -import * as InputModule from './Input.js'; -import * as LabelModule from './Label.js'; -import * as ListModule from './List.js'; -import * as MenuModule from './Menu.js'; -import * as ModalModule from './Modal.js'; -import * as NavbarModule from './Navbar.js'; -import * as RadioModule from './Radio.js'; -import * as RangeModule from './Range.js'; -import * as RatingModule from './Rating.js'; -import * as SelectModule from './Select.js'; -import * as StackModule from './Stack.js'; -import * as StatModule from './Stat.js'; -import * as SwapModule from './Swap.js'; -import * as TableModule from './Table.js'; -import * as TabsModule from './Tabs.js'; -import * as TimelineModule from './Timeline.js'; -import * as ToastModule from './Toast.js'; -import * as TooltipModule from './Tooltip.js'; - -export * from './Accordion.js'; -export * from './Alert.js'; -export * from './Autocomplete.js'; -export * from './Badge.js'; -export * from './Button.js'; -export * from './Checkbox.js'; -export * from './Colorpicker.js'; -export * from './Datepicker.js'; -export * from './Drawer.js'; -export * from './Dropdown.js'; -export * from "./Fab.js"; -export * from './Fieldset.js'; -export * from './Fileinput.js'; -export * from './Indicator.js'; -export * from './Input.js'; -export * from './Label.js'; -export * from './List.js'; -export * from './Menu.js'; -export * from './Modal.js'; -export * from './Navbar.js'; -export * from './Radio.js'; -export * from './Range.js'; -export * from './Rating.js'; -export * from './Select.js'; -export * from './Stack.js'; -export * from './Stat.js'; -export * from './Swap.js'; -export * from './Table.js'; -export * from './Tabs.js'; -export * from './Timeline.js'; -export * from './Toast.js'; -export * from './Tooltip.js'; - -const Components = { - ...AccordionModule, - ...AlertModule, - ...AutocompleteModule, - ...BadgeModule, - ...ButtonModule, - ...CheckboxModule, - ...ColorpickerModule, - ...DatepickerModule, - ...DrawerModule, - ...DropdownModule, - ...FabModule, - ...FieldsetModule, - ...FileinputModule, - ...IndicatorModule, - ...InputModule, - ...LabelModule, - ...ListModule, - ...MenuModule, - ...ModalModule, - ...NavbarModule, - ...RadioModule, - ...RangeModule, - ...RatingModule, - ...SelectModule, - ...StackModule, - ...StatModule, - ...SwapModule, - ...TableModule, - ...TabsModule, - ...TimelineModule, - ...ToastModule, - ...TooltipModule -}; - -export default { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("🚀 SigproUI"); - } -}; diff --git a/src/core/i18n.js b/src/core/i18n.js deleted file mode 100644 index 801ae72..0000000 --- a/src/core/i18n.js +++ /dev/null @@ -1,26 +0,0 @@ -// import { $ } from "../sigpro.js"; - -export const i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } -}; - -export const currentLocale = $("es"); - -export const Locale = t => currentLocale(t); - -export const tt = t => () => i18n[currentLocale()][t] || t; diff --git a/src/core/utils.js b/src/core/utils.js index 4950482..d922b1f 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -1,5 +1,5 @@ // core/utils.js -// import { Tag } from "../sigpro.js"; +import { $, Tag } from "sigpro"; export const val = t => typeof t === "function" ? t() : t; @@ -33,4 +33,30 @@ export const getIcon = (icon) => { } return null; -}; \ No newline at end of file +}; + +export const i18n = { + es: { + close: "Cerrar", + confirm: "Confirmar", + cancel: "Cancelar", + search: "Buscar...", + loading: "Cargando...", + nodata: "Sin datos" + }, + en: { + close: "Close", + confirm: "Confirm", + cancel: "Cancel", + search: "Search...", + loading: "Loading...", + nodata: "No data" + } +}; + +export const currentLocale = $("es"); + + +// Export design +export const Locale = t => currentLocale(t); +export const tt = t => () => i18n[currentLocale()][t] || t; \ No newline at end of file diff --git a/src/sigpro.js b/src/sigpro.js deleted file mode 100644 index 74ce884..0000000 --- a/src/sigpro.js +++ /dev/null @@ -1,518 +0,0 @@ -// sigpro 1.2.0 -const isFunc = f => typeof f === "function" -const isObj = o => o && typeof o === "object" -const isArr = Array.isArray -const doc = typeof document !== "undefined" ? document : null -const ensureNode = n => n?._isRuntime ? n.container : (n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n))) - -let activeEffect = null -let activeOwner = null -let isFlushing = false -let batchDepth = 0 -const effectQueue = new Set() -const proxyCache = new WeakMap() -const ITER = Symbol('iter') -const MOUNTED_NODES = new WeakMap() - -const dispose = eff => { - if (!eff || eff._disposed) return - eff._disposed = true - const stack = [eff] - while (stack.length) { - const e = stack.pop() - if (e._cleanups) { - e._cleanups.forEach(fn => fn()) - e._cleanups.clear() - } - if (e._children) { - e._children.forEach(child => stack.push(child)) - e._children.clear() - } - if (e._deps) { - e._deps.forEach(depSet => depSet.delete(e)) - e._deps.clear() - } - } -} - -const onMount = fn => { - if (activeOwner) (activeOwner._mounts ||= []).push(fn) -} - -const onUnmount = fn => { - if (activeOwner) (activeOwner._cleanups ||= new Set()).add(fn) -} - -const untrack = fn => { - const p = activeEffect - activeEffect = null - try { return fn() } finally { activeEffect = p } -} - -const createEffect = (fn, isComputed = false) => { - const effect = () => { - if (effect._disposed) return - if (effect._deps) effect._deps.forEach(s => s.delete(effect)) - if (effect._cleanups) { - effect._cleanups.forEach(c => c()) - effect._cleanups.clear() - } - const prevEffect = activeEffect - const prevOwner = activeOwner - activeEffect = activeOwner = effect - try { - return effect._result = fn() - } catch (e) { - console.error("[SigPro]", e) - } finally { - activeEffect = prevEffect - activeOwner = prevOwner - } - } - effect._deps = effect._cleanups = effect._children = null - effect._disposed = false - effect._isComputed = isComputed - effect._depth = activeEffect ? activeEffect._depth + 1 : 0 - effect._mounts = [] - effect._parent = activeOwner - if (activeOwner) (activeOwner._children ||= new Set()).add(effect) - return effect -} - -const flush = () => { - if (isFlushing) return - isFlushing = true - const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth) - effectQueue.clear() - for (const e of sorted) if (!e._disposed) e() - isFlushing = false -} - -const Batch = fn => { - batchDepth++ - try { - return fn() - } finally { - batchDepth-- - if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) { - flush() - } - } -} - -const trackUpdate = (subs, trigger = false) => { - if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect) - ; (activeEffect._deps ||= new Set()).add(subs) - } else if (trigger) { - let hasQueue = false - subs.forEach(e => { - if (e === activeEffect || e._disposed) return - if (e._isComputed) { - e._dirty = true - if (e._subs) trackUpdate(e._subs, true) - } else { - effectQueue.add(e) - hasQueue = true - } - }) - if (hasQueue && !isFlushing && batchDepth === 0) queueMicrotask(flush) - } -} - -const $ = (val, key = null) => { - const subs = new Set() - if (isFunc(val)) { - let cache, dirty = true - const computed = () => { - if (dirty) { - const prev = activeEffect - activeEffect = computed - try { - const next = val() - if (!Object.is(cache, next)) { - cache = next - dirty = false - trackUpdate(subs, true) - } - } finally { activeEffect = prev } - } - trackUpdate(subs) - return cache - } - computed._isComputed = true - computed._subs = subs - computed._dirty = true - computed._deps = null - computed._disposed = false - computed.markDirty = () => { dirty = true } - computed.stop = () => { - computed._disposed = true - if (computed._deps) { - computed._deps.forEach(depSet => depSet.delete(computed)) - computed._deps.clear() - } - subs.clear() - } - if (activeOwner) onUnmount(computed.stop) - return computed - } - if (key) try { val = JSON.parse(localStorage.getItem(key)) ?? val } catch (e) { } - return (...args) => { - if (args.length) { - const next = isFunc(args[0]) ? args[0](val) : args[0] - if (!Object.is(val, next)) { - val = next - if (key) localStorage.setItem(key, JSON.stringify(val)) - trackUpdate(subs, true) - } - } - trackUpdate(subs) - return val - } -} - -const $$ = (target) => { - if (!isObj(target)) return target - - if (proxyCache.has(target)) return proxyCache.get(target) - - const subsMap = new Map() - const getSubs = (k) => { - let s = subsMap.get(k) - if (!s) subsMap.set(k, s = new Set()) - return s - } - - const proxy = new Proxy(target, { - get(t, k) { - trackUpdate(getSubs(k)) - return $$(t[k]) - }, - set(t, k, v) { - const isNew = !(k in t) - if (!Object.is(t[k], v)) { - t[k] = v - trackUpdate(getSubs(k), true) - if (isNew) trackUpdate(getSubs(ITER), true) - } - return true - }, - deleteProperty(t, k) { - const res = Reflect.deleteProperty(t, k) - if (res) { - trackUpdate(getSubs(k), true) - trackUpdate(getSubs(ITER), true) - } - return res - }, - ownKeys(t) { - trackUpdate(getSubs(ITER)) - return Reflect.ownKeys(t) - } - }) - - proxyCache.set(target, proxy) - return proxy -} - -const Watch = (sources, cb) => { - if (cb === undefined) { - const effect = createEffect(sources) - effect() - return () => dispose(effect) - } - const effect = createEffect(() => { - const vals = Array.isArray(sources) ? sources.map(s => s()) : sources() - untrack(() => cb(vals)) - }) - effect() - return () => dispose(effect) -} - -const cleanupNode = node => { - if (node._cleanups) { - node._cleanups.forEach(fn => fn()) - node._cleanups.clear() - } - if (node._ownerEffect) dispose(node._ownerEffect) - if (node.childNodes) node.childNodes.forEach(cleanupNode) -} - -const DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i -const isDangerousAttr = key => key === 'src' || key === 'href' || key.startsWith('on') - -const validateAttr = (key, val) => { - if (val == null || val === false) return null - if (isDangerousAttr(key)) { - const sVal = String(val) - if (DANGEROUS_PROTOCOL.test(sVal)) { - console.warn(`[SigPro] Bloqueado protocolo peligroso en ${key}`) - return '#' - } - } - return val -} - -const Tag = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || !isObj(props)) { - children = props - props = {} - } - if (isFunc(tag)) { - const ctx = { _mounts: [], _cleanups: new Set() } - const effect = createEffect(() => { - const result = tag(props, { - children, - emit: (ev, ...args) => props[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...args) - }) - effect._result = result - return result - }) - effect() - - const result = effect._result - if (result == null) return null - - const node = (result instanceof Node || (isArr(result) && result.every(n => n instanceof Node))) - ? result - : doc.createTextNode(String(result)) - - const attach = n => { - if (isObj(n) && !n._isRuntime) { - n._mounts = effect._mounts || [] - n._cleanups = effect._cleanups || new Set() - n._ownerEffect = effect - } - } - - isArr(node) ? node.forEach(attach) : attach(node) - return node - } - const isSVG = /^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(tag) - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag) - el._cleanups = new Set() - - for (let k in props) { - if (!props.hasOwnProperty(k)) continue - let v = props[k] - if (k === "ref") { - isFunc(v) ? v(el) : (v.current = el) - continue - } - if (k.startsWith("on")) { - const ev = k.slice(2).toLowerCase() - el.addEventListener(ev, v) - const off = () => el.removeEventListener(ev, v) - el._cleanups.add(off) - onUnmount(off) - } else if (isFunc(v)) { - const effect = createEffect(() => { - const val = validateAttr(k, v()) - if (k === "class") el.className = val || "" - else if (val == null) el.removeAttribute(k) - else if (k in el && !isSVG) el[k] = val - else el.setAttribute(k, val === true ? "" : val) - }) - effect() - el._cleanups.add(() => dispose(effect)) - onUnmount(() => dispose(effect)) - if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) { - const evType = k === "checked" ? "change" : "input" - el.addEventListener(evType, ev => v(ev.target[k])) - } - } else { - const val = validateAttr(k, v) - if (val != null) { - if (k in el && !isSVG) el[k] = val - else el.setAttribute(k, val === true ? "" : val) - } - } - } - - const append = c => { - if (isArr(c)) return c.forEach(append) - if (isFunc(c)) { - const anchor = doc.createTextNode("") - el.appendChild(anchor) - let currentNodes = [] - const effect = createEffect(() => { - const res = c() - const next = (isArr(res) ? res : [res]).map(ensureNode) - currentNodes.forEach(n => { - if (n._isRuntime) n.destroy() - else cleanupNode(n) - if (n.parentNode) n.remove() - }) - let ref = anchor - for (let i = next.length - 1; i >= 0; i--) { - const node = next[i] - if (node.parentNode !== ref.parentNode) ref.parentNode?.insertBefore(node, ref) - if (node._mounts) node._mounts.forEach(fn => fn()) - ref = node - } - currentNodes = next - }) - effect() - el._cleanups.add(() => dispose(effect)) - onUnmount(() => dispose(effect)) - } else { - const node = ensureNode(c) - el.appendChild(node) - if (node._mounts) node._mounts.forEach(fn => fn()) - } - } - append(children) - return el -} - -const Render = renderFn => { - const cleanups = new Set() - const mounts = [] - const previousOwner = activeOwner - const previousEffect = activeEffect - const container = doc.createElement("div") - container.style.display = "contents" - container.setAttribute("role", "presentation") - activeOwner = { _cleanups: cleanups, _mounts: mounts } - activeEffect = null - - const processResult = result => { - if (!result) return - if (result._isRuntime) { - cleanups.add(result.destroy) - container.appendChild(result.container) - } else if (isArr(result)) { - result.forEach(processResult) - } else { - container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))) - } - } - - try { - processResult(renderFn({ onCleanup: fn => cleanups.add(fn) })) - } finally { - activeOwner = previousOwner - activeEffect = previousEffect - } - - mounts.forEach(fn => fn()) - return { - _isRuntime: true, - container, - destroy: () => { - cleanups.forEach(fn => fn()) - cleanupNode(container) - container.remove() - } - } -} - -const If = (cond, ifYes, ifNot = null) => { - const anchor = doc.createTextNode("") - const root = Tag("div", { style: "display:contents" }, [anchor]) - let currentView = null - - Watch( - () => !!(isFunc(cond) ? cond() : cond), - show => { - if (currentView) { - currentView.destroy() - currentView = null - } - - const content = show ? ifYes : ifNot - if (content) { - currentView = Render(() => isFunc(content) ? content() : content) - root.insertBefore(currentView.container, anchor) - } - } - ) - - onUnmount(() => currentView?.destroy()) - return root -} - -const For = (src, itemFn, keyFn) => { - const anchor = doc.createTextNode("") - const root = Tag("div", { style: "display:contents" }, [anchor]) - let cache = new Map() - Watch(() => (isFunc(src) ? src() : src) || [], items => { - const nextCache = new Map() - const nextOrder = [] - const newItems = items || [] - for (let i = 0; i < newItems.length; i++) { - const item = newItems[i] - const key = keyFn ? keyFn(item, i) : (item?.id ?? i) - let view = cache.get(key) - if (!view) view = Render(() => itemFn(item, i)) - else cache.delete(key) - nextCache.set(key, view) - nextOrder.push(view) - } - cache.forEach(view => view.destroy()) - let lastRef = anchor - for (let i = nextOrder.length - 1; i >= 0; i--) { - const view = nextOrder[i] - const node = view.container - if (node.nextSibling !== lastRef) root.insertBefore(node, lastRef) - lastRef = node - } - cache = nextCache - }) - return root -} - -const Router = routes => { - const getHash = () => window.location.hash.slice(1) || "/" - const path = $(getHash()) - const handler = () => path(getHash()) - window.addEventListener("hashchange", handler) - onUnmount(() => window.removeEventListener("hashchange", handler)) - const hook = Tag("div", { class: "router-hook" }) - let currentView = null - Watch([path], () => { - const cur = path() - const route = routes.find(r => { - const p1 = r.path.split("/").filter(Boolean) - const p2 = cur.split("/").filter(Boolean) - return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]) - }) || routes.find(r => r.path === "*") - if (route) { - currentView?.destroy() - const params = {} - route.path.split("/").filter(Boolean).forEach((p, i) => { - if (p[0] === ":") params[p.slice(1)] = cur.split("/").filter(Boolean)[i] - }) - Router.params(params) - currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component) - hook.replaceChildren(currentView.container) - } - }) - return hook -} -Router.params = $({}) -Router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/") -Router.back = () => window.history.back() -Router.path = () => window.location.hash.replace(/^#/, "") || "/" - -const Mount = (comp, target) => { - const t = typeof target === "string" ? doc.querySelector(target) : target - if (!t) return - if (MOUNTED_NODES.has(t)) MOUNTED_NODES.get(t).destroy() - const inst = Render(isFunc(comp) ? comp : () => comp) - t.replaceChildren(inst.container) - MOUNTED_NODES.set(t, inst) - return inst -} - -const SigPro = Object.freeze({ $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Batch }) - -if (typeof window !== "undefined") { - Object.assign(window, SigPro) - "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg" - .split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)) -} - -export { $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Batch } -export default SigPro \ No newline at end of file diff --git a/src/sigpro2.js b/src/sigpro2.js deleted file mode 100644 index d5748aa..0000000 --- a/src/sigpro2.js +++ /dev/null @@ -1,558 +0,0 @@ -// sigpro 1.2.2 -const isFunc = f => typeof f === "function" -const isObj = o => o && typeof o === "object" -const isArr = Array.isArray -const doc = typeof document !== "undefined" ? document : null -const ensureNode = n => n?._isRuntime ? n.container : (n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n))) - -let activeEffect = null -let activeOwner = null -let isFlushing = false -let batchDepth = 0 -const effectQueue = new Set() -const proxyCache = new WeakMap() -const ITER = Symbol('iter') -const MOUNTED_NODES = new WeakMap() - -const dispose = eff => { - if (!eff || eff._disposed) return - eff._disposed = true - const stack = [eff] - while (stack.length) { - const e = stack.pop() - if (e._cleanups) { - e._cleanups.forEach(fn => fn()) - e._cleanups.clear() - } - if (e._children) { - e._children.forEach(child => stack.push(child)) - e._children.clear() - } - if (e._deps) { - e._deps.forEach(depSet => depSet.delete(e)) - e._deps.clear() - } - } -} - -const onMount = fn => { - if (activeOwner) (activeOwner._mounts ||= []).push(fn) -} - -const onUnmount = fn => { - if (activeOwner) (activeOwner._cleanups ||= new Set()).add(fn) -} - -const untrack = fn => { - const p = activeEffect - activeEffect = null - try { return fn() } finally { activeEffect = p } -} - -const createEffect = (fn, isComputed = false) => { - const effect = () => { - if (effect._disposed) return - if (effect._deps) effect._deps.forEach(s => s.delete(effect)) - if (effect._cleanups) { - effect._cleanups.forEach(c => c()) - effect._cleanups.clear() - } - const prevEffect = activeEffect - const prevOwner = activeOwner - activeEffect = activeOwner = effect - try { - return effect._result = fn() - } catch (e) { - console.error("[SigPro]", e) - } finally { - activeEffect = prevEffect - activeOwner = prevOwner - } - } - effect._deps = effect._cleanups = effect._children = null - effect._disposed = false - effect._isComputed = isComputed - effect._depth = activeEffect ? activeEffect._depth + 1 : 0 - effect._mounts = [] - effect._parent = activeOwner - if (activeOwner) (activeOwner._children ||= new Set()).add(effect) - return effect -} - -const flush = () => { - if (isFlushing) return - isFlushing = true - const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth) - effectQueue.clear() - for (const e of sorted) if (!e._disposed) e() - isFlushing = false -} - -const Batch = fn => { - batchDepth++ - try { - return fn() - } finally { - batchDepth-- - if (batchDepth === 0 && effectQueue.size > 0 && !isFlushing) { - flush() - } - } -} - -const trackUpdate = (subs, trigger = false) => { - if (!trigger && activeEffect && !activeEffect._disposed) { - subs.add(activeEffect) - ; (activeEffect._deps ||= new Set()).add(subs) - } else if (trigger && subs.size > 0) { - let hasQueue = false - for (const e of subs) { - if (e === activeEffect || e._disposed) continue - if (e._isComputed) { - e._dirty = true - if (e._subs) trackUpdate(e._subs, true) - } else { - effectQueue.add(e) - hasQueue = true - } - } - if (hasQueue && !isFlushing && batchDepth === 0) queueMicrotask(flush) - } -} - -const $ = (val, key = null) => { - const subs = new Set() - if (isFunc(val)) { - let cache, dirty = true - const computed = () => { - if (dirty) { - const prev = activeEffect - activeEffect = computed - try { - const next = val() - if (!Object.is(cache, next)) { - cache = next - dirty = false - trackUpdate(subs, true) - } - } finally { activeEffect = prev } - } - trackUpdate(subs) - return cache - } - computed._isComputed = true - computed._subs = subs - computed._dirty = true - computed._deps = null - computed._disposed = false - computed.markDirty = () => { dirty = true } - computed.stop = () => { - computed._disposed = true - if (computed._deps) { - computed._deps.forEach(depSet => depSet.delete(computed)) - computed._deps.clear() - } - subs.clear() - } - if (activeOwner) onUnmount(computed.stop) - return computed - } - if (key) try { val = JSON.parse(localStorage.getItem(key)) ?? val } catch (e) { } - return (...args) => { - if (args.length) { - const next = isFunc(args[0]) ? args[0](val) : args[0] - if (!Object.is(val, next)) { - val = next - if (key) localStorage.setItem(key, JSON.stringify(val)) - trackUpdate(subs, true) - } - } - trackUpdate(subs) - return val - } -} - -const $$ = (target) => { - if (!isObj(target)) return target - - let proxy = proxyCache.get(target) - if (proxy) return proxy - - const subsMap = new Map() - const getSubs = (k) => { - let s = subsMap.get(k) - if (!s) subsMap.set(k, (s = new Set())) - return s - } - - proxy = new Proxy(target, { - get(t, k, receiver) { - if (typeof k !== 'symbol') trackUpdate(getSubs(k)) - return $$(Reflect.get(t, k, receiver)) - }, - set(t, k, v, receiver) { - const isNew = !Reflect.has(t, k) - const oldV = Reflect.get(t, k, receiver) - const result = Reflect.set(t, k, v, receiver) - - if (result && !Object.is(oldV, v)) { - trackUpdate(getSubs(k), true) - if (isNew) trackUpdate(getSubs(ITER), true) - } - return result - }, - deleteProperty(t, k) { - const result = Reflect.deleteProperty(t, k) - if (result) { - trackUpdate(getSubs(k), true) - trackUpdate(getSubs(ITER), true) - } - return result - }, - ownKeys(t) { - trackUpdate(getSubs(ITER)) - return Reflect.ownKeys(t) - } - }) - - proxyCache.set(target, proxy) - return proxy -} - -const Watch = (sources, cb) => { - if (cb === undefined) { - const effect = createEffect(sources) - effect() - return () => dispose(effect) - } - const effect = createEffect(() => { - const vals = Array.isArray(sources) ? sources.map(s => s()) : sources() - untrack(() => cb(vals)) - }) - effect() - return () => dispose(effect) -} - -const cleanupNode = node => { - if (node._cleanups) { - node._cleanups.forEach(fn => fn()) - node._cleanups.clear() - } - if (node._ownerEffect) dispose(node._ownerEffect) - if (node.childNodes) node.childNodes.forEach(cleanupNode) -} - -const DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i -const isDangerousAttr = key => key === 'src' || key === 'href' || key.startsWith('on') - -const validateAttr = (key, val) => { - if (val == null || val === false) return null - if (isDangerousAttr(key)) { - const sVal = String(val) - if (DANGEROUS_PROTOCOL.test(sVal)) { - console.warn(`[SigPro] Bloqueado protocolo peligroso en ${key}`) - return '#' - } - } - return val -} - -const Tag = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || !isObj(props)) { - children = props - props = {} - } - if (isFunc(tag)) { - const ctx = { _mounts: [], _cleanups: new Set() } - const effect = createEffect(() => { - const result = tag(props, { - children, - emit: (ev, ...args) => props[`on${ev[0].toUpperCase()}${ev.slice(1)}`]?.(...args) - }) - effect._result = result - return result - }) - effect() - - const result = effect._result - if (result == null) return null - - const node = (result instanceof Node || (isArr(result) && result.every(n => n instanceof Node))) - ? result - : doc.createTextNode(String(result)) - - const attach = n => { - if (isObj(n) && !n._isRuntime) { - n._mounts = effect._mounts || [] - n._cleanups = effect._cleanups || new Set() - n._ownerEffect = effect - } - } - - isArr(node) ? node.forEach(attach) : attach(node) - return node - } - const SVG_TAGS = /^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use|image|ellipse|foreignObject|linearGradient|radialGradient|stop|pattern|mask|clipPath|filter|feColorMatrix|feBlend|feGaussianBlur|animate|animateTransform|set|metadata|desc|title|symbol|marker|view|switch|a|altGlyph|altGlyphDef|altGlyphItem|glyph|glyphRef|hkern|vkern|font|font-face|font-face-format|font-face-name|font-face-src|font-face-uri|missing-glyph|mpath|textPath|tref|tbreak)$/i; - const isSVG = SVG_TAGS.test(tag); - const el = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag) - el._cleanups = new Set() - - for (let k in props) { - if (!props.hasOwnProperty(k)) continue - let v = props[k] - if (k === "ref") { - isFunc(v) ? v(el) : (v.current = el) - continue - } - if (isSVG && k.startsWith("xlink:")) { - const ns = "http://www.w3.org/1999/xlink" - val == null ? el.removeAttributeNS(ns, k.slice(6)) : el.setAttributeNS(ns, k.slice(6), val) - continue - } - if (k.startsWith("on")) { - const ev = k.slice(2).toLowerCase() - el.addEventListener(ev, v) - const off = () => el.removeEventListener(ev, v) - el._cleanups.add(off) - onUnmount(off) - } else if (isFunc(v)) { - const effect = createEffect(() => { - const val = validateAttr(k, v()) - if (k === "class") el.className = val || "" - else if (val == null) el.removeAttribute(k) - else if (k in el && !isSVG) el[k] = val - else el.setAttribute(k, val === true ? "" : val) - }) - effect() - el._cleanups.add(() => dispose(effect)) - onUnmount(() => dispose(effect)) - if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && (k === "value" || k === "checked")) { - const evType = k === "checked" ? "change" : "input" - el.addEventListener(evType, ev => v(ev.target[k])) - } - } else { - const val = validateAttr(k, v) - if (val != null) { - if (k in el && !isSVG) el[k] = val - else el.setAttribute(k, val === true ? "" : val) - } - } - } - - const append = c => { - if (isArr(c)) return c.forEach(append) - if (isFunc(c)) { - const anchor = doc.createTextNode("") - el.appendChild(anchor) - let currentNodes = [] - const effect = createEffect(() => { - const res = c() - const next = (isArr(res) ? res : [res]).map(ensureNode) - currentNodes.forEach(n => { - if (n._isRuntime) n.destroy() - else cleanupNode(n) - if (n.parentNode) n.remove() - }) - let ref = anchor - for (let i = next.length - 1; i >= 0; i--) { - const node = next[i] - if (node.parentNode !== ref.parentNode) ref.parentNode?.insertBefore(node, ref) - if (node._mounts) node._mounts.forEach(fn => fn()) - ref = node - } - currentNodes = next - }) - effect() - el._cleanups.add(() => dispose(effect)) - onUnmount(() => dispose(effect)) - } else { - const node = ensureNode(c) - el.appendChild(node) - if (node._mounts) node._mounts.forEach(fn => fn()) - } - } - append(children) - return el -} - -const Render = renderFn => { - const cleanups = new Set() - const mounts = [] - const previousOwner = activeOwner - const previousEffect = activeEffect - const container = doc.createElement("div") - container.style.display = "contents" - container.setAttribute("role", "presentation") - activeOwner = { _cleanups: cleanups, _mounts: mounts } - activeEffect = null - - const processResult = result => { - if (!result) return - if (result._isRuntime) { - cleanups.add(result.destroy) - container.appendChild(result.container) - } else if (isArr(result)) { - result.forEach(processResult) - } else { - container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))) - } - } - - try { - processResult(renderFn({ onCleanup: fn => cleanups.add(fn) })) - } finally { - activeOwner = previousOwner - activeEffect = previousEffect - } - - mounts.forEach(fn => fn()) - return { - _isRuntime: true, - container, - destroy: () => { - cleanups.forEach(fn => fn()) - cleanupNode(container) - container.remove() - } - } -} - -const If = (cond, ifYes, ifNot = null) => { - const anchor = doc.createTextNode("") - const root = Tag("div", { style: "display:contents" }, [anchor]) - let currentView = null - - Watch( - () => !!(isFunc(cond) ? cond() : cond), - show => { - if (currentView) { - currentView.destroy() - currentView = null - } - - const content = show ? ifYes : ifNot - if (content) { - currentView = Render(() => isFunc(content) ? content() : content) - root.insertBefore(currentView.container, anchor) - } - } - ) - - onUnmount(() => currentView?.destroy()) - return root -} - -const For = (src, itemFn, keyFn) => { - const anchor = doc.createTextNode("") - const root = Tag("div", { style: "display:contents" }, [anchor]) - let cache = new Map() - Watch(() => (isFunc(src) ? src() : src) || [], items => { - const nextCache = new Map() - const nextOrder = [] - const newItems = items || [] - for (let i = 0; i < newItems.length; i++) { - const item = newItems[i] - const key = keyFn ? keyFn(item, i) : (item?.id ?? i) - let view = cache.get(key) - if (!view) view = Render(() => itemFn(item, i)) - else cache.delete(key) - nextCache.set(key, view) - nextOrder.push(view) - } - cache.forEach(view => view.destroy()) - let lastRef = anchor - for (let i = nextOrder.length - 1; i >= 0; i--) { - const view = nextOrder[i] - const node = view.container - if (node.nextSibling !== lastRef) root.insertBefore(node, lastRef) - lastRef = node - } - cache = nextCache - }) - return root -} - -const Router = routes => { - const getHash = () => window.location.hash.slice(1) || "/" - const path = $(getHash()) - const handler = () => path(getHash()) - window.addEventListener("hashchange", handler) - onUnmount(() => window.removeEventListener("hashchange", handler)) - const hook = Tag("div", { class: "router-hook" }) - let currentView = null - Watch([path], () => { - const cur = path() - const route = routes.find(r => { - const p1 = r.path.split("/").filter(Boolean) - const p2 = cur.split("/").filter(Boolean) - return p1.length === p2.length && p1.every((p, i) => p[0] === ":" || p === p2[i]) - }) || routes.find(r => r.path === "*") - if (route) { - currentView?.destroy() - const params = {} - route.path.split("/").filter(Boolean).forEach((p, i) => { - if (p[0] === ":") params[p.slice(1)] = cur.split("/").filter(Boolean)[i] - }) - Router.params(params) - currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component) - hook.replaceChildren(currentView.container) - } - }) - return hook -} -Router.params = $({}) -Router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/") -Router.back = () => window.history.back() -Router.path = () => window.location.hash.replace(/^#/, "") || "/" - -const Anim = (show, render, { enter, leave } = {}) => { - const wrap = Tag('div', { style: 'display:contents' }) - let view = null - - const wait = (el, cb) => { - let done = false - const finish = () => !done && (done = true, cb()) - if (!el) return finish() - 'transitionend animationend'.split(' ').map(e => el.addEventListener(e, finish, { once: true })) - setTimeout(finish, 500) - } - - Watch(show, on => { - if (on && !view) { - const el = (view = Render(render)).container.firstChild - wrap.appendChild(view.container) - if (enter && el) { - el.classList.add(enter); el.clientTop - el.classList.add(enter + '-active') - wait(el, () => el.classList.remove(enter, enter + '-active')) - } - } else if (!on && view) { - const el = view.container.firstChild - const del = () => (view?.destroy(), view = null) - leave && el ? (el.classList.add(leave), wait(el, del)) : del() - } - }) - - return onUnmount(() => view?.destroy()), wrap -} - -const Mount = (comp, target) => { - const t = typeof target === "string" ? doc.querySelector(target) : target - if (!t) return - if (MOUNTED_NODES.has(t)) MOUNTED_NODES.get(t).destroy() - const inst = Render(isFunc(comp) ? comp : () => comp) - t.replaceChildren(inst.container) - MOUNTED_NODES.set(t, inst) - return inst -} - -const SigPro = Object.freeze({ $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Anim, Batch }) - -if (typeof window !== "undefined") { - Object.assign(window, SigPro) - "div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg" - .split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)) -} - -export { $, $$, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, Anim, Batch } -export default SigPro \ No newline at end of file