From a29963563e9eb002d014dd1a160fe739d573efef Mon Sep 17 00:00:00 2001 From: natxocc Date: Mon, 13 Apr 2026 22:23:10 +0200 Subject: [PATCH] events on Tabs --- dist/sigpro-ui.esm.js | 416 ++++++++++++++++++-------------------- dist/sigpro-ui.esm.min.js | 8 +- dist/sigpro-ui.js | 416 ++++++++++++++++++-------------------- dist/sigpro-ui.min.js | 8 +- docs/components/tabs.md | 7 +- docs/sigpro-ui.min.js | 416 ++++++++++++++++++-------------------- src/components/Tabs.js | 28 +-- src/sigpro.js | 390 +++++++++++++++++------------------ 8 files changed, 804 insertions(+), 885 deletions(-) diff --git a/dist/sigpro-ui.esm.js b/dist/sigpro-ui.esm.js index fc5056f..3abe88e 100644 --- a/dist/sigpro-ui.esm.js +++ b/dist/sigpro-ui.esm.js @@ -10,62 +10,81 @@ var __export = (target, all) => { }; // src/sigpro.js -var isFunc = (fn) => typeof fn === "function"; +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 = (node) => node?._isRuntime ? node.container : node instanceof Node ? node : doc.createTextNode(node == null ? "" : String(node)); +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 effectQueue = new Set; var MOUNTED_NODES = new WeakMap; -var dispose = (effect) => { - if (!effect || effect._disposed) +var dispose = (eff) => { + if (!eff || eff._disposed) return; - effect._disposed = true; - const stack = [effect]; + eff._disposed = true; + const stack = [eff]; while (stack.length) { - const eff = stack.pop(); - if (eff._cleanups) { - eff._cleanups.forEach((fn) => fn()); - eff._cleanups.clear(); + const e = stack.pop(); + if (e._cleanups) { + e._cleanups.forEach((fn) => fn()); + e._cleanups.clear(); } - if (eff._children) { - eff._children.forEach((child) => stack.push(child)); - eff._children.clear(); + if (e._children) { + e._children.forEach((child) => stack.push(child)); + e._children.clear(); } - if (eff._deps) { - eff._deps.forEach((depSet) => depSet.delete(eff)); - eff._deps.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 onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); +var set = (signal, path, value) => { + if (value === undefined) + return signal(isFunc(path) ? path(signal()) : path); + const keys = path.split("."), root = { ...signal() }; + let acc = root, k; + for (k of keys.slice(0, -1)) + acc = acc[k] = { ...acc[k] || {} }; + acc[keys.at(-1)] = value; + signal(root); +}; +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((depSet) => depSet.delete(effect)); + effect._deps.forEach((s) => s.delete(effect)); if (effect._cleanups) { - effect._cleanups.forEach((cleanup) => cleanup()); + effect._cleanups.forEach((c) => c()); effect._cleanups.clear(); } const prevEffect = activeEffect; const prevOwner = activeOwner; activeEffect = activeOwner = effect; try { - const res = isComputed ? fn() : (fn(), undefined); - if (!isComputed) - effect._result = res; - return res; + return effect._result = fn(); + } catch (e) { + console.error("[SigPro]", e); } finally { activeEffect = prevEffect; activeOwner = prevOwner; @@ -87,9 +106,9 @@ var flush = () => { isFlushing = true; const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); effectQueue.clear(); - for (const eff of sorted) - if (!eff._disposed) - eff(); + for (const e of sorted) + if (!e._disposed) + e(); isFlushing = false; }; var trackUpdate = (subs, trigger = false) => { @@ -98,15 +117,15 @@ var trackUpdate = (subs, trigger = false) => { (activeEffect._deps ||= new Set).add(subs); } else if (trigger) { let hasQueue = false; - subs.forEach((eff) => { - if (eff === activeEffect || eff._disposed) + subs.forEach((e) => { + if (e === activeEffect || e._disposed) return; - if (eff._isComputed) { - eff._dirty = true; - if (eff._subs) - trackUpdate(eff._subs, true); + if (e._isComputed) { + e._dirty = true; + if (e._subs) + trackUpdate(e._subs, true); } else { - effectQueue.add(eff); + effectQueue.add(e); hasQueue = true; } }); @@ -114,25 +133,16 @@ var trackUpdate = (subs, trigger = false) => { queueMicrotask(flush); } }; -var untrack = (fn) => { - const prev = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = prev; - } -}; -var $2 = (initialValue, storageKey = null) => { +var $2 = (val, key = null) => { const subs = new Set; - if (isFunc(initialValue)) { + if (isFunc(val)) { let cache, dirty = true; const computed = () => { if (dirty) { const prev = activeEffect; activeEffect = computed; try { - const next = initialValue(); + const next = val(); if (!Object.is(cache, next)) { cache = next; dirty = false; @@ -165,33 +175,33 @@ var $2 = (initialValue, storageKey = null) => { onUnmount(computed.stop); return computed; } - if (storageKey) + if (key) try { - initialValue = JSON.parse(localStorage.getItem(storageKey)) ?? initialValue; + val = JSON.parse(localStorage.getItem(key)) ?? val; } catch (e) {} return (...args) => { if (args.length) { - const next = isFunc(args[0]) ? args[0](initialValue) : args[0]; - if (!Object.is(initialValue, next)) { - initialValue = next; - if (storageKey) - localStorage.setItem(storageKey, JSON.stringify(initialValue)); + 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 initialValue; + return val; }; }; -var Watch2 = (sources, callback) => { - if (callback === undefined) { +var Watch2 = (sources, cb) => { + if (cb === undefined) { const effect2 = createEffect(sources); effect2(); return () => dispose(effect2); } const effect = createEffect(() => { - const vals = isArr(sources) ? sources.map((src) => src()) : sources(); - untrack(() => callback(vals)); + const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); + untrack(() => cb(vals)); }); effect(); return () => dispose(effect); @@ -208,36 +218,20 @@ var cleanupNode = (node) => { }; var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); -var applyProp = (elem, key, value, isSVG) => { - if (value == null || value === false) { - if (key === "class" || key === "className") - elem.className = ""; - else if (key in elem && !isSVG) - elem[key] = ""; - else - elem.removeAttribute(key); - return; - } - if (key === "class" || key === "className") { - elem.className = value; - } else if (key === "style" && typeof value === "object") { - Object.assign(elem.style, value); - } else if (key in elem && !isSVG) { - elem[key] = value; - } else if (isSVG) { - if (key.startsWith("xlink:")) { - elem.setAttributeNS("http://www.w3.org/1999/xlink", key, value); - } else if (key === "xmlns" || key.startsWith("xmlns:")) { - elem.setAttributeNS("http://www.w3.org/2000/xmlns/", key, value); - } else { - elem.setAttribute(key, value === true ? "" : value); +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 "#"; } - } else { - elem.setAttribute(key, value === true ? "" : value); } + return val; }; var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || props && typeof props !== "object") { + if (props instanceof Node || isArr(props) || !isObj(props)) { children = props; props = {}; } @@ -252,71 +246,75 @@ var Tag2 = (tag, props = {}, children = []) => { return result2; }); effect(); - ctx._mounts = effect._mounts || []; - ctx._cleanups = effect._cleanups || new Set; const result = effect._result; - const attach = (node) => { - if (node && typeof node === "object" && !node._isRuntime) { - node._mounts = ctx._mounts; - node._cleanups = ctx._cleanups; - node._ownerEffect = effect; - } - }; - isArr(result) ? result.forEach(attach) : attach(result); if (result == null) return null; - if (result instanceof Node || isArr(result) && result.every((n) => n instanceof Node)) - return result; - return doc.createTextNode(String(result)); + 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|image|ellipse|foreignObject|linearGradient|radialGradient|stop|pattern|mask|clipPath|filter|feColorMatrix|feBlend|feGaussianBlur|animate|animateTransform|set|metadata|desc|title|symbol|marker|view)$/i.test(tag); - const elem = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - elem._cleanups = new Set; - for (let key in props) { - if (!props.hasOwnProperty(key)) + 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 value = props[key]; - if (key === "ref") { - isFunc(value) ? value(elem) : value.current = elem; + let v = props[k]; + if (k === "ref") { + isFunc(v) ? v(el) : v.current = el; continue; } - if (key.startsWith("on")) { - const event = key.slice(2).toLowerCase(); - elem.addEventListener(event, value); - const off = () => elem.removeEventListener(event, value); - elem._cleanups.add(off); + 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(value)) { + } else if (isFunc(v)) { const effect = createEffect(() => { - let val = value(); - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - applyProp(elem, key, val, isSVG); + 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(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(elem.tagName) && (key === "value" || key === "checked")) { - const eventType = key === "checked" ? "change" : "input"; - elem.addEventListener(eventType, (ev) => value(ev.target[key])); + 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 { - let val = value; - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - if (val != null) - applyProp(elem, key, val, isSVG); + const val = validateAttr(k, v); + if (val != null) { + if (k in el && !isSVG) + el[k] = val; + else + el.setAttribute(k, val === true ? "" : val); + } } } - const mountChild = (child) => { - if (isArr(child)) - return child.forEach(mountChild); - if (isFunc(child)) { + const append = (c) => { + if (isArr(c)) + return c.forEach(append); + if (isFunc(c)) { const anchor = doc.createTextNode(""); - elem.appendChild(anchor); + el.appendChild(anchor); let currentNodes = []; const effect = createEffect(() => { - const res = child(); + const res = c(); const next = (isArr(res) ? res : [res]).map(ensureNode); currentNodes.forEach((n) => { if (n._isRuntime) @@ -338,55 +336,46 @@ var Tag2 = (tag, props = {}, children = []) => { currentNodes = next; }); effect(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); } else { - const node = ensureNode(child); - elem.appendChild(node); + const node = ensureNode(c); + el.appendChild(node); if (node._mounts) node._mounts.forEach((fn) => fn()); } }; - mountChild(children); - return elem; + append(children); + return el; }; -var createView = (renderFn) => { +var Render = (renderFn) => { const cleanups = new Set; const mounts = []; const previousOwner = activeOwner; - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - const result = renderFn({ onCleanup: (fn) => cleanups.add(fn) }); - activeOwner = previousOwner; - if (result == null) - return null; - if (result instanceof Node) { - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container: result, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(result); - result.remove(); - } - }; - } + const previousEffect = activeEffect; const container = doc.createElement("div"); container.style.display = "contents"; container.setAttribute("role", "presentation"); - const process = (node) => { - if (!node) + activeOwner = { _cleanups: cleanups, _mounts: mounts }; + activeEffect = null; + const processResult = (result) => { + if (!result) return; - if (node._isRuntime) { - cleanups.add(node.destroy); - container.appendChild(node.container); - } else if (isArr(node)) { - node.forEach(process); + if (result._isRuntime) { + cleanups.add(result.destroy); + container.appendChild(result.container); + } else if (isArr(result)) { + result.forEach(processResult); } else { - container.appendChild(node instanceof Node ? node : doc.createTextNode(String(node))); + container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); } }; - process(result); + try { + processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); + } finally { + activeOwner = previousOwner; + activeEffect = previousEffect; + } mounts.forEach((fn) => fn()); return { _isRuntime: true, @@ -428,7 +417,7 @@ var If2 = (cond, ifYes, ifNot = null, trans = null) => { } const content = show ? ifYes : ifNot; if (content) { - currentView = createView(() => isFunc(content) ? content() : content); + currentView = Render(() => isFunc(content) ? content() : content); root.insertBefore(currentView.container, anchor); if (trans?.in) trans.in(currentView.container); @@ -449,7 +438,7 @@ var For2 = (src, itemFn, keyFn) => { const key = keyFn ? keyFn(item, i) : item?.id ?? i; let view = cache.get(key); if (!view) - view = createView(() => itemFn(item, i)); + view = Render(() => itemFn(item, i)); else cache.delete(key); nextCache.set(key, view); @@ -474,14 +463,14 @@ var Router = (routes) => { const handler = () => path(getHash()); window.addEventListener("hashchange", handler); onUnmount(() => window.removeEventListener("hashchange", handler)); - const outlet = Tag2("div", { class: "router-outlet" }); + const hook = Tag2("div", { class: "router-hook" }); let currentView = null; Watch2([path], () => { const cur = path(); const route = routes.find((r) => { - const rParts = r.path.split("/").filter(Boolean); - const curParts = cur.split("/").filter(Boolean); - return rParts.length === curParts.length && rParts.every((p, i) => p[0] === ":" || p === curParts[i]); + 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(); @@ -491,14 +480,14 @@ var Router = (routes) => { params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; }); Router.params(params); - currentView = createView(() => isFunc(route.component) ? route.component(params) : route.component); - outlet.replaceChildren(currentView.container); + currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); + hook.replaceChildren(currentView.container); } }); - return outlet; + return hook; }; Router.params = $2({}); -Router.to = (path) => window.location.hash = path.replace(/^#?\/?/, "#/"); +Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.back = () => window.history.back(); Router.path = () => window.location.hash.replace(/^#/, "") || "/"; var Mount2 = (comp, target) => { @@ -507,24 +496,12 @@ var Mount2 = (comp, target) => { return; if (MOUNTED_NODES.has(t)) MOUNTED_NODES.get(t).destroy(); - const inst = createView(() => isFunc(comp) ? comp() : comp); + const inst = Render(isFunc(comp) ? comp : () => comp); t.replaceChildren(inst.container); MOUNTED_NODES.set(t, inst); return inst; }; -var set = (signal, path, value) => { - if (value === undefined) { - signal(isFunc(path) ? path(signal()) : path); - } else { - const keys = path.split("."); - const last = keys.pop(); - const current = signal(); - const obj = keys.reduce((o, k) => ({ ...o, [k]: { ...o[k] } }), { ...current }); - obj[last] = value; - signal(obj); - } -}; -var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); +var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); 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)); @@ -579,11 +556,11 @@ var exports_utils = {}; __export(exports_utils, { val: () => val, ui: () => ui, - getIcon: () => getIcon2 + getIcon: () => getIcon }); var val = (t) => typeof t === "function" ? t() : t; var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); -var getIcon2 = (icon) => { +var getIcon = (icon) => { if (!icon) return null; if (typeof icon === "function") { @@ -644,7 +621,7 @@ var Alert = (props, children) => { role: "alert", class: ui("alert", allClasses) }, () => [ - getIcon2(iconMap[type]), + getIcon(iconMap[type]), Tag("div", { class: "flex-1" }, [ Tag("span", {}, [typeof content === "function" ? content() : content]) ]), @@ -713,8 +690,8 @@ var Input = (props) => { tel: "icon-[lucide--phone]", url: "icon-[lucide--link]" }; - const leftIcon = icon ? getIcon2(icon) : iconMap[type] ? getIcon2(iconMap[type]) : null; - const getPasswordIcon = () => getIcon2(visible() ? "icon-[lucide--eye-off]" : "icon-[lucide--eye]"); + 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 = () => { @@ -871,7 +848,7 @@ __export(exports_Button, { }); var Button = (props, children) => { const { class: className, loading, icon, ...rest } = props; - const iconEl = getIcon2(icon); + const iconEl = getIcon(icon); return Tag("button", { ...rest, class: ui("btn", className), @@ -1067,7 +1044,7 @@ var Datepicker = (props) => { placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), value: displayValue, readonly: true, - icon: getIcon2("icon-[lucide--calendar]"), + icon: getIcon("icon-[lucide--calendar]"), onclick: (e) => { e.stopPropagation(); isOpen(!isOpen()); @@ -1080,15 +1057,15 @@ var Datepicker = (props) => { }, [ 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) }, getIcon2("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon2("icon-[lucide--chevron-left]")) + 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) }, getIcon2("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon2("icon-[lucide--chevrons-right]")) + 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) }, [ @@ -1296,7 +1273,7 @@ var Fab = (props) => { role: "button", class: "btn btn-lg btn-circle btn-primary shadow-2xl" }, [ - icon ? getIcon2(icon) : null, + icon ? getIcon(icon) : null, !icon && label ? label : null ]), ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ @@ -1308,7 +1285,7 @@ var Fab = (props) => { e.stopPropagation(); act.onclick?.(e); } - }, [act.icon ? getIcon2(act.icon) : act.text || ""]) + }, [act.icon ? getIcon(act.icon) : act.text || ""]) ])) ]); }; @@ -1383,7 +1360,7 @@ var Fileinput = (props) => { } }, [ Tag("div", { class: "flex items-center gap-3 w-full" }, [ - getIcon2("icon-[lucide--upload]"), + 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`) ]), @@ -1412,7 +1389,7 @@ var Fileinput = (props) => { e.stopPropagation(); removeFile(index); } - }, [getIcon2("icon-[lucide--x]")]) + }, [getIcon("icon-[lucide--x]")]) ]), (file) => file.name + file.lastModified) ])) ]); @@ -1760,10 +1737,10 @@ __export(exports_Tabs, { Tabs: () => Tabs }); var Tabs = (props) => { - const { items, class: className, ...rest } = props; + const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $(0); - Watch(() => { + const activeIndex = $2(0); + Watch2(() => { const list = itemsSignal(); const idx = list.findIndex((it) => val(it.active) === true); if (idx !== -1 && activeIndex() !== idx) { @@ -1772,7 +1749,9 @@ var Tabs = (props) => { }); const removeTab = (indexToRemove, item) => { if (item.onClose) - 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; @@ -1790,7 +1769,7 @@ var Tabs = (props) => { newActive = Math.min(newActive, newItems.length - 1); activeIndex(newActive); }; - return Tag("div", { ...rest, class: ui("tabs", className) }, () => { + return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { const list = itemsSignal(); const elements = []; for (let i = 0;i < list.length; i++) { @@ -1805,16 +1784,13 @@ var Tabs = (props) => { e.stopPropagation(); removeTab(i, item); }; - const wrapper = Tag("span", { class: "flex items-center" }, [labelNode, closeIcon]); + const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); buttonChildren.push(wrapper); } else { buttonChildren.push(labelNode); } - const button = Tag("button", { - class: () => { - const isActive = activeIndex() === i; - return ui("tab", isActive ? "tab-active" : ""); - }, + const buttonBase = Tag2("button", { + class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); if (!val(item.disabled)) { @@ -1822,9 +1798,9 @@ var Tabs = (props) => { item.onclick(); activeIndex(i); } - }, - title: item.tip || "" + } }, 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); @@ -1835,8 +1811,8 @@ var Tabs = (props) => { } else { contentNode = document.createTextNode(String(rawContent)); } - const inner = Tag("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag("div", { + 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); @@ -1875,7 +1851,7 @@ var Timeline = (props) => { !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), Tag("div", { class: "timeline-middle" }, [ - () => item.icon ? getIcon2(item.icon) : getIcon2(iconMap[itemType] || iconMap.success) + () => 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 @@ -1918,7 +1894,7 @@ var Toast = (message, type = "alert-success", duration = 3500) => { } }; const ToastComponent = () => { - const closeIcon = getIcon2("icon-[lucide--x]"); + 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` }, [ @@ -2029,7 +2005,7 @@ export { val, ui, tt, - getIcon2 as getIcon, + getIcon, Watch2 as Watch, Tooltip, Toast, diff --git a/dist/sigpro-ui.esm.min.js b/dist/sigpro-ui.esm.min.js index e74feea..3039e50 100644 --- a/dist/sigpro-ui.esm.min.js +++ b/dist/sigpro-ui.esm.min.js @@ -1,7 +1,7 @@ -var k_=Object.defineProperty;var N=(f,M)=>{for(var _ in M)k_(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var V=(f)=>typeof f==="function",v=Array.isArray,H=typeof document<"u"?document:null,rf=(f)=>f?._isRuntime?f.container:f instanceof Node?f:H.createTextNode(f==null?"":String(f)),h=null,F=null,l=!1,Bf=new Set,Af=new WeakMap,g=(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(F)(F._cleanups||=new Set).add(f)},w_=(f)=>{if(F)(F._mounts||=[]).push(f)},i=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((A)=>A.delete(_));if(_._cleanups)_._cleanups.forEach((A)=>A()),_._cleanups.clear();let E=h,L=F;h=F=_;try{let A=M?f():(f(),void 0);if(!M)_._result=A;return A}finally{h=E,F=L}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=h?h._depth+1:0,_._mounts=[],_._parent=F,F)(F._children||=new Set).add(_);return _},x_=()=>{if(l)return;l=!0;let f=Array.from(Bf).sort((M,_)=>M._depth-_._depth);Bf.clear();for(let M of f)if(!M._disposed)M();l=!1},o=(f,M=!1)=>{if(!M&&h&&!h._disposed)f.add(h),(h._deps||=new Set).add(f);else if(M){let _=!1;if(f.forEach((E)=>{if(E===h||E._disposed)return;if(E._isComputed){if(E._dirty=!0,E._subs)o(E._subs,!0)}else Bf.add(E),_=!0}),_&&!l)queueMicrotask(x_)}},y_=(f)=>{let M=h;h=null;try{return f()}finally{h=M}},e=(f,M=null)=>{let _=new Set;if(V(f)){let E,L=!0,A=()=>{if(L){let W=h;h=A;try{let T=f();if(!Object.is(E,T))E=T,L=!1,o(_,!0)}finally{h=W}}return o(_),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((W)=>W.delete(A)),A._deps.clear();_.clear()},F)p(A.stop);return A}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let L=V(E[0])?E[0](f):E[0];if(!Object.is(f,L)){if(f=L,M)localStorage.setItem(M,JSON.stringify(f));o(_,!0)}}return o(_),f}},s=(f,M)=>{if(M===void 0){let E=i(f);return E(),()=>g(E)}let _=i(()=>{let E=v(f)?f.map((L)=>L()):f();y_(()=>M(E))});return _(),()=>g(_)},a=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)g(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(a)},df=/^\s*(javascript|data|vbscript):/i,nf=(f)=>f==="src"||f==="href"||f.startsWith("on"),of=(f,M,_,E)=>{if(_==null||_===!1){if(M==="class"||M==="className")f.className="";else if(M in f&&!E)f[M]="";else f.removeAttribute(M);return}if(M==="class"||M==="className")f.className=_;else if(M==="style"&&typeof _==="object")Object.assign(f.style,_);else if(M in f&&!E)f[M]=_;else if(E)if(M.startsWith("xlink:"))f.setAttributeNS("http://www.w3.org/1999/xlink",M,_);else if(M==="xmlns"||M.startsWith("xmlns:"))f.setAttributeNS("http://www.w3.org/2000/xmlns/",M,_);else f.setAttribute(M,_===!0?"":_);else f.setAttribute(M,_===!0?"":_)},t=(f,M={},_=[])=>{if(M instanceof Node||v(M)||M&&typeof M!=="object")_=M,M={};if(V(f)){let W={_mounts:[],_cleanups:new Set},T=i(()=>{let J=f(M,{children:_,emit:(P,...K)=>M[`on${P[0].toUpperCase()}${P.slice(1)}`]?.(...K)});return T._result=J,J});T(),W._mounts=T._mounts||[],W._cleanups=T._cleanups||new Set;let B=T._result,G=(J)=>{if(J&&typeof J==="object"&&!J._isRuntime)J._mounts=W._mounts,J._cleanups=W._cleanups,J._ownerEffect=T};if(v(B)?B.forEach(G):G(B),B==null)return null;if(B instanceof Node||v(B)&&B.every((J)=>J instanceof Node))return B;return H.createTextNode(String(B))}let E=/^(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)$/i.test(f),L=E?H.createElementNS("http://www.w3.org/2000/svg",f):H.createElement(f);L._cleanups=new Set;for(let W in M){if(!M.hasOwnProperty(W))continue;let T=M[W];if(W==="ref"){V(T)?T(L):T.current=L;continue}if(W.startsWith("on")){let B=W.slice(2).toLowerCase();L.addEventListener(B,T);let G=()=>L.removeEventListener(B,T);L._cleanups.add(G),p(G)}else if(V(T)){let B=i(()=>{let G=T();if(nf(W)&&df.test(String(G)))G="#";of(L,W,G,E)});if(B(),L._cleanups.add(()=>g(B)),p(()=>g(B)),/^(INPUT|TEXTAREA|SELECT)$/.test(L.tagName)&&(W==="value"||W==="checked")){let G=W==="checked"?"change":"input";L.addEventListener(G,(J)=>T(J.target[W]))}}else{let B=T;if(nf(W)&&df.test(String(B)))B="#";if(B!=null)of(L,W,B,E)}}let A=(W)=>{if(v(W))return W.forEach(A);if(V(W)){let T=H.createTextNode("");L.appendChild(T);let B=[],G=i(()=>{let J=W(),P=(v(J)?J:[J]).map(rf);B.forEach((Y)=>{if(Y._isRuntime)Y.destroy();else a(Y);if(Y.parentNode)Y.remove()});let K=T;for(let Y=P.length-1;Y>=0;Y--){let X=P[Y];if(X.parentNode!==K.parentNode)K.parentNode?.insertBefore(X,K);if(X._mounts)X._mounts.forEach((S)=>S());K=X}B=P});G(),L._cleanups.add(()=>g(G)),p(()=>g(G))}else{let T=rf(W);if(L.appendChild(T),T._mounts)T._mounts.forEach((B)=>B())}};return A(_),L},ff=(f)=>{let M=new Set,_=[],E=F;F={_cleanups:M,_mounts:_};let L=f({onCleanup:(T)=>M.add(T)});if(F=E,L==null)return null;if(L instanceof Node)return _.forEach((T)=>T()),{_isRuntime:!0,container:L,destroy:()=>{M.forEach((T)=>T()),a(L),L.remove()}};let A=H.createElement("div");A.style.display="contents",A.setAttribute("role","presentation");let W=(T)=>{if(!T)return;if(T._isRuntime)M.add(T.destroy),A.appendChild(T.container);else if(v(T))T.forEach(W);else A.appendChild(T instanceof Node?T:H.createTextNode(String(T)))};return W(L),_.forEach((T)=>T()),{_isRuntime:!0,container:A,destroy:()=>{M.forEach((T)=>T()),a(A),A.remove()}}},tf=(f,M,_=null,E=null)=>{let L=H.createTextNode(""),A=t("div",{style:"display:contents"},[L]),W=null,T=null,B=null;return s(()=>!!(V(f)?f():f),(G)=>{if(G===T)return;T=G;let J=()=>{if(W)W.destroy(),W=null};if(W&&!G&&E?.out){if(B&&B.cancel)B.cancel();let K=E.out(W.container,J);if(B=K,K&&K.finished)K.finished.then(J);else J()}else J();let P=G?M:_;if(P){if(W=ff(()=>V(P)?P():P),A.insertBefore(W.container,L),E?.in)E.in(W.container)}}),A},lf=(f,M,_)=>{let E=H.createTextNode(""),L=t("div",{style:"display:contents"},[E]),A=new Map;return s(()=>(V(f)?f():f)||[],(W)=>{let T=new Map,B=[],G=W||[];for(let P=0;PM(K,P));else A.delete(Y);T.set(Y,X),B.push(X)}A.forEach((P)=>P.destroy());let J=E;for(let P=B.length-1;P>=0;P--){let Y=B[P].container;if(Y.nextSibling!==J)L.insertBefore(Y,J);J=Y}A=T}),L},c=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=e(M()),E=()=>_(M());window.addEventListener("hashchange",E),p(()=>window.removeEventListener("hashchange",E));let L=t("div",{class:"router-outlet"}),A=null;return s([_],()=>{let W=_(),T=f.find((B)=>{let G=B.path.split("/").filter(Boolean),J=W.split("/").filter(Boolean);return G.length===J.length&&G.every((P,K)=>P[0]===":"||P===J[K])})||f.find((B)=>B.path==="*");if(T){A?.destroy();let B={};T.path.split("/").filter(Boolean).forEach((G,J)=>{if(G[0]===":")B[G.slice(1)]=W.split("/").filter(Boolean)[J]}),c.params(B),A=ff(()=>V(T.component)?T.component(B):T.component),L.replaceChildren(A.container)}}),L};c.params=e({});c.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");c.back=()=>window.history.back();c.path=()=>window.location.hash.replace(/^#/,"")||"/";var af=(f,M)=>{let _=typeof M==="string"?H.querySelector(M):M;if(!_)return;if(Af.has(_))Af.get(_).destroy();let E=ff(()=>V(f)?f():f);return _.replaceChildren(E.container),Af.set(_,E),E},I_=(f,M,_)=>{if(_===void 0)f(V(M)?M(f()):M);else{let E=M.split("."),L=E.pop(),A=f(),W=E.reduce((T,B)=>({...T,[B]:{...T[B]}}),{...A});W[L]=_,f(W)}},sf=Object.freeze({$:e,Watch:s,Tag:t,If:tf,For:lf,Router:c,Mount:af,onMount:w_,onUnmount:p,set:I_});if(typeof window<"u")Object.assign(window,sf),"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,_)=>sf.Tag(f,M,_));var Mf={};N(Mf,{default:()=>v_,Tooltip:()=>U_,Toast:()=>F_,Timeline:()=>h_,Tabs:()=>O_,Table:()=>z_,Swap:()=>D_,Stat:()=>R_,Stack:()=>N_,Select:()=>q_,Rating:()=>S_,Range:()=>K_,Radio:()=>C_,Navbar:()=>Y_,Modal:()=>Z_,Menu:()=>X_,List:()=>Q_,Label:()=>P_,Input:()=>r,Indicator:()=>J_,Fileinput:()=>G_,Fieldset:()=>B_,Fab:()=>A_,Dropdown:()=>W_,Drawer:()=>L_,Datepicker:()=>$_,Colorpicker:()=>T_,Checkbox:()=>E_,Button:()=>d,Badge:()=>M_,Autocomplete:()=>__,Alert:()=>f_,Accordion:()=>ef});var Gf={};N(Gf,{Accordion:()=>ef});var _f={};N(_f,{val:()=>Q,ui:()=>Z,getIcon:()=>D});var Q=(f)=>typeof f==="function"?f():f,Z=(f,M)=>typeof M==="function"?()=>`${f} ${M()||""}`.trim():`${f} ${M||""}`.trim(),D=(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 ef=(f,M)=>{let{class:_,title:E,name:L,open:A,...W}=f;return Tag("div",{...W,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:L?"radio":"checkbox",name:L,checked:Q(A)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Jf={};N(Jf,{Alert:()=>f_});var f_=(f,M)=>{let{class:_,actions:E,type:L="info",soft:A=!0,...W}=f,T={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},J=[`alert-${L}`,A?"alert-soft":"",_].filter(Boolean).join(" "),P=M||f.message;return Tag("div",{...W,role:"alert",class:Z("alert",J)},()=>[D(T[L]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof P==="function"?P():P])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var Qf={};N(Qf,{Autocomplete:()=>__});var u_={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"}},m_=$("es");var k=(f)=>()=>u_[m_()][f]||f;var Pf={};N(Pf,{Input:()=>r});var r=(f)=>{let{class:M,value:_,type:E="text",icon:L,oninput:A,placeholder:W,disabled:T,validate:B,label:G,...J}=f,P=E==="password",K=$(!1),Y=$(null),X={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=L?D(L):X[E]?D(X[E]):null,R=()=>D(K()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),I=S?"pl-10":"",n=P?"pr-10":"",U=()=>{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"},b=(O)=>{let u=O.target.value;if(B){let Ef=B(u);Y(Ef||null)}A?.(O)},x=()=>Y()&&Y()!=="",C=()=>{let O=`input w-full ${I} ${n}`;if(M)O+=` ${M}`;if(x())O+=" input-error";return O.trim()},q=Tag("input",{...J,type:()=>P?K()?"text":"password":E,placeholder:W||(G?" ":W),class:C,value:_,oninput:b,disabled:()=>Q(T),"aria-invalid":()=>x()?"true":"false"}),z=()=>[q,S?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},S):null,P?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",U()),onclick:(O)=>{O.preventDefault(),K(!K())}},()=>R()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>x()?Y():null)];if(G)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},z),Tag("span",{},Q(G))]);return Tag("div",{class:"relative w-full"},z)};var __=(f)=>{let{class:M,items:_=[],value:E,onselect:L,label:A,placeholder:W,...T}=f,B=$(Q(E)||""),G=$(!1),J=$(-1),P=$(()=>{let X=B().toLowerCase(),S=Q(_)||[];return X?S.filter((R)=>(typeof R==="string"?R:R.label).toLowerCase().includes(X)):S}),K=(X)=>{let S=typeof X==="string"?X:X.value,R=typeof X==="string"?X:X.label;if(B(R),typeof E==="function")E(S);L?.(X),G(!1),J(-1)},Y=(X)=>{let S=P();if(X.key==="ArrowDown")X.preventDefault(),G(!0),J(Math.min(J()+1,S.length-1));else if(X.key==="ArrowUp")X.preventDefault(),J(Math.max(J()-1,0));else if(X.key==="Enter"&&J()>=0)X.preventDefault(),K(S[J()]);else if(X.key==="Escape")G(!1)};return Tag("div",{class:"relative w-full"},[r({label:A,class:M,placeholder:W||k("search")(),value:B,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:Y,oninput:(X)=>{let S=X.target.value;if(B(S),typeof E==="function")E(S);G(!0),J(-1)},...T}),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:()=>G()&&P().length?"display:block":"display:none"},[For(P,(X,S)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${J()===S?"active bg-primary text-primary-content":""}`,onclick:()=>K(X),onmouseenter:()=>J(S)},typeof X==="string"?X:X.label)]),(X,S)=>(typeof X==="string"?X:X.value)+S),()=>P().length?null:Tag("li",{class:"p-2 text-center opacity-50"},k("nodata")())])])};var Xf={};N(Xf,{Badge:()=>M_});var M_=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Zf={};N(Zf,{Button:()=>d});var d=(f,M)=>{let{class:_,loading:E,icon:L,...A}=f,W=D(L);return Tag("button",{...A,class:Z("btn",_),disabled:()=>Q(E)||Q(f.disabled)},()=>[Q(E)&&Tag("span",{class:"loading loading-spinner"}),W,M].filter(Boolean))};var Yf={};N(Yf,{Checkbox:()=>E_});var E_=(f)=>{let{class:M,value:_,toggle:E,label:L,...A}=f,W=Tag("input",{...A,type:"checkbox",class:()=>Z(Q(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[W,L?Tag("span",{class:"label-text"},L):null])};var Cf={};N(Cf,{Colorpicker:()=>T_});var T_=(f)=>{let{class:M,value:_,label:E,...L}=f,A=$(!1),W=["#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"],T=()=>Q(_)||"#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:(B)=>{B.stopPropagation(),A(!A())},...L},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${T()}`}),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:(B)=>B.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},W.map((B)=>Tag("button",{type:"button",style:`background-color: ${B}`,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 - ${T().toLowerCase()===B.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(B);A(!1)}})))])),If(A,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>A(!1)}))])};var Kf={};N(Kf,{Datepicker:()=>$_});var $_=(f)=>{let{class:M,value:_,range:E,label:L,placeholder:A,hour:W=!1,...T}=f,B=$(!1),G=$(new Date),J=$(null),P=$(0),K=$(0),Y=()=>Q(E)===!0,X=new Date,S=`${X.getFullYear()}-${String(X.getMonth()+1).padStart(2,"0")}-${String(X.getDate()).padStart(2,"0")}`,R=(C)=>{let q=C.getFullYear(),z=String(C.getMonth()+1).padStart(2,"0"),O=String(C.getDate()).padStart(2,"0");return`${q}-${z}-${O}`},I=(C)=>{let q=R(C),z=Q(_);if(Y())if(!z?.start||z.start&&z.end){if(typeof _==="function")_({start:q,end:null,...W&&{startHour:P()}})}else{let O=z.start;if(typeof _==="function"){let u=q{let C=Q(_);if(!C)return"";if(typeof C==="string"){if(W&&C.includes("T"))return C.replace("T"," ");return C}if(C.start&&C.end){let q=W&&C.startHour?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start,z=W&&C.endHour?`${C.end} ${String(C.endHour).padStart(2,"0")}:00`:C.end;return`${q} - ${z}`}if(C.start)return`${W&&C.startHour?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start}...`;return""}),U=(C)=>{let q=G();G(new Date(q.getFullYear(),q.getMonth()+C,1))},b=(C)=>{let q=G();G(new Date(q.getFullYear()+C,q.getMonth(),1))},x=({value:C,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:C,class:"range range-xs flex-1",oninput:(z)=>{let O=parseInt(z.target.value);q(O)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(Q(C)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[r({label:L,placeholder:A||(Y()?"Seleccionar rango...":"Seleccionar fecha..."),value:n,readonly:!0,icon:D("icon-[lucide--calendar]"),onclick:(C)=>{C.stopPropagation(),B(!B())},...T}),If(B,()=>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:(C)=>C.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:()=>b(-1)},D("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>U(-1)},D("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().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:()=>U(1)},D("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>b(1)},D("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>J(null)},[...["L","M","X","J","V","S","D"].map((C)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},C)),()=>{let C=G(),q=C.getFullYear(),z=C.getMonth(),O=new Date(q,z,1).getDay(),u=O===0?6:O-1,Ef=new Date(q,z+1,0).getDate(),Tf=[];for(let m=0;m{let y=Q(_),$f=J(),j_=typeof y==="string"?y.split("T")[0]===j:y?.start===j,H_=y?.end===j,Lf=!1;if(Y()&&y?.start){let Wf=y.start;if(!y.end&&$f)Lf=j>Wf&&j<=$f||j=$f;else if(y.end)Lf=j>Wf&&j{if(Y())J(j)},onclick:()=>I(pf)},[m.toString()]))}return Tf}]),W?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[Y()?Tag("div",{class:"flex gap-4"},[x({value:P,onChange:(C)=>{P(C);let q=Q(_);if(q?.start)_({...q,startHour:C})}}),x({value:K,onChange:(C)=>{K(C);let q=Q(_);if(q?.end)_({...q,endHour:C})}})]):x({value:P,onChange:(C)=>{P(C);let q=Q(_);if(q&&typeof q==="string"&&q.includes("-"))_(q.split("T")[0]+"T"+String(C).padStart(2,"0")+":00:00")}})]):null])),If(B,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>B(!1)}))])};var Sf={};N(Sf,{Drawer:()=>L_});var L_=(f,M)=>{let{class:_,id:E,open:L,side:A,content:W,...T}=f,B=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...T,class:Z("drawer",_)},[Tag("input",{id:B,type:"checkbox",class:"drawer-toggle",checked:()=>typeof L==="function"?L():L,onchange:(G)=>{if(typeof L==="function")L(G.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof W==="function"?W():W]),Tag("div",{class:"drawer-side"},[Tag("label",{for:B,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 qf={};N(qf,{Dropdown:()=>W_});var w=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(w&&!w.contains(f.target))w.open=!1,w=null}),window.__dropdownHandlerRegistered=!0;var W_=(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:(W)=>{let T=W.currentTarget.closest("details");if(w&&w!==T)w.open=!1;setTimeout(()=>{w=T.open?T: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((T)=>Tag("li",{},[Tag("a",{class:T.class||"",onclick:(B)=>{if(T.onclick)T.onclick(B);let G=B.currentTarget.closest("details");if(G){if(G.open=!1,w===G)w=null}}},[T.icon?Tag("span",{},T.icon):null,Tag("span",{},T.label)])]))}])])};var Nf={};N(Nf,{Fab:()=>A_});var A_=(f)=>{let{class:M,icon:_,label:E,actions:L=[],position:A="bottom-6 right-6",...W}=f;return Tag("div",{...W,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"},[_?D(_):null,!_&&E?E:null]),...Q(L).map((T)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[T.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},T.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${T.class||""}`,onclick:(B)=>{B.stopPropagation(),T.onclick?.(B)}},[T.icon?D(T.icon):T.text||""])]))])};var Rf={};N(Rf,{Fieldset:()=>B_});var B_=(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=Q(E);return A?Tag("legend",{class:"fieldset-legend font-bold"},[A]):null},M])};var Df={};N(Df,{Fileinput:()=>G_});var G_=(f)=>{let{class:M,tooltip:_,max:E=2,accept:L="*",onselect:A,...W}=f,T=$([]),B=$(!1),G=$(null),J=E*1024*1024,P=(Y)=>{let X=Array.from(Y);if(G(null),X.find((R)=>R.size>J)){G(`Máx ${E}MB`);return}T([...T(),...X]),A?.(T())},K=(Y)=>{let X=T().filter((S,R)=>R!==Y);T(X),A?.(X)};return Tag("fieldset",{...W,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 H_=Object.defineProperty;var R=(f,M)=>{for(var _ in M)H_(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var h=(f)=>typeof f==="function",df=(f)=>f&&typeof f==="object",r=Array.isArray,w=typeof document<"u"?document:null,rf=(f)=>f?._isRuntime?f.container:f instanceof Node?f:w.createTextNode(f==null?"":String(f)),O=null,F=null,e=!1,Jf=new Set,Wf=new WeakMap,g=(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()}},j_=(f)=>{if(F)(F._mounts||=[]).push(f)},n=(f)=>{if(F)(F._cleanups||=new Set).add(f)},w_=(f,M,_)=>{if(_===void 0)return f(h(M)?M(f()):M);let E=M.split("."),W={...f()},J=W,L;for(L of E.slice(0,-1))J=J[L]={...J[L]||{}};J[E.at(-1)]=_,f(W)},x_=(f)=>{let M=O;O=null;try{return f()}finally{O=M}},t=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((J)=>J.delete(_));if(_._cleanups)_._cleanups.forEach((J)=>J()),_._cleanups.clear();let E=O,W=F;O=F=_;try{return _._result=f()}catch(J){console.error("[SigPro]",J)}finally{O=E,F=W}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=O?O._depth+1:0,_._mounts=[],_._parent=F,F)(F._children||=new Set).add(_);return _},y_=()=>{if(e)return;e=!0;let f=Array.from(Jf).sort((M,_)=>M._depth-_._depth);Jf.clear();for(let M of f)if(!M._disposed)M();e=!1},s=(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)s(E._subs,!0)}else Jf.add(E),_=!0}),_&&!e)queueMicrotask(y_)}},o=(f,M=null)=>{let _=new Set;if(h(f)){let E,W=!0,J=()=>{if(W){let L=O;O=J;try{let A=f();if(!Object.is(E,A))E=A,W=!1,s(_,!0)}finally{O=L}}return s(_),E};if(J._isComputed=!0,J._subs=_,J._dirty=!0,J._deps=null,J._disposed=!1,J.markDirty=()=>{W=!0},J.stop=()=>{if(J._disposed=!0,J._deps)J._deps.forEach((L)=>L.delete(J)),J._deps.clear();_.clear()},F)n(J.stop);return J}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let W=h(E[0])?E[0](f):E[0];if(!Object.is(f,W)){if(f=W,M)localStorage.setItem(M,JSON.stringify(f));s(_,!0)}}return s(_),f}},c=(f,M)=>{if(M===void 0){let E=t(f);return E(),()=>g(E)}let _=t(()=>{let E=Array.isArray(f)?f.map((W)=>W()):f();x_(()=>M(E))});return _(),()=>g(_)},Qf=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)g(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Qf)},I_=/^\s*(javascript|data|vbscript):/i,u_=(f)=>f==="src"||f==="href"||f.startsWith("on"),nf=(f,M)=>{if(M==null||M===!1)return null;if(u_(f)){let _=String(M);if(I_.test(_))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return M},k=(f,M={},_=[])=>{if(M instanceof Node||r(M)||!df(M))_=M,M={};if(h(f)){let L={_mounts:[],_cleanups:new Set},A=t(()=>{let P=f(M,{children:_,emit:(S,...K)=>M[`on${S[0].toUpperCase()}${S.slice(1)}`]?.(...K)});return A._result=P,P});A();let Q=A._result;if(Q==null)return null;let G=Q instanceof Node||r(Q)&&Q.every((P)=>P instanceof Node)?Q:w.createTextNode(String(Q)),T=(P)=>{if(df(P)&&!P._isRuntime)P._mounts=A._mounts||[],P._cleanups=A._cleanups||new Set,P._ownerEffect=A};return r(G)?G.forEach(T):T(G),G}let E=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(f),W=E?w.createElementNS("http://www.w3.org/2000/svg",f):w.createElement(f);W._cleanups=new Set;for(let L in M){if(!M.hasOwnProperty(L))continue;let A=M[L];if(L==="ref"){h(A)?A(W):A.current=W;continue}if(L.startsWith("on")){let Q=L.slice(2).toLowerCase();W.addEventListener(Q,A);let G=()=>W.removeEventListener(Q,A);W._cleanups.add(G),n(G)}else if(h(A)){let Q=t(()=>{let G=nf(L,A());if(L==="class")W.className=G||"";else if(G==null)W.removeAttribute(L);else if(L in W&&!E)W[L]=G;else W.setAttribute(L,G===!0?"":G)});if(Q(),W._cleanups.add(()=>g(Q)),n(()=>g(Q)),/^(INPUT|TEXTAREA|SELECT)$/.test(W.tagName)&&(L==="value"||L==="checked")){let G=L==="checked"?"change":"input";W.addEventListener(G,(T)=>A(T.target[L]))}}else{let Q=nf(L,A);if(Q!=null)if(L in W&&!E)W[L]=Q;else W.setAttribute(L,Q===!0?"":Q)}}let J=(L)=>{if(r(L))return L.forEach(J);if(h(L)){let A=w.createTextNode("");W.appendChild(A);let Q=[],G=t(()=>{let T=L(),P=(r(T)?T:[T]).map(rf);Q.forEach((K)=>{if(K._isRuntime)K.destroy();else Qf(K);if(K.parentNode)K.remove()});let S=A;for(let K=P.length-1;K>=0;K--){let X=P[K];if(X.parentNode!==S.parentNode)S.parentNode?.insertBefore(X,S);if(X._mounts)X._mounts.forEach((q)=>q());S=X}Q=P});G(),W._cleanups.add(()=>g(G)),n(()=>g(G))}else{let A=rf(L);if(W.appendChild(A),A._mounts)A._mounts.forEach((Q)=>Q())}};return J(_),W},a=(f)=>{let M=new Set,_=[],E=F,W=O,J=w.createElement("div");J.style.display="contents",J.setAttribute("role","presentation"),F={_cleanups:M,_mounts:_},O=null;let L=(A)=>{if(!A)return;if(A._isRuntime)M.add(A.destroy),J.appendChild(A.container);else if(r(A))A.forEach(L);else J.appendChild(A instanceof Node?A:w.createTextNode(String(A==null?"":A)))};try{L(f({onCleanup:(A)=>M.add(A)}))}finally{F=E,O=W}return _.forEach((A)=>A()),{_isRuntime:!0,container:J,destroy:()=>{M.forEach((A)=>A()),Qf(J),J.remove()}}},lf=(f,M,_=null,E=null)=>{let W=w.createTextNode(""),J=k("div",{style:"display:contents"},[W]),L=null,A=null,Q=null;return c(()=>!!(h(f)?f():f),(G)=>{if(G===A)return;A=G;let T=()=>{if(L)L.destroy(),L=null};if(L&&!G&&E?.out){if(Q&&Q.cancel)Q.cancel();let S=E.out(L.container,T);if(Q=S,S&&S.finished)S.finished.then(T);else T()}else T();let P=G?M:_;if(P){if(L=a(()=>h(P)?P():P),J.insertBefore(L.container,W),E?.in)E.in(L.container)}}),J},sf=(f,M,_)=>{let E=w.createTextNode(""),W=k("div",{style:"display:contents"},[E]),J=new Map;return c(()=>(h(f)?f():f)||[],(L)=>{let A=new Map,Q=[],G=L||[];for(let P=0;PM(S,P));else J.delete(K);A.set(K,X),Q.push(X)}J.forEach((P)=>P.destroy());let T=E;for(let P=Q.length-1;P>=0;P--){let K=Q[P].container;if(K.nextSibling!==T)W.insertBefore(K,T);T=K}J=A}),W},b=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=o(M()),E=()=>_(M());window.addEventListener("hashchange",E),n(()=>window.removeEventListener("hashchange",E));let W=k("div",{class:"router-hook"}),J=null;return c([_],()=>{let L=_(),A=f.find((Q)=>{let G=Q.path.split("/").filter(Boolean),T=L.split("/").filter(Boolean);return G.length===T.length&&G.every((P,S)=>P[0]===":"||P===T[S])})||f.find((Q)=>Q.path==="*");if(A){J?.destroy();let Q={};A.path.split("/").filter(Boolean).forEach((G,T)=>{if(G[0]===":")Q[G.slice(1)]=L.split("/").filter(Boolean)[T]}),b.params(Q),J=a(()=>h(A.component)?A.component(Q):A.component),W.replaceChildren(J.container)}}),W};b.params=o({});b.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");b.back=()=>window.history.back();b.path=()=>window.location.hash.replace(/^#/,"")||"/";var tf=(f,M)=>{let _=typeof M==="string"?w.querySelector(M):M;if(!_)return;if(Wf.has(_))Wf.get(_).destroy();let E=a(h(f)?f:()=>f);return _.replaceChildren(E.container),Wf.set(_,E),E},of=Object.freeze({$:o,Watch:c,Tag:k,Render:a,If:lf,For:sf,Router:b,Mount:tf,onMount:j_,onUnmount:n,set:w_});if(typeof window<"u")Object.assign(window,of),"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,_)=>of.Tag(f,M,_));var _f={};R(_f,{default:()=>g_,Tooltip:()=>F_,Toast:()=>O_,Timeline:()=>V_,Tabs:()=>N_,Table:()=>D_,Swap:()=>z_,Stat:()=>R_,Stack:()=>C_,Select:()=>q_,Rating:()=>S_,Range:()=>Y_,Radio:()=>K_,Navbar:()=>Z_,Modal:()=>X_,Menu:()=>B_,List:()=>T_,Label:()=>P_,Input:()=>i,Indicator:()=>G_,Fileinput:()=>Q_,Fieldset:()=>J_,Fab:()=>W_,Dropdown:()=>A_,Drawer:()=>L_,Datepicker:()=>$_,Colorpicker:()=>E_,Checkbox:()=>M_,Button:()=>l,Badge:()=>__,Autocomplete:()=>f_,Alert:()=>ef,Accordion:()=>af});var Gf={};R(Gf,{Accordion:()=>af});var ff={};R(ff,{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,W=_?"ml-1":"mr-1";if(E&&!E.startsWith("icon-[")&&!E.includes("--"))return Tag("span",{class:W},E);return Tag("span",{class:`${E} ${W}`.trim()})}return null};var af=(f,M)=>{let{class:_,title:E,name:W,open:J,...L}=f;return Tag("div",{...L,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:W?"radio":"checkbox",name:W,checked:B(J)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Pf={};R(Pf,{Alert:()=>ef});var ef=(f,M)=>{let{class:_,actions:E,type:W="info",soft:J=!0,...L}=f,A={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},T=[`alert-${W}`,J?"alert-soft":"",_].filter(Boolean).join(" "),P=M||f.message;return Tag("div",{...L,role:"alert",class:Z("alert",T)},()=>[z(A[W]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof P==="function"?P():P])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var Bf={};R(Bf,{Autocomplete:()=>f_});var m_={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"}},v_=$("es");var x=(f)=>()=>m_[v_()][f]||f;var Tf={};R(Tf,{Input:()=>i});var i=(f)=>{let{class:M,value:_,type:E="text",icon:W,oninput:J,placeholder:L,disabled:A,validate:Q,label:G,...T}=f,P=E==="password",S=$(!1),K=$(null),X={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]"},q=W?z(W):X[E]?z(X[E]):null,D=()=>z(S()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),j=q?"pl-10":"",I=P?"pr-10":"",p=()=>{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"},d=(V)=>{let m=V.target.value;if(Q){let Mf=Q(m);K(Mf||null)}J?.(V)},U=()=>K()&&K()!=="",Y=()=>{let V=`input w-full ${j} ${I}`;if(M)V+=` ${M}`;if(U())V+=" input-error";return V.trim()},C=Tag("input",{...T,type:()=>P?S()?"text":"password":E,placeholder:L||(G?" ":L),class:Y,value:_,oninput:d,disabled:()=>B(A),"aria-invalid":()=>U()?"true":"false"}),N=()=>[C,q?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},q):null,P?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",p()),onclick:(V)=>{V.preventDefault(),S(!S())}},()=>D()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>U()?K():null)];if(G)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},N),Tag("span",{},B(G))]);return Tag("div",{class:"relative w-full"},N)};var f_=(f)=>{let{class:M,items:_=[],value:E,onselect:W,label:J,placeholder:L,...A}=f,Q=$(B(E)||""),G=$(!1),T=$(-1),P=$(()=>{let X=Q().toLowerCase(),q=B(_)||[];return X?q.filter((D)=>(typeof D==="string"?D:D.label).toLowerCase().includes(X)):q}),S=(X)=>{let q=typeof X==="string"?X:X.value,D=typeof X==="string"?X:X.label;if(Q(D),typeof E==="function")E(q);W?.(X),G(!1),T(-1)},K=(X)=>{let q=P();if(X.key==="ArrowDown")X.preventDefault(),G(!0),T(Math.min(T()+1,q.length-1));else if(X.key==="ArrowUp")X.preventDefault(),T(Math.max(T()-1,0));else if(X.key==="Enter"&&T()>=0)X.preventDefault(),S(q[T()]);else if(X.key==="Escape")G(!1)};return Tag("div",{class:"relative w-full"},[i({label:J,class:M,placeholder:L||x("search")(),value:Q,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:K,oninput:(X)=>{let q=X.target.value;if(Q(q),typeof E==="function")E(q);G(!0),T(-1)},...A}),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:()=>G()&&P().length?"display:block":"display:none"},[For(P,(X,q)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${T()===q?"active bg-primary text-primary-content":""}`,onclick:()=>S(X),onmouseenter:()=>T(q)},typeof X==="string"?X:X.label)]),(X,q)=>(typeof X==="string"?X:X.value)+q),()=>P().length?null:Tag("li",{class:"p-2 text-center opacity-50"},x("nodata")())])])};var Xf={};R(Xf,{Badge:()=>__});var __=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Zf={};R(Zf,{Button:()=>l});var l=(f,M)=>{let{class:_,loading:E,icon:W,...J}=f,L=z(W);return Tag("button",{...J,class:Z("btn",_),disabled:()=>B(E)||B(f.disabled)},()=>[B(E)&&Tag("span",{class:"loading loading-spinner"}),L,M].filter(Boolean))};var Kf={};R(Kf,{Checkbox:()=>M_});var M_=(f)=>{let{class:M,value:_,toggle:E,label:W,...J}=f,L=Tag("input",{...J,type:"checkbox",class:()=>Z(B(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[L,W?Tag("span",{class:"label-text"},W):null])};var Yf={};R(Yf,{Colorpicker:()=>E_});var E_=(f)=>{let{class:M,value:_,label:E,...W}=f,J=$(!1),L=["#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=()=>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:(Q)=>{Q.stopPropagation(),J(!J())},...W},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${A()}`}),E?Tag("span",{class:"opacity-80"},E):null]),If(J,()=>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:(Q)=>Q.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},L.map((Q)=>Tag("button",{type:"button",style:`background-color: ${Q}`,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()===Q.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(Q);J(!1)}})))])),If(J,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>J(!1)}))])};var Sf={};R(Sf,{Datepicker:()=>$_});var $_=(f)=>{let{class:M,value:_,range:E,label:W,placeholder:J,hour:L=!1,...A}=f,Q=$(!1),G=$(new Date),T=$(null),P=$(0),S=$(0),K=()=>B(E)===!0,X=new Date,q=`${X.getFullYear()}-${String(X.getMonth()+1).padStart(2,"0")}-${String(X.getDate()).padStart(2,"0")}`,D=(Y)=>{let C=Y.getFullYear(),N=String(Y.getMonth()+1).padStart(2,"0"),V=String(Y.getDate()).padStart(2,"0");return`${C}-${N}-${V}`},j=(Y)=>{let C=D(Y),N=B(_);if(K())if(!N?.start||N.start&&N.end){if(typeof _==="function")_({start:C,end:null,...L&&{startHour:P()}})}else{let V=N.start;if(typeof _==="function"){let m=C{let Y=B(_);if(!Y)return"";if(typeof Y==="string"){if(L&&Y.includes("T"))return Y.replace("T"," ");return Y}if(Y.start&&Y.end){let C=L&&Y.startHour?`${Y.start} ${String(Y.startHour).padStart(2,"0")}:00`:Y.start,N=L&&Y.endHour?`${Y.end} ${String(Y.endHour).padStart(2,"0")}:00`:Y.end;return`${C} - ${N}`}if(Y.start)return`${L&&Y.startHour?`${Y.start} ${String(Y.startHour).padStart(2,"0")}:00`:Y.start}...`;return""}),p=(Y)=>{let C=G();G(new Date(C.getFullYear(),C.getMonth()+Y,1))},d=(Y)=>{let C=G();G(new Date(C.getFullYear()+Y,C.getMonth(),1))},U=({value:Y,onChange:C})=>{return Tag("div",{class:"flex-1"},[Tag("div",{class:"flex gap-2 items-center"},[Tag("input",{type:"range",min:0,max:23,value:Y,class:"range range-xs flex-1",oninput:(N)=>{let V=parseInt(N.target.value);C(V)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(B(Y)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[i({label:W,placeholder:J||(K()?"Seleccionar rango...":"Seleccionar fecha..."),value:I,readonly:!0,icon:z("icon-[lucide--calendar]"),onclick:(Y)=>{Y.stopPropagation(),Q(!Q())},...A}),If(Q,()=>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:(Y)=>Y.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:()=>d(-1)},z("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>p(-1)},z("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().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:()=>p(1)},z("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>d(1)},z("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>T(null)},[...["L","M","X","J","V","S","D"].map((Y)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},Y)),()=>{let Y=G(),C=Y.getFullYear(),N=Y.getMonth(),V=new Date(C,N,1).getDay(),m=V===0?6:V-1,Mf=new Date(C,N+1,0).getDate(),Ef=[];for(let v=0;v{let u=B(_),$f=T(),h_=typeof u==="string"?u.split("T")[0]===H:u?.start===H,k_=u?.end===H,Lf=!1;if(K()&&u?.start){let Af=u.start;if(!u.end&&$f)Lf=H>Af&&H<=$f||H=$f;else if(u.end)Lf=H>Af&&H{if(K())T(H)},onclick:()=>j(pf)},[v.toString()]))}return Ef}]),L?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[K()?Tag("div",{class:"flex gap-4"},[U({value:P,onChange:(Y)=>{P(Y);let C=B(_);if(C?.start)_({...C,startHour:Y})}}),U({value:S,onChange:(Y)=>{S(Y);let C=B(_);if(C?.end)_({...C,endHour:Y})}})]):U({value:P,onChange:(Y)=>{P(Y);let C=B(_);if(C&&typeof C==="string"&&C.includes("-"))_(C.split("T")[0]+"T"+String(Y).padStart(2,"0")+":00:00")}})]):null])),If(Q,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>Q(!1)}))])};var qf={};R(qf,{Drawer:()=>L_});var L_=(f,M)=>{let{class:_,id:E,open:W,side:J,content:L,...A}=f,Q=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...A,class:Z("drawer",_)},[Tag("input",{id:Q,type:"checkbox",class:"drawer-toggle",checked:()=>typeof W==="function"?W():W,onchange:(G)=>{if(typeof W==="function")W(G.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof L==="function"?L():L]),Tag("div",{class:"drawer-side"},[Tag("label",{for:Q,class:"drawer-overlay",onclick:()=>{if(typeof W==="function")W(!1)}}),Tag("div",{class:"min-h-full bg-base-200 w-80"},[typeof J==="function"?J():J])])])};var Cf={};R(Cf,{Dropdown:()=>A_});var y=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(y&&!y.contains(f.target))y.open=!1,y=null}),window.__dropdownHandlerRegistered=!0;var A_=(f)=>{let{class:M,label:_,icon:E,items:W,...J}=f;return Tag("details",{...J,class:Z("dropdown",M)},[Tag("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(L)=>{let A=L.currentTarget.closest("details");if(y&&y!==A)y.open=!1;setTimeout(()=>{y=A.open?A: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 W==="function"?W():W||[]).map((A)=>Tag("li",{},[Tag("a",{class:A.class||"",onclick:(Q)=>{if(A.onclick)A.onclick(Q);let G=Q.currentTarget.closest("details");if(G){if(G.open=!1,y===G)y=null}}},[A.icon?Tag("span",{},A.icon):null,Tag("span",{},A.label)])]))}])])};var Rf={};R(Rf,{Fab:()=>W_});var W_=(f)=>{let{class:M,icon:_,label:E,actions:W=[],position:J="bottom-6 right-6",...L}=f;return Tag("div",{...L,class:Z(`fab absolute ${J} 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(W).map((A)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[A.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},A.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${A.class||""}`,onclick:(Q)=>{Q.stopPropagation(),A.onclick?.(Q)}},[A.icon?z(A.icon):A.text||""])]))])};var zf={};R(zf,{Fieldset:()=>J_});var J_=(f,M)=>{let{class:_,legend:E,...W}=f;return Tag("fieldset",{...W,class:Z("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",_)},[()=>{let J=B(E);return J?Tag("legend",{class:"fieldset-legend font-bold"},[J]):null},M])};var Df={};R(Df,{Fileinput:()=>Q_});var Q_=(f)=>{let{class:M,tooltip:_,max:E=2,accept:W="*",onselect:J,...L}=f,A=$([]),Q=$(!1),G=$(null),T=E*1024*1024,P=(K)=>{let X=Array.from(K);if(G(null),X.find((D)=>D.size>T)){G(`Máx ${E}MB`);return}A([...A(),...X]),J?.(A())},S=(K)=>{let X=A().filter((q,D)=>D!==K);A(X),J?.(X)};return Tag("fieldset",{...L,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:()=>` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-200 - ${B()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} - `,ondragover:(Y)=>{Y.preventDefault(),B(!0)},ondragleave:()=>B(!1),ondrop:(Y)=>{Y.preventDefault(),B(!1),P(Y.dataTransfer.files)}},[Tag("div",{class:"flex items-center gap-3 w-full"},[D("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:(Y)=>P(Y.target.files)})])]),()=>G()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,If(()=>T().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(T,(Y,X)=>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]"},Y.name),Tag("span",{class:"text-[9px] opacity-40"},`(${(Y.size/1024).toFixed(0)} KB)`)]),Tag("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(S)=>{S.preventDefault(),S.stopPropagation(),K(X)}},[D("icon-[lucide--x]")])]),(Y)=>Y.name+Y.lastModified)]))])};var zf={};N(zf,{Indicator:()=>J_});var J_=(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 Of={};N(Of,{Label:()=>P_});var P_=(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",{},Q(_)):null]);return Tag("label",{class:Z("label",L),...A},()=>[_?Tag("span",{class:"label-text"},Q(_)):null,typeof M==="function"?M():M])};var hf={};N(hf,{List:()=>Q_});var Q_=(f)=>{let{class:M,items:_,header:E,render:L=(B)=>B,keyFn:A=(B,G)=>B.id??G,...W}=f,T=For(_,(B,G)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[L(B,G)])]),A);return Tag("ul",{...W,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%;"},[Q(E)])),T]:T)};var Ff={};N(Ff,{Menu:()=>X_});var X_=(f)=>{let{class:M,items:_,...E}=f,L=(A)=>For(()=>A||[],(W)=>Tag("li",{},[W.children?Tag("details",{open:W.open},[Tag("summary",{},[W.icon&&Tag("span",{class:"mr-2"},W.icon),W.label]),Tag("ul",{},L(W.children))]):Tag("a",{class:()=>Q(W.active)?"active":"",onclick:W.onclick},[W.icon&&Tag("span",{class:"mr-2"},W.icon),W.label])]),(W,T)=>W.label||T);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},L(_))};var Uf={};N(Uf,{Modal:()=>Z_});var Z_=(f,M)=>{let{class:_,title:E,buttons:L,open:A,...W}=f,T=null,B=()=>{let J=typeof A==="function"?A():A;if(!T)return;if(J){if(!T.open)T.showModal()}else if(T.open)T.close()};Watch(()=>B());let G=()=>{if(typeof A==="function")A(!1)};return Tag("dialog",{...W,ref:(J)=>{if(T=J,J)B()},class:Z("modal",_),onclose:G,oncancel:G},[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),d({type:"submit"},k("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var Vf={};N(Vf,{Navbar:()=>Y_});var Y_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var jf={};N(jf,{Radio:()=>C_});var C_=(f)=>{let{class:M,label:_,tooltip:E,value:L,inputValue:A,name:W,...T}=f,B=Tag("input",{...T,type:"radio",name:W,class:Z("radio",M),checked:()=>Q(L)===A,onclick:()=>{if(typeof L==="function")L(A)}});if(!_&&!E)return B;let G=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[B,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},G):G};var Hf={};N(Hf,{Range:()=>K_});var K_=(f)=>{let{class:M,label:_,tooltip:E,value:L,...A}=f,W=Tag("input",{...A,type:"range",class:Z("range",M),value:L,disabled:()=>Q(f.disabled)});if(!_&&!E)return W;let T=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,W]);return E?Tag("div",{class:"tooltip","data-tip":E},T):T};var kf={};N(kf,{Rating:()=>S_});var S_=(f)=>{let{class:M,value:_,count:E=5,mask:L="mask-star",readonly:A=!1,onchange:W,...T}=f,B=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...T,class:()=>Z(`rating ${Q(A)?"pointer-events-none":""}`,M)},Array.from({length:Q(E)},(G,J)=>{let P=J+1;return Tag("input",{type:"radio",name:B,class:`mask ${L}`,checked:()=>Math.round(Q(_))===P,onchange:()=>{if(!Q(A)){if(typeof W==="function")W(P);else if(typeof _==="function")_(P)}}})}))};var wf={};N(wf,{Select:()=>q_});var q_=(f)=>{let{class:M,label:_,items:E,value:L,...A}=f,W=Tag("select",{...A,class:Z("select select-bordered w-full",M),value:L},For(()=>Q(E)||[],(T)=>Tag("option",{value:T.value,$selected:()=>String(Q(L))===String(T.value)},T.label),(T)=>T.value));if(!_)return W;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),W])};var xf={};N(xf,{Stack:()=>N_});var N_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var yf={};N(yf,{Stat:()=>R_});var R_=(f)=>{let{class:M,icon:_,label:E,value:L,desc:A,...W}=f;return Tag("div",{...W,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>Q(L)??L),A&&Tag("div",{class:"stat-desc"},A)])};var uf={};N(uf,{Swap:()=>D_});var D_=(f)=>{let{class:M,value:_,on:E,off:L,...A}=f;return Tag("label",{...A,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>Q(_),onclick:(W)=>{if(typeof _==="function")_(W.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},L)])};var mf={};N(mf,{Table:()=>z_});var z_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:L,zebra:A=!1,pinRows:W=!1,empty:T=k("nodata")(),...B}=f,G=()=>{let P=Q(A)?"table-zebra":"",K=Q(W)?"table-pin-rows":"";return Z("table",M,P,K)},J=L||((P,K)=>P.id||K);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...B,class:G},[Tag("thead",{},[Tag("tr",{},E.map((P)=>Tag("th",{class:P.class||""},P.label)))]),Tag("tbody",{},[For(_,(P,K)=>{let Y=()=>{let X=Q(_),S=J(P,K);return X.find((R,I)=>J(R,I)===S)||P};return Tag("tr",{class:"hover"},E.map((X)=>{let S=()=>{let R=Y();if(X.render)return X.render(R,K);return Q(R[X.key])};return Tag("td",{class:X.class||""},[S])}))},J),If(()=>Q(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[Q(T)])]))])])])};var vf={};N(vf,{Tabs:()=>O_});var O_=(f)=>{let{items:M,class:_,...E}=f,L=typeof M==="function"?M:()=>M||[],A=$(0);Watch(()=>{let B=L().findIndex((G)=>Q(G.active)===!0);if(B!==-1&&A()!==B)A(B)});let W=(T,B)=>{if(B.onClose)B.onClose();let J=L().filter((Y,X)=>X!==T);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(J),J.length===0)return;let K=A();if(T{let T=L(),B=[];for(let G=0;G{x.stopPropagation(),W(G,J)};let b=Tag("span",{class:"flex items-center"},[K,U]);Y.push(b)}else Y.push(K);let X=Tag("button",{class:()=>{let U=A()===G;return Z("tab",U?"tab-active":"")},onclick:(U)=>{if(U.preventDefault(),!Q(J.disabled)){if(J.onclick)J.onclick();A(G)}},title:J.tip||""},Y);B.push(X);let S,R=Q(J.content);if(typeof R==="function")S=R();else if(R instanceof Node)S=R;else S=document.createTextNode(String(R));let I=Tag("div",{class:"tab-content-inner"},S),n=Tag("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>A()===G?"display: block":"display: none"},I);B.push(n)}return B})};var gf={};N(gf,{Timeline:()=>h_});var h_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:L=!1,...A}=f,W={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 ${Q(E)?"timeline-vertical":"timeline-horizontal"} ${Q(L)?"timeline-compact":""}`,M)},()=>{let T=(typeof _==="function"?_():_)||[];return T.map((B,G)=>{let J=G===0,P=G===T.length-1,K=B.type||"success",Y=()=>Q(B.completed),X=()=>G>0&&Q(T[G-1].completed),S=(R)=>typeof R==="function"?R():R;return Tag("li",{class:"flex-1"},[!J?Tag("hr",{class:()=>X()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>S(B.title)]),Tag("div",{class:"timeline-middle"},[()=>B.icon?D(B.icon):D(W[K]||W.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>S(B.detail)]),!P?Tag("hr",{class:()=>Y()?"bg-primary":""}):null])})})};var cf={};N(cf,{Toast:()=>F_});var F_=(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,W=()=>{clearTimeout(A);let G=L.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(B.destroy(),L.remove(),!E.hasChildNodes())E.remove()},300);else B.destroy(),L.remove()},T=()=>{let G=D("icon-[lucide--x]"),J=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]),d({class:"btn-xs btn-circle btn-ghost",onclick:W},G)]);return requestAnimationFrame(()=>J.classList.remove("translate-x-10","opacity-0")),J},B=Mount(T,L);if(_>0)A=setTimeout(W,_);return W};var bf={};N(bf,{Tooltip:()=>U_});var U_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var V_={...Gf,...Jf,...Qf,...Xf,...Zf,...Yf,...Cf,...Kf,...Sf,...qf,...Nf,...Rf,...Df,...zf,...Pf,...Of,...hf,...Ff,...Uf,...Vf,...jf,...Hf,...kf,...wf,...xf,...yf,...uf,...mf,...vf,...gf,...cf,...bf},v_={...V_,install:(f=window)=>{Object.entries(V_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(Mf).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(_f).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.defineProperty(window,"tt",{value:k,writable:!1,configurable:!0,enumerable:!0}),Object.defineProperty(window,"SigProUI",{value:{...Mf,Utils:_f,tt:k},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");export{Q as val,Z as ui,k as tt,D as getIcon,s as Watch,U_ as Tooltip,F_ as Toast,h_ as Timeline,t as Tag,O_ as Tabs,z_ as Table,D_ as Swap,R_ as Stat,N_ as Stack,q_ as Select,c as Router,S_ as Rating,K_ as Range,C_ as Radio,Y_ as Navbar,af as Mount,Z_ as Modal,X_ as Menu,Q_ as List,P_ as Label,r as Input,J_ as Indicator,tf as If,lf as For,G_ as Fileinput,B_ as Fieldset,A_ as Fab,W_ as Dropdown,L_ as Drawer,$_ as Datepicker,T_ as Colorpicker,E_ as Checkbox,d as Button,M_ as Badge,__ as Autocomplete,f_ as Alert,ef as Accordion,e as $}; + ${Q()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(K)=>{K.preventDefault(),Q(!0)},ondragleave:()=>Q(!1),ondrop:(K)=>{K.preventDefault(),Q(!1),P(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:W,class:"hidden",onchange:(K)=>P(K.target.files)})])]),()=>G()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,If(()=>A().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(A,(K,X)=>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:(q)=>{q.preventDefault(),q.stopPropagation(),S(X)}},[z("icon-[lucide--x]")])]),(K)=>K.name+K.lastModified)]))])};var Nf={};R(Nf,{Indicator:()=>G_});var G_=(f,M)=>{let{value:_,class:E,...W}=f;return Tag("div",{...W,class:"indicator"},()=>[_?Tag("span",{class:Z("indicator-item badge",E)},()=>typeof _==="function"?_():_):null,M].filter(Boolean))};var Vf={};R(Vf,{Label:()=>P_});var P_=(f)=>{let{children:M,value:_,floating:E=!1,class:W,...J}=f;if(E)return Tag("label",{class:Z("floating-label",W),...J},()=>[typeof M==="function"?M():M,_?Tag("span",{},B(_)):null]);return Tag("label",{class:Z("label",W),...J},()=>[_?Tag("span",{class:"label-text"},B(_)):null,typeof M==="function"?M():M])};var Of={};R(Of,{List:()=>T_});var T_=(f)=>{let{class:M,items:_,header:E,render:W=(Q)=>Q,keyFn:J=(Q,G)=>Q.id??G,...L}=f,A=For(_,(Q,G)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[W(Q,G)])]),J);return Tag("ul",{...L,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)])),A]:A)};var Ff={};R(Ff,{Menu:()=>B_});var B_=(f)=>{let{class:M,items:_,...E}=f,W=(J)=>For(()=>J||[],(L)=>Tag("li",{},[L.children?Tag("details",{open:L.open},[Tag("summary",{},[L.icon&&Tag("span",{class:"mr-2"},L.icon),L.label]),Tag("ul",{},W(L.children))]):Tag("a",{class:()=>B(L.active)?"active":"",onclick:L.onclick},[L.icon&&Tag("span",{class:"mr-2"},L.icon),L.label])]),(L,A)=>L.label||A);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},W(_))};var Uf={};R(Uf,{Modal:()=>X_});var X_=(f,M)=>{let{class:_,title:E,buttons:W,open:J,...L}=f,A=null,Q=()=>{let T=typeof J==="function"?J():J;if(!A)return;if(T){if(!A.open)A.showModal()}else if(A.open)A.close()};Watch(()=>Q());let G=()=>{if(typeof J==="function")J(!1)};return Tag("dialog",{...L,ref:(T)=>{if(A=T,T)Q()},class:Z("modal",_),onclose:G,oncancel:G},[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(W)?W:[W]).filter(Boolean),l({type:"submit"},x("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var hf={};R(hf,{Navbar:()=>Z_});var Z_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var kf={};R(kf,{Radio:()=>K_});var K_=(f)=>{let{class:M,label:_,tooltip:E,value:W,inputValue:J,name:L,...A}=f,Q=Tag("input",{...A,type:"radio",name:L,class:Z("radio",M),checked:()=>B(W)===J,onclick:()=>{if(typeof W==="function")W(J)}});if(!_&&!E)return Q;let G=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[Q,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},G):G};var Hf={};R(Hf,{Range:()=>Y_});var Y_=(f)=>{let{class:M,label:_,tooltip:E,value:W,...J}=f,L=Tag("input",{...J,type:"range",class:Z("range",M),value:W,disabled:()=>B(f.disabled)});if(!_&&!E)return L;let A=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,L]);return E?Tag("div",{class:"tooltip","data-tip":E},A):A};var jf={};R(jf,{Rating:()=>S_});var S_=(f)=>{let{class:M,value:_,count:E=5,mask:W="mask-star",readonly:J=!1,onchange:L,...A}=f,Q=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...A,class:()=>Z(`rating ${B(J)?"pointer-events-none":""}`,M)},Array.from({length:B(E)},(G,T)=>{let P=T+1;return Tag("input",{type:"radio",name:Q,class:`mask ${W}`,checked:()=>Math.round(B(_))===P,onchange:()=>{if(!B(J)){if(typeof L==="function")L(P);else if(typeof _==="function")_(P)}}})}))};var wf={};R(wf,{Select:()=>q_});var q_=(f)=>{let{class:M,label:_,items:E,value:W,...J}=f,L=Tag("select",{...J,class:Z("select select-bordered w-full",M),value:W},For(()=>B(E)||[],(A)=>Tag("option",{value:A.value,$selected:()=>String(B(W))===String(A.value)},A.label),(A)=>A.value));if(!_)return L;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),L])};var xf={};R(xf,{Stack:()=>C_});var C_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var yf={};R(yf,{Stat:()=>R_});var R_=(f)=>{let{class:M,icon:_,label:E,value:W,desc:J,...L}=f;return Tag("div",{...L,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>B(W)??W),J&&Tag("div",{class:"stat-desc"},J)])};var uf={};R(uf,{Swap:()=>z_});var z_=(f)=>{let{class:M,value:_,on:E,off:W,...J}=f;return Tag("label",{...J,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>B(_),onclick:(L)=>{if(typeof _==="function")_(L.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},W)])};var mf={};R(mf,{Table:()=>D_});var D_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:W,zebra:J=!1,pinRows:L=!1,empty:A=x("nodata")(),...Q}=f,G=()=>{let P=B(J)?"table-zebra":"",S=B(L)?"table-pin-rows":"";return Z("table",M,P,S)},T=W||((P,S)=>P.id||S);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...Q,class:G},[Tag("thead",{},[Tag("tr",{},E.map((P)=>Tag("th",{class:P.class||""},P.label)))]),Tag("tbody",{},[For(_,(P,S)=>{let K=()=>{let X=B(_),q=T(P,S);return X.find((D,j)=>T(D,j)===q)||P};return Tag("tr",{class:"hover"},E.map((X)=>{let q=()=>{let D=K();if(X.render)return X.render(D,S);return B(D[X.key])};return Tag("td",{class:X.class||""},[q])}))},T),If(()=>B(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[B(A)])]))])])])};var vf={};R(vf,{Tabs:()=>N_});var N_=(f)=>{let{items:M,class:_,onTabClose:E,...W}=f,J=typeof M==="function"?M:()=>M||[],L=o(0);c(()=>{let G=J().findIndex((T)=>B(T.active)===!0);if(G!==-1&&L()!==G)L(G)});let A=(Q,G)=>{if(G.onClose)G.onClose(G);if(E)E(G,Q);let P=J().filter((X,q)=>q!==Q);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(P),P.length===0)return;let K=L();if(Q{let Q=J(),G=[];for(let T=0;T{C.stopPropagation(),A(T,P)};let Y=k("span",{class:"flex items-center"},[K,U]);X.push(Y)}else X.push(K);let q=k("button",{class:()=>Z("tab",L()===T?"tab-active":""),onclick:(U)=>{if(U.preventDefault(),!B(P.disabled)){if(P.onclick)P.onclick();L(T)}}},X),D=P.tip?k("div",{class:"tooltip","data-tip":P.tip},q):q;G.push(D);let j,I=B(P.content);if(typeof I==="function")j=I();else if(I instanceof Node)j=I;else j=document.createTextNode(String(I));let p=k("div",{class:"tab-content-inner"},j),d=k("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>L()===T?"display: block":"display: none"},p);G.push(d)}return G})};var gf={};R(gf,{Timeline:()=>V_});var V_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:W=!1,...J}=f,L={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return Tag("ul",{...J,class:()=>Z(`timeline ${B(E)?"timeline-vertical":"timeline-horizontal"} ${B(W)?"timeline-compact":""}`,M)},()=>{let A=(typeof _==="function"?_():_)||[];return A.map((Q,G)=>{let T=G===0,P=G===A.length-1,S=Q.type||"success",K=()=>B(Q.completed),X=()=>G>0&&B(A[G-1].completed),q=(D)=>typeof D==="function"?D():D;return Tag("li",{class:"flex-1"},[!T?Tag("hr",{class:()=>X()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>q(Q.title)]),Tag("div",{class:"timeline-middle"},[()=>Q.icon?z(Q.icon):z(L[S]||L.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>q(Q.detail)]),!P?Tag("hr",{class:()=>K()?"bg-primary":""}):null])})})};var cf={};R(cf,{Toast:()=>O_});var O_=(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 W=Tag("div",{style:"display: contents"});E.appendChild(W);let J,L=()=>{clearTimeout(J);let G=W.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(Q.destroy(),W.remove(),!E.hasChildNodes())E.remove()},300);else Q.destroy(),W.remove()},A=()=>{let G=z("icon-[lucide--x]"),T=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:L},G)]);return requestAnimationFrame(()=>T.classList.remove("translate-x-10","opacity-0")),T},Q=Mount(A,W);if(_>0)J=setTimeout(L,_);return L};var bf={};R(bf,{Tooltip:()=>F_});var F_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var U_={...Gf,...Pf,...Bf,...Xf,...Zf,...Kf,...Yf,...Sf,...qf,...Cf,...Rf,...zf,...Df,...Nf,...Tf,...Vf,...Of,...Ff,...Uf,...hf,...kf,...Hf,...jf,...wf,...xf,...yf,...uf,...mf,...vf,...gf,...cf,...bf},g_={...U_,install:(f=window)=>{Object.entries(U_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(_f).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(ff).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:{..._f,Utils:ff,tt:x},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");export{B as val,Z as ui,x as tt,z as getIcon,c as Watch,F_ as Tooltip,O_ as Toast,V_ as Timeline,k as Tag,N_ as Tabs,D_ as Table,z_ as Swap,R_ as Stat,C_ as Stack,q_ as Select,b as Router,S_ as Rating,Y_ as Range,K_ as Radio,Z_ as Navbar,tf as Mount,X_ as Modal,B_ as Menu,T_ as List,P_ as Label,i as Input,G_ as Indicator,lf as If,sf as For,Q_ as Fileinput,J_ as Fieldset,W_ as Fab,A_ as Dropdown,L_ as Drawer,$_ as Datepicker,E_ as Colorpicker,M_ as Checkbox,l as Button,__ as Badge,f_ as Autocomplete,ef as Alert,af as Accordion,o as $}; diff --git a/dist/sigpro-ui.js b/dist/sigpro-ui.js index 8655a27..037428d 100644 --- a/dist/sigpro-ui.js +++ b/dist/sigpro-ui.js @@ -33,7 +33,7 @@ val: () => val, ui: () => ui, tt: () => tt, - getIcon: () => getIcon2, + getIcon: () => getIcon, Watch: () => Watch2, Tooltip: () => Tooltip, Toast: () => Toast, @@ -76,62 +76,81 @@ }); // src/sigpro.js - var isFunc = (fn) => typeof fn === "function"; + 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 = (node) => node?._isRuntime ? node.container : node instanceof Node ? node : doc.createTextNode(node == null ? "" : String(node)); + 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 effectQueue = new Set; var MOUNTED_NODES = new WeakMap; - var dispose = (effect) => { - if (!effect || effect._disposed) + var dispose = (eff) => { + if (!eff || eff._disposed) return; - effect._disposed = true; - const stack = [effect]; + eff._disposed = true; + const stack = [eff]; while (stack.length) { - const eff = stack.pop(); - if (eff._cleanups) { - eff._cleanups.forEach((fn) => fn()); - eff._cleanups.clear(); + const e = stack.pop(); + if (e._cleanups) { + e._cleanups.forEach((fn) => fn()); + e._cleanups.clear(); } - if (eff._children) { - eff._children.forEach((child) => stack.push(child)); - eff._children.clear(); + if (e._children) { + e._children.forEach((child) => stack.push(child)); + e._children.clear(); } - if (eff._deps) { - eff._deps.forEach((depSet) => depSet.delete(eff)); - eff._deps.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 onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); + var set = (signal, path, value) => { + if (value === undefined) + return signal(isFunc(path) ? path(signal()) : path); + const keys = path.split("."), root = { ...signal() }; + let acc = root, k; + for (k of keys.slice(0, -1)) + acc = acc[k] = { ...acc[k] || {} }; + acc[keys.at(-1)] = value; + signal(root); + }; + 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((depSet) => depSet.delete(effect)); + effect._deps.forEach((s) => s.delete(effect)); if (effect._cleanups) { - effect._cleanups.forEach((cleanup) => cleanup()); + effect._cleanups.forEach((c) => c()); effect._cleanups.clear(); } const prevEffect = activeEffect; const prevOwner = activeOwner; activeEffect = activeOwner = effect; try { - const res = isComputed ? fn() : (fn(), undefined); - if (!isComputed) - effect._result = res; - return res; + return effect._result = fn(); + } catch (e) { + console.error("[SigPro]", e); } finally { activeEffect = prevEffect; activeOwner = prevOwner; @@ -153,9 +172,9 @@ isFlushing = true; const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); effectQueue.clear(); - for (const eff of sorted) - if (!eff._disposed) - eff(); + for (const e of sorted) + if (!e._disposed) + e(); isFlushing = false; }; var trackUpdate = (subs, trigger = false) => { @@ -164,15 +183,15 @@ (activeEffect._deps ||= new Set).add(subs); } else if (trigger) { let hasQueue = false; - subs.forEach((eff) => { - if (eff === activeEffect || eff._disposed) + subs.forEach((e) => { + if (e === activeEffect || e._disposed) return; - if (eff._isComputed) { - eff._dirty = true; - if (eff._subs) - trackUpdate(eff._subs, true); + if (e._isComputed) { + e._dirty = true; + if (e._subs) + trackUpdate(e._subs, true); } else { - effectQueue.add(eff); + effectQueue.add(e); hasQueue = true; } }); @@ -180,25 +199,16 @@ queueMicrotask(flush); } }; - var untrack = (fn) => { - const prev = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = prev; - } - }; - var $2 = (initialValue, storageKey = null) => { + var $2 = (val, key = null) => { const subs = new Set; - if (isFunc(initialValue)) { + if (isFunc(val)) { let cache, dirty = true; const computed = () => { if (dirty) { const prev = activeEffect; activeEffect = computed; try { - const next = initialValue(); + const next = val(); if (!Object.is(cache, next)) { cache = next; dirty = false; @@ -231,33 +241,33 @@ onUnmount(computed.stop); return computed; } - if (storageKey) + if (key) try { - initialValue = JSON.parse(localStorage.getItem(storageKey)) ?? initialValue; + val = JSON.parse(localStorage.getItem(key)) ?? val; } catch (e) {} return (...args) => { if (args.length) { - const next = isFunc(args[0]) ? args[0](initialValue) : args[0]; - if (!Object.is(initialValue, next)) { - initialValue = next; - if (storageKey) - localStorage.setItem(storageKey, JSON.stringify(initialValue)); + 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 initialValue; + return val; }; }; - var Watch2 = (sources, callback) => { - if (callback === undefined) { + var Watch2 = (sources, cb) => { + if (cb === undefined) { const effect2 = createEffect(sources); effect2(); return () => dispose(effect2); } const effect = createEffect(() => { - const vals = isArr(sources) ? sources.map((src) => src()) : sources(); - untrack(() => callback(vals)); + const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); + untrack(() => cb(vals)); }); effect(); return () => dispose(effect); @@ -274,36 +284,20 @@ }; var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); - var applyProp = (elem, key, value, isSVG) => { - if (value == null || value === false) { - if (key === "class" || key === "className") - elem.className = ""; - else if (key in elem && !isSVG) - elem[key] = ""; - else - elem.removeAttribute(key); - return; - } - if (key === "class" || key === "className") { - elem.className = value; - } else if (key === "style" && typeof value === "object") { - Object.assign(elem.style, value); - } else if (key in elem && !isSVG) { - elem[key] = value; - } else if (isSVG) { - if (key.startsWith("xlink:")) { - elem.setAttributeNS("http://www.w3.org/1999/xlink", key, value); - } else if (key === "xmlns" || key.startsWith("xmlns:")) { - elem.setAttributeNS("http://www.w3.org/2000/xmlns/", key, value); - } else { - elem.setAttribute(key, value === true ? "" : value); + 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 "#"; } - } else { - elem.setAttribute(key, value === true ? "" : value); } + return val; }; var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || props && typeof props !== "object") { + if (props instanceof Node || isArr(props) || !isObj(props)) { children = props; props = {}; } @@ -318,71 +312,75 @@ return result2; }); effect(); - ctx._mounts = effect._mounts || []; - ctx._cleanups = effect._cleanups || new Set; const result = effect._result; - const attach = (node) => { - if (node && typeof node === "object" && !node._isRuntime) { - node._mounts = ctx._mounts; - node._cleanups = ctx._cleanups; - node._ownerEffect = effect; - } - }; - isArr(result) ? result.forEach(attach) : attach(result); if (result == null) return null; - if (result instanceof Node || isArr(result) && result.every((n) => n instanceof Node)) - return result; - return doc.createTextNode(String(result)); + 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|image|ellipse|foreignObject|linearGradient|radialGradient|stop|pattern|mask|clipPath|filter|feColorMatrix|feBlend|feGaussianBlur|animate|animateTransform|set|metadata|desc|title|symbol|marker|view)$/i.test(tag); - const elem = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - elem._cleanups = new Set; - for (let key in props) { - if (!props.hasOwnProperty(key)) + 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 value = props[key]; - if (key === "ref") { - isFunc(value) ? value(elem) : value.current = elem; + let v = props[k]; + if (k === "ref") { + isFunc(v) ? v(el) : v.current = el; continue; } - if (key.startsWith("on")) { - const event = key.slice(2).toLowerCase(); - elem.addEventListener(event, value); - const off = () => elem.removeEventListener(event, value); - elem._cleanups.add(off); + 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(value)) { + } else if (isFunc(v)) { const effect = createEffect(() => { - let val = value(); - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - applyProp(elem, key, val, isSVG); + 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(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(elem.tagName) && (key === "value" || key === "checked")) { - const eventType = key === "checked" ? "change" : "input"; - elem.addEventListener(eventType, (ev) => value(ev.target[key])); + 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 { - let val = value; - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - if (val != null) - applyProp(elem, key, val, isSVG); + const val = validateAttr(k, v); + if (val != null) { + if (k in el && !isSVG) + el[k] = val; + else + el.setAttribute(k, val === true ? "" : val); + } } } - const mountChild = (child) => { - if (isArr(child)) - return child.forEach(mountChild); - if (isFunc(child)) { + const append = (c) => { + if (isArr(c)) + return c.forEach(append); + if (isFunc(c)) { const anchor = doc.createTextNode(""); - elem.appendChild(anchor); + el.appendChild(anchor); let currentNodes = []; const effect = createEffect(() => { - const res = child(); + const res = c(); const next = (isArr(res) ? res : [res]).map(ensureNode); currentNodes.forEach((n) => { if (n._isRuntime) @@ -404,55 +402,46 @@ currentNodes = next; }); effect(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); } else { - const node = ensureNode(child); - elem.appendChild(node); + const node = ensureNode(c); + el.appendChild(node); if (node._mounts) node._mounts.forEach((fn) => fn()); } }; - mountChild(children); - return elem; + append(children); + return el; }; - var createView = (renderFn) => { + var Render = (renderFn) => { const cleanups = new Set; const mounts = []; const previousOwner = activeOwner; - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - const result = renderFn({ onCleanup: (fn) => cleanups.add(fn) }); - activeOwner = previousOwner; - if (result == null) - return null; - if (result instanceof Node) { - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container: result, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(result); - result.remove(); - } - }; - } + const previousEffect = activeEffect; const container = doc.createElement("div"); container.style.display = "contents"; container.setAttribute("role", "presentation"); - const process = (node) => { - if (!node) + activeOwner = { _cleanups: cleanups, _mounts: mounts }; + activeEffect = null; + const processResult = (result) => { + if (!result) return; - if (node._isRuntime) { - cleanups.add(node.destroy); - container.appendChild(node.container); - } else if (isArr(node)) { - node.forEach(process); + if (result._isRuntime) { + cleanups.add(result.destroy); + container.appendChild(result.container); + } else if (isArr(result)) { + result.forEach(processResult); } else { - container.appendChild(node instanceof Node ? node : doc.createTextNode(String(node))); + container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); } }; - process(result); + try { + processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); + } finally { + activeOwner = previousOwner; + activeEffect = previousEffect; + } mounts.forEach((fn) => fn()); return { _isRuntime: true, @@ -494,7 +483,7 @@ } const content = show ? ifYes : ifNot; if (content) { - currentView = createView(() => isFunc(content) ? content() : content); + currentView = Render(() => isFunc(content) ? content() : content); root.insertBefore(currentView.container, anchor); if (trans?.in) trans.in(currentView.container); @@ -515,7 +504,7 @@ const key = keyFn ? keyFn(item, i) : item?.id ?? i; let view = cache.get(key); if (!view) - view = createView(() => itemFn(item, i)); + view = Render(() => itemFn(item, i)); else cache.delete(key); nextCache.set(key, view); @@ -540,14 +529,14 @@ const handler = () => path(getHash()); window.addEventListener("hashchange", handler); onUnmount(() => window.removeEventListener("hashchange", handler)); - const outlet = Tag2("div", { class: "router-outlet" }); + const hook = Tag2("div", { class: "router-hook" }); let currentView = null; Watch2([path], () => { const cur = path(); const route = routes.find((r) => { - const rParts = r.path.split("/").filter(Boolean); - const curParts = cur.split("/").filter(Boolean); - return rParts.length === curParts.length && rParts.every((p, i) => p[0] === ":" || p === curParts[i]); + 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(); @@ -557,14 +546,14 @@ params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; }); Router.params(params); - currentView = createView(() => isFunc(route.component) ? route.component(params) : route.component); - outlet.replaceChildren(currentView.container); + currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); + hook.replaceChildren(currentView.container); } }); - return outlet; + return hook; }; Router.params = $2({}); - Router.to = (path) => window.location.hash = path.replace(/^#?\/?/, "#/"); + Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.back = () => window.history.back(); Router.path = () => window.location.hash.replace(/^#/, "") || "/"; var Mount2 = (comp, target) => { @@ -573,24 +562,12 @@ return; if (MOUNTED_NODES.has(t)) MOUNTED_NODES.get(t).destroy(); - const inst = createView(() => isFunc(comp) ? comp() : comp); + const inst = Render(isFunc(comp) ? comp : () => comp); t.replaceChildren(inst.container); MOUNTED_NODES.set(t, inst); return inst; }; - var set = (signal, path, value) => { - if (value === undefined) { - signal(isFunc(path) ? path(signal()) : path); - } else { - const keys = path.split("."); - const last = keys.pop(); - const current = signal(); - const obj = keys.reduce((o, k) => ({ ...o, [k]: { ...o[k] } }), { ...current }); - obj[last] = value; - signal(obj); - } - }; - var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); + var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); 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)); @@ -645,11 +622,11 @@ __export(exports_utils, { val: () => val, ui: () => ui, - getIcon: () => getIcon2 + getIcon: () => getIcon }); var val = (t) => typeof t === "function" ? t() : t; var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); - var getIcon2 = (icon) => { + var getIcon = (icon) => { if (!icon) return null; if (typeof icon === "function") { @@ -710,7 +687,7 @@ role: "alert", class: ui("alert", allClasses) }, () => [ - getIcon2(iconMap[type]), + getIcon(iconMap[type]), Tag("div", { class: "flex-1" }, [ Tag("span", {}, [typeof content === "function" ? content() : content]) ]), @@ -779,8 +756,8 @@ tel: "icon-[lucide--phone]", url: "icon-[lucide--link]" }; - const leftIcon = icon ? getIcon2(icon) : iconMap[type] ? getIcon2(iconMap[type]) : null; - const getPasswordIcon = () => getIcon2(visible() ? "icon-[lucide--eye-off]" : "icon-[lucide--eye]"); + 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 = () => { @@ -937,7 +914,7 @@ }); var Button = (props, children) => { const { class: className, loading, icon, ...rest } = props; - const iconEl = getIcon2(icon); + const iconEl = getIcon(icon); return Tag("button", { ...rest, class: ui("btn", className), @@ -1133,7 +1110,7 @@ placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), value: displayValue, readonly: true, - icon: getIcon2("icon-[lucide--calendar]"), + icon: getIcon("icon-[lucide--calendar]"), onclick: (e) => { e.stopPropagation(); isOpen(!isOpen()); @@ -1146,15 +1123,15 @@ }, [ 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) }, getIcon2("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon2("icon-[lucide--chevron-left]")) + 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) }, getIcon2("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon2("icon-[lucide--chevrons-right]")) + 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) }, [ @@ -1362,7 +1339,7 @@ role: "button", class: "btn btn-lg btn-circle btn-primary shadow-2xl" }, [ - icon ? getIcon2(icon) : null, + icon ? getIcon(icon) : null, !icon && label ? label : null ]), ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ @@ -1374,7 +1351,7 @@ e.stopPropagation(); act.onclick?.(e); } - }, [act.icon ? getIcon2(act.icon) : act.text || ""]) + }, [act.icon ? getIcon(act.icon) : act.text || ""]) ])) ]); }; @@ -1449,7 +1426,7 @@ } }, [ Tag("div", { class: "flex items-center gap-3 w-full" }, [ - getIcon2("icon-[lucide--upload]"), + 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`) ]), @@ -1478,7 +1455,7 @@ e.stopPropagation(); removeFile(index); } - }, [getIcon2("icon-[lucide--x]")]) + }, [getIcon("icon-[lucide--x]")]) ]), (file) => file.name + file.lastModified) ])) ]); @@ -1826,10 +1803,10 @@ Tabs: () => Tabs }); var Tabs = (props) => { - const { items, class: className, ...rest } = props; + const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $(0); - Watch(() => { + const activeIndex = $2(0); + Watch2(() => { const list = itemsSignal(); const idx = list.findIndex((it) => val(it.active) === true); if (idx !== -1 && activeIndex() !== idx) { @@ -1838,7 +1815,9 @@ }); const removeTab = (indexToRemove, item) => { if (item.onClose) - 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; @@ -1856,7 +1835,7 @@ newActive = Math.min(newActive, newItems.length - 1); activeIndex(newActive); }; - return Tag("div", { ...rest, class: ui("tabs", className) }, () => { + return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { const list = itemsSignal(); const elements = []; for (let i = 0;i < list.length; i++) { @@ -1871,16 +1850,13 @@ e.stopPropagation(); removeTab(i, item); }; - const wrapper = Tag("span", { class: "flex items-center" }, [labelNode, closeIcon]); + const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); buttonChildren.push(wrapper); } else { buttonChildren.push(labelNode); } - const button = Tag("button", { - class: () => { - const isActive = activeIndex() === i; - return ui("tab", isActive ? "tab-active" : ""); - }, + const buttonBase = Tag2("button", { + class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); if (!val(item.disabled)) { @@ -1888,9 +1864,9 @@ item.onclick(); activeIndex(i); } - }, - title: item.tip || "" + } }, 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); @@ -1901,8 +1877,8 @@ } else { contentNode = document.createTextNode(String(rawContent)); } - const inner = Tag("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag("div", { + 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); @@ -1941,7 +1917,7 @@ !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), Tag("div", { class: "timeline-middle" }, [ - () => item.icon ? getIcon2(item.icon) : getIcon2(iconMap[itemType] || iconMap.success) + () => 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 @@ -1984,7 +1960,7 @@ } }; const ToastComponent = () => { - const closeIcon = getIcon2("icon-[lucide--x]"); + 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` }, [ diff --git a/dist/sigpro-ui.min.js b/dist/sigpro-ui.min.js index 850e4bb..a6ce436 100644 --- a/dist/sigpro-ui.min.js +++ b/dist/sigpro-ui.min.js @@ -1,7 +1,7 @@ -(()=>{var{defineProperty:Af,getOwnPropertyNames:x_,getOwnPropertyDescriptor:y_}=Object,I_=Object.prototype.hasOwnProperty;var O_=new WeakMap,u_=(f)=>{var M=O_.get(f),_;if(M)return M;if(M=Af({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function")x_(f).map((E)=>!I_.call(M,E)&&Af(M,E,{get:()=>f[E],enumerable:!(_=y_(f,E))||_.enumerable}));return O_.set(f,M),M};var N=(f,M)=>{for(var _ in M)Af(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var d_={};N(d_,{val:()=>Q,ui:()=>Z,tt:()=>H,getIcon:()=>D,Watch:()=>n,Tooltip:()=>R_,Toast:()=>q_,Timeline:()=>K_,Tag:()=>o,Tabs:()=>Y_,Table:()=>X_,Swap:()=>P_,Stat:()=>G_,Stack:()=>A_,Select:()=>L_,Router:()=>I,Rating:()=>T_,Range:()=>M_,Radio:()=>f_,Navbar:()=>af,Mount:()=>Qf,Modal:()=>tf,Menu:()=>of,List:()=>df,Label:()=>pf,Input:()=>b,Indicator:()=>cf,If:()=>Jf,For:()=>Pf,Fileinput:()=>vf,Fieldset:()=>uf,Fab:()=>xf,Dropdown:()=>kf,Drawer:()=>jf,Datepicker:()=>Uf,Colorpicker:()=>hf,Checkbox:()=>zf,Button:()=>p,Badge:()=>Nf,Autocomplete:()=>Sf,Alert:()=>Yf,Accordion:()=>Xf,$:()=>l});var V=(f)=>typeof f==="function",g=Array.isArray,k=typeof document<"u"?document:null,h_=(f)=>f?._isRuntime?f.container:f instanceof Node?f:k.createTextNode(f==null?"":String(f)),h=null,F=null,a=!1,Gf=new Set,Bf=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()}},d=(f)=>{if(F)(F._cleanups||=new Set).add(f)},m_=(f)=>{if(F)(F._mounts||=[]).push(f)},t=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((A)=>A.delete(_));if(_._cleanups)_._cleanups.forEach((A)=>A()),_._cleanups.clear();let E=h,L=F;h=F=_;try{let A=M?f():(f(),void 0);if(!M)_._result=A;return A}finally{h=E,F=L}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=h?h._depth+1:0,_._mounts=[],_._parent=F,F)(F._children||=new Set).add(_);return _},v_=()=>{if(a)return;a=!0;let f=Array.from(Gf).sort((M,_)=>M._depth-_._depth);Gf.clear();for(let M of f)if(!M._disposed)M();a=!1},s=(f,M=!1)=>{if(!M&&h&&!h._disposed)f.add(h),(h._deps||=new Set).add(f);else if(M){let _=!1;if(f.forEach((E)=>{if(E===h||E._disposed)return;if(E._isComputed){if(E._dirty=!0,E._subs)s(E._subs,!0)}else Gf.add(E),_=!0}),_&&!a)queueMicrotask(v_)}},g_=(f)=>{let M=h;h=null;try{return f()}finally{h=M}},l=(f,M=null)=>{let _=new Set;if(V(f)){let E,L=!0,A=()=>{if(L){let W=h;h=A;try{let T=f();if(!Object.is(E,T))E=T,L=!1,s(_,!0)}finally{h=W}}return s(_),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((W)=>W.delete(A)),A._deps.clear();_.clear()},F)d(A.stop);return A}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let L=V(E[0])?E[0](f):E[0];if(!Object.is(f,L)){if(f=L,M)localStorage.setItem(M,JSON.stringify(f));s(_,!0)}}return s(_),f}},n=(f,M)=>{if(M===void 0){let E=t(f);return E(),()=>c(E)}let _=t(()=>{let E=g(f)?f.map((L)=>L()):f();g_(()=>M(E))});return _(),()=>c(_)},e=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)c(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(e)},F_=/^\s*(javascript|data|vbscript):/i,U_=(f)=>f==="src"||f==="href"||f.startsWith("on"),V_=(f,M,_,E)=>{if(_==null||_===!1){if(M==="class"||M==="className")f.className="";else if(M in f&&!E)f[M]="";else f.removeAttribute(M);return}if(M==="class"||M==="className")f.className=_;else if(M==="style"&&typeof _==="object")Object.assign(f.style,_);else if(M in f&&!E)f[M]=_;else if(E)if(M.startsWith("xlink:"))f.setAttributeNS("http://www.w3.org/1999/xlink",M,_);else if(M==="xmlns"||M.startsWith("xmlns:"))f.setAttributeNS("http://www.w3.org/2000/xmlns/",M,_);else f.setAttribute(M,_===!0?"":_);else f.setAttribute(M,_===!0?"":_)},o=(f,M={},_=[])=>{if(M instanceof Node||g(M)||M&&typeof M!=="object")_=M,M={};if(V(f)){let W={_mounts:[],_cleanups:new Set},T=t(()=>{let J=f(M,{children:_,emit:(P,...K)=>M[`on${P[0].toUpperCase()}${P.slice(1)}`]?.(...K)});return T._result=J,J});T(),W._mounts=T._mounts||[],W._cleanups=T._cleanups||new Set;let B=T._result,G=(J)=>{if(J&&typeof J==="object"&&!J._isRuntime)J._mounts=W._mounts,J._cleanups=W._cleanups,J._ownerEffect=T};if(g(B)?B.forEach(G):G(B),B==null)return null;if(B instanceof Node||g(B)&&B.every((J)=>J instanceof Node))return B;return k.createTextNode(String(B))}let E=/^(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)$/i.test(f),L=E?k.createElementNS("http://www.w3.org/2000/svg",f):k.createElement(f);L._cleanups=new Set;for(let W in M){if(!M.hasOwnProperty(W))continue;let T=M[W];if(W==="ref"){V(T)?T(L):T.current=L;continue}if(W.startsWith("on")){let B=W.slice(2).toLowerCase();L.addEventListener(B,T);let G=()=>L.removeEventListener(B,T);L._cleanups.add(G),d(G)}else if(V(T)){let B=t(()=>{let G=T();if(U_(W)&&F_.test(String(G)))G="#";V_(L,W,G,E)});if(B(),L._cleanups.add(()=>c(B)),d(()=>c(B)),/^(INPUT|TEXTAREA|SELECT)$/.test(L.tagName)&&(W==="value"||W==="checked")){let G=W==="checked"?"change":"input";L.addEventListener(G,(J)=>T(J.target[W]))}}else{let B=T;if(U_(W)&&F_.test(String(B)))B="#";if(B!=null)V_(L,W,B,E)}}let A=(W)=>{if(g(W))return W.forEach(A);if(V(W)){let T=k.createTextNode("");L.appendChild(T);let B=[],G=t(()=>{let J=W(),P=(g(J)?J:[J]).map(h_);B.forEach((Y)=>{if(Y._isRuntime)Y.destroy();else e(Y);if(Y.parentNode)Y.remove()});let K=T;for(let Y=P.length-1;Y>=0;Y--){let X=P[Y];if(X.parentNode!==K.parentNode)K.parentNode?.insertBefore(X,K);if(X._mounts)X._mounts.forEach((S)=>S());K=X}B=P});G(),L._cleanups.add(()=>c(G)),d(()=>c(G))}else{let T=h_(W);if(L.appendChild(T),T._mounts)T._mounts.forEach((B)=>B())}};return A(_),L},ff=(f)=>{let M=new Set,_=[],E=F;F={_cleanups:M,_mounts:_};let L=f({onCleanup:(T)=>M.add(T)});if(F=E,L==null)return null;if(L instanceof Node)return _.forEach((T)=>T()),{_isRuntime:!0,container:L,destroy:()=>{M.forEach((T)=>T()),e(L),L.remove()}};let A=k.createElement("div");A.style.display="contents",A.setAttribute("role","presentation");let W=(T)=>{if(!T)return;if(T._isRuntime)M.add(T.destroy),A.appendChild(T.container);else if(g(T))T.forEach(W);else A.appendChild(T instanceof Node?T:k.createTextNode(String(T)))};return W(L),_.forEach((T)=>T()),{_isRuntime:!0,container:A,destroy:()=>{M.forEach((T)=>T()),e(A),A.remove()}}},Jf=(f,M,_=null,E=null)=>{let L=k.createTextNode(""),A=o("div",{style:"display:contents"},[L]),W=null,T=null,B=null;return n(()=>!!(V(f)?f():f),(G)=>{if(G===T)return;T=G;let J=()=>{if(W)W.destroy(),W=null};if(W&&!G&&E?.out){if(B&&B.cancel)B.cancel();let K=E.out(W.container,J);if(B=K,K&&K.finished)K.finished.then(J);else J()}else J();let P=G?M:_;if(P){if(W=ff(()=>V(P)?P():P),A.insertBefore(W.container,L),E?.in)E.in(W.container)}}),A},Pf=(f,M,_)=>{let E=k.createTextNode(""),L=o("div",{style:"display:contents"},[E]),A=new Map;return n(()=>(V(f)?f():f)||[],(W)=>{let T=new Map,B=[],G=W||[];for(let P=0;PM(K,P));else A.delete(Y);T.set(Y,X),B.push(X)}A.forEach((P)=>P.destroy());let J=E;for(let P=B.length-1;P>=0;P--){let Y=B[P].container;if(Y.nextSibling!==J)L.insertBefore(Y,J);J=Y}A=T}),L},I=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=l(M()),E=()=>_(M());window.addEventListener("hashchange",E),d(()=>window.removeEventListener("hashchange",E));let L=o("div",{class:"router-outlet"}),A=null;return n([_],()=>{let W=_(),T=f.find((B)=>{let G=B.path.split("/").filter(Boolean),J=W.split("/").filter(Boolean);return G.length===J.length&&G.every((P,K)=>P[0]===":"||P===J[K])})||f.find((B)=>B.path==="*");if(T){A?.destroy();let B={};T.path.split("/").filter(Boolean).forEach((G,J)=>{if(G[0]===":")B[G.slice(1)]=W.split("/").filter(Boolean)[J]}),I.params(B),A=ff(()=>V(T.component)?T.component(B):T.component),L.replaceChildren(A.container)}}),L};I.params=l({});I.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");I.back=()=>window.history.back();I.path=()=>window.location.hash.replace(/^#/,"")||"/";var Qf=(f,M)=>{let _=typeof M==="string"?k.querySelector(M):M;if(!_)return;if(Bf.has(_))Bf.get(_).destroy();let E=ff(()=>V(f)?f():f);return _.replaceChildren(E.container),Bf.set(_,E),E},c_=(f,M,_)=>{if(_===void 0)f(V(M)?M(f()):M);else{let E=M.split("."),L=E.pop(),A=f(),W=E.reduce((T,B)=>({...T,[B]:{...T[B]}}),{...A});W[L]=_,f(W)}},j_=Object.freeze({$:l,Watch:n,Tag:o,If:Jf,For:Pf,Router:I,Mount:Qf,onMount:m_,onUnmount:d,set:c_});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 Mf={};N(Mf,{default:()=>r_,Tooltip:()=>R_,Toast:()=>q_,Timeline:()=>K_,Tabs:()=>Y_,Table:()=>X_,Swap:()=>P_,Stat:()=>G_,Stack:()=>A_,Select:()=>L_,Rating:()=>T_,Range:()=>M_,Radio:()=>f_,Navbar:()=>af,Modal:()=>tf,Menu:()=>of,List:()=>df,Label:()=>pf,Input:()=>b,Indicator:()=>cf,Fileinput:()=>vf,Fieldset:()=>uf,Fab:()=>xf,Dropdown:()=>kf,Drawer:()=>jf,Datepicker:()=>Uf,Colorpicker:()=>hf,Checkbox:()=>zf,Button:()=>p,Badge:()=>Nf,Autocomplete:()=>Sf,Alert:()=>Yf,Accordion:()=>Xf});var Zf={};N(Zf,{Accordion:()=>Xf});var _f={};N(_f,{val:()=>Q,ui:()=>Z,getIcon:()=>D});var Q=(f)=>typeof f==="function"?f():f,Z=(f,M)=>typeof M==="function"?()=>`${f} ${M()||""}`.trim():`${f} ${M||""}`.trim(),D=(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 Xf=(f,M)=>{let{class:_,title:E,name:L,open:A,...W}=f;return Tag("div",{...W,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:L?"radio":"checkbox",name:L,checked:Q(A)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Cf={};N(Cf,{Alert:()=>Yf});var Yf=(f,M)=>{let{class:_,actions:E,type:L="info",soft:A=!0,...W}=f,T={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},J=[`alert-${L}`,A?"alert-soft":"",_].filter(Boolean).join(" "),P=M||f.message;return Tag("div",{...W,role:"alert",class:Z("alert",J)},()=>[D(T[L]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof P==="function"?P():P])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var qf={};N(qf,{Autocomplete:()=>Sf});var b_={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"}},p_=$("es");var H=(f)=>()=>b_[p_()][f]||f;var Kf={};N(Kf,{Input:()=>b});var b=(f)=>{let{class:M,value:_,type:E="text",icon:L,oninput:A,placeholder:W,disabled:T,validate:B,label:G,...J}=f,P=E==="password",K=$(!1),Y=$(null),X={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=L?D(L):X[E]?D(X[E]):null,R=()=>D(K()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),u=S?"pl-10":"",i=P?"pr-10":"",U=()=>{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"},r=(O)=>{let m=O.target.value;if(B){let Ef=B(m);Y(Ef||null)}A?.(O)},x=()=>Y()&&Y()!=="",C=()=>{let O=`input w-full ${u} ${i}`;if(M)O+=` ${M}`;if(x())O+=" input-error";return O.trim()},q=Tag("input",{...J,type:()=>P?K()?"text":"password":E,placeholder:W||(G?" ":W),class:C,value:_,oninput:r,disabled:()=>Q(T),"aria-invalid":()=>x()?"true":"false"}),z=()=>[q,S?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},S):null,P?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",U()),onclick:(O)=>{O.preventDefault(),K(!K())}},()=>R()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>x()?Y():null)];if(G)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},z),Tag("span",{},Q(G))]);return Tag("div",{class:"relative w-full"},z)};var Sf=(f)=>{let{class:M,items:_=[],value:E,onselect:L,label:A,placeholder:W,...T}=f,B=$(Q(E)||""),G=$(!1),J=$(-1),P=$(()=>{let X=B().toLowerCase(),S=Q(_)||[];return X?S.filter((R)=>(typeof R==="string"?R:R.label).toLowerCase().includes(X)):S}),K=(X)=>{let S=typeof X==="string"?X:X.value,R=typeof X==="string"?X:X.label;if(B(R),typeof E==="function")E(S);L?.(X),G(!1),J(-1)},Y=(X)=>{let S=P();if(X.key==="ArrowDown")X.preventDefault(),G(!0),J(Math.min(J()+1,S.length-1));else if(X.key==="ArrowUp")X.preventDefault(),J(Math.max(J()-1,0));else if(X.key==="Enter"&&J()>=0)X.preventDefault(),K(S[J()]);else if(X.key==="Escape")G(!1)};return Tag("div",{class:"relative w-full"},[b({label:A,class:M,placeholder:W||H("search")(),value:B,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:Y,oninput:(X)=>{let S=X.target.value;if(B(S),typeof E==="function")E(S);G(!0),J(-1)},...T}),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:()=>G()&&P().length?"display:block":"display:none"},[For(P,(X,S)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${J()===S?"active bg-primary text-primary-content":""}`,onclick:()=>K(X),onmouseenter:()=>J(S)},typeof X==="string"?X:X.label)]),(X,S)=>(typeof X==="string"?X:X.value)+S),()=>P().length?null:Tag("li",{class:"p-2 text-center opacity-50"},H("nodata")())])])};var Rf={};N(Rf,{Badge:()=>Nf});var Nf=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Df={};N(Df,{Button:()=>p});var p=(f,M)=>{let{class:_,loading:E,icon:L,...A}=f,W=D(L);return Tag("button",{...A,class:Z("btn",_),disabled:()=>Q(E)||Q(f.disabled)},()=>[Q(E)&&Tag("span",{class:"loading loading-spinner"}),W,M].filter(Boolean))};var Of={};N(Of,{Checkbox:()=>zf});var zf=(f)=>{let{class:M,value:_,toggle:E,label:L,...A}=f,W=Tag("input",{...A,type:"checkbox",class:()=>Z(Q(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[W,L?Tag("span",{class:"label-text"},L):null])};var Ff={};N(Ff,{Colorpicker:()=>hf});var hf=(f)=>{let{class:M,value:_,label:E,...L}=f,A=$(!1),W=["#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"],T=()=>Q(_)||"#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:(B)=>{B.stopPropagation(),A(!A())},...L},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${T()}`}),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:(B)=>B.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},W.map((B)=>Tag("button",{type:"button",style:`background-color: ${B}`,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 - ${T().toLowerCase()===B.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(B);A(!1)}})))])),If(A,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>A(!1)}))])};var Vf={};N(Vf,{Datepicker:()=>Uf});var Uf=(f)=>{let{class:M,value:_,range:E,label:L,placeholder:A,hour:W=!1,...T}=f,B=$(!1),G=$(new Date),J=$(null),P=$(0),K=$(0),Y=()=>Q(E)===!0,X=new Date,S=`${X.getFullYear()}-${String(X.getMonth()+1).padStart(2,"0")}-${String(X.getDate()).padStart(2,"0")}`,R=(C)=>{let q=C.getFullYear(),z=String(C.getMonth()+1).padStart(2,"0"),O=String(C.getDate()).padStart(2,"0");return`${q}-${z}-${O}`},u=(C)=>{let q=R(C),z=Q(_);if(Y())if(!z?.start||z.start&&z.end){if(typeof _==="function")_({start:q,end:null,...W&&{startHour:P()}})}else{let O=z.start;if(typeof _==="function"){let m=q{let C=Q(_);if(!C)return"";if(typeof C==="string"){if(W&&C.includes("T"))return C.replace("T"," ");return C}if(C.start&&C.end){let q=W&&C.startHour?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start,z=W&&C.endHour?`${C.end} ${String(C.endHour).padStart(2,"0")}:00`:C.end;return`${q} - ${z}`}if(C.start)return`${W&&C.startHour?`${C.start} ${String(C.startHour).padStart(2,"0")}:00`:C.start}...`;return""}),U=(C)=>{let q=G();G(new Date(q.getFullYear(),q.getMonth()+C,1))},r=(C)=>{let q=G();G(new Date(q.getFullYear()+C,q.getMonth(),1))},x=({value:C,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:C,class:"range range-xs flex-1",oninput:(z)=>{let O=parseInt(z.target.value);q(O)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(Q(C)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[b({label:L,placeholder:A||(Y()?"Seleccionar rango...":"Seleccionar fecha..."),value:i,readonly:!0,icon:D("icon-[lucide--calendar]"),onclick:(C)=>{C.stopPropagation(),B(!B())},...T}),If(B,()=>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:(C)=>C.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:()=>r(-1)},D("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>U(-1)},D("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().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:()=>U(1)},D("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>r(1)},D("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>J(null)},[...["L","M","X","J","V","S","D"].map((C)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},C)),()=>{let C=G(),q=C.getFullYear(),z=C.getMonth(),O=new Date(q,z,1).getDay(),m=O===0?6:O-1,Ef=new Date(q,z+1,0).getDate(),Tf=[];for(let v=0;v{let y=Q(_),$f=J(),k_=typeof y==="string"?y.split("T")[0]===j:y?.start===j,w_=y?.end===j,Lf=!1;if(Y()&&y?.start){let Wf=y.start;if(!y.end&&$f)Lf=j>Wf&&j<=$f||j=$f;else if(y.end)Lf=j>Wf&&j{if(Y())J(j)},onclick:()=>u(z_)},[v.toString()]))}return Tf}]),W?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[Y()?Tag("div",{class:"flex gap-4"},[x({value:P,onChange:(C)=>{P(C);let q=Q(_);if(q?.start)_({...q,startHour:C})}}),x({value:K,onChange:(C)=>{K(C);let q=Q(_);if(q?.end)_({...q,endHour:C})}})]):x({value:P,onChange:(C)=>{P(C);let q=Q(_);if(q&&typeof q==="string"&&q.includes("-"))_(q.split("T")[0]+"T"+String(C).padStart(2,"0")+":00:00")}})]):null])),If(B,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>B(!1)}))])};var Hf={};N(Hf,{Drawer:()=>jf});var jf=(f,M)=>{let{class:_,id:E,open:L,side:A,content:W,...T}=f,B=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...T,class:Z("drawer",_)},[Tag("input",{id:B,type:"checkbox",class:"drawer-toggle",checked:()=>typeof L==="function"?L():L,onchange:(G)=>{if(typeof L==="function")L(G.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof W==="function"?W():W]),Tag("div",{class:"drawer-side"},[Tag("label",{for:B,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 wf={};N(wf,{Dropdown:()=>kf});var w=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(w&&!w.contains(f.target))w.open=!1,w=null}),window.__dropdownHandlerRegistered=!0;var kf=(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:(W)=>{let T=W.currentTarget.closest("details");if(w&&w!==T)w.open=!1;setTimeout(()=>{w=T.open?T: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((T)=>Tag("li",{},[Tag("a",{class:T.class||"",onclick:(B)=>{if(T.onclick)T.onclick(B);let G=B.currentTarget.closest("details");if(G){if(G.open=!1,w===G)w=null}}},[T.icon?Tag("span",{},T.icon):null,Tag("span",{},T.label)])]))}])])};var yf={};N(yf,{Fab:()=>xf});var xf=(f)=>{let{class:M,icon:_,label:E,actions:L=[],position:A="bottom-6 right-6",...W}=f;return Tag("div",{...W,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"},[_?D(_):null,!_&&E?E:null]),...Q(L).map((T)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[T.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},T.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${T.class||""}`,onclick:(B)=>{B.stopPropagation(),T.onclick?.(B)}},[T.icon?D(T.icon):T.text||""])]))])};var mf={};N(mf,{Fieldset:()=>uf});var uf=(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=Q(E);return A?Tag("legend",{class:"fieldset-legend font-bold"},[A]):null},M])};var gf={};N(gf,{Fileinput:()=>vf});var vf=(f)=>{let{class:M,tooltip:_,max:E=2,accept:L="*",onselect:A,...W}=f,T=$([]),B=$(!1),G=$(null),J=E*1024*1024,P=(Y)=>{let X=Array.from(Y);if(G(null),X.find((R)=>R.size>J)){G(`Máx ${E}MB`);return}T([...T(),...X]),A?.(T())},K=(Y)=>{let X=T().filter((S,R)=>R!==Y);T(X),A?.(X)};return Tag("fieldset",{...W,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:Wf,getOwnPropertyNames:w_,getOwnPropertyDescriptor:x_}=Object,y_=Object.prototype.hasOwnProperty;var V_=new WeakMap,I_=(f)=>{var M=V_.get(f),_;if(M)return M;if(M=Wf({},"__esModule",{value:!0}),f&&typeof f==="object"||typeof f==="function")w_(f).map((E)=>!y_.call(M,E)&&Wf(M,E,{get:()=>f[E],enumerable:!(_=x_(f,E))||_.enumerable}));return V_.set(f,M),M};var R=(f,M)=>{for(var _ in M)Wf(f,_,{get:M[_],enumerable:!0,configurable:!0,set:(E)=>M[_]=()=>E})};var n_={};R(n_,{val:()=>T,ui:()=>Z,tt:()=>j,getIcon:()=>z,Watch:()=>m,Tooltip:()=>z_,Toast:()=>C_,Timeline:()=>S_,Tag:()=>h,Tabs:()=>K_,Table:()=>X_,Swap:()=>T_,Stat:()=>G_,Stack:()=>J_,Select:()=>A_,Router:()=>v,Rating:()=>$_,Range:()=>M_,Radio:()=>f_,Navbar:()=>af,Mount:()=>Bf,Modal:()=>sf,Menu:()=>of,List:()=>rf,Label:()=>pf,Input:()=>d,Indicator:()=>cf,If:()=>Pf,For:()=>Tf,Fileinput:()=>vf,Fieldset:()=>uf,Fab:()=>xf,Dropdown:()=>jf,Drawer:()=>kf,Datepicker:()=>Uf,Colorpicker:()=>Of,Checkbox:()=>Nf,Button:()=>r,Badge:()=>Rf,Autocomplete:()=>qf,Alert:()=>Kf,Accordion:()=>Xf,$:()=>p});var k=(f)=>typeof f==="function",O_=(f)=>f&&typeof f==="object",i=Array.isArray,x=typeof document<"u"?document:null,F_=(f)=>f?._isRuntime?f.container:f instanceof Node?f:x.createTextNode(f==null?"":String(f)),O=null,F=null,e=!1,Qf=new Set,Jf=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()}},u_=(f)=>{if(F)(F._mounts||=[]).push(f)},l=(f)=>{if(F)(F._cleanups||=new Set).add(f)},m_=(f,M,_)=>{if(_===void 0)return f(k(M)?M(f()):M);let E=M.split("."),W={...f()},J=W,L;for(L of E.slice(0,-1))J=J[L]={...J[L]||{}};J[E.at(-1)]=_,f(W)},v_=(f)=>{let M=O;O=null;try{return f()}finally{O=M}},t=(f,M=!1)=>{let _=()=>{if(_._disposed)return;if(_._deps)_._deps.forEach((J)=>J.delete(_));if(_._cleanups)_._cleanups.forEach((J)=>J()),_._cleanups.clear();let E=O,W=F;O=F=_;try{return _._result=f()}catch(J){console.error("[SigPro]",J)}finally{O=E,F=W}};if(_._deps=_._cleanups=_._children=null,_._disposed=!1,_._isComputed=M,_._depth=O?O._depth+1:0,_._mounts=[],_._parent=F,F)(F._children||=new Set).add(_);return _},g_=()=>{if(e)return;e=!0;let f=Array.from(Qf).sort((M,_)=>M._depth-_._depth);Qf.clear();for(let M of f)if(!M._disposed)M();e=!1},s=(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)s(E._subs,!0)}else Qf.add(E),_=!0}),_&&!e)queueMicrotask(g_)}},p=(f,M=null)=>{let _=new Set;if(k(f)){let E,W=!0,J=()=>{if(W){let L=O;O=J;try{let A=f();if(!Object.is(E,A))E=A,W=!1,s(_,!0)}finally{O=L}}return s(_),E};if(J._isComputed=!0,J._subs=_,J._dirty=!0,J._deps=null,J._disposed=!1,J.markDirty=()=>{W=!0},J.stop=()=>{if(J._disposed=!0,J._deps)J._deps.forEach((L)=>L.delete(J)),J._deps.clear();_.clear()},F)l(J.stop);return J}if(M)try{f=JSON.parse(localStorage.getItem(M))??f}catch(E){}return(...E)=>{if(E.length){let W=k(E[0])?E[0](f):E[0];if(!Object.is(f,W)){if(f=W,M)localStorage.setItem(M,JSON.stringify(f));s(_,!0)}}return s(_),f}},m=(f,M)=>{if(M===void 0){let E=t(f);return E(),()=>b(E)}let _=t(()=>{let E=Array.isArray(f)?f.map((W)=>W()):f();v_(()=>M(E))});return _(),()=>b(_)},Gf=(f)=>{if(f._cleanups)f._cleanups.forEach((M)=>M()),f._cleanups.clear();if(f._ownerEffect)b(f._ownerEffect);if(f.childNodes)f.childNodes.forEach(Gf)},c_=/^\s*(javascript|data|vbscript):/i,b_=(f)=>f==="src"||f==="href"||f.startsWith("on"),U_=(f,M)=>{if(M==null||M===!1)return null;if(b_(f)){let _=String(M);if(c_.test(_))return console.warn(`[SigPro] Bloqueado protocolo peligroso en ${f}`),"#"}return M},h=(f,M={},_=[])=>{if(M instanceof Node||i(M)||!O_(M))_=M,M={};if(k(f)){let L={_mounts:[],_cleanups:new Set},A=t(()=>{let P=f(M,{children:_,emit:(S,...K)=>M[`on${S[0].toUpperCase()}${S.slice(1)}`]?.(...K)});return A._result=P,P});A();let Q=A._result;if(Q==null)return null;let G=Q instanceof Node||i(Q)&&Q.every((P)=>P instanceof Node)?Q:x.createTextNode(String(Q)),B=(P)=>{if(O_(P)&&!P._isRuntime)P._mounts=A._mounts||[],P._cleanups=A._cleanups||new Set,P._ownerEffect=A};return i(G)?G.forEach(B):B(G),G}let E=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(f),W=E?x.createElementNS("http://www.w3.org/2000/svg",f):x.createElement(f);W._cleanups=new Set;for(let L in M){if(!M.hasOwnProperty(L))continue;let A=M[L];if(L==="ref"){k(A)?A(W):A.current=W;continue}if(L.startsWith("on")){let Q=L.slice(2).toLowerCase();W.addEventListener(Q,A);let G=()=>W.removeEventListener(Q,A);W._cleanups.add(G),l(G)}else if(k(A)){let Q=t(()=>{let G=U_(L,A());if(L==="class")W.className=G||"";else if(G==null)W.removeAttribute(L);else if(L in W&&!E)W[L]=G;else W.setAttribute(L,G===!0?"":G)});if(Q(),W._cleanups.add(()=>b(Q)),l(()=>b(Q)),/^(INPUT|TEXTAREA|SELECT)$/.test(W.tagName)&&(L==="value"||L==="checked")){let G=L==="checked"?"change":"input";W.addEventListener(G,(B)=>A(B.target[L]))}}else{let Q=U_(L,A);if(Q!=null)if(L in W&&!E)W[L]=Q;else W.setAttribute(L,Q===!0?"":Q)}}let J=(L)=>{if(i(L))return L.forEach(J);if(k(L)){let A=x.createTextNode("");W.appendChild(A);let Q=[],G=t(()=>{let B=L(),P=(i(B)?B:[B]).map(F_);Q.forEach((K)=>{if(K._isRuntime)K.destroy();else Gf(K);if(K.parentNode)K.remove()});let S=A;for(let K=P.length-1;K>=0;K--){let X=P[K];if(X.parentNode!==S.parentNode)S.parentNode?.insertBefore(X,S);if(X._mounts)X._mounts.forEach((q)=>q());S=X}Q=P});G(),W._cleanups.add(()=>b(G)),l(()=>b(G))}else{let A=F_(L);if(W.appendChild(A),A._mounts)A._mounts.forEach((Q)=>Q())}};return J(_),W},a=(f)=>{let M=new Set,_=[],E=F,W=O,J=x.createElement("div");J.style.display="contents",J.setAttribute("role","presentation"),F={_cleanups:M,_mounts:_},O=null;let L=(A)=>{if(!A)return;if(A._isRuntime)M.add(A.destroy),J.appendChild(A.container);else if(i(A))A.forEach(L);else J.appendChild(A instanceof Node?A:x.createTextNode(String(A==null?"":A)))};try{L(f({onCleanup:(A)=>M.add(A)}))}finally{F=E,O=W}return _.forEach((A)=>A()),{_isRuntime:!0,container:J,destroy:()=>{M.forEach((A)=>A()),Gf(J),J.remove()}}},Pf=(f,M,_=null,E=null)=>{let W=x.createTextNode(""),J=h("div",{style:"display:contents"},[W]),L=null,A=null,Q=null;return m(()=>!!(k(f)?f():f),(G)=>{if(G===A)return;A=G;let B=()=>{if(L)L.destroy(),L=null};if(L&&!G&&E?.out){if(Q&&Q.cancel)Q.cancel();let S=E.out(L.container,B);if(Q=S,S&&S.finished)S.finished.then(B);else B()}else B();let P=G?M:_;if(P){if(L=a(()=>k(P)?P():P),J.insertBefore(L.container,W),E?.in)E.in(L.container)}}),J},Tf=(f,M,_)=>{let E=x.createTextNode(""),W=h("div",{style:"display:contents"},[E]),J=new Map;return m(()=>(k(f)?f():f)||[],(L)=>{let A=new Map,Q=[],G=L||[];for(let P=0;PM(S,P));else J.delete(K);A.set(K,X),Q.push(X)}J.forEach((P)=>P.destroy());let B=E;for(let P=Q.length-1;P>=0;P--){let K=Q[P].container;if(K.nextSibling!==B)W.insertBefore(K,B);B=K}J=A}),W},v=(f)=>{let M=()=>window.location.hash.slice(1)||"/",_=p(M()),E=()=>_(M());window.addEventListener("hashchange",E),l(()=>window.removeEventListener("hashchange",E));let W=h("div",{class:"router-hook"}),J=null;return m([_],()=>{let L=_(),A=f.find((Q)=>{let G=Q.path.split("/").filter(Boolean),B=L.split("/").filter(Boolean);return G.length===B.length&&G.every((P,S)=>P[0]===":"||P===B[S])})||f.find((Q)=>Q.path==="*");if(A){J?.destroy();let Q={};A.path.split("/").filter(Boolean).forEach((G,B)=>{if(G[0]===":")Q[G.slice(1)]=L.split("/").filter(Boolean)[B]}),v.params(Q),J=a(()=>k(A.component)?A.component(Q):A.component),W.replaceChildren(J.container)}}),W};v.params=p({});v.to=(f)=>window.location.hash=f.replace(/^#?\/?/,"#/");v.back=()=>window.history.back();v.path=()=>window.location.hash.replace(/^#/,"")||"/";var Bf=(f,M)=>{let _=typeof M==="string"?x.querySelector(M):M;if(!_)return;if(Jf.has(_))Jf.get(_).destroy();let E=a(k(f)?f:()=>f);return _.replaceChildren(E.container),Jf.set(_,E),E},h_=Object.freeze({$:p,Watch:m,Tag:h,Render:a,If:Pf,For:Tf,Router:v,Mount:Bf,onMount:u_,onUnmount:l,set:m_});if(typeof window<"u")Object.assign(window,h_),"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,_)=>h_.Tag(f,M,_));var _f={};R(_f,{default:()=>r_,Tooltip:()=>z_,Toast:()=>C_,Timeline:()=>S_,Tabs:()=>K_,Table:()=>X_,Swap:()=>T_,Stat:()=>G_,Stack:()=>J_,Select:()=>A_,Rating:()=>$_,Range:()=>M_,Radio:()=>f_,Navbar:()=>af,Modal:()=>sf,Menu:()=>of,List:()=>rf,Label:()=>pf,Input:()=>d,Indicator:()=>cf,Fileinput:()=>vf,Fieldset:()=>uf,Fab:()=>xf,Dropdown:()=>jf,Drawer:()=>kf,Datepicker:()=>Uf,Colorpicker:()=>Of,Checkbox:()=>Nf,Button:()=>r,Badge:()=>Rf,Autocomplete:()=>qf,Alert:()=>Kf,Accordion:()=>Xf});var Zf={};R(Zf,{Accordion:()=>Xf});var ff={};R(ff,{val:()=>T,ui:()=>Z,getIcon:()=>z});var T=(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,W=_?"ml-1":"mr-1";if(E&&!E.startsWith("icon-[")&&!E.includes("--"))return Tag("span",{class:W},E);return Tag("span",{class:`${E} ${W}`.trim()})}return null};var Xf=(f,M)=>{let{class:_,title:E,name:W,open:J,...L}=f;return Tag("div",{...L,class:Z("collapse collapse-arrow bg-base-200 mb-2",_)},[Tag("input",{type:W?"radio":"checkbox",name:W,checked:T(J)}),Tag("div",{class:"collapse-title text-xl font-medium"},E),Tag("div",{class:"collapse-content"},M)])};var Yf={};R(Yf,{Alert:()=>Kf});var Kf=(f,M)=>{let{class:_,actions:E,type:W="info",soft:J=!0,...L}=f,A={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"},B=[`alert-${W}`,J?"alert-soft":"",_].filter(Boolean).join(" "),P=M||f.message;return Tag("div",{...L,role:"alert",class:Z("alert",B)},()=>[z(A[W]),Tag("div",{class:"flex-1"},[Tag("span",{},[typeof P==="function"?P():P])]),E?Tag("div",{class:"flex-none"},[typeof E==="function"?E():E]):null].filter(Boolean))};var Cf={};R(Cf,{Autocomplete:()=>qf});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"}},d_=$("es");var j=(f)=>()=>p_[d_()][f]||f;var Sf={};R(Sf,{Input:()=>d});var d=(f)=>{let{class:M,value:_,type:E="text",icon:W,oninput:J,placeholder:L,disabled:A,validate:Q,label:G,...B}=f,P=E==="password",S=$(!1),K=$(null),X={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]"},q=W?z(W):X[E]?z(X[E]):null,D=()=>z(S()?"icon-[lucide--eye-off]":"icon-[lucide--eye]"),w=q?"pl-10":"",I=P?"pr-10":"",n=()=>{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"},o=(V)=>{let g=V.target.value;if(Q){let Mf=Q(g);K(Mf||null)}J?.(V)},U=()=>K()&&K()!=="",Y=()=>{let V=`input w-full ${w} ${I}`;if(M)V+=` ${M}`;if(U())V+=" input-error";return V.trim()},C=Tag("input",{...B,type:()=>P?S()?"text":"password":E,placeholder:L||(G?" ":L),class:Y,value:_,oninput:o,disabled:()=>T(A),"aria-invalid":()=>U()?"true":"false"}),N=()=>[C,q?Tag("div",{class:"absolute left-3 inset-y-0 flex items-center pointer-events-none text-base-content/60"},q):null,P?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",n()),onclick:(V)=>{V.preventDefault(),S(!S())}},()=>D()):null,Tag("div",{class:"text-error text-xs mt-1 px-3 absolute -bottom-5 left-0"},()=>U()?K():null)];if(G)return Tag("label",{class:Z("floating-label w-full",M)},()=>[Tag("div",{class:"relative w-full"},N),Tag("span",{},T(G))]);return Tag("div",{class:"relative w-full"},N)};var qf=(f)=>{let{class:M,items:_=[],value:E,onselect:W,label:J,placeholder:L,...A}=f,Q=$(T(E)||""),G=$(!1),B=$(-1),P=$(()=>{let X=Q().toLowerCase(),q=T(_)||[];return X?q.filter((D)=>(typeof D==="string"?D:D.label).toLowerCase().includes(X)):q}),S=(X)=>{let q=typeof X==="string"?X:X.value,D=typeof X==="string"?X:X.label;if(Q(D),typeof E==="function")E(q);W?.(X),G(!1),B(-1)},K=(X)=>{let q=P();if(X.key==="ArrowDown")X.preventDefault(),G(!0),B(Math.min(B()+1,q.length-1));else if(X.key==="ArrowUp")X.preventDefault(),B(Math.max(B()-1,0));else if(X.key==="Enter"&&B()>=0)X.preventDefault(),S(q[B()]);else if(X.key==="Escape")G(!1)};return Tag("div",{class:"relative w-full"},[d({label:J,class:M,placeholder:L||j("search")(),value:Q,onfocus:()=>G(!0),onblur:()=>setTimeout(()=>G(!1),150),onkeydown:K,oninput:(X)=>{let q=X.target.value;if(Q(q),typeof E==="function")E(q);G(!0),B(-1)},...A}),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:()=>G()&&P().length?"display:block":"display:none"},[For(P,(X,q)=>Tag("li",{},[Tag("a",{class:()=>`block w-full ${B()===q?"active bg-primary text-primary-content":""}`,onclick:()=>S(X),onmouseenter:()=>B(q)},typeof X==="string"?X:X.label)]),(X,q)=>(typeof X==="string"?X:X.value)+q),()=>P().length?null:Tag("li",{class:"p-2 text-center opacity-50"},j("nodata")())])])};var zf={};R(zf,{Badge:()=>Rf});var Rf=(f,M)=>{let{class:_,...E}=f;return Tag("span",{...E,class:Z("badge",_)},M)};var Df={};R(Df,{Button:()=>r});var r=(f,M)=>{let{class:_,loading:E,icon:W,...J}=f,L=z(W);return Tag("button",{...J,class:Z("btn",_),disabled:()=>T(E)||T(f.disabled)},()=>[T(E)&&Tag("span",{class:"loading loading-spinner"}),L,M].filter(Boolean))};var Vf={};R(Vf,{Checkbox:()=>Nf});var Nf=(f)=>{let{class:M,value:_,toggle:E,label:W,...J}=f,L=Tag("input",{...J,type:"checkbox",class:()=>Z(T(E)?"toggle":"checkbox",M),checked:_});return Tag("label",{class:"label cursor-pointer justify-start gap-3"},[L,W?Tag("span",{class:"label-text"},W):null])};var Ff={};R(Ff,{Colorpicker:()=>Of});var Of=(f)=>{let{class:M,value:_,label:E,...W}=f,J=$(!1),L=["#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=()=>T(_)||"#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:(Q)=>{Q.stopPropagation(),J(!J())},...W},[Tag("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${A()}`}),E?Tag("span",{class:"opacity-80"},E):null]),If(J,()=>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:(Q)=>Q.stopPropagation()},[Tag("div",{class:"grid grid-cols-8 gap-1"},L.map((Q)=>Tag("button",{type:"button",style:`background-color: ${Q}`,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()===Q.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof _==="function")_(Q);J(!1)}})))])),If(J,()=>Tag("div",{class:"fixed inset-0 z-[100]",onclick:()=>J(!1)}))])};var hf={};R(hf,{Datepicker:()=>Uf});var Uf=(f)=>{let{class:M,value:_,range:E,label:W,placeholder:J,hour:L=!1,...A}=f,Q=$(!1),G=$(new Date),B=$(null),P=$(0),S=$(0),K=()=>T(E)===!0,X=new Date,q=`${X.getFullYear()}-${String(X.getMonth()+1).padStart(2,"0")}-${String(X.getDate()).padStart(2,"0")}`,D=(Y)=>{let C=Y.getFullYear(),N=String(Y.getMonth()+1).padStart(2,"0"),V=String(Y.getDate()).padStart(2,"0");return`${C}-${N}-${V}`},w=(Y)=>{let C=D(Y),N=T(_);if(K())if(!N?.start||N.start&&N.end){if(typeof _==="function")_({start:C,end:null,...L&&{startHour:P()}})}else{let V=N.start;if(typeof _==="function"){let g=C{let Y=T(_);if(!Y)return"";if(typeof Y==="string"){if(L&&Y.includes("T"))return Y.replace("T"," ");return Y}if(Y.start&&Y.end){let C=L&&Y.startHour?`${Y.start} ${String(Y.startHour).padStart(2,"0")}:00`:Y.start,N=L&&Y.endHour?`${Y.end} ${String(Y.endHour).padStart(2,"0")}:00`:Y.end;return`${C} - ${N}`}if(Y.start)return`${L&&Y.startHour?`${Y.start} ${String(Y.startHour).padStart(2,"0")}:00`:Y.start}...`;return""}),n=(Y)=>{let C=G();G(new Date(C.getFullYear(),C.getMonth()+Y,1))},o=(Y)=>{let C=G();G(new Date(C.getFullYear()+Y,C.getMonth(),1))},U=({value:Y,onChange:C})=>{return Tag("div",{class:"flex-1"},[Tag("div",{class:"flex gap-2 items-center"},[Tag("input",{type:"range",min:0,max:23,value:Y,class:"range range-xs flex-1",oninput:(N)=>{let V=parseInt(N.target.value);C(V)}}),Tag("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(T(Y)).padStart(2,"0")+":00")])])};return Tag("div",{class:Z("relative w-full",M)},[d({label:W,placeholder:J||(K()?"Seleccionar rango...":"Seleccionar fecha..."),value:I,readonly:!0,icon:z("icon-[lucide--calendar]"),onclick:(Y)=>{Y.stopPropagation(),Q(!Q())},...A}),If(Q,()=>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:(Y)=>Y.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:()=>o(-1)},z("icon-[lucide--chevrons-left]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>n(-1)},z("icon-[lucide--chevron-left]"))]),Tag("span",{class:"font-bold uppercase flex-1 text-center"},[()=>G().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:()=>n(1)},z("icon-[lucide--chevron-right]")),Tag("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>o(1)},z("icon-[lucide--chevrons-right]"))])]),Tag("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>B(null)},[...["L","M","X","J","V","S","D"].map((Y)=>Tag("div",{class:"text-[10px] opacity-40 font-bold text-center"},Y)),()=>{let Y=G(),C=Y.getFullYear(),N=Y.getMonth(),V=new Date(C,N,1).getDay(),g=V===0?6:V-1,Mf=new Date(C,N+1,0).getDate(),Ef=[];for(let c=0;c{let u=T(_),$f=B(),H_=typeof u==="string"?u.split("T")[0]===H:u?.start===H,j_=u?.end===H,Lf=!1;if(K()&&u?.start){let Af=u.start;if(!u.end&&$f)Lf=H>Af&&H<=$f||H=$f;else if(u.end)Lf=H>Af&&H{if(K())B(H)},onclick:()=>w(N_)},[c.toString()]))}return Ef}]),L?Tag("div",{class:"mt-3 pt-2 border-t border-base-300"},[K()?Tag("div",{class:"flex gap-4"},[U({value:P,onChange:(Y)=>{P(Y);let C=T(_);if(C?.start)_({...C,startHour:Y})}}),U({value:S,onChange:(Y)=>{S(Y);let C=T(_);if(C?.end)_({...C,endHour:Y})}})]):U({value:P,onChange:(Y)=>{P(Y);let C=T(_);if(C&&typeof C==="string"&&C.includes("-"))_(C.split("T")[0]+"T"+String(Y).padStart(2,"0")+":00:00")}})]):null])),If(Q,()=>Tag("div",{class:"fixed inset-0 z-[90]",onclick:()=>Q(!1)}))])};var Hf={};R(Hf,{Drawer:()=>kf});var kf=(f,M)=>{let{class:_,id:E,open:W,side:J,content:L,...A}=f,Q=E||`drawer-${Math.random().toString(36).slice(2,9)}`;return Tag("div",{...A,class:Z("drawer",_)},[Tag("input",{id:Q,type:"checkbox",class:"drawer-toggle",checked:()=>typeof W==="function"?W():W,onchange:(G)=>{if(typeof W==="function")W(G.target.checked)}}),Tag("div",{class:"drawer-content"},[typeof L==="function"?L():L]),Tag("div",{class:"drawer-side"},[Tag("label",{for:Q,class:"drawer-overlay",onclick:()=>{if(typeof W==="function")W(!1)}}),Tag("div",{class:"min-h-full bg-base-200 w-80"},[typeof J==="function"?J():J])])])};var wf={};R(wf,{Dropdown:()=>jf});var y=null;if(typeof window<"u"&&!window.__dropdownHandlerRegistered)window.addEventListener("click",(f)=>{if(y&&!y.contains(f.target))y.open=!1,y=null}),window.__dropdownHandlerRegistered=!0;var jf=(f)=>{let{class:M,label:_,icon:E,items:W,...J}=f;return Tag("details",{...J,class:Z("dropdown",M)},[Tag("summary",{class:"btn m-1 flex items-center gap-2 list-none cursor-pointer",style:"display: inline-flex;",onclick:(L)=>{let A=L.currentTarget.closest("details");if(y&&y!==A)y.open=!1;setTimeout(()=>{y=A.open?A: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 W==="function"?W():W||[]).map((A)=>Tag("li",{},[Tag("a",{class:A.class||"",onclick:(Q)=>{if(A.onclick)A.onclick(Q);let G=Q.currentTarget.closest("details");if(G){if(G.open=!1,y===G)y=null}}},[A.icon?Tag("span",{},A.icon):null,Tag("span",{},A.label)])]))}])])};var yf={};R(yf,{Fab:()=>xf});var xf=(f)=>{let{class:M,icon:_,label:E,actions:W=[],position:J="bottom-6 right-6",...L}=f;return Tag("div",{...L,class:Z(`fab absolute ${J} 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]),...T(W).map((A)=>Tag("div",{class:"flex items-center gap-3 transition-all duration-300"},[A.label?Tag("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},A.label):null,Tag("button",{type:"button",class:`btn btn-circle shadow-lg ${A.class||""}`,onclick:(Q)=>{Q.stopPropagation(),A.onclick?.(Q)}},[A.icon?z(A.icon):A.text||""])]))])};var mf={};R(mf,{Fieldset:()=>uf});var uf=(f,M)=>{let{class:_,legend:E,...W}=f;return Tag("fieldset",{...W,class:Z("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",_)},[()=>{let J=T(E);return J?Tag("legend",{class:"fieldset-legend font-bold"},[J]):null},M])};var gf={};R(gf,{Fileinput:()=>vf});var vf=(f)=>{let{class:M,tooltip:_,max:E=2,accept:W="*",onselect:J,...L}=f,A=$([]),Q=$(!1),G=$(null),B=E*1024*1024,P=(K)=>{let X=Array.from(K);if(G(null),X.find((D)=>D.size>B)){G(`Máx ${E}MB`);return}A([...A(),...X]),J?.(A())},S=(K)=>{let X=A().filter((q,D)=>D!==K);A(X),J?.(X)};return Tag("fieldset",{...L,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:()=>` relative flex items-center justify-between w-full h-12 px-4 border-2 border-dashed rounded-lg cursor-pointer transition-all duration-200 - ${B()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} - `,ondragover:(Y)=>{Y.preventDefault(),B(!0)},ondragleave:()=>B(!1),ondrop:(Y)=>{Y.preventDefault(),B(!1),P(Y.dataTransfer.files)}},[Tag("div",{class:"flex items-center gap-3 w-full"},[D("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:(Y)=>P(Y.target.files)})])]),()=>G()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,If(()=>T().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(T,(Y,X)=>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]"},Y.name),Tag("span",{class:"text-[9px] opacity-40"},`(${(Y.size/1024).toFixed(0)} KB)`)]),Tag("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(S)=>{S.preventDefault(),S.stopPropagation(),K(X)}},[D("icon-[lucide--x]")])]),(Y)=>Y.name+Y.lastModified)]))])};var bf={};N(bf,{Indicator:()=>cf});var cf=(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 rf={};N(rf,{Label:()=>pf});var pf=(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",{},Q(_)):null]);return Tag("label",{class:Z("label",L),...A},()=>[_?Tag("span",{class:"label-text"},Q(_)):null,typeof M==="function"?M():M])};var nf={};N(nf,{List:()=>df});var df=(f)=>{let{class:M,items:_,header:E,render:L=(B)=>B,keyFn:A=(B,G)=>B.id??G,...W}=f,T=For(_,(B,G)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[L(B,G)])]),A);return Tag("ul",{...W,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%;"},[Q(E)])),T]:T)};var sf={};N(sf,{Menu:()=>of});var of=(f)=>{let{class:M,items:_,...E}=f,L=(A)=>For(()=>A||[],(W)=>Tag("li",{},[W.children?Tag("details",{open:W.open},[Tag("summary",{},[W.icon&&Tag("span",{class:"mr-2"},W.icon),W.label]),Tag("ul",{},L(W.children))]):Tag("a",{class:()=>Q(W.active)?"active":"",onclick:W.onclick},[W.icon&&Tag("span",{class:"mr-2"},W.icon),W.label])]),(W,T)=>W.label||T);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},L(_))};var lf={};N(lf,{Modal:()=>tf});var tf=(f,M)=>{let{class:_,title:E,buttons:L,open:A,...W}=f,T=null,B=()=>{let J=typeof A==="function"?A():A;if(!T)return;if(J){if(!T.open)T.showModal()}else if(T.open)T.close()};Watch(()=>B());let G=()=>{if(typeof A==="function")A(!1)};return Tag("dialog",{...W,ref:(J)=>{if(T=J,J)B()},class:Z("modal",_),onclose:G,oncancel:G},[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),p({type:"submit"},H("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var ef={};N(ef,{Navbar:()=>af});var af=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var __={};N(__,{Radio:()=>f_});var f_=(f)=>{let{class:M,label:_,tooltip:E,value:L,inputValue:A,name:W,...T}=f,B=Tag("input",{...T,type:"radio",name:W,class:Z("radio",M),checked:()=>Q(L)===A,onclick:()=>{if(typeof L==="function")L(A)}});if(!_&&!E)return B;let G=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[B,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},G):G};var E_={};N(E_,{Range:()=>M_});var M_=(f)=>{let{class:M,label:_,tooltip:E,value:L,...A}=f,W=Tag("input",{...A,type:"range",class:Z("range",M),value:L,disabled:()=>Q(f.disabled)});if(!_&&!E)return W;let T=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,W]);return E?Tag("div",{class:"tooltip","data-tip":E},T):T};var $_={};N($_,{Rating:()=>T_});var T_=(f)=>{let{class:M,value:_,count:E=5,mask:L="mask-star",readonly:A=!1,onchange:W,...T}=f,B=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...T,class:()=>Z(`rating ${Q(A)?"pointer-events-none":""}`,M)},Array.from({length:Q(E)},(G,J)=>{let P=J+1;return Tag("input",{type:"radio",name:B,class:`mask ${L}`,checked:()=>Math.round(Q(_))===P,onchange:()=>{if(!Q(A)){if(typeof W==="function")W(P);else if(typeof _==="function")_(P)}}})}))};var W_={};N(W_,{Select:()=>L_});var L_=(f)=>{let{class:M,label:_,items:E,value:L,...A}=f,W=Tag("select",{...A,class:Z("select select-bordered w-full",M),value:L},For(()=>Q(E)||[],(T)=>Tag("option",{value:T.value,$selected:()=>String(Q(L))===String(T.value)},T.label),(T)=>T.value));if(!_)return W;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),W])};var B_={};N(B_,{Stack:()=>A_});var A_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var J_={};N(J_,{Stat:()=>G_});var G_=(f)=>{let{class:M,icon:_,label:E,value:L,desc:A,...W}=f;return Tag("div",{...W,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>Q(L)??L),A&&Tag("div",{class:"stat-desc"},A)])};var Q_={};N(Q_,{Swap:()=>P_});var P_=(f)=>{let{class:M,value:_,on:E,off:L,...A}=f;return Tag("label",{...A,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>Q(_),onclick:(W)=>{if(typeof _==="function")_(W.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},L)])};var Z_={};N(Z_,{Table:()=>X_});var X_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:L,zebra:A=!1,pinRows:W=!1,empty:T=H("nodata")(),...B}=f,G=()=>{let P=Q(A)?"table-zebra":"",K=Q(W)?"table-pin-rows":"";return Z("table",M,P,K)},J=L||((P,K)=>P.id||K);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...B,class:G},[Tag("thead",{},[Tag("tr",{},E.map((P)=>Tag("th",{class:P.class||""},P.label)))]),Tag("tbody",{},[For(_,(P,K)=>{let Y=()=>{let X=Q(_),S=J(P,K);return X.find((R,u)=>J(R,u)===S)||P};return Tag("tr",{class:"hover"},E.map((X)=>{let S=()=>{let R=Y();if(X.render)return X.render(R,K);return Q(R[X.key])};return Tag("td",{class:X.class||""},[S])}))},J),If(()=>Q(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[Q(T)])]))])])])};var C_={};N(C_,{Tabs:()=>Y_});var Y_=(f)=>{let{items:M,class:_,...E}=f,L=typeof M==="function"?M:()=>M||[],A=$(0);Watch(()=>{let B=L().findIndex((G)=>Q(G.active)===!0);if(B!==-1&&A()!==B)A(B)});let W=(T,B)=>{if(B.onClose)B.onClose();let J=L().filter((Y,X)=>X!==T);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(J),J.length===0)return;let K=A();if(T{let T=L(),B=[];for(let G=0;G{x.stopPropagation(),W(G,J)};let r=Tag("span",{class:"flex items-center"},[K,U]);Y.push(r)}else Y.push(K);let X=Tag("button",{class:()=>{let U=A()===G;return Z("tab",U?"tab-active":"")},onclick:(U)=>{if(U.preventDefault(),!Q(J.disabled)){if(J.onclick)J.onclick();A(G)}},title:J.tip||""},Y);B.push(X);let S,R=Q(J.content);if(typeof R==="function")S=R();else if(R instanceof Node)S=R;else S=document.createTextNode(String(R));let u=Tag("div",{class:"tab-content-inner"},S),i=Tag("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>A()===G?"display: block":"display: none"},u);B.push(i)}return B})};var S_={};N(S_,{Timeline:()=>K_});var K_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:L=!1,...A}=f,W={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 ${Q(E)?"timeline-vertical":"timeline-horizontal"} ${Q(L)?"timeline-compact":""}`,M)},()=>{let T=(typeof _==="function"?_():_)||[];return T.map((B,G)=>{let J=G===0,P=G===T.length-1,K=B.type||"success",Y=()=>Q(B.completed),X=()=>G>0&&Q(T[G-1].completed),S=(R)=>typeof R==="function"?R():R;return Tag("li",{class:"flex-1"},[!J?Tag("hr",{class:()=>X()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>S(B.title)]),Tag("div",{class:"timeline-middle"},[()=>B.icon?D(B.icon):D(W[K]||W.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>S(B.detail)]),!P?Tag("hr",{class:()=>Y()?"bg-primary":""}):null])})})};var N_={};N(N_,{Toast:()=>q_});var q_=(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,W=()=>{clearTimeout(A);let G=L.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(B.destroy(),L.remove(),!E.hasChildNodes())E.remove()},300);else B.destroy(),L.remove()},T=()=>{let G=D("icon-[lucide--x]"),J=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]),p({class:"btn-xs btn-circle btn-ghost",onclick:W},G)]);return requestAnimationFrame(()=>J.classList.remove("translate-x-10","opacity-0")),J},B=Mount(T,L);if(_>0)A=setTimeout(W,_);return W};var D_={};N(D_,{Tooltip:()=>R_});var R_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var H_={...Zf,...Cf,...qf,...Rf,...Df,...Of,...Ff,...Vf,...Hf,...wf,...yf,...mf,...gf,...bf,...Kf,...rf,...nf,...sf,...lf,...ef,...__,...E_,...$_,...W_,...B_,...J_,...Q_,...Z_,...C_,...S_,...N_,...D_},r_={...H_,install:(f=window)=>{Object.entries(H_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(Mf).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(_f).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.defineProperty(window,"tt",{value:H,writable:!1,configurable:!0,enumerable:!0}),Object.defineProperty(window,"SigProUI",{value:{...Mf,Utils:_f,tt:H},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");})(); + ${Q()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(K)=>{K.preventDefault(),Q(!0)},ondragleave:()=>Q(!1),ondrop:(K)=>{K.preventDefault(),Q(!1),P(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:W,class:"hidden",onchange:(K)=>P(K.target.files)})])]),()=>G()?Tag("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},G()):null,If(()=>A().length>0,()=>Tag("ul",{class:"mt-2 space-y-1"},[For(A,(K,X)=>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:(q)=>{q.preventDefault(),q.stopPropagation(),S(X)}},[z("icon-[lucide--x]")])]),(K)=>K.name+K.lastModified)]))])};var bf={};R(bf,{Indicator:()=>cf});var cf=(f,M)=>{let{value:_,class:E,...W}=f;return Tag("div",{...W,class:"indicator"},()=>[_?Tag("span",{class:Z("indicator-item badge",E)},()=>typeof _==="function"?_():_):null,M].filter(Boolean))};var df={};R(df,{Label:()=>pf});var pf=(f)=>{let{children:M,value:_,floating:E=!1,class:W,...J}=f;if(E)return Tag("label",{class:Z("floating-label",W),...J},()=>[typeof M==="function"?M():M,_?Tag("span",{},T(_)):null]);return Tag("label",{class:Z("label",W),...J},()=>[_?Tag("span",{class:"label-text"},T(_)):null,typeof M==="function"?M():M])};var nf={};R(nf,{List:()=>rf});var rf=(f)=>{let{class:M,items:_,header:E,render:W=(Q)=>Q,keyFn:J=(Q,G)=>Q.id??G,...L}=f,A=For(_,(Q,G)=>Tag("li",{class:"list-row",style:"width: 100%; display: block;"},[Tag("div",{style:"width: 100%;"},[W(Q,G)])]),J);return Tag("ul",{...L,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%;"},[T(E)])),A]:A)};var lf={};R(lf,{Menu:()=>of});var of=(f)=>{let{class:M,items:_,...E}=f,W=(J)=>For(()=>J||[],(L)=>Tag("li",{},[L.children?Tag("details",{open:L.open},[Tag("summary",{},[L.icon&&Tag("span",{class:"mr-2"},L.icon),L.label]),Tag("ul",{},W(L.children))]):Tag("a",{class:()=>T(L.active)?"active":"",onclick:L.onclick},[L.icon&&Tag("span",{class:"mr-2"},L.icon),L.label])]),(L,A)=>L.label||A);return Tag("ul",{...E,class:Z("menu bg-base-200 rounded-box",M)},W(_))};var tf={};R(tf,{Modal:()=>sf});var sf=(f,M)=>{let{class:_,title:E,buttons:W,open:J,...L}=f,A=null,Q=()=>{let B=typeof J==="function"?J():J;if(!A)return;if(B){if(!A.open)A.showModal()}else if(A.open)A.close()};Watch(()=>Q());let G=()=>{if(typeof J==="function")J(!1)};return Tag("dialog",{...L,ref:(B)=>{if(A=B,B)Q()},class:Z("modal",_),onclose:G,oncancel:G},[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(W)?W:[W]).filter(Boolean),r({type:"submit"},j("close")())])])]),Tag("form",{method:"dialog",class:"modal-backdrop"},[Tag("button",{},"close")])])};var ef={};R(ef,{Navbar:()=>af});var af=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("navbar bg-base-100 shadow-sm px-4",_)},M)};var __={};R(__,{Radio:()=>f_});var f_=(f)=>{let{class:M,label:_,tooltip:E,value:W,inputValue:J,name:L,...A}=f,Q=Tag("input",{...A,type:"radio",name:L,class:Z("radio",M),checked:()=>T(W)===J,onclick:()=>{if(typeof W==="function")W(J)}});if(!_&&!E)return Q;let G=Tag("label",{class:"label cursor-pointer justify-start gap-3"},[Q,_?Tag("span",{class:"label-text"},_):null]);return E?Tag("div",{class:"tooltip","data-tip":E},G):G};var E_={};R(E_,{Range:()=>M_});var M_=(f)=>{let{class:M,label:_,tooltip:E,value:W,...J}=f,L=Tag("input",{...J,type:"range",class:Z("range",M),value:W,disabled:()=>T(f.disabled)});if(!_&&!E)return L;let A=Tag("div",{class:"flex flex-col gap-2"},[_?Tag("span",{class:"label-text"},_):null,L]);return E?Tag("div",{class:"tooltip","data-tip":E},A):A};var L_={};R(L_,{Rating:()=>$_});var $_=(f)=>{let{class:M,value:_,count:E=5,mask:W="mask-star",readonly:J=!1,onchange:L,...A}=f,Q=`rating-${Math.random().toString(36).slice(2,7)}`;return Tag("div",{...A,class:()=>Z(`rating ${T(J)?"pointer-events-none":""}`,M)},Array.from({length:T(E)},(G,B)=>{let P=B+1;return Tag("input",{type:"radio",name:Q,class:`mask ${W}`,checked:()=>Math.round(T(_))===P,onchange:()=>{if(!T(J)){if(typeof L==="function")L(P);else if(typeof _==="function")_(P)}}})}))};var W_={};R(W_,{Select:()=>A_});var A_=(f)=>{let{class:M,label:_,items:E,value:W,...J}=f,L=Tag("select",{...J,class:Z("select select-bordered w-full",M),value:W},For(()=>T(E)||[],(A)=>Tag("option",{value:A.value,$selected:()=>String(T(W))===String(A.value)},A.label),(A)=>A.value));if(!_)return L;return Tag("label",{class:"fieldset-label flex flex-col gap-1"},[Tag("span",{},_),L])};var Q_={};R(Q_,{Stack:()=>J_});var J_=(f,M)=>{let{class:_,...E}=f;return Tag("div",{...E,class:Z("stack",_)},M)};var P_={};R(P_,{Stat:()=>G_});var G_=(f)=>{let{class:M,icon:_,label:E,value:W,desc:J,...L}=f;return Tag("div",{...L,class:Z("stat",M)},[_&&Tag("div",{class:"stat-figure text-secondary"},_),E&&Tag("div",{class:"stat-title"},E),Tag("div",{class:"stat-value"},()=>T(W)??W),J&&Tag("div",{class:"stat-desc"},J)])};var B_={};R(B_,{Swap:()=>T_});var T_=(f)=>{let{class:M,value:_,on:E,off:W,...J}=f;return Tag("label",{...J,class:Z("swap",M)},[Tag("input",{type:"checkbox",checked:()=>T(_),onclick:(L)=>{if(typeof _==="function")_(L.target.checked)}}),Tag("div",{class:"swap-on"},E),Tag("div",{class:"swap-off"},W)])};var Z_={};R(Z_,{Table:()=>X_});var X_=(f)=>{let{class:M,items:_=[],columns:E=[],keyFn:W,zebra:J=!1,pinRows:L=!1,empty:A=j("nodata")(),...Q}=f,G=()=>{let P=T(J)?"table-zebra":"",S=T(L)?"table-pin-rows":"";return Z("table",M,P,S)},B=W||((P,S)=>P.id||S);return Tag("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[Tag("table",{...Q,class:G},[Tag("thead",{},[Tag("tr",{},E.map((P)=>Tag("th",{class:P.class||""},P.label)))]),Tag("tbody",{},[For(_,(P,S)=>{let K=()=>{let X=T(_),q=B(P,S);return X.find((D,w)=>B(D,w)===q)||P};return Tag("tr",{class:"hover"},E.map((X)=>{let q=()=>{let D=K();if(X.render)return X.render(D,S);return T(D[X.key])};return Tag("td",{class:X.class||""},[q])}))},B),If(()=>T(_).length===0,()=>Tag("tr",{},[Tag("td",{colspan:E.length,class:"text-center p-10 opacity-50"},[T(A)])]))])])])};var Y_={};R(Y_,{Tabs:()=>K_});var K_=(f)=>{let{items:M,class:_,onTabClose:E,...W}=f,J=typeof M==="function"?M:()=>M||[],L=p(0);m(()=>{let G=J().findIndex((B)=>T(B.active)===!0);if(G!==-1&&L()!==G)L(G)});let A=(Q,G)=>{if(G.onClose)G.onClose(G);if(E)E(G,Q);let P=J().filter((X,q)=>q!==Q);if(!(typeof M==="function"&&!M._isComputed)){console.warn("Tabs: items must be a writable signal to support closable tabs");return}if(M(P),P.length===0)return;let K=L();if(Q{let Q=J(),G=[];for(let B=0;B{C.stopPropagation(),A(B,P)};let Y=h("span",{class:"flex items-center"},[K,U]);X.push(Y)}else X.push(K);let q=h("button",{class:()=>Z("tab",L()===B?"tab-active":""),onclick:(U)=>{if(U.preventDefault(),!T(P.disabled)){if(P.onclick)P.onclick();L(B)}}},X),D=P.tip?h("div",{class:"tooltip","data-tip":P.tip},q):q;G.push(D);let w,I=T(P.content);if(typeof I==="function")w=I();else if(I instanceof Node)w=I;else w=document.createTextNode(String(I));let n=h("div",{class:"tab-content-inner"},w),o=h("div",{class:"tab-content bg-base-100 border-base-300 p-6",style:()=>L()===B?"display: block":"display: none"},n);G.push(o)}return G})};var q_={};R(q_,{Timeline:()=>S_});var S_=(f)=>{let{class:M,items:_=[],vertical:E=!0,compact:W=!1,...J}=f,L={info:"icon-[lucide--info]",success:"icon-[lucide--check-circle]",warning:"icon-[lucide--alert-triangle]",error:"icon-[lucide--alert-circle]"};return Tag("ul",{...J,class:()=>Z(`timeline ${T(E)?"timeline-vertical":"timeline-horizontal"} ${T(W)?"timeline-compact":""}`,M)},()=>{let A=(typeof _==="function"?_():_)||[];return A.map((Q,G)=>{let B=G===0,P=G===A.length-1,S=Q.type||"success",K=()=>T(Q.completed),X=()=>G>0&&T(A[G-1].completed),q=(D)=>typeof D==="function"?D():D;return Tag("li",{class:"flex-1"},[!B?Tag("hr",{class:()=>X()?"bg-primary":""}):null,Tag("div",{class:"timeline-start"},[()=>q(Q.title)]),Tag("div",{class:"timeline-middle"},[()=>Q.icon?z(Q.icon):z(L[S]||L.success)]),Tag("div",{class:"timeline-end timeline-box shadow-sm"},[()=>q(Q.detail)]),!P?Tag("hr",{class:()=>K()?"bg-primary":""}):null])})})};var R_={};R(R_,{Toast:()=>C_});var C_=(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 W=Tag("div",{style:"display: contents"});E.appendChild(W);let J,L=()=>{clearTimeout(J);let G=W.firstElementChild;if(G&&!G.classList.contains("opacity-0"))G.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(Q.destroy(),W.remove(),!E.hasChildNodes())E.remove()},300);else Q.destroy(),W.remove()},A=()=>{let G=z("icon-[lucide--x]"),B=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]),r({class:"btn-xs btn-circle btn-ghost",onclick:L},G)]);return requestAnimationFrame(()=>B.classList.remove("translate-x-10","opacity-0")),B},Q=Mount(A,W);if(_>0)J=setTimeout(L,_);return L};var D_={};R(D_,{Tooltip:()=>z_});var z_=(f,M)=>Tag("div",{...f,class:()=>Z("tooltip w-full",f.class),"data-tip":f.tip},M);var k_={...Zf,...Yf,...Cf,...zf,...Df,...Vf,...Ff,...hf,...Hf,...wf,...yf,...mf,...gf,...bf,...Sf,...df,...nf,...lf,...tf,...ef,...__,...E_,...L_,...W_,...Q_,...P_,...B_,...Z_,...Y_,...q_,...R_,...D_},r_={...k_,install:(f=window)=>{Object.entries(k_).forEach(([M,_])=>{f[M]=_}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(_f).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.entries(ff).forEach(([f,M])=>{Object.defineProperty(window,f,{value:M,writable:!1,configurable:!0,enumerable:!0})}),Object.defineProperty(window,"tt",{value:j,writable:!1,configurable:!0,enumerable:!0}),Object.defineProperty(window,"SigProUI",{value:{..._f,Utils:ff,tt:j},writable:!1,configurable:!0,enumerable:!0}),console.log("\uD83C\uDFA8 SigProUI ready");})(); diff --git a/docs/components/tabs.md b/docs/components/tabs.md index 4405d55..80bb958 100644 --- a/docs/components/tabs.md +++ b/docs/components/tabs.md @@ -427,8 +427,8 @@ let nextTabId = 4; const ClosableTabsDemo = () => { const tabs = $([ - { label: 'Tab 1', content: Div('Content 1') }, // ❌ quita active: true - { label: 'Tab 2', content: Div('Content 2'), closable: true }, + { label: 'Tab 1', tip:"Tab1" , content: Div('Content 1') }, // ❌ quita active: true + { label: 'Tab 2', tip: "Tab 2 Default", content: Div('Content 2'), closable: true }, { label: 'Tab 3', content: Div('Content 3'), closable: true } ]); @@ -441,13 +441,14 @@ const ClosableTabsDemo = () => { tabs([...tabs(), { label: `Tab ${newId}`, content: Div(`Content ${newId}`), + onClose: (item) => console.log('Closing Individual', item), closable: true }]); }; return Div({ class: 'flex flex-col gap-4' }, [ Button({ class: 'btn btn-sm btn-outline mb-2', onclick: addTab }, 'Add Tab'), - Tabs({ items: tabs }) + Tabs({ items: tabs, onTabClose: (item) => console.log('Closing', item) }) ]); }; diff --git a/docs/sigpro-ui.min.js b/docs/sigpro-ui.min.js index 8655a27..037428d 100644 --- a/docs/sigpro-ui.min.js +++ b/docs/sigpro-ui.min.js @@ -33,7 +33,7 @@ val: () => val, ui: () => ui, tt: () => tt, - getIcon: () => getIcon2, + getIcon: () => getIcon, Watch: () => Watch2, Tooltip: () => Tooltip, Toast: () => Toast, @@ -76,62 +76,81 @@ }); // src/sigpro.js - var isFunc = (fn) => typeof fn === "function"; + 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 = (node) => node?._isRuntime ? node.container : node instanceof Node ? node : doc.createTextNode(node == null ? "" : String(node)); + 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 effectQueue = new Set; var MOUNTED_NODES = new WeakMap; - var dispose = (effect) => { - if (!effect || effect._disposed) + var dispose = (eff) => { + if (!eff || eff._disposed) return; - effect._disposed = true; - const stack = [effect]; + eff._disposed = true; + const stack = [eff]; while (stack.length) { - const eff = stack.pop(); - if (eff._cleanups) { - eff._cleanups.forEach((fn) => fn()); - eff._cleanups.clear(); + const e = stack.pop(); + if (e._cleanups) { + e._cleanups.forEach((fn) => fn()); + e._cleanups.clear(); } - if (eff._children) { - eff._children.forEach((child) => stack.push(child)); - eff._children.clear(); + if (e._children) { + e._children.forEach((child) => stack.push(child)); + e._children.clear(); } - if (eff._deps) { - eff._deps.forEach((depSet) => depSet.delete(eff)); - eff._deps.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 onMount = (fn) => { - if (activeOwner) - (activeOwner._mounts ||= []).push(fn); + var set = (signal, path, value) => { + if (value === undefined) + return signal(isFunc(path) ? path(signal()) : path); + const keys = path.split("."), root = { ...signal() }; + let acc = root, k; + for (k of keys.slice(0, -1)) + acc = acc[k] = { ...acc[k] || {} }; + acc[keys.at(-1)] = value; + signal(root); + }; + 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((depSet) => depSet.delete(effect)); + effect._deps.forEach((s) => s.delete(effect)); if (effect._cleanups) { - effect._cleanups.forEach((cleanup) => cleanup()); + effect._cleanups.forEach((c) => c()); effect._cleanups.clear(); } const prevEffect = activeEffect; const prevOwner = activeOwner; activeEffect = activeOwner = effect; try { - const res = isComputed ? fn() : (fn(), undefined); - if (!isComputed) - effect._result = res; - return res; + return effect._result = fn(); + } catch (e) { + console.error("[SigPro]", e); } finally { activeEffect = prevEffect; activeOwner = prevOwner; @@ -153,9 +172,9 @@ isFlushing = true; const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth); effectQueue.clear(); - for (const eff of sorted) - if (!eff._disposed) - eff(); + for (const e of sorted) + if (!e._disposed) + e(); isFlushing = false; }; var trackUpdate = (subs, trigger = false) => { @@ -164,15 +183,15 @@ (activeEffect._deps ||= new Set).add(subs); } else if (trigger) { let hasQueue = false; - subs.forEach((eff) => { - if (eff === activeEffect || eff._disposed) + subs.forEach((e) => { + if (e === activeEffect || e._disposed) return; - if (eff._isComputed) { - eff._dirty = true; - if (eff._subs) - trackUpdate(eff._subs, true); + if (e._isComputed) { + e._dirty = true; + if (e._subs) + trackUpdate(e._subs, true); } else { - effectQueue.add(eff); + effectQueue.add(e); hasQueue = true; } }); @@ -180,25 +199,16 @@ queueMicrotask(flush); } }; - var untrack = (fn) => { - const prev = activeEffect; - activeEffect = null; - try { - return fn(); - } finally { - activeEffect = prev; - } - }; - var $2 = (initialValue, storageKey = null) => { + var $2 = (val, key = null) => { const subs = new Set; - if (isFunc(initialValue)) { + if (isFunc(val)) { let cache, dirty = true; const computed = () => { if (dirty) { const prev = activeEffect; activeEffect = computed; try { - const next = initialValue(); + const next = val(); if (!Object.is(cache, next)) { cache = next; dirty = false; @@ -231,33 +241,33 @@ onUnmount(computed.stop); return computed; } - if (storageKey) + if (key) try { - initialValue = JSON.parse(localStorage.getItem(storageKey)) ?? initialValue; + val = JSON.parse(localStorage.getItem(key)) ?? val; } catch (e) {} return (...args) => { if (args.length) { - const next = isFunc(args[0]) ? args[0](initialValue) : args[0]; - if (!Object.is(initialValue, next)) { - initialValue = next; - if (storageKey) - localStorage.setItem(storageKey, JSON.stringify(initialValue)); + 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 initialValue; + return val; }; }; - var Watch2 = (sources, callback) => { - if (callback === undefined) { + var Watch2 = (sources, cb) => { + if (cb === undefined) { const effect2 = createEffect(sources); effect2(); return () => dispose(effect2); } const effect = createEffect(() => { - const vals = isArr(sources) ? sources.map((src) => src()) : sources(); - untrack(() => callback(vals)); + const vals = Array.isArray(sources) ? sources.map((s) => s()) : sources(); + untrack(() => cb(vals)); }); effect(); return () => dispose(effect); @@ -274,36 +284,20 @@ }; var DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i; var isDangerousAttr = (key) => key === "src" || key === "href" || key.startsWith("on"); - var applyProp = (elem, key, value, isSVG) => { - if (value == null || value === false) { - if (key === "class" || key === "className") - elem.className = ""; - else if (key in elem && !isSVG) - elem[key] = ""; - else - elem.removeAttribute(key); - return; - } - if (key === "class" || key === "className") { - elem.className = value; - } else if (key === "style" && typeof value === "object") { - Object.assign(elem.style, value); - } else if (key in elem && !isSVG) { - elem[key] = value; - } else if (isSVG) { - if (key.startsWith("xlink:")) { - elem.setAttributeNS("http://www.w3.org/1999/xlink", key, value); - } else if (key === "xmlns" || key.startsWith("xmlns:")) { - elem.setAttributeNS("http://www.w3.org/2000/xmlns/", key, value); - } else { - elem.setAttribute(key, value === true ? "" : value); + 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 "#"; } - } else { - elem.setAttribute(key, value === true ? "" : value); } + return val; }; var Tag2 = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || props && typeof props !== "object") { + if (props instanceof Node || isArr(props) || !isObj(props)) { children = props; props = {}; } @@ -318,71 +312,75 @@ return result2; }); effect(); - ctx._mounts = effect._mounts || []; - ctx._cleanups = effect._cleanups || new Set; const result = effect._result; - const attach = (node) => { - if (node && typeof node === "object" && !node._isRuntime) { - node._mounts = ctx._mounts; - node._cleanups = ctx._cleanups; - node._ownerEffect = effect; - } - }; - isArr(result) ? result.forEach(attach) : attach(result); if (result == null) return null; - if (result instanceof Node || isArr(result) && result.every((n) => n instanceof Node)) - return result; - return doc.createTextNode(String(result)); + 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|image|ellipse|foreignObject|linearGradient|radialGradient|stop|pattern|mask|clipPath|filter|feColorMatrix|feBlend|feGaussianBlur|animate|animateTransform|set|metadata|desc|title|symbol|marker|view)$/i.test(tag); - const elem = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag); - elem._cleanups = new Set; - for (let key in props) { - if (!props.hasOwnProperty(key)) + 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 value = props[key]; - if (key === "ref") { - isFunc(value) ? value(elem) : value.current = elem; + let v = props[k]; + if (k === "ref") { + isFunc(v) ? v(el) : v.current = el; continue; } - if (key.startsWith("on")) { - const event = key.slice(2).toLowerCase(); - elem.addEventListener(event, value); - const off = () => elem.removeEventListener(event, value); - elem._cleanups.add(off); + 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(value)) { + } else if (isFunc(v)) { const effect = createEffect(() => { - let val = value(); - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - applyProp(elem, key, val, isSVG); + 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(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); - if (/^(INPUT|TEXTAREA|SELECT)$/.test(elem.tagName) && (key === "value" || key === "checked")) { - const eventType = key === "checked" ? "change" : "input"; - elem.addEventListener(eventType, (ev) => value(ev.target[key])); + 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 { - let val = value; - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) - val = "#"; - if (val != null) - applyProp(elem, key, val, isSVG); + const val = validateAttr(k, v); + if (val != null) { + if (k in el && !isSVG) + el[k] = val; + else + el.setAttribute(k, val === true ? "" : val); + } } } - const mountChild = (child) => { - if (isArr(child)) - return child.forEach(mountChild); - if (isFunc(child)) { + const append = (c) => { + if (isArr(c)) + return c.forEach(append); + if (isFunc(c)) { const anchor = doc.createTextNode(""); - elem.appendChild(anchor); + el.appendChild(anchor); let currentNodes = []; const effect = createEffect(() => { - const res = child(); + const res = c(); const next = (isArr(res) ? res : [res]).map(ensureNode); currentNodes.forEach((n) => { if (n._isRuntime) @@ -404,55 +402,46 @@ currentNodes = next; }); effect(); - elem._cleanups.add(() => dispose(effect)); + el._cleanups.add(() => dispose(effect)); onUnmount(() => dispose(effect)); } else { - const node = ensureNode(child); - elem.appendChild(node); + const node = ensureNode(c); + el.appendChild(node); if (node._mounts) node._mounts.forEach((fn) => fn()); } }; - mountChild(children); - return elem; + append(children); + return el; }; - var createView = (renderFn) => { + var Render = (renderFn) => { const cleanups = new Set; const mounts = []; const previousOwner = activeOwner; - activeOwner = { _cleanups: cleanups, _mounts: mounts }; - const result = renderFn({ onCleanup: (fn) => cleanups.add(fn) }); - activeOwner = previousOwner; - if (result == null) - return null; - if (result instanceof Node) { - mounts.forEach((fn) => fn()); - return { - _isRuntime: true, - container: result, - destroy: () => { - cleanups.forEach((fn) => fn()); - cleanupNode(result); - result.remove(); - } - }; - } + const previousEffect = activeEffect; const container = doc.createElement("div"); container.style.display = "contents"; container.setAttribute("role", "presentation"); - const process = (node) => { - if (!node) + activeOwner = { _cleanups: cleanups, _mounts: mounts }; + activeEffect = null; + const processResult = (result) => { + if (!result) return; - if (node._isRuntime) { - cleanups.add(node.destroy); - container.appendChild(node.container); - } else if (isArr(node)) { - node.forEach(process); + if (result._isRuntime) { + cleanups.add(result.destroy); + container.appendChild(result.container); + } else if (isArr(result)) { + result.forEach(processResult); } else { - container.appendChild(node instanceof Node ? node : doc.createTextNode(String(node))); + container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))); } }; - process(result); + try { + processResult(renderFn({ onCleanup: (fn) => cleanups.add(fn) })); + } finally { + activeOwner = previousOwner; + activeEffect = previousEffect; + } mounts.forEach((fn) => fn()); return { _isRuntime: true, @@ -494,7 +483,7 @@ } const content = show ? ifYes : ifNot; if (content) { - currentView = createView(() => isFunc(content) ? content() : content); + currentView = Render(() => isFunc(content) ? content() : content); root.insertBefore(currentView.container, anchor); if (trans?.in) trans.in(currentView.container); @@ -515,7 +504,7 @@ const key = keyFn ? keyFn(item, i) : item?.id ?? i; let view = cache.get(key); if (!view) - view = createView(() => itemFn(item, i)); + view = Render(() => itemFn(item, i)); else cache.delete(key); nextCache.set(key, view); @@ -540,14 +529,14 @@ const handler = () => path(getHash()); window.addEventListener("hashchange", handler); onUnmount(() => window.removeEventListener("hashchange", handler)); - const outlet = Tag2("div", { class: "router-outlet" }); + const hook = Tag2("div", { class: "router-hook" }); let currentView = null; Watch2([path], () => { const cur = path(); const route = routes.find((r) => { - const rParts = r.path.split("/").filter(Boolean); - const curParts = cur.split("/").filter(Boolean); - return rParts.length === curParts.length && rParts.every((p, i) => p[0] === ":" || p === curParts[i]); + 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(); @@ -557,14 +546,14 @@ params[p.slice(1)] = cur.split("/").filter(Boolean)[i]; }); Router.params(params); - currentView = createView(() => isFunc(route.component) ? route.component(params) : route.component); - outlet.replaceChildren(currentView.container); + currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component); + hook.replaceChildren(currentView.container); } }); - return outlet; + return hook; }; Router.params = $2({}); - Router.to = (path) => window.location.hash = path.replace(/^#?\/?/, "#/"); + Router.to = (p) => window.location.hash = p.replace(/^#?\/?/, "#/"); Router.back = () => window.history.back(); Router.path = () => window.location.hash.replace(/^#/, "") || "/"; var Mount2 = (comp, target) => { @@ -573,24 +562,12 @@ return; if (MOUNTED_NODES.has(t)) MOUNTED_NODES.get(t).destroy(); - const inst = createView(() => isFunc(comp) ? comp() : comp); + const inst = Render(isFunc(comp) ? comp : () => comp); t.replaceChildren(inst.container); MOUNTED_NODES.set(t, inst); return inst; }; - var set = (signal, path, value) => { - if (value === undefined) { - signal(isFunc(path) ? path(signal()) : path); - } else { - const keys = path.split("."); - const last = keys.pop(); - const current = signal(); - const obj = keys.reduce((o, k) => ({ ...o, [k]: { ...o[k] } }), { ...current }); - obj[last] = value; - signal(obj); - } - }; - var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); + var SigPro = Object.freeze({ $: $2, Watch: Watch2, Tag: Tag2, Render, If: If2, For: For2, Router, Mount: Mount2, onMount, onUnmount, set }); 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)); @@ -645,11 +622,11 @@ __export(exports_utils, { val: () => val, ui: () => ui, - getIcon: () => getIcon2 + getIcon: () => getIcon }); var val = (t) => typeof t === "function" ? t() : t; var ui = (baseClass, additionalClassOrFn) => typeof additionalClassOrFn === "function" ? () => `${baseClass} ${additionalClassOrFn() || ""}`.trim() : `${baseClass} ${additionalClassOrFn || ""}`.trim(); - var getIcon2 = (icon) => { + var getIcon = (icon) => { if (!icon) return null; if (typeof icon === "function") { @@ -710,7 +687,7 @@ role: "alert", class: ui("alert", allClasses) }, () => [ - getIcon2(iconMap[type]), + getIcon(iconMap[type]), Tag("div", { class: "flex-1" }, [ Tag("span", {}, [typeof content === "function" ? content() : content]) ]), @@ -779,8 +756,8 @@ tel: "icon-[lucide--phone]", url: "icon-[lucide--link]" }; - const leftIcon = icon ? getIcon2(icon) : iconMap[type] ? getIcon2(iconMap[type]) : null; - const getPasswordIcon = () => getIcon2(visible() ? "icon-[lucide--eye-off]" : "icon-[lucide--eye]"); + 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 = () => { @@ -937,7 +914,7 @@ }); var Button = (props, children) => { const { class: className, loading, icon, ...rest } = props; - const iconEl = getIcon2(icon); + const iconEl = getIcon(icon); return Tag("button", { ...rest, class: ui("btn", className), @@ -1133,7 +1110,7 @@ placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), value: displayValue, readonly: true, - icon: getIcon2("icon-[lucide--calendar]"), + icon: getIcon("icon-[lucide--calendar]"), onclick: (e) => { e.stopPropagation(); isOpen(!isOpen()); @@ -1146,15 +1123,15 @@ }, [ 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) }, getIcon2("icon-[lucide--chevrons-left]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, getIcon2("icon-[lucide--chevron-left]")) + 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) }, getIcon2("icon-[lucide--chevron-right]")), - Tag("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, getIcon2("icon-[lucide--chevrons-right]")) + 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) }, [ @@ -1362,7 +1339,7 @@ role: "button", class: "btn btn-lg btn-circle btn-primary shadow-2xl" }, [ - icon ? getIcon2(icon) : null, + icon ? getIcon(icon) : null, !icon && label ? label : null ]), ...val(actions).map((act) => Tag("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ @@ -1374,7 +1351,7 @@ e.stopPropagation(); act.onclick?.(e); } - }, [act.icon ? getIcon2(act.icon) : act.text || ""]) + }, [act.icon ? getIcon(act.icon) : act.text || ""]) ])) ]); }; @@ -1449,7 +1426,7 @@ } }, [ Tag("div", { class: "flex items-center gap-3 w-full" }, [ - getIcon2("icon-[lucide--upload]"), + 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`) ]), @@ -1478,7 +1455,7 @@ e.stopPropagation(); removeFile(index); } - }, [getIcon2("icon-[lucide--x]")]) + }, [getIcon("icon-[lucide--x]")]) ]), (file) => file.name + file.lastModified) ])) ]); @@ -1826,10 +1803,10 @@ Tabs: () => Tabs }); var Tabs = (props) => { - const { items, class: className, ...rest } = props; + const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; - const activeIndex = $(0); - Watch(() => { + const activeIndex = $2(0); + Watch2(() => { const list = itemsSignal(); const idx = list.findIndex((it) => val(it.active) === true); if (idx !== -1 && activeIndex() !== idx) { @@ -1838,7 +1815,9 @@ }); const removeTab = (indexToRemove, item) => { if (item.onClose) - 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; @@ -1856,7 +1835,7 @@ newActive = Math.min(newActive, newItems.length - 1); activeIndex(newActive); }; - return Tag("div", { ...rest, class: ui("tabs", className) }, () => { + return Tag2("div", { ...rest, class: ui("tabs", className) }, () => { const list = itemsSignal(); const elements = []; for (let i = 0;i < list.length; i++) { @@ -1871,16 +1850,13 @@ e.stopPropagation(); removeTab(i, item); }; - const wrapper = Tag("span", { class: "flex items-center" }, [labelNode, closeIcon]); + const wrapper = Tag2("span", { class: "flex items-center" }, [labelNode, closeIcon]); buttonChildren.push(wrapper); } else { buttonChildren.push(labelNode); } - const button = Tag("button", { - class: () => { - const isActive = activeIndex() === i; - return ui("tab", isActive ? "tab-active" : ""); - }, + const buttonBase = Tag2("button", { + class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); if (!val(item.disabled)) { @@ -1888,9 +1864,9 @@ item.onclick(); activeIndex(i); } - }, - title: item.tip || "" + } }, 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); @@ -1901,8 +1877,8 @@ } else { contentNode = document.createTextNode(String(rawContent)); } - const inner = Tag("div", { class: "tab-content-inner" }, contentNode); - const panel = Tag("div", { + 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); @@ -1941,7 +1917,7 @@ !isFirst ? Tag("hr", { class: () => prevCompleted() ? "bg-primary" : "" }) : null, Tag("div", { class: "timeline-start" }, [() => renderSlot(item.title)]), Tag("div", { class: "timeline-middle" }, [ - () => item.icon ? getIcon2(item.icon) : getIcon2(iconMap[itemType] || iconMap.success) + () => 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 @@ -1984,7 +1960,7 @@ } }; const ToastComponent = () => { - const closeIcon = getIcon2("icon-[lucide--x]"); + 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` }, [ diff --git a/src/components/Tabs.js b/src/components/Tabs.js index bb25936..cf575c4 100644 --- a/src/components/Tabs.js +++ b/src/components/Tabs.js @@ -1,6 +1,6 @@ // components/Tabs.js -// import { $, Tag, For } from "../sigpro.js"; -import { val, ui } from "../core/utils.js"; +import { $, Tag, Watch } from "../sigpro.js"; +import { val, ui, getIcon } from "..//core/utils.js"; /** * Tabs component @@ -11,11 +11,10 @@ import { val, ui } from "../core/utils.js"; * - bg-base-100, border-base-300, p-6 */ export const Tabs = (props) => { - const { items, class: className, ...rest } = props; + const { items, class: className, onTabClose, ...rest } = props; const itemsSignal = typeof items === "function" ? items : () => items || []; const activeIndex = $(0); - // Sincroniza con active:true solo cuando cambia la lista de items Watch(() => { const list = itemsSignal(); const idx = list.findIndex(it => val(it.active) === true); @@ -25,7 +24,9 @@ export const Tabs = (props) => { }); const removeTab = (indexToRemove, item) => { - if (item.onClose) item.onClose(); + 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; @@ -48,7 +49,6 @@ export const Tabs = (props) => { for (let i = 0; i < list.length; i++) { const item = list[i]; - // --- Botón --- const label = val(item.label); const labelNode = label instanceof Node ? label : document.createTextNode(String(label)); const buttonChildren = []; @@ -66,23 +66,23 @@ export const Tabs = (props) => { buttonChildren.push(labelNode); } - const button = Tag("button", { - class: () => { - const isActive = activeIndex() === i; - return ui("tab", isActive ? "tab-active" : ""); - }, + const buttonBase = Tag("button", { + class: () => ui("tab", activeIndex() === i ? "tab-active" : ""), onclick: (e) => { e.preventDefault(); if (!val(item.disabled)) { if (item.onclick) item.onclick(); activeIndex(i); } - }, - title: item.tip || "" + } }, buttonChildren); + + const button = item.tip + ? Tag("div", { class: "tooltip", "data-tip": item.tip }, buttonBase) + : buttonBase; + elements.push(button); - // --- Panel --- let contentNode; const rawContent = val(item.content); if (typeof rawContent === "function") { diff --git a/src/sigpro.js b/src/sigpro.js index 1651727..dbf9a79 100644 --- a/src/sigpro.js +++ b/src/sigpro.js @@ -1,7 +1,9 @@ -const isFunc = fn => typeof fn === "function" +// 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 = node => node?._isRuntime ? node.container : (node instanceof Node ? node : doc.createTextNode(node == null ? "" : String(node))) +const ensureNode = n => n?._isRuntime ? n.container : (n instanceof Node ? n : doc.createTextNode(n == null ? "" : String(n))) let activeEffect = null let activeOwner = null @@ -9,55 +11,73 @@ let isFlushing = false const effectQueue = new Set() const MOUNTED_NODES = new WeakMap() -const dispose = effect => { - if (!effect || effect._disposed) return - effect._disposed = true - const stack = [effect] +// effect cleanup +const dispose = eff => { + if (!eff || eff._disposed) return + eff._disposed = true + const stack = [eff] while (stack.length) { - const eff = stack.pop() - if (eff._cleanups) { - eff._cleanups.forEach(fn => fn()) - eff._cleanups.clear() + const e = stack.pop() + if (e._cleanups) { + e._cleanups.forEach(fn => fn()) + e._cleanups.clear() } - if (eff._children) { - eff._children.forEach(child => stack.push(child)) - eff._children.clear() + if (e._children) { + e._children.forEach(child => stack.push(child)) + e._children.clear() } - if (eff._deps) { - eff._deps.forEach(depSet => depSet.delete(eff)) - eff._deps.clear() + if (e._deps) { + e._deps.forEach(depSet => depSet.delete(e)) + e._deps.clear() } } } +// helpers +const onMount = fn => { + if (activeOwner) (activeOwner._mounts ||= []).push(fn) +} + const onUnmount = fn => { if (activeOwner) (activeOwner._cleanups ||= new Set()).add(fn) } -const onMount = fn => { - if (activeOwner) (activeOwner._mounts ||= []).push(fn) +const set = (signal, path, value) => { + if (value === undefined) return signal(isFunc(path) ? path(signal()) : path) + const keys = path.split('.'), root = { ...signal() } + let acc = root, k + for (k of keys.slice(0, -1)) acc = acc[k] = { ...(acc[k] || {}) } + acc[keys.at(-1)] = value + signal(root) } +const untrack = fn => { + const p = activeEffect + activeEffect = null + try { return fn() } finally { activeEffect = p } +} + +// effect creation const createEffect = (fn, isComputed = false) => { const effect = () => { - if (effect._disposed) return - if (effect._deps) effect._deps.forEach(depSet => depSet.delete(effect)) - if (effect._cleanups) { - effect._cleanups.forEach(cleanup => cleanup()) - effect._cleanups.clear() - } - const prevEffect = activeEffect - const prevOwner = activeOwner - activeEffect = activeOwner = effect - try { - const res = isComputed ? fn() : (fn(), undefined) - if (!isComputed) effect._result = res - return res - } finally { - activeEffect = prevEffect - activeOwner = prevOwner - } + 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 @@ -73,23 +93,23 @@ const flush = () => { isFlushing = true const sorted = Array.from(effectQueue).sort((a, b) => a._depth - b._depth) effectQueue.clear() - for (const eff of sorted) if (!eff._disposed) eff() + for (const e of sorted) if (!e._disposed) e() isFlushing = false } const trackUpdate = (subs, trigger = false) => { if (!trigger && activeEffect && !activeEffect._disposed) { subs.add(activeEffect) - ;(activeEffect._deps ||= new Set()).add(subs) + ; (activeEffect._deps ||= new Set()).add(subs) } else if (trigger) { let hasQueue = false - subs.forEach(eff => { - if (eff === activeEffect || eff._disposed) return - if (eff._isComputed) { - eff._dirty = true - if (eff._subs) trackUpdate(eff._subs, true) + 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(eff) + effectQueue.add(e) hasQueue = true } }) @@ -97,22 +117,17 @@ const trackUpdate = (subs, trigger = false) => { } } -const untrack = fn => { - const prev = activeEffect - activeEffect = null - try { return fn() } finally { activeEffect = prev } -} - -const $ = (initialValue, storageKey = null) => { +// signal creation +const $ = (val, key = null) => { const subs = new Set() - if (isFunc(initialValue)) { + if (isFunc(val)) { let cache, dirty = true const computed = () => { if (dirty) { const prev = activeEffect activeEffect = computed try { - const next = initialValue() + const next = val() if (!Object.is(cache, next)) { cache = next dirty = false @@ -140,30 +155,31 @@ const $ = (initialValue, storageKey = null) => { if (activeOwner) onUnmount(computed.stop) return computed } - if (storageKey) try { initialValue = JSON.parse(localStorage.getItem(storageKey)) ?? initialValue } catch (e) {} + if (key) try { val = JSON.parse(localStorage.getItem(key)) ?? val } catch (e) { } return (...args) => { if (args.length) { - const next = isFunc(args[0]) ? args[0](initialValue) : args[0] - if (!Object.is(initialValue, next)) { - initialValue = next - if (storageKey) localStorage.setItem(storageKey, JSON.stringify(initialValue)) + 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 initialValue + return val } } -const Watch = (sources, callback) => { - if (callback === undefined) { +// create Watch +const Watch = (sources, cb) => { + if (cb === undefined) { const effect = createEffect(sources) effect() return () => dispose(effect) } const effect = createEffect(() => { - const vals = isArr(sources) ? sources.map(src => src()) : sources() - untrack(() => callback(vals)) + const vals = Array.isArray(sources) ? sources.map(s => s()) : sources() + untrack(() => cb(vals)) }) effect() return () => dispose(effect) @@ -181,109 +197,103 @@ const cleanupNode = node => { const DANGEROUS_PROTOCOL = /^\s*(javascript|data|vbscript):/i const isDangerousAttr = key => key === 'src' || key === 'href' || key.startsWith('on') -const applyProp = (elem, key, value, isSVG) => { - if (value == null || value === false) { - if (key === 'class' || key === 'className') elem.className = '' - else if (key in elem && !isSVG) elem[key] = '' - else elem.removeAttribute(key) - return - } - if (key === 'class' || key === 'className') { - elem.className = value - } else if (key === 'style' && typeof value === 'object') { - Object.assign(elem.style, value) - } else if (key in elem && !isSVG) { - elem[key] = value - } else if (isSVG) { - if (key.startsWith('xlink:')) { - elem.setAttributeNS('http://www.w3.org/1999/xlink', key, value) - } else if (key === 'xmlns' || key.startsWith('xmlns:')) { - elem.setAttributeNS('http://www.w3.org/2000/xmlns/', key, value) - } else { - elem.setAttribute(key, value === true ? '' : value) +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 '#' } - } else { - elem.setAttribute(key, value === true ? '' : value) } + return val } +// create Tag const Tag = (tag, props = {}, children = []) => { - if (props instanceof Node || isArr(props) || (props && typeof props !== 'object')) { + 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 + 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() - ctx._mounts = effect._mounts || [] - ctx._cleanups = effect._cleanups || new Set() - const result = effect._result - const attach = node => { - if (node && typeof node === 'object' && !node._isRuntime) { - node._mounts = ctx._mounts - node._cleanups = ctx._cleanups - node._ownerEffect = effect - } + 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(result) ? result.forEach(attach) : attach(result) - if (result == null) return null - if (result instanceof Node || (isArr(result) && result.every(n => n instanceof Node))) return result - return doc.createTextNode(String(result)) } - const isSVG = /^(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)$/i.test(tag) - const elem = isSVG ? doc.createElementNS("http://www.w3.org/2000/svg", tag) : doc.createElement(tag) - elem._cleanups = new Set() + 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 key in props) { - if (!props.hasOwnProperty(key)) continue - let value = props[key] - if (key === "ref") { - isFunc(value) ? value(elem) : (value.current = elem) + 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 (key.startsWith("on")) { - const event = key.slice(2).toLowerCase() - elem.addEventListener(event, value) - const off = () => elem.removeEventListener(event, value) - elem._cleanups.add(off) + 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(value)) { + } else if (isFunc(v)) { const effect = createEffect(() => { - let val = value() - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) val = '#' - applyProp(elem, key, val, isSVG) + 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() - elem._cleanups.add(() => dispose(effect)) + el._cleanups.add(() => dispose(effect)) onUnmount(() => dispose(effect)) - if (/^(INPUT|TEXTAREA|SELECT)$/.test(elem.tagName) && (key === "value" || key === "checked")) { - const eventType = key === "checked" ? "change" : "input" - elem.addEventListener(eventType, ev => value(ev.target[key])) + 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 { - let val = value - if (isDangerousAttr(key) && DANGEROUS_PROTOCOL.test(String(val))) val = '#' - if (val != null) applyProp(elem, key, val, isSVG) + const val = validateAttr(k, v) + if (val != null) { + if (k in el && !isSVG) el[k] = val + else el.setAttribute(k, val === true ? "" : val) + } } } - const mountChild = child => { - if (isArr(child)) return child.forEach(mountChild) - if (isFunc(child)) { + const append = c => { + if (isArr(c)) return c.forEach(append) + if (isFunc(c)) { const anchor = doc.createTextNode("") - elem.appendChild(anchor) + el.appendChild(anchor) let currentNodes = [] const effect = createEffect(() => { - const res = child() + const res = c() const next = (isArr(res) ? res : [res]).map(ensureNode) currentNodes.forEach(n => { if (n._isRuntime) n.destroy() @@ -300,59 +310,49 @@ const Tag = (tag, props = {}, children = []) => { currentNodes = next }) effect() - elem._cleanups.add(() => dispose(effect)) + el._cleanups.add(() => dispose(effect)) onUnmount(() => dispose(effect)) } else { - const node = ensureNode(child) - elem.appendChild(node) + const node = ensureNode(c) + el.appendChild(node) if (node._mounts) node._mounts.forEach(fn => fn()) } } - mountChild(children) - return elem + append(children) + return el } -const createView = (renderFn) => { +// create Render +const Render = renderFn => { const cleanups = new Set() const mounts = [] const previousOwner = activeOwner - activeOwner = { _cleanups: cleanups, _mounts: mounts } - - const result = renderFn({ onCleanup: fn => cleanups.add(fn) }) - - activeOwner = previousOwner - - if (result == null) return null - if (result instanceof Node) { - mounts.forEach(fn => fn()) - return { - _isRuntime: true, - container: result, - destroy: () => { - cleanups.forEach(fn => fn()) - cleanupNode(result) - result.remove() - } - } - } - + const previousEffect = activeEffect const container = doc.createElement("div") container.style.display = "contents" - container.setAttribute("role", "presentation") - - const process = node => { - if (!node) return - if (node._isRuntime) { - cleanups.add(node.destroy) - container.appendChild(node.container) - } else if (isArr(node)) { - node.forEach(process) + container.setAttribute("role", "presentation") // ← único cambio real + 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(node instanceof Node ? node : doc.createTextNode(String(node))) + container.appendChild(result instanceof Node ? result : doc.createTextNode(String(result == null ? "" : result))) } } - process(result) - + + try { + processResult(renderFn({ onCleanup: fn => cleanups.add(fn) })) + } finally { + activeOwner = previousOwner + activeEffect = previousEffect + } + mounts.forEach(fn => fn()) return { _isRuntime: true, @@ -365,6 +365,7 @@ const createView = (renderFn) => { } } +// create If const If = (cond, ifYes, ifNot = null, trans = null) => { const anchor = doc.createTextNode("") const root = Tag("div", { style: "display:contents" }, [anchor]) @@ -397,7 +398,7 @@ const If = (cond, ifYes, ifNot = null, trans = null) => { const content = show ? ifYes : ifNot if (content) { - currentView = createView(() => isFunc(content) ? content() : content) + currentView = Render(() => isFunc(content) ? content() : content) root.insertBefore(currentView.container, anchor) if (trans?.in) trans.in(currentView.container) } @@ -406,6 +407,7 @@ const If = (cond, ifYes, ifNot = null, trans = null) => { return root } +// create For const For = (src, itemFn, keyFn) => { const anchor = doc.createTextNode("") const root = Tag("div", { style: "display:contents" }, [anchor]) @@ -418,7 +420,7 @@ const For = (src, itemFn, keyFn) => { const item = newItems[i] const key = keyFn ? keyFn(item, i) : (item?.id ?? i) let view = cache.get(key) - if (!view) view = createView(() => itemFn(item, i)) + if (!view) view = Render(() => itemFn(item, i)) else cache.delete(key) nextCache.set(key, view) nextOrder.push(view) @@ -436,20 +438,21 @@ const For = (src, itemFn, keyFn) => { return root } +// create Router 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 outlet = Tag("div", { class: "router-outlet" }) + const hook = Tag("div", { class: "router-hook" }) let currentView = null Watch([path], () => { const cur = path() const route = routes.find(r => { - const rParts = r.path.split("/").filter(Boolean) - const curParts = cur.split("/").filter(Boolean) - return rParts.length === curParts.length && rParts.every((p, i) => p[0] === ":" || p === curParts[i]) + 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() @@ -458,14 +461,14 @@ const Router = routes => { if (p[0] === ":") params[p.slice(1)] = cur.split("/").filter(Boolean)[i] }) Router.params(params) - currentView = createView(() => isFunc(route.component) ? route.component(params) : route.component) - outlet.replaceChildren(currentView.container) + currentView = Render(() => isFunc(route.component) ? route.component(params) : route.component) + hook.replaceChildren(currentView.container) } }) - return outlet + return hook } Router.params = $({}) -Router.to = path => window.location.hash = path.replace(/^#?\/?/, "#/") +Router.to = p => window.location.hash = p.replace(/^#?\/?/, "#/") Router.back = () => window.history.back() Router.path = () => window.location.hash.replace(/^#/, "") || "/" @@ -473,26 +476,13 @@ 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 = createView(() => isFunc(comp) ? comp() : comp) + const inst = Render(isFunc(comp) ? comp : () => comp) t.replaceChildren(inst.container) MOUNTED_NODES.set(t, inst) return inst } -const set = (signal, path, value) => { - if (value === undefined) { - signal(isFunc(path) ? path(signal()) : path) - } else { - const keys = path.split('.') - const last = keys.pop() - const current = signal() - const obj = keys.reduce((o, k) => ({ ...o, [k]: { ...o[k] } }), { ...current }) - obj[last] = value - signal(obj) - } -} - -const SigPro = Object.freeze({ $, Watch, Tag, If, For, Router, Mount, onMount, onUnmount, set }) +const SigPro = Object.freeze({ $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, set }) if (typeof window !== "undefined") { Object.assign(window, SigPro) @@ -500,5 +490,5 @@ if (typeof window !== "undefined") { .split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)) } -export { $, Watch, Tag, If, For, Router, Mount, onMount, onUnmount, set } +export { $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, set } export default SigPro \ No newline at end of file