From 5a77deb4428574ef903f128118f771911d43a05a Mon Sep 17 00:00:00 2001 From: natxocc Date: Wed, 1 Apr 2026 20:53:41 +0200 Subject: [PATCH] BUILD BEFORE CHANGE NEW COMPONENTS WITH UI FUNCTION --- css/index.js | 3 + css/sigpro.css | 2 + dist/sigpro-ui.cjs | 1724 ------------------------------- dist/sigpro-ui.esm.js | 1668 ------------------------------ dist/sigpro-ui.js | 1776 ++++++++++++++++++++++++++++++++ dist/sigpro-ui.min.js | 7 + dist/sigpro-ui.umd.js | 1727 ------------------------------- dist/sigpro-ui.umd.min.js | 1 - docs/components/button copy.md | 248 +++++ docs/components/button.md | 224 ++-- docs/index.html | 47 +- docs/install.md | 216 +++- docs/sigpro-ui.min.js | 7 + docs/sigpro-ui.umd.min.js | 1 - docs/sigpro.min.js | 1 - index.js | 47 +- package.json | 60 +- rollup.config.js | 62 -- src/components/Button.js | 4 +- src/core/utils.js | 40 + src/css/index.js | 4 + src/css/sigpro.css | 3 + src/ui/Accordion.js | 27 + src/ui/Alert.js | 55 + src/ui/Autocomplete.js | 102 ++ src/ui/Badge.js | 16 + src/ui/Button.js | 28 + src/ui/Checkbox.js | 26 + src/ui/Colorpicker.js | 88 ++ src/ui/Datepicker.js | 252 +++++ src/ui/Drawer.js | 28 + src/ui/Dropdown.js | 61 ++ src/ui/Fab.js | 54 + src/ui/Fieldset.js | 29 + src/ui/Fileinput.js | 120 +++ src/ui/Indicator.js | 19 + src/ui/Input.js | 76 ++ src/ui/List.js | 37 + src/ui/Loading.js | 13 + src/ui/Menu.js | 34 + src/ui/Modal.js | 58 ++ src/ui/Navbar.js | 16 + src/ui/Radio.js | 34 + src/ui/Range.js | 31 + src/ui/Rating.js | 41 + src/ui/Select.js | 43 + src/ui/Stack.js | 16 + src/ui/Stat.js | 21 + src/ui/Swap.js | 23 + src/ui/Table.js | 67 ++ src/ui/Tabs.js | 69 ++ src/ui/Timeline.js | 54 + src/ui/Toast.js | 67 ++ src/ui/Tooltip.js | 19 + src/ui/index.js | 110 ++ 55 files changed, 4137 insertions(+), 5469 deletions(-) create mode 100644 css/index.js create mode 100644 css/sigpro.css delete mode 100644 dist/sigpro-ui.cjs delete mode 100644 dist/sigpro-ui.esm.js create mode 100644 dist/sigpro-ui.js create mode 100644 dist/sigpro-ui.min.js delete mode 100644 dist/sigpro-ui.umd.js delete mode 100644 dist/sigpro-ui.umd.min.js create mode 100644 docs/components/button copy.md create mode 100644 docs/sigpro-ui.min.js delete mode 100644 docs/sigpro-ui.umd.min.js delete mode 100644 docs/sigpro.min.js delete mode 100644 rollup.config.js create mode 100644 src/css/index.js create mode 100644 src/css/sigpro.css create mode 100644 src/ui/Accordion.js create mode 100644 src/ui/Alert.js create mode 100644 src/ui/Autocomplete.js create mode 100644 src/ui/Badge.js create mode 100644 src/ui/Button.js create mode 100644 src/ui/Checkbox.js create mode 100644 src/ui/Colorpicker.js create mode 100644 src/ui/Datepicker.js create mode 100644 src/ui/Drawer.js create mode 100644 src/ui/Dropdown.js create mode 100644 src/ui/Fab.js create mode 100644 src/ui/Fieldset.js create mode 100644 src/ui/Fileinput.js create mode 100644 src/ui/Indicator.js create mode 100644 src/ui/Input.js create mode 100644 src/ui/List.js create mode 100644 src/ui/Loading.js create mode 100644 src/ui/Menu.js create mode 100644 src/ui/Modal.js create mode 100644 src/ui/Navbar.js create mode 100644 src/ui/Radio.js create mode 100644 src/ui/Range.js create mode 100644 src/ui/Rating.js create mode 100644 src/ui/Select.js create mode 100644 src/ui/Stack.js create mode 100644 src/ui/Stat.js create mode 100644 src/ui/Swap.js create mode 100644 src/ui/Table.js create mode 100644 src/ui/Tabs.js create mode 100644 src/ui/Timeline.js create mode 100644 src/ui/Toast.js create mode 100644 src/ui/Tooltip.js create mode 100644 src/ui/index.js diff --git a/css/index.js b/css/index.js new file mode 100644 index 0000000..d929db7 --- /dev/null +++ b/css/index.js @@ -0,0 +1,3 @@ +// css/index.js +import './daisy.css'; +export default { version: '1.0.0' }; \ No newline at end of file diff --git a/css/sigpro.css b/css/sigpro.css new file mode 100644 index 0000000..ccce702 --- /dev/null +++ b/css/sigpro.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-3xl:48rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-bold:700;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--drop-shadow-2xl:0 25px 25px #00000026;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@media (prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}}:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root{--fx-noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E");scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}@property --radialprogress{syntax:"";inherits:true;initial-value:0%}:root:not(span){overflow:var(--page-overflow)}:root{background:var(--page-scroll-bg,var(--root-bg));--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000)) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg-on:linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000)) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{--page-scroll-transition-on:background-color .3s ease-out;transition:var(--page-scroll-transition);scrollbar-gutter:var(--page-scroll-gutter,unset);scrollbar-gutter:if(style(--page-has-scroll: 1): var(--page-scroll-gutter,unset) ; else: unset)}@keyframes set-page-has-scroll{0%,to{--page-has-scroll:1}}:root,[data-theme]{background:var(--page-scroll-bg,var(--root-bg));color:var(--color-base-content)}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}}@layer components;@layer utilities{@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}:where(.drawer-side){overflow:hidden}.drawer-side{pointer-events:none;visibility:hidden;z-index:10;overscroll-behavior:contain;opacity:0;width:100%;transition:opacity .2s ease-out .1s allow-discrete, visibility .3s ease-out .1s allow-discrete;inset-inline-start:0;background-color:#0000;grid-template-rows:repeat(1,minmax(0,1fr));grid-template-columns:repeat(1,minmax(0,1fr));grid-row-start:1;grid-column-start:1;place-items:flex-start start;height:100dvh;display:grid;position:fixed;top:0}.drawer-side>.drawer-overlay{cursor:pointer;background-color:oklch(0% 0 0/.4);place-self:stretch stretch;position:sticky;top:0}.drawer-side>*{grid-row-start:1;grid-column-start:1}.drawer-side>:not(.drawer-overlay){will-change:transform;transition:translate .3s ease-out,width .2s ease-out;translate:-100%}[dir=rtl] :is(.drawer-side>:not(.drawer-overlay)){translate:100%}.fab{pointer-events:none;z-index:999;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;inset-inline-end:1rem;flex-direction:column-reverse;align-items:flex-end;gap:.5rem;display:flex;position:fixed;bottom:1rem}.fab>*{pointer-events:auto;align-items:center;gap:.5rem;display:flex}.fab>:hover,.fab>:has(:focus-visible){z-index:1}.fab>[tabindex]:first-child{transition-property:opacity,visibility,rotate;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:grid;position:relative}.fab .fab-close,.fab .fab-main-action{inset-inline-end:0;position:absolute;bottom:0}:is(.fab:focus-within:has(.fab-close),.fab:focus-within:has(.fab-main-action))>[tabindex]{opacity:0;rotate:90deg}.fab:focus-within>[tabindex]:first-child{pointer-events:none}.fab:focus-within>:nth-child(n+2){visibility:visible;--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:1}.fab>:nth-child(n+2){visibility:hidden;--tw-scale-x:80%;--tw-scale-y:80%;--tw-scale-z:80%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:0;transition-property:opacity,scale,visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fab>:nth-child(n+2).fab-main-action,.fab>:nth-child(n+2).fab-close{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.fab>:nth-child(3){transition-delay:30ms}.fab>:nth-child(4){transition-delay:60ms}.fab>:nth-child(5){transition-delay:90ms}.fab>:nth-child(6){transition-delay:.12s}.drawer-toggle{appearance:none;opacity:0;width:0;height:0;position:fixed}:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:currentColor oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}@supports (color:color-mix(in lab, red, red)){:where(.drawer-toggle:checked~.drawer-side){scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop,0) * .4))}}:where(:root:has(.drawer-toggle:checked)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:"";pointer-events:none;--mask-tooltip:url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=""]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab{cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:hover{color:var(--color-base-content)}}.tab{--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(input[type=radio]){min-width:fit-content}.tab:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(label){position:relative}.tab:is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:checked,.tab:is(label:has(:checked)),.tab:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:not(input):empty{cursor:default;flex-grow:1}.tab:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:focus{outline-offset:2px;outline:2px solid #0000}}.tab:focus-visible,.tab:is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab[disabled]{pointer-events:none;opacity:.4}.tab\!{cursor:pointer!important;appearance:none!important;text-align:center!important;webkit-user-select:none!important;-webkit-user-select:none!important;user-select:none!important;flex-wrap:wrap!important;justify-content:center!important;align-items:center!important;display:inline-flex!important;position:relative!important}@media (hover:hover){.tab\!:hover{color:var(--color-base-content)!important}}.tab\!{--tab-p:.75rem!important;--tab-bg:var(--color-base-100)!important;--tab-border-color:var(--color-base-300)!important;--tab-radius-ss:0!important;--tab-radius-se:0!important;--tab-radius-es:0!important;--tab-radius-ee:0!important;--tab-order:0!important;--tab-radius-min:calc(.75rem - var(--border))!important;--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min))!important;--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px)!important;order:var(--tab-order)!important;height:var(--tab-height)!important;padding-inline:var(--tab-p)!important;border-color:#0000!important;font-size:.875rem!important}.tab\!:is(input[type=radio]){min-width:fit-content!important}.tab\!:is(input[type=radio]):after{--tw-content:attr(aria-label)!important;content:var(--tw-content)!important}.tab\!:is(label){position:relative!important}.tab\!:is(label) input{cursor:pointer!important;appearance:none!important;opacity:0!important;position:absolute!important;inset:0!important}:is(.tab\!:checked,.tab\!:is(label:has(:checked)),.tab\!:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block!important}.tab\!:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)!important}@supports (color:color-mix(in lab, red, red)){.tab\!:not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)!important}}.tab\!:not(input):empty{cursor:default!important;flex-grow:1!important}.tab\!:focus{--tw-outline-style:none!important;outline-style:none!important}@media (forced-colors:active){.tab\!:focus{outline-offset:2px!important;outline:2px solid #0000!important}}.tab\!:focus-visible,.tab\!:is(label:has(:checked:focus-visible)){outline-offset:-5px!important;outline:2px solid!important}.tab\![disabled]{pointer-events:none!important;opacity:.4!important}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:"";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;text-wrap:balance;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:"";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.floating-label{display:block;position:relative}.floating-label input{display:block}.floating-label input::placeholder,.floating-label textarea::placeholder{transition:top .1s ease-out,translate .1s ease-out,scale .1s ease-out,opacity .1s ease-out}.floating-label>span{z-index:1;background-color:var(--color-base-100);opacity:0;inset-inline-start:.75rem;top:calc(var(--size-field,.25rem) * 10 / 2);pointer-events:none;border-radius:2px;padding-inline:.25rem;font-size:.875rem;line-height:1;transition:top .1s ease-out,translate .1s ease-out,scale .1s ease-out,opacity .1s ease-out;position:absolute;translate:0 -50%}:is(.floating-label:focus-within,.floating-label:not(:has(input:placeholder-shown,textarea:placeholder-shown))) ::placeholder{opacity:0;pointer-events:auto;top:0;translate:-12.5% calc(-50% - .125em);scale:.75}:is(.floating-label:focus-within,.floating-label:not(:has(input:placeholder-shown,textarea:placeholder-shown)))>span{opacity:1;pointer-events:auto;z-index:2;top:0;translate:-12.5% calc(-50% - .125em);scale:.75}.floating-label:has(:disabled,[disabled])>span{opacity:0}.floating-label:has(.input-xs,.select-xs,.textarea-xs) span{top:calc(var(--size-field,.25rem) * 6 / 2);font-size:.6875rem}.floating-label:has(.input-sm,.select-sm,.textarea-sm) span{top:calc(var(--size-field,.25rem) * 8 / 2);font-size:.75rem}.floating-label:has(.input-md,.select-md,.textarea-md) span{top:calc(var(--size-field,.25rem) * 10 / 2);font-size:.875rem}.floating-label:has(.input-lg,.select-lg,.textarea-lg) span{top:calc(var(--size-field,.25rem) * 12 / 2);font-size:1.125rem}.floating-label:has(.input-xl,.select-xl,.textarea-xl) span{top:calc(var(--size-field,.25rem) * 14 / 2);font-size:1.375rem}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;padding-inline:var(--btn-p);color:var(--btn-fg);--tw-prose-links:var(--btn-fg);height:var(--size);font-size:var(--fontsize,.875rem);outline-color:var(--btn-color,var(--color-base-content));background-color:var(--btn-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--btn-noise);border-width:var(--border);border-style:solid;border-color:var(--btn-border);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));touch-action:manipulation;box-shadow:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow);--size:calc(var(--size-field,.25rem) * 10);--btn-bg:var(--btn-color,var(--color-base-200));--btn-fg:var(--color-base-content);--btn-p:1rem;--btn-border:var(--btn-bg);border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn{--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-noise:var(--fx-noise)}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%)}}.btn:active:not(.btn-active){--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn:active:not(.btn-active){--btn-shadow:0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0)}.btn:is(input[type=checkbox],input[type=radio]){appearance:none}.btn:is(input[type=checkbox],input[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.btn:where(input:checked:not(.filter .btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);isolation:isolate}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative;overflow:hidden}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords;height:0}.collapse:is(details):where([open])::details-content{height:auto}}.collapse:is(details) summary{display:block;position:relative}.collapse:is(details) summary::-webkit-details-marker{display:none}.collapse:is(details)>.collapse-content{content-visibility:visible}.collapse:is(details) summary{outline:none}.collapse-content{content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:"";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:"";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{cursor:text;border:var(--border) solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,.875rem), .875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input{--size:calc(var(--size-field,.25rem) * 10);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input:where(input){display:inline-flex}.input :where(input){appearance:none;background-color:#0000;border:none;width:100%;height:100%;display:inline-flex}.input :where(input):focus,.input :where(input):focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input :where(input):focus,.input :where(input):focus-within{outline-offset:2px;outline:2px solid #0000}}.input :where(input[type=url]),.input :where(input[type=email]){direction:ltr}.input :where(input[type=date]){display:inline-flex}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.input[type=number]::-webkit-inner-spin-button{margin-block:-.75rem;margin-inline-end:-.75rem}.input::-webkit-calendar-picker-indicator{position:absolute;inset-inline-end:.75em}.input:has(>input[type=date]) :where(input[type=date]){webkit-appearance:none;appearance:none;display:inline-flex}.input:has(>input[type=date]) input[type=date]::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute;inset-inline-end:.75em}.indicator{width:max-content;display:inline-flex;position:relative}.indicator :where(.indicator-item){z-index:1;white-space:nowrap;top:var(--indicator-t,0);bottom:var(--indicator-b,auto);left:var(--indicator-s,auto);right:var(--indicator-e,0);translate:var(--indicator-x,50%) var(--indicator-y,-50%);position:absolute}.table{border-collapse:separate;--tw-border-spacing-x:calc(.25rem * 0);--tw-border-spacing-y:calc(.25rem * 0);width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:"";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill));position:relative;top:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill))}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill));background-color:currentColor;position:relative;top:50%}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill))}}.range:disabled{cursor:not-allowed;opacity:.3}.select{border:var(--border) solid #0000;appearance:none;background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);height:var(--size);touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;font-size:.875rem;display:inline-flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.select{border-color:var(--input-color);--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{--size:calc(var(--size-field,.25rem) * 10)}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}.select:focus,.select:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.select:focus,.select:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.select:focus,.select:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){.select,.select select{appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);white-space:normal;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.timeline{display:flex;position:relative}.timeline>li{grid-template-rows:var(--timeline-row-start,minmax(0, 1fr)) auto var(--timeline-row-end,minmax(0, 1fr));grid-template-columns:var(--timeline-col-start,minmax(0, 1fr)) auto var(--timeline-col-end,minmax(0, 1fr));flex-shrink:0;align-items:center;display:grid;position:relative}.timeline>li>hr{border:none;width:100%}.timeline>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline>li>hr:last-child{grid-area:2/3/auto/none}@media print{.timeline>li>hr{border:.1px solid var(--color-base-300)}}.timeline :where(hr){background-color:var(--color-base-300);height:.25rem}.timeline:has(.timeline-middle hr):first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline:has(.timeline-middle hr):last-child,.timeline:not(:has(.timeline-middle)) :first-child hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline:not(:has(.timeline-middle)) :last-child hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.avatar{vertical-align:middle;display:inline-flex;position:relative}.avatar>div{aspect-ratio:1;display:block;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:"";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:"✔︎";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:"";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.rating{vertical-align:middle;display:inline-flex;position:relative}.rating input{appearance:none;border:none}.rating :where(*){background-color:var(--color-base-content);opacity:.2;border-radius:0;width:1.5rem;height:1.5rem}@media (prefers-reduced-motion:no-preference){.rating :where(*){animation:.25s ease-out rating}}.rating :where(*):is(input){cursor:pointer}.rating .rating-hidden{background-color:#0000;width:.5rem}.rating input[type=radio]:checked{background-image:none}.rating :checked,.rating [aria-checked=true],.rating [aria-current=true],.rating :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1}.rating :focus-visible{scale:1.1}@media (prefers-reduced-motion:no-preference){.rating :focus-visible{transition:scale .2s ease-out}}.rating :active:focus{animation:none;scale:1.1}.rating\!{vertical-align:middle!important;display:inline-flex!important;position:relative!important}.rating\! input{appearance:none!important;border:none!important}.rating\! :where(*){background-color:var(--color-base-content)!important;opacity:.2!important;border-radius:0!important;width:1.5rem!important;height:1.5rem!important}@media (prefers-reduced-motion:no-preference){.rating\! :where(*){animation:.25s ease-out rating!important}}.rating\! :where(*):is(input){cursor:pointer!important}.rating\! .rating-hidden{background-color:#0000!important;width:.5rem!important}.rating\! input[type=radio]:checked{background-image:none!important}.rating\! :checked,.rating\! [aria-checked=true],.rating\! [aria-current=true],.rating\! :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1!important}.rating\! :focus-visible{scale:1.1!important}@media (prefers-reduced-motion:no-preference){.rating\! :focus-visible{transition:scale .2s ease-out!important}}.rating\! :active:focus{animation:none!important;scale:1.1!important}.navbar{align-items:center;width:100%;min-height:4rem;padding:.5rem;display:flex}.drawer{grid-auto-columns:max-content auto;width:100%;display:grid;position:relative}.card{border-radius:var(--radius-box);outline-offset:2px;outline:0 solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.card:focus{outline-offset:2px;outline:2px solid #0000}}.card:focus-visible{outline-color:currentColor}.card :where(figure:first-child){border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card :where(figure:last-child){border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}.card:has(>input:is(input[type=checkbox],input[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card:has(>:checked){outline:2px solid}.stats{border-radius:var(--radius-box);grid-auto-flow:column;display:inline-grid;position:relative;overflow-x:auto}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{border:var(--border) solid #0000;appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;width:clamp(3rem,20rem,100%);min-height:5rem;font-size:max(var(--font-size,.875rem), .875rem);touch-action:manipulation;border-color:var(--input-color);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;flex-shrink:1;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea{--input-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.modal-backdrop{color:#0000;z-index:-1;grid-row-start:1;grid-column-start:1;place-self:stretch stretch;display:grid}.modal-backdrop button{cursor:pointer}.timeline-end{grid-area:3/1/4/4;place-self:flex-start center;margin:.25rem}.timeline-start{grid-area:1/1/2/4;place-self:flex-end center;margin:.25rem}.stat-figure{grid-row:1/span 3;grid-column-start:2;place-self:center flex-end}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:.95;box-shadow:0 25px 50px -12px oklch(0% 0 0/.25)}.drawer-content{grid-row-start:1;grid-column-start:2;min-width:0}.timeline-middle{grid-row-start:2;grid-column-start:2}.stat-value{white-space:nowrap;grid-column-start:1;font-size:2rem;font-weight:800}.stat-desc{white-space:nowrap;color:var(--color-base-content);grid-column-start:1}@supports (color:color-mix(in lab, red, red)){.stat-desc{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-desc{font-size:.75rem}.stat-title{white-space:nowrap;color:var(--color-base-content);grid-column-start:1}@supports (color:color-mix(in lab, red, red)){.stat-title{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.stat-title{font-size:.75rem}.divider{white-space:nowrap;height:1rem;margin:var(--divider-m,1rem 0);--divider-color:var(--color-base-content);flex-direction:row;align-self:stretch;align-items:center;display:flex}@supports (color:color-mix(in lab, red, red)){.divider{--divider-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.divider:before,.divider:after{content:"";background-color:var(--divider-color);flex-grow:1;width:100%;height:.125rem}@media print{.divider:before,.divider:after{border:.5px solid}}.divider:not(:empty){gap:1rem}.filter{flex-wrap:wrap;display:flex}.filter input[type=radio]{width:auto}.filter input{opacity:1;transition:margin .1s,opacity .3s,padding .3s,border-width .1s;overflow:hidden;scale:1}.filter input:not(:last-child){margin-inline-end:.25rem}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:"×";content:var(--tw-content)}.filter:not(:has(input:checked:not(.filter-reset))) .filter-reset,.filter:not(:has(input:checked:not(.filter-reset))) input[type=reset],.filter:has(input:checked:not(.filter-reset)) input:not(:checked,.filter-reset,input[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.modal-action{justify-content:flex-end;gap:.5rem;margin-top:1.5rem;display:flex}.fieldset-legend{color:var(--color-base-content);justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:-.25rem;padding-block:.5rem;font-weight:600;display:flex}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.tabs{--tabs-height:auto;--tabs-direction:row;--tab-height:calc(var(--size-field,.25rem) * 10);height:var(--tabs-height);flex-wrap:wrap;flex-direction:var(--tabs-direction);display:flex}.footer{grid-auto-flow:row;place-items:start;gap:2.5rem 1rem;width:100%;font-size:.875rem;line-height:1.25rem;display:grid}.footer>*{place-items:start;gap:.5rem;display:grid}.footer.footer-center{text-align:center;grid-auto-flow:column dense;place-items:center}.footer.footer-center>*{place-items:center}.stat{grid-template-columns:repeat(1,1fr);column-gap:1rem;width:100%;padding-block:1rem;padding-inline:1.5rem;display:inline-grid}.stat:not(:last-child){border-inline-end:var(--border) dashed currentColor}@supports (color:color-mix(in lab, red, red)){.stat:not(:last-child){border-inline-end:var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)}}.stat:not(:last-child){border-block-end:none}.navbar-end{justify-content:flex-end;align-items:center;width:50%;display:inline-flex}.navbar-start{justify-content:flex-start;align-items:center;width:50%;display:inline-flex}.card-body{padding:var(--card-p,1.5rem);font-size:var(--card-fs,.875rem);flex-direction:column;flex:auto;gap:.5rem;display:flex}.card-body :where(p){flex-grow:1}.navbar-center{flex-shrink:0;align-items:center;display:inline-flex}.fab-flower{--position:0rem;display:grid}.fab-flower>:nth-child(-n+2){--position:0rem}.fab-flower>*{--degree:180deg;--flip-degree:calc(180deg - var(--degree));transform:translateX(calc(cos(var(--degree)) * var(--position))) translateY(calc(sin(var(--degree)) * -1 * var(--position)));grid-area:1/1}[dir=rtl] :is(.fab-flower>*){transform:translateX(calc(cos(var(--flip-degree)) * var(--position))) translateY(calc(sin(var(--flip-degree)) * -1 * var(--position)))}.fab-flower>:nth-child(n+7){display:none}.fab-flower:has(:nth-child(3)){--position:140%}.fab-flower:has(:nth-child(3))>:nth-child(3){--degree:135deg}.fab-flower:has(:nth-child(4)){--position:140%}.fab-flower:has(:nth-child(4))>:nth-child(3){--degree:165deg}.fab-flower:has(:nth-child(4))>:nth-child(4){--degree:105deg}.fab-flower:has(:nth-child(5)){--position:180%}.fab-flower:has(:nth-child(5))>:nth-child(3){--degree:180deg}.fab-flower:has(:nth-child(5))>:nth-child(4){--degree:135deg}.fab-flower:has(:nth-child(5))>:nth-child(5){--degree:90deg}.fab-flower:has(:nth-child(6)){--position:220%}.fab-flower:has(:nth-child(6))>:nth-child(3){--degree:180deg}.fab-flower:has(:nth-child(6))>:nth-child(4){--degree:150deg}.fab-flower:has(:nth-child(6))>:nth-child(5){--degree:120deg}.fab-flower:has(:nth-child(6))>:nth-child(6){--degree:90deg}.fieldset-label{color:var(--color-base-content);align-items:center;gap:.375rem;display:flex}@supports (color:color-mix(in lab, red, red)){.fieldset-label{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.fieldset-label:has(input){cursor:pointer}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px #000, 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px color-mix(in oklab, color-mix(in oklab, #000 20%, var(--alert-color,var(--color-base-200))) calc(var(--depth) * 20%), #0000), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.fieldset{grid-template-columns:1fr;grid-auto-rows:max-content;gap:.375rem;padding-block:.25rem;font-size:.75rem;display:grid}.card-title{font-size:var(--cardtitle-fs,1.125rem);align-items:center;gap:.5rem;font-weight:600;display:flex}.mask{vertical-align:middle;display:inline-block;-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.timeline-box{border:var(--border) solid;border-radius:var(--radius-box);border-color:var(--color-base-300);background-color:var(--color-base-100);padding-block:.5rem;padding-inline:1rem;font-size:.75rem;box-shadow:0 1px 2px oklch(0% 0 0/.05)}.btn-accent{--btn-color:var(--color-accent);--btn-fg:var(--color-accent-content)}.btn-error{--btn-color:var(--color-error);--btn-fg:var(--color-error-content)}.btn-info{--btn-color:var(--color-info);--btn-fg:var(--color-info-content)}.btn-neutral{--btn-color:var(--color-neutral);--btn-fg:var(--color-neutral-content)}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}.btn-secondary{--btn-color:var(--color-secondary);--btn-fg:var(--color-secondary-content)}.btn-success{--btn-color:var(--color-success);--btn-fg:var(--color-success-content)}.btn-warning{--btn-color:var(--color-warning);--btn-fg:var(--color-warning-content)}}@layer daisyui.l1.l2{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-has-backdrop:1;--page-overflow:hidden;--page-scroll-bg:var(--page-scroll-bg-on);--page-scroll-gutter:stable;--page-scroll-transition:var(--page-scroll-transition-on);animation:forwards set-page-has-scroll;animation-timeline:scroll()}@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}}:where(.drawer-toggle:checked~.drawer-side){pointer-events:auto;visibility:visible;opacity:1;overflow-y:auto}:where(.drawer-toggle:checked~.drawer-side)>:not(.drawer-overlay){translate:0%}.drawer-toggle:focus-visible~.drawer-content label.drawer-button{outline-offset:2px;outline:2px solid}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(-50%) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off) 50%}.tooltip:after{transform:translateX(-50%) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail) 50%}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:"";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}.btn:disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.btn:disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn:disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:disabled{--btn-fg:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn[disabled]:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.btn[disabled]:not(.btn-link,.btn-ghost){box-shadow:none}.btn[disabled]{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn[disabled]{--btn-fg:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn-disabled:not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn-disabled:not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.btn-disabled:not(.btn-link,.btn-ghost){box-shadow:none}.btn-disabled{pointer-events:none;--btn-border:#0000;--btn-noise:none;--btn-fg:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn-disabled{--btn-fg:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.tab-disabled{pointer-events:none;opacity:.4}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:"−";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:"−";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.menu-horizontal{flex-direction:row;display:inline-flex}.menu-horizontal>li:not(.menu-title)>details>ul{transform-origin:top;border-radius:var(--radius-box);background-color:var(--color-base-100);opacity:0;margin-inline-start:0;margin-top:1rem;padding-block:.5rem;padding-inline-end:.5rem;position:absolute;scale:.95;box-shadow:0 1px 3px oklch(0% 0 0/.1),0 1px 2px -1px oklch(0% 0 0/.1)}@media (prefers-reduced-motion:no-preference){@starting-style{.menu-horizontal>li:not(.menu-title)>details>ul{opacity:0;scale:.95}}.menu-horizontal>li:not(.menu-title)>details>ul{transition-behavior:allow-discrete;transition-property:opacity,scale,display;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s menu}}.menu-horizontal>li:not(.menu-title)>details[open]>ul{opacity:1;scale:1}.menu-horizontal>li>details>ul:before{--tw-content:none;content:var(--tw-content)}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}.rating.rating-xs :where(:not(.rating-hidden)){width:1rem;height:1rem}.rating.rating-sm :where(:not(.rating-hidden)){width:1.25rem;height:1.25rem}.rating.rating-md :where(:not(.rating-hidden)){width:1.5rem;height:1.5rem}.rating.rating-lg :where(:not(.rating-hidden)){width:1.75rem;height:1.75rem}.rating.rating-xl :where(:not(.rating-hidden)){width:2rem;height:2rem}.rating\!.rating-xs :where(:not(.rating-hidden)){width:1rem!important;height:1rem!important}.rating\!.rating-sm :where(:not(.rating-hidden)){width:1.25rem!important;height:1.25rem!important}.rating\!.rating-md :where(:not(.rating-hidden)){width:1.5rem!important;height:1.5rem!important}.rating\!.rating-lg :where(:not(.rating-hidden)){width:1.75rem!important;height:1.75rem!important}.rating\!.rating-xl :where(:not(.rating-hidden)){width:2rem!important;height:2rem!important}:where(.navbar){position:relative}.tooltip-bottom>.tooltip-content,.tooltip-bottom[data-tip]:before{transform:translateX(-50%) translateY(var(--tt-pos,-.25rem));inset:var(--tt-off) auto auto 50%}.tooltip-bottom:after{transform:translateX(-50%) translateY(var(--tt-pos,-.25rem)) rotate(180deg);inset:var(--tt-tail) auto auto 50%}.tooltip-left>.tooltip-content,.tooltip-left[data-tip]:before{transform:translateX(calc(var(--tt-pos,.25rem) - .25rem)) translateY(-50%);inset:50% var(--tt-off) auto auto}.tooltip-left:after{transform:translateX(var(--tt-pos,.25rem)) translateY(-50%) rotate(-90deg);inset:50% calc(var(--tt-tail) + 1px) auto auto}.tooltip-right>.tooltip-content,.tooltip-right[data-tip]:before{transform:translateX(calc(var(--tt-pos,-.25rem) + .25rem)) translateY(-50%);inset:50% auto auto var(--tt-off)}.tooltip-right:after{transform:translateX(var(--tt-pos,-.25rem)) translateY(-50%) rotate(90deg);inset:50% auto auto calc(var(--tt-tail) + 1px)}.tooltip-top>.tooltip-content,.tooltip-top[data-tip]:before{transform:translateX(-50%) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off) 50%}.tooltip-top:after{transform:translateX(-50%) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail) 50%}.dropdown-end{--anchor-h:span-left}.dropdown-end :where(.dropdown-content){inset-inline-end:0;translate:0}[dir=rtl] :is(.dropdown-end :where(.dropdown-content)){translate:0}.dropdown-end.dropdown-left{--anchor-h:left;--anchor-v:span-top}.dropdown-end.dropdown-left .dropdown-content{top:auto;bottom:0}.dropdown-end.dropdown-right{--anchor-h:right;--anchor-v:span-top}.dropdown-end.dropdown-right .dropdown-content{top:auto;bottom:0}.btn-active{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn-active{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn-active{--btn-shadow:0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0);isolation:isolate}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.tabs-box{background-color:var(--color-base-200);--tabs-box-radius:calc(3 * var(--radius-field));border-radius:calc(min(var(--tab-height) / 2, var(--radius-field)) + min(.25rem, var(--tabs-box-radius)));box-shadow:0 -.5px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 .5px oklch(0% 0 0 / calc(var(--depth) * .05)) inset;padding:.25rem}.tabs-box>.tab{border-radius:var(--radius-field);border-style:none}.tabs-box>.tab:focus-visible,.tabs-box>.tab:is(label:has(:checked:focus-visible)){outline-offset:2px}.tabs-box>.tab:focus-visible{z-index:1}.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){background-color:var(--tab-bg,var(--color-base-100));box-shadow:0 1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px 1px -1px var(--color-neutral), 0 1px 6px -4px var(--color-neutral)}@supports (color:color-mix(in lab, red, red)){.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){box-shadow:0 1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px 1px -1px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 50%), #0000), 0 1px 6px -4px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 100%), #0000)}}@media (forced-colors:active){.tabs-box>:is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]):not(.tab-disabled,[disabled]),.tabs-box>:is(input:checked),.tabs-box>:is(label:has(:checked)){border:1px solid}}.tabs-box>.tab-content{height:calc(100% - var(--tab-height) + var(--border) - .5rem);border-radius:calc(min(var(--tab-height) / 2, var(--radius-field)) + min(.25rem, var(--tabs-box-radius)) - var(--border));margin-top:.25rem}.timeline-horizontal{flex-direction:row}.timeline-horizontal>li{align-items:center}.timeline-horizontal>li>hr{width:100%;height:.25rem}.timeline-horizontal>li>hr:first-child{grid-row-start:2;grid-column-start:1}.timeline-horizontal>li>hr:last-child{grid-area:2/3/auto/none}.timeline-horizontal .timeline-start{grid-area:1/1/2/4;place-self:flex-end center}.timeline-horizontal .timeline-end{grid-area:3/1/4/4;place-self:flex-start center}.timeline-horizontal:has(.timeline-middle)>li>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline-horizontal:has(.timeline-middle)>li>hr:last-child,.timeline-horizontal:not(:has(.timeline-middle)) :first-child>hr:last-child{border-start-start-radius:var(--radius-selector);border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:var(--radius-selector)}.timeline-horizontal:not(:has(.timeline-middle)) :last-child>hr:first-child{border-start-start-radius:0;border-start-end-radius:var(--radius-selector);border-end-end-radius:var(--radius-selector);border-end-start-radius:0}.timeline-vertical{flex-direction:column}.timeline-vertical>li{--timeline-row-start:minmax(0, 1fr);--timeline-row-end:minmax(0, 1fr);justify-items:center}.timeline-vertical>li>hr{width:.25rem;height:100%}.timeline-vertical>li>hr:first-child{grid-row-start:1;grid-column-start:2}.timeline-vertical>li>hr:last-child{grid-area:3/2/none}.timeline-vertical .timeline-start{grid-area:1/1/4/2;place-self:center flex-end}.timeline-vertical .timeline-end{grid-area:1/3/4/4;place-self:center flex-start}.timeline-vertical:has(.timeline-middle)>li>hr:first-child{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:var(--radius-selector);border-bottom-left-radius:var(--radius-selector)}.timeline-vertical:has(.timeline-middle)>li>hr:last-child,.timeline-vertical:not(:has(.timeline-middle)) :first-child>hr:last-child{border-top-left-radius:var(--radius-selector);border-top-right-radius:var(--radius-selector);border-bottom-right-radius:0;border-bottom-left-radius:0}.timeline-vertical:not(:has(.timeline-middle)) :last-child>hr:first-child{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:var(--radius-selector);border-bottom-left-radius:var(--radius-selector)}.timeline-vertical.timeline-snap-icon>li{--timeline-col-start:minmax(0, 1fr);--timeline-row-start:.5rem}.timeline-compact{--timeline-row-start:0}.timeline-compact .timeline-start{grid-area:3/1/4/4;place-self:flex-start center}.timeline-compact li:has(.timeline-start) .timeline-end{grid-row-start:auto;grid-column-start:none}.timeline-compact.timeline-vertical>li{--timeline-col-start:0}.timeline-compact.timeline-vertical .timeline-start{grid-area:1/3/4/4;place-self:center flex-start}.timeline-compact.timeline-vertical li:has(.timeline-start) .timeline-end{grid-row-start:none;grid-column-start:auto}.input-sm{--size:calc(var(--size-field,.25rem) * 8);font-size:max(var(--font-size,.75rem), .75rem)}.input-sm[type=number]::-webkit-inner-spin-button{margin-block:-.5rem;margin-inline-end:-.75rem}.btn-circle{width:var(--size);height:var(--size);border-radius:3.40282e38px;padding-inline:0}.btn-square{width:var(--size);height:var(--size);padding-inline:0}.btn-wide{width:100%;max-width:16rem}.btn-block{width:100%}.loading-lg{width:calc(var(--size-selector,.25rem) * 7)}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.loading-sm{width:calc(var(--size-selector,.25rem) * 5)}.loading-xs{width:calc(var(--size-selector,.25rem) * 4)}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.select-ghost{box-shadow:none;background-color:#0000;border-color:#0000;transition:background-color .2s}.select-ghost:focus,.select-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.input-ghost{box-shadow:none;background-color:#0000;border-color:#0000}.input-ghost:focus,.input-ghost:focus-within{background-color:var(--color-base-100);color:var(--color-base-content);box-shadow:none;border-color:#0000}.badge-outline{color:var(--badge-color);--badge-bg:#0000;background-image:none;border-color:currentColor}.table-zebra tbody tr:where(:nth-child(2n)),.table-zebra tbody tr:where(:nth-child(2n)) :where(.table-pin-cols tr th){background-color:var(--color-base-200)}@media (hover:hover){:is(.table-zebra tbody tr.row-hover,.table-zebra tbody tr.row-hover:where(:nth-child(2n))):hover{background-color:var(--color-base-300)}}.loading-ball{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E")}.loading-bars{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E")}.loading-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")}.loading-infinity{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E")}.loading-ring{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.mask-heart{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")}.mask-star{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e")}.mask-star-2{-webkit-mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e");mask-image:url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e")}.badge-lg{--size:calc(var(--size-selector,.25rem) * 7);font-size:1rem}.badge-md{--size:calc(var(--size-selector,.25rem) * 6);font-size:.875rem}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-info{color:var(--color-info-content);--alert-border-color:var(--color-info);--alert-color:var(--color-info)}.alert-success{color:var(--color-success-content);--alert-border-color:var(--color-success);--alert-color:var(--color-success)}.alert-warning{color:var(--color-warning-content);--alert-border-color:var(--color-warning);--alert-color:var(--color-warning)}.checkbox-accent{color:var(--color-accent-content);--input-color:var(--color-accent)}.checkbox-primary{color:var(--color-primary-content);--input-color:var(--color-primary)}.checkbox-secondary{color:var(--color-secondary-content);--input-color:var(--color-secondary)}.tooltip-accent{--tt-bg:var(--color-accent)}.tooltip-accent>.tooltip-content,.tooltip-accent[data-tip]:before{color:var(--color-accent-content)}.tooltip-error{--tt-bg:var(--color-error)}.tooltip-error>.tooltip-content,.tooltip-error[data-tip]:before{color:var(--color-error-content)}.tooltip-info{--tt-bg:var(--color-info)}.tooltip-info>.tooltip-content,.tooltip-info[data-tip]:before{color:var(--color-info-content)}.tooltip-primary{--tt-bg:var(--color-primary)}.tooltip-primary>.tooltip-content,.tooltip-primary[data-tip]:before{color:var(--color-primary-content)}.tooltip-secondary{--tt-bg:var(--color-secondary)}.tooltip-secondary>.tooltip-content,.tooltip-secondary[data-tip]:before{color:var(--color-secondary-content)}.tooltip-success{--tt-bg:var(--color-success)}.tooltip-success>.tooltip-content,.tooltip-success[data-tip]:before{color:var(--color-success-content)}.tooltip-warning{--tt-bg:var(--color-warning)}.tooltip-warning>.tooltip-content,.tooltip-warning[data-tip]:before{color:var(--color-warning-content)}.btn-lg{--fontsize:1.125rem;--btn-p:1.25rem;--size:calc(var(--size-field,.25rem) * 12)}.btn-md{--fontsize:.875rem;--btn-p:1rem;--size:calc(var(--size-field,.25rem) * 10)}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem) * 8)}.btn-xl{--fontsize:1.375rem;--btn-p:1.5rem;--size:calc(var(--size-field,.25rem) * 14)}.btn-xs{--fontsize:.6875rem;--btn-p:.5rem;--size:calc(var(--size-field,.25rem) * 6)}.badge-accent{--badge-color:var(--color-accent);--badge-fg:var(--color-accent-content)}.badge-error{--badge-color:var(--color-error);--badge-fg:var(--color-error-content)}.badge-info{--badge-color:var(--color-info);--badge-fg:var(--color-info-content)}.badge-primary{--badge-color:var(--color-primary);--badge-fg:var(--color-primary-content)}.badge-secondary{--badge-color:var(--color-secondary);--badge-fg:var(--color-secondary-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.badge-warning{--badge-color:var(--color-warning);--badge-fg:var(--color-warning-content)}.input-error,.input-error:focus,.input-error:focus-within{--input-color:var(--color-error)}.input-primary,.input-primary:focus,.input-primary:focus-within{--input-color:var(--color-primary)}.input-secondary,.input-secondary:focus,.input-secondary:focus-within{--input-color:var(--color-secondary)}.radio-accent{--input-color:var(--color-accent)}.radio-primary{--input-color:var(--color-primary)}.radio-secondary{--input-color:var(--color-secondary)}.range-xs{--range-thumb-size:calc(var(--size-selector,.25rem) * 4)}.select-primary,.select-primary:focus,.select-primary:focus-within{--input-color:var(--color-primary)}.select-secondary,.select-secondary:focus,.select-secondary:focus-within{--input-color:var(--color-secondary)}.toggle-primary:checked,.toggle-primary[aria-checked=true]{--input-color:var(--color-primary)}}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse:not(td,tr,colgroup){visibility:revert-layer}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.-top-1{top:calc(var(--spacing) * -1)}.top-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-4{top:calc(var(--spacing) * 4)}.top-6{top:calc(var(--spacing) * 6)}.top-10{top:calc(var(--spacing) * 10)}.-right-2{right:calc(var(--spacing) * -2)}.right-0{right:calc(var(--spacing) * 0)}.right-1\/4{right:25%}.right-6{right:calc(var(--spacing) * 6)}.-bottom-5{bottom:calc(var(--spacing) * -5)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-10{bottom:calc(var(--spacing) * 10)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-1\/4{left:25%}.left-2{left:calc(var(--spacing) * 2)}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.-z-0{z-index:calc(0 * -1)}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[50\]{z-index:50}.z-\[90\]{z-index:90}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[9999\]{z-index:9999}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-1{margin:calc(var(--spacing) * 1)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.my-16{margin-block:calc(var(--spacing) * 16)}.-mt-10{margin-top:calc(var(--spacing) * -10)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-6{margin-left:calc(var(--spacing) * 6)}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.aspect-square{aspect-ratio:1}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-96{height:calc(var(--spacing) * 96)}.h-\[300px\]{height:300px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-auto{height:auto}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-96{max-height:calc(var(--spacing) * 96)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[100px\]{min-height:100px}.min-h-\[200px\]{min-height:200px}.min-h-\[300px\]{min-height:300px}.min-h-\[400px\]{min-height:400px}.min-h-\[500px\]{min-height:500px}.min-h-full{min-height:100%}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:var(--container-md)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\[4rem\]{min-width:4rem}.min-w-\[48px\]{min-width:48px}.min-w-\[500px\]{min-width:500px}.min-w-\[600px\]{min-width:600px}.min-w-max{min-width:max-content}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-2{--tw-translate-x:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-10{--tw-translate-x:calc(var(--spacing) * 10);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing) * 2);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-box{border-radius:var(--radius-box);border-radius:var(--radius-box)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}@layer daisyui.l1{.btn-dash:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}@media (hover:none){.btn-dash:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}}.alert-soft{color:var(--alert-color,var(--color-base-content));background:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{background:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 8%, var(--color-base-100))}}.alert-soft{--alert-border-color:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{--alert-border-color:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 10%, var(--color-base-100))}}.alert-soft{box-shadow:none;background-image:none}.btn-link{--btn-border:#0000;--btn-bg:#0000;--btn-noise:none;--btn-shadow:"";outline-color:currentColor;text-decoration-line:underline}.btn-link:not(.btn-disabled,.btn:disabled,.btn[disabled]){--btn-fg:var(--btn-color,var(--color-primary))}.btn-link:is(.btn-active,:hover,:active:focus,:focus-visible){--btn-border:#0000;--btn-bg:#0000}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)){--btn-shadow:"";--btn-bg:#0000;--btn-border:#0000;--btn-noise:none}.btn-ghost:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn)):not(:disabled,[disabled],.btn-disabled){--btn-fg:var(--btn-color,currentColor);outline-color:currentColor}@media (hover:none){.btn-ghost:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color,currentColor);--btn-border:#0000;--btn-noise:none;outline-color:currentColor}}.btn-outline:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}@media (hover:none){.btn-outline:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-bg:#0000;--btn-fg:var(--btn-color);--btn-border:var(--btn-color);--btn-noise:none}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 8%, var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 10%, var(--color-base-100))}}.btn-soft:not(.btn-active,:hover,:active:focus,:focus-visible,input:checked:not(.filter .btn),:disabled,[disabled],.btn-disabled){--btn-noise:none}@media (hover:none){.btn-soft:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-shadow:"";--btn-fg:var(--btn-color,var(--color-base-content));--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 8%, var(--color-base-100))}}.btn-soft:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 10%, var(--color-base-100))}}.btn-soft:not(.btn-active,:active,:focus-visible,input:checked:not(.filter .btn)):hover{--btn-noise:none}}}.btn-dash{border-style:dashed}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-base-200\/30{border-color:var(--color-base-200)}@supports (color:color-mix(in lab, red, red)){.border-base-200\/30{border-color:color-mix(in oklab, var(--color-base-200) 30%, transparent)}}.border-base-300{border-color:var(--color-base-300)}.border-base-content\/20{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\/20{border-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.border-black\/5{border-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.border-black\/5{border-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.border-black\/10{border-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.border-primary,.border-primary\/20{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/20{border-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.border-transparent{border-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-base-100,.bg-base-100\/30{background-color:var(--color-base-100)}@supports (color:color-mix(in lab, red, red)){.bg-base-100\/30{background-color:color-mix(in oklab, var(--color-base-100) 30%, transparent)}}.bg-base-200,.bg-base-200\/30{background-color:var(--color-base-200)}@supports (color:color-mix(in lab, red, red)){.bg-base-200\/30{background-color:color-mix(in oklab, var(--color-base-200) 30%, transparent)}}.bg-base-200\/50{background-color:var(--color-base-200)}@supports (color:color-mix(in lab, red, red)){.bg-base-200\/50{background-color:color-mix(in oklab, var(--color-base-200) 50%, transparent)}}.bg-base-300{background-color:var(--color-base-300)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-error,.bg-error\/10{background-color:var(--color-error)}@supports (color:color-mix(in lab, red, red)){.bg-error\/10{background-color:color-mix(in oklab, var(--color-error) 10%, transparent)}}.bg-info{background-color:var(--color-info)}.bg-neutral{background-color:var(--color-neutral)}.bg-primary,.bg-primary\/5{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--color-primary) 5%, transparent)}}.bg-primary\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-primary\/20{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--color-primary) 20%, transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-success,.bg-success\/10{background-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.bg-success\/10{background-color:color-mix(in oklab, var(--color-success) 10%, transparent)}}.bg-warning,.bg-warning\/10{background-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--color-warning) 10%, transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-accent{--tw-gradient-from:var(--color-accent);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-secondary{--tw-gradient-from:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-accent{--tw-gradient-via:var(--color-accent);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-accent{--tw-gradient-to:var(--color-accent);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-primary{--tw-gradient-to:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.object-contain{object-fit:contain}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-10{padding:calc(var(--spacing) * 10)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.\!text-center{text-align:center!important}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-20{--tw-leading:calc(var(--spacing) * 20);line-height:calc(var(--spacing) * 20)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.whitespace-nowrap{white-space:nowrap}.text-accent{color:var(--color-accent)}.text-accent-content{color:var(--color-accent-content)}.text-base-content,.text-base-content\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/60{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.text-base-content\/90{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\/90{color:color-mix(in oklab, var(--color-base-content) 90%, transparent)}}.text-error{color:var(--color-error)}.text-error-content{color:var(--color-error-content)}.text-gray-500{color:var(--color-gray-500)}.text-info{color:var(--color-info)}.text-info-content{color:var(--color-info-content)}.text-neutral-content{color:var(--color-neutral-content)}.text-primary{color:var(--color-primary)}.text-primary-content{color:var(--color-primary-content)}.text-secondary{color:var(--color-secondary)}.text-secondary-content{color:var(--color-secondary-content)}.text-success{color:var(--color-success)}.text-success-content{color:var(--color-success-content)}.text-transparent{color:#0000}.text-warning{color:var(--color-warning)}.text-warning-content{color:var(--color-warning-content)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-secondary\/20{--tw-shadow-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.shadow-secondary\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-secondary) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-primary{--tw-ring-color:var(--color-primary)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-2xl{--tw-drop-shadow-size:drop-shadow(0 25px 25px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.ring-inset{--tw-ring-inset:inset}@media (hover:hover){.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}}.before\:z-50:before,.after\:z-50:after{content:var(--tw-content);z-index:50}@media (hover:hover){.hover\:z-10:hover{z-index:10}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:scale-125:hover{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-accent\/40:hover{border-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:border-accent\/40:hover{border-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.hover\:border-base-content\/20:hover{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.hover\:border-base-content\/20:hover{border-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.hover\:border-primary\/40:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/40:hover{border-color:color-mix(in oklab, var(--color-primary) 40%, transparent)}}.hover\:border-primary\/50:hover{border-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.hover\:border-secondary\/40:hover{border-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-secondary\/40:hover{border-color:color-mix(in oklab, var(--color-secondary) 40%, transparent)}}.hover\:bg-base-100:hover{background-color:var(--color-base-100)}.hover\:bg-base-200:hover{background-color:var(--color-base-200)}.hover\:bg-base-300:hover{background-color:var(--color-base-300)}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab, var(--color-white) 30%, transparent)}}.hover\:text-base-content:hover{color:var(--color-base-content)}.hover\:opacity-100:hover{opacity:1}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}@media (min-width:48rem){.md\:h-64{height:calc(var(--spacing) * 64)}.md\:w-64{width:calc(var(--spacing) * 64)}.md\:w-auto{width:auto}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes dropdown{0%{opacity:0}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes menu{0%{opacity:0}}@keyframes progress{50%{background-position-x:-115%}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file diff --git a/dist/sigpro-ui.cjs b/dist/sigpro-ui.cjs deleted file mode 100644 index 81baa1b..0000000 --- a/dist/sigpro-ui.cjs +++ /dev/null @@ -1,1724 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var sigpro = require('sigpro'); - -const val = t => typeof t === "function" ? t() : t; - -const joinClass = (t, l) => typeof l === "function" - ? () => `${t} ${l() || ""}`.trim() - : `${t} ${l || ""}`.trim(); - -var Utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - joinClass: joinClass, - val: val -}); - -/** ACCORDION */ -const Accordion = (props, children) => { - const { title, name, open, ...rest } = props; - - return sigpro.$html( - "div", - { - ...rest, - class: joinClass("collapse collapse-arrow bg-base-200 mb-2", props.class), - }, - [ - sigpro.$html("input", { - type: name ? "radio" : "checkbox", - name: name, - checked: open - }), - sigpro.$html("div", { class: "collapse-title text-xl font-medium" }, title), - sigpro.$html("div", { class: "collapse-content" }, children), - ], - ); -}; - -var AccordionModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion -}); - -const iconShow = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg=="; -const iconHide = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC"; -const iconClose = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg=="; -const iconCalendar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC"; -const iconLock = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII="; -const iconAbc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg=="; -const icon123 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg=="; -const iconMail = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC"; -const iconInfo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC"; -const iconSuccess = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg=="; -const iconError = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC"; -const iconWarning = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII="; -const iconLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg=="; -const iconRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg=="; -const iconLLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg=="; -const iconRRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII="; -const iconUpload = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC"; - -var Icons = /*#__PURE__*/Object.freeze({ - __proto__: null, - icon123: icon123, - iconAbc: iconAbc, - iconCalendar: iconCalendar, - iconClose: iconClose, - iconError: iconError, - iconHide: iconHide, - iconInfo: iconInfo, - iconLLeft: iconLLeft, - iconLeft: iconLeft, - iconLock: iconLock, - iconMail: iconMail, - iconRRight: iconRRight, - iconRight: iconRight, - iconShow: iconShow, - iconSuccess: iconSuccess, - iconUpload: iconUpload, - iconWarning: iconWarning -}); - -/** ALERT */ -const Alert = (props, children) => { - const { type = "info", soft = true, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - const typeClass = () => { - const t = val(type); - const map = { - info: "alert-info", - success: "alert-success", - warning: "alert-warning", - error: "alert-error", - }; - return map[t] || t; - }; - - const content = children || props.message; - - return sigpro.$html( - "div", - { - ...rest, - role: "alert", - class: () => `alert ${typeClass()} ${val(soft) ? "alert-soft" : ""} ${props.class || ""}`, - }, - [ - sigpro.$html("img", { - src: icons[val(type)] || icons.info, - class: "w-4 h-4 object-contain", - alt: val(type), - }), - sigpro.$html("div", { class: "flex-1" }, [ - sigpro.$html("span", {}, [typeof content === "function" ? content() : content]) - ]), - props.actions ? sigpro.$html("div", { class: "flex-none" }, [ - typeof props.actions === "function" ? props.actions() : props.actions - ]) : null, - ], - ); -}; - -var AlertModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Alert: Alert -}); - -const i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } -}; - -const currentLocale = sigpro.$("es"); - -const tt = t => () => i18n[currentLocale()][t] || t; - -/** INPUT */ -const Input = (props) => { - const { label, tip, value, error, isSearch, icon, type = "text", ...rest } = props; - const isPassword = type === "password"; - const visible = sigpro.$(false); - - const iconsByType = { - text: iconAbc, - password: iconLock, - date: iconCalendar, - number: icon123, - email: iconMail, - }; - - const inputEl = sigpro.$html("input", { - ...rest, - type: () => (isPassword ? (visible() ? "text" : "password") : type), - placeholder: props.placeholder || label || (isSearch ? tt("search")() : " "), - class: joinClass("grow order-2 focus:outline-none", props.class), - value: value, - oninput: (e) => props.oninput?.(e), - disabled: () => val(props.disabled), - }); - - const leftIcon = icon ? icon : iconsByType[type] ? sigpro.$html("img", { src: iconsByType[type], class: "opacity-50", alt: type }) : null; - - return sigpro.$html( - "label", - { - class: () => joinClass("input input-bordered floating-label flex items-center gap-2 w-full relative", val(error) ? "input-error" : ""), - }, - [ - leftIcon ? sigpro.$html("div", { class: "order-1 shrink-0" }, leftIcon) : null, - label ? sigpro.$html("span", { class: "text-base-content/60 order-0" }, label) : null, - inputEl, - isPassword - ? sigpro.$html( - "button", - { - type: "button", - class: "order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100", - onclick: (e) => { - e.preventDefault(); - visible(!visible()); - }, - }, - () => - sigpro.$html("img", { - class: "w-5 h-5", - src: visible() ? iconShow : iconHide, - }), - ) - : null, - tip - ? sigpro.$html( - "div", - { class: "tooltip tooltip-left order-4", "data-tip": tip }, - sigpro.$html("span", { class: "badge badge-ghost badge-xs cursor-help" }, "?"), - ) - : null, - () => (val(error) ? sigpro.$html("span", { class: "text-error text-[10px] absolute -bottom-5 left-2" }, val(error)) : null), - ], - ); -}; - -var InputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Input: Input -}); - -/** AUTOCOMPLETE */ -const Autocomplete = (props) => { - const { options = [], value, onSelect, label, placeholder, ...rest } = props; - - const query = sigpro.$(val(value) || ""); - const isOpen = sigpro.$(false); - const cursor = sigpro.$(-1); - - const list = sigpro.$(() => { - const q = query().toLowerCase(); - const data = val(options) || []; - return q - ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) - : data; - }); - - const pick = (opt) => { - const valStr = typeof opt === "string" ? opt : opt.value; - const labelStr = typeof opt === "string" ? opt : opt.label; - - query(labelStr); - if (typeof value === "function") value(valStr); - onSelect?.(opt); - - isOpen(false); - cursor(-1); - }; - - const nav = (e) => { - const items = list(); - if (e.key === "ArrowDown") { - e.preventDefault(); - isOpen(true); - cursor(Math.min(cursor() + 1, items.length - 1)); - } else if (e.key === "ArrowUp") { - e.preventDefault(); - cursor(Math.max(cursor() - 1, 0)); - } else if (e.key === "Enter" && cursor() >= 0) { - e.preventDefault(); - pick(items[cursor()]); - } else if (e.key === "Escape") { - isOpen(false); - } - }; - - return sigpro.$html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || tt("search")(), - value: query, - onfocus: () => isOpen(true), - onblur: () => setTimeout(() => isOpen(false), 150), - onkeydown: nav, - oninput: (e) => { - const v = e.target.value; - query(v); - if (typeof value === "function") value(v); - isOpen(true); - cursor(-1); - }, - ...rest, - }), - sigpro.$html( - "ul", - { - class: "absolute left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", - style: () => (isOpen() && list().length ? "display:block" : "display:none"), - }, - [ - sigpro.$for( - list, - (opt, i) => - sigpro.$html("li", {}, [ - sigpro.$html( - "a", - { - class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, - onclick: () => pick(opt), - onmouseenter: () => cursor(i), - }, - typeof opt === "string" ? opt : opt.label, - ), - ]), - (opt, i) => (typeof opt === "string" ? opt : opt.value) + i, - ), - () => (list().length ? null : sigpro.$html("li", { class: "p-2 text-center opacity-50" }, "No results")), - ], - ), - ]); -}; - -var AutocompleteModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Autocomplete: Autocomplete -}); - -/** BADGE */ -const Badge = (props, children) => - sigpro.$html("span", { ...props, class: joinClass("badge", props.class) }, children); - -var BadgeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Badge: Badge -}); - -/** BUTTON */ -const Button = (props, children) => { - const { badge, badgeClass, tooltip, icon, loading, ...rest } = props; - - const btn = sigpro.$html( - "button", - { - ...rest, - // Usamos props.class directamente - class: joinClass("btn", props.class), - disabled: () => val(loading) || val(props.disabled), - }, - [ - () => (val(loading) ? sigpro.$html("span", { class: "loading loading-spinner" }) : null), - icon ? sigpro.$html("span", { class: "mr-1" }, icon) : null, - children, - ] - ); - - let out = btn; - - if (badge) { - out = sigpro.$html("div", { class: "indicator" }, [ - sigpro.$html( - "span", - { class: joinClass("indicator-item badge", badgeClass || "badge-secondary") }, - badge - ), - out, - ]); - } - - return tooltip - ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, out) - : out; -}; - -var ButtonModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Button: Button -}); - -/** CHECKBOX */ -const Checkbox = (props) => { - const { value, tooltip, toggle, label, ...rest } = props; - - const checkEl = sigpro.$html("input", { - ...rest, - type: "checkbox", - class: () => (val(toggle) ? "toggle" : "checkbox"), - checked: value - }); - - const layout = sigpro.$html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - checkEl, - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - ]); - - return tooltip ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; -}; - -var CheckboxModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Checkbox: Checkbox -}); - -/** COLORPICKER */ -const Colorpicker = (props) => { - const { value, label, ...rest } = props; - const isOpen = sigpro.$(false); - - const palette = [ - ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], - ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], - ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], - ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], - ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], - ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], - ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], - ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"], - ]; - - const getColor = () => val(value) || "#000000"; - - return sigpro.$html("div", { class: "relative w-fit" }, [ - sigpro.$html( - "button", - { - type: "button", - class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }, - [ - sigpro.$html("div", { - class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", - style: () => `background-color: ${getColor()}`, - }), - label ? sigpro.$html("span", { class: "opacity-80" }, label) : null, - ], - ), - - sigpro.$if(isOpen, () => - sigpro.$html( - "div", - { - class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - sigpro.$html( - "div", - { class: "grid grid-cols-8 gap-1" }, - palette.map((c) => - sigpro.$html("button", { - type: "button", - style: `background-color: ${c}`, - class: () => { - const active = getColor().toLowerCase() === c.toLowerCase(); - return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; - }, - onclick: () => { - if (typeof value === "function") value(c); - isOpen(false); - }, - }), - ), - ), - ], - ), - ), - - sigpro.$if(isOpen, () => - sigpro.$html("div", { - class: "fixed inset-0 z-[100]", - onclick: () => isOpen(false), - }), - ), - ]); -}; - -var ColorpickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Colorpicker: Colorpicker -}); - -/** DATEPICKER */ -const Datepicker = (props) => { - const { value, range, label, placeholder, hour = false, ...rest } = props; - - const isOpen = sigpro.$(false); - const internalDate = sigpro.$(new Date()); - const hoverDate = sigpro.$(null); - const startHour = sigpro.$(0); - const endHour = sigpro.$(0); - const isRangeMode = () => val(range) === true; - - const now = new Date(); - const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; - - const formatDate = (d) => { - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, "0"); - const day = String(d.getDate()).padStart(2, "0"); - return `${year}-${month}-${day}`; - }; - - const selectDate = (date) => { - const dateStr = formatDate(date); - const current = val(value); - - if (isRangeMode()) { - if (!current?.start || (current.start && current.end)) { - if (typeof value === "function") { - value({ - start: dateStr, - end: null, - ...(hour && { startHour: startHour() }), - }); - } - } else { - const start = current.start; - if (typeof value === "function") { - const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; - if (hour) { - newValue.startHour = current.startHour || startHour(); - newValue.endHour = current.endHour || endHour(); - } - value(newValue); - } - isOpen(false); - } - } else { - if (typeof value === "function") { - value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); - } - isOpen(false); - } - }; - - const displayValue = sigpro.$(() => { - const v = val(value); - if (!v) return ""; - if (typeof v === "string") { - if (hour && v.includes("T")) return v.replace("T", " "); - return v; - } - if (v.start && v.end) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; - return `${startStr} - ${endStr}`; - } - if (v.start) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - return `${startStr}...`; - } - return ""; - }); - - const move = (m) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); - }; - - const moveYear = (y) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); - }; - - const HourSlider = ({ value: hVal, onChange }) => { - return sigpro.$html("div", { class: "flex-1" }, [ - sigpro.$html("div", { class: "flex gap-2 items-center" }, [ - sigpro.$html("input", { - type: "range", - min: 0, - max: 23, - value: hVal, - class: "range range-xs flex-1", - oninput: (e) => { - const newHour = parseInt(e.target.value); - onChange(newHour); - }, - }), - sigpro.$html("span", { class: "text-sm font-mono min-w-[48px] text-center" }, - () => String(val(hVal)).padStart(2, "0") + ":00" - ), - ]), - ]); - }; - - return sigpro.$html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), - value: displayValue, - readonly: true, - icon: sigpro.$html("img", { src: iconCalendar, class: "opacity-40" }), - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }), - - sigpro.$if(isOpen, () => - sigpro.$html( - "div", - { - class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - sigpro.$html("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - sigpro.$html("div", { class: "flex gap-0.5" }, [ - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, - sigpro.$html("img", { src: iconLLeft, class: "opacity-40" }) - ), - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, - sigpro.$html("img", { src: iconLeft, class: "opacity-40" }) - ), - ]), - sigpro.$html("span", { class: "font-bold uppercase flex-1 text-center" }, [ - () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }), - ]), - sigpro.$html("div", { class: "flex gap-0.5" }, [ - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, - sigpro.$html("img", { src: iconRight, class: "opacity-40" }) - ), - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, - sigpro.$html("img", { src: iconRRight, class: "opacity-40" }) - ), - ]), - ]), - - sigpro.$html("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => sigpro.$html("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), - () => { - const d = internalDate(); - const year = d.getFullYear(); - const month = d.getMonth(); - const firstDay = new Date(year, month, 1).getDay(); - const offset = firstDay === 0 ? 6 : firstDay - 1; - const daysInMonth = new Date(year, month + 1, 0).getDate(); - - const nodes = []; - for (let i = 0; i < offset; i++) nodes.push(sigpro.$html("div")); - - for (let i = 1; i <= daysInMonth; i++) { - const date = new Date(year, month, i); - const dStr = formatDate(date); - - nodes.push( - sigpro.$html( - "button", - { - type: "button", - class: () => { - const v = val(value); - const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; - let inRange = false; - - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { - inRange = (dStr > start && dStr <= h) || (dStr < start && dStr >= h); - } else if (v.end) { - inRange = dStr > start && dStr < v.end; - } - } - - const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; - const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; - const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; - - return `${base} ${state} ${today}`; - }, - onmouseenter: () => { if (isRangeMode()) hoverDate(dStr); }, - onclick: () => selectDate(date), - }, - [i.toString()], - ), - ); - } - return nodes; - }, - ]), - - hour ? sigpro.$html("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() - ? sigpro.$html("div", { class: "flex gap-4" }, [ - HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal?.start) value({ ...currentVal, startHour: newHour }); - }, - }), - HourSlider({ - value: endHour, - onChange: (newHour) => { - endHour(newHour); - const currentVal = val(value); - if (currentVal?.end) value({ ...currentVal, endHour: newHour }); - }, - }), - ]) - : HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal && typeof currentVal === "string" && currentVal.includes("-")) { - value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); - } - }, - }), - ]) : null, - ], - ), - ), - - sigpro.$if(isOpen, () => sigpro.$html("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })), - ]); -}; - -var DatepickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Datepicker: Datepicker -}); - -/** DRAWER */ -const Drawer = (props) => - sigpro.$html("div", { class: joinClass("drawer", props.class) }, [ - sigpro.$html("input", { - id: props.id, - type: "checkbox", - class: "drawer-toggle", - checked: props.open, - }), - sigpro.$html("div", { class: "drawer-content" }, props.content), - sigpro.$html("div", { class: "drawer-side" }, [ - sigpro.$html("label", { for: props.id, class: "drawer-overlay", onclick: () => props.open?.(false) }), - sigpro.$html("div", { class: "min-h-full bg-base-200 w-80" }, props.side), - ]), - ]); - -var DrawerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Drawer: Drawer -}); - -const Dropdown = (props, children) => { - const { label, icon, items, ...rest } = props; - - const renderContent = () => { - if (items) { - const source = typeof items === "function" ? items : () => items; - return sigpro.$html("ul", { - tabindex: 0, - class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" - }, [ - sigpro.$for(source, (item) => - sigpro.$html("li", {}, [ - sigpro.$html("a", { - class: item.class || "", - onclick: (e) => { - if (item.onclick) item.onclick(e); - if (document.activeElement) document.activeElement.blur(); - } - }, [ - item.icon ? sigpro.$html("span", {}, item.icon) : null, - sigpro.$html("span", {}, item.label) - ]) - ]) - ) - ]); - } - - return sigpro.$html("div", { - tabindex: 0, - class: "dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300" - }, [ - typeof children === "function" ? children() : children - ]); - }; - - return sigpro.$html("div", { - ...rest, - class: () => `dropdown ${val(props.class) || ""}`, - }, [ - sigpro.$html("div", { - tabindex: 0, - role: "button", - class: "btn m-1 flex items-center gap-2", - }, [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - label ? (typeof label === "function" ? label() : label) : null - ]), - renderContent() - ]); -}; - -var DropdownModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Dropdown: Dropdown -}); - -/** FAB (Floating Action Button) */ -const Fab = (props) => { - const { icon, label, actions = [], position = "bottom-6 right-6", class: className = "", ...rest } = props; - - return sigpro.$html( - "div", - { - ...rest, - class: `fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100] ${className}`, - }, - [ - sigpro.$html( - "div", - { - tabindex: 0, - role: "button", - class: "btn btn-lg btn-circle btn-primary shadow-2xl", - }, - [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - !icon && label ? label : null - ], - ), - - ...val(actions).map((act) => - sigpro.$html("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? sigpro.$html("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - sigpro.$html( - "button", - { - type: "button", - class: `btn btn-circle shadow-lg ${act.class || ""}`, - onclick: (e) => { - e.stopPropagation(); - act.onclick?.(e); - }, - }, - [act.icon ? (typeof act.icon === "function" ? act.icon() : act.icon) : act.text || ""], - ), - ]), - ), - ], - ); -}; - -var FabModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fab: Fab -}); - -/** FIELDSET */ -const Fieldset = (props, children) => - sigpro.$html( - "fieldset", - { - ...props, - class: joinClass("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", props.class), - }, - [ - () => { - const legendText = val(props.legend); - return legendText ? sigpro.$html("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; - }, - children, - ], - ); - -var FieldsetModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fieldset: Fieldset -}); - -/** FILEINPUT */ -const Fileinput = (props) => { - const { tooltip, max = 2, accept = "*", onSelect } = props; - - const selectedFiles = sigpro.$([]); - const isDragging = sigpro.$(false); - const error = sigpro.$(null); - const MAX_BYTES = max * 1024 * 1024; - - const handleFiles = (files) => { - const fileList = Array.from(files); - error(null); - const oversized = fileList.find((f) => f.size > MAX_BYTES); - - if (oversized) { - error(`Máx ${max}MB`); - return; - } - - selectedFiles([...selectedFiles(), ...fileList]); - onSelect?.(selectedFiles()); - }; - - const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); - selectedFiles(updated); - onSelect?.(updated); - }; - - return sigpro.$html("fieldset", { class: "fieldset w-full p-0" }, [ - sigpro.$html( - "div", - { - class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, - "data-tip": tooltip, - }, - [ - sigpro.$html( - "label", - { - class: () => ` - relative flex items-center justify-between w-full h-12 px-4 - border-2 border-dashed rounded-lg cursor-pointer - transition-all duration-200 - ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} - `, - ondragover: (e) => { - e.preventDefault(); - isDragging(true); - }, - ondragleave: () => isDragging(false), - ondrop: (e) => { - e.preventDefault(); - isDragging(false); - handleFiles(e.dataTransfer.files); - }, - }, - [ - sigpro.$html("div", { class: "flex items-center gap-3 w-full" }, [ - sigpro.$html("img", { src: iconUpload, class: "w-5 h-5 opacity-50 shrink-0" }), - sigpro.$html("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - sigpro.$html("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`), - ]), - sigpro.$html("input", { - type: "file", - multiple: true, - accept: accept, - class: "hidden", - onchange: (e) => handleFiles(e.target.files), - }), - ], - ), - ], - ), - - () => (error() ? sigpro.$html("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null), - - sigpro.$if( - () => selectedFiles().length > 0, - () => - sigpro.$html("ul", { class: "mt-2 space-y-1" }, [ - sigpro.$for( - selectedFiles, - (file, index) => - sigpro.$html("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - sigpro.$html("div", { class: "flex items-center gap-2 truncate" }, [ - sigpro.$html("span", { class: "opacity-50" }, "📄"), - sigpro.$html("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - sigpro.$html("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`), - ]), - sigpro.$html( - "button", - { - type: "button", - class: "btn btn-ghost btn-xs btn-circle", - onclick: (e) => { - e.preventDefault(); - e.stopPropagation(); - removeFile(index); - }, - }, - [sigpro.$html("img", { src: iconClose, class: "w-3 h-3 opacity-70" })], - ), - ]), - (file) => file.name + file.lastModified, - ), - ]), - ), - ]); -}; - -var FileinputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fileinput: Fileinput -}); - -/** INDICATOR */ -const Indicator = (props, children) => - sigpro.$html("div", { class: joinClass("indicator", props.class) }, [ - children, - sigpro.$html("span", { class: joinClass("indicator-item badge", props.badgeClass) }, props.badge), - ]); - -var IndicatorModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Indicator: Indicator -}); - -/** LIST */ -const List = (props) => { - const { - items, - header, - render, - keyFn = (item, index) => index, - class: className, - ...rest - } = props; - - const listItems = sigpro.$for( - items, - (item, index) => sigpro.$html("li", { class: "list-row" }, [render(item, index)]), - keyFn - ); - - return sigpro.$html( - "ul", - { - ...rest, - class: joinClass("list bg-base-100 rounded-box shadow-md", className), - }, - header ? [sigpro.$if(header, () => sigpro.$html("li", { class: "p-4 pb-2 text-xs opacity-60" }, [val(header)])), listItems] : listItems - ); -}; - -var ListModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - List: List -}); - -/** LOADING (Overlay Component) */ -const Loading = (props) => { - // Se espera un signal props.$show para controlar la visibilidad - return sigpro.$if(props.$show, () => - sigpro.$html("div", { - class: "fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30" - }, [ - sigpro.$html("span", { class: "loading loading-spinner loading-lg text-primary" }), - ]), - ); -}; - -var LoadingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Loading: Loading -}); - -/** MENU */ -const Menu = (props) => { - const renderItems = (items) => - sigpro.$for( - () => items || [], - (it) => - sigpro.$html("li", {}, [ - it.children - ? sigpro.$html("details", { open: it.open }, [ - sigpro.$html("summary", {}, [it.icon && sigpro.$html("span", { class: "mr-2" }, it.icon), it.label]), - sigpro.$html("ul", {}, renderItems(it.children)), - ]) - : sigpro.$html("a", { class: () => (val(it.active) ? "active" : ""), onclick: it.onclick }, [ - it.icon && sigpro.$html("span", { class: "mr-2" }, it.icon), - it.label, - ]), - ]), - (it, i) => it.label || i, - ); - - return sigpro.$html("ul", { ...props, class: joinClass("menu bg-base-200 rounded-box", props.class) }, renderItems(props.items)); -}; - -var MenuModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Menu: Menu -}); - -/** MODAL REACTIVO NATIVO */ -const Modal = (props, children) => { - const { title, buttons, open, ...rest } = props; - const dialogRef = { current: null }; - - // Sincronizamos la señal con los métodos nativos del navegador - sigpro.$watch(() => { - const dialog = dialogRef.current; - if (!dialog) return; - - if (open()) { - // Solo abrimos si no está ya abierto (evita bucles) - if (!dialog.open) dialog.showModal(); - } else { - if (dialog.open) dialog.close(); - } - }); - - const close = (e) => { - if (e && e.preventDefault) e.preventDefault(); - open(false); - }; - - return sigpro.$html("dialog", { - ...rest, - ref: dialogRef, - class: "modal", - // Importante: Si el usuario pulsa ESC, actualizamos la señal - oncancel: () => open(false) - }, [ - sigpro.$html("div", { class: "modal-box" }, [ - title ? sigpro.$html("h3", { class: "text-lg font-bold mb-4" }, title) : null, - sigpro.$html("div", { class: "py-2" }, [ - typeof children === "function" ? children() : children - ]), - sigpro.$html("div", { class: "modal-action flex gap-2" }, [ - ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "button", onclick: close }, tt("close")()), - ]), - ]), - // Backdrop nativo que sincroniza con la señal - sigpro.$html("form", { - method: "dialog", - class: "modal-backdrop", - onsubmit: close - }, [ - sigpro.$html("button", {}, "close") - ]) - ]); -}; - -var ModalModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Modal: Modal -}); - -/** NAVBAR */ -const Navbar = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("navbar bg-base-100 shadow-sm px-4", props.class) }, children); - -var NavbarModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Navbar: Navbar -}); - -/** RADIO */ -const Radio = (props) => { - const { label, tooltip, value, inputValue, name, ...rest } = props; - - const radioEl = sigpro.$html("input", { - ...rest, - type: "radio", - name: name, - class: joinClass("radio", props.class), - checked: () => val(value) === inputValue, - onclick: () => { - if (typeof value === "function") value(inputValue); - }, - }); - - if (!label && !tooltip) return radioEl; - - return sigpro.$html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - radioEl, - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - ]); -}; - -var RadioModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Radio: Radio -}); - -/** RANGE */ -const Range = (props) => { - const { label, tooltip, value, ...rest } = props; - - const rangeEl = sigpro.$html("input", { - ...rest, - type: "range", - class: joinClass("range", props.class), - value: value, - disabled: () => val(props.disabled) - }); - - if (!label && !tooltip) return rangeEl; - - const layout = sigpro.$html("div", { class: "flex flex-col gap-2" }, [ - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - rangeEl - ]); - - return tooltip ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; -}; - -var RangeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Range: Range -}); - -/** RATING */ -const Rating = (props) => { - const { value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; - const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - - return sigpro.$html( - "div", - { - ...rest, - class: () => `rating ${val(readonly) ? "pointer-events-none" : ""} ${props.class || ""}`, - }, - Array.from({ length: val(count) }, (_, i) => { - const starValue = i + 1; - return sigpro.$html("input", { - type: "radio", - name: ratingGroup, - class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, - onchange: () => { - if (!val(readonly)) { - if (typeof onchange === "function") { - onchange(starValue); - } - else if (typeof value === "function") { - value(starValue); - } - } - }, - }); - }) - ); -}; - -var RatingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Rating: Rating -}); - -/** SELECT */ -const Select = (props) => { - const { label, options, value, ...rest } = props; - - const selectEl = sigpro.$html( - "select", - { - ...rest, - class: joinClass("select select-bordered w-full", props.class), - value: value - }, - sigpro.$for( - () => val(options) || [], - (opt) => - sigpro.$html( - "option", - { - value: opt.value, - $selected: () => String(val(value)) === String(opt.value), - }, - opt.label, - ), - (opt) => opt.value, - ), - ); - - if (!label) return selectEl; - - return sigpro.$html("label", { class: "fieldset-label flex flex-col gap-1" }, [ - sigpro.$html("span", {}, label), - selectEl - ]); -}; - -var SelectModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Select: Select -}); - -/** STACK */ -const Stack = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("stack", props.class) }, children); - -var StackModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stack: Stack -}); - -/** STAT */ -const Stat = (props) => - sigpro.$html("div", { ...props, class: joinClass("stat", props.class) }, [ - props.icon && sigpro.$html("div", { class: "stat-figure text-secondary" }, props.icon), - props.label && sigpro.$html("div", { class: "stat-title" }, props.label), - sigpro.$html("div", { class: "stat-value" }, () => val(props.value) ?? props.value), - props.desc && sigpro.$html("div", { class: "stat-desc" }, props.desc), - ]); - -var StatModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stat: Stat -}); - -/** SWAP */ -const Swap = (props) => - sigpro.$html("label", { class: joinClass("swap", props.class) }, [ - sigpro.$html("input", { - type: "checkbox", - checked: props.value - }), - sigpro.$html("div", { class: "swap-on" }, props.on), - sigpro.$html("div", { class: "swap-off" }, props.off), - ]); - -var SwapModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Swap: Swap -}); - -/** TABLE */ -const Table = (props) => { - const { - items = [], - columns = [], - keyFn, - zebra = false, - pinRows = false, - empty = tt("nodata")(), - ...rest - } = props; - - const tableClass = () => joinClass( - "table", - `${val(zebra) ? "table-zebra" : ""} ${val(pinRows) ? "table-pin-rows" : ""} ${props.class || ""}` - ); - - return sigpro.$html("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - sigpro.$html("table", { ...rest, class: tableClass }, [ - sigpro.$html("thead", {}, [ - sigpro.$html("tr", {}, - columns.map(col => sigpro.$html("th", { class: col.class || "" }, col.label)) - ) - ]), - sigpro.$html("tbody", {}, [ - sigpro.$for(items, (item, index) => { - return sigpro.$html("tr", { class: "hover" }, - columns.map(col => { - const cellContent = () => { - if (col.render) return col.render(item, index); - const value = item[col.key]; - return val(value); - }; - return sigpro.$html("td", { class: col.class || "" }, [cellContent]); - }) - ); - }, keyFn || ((item, idx) => item.id || idx)), - - sigpro.$if(() => val(items).length === 0, () => - sigpro.$html("tr", {}, [ - sigpro.$html("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) - ]) - ]) - ) - ]), - sigpro.$if(() => columns.some(c => c.footer), () => - sigpro.$html("tfoot", {}, [ - sigpro.$html("tr", {}, - columns.map(col => sigpro.$html("th", {}, col.footer || "")) - ) - ]) - ) - ]) - ]); -}; - -var TableModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Table: Table -}); - -/** TABS */ -const Tabs = (props) => { - const { items, ...rest } = props; - const itemsSignal = typeof items === "function" ? items : () => items || []; - - return sigpro.$html("div", { ...rest, class: "flex flex-col gap-4 w-full" }, [ - sigpro.$html( - "div", - { - role: "tablist", - class: joinClass("tabs tabs-box", props.class), - }, - sigpro.$for( - itemsSignal, - (it) => - sigpro.$html( - "a", - { - role: "tab", - class: () => joinClass( - "tab", - val(it.active) && "tab-active", - val(it.disabled) && "tab-disabled", - it.tip && "tooltip" - ), - "data-tip": it.tip, - onclick: (e) => !val(it.disabled) && it.onclick?.(e), - }, - it.label, - ), - (t) => t.label, - ), - ), - () => { - const active = itemsSignal().find((it) => val(it.active)); - if (!active) return null; - const content = val(active.content); - return sigpro.$html("div", { class: "p-4" }, [ - typeof content === "function" ? content() : content - ]); - }, - ]); -}; - -var TabsModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tabs: Tabs -}); - -/** TIMELINE */ -const Timeline = (props) => { - const { items = [], vertical = true, compact = false, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - return sigpro.$html( - "ul", - { - ...rest, - class: () => - `timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${ - val(compact) ? "timeline-compact" : "" - } ${props.class || ""}`, - }, - [ - sigpro.$for( - items, - (item, i) => { - const isFirst = i === 0; - const isLast = i === val(items).length - 1; - const itemType = item.type || "success"; - const renderSlot = (content) => (typeof content === "function" ? content() : content); - - return sigpro.$html("li", { class: "flex-1" }, [ - !isFirst ? sigpro.$html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - sigpro.$html("div", { class: "timeline-start" }, [renderSlot(item.title)]), - sigpro.$html("div", { class: "timeline-middle" }, [ - sigpro.$html("img", { - src: icons[itemType] || item.icon || icons.success, - class: "w-4 h-4 object-contain mx-1", - alt: itemType, - }), - ]), - sigpro.$html("div", { class: "timeline-end timeline-box shadow-sm" }, [renderSlot(item.detail)]), - !isLast ? sigpro.$html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - ]); - }, - (item, i) => item.id || i, - ), - ], - ); -}; - -var TimelineModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Timeline: Timeline -}); - -/** TOAST (Imperative Function) */ -const Toast = (message, type = "alert-success", duration = 3500) => { - let container = document.getElementById("sigpro-toast-container"); - - // Crear el contenedor global si no existe - if (!container) { - container = sigpro.$html("div", { - id: "sigpro-toast-container", - class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none", - }); - document.body.appendChild(container); - } - - const toastHost = sigpro.$html("div", { style: "display: contents" }); - container.appendChild(toastHost); - - let timeoutId; - - const close = () => { - clearTimeout(timeoutId); - const el = toastHost.firstElementChild; - if (el && !el.classList.contains("opacity-0")) { - el.classList.add("translate-x-full", "opacity-0"); - setTimeout(() => { - instance.destroy(); - toastHost.remove(); - // Limpiar el contenedor si ya no hay más toasts - if (!container.hasChildNodes()) container.remove(); - }, 300); - } else { - instance.destroy(); - toastHost.remove(); - } - }; - - const ToastComponent = () => { - const el = sigpro.$html( - "div", - { - class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`, - }, - [ - sigpro.$html("span", {}, [typeof message === "function" ? message() : message]), - Button({ class: "btn-xs btn-circle btn-ghost", onclick: close }, "✕") - ], - ); - - // Animación de entrada - requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); - return el; - }; - - const instance = sigpro.$mount(ToastComponent, toastHost); - - if (duration > 0) { - timeoutId = setTimeout(close, duration); - } - - return close; -}; - -var ToastModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Toast: Toast -}); - -/** TOOLTIP */ -const Tooltip = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("tooltip", props.class), "data-tip": props.tip }, children); - -var TooltipModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tooltip: Tooltip -}); - -const Components = { - ...AccordionModule, - ...AlertModule, - ...AutocompleteModule, - ...BadgeModule, - ...ButtonModule, - ...CheckboxModule, - ...ColorpickerModule, - ...DatepickerModule, - ...DrawerModule, - ...DropdownModule, - ...FabModule, - ...FieldsetModule, - ...FileinputModule, - ...IndicatorModule, - ...InputModule, - ...ListModule, - ...LoadingModule, - ...MenuModule, - ...ModalModule, - ...NavbarModule, - ...RadioModule, - ...RangeModule, - ...RatingModule, - ...SelectModule, - ...StackModule, - ...StatModule, - ...SwapModule, - ...TableModule, - ...TabsModule, - ...TimelineModule, - ...ToastModule, - ...TooltipModule -}; - -var index = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("🚀 SigproUI"); - } -}; - -var Components$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion, - Alert: Alert, - Autocomplete: Autocomplete, - Badge: Badge, - Button: Button, - Checkbox: Checkbox, - Colorpicker: Colorpicker, - Datepicker: Datepicker, - Drawer: Drawer, - Dropdown: Dropdown, - Fab: Fab, - Fieldset: Fieldset, - Fileinput: Fileinput, - Indicator: Indicator, - Input: Input, - List: List, - Loading: Loading, - Menu: Menu, - Modal: Modal, - Navbar: Navbar, - Radio: Radio, - Range: Range, - Rating: Rating, - Select: Select, - Stack: Stack, - Stat: Stat, - Swap: Swap, - Table: Table, - Tabs: Tabs, - Timeline: Timeline, - Toast: Toast, - Tooltip: Tooltip, - default: index -}); - -/** - * SigproUI - Entry Point - */ - - -const SigproUI = { - ...Components$1, - Icons, - Utils, - tt, - - install: (target = (typeof window !== 'undefined' ? window : {})) => { - Object.entries(Components$1).forEach(([name, component]) => { - target[name] = component; - }); - - target.Icons = Icons; - target.Utils = Utils; - target.tt = tt; - - console.log("🌟 SigproUI"); - } -}; - -if (typeof window !== 'undefined') { - SigproUI.install(window); -} - -exports.Accordion = Accordion; -exports.Alert = Alert; -exports.Autocomplete = Autocomplete; -exports.Badge = Badge; -exports.Button = Button; -exports.Checkbox = Checkbox; -exports.Colorpicker = Colorpicker; -exports.Datepicker = Datepicker; -exports.Drawer = Drawer; -exports.Dropdown = Dropdown; -exports.Fab = Fab; -exports.Fieldset = Fieldset; -exports.Fileinput = Fileinput; -exports.Indicator = Indicator; -exports.Input = Input; -exports.List = List; -exports.Loading = Loading; -exports.Menu = Menu; -exports.Modal = Modal; -exports.Navbar = Navbar; -exports.Radio = Radio; -exports.Range = Range; -exports.Rating = Rating; -exports.Select = Select; -exports.Stack = Stack; -exports.Stat = Stat; -exports.Swap = Swap; -exports.Table = Table; -exports.Tabs = Tabs; -exports.Timeline = Timeline; -exports.Toast = Toast; -exports.Tooltip = Tooltip; -exports.default = SigproUI; -exports.icon123 = icon123; -exports.iconAbc = iconAbc; -exports.iconCalendar = iconCalendar; -exports.iconClose = iconClose; -exports.iconError = iconError; -exports.iconHide = iconHide; -exports.iconInfo = iconInfo; -exports.iconLLeft = iconLLeft; -exports.iconLeft = iconLeft; -exports.iconLock = iconLock; -exports.iconMail = iconMail; -exports.iconRRight = iconRRight; -exports.iconRight = iconRight; -exports.iconShow = iconShow; -exports.iconSuccess = iconSuccess; -exports.iconUpload = iconUpload; -exports.iconWarning = iconWarning; -exports.joinClass = joinClass; -exports.tt = tt; -exports.val = val; diff --git a/dist/sigpro-ui.esm.js b/dist/sigpro-ui.esm.js deleted file mode 100644 index 5bc61bf..0000000 --- a/dist/sigpro-ui.esm.js +++ /dev/null @@ -1,1668 +0,0 @@ -import { $html, $, $for, $if, $watch, $mount } from 'sigpro'; - -const val = t => typeof t === "function" ? t() : t; - -const joinClass = (t, l) => typeof l === "function" - ? () => `${t} ${l() || ""}`.trim() - : `${t} ${l || ""}`.trim(); - -var Utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - joinClass: joinClass, - val: val -}); - -/** ACCORDION */ -const Accordion = (props, children) => { - const { title, name, open, ...rest } = props; - - return $html( - "div", - { - ...rest, - class: joinClass("collapse collapse-arrow bg-base-200 mb-2", props.class), - }, - [ - $html("input", { - type: name ? "radio" : "checkbox", - name: name, - checked: open - }), - $html("div", { class: "collapse-title text-xl font-medium" }, title), - $html("div", { class: "collapse-content" }, children), - ], - ); -}; - -var AccordionModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion -}); - -const iconShow = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg=="; -const iconHide = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC"; -const iconClose = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg=="; -const iconCalendar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC"; -const iconLock = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII="; -const iconAbc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg=="; -const icon123 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg=="; -const iconMail = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC"; -const iconInfo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC"; -const iconSuccess = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg=="; -const iconError = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC"; -const iconWarning = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII="; -const iconLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg=="; -const iconRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg=="; -const iconLLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg=="; -const iconRRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII="; -const iconUpload = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC"; - -var Icons = /*#__PURE__*/Object.freeze({ - __proto__: null, - icon123: icon123, - iconAbc: iconAbc, - iconCalendar: iconCalendar, - iconClose: iconClose, - iconError: iconError, - iconHide: iconHide, - iconInfo: iconInfo, - iconLLeft: iconLLeft, - iconLeft: iconLeft, - iconLock: iconLock, - iconMail: iconMail, - iconRRight: iconRRight, - iconRight: iconRight, - iconShow: iconShow, - iconSuccess: iconSuccess, - iconUpload: iconUpload, - iconWarning: iconWarning -}); - -/** ALERT */ -const Alert = (props, children) => { - const { type = "info", soft = true, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - const typeClass = () => { - const t = val(type); - const map = { - info: "alert-info", - success: "alert-success", - warning: "alert-warning", - error: "alert-error", - }; - return map[t] || t; - }; - - const content = children || props.message; - - return $html( - "div", - { - ...rest, - role: "alert", - class: () => `alert ${typeClass()} ${val(soft) ? "alert-soft" : ""} ${props.class || ""}`, - }, - [ - $html("img", { - src: icons[val(type)] || icons.info, - class: "w-4 h-4 object-contain", - alt: val(type), - }), - $html("div", { class: "flex-1" }, [ - $html("span", {}, [typeof content === "function" ? content() : content]) - ]), - props.actions ? $html("div", { class: "flex-none" }, [ - typeof props.actions === "function" ? props.actions() : props.actions - ]) : null, - ], - ); -}; - -var AlertModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Alert: Alert -}); - -const i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } -}; - -const currentLocale = $("es"); - -const tt = t => () => i18n[currentLocale()][t] || t; - -/** INPUT */ -const Input = (props) => { - const { label, tip, value, error, isSearch, icon, type = "text", ...rest } = props; - const isPassword = type === "password"; - const visible = $(false); - - const iconsByType = { - text: iconAbc, - password: iconLock, - date: iconCalendar, - number: icon123, - email: iconMail, - }; - - const inputEl = $html("input", { - ...rest, - type: () => (isPassword ? (visible() ? "text" : "password") : type), - placeholder: props.placeholder || label || (isSearch ? tt("search")() : " "), - class: joinClass("grow order-2 focus:outline-none", props.class), - value: value, - oninput: (e) => props.oninput?.(e), - disabled: () => val(props.disabled), - }); - - const leftIcon = icon ? icon : iconsByType[type] ? $html("img", { src: iconsByType[type], class: "opacity-50", alt: type }) : null; - - return $html( - "label", - { - class: () => joinClass("input input-bordered floating-label flex items-center gap-2 w-full relative", val(error) ? "input-error" : ""), - }, - [ - leftIcon ? $html("div", { class: "order-1 shrink-0" }, leftIcon) : null, - label ? $html("span", { class: "text-base-content/60 order-0" }, label) : null, - inputEl, - isPassword - ? $html( - "button", - { - type: "button", - class: "order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100", - onclick: (e) => { - e.preventDefault(); - visible(!visible()); - }, - }, - () => - $html("img", { - class: "w-5 h-5", - src: visible() ? iconShow : iconHide, - }), - ) - : null, - tip - ? $html( - "div", - { class: "tooltip tooltip-left order-4", "data-tip": tip }, - $html("span", { class: "badge badge-ghost badge-xs cursor-help" }, "?"), - ) - : null, - () => (val(error) ? $html("span", { class: "text-error text-[10px] absolute -bottom-5 left-2" }, val(error)) : null), - ], - ); -}; - -var InputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Input: Input -}); - -/** AUTOCOMPLETE */ -const Autocomplete = (props) => { - const { options = [], value, onSelect, label, placeholder, ...rest } = props; - - const query = $(val(value) || ""); - const isOpen = $(false); - const cursor = $(-1); - - const list = $(() => { - const q = query().toLowerCase(); - const data = val(options) || []; - return q - ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) - : data; - }); - - const pick = (opt) => { - const valStr = typeof opt === "string" ? opt : opt.value; - const labelStr = typeof opt === "string" ? opt : opt.label; - - query(labelStr); - if (typeof value === "function") value(valStr); - onSelect?.(opt); - - isOpen(false); - cursor(-1); - }; - - const nav = (e) => { - const items = list(); - if (e.key === "ArrowDown") { - e.preventDefault(); - isOpen(true); - cursor(Math.min(cursor() + 1, items.length - 1)); - } else if (e.key === "ArrowUp") { - e.preventDefault(); - cursor(Math.max(cursor() - 1, 0)); - } else if (e.key === "Enter" && cursor() >= 0) { - e.preventDefault(); - pick(items[cursor()]); - } else if (e.key === "Escape") { - isOpen(false); - } - }; - - return $html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || tt("search")(), - value: query, - onfocus: () => isOpen(true), - onblur: () => setTimeout(() => isOpen(false), 150), - onkeydown: nav, - oninput: (e) => { - const v = e.target.value; - query(v); - if (typeof value === "function") value(v); - isOpen(true); - cursor(-1); - }, - ...rest, - }), - $html( - "ul", - { - class: "absolute left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", - style: () => (isOpen() && list().length ? "display:block" : "display:none"), - }, - [ - $for( - list, - (opt, i) => - $html("li", {}, [ - $html( - "a", - { - class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, - onclick: () => pick(opt), - onmouseenter: () => cursor(i), - }, - typeof opt === "string" ? opt : opt.label, - ), - ]), - (opt, i) => (typeof opt === "string" ? opt : opt.value) + i, - ), - () => (list().length ? null : $html("li", { class: "p-2 text-center opacity-50" }, "No results")), - ], - ), - ]); -}; - -var AutocompleteModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Autocomplete: Autocomplete -}); - -/** BADGE */ -const Badge = (props, children) => - $html("span", { ...props, class: joinClass("badge", props.class) }, children); - -var BadgeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Badge: Badge -}); - -/** BUTTON */ -const Button = (props, children) => { - const { badge, badgeClass, tooltip, icon, loading, ...rest } = props; - - const btn = $html( - "button", - { - ...rest, - // Usamos props.class directamente - class: joinClass("btn", props.class), - disabled: () => val(loading) || val(props.disabled), - }, - [ - () => (val(loading) ? $html("span", { class: "loading loading-spinner" }) : null), - icon ? $html("span", { class: "mr-1" }, icon) : null, - children, - ] - ); - - let out = btn; - - if (badge) { - out = $html("div", { class: "indicator" }, [ - $html( - "span", - { class: joinClass("indicator-item badge", badgeClass || "badge-secondary") }, - badge - ), - out, - ]); - } - - return tooltip - ? $html("div", { class: "tooltip", "data-tip": tooltip }, out) - : out; -}; - -var ButtonModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Button: Button -}); - -/** CHECKBOX */ -const Checkbox = (props) => { - const { value, tooltip, toggle, label, ...rest } = props; - - const checkEl = $html("input", { - ...rest, - type: "checkbox", - class: () => (val(toggle) ? "toggle" : "checkbox"), - checked: value - }); - - const layout = $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - checkEl, - label ? $html("span", { class: "label-text" }, label) : null, - ]); - - return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; -}; - -var CheckboxModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Checkbox: Checkbox -}); - -/** COLORPICKER */ -const Colorpicker = (props) => { - const { value, label, ...rest } = props; - const isOpen = $(false); - - const palette = [ - ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], - ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], - ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], - ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], - ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], - ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], - ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], - ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"], - ]; - - const getColor = () => val(value) || "#000000"; - - return $html("div", { class: "relative w-fit" }, [ - $html( - "button", - { - type: "button", - class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }, - [ - $html("div", { - class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", - style: () => `background-color: ${getColor()}`, - }), - label ? $html("span", { class: "opacity-80" }, label) : null, - ], - ), - - $if(isOpen, () => - $html( - "div", - { - class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - $html( - "div", - { class: "grid grid-cols-8 gap-1" }, - palette.map((c) => - $html("button", { - type: "button", - style: `background-color: ${c}`, - class: () => { - const active = getColor().toLowerCase() === c.toLowerCase(); - return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; - }, - onclick: () => { - if (typeof value === "function") value(c); - isOpen(false); - }, - }), - ), - ), - ], - ), - ), - - $if(isOpen, () => - $html("div", { - class: "fixed inset-0 z-[100]", - onclick: () => isOpen(false), - }), - ), - ]); -}; - -var ColorpickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Colorpicker: Colorpicker -}); - -/** DATEPICKER */ -const Datepicker = (props) => { - const { value, range, label, placeholder, hour = false, ...rest } = props; - - const isOpen = $(false); - const internalDate = $(new Date()); - const hoverDate = $(null); - const startHour = $(0); - const endHour = $(0); - const isRangeMode = () => val(range) === true; - - const now = new Date(); - const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; - - const formatDate = (d) => { - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, "0"); - const day = String(d.getDate()).padStart(2, "0"); - return `${year}-${month}-${day}`; - }; - - const selectDate = (date) => { - const dateStr = formatDate(date); - const current = val(value); - - if (isRangeMode()) { - if (!current?.start || (current.start && current.end)) { - if (typeof value === "function") { - value({ - start: dateStr, - end: null, - ...(hour && { startHour: startHour() }), - }); - } - } else { - const start = current.start; - if (typeof value === "function") { - const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; - if (hour) { - newValue.startHour = current.startHour || startHour(); - newValue.endHour = current.endHour || endHour(); - } - value(newValue); - } - isOpen(false); - } - } else { - if (typeof value === "function") { - value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); - } - isOpen(false); - } - }; - - const displayValue = $(() => { - const v = val(value); - if (!v) return ""; - if (typeof v === "string") { - if (hour && v.includes("T")) return v.replace("T", " "); - return v; - } - if (v.start && v.end) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; - return `${startStr} - ${endStr}`; - } - if (v.start) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - return `${startStr}...`; - } - return ""; - }); - - const move = (m) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); - }; - - const moveYear = (y) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); - }; - - const HourSlider = ({ value: hVal, onChange }) => { - return $html("div", { class: "flex-1" }, [ - $html("div", { class: "flex gap-2 items-center" }, [ - $html("input", { - type: "range", - min: 0, - max: 23, - value: hVal, - class: "range range-xs flex-1", - oninput: (e) => { - const newHour = parseInt(e.target.value); - onChange(newHour); - }, - }), - $html("span", { class: "text-sm font-mono min-w-[48px] text-center" }, - () => String(val(hVal)).padStart(2, "0") + ":00" - ), - ]), - ]); - }; - - return $html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), - value: displayValue, - readonly: true, - icon: $html("img", { src: iconCalendar, class: "opacity-40" }), - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }), - - $if(isOpen, () => - $html( - "div", - { - class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - $html("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - $html("div", { class: "flex gap-0.5" }, [ - $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, - $html("img", { src: iconLLeft, class: "opacity-40" }) - ), - $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, - $html("img", { src: iconLeft, class: "opacity-40" }) - ), - ]), - $html("span", { class: "font-bold uppercase flex-1 text-center" }, [ - () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }), - ]), - $html("div", { class: "flex gap-0.5" }, [ - $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, - $html("img", { src: iconRight, class: "opacity-40" }) - ), - $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, - $html("img", { src: iconRRight, class: "opacity-40" }) - ), - ]), - ]), - - $html("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => $html("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), - () => { - const d = internalDate(); - const year = d.getFullYear(); - const month = d.getMonth(); - const firstDay = new Date(year, month, 1).getDay(); - const offset = firstDay === 0 ? 6 : firstDay - 1; - const daysInMonth = new Date(year, month + 1, 0).getDate(); - - const nodes = []; - for (let i = 0; i < offset; i++) nodes.push($html("div")); - - for (let i = 1; i <= daysInMonth; i++) { - const date = new Date(year, month, i); - const dStr = formatDate(date); - - nodes.push( - $html( - "button", - { - type: "button", - class: () => { - const v = val(value); - const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; - let inRange = false; - - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { - inRange = (dStr > start && dStr <= h) || (dStr < start && dStr >= h); - } else if (v.end) { - inRange = dStr > start && dStr < v.end; - } - } - - const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; - const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; - const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; - - return `${base} ${state} ${today}`; - }, - onmouseenter: () => { if (isRangeMode()) hoverDate(dStr); }, - onclick: () => selectDate(date), - }, - [i.toString()], - ), - ); - } - return nodes; - }, - ]), - - hour ? $html("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() - ? $html("div", { class: "flex gap-4" }, [ - HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal?.start) value({ ...currentVal, startHour: newHour }); - }, - }), - HourSlider({ - value: endHour, - onChange: (newHour) => { - endHour(newHour); - const currentVal = val(value); - if (currentVal?.end) value({ ...currentVal, endHour: newHour }); - }, - }), - ]) - : HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal && typeof currentVal === "string" && currentVal.includes("-")) { - value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); - } - }, - }), - ]) : null, - ], - ), - ), - - $if(isOpen, () => $html("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })), - ]); -}; - -var DatepickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Datepicker: Datepicker -}); - -/** DRAWER */ -const Drawer = (props) => - $html("div", { class: joinClass("drawer", props.class) }, [ - $html("input", { - id: props.id, - type: "checkbox", - class: "drawer-toggle", - checked: props.open, - }), - $html("div", { class: "drawer-content" }, props.content), - $html("div", { class: "drawer-side" }, [ - $html("label", { for: props.id, class: "drawer-overlay", onclick: () => props.open?.(false) }), - $html("div", { class: "min-h-full bg-base-200 w-80" }, props.side), - ]), - ]); - -var DrawerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Drawer: Drawer -}); - -const Dropdown = (props, children) => { - const { label, icon, items, ...rest } = props; - - const renderContent = () => { - if (items) { - const source = typeof items === "function" ? items : () => items; - return $html("ul", { - tabindex: 0, - class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" - }, [ - $for(source, (item) => - $html("li", {}, [ - $html("a", { - class: item.class || "", - onclick: (e) => { - if (item.onclick) item.onclick(e); - if (document.activeElement) document.activeElement.blur(); - } - }, [ - item.icon ? $html("span", {}, item.icon) : null, - $html("span", {}, item.label) - ]) - ]) - ) - ]); - } - - return $html("div", { - tabindex: 0, - class: "dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300" - }, [ - typeof children === "function" ? children() : children - ]); - }; - - return $html("div", { - ...rest, - class: () => `dropdown ${val(props.class) || ""}`, - }, [ - $html("div", { - tabindex: 0, - role: "button", - class: "btn m-1 flex items-center gap-2", - }, [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - label ? (typeof label === "function" ? label() : label) : null - ]), - renderContent() - ]); -}; - -var DropdownModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Dropdown: Dropdown -}); - -/** FAB (Floating Action Button) */ -const Fab = (props) => { - const { icon, label, actions = [], position = "bottom-6 right-6", class: className = "", ...rest } = props; - - return $html( - "div", - { - ...rest, - class: `fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100] ${className}`, - }, - [ - $html( - "div", - { - tabindex: 0, - role: "button", - class: "btn btn-lg btn-circle btn-primary shadow-2xl", - }, - [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - !icon && label ? label : null - ], - ), - - ...val(actions).map((act) => - $html("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? $html("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - $html( - "button", - { - type: "button", - class: `btn btn-circle shadow-lg ${act.class || ""}`, - onclick: (e) => { - e.stopPropagation(); - act.onclick?.(e); - }, - }, - [act.icon ? (typeof act.icon === "function" ? act.icon() : act.icon) : act.text || ""], - ), - ]), - ), - ], - ); -}; - -var FabModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fab: Fab -}); - -/** FIELDSET */ -const Fieldset = (props, children) => - $html( - "fieldset", - { - ...props, - class: joinClass("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", props.class), - }, - [ - () => { - const legendText = val(props.legend); - return legendText ? $html("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; - }, - children, - ], - ); - -var FieldsetModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fieldset: Fieldset -}); - -/** FILEINPUT */ -const Fileinput = (props) => { - const { tooltip, max = 2, accept = "*", onSelect } = props; - - const selectedFiles = $([]); - const isDragging = $(false); - const error = $(null); - const MAX_BYTES = max * 1024 * 1024; - - const handleFiles = (files) => { - const fileList = Array.from(files); - error(null); - const oversized = fileList.find((f) => f.size > MAX_BYTES); - - if (oversized) { - error(`Máx ${max}MB`); - return; - } - - selectedFiles([...selectedFiles(), ...fileList]); - onSelect?.(selectedFiles()); - }; - - const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); - selectedFiles(updated); - onSelect?.(updated); - }; - - return $html("fieldset", { class: "fieldset w-full p-0" }, [ - $html( - "div", - { - class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, - "data-tip": tooltip, - }, - [ - $html( - "label", - { - class: () => ` - relative flex items-center justify-between w-full h-12 px-4 - border-2 border-dashed rounded-lg cursor-pointer - transition-all duration-200 - ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} - `, - ondragover: (e) => { - e.preventDefault(); - isDragging(true); - }, - ondragleave: () => isDragging(false), - ondrop: (e) => { - e.preventDefault(); - isDragging(false); - handleFiles(e.dataTransfer.files); - }, - }, - [ - $html("div", { class: "flex items-center gap-3 w-full" }, [ - $html("img", { src: iconUpload, class: "w-5 h-5 opacity-50 shrink-0" }), - $html("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - $html("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`), - ]), - $html("input", { - type: "file", - multiple: true, - accept: accept, - class: "hidden", - onchange: (e) => handleFiles(e.target.files), - }), - ], - ), - ], - ), - - () => (error() ? $html("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null), - - $if( - () => selectedFiles().length > 0, - () => - $html("ul", { class: "mt-2 space-y-1" }, [ - $for( - selectedFiles, - (file, index) => - $html("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - $html("div", { class: "flex items-center gap-2 truncate" }, [ - $html("span", { class: "opacity-50" }, "📄"), - $html("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - $html("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`), - ]), - $html( - "button", - { - type: "button", - class: "btn btn-ghost btn-xs btn-circle", - onclick: (e) => { - e.preventDefault(); - e.stopPropagation(); - removeFile(index); - }, - }, - [$html("img", { src: iconClose, class: "w-3 h-3 opacity-70" })], - ), - ]), - (file) => file.name + file.lastModified, - ), - ]), - ), - ]); -}; - -var FileinputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fileinput: Fileinput -}); - -/** INDICATOR */ -const Indicator = (props, children) => - $html("div", { class: joinClass("indicator", props.class) }, [ - children, - $html("span", { class: joinClass("indicator-item badge", props.badgeClass) }, props.badge), - ]); - -var IndicatorModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Indicator: Indicator -}); - -/** LIST */ -const List = (props) => { - const { - items, - header, - render, - keyFn = (item, index) => index, - class: className, - ...rest - } = props; - - const listItems = $for( - items, - (item, index) => $html("li", { class: "list-row" }, [render(item, index)]), - keyFn - ); - - return $html( - "ul", - { - ...rest, - class: joinClass("list bg-base-100 rounded-box shadow-md", className), - }, - header ? [$if(header, () => $html("li", { class: "p-4 pb-2 text-xs opacity-60" }, [val(header)])), listItems] : listItems - ); -}; - -var ListModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - List: List -}); - -/** LOADING (Overlay Component) */ -const Loading = (props) => { - // Se espera un signal props.$show para controlar la visibilidad - return $if(props.$show, () => - $html("div", { - class: "fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30" - }, [ - $html("span", { class: "loading loading-spinner loading-lg text-primary" }), - ]), - ); -}; - -var LoadingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Loading: Loading -}); - -/** MENU */ -const Menu = (props) => { - const renderItems = (items) => - $for( - () => items || [], - (it) => - $html("li", {}, [ - it.children - ? $html("details", { open: it.open }, [ - $html("summary", {}, [it.icon && $html("span", { class: "mr-2" }, it.icon), it.label]), - $html("ul", {}, renderItems(it.children)), - ]) - : $html("a", { class: () => (val(it.active) ? "active" : ""), onclick: it.onclick }, [ - it.icon && $html("span", { class: "mr-2" }, it.icon), - it.label, - ]), - ]), - (it, i) => it.label || i, - ); - - return $html("ul", { ...props, class: joinClass("menu bg-base-200 rounded-box", props.class) }, renderItems(props.items)); -}; - -var MenuModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Menu: Menu -}); - -/** MODAL REACTIVO NATIVO */ -const Modal = (props, children) => { - const { title, buttons, open, ...rest } = props; - const dialogRef = { current: null }; - - // Sincronizamos la señal con los métodos nativos del navegador - $watch(() => { - const dialog = dialogRef.current; - if (!dialog) return; - - if (open()) { - // Solo abrimos si no está ya abierto (evita bucles) - if (!dialog.open) dialog.showModal(); - } else { - if (dialog.open) dialog.close(); - } - }); - - const close = (e) => { - if (e && e.preventDefault) e.preventDefault(); - open(false); - }; - - return $html("dialog", { - ...rest, - ref: dialogRef, - class: "modal", - // Importante: Si el usuario pulsa ESC, actualizamos la señal - oncancel: () => open(false) - }, [ - $html("div", { class: "modal-box" }, [ - title ? $html("h3", { class: "text-lg font-bold mb-4" }, title) : null, - $html("div", { class: "py-2" }, [ - typeof children === "function" ? children() : children - ]), - $html("div", { class: "modal-action flex gap-2" }, [ - ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "button", onclick: close }, tt("close")()), - ]), - ]), - // Backdrop nativo que sincroniza con la señal - $html("form", { - method: "dialog", - class: "modal-backdrop", - onsubmit: close - }, [ - $html("button", {}, "close") - ]) - ]); -}; - -var ModalModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Modal: Modal -}); - -/** NAVBAR */ -const Navbar = (props, children) => - $html("div", { ...props, class: joinClass("navbar bg-base-100 shadow-sm px-4", props.class) }, children); - -var NavbarModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Navbar: Navbar -}); - -/** RADIO */ -const Radio = (props) => { - const { label, tooltip, value, inputValue, name, ...rest } = props; - - const radioEl = $html("input", { - ...rest, - type: "radio", - name: name, - class: joinClass("radio", props.class), - checked: () => val(value) === inputValue, - onclick: () => { - if (typeof value === "function") value(inputValue); - }, - }); - - if (!label && !tooltip) return radioEl; - - return $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - radioEl, - label ? $html("span", { class: "label-text" }, label) : null, - ]); -}; - -var RadioModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Radio: Radio -}); - -/** RANGE */ -const Range = (props) => { - const { label, tooltip, value, ...rest } = props; - - const rangeEl = $html("input", { - ...rest, - type: "range", - class: joinClass("range", props.class), - value: value, - disabled: () => val(props.disabled) - }); - - if (!label && !tooltip) return rangeEl; - - const layout = $html("div", { class: "flex flex-col gap-2" }, [ - label ? $html("span", { class: "label-text" }, label) : null, - rangeEl - ]); - - return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; -}; - -var RangeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Range: Range -}); - -/** RATING */ -const Rating = (props) => { - const { value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; - const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - - return $html( - "div", - { - ...rest, - class: () => `rating ${val(readonly) ? "pointer-events-none" : ""} ${props.class || ""}`, - }, - Array.from({ length: val(count) }, (_, i) => { - const starValue = i + 1; - return $html("input", { - type: "radio", - name: ratingGroup, - class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, - onchange: () => { - if (!val(readonly)) { - if (typeof onchange === "function") { - onchange(starValue); - } - else if (typeof value === "function") { - value(starValue); - } - } - }, - }); - }) - ); -}; - -var RatingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Rating: Rating -}); - -/** SELECT */ -const Select = (props) => { - const { label, options, value, ...rest } = props; - - const selectEl = $html( - "select", - { - ...rest, - class: joinClass("select select-bordered w-full", props.class), - value: value - }, - $for( - () => val(options) || [], - (opt) => - $html( - "option", - { - value: opt.value, - $selected: () => String(val(value)) === String(opt.value), - }, - opt.label, - ), - (opt) => opt.value, - ), - ); - - if (!label) return selectEl; - - return $html("label", { class: "fieldset-label flex flex-col gap-1" }, [ - $html("span", {}, label), - selectEl - ]); -}; - -var SelectModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Select: Select -}); - -/** STACK */ -const Stack = (props, children) => - $html("div", { ...props, class: joinClass("stack", props.class) }, children); - -var StackModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stack: Stack -}); - -/** STAT */ -const Stat = (props) => - $html("div", { ...props, class: joinClass("stat", props.class) }, [ - props.icon && $html("div", { class: "stat-figure text-secondary" }, props.icon), - props.label && $html("div", { class: "stat-title" }, props.label), - $html("div", { class: "stat-value" }, () => val(props.value) ?? props.value), - props.desc && $html("div", { class: "stat-desc" }, props.desc), - ]); - -var StatModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stat: Stat -}); - -/** SWAP */ -const Swap = (props) => - $html("label", { class: joinClass("swap", props.class) }, [ - $html("input", { - type: "checkbox", - checked: props.value - }), - $html("div", { class: "swap-on" }, props.on), - $html("div", { class: "swap-off" }, props.off), - ]); - -var SwapModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Swap: Swap -}); - -/** TABLE */ -const Table = (props) => { - const { - items = [], - columns = [], - keyFn, - zebra = false, - pinRows = false, - empty = tt("nodata")(), - ...rest - } = props; - - const tableClass = () => joinClass( - "table", - `${val(zebra) ? "table-zebra" : ""} ${val(pinRows) ? "table-pin-rows" : ""} ${props.class || ""}` - ); - - return $html("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - $html("table", { ...rest, class: tableClass }, [ - $html("thead", {}, [ - $html("tr", {}, - columns.map(col => $html("th", { class: col.class || "" }, col.label)) - ) - ]), - $html("tbody", {}, [ - $for(items, (item, index) => { - return $html("tr", { class: "hover" }, - columns.map(col => { - const cellContent = () => { - if (col.render) return col.render(item, index); - const value = item[col.key]; - return val(value); - }; - return $html("td", { class: col.class || "" }, [cellContent]); - }) - ); - }, keyFn || ((item, idx) => item.id || idx)), - - $if(() => val(items).length === 0, () => - $html("tr", {}, [ - $html("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) - ]) - ]) - ) - ]), - $if(() => columns.some(c => c.footer), () => - $html("tfoot", {}, [ - $html("tr", {}, - columns.map(col => $html("th", {}, col.footer || "")) - ) - ]) - ) - ]) - ]); -}; - -var TableModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Table: Table -}); - -/** TABS */ -const Tabs = (props) => { - const { items, ...rest } = props; - const itemsSignal = typeof items === "function" ? items : () => items || []; - - return $html("div", { ...rest, class: "flex flex-col gap-4 w-full" }, [ - $html( - "div", - { - role: "tablist", - class: joinClass("tabs tabs-box", props.class), - }, - $for( - itemsSignal, - (it) => - $html( - "a", - { - role: "tab", - class: () => joinClass( - "tab", - val(it.active) && "tab-active", - val(it.disabled) && "tab-disabled", - it.tip && "tooltip" - ), - "data-tip": it.tip, - onclick: (e) => !val(it.disabled) && it.onclick?.(e), - }, - it.label, - ), - (t) => t.label, - ), - ), - () => { - const active = itemsSignal().find((it) => val(it.active)); - if (!active) return null; - const content = val(active.content); - return $html("div", { class: "p-4" }, [ - typeof content === "function" ? content() : content - ]); - }, - ]); -}; - -var TabsModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tabs: Tabs -}); - -/** TIMELINE */ -const Timeline = (props) => { - const { items = [], vertical = true, compact = false, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - return $html( - "ul", - { - ...rest, - class: () => - `timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${ - val(compact) ? "timeline-compact" : "" - } ${props.class || ""}`, - }, - [ - $for( - items, - (item, i) => { - const isFirst = i === 0; - const isLast = i === val(items).length - 1; - const itemType = item.type || "success"; - const renderSlot = (content) => (typeof content === "function" ? content() : content); - - return $html("li", { class: "flex-1" }, [ - !isFirst ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - $html("div", { class: "timeline-start" }, [renderSlot(item.title)]), - $html("div", { class: "timeline-middle" }, [ - $html("img", { - src: icons[itemType] || item.icon || icons.success, - class: "w-4 h-4 object-contain mx-1", - alt: itemType, - }), - ]), - $html("div", { class: "timeline-end timeline-box shadow-sm" }, [renderSlot(item.detail)]), - !isLast ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - ]); - }, - (item, i) => item.id || i, - ), - ], - ); -}; - -var TimelineModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Timeline: Timeline -}); - -/** TOAST (Imperative Function) */ -const Toast = (message, type = "alert-success", duration = 3500) => { - let container = document.getElementById("sigpro-toast-container"); - - // Crear el contenedor global si no existe - if (!container) { - container = $html("div", { - id: "sigpro-toast-container", - class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none", - }); - document.body.appendChild(container); - } - - const toastHost = $html("div", { style: "display: contents" }); - container.appendChild(toastHost); - - let timeoutId; - - const close = () => { - clearTimeout(timeoutId); - const el = toastHost.firstElementChild; - if (el && !el.classList.contains("opacity-0")) { - el.classList.add("translate-x-full", "opacity-0"); - setTimeout(() => { - instance.destroy(); - toastHost.remove(); - // Limpiar el contenedor si ya no hay más toasts - if (!container.hasChildNodes()) container.remove(); - }, 300); - } else { - instance.destroy(); - toastHost.remove(); - } - }; - - const ToastComponent = () => { - const el = $html( - "div", - { - class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`, - }, - [ - $html("span", {}, [typeof message === "function" ? message() : message]), - Button({ class: "btn-xs btn-circle btn-ghost", onclick: close }, "✕") - ], - ); - - // Animación de entrada - requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); - return el; - }; - - const instance = $mount(ToastComponent, toastHost); - - if (duration > 0) { - timeoutId = setTimeout(close, duration); - } - - return close; -}; - -var ToastModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Toast: Toast -}); - -/** TOOLTIP */ -const Tooltip = (props, children) => - $html("div", { ...props, class: joinClass("tooltip", props.class), "data-tip": props.tip }, children); - -var TooltipModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tooltip: Tooltip -}); - -const Components = { - ...AccordionModule, - ...AlertModule, - ...AutocompleteModule, - ...BadgeModule, - ...ButtonModule, - ...CheckboxModule, - ...ColorpickerModule, - ...DatepickerModule, - ...DrawerModule, - ...DropdownModule, - ...FabModule, - ...FieldsetModule, - ...FileinputModule, - ...IndicatorModule, - ...InputModule, - ...ListModule, - ...LoadingModule, - ...MenuModule, - ...ModalModule, - ...NavbarModule, - ...RadioModule, - ...RangeModule, - ...RatingModule, - ...SelectModule, - ...StackModule, - ...StatModule, - ...SwapModule, - ...TableModule, - ...TabsModule, - ...TimelineModule, - ...ToastModule, - ...TooltipModule -}; - -var index = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("🚀 SigproUI"); - } -}; - -var Components$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion, - Alert: Alert, - Autocomplete: Autocomplete, - Badge: Badge, - Button: Button, - Checkbox: Checkbox, - Colorpicker: Colorpicker, - Datepicker: Datepicker, - Drawer: Drawer, - Dropdown: Dropdown, - Fab: Fab, - Fieldset: Fieldset, - Fileinput: Fileinput, - Indicator: Indicator, - Input: Input, - List: List, - Loading: Loading, - Menu: Menu, - Modal: Modal, - Navbar: Navbar, - Radio: Radio, - Range: Range, - Rating: Rating, - Select: Select, - Stack: Stack, - Stat: Stat, - Swap: Swap, - Table: Table, - Tabs: Tabs, - Timeline: Timeline, - Toast: Toast, - Tooltip: Tooltip, - default: index -}); - -/** - * SigproUI - Entry Point - */ - - -const SigproUI = { - ...Components$1, - Icons, - Utils, - tt, - - install: (target = (typeof window !== 'undefined' ? window : {})) => { - Object.entries(Components$1).forEach(([name, component]) => { - target[name] = component; - }); - - target.Icons = Icons; - target.Utils = Utils; - target.tt = tt; - - console.log("🌟 SigproUI"); - } -}; - -if (typeof window !== 'undefined') { - SigproUI.install(window); -} - -export { Accordion, Alert, Autocomplete, Badge, Button, Checkbox, Colorpicker, Datepicker, Drawer, Dropdown, Fab, Fieldset, Fileinput, Indicator, Input, List, Loading, Menu, Modal, Navbar, Radio, Range, Rating, Select, Stack, Stat, Swap, Table, Tabs, Timeline, Toast, Tooltip, SigproUI as default, icon123, iconAbc, iconCalendar, iconClose, iconError, iconHide, iconInfo, iconLLeft, iconLeft, iconLock, iconMail, iconRRight, iconRight, iconShow, iconSuccess, iconUpload, iconWarning, joinClass, tt, val }; diff --git a/dist/sigpro-ui.js b/dist/sigpro-ui.js new file mode 100644 index 0000000..5ea4848 --- /dev/null +++ b/dist/sigpro-ui.js @@ -0,0 +1,1776 @@ +(() => { + var __defProp = Object.defineProperty; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __moduleCache = /* @__PURE__ */ new WeakMap; + var __toCommonJS = (from) => { + var entry = __moduleCache.get(from), desc; + if (entry) + return entry; + entry = __defProp({}, "__esModule", { value: true }); + if (from && typeof from === "object" || typeof from === "function") + __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, { + get: () => from[key], + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + })); + __moduleCache.set(from, entry); + return entry; + }; + var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { + get: all[name], + enumerable: true, + configurable: true, + set: (newValue) => all[name] = () => newValue + }); + }; + + // index.js + var exports_sigpro_ui = {}; + __export(exports_sigpro_ui, { + val: () => val, + ui: () => ui, + tt: () => tt, + joinClass: () => joinClass, + getIcon: () => getIcon, + Tooltip: () => Tooltip, + Toast: () => Toast, + Timeline: () => Timeline, + Tabs: () => Tabs, + Table: () => Table, + Swap: () => Swap, + Stat: () => Stat, + Stack: () => Stack, + Select: () => Select, + Rating: () => Rating, + Range: () => Range, + Radio: () => Radio, + Navbar: () => Navbar, + Modal: () => Modal, + Menu: () => Menu, + Loading: () => Loading, + List: () => List, + Input: () => Input, + Indicator: () => Indicator, + Fileinput: () => Fileinput, + Fieldset: () => Fieldset, + Fab: () => Fab, + Dropdown: () => Dropdown, + Drawer: () => Drawer, + Datepicker: () => Datepicker, + Colorpicker: () => Colorpicker, + Checkbox: () => Checkbox, + Button: () => Button, + Badge: () => Badge, + Autocomplete: () => Autocomplete, + Alert: () => Alert, + Accordion: () => Accordion + }); + + // node_modules/sigpro/sigpro/index.js + var activeEffect = null; + var currentOwner = null; + var effectQueue = new Set; + var isFlushing = false; + var MOUNTED_NODES = new WeakMap; + var flush = () => { + if (isFlushing) + return; + isFlushing = true; + while (effectQueue.size > 0) { + const sorted = Array.from(effectQueue).sort((a, b) => (a.depth || 0) - (b.depth || 0)); + effectQueue.clear(); + for (const eff of sorted) + if (!eff._deleted) + eff(); + } + isFlushing = false; + }; + var track = (subs) => { + if (activeEffect && !activeEffect._deleted) { + subs.add(activeEffect); + activeEffect._deps.add(subs); + } + }; + var trigger = (subs) => { + for (const eff of subs) { + if (eff === activeEffect || eff._deleted) + continue; + if (eff._isComputed) { + eff.markDirty(); + if (eff._subs) + trigger(eff._subs); + } else { + effectQueue.add(eff); + } + } + if (!isFlushing) + queueMicrotask(flush); + }; + var sweep = (node) => { + if (node._cleanups) { + node._cleanups.forEach((f) => f()); + node._cleanups.clear(); + } + node.childNodes?.forEach(sweep); + }; + var _view = (fn) => { + const cleanups = new Set; + const prev = currentOwner; + const container = document.createElement("div"); + container.style.display = "contents"; + currentOwner = { cleanups }; + try { + const res = fn({ onCleanup: (f) => cleanups.add(f) }); + const process = (n) => { + if (!n) + return; + if (n._isRuntime) { + cleanups.add(n.destroy); + container.appendChild(n.container); + } else if (Array.isArray(n)) + n.forEach(process); + else + container.appendChild(n instanceof Node ? n : document.createTextNode(String(n))); + }; + process(res); + } finally { + currentOwner = prev; + } + return { + _isRuntime: true, + container, + destroy: () => { + cleanups.forEach((f) => f()); + sweep(container); + container.remove(); + } + }; + }; + var $ = (initial, key = null) => { + if (typeof initial === "function") { + const subs2 = new Set; + let cached, dirty = true; + const effect = () => { + if (effect._deleted) + return; + effect._deps.forEach((s) => s.delete(effect)); + effect._deps.clear(); + const prev = activeEffect; + activeEffect = effect; + try { + const val = initial(); + if (!Object.is(cached, val) || dirty) { + cached = val; + dirty = false; + trigger(subs2); + } + } finally { + activeEffect = prev; + } + }; + effect._deps = new Set; + effect._isComputed = true; + effect._subs = subs2; + effect._deleted = false; + effect.markDirty = () => dirty = true; + effect.stop = () => { + effect._deleted = true; + effect._deps.forEach((s) => s.delete(effect)); + subs2.clear(); + }; + if (currentOwner) + currentOwner.cleanups.add(effect.stop); + return () => { + if (dirty) + effect(); + track(subs2); + return cached; + }; + } + let value = initial; + if (key) { + try { + const saved = localStorage.getItem(key); + if (saved !== null) + value = JSON.parse(saved); + } catch (e) { + console.warn("SigPro: LocalStorage locked", e); + } + } + const subs = new Set; + return (...args) => { + if (args.length) { + const next = typeof args[0] === "function" ? args[0](value) : args[0]; + if (!Object.is(value, next)) { + value = next; + if (key) + localStorage.setItem(key, JSON.stringify(value)); + trigger(subs); + } + } + track(subs); + return value; + }; + }; + var $watch = (target, fn) => { + const isExplicit = Array.isArray(target); + const callback = isExplicit ? fn : target; + const depsInput = isExplicit ? target : null; + if (typeof callback !== "function") + return () => {}; + const owner = currentOwner; + const runner = () => { + if (runner._deleted) + return; + runner._deps.forEach((s) => s.delete(runner)); + runner._deps.clear(); + runner._cleanups.forEach((c) => c()); + runner._cleanups.clear(); + const prevEffect = activeEffect; + const prevOwner = currentOwner; + activeEffect = runner; + currentOwner = { cleanups: runner._cleanups }; + runner.depth = prevEffect ? prevEffect.depth + 1 : 0; + try { + if (isExplicit) { + activeEffect = null; + callback(); + activeEffect = runner; + depsInput.forEach((d) => typeof d === "function" && d()); + } else { + callback(); + } + } finally { + activeEffect = prevEffect; + currentOwner = prevOwner; + } + }; + runner._deps = new Set; + runner._cleanups = new Set; + runner._deleted = false; + runner.stop = () => { + if (runner._deleted) + return; + runner._deleted = true; + effectQueue.delete(runner); + runner._deps.forEach((s) => s.delete(runner)); + runner._cleanups.forEach((c) => c()); + if (owner) + owner.cleanups.delete(runner.stop); + }; + if (owner) + owner.cleanups.add(runner.stop); + runner(); + return runner.stop; + }; + var $html = (tag, props = {}, content = []) => { + if (props instanceof Node || Array.isArray(props) || typeof props !== "object") { + content = props; + props = {}; + } + const el = document.createElement(tag), _sanitize = (key, val) => (key === "src" || key === "href") && String(val).toLowerCase().includes("javascript:") ? "#" : val; + el._cleanups = new Set; + for (let [key, val] of Object.entries(props)) { + if (key === "ref") { + typeof val === "function" ? val(el) : val.current = el; + continue; + } + const isSignal = typeof val === "function", isInput = ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName), isBindAttr = key === "value" || key === "checked"; + if (isInput && isBindAttr && isSignal) { + el._cleanups.add($watch(() => { + const currentVal = val(); + if (el[key] !== currentVal) + el[key] = currentVal; + })); + const eventName = key === "checked" ? "change" : "input", handler = (event) => val(event.target[key]); + el.addEventListener(eventName, handler); + el._cleanups.add(() => el.removeEventListener(eventName, handler)); + } else if (key.startsWith("on")) { + const eventName = key.slice(2).toLowerCase().split(".")[0], handler = (event) => val(event); + el.addEventListener(eventName, handler); + el._cleanups.add(() => el.removeEventListener(eventName, handler)); + } else if (isSignal) { + el._cleanups.add($watch(() => { + const currentVal = _sanitize(key, val()); + if (key === "class") + el.className = currentVal || ""; + else + currentVal == null ? el.removeAttribute(key) : el.setAttribute(key, currentVal); + })); + } else { + el.setAttribute(key, _sanitize(key, val)); + } + } + const append = (child) => { + if (Array.isArray(child)) + return child.forEach(append); + if (typeof child === "function") { + const marker = document.createTextNode(""); + el.appendChild(marker); + let nodes = []; + el._cleanups.add($watch(() => { + const result = child(), nextNodes = (Array.isArray(result) ? result : [result]).map((item) => item?._isRuntime ? item.container : item instanceof Node ? item : document.createTextNode(item ?? "")); + nodes.forEach((node) => { + sweep(node); + node.remove(); + }); + nextNodes.forEach((node) => marker.parentNode?.insertBefore(node, marker)); + nodes = nextNodes; + })); + } else + el.appendChild(child instanceof Node ? child : document.createTextNode(child ?? "")); + }; + append(content); + return el; + }; + var $if = (condition, thenVal, otherwiseVal = null) => { + const marker = document.createTextNode(""); + const container = $html("div", { style: "display:contents" }, [marker]); + let current = null, last = null; + $watch(() => { + const state = !!(typeof condition === "function" ? condition() : condition); + if (state !== last) { + last = state; + if (current) + current.destroy(); + const branch = state ? thenVal : otherwiseVal; + if (branch) { + current = _view(() => typeof branch === "function" ? branch() : branch); + container.insertBefore(current.container, marker); + } + } + }); + return container; + }; + $if.not = (condition, thenVal, otherwiseVal) => $if(() => !(typeof condition === "function" ? condition() : condition), thenVal, otherwiseVal); + var $for = (source, render, keyFn) => { + const marker = document.createTextNode(""); + const container = $html("div", { style: "display:contents" }, [marker]); + let cache = new Map; + $watch(() => { + const items = (typeof source === "function" ? source() : source) || []; + const newCache = new Map; + const newOrder = []; + for (let i = 0;i < items.length; i++) { + const item = items[i]; + const key = keyFn ? keyFn(item, i) : i; + let run = cache.get(key); + if (!run) { + run = _view(() => render(item, i)); + } else { + cache.delete(key); + } + newCache.set(key, run); + newOrder.push(key); + } + cache.forEach((run) => { + run.destroy(); + run.container.remove(); + }); + let anchor = marker; + for (let i = newOrder.length - 1;i >= 0; i--) { + const run = newCache.get(newOrder[i]); + if (run.container.nextSibling !== anchor) { + container.insertBefore(run.container, anchor); + } + anchor = run.container; + } + cache = newCache; + }); + return container; + }; + var $router = (routes) => { + const sPath = $(window.location.hash.replace(/^#/, "") || "/"); + window.addEventListener("hashchange", () => sPath(window.location.hash.replace(/^#/, "") || "/")); + const outlet = $html("div", { class: "router-outlet" }); + let current = null; + $watch([sPath], async () => { + const path = sPath(); + const route = routes.find((r) => { + const rp = r.path.split("/").filter(Boolean), pp = path.split("/").filter(Boolean); + return rp.length === pp.length && rp.every((p, i) => p.startsWith(":") || p === pp[i]); + }) || routes.find((r) => r.path === "*"); + if (route) { + let comp = route.component; + if (typeof comp === "function" && comp.toString().includes("import")) { + comp = (await comp()).default || await comp(); + } + const params = {}; + route.path.split("/").filter(Boolean).forEach((p, i) => { + if (p.startsWith(":")) + params[p.slice(1)] = path.split("/").filter(Boolean)[i]; + }); + if (current) + current.destroy(); + if ($router.params) + $router.params(params); + current = _view(() => { + try { + return typeof comp === "function" ? comp(params) : comp; + } catch (e) { + return $html("div", { class: "p-4 text-error" }, "Error loading view"); + } + }); + outlet.appendChild(current.container); + } + }); + return outlet; + }; + $router.params = $({}); + $router.to = (path) => window.location.hash = path.replace(/^#?\/?/, "#/"); + $router.back = () => window.history.back(); + $router.path = () => window.location.hash.replace(/^#/, "") || "/"; + var $mount = (component, target) => { + const el = typeof target === "string" ? document.querySelector(target) : target; + if (!el) + return; + if (MOUNTED_NODES.has(el)) + MOUNTED_NODES.get(el).destroy(); + const instance = _view(typeof component === "function" ? component : () => component); + el.replaceChildren(instance.container); + MOUNTED_NODES.set(el, instance); + return instance; + }; + var SigProCore = { $, $watch, $html, $if, $for, $router, $mount }; + if (typeof window !== "undefined") { + const install = (registry) => { + Object.keys(registry).forEach((key) => { + window[key] = registry[key]; + }); + const tags = `div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer address ul ol li dl dt dd a em strong small i b u mark time sub sup pre code blockquote details summary dialog form label input textarea select button option fieldset legend table thead tbody tfoot tr th td caption img video audio canvas svg iframe picture source progress meter`.split(/\s+/); + tags.forEach((tagName) => { + const helperName = tagName.charAt(0).toUpperCase() + tagName.slice(1); + if (!(helperName in window)) { + window[helperName] = (props, content) => $html(tagName, props, content); + } + }); + window.SigPro = Object.freeze(registry); + }; + install(SigProCore); + } + // src/components/index.js + var exports_components = {}; + __export(exports_components, { + default: () => components_default, + Tooltip: () => Tooltip, + Toast: () => Toast, + Timeline: () => Timeline, + Tabs: () => Tabs, + Table: () => Table, + Swap: () => Swap, + Stat: () => Stat, + Stack: () => Stack, + Select: () => Select, + Rating: () => Rating, + Range: () => Range, + Radio: () => Radio, + Navbar: () => Navbar, + Modal: () => Modal, + Menu: () => Menu, + Loading: () => Loading, + List: () => List, + Input: () => Input, + Indicator: () => Indicator, + Fileinput: () => Fileinput, + Fieldset: () => Fieldset, + Fab: () => Fab, + Dropdown: () => Dropdown, + Drawer: () => Drawer, + Datepicker: () => Datepicker, + Colorpicker: () => Colorpicker, + Checkbox: () => Checkbox, + Button: () => Button, + Badge: () => Badge, + Autocomplete: () => Autocomplete, + Alert: () => Alert, + Accordion: () => Accordion + }); + + // src/components/Accordion.js + var exports_Accordion = {}; + __export(exports_Accordion, { + Accordion: () => Accordion + }); + + // src/core/utils.js + var exports_utils = {}; + __export(exports_utils, { + val: () => val, + ui: () => ui, + joinClass: () => joinClass, + getIcon: () => getIcon + }); + var val = (t) => typeof t === "function" ? t() : t; + var joinClass = (t, l) => typeof l === "function" ? () => `${t} ${l() || ""}`.trim() : `${t} ${l || ""}`.trim(); + var ui = (base, str) => { + if (!str) + return base; + const parts = typeof str === "string" ? str.split(" ") : str; + const classes = [base]; + parts.forEach((part) => { + if (part) + classes.push(`${base}-${part}`); + }); + return classes.join(" "); + }; + var getIcon = (icon) => { + if (!icon) + return null; + let position = "left"; + let iconValue = icon; + if (typeof icon === "string") { + const parts = icon.trim().split(/\s+/); + if (parts[parts.length - 1] === "right") { + position = "right"; + iconValue = parts.slice(0, -1).join(" "); + } + } + const spacing = position === "left" ? "mr-1" : "ml-1"; + const element = typeof iconValue === "string" && iconValue.includes("--") ? $html("span", { class: `icon-[${iconValue}]` }) : typeof iconValue === "function" ? iconValue() : $html("span", {}, iconValue); + return $html("span", { class: spacing }, element); + }; + + // src/components/Accordion.js + var Accordion = (props, children) => { + const { title, name, open, ...rest } = props; + return $html("div", { + ...rest, + class: joinClass("collapse collapse-arrow bg-base-200 mb-2", props.class) + }, [ + $html("input", { + type: name ? "radio" : "checkbox", + name, + checked: open + }), + $html("div", { class: "collapse-title text-xl font-medium" }, title), + $html("div", { class: "collapse-content" }, children) + ]); + }; + + // src/components/Alert.js + var exports_Alert = {}; + __export(exports_Alert, { + Alert: () => Alert + }); + + // src/core/icons.js + var iconShow = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg=="; + var iconHide = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC"; + var iconClose = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg=="; + var iconCalendar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC"; + var iconLock = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII="; + var iconAbc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg=="; + var icon123 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg=="; + var iconMail = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC"; + var iconInfo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC"; + var iconSuccess = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg=="; + var iconError = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC"; + var iconWarning = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII="; + var iconLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg=="; + var iconRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg=="; + var iconLLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg=="; + var iconRRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII="; + var iconUpload = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC"; + + // src/components/Alert.js + var Alert = (props, children) => { + const { type = "info", soft = true, ...rest } = props; + const icons = { + info: iconInfo, + success: iconSuccess, + warning: iconWarning, + error: iconError + }; + const typeClass = () => { + const t = val(type); + const map = { + info: "alert-info", + success: "alert-success", + warning: "alert-warning", + error: "alert-error" + }; + return map[t] || t; + }; + const content = children || props.message; + return $html("div", { + ...rest, + role: "alert", + class: () => `alert ${typeClass()} ${val(soft) ? "alert-soft" : ""} ${props.class || ""}` + }, [ + $html("img", { + src: icons[val(type)] || icons.info, + class: "w-4 h-4 object-contain", + alt: val(type) + }), + $html("div", { class: "flex-1" }, [ + $html("span", {}, [typeof content === "function" ? content() : content]) + ]), + props.actions ? $html("div", { class: "flex-none" }, [ + typeof props.actions === "function" ? props.actions() : props.actions + ]) : null + ]); + }; + + // src/components/Autocomplete.js + var exports_Autocomplete = {}; + __export(exports_Autocomplete, { + Autocomplete: () => Autocomplete + }); + + // src/core/i18n.js + var i18n = { + es: { + close: "Cerrar", + confirm: "Confirmar", + cancel: "Cancelar", + search: "Buscar...", + loading: "Cargando...", + nodata: "Sin datos" + }, + en: { + close: "Close", + confirm: "Confirm", + cancel: "Cancel", + search: "Search...", + loading: "Loading...", + nodata: "No data" + } + }; + var currentLocale = $("es"); + var tt = (t) => () => i18n[currentLocale()][t] || t; + + // src/components/Input.js + var exports_Input = {}; + __export(exports_Input, { + Input: () => Input + }); + var Input = (props) => { + const { label, tip, value, error, isSearch, icon, type = "text", ...rest } = props; + const isPassword = type === "password"; + const visible = $(false); + const iconsByType = { + text: iconAbc, + password: iconLock, + date: iconCalendar, + number: icon123, + email: iconMail + }; + const inputEl = $html("input", { + ...rest, + type: () => isPassword ? visible() ? "text" : "password" : type, + placeholder: props.placeholder || label || (isSearch ? tt("search")() : " "), + class: joinClass("grow order-2 focus:outline-none", props.class), + value, + oninput: (e) => props.oninput?.(e), + disabled: () => val(props.disabled) + }); + const leftIcon = icon ? icon : iconsByType[type] ? $html("img", { src: iconsByType[type], class: "opacity-50", alt: type }) : null; + return $html("label", { + class: () => joinClass("input input-bordered floating-label flex items-center gap-2 w-full relative", val(error) ? "input-error" : "") + }, [ + leftIcon ? $html("div", { class: "order-1 shrink-0" }, leftIcon) : null, + label ? $html("span", { class: "text-base-content/60 order-0" }, label) : null, + inputEl, + isPassword ? $html("button", { + type: "button", + class: "order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100", + onclick: (e) => { + e.preventDefault(); + visible(!visible()); + } + }, () => $html("img", { + class: "w-5 h-5", + src: visible() ? iconShow : iconHide + })) : null, + tip ? $html("div", { class: "tooltip tooltip-left order-4", "data-tip": tip }, $html("span", { class: "badge badge-ghost badge-xs cursor-help" }, "?")) : null, + () => val(error) ? $html("span", { class: "text-error text-[10px] absolute -bottom-5 left-2" }, val(error)) : null + ]); + }; + + // src/components/Autocomplete.js + var Autocomplete = (props) => { + const { options = [], value, onSelect, label, placeholder, ...rest } = props; + const query = $(val(value) || ""); + const isOpen = $(false); + const cursor = $(-1); + const list = $(() => { + const q = query().toLowerCase(); + const data = val(options) || []; + return q ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) : data; + }); + const pick = (opt) => { + const valStr = typeof opt === "string" ? opt : opt.value; + const labelStr = typeof opt === "string" ? opt : opt.label; + query(labelStr); + if (typeof value === "function") + value(valStr); + onSelect?.(opt); + isOpen(false); + cursor(-1); + }; + const nav = (e) => { + const items = list(); + if (e.key === "ArrowDown") { + e.preventDefault(); + isOpen(true); + cursor(Math.min(cursor() + 1, items.length - 1)); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + cursor(Math.max(cursor() - 1, 0)); + } else if (e.key === "Enter" && cursor() >= 0) { + e.preventDefault(); + pick(items[cursor()]); + } else if (e.key === "Escape") { + isOpen(false); + } + }; + return $html("div", { class: "relative w-full" }, [ + Input({ + label, + placeholder: placeholder || tt("search")(), + value: query, + onfocus: () => isOpen(true), + onblur: () => setTimeout(() => isOpen(false), 150), + onkeydown: nav, + oninput: (e) => { + const v = e.target.value; + query(v); + if (typeof value === "function") + value(v); + isOpen(true); + cursor(-1); + }, + ...rest + }), + $html("ul", { + class: "absolute left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", + style: () => isOpen() && list().length ? "display:block" : "display:none" + }, [ + $for(list, (opt, i) => $html("li", {}, [ + $html("a", { + class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, + onclick: () => pick(opt), + onmouseenter: () => cursor(i) + }, typeof opt === "string" ? opt : opt.label) + ]), (opt, i) => (typeof opt === "string" ? opt : opt.value) + i), + () => list().length ? null : $html("li", { class: "p-2 text-center opacity-50" }, "No results") + ]) + ]); + }; + + // src/components/Badge.js + var exports_Badge = {}; + __export(exports_Badge, { + Badge: () => Badge + }); + var Badge = (props, children) => $html("span", { ...props, class: joinClass("badge", props.class) }, children); + + // src/components/Button.js + var exports_Button = {}; + __export(exports_Button, { + Button: () => Button + }); + var Button = (props, children) => { + const { badge, badgeClass, tooltip, icon, loading, ...rest } = props; + const btn = $html("button", { + ...rest, + class: joinClass("btn", props.class) + }, [ + () => val(loading) ? $html("span", { class: "loading loading-spinner" }) : null, + icon ? $html("span", { class: "mr-1" }, icon) : null, + children + ]); + let out = btn; + if (badge) { + out = $html("div", { class: "indicator" }, [ + $html("span", { class: joinClass("indicator-item badge", badgeClass || "badge-secondary") }, badge), + out + ]); + } + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, out) : out; + }; + + // src/components/Checkbox.js + var exports_Checkbox = {}; + __export(exports_Checkbox, { + Checkbox: () => Checkbox + }); + var Checkbox = (props) => { + const { value, tooltip, toggle, label, ...rest } = props; + const checkEl = $html("input", { + ...rest, + type: "checkbox", + class: () => val(toggle) ? "toggle" : "checkbox", + checked: value + }); + const layout = $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ + checkEl, + label ? $html("span", { class: "label-text" }, label) : null + ]); + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + }; + + // src/components/Colorpicker.js + var exports_Colorpicker = {}; + __export(exports_Colorpicker, { + Colorpicker: () => Colorpicker + }); + var Colorpicker = (props) => { + const { value, label, ...rest } = props; + const isOpen = $(false); + const palette = [ + ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], + ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], + ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], + ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], + ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], + ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], + ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], + ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"] + ]; + const getColor = () => val(value) || "#000000"; + return $html("div", { class: "relative w-fit" }, [ + $html("button", { + type: "button", + class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", + onclick: (e) => { + e.stopPropagation(); + isOpen(!isOpen()); + }, + ...rest + }, [ + $html("div", { + class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", + style: () => `background-color: ${getColor()}` + }), + label ? $html("span", { class: "opacity-80" }, label) : null + ]), + $if(isOpen, () => $html("div", { + class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", + onclick: (e) => e.stopPropagation() + }, [ + $html("div", { class: "grid grid-cols-8 gap-1" }, palette.map((c) => $html("button", { + type: "button", + style: `background-color: ${c}`, + class: () => { + const active = getColor().toLowerCase() === c.toLowerCase(); + return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 + ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; + }, + onclick: () => { + if (typeof value === "function") + value(c); + isOpen(false); + } + }))) + ])), + $if(isOpen, () => $html("div", { + class: "fixed inset-0 z-[100]", + onclick: () => isOpen(false) + })) + ]); + }; + + // src/components/Datepicker.js + var exports_Datepicker = {}; + __export(exports_Datepicker, { + Datepicker: () => Datepicker + }); + var Datepicker = (props) => { + const { value, range, label, placeholder, hour = false, ...rest } = props; + const isOpen = $(false); + const internalDate = $(new Date); + const hoverDate = $(null); + const startHour = $(0); + const endHour = $(0); + const isRangeMode = () => val(range) === true; + const now = new Date; + const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; + const formatDate = (d) => { + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, "0"); + const day = String(d.getDate()).padStart(2, "0"); + return `${year}-${month}-${day}`; + }; + const selectDate = (date) => { + const dateStr = formatDate(date); + const current = val(value); + if (isRangeMode()) { + if (!current?.start || current.start && current.end) { + if (typeof value === "function") { + value({ + start: dateStr, + end: null, + ...hour && { startHour: startHour() } + }); + } + } else { + const start = current.start; + if (typeof value === "function") { + const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; + if (hour) { + newValue.startHour = current.startHour || startHour(); + newValue.endHour = current.endHour || endHour(); + } + value(newValue); + } + isOpen(false); + } + } else { + if (typeof value === "function") { + value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); + } + isOpen(false); + } + }; + const displayValue = $(() => { + const v = val(value); + if (!v) + return ""; + if (typeof v === "string") { + if (hour && v.includes("T")) + return v.replace("T", " "); + return v; + } + if (v.start && v.end) { + const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + const endStr = hour && v.endHour ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; + return `${startStr} - ${endStr}`; + } + if (v.start) { + const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + return `${startStr}...`; + } + return ""; + }); + const move = (m) => { + const d = internalDate(); + internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); + }; + const moveYear = (y) => { + const d = internalDate(); + internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); + }; + const HourSlider = ({ value: hVal, onChange }) => { + return $html("div", { class: "flex-1" }, [ + $html("div", { class: "flex gap-2 items-center" }, [ + $html("input", { + type: "range", + min: 0, + max: 23, + value: hVal, + class: "range range-xs flex-1", + oninput: (e) => { + const newHour = parseInt(e.target.value); + onChange(newHour); + } + }), + $html("span", { class: "text-sm font-mono min-w-[48px] text-center" }, () => String(val(hVal)).padStart(2, "0") + ":00") + ]) + ]); + }; + return $html("div", { class: "relative w-full" }, [ + Input({ + label, + placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), + value: displayValue, + readonly: true, + icon: $html("img", { src: iconCalendar, class: "opacity-40" }), + onclick: (e) => { + e.stopPropagation(); + isOpen(!isOpen()); + }, + ...rest + }), + $if(isOpen, () => $html("div", { + class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", + onclick: (e) => e.stopPropagation() + }, [ + $html("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ + $html("div", { class: "flex gap-0.5" }, [ + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, $html("img", { src: iconLLeft, class: "opacity-40" })), + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, $html("img", { src: iconLeft, class: "opacity-40" })) + ]), + $html("span", { class: "font-bold uppercase flex-1 text-center" }, [ + () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }) + ]), + $html("div", { class: "flex gap-0.5" }, [ + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, $html("img", { src: iconRight, class: "opacity-40" })), + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, $html("img", { src: iconRRight, class: "opacity-40" })) + ]) + ]), + $html("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ + ...["L", "M", "X", "J", "V", "S", "D"].map((d) => $html("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), + () => { + const d = internalDate(); + const year = d.getFullYear(); + const month = d.getMonth(); + const firstDay = new Date(year, month, 1).getDay(); + const offset = firstDay === 0 ? 6 : firstDay - 1; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + const nodes = []; + for (let i = 0;i < offset; i++) + nodes.push($html("div")); + for (let i = 1;i <= daysInMonth; i++) { + const date = new Date(year, month, i); + const dStr = formatDate(date); + nodes.push($html("button", { + type: "button", + class: () => { + const v = val(value); + const h = hoverDate(); + const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; + const isEnd = v?.end === dStr; + let inRange = false; + if (isRangeMode() && v?.start) { + const start = v.start; + if (!v.end && h) { + inRange = dStr > start && dStr <= h || dStr < start && dStr >= h; + } else if (v.end) { + inRange = dStr > start && dStr < v.end; + } + } + const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; + const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; + const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; + return `${base} ${state} ${today}`; + }, + onmouseenter: () => { + if (isRangeMode()) + hoverDate(dStr); + }, + onclick: () => selectDate(date) + }, [i.toString()])); + } + return nodes; + } + ]), + hour ? $html("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ + isRangeMode() ? $html("div", { class: "flex gap-4" }, [ + HourSlider({ + value: startHour, + onChange: (newHour) => { + startHour(newHour); + const currentVal = val(value); + if (currentVal?.start) + value({ ...currentVal, startHour: newHour }); + } + }), + HourSlider({ + value: endHour, + onChange: (newHour) => { + endHour(newHour); + const currentVal = val(value); + if (currentVal?.end) + value({ ...currentVal, endHour: newHour }); + } + }) + ]) : HourSlider({ + value: startHour, + onChange: (newHour) => { + startHour(newHour); + const currentVal = val(value); + if (currentVal && typeof currentVal === "string" && currentVal.includes("-")) { + value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); + } + } + }) + ]) : null + ])), + $if(isOpen, () => $html("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })) + ]); + }; + + // src/components/Drawer.js + var exports_Drawer = {}; + __export(exports_Drawer, { + Drawer: () => Drawer + }); + var Drawer = (props) => $html("div", { class: joinClass("drawer", props.class) }, [ + $html("input", { + id: props.id, + type: "checkbox", + class: "drawer-toggle", + checked: props.open + }), + $html("div", { class: "drawer-content" }, props.content), + $html("div", { class: "drawer-side" }, [ + $html("label", { for: props.id, class: "drawer-overlay", onclick: () => props.open?.(false) }), + $html("div", { class: "min-h-full bg-base-200 w-80" }, props.side) + ]) + ]); + + // src/components/Dropdown.js + var exports_Dropdown = {}; + __export(exports_Dropdown, { + Dropdown: () => Dropdown + }); + var Dropdown = (props, children) => { + const { label, icon, items, ...rest } = props; + const renderContent = () => { + if (items) { + const source = typeof items === "function" ? items : () => items; + return $html("ul", { + tabindex: 0, + class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" + }, [ + $for(source, (item) => $html("li", {}, [ + $html("a", { + class: item.class || "", + onclick: (e) => { + if (item.onclick) + item.onclick(e); + if (document.activeElement) + document.activeElement.blur(); + } + }, [ + item.icon ? $html("span", {}, item.icon) : null, + $html("span", {}, item.label) + ]) + ])) + ]); + } + return $html("div", { + tabindex: 0, + class: "dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300" + }, [ + typeof children === "function" ? children() : children + ]); + }; + return $html("div", { + ...rest, + class: () => `dropdown ${val(props.class) || ""}` + }, [ + $html("div", { + tabindex: 0, + role: "button", + class: "btn m-1 flex items-center gap-2" + }, [ + icon ? typeof icon === "function" ? icon() : icon : null, + label ? typeof label === "function" ? label() : label : null + ]), + renderContent() + ]); + }; + + // src/components/Fab.js + var exports_Fab = {}; + __export(exports_Fab, { + Fab: () => Fab + }); + var Fab = (props) => { + const { icon, label, actions = [], position = "bottom-6 right-6", class: className = "", ...rest } = props; + return $html("div", { + ...rest, + class: `fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100] ${className}` + }, [ + $html("div", { + tabindex: 0, + role: "button", + class: "btn btn-lg btn-circle btn-primary shadow-2xl" + }, [ + icon ? typeof icon === "function" ? icon() : icon : null, + !icon && label ? label : null + ]), + ...val(actions).map((act) => $html("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ + act.label ? $html("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, + $html("button", { + type: "button", + class: `btn btn-circle shadow-lg ${act.class || ""}`, + onclick: (e) => { + e.stopPropagation(); + act.onclick?.(e); + } + }, [act.icon ? typeof act.icon === "function" ? act.icon() : act.icon : act.text || ""]) + ])) + ]); + }; + + // src/components/Fieldset.js + var exports_Fieldset = {}; + __export(exports_Fieldset, { + Fieldset: () => Fieldset + }); + var Fieldset = (props, children) => $html("fieldset", { + ...props, + class: joinClass("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", props.class) + }, [ + () => { + const legendText = val(props.legend); + return legendText ? $html("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; + }, + children + ]); + + // src/components/Fileinput.js + var exports_Fileinput = {}; + __export(exports_Fileinput, { + Fileinput: () => Fileinput + }); + var Fileinput = (props) => { + const { tooltip, max = 2, accept = "*", onSelect } = props; + const selectedFiles = $([]); + const isDragging = $(false); + const error = $(null); + const MAX_BYTES = max * 1024 * 1024; + const handleFiles = (files) => { + const fileList = Array.from(files); + error(null); + const oversized = fileList.find((f) => f.size > MAX_BYTES); + if (oversized) { + error(`Máx ${max}MB`); + return; + } + selectedFiles([...selectedFiles(), ...fileList]); + onSelect?.(selectedFiles()); + }; + const removeFile = (index) => { + const updated = selectedFiles().filter((_, i) => i !== index); + selectedFiles(updated); + onSelect?.(updated); + }; + return $html("fieldset", { class: "fieldset w-full p-0" }, [ + $html("div", { + class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, + "data-tip": tooltip + }, [ + $html("label", { + class: () => ` + relative flex items-center justify-between w-full h-12 px-4 + border-2 border-dashed rounded-lg cursor-pointer + transition-all duration-200 + ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} + `, + ondragover: (e) => { + e.preventDefault(); + isDragging(true); + }, + ondragleave: () => isDragging(false), + ondrop: (e) => { + e.preventDefault(); + isDragging(false); + handleFiles(e.dataTransfer.files); + } + }, [ + $html("div", { class: "flex items-center gap-3 w-full" }, [ + $html("img", { src: iconUpload, class: "w-5 h-5 opacity-50 shrink-0" }), + $html("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), + $html("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`) + ]), + $html("input", { + type: "file", + multiple: true, + accept, + class: "hidden", + onchange: (e) => handleFiles(e.target.files) + }) + ]) + ]), + () => error() ? $html("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null, + $if(() => selectedFiles().length > 0, () => $html("ul", { class: "mt-2 space-y-1" }, [ + $for(selectedFiles, (file, index) => $html("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ + $html("div", { class: "flex items-center gap-2 truncate" }, [ + $html("span", { class: "opacity-50" }, "\uD83D\uDCC4"), + $html("span", { class: "truncate font-medium max-w-[200px]" }, file.name), + $html("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`) + ]), + $html("button", { + type: "button", + class: "btn btn-ghost btn-xs btn-circle", + onclick: (e) => { + e.preventDefault(); + e.stopPropagation(); + removeFile(index); + } + }, [$html("img", { src: iconClose, class: "w-3 h-3 opacity-70" })]) + ]), (file) => file.name + file.lastModified) + ])) + ]); + }; + + // src/components/Indicator.js + var exports_Indicator = {}; + __export(exports_Indicator, { + Indicator: () => Indicator + }); + var Indicator = (props, children) => $html("div", { class: joinClass("indicator", props.class) }, [ + children, + $html("span", { class: joinClass("indicator-item badge", props.badgeClass) }, props.badge) + ]); + + // src/components/List.js + var exports_List = {}; + __export(exports_List, { + List: () => List + }); + var List = (props) => { + const { + items, + header, + render, + keyFn = (item, index) => index, + class: className, + ...rest + } = props; + const listItems = $for(items, (item, index) => $html("li", { class: "list-row" }, [render(item, index)]), keyFn); + return $html("ul", { + ...rest, + class: joinClass("list bg-base-100 rounded-box shadow-md", className) + }, header ? [$if(header, () => $html("li", { class: "p-4 pb-2 text-xs opacity-60" }, [val(header)])), listItems] : listItems); + }; + + // src/components/Loading.js + var exports_Loading = {}; + __export(exports_Loading, { + Loading: () => Loading + }); + var Loading = (props) => { + return $if(props.$show, () => $html("div", { + class: "fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30" + }, [ + $html("span", { class: "loading loading-spinner loading-lg text-primary" }) + ])); + }; + + // src/components/Menu.js + var exports_Menu = {}; + __export(exports_Menu, { + Menu: () => Menu + }); + var Menu = (props) => { + const renderItems = (items) => $for(() => items || [], (it) => $html("li", {}, [ + it.children ? $html("details", { open: it.open }, [ + $html("summary", {}, [it.icon && $html("span", { class: "mr-2" }, it.icon), it.label]), + $html("ul", {}, renderItems(it.children)) + ]) : $html("a", { class: () => val(it.active) ? "active" : "", onclick: it.onclick }, [ + it.icon && $html("span", { class: "mr-2" }, it.icon), + it.label + ]) + ]), (it, i) => it.label || i); + return $html("ul", { ...props, class: joinClass("menu bg-base-200 rounded-box", props.class) }, renderItems(props.items)); + }; + + // src/components/Modal.js + var exports_Modal = {}; + __export(exports_Modal, { + Modal: () => Modal + }); + var Modal = (props, children) => { + const { title, buttons, open, ...rest } = props; + const dialogRef = { current: null }; + $watch(() => { + const dialog = dialogRef.current; + if (!dialog) + return; + if (open()) { + if (!dialog.open) + dialog.showModal(); + } else { + if (dialog.open) + dialog.close(); + } + }); + const close = (e) => { + if (e && e.preventDefault) + e.preventDefault(); + open(false); + }; + return $html("dialog", { + ...rest, + ref: dialogRef, + class: "modal", + oncancel: () => open(false) + }, [ + $html("div", { class: "modal-box" }, [ + title ? $html("h3", { class: "text-lg font-bold mb-4" }, title) : null, + $html("div", { class: "py-2" }, [ + typeof children === "function" ? children() : children + ]), + $html("div", { class: "modal-action flex gap-2" }, [ + ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), + Button({ type: "button", onclick: close }, tt("close")()) + ]) + ]), + $html("form", { + method: "dialog", + class: "modal-backdrop", + onsubmit: close + }, [ + $html("button", {}, "close") + ]) + ]); + }; + + // src/components/Navbar.js + var exports_Navbar = {}; + __export(exports_Navbar, { + Navbar: () => Navbar + }); + var Navbar = (props, children) => $html("div", { ...props, class: joinClass("navbar bg-base-100 shadow-sm px-4", props.class) }, children); + + // src/components/Radio.js + var exports_Radio = {}; + __export(exports_Radio, { + Radio: () => Radio + }); + var Radio = (props) => { + const { label, tooltip, value, inputValue, name, ...rest } = props; + const radioEl = $html("input", { + ...rest, + type: "radio", + name, + class: joinClass("radio", props.class), + checked: () => val(value) === inputValue, + onclick: () => { + if (typeof value === "function") + value(inputValue); + } + }); + if (!label && !tooltip) + return radioEl; + return $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ + radioEl, + label ? $html("span", { class: "label-text" }, label) : null + ]); + }; + + // src/components/Range.js + var exports_Range = {}; + __export(exports_Range, { + Range: () => Range + }); + var Range = (props) => { + const { label, tooltip, value, ...rest } = props; + const rangeEl = $html("input", { + ...rest, + type: "range", + class: joinClass("range", props.class), + value, + disabled: () => val(props.disabled) + }); + if (!label && !tooltip) + return rangeEl; + const layout = $html("div", { class: "flex flex-col gap-2" }, [ + label ? $html("span", { class: "label-text" }, label) : null, + rangeEl + ]); + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; + }; + + // src/components/Rating.js + var exports_Rating = {}; + __export(exports_Rating, { + Rating: () => Rating + }); + var Rating = (props) => { + const { value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; + const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; + return $html("div", { + ...rest, + class: () => `rating ${val(readonly) ? "pointer-events-none" : ""} ${props.class || ""}` + }, Array.from({ length: val(count) }, (_, i) => { + const starValue = i + 1; + return $html("input", { + type: "radio", + name: ratingGroup, + class: `mask ${mask}`, + checked: () => Math.round(val(value)) === starValue, + onchange: () => { + if (!val(readonly)) { + if (typeof onchange === "function") { + onchange(starValue); + } else if (typeof value === "function") { + value(starValue); + } + } + } + }); + })); + }; + + // src/components/Select.js + var exports_Select = {}; + __export(exports_Select, { + Select: () => Select + }); + var Select = (props) => { + const { label, options, value, ...rest } = props; + const selectEl = $html("select", { + ...rest, + class: joinClass("select select-bordered w-full", props.class), + value + }, $for(() => val(options) || [], (opt) => $html("option", { + value: opt.value, + $selected: () => String(val(value)) === String(opt.value) + }, opt.label), (opt) => opt.value)); + if (!label) + return selectEl; + return $html("label", { class: "fieldset-label flex flex-col gap-1" }, [ + $html("span", {}, label), + selectEl + ]); + }; + + // src/components/Stack.js + var exports_Stack = {}; + __export(exports_Stack, { + Stack: () => Stack + }); + var Stack = (props, children) => $html("div", { ...props, class: joinClass("stack", props.class) }, children); + + // src/components/Stat.js + var exports_Stat = {}; + __export(exports_Stat, { + Stat: () => Stat + }); + var Stat = (props) => $html("div", { ...props, class: joinClass("stat", props.class) }, [ + props.icon && $html("div", { class: "stat-figure text-secondary" }, props.icon), + props.label && $html("div", { class: "stat-title" }, props.label), + $html("div", { class: "stat-value" }, () => val(props.value) ?? props.value), + props.desc && $html("div", { class: "stat-desc" }, props.desc) + ]); + + // src/components/Swap.js + var exports_Swap = {}; + __export(exports_Swap, { + Swap: () => Swap + }); + var Swap = (props) => $html("label", { class: joinClass("swap", props.class) }, [ + $html("input", { + type: "checkbox", + checked: props.value + }), + $html("div", { class: "swap-on" }, props.on), + $html("div", { class: "swap-off" }, props.off) + ]); + + // src/components/Table.js + var exports_Table = {}; + __export(exports_Table, { + Table: () => Table + }); + var Table = (props) => { + const { + items = [], + columns = [], + keyFn, + zebra = false, + pinRows = false, + empty = tt("nodata")(), + ...rest + } = props; + const tableClass = () => joinClass("table", `${val(zebra) ? "table-zebra" : ""} ${val(pinRows) ? "table-pin-rows" : ""} ${props.class || ""}`); + return $html("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ + $html("table", { ...rest, class: tableClass }, [ + $html("thead", {}, [ + $html("tr", {}, columns.map((col) => $html("th", { class: col.class || "" }, col.label))) + ]), + $html("tbody", {}, [ + $for(items, (item, index) => { + return $html("tr", { class: "hover" }, columns.map((col) => { + const cellContent = () => { + if (col.render) + return col.render(item, index); + const value = item[col.key]; + return val(value); + }; + return $html("td", { class: col.class || "" }, [cellContent]); + })); + }, keyFn || ((item, idx) => item.id || idx)), + $if(() => val(items).length === 0, () => $html("tr", {}, [ + $html("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ + val(empty) + ]) + ])) + ]), + $if(() => columns.some((c) => c.footer), () => $html("tfoot", {}, [ + $html("tr", {}, columns.map((col) => $html("th", {}, col.footer || ""))) + ])) + ]) + ]); + }; + + // src/components/Tabs.js + var exports_Tabs = {}; + __export(exports_Tabs, { + Tabs: () => Tabs + }); + var Tabs = (props) => { + const { items, ...rest } = props; + const itemsSignal = typeof items === "function" ? items : () => items || []; + return $html("div", { ...rest, class: "flex flex-col gap-4 w-full" }, [ + $html("div", { + role: "tablist", + class: joinClass("tabs tabs-box", props.class) + }, $for(itemsSignal, (it) => $html("a", { + role: "tab", + class: () => joinClass("tab", val(it.active) && "tab-active", val(it.disabled) && "tab-disabled", it.tip && "tooltip"), + "data-tip": it.tip, + onclick: (e) => !val(it.disabled) && it.onclick?.(e) + }, it.label), (t) => t.label)), + () => { + const active = itemsSignal().find((it) => val(it.active)); + if (!active) + return null; + const content = val(active.content); + return $html("div", { class: "p-4" }, [ + typeof content === "function" ? content() : content + ]); + } + ]); + }; + + // src/components/Timeline.js + var exports_Timeline = {}; + __export(exports_Timeline, { + Timeline: () => Timeline + }); + var Timeline = (props) => { + const { items = [], vertical = true, compact = false, ...rest } = props; + const icons = { + info: iconInfo, + success: iconSuccess, + warning: iconWarning, + error: iconError + }; + return $html("ul", { + ...rest, + class: () => `timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val(compact) ? "timeline-compact" : ""} ${props.class || ""}` + }, [ + $for(items, (item, i) => { + const isFirst = i === 0; + const isLast = i === val(items).length - 1; + const itemType = item.type || "success"; + const renderSlot = (content) => typeof content === "function" ? content() : content; + return $html("li", { class: "flex-1" }, [ + !isFirst ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null, + $html("div", { class: "timeline-start" }, [renderSlot(item.title)]), + $html("div", { class: "timeline-middle" }, [ + $html("img", { + src: icons[itemType] || item.icon || icons.success, + class: "w-4 h-4 object-contain mx-1", + alt: itemType + }) + ]), + $html("div", { class: "timeline-end timeline-box shadow-sm" }, [renderSlot(item.detail)]), + !isLast ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null + ]); + }, (item, i) => item.id || i) + ]); + }; + + // src/components/Toast.js + var exports_Toast = {}; + __export(exports_Toast, { + Toast: () => Toast + }); + var Toast = (message, type = "alert-success", duration = 3500) => { + let container = document.getElementById("sigpro-toast-container"); + if (!container) { + container = $html("div", { + id: "sigpro-toast-container", + class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none" + }); + document.body.appendChild(container); + } + const toastHost = $html("div", { style: "display: contents" }); + container.appendChild(toastHost); + let timeoutId; + const close = () => { + clearTimeout(timeoutId); + const el = toastHost.firstElementChild; + if (el && !el.classList.contains("opacity-0")) { + el.classList.add("translate-x-full", "opacity-0"); + setTimeout(() => { + instance.destroy(); + toastHost.remove(); + if (!container.hasChildNodes()) + container.remove(); + }, 300); + } else { + instance.destroy(); + toastHost.remove(); + } + }; + const ToastComponent = () => { + const el = $html("div", { + class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto` + }, [ + $html("span", {}, [typeof message === "function" ? message() : message]), + Button({ class: "btn-xs btn-circle btn-ghost", onclick: close }, "✕") + ]); + requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); + return el; + }; + const instance = $mount(ToastComponent, toastHost); + if (duration > 0) { + timeoutId = setTimeout(close, duration); + } + return close; + }; + + // src/components/Tooltip.js + var exports_Tooltip = {}; + __export(exports_Tooltip, { + Tooltip: () => Tooltip + }); + var Tooltip = (props, children) => $html("div", { ...props, class: joinClass("tooltip", props.class), "data-tip": props.tip }, children); + + // src/components/index.js + var Components = { + ...exports_Accordion, + ...exports_Alert, + ...exports_Autocomplete, + ...exports_Badge, + ...exports_Button, + ...exports_Checkbox, + ...exports_Colorpicker, + ...exports_Datepicker, + ...exports_Drawer, + ...exports_Dropdown, + ...exports_Fab, + ...exports_Fieldset, + ...exports_Fileinput, + ...exports_Indicator, + ...exports_Input, + ...exports_List, + ...exports_Loading, + ...exports_Menu, + ...exports_Modal, + ...exports_Navbar, + ...exports_Radio, + ...exports_Range, + ...exports_Rating, + ...exports_Select, + ...exports_Stack, + ...exports_Stat, + ...exports_Swap, + ...exports_Table, + ...exports_Tabs, + ...exports_Timeline, + ...exports_Toast, + ...exports_Tooltip + }; + var components_default = { + ...Components, + install: (target = window) => { + Object.entries(Components).forEach(([name, component]) => { + target[name] = component; + }); + console.log("\uD83D\uDE80 SigproUI"); + } + }; + // index.js + if (typeof window !== "undefined") { + Object.entries(exports_components).forEach(([name, component]) => { + window[name] = component; + }); + window.Utils = exports_utils; + window.tt = tt; + window.SigProUI = { ...exports_components, Utils: exports_utils, tt }; + console.log("\uD83C\uDFA8 SigProUI ready"); + } +})(); diff --git a/dist/sigpro-ui.min.js b/dist/sigpro-ui.min.js new file mode 100644 index 0000000..c1c5c1d --- /dev/null +++ b/dist/sigpro-ui.min.js @@ -0,0 +1,7 @@ +(()=>{var{defineProperty:_,getOwnPropertyNames:GA,getOwnPropertyDescriptor:LA}=Object,JA=Object.prototype.hasOwnProperty;var xA=new WeakMap,NA=(A)=>{var t=xA.get(A),r;if(t)return t;if(t=_({},"__esModule",{value:!0}),A&&typeof A==="object"||typeof A==="function")GA(A).map((a)=>!JA.call(t,a)&&_(t,a,{get:()=>A[a],enumerable:!(r=LA(A,a))||r.enumerable}));return xA.set(A,t),t};var p=(A,t)=>{for(var r in t)_(A,r,{get:t[r],enumerable:!0,configurable:!0,set:(a)=>t[r]=()=>a})};var ZA={};p(ZA,{val:()=>d,ui:()=>uA,tt:()=>R,joinClass:()=>x,getIcon:()=>BA,Tooltip:()=>dA,Toast:()=>iA,Timeline:()=>eA,Tabs:()=>lA,Table:()=>sA,Swap:()=>AA,Stat:()=>_o,Stack:()=>qo,Select:()=>Wo,Rating:()=>Zo,Range:()=>Ko,Radio:()=>zo,Navbar:()=>No,Modal:()=>Lo,Menu:()=>Eo,Loading:()=>Fo,List:()=>Qo,Input:()=>F,Indicator:()=>yo,Fileinput:()=>Vo,Fieldset:()=>Yo,Fab:()=>wo,Dropdown:()=>Uo,Drawer:()=>So,Datepicker:()=>Bo,Colorpicker:()=>po,Checkbox:()=>bo,Button:()=>j,Badge:()=>mo,Autocomplete:()=>io,Alert:()=>ro,Accordion:()=>ao});var w=null,H=null,G=new Set,L=!1,oo=new WeakMap,TA=()=>{if(L)return;L=!0;while(G.size>0){let A=Array.from(G).sort((t,r)=>(t.depth||0)-(r.depth||0));G.clear();for(let t of A)if(!t._deleted)t()}L=!1},pA=(A)=>{if(w&&!w._deleted)A.add(w),w._deps.add(A)},Ao=(A)=>{for(let t of A){if(t===w||t._deleted)continue;if(t._isComputed){if(t.markDirty(),t._subs)Ao(t._subs)}else G.add(t)}if(!L)queueMicrotask(TA)},to=(A)=>{if(A._cleanups)A._cleanups.forEach((t)=>t()),A._cleanups.clear();A.childNodes?.forEach(to)},J=(A)=>{let t=new Set,r=H,a=document.createElement("div");a.style.display="contents",H={cleanups:t};try{let e=A({onCleanup:(s)=>t.add(s)}),n=(s)=>{if(!s)return;if(s._isRuntime)t.add(s.destroy),a.appendChild(s.container);else if(Array.isArray(s))s.forEach(n);else a.appendChild(s instanceof Node?s:document.createTextNode(String(s)))};n(e)}finally{H=r}return{_isRuntime:!0,container:a,destroy:()=>{t.forEach((e)=>e()),to(a),a.remove()}}},S=(A,t=null)=>{if(typeof A==="function"){let e=new Set,n,s=!0,l=()=>{if(l._deleted)return;l._deps.forEach((c)=>c.delete(l)),l._deps.clear();let i=w;w=l;try{let c=A();if(!Object.is(n,c)||s)n=c,s=!1,Ao(e)}finally{w=i}};if(l._deps=new Set,l._isComputed=!0,l._subs=e,l._deleted=!1,l.markDirty=()=>s=!0,l.stop=()=>{l._deleted=!0,l._deps.forEach((i)=>i.delete(l)),e.clear()},H)H.cleanups.add(l.stop);return()=>{if(s)l();return pA(e),n}}let r=A;if(t)try{let e=localStorage.getItem(t);if(e!==null)r=JSON.parse(e)}catch(e){console.warn("SigPro: LocalStorage locked",e)}let a=new Set;return(...e)=>{if(e.length){let n=typeof e[0]==="function"?e[0](r):e[0];if(!Object.is(r,n)){if(r=n,t)localStorage.setItem(t,JSON.stringify(r));Ao(a)}}return pA(a),r}},y=(A,t)=>{let r=Array.isArray(A),a=r?t:A,e=r?A:null;if(typeof a!=="function")return()=>{};let n=H,s=()=>{if(s._deleted)return;s._deps.forEach((c)=>c.delete(s)),s._deps.clear(),s._cleanups.forEach((c)=>c()),s._cleanups.clear();let l=w,i=H;w=s,H={cleanups:s._cleanups},s.depth=l?l.depth+1:0;try{if(r)w=null,a(),w=s,e.forEach((c)=>typeof c==="function"&&c());else a()}finally{w=l,H=i}};if(s._deps=new Set,s._cleanups=new Set,s._deleted=!1,s.stop=()=>{if(s._deleted)return;if(s._deleted=!0,G.delete(s),s._deps.forEach((l)=>l.delete(s)),s._cleanups.forEach((l)=>l()),n)n.cleanups.delete(s.stop)},n)n.cleanups.add(s.stop);return s(),s.stop},o=(A,t={},r=[])=>{if(t instanceof Node||Array.isArray(t)||typeof t!=="object")r=t,t={};let a=document.createElement(A),e=(s,l)=>(s==="src"||s==="href")&&String(l).toLowerCase().includes("javascript:")?"#":l;a._cleanups=new Set;for(let[s,l]of Object.entries(t)){if(s==="ref"){typeof l==="function"?l(a):l.current=a;continue}let i=typeof l==="function";if(["INPUT","TEXTAREA","SELECT"].includes(a.tagName)&&(s==="value"||s==="checked")&&i){a._cleanups.add(y(()=>{let f=l();if(a[s]!==f)a[s]=f}));let m=s==="checked"?"change":"input",u=(f)=>l(f.target[s]);a.addEventListener(m,u),a._cleanups.add(()=>a.removeEventListener(m,u))}else if(s.startsWith("on")){let m=s.slice(2).toLowerCase().split(".")[0],u=(f)=>l(f);a.addEventListener(m,u),a._cleanups.add(()=>a.removeEventListener(m,u))}else if(i)a._cleanups.add(y(()=>{let m=e(s,l());if(s==="class")a.className=m||"";else m==null?a.removeAttribute(s):a.setAttribute(s,m)}));else a.setAttribute(s,e(s,l))}let n=(s)=>{if(Array.isArray(s))return s.forEach(n);if(typeof s==="function"){let l=document.createTextNode("");a.appendChild(l);let i=[];a._cleanups.add(y(()=>{let c=s(),b=(Array.isArray(c)?c:[c]).map((m)=>m?._isRuntime?m.container:m instanceof Node?m:document.createTextNode(m??""));i.forEach((m)=>{to(m),m.remove()}),b.forEach((m)=>l.parentNode?.insertBefore(m,l)),i=b}))}else a.appendChild(s instanceof Node?s:document.createTextNode(s??""))};return n(r),a},U=(A,t,r=null)=>{let a=document.createTextNode(""),e=o("div",{style:"display:contents"},[a]),n=null,s=null;return y(()=>{let l=!!(typeof A==="function"?A():A);if(l!==s){if(s=l,n)n.destroy();let i=l?t:r;if(i)n=J(()=>typeof i==="function"?i():i),e.insertBefore(n.container,a)}}),e};U.not=(A,t,r)=>U(()=>!(typeof A==="function"?A():A),t,r);var h=(A,t,r)=>{let a=document.createTextNode(""),e=o("div",{style:"display:contents"},[a]),n=new Map;return y(()=>{let s=(typeof A==="function"?A():A)||[],l=new Map,i=[];for(let b=0;bt(m,b));else n.delete(u);l.set(u,f),i.push(u)}n.forEach((b)=>{b.destroy(),b.container.remove()});let c=a;for(let b=i.length-1;b>=0;b--){let m=l.get(i[b]);if(m.container.nextSibling!==c)e.insertBefore(m.container,c);c=m.container}n=l}),e},M=(A)=>{let t=S(window.location.hash.replace(/^#/,"")||"/");window.addEventListener("hashchange",()=>t(window.location.hash.replace(/^#/,"")||"/"));let r=o("div",{class:"router-outlet"}),a=null;return y([t],async()=>{let e=t(),n=A.find((s)=>{let l=s.path.split("/").filter(Boolean),i=e.split("/").filter(Boolean);return l.length===i.length&&l.every((c,b)=>c.startsWith(":")||c===i[b])})||A.find((s)=>s.path==="*");if(n){let s=n.component;if(typeof s==="function"&&s.toString().includes("import"))s=(await s()).default||await s();let l={};if(n.path.split("/").filter(Boolean).forEach((i,c)=>{if(i.startsWith(":"))l[i.slice(1)]=e.split("/").filter(Boolean)[c]}),a)a.destroy();if(M.params)M.params(l);a=J(()=>{try{return typeof s==="function"?s(l):s}catch(i){return o("div",{class:"p-4 text-error"},"Error loading view")}}),r.appendChild(a.container)}}),r};M.params=S({});M.to=(A)=>window.location.hash=A.replace(/^#?\/?/,"#/");M.back=()=>window.history.back();M.path=()=>window.location.hash.replace(/^#/,"")||"/";var so=(A,t)=>{let r=typeof t==="string"?document.querySelector(t):t;if(!r)return;if(oo.has(r))oo.get(r).destroy();let a=J(typeof A==="function"?A:()=>A);return r.replaceChildren(a.container),oo.set(r,a),a},zA={$:S,$watch:y,$html:o,$if:U,$for:h,$router:M,$mount:so};if(typeof window<"u")((t)=>{Object.keys(t).forEach((a)=>{window[a]=t[a]}),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer address ul ol li dl dt dd a em strong small i b u mark time sub sup pre code blockquote details summary dialog form label input textarea select button option fieldset legend table thead tbody tfoot tr th td caption img video audio canvas svg iframe picture source progress meter".split(/\s+/).forEach((a)=>{let e=a.charAt(0).toUpperCase()+a.slice(1);if(!(e in window))window[e]=(n,s)=>o(a,n,s)}),window.SigPro=Object.freeze(t)})(zA);var Z={};p(Z,{default:()=>XA,Tooltip:()=>dA,Toast:()=>iA,Timeline:()=>eA,Tabs:()=>lA,Table:()=>sA,Swap:()=>AA,Stat:()=>_o,Stack:()=>qo,Select:()=>Wo,Rating:()=>Zo,Range:()=>Ko,Radio:()=>zo,Navbar:()=>No,Modal:()=>Lo,Menu:()=>Eo,Loading:()=>Fo,List:()=>Qo,Input:()=>F,Indicator:()=>yo,Fileinput:()=>Vo,Fieldset:()=>Yo,Fab:()=>wo,Dropdown:()=>Uo,Drawer:()=>So,Datepicker:()=>Bo,Colorpicker:()=>po,Checkbox:()=>bo,Button:()=>j,Badge:()=>mo,Autocomplete:()=>io,Alert:()=>ro,Accordion:()=>ao});var lo={};p(lo,{Accordion:()=>ao});var N={};p(N,{val:()=>d,ui:()=>uA,joinClass:()=>x,getIcon:()=>BA});var d=(A)=>typeof A==="function"?A():A,x=(A,t)=>typeof t==="function"?()=>`${A} ${t()||""}`.trim():`${A} ${t||""}`.trim(),uA=(A,t)=>{if(!t)return A;let r=typeof t==="string"?t.split(" "):t,a=[A];return r.forEach((e)=>{if(e)a.push(`${A}-${e}`)}),a.join(" ")},BA=(A)=>{if(!A)return null;let t="left",r=A;if(typeof A==="string"){let n=A.trim().split(/\s+/);if(n[n.length-1]==="right")t="right",r=n.slice(0,-1).join(" ")}let a=t==="left"?"mr-1":"ml-1",e=typeof r==="string"&&r.includes("--")?o("span",{class:`icon-[${r}]`}):typeof r==="function"?r():o("span",{},r);return o("span",{class:a},e)};var ao=(A,t)=>{let{title:r,name:a,open:e,...n}=A;return o("div",{...n,class:x("collapse collapse-arrow bg-base-200 mb-2",A.class)},[o("input",{type:a?"radio":"checkbox",name:a,checked:e}),o("div",{class:"collapse-title text-xl font-medium"},r),o("div",{class:"collapse-content"},t)])};var eo={};p(eo,{Alert:()=>ro});var CA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg==",SA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC",hA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg==",T="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC",UA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII=",vA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg==",wA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg==",RA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC",z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC",k="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg==",K="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC",X="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII=",YA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg==",DA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg==",VA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg==",HA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII=",yA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC";var ro=(A,t)=>{let{type:r="info",soft:a=!0,...e}=A,n={info:z,success:k,warning:X,error:K},s=()=>{let i=d(r);return{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-error"}[i]||i},l=t||A.message;return o("div",{...e,role:"alert",class:()=>`alert ${s()} ${d(a)?"alert-soft":""} ${A.class||""}`},[o("img",{src:n[d(r)]||n.info,class:"w-4 h-4 object-contain",alt:d(r)}),o("div",{class:"flex-1"},[o("span",{},[typeof l==="function"?l():l])]),A.actions?o("div",{class:"flex-none"},[typeof A.actions==="function"?A.actions():A.actions]):null])};var co={};p(co,{Autocomplete:()=>io});var kA={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"}},KA=S("es");var R=(A)=>()=>kA[KA()][A]||A;var no={};p(no,{Input:()=>F});var F=(A)=>{let{label:t,tip:r,value:a,error:e,isSearch:n,icon:s,type:l="text",...i}=A,c=l==="password",b=S(!1),m={text:vA,password:UA,date:T,number:wA,email:RA},u=o("input",{...i,type:()=>c?b()?"text":"password":l,placeholder:A.placeholder||t||(n?R("search")():" "),class:x("grow order-2 focus:outline-none",A.class),value:a,oninput:(C)=>A.oninput?.(C),disabled:()=>d(A.disabled)}),f=s?s:m[l]?o("img",{src:m[l],class:"opacity-50",alt:l}):null;return o("label",{class:()=>x("input input-bordered floating-label flex items-center gap-2 w-full relative",d(e)?"input-error":"")},[f?o("div",{class:"order-1 shrink-0"},f):null,t?o("span",{class:"text-base-content/60 order-0"},t):null,u,c?o("button",{type:"button",class:"order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100",onclick:(C)=>{C.preventDefault(),b(!b())}},()=>o("img",{class:"w-5 h-5",src:b()?CA:SA})):null,r?o("div",{class:"tooltip tooltip-left order-4","data-tip":r},o("span",{class:"badge badge-ghost badge-xs cursor-help"},"?")):null,()=>d(e)?o("span",{class:"text-error text-[10px] absolute -bottom-5 left-2"},d(e)):null])};var io=(A)=>{let{options:t=[],value:r,onSelect:a,label:e,placeholder:n,...s}=A,l=S(d(r)||""),i=S(!1),c=S(-1),b=S(()=>{let f=l().toLowerCase(),C=d(t)||[];return f?C.filter((I)=>(typeof I==="string"?I:I.label).toLowerCase().includes(f)):C}),m=(f)=>{let C=typeof f==="string"?f:f.value,I=typeof f==="string"?f:f.label;if(l(I),typeof r==="function")r(C);a?.(f),i(!1),c(-1)},u=(f)=>{let C=b();if(f.key==="ArrowDown")f.preventDefault(),i(!0),c(Math.min(c()+1,C.length-1));else if(f.key==="ArrowUp")f.preventDefault(),c(Math.max(c()-1,0));else if(f.key==="Enter"&&c()>=0)f.preventDefault(),m(C[c()]);else if(f.key==="Escape")i(!1)};return o("div",{class:"relative w-full"},[F({label:e,placeholder:n||R("search")(),value:l,onfocus:()=>i(!0),onblur:()=>setTimeout(()=>i(!1),150),onkeydown:u,oninput:(f)=>{let C=f.target.value;if(l(C),typeof r==="function")r(C);i(!0),c(-1)},...s}),o("ul",{class:"absolute 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:()=>i()&&b().length?"display:block":"display:none"},[h(b,(f,C)=>o("li",{},[o("a",{class:()=>`block w-full ${c()===C?"active bg-primary text-primary-content":""}`,onclick:()=>m(f),onmouseenter:()=>c(C)},typeof f==="string"?f:f.label)]),(f,C)=>(typeof f==="string"?f:f.value)+C),()=>b().length?null:o("li",{class:"p-2 text-center opacity-50"},"No results")])])};var fo={};p(fo,{Badge:()=>mo});var mo=(A,t)=>o("span",{...A,class:x("badge",A.class)},t);var go={};p(go,{Button:()=>j});var j=(A,t)=>{let{badge:r,badgeClass:a,tooltip:e,icon:n,loading:s,...l}=A,c=o("button",{...l,class:x("btn",A.class)},[()=>d(s)?o("span",{class:"loading loading-spinner"}):null,n?o("span",{class:"mr-1"},n):null,t]);if(r)c=o("div",{class:"indicator"},[o("span",{class:x("indicator-item badge",a||"badge-secondary")},r),c]);return e?o("div",{class:"tooltip","data-tip":e},c):c};var xo={};p(xo,{Checkbox:()=>bo});var bo=(A)=>{let{value:t,tooltip:r,toggle:a,label:e,...n}=A,s=o("input",{...n,type:"checkbox",class:()=>d(a)?"toggle":"checkbox",checked:t}),l=o("label",{class:"label cursor-pointer justify-start gap-3"},[s,e?o("span",{class:"label-text"},e):null]);return r?o("div",{class:"tooltip","data-tip":r},l):l};var uo={};p(uo,{Colorpicker:()=>po});var po=(A)=>{let{value:t,label:r,...a}=A,e=S(!1),n=["#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"],s=()=>d(t)||"#000000";return o("div",{class:"relative w-fit"},[o("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:(l)=>{l.stopPropagation(),e(!e())},...a},[o("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${s()}`}),r?o("span",{class:"opacity-80"},r):null]),U(e,()=>o("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:(l)=>l.stopPropagation()},[o("div",{class:"grid grid-cols-8 gap-1"},n.map((l)=>o("button",{type:"button",style:`background-color: ${l}`,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 + ${s().toLowerCase()===l.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof t==="function")t(l);e(!1)}})))])),U(e,()=>o("div",{class:"fixed inset-0 z-[100]",onclick:()=>e(!1)}))])};var Co={};p(Co,{Datepicker:()=>Bo});var Bo=(A)=>{let{value:t,range:r,label:a,placeholder:e,hour:n=!1,...s}=A,l=S(!1),i=S(new Date),c=S(null),b=S(0),m=S(0),u=()=>d(r)===!0,f=new Date,C=`${f.getFullYear()}-${String(f.getMonth()+1).padStart(2,"0")}-${String(f.getDate()).padStart(2,"0")}`,I=(g)=>{let B=g.getFullYear(),v=String(g.getMonth()+1).padStart(2,"0"),D=String(g.getDate()).padStart(2,"0");return`${B}-${v}-${D}`},QA=(g)=>{let B=I(g),v=d(t);if(u())if(!v?.start||v.start&&v.end){if(typeof t==="function")t({start:B,end:null,...n&&{startHour:b()}})}else{let D=v.start;if(typeof t==="function"){let E=B{let g=d(t);if(!g)return"";if(typeof g==="string"){if(n&&g.includes("T"))return g.replace("T"," ");return g}if(g.start&&g.end){let B=n&&g.startHour?`${g.start} ${String(g.startHour).padStart(2,"0")}:00`:g.start,v=n&&g.endHour?`${g.end} ${String(g.endHour).padStart(2,"0")}:00`:g.end;return`${B} - ${v}`}if(g.start)return`${n&&g.startHour?`${g.start} ${String(g.startHour).padStart(2,"0")}:00`:g.start}...`;return""}),fA=(g)=>{let B=i();i(new Date(B.getFullYear(),B.getMonth()+g,1))},gA=(g)=>{let B=i();i(new Date(B.getFullYear()+g,B.getMonth(),1))},P=({value:g,onChange:B})=>{return o("div",{class:"flex-1"},[o("div",{class:"flex gap-2 items-center"},[o("input",{type:"range",min:0,max:23,value:g,class:"range range-xs flex-1",oninput:(v)=>{let D=parseInt(v.target.value);B(D)}}),o("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(d(g)).padStart(2,"0")+":00")])])};return o("div",{class:"relative w-full"},[F({label:a,placeholder:e||(u()?"Seleccionar rango...":"Seleccionar fecha..."),value:MA,readonly:!0,icon:o("img",{src:T,class:"opacity-40"}),onclick:(g)=>{g.stopPropagation(),l(!l())},...s}),U(l,()=>o("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:(g)=>g.stopPropagation()},[o("div",{class:"flex justify-between items-center mb-4 gap-1"},[o("div",{class:"flex gap-0.5"},[o("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>gA(-1)},o("img",{src:VA,class:"opacity-40"})),o("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>fA(-1)},o("img",{src:YA,class:"opacity-40"}))]),o("span",{class:"font-bold uppercase flex-1 text-center"},[()=>i().toLocaleString("es-ES",{month:"short",year:"numeric"})]),o("div",{class:"flex gap-0.5"},[o("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>fA(1)},o("img",{src:DA,class:"opacity-40"})),o("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>gA(1)},o("img",{src:HA,class:"opacity-40"}))])]),o("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>c(null)},[...["L","M","X","J","V","S","D"].map((g)=>o("div",{class:"text-[10px] opacity-40 font-bold text-center"},g)),()=>{let g=i(),B=g.getFullYear(),v=g.getMonth(),D=new Date(B,v,1).getDay(),E=D===0?6:D-1,FA=new Date(B,v+1,0).getDate(),W=[];for(let Q=0;Q{let V=d(t),O=c(),jA=typeof V==="string"?V.split("T")[0]===Y:V?.start===Y,EA=V?.end===Y,q=!1;if(u()&&V?.start){let $=V.start;if(!V.end&&O)q=Y>$&&Y<=O||Y<$&&Y>=O;else if(V.end)q=Y>$&&Y{if(u())c(Y)},onclick:()=>QA(bA)},[Q.toString()]))}return W}]),n?o("div",{class:"mt-3 pt-2 border-t border-base-300"},[u()?o("div",{class:"flex gap-4"},[P({value:b,onChange:(g)=>{b(g);let B=d(t);if(B?.start)t({...B,startHour:g})}}),P({value:m,onChange:(g)=>{m(g);let B=d(t);if(B?.end)t({...B,endHour:g})}})]):P({value:b,onChange:(g)=>{b(g);let B=d(t);if(B&&typeof B==="string"&&B.includes("-"))t(B.split("T")[0]+"T"+String(g).padStart(2,"0")+":00:00")}})]):null])),U(l,()=>o("div",{class:"fixed inset-0 z-[90]",onclick:()=>l(!1)}))])};var ho={};p(ho,{Drawer:()=>So});var So=(A)=>o("div",{class:x("drawer",A.class)},[o("input",{id:A.id,type:"checkbox",class:"drawer-toggle",checked:A.open}),o("div",{class:"drawer-content"},A.content),o("div",{class:"drawer-side"},[o("label",{for:A.id,class:"drawer-overlay",onclick:()=>A.open?.(!1)}),o("div",{class:"min-h-full bg-base-200 w-80"},A.side)])]);var vo={};p(vo,{Dropdown:()=>Uo});var Uo=(A,t)=>{let{label:r,icon:a,items:e,...n}=A,s=()=>{if(e)return o("ul",{tabindex:0,class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[h(typeof e==="function"?e:()=>e,(i)=>o("li",{},[o("a",{class:i.class||"",onclick:(c)=>{if(i.onclick)i.onclick(c);if(document.activeElement)document.activeElement.blur()}},[i.icon?o("span",{},i.icon):null,o("span",{},i.label)])]))]);return o("div",{tabindex:0,class:"dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300"},[typeof t==="function"?t():t])};return o("div",{...n,class:()=>`dropdown ${d(A.class)||""}`},[o("div",{tabindex:0,role:"button",class:"btn m-1 flex items-center gap-2"},[a?typeof a==="function"?a():a:null,r?typeof r==="function"?r():r:null]),s()])};var Ro={};p(Ro,{Fab:()=>wo});var wo=(A)=>{let{icon:t,label:r,actions:a=[],position:e="bottom-6 right-6",class:n="",...s}=A;return o("div",{...s,class:`fab absolute ${e} flex flex-col-reverse items-end gap-3 z-[100] ${n}`},[o("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[t?typeof t==="function"?t():t:null,!t&&r?r:null]),...d(a).map((l)=>o("div",{class:"flex items-center gap-3 transition-all duration-300"},[l.label?o("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},l.label):null,o("button",{type:"button",class:`btn btn-circle shadow-lg ${l.class||""}`,onclick:(i)=>{i.stopPropagation(),l.onclick?.(i)}},[l.icon?typeof l.icon==="function"?l.icon():l.icon:l.text||""])]))])};var Do={};p(Do,{Fieldset:()=>Yo});var Yo=(A,t)=>o("fieldset",{...A,class:x("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",A.class)},[()=>{let r=d(A.legend);return r?o("legend",{class:"fieldset-legend font-bold"},[r]):null},t]);var Ho={};p(Ho,{Fileinput:()=>Vo});var Vo=(A)=>{let{tooltip:t,max:r=2,accept:a="*",onSelect:e}=A,n=S([]),s=S(!1),l=S(null),i=r*1024*1024,c=(m)=>{let u=Array.from(m);if(l(null),u.find((C)=>C.size>i)){l(`Máx ${r}MB`);return}n([...n(),...u]),e?.(n())},b=(m)=>{let u=n().filter((f,C)=>C!==m);n(u),e?.(u)};return o("fieldset",{class:"fieldset w-full p-0"},[o("div",{class:()=>`w-full ${t?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":t},[o("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 + ${s()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(m)=>{m.preventDefault(),s(!0)},ondragleave:()=>s(!1),ondrop:(m)=>{m.preventDefault(),s(!1),c(m.dataTransfer.files)}},[o("div",{class:"flex items-center gap-3 w-full"},[o("img",{src:yA,class:"w-5 h-5 opacity-50 shrink-0"}),o("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),o("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${r}MB`)]),o("input",{type:"file",multiple:!0,accept:a,class:"hidden",onchange:(m)=>c(m.target.files)})])]),()=>l()?o("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},l()):null,U(()=>n().length>0,()=>o("ul",{class:"mt-2 space-y-1"},[h(n,(m,u)=>o("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[o("div",{class:"flex items-center gap-2 truncate"},[o("span",{class:"opacity-50"},"\uD83D\uDCC4"),o("span",{class:"truncate font-medium max-w-[200px]"},m.name),o("span",{class:"text-[9px] opacity-40"},`(${(m.size/1024).toFixed(0)} KB)`)]),o("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(f)=>{f.preventDefault(),f.stopPropagation(),b(u)}},[o("img",{src:hA,class:"w-3 h-3 opacity-70"})])]),(m)=>m.name+m.lastModified)]))])};var Io={};p(Io,{Indicator:()=>yo});var yo=(A,t)=>o("div",{class:x("indicator",A.class)},[t,o("span",{class:x("indicator-item badge",A.badgeClass)},A.badge)]);var Mo={};p(Mo,{List:()=>Qo});var Qo=(A)=>{let{items:t,header:r,render:a,keyFn:e=(i,c)=>c,class:n,...s}=A,l=h(t,(i,c)=>o("li",{class:"list-row"},[a(i,c)]),e);return o("ul",{...s,class:x("list bg-base-100 rounded-box shadow-md",n)},r?[U(r,()=>o("li",{class:"p-4 pb-2 text-xs opacity-60"},[d(r)])),l]:l)};var jo={};p(jo,{Loading:()=>Fo});var Fo=(A)=>{return U(A.$show,()=>o("div",{class:"fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30"},[o("span",{class:"loading loading-spinner loading-lg text-primary"})]))};var Go={};p(Go,{Menu:()=>Eo});var Eo=(A)=>{let t=(r)=>h(()=>r||[],(a)=>o("li",{},[a.children?o("details",{open:a.open},[o("summary",{},[a.icon&&o("span",{class:"mr-2"},a.icon),a.label]),o("ul",{},t(a.children))]):o("a",{class:()=>d(a.active)?"active":"",onclick:a.onclick},[a.icon&&o("span",{class:"mr-2"},a.icon),a.label])]),(a,e)=>a.label||e);return o("ul",{...A,class:x("menu bg-base-200 rounded-box",A.class)},t(A.items))};var Jo={};p(Jo,{Modal:()=>Lo});var Lo=(A,t)=>{let{title:r,buttons:a,open:e,...n}=A,s={current:null};y(()=>{let i=s.current;if(!i)return;if(e()){if(!i.open)i.showModal()}else if(i.open)i.close()});let l=(i)=>{if(i&&i.preventDefault)i.preventDefault();e(!1)};return o("dialog",{...n,ref:s,class:"modal",oncancel:()=>e(!1)},[o("div",{class:"modal-box"},[r?o("h3",{class:"text-lg font-bold mb-4"},r):null,o("div",{class:"py-2"},[typeof t==="function"?t():t]),o("div",{class:"modal-action flex gap-2"},[...(Array.isArray(a)?a:[a]).filter(Boolean),j({type:"button",onclick:l},R("close")())])]),o("form",{method:"dialog",class:"modal-backdrop",onsubmit:l},[o("button",{},"close")])])};var To={};p(To,{Navbar:()=>No});var No=(A,t)=>o("div",{...A,class:x("navbar bg-base-100 shadow-sm px-4",A.class)},t);var ko={};p(ko,{Radio:()=>zo});var zo=(A)=>{let{label:t,tooltip:r,value:a,inputValue:e,name:n,...s}=A,l=o("input",{...s,type:"radio",name:n,class:x("radio",A.class),checked:()=>d(a)===e,onclick:()=>{if(typeof a==="function")a(e)}});if(!t&&!r)return l;return o("label",{class:"label cursor-pointer justify-start gap-3"},[l,t?o("span",{class:"label-text"},t):null])};var Xo={};p(Xo,{Range:()=>Ko});var Ko=(A)=>{let{label:t,tooltip:r,value:a,...e}=A,n=o("input",{...e,type:"range",class:x("range",A.class),value:a,disabled:()=>d(A.disabled)});if(!t&&!r)return n;let s=o("div",{class:"flex flex-col gap-2"},[t?o("span",{class:"label-text"},t):null,n]);return r?o("div",{class:"tooltip","data-tip":r},s):s};var Po={};p(Po,{Rating:()=>Zo});var Zo=(A)=>{let{value:t,count:r=5,mask:a="mask-star",readonly:e=!1,onchange:n,...s}=A,l=`rating-${Math.random().toString(36).slice(2,7)}`;return o("div",{...s,class:()=>`rating ${d(e)?"pointer-events-none":""} ${A.class||""}`},Array.from({length:d(r)},(i,c)=>{let b=c+1;return o("input",{type:"radio",name:l,class:`mask ${a}`,checked:()=>Math.round(d(t))===b,onchange:()=>{if(!d(e)){if(typeof n==="function")n(b);else if(typeof t==="function")t(b)}}})}))};var Oo={};p(Oo,{Select:()=>Wo});var Wo=(A)=>{let{label:t,options:r,value:a,...e}=A,n=o("select",{...e,class:x("select select-bordered w-full",A.class),value:a},h(()=>d(r)||[],(s)=>o("option",{value:s.value,$selected:()=>String(d(a))===String(s.value)},s.label),(s)=>s.value));if(!t)return n;return o("label",{class:"fieldset-label flex flex-col gap-1"},[o("span",{},t),n])};var $o={};p($o,{Stack:()=>qo});var qo=(A,t)=>o("div",{...A,class:x("stack",A.class)},t);var oA={};p(oA,{Stat:()=>_o});var _o=(A)=>o("div",{...A,class:x("stat",A.class)},[A.icon&&o("div",{class:"stat-figure text-secondary"},A.icon),A.label&&o("div",{class:"stat-title"},A.label),o("div",{class:"stat-value"},()=>d(A.value)??A.value),A.desc&&o("div",{class:"stat-desc"},A.desc)]);var tA={};p(tA,{Swap:()=>AA});var AA=(A)=>o("label",{class:x("swap",A.class)},[o("input",{type:"checkbox",checked:A.value}),o("div",{class:"swap-on"},A.on),o("div",{class:"swap-off"},A.off)]);var aA={};p(aA,{Table:()=>sA});var sA=(A)=>{let{items:t=[],columns:r=[],keyFn:a,zebra:e=!1,pinRows:n=!1,empty:s=R("nodata")(),...l}=A;return o("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[o("table",{...l,class:()=>x("table",`${d(e)?"table-zebra":""} ${d(n)?"table-pin-rows":""} ${A.class||""}`)},[o("thead",{},[o("tr",{},r.map((c)=>o("th",{class:c.class||""},c.label)))]),o("tbody",{},[h(t,(c,b)=>{return o("tr",{class:"hover"},r.map((m)=>{let u=()=>{if(m.render)return m.render(c,b);let f=c[m.key];return d(f)};return o("td",{class:m.class||""},[u])}))},a||((c,b)=>c.id||b)),U(()=>d(t).length===0,()=>o("tr",{},[o("td",{colspan:r.length,class:"text-center p-10 opacity-50"},[d(s)])]))]),U(()=>r.some((c)=>c.footer),()=>o("tfoot",{},[o("tr",{},r.map((c)=>o("th",{},c.footer||"")))]))])])};var rA={};p(rA,{Tabs:()=>lA});var lA=(A)=>{let{items:t,...r}=A,a=typeof t==="function"?t:()=>t||[];return o("div",{...r,class:"flex flex-col gap-4 w-full"},[o("div",{role:"tablist",class:x("tabs tabs-box",A.class)},h(a,(e)=>o("a",{role:"tab",class:()=>x("tab",d(e.active)&&"tab-active",d(e.disabled)&&"tab-disabled",e.tip&&"tooltip"),"data-tip":e.tip,onclick:(n)=>!d(e.disabled)&&e.onclick?.(n)},e.label),(e)=>e.label)),()=>{let e=a().find((s)=>d(s.active));if(!e)return null;let n=d(e.content);return o("div",{class:"p-4"},[typeof n==="function"?n():n])}])};var nA={};p(nA,{Timeline:()=>eA});var eA=(A)=>{let{items:t=[],vertical:r=!0,compact:a=!1,...e}=A,n={info:z,success:k,warning:X,error:K};return o("ul",{...e,class:()=>`timeline ${d(r)?"timeline-vertical":"timeline-horizontal"} ${d(a)?"timeline-compact":""} ${A.class||""}`},[h(t,(s,l)=>{let i=l===0,c=l===d(t).length-1,b=s.type||"success",m=(u)=>typeof u==="function"?u():u;return o("li",{class:"flex-1"},[!i?o("hr",{class:s.completed?"bg-primary":""}):null,o("div",{class:"timeline-start"},[m(s.title)]),o("div",{class:"timeline-middle"},[o("img",{src:n[b]||s.icon||n.success,class:"w-4 h-4 object-contain mx-1",alt:b})]),o("div",{class:"timeline-end timeline-box shadow-sm"},[m(s.detail)]),!c?o("hr",{class:s.completed?"bg-primary":""}):null])},(s,l)=>s.id||l)])};var cA={};p(cA,{Toast:()=>iA});var iA=(A,t="alert-success",r=3500)=>{let a=document.getElementById("sigpro-toast-container");if(!a)a=o("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(a);let e=o("div",{style:"display: contents"});a.appendChild(e);let n,s=()=>{clearTimeout(n);let c=e.firstElementChild;if(c&&!c.classList.contains("opacity-0"))c.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(i.destroy(),e.remove(),!a.hasChildNodes())a.remove()},300);else i.destroy(),e.remove()},i=so(()=>{let c=o("div",{class:`alert alert-soft ${t} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[o("span",{},[typeof A==="function"?A():A]),j({class:"btn-xs btn-circle btn-ghost",onclick:s},"✕")]);return requestAnimationFrame(()=>c.classList.remove("translate-x-10","opacity-0")),c},e);if(r>0)n=setTimeout(s,r);return s};var mA={};p(mA,{Tooltip:()=>dA});var dA=(A,t)=>o("div",{...A,class:x("tooltip",A.class),"data-tip":A.tip},t);var IA={...lo,...eo,...co,...fo,...go,...xo,...uo,...Co,...ho,...vo,...Ro,...Do,...Ho,...Io,...no,...Mo,...jo,...Go,...Jo,...To,...ko,...Xo,...Po,...Oo,...$o,...oA,...tA,...aA,...rA,...nA,...cA,...mA},XA={...IA,install:(A=window)=>{Object.entries(IA).forEach(([t,r])=>{A[t]=r}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(Z).forEach(([A,t])=>{window[A]=t}),window.Utils=N,window.tt=R,window.SigProUI={...Z,Utils:N,tt:R},console.log("\uD83C\uDFA8 SigProUI ready");})(); diff --git a/dist/sigpro-ui.umd.js b/dist/sigpro-ui.umd.js deleted file mode 100644 index f4c0d6b..0000000 --- a/dist/sigpro-ui.umd.js +++ /dev/null @@ -1,1727 +0,0 @@ -var SigProUI = (function (exports, sigpro) { - 'use strict'; - - const val = t => typeof t === "function" ? t() : t; - - const joinClass = (t, l) => typeof l === "function" - ? () => `${t} ${l() || ""}`.trim() - : `${t} ${l || ""}`.trim(); - - var Utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - joinClass: joinClass, - val: val - }); - - /** ACCORDION */ - const Accordion = (props, children) => { - const { title, name, open, ...rest } = props; - - return sigpro.$html( - "div", - { - ...rest, - class: joinClass("collapse collapse-arrow bg-base-200 mb-2", props.class), - }, - [ - sigpro.$html("input", { - type: name ? "radio" : "checkbox", - name: name, - checked: open - }), - sigpro.$html("div", { class: "collapse-title text-xl font-medium" }, title), - sigpro.$html("div", { class: "collapse-content" }, children), - ], - ); - }; - - var AccordionModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion - }); - - const iconShow = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg=="; - const iconHide = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC"; - const iconClose = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg=="; - const iconCalendar = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC"; - const iconLock = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII="; - const iconAbc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg=="; - const icon123 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg=="; - const iconMail = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC"; - const iconInfo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC"; - const iconSuccess = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg=="; - const iconError = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC"; - const iconWarning = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII="; - const iconLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg=="; - const iconRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg=="; - const iconLLeft = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg=="; - const iconRRight = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII="; - const iconUpload = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC"; - - var Icons = /*#__PURE__*/Object.freeze({ - __proto__: null, - icon123: icon123, - iconAbc: iconAbc, - iconCalendar: iconCalendar, - iconClose: iconClose, - iconError: iconError, - iconHide: iconHide, - iconInfo: iconInfo, - iconLLeft: iconLLeft, - iconLeft: iconLeft, - iconLock: iconLock, - iconMail: iconMail, - iconRRight: iconRRight, - iconRight: iconRight, - iconShow: iconShow, - iconSuccess: iconSuccess, - iconUpload: iconUpload, - iconWarning: iconWarning - }); - - /** ALERT */ - const Alert = (props, children) => { - const { type = "info", soft = true, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - const typeClass = () => { - const t = val(type); - const map = { - info: "alert-info", - success: "alert-success", - warning: "alert-warning", - error: "alert-error", - }; - return map[t] || t; - }; - - const content = children || props.message; - - return sigpro.$html( - "div", - { - ...rest, - role: "alert", - class: () => `alert ${typeClass()} ${val(soft) ? "alert-soft" : ""} ${props.class || ""}`, - }, - [ - sigpro.$html("img", { - src: icons[val(type)] || icons.info, - class: "w-4 h-4 object-contain", - alt: val(type), - }), - sigpro.$html("div", { class: "flex-1" }, [ - sigpro.$html("span", {}, [typeof content === "function" ? content() : content]) - ]), - props.actions ? sigpro.$html("div", { class: "flex-none" }, [ - typeof props.actions === "function" ? props.actions() : props.actions - ]) : null, - ], - ); - }; - - var AlertModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Alert: Alert - }); - - const i18n = { - es: { - close: "Cerrar", - confirm: "Confirmar", - cancel: "Cancelar", - search: "Buscar...", - loading: "Cargando...", - nodata: "Sin datos" - }, - en: { - close: "Close", - confirm: "Confirm", - cancel: "Cancel", - search: "Search...", - loading: "Loading...", - nodata: "No data" - } - }; - - const currentLocale = sigpro.$("es"); - - const tt = t => () => i18n[currentLocale()][t] || t; - - /** INPUT */ - const Input = (props) => { - const { label, tip, value, error, isSearch, icon, type = "text", ...rest } = props; - const isPassword = type === "password"; - const visible = sigpro.$(false); - - const iconsByType = { - text: iconAbc, - password: iconLock, - date: iconCalendar, - number: icon123, - email: iconMail, - }; - - const inputEl = sigpro.$html("input", { - ...rest, - type: () => (isPassword ? (visible() ? "text" : "password") : type), - placeholder: props.placeholder || label || (isSearch ? tt("search")() : " "), - class: joinClass("grow order-2 focus:outline-none", props.class), - value: value, - oninput: (e) => props.oninput?.(e), - disabled: () => val(props.disabled), - }); - - const leftIcon = icon ? icon : iconsByType[type] ? sigpro.$html("img", { src: iconsByType[type], class: "opacity-50", alt: type }) : null; - - return sigpro.$html( - "label", - { - class: () => joinClass("input input-bordered floating-label flex items-center gap-2 w-full relative", val(error) ? "input-error" : ""), - }, - [ - leftIcon ? sigpro.$html("div", { class: "order-1 shrink-0" }, leftIcon) : null, - label ? sigpro.$html("span", { class: "text-base-content/60 order-0" }, label) : null, - inputEl, - isPassword - ? sigpro.$html( - "button", - { - type: "button", - class: "order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100", - onclick: (e) => { - e.preventDefault(); - visible(!visible()); - }, - }, - () => - sigpro.$html("img", { - class: "w-5 h-5", - src: visible() ? iconShow : iconHide, - }), - ) - : null, - tip - ? sigpro.$html( - "div", - { class: "tooltip tooltip-left order-4", "data-tip": tip }, - sigpro.$html("span", { class: "badge badge-ghost badge-xs cursor-help" }, "?"), - ) - : null, - () => (val(error) ? sigpro.$html("span", { class: "text-error text-[10px] absolute -bottom-5 left-2" }, val(error)) : null), - ], - ); - }; - - var InputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Input: Input - }); - - /** AUTOCOMPLETE */ - const Autocomplete = (props) => { - const { options = [], value, onSelect, label, placeholder, ...rest } = props; - - const query = sigpro.$(val(value) || ""); - const isOpen = sigpro.$(false); - const cursor = sigpro.$(-1); - - const list = sigpro.$(() => { - const q = query().toLowerCase(); - const data = val(options) || []; - return q - ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) - : data; - }); - - const pick = (opt) => { - const valStr = typeof opt === "string" ? opt : opt.value; - const labelStr = typeof opt === "string" ? opt : opt.label; - - query(labelStr); - if (typeof value === "function") value(valStr); - onSelect?.(opt); - - isOpen(false); - cursor(-1); - }; - - const nav = (e) => { - const items = list(); - if (e.key === "ArrowDown") { - e.preventDefault(); - isOpen(true); - cursor(Math.min(cursor() + 1, items.length - 1)); - } else if (e.key === "ArrowUp") { - e.preventDefault(); - cursor(Math.max(cursor() - 1, 0)); - } else if (e.key === "Enter" && cursor() >= 0) { - e.preventDefault(); - pick(items[cursor()]); - } else if (e.key === "Escape") { - isOpen(false); - } - }; - - return sigpro.$html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || tt("search")(), - value: query, - onfocus: () => isOpen(true), - onblur: () => setTimeout(() => isOpen(false), 150), - onkeydown: nav, - oninput: (e) => { - const v = e.target.value; - query(v); - if (typeof value === "function") value(v); - isOpen(true); - cursor(-1); - }, - ...rest, - }), - sigpro.$html( - "ul", - { - class: "absolute left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", - style: () => (isOpen() && list().length ? "display:block" : "display:none"), - }, - [ - sigpro.$for( - list, - (opt, i) => - sigpro.$html("li", {}, [ - sigpro.$html( - "a", - { - class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, - onclick: () => pick(opt), - onmouseenter: () => cursor(i), - }, - typeof opt === "string" ? opt : opt.label, - ), - ]), - (opt, i) => (typeof opt === "string" ? opt : opt.value) + i, - ), - () => (list().length ? null : sigpro.$html("li", { class: "p-2 text-center opacity-50" }, "No results")), - ], - ), - ]); - }; - - var AutocompleteModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Autocomplete: Autocomplete - }); - - /** BADGE */ - const Badge = (props, children) => - sigpro.$html("span", { ...props, class: joinClass("badge", props.class) }, children); - - var BadgeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Badge: Badge - }); - - /** BUTTON */ - const Button = (props, children) => { - const { badge, badgeClass, tooltip, icon, loading, ...rest } = props; - - const btn = sigpro.$html( - "button", - { - ...rest, - // Usamos props.class directamente - class: joinClass("btn", props.class), - disabled: () => val(loading) || val(props.disabled), - }, - [ - () => (val(loading) ? sigpro.$html("span", { class: "loading loading-spinner" }) : null), - icon ? sigpro.$html("span", { class: "mr-1" }, icon) : null, - children, - ] - ); - - let out = btn; - - if (badge) { - out = sigpro.$html("div", { class: "indicator" }, [ - sigpro.$html( - "span", - { class: joinClass("indicator-item badge", badgeClass || "badge-secondary") }, - badge - ), - out, - ]); - } - - return tooltip - ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, out) - : out; - }; - - var ButtonModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Button: Button - }); - - /** CHECKBOX */ - const Checkbox = (props) => { - const { value, tooltip, toggle, label, ...rest } = props; - - const checkEl = sigpro.$html("input", { - ...rest, - type: "checkbox", - class: () => (val(toggle) ? "toggle" : "checkbox"), - checked: value - }); - - const layout = sigpro.$html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - checkEl, - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - ]); - - return tooltip ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; - }; - - var CheckboxModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Checkbox: Checkbox - }); - - /** COLORPICKER */ - const Colorpicker = (props) => { - const { value, label, ...rest } = props; - const isOpen = sigpro.$(false); - - const palette = [ - ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], - ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], - ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], - ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], - ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], - ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], - ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], - ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"], - ]; - - const getColor = () => val(value) || "#000000"; - - return sigpro.$html("div", { class: "relative w-fit" }, [ - sigpro.$html( - "button", - { - type: "button", - class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }, - [ - sigpro.$html("div", { - class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", - style: () => `background-color: ${getColor()}`, - }), - label ? sigpro.$html("span", { class: "opacity-80" }, label) : null, - ], - ), - - sigpro.$if(isOpen, () => - sigpro.$html( - "div", - { - class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - sigpro.$html( - "div", - { class: "grid grid-cols-8 gap-1" }, - palette.map((c) => - sigpro.$html("button", { - type: "button", - style: `background-color: ${c}`, - class: () => { - const active = getColor().toLowerCase() === c.toLowerCase(); - return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 - ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; - }, - onclick: () => { - if (typeof value === "function") value(c); - isOpen(false); - }, - }), - ), - ), - ], - ), - ), - - sigpro.$if(isOpen, () => - sigpro.$html("div", { - class: "fixed inset-0 z-[100]", - onclick: () => isOpen(false), - }), - ), - ]); - }; - - var ColorpickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Colorpicker: Colorpicker - }); - - /** DATEPICKER */ - const Datepicker = (props) => { - const { value, range, label, placeholder, hour = false, ...rest } = props; - - const isOpen = sigpro.$(false); - const internalDate = sigpro.$(new Date()); - const hoverDate = sigpro.$(null); - const startHour = sigpro.$(0); - const endHour = sigpro.$(0); - const isRangeMode = () => val(range) === true; - - const now = new Date(); - const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; - - const formatDate = (d) => { - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, "0"); - const day = String(d.getDate()).padStart(2, "0"); - return `${year}-${month}-${day}`; - }; - - const selectDate = (date) => { - const dateStr = formatDate(date); - const current = val(value); - - if (isRangeMode()) { - if (!current?.start || (current.start && current.end)) { - if (typeof value === "function") { - value({ - start: dateStr, - end: null, - ...(hour && { startHour: startHour() }), - }); - } - } else { - const start = current.start; - if (typeof value === "function") { - const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; - if (hour) { - newValue.startHour = current.startHour || startHour(); - newValue.endHour = current.endHour || endHour(); - } - value(newValue); - } - isOpen(false); - } - } else { - if (typeof value === "function") { - value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); - } - isOpen(false); - } - }; - - const displayValue = sigpro.$(() => { - const v = val(value); - if (!v) return ""; - if (typeof v === "string") { - if (hour && v.includes("T")) return v.replace("T", " "); - return v; - } - if (v.start && v.end) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - const endStr = hour && v.endHour ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; - return `${startStr} - ${endStr}`; - } - if (v.start) { - const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; - return `${startStr}...`; - } - return ""; - }); - - const move = (m) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); - }; - - const moveYear = (y) => { - const d = internalDate(); - internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); - }; - - const HourSlider = ({ value: hVal, onChange }) => { - return sigpro.$html("div", { class: "flex-1" }, [ - sigpro.$html("div", { class: "flex gap-2 items-center" }, [ - sigpro.$html("input", { - type: "range", - min: 0, - max: 23, - value: hVal, - class: "range range-xs flex-1", - oninput: (e) => { - const newHour = parseInt(e.target.value); - onChange(newHour); - }, - }), - sigpro.$html("span", { class: "text-sm font-mono min-w-[48px] text-center" }, - () => String(val(hVal)).padStart(2, "0") + ":00" - ), - ]), - ]); - }; - - return sigpro.$html("div", { class: "relative w-full" }, [ - Input({ - label, - placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), - value: displayValue, - readonly: true, - icon: sigpro.$html("img", { src: iconCalendar, class: "opacity-40" }), - onclick: (e) => { - e.stopPropagation(); - isOpen(!isOpen()); - }, - ...rest, - }), - - sigpro.$if(isOpen, () => - sigpro.$html( - "div", - { - class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", - onclick: (e) => e.stopPropagation(), - }, - [ - sigpro.$html("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ - sigpro.$html("div", { class: "flex gap-0.5" }, [ - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, - sigpro.$html("img", { src: iconLLeft, class: "opacity-40" }) - ), - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, - sigpro.$html("img", { src: iconLeft, class: "opacity-40" }) - ), - ]), - sigpro.$html("span", { class: "font-bold uppercase flex-1 text-center" }, [ - () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }), - ]), - sigpro.$html("div", { class: "flex gap-0.5" }, [ - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, - sigpro.$html("img", { src: iconRight, class: "opacity-40" }) - ), - sigpro.$html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, - sigpro.$html("img", { src: iconRRight, class: "opacity-40" }) - ), - ]), - ]), - - sigpro.$html("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ - ...["L", "M", "X", "J", "V", "S", "D"].map((d) => sigpro.$html("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), - () => { - const d = internalDate(); - const year = d.getFullYear(); - const month = d.getMonth(); - const firstDay = new Date(year, month, 1).getDay(); - const offset = firstDay === 0 ? 6 : firstDay - 1; - const daysInMonth = new Date(year, month + 1, 0).getDate(); - - const nodes = []; - for (let i = 0; i < offset; i++) nodes.push(sigpro.$html("div")); - - for (let i = 1; i <= daysInMonth; i++) { - const date = new Date(year, month, i); - const dStr = formatDate(date); - - nodes.push( - sigpro.$html( - "button", - { - type: "button", - class: () => { - const v = val(value); - const h = hoverDate(); - const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; - const isEnd = v?.end === dStr; - let inRange = false; - - if (isRangeMode() && v?.start) { - const start = v.start; - if (!v.end && h) { - inRange = (dStr > start && dStr <= h) || (dStr < start && dStr >= h); - } else if (v.end) { - inRange = dStr > start && dStr < v.end; - } - } - - const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; - const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; - const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; - - return `${base} ${state} ${today}`; - }, - onmouseenter: () => { if (isRangeMode()) hoverDate(dStr); }, - onclick: () => selectDate(date), - }, - [i.toString()], - ), - ); - } - return nodes; - }, - ]), - - hour ? sigpro.$html("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ - isRangeMode() - ? sigpro.$html("div", { class: "flex gap-4" }, [ - HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal?.start) value({ ...currentVal, startHour: newHour }); - }, - }), - HourSlider({ - value: endHour, - onChange: (newHour) => { - endHour(newHour); - const currentVal = val(value); - if (currentVal?.end) value({ ...currentVal, endHour: newHour }); - }, - }), - ]) - : HourSlider({ - value: startHour, - onChange: (newHour) => { - startHour(newHour); - const currentVal = val(value); - if (currentVal && typeof currentVal === "string" && currentVal.includes("-")) { - value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); - } - }, - }), - ]) : null, - ], - ), - ), - - sigpro.$if(isOpen, () => sigpro.$html("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })), - ]); - }; - - var DatepickerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Datepicker: Datepicker - }); - - /** DRAWER */ - const Drawer = (props) => - sigpro.$html("div", { class: joinClass("drawer", props.class) }, [ - sigpro.$html("input", { - id: props.id, - type: "checkbox", - class: "drawer-toggle", - checked: props.open, - }), - sigpro.$html("div", { class: "drawer-content" }, props.content), - sigpro.$html("div", { class: "drawer-side" }, [ - sigpro.$html("label", { for: props.id, class: "drawer-overlay", onclick: () => props.open?.(false) }), - sigpro.$html("div", { class: "min-h-full bg-base-200 w-80" }, props.side), - ]), - ]); - - var DrawerModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Drawer: Drawer - }); - - const Dropdown = (props, children) => { - const { label, icon, items, ...rest } = props; - - const renderContent = () => { - if (items) { - const source = typeof items === "function" ? items : () => items; - return sigpro.$html("ul", { - tabindex: 0, - class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" - }, [ - sigpro.$for(source, (item) => - sigpro.$html("li", {}, [ - sigpro.$html("a", { - class: item.class || "", - onclick: (e) => { - if (item.onclick) item.onclick(e); - if (document.activeElement) document.activeElement.blur(); - } - }, [ - item.icon ? sigpro.$html("span", {}, item.icon) : null, - sigpro.$html("span", {}, item.label) - ]) - ]) - ) - ]); - } - - return sigpro.$html("div", { - tabindex: 0, - class: "dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300" - }, [ - typeof children === "function" ? children() : children - ]); - }; - - return sigpro.$html("div", { - ...rest, - class: () => `dropdown ${val(props.class) || ""}`, - }, [ - sigpro.$html("div", { - tabindex: 0, - role: "button", - class: "btn m-1 flex items-center gap-2", - }, [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - label ? (typeof label === "function" ? label() : label) : null - ]), - renderContent() - ]); - }; - - var DropdownModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Dropdown: Dropdown - }); - - /** FAB (Floating Action Button) */ - const Fab = (props) => { - const { icon, label, actions = [], position = "bottom-6 right-6", class: className = "", ...rest } = props; - - return sigpro.$html( - "div", - { - ...rest, - class: `fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100] ${className}`, - }, - [ - sigpro.$html( - "div", - { - tabindex: 0, - role: "button", - class: "btn btn-lg btn-circle btn-primary shadow-2xl", - }, - [ - icon ? (typeof icon === "function" ? icon() : icon) : null, - !icon && label ? label : null - ], - ), - - ...val(actions).map((act) => - sigpro.$html("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ - act.label ? sigpro.$html("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, - sigpro.$html( - "button", - { - type: "button", - class: `btn btn-circle shadow-lg ${act.class || ""}`, - onclick: (e) => { - e.stopPropagation(); - act.onclick?.(e); - }, - }, - [act.icon ? (typeof act.icon === "function" ? act.icon() : act.icon) : act.text || ""], - ), - ]), - ), - ], - ); - }; - - var FabModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fab: Fab - }); - - /** FIELDSET */ - const Fieldset = (props, children) => - sigpro.$html( - "fieldset", - { - ...props, - class: joinClass("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", props.class), - }, - [ - () => { - const legendText = val(props.legend); - return legendText ? sigpro.$html("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; - }, - children, - ], - ); - - var FieldsetModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fieldset: Fieldset - }); - - /** FILEINPUT */ - const Fileinput = (props) => { - const { tooltip, max = 2, accept = "*", onSelect } = props; - - const selectedFiles = sigpro.$([]); - const isDragging = sigpro.$(false); - const error = sigpro.$(null); - const MAX_BYTES = max * 1024 * 1024; - - const handleFiles = (files) => { - const fileList = Array.from(files); - error(null); - const oversized = fileList.find((f) => f.size > MAX_BYTES); - - if (oversized) { - error(`Máx ${max}MB`); - return; - } - - selectedFiles([...selectedFiles(), ...fileList]); - onSelect?.(selectedFiles()); - }; - - const removeFile = (index) => { - const updated = selectedFiles().filter((_, i) => i !== index); - selectedFiles(updated); - onSelect?.(updated); - }; - - return sigpro.$html("fieldset", { class: "fieldset w-full p-0" }, [ - sigpro.$html( - "div", - { - class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, - "data-tip": tooltip, - }, - [ - sigpro.$html( - "label", - { - class: () => ` - relative flex items-center justify-between w-full h-12 px-4 - border-2 border-dashed rounded-lg cursor-pointer - transition-all duration-200 - ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} - `, - ondragover: (e) => { - e.preventDefault(); - isDragging(true); - }, - ondragleave: () => isDragging(false), - ondrop: (e) => { - e.preventDefault(); - isDragging(false); - handleFiles(e.dataTransfer.files); - }, - }, - [ - sigpro.$html("div", { class: "flex items-center gap-3 w-full" }, [ - sigpro.$html("img", { src: iconUpload, class: "w-5 h-5 opacity-50 shrink-0" }), - sigpro.$html("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), - sigpro.$html("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`), - ]), - sigpro.$html("input", { - type: "file", - multiple: true, - accept: accept, - class: "hidden", - onchange: (e) => handleFiles(e.target.files), - }), - ], - ), - ], - ), - - () => (error() ? sigpro.$html("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null), - - sigpro.$if( - () => selectedFiles().length > 0, - () => - sigpro.$html("ul", { class: "mt-2 space-y-1" }, [ - sigpro.$for( - selectedFiles, - (file, index) => - sigpro.$html("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ - sigpro.$html("div", { class: "flex items-center gap-2 truncate" }, [ - sigpro.$html("span", { class: "opacity-50" }, "📄"), - sigpro.$html("span", { class: "truncate font-medium max-w-[200px]" }, file.name), - sigpro.$html("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`), - ]), - sigpro.$html( - "button", - { - type: "button", - class: "btn btn-ghost btn-xs btn-circle", - onclick: (e) => { - e.preventDefault(); - e.stopPropagation(); - removeFile(index); - }, - }, - [sigpro.$html("img", { src: iconClose, class: "w-3 h-3 opacity-70" })], - ), - ]), - (file) => file.name + file.lastModified, - ), - ]), - ), - ]); - }; - - var FileinputModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Fileinput: Fileinput - }); - - /** INDICATOR */ - const Indicator = (props, children) => - sigpro.$html("div", { class: joinClass("indicator", props.class) }, [ - children, - sigpro.$html("span", { class: joinClass("indicator-item badge", props.badgeClass) }, props.badge), - ]); - - var IndicatorModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Indicator: Indicator - }); - - /** LIST */ - const List = (props) => { - const { - items, - header, - render, - keyFn = (item, index) => index, - class: className, - ...rest - } = props; - - const listItems = sigpro.$for( - items, - (item, index) => sigpro.$html("li", { class: "list-row" }, [render(item, index)]), - keyFn - ); - - return sigpro.$html( - "ul", - { - ...rest, - class: joinClass("list bg-base-100 rounded-box shadow-md", className), - }, - header ? [sigpro.$if(header, () => sigpro.$html("li", { class: "p-4 pb-2 text-xs opacity-60" }, [val(header)])), listItems] : listItems - ); - }; - - var ListModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - List: List - }); - - /** LOADING (Overlay Component) */ - const Loading = (props) => { - // Se espera un signal props.$show para controlar la visibilidad - return sigpro.$if(props.$show, () => - sigpro.$html("div", { - class: "fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30" - }, [ - sigpro.$html("span", { class: "loading loading-spinner loading-lg text-primary" }), - ]), - ); - }; - - var LoadingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Loading: Loading - }); - - /** MENU */ - const Menu = (props) => { - const renderItems = (items) => - sigpro.$for( - () => items || [], - (it) => - sigpro.$html("li", {}, [ - it.children - ? sigpro.$html("details", { open: it.open }, [ - sigpro.$html("summary", {}, [it.icon && sigpro.$html("span", { class: "mr-2" }, it.icon), it.label]), - sigpro.$html("ul", {}, renderItems(it.children)), - ]) - : sigpro.$html("a", { class: () => (val(it.active) ? "active" : ""), onclick: it.onclick }, [ - it.icon && sigpro.$html("span", { class: "mr-2" }, it.icon), - it.label, - ]), - ]), - (it, i) => it.label || i, - ); - - return sigpro.$html("ul", { ...props, class: joinClass("menu bg-base-200 rounded-box", props.class) }, renderItems(props.items)); - }; - - var MenuModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Menu: Menu - }); - - /** MODAL REACTIVO NATIVO */ - const Modal = (props, children) => { - const { title, buttons, open, ...rest } = props; - const dialogRef = { current: null }; - - // Sincronizamos la señal con los métodos nativos del navegador - sigpro.$watch(() => { - const dialog = dialogRef.current; - if (!dialog) return; - - if (open()) { - // Solo abrimos si no está ya abierto (evita bucles) - if (!dialog.open) dialog.showModal(); - } else { - if (dialog.open) dialog.close(); - } - }); - - const close = (e) => { - if (e && e.preventDefault) e.preventDefault(); - open(false); - }; - - return sigpro.$html("dialog", { - ...rest, - ref: dialogRef, - class: "modal", - // Importante: Si el usuario pulsa ESC, actualizamos la señal - oncancel: () => open(false) - }, [ - sigpro.$html("div", { class: "modal-box" }, [ - title ? sigpro.$html("h3", { class: "text-lg font-bold mb-4" }, title) : null, - sigpro.$html("div", { class: "py-2" }, [ - typeof children === "function" ? children() : children - ]), - sigpro.$html("div", { class: "modal-action flex gap-2" }, [ - ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), - Button({ type: "button", onclick: close }, tt("close")()), - ]), - ]), - // Backdrop nativo que sincroniza con la señal - sigpro.$html("form", { - method: "dialog", - class: "modal-backdrop", - onsubmit: close - }, [ - sigpro.$html("button", {}, "close") - ]) - ]); - }; - - var ModalModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Modal: Modal - }); - - /** NAVBAR */ - const Navbar = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("navbar bg-base-100 shadow-sm px-4", props.class) }, children); - - var NavbarModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Navbar: Navbar - }); - - /** RADIO */ - const Radio = (props) => { - const { label, tooltip, value, inputValue, name, ...rest } = props; - - const radioEl = sigpro.$html("input", { - ...rest, - type: "radio", - name: name, - class: joinClass("radio", props.class), - checked: () => val(value) === inputValue, - onclick: () => { - if (typeof value === "function") value(inputValue); - }, - }); - - if (!label && !tooltip) return radioEl; - - return sigpro.$html("label", { class: "label cursor-pointer justify-start gap-3" }, [ - radioEl, - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - ]); - }; - - var RadioModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Radio: Radio - }); - - /** RANGE */ - const Range = (props) => { - const { label, tooltip, value, ...rest } = props; - - const rangeEl = sigpro.$html("input", { - ...rest, - type: "range", - class: joinClass("range", props.class), - value: value, - disabled: () => val(props.disabled) - }); - - if (!label && !tooltip) return rangeEl; - - const layout = sigpro.$html("div", { class: "flex flex-col gap-2" }, [ - label ? sigpro.$html("span", { class: "label-text" }, label) : null, - rangeEl - ]); - - return tooltip ? sigpro.$html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; - }; - - var RangeModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Range: Range - }); - - /** RATING */ - const Rating = (props) => { - const { value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; - const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; - - return sigpro.$html( - "div", - { - ...rest, - class: () => `rating ${val(readonly) ? "pointer-events-none" : ""} ${props.class || ""}`, - }, - Array.from({ length: val(count) }, (_, i) => { - const starValue = i + 1; - return sigpro.$html("input", { - type: "radio", - name: ratingGroup, - class: `mask ${mask}`, - checked: () => Math.round(val(value)) === starValue, - onchange: () => { - if (!val(readonly)) { - if (typeof onchange === "function") { - onchange(starValue); - } - else if (typeof value === "function") { - value(starValue); - } - } - }, - }); - }) - ); - }; - - var RatingModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Rating: Rating - }); - - /** SELECT */ - const Select = (props) => { - const { label, options, value, ...rest } = props; - - const selectEl = sigpro.$html( - "select", - { - ...rest, - class: joinClass("select select-bordered w-full", props.class), - value: value - }, - sigpro.$for( - () => val(options) || [], - (opt) => - sigpro.$html( - "option", - { - value: opt.value, - $selected: () => String(val(value)) === String(opt.value), - }, - opt.label, - ), - (opt) => opt.value, - ), - ); - - if (!label) return selectEl; - - return sigpro.$html("label", { class: "fieldset-label flex flex-col gap-1" }, [ - sigpro.$html("span", {}, label), - selectEl - ]); - }; - - var SelectModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Select: Select - }); - - /** STACK */ - const Stack = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("stack", props.class) }, children); - - var StackModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stack: Stack - }); - - /** STAT */ - const Stat = (props) => - sigpro.$html("div", { ...props, class: joinClass("stat", props.class) }, [ - props.icon && sigpro.$html("div", { class: "stat-figure text-secondary" }, props.icon), - props.label && sigpro.$html("div", { class: "stat-title" }, props.label), - sigpro.$html("div", { class: "stat-value" }, () => val(props.value) ?? props.value), - props.desc && sigpro.$html("div", { class: "stat-desc" }, props.desc), - ]); - - var StatModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Stat: Stat - }); - - /** SWAP */ - const Swap = (props) => - sigpro.$html("label", { class: joinClass("swap", props.class) }, [ - sigpro.$html("input", { - type: "checkbox", - checked: props.value - }), - sigpro.$html("div", { class: "swap-on" }, props.on), - sigpro.$html("div", { class: "swap-off" }, props.off), - ]); - - var SwapModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Swap: Swap - }); - - /** TABLE */ - const Table = (props) => { - const { - items = [], - columns = [], - keyFn, - zebra = false, - pinRows = false, - empty = tt("nodata")(), - ...rest - } = props; - - const tableClass = () => joinClass( - "table", - `${val(zebra) ? "table-zebra" : ""} ${val(pinRows) ? "table-pin-rows" : ""} ${props.class || ""}` - ); - - return sigpro.$html("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ - sigpro.$html("table", { ...rest, class: tableClass }, [ - sigpro.$html("thead", {}, [ - sigpro.$html("tr", {}, - columns.map(col => sigpro.$html("th", { class: col.class || "" }, col.label)) - ) - ]), - sigpro.$html("tbody", {}, [ - sigpro.$for(items, (item, index) => { - return sigpro.$html("tr", { class: "hover" }, - columns.map(col => { - const cellContent = () => { - if (col.render) return col.render(item, index); - const value = item[col.key]; - return val(value); - }; - return sigpro.$html("td", { class: col.class || "" }, [cellContent]); - }) - ); - }, keyFn || ((item, idx) => item.id || idx)), - - sigpro.$if(() => val(items).length === 0, () => - sigpro.$html("tr", {}, [ - sigpro.$html("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ - val(empty) - ]) - ]) - ) - ]), - sigpro.$if(() => columns.some(c => c.footer), () => - sigpro.$html("tfoot", {}, [ - sigpro.$html("tr", {}, - columns.map(col => sigpro.$html("th", {}, col.footer || "")) - ) - ]) - ) - ]) - ]); - }; - - var TableModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Table: Table - }); - - /** TABS */ - const Tabs = (props) => { - const { items, ...rest } = props; - const itemsSignal = typeof items === "function" ? items : () => items || []; - - return sigpro.$html("div", { ...rest, class: "flex flex-col gap-4 w-full" }, [ - sigpro.$html( - "div", - { - role: "tablist", - class: joinClass("tabs tabs-box", props.class), - }, - sigpro.$for( - itemsSignal, - (it) => - sigpro.$html( - "a", - { - role: "tab", - class: () => joinClass( - "tab", - val(it.active) && "tab-active", - val(it.disabled) && "tab-disabled", - it.tip && "tooltip" - ), - "data-tip": it.tip, - onclick: (e) => !val(it.disabled) && it.onclick?.(e), - }, - it.label, - ), - (t) => t.label, - ), - ), - () => { - const active = itemsSignal().find((it) => val(it.active)); - if (!active) return null; - const content = val(active.content); - return sigpro.$html("div", { class: "p-4" }, [ - typeof content === "function" ? content() : content - ]); - }, - ]); - }; - - var TabsModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tabs: Tabs - }); - - /** TIMELINE */ - const Timeline = (props) => { - const { items = [], vertical = true, compact = false, ...rest } = props; - - const icons = { - info: iconInfo, - success: iconSuccess, - warning: iconWarning, - error: iconError, - }; - - return sigpro.$html( - "ul", - { - ...rest, - class: () => - `timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${ - val(compact) ? "timeline-compact" : "" - } ${props.class || ""}`, - }, - [ - sigpro.$for( - items, - (item, i) => { - const isFirst = i === 0; - const isLast = i === val(items).length - 1; - const itemType = item.type || "success"; - const renderSlot = (content) => (typeof content === "function" ? content() : content); - - return sigpro.$html("li", { class: "flex-1" }, [ - !isFirst ? sigpro.$html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - sigpro.$html("div", { class: "timeline-start" }, [renderSlot(item.title)]), - sigpro.$html("div", { class: "timeline-middle" }, [ - sigpro.$html("img", { - src: icons[itemType] || item.icon || icons.success, - class: "w-4 h-4 object-contain mx-1", - alt: itemType, - }), - ]), - sigpro.$html("div", { class: "timeline-end timeline-box shadow-sm" }, [renderSlot(item.detail)]), - !isLast ? sigpro.$html("hr", { class: item.completed ? "bg-primary" : "" }) : null, - ]); - }, - (item, i) => item.id || i, - ), - ], - ); - }; - - var TimelineModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Timeline: Timeline - }); - - /** TOAST (Imperative Function) */ - const Toast = (message, type = "alert-success", duration = 3500) => { - let container = document.getElementById("sigpro-toast-container"); - - // Crear el contenedor global si no existe - if (!container) { - container = sigpro.$html("div", { - id: "sigpro-toast-container", - class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none", - }); - document.body.appendChild(container); - } - - const toastHost = sigpro.$html("div", { style: "display: contents" }); - container.appendChild(toastHost); - - let timeoutId; - - const close = () => { - clearTimeout(timeoutId); - const el = toastHost.firstElementChild; - if (el && !el.classList.contains("opacity-0")) { - el.classList.add("translate-x-full", "opacity-0"); - setTimeout(() => { - instance.destroy(); - toastHost.remove(); - // Limpiar el contenedor si ya no hay más toasts - if (!container.hasChildNodes()) container.remove(); - }, 300); - } else { - instance.destroy(); - toastHost.remove(); - } - }; - - const ToastComponent = () => { - const el = sigpro.$html( - "div", - { - class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`, - }, - [ - sigpro.$html("span", {}, [typeof message === "function" ? message() : message]), - Button({ class: "btn-xs btn-circle btn-ghost", onclick: close }, "✕") - ], - ); - - // Animación de entrada - requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); - return el; - }; - - const instance = sigpro.$mount(ToastComponent, toastHost); - - if (duration > 0) { - timeoutId = setTimeout(close, duration); - } - - return close; - }; - - var ToastModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Toast: Toast - }); - - /** TOOLTIP */ - const Tooltip = (props, children) => - sigpro.$html("div", { ...props, class: joinClass("tooltip", props.class), "data-tip": props.tip }, children); - - var TooltipModule = /*#__PURE__*/Object.freeze({ - __proto__: null, - Tooltip: Tooltip - }); - - const Components = { - ...AccordionModule, - ...AlertModule, - ...AutocompleteModule, - ...BadgeModule, - ...ButtonModule, - ...CheckboxModule, - ...ColorpickerModule, - ...DatepickerModule, - ...DrawerModule, - ...DropdownModule, - ...FabModule, - ...FieldsetModule, - ...FileinputModule, - ...IndicatorModule, - ...InputModule, - ...ListModule, - ...LoadingModule, - ...MenuModule, - ...ModalModule, - ...NavbarModule, - ...RadioModule, - ...RangeModule, - ...RatingModule, - ...SelectModule, - ...StackModule, - ...StatModule, - ...SwapModule, - ...TableModule, - ...TabsModule, - ...TimelineModule, - ...ToastModule, - ...TooltipModule - }; - - var index = { - ...Components, - install: (target = window) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - console.log("🚀 SigproUI"); - } - }; - - var Components$1 = /*#__PURE__*/Object.freeze({ - __proto__: null, - Accordion: Accordion, - Alert: Alert, - Autocomplete: Autocomplete, - Badge: Badge, - Button: Button, - Checkbox: Checkbox, - Colorpicker: Colorpicker, - Datepicker: Datepicker, - Drawer: Drawer, - Dropdown: Dropdown, - Fab: Fab, - Fieldset: Fieldset, - Fileinput: Fileinput, - Indicator: Indicator, - Input: Input, - List: List, - Loading: Loading, - Menu: Menu, - Modal: Modal, - Navbar: Navbar, - Radio: Radio, - Range: Range, - Rating: Rating, - Select: Select, - Stack: Stack, - Stat: Stat, - Swap: Swap, - Table: Table, - Tabs: Tabs, - Timeline: Timeline, - Toast: Toast, - Tooltip: Tooltip, - default: index - }); - - /** - * SigproUI - Entry Point - */ - - - const SigproUI = { - ...Components$1, - Icons, - Utils, - tt, - - install: (target = (typeof window !== 'undefined' ? window : {})) => { - Object.entries(Components$1).forEach(([name, component]) => { - target[name] = component; - }); - - target.Icons = Icons; - target.Utils = Utils; - target.tt = tt; - - console.log("🌟 SigproUI"); - } - }; - - if (typeof window !== 'undefined') { - SigproUI.install(window); - } - - exports.Accordion = Accordion; - exports.Alert = Alert; - exports.Autocomplete = Autocomplete; - exports.Badge = Badge; - exports.Button = Button; - exports.Checkbox = Checkbox; - exports.Colorpicker = Colorpicker; - exports.Datepicker = Datepicker; - exports.Drawer = Drawer; - exports.Dropdown = Dropdown; - exports.Fab = Fab; - exports.Fieldset = Fieldset; - exports.Fileinput = Fileinput; - exports.Indicator = Indicator; - exports.Input = Input; - exports.List = List; - exports.Loading = Loading; - exports.Menu = Menu; - exports.Modal = Modal; - exports.Navbar = Navbar; - exports.Radio = Radio; - exports.Range = Range; - exports.Rating = Rating; - exports.Select = Select; - exports.Stack = Stack; - exports.Stat = Stat; - exports.Swap = Swap; - exports.Table = Table; - exports.Tabs = Tabs; - exports.Timeline = Timeline; - exports.Toast = Toast; - exports.Tooltip = Tooltip; - exports.default = SigproUI; - exports.icon123 = icon123; - exports.iconAbc = iconAbc; - exports.iconCalendar = iconCalendar; - exports.iconClose = iconClose; - exports.iconError = iconError; - exports.iconHide = iconHide; - exports.iconInfo = iconInfo; - exports.iconLLeft = iconLLeft; - exports.iconLeft = iconLeft; - exports.iconLock = iconLock; - exports.iconMail = iconMail; - exports.iconRRight = iconRRight; - exports.iconRight = iconRight; - exports.iconShow = iconShow; - exports.iconSuccess = iconSuccess; - exports.iconUpload = iconUpload; - exports.iconWarning = iconWarning; - exports.joinClass = joinClass; - exports.tt = tt; - exports.val = val; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -})({}, SigPro); diff --git a/dist/sigpro-ui.umd.min.js b/dist/sigpro-ui.umd.min.js deleted file mode 100644 index 65f7fb1..0000000 --- a/dist/sigpro-ui.umd.min.js +++ /dev/null @@ -1 +0,0 @@ -var SigProUI=function(t,e){"use strict";const l=t=>"function"==typeof t?t():t,a=(t,e)=>"function"==typeof e?()=>`${t} ${e()||""}`.trim():`${t} ${e||""}`.trim();var o=Object.freeze({__proto__:null,joinClass:a,val:l});const n=(t,l)=>{const{title:o,name:n,open:s,...A}=t;return e.$html("div",{...A,class:a("collapse collapse-arrow bg-base-200 mb-2",t.class)},[e.$html("input",{type:n?"radio":"checkbox",name:n,checked:s}),e.$html("div",{class:"collapse-title text-xl font-medium"},o),e.$html("div",{class:"collapse-content"},l)])};var s=Object.freeze({__proto__:null,Accordion:n});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC",r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg==",i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC",d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII=",m="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg==",u="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg==",p="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC",h="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC",b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg==",g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC",f="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII=",$="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg==",v="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg==",B="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg==",w="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII=",x="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC";var y=Object.freeze({__proto__:null,icon123:u,iconAbc:m,iconCalendar:i,iconClose:r,iconError:g,iconHide:c,iconInfo:h,iconLLeft:B,iconLeft:$,iconLock:d,iconMail:p,iconRRight:w,iconRight:v,iconShow:A,iconSuccess:b,iconUpload:x,iconWarning:f});const S=(t,a)=>{const{type:o="info",soft:n=!0,...s}=t,A={info:h,success:b,warning:f,error:g},c=a||t.message;return e.$html("div",{...s,role:"alert",class:()=>`alert ${(()=>{const t=l(o);return{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-error"}[t]||t})()} ${l(n)?"alert-soft":""} ${t.class||""}`},[e.$html("img",{src:A[l(o)]||A.info,class:"w-4 h-4 object-contain",alt:l(o)}),e.$html("div",{class:"flex-1"},[e.$html("span",{},["function"==typeof c?c():c])]),t.actions?e.$html("div",{class:"flex-none"},["function"==typeof t.actions?t.actions():t.actions]):null])};var C=Object.freeze({__proto__:null,Alert:S});const 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"}},k=e.$("es"),R=t=>()=>U[k()][t]||t,D=t=>{const{label:o,tip:n,value:s,error:r,isSearch:h,icon:b,type:g="text",...f}=t,$="password"===g,v=e.$(!1),B={text:m,password:d,date:i,number:u,email:p},w=e.$html("input",{...f,type:()=>$?v()?"text":"password":g,placeholder:t.placeholder||o||(h?R("search")():" "),class:a("grow order-2 focus:outline-none",t.class),value:s,oninput:e=>t.oninput?.(e),disabled:()=>l(t.disabled)}),x=b||(B[g]?e.$html("img",{src:B[g],class:"opacity-50",alt:g}):null);return e.$html("label",{class:()=>a("input input-bordered floating-label flex items-center gap-2 w-full relative",l(r)?"input-error":"")},[x?e.$html("div",{class:"order-1 shrink-0"},x):null,o?e.$html("span",{class:"text-base-content/60 order-0"},o):null,w,$?e.$html("button",{type:"button",class:"order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100",onclick:t=>{t.preventDefault(),v(!v())}},()=>e.$html("img",{class:"w-5 h-5",src:v()?A:c})):null,n?e.$html("div",{class:"tooltip tooltip-left order-4","data-tip":n},e.$html("span",{class:"badge badge-ghost badge-xs cursor-help"},"?")):null,()=>l(r)?e.$html("span",{class:"text-error text-[10px] absolute -bottom-5 left-2"},l(r)):null])};var j=Object.freeze({__proto__:null,Input:D});const _=t=>{const{options:a=[],value:o,onSelect:n,label:s,placeholder:A,...c}=t,r=e.$(l(o)||""),i=e.$(!1),d=e.$(-1),m=e.$(()=>{const t=r().toLowerCase(),e=l(a)||[];return t?e.filter(e=>("string"==typeof e?e:e.label).toLowerCase().includes(t)):e}),u=t=>{const e="string"==typeof t?t:t.value,l="string"==typeof t?t:t.label;r(l),"function"==typeof o&&o(e),n?.(t),i(!1),d(-1)};return e.$html("div",{class:"relative w-full"},[D({label:s,placeholder:A||R("search")(),value:r,onfocus:()=>i(!0),onblur:()=>setTimeout(()=>i(!1),150),onkeydown:t=>{const e=m();"ArrowDown"===t.key?(t.preventDefault(),i(!0),d(Math.min(d()+1,e.length-1))):"ArrowUp"===t.key?(t.preventDefault(),d(Math.max(d()-1,0))):"Enter"===t.key&&d()>=0?(t.preventDefault(),u(e[d()])):"Escape"===t.key&&i(!1)},oninput:t=>{const e=t.target.value;r(e),"function"==typeof o&&o(e),i(!0),d(-1)},...c}),e.$html("ul",{class:"absolute 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:()=>i()&&m().length?"display:block":"display:none"},[e.$for(m,(t,l)=>e.$html("li",{},[e.$html("a",{class:()=>"block w-full "+(d()===l?"active bg-primary text-primary-content":""),onclick:()=>u(t),onmouseenter:()=>d(l)},"string"==typeof t?t:t.label)]),(t,e)=>("string"==typeof t?t:t.value)+e),()=>m().length?null:e.$html("li",{class:"p-2 text-center opacity-50"},"No results")])])};const z=(t,l)=>e.$html("span",{...t,class:a("badge",t.class)},l);const E=(t,o)=>{const{badge:n,badgeClass:s,tooltip:A,icon:c,loading:r,...i}=t;let d=e.$html("button",{...i,class:a("btn",t.class),disabled:()=>l(r)||l(t.disabled)},[()=>l(r)?e.$html("span",{class:"loading loading-spinner"}):null,c?e.$html("span",{class:"mr-1"},c):null,o]);return n&&(d=e.$html("div",{class:"indicator"},[e.$html("span",{class:a("indicator-item badge",s||"badge-secondary")},n),d])),A?e.$html("div",{class:"tooltip","data-tip":A},d):d};const I=t=>{const{value:a,tooltip:o,toggle:n,label:s,...A}=t,c=e.$html("input",{...A,type:"checkbox",class:()=>l(n)?"toggle":"checkbox",checked:a}),r=e.$html("label",{class:"label cursor-pointer justify-start gap-3"},[c,s?e.$html("span",{class:"label-text"},s):null]);return o?e.$html("div",{class:"tooltip","data-tip":o},r):r};const Y=t=>{const{value:a,label:o,...n}=t,s=e.$(!1),A=["#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"],c=()=>l(a)||"#000000";return e.$html("div",{class:"relative w-fit"},[e.$html("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:t=>{t.stopPropagation(),s(!s())},...n},[e.$html("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${c()}`}),o?e.$html("span",{class:"opacity-80"},o):null]),e.$if(s,()=>e.$html("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:t=>t.stopPropagation()},[e.$html("div",{class:"grid grid-cols-8 gap-1"},A.map(t=>e.$html("button",{type:"button",style:`background-color: ${t}`,class:()=>"size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 \n "+(c().toLowerCase()===t.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""),onclick:()=>{"function"==typeof a&&a(t),s(!1)}})))])),e.$if(s,()=>e.$html("div",{class:"fixed inset-0 z-[100]",onclick:()=>s(!1)}))])};const V=t=>{const{value:a,range:o,label:n,placeholder:s,hour:A=!1,...c}=t,r=e.$(!1),d=e.$(new Date),m=e.$(null),u=e.$(0),p=e.$(0),h=()=>!0===l(o),b=new Date,g=`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`,f=t=>`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`,x=t=>{const e=f(t),o=l(a);if(h())if(!o?.start||o.start&&o.end)"function"==typeof a&&a({start:e,end:null,...A&&{startHour:u()}});else{const t=o.start;if("function"==typeof a){const l=e{const t=l(a);if(!t)return"";if("string"==typeof t)return A&&t.includes("T")?t.replace("T"," "):t;if(t.start&&t.end){return`${A&&t.startHour?`${t.start} ${String(t.startHour).padStart(2,"0")}:00`:t.start} - ${A&&t.endHour?`${t.end} ${String(t.endHour).padStart(2,"0")}:00`:t.end}`}if(t.start){return`${A&&t.startHour?`${t.start} ${String(t.startHour).padStart(2,"0")}:00`:t.start}...`}return""}),S=t=>{const e=d();d(new Date(e.getFullYear(),e.getMonth()+t,1))},C=t=>{const e=d();d(new Date(e.getFullYear()+t,e.getMonth(),1))},U=({value:t,onChange:a})=>e.$html("div",{class:"flex-1"},[e.$html("div",{class:"flex gap-2 items-center"},[e.$html("input",{type:"range",min:0,max:23,value:t,class:"range range-xs flex-1",oninput:t=>{const e=parseInt(t.target.value);a(e)}}),e.$html("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(l(t)).padStart(2,"0")+":00")])]);return e.$html("div",{class:"relative w-full"},[D({label:n,placeholder:s||(h()?"Seleccionar rango...":"Seleccionar fecha..."),value:y,readonly:!0,icon:e.$html("img",{src:i,class:"opacity-40"}),onclick:t=>{t.stopPropagation(),r(!r())},...c}),e.$if(r,()=>e.$html("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:t=>t.stopPropagation()},[e.$html("div",{class:"flex justify-between items-center mb-4 gap-1"},[e.$html("div",{class:"flex gap-0.5"},[e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>C(-1)},e.$html("img",{src:B,class:"opacity-40"})),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>S(-1)},e.$html("img",{src:$,class:"opacity-40"}))]),e.$html("span",{class:"font-bold uppercase flex-1 text-center"},[()=>d().toLocaleString("es-ES",{month:"short",year:"numeric"})]),e.$html("div",{class:"flex gap-0.5"},[e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>S(1)},e.$html("img",{src:v,class:"opacity-40"})),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>C(1)},e.$html("img",{src:w,class:"opacity-40"}))])]),e.$html("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>m(null)},[...["L","M","X","J","V","S","D"].map(t=>e.$html("div",{class:"text-[10px] opacity-40 font-bold text-center"},t)),()=>{const t=d(),o=t.getFullYear(),n=t.getMonth(),s=new Date(o,n,1).getDay(),A=0===s?6:s-1,c=new Date(o,n+1,0).getDate(),r=[];for(let t=0;t{const t=l(a),e=m(),o="string"==typeof t?t.split("T")[0]===A:t?.start===A,n=t?.end===A;let s=!1;if(h()&&t?.start){const l=t.start;!t.end&&e?s=A>l&&A<=e||A=e:t.end&&(s=A>l&&A{h()&&m(A)},onclick:()=>x(s)},[t.toString()]))}return r}]),A?e.$html("div",{class:"mt-3 pt-2 border-t border-base-300"},[h()?e.$html("div",{class:"flex gap-4"},[U({value:u,onChange:t=>{u(t);const e=l(a);e?.start&&a({...e,startHour:t})}}),U({value:p,onChange:t=>{p(t);const e=l(a);e?.end&&a({...e,endHour:t})}})]):U({value:u,onChange:t=>{u(t);const e=l(a);e&&"string"==typeof e&&e.includes("-")&&a(e.split("T")[0]+"T"+String(t).padStart(2,"0")+":00:00")}})]):null])),e.$if(r,()=>e.$html("div",{class:"fixed inset-0 z-[90]",onclick:()=>r(!1)}))])};const H=t=>e.$html("div",{class:a("drawer",t.class)},[e.$html("input",{id:t.id,type:"checkbox",class:"drawer-toggle",checked:t.open}),e.$html("div",{class:"drawer-content"},t.content),e.$html("div",{class:"drawer-side"},[e.$html("label",{for:t.id,class:"drawer-overlay",onclick:()=>t.open?.(!1)}),e.$html("div",{class:"min-h-full bg-base-200 w-80"},t.side)])]);const O=(t,a)=>{const{label:o,icon:n,items:s,...A}=t;return e.$html("div",{...A,class:()=>`dropdown ${l(t.class)||""}`},[e.$html("div",{tabindex:0,role:"button",class:"btn m-1 flex items-center gap-2"},[n?"function"==typeof n?n():n:null,o?"function"==typeof o?o():o:null]),(()=>{if(s){const t="function"==typeof s?s:()=>s;return e.$html("ul",{tabindex:0,class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[e.$for(t,t=>e.$html("li",{},[e.$html("a",{class:t.class||"",onclick:e=>{t.onclick&&t.onclick(e),document.activeElement&&document.activeElement.blur()}},[t.icon?e.$html("span",{},t.icon):null,e.$html("span",{},t.label)])]))])}return e.$html("div",{tabindex:0,class:"dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300"},["function"==typeof a?a():a])})()])};const F=t=>{const{icon:a,label:o,actions:n=[],position:s="bottom-6 right-6",class:A="",...c}=t;return e.$html("div",{...c,class:`fab absolute ${s} flex flex-col-reverse items-end gap-3 z-[100] ${A}`},[e.$html("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[a?"function"==typeof a?a():a:null,!a&&o?o:null]),...l(n).map(t=>e.$html("div",{class:"flex items-center gap-3 transition-all duration-300"},[t.label?e.$html("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},t.label):null,e.$html("button",{type:"button",class:`btn btn-circle shadow-lg ${t.class||""}`,onclick:e=>{e.stopPropagation(),t.onclick?.(e)}},[t.icon?"function"==typeof t.icon?t.icon():t.icon:t.text||""])]))])};const Q=(t,o)=>e.$html("fieldset",{...t,class:a("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",t.class)},[()=>{const a=l(t.legend);return a?e.$html("legend",{class:"fieldset-legend font-bold"},[a]):null},o]);const N=t=>{const{tooltip:l,max:a=2,accept:o="*",onSelect:n}=t,s=e.$([]),A=e.$(!1),c=e.$(null),i=1024*a*1024,d=t=>{const e=Array.from(t);c(null);e.find(t=>t.size>i)?c(`Máx ${a}MB`):(s([...s(),...e]),n?.(s()))};return e.$html("fieldset",{class:"fieldset w-full p-0"},[e.$html("div",{class:()=>"w-full "+(l?"tooltip tooltip-top before:z-50 after:z-50":""),"data-tip":l},[e.$html("label",{class:()=>`\n relative flex items-center justify-between w-full h-12 px-4\n border-2 border-dashed rounded-lg cursor-pointer\n transition-all duration-200\n ${A()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"}\n `,ondragover:t=>{t.preventDefault(),A(!0)},ondragleave:()=>A(!1),ondrop:t=>{t.preventDefault(),A(!1),d(t.dataTransfer.files)}},[e.$html("div",{class:"flex items-center gap-3 w-full"},[e.$html("img",{src:x,class:"w-5 h-5 opacity-50 shrink-0"}),e.$html("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),e.$html("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${a}MB`)]),e.$html("input",{type:"file",multiple:!0,accept:o,class:"hidden",onchange:t=>d(t.target.files)})])]),()=>c()?e.$html("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},c()):null,e.$if(()=>s().length>0,()=>e.$html("ul",{class:"mt-2 space-y-1"},[e.$for(s,(t,l)=>e.$html("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[e.$html("div",{class:"flex items-center gap-2 truncate"},[e.$html("span",{class:"opacity-50"},"📄"),e.$html("span",{class:"truncate font-medium max-w-[200px]"},t.name),e.$html("span",{class:"text-[9px] opacity-40"},`(${(t.size/1024).toFixed(0)} KB)`)]),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:t=>{t.preventDefault(),t.stopPropagation(),(t=>{const e=s().filter((e,l)=>l!==t);s(e),n?.(e)})(l)}},[e.$html("img",{src:r,class:"w-3 h-3 opacity-70"})])]),t=>t.name+t.lastModified)]))])};const L=(t,l)=>e.$html("div",{class:a("indicator",t.class)},[l,e.$html("span",{class:a("indicator-item badge",t.badgeClass)},t.badge)]);const T=t=>{const{items:o,header:n,render:s,keyFn:A=(t,e)=>e,class:c,...r}=t,i=e.$for(o,(t,l)=>e.$html("li",{class:"list-row"},[s(t,l)]),A);return e.$html("ul",{...r,class:a("list bg-base-100 rounded-box shadow-md",c)},n?[e.$if(n,()=>e.$html("li",{class:"p-4 pb-2 text-xs opacity-60"},[l(n)])),i]:i)};const G=t=>e.$if(t.$show,()=>e.$html("div",{class:"fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30"},[e.$html("span",{class:"loading loading-spinner loading-lg text-primary"})]));const M=t=>{const o=t=>e.$for(()=>t||[],t=>e.$html("li",{},[t.children?e.$html("details",{open:t.open},[e.$html("summary",{},[t.icon&&e.$html("span",{class:"mr-2"},t.icon),t.label]),e.$html("ul",{},o(t.children))]):e.$html("a",{class:()=>l(t.active)?"active":"",onclick:t.onclick},[t.icon&&e.$html("span",{class:"mr-2"},t.icon),t.label])]),(t,e)=>t.label||e);return e.$html("ul",{...t,class:a("menu bg-base-200 rounded-box",t.class)},o(t.items))};const J=(t,l)=>{const{title:a,buttons:o,open:n,...s}=t,A={current:null};e.$watch(()=>{const t=A.current;t&&(n()?t.open||t.showModal():t.open&&t.close())});const c=t=>{t&&t.preventDefault&&t.preventDefault(),n(!1)};return e.$html("dialog",{...s,ref:A,class:"modal",oncancel:()=>n(!1)},[e.$html("div",{class:"modal-box"},[a?e.$html("h3",{class:"text-lg font-bold mb-4"},a):null,e.$html("div",{class:"py-2"},["function"==typeof l?l():l]),e.$html("div",{class:"modal-action flex gap-2"},[...(Array.isArray(o)?o:[o]).filter(Boolean),E({type:"button",onclick:c},R("close")())])]),e.$html("form",{method:"dialog",class:"modal-backdrop",onsubmit:c},[e.$html("button",{},"close")])])};const K=(t,l)=>e.$html("div",{...t,class:a("navbar bg-base-100 shadow-sm px-4",t.class)},l);const P=t=>{const{label:o,tooltip:n,value:s,inputValue:A,name:c,...r}=t,i=e.$html("input",{...r,type:"radio",name:c,class:a("radio",t.class),checked:()=>l(s)===A,onclick:()=>{"function"==typeof s&&s(A)}});return o||n?e.$html("label",{class:"label cursor-pointer justify-start gap-3"},[i,o?e.$html("span",{class:"label-text"},o):null]):i};const X=t=>{const{label:o,tooltip:n,value:s,...A}=t,c=e.$html("input",{...A,type:"range",class:a("range",t.class),value:s,disabled:()=>l(t.disabled)});if(!o&&!n)return c;const r=e.$html("div",{class:"flex flex-col gap-2"},[o?e.$html("span",{class:"label-text"},o):null,c]);return n?e.$html("div",{class:"tooltip","data-tip":n},r):r};const Z=t=>{const{value:a,count:o=5,mask:n="mask-star",readonly:s=!1,onchange:A,...c}=t,r=`rating-${Math.random().toString(36).slice(2,7)}`;return e.$html("div",{...c,class:()=>`rating ${l(s)?"pointer-events-none":""} ${t.class||""}`},Array.from({length:l(o)},(t,o)=>{const c=o+1;return e.$html("input",{type:"radio",name:r,class:`mask ${n}`,checked:()=>Math.round(l(a))===c,onchange:()=>{l(s)||("function"==typeof A?A(c):"function"==typeof a&&a(c))}})}))};const W=t=>{const{label:o,options:n,value:s,...A}=t,c=e.$html("select",{...A,class:a("select select-bordered w-full",t.class),value:s},e.$for(()=>l(n)||[],t=>e.$html("option",{value:t.value,$selected:()=>String(l(s))===String(t.value)},t.label),t=>t.value));return o?e.$html("label",{class:"fieldset-label flex flex-col gap-1"},[e.$html("span",{},o),c]):c};const q=(t,l)=>e.$html("div",{...t,class:a("stack",t.class)},l);const tt=t=>e.$html("div",{...t,class:a("stat",t.class)},[t.icon&&e.$html("div",{class:"stat-figure text-secondary"},t.icon),t.label&&e.$html("div",{class:"stat-title"},t.label),e.$html("div",{class:"stat-value"},()=>l(t.value)??t.value),t.desc&&e.$html("div",{class:"stat-desc"},t.desc)]);const et=t=>e.$html("label",{class:a("swap",t.class)},[e.$html("input",{type:"checkbox",checked:t.value}),e.$html("div",{class:"swap-on"},t.on),e.$html("div",{class:"swap-off"},t.off)]);const lt=t=>{const{items:o=[],columns:n=[],keyFn:s,zebra:A=!1,pinRows:c=!1,empty:r=R("nodata")(),...i}=t;return e.$html("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[e.$html("table",{...i,class:()=>a("table",`${l(A)?"table-zebra":""} ${l(c)?"table-pin-rows":""} ${t.class||""}`)},[e.$html("thead",{},[e.$html("tr",{},n.map(t=>e.$html("th",{class:t.class||""},t.label)))]),e.$html("tbody",{},[e.$for(o,(t,a)=>e.$html("tr",{class:"hover"},n.map(o=>e.$html("td",{class:o.class||""},[()=>{if(o.render)return o.render(t,a);const e=t[o.key];return l(e)}]))),s||((t,e)=>t.id||e)),e.$if(()=>0===l(o).length,()=>e.$html("tr",{},[e.$html("td",{colspan:n.length,class:"text-center p-10 opacity-50"},[l(r)])]))]),e.$if(()=>n.some(t=>t.footer),()=>e.$html("tfoot",{},[e.$html("tr",{},n.map(t=>e.$html("th",{},t.footer||"")))]))])])};const at=t=>{const{items:o,...n}=t,s="function"==typeof o?o:()=>o||[];return e.$html("div",{...n,class:"flex flex-col gap-4 w-full"},[e.$html("div",{role:"tablist",class:a("tabs tabs-box",t.class)},e.$for(s,t=>e.$html("a",{role:"tab",class:()=>a("tab",l(t.active)&&"tab-active",l(t.disabled),t.tip),"data-tip":t.tip,onclick:e=>!l(t.disabled)&&t.onclick?.(e)},t.label),t=>t.label)),()=>{const t=s().find(t=>l(t.active));if(!t)return null;const a=l(t.content);return e.$html("div",{class:"p-4"},["function"==typeof a?a():a])}])};const ot=t=>{const{items:a=[],vertical:o=!0,compact:n=!1,...s}=t,A={info:h,success:b,warning:f,error:g};return e.$html("ul",{...s,class:()=>`timeline ${l(o)?"timeline-vertical":"timeline-horizontal"} ${l(n)?"timeline-compact":""} ${t.class||""}`},[e.$for(a,(t,o)=>{const n=0===o,s=o===l(a).length-1,c=t.type||"success",r=t=>"function"==typeof t?t():t;return e.$html("li",{class:"flex-1"},[n?null:e.$html("hr",{class:t.completed?"bg-primary":""}),e.$html("div",{class:"timeline-start"},[r(t.title)]),e.$html("div",{class:"timeline-middle"},[e.$html("img",{src:A[c]||t.icon||A.success,class:"w-4 h-4 object-contain mx-1",alt:c})]),e.$html("div",{class:"timeline-end timeline-box shadow-sm"},[r(t.detail)]),s?null:e.$html("hr",{class:t.completed?"bg-primary":""})])},(t,e)=>t.id||e)])};const nt=(t,l="alert-success",a=3500)=>{let o=document.getElementById("sigpro-toast-container");o||(o=e.$html("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(o));const n=e.$html("div",{style:"display: contents"});let s;o.appendChild(n);const A=()=>{clearTimeout(s);const t=n.firstElementChild;t&&!t.classList.contains("opacity-0")?(t.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{c.destroy(),n.remove(),o.hasChildNodes()||o.remove()},300)):(c.destroy(),n.remove())},c=e.$mount(()=>{const a=e.$html("div",{class:`alert alert-soft ${l} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[e.$html("span",{},["function"==typeof t?t():t]),E({class:"btn-xs btn-circle btn-ghost",onclick:A},"✕")]);return requestAnimationFrame(()=>a.classList.remove("translate-x-10","opacity-0")),a},n);return a>0&&(s=setTimeout(A,a)),A};const st=(t,l)=>e.$html("div",{...t,class:a("tooltip",t.class),"data-tip":t.tip},l);const At={...s,...C,...Object.freeze({__proto__:null,Autocomplete:_}),...Object.freeze({__proto__:null,Badge:z}),...Object.freeze({__proto__:null,Button:E}),...Object.freeze({__proto__:null,Checkbox:I}),...Object.freeze({__proto__:null,Colorpicker:Y}),...Object.freeze({__proto__:null,Datepicker:V}),...Object.freeze({__proto__:null,Drawer:H}),...Object.freeze({__proto__:null,Dropdown:O}),...Object.freeze({__proto__:null,Fab:F}),...Object.freeze({__proto__:null,Fieldset:Q}),...Object.freeze({__proto__:null,Fileinput:N}),...Object.freeze({__proto__:null,Indicator:L}),...j,...Object.freeze({__proto__:null,List:T}),...Object.freeze({__proto__:null,Loading:G}),...Object.freeze({__proto__:null,Menu:M}),...Object.freeze({__proto__:null,Modal:J}),...Object.freeze({__proto__:null,Navbar:K}),...Object.freeze({__proto__:null,Radio:P}),...Object.freeze({__proto__:null,Range:X}),...Object.freeze({__proto__:null,Rating:Z}),...Object.freeze({__proto__:null,Select:W}),...Object.freeze({__proto__:null,Stack:q}),...Object.freeze({__proto__:null,Stat:tt}),...Object.freeze({__proto__:null,Swap:et}),...Object.freeze({__proto__:null,Table:lt}),...Object.freeze({__proto__:null,Tabs:at}),...Object.freeze({__proto__:null,Timeline:ot}),...Object.freeze({__proto__:null,Toast:nt}),...Object.freeze({__proto__:null,Tooltip:st})};var ct={...At,install:(t=window)=>{Object.entries(At).forEach(([e,l])=>{t[e]=l}),console.log("🚀 SigproUI")}},rt=Object.freeze({__proto__:null,Accordion:n,Alert:S,Autocomplete:_,Badge:z,Button:E,Checkbox:I,Colorpicker:Y,Datepicker:V,Drawer:H,Dropdown:O,Fab:F,Fieldset:Q,Fileinput:N,Indicator:L,Input:D,List:T,Loading:G,Menu:M,Modal:J,Navbar:K,Radio:P,Range:X,Rating:Z,Select:W,Stack:q,Stat:tt,Swap:et,Table:lt,Tabs:at,Timeline:ot,Toast:nt,Tooltip:st,default:ct});const it={...rt,Icons:y,Utils:o,tt:R,install:(t=("undefined"!=typeof window?window:{}))=>{Object.entries(rt).forEach(([e,l])=>{t[e]=l}),t.Icons=y,t.Utils=o,t.tt=R,console.log("🌟 SigproUI")}};return"undefined"!=typeof window&&it.install(window),t.Accordion=n,t.Alert=S,t.Autocomplete=_,t.Badge=z,t.Button=E,t.Checkbox=I,t.Colorpicker=Y,t.Datepicker=V,t.Drawer=H,t.Dropdown=O,t.Fab=F,t.Fieldset=Q,t.Fileinput=N,t.Indicator=L,t.Input=D,t.List=T,t.Loading=G,t.Menu=M,t.Modal=J,t.Navbar=K,t.Radio=P,t.Range=X,t.Rating=Z,t.Select=W,t.Stack=q,t.Stat=tt,t.Swap=et,t.Table=lt,t.Tabs=at,t.Timeline=ot,t.Toast=nt,t.Tooltip=st,t.default=it,t.icon123=u,t.iconAbc=m,t.iconCalendar=i,t.iconClose=r,t.iconError=g,t.iconHide=c,t.iconInfo=h,t.iconLLeft=B,t.iconLeft=$,t.iconLock=d,t.iconMail=p,t.iconRRight=w,t.iconRight=v,t.iconShow=A,t.iconSuccess=b,t.iconUpload=x,t.iconWarning=f,t.joinClass=a,t.tt=R,t.val=l,Object.defineProperty(t,"__esModule",{value:!0}),t}({},SigPro); diff --git a/docs/components/button copy.md b/docs/components/button copy.md new file mode 100644 index 0000000..aacc80b --- /dev/null +++ b/docs/components/button copy.md @@ -0,0 +1,248 @@ +# Button + +Styled button with full DaisyUI support and reactive states. + +## Tag + +`Button` + +## Props + +| Prop | Type | Default | Description | +| :----------- | :--------------------------- | :------------------ | :------------------------------------------ | +| `class` | `string` | `''` | Additional CSS classes (DaisyUI + Tailwind) | +| `disabled` | `boolean \| Signal` | `false` | Disabled state | +| `loading` | `boolean \| Signal` | `false` | Shows loading spinner | +| `badge` | `string \| Signal` | `-` | Badge text displayed on corner | +| `badgeClass` | `string` | `'badge-secondary'` | Badge styling classes | +| `tooltip` | `string \| Signal` | `-` | Tooltip text on hover | +| `icon` | `string \| VNode \| Signal` | `-` | Icon displayed before text | +| `onclick` | `function` | `-` | Click event handler | +| `type` | `string` | `'button'` | Native button type | + +## Live Examples + +### Basic Button + +
+
+

Live Demo

+
+
+
+ +```javascript +const BasicDemo = () => { + return Button({ class: "btn btn-primary" }, "Click Me"); +}; +$mount(BasicDemo, "#demo-basic"); +``` + +### With Loading State + +
+
+

Live Demo

+
+
+
+ +```javascript +const LoadingDemo = () => { + const isSaving = $(false); + + return Button( + { + class: "btn btn-success", + loading: isSaving, + onclick: async () => { + isSaving(true); + await new Promise((resolve) => setTimeout(resolve, 2000)); + isSaving(false); + }, + }, + "Save Changes", + ); +}; +$mount(LoadingDemo, "#demo-loading"); +``` + +### With Badge + +
+
+

Live Demo

+
+
+
+ +```javascript +const BadgeDemo = () => { + return Button( + { + class: "btn btn-outline", + badge: "3", + badgeClass: "badge-accent", + }, + "Notifications", + ); +}; +$mount(BadgeDemo, "#demo-badge"); +``` + +### With Tooltip + +
+
+

Live Demo

+
+
+
+ +```javascript +const TooltipDemo = () => { + return Button( + { + class: "btn btn-ghost", + tooltip: "Delete item", + }, + "Delete", + ); +}; +$mount(TooltipDemo, "#demo-tooltip"); +``` + +### Disabled State + +
+
+

Live Demo

+
+
+
+ +```javascript +const DisabledDemo = () => { + const isDisabled = $(true); + + return Button( + { + class: "btn btn-primary", + disabled: isDisabled, + }, + "Submit", + ); +}; +$mount(DisabledDemo, "#demo-disabled"); +``` + +### All Variants + +
+
+

Live Demo

+
+
+
+ +```javascript +const VariantsDemo = () => { + return Div({ class: "flex flex-wrap gap-2 justify-center" }, [ + Button({ class: "btn btn-primary" }, "Primary"), + Button({ class: "btn btn-secondary" }, "Secondary"), + Button({ class: "btn btn-accent" }, "Accent"), + Button({ class: "btn btn-ghost" }, "Ghost"), + Button({ class: "btn btn-outline" }, "Outline"), + ]); +}; +$mount(VariantsDemo, "#demo-variants"); +``` + + \ No newline at end of file diff --git a/docs/components/button.md b/docs/components/button.md index aacc80b..7202059 100644 --- a/docs/components/button.md +++ b/docs/components/button.md @@ -1,51 +1,68 @@ -# Button +> # Button(props, children?: string | Signal | [...]): HTMLElement -Styled button with full DaisyUI support and reactive states. - -## Tag - -`Button` +--- ## Props -| Prop | Type | Default | Description | -| :----------- | :--------------------------- | :------------------ | :------------------------------------------ | -| `class` | `string` | `''` | Additional CSS classes (DaisyUI + Tailwind) | -| `disabled` | `boolean \| Signal` | `false` | Disabled state | -| `loading` | `boolean \| Signal` | `false` | Shows loading spinner | -| `badge` | `string \| Signal` | `-` | Badge text displayed on corner | -| `badgeClass` | `string` | `'badge-secondary'` | Badge styling classes | -| `tooltip` | `string \| Signal` | `-` | Tooltip text on hover | -| `icon` | `string \| VNode \| Signal` | `-` | Icon displayed before text | -| `onclick` | `function` | `-` | Click event handler | -| `type` | `string` | `'button'` | Native button type | +| Prop | Type | Default | Description | +| :----------- | :--------------------------- | :------------------ | :------------------------------- | +| `class` | `string` | `''` | Additional CSS classes (daisyUI) | +| `disabled` | `boolean \| Signal` | `false` | Disabled state | +| `loading` | `boolean \| Signal` | `false` | Shows loading spinner | +| `badge` | `string \| Signal` | `-` | Badge text displayed on corner | +| `badgeClass` | `string` | `'badge-secondary'` | Badge styling classes | +| `tooltip` | `string \| Signal` | `-` | Tooltip text on hover | +| `icon` | `string \| VNode \| Signal` | `-` | Icon displayed before text | +| `onclick` | `function` | `-` | Click event handler | +| `type` | `string` | `'button'` | Native button type | -## Live Examples +## Class Options + +For more detailed information about the underlying styling system, visit the daisyUI documentation: + +- [daisyUI Button](https://daisyui.com/components/button) + +| Class Name | Category | Description | +| :-------------- | :------------ | :------------------------------------ | +| `btn-neutral` | `Color` 🎨 | Neutral brand color | +| `btn-primary` | `Color` 🎨 | Primary brand color | +| `btn-secondary` | `Color` 🎨 | Secondary brand color | +| `btn-accent` | `Color` 🎨 | Accent brand color | +| `btn-info` | `Color` 🎨 | Informational blue color | +| `btn-success` | `Color` 🎨 | Success green color | +| `btn-warning` | `Color` 🎨 | Warning yellow color | +| `btn-error` | `Color` 🎨 | Error red color | +| `btn-xl` | `Size` 📏 | Extra large scale | +| `btn-lg` | `Size` 📏 | Large scale | +| `btn-md` | `Size` 📏 | Medium scale (Default) | +| `btn-sm` | `Size` 📏 | Small scale | +| `btn-xs` | `Size` 📏 | Extra small scale | +| `btn-outline` | `Style` ✨ | Transparent with colored border | +| `btn-dash` | `Style` ✨ | Dashed border style | +| `btn-soft` | `Style` ✨ | Low opacity background color | +| `btn-ghost` | `Style` ✨ | No background, hover effect only | +| `btn-link` | `Style` ✨ | Looks like a text link | +| `btn-square` | `Shape` 📐 | 1:1 aspect ratio | +| `btn-circle` | `Shape` 📐 | 1:1 aspect ratio with rounded corners | +| `btn-wide` | `Shape` 📐 | Extra horizontal padding | +| `btn-block` | `Shape` 📐 | Full width of container | +| `btn-active` | `Behavior` ⚙️ | Forced active/pressed state | +| `btn-disabled` | `Behavior` ⚙️ | Visual and functional disabled state | ### Basic Button -
-
-

Live Demo

-
-
-
+
```javascript const BasicDemo = () => { - return Button({ class: "btn btn-primary" }, "Click Me"); + return Button({ class: "btn-primary" }, "Click Me"); }; $mount(BasicDemo, "#demo-basic"); ``` ### With Loading State -
-
-

Live Demo

-
-
-
+
```javascript const LoadingDemo = () => { @@ -53,7 +70,7 @@ const LoadingDemo = () => { return Button( { - class: "btn btn-success", + class: "btn-success", loading: isSaving, onclick: async () => { isSaving(true); @@ -69,18 +86,13 @@ $mount(LoadingDemo, "#demo-loading"); ### With Badge -
-
-

Live Demo

-
-
-
+
```javascript const BadgeDemo = () => { return Button( { - class: "btn btn-outline", + class: "btn-outline", badge: "3", badgeClass: "badge-accent", }, @@ -92,18 +104,13 @@ $mount(BadgeDemo, "#demo-badge"); ### With Tooltip -
-
-

Live Demo

-
-
-
+
```javascript const TooltipDemo = () => { return Button( { - class: "btn btn-ghost", + class: "btn-ghost", tooltip: "Delete item", }, "Delete", @@ -114,12 +121,7 @@ $mount(TooltipDemo, "#demo-tooltip"); ### Disabled State -
-
-

Live Demo

-
-
-
+
```javascript const DisabledDemo = () => { @@ -127,8 +129,7 @@ const DisabledDemo = () => { return Button( { - class: "btn btn-primary", - disabled: isDisabled, + class: "btn-primary btn-disabled", }, "Submit", ); @@ -138,111 +139,30 @@ $mount(DisabledDemo, "#demo-disabled"); ### All Variants -
-
-

Live Demo

-
-
-
+
```javascript const VariantsDemo = () => { return Div({ class: "flex flex-wrap gap-2 justify-center" }, [ - Button({ class: "btn btn-primary" }, "Primary"), - Button({ class: "btn btn-secondary" }, "Secondary"), - Button({ class: "btn btn-accent" }, "Accent"), - Button({ class: "btn btn-ghost" }, "Ghost"), - Button({ class: "btn btn-outline" }, "Outline"), + Button({ class: "btn-primary" }, "Primary"), + Button({ class: "btn-secondary" }, "Secondary"), + Button({ class: "btn-accent" }, "Accent"), + Button({ class: "btn-ghost" }, "Ghost"), + Button({ class: "btn-outline" }, "Outline"), ]); }; $mount(VariantsDemo, "#demo-variants"); ``` - \ No newline at end of file +```javascript +const TestDemo = () => { + return Div({ class: "flex flex-wrap gap-2 justify-center" }, [ + $html("span", {class: "indicator"},[ + 5, + Button('Click')]) + ]); +}; +$mount(TestDemo, "#demo-test"); +``` diff --git a/docs/index.html b/docs/index.html index d204656..02e35b1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -17,6 +17,13 @@ /> + +
@@ -26,26 +33,40 @@ name: "SigPro-UI", repo: "", loadSidebar: true, - subMaxLevel: 3, sidebarDisplayLevel: 1, executeScript: true, copyCode: { - buttonText: - '', + buttonText: '', errorText: "Error", - successText: - '', + successText: '', }, + plugins: [ + function(hook, vm) { + hook.doneEach(function() { + // Buscamos los bloques de código JS que queremos ejecutar + const codeBlocks = document.querySelectorAll('pre[data-lang="javascript"] code'); + + codeBlocks.forEach(code => { + // Usamos un bloque try/catch por si el código del Markdown tiene errores + try { + // Ejecutamos el código. + // Como tu librería ya puso $, $mount, Button, etc. en 'window', + // el código los encontrará directamente. + const runDemo = new Function(code.innerText); + runDemo(); + } catch (err) { + console.error("Error en la demo de SigPro:", err); + } + }); + }); + } + ] }; - - - - - - - + + + - + \ No newline at end of file diff --git a/docs/install.md b/docs/install.md index d2ba18f..3b861a3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -4,13 +4,18 @@ Follow these steps to integrate **SigPro-UI** into your project. ## Prerequisites -Make sure your project already has: - -- [SigPro Core](https://www.npmjs.com/package/sigpro) installed. - [Tailwind CSS v4](https://tailwindcss.com/) configured. - [daisyUI v5](https://daisyui.com/) installed. -## 1️.Install the package +--- + + +!> **📘 Core Concepts** +**Note:** SigPro-UI now includes SigPro core internally. You no longer need to install SigPro separately. + SigProUI is built on top of the [SigPro](https://natxocc.github.io/sigpro/#/) reactive core. To learn how to create signals, manage reactivity, and structure your application logic, check out the [SigPro documentation](https://natxocc.github.io/sigpro/#/). It covers everything you need to build reactive applications with signals, computed values, and effects. +--- + +## 1. Install the package Choose your preferred package manager: @@ -24,7 +29,7 @@ bun add sigpro-ui yarn add sigpro-ui ``` -## 2️.Configure CSS +## 2. Configure CSS Add the following to your main CSS file (e.g., `app.css`): @@ -35,48 +40,67 @@ Add the following to your main CSS file (e.g., `app.css`): > This enables Tailwind CSS v4 + daisyUI v5 styles for all SigPro-UI components. -## 3️.Import and initialize in your app +## 3. Import and use in your app -Create or update your `main.js` (or `index.js`): +### ESM / Module usage ```javascript -// Import required modules -import { $, $mount } from "sigpro"; -import { UI } from "sigpro-ui"; +// Import everything from sigpro-ui (includes sigpro core) +import { $, $mount, Button, Alert, Input, tt } from "sigpro-ui"; // Import your CSS (adjust the path if needed) import "./app.css"; -// Import your main App component -import { App } from "./App.js"; - -// Initialize SigPro-UI (English locale) -UI("en"); +// Create your app +const App = () => { + const count = $(0); + + return $html('div', { class: 'p-8 max-w-md mx-auto' }, [ + $html('h1', { class: 'text-2xl font-bold mb-4' }, 'SigProUI Demo'), + + Input({ + label: 'Your name', + placeholder: 'Enter your name...' + }), + + Button({ + class: 'btn-primary mt-4', + onclick: () => count(count() + 1) + }, () => `Clicks: ${count()}`), + + Alert({ + type: 'success', + message: () => `Welcome to SigProUI!` + }) + ]); +}; // Mount your app $mount(App, "#app"); ``` -## 4️.Create your first component - -Example `App.js`: +### CommonJS usage ```javascript -import { Div, Button, Alert } from "sigpro-ui"; +const { $, $mount, Button, Input, Alert } = require('sigpro-ui'); -export const App = () => { - return Div({ class: "p-4" }, [ - Button({ - class: "btn-primary", - onclick: () => Alert("Hello SigPro-UI!") - }, "Click Me") +const App = () => { + const count = $(0); + + return $html('div', { class: 'p-8' }, [ + Button({ + class: 'btn-primary', + onclick: () => count(count() + 1) + }, () => `Clicks: ${count()}`) ]); }; + +$mount(App, "#app"); ``` -## Optional: Use CDN (no build step) +## 4. CDN Usage (no build step) -If you prefer not to use a build step, you can import directly from a CDN: +Simply add the script tag and start using SigProUI: ```html @@ -84,46 +108,134 @@ If you prefer not to use a build step, you can import directly from a CDN: - + SigProUI Demo + +
- ``` +## What's included? + +When you install SigProUI, you get: + +### SigPro Core Functions +- `$()` - Reactive signals +- `$watch()` - Watch reactive dependencies +- `$html()` - Create HTML elements with reactivity +- `$if()` - Conditional rendering +- `$for()` - List rendering +- `$router()` - Hash-based routing +- `$mount()` - Mount components to DOM + +### UI Components +- `Button()` - Styled button with DaisyUI +- `Input()` - Form input with floating labels +- `Alert()` - Alert messages +- `Modal()` - Modal dialogs +- `Table()` - Data tables +- `Tabs()` - Tabbed interfaces +- And 30+ more components! + +### Utilities +- `Icons` - SVG icon set +- `Utils` - Helper functions (joinClass, val) +- `tt()` - i18n translation function + +## Language Support + +SigProUI includes built-in i18n with Spanish and English: + +```javascript +import { tt } from 'sigpro-ui'; + +// Change locale (default is 'es') +tt.setLocale('en'); + +// Use translations +const closeButton = Button({}, tt('close')()); +const searchPlaceholder = Input({ placeholder: tt('search')() }); +``` + +Available translations: `close`, `confirm`, `cancel`, `search`, `loading`, `nodata` + +## TypeScript Support + +SigProUI includes TypeScript definitions. Import types as needed: + +```typescript +import { Button, Input, type ButtonProps, type InputProps } from 'sigpro-ui'; + +const MyButton: React.FC = (props) => { + return Button(props, 'Click me'); +}; +``` + ## Troubleshooting | Problem | Solution | | :--- | :--- | -| Components don't look styled | Check that `app.css` is imported and contains the Tailwind + daisyUI directives. | -| `UI is not defined` | Make sure you call `UI()` **before** using any component like `Button`, `Input`, etc. | -| Locale not working | Verify you passed a valid locale (`"es"` or `"en"`) to `UI()`. | -| Build errors with Tailwind v4 | Ensure Tailwind CSS v4 and daisyUI v5 are correctly installed and configured. | +| Components don't look styled | Check that you've included Tailwind + daisyUI CSS (either via import or CDN) | +| `$ is not defined` | SigProUI includes sigpro core - no need to install separately. Make sure you're importing from 'sigpro-ui' | +| `Button is not defined` | In CDN mode, all components are in window. Use `window.Button` or destructure from window | +| Build errors | Ensure you're using a modern bundler that supports ESM | +| CDN components not working | The CDN version exposes everything globally. Use `const { $, Button } = window;` or call directly | +| Locale not working | Set locale with `tt.setLocale('en')` before using translations | +## Migration from older versions + +If you were using SigProUI v1.0.x with separate SigPro installation: + +**Before:** +```javascript +import { $ } from 'sigpro'; +import { Button } from 'sigpro-ui'; +``` + +**Now:** +```javascript +import { $, Button } from 'sigpro-ui'; +// That's it! Everything comes from one package. +``` **Happy coding!** 🎉 - diff --git a/docs/sigpro-ui.min.js b/docs/sigpro-ui.min.js new file mode 100644 index 0000000..092e5e6 --- /dev/null +++ b/docs/sigpro-ui.min.js @@ -0,0 +1,7 @@ +(()=>{var{defineProperty:mA,getOwnPropertyNames:Eo,getOwnPropertyDescriptor:Go}=Object,Lo=Object.prototype.hasOwnProperty;var Io=new WeakMap,Jo=(o)=>{var t=Io.get(o),r;if(t)return t;if(t=mA({},"__esModule",{value:!0}),o&&typeof o==="object"||typeof o==="function")Eo(o).map((a)=>!Lo.call(t,a)&&mA(t,a,{get:()=>o[a],enumerable:!(r=Go(o,a))||r.enumerable}));return Io.set(o,t),t};var u=(o,t)=>{for(var r in t)mA(o,r,{get:t[r],enumerable:!0,configurable:!0,set:(a)=>t[r]=()=>a})};var Xo={};u(Xo,{val:()=>d,tt:()=>R,joinClass:()=>x,iconWarning:()=>N,iconUpload:()=>aA,iconSuccess:()=>L,iconShow:()=>Z,iconRight:()=>oA,iconRRight:()=>sA,iconMail:()=>_,iconLock:()=>O,iconLeft:()=>AA,iconLLeft:()=>tA,iconInfo:()=>G,iconHide:()=>P,iconError:()=>J,iconClose:()=>W,iconCalendar:()=>E,iconAbc:()=>q,icon123:()=>$,Tooltip:()=>vo,Toast:()=>Uo,Timeline:()=>Co,Tabs:()=>po,Table:()=>xo,Swap:()=>go,Stat:()=>mo,Stack:()=>io,Select:()=>eo,Rating:()=>lo,Range:()=>so,Radio:()=>oo,Navbar:()=>_A,Modal:()=>qA,Menu:()=>WA,Loading:()=>ZA,List:()=>KA,Input:()=>F,Indicator:()=>zA,Fileinput:()=>NA,Fieldset:()=>LA,Fab:()=>EA,Dropdown:()=>FA,Drawer:()=>yA,Datepicker:()=>HA,Colorpicker:()=>IA,Checkbox:()=>YA,Button:()=>j,Badge:()=>vA,Autocomplete:()=>UA,Alert:()=>BA,Accordion:()=>uA});var h=null,V=null,z=new Set,k=!1,fA=new WeakMap,No=()=>{if(k)return;k=!0;while(z.size>0){let o=Array.from(z).sort((t,r)=>(t.depth||0)-(r.depth||0));z.clear();for(let t of o)if(!t._deleted)t()}k=!1},Vo=(o)=>{if(h&&!h._deleted)o.add(h),h._deps.add(o)},gA=(o)=>{for(let t of o){if(t===h||t._deleted)continue;if(t._isComputed){if(t.markDirty(),t._subs)gA(t._subs)}else z.add(t)}if(!k)queueMicrotask(No)},bA=(o)=>{if(o._cleanups)o._cleanups.forEach((t)=>t()),o._cleanups.clear();o.childNodes?.forEach(bA)},K=(o)=>{let t=new Set,r=V,a=document.createElement("div");a.style.display="contents",V={cleanups:t};try{let e=o({onCleanup:(s)=>t.add(s)}),n=(s)=>{if(!s)return;if(s._isRuntime)t.add(s.destroy),a.appendChild(s.container);else if(Array.isArray(s))s.forEach(n);else a.appendChild(s instanceof Node?s:document.createTextNode(String(s)))};n(e)}finally{V=r}return{_isRuntime:!0,container:a,destroy:()=>{t.forEach((e)=>e()),bA(a),a.remove()}}},S=(o,t=null)=>{if(typeof o==="function"){let e=new Set,n,s=!0,l=()=>{if(l._deleted)return;l._deps.forEach((c)=>c.delete(l)),l._deps.clear();let i=h;h=l;try{let c=o();if(!Object.is(n,c)||s)n=c,s=!1,gA(e)}finally{h=i}};if(l._deps=new Set,l._isComputed=!0,l._subs=e,l._deleted=!1,l.markDirty=()=>s=!0,l.stop=()=>{l._deleted=!0,l._deps.forEach((i)=>i.delete(l)),e.clear()},V)V.cleanups.add(l.stop);return()=>{if(s)l();return Vo(e),n}}let r=o;if(t)try{let e=localStorage.getItem(t);if(e!==null)r=JSON.parse(e)}catch(e){console.warn("SigPro: LocalStorage locked",e)}let a=new Set;return(...e)=>{if(e.length){let n=typeof e[0]==="function"?e[0](r):e[0];if(!Object.is(r,n)){if(r=n,t)localStorage.setItem(t,JSON.stringify(r));gA(a)}}return Vo(a),r}},H=(o,t)=>{let r=Array.isArray(o),a=r?t:o,e=r?o:null;if(typeof a!=="function")return()=>{};let n=V,s=()=>{if(s._deleted)return;s._deps.forEach((c)=>c.delete(s)),s._deps.clear(),s._cleanups.forEach((c)=>c()),s._cleanups.clear();let l=h,i=V;h=s,V={cleanups:s._cleanups},s.depth=l?l.depth+1:0;try{if(r)h=null,a(),h=s,e.forEach((c)=>typeof c==="function"&&c());else a()}finally{h=l,V=i}};if(s._deps=new Set,s._cleanups=new Set,s._deleted=!1,s.stop=()=>{if(s._deleted)return;if(s._deleted=!0,z.delete(s),s._deps.forEach((l)=>l.delete(s)),s._cleanups.forEach((l)=>l()),n)n.cleanups.delete(s.stop)},n)n.cleanups.add(s.stop);return s(),s.stop},A=(o,t={},r=[])=>{if(t instanceof Node||Array.isArray(t)||typeof t!=="object")r=t,t={};let a=document.createElement(o),e=(s,l)=>(s==="src"||s==="href")&&String(l).toLowerCase().includes("javascript:")?"#":l;a._cleanups=new Set;for(let[s,l]of Object.entries(t)){if(s==="ref"){typeof l==="function"?l(a):l.current=a;continue}let i=typeof l==="function";if(["INPUT","TEXTAREA","SELECT"].includes(a.tagName)&&(s==="value"||s==="checked")&&i){a._cleanups.add(H(()=>{let f=l();if(a[s]!==f)a[s]=f}));let m=s==="checked"?"change":"input",p=(f)=>l(f.target[s]);a.addEventListener(m,p),a._cleanups.add(()=>a.removeEventListener(m,p))}else if(s.startsWith("on")){let m=s.slice(2).toLowerCase().split(".")[0],p=(f)=>l(f);a.addEventListener(m,p),a._cleanups.add(()=>a.removeEventListener(m,p))}else if(i)a._cleanups.add(H(()=>{let m=e(s,l());if(s==="class")a.className=m||"";else m==null?a.removeAttribute(s):a.setAttribute(s,m)}));else a.setAttribute(s,e(s,l))}let n=(s)=>{if(Array.isArray(s))return s.forEach(n);if(typeof s==="function"){let l=document.createTextNode("");a.appendChild(l);let i=[];a._cleanups.add(H(()=>{let c=s(),b=(Array.isArray(c)?c:[c]).map((m)=>m?._isRuntime?m.container:m instanceof Node?m:document.createTextNode(m??""));i.forEach((m)=>{bA(m),m.remove()}),b.forEach((m)=>l.parentNode?.insertBefore(m,l)),i=b}))}else a.appendChild(s instanceof Node?s:document.createTextNode(s??""))};return n(r),a},w=(o,t,r=null)=>{let a=document.createTextNode(""),e=A("div",{style:"display:contents"},[a]),n=null,s=null;return H(()=>{let l=!!(typeof o==="function"?o():o);if(l!==s){if(s=l,n)n.destroy();let i=l?t:r;if(i)n=K(()=>typeof i==="function"?i():i),e.insertBefore(n.container,a)}}),e};w.not=(o,t,r)=>w(()=>!(typeof o==="function"?o():o),t,r);var U=(o,t,r)=>{let a=document.createTextNode(""),e=A("div",{style:"display:contents"},[a]),n=new Map;return H(()=>{let s=(typeof o==="function"?o():o)||[],l=new Map,i=[];for(let b=0;bt(m,b));else n.delete(p);l.set(p,f),i.push(p)}n.forEach((b)=>{b.destroy(),b.container.remove()});let c=a;for(let b=i.length-1;b>=0;b--){let m=l.get(i[b]);if(m.container.nextSibling!==c)e.insertBefore(m.container,c);c=m.container}n=l}),e},M=(o)=>{let t=S(window.location.hash.replace(/^#/,"")||"/");window.addEventListener("hashchange",()=>t(window.location.hash.replace(/^#/,"")||"/"));let r=A("div",{class:"router-outlet"}),a=null;return H([t],async()=>{let e=t(),n=o.find((s)=>{let l=s.path.split("/").filter(Boolean),i=e.split("/").filter(Boolean);return l.length===i.length&&l.every((c,b)=>c.startsWith(":")||c===i[b])})||o.find((s)=>s.path==="*");if(n){let s=n.component;if(typeof s==="function"&&s.toString().includes("import"))s=(await s()).default||await s();let l={};if(n.path.split("/").filter(Boolean).forEach((i,c)=>{if(i.startsWith(":"))l[i.slice(1)]=e.split("/").filter(Boolean)[c]}),a)a.destroy();if(M.params)M.params(l);a=K(()=>{try{return typeof s==="function"?s(l):s}catch(i){return A("div",{class:"p-4 text-error"},"Error loading view")}}),r.appendChild(a.container)}}),r};M.params=S({});M.to=(o)=>window.location.hash=o.replace(/^#?\/?/,"#/");M.back=()=>window.history.back();M.path=()=>window.location.hash.replace(/^#/,"")||"/";var xA=(o,t)=>{let r=typeof t==="string"?document.querySelector(t):t;if(!r)return;if(fA.has(r))fA.get(r).destroy();let a=K(typeof o==="function"?o:()=>o);return r.replaceChildren(a.container),fA.set(r,a),a},To={$:S,$watch:H,$html:A,$if:w,$for:U,$router:M,$mount:xA};if(typeof window<"u")((t)=>{Object.keys(t).forEach((a)=>{window[a]=t[a]}),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer address ul ol li dl dt dd a em strong small i b u mark time sub sup pre code blockquote details summary dialog form label input textarea select button option fieldset legend table thead tbody tfoot tr th td caption img video audio canvas svg iframe picture source progress meter".split(/\s+/).forEach((a)=>{let e=a.charAt(0).toUpperCase()+a.slice(1);if(!(e in window))window[e]=(n,s)=>A(a,n,s)}),window.SigPro=Object.freeze(t)})(To);var rA={};u(rA,{default:()=>Ko,Tooltip:()=>vo,Toast:()=>Uo,Timeline:()=>Co,Tabs:()=>po,Table:()=>xo,Swap:()=>go,Stat:()=>mo,Stack:()=>io,Select:()=>eo,Rating:()=>lo,Range:()=>so,Radio:()=>oo,Navbar:()=>_A,Modal:()=>qA,Menu:()=>WA,Loading:()=>ZA,List:()=>KA,Input:()=>F,Indicator:()=>zA,Fileinput:()=>NA,Fieldset:()=>LA,Fab:()=>EA,Dropdown:()=>FA,Drawer:()=>yA,Datepicker:()=>HA,Colorpicker:()=>IA,Checkbox:()=>YA,Button:()=>j,Badge:()=>vA,Autocomplete:()=>UA,Alert:()=>BA,Accordion:()=>uA});var pA={};u(pA,{Accordion:()=>uA});var X={};u(X,{val:()=>d,joinClass:()=>x});var d=(o)=>typeof o==="function"?o():o,x=(o,t)=>typeof t==="function"?()=>`${o} ${t()||""}`.trim():`${o} ${t||""}`.trim();var uA=(o,t)=>{let{title:r,name:a,open:e,...n}=o;return A("div",{...n,class:x("collapse collapse-arrow bg-base-200 mb-2",o.class)},[A("input",{type:a?"radio":"checkbox",name:a,checked:e}),A("div",{class:"collapse-title text-xl font-medium"},r),A("div",{class:"collapse-content"},t)])};var CA={};u(CA,{Alert:()=>BA});var lA={};u(lA,{iconWarning:()=>N,iconUpload:()=>aA,iconSuccess:()=>L,iconShow:()=>Z,iconRight:()=>oA,iconRRight:()=>sA,iconMail:()=>_,iconLock:()=>O,iconLeft:()=>AA,iconLLeft:()=>tA,iconInfo:()=>G,iconHide:()=>P,iconError:()=>J,iconClose:()=>W,iconCalendar:()=>E,iconAbc:()=>q,icon123:()=>$});var Z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg==",P="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC",W="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg==",E="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC",O="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII=",q="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg==",$="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg==",_="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC",G="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC",L="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg==",J="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC",N="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII=",AA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg==",oA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg==",tA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg==",sA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII=",aA="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC";var BA=(o,t)=>{let{type:r="info",soft:a=!0,...e}=o,n={info:G,success:L,warning:N,error:J},s=()=>{let i=d(r);return{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-error"}[i]||i},l=t||o.message;return A("div",{...e,role:"alert",class:()=>`alert ${s()} ${d(a)?"alert-soft":""} ${o.class||""}`},[A("img",{src:n[d(r)]||n.info,class:"w-4 h-4 object-contain",alt:d(r)}),A("div",{class:"flex-1"},[A("span",{},[typeof l==="function"?l():l])]),o.actions?A("div",{class:"flex-none"},[typeof o.actions==="function"?o.actions():o.actions]):null])};var wA={};u(wA,{Autocomplete:()=>UA});var zo={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"}},ko=S("es");var R=(o)=>()=>zo[ko()][o]||o;var SA={};u(SA,{Input:()=>F});var F=(o)=>{let{label:t,tip:r,value:a,error:e,isSearch:n,icon:s,type:l="text",...i}=o,c=l==="password",b=S(!1),m={text:q,password:O,date:E,number:$,email:_},p=A("input",{...i,type:()=>c?b()?"text":"password":l,placeholder:o.placeholder||t||(n?R("search")():" "),class:x("grow order-2 focus:outline-none",o.class),value:a,oninput:(C)=>o.oninput?.(C),disabled:()=>d(o.disabled)}),f=s?s:m[l]?A("img",{src:m[l],class:"opacity-50",alt:l}):null;return A("label",{class:()=>x("input input-bordered floating-label flex items-center gap-2 w-full relative",d(e)?"input-error":"")},[f?A("div",{class:"order-1 shrink-0"},f):null,t?A("span",{class:"text-base-content/60 order-0"},t):null,p,c?A("button",{type:"button",class:"order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100",onclick:(C)=>{C.preventDefault(),b(!b())}},()=>A("img",{class:"w-5 h-5",src:b()?Z:P})):null,r?A("div",{class:"tooltip tooltip-left order-4","data-tip":r},A("span",{class:"badge badge-ghost badge-xs cursor-help"},"?")):null,()=>d(e)?A("span",{class:"text-error text-[10px] absolute -bottom-5 left-2"},d(e)):null])};var UA=(o)=>{let{options:t=[],value:r,onSelect:a,label:e,placeholder:n,...s}=o,l=S(d(r)||""),i=S(!1),c=S(-1),b=S(()=>{let f=l().toLowerCase(),C=d(t)||[];return f?C.filter((Q)=>(typeof Q==="string"?Q:Q.label).toLowerCase().includes(f)):C}),m=(f)=>{let C=typeof f==="string"?f:f.value,Q=typeof f==="string"?f:f.label;if(l(Q),typeof r==="function")r(C);a?.(f),i(!1),c(-1)},p=(f)=>{let C=b();if(f.key==="ArrowDown")f.preventDefault(),i(!0),c(Math.min(c()+1,C.length-1));else if(f.key==="ArrowUp")f.preventDefault(),c(Math.max(c()-1,0));else if(f.key==="Enter"&&c()>=0)f.preventDefault(),m(C[c()]);else if(f.key==="Escape")i(!1)};return A("div",{class:"relative w-full"},[F({label:e,placeholder:n||R("search")(),value:l,onfocus:()=>i(!0),onblur:()=>setTimeout(()=>i(!1),150),onkeydown:p,oninput:(f)=>{let C=f.target.value;if(l(C),typeof r==="function")r(C);i(!0),c(-1)},...s}),A("ul",{class:"absolute 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:()=>i()&&b().length?"display:block":"display:none"},[U(b,(f,C)=>A("li",{},[A("a",{class:()=>`block w-full ${c()===C?"active bg-primary text-primary-content":""}`,onclick:()=>m(f),onmouseenter:()=>c(C)},typeof f==="string"?f:f.label)]),(f,C)=>(typeof f==="string"?f:f.value)+C),()=>b().length?null:A("li",{class:"p-2 text-center opacity-50"},"No results")])])};var hA={};u(hA,{Badge:()=>vA});var vA=(o,t)=>A("span",{...o,class:x("badge",o.class)},t);var RA={};u(RA,{Button:()=>j});var j=(o,t)=>{let{badge:r,badgeClass:a,tooltip:e,icon:n,loading:s,...l}=o,c=A("button",{...l,class:x("btn",o.class),disabled:()=>d(s)||d(o.disabled)},[()=>d(s)?A("span",{class:"loading loading-spinner"}):null,n?A("span",{class:"mr-1"},n):null,t]);if(r)c=A("div",{class:"indicator"},[A("span",{class:x("indicator-item badge",a||"badge-secondary")},r),c]);return e?A("div",{class:"tooltip","data-tip":e},c):c};var DA={};u(DA,{Checkbox:()=>YA});var YA=(o)=>{let{value:t,tooltip:r,toggle:a,label:e,...n}=o,s=A("input",{...n,type:"checkbox",class:()=>d(a)?"toggle":"checkbox",checked:t}),l=A("label",{class:"label cursor-pointer justify-start gap-3"},[s,e?A("span",{class:"label-text"},e):null]);return r?A("div",{class:"tooltip","data-tip":r},l):l};var VA={};u(VA,{Colorpicker:()=>IA});var IA=(o)=>{let{value:t,label:r,...a}=o,e=S(!1),n=["#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"],s=()=>d(t)||"#000000";return A("div",{class:"relative w-fit"},[A("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:(l)=>{l.stopPropagation(),e(!e())},...a},[A("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${s()}`}),r?A("span",{class:"opacity-80"},r):null]),w(e,()=>A("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:(l)=>l.stopPropagation()},[A("div",{class:"grid grid-cols-8 gap-1"},n.map((l)=>A("button",{type:"button",style:`background-color: ${l}`,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 + ${s().toLowerCase()===l.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""}`},onclick:()=>{if(typeof t==="function")t(l);e(!1)}})))])),w(e,()=>A("div",{class:"fixed inset-0 z-[100]",onclick:()=>e(!1)}))])};var QA={};u(QA,{Datepicker:()=>HA});var HA=(o)=>{let{value:t,range:r,label:a,placeholder:e,hour:n=!1,...s}=o,l=S(!1),i=S(new Date),c=S(null),b=S(0),m=S(0),p=()=>d(r)===!0,f=new Date,C=`${f.getFullYear()}-${String(f.getMonth()+1).padStart(2,"0")}-${String(f.getDate()).padStart(2,"0")}`,Q=(g)=>{let B=g.getFullYear(),v=String(g.getMonth()+1).padStart(2,"0"),D=String(g.getDate()).padStart(2,"0");return`${B}-${v}-${D}`},Qo=(g)=>{let B=Q(g),v=d(t);if(p())if(!v?.start||v.start&&v.end){if(typeof t==="function")t({start:B,end:null,...n&&{startHour:b()}})}else{let D=v.start;if(typeof t==="function"){let T=B{let g=d(t);if(!g)return"";if(typeof g==="string"){if(n&&g.includes("T"))return g.replace("T"," ");return g}if(g.start&&g.end){let B=n&&g.startHour?`${g.start} ${String(g.startHour).padStart(2,"0")}:00`:g.start,v=n&&g.endHour?`${g.end} ${String(g.endHour).padStart(2,"0")}:00`:g.end;return`${B} - ${v}`}if(g.start)return`${n&&g.startHour?`${g.start} ${String(g.startHour).padStart(2,"0")}:00`:g.start}...`;return""}),Ro=(g)=>{let B=i();i(new Date(B.getFullYear(),B.getMonth()+g,1))},Yo=(g)=>{let B=i();i(new Date(B.getFullYear()+g,B.getMonth(),1))},eA=({value:g,onChange:B})=>{return A("div",{class:"flex-1"},[A("div",{class:"flex gap-2 items-center"},[A("input",{type:"range",min:0,max:23,value:g,class:"range range-xs flex-1",oninput:(v)=>{let D=parseInt(v.target.value);B(D)}}),A("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(d(g)).padStart(2,"0")+":00")])])};return A("div",{class:"relative w-full"},[F({label:a,placeholder:e||(p()?"Seleccionar rango...":"Seleccionar fecha..."),value:yo,readonly:!0,icon:A("img",{src:E,class:"opacity-40"}),onclick:(g)=>{g.stopPropagation(),l(!l())},...s}),w(l,()=>A("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:(g)=>g.stopPropagation()},[A("div",{class:"flex justify-between items-center mb-4 gap-1"},[A("div",{class:"flex gap-0.5"},[A("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>Yo(-1)},A("img",{src:tA,class:"opacity-40"})),A("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>Ro(-1)},A("img",{src:AA,class:"opacity-40"}))]),A("span",{class:"font-bold uppercase flex-1 text-center"},[()=>i().toLocaleString("es-ES",{month:"short",year:"numeric"})]),A("div",{class:"flex gap-0.5"},[A("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>Ro(1)},A("img",{src:oA,class:"opacity-40"})),A("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>Yo(1)},A("img",{src:sA,class:"opacity-40"}))])]),A("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>c(null)},[...["L","M","X","J","V","S","D"].map((g)=>A("div",{class:"text-[10px] opacity-40 font-bold text-center"},g)),()=>{let g=i(),B=g.getFullYear(),v=g.getMonth(),D=new Date(B,v,1).getDay(),T=D===0?6:D-1,Mo=new Date(B,v+1,0).getDate(),nA=[];for(let y=0;y{let I=d(t),iA=c(),Fo=typeof I==="string"?I.split("T")[0]===Y:I?.start===Y,jo=I?.end===Y,cA=!1;if(p()&&I?.start){let dA=I.start;if(!I.end&&iA)cA=Y>dA&&Y<=iA||Y=iA;else if(I.end)cA=Y>dA&&Y{if(p())c(Y)},onclick:()=>Qo(Do)},[y.toString()]))}return nA}]),n?A("div",{class:"mt-3 pt-2 border-t border-base-300"},[p()?A("div",{class:"flex gap-4"},[eA({value:b,onChange:(g)=>{b(g);let B=d(t);if(B?.start)t({...B,startHour:g})}}),eA({value:m,onChange:(g)=>{m(g);let B=d(t);if(B?.end)t({...B,endHour:g})}})]):eA({value:b,onChange:(g)=>{b(g);let B=d(t);if(B&&typeof B==="string"&&B.includes("-"))t(B.split("T")[0]+"T"+String(g).padStart(2,"0")+":00:00")}})]):null])),w(l,()=>A("div",{class:"fixed inset-0 z-[90]",onclick:()=>l(!1)}))])};var MA={};u(MA,{Drawer:()=>yA});var yA=(o)=>A("div",{class:x("drawer",o.class)},[A("input",{id:o.id,type:"checkbox",class:"drawer-toggle",checked:o.open}),A("div",{class:"drawer-content"},o.content),A("div",{class:"drawer-side"},[A("label",{for:o.id,class:"drawer-overlay",onclick:()=>o.open?.(!1)}),A("div",{class:"min-h-full bg-base-200 w-80"},o.side)])]);var jA={};u(jA,{Dropdown:()=>FA});var FA=(o,t)=>{let{label:r,icon:a,items:e,...n}=o,s=()=>{if(e)return A("ul",{tabindex:0,class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[U(typeof e==="function"?e:()=>e,(i)=>A("li",{},[A("a",{class:i.class||"",onclick:(c)=>{if(i.onclick)i.onclick(c);if(document.activeElement)document.activeElement.blur()}},[i.icon?A("span",{},i.icon):null,A("span",{},i.label)])]))]);return A("div",{tabindex:0,class:"dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300"},[typeof t==="function"?t():t])};return A("div",{...n,class:()=>`dropdown ${d(o.class)||""}`},[A("div",{tabindex:0,role:"button",class:"btn m-1 flex items-center gap-2"},[a?typeof a==="function"?a():a:null,r?typeof r==="function"?r():r:null]),s()])};var GA={};u(GA,{Fab:()=>EA});var EA=(o)=>{let{icon:t,label:r,actions:a=[],position:e="bottom-6 right-6",class:n="",...s}=o;return A("div",{...s,class:`fab absolute ${e} flex flex-col-reverse items-end gap-3 z-[100] ${n}`},[A("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[t?typeof t==="function"?t():t:null,!t&&r?r:null]),...d(a).map((l)=>A("div",{class:"flex items-center gap-3 transition-all duration-300"},[l.label?A("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},l.label):null,A("button",{type:"button",class:`btn btn-circle shadow-lg ${l.class||""}`,onclick:(i)=>{i.stopPropagation(),l.onclick?.(i)}},[l.icon?typeof l.icon==="function"?l.icon():l.icon:l.text||""])]))])};var JA={};u(JA,{Fieldset:()=>LA});var LA=(o,t)=>A("fieldset",{...o,class:x("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",o.class)},[()=>{let r=d(o.legend);return r?A("legend",{class:"fieldset-legend font-bold"},[r]):null},t]);var TA={};u(TA,{Fileinput:()=>NA});var NA=(o)=>{let{tooltip:t,max:r=2,accept:a="*",onSelect:e}=o,n=S([]),s=S(!1),l=S(null),i=r*1024*1024,c=(m)=>{let p=Array.from(m);if(l(null),p.find((C)=>C.size>i)){l(`Máx ${r}MB`);return}n([...n(),...p]),e?.(n())},b=(m)=>{let p=n().filter((f,C)=>C!==m);n(p),e?.(p)};return A("fieldset",{class:"fieldset w-full p-0"},[A("div",{class:()=>`w-full ${t?"tooltip tooltip-top before:z-50 after:z-50":""}`,"data-tip":t},[A("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 + ${s()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"} + `,ondragover:(m)=>{m.preventDefault(),s(!0)},ondragleave:()=>s(!1),ondrop:(m)=>{m.preventDefault(),s(!1),c(m.dataTransfer.files)}},[A("div",{class:"flex items-center gap-3 w-full"},[A("img",{src:aA,class:"w-5 h-5 opacity-50 shrink-0"}),A("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),A("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${r}MB`)]),A("input",{type:"file",multiple:!0,accept:a,class:"hidden",onchange:(m)=>c(m.target.files)})])]),()=>l()?A("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},l()):null,w(()=>n().length>0,()=>A("ul",{class:"mt-2 space-y-1"},[U(n,(m,p)=>A("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[A("div",{class:"flex items-center gap-2 truncate"},[A("span",{class:"opacity-50"},"\uD83D\uDCC4"),A("span",{class:"truncate font-medium max-w-[200px]"},m.name),A("span",{class:"text-[9px] opacity-40"},`(${(m.size/1024).toFixed(0)} KB)`)]),A("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:(f)=>{f.preventDefault(),f.stopPropagation(),b(p)}},[A("img",{src:W,class:"w-3 h-3 opacity-70"})])]),(m)=>m.name+m.lastModified)]))])};var kA={};u(kA,{Indicator:()=>zA});var zA=(o,t)=>A("div",{class:x("indicator",o.class)},[t,A("span",{class:x("indicator-item badge",o.badgeClass)},o.badge)]);var XA={};u(XA,{List:()=>KA});var KA=(o)=>{let{items:t,header:r,render:a,keyFn:e=(i,c)=>c,class:n,...s}=o,l=U(t,(i,c)=>A("li",{class:"list-row"},[a(i,c)]),e);return A("ul",{...s,class:x("list bg-base-100 rounded-box shadow-md",n)},r?[w(r,()=>A("li",{class:"p-4 pb-2 text-xs opacity-60"},[d(r)])),l]:l)};var PA={};u(PA,{Loading:()=>ZA});var ZA=(o)=>{return w(o.$show,()=>A("div",{class:"fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30"},[A("span",{class:"loading loading-spinner loading-lg text-primary"})]))};var OA={};u(OA,{Menu:()=>WA});var WA=(o)=>{let t=(r)=>U(()=>r||[],(a)=>A("li",{},[a.children?A("details",{open:a.open},[A("summary",{},[a.icon&&A("span",{class:"mr-2"},a.icon),a.label]),A("ul",{},t(a.children))]):A("a",{class:()=>d(a.active)?"active":"",onclick:a.onclick},[a.icon&&A("span",{class:"mr-2"},a.icon),a.label])]),(a,e)=>a.label||e);return A("ul",{...o,class:x("menu bg-base-200 rounded-box",o.class)},t(o.items))};var $A={};u($A,{Modal:()=>qA});var qA=(o,t)=>{let{title:r,buttons:a,open:e,...n}=o,s={current:null};H(()=>{let i=s.current;if(!i)return;if(e()){if(!i.open)i.showModal()}else if(i.open)i.close()});let l=(i)=>{if(i&&i.preventDefault)i.preventDefault();e(!1)};return A("dialog",{...n,ref:s,class:"modal",oncancel:()=>e(!1)},[A("div",{class:"modal-box"},[r?A("h3",{class:"text-lg font-bold mb-4"},r):null,A("div",{class:"py-2"},[typeof t==="function"?t():t]),A("div",{class:"modal-action flex gap-2"},[...(Array.isArray(a)?a:[a]).filter(Boolean),j({type:"button",onclick:l},R("close")())])]),A("form",{method:"dialog",class:"modal-backdrop",onsubmit:l},[A("button",{},"close")])])};var Ao={};u(Ao,{Navbar:()=>_A});var _A=(o,t)=>A("div",{...o,class:x("navbar bg-base-100 shadow-sm px-4",o.class)},t);var to={};u(to,{Radio:()=>oo});var oo=(o)=>{let{label:t,tooltip:r,value:a,inputValue:e,name:n,...s}=o,l=A("input",{...s,type:"radio",name:n,class:x("radio",o.class),checked:()=>d(a)===e,onclick:()=>{if(typeof a==="function")a(e)}});if(!t&&!r)return l;return A("label",{class:"label cursor-pointer justify-start gap-3"},[l,t?A("span",{class:"label-text"},t):null])};var ao={};u(ao,{Range:()=>so});var so=(o)=>{let{label:t,tooltip:r,value:a,...e}=o,n=A("input",{...e,type:"range",class:x("range",o.class),value:a,disabled:()=>d(o.disabled)});if(!t&&!r)return n;let s=A("div",{class:"flex flex-col gap-2"},[t?A("span",{class:"label-text"},t):null,n]);return r?A("div",{class:"tooltip","data-tip":r},s):s};var ro={};u(ro,{Rating:()=>lo});var lo=(o)=>{let{value:t,count:r=5,mask:a="mask-star",readonly:e=!1,onchange:n,...s}=o,l=`rating-${Math.random().toString(36).slice(2,7)}`;return A("div",{...s,class:()=>`rating ${d(e)?"pointer-events-none":""} ${o.class||""}`},Array.from({length:d(r)},(i,c)=>{let b=c+1;return A("input",{type:"radio",name:l,class:`mask ${a}`,checked:()=>Math.round(d(t))===b,onchange:()=>{if(!d(e)){if(typeof n==="function")n(b);else if(typeof t==="function")t(b)}}})}))};var no={};u(no,{Select:()=>eo});var eo=(o)=>{let{label:t,options:r,value:a,...e}=o,n=A("select",{...e,class:x("select select-bordered w-full",o.class),value:a},U(()=>d(r)||[],(s)=>A("option",{value:s.value,$selected:()=>String(d(a))===String(s.value)},s.label),(s)=>s.value));if(!t)return n;return A("label",{class:"fieldset-label flex flex-col gap-1"},[A("span",{},t),n])};var co={};u(co,{Stack:()=>io});var io=(o,t)=>A("div",{...o,class:x("stack",o.class)},t);var fo={};u(fo,{Stat:()=>mo});var mo=(o)=>A("div",{...o,class:x("stat",o.class)},[o.icon&&A("div",{class:"stat-figure text-secondary"},o.icon),o.label&&A("div",{class:"stat-title"},o.label),A("div",{class:"stat-value"},()=>d(o.value)??o.value),o.desc&&A("div",{class:"stat-desc"},o.desc)]);var bo={};u(bo,{Swap:()=>go});var go=(o)=>A("label",{class:x("swap",o.class)},[A("input",{type:"checkbox",checked:o.value}),A("div",{class:"swap-on"},o.on),A("div",{class:"swap-off"},o.off)]);var uo={};u(uo,{Table:()=>xo});var xo=(o)=>{let{items:t=[],columns:r=[],keyFn:a,zebra:e=!1,pinRows:n=!1,empty:s=R("nodata")(),...l}=o;return A("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[A("table",{...l,class:()=>x("table",`${d(e)?"table-zebra":""} ${d(n)?"table-pin-rows":""} ${o.class||""}`)},[A("thead",{},[A("tr",{},r.map((c)=>A("th",{class:c.class||""},c.label)))]),A("tbody",{},[U(t,(c,b)=>{return A("tr",{class:"hover"},r.map((m)=>{let p=()=>{if(m.render)return m.render(c,b);let f=c[m.key];return d(f)};return A("td",{class:m.class||""},[p])}))},a||((c,b)=>c.id||b)),w(()=>d(t).length===0,()=>A("tr",{},[A("td",{colspan:r.length,class:"text-center p-10 opacity-50"},[d(s)])]))]),w(()=>r.some((c)=>c.footer),()=>A("tfoot",{},[A("tr",{},r.map((c)=>A("th",{},c.footer||"")))]))])])};var Bo={};u(Bo,{Tabs:()=>po});var po=(o)=>{let{items:t,...r}=o,a=typeof t==="function"?t:()=>t||[];return A("div",{...r,class:"flex flex-col gap-4 w-full"},[A("div",{role:"tablist",class:x("tabs tabs-box",o.class)},U(a,(e)=>A("a",{role:"tab",class:()=>x("tab",d(e.active)&&"tab-active",d(e.disabled)&&"tab-disabled",e.tip&&"tooltip"),"data-tip":e.tip,onclick:(n)=>!d(e.disabled)&&e.onclick?.(n)},e.label),(e)=>e.label)),()=>{let e=a().find((s)=>d(s.active));if(!e)return null;let n=d(e.content);return A("div",{class:"p-4"},[typeof n==="function"?n():n])}])};var So={};u(So,{Timeline:()=>Co});var Co=(o)=>{let{items:t=[],vertical:r=!0,compact:a=!1,...e}=o,n={info:G,success:L,warning:N,error:J};return A("ul",{...e,class:()=>`timeline ${d(r)?"timeline-vertical":"timeline-horizontal"} ${d(a)?"timeline-compact":""} ${o.class||""}`},[U(t,(s,l)=>{let i=l===0,c=l===d(t).length-1,b=s.type||"success",m=(p)=>typeof p==="function"?p():p;return A("li",{class:"flex-1"},[!i?A("hr",{class:s.completed?"bg-primary":""}):null,A("div",{class:"timeline-start"},[m(s.title)]),A("div",{class:"timeline-middle"},[A("img",{src:n[b]||s.icon||n.success,class:"w-4 h-4 object-contain mx-1",alt:b})]),A("div",{class:"timeline-end timeline-box shadow-sm"},[m(s.detail)]),!c?A("hr",{class:s.completed?"bg-primary":""}):null])},(s,l)=>s.id||l)])};var wo={};u(wo,{Toast:()=>Uo});var Uo=(o,t="alert-success",r=3500)=>{let a=document.getElementById("sigpro-toast-container");if(!a)a=A("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(a);let e=A("div",{style:"display: contents"});a.appendChild(e);let n,s=()=>{clearTimeout(n);let c=e.firstElementChild;if(c&&!c.classList.contains("opacity-0"))c.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{if(i.destroy(),e.remove(),!a.hasChildNodes())a.remove()},300);else i.destroy(),e.remove()},i=xA(()=>{let c=A("div",{class:`alert alert-soft ${t} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[A("span",{},[typeof o==="function"?o():o]),j({class:"btn-xs btn-circle btn-ghost",onclick:s},"✕")]);return requestAnimationFrame(()=>c.classList.remove("translate-x-10","opacity-0")),c},e);if(r>0)n=setTimeout(s,r);return s};var ho={};u(ho,{Tooltip:()=>vo});var vo=(o,t)=>A("div",{...o,class:x("tooltip",o.class),"data-tip":o.tip},t);var Ho={...pA,...CA,...wA,...hA,...RA,...DA,...VA,...QA,...MA,...jA,...GA,...JA,...TA,...kA,...SA,...XA,...PA,...OA,...$A,...Ao,...to,...ao,...ro,...no,...co,...fo,...bo,...uo,...Bo,...So,...wo,...ho},Ko={...Ho,install:(o=window)=>{Object.entries(Ho).forEach(([t,r])=>{o[t]=r}),console.log("\uD83D\uDE80 SigproUI")}};if(typeof window<"u")Object.entries(rA).forEach(([o,t])=>{window[o]=t}),window.Icons=lA,window.Utils=X,window.tt=R,window.SigProUI={...rA,Icons:lA,Utils:X,tt:R},console.log("SigProUI ready");})(); diff --git a/docs/sigpro-ui.umd.min.js b/docs/sigpro-ui.umd.min.js deleted file mode 100644 index 65f7fb1..0000000 --- a/docs/sigpro-ui.umd.min.js +++ /dev/null @@ -1 +0,0 @@ -var SigProUI=function(t,e){"use strict";const l=t=>"function"==typeof t?t():t,a=(t,e)=>"function"==typeof e?()=>`${t} ${e()||""}`.trim():`${t} ${e||""}`.trim();var o=Object.freeze({__proto__:null,joinClass:a,val:l});const n=(t,l)=>{const{title:o,name:n,open:s,...A}=t;return e.$html("div",{...A,class:a("collapse collapse-arrow bg-base-200 mb-2",t.class)},[e.$html("input",{type:n?"radio":"checkbox",name:n,checked:s}),e.$html("div",{class:"collapse-title text-xl font-medium"},o),e.$html("div",{class:"collapse-content"},l)])};var s=Object.freeze({__proto__:null,Accordion:n});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADjSURBVDiN3dJNSgNBEAXgz4DZeAAVJ9tko2St3kaIFxAVt4KZeAD1GKKi7vQSydI/yHgALxAXU02GxniAFBR0v1ev+3V1sZSxjxtM8BM5wTX2/hNu4gFvOMI21iJ3cIwP3GMjF/dQ4RyraOMS34GPAmvjIrBeEnfwjoPGgSM8ooh8QtngB6Ep4BWnmaMqkY1LqqzmDC8tzNDK3/RHzLL9SloUYWfQIMuw3Yl8xrDBH6qbvZWALqbqBqVmlWF7GuKEDwPr5hbXcYdPnKBv/o39wL5wG7ULY1c9NGPzQRrjKrhli1/02zEjWyWMBwAAAABJRU5ErkJggg==",c="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEDSURBVDiN1dK/K8VhFAbwD+VLGSxKcu9guSQ/Zils/gNkuaX4BxRZDTdklYU/QAaDlEVGGwu2Kz/uVbKJzWDwfuv1+jHz1Km3c85znuf0Hv4jxnD2W8MItnCJ5xAX2MQcHsOQL+jEAapYQD9aQwxiDy+B3JKSe1DHCpqQYQ0PeMJOpDyAmyAAirjGbDRwFYcoYCZSzjGP+8B1gqXEUT2QxyPlqaRnGceNeENzUswwil1MBocbSU9DCAXUUI6K25HtIo5QSVaooitP9OEO65iIbE+HXSvBVRbeNZQSR9pxGil3o83HNw5hEbfYR0dKFki5ci+u8OrzIQ1/R8xx7ocL+9t4B0HPOVXjoptxAAAAAElFTkSuQmCC",r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABcSURBVDiN3dIxDoAwCIXhL563g3bSm+hlq4O6GFNbO+k/EV54QIDfsSBk9IA5ZxCQEG+0eGi5BqDHivEhV2xSXXwy2EdOR3xLV+ta0/26wvSm+KTYpPmMzY/0QTZeZR2f+FxhRQAAAABJRU5ErkJggg==",i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACLSURBVDiN7dO9CQJBFEXhb38K0FwQrMNEVpuwB0NjrcYabECsQk0sQ1mTF4zIjrgmBh54MMx998AEwzOrmC5e8gJjbDHCJO7PHYI0v2JT4Ig9DljGwq5DkOZTLOCOMoIhBpknpHmFWx3ldaaUo6oTc2/ab7rl+508f8GvCC5oenTn4tM1cWg/nBNmD4fBH/Kfvt2TAAAAAElFTkSuQmCC",d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAWQAAAFkBqp2phgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAACQSURBVDiN7dKxDcJQDATQJ0YgXQQ1bAgDEIZBETPQwjakIjRQ8CMSyR8SiZKTrvHZd/r+JsYSNZrEI1ZR4ywzfElcJ55xwiITOECNTVDf4jDGoEEZ1Etcxxg8pmjRDiahb7BH20uKKPVUkVmL+YjQArdI+PT2bO9Pd/A34O71Rd9QeN/LAFUSckfUscWuG3oCgP8nrDH6T5AAAAAASUVORK5CYII=",m="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADFSURBVDiN7dCxSoIBFAXgr1BbgmgSB5ubxKAHaAkcgnBpySVaDET3WhzcpQfoHZojawgX0ZZcfAWDSDdBoeUKP/8ojZ7tnnPv4dzDFv+KZzwl5jf84B354C4wwjdeUV4vl7DCEsXgxmhigDpOMcMVjoKr7cTyI/ZxiE90wmCB4zi+RRatZOxd7OEavxHtBmvjIV5wH2a59N8ZXIZQisMCzkL/wgGq6EYffXzgHHNo4y5h+oBGlLjEBJVUiVP0cJJOtMUG+APtfyYzbH7eVgAAAABJRU5ErkJggg==",u="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAB2AAAAdgFOeyYIAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMxJREFUOI3t0bFKwlEUBvBfmmBEr1APIDZJ9AJJQyAIvkGP0C4uQruza+DUmuIc9AC9gBG4Nmpkw/8IB3Vw1w8u95zvnvPde77LEeUUV9HAF67QRA2nmMf5A+o4x3cWOsMYy8j7WMX6jaYbLBL/mAWe8RcHm1ihs8G94gVKQQzwlAouMcQo8p/Y28HdYpYFZmsi0MVdxD1MdrxsC500wijdvgtbI1AYtDbxMwkuFAZmE1uYwkkSqOIaHyHcxEU0vUXNPSqKr37fZ6xDwD9DPS0OyHjQHQAAAABJRU5ErkJggg==",p="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC4SURBVDiNxdIxagJRFIXhLzLFBNJYaJslSEylWOhq3IorMGQ16SyjYCFiZWU5pTaDFvOUyTAZ8RHID69555577oXLf/OEGaY4R3g/4IhORHg3eOXYYvSAeRQ8OWQYYoNPvDQYnxUr7zBB1grCAv3QbIlxjXmAb7Txhq+rkFUKq9NUU8vcJiizwDtOWGEdmvTKqT+61H0GXsP7jSxpEGF/R1e3wkO0FBeVRnhTSBTneBB3yvOI4D/mAnvrIwKM5s4AAAAAAElFTkSuQmCC",h="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASVJREFUOI190r0uhFEQBuBnVxaF2PUTCkFchV0SV6BQi0rEbShFlCqNktJP0Iqf3i3YVSlXVEQozojP8e2+ySSTed+ZMzNnKnpjCFPhv+C9j/YPlnCBV3TCujhHq19iFftoYxOjBa4esTb2QvsP+7jFWJ9HxnEXRf5gGU9Z8gKucBl+sUgHTahE8AJnOCoIT/AcmhmsF7gtrGINBqWFFWcmLXMUhzjIuEbk1GA+2i/DNh4wUsK1MVfFV2GUHJO4xlsPHr8j1Eu44bAcDek2agP4lDZaxWMm3MEKbrL4hjT/8U+gJc00nglnw4qYkL5xMW9rTzqSvEiefI/dMrIaRTrSPzcKXCNinUguPeUfNKWj6kqH9Bz+aVnbvb6PtKTp8F/wUSb6Bu5YN5n7ff0kAAAAAElFTkSuQmCC",b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAQtJREFUOI2F0jFOAlEQBuAPImoFqyTa6TEEbfUihruYDYfwCAg3UDsTY20na0VjgqUWWuxgHsuy/skk82bmn/fPm9eyHXs4Cn+Br4baNZxjhk8UYUtMMWwitjHGHNfoJrlexObIo3YDY9zjoOGSQzxEkzVc4O0fctqkwCANzkJiE9LmI9ytDrvKB+tWGQnylIAsOB04VcrfdluO55CeYo6THfygVUne4jX8S1zho1LTDu7fCL2KxCe8oF8zUqb8G51VYGrzEffD6jDCJA0MY6bqnHXoK9d4Vk3kyk/S1KSPR9zUJdvRpAiJWZLLIlYEufYrrzBQ7nyJ97ClcuYN2dX1pejgOPwFvuuKfgHXiDR+HL1j1AAAAABJRU5ErkJggg==",g="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARZJREFUOI2V0j1KQ1EQBeDPp4lWRiMoKVyAK9AoiLgJGytxD9oJNhKyDyvBnw2IugC3YGKVRk1KRbR48yC5vjzwwIHL3DPnzp2ZGdMxj9U4D/BZoZ3ANu4wQj84xC3aVYkZuujhCItjd42I9dAJ7R908YDlikeaeAyTCezgpST5IJia9LFVlA0nOMd7It4IjuMttKeFQR17uKooPcUV9lHL0ArX0T8MPqLa1hx+MDNFWDX7LHLV4/VGiWghmGJJvhu1WXzLO5rhORGeYRf3SfwQNVwWgbZ8SZqJcD04jhX5GDfTsjryJUlN0uQnXJRdZmHSx7H8nwWWItaP5NJVLrCFG3mTXoNDXJeVPW185E1ai/MAX2WiX9S3NSPYbj+uAAAAAElFTkSuQmCC",f="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAnXAAAJ1wGxbhe3AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARJJREFUOI2l0r8uRFEQBvAfu9glwUYiUaxHUEl0VDpKeq+wpZBINAqFRHgTKg0tCSqVhmKDEM1u/Esodm725rq7iC+ZzMnM982ZmXP4JwpdchWsYBrXeMkj9XQQV3GEi+BMYR63v+mqiDPUUrEaTiP3I1ZxEOcySnE+jFxXVPEQPimWiCYzOdCbKbCFPe1Z+8PgBvvBycVMCIdSsY2wBEPBmcnrYBtraKRib2EJGljHjswLLuI8Z6SS9hLTl15iIR08wZLv2AzLYjk0YATP8n9lVWbrgUJohosYxCdG8Zghdvp5ldCUi6hrPd0VjvGEVzTxEYLkogGMYQ67uEtvcgKzGA8y9IV/D9/Evdb89Q7d/Q1fB8U0mpUmzV0AAAAASUVORK5CYII=",$="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABfSURBVDiNY2AY8oCZSHWxDAwMEgwMDHfJsaSAgYHhH9QQsjT/Z2BgKKe75gQGiLMLCSlkwiHOSI6t6ADmhYoBN6SIARIeidgkiUlIxxkYGB4xMDB8YmBguE6JSwYpAACvLRHTKwPjZgAAAABJRU5ErkJggg==",v="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABNSURBVDiN3dAxCoAwFATRh3fU2oAHiDbi5Y1F2jT+gKLbzyy7/DYjUo8g4cTWI8koOF6XrOqc5ifDDVGJthfsj8OLujtHYJgwR+GP5QKMxA9/SolDQgAAAABJRU5ErkJggg==",B="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABlSURBVDiN3ZLBDUBAEEUfmtCchA5woUMlOO1FCQrAwbqwf8eFhHd7mfzJn2Tg82TGvABywAmPUgOLD4XcDK9AJ/y5cOlrNsIvpCdPDL/FUbkX/t6Slv3+SjgQf6QBmIAZGAP+FzZJViOd89x8pAAAAABJRU5ErkJggg==",w="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABmSURBVDiN3dGxCoAgEMbxfz1dL1BTREJzmUv08trgDYcg6VCD3/YD7zvkoLmMgFEegLmmwAAecOJVvNeUWCAAt7IHjt9LThkyiRf9qC8oCom70u0BuDL+bngj/tNm/JqJePucW8wDvGYdzT0nMUkAAAAASUVORK5CYII=",x="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAdgAAAHYBTnsmCAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADNSURBVDiNndOxTgJRFIThz41ZDMFKqH0DLSRSq4lQ0RifUcMzUJlYQKjtLcHVSimBggPRNSzs/sk0kzPnTHEvxZyHKnGJD3yhXSWcYRnKwvvH0Y7wEG/4wQI1XOEek6LLF3FtiDoGoXp4WcxsSXILHjFCH/Nf/jy8ER6KGuTZNNhJvkFpEpygUyHbRi1BFy8VFryilyANlSVFerxn6N36IRVyG0PNEtdbkbmBU8zwdOCSJp4xRWNj3sWS5YGaRvM/f6GBa5ztafCJMb5hBQQ/MMwXLnnZAAAAAElFTkSuQmCC";var y=Object.freeze({__proto__:null,icon123:u,iconAbc:m,iconCalendar:i,iconClose:r,iconError:g,iconHide:c,iconInfo:h,iconLLeft:B,iconLeft:$,iconLock:d,iconMail:p,iconRRight:w,iconRight:v,iconShow:A,iconSuccess:b,iconUpload:x,iconWarning:f});const S=(t,a)=>{const{type:o="info",soft:n=!0,...s}=t,A={info:h,success:b,warning:f,error:g},c=a||t.message;return e.$html("div",{...s,role:"alert",class:()=>`alert ${(()=>{const t=l(o);return{info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-error"}[t]||t})()} ${l(n)?"alert-soft":""} ${t.class||""}`},[e.$html("img",{src:A[l(o)]||A.info,class:"w-4 h-4 object-contain",alt:l(o)}),e.$html("div",{class:"flex-1"},[e.$html("span",{},["function"==typeof c?c():c])]),t.actions?e.$html("div",{class:"flex-none"},["function"==typeof t.actions?t.actions():t.actions]):null])};var C=Object.freeze({__proto__:null,Alert:S});const 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"}},k=e.$("es"),R=t=>()=>U[k()][t]||t,D=t=>{const{label:o,tip:n,value:s,error:r,isSearch:h,icon:b,type:g="text",...f}=t,$="password"===g,v=e.$(!1),B={text:m,password:d,date:i,number:u,email:p},w=e.$html("input",{...f,type:()=>$?v()?"text":"password":g,placeholder:t.placeholder||o||(h?R("search")():" "),class:a("grow order-2 focus:outline-none",t.class),value:s,oninput:e=>t.oninput?.(e),disabled:()=>l(t.disabled)}),x=b||(B[g]?e.$html("img",{src:B[g],class:"opacity-50",alt:g}):null);return e.$html("label",{class:()=>a("input input-bordered floating-label flex items-center gap-2 w-full relative",l(r)?"input-error":"")},[x?e.$html("div",{class:"order-1 shrink-0"},x):null,o?e.$html("span",{class:"text-base-content/60 order-0"},o):null,w,$?e.$html("button",{type:"button",class:"order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100",onclick:t=>{t.preventDefault(),v(!v())}},()=>e.$html("img",{class:"w-5 h-5",src:v()?A:c})):null,n?e.$html("div",{class:"tooltip tooltip-left order-4","data-tip":n},e.$html("span",{class:"badge badge-ghost badge-xs cursor-help"},"?")):null,()=>l(r)?e.$html("span",{class:"text-error text-[10px] absolute -bottom-5 left-2"},l(r)):null])};var j=Object.freeze({__proto__:null,Input:D});const _=t=>{const{options:a=[],value:o,onSelect:n,label:s,placeholder:A,...c}=t,r=e.$(l(o)||""),i=e.$(!1),d=e.$(-1),m=e.$(()=>{const t=r().toLowerCase(),e=l(a)||[];return t?e.filter(e=>("string"==typeof e?e:e.label).toLowerCase().includes(t)):e}),u=t=>{const e="string"==typeof t?t:t.value,l="string"==typeof t?t:t.label;r(l),"function"==typeof o&&o(e),n?.(t),i(!1),d(-1)};return e.$html("div",{class:"relative w-full"},[D({label:s,placeholder:A||R("search")(),value:r,onfocus:()=>i(!0),onblur:()=>setTimeout(()=>i(!1),150),onkeydown:t=>{const e=m();"ArrowDown"===t.key?(t.preventDefault(),i(!0),d(Math.min(d()+1,e.length-1))):"ArrowUp"===t.key?(t.preventDefault(),d(Math.max(d()-1,0))):"Enter"===t.key&&d()>=0?(t.preventDefault(),u(e[d()])):"Escape"===t.key&&i(!1)},oninput:t=>{const e=t.target.value;r(e),"function"==typeof o&&o(e),i(!0),d(-1)},...c}),e.$html("ul",{class:"absolute 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:()=>i()&&m().length?"display:block":"display:none"},[e.$for(m,(t,l)=>e.$html("li",{},[e.$html("a",{class:()=>"block w-full "+(d()===l?"active bg-primary text-primary-content":""),onclick:()=>u(t),onmouseenter:()=>d(l)},"string"==typeof t?t:t.label)]),(t,e)=>("string"==typeof t?t:t.value)+e),()=>m().length?null:e.$html("li",{class:"p-2 text-center opacity-50"},"No results")])])};const z=(t,l)=>e.$html("span",{...t,class:a("badge",t.class)},l);const E=(t,o)=>{const{badge:n,badgeClass:s,tooltip:A,icon:c,loading:r,...i}=t;let d=e.$html("button",{...i,class:a("btn",t.class),disabled:()=>l(r)||l(t.disabled)},[()=>l(r)?e.$html("span",{class:"loading loading-spinner"}):null,c?e.$html("span",{class:"mr-1"},c):null,o]);return n&&(d=e.$html("div",{class:"indicator"},[e.$html("span",{class:a("indicator-item badge",s||"badge-secondary")},n),d])),A?e.$html("div",{class:"tooltip","data-tip":A},d):d};const I=t=>{const{value:a,tooltip:o,toggle:n,label:s,...A}=t,c=e.$html("input",{...A,type:"checkbox",class:()=>l(n)?"toggle":"checkbox",checked:a}),r=e.$html("label",{class:"label cursor-pointer justify-start gap-3"},[c,s?e.$html("span",{class:"label-text"},s):null]);return o?e.$html("div",{class:"tooltip","data-tip":o},r):r};const Y=t=>{const{value:a,label:o,...n}=t,s=e.$(!1),A=["#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"],c=()=>l(a)||"#000000";return e.$html("div",{class:"relative w-fit"},[e.$html("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:t=>{t.stopPropagation(),s(!s())},...n},[e.$html("div",{class:"size-5 rounded-sm shadow-inner border border-black/10 shrink-0",style:()=>`background-color: ${c()}`}),o?e.$html("span",{class:"opacity-80"},o):null]),e.$if(s,()=>e.$html("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:t=>t.stopPropagation()},[e.$html("div",{class:"grid grid-cols-8 gap-1"},A.map(t=>e.$html("button",{type:"button",style:`background-color: ${t}`,class:()=>"size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 \n "+(c().toLowerCase()===t.toLowerCase()?"ring-2 ring-offset-1 ring-primary z-10 scale-110":""),onclick:()=>{"function"==typeof a&&a(t),s(!1)}})))])),e.$if(s,()=>e.$html("div",{class:"fixed inset-0 z-[100]",onclick:()=>s(!1)}))])};const V=t=>{const{value:a,range:o,label:n,placeholder:s,hour:A=!1,...c}=t,r=e.$(!1),d=e.$(new Date),m=e.$(null),u=e.$(0),p=e.$(0),h=()=>!0===l(o),b=new Date,g=`${b.getFullYear()}-${String(b.getMonth()+1).padStart(2,"0")}-${String(b.getDate()).padStart(2,"0")}`,f=t=>`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`,x=t=>{const e=f(t),o=l(a);if(h())if(!o?.start||o.start&&o.end)"function"==typeof a&&a({start:e,end:null,...A&&{startHour:u()}});else{const t=o.start;if("function"==typeof a){const l=e{const t=l(a);if(!t)return"";if("string"==typeof t)return A&&t.includes("T")?t.replace("T"," "):t;if(t.start&&t.end){return`${A&&t.startHour?`${t.start} ${String(t.startHour).padStart(2,"0")}:00`:t.start} - ${A&&t.endHour?`${t.end} ${String(t.endHour).padStart(2,"0")}:00`:t.end}`}if(t.start){return`${A&&t.startHour?`${t.start} ${String(t.startHour).padStart(2,"0")}:00`:t.start}...`}return""}),S=t=>{const e=d();d(new Date(e.getFullYear(),e.getMonth()+t,1))},C=t=>{const e=d();d(new Date(e.getFullYear()+t,e.getMonth(),1))},U=({value:t,onChange:a})=>e.$html("div",{class:"flex-1"},[e.$html("div",{class:"flex gap-2 items-center"},[e.$html("input",{type:"range",min:0,max:23,value:t,class:"range range-xs flex-1",oninput:t=>{const e=parseInt(t.target.value);a(e)}}),e.$html("span",{class:"text-sm font-mono min-w-[48px] text-center"},()=>String(l(t)).padStart(2,"0")+":00")])]);return e.$html("div",{class:"relative w-full"},[D({label:n,placeholder:s||(h()?"Seleccionar rango...":"Seleccionar fecha..."),value:y,readonly:!0,icon:e.$html("img",{src:i,class:"opacity-40"}),onclick:t=>{t.stopPropagation(),r(!r())},...c}),e.$if(r,()=>e.$html("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:t=>t.stopPropagation()},[e.$html("div",{class:"flex justify-between items-center mb-4 gap-1"},[e.$html("div",{class:"flex gap-0.5"},[e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>C(-1)},e.$html("img",{src:B,class:"opacity-40"})),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>S(-1)},e.$html("img",{src:$,class:"opacity-40"}))]),e.$html("span",{class:"font-bold uppercase flex-1 text-center"},[()=>d().toLocaleString("es-ES",{month:"short",year:"numeric"})]),e.$html("div",{class:"flex gap-0.5"},[e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>S(1)},e.$html("img",{src:v,class:"opacity-40"})),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs px-1",onclick:()=>C(1)},e.$html("img",{src:w,class:"opacity-40"}))])]),e.$html("div",{class:"grid grid-cols-7 gap-1",onmouseleave:()=>m(null)},[...["L","M","X","J","V","S","D"].map(t=>e.$html("div",{class:"text-[10px] opacity-40 font-bold text-center"},t)),()=>{const t=d(),o=t.getFullYear(),n=t.getMonth(),s=new Date(o,n,1).getDay(),A=0===s?6:s-1,c=new Date(o,n+1,0).getDate(),r=[];for(let t=0;t{const t=l(a),e=m(),o="string"==typeof t?t.split("T")[0]===A:t?.start===A,n=t?.end===A;let s=!1;if(h()&&t?.start){const l=t.start;!t.end&&e?s=A>l&&A<=e||A=e:t.end&&(s=A>l&&A{h()&&m(A)},onclick:()=>x(s)},[t.toString()]))}return r}]),A?e.$html("div",{class:"mt-3 pt-2 border-t border-base-300"},[h()?e.$html("div",{class:"flex gap-4"},[U({value:u,onChange:t=>{u(t);const e=l(a);e?.start&&a({...e,startHour:t})}}),U({value:p,onChange:t=>{p(t);const e=l(a);e?.end&&a({...e,endHour:t})}})]):U({value:u,onChange:t=>{u(t);const e=l(a);e&&"string"==typeof e&&e.includes("-")&&a(e.split("T")[0]+"T"+String(t).padStart(2,"0")+":00:00")}})]):null])),e.$if(r,()=>e.$html("div",{class:"fixed inset-0 z-[90]",onclick:()=>r(!1)}))])};const H=t=>e.$html("div",{class:a("drawer",t.class)},[e.$html("input",{id:t.id,type:"checkbox",class:"drawer-toggle",checked:t.open}),e.$html("div",{class:"drawer-content"},t.content),e.$html("div",{class:"drawer-side"},[e.$html("label",{for:t.id,class:"drawer-overlay",onclick:()=>t.open?.(!1)}),e.$html("div",{class:"min-h-full bg-base-200 w-80"},t.side)])]);const O=(t,a)=>{const{label:o,icon:n,items:s,...A}=t;return e.$html("div",{...A,class:()=>`dropdown ${l(t.class)||""}`},[e.$html("div",{tabindex:0,role:"button",class:"btn m-1 flex items-center gap-2"},[n?"function"==typeof n?n():n:null,o?"function"==typeof o?o():o:null]),(()=>{if(s){const t="function"==typeof s?s:()=>s;return e.$html("ul",{tabindex:0,class:"dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300"},[e.$for(t,t=>e.$html("li",{},[e.$html("a",{class:t.class||"",onclick:e=>{t.onclick&&t.onclick(e),document.activeElement&&document.activeElement.blur()}},[t.icon?e.$html("span",{},t.icon):null,e.$html("span",{},t.label)])]))])}return e.$html("div",{tabindex:0,class:"dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300"},["function"==typeof a?a():a])})()])};const F=t=>{const{icon:a,label:o,actions:n=[],position:s="bottom-6 right-6",class:A="",...c}=t;return e.$html("div",{...c,class:`fab absolute ${s} flex flex-col-reverse items-end gap-3 z-[100] ${A}`},[e.$html("div",{tabindex:0,role:"button",class:"btn btn-lg btn-circle btn-primary shadow-2xl"},[a?"function"==typeof a?a():a:null,!a&&o?o:null]),...l(n).map(t=>e.$html("div",{class:"flex items-center gap-3 transition-all duration-300"},[t.label?e.$html("span",{class:"badge badge-ghost shadow-sm whitespace-nowrap"},t.label):null,e.$html("button",{type:"button",class:`btn btn-circle shadow-lg ${t.class||""}`,onclick:e=>{e.stopPropagation(),t.onclick?.(e)}},[t.icon?"function"==typeof t.icon?t.icon():t.icon:t.text||""])]))])};const Q=(t,o)=>e.$html("fieldset",{...t,class:a("fieldset bg-base-200 border border-base-300 p-4 rounded-lg",t.class)},[()=>{const a=l(t.legend);return a?e.$html("legend",{class:"fieldset-legend font-bold"},[a]):null},o]);const N=t=>{const{tooltip:l,max:a=2,accept:o="*",onSelect:n}=t,s=e.$([]),A=e.$(!1),c=e.$(null),i=1024*a*1024,d=t=>{const e=Array.from(t);c(null);e.find(t=>t.size>i)?c(`Máx ${a}MB`):(s([...s(),...e]),n?.(s()))};return e.$html("fieldset",{class:"fieldset w-full p-0"},[e.$html("div",{class:()=>"w-full "+(l?"tooltip tooltip-top before:z-50 after:z-50":""),"data-tip":l},[e.$html("label",{class:()=>`\n relative flex items-center justify-between w-full h-12 px-4\n border-2 border-dashed rounded-lg cursor-pointer\n transition-all duration-200\n ${A()?"border-primary bg-primary/10":"border-base-content/20 bg-base-100 hover:bg-base-200"}\n `,ondragover:t=>{t.preventDefault(),A(!0)},ondragleave:()=>A(!1),ondrop:t=>{t.preventDefault(),A(!1),d(t.dataTransfer.files)}},[e.$html("div",{class:"flex items-center gap-3 w-full"},[e.$html("img",{src:x,class:"w-5 h-5 opacity-50 shrink-0"}),e.$html("span",{class:"text-sm opacity-70 truncate grow text-left"},"Arrastra o selecciona archivos..."),e.$html("span",{class:"text-[10px] opacity-40 shrink-0"},`Máx ${a}MB`)]),e.$html("input",{type:"file",multiple:!0,accept:o,class:"hidden",onchange:t=>d(t.target.files)})])]),()=>c()?e.$html("span",{class:"text-[10px] text-error mt-1 px-1 font-medium"},c()):null,e.$if(()=>s().length>0,()=>e.$html("ul",{class:"mt-2 space-y-1"},[e.$for(s,(t,l)=>e.$html("li",{class:"flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300"},[e.$html("div",{class:"flex items-center gap-2 truncate"},[e.$html("span",{class:"opacity-50"},"📄"),e.$html("span",{class:"truncate font-medium max-w-[200px]"},t.name),e.$html("span",{class:"text-[9px] opacity-40"},`(${(t.size/1024).toFixed(0)} KB)`)]),e.$html("button",{type:"button",class:"btn btn-ghost btn-xs btn-circle",onclick:t=>{t.preventDefault(),t.stopPropagation(),(t=>{const e=s().filter((e,l)=>l!==t);s(e),n?.(e)})(l)}},[e.$html("img",{src:r,class:"w-3 h-3 opacity-70"})])]),t=>t.name+t.lastModified)]))])};const L=(t,l)=>e.$html("div",{class:a("indicator",t.class)},[l,e.$html("span",{class:a("indicator-item badge",t.badgeClass)},t.badge)]);const T=t=>{const{items:o,header:n,render:s,keyFn:A=(t,e)=>e,class:c,...r}=t,i=e.$for(o,(t,l)=>e.$html("li",{class:"list-row"},[s(t,l)]),A);return e.$html("ul",{...r,class:a("list bg-base-100 rounded-box shadow-md",c)},n?[e.$if(n,()=>e.$html("li",{class:"p-4 pb-2 text-xs opacity-60"},[l(n)])),i]:i)};const G=t=>e.$if(t.$show,()=>e.$html("div",{class:"fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30"},[e.$html("span",{class:"loading loading-spinner loading-lg text-primary"})]));const M=t=>{const o=t=>e.$for(()=>t||[],t=>e.$html("li",{},[t.children?e.$html("details",{open:t.open},[e.$html("summary",{},[t.icon&&e.$html("span",{class:"mr-2"},t.icon),t.label]),e.$html("ul",{},o(t.children))]):e.$html("a",{class:()=>l(t.active)?"active":"",onclick:t.onclick},[t.icon&&e.$html("span",{class:"mr-2"},t.icon),t.label])]),(t,e)=>t.label||e);return e.$html("ul",{...t,class:a("menu bg-base-200 rounded-box",t.class)},o(t.items))};const J=(t,l)=>{const{title:a,buttons:o,open:n,...s}=t,A={current:null};e.$watch(()=>{const t=A.current;t&&(n()?t.open||t.showModal():t.open&&t.close())});const c=t=>{t&&t.preventDefault&&t.preventDefault(),n(!1)};return e.$html("dialog",{...s,ref:A,class:"modal",oncancel:()=>n(!1)},[e.$html("div",{class:"modal-box"},[a?e.$html("h3",{class:"text-lg font-bold mb-4"},a):null,e.$html("div",{class:"py-2"},["function"==typeof l?l():l]),e.$html("div",{class:"modal-action flex gap-2"},[...(Array.isArray(o)?o:[o]).filter(Boolean),E({type:"button",onclick:c},R("close")())])]),e.$html("form",{method:"dialog",class:"modal-backdrop",onsubmit:c},[e.$html("button",{},"close")])])};const K=(t,l)=>e.$html("div",{...t,class:a("navbar bg-base-100 shadow-sm px-4",t.class)},l);const P=t=>{const{label:o,tooltip:n,value:s,inputValue:A,name:c,...r}=t,i=e.$html("input",{...r,type:"radio",name:c,class:a("radio",t.class),checked:()=>l(s)===A,onclick:()=>{"function"==typeof s&&s(A)}});return o||n?e.$html("label",{class:"label cursor-pointer justify-start gap-3"},[i,o?e.$html("span",{class:"label-text"},o):null]):i};const X=t=>{const{label:o,tooltip:n,value:s,...A}=t,c=e.$html("input",{...A,type:"range",class:a("range",t.class),value:s,disabled:()=>l(t.disabled)});if(!o&&!n)return c;const r=e.$html("div",{class:"flex flex-col gap-2"},[o?e.$html("span",{class:"label-text"},o):null,c]);return n?e.$html("div",{class:"tooltip","data-tip":n},r):r};const Z=t=>{const{value:a,count:o=5,mask:n="mask-star",readonly:s=!1,onchange:A,...c}=t,r=`rating-${Math.random().toString(36).slice(2,7)}`;return e.$html("div",{...c,class:()=>`rating ${l(s)?"pointer-events-none":""} ${t.class||""}`},Array.from({length:l(o)},(t,o)=>{const c=o+1;return e.$html("input",{type:"radio",name:r,class:`mask ${n}`,checked:()=>Math.round(l(a))===c,onchange:()=>{l(s)||("function"==typeof A?A(c):"function"==typeof a&&a(c))}})}))};const W=t=>{const{label:o,options:n,value:s,...A}=t,c=e.$html("select",{...A,class:a("select select-bordered w-full",t.class),value:s},e.$for(()=>l(n)||[],t=>e.$html("option",{value:t.value,$selected:()=>String(l(s))===String(t.value)},t.label),t=>t.value));return o?e.$html("label",{class:"fieldset-label flex flex-col gap-1"},[e.$html("span",{},o),c]):c};const q=(t,l)=>e.$html("div",{...t,class:a("stack",t.class)},l);const tt=t=>e.$html("div",{...t,class:a("stat",t.class)},[t.icon&&e.$html("div",{class:"stat-figure text-secondary"},t.icon),t.label&&e.$html("div",{class:"stat-title"},t.label),e.$html("div",{class:"stat-value"},()=>l(t.value)??t.value),t.desc&&e.$html("div",{class:"stat-desc"},t.desc)]);const et=t=>e.$html("label",{class:a("swap",t.class)},[e.$html("input",{type:"checkbox",checked:t.value}),e.$html("div",{class:"swap-on"},t.on),e.$html("div",{class:"swap-off"},t.off)]);const lt=t=>{const{items:o=[],columns:n=[],keyFn:s,zebra:A=!1,pinRows:c=!1,empty:r=R("nodata")(),...i}=t;return e.$html("div",{class:"overflow-x-auto w-full bg-base-100 rounded-box border border-base-300"},[e.$html("table",{...i,class:()=>a("table",`${l(A)?"table-zebra":""} ${l(c)?"table-pin-rows":""} ${t.class||""}`)},[e.$html("thead",{},[e.$html("tr",{},n.map(t=>e.$html("th",{class:t.class||""},t.label)))]),e.$html("tbody",{},[e.$for(o,(t,a)=>e.$html("tr",{class:"hover"},n.map(o=>e.$html("td",{class:o.class||""},[()=>{if(o.render)return o.render(t,a);const e=t[o.key];return l(e)}]))),s||((t,e)=>t.id||e)),e.$if(()=>0===l(o).length,()=>e.$html("tr",{},[e.$html("td",{colspan:n.length,class:"text-center p-10 opacity-50"},[l(r)])]))]),e.$if(()=>n.some(t=>t.footer),()=>e.$html("tfoot",{},[e.$html("tr",{},n.map(t=>e.$html("th",{},t.footer||"")))]))])])};const at=t=>{const{items:o,...n}=t,s="function"==typeof o?o:()=>o||[];return e.$html("div",{...n,class:"flex flex-col gap-4 w-full"},[e.$html("div",{role:"tablist",class:a("tabs tabs-box",t.class)},e.$for(s,t=>e.$html("a",{role:"tab",class:()=>a("tab",l(t.active)&&"tab-active",l(t.disabled),t.tip),"data-tip":t.tip,onclick:e=>!l(t.disabled)&&t.onclick?.(e)},t.label),t=>t.label)),()=>{const t=s().find(t=>l(t.active));if(!t)return null;const a=l(t.content);return e.$html("div",{class:"p-4"},["function"==typeof a?a():a])}])};const ot=t=>{const{items:a=[],vertical:o=!0,compact:n=!1,...s}=t,A={info:h,success:b,warning:f,error:g};return e.$html("ul",{...s,class:()=>`timeline ${l(o)?"timeline-vertical":"timeline-horizontal"} ${l(n)?"timeline-compact":""} ${t.class||""}`},[e.$for(a,(t,o)=>{const n=0===o,s=o===l(a).length-1,c=t.type||"success",r=t=>"function"==typeof t?t():t;return e.$html("li",{class:"flex-1"},[n?null:e.$html("hr",{class:t.completed?"bg-primary":""}),e.$html("div",{class:"timeline-start"},[r(t.title)]),e.$html("div",{class:"timeline-middle"},[e.$html("img",{src:A[c]||t.icon||A.success,class:"w-4 h-4 object-contain mx-1",alt:c})]),e.$html("div",{class:"timeline-end timeline-box shadow-sm"},[r(t.detail)]),s?null:e.$html("hr",{class:t.completed?"bg-primary":""})])},(t,e)=>t.id||e)])};const nt=(t,l="alert-success",a=3500)=>{let o=document.getElementById("sigpro-toast-container");o||(o=e.$html("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(o));const n=e.$html("div",{style:"display: contents"});let s;o.appendChild(n);const A=()=>{clearTimeout(s);const t=n.firstElementChild;t&&!t.classList.contains("opacity-0")?(t.classList.add("translate-x-full","opacity-0"),setTimeout(()=>{c.destroy(),n.remove(),o.hasChildNodes()||o.remove()},300)):(c.destroy(),n.remove())},c=e.$mount(()=>{const a=e.$html("div",{class:`alert alert-soft ${l} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`},[e.$html("span",{},["function"==typeof t?t():t]),E({class:"btn-xs btn-circle btn-ghost",onclick:A},"✕")]);return requestAnimationFrame(()=>a.classList.remove("translate-x-10","opacity-0")),a},n);return a>0&&(s=setTimeout(A,a)),A};const st=(t,l)=>e.$html("div",{...t,class:a("tooltip",t.class),"data-tip":t.tip},l);const At={...s,...C,...Object.freeze({__proto__:null,Autocomplete:_}),...Object.freeze({__proto__:null,Badge:z}),...Object.freeze({__proto__:null,Button:E}),...Object.freeze({__proto__:null,Checkbox:I}),...Object.freeze({__proto__:null,Colorpicker:Y}),...Object.freeze({__proto__:null,Datepicker:V}),...Object.freeze({__proto__:null,Drawer:H}),...Object.freeze({__proto__:null,Dropdown:O}),...Object.freeze({__proto__:null,Fab:F}),...Object.freeze({__proto__:null,Fieldset:Q}),...Object.freeze({__proto__:null,Fileinput:N}),...Object.freeze({__proto__:null,Indicator:L}),...j,...Object.freeze({__proto__:null,List:T}),...Object.freeze({__proto__:null,Loading:G}),...Object.freeze({__proto__:null,Menu:M}),...Object.freeze({__proto__:null,Modal:J}),...Object.freeze({__proto__:null,Navbar:K}),...Object.freeze({__proto__:null,Radio:P}),...Object.freeze({__proto__:null,Range:X}),...Object.freeze({__proto__:null,Rating:Z}),...Object.freeze({__proto__:null,Select:W}),...Object.freeze({__proto__:null,Stack:q}),...Object.freeze({__proto__:null,Stat:tt}),...Object.freeze({__proto__:null,Swap:et}),...Object.freeze({__proto__:null,Table:lt}),...Object.freeze({__proto__:null,Tabs:at}),...Object.freeze({__proto__:null,Timeline:ot}),...Object.freeze({__proto__:null,Toast:nt}),...Object.freeze({__proto__:null,Tooltip:st})};var ct={...At,install:(t=window)=>{Object.entries(At).forEach(([e,l])=>{t[e]=l}),console.log("🚀 SigproUI")}},rt=Object.freeze({__proto__:null,Accordion:n,Alert:S,Autocomplete:_,Badge:z,Button:E,Checkbox:I,Colorpicker:Y,Datepicker:V,Drawer:H,Dropdown:O,Fab:F,Fieldset:Q,Fileinput:N,Indicator:L,Input:D,List:T,Loading:G,Menu:M,Modal:J,Navbar:K,Radio:P,Range:X,Rating:Z,Select:W,Stack:q,Stat:tt,Swap:et,Table:lt,Tabs:at,Timeline:ot,Toast:nt,Tooltip:st,default:ct});const it={...rt,Icons:y,Utils:o,tt:R,install:(t=("undefined"!=typeof window?window:{}))=>{Object.entries(rt).forEach(([e,l])=>{t[e]=l}),t.Icons=y,t.Utils=o,t.tt=R,console.log("🌟 SigproUI")}};return"undefined"!=typeof window&&it.install(window),t.Accordion=n,t.Alert=S,t.Autocomplete=_,t.Badge=z,t.Button=E,t.Checkbox=I,t.Colorpicker=Y,t.Datepicker=V,t.Drawer=H,t.Dropdown=O,t.Fab=F,t.Fieldset=Q,t.Fileinput=N,t.Indicator=L,t.Input=D,t.List=T,t.Loading=G,t.Menu=M,t.Modal=J,t.Navbar=K,t.Radio=P,t.Range=X,t.Rating=Z,t.Select=W,t.Stack=q,t.Stat=tt,t.Swap=et,t.Table=lt,t.Tabs=at,t.Timeline=ot,t.Toast=nt,t.Tooltip=st,t.default=it,t.icon123=u,t.iconAbc=m,t.iconCalendar=i,t.iconClose=r,t.iconError=g,t.iconHide=c,t.iconInfo=h,t.iconLLeft=B,t.iconLeft=$,t.iconLock=d,t.iconMail=p,t.iconRRight=w,t.iconRight=v,t.iconShow=A,t.iconSuccess=b,t.iconUpload=x,t.iconWarning=f,t.joinClass=a,t.tt=R,t.val=l,Object.defineProperty(t,"__esModule",{value:!0}),t}({},SigPro); diff --git a/docs/sigpro.min.js b/docs/sigpro.min.js deleted file mode 100644 index 044c32b..0000000 --- a/docs/sigpro.min.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var{defineProperty:D,getOwnPropertyNames:$,getOwnPropertyDescriptor:w}=Object,k=Object.prototype.hasOwnProperty;var N=new WeakMap,y=(K)=>{var J=N.get(K),Z;if(J)return J;if(J=D({},"__esModule",{value:!0}),K&&typeof K==="object"||typeof K==="function")$(K).map((q)=>!k.call(J,q)&&D(J,q,{get:()=>K[q],enumerable:!(Z=w(K,q))||Z.enumerable}));return N.set(K,J),J};var g=(K,J)=>{for(var Z in J)D(K,Z,{get:J[Z],enumerable:!0,configurable:!0,set:(q)=>J[Z]=()=>q})};var m={};g(m,{$watch:()=>L,$router:()=>Q,$mount:()=>E,$if:()=>T,$html:()=>x,$for:()=>O,$:()=>_});var U=null,I=null,P=new Set,C=!1,M=new WeakMap,v=()=>{if(C)return;C=!0;while(P.size>0){let K=Array.from(P).sort((J,Z)=>(J.depth||0)-(Z.depth||0));P.clear();for(let J of K)if(!J._deleted)J()}C=!1},b=(K)=>{if(U&&!U._deleted)K.add(U),U._deps.add(K)},S=(K)=>{for(let J of K){if(J===U||J._deleted)continue;if(J._isComputed){if(J.markDirty(),J._subs)S(J._subs)}else P.add(J)}if(!C)queueMicrotask(v)},V=(K)=>{if(K._cleanups)K._cleanups.forEach((J)=>J()),K._cleanups.clear();K.childNodes?.forEach(V)},F=(K)=>{let J=new Set,Z=I,q=document.createElement("div");q.style.display="contents",I={cleanups:J};try{let W=K({onCleanup:(j)=>J.add(j)}),Y=(j)=>{if(!j)return;if(j._isRuntime)J.add(j.destroy),q.appendChild(j.container);else if(Array.isArray(j))j.forEach(Y);else q.appendChild(j instanceof Node?j:document.createTextNode(String(j)))};Y(W)}finally{I=Z}return{_isRuntime:!0,container:q,destroy:()=>{J.forEach((W)=>W()),V(q),q.remove()}}},_=(K,J=null)=>{if(typeof K==="function"){let W=new Set,Y,j=!0,X=()=>{if(X._deleted)return;X._deps.forEach((G)=>G.delete(X)),X._deps.clear();let z=U;U=X;try{let G=K();if(!Object.is(Y,G)||j)Y=G,j=!1,S(W)}finally{U=z}};if(X._deps=new Set,X._isComputed=!0,X._subs=W,X._deleted=!1,X.markDirty=()=>j=!0,X.stop=()=>{X._deleted=!0,X._deps.forEach((z)=>z.delete(X)),W.clear()},I)I.cleanups.add(X.stop);return()=>{if(j)X();return b(W),Y}}let Z=K;if(J)try{let W=localStorage.getItem(J);if(W!==null)Z=JSON.parse(W)}catch(W){console.warn("SigPro: LocalStorage locked",W)}let q=new Set;return(...W)=>{if(W.length){let Y=typeof W[0]==="function"?W[0](Z):W[0];if(!Object.is(Z,Y)){if(Z=Y,J)localStorage.setItem(J,JSON.stringify(Z));S(q)}}return b(q),Z}},L=(K,J)=>{let Z=Array.isArray(K),q=Z?J:K,W=Z?K:null;if(typeof q!=="function")return()=>{};let Y=I,j=()=>{if(j._deleted)return;j._deps.forEach((G)=>G.delete(j)),j._deps.clear(),j._cleanups.forEach((G)=>G()),j._cleanups.clear();let X=U,z=I;U=j,I={cleanups:j._cleanups},j.depth=X?X.depth+1:0;try{if(Z)U=null,q(),U=j,W.forEach((G)=>typeof G==="function"&&G());else q()}finally{U=X,I=z}};if(j._deps=new Set,j._cleanups=new Set,j._deleted=!1,j.stop=()=>{if(j._deleted)return;if(j._deleted=!0,P.delete(j),j._deps.forEach((X)=>X.delete(j)),j._cleanups.forEach((X)=>X()),Y)Y.cleanups.delete(j.stop)},Y)Y.cleanups.add(j.stop);return j(),j.stop},x=(K,J={},Z=[])=>{if(J instanceof Node||Array.isArray(J)||typeof J!=="object")Z=J,J={};let q=document.createElement(K),W=(j,X)=>(j==="src"||j==="href")&&String(X).toLowerCase().includes("javascript:")?"#":X;q._cleanups=new Set;for(let[j,X]of Object.entries(J)){if(j==="ref"){typeof X==="function"?X(q):X.current=q;continue}let z=typeof X==="function";if(["INPUT","TEXTAREA","SELECT"].includes(q.tagName)&&(j==="value"||j==="checked")&&z){q._cleanups.add(L(()=>{let H=X();if(q[j]!==H)q[j]=H}));let B=j==="checked"?"change":"input",A=(H)=>X(H.target[j]);q.addEventListener(B,A),q._cleanups.add(()=>q.removeEventListener(B,A))}else if(j.startsWith("on")){let B=j.slice(2).toLowerCase().split(".")[0],A=(H)=>X(H);q.addEventListener(B,A),q._cleanups.add(()=>q.removeEventListener(B,A))}else if(z)q._cleanups.add(L(()=>{let B=W(j,X());if(j==="class")q.className=B||"";else B==null?q.removeAttribute(j):q.setAttribute(j,B)}));else q.setAttribute(j,W(j,X))}let Y=(j)=>{if(Array.isArray(j))return j.forEach(Y);if(typeof j==="function"){let X=document.createTextNode("");q.appendChild(X);let z=[];q._cleanups.add(L(()=>{let G=j(),R=(Array.isArray(G)?G:[G]).map((B)=>B?._isRuntime?B.container:B instanceof Node?B:document.createTextNode(B??""));z.forEach((B)=>{V(B),B.remove()}),R.forEach((B)=>X.parentNode?.insertBefore(B,X)),z=R}))}else q.appendChild(j instanceof Node?j:document.createTextNode(j??""))};return Y(Z),q},T=(K,J,Z=null)=>{let q=document.createTextNode(""),W=x("div",{style:"display:contents"},[q]),Y=null,j=null;return L(()=>{let X=!!(typeof K==="function"?K():K);if(X!==j){if(j=X,Y)Y.destroy();let z=X?J:Z;if(z)Y=F(()=>typeof z==="function"?z():z),W.insertBefore(Y.container,q)}}),W};T.not=(K,J,Z)=>T(()=>!(typeof K==="function"?K():K),J,Z);var O=(K,J,Z)=>{let q=document.createTextNode(""),W=x("div",{style:"display:contents"},[q]),Y=new Map;return L(()=>{let j=(typeof K==="function"?K():K)||[],X=new Map,z=[];for(let R=0;RJ(B,R));else Y.delete(A);X.set(A,H),z.push(A)}Y.forEach((R)=>{R.destroy(),R.container.remove()});let G=q;for(let R=z.length-1;R>=0;R--){let B=X.get(z[R]);if(B.container.nextSibling!==G)W.insertBefore(B.container,G);G=B.container}Y=X}),W},Q=(K)=>{let J=_(window.location.hash.replace(/^#/,"")||"/");window.addEventListener("hashchange",()=>J(window.location.hash.replace(/^#/,"")||"/"));let Z=x("div",{class:"router-outlet"}),q=null;return L([J],async()=>{let W=J(),Y=K.find((j)=>{let X=j.path.split("/").filter(Boolean),z=W.split("/").filter(Boolean);return X.length===z.length&&X.every((G,R)=>G.startsWith(":")||G===z[R])})||K.find((j)=>j.path==="*");if(Y){let j=Y.component;if(typeof j==="function"&&j.toString().includes("import"))j=(await j()).default||await j();let X={};if(Y.path.split("/").filter(Boolean).forEach((z,G)=>{if(z.startsWith(":"))X[z.slice(1)]=W.split("/").filter(Boolean)[G]}),q)q.destroy();if(Q.params)Q.params(X);q=F(()=>{try{return typeof j==="function"?j(X):j}catch(z){return x("div",{class:"p-4 text-error"},"Error loading view")}}),Z.appendChild(q.container)}}),Z};Q.params=_({});Q.to=(K)=>window.location.hash=K.replace(/^#?\/?/,"#/");Q.back=()=>window.history.back();Q.path=()=>window.location.hash.replace(/^#/,"")||"/";var E=(K,J)=>{let Z=typeof J==="string"?document.querySelector(J):J;if(!Z)return;if(M.has(Z))M.get(Z).destroy();let q=F(typeof K==="function"?K:()=>K);return Z.replaceChildren(q.container),M.set(Z,q),q},h={$:_,$watch:L,$html:x,$if:T,$for:O,$router:Q,$mount:E};if(typeof window<"u")((J)=>{Object.keys(J).forEach((q)=>{window[q]=J[q]}),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer address ul ol li dl dt dd a em strong small i b u mark time sub sup pre code blockquote details summary dialog form label input textarea select button option fieldset legend table thead tbody tfoot tr th td caption img video audio canvas svg iframe picture source progress meter".split(/\s+/).forEach((q)=>{let W=q.charAt(0).toUpperCase()+q.slice(1);if(!(W in window))window[W]=(Y,j)=>x(q,Y,j)}),window.SigPro=Object.freeze(J)})(h);})(); diff --git a/index.js b/index.js index 7518abd..9eae459 100644 --- a/index.js +++ b/index.js @@ -1,40 +1,25 @@ -/** - * SigproUI - Entry Point - */ - +// index.js +import 'sigpro'; +// import './src/css/sigpro.css'; // No importes CSS en JS import * as Components from './src/components/index.js'; - -import * as Icons from './src/core/icons.js'; +// import * as Icons from './src/core/icons.js'; // ELIMINAR import * as Utils from './src/core/utils.js'; import { tt } from './src/core/i18n.js'; - export * from './src/components/index.js'; -export * from './src/core/icons.js'; +// export * from './src/core/icons.js'; // ELIMINAR export * from './src/core/utils.js'; export { tt }; -const SigproUI = { - ...Components, - Icons, - Utils, - tt, - - install: (target = (typeof window !== 'undefined' ? window : {})) => { - Object.entries(Components).forEach(([name, component]) => { - target[name] = component; - }); - - target.Icons = Icons; - target.Utils = Utils; - target.tt = tt; - - console.log("🌟 SigproUI"); - } -}; - if (typeof window !== 'undefined') { - SigproUI.install(window); -} - -export default SigproUI; + Object.entries(Components).forEach(([name, component]) => { + window[name] = component; + }); + + // window.Icons = Icons; // ELIMINAR + window.Utils = Utils; + window.tt = tt; + window.SigProUI = { ...Components, Utils, tt }; + + console.log("🎨 SigProUI ready"); +} \ No newline at end of file diff --git a/package.json b/package.json index 6510fdd..6c2ef46 100644 --- a/package.json +++ b/package.json @@ -1,52 +1,44 @@ { "name": "sigpro-ui", - "version": "1.0.6", - "repository": { - "type": "git", - "url": "https://github.com/natxocc/sigpro-ui.git" - }, - "main": "./dist/sigpro-ui.cjs", - "module": "./dist/sigpro-ui.esm.js", - "unpkg": "./dist/sigpro-ui.umd.min.js", - "jsdelivr": "./dist/sigpro-ui.umd.min.js", + "version": "1.1.0", + "type": "module", + "license": "MIT", + "main": "./index.js", + "module": "./index.js", + "unpkg": "./dist/sigpro-ui.min.js", + "jsdelivr": "./dist/sigpro-ui.min.js", "exports": { ".": { - "import": "./dist/sigpro-ui.esm.js", - "require": "./dist/sigpro-ui.cjs" + "import": "./index.js", + "script": "./dist/sigpro-ui.js" + }, + "./css": { + "import": "./css/index.js", + "default": "./css/index.js" } }, - "bugs": { - "url": "https://github.com/natxocc/sigpro-ui/issues" - }, "files": [ "index.js", - "src", "dist", + "css", "README.md", "LICENSE" ], - "homepage": "https://natxocc.github.io/sigpro-ui/", - "keywords": [ - "signals", - "reactive", - "sigpro", - "sigpro components", - "UI", - "vanilla-js", - "reactive-programming" - ], - "license": "MIT", "scripts": { - "docs": "bun x serve docs", - "build": "rollup -c", - "prepublishOnly": "npm run build" + "build:css": "./node_modules/.bin/tailwindcss -i ./src/css/sigpro.css -o ./css/sigpro.css --content './src/**/*.js' --minify", + "build:js": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.js --format=iife --global-name=SigProUI && bun build ./index.js --bundle --outfile=./dist/sigpro-ui.min.js --format=iife --global-name=SigProUI --minify", + "build": "bun run build:css && bun run build:js", + "prepublishOnly": "bun run build", + "docs": "bun x serve docs" }, - "peerDependencies": { - "sigpro": ">=1.1.16" + "dependencies": { + "sigpro": "^1.1.18" }, - "type": "module", "devDependencies": { - "@rollup/plugin-terser": "^0.4.4", - "rollup": "^4.34.8" + "@iconify/json": "^2.2.458", + "@iconify/tailwind4": "^1.2.3", + "@tailwindcss/cli": "^4.0.0", + "daisyui": "^5.5.19", + "tailwindcss": "^4.2.2" } } \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 5d87514..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,62 +0,0 @@ -import terser from '@rollup/plugin-terser'; - -export default [ - // ESM - { - input: './index.js', - external: ['sigpro'], - output: { - file: './dist/sigpro-ui.esm.js', - format: 'esm' - } - }, - // CommonJS - { - input: './index.js', - external: ['sigpro'], - output: { - file: './dist/sigpro-ui.cjs', - format: 'cjs' - } - }, - // UMD (IIFE para navegador) - { - input: './index.js', - external: ['sigpro'], - output: { - file: './dist/sigpro-ui.umd.js', - format: 'iife', - name: 'SigProUI', - globals: { - sigpro: 'SigPro' - } - } - }, - // UMD minificado - { - input: './index.js', - external: ['sigpro'], - output: { - file: './dist/sigpro-ui.umd.min.js', - format: 'iife', - name: 'SigProUI', - globals: { - sigpro: 'SigPro' - }, - plugins: [terser()] - } - }, - { - input: './index.js', - external: ['sigpro'], - output: { - file: './docs/sigpro-ui.umd.min.js', - format: 'iife', - name: 'SigProUI', - globals: { - sigpro: 'SigPro' - }, - plugins: [terser()] - } - } -]; \ No newline at end of file diff --git a/src/components/Button.js b/src/components/Button.js index 1222680..d26b134 100644 --- a/src/components/Button.js +++ b/src/components/Button.js @@ -9,9 +9,7 @@ export const Button = (props, children) => { "button", { ...rest, - // Usamos props.class directamente - class: joinClass("btn", props.class), - disabled: () => val(loading) || val(props.disabled), + class: joinClass("btn", props.class) }, [ () => (val(loading) ? $html("span", { class: "loading loading-spinner" }) : null), diff --git a/src/core/utils.js b/src/core/utils.js index 02aca9c..6f94f83 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -1,5 +1,45 @@ +import { $html } from "sigpro"; + export const val = t => typeof t === "function" ? t() : t; export const joinClass = (t, l) => typeof l === "function" ? () => `${t} ${l() || ""}`.trim() : `${t} ${l || ""}`.trim(); + +export const ui = (base, str) => { + if (!str) return base; + + const parts = typeof str === 'string' ? str.split(' ') : str; + const classes = [base]; + + parts.forEach(part => { + if (part) classes.push(`${base}-${part}`); + }); + + return classes.join(' '); +}; + +export const getIcon = (icon) => { + if (!icon) return null; + + let position = 'left'; + let iconValue = icon; + + if (typeof icon === 'string') { + const parts = icon.trim().split(/\s+/); + if (parts[parts.length - 1] === 'right') { + position = 'right'; + iconValue = parts.slice(0, -1).join(' '); + } + } + + const spacing = position === 'left' ? 'mr-1' : 'ml-1'; + + const element = typeof iconValue === 'string' && iconValue.includes('--') + ? $html("span", { class: `icon-[${iconValue}]` }) + : typeof iconValue === 'function' + ? iconValue() + : $html("span", {}, iconValue); + + return $html("span", { class: spacing }, element); +}; \ No newline at end of file diff --git a/src/css/index.js b/src/css/index.js new file mode 100644 index 0000000..da727cf --- /dev/null +++ b/src/css/index.js @@ -0,0 +1,4 @@ +// css/index.js +import './sigpro.css'; + +export default { version: '1.0.0' }; \ No newline at end of file diff --git a/src/css/sigpro.css b/src/css/sigpro.css new file mode 100644 index 0000000..d0c0935 --- /dev/null +++ b/src/css/sigpro.css @@ -0,0 +1,3 @@ +@import "tailwindcss"; +@plugin "daisyui"; +@plugin "@iconify/tailwind4"; \ No newline at end of file diff --git a/src/ui/Accordion.js b/src/ui/Accordion.js new file mode 100644 index 0000000..02304f2 --- /dev/null +++ b/src/ui/Accordion.js @@ -0,0 +1,27 @@ +// components/Accordion.js +import { $html } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; + +export const Accordion = (props, children) => { + const { ui: uiProps, class: className, title, name, open, ...rest } = props; + + const dynamicClasses = [ + ui('collapse', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("collapse collapse-arrow bg-base-200 mb-2", dynamicClasses); + + return $html("div", { + ...rest, + class: classes, + }, [ + $html("input", { + type: name ? "radio" : "checkbox", + name: name, + checked: val(open), + }), + $html("div", { class: "collapse-title text-xl font-medium" }, title), + $html("div", { class: "collapse-content" }, children), + ]); +}; \ No newline at end of file diff --git a/src/ui/Alert.js b/src/ui/Alert.js new file mode 100644 index 0000000..ff98be5 --- /dev/null +++ b/src/ui/Alert.js @@ -0,0 +1,55 @@ +// components/Alert.js +import { $html } from "sigpro"; +import { ui, val, joinClass, getIcon } from "../core/utils.js"; + +export const Alert = (props, children) => { + const { ui: uiProps, class: className, type = "info", soft = true, actions, ...rest } = props; + + const dynamicClasses = [ + ui('alert', uiProps), + className + ].filter(Boolean).join(' '); + + const typeClass = () => { + const t = val(type); + const map = { + info: "alert-info", + success: "alert-success", + warning: "alert-warning", + error: "alert-error", + }; + return map[t] || t; + }; + + const softClass = () => val(soft) ? "alert-soft" : ""; + + const classes = joinClass( + ["alert", typeClass(), softClass()].filter(Boolean).join(' '), + dynamicClasses + ); + + const content = children || props.message; + + const iconMap = { + info: "lucide--info", + success: "lucide--check-circle", + warning: "lucide--alert-triangle", + error: "lucide--alert-circle", + }; + + const iconName = iconMap[val(type)] || iconMap.info; + + return $html("div", { + ...rest, + role: "alert", + class: classes, + }, [ + getIcon(iconName), + $html("div", { class: "flex-1" }, [ + $html("span", {}, [typeof content === "function" ? content() : content]) + ]), + actions ? $html("div", { class: "flex-none" }, [ + typeof actions === "function" ? actions() : actions + ]) : null, + ]); +}; \ No newline at end of file diff --git a/src/ui/Autocomplete.js b/src/ui/Autocomplete.js new file mode 100644 index 0000000..1943bde --- /dev/null +++ b/src/ui/Autocomplete.js @@ -0,0 +1,102 @@ +// components/Autocomplete.js +import { $, $html, $for } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; +import { tt } from "../core/i18n.js"; +import { Input } from "./Input.js"; + +export const Autocomplete = (props) => { + const { ui: uiProps, class: className, options = [], value, onSelect, label, placeholder, ...rest } = props; + + const query = $(val(value) || ""); + const isOpen = $(false); + const cursor = $(-1); + + const list = $(() => { + const q = query().toLowerCase(); + const data = val(options) || []; + return q + ? data.filter((o) => (typeof o === "string" ? o : o.label).toLowerCase().includes(q)) + : data; + }); + + const pick = (opt) => { + const valStr = typeof opt === "string" ? opt : opt.value; + const labelStr = typeof opt === "string" ? opt : opt.label; + + query(labelStr); + if (typeof value === "function") value(valStr); + onSelect?.(opt); + + isOpen(false); + cursor(-1); + }; + + const nav = (e) => { + const items = list(); + if (e.key === "ArrowDown") { + e.preventDefault(); + isOpen(true); + cursor(Math.min(cursor() + 1, items.length - 1)); + } else if (e.key === "ArrowUp") { + e.preventDefault(); + cursor(Math.max(cursor() - 1, 0)); + } else if (e.key === "Enter" && cursor() >= 0) { + e.preventDefault(); + pick(items[cursor()]); + } else if (e.key === "Escape") { + isOpen(false); + } + }; + + const dynamicClasses = [ + ui('autocomplete', uiProps), + className + ].filter(Boolean).join(' '); + + const containerClasses = joinClass("relative w-full", dynamicClasses); + + return $html("div", { class: containerClasses }, [ + Input({ + label, + placeholder: placeholder || tt("search")(), + value: query, + onfocus: () => isOpen(true), + onblur: () => setTimeout(() => isOpen(false), 150), + onkeydown: nav, + oninput: (e) => { + const v = e.target.value; + query(v); + if (typeof value === "function") value(v); + isOpen(true); + cursor(-1); + }, + ...rest, + }), + $html( + "ul", + { + class: "absolute left-0 w-full menu bg-base-100 rounded-box mt-1 p-2 shadow-xl max-h-60 overflow-y-auto border border-base-300 z-50", + style: () => (isOpen() && list().length ? "display:block" : "display:none"), + }, + [ + $for( + list, + (opt, i) => + $html("li", {}, [ + $html( + "a", + { + class: () => `block w-full ${cursor() === i ? "active bg-primary text-primary-content" : ""}`, + onclick: () => pick(opt), + onmouseenter: () => cursor(i), + }, + typeof opt === "string" ? opt : opt.label, + ), + ]), + (opt, i) => (typeof opt === "string" ? opt : opt.value) + i, + ), + () => (list().length ? null : $html("li", { class: "p-2 text-center opacity-50" }, tt("nodata")())), + ], + ), + ]); +}; \ No newline at end of file diff --git a/src/ui/Badge.js b/src/ui/Badge.js new file mode 100644 index 0000000..d219293 --- /dev/null +++ b/src/ui/Badge.js @@ -0,0 +1,16 @@ +// components/Badge.js +import { $html } from "sigpro"; +import { ui, joinClass } from "../core/utils.js"; + +export const Badge = (props, children) => { + const { ui: uiProps, class: className, ...rest } = props; + + const dynamicClasses = [ + ui('badge', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("badge", dynamicClasses); + + return $html("span", { ...rest, class: classes }, children); +}; \ No newline at end of file diff --git a/src/ui/Button.js b/src/ui/Button.js new file mode 100644 index 0000000..ff0e5eb --- /dev/null +++ b/src/ui/Button.js @@ -0,0 +1,28 @@ +// components/Button.js +import { $html } from "sigpro"; +import { ui, val, getIcon, joinClass } from "../core/utils.js"; + +export const Button = (props, children) => { + const { ui: uiProps, class: className, loading, icon, ...rest } = props; + + const dynamicClasses = [ + ui('btn', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("btn", dynamicClasses); + + const iconEl = getIcon(icon); + + const content = [ + () => val(loading) && $html("span", { class: "loading loading-spinner" }), + iconEl, + children, + ].filter(Boolean); + + return $html("button", { + ...rest, + class: classes, + disabled: () => val(loading) || val(props.disabled), + }, content); +}; \ No newline at end of file diff --git a/src/ui/Checkbox.js b/src/ui/Checkbox.js new file mode 100644 index 0000000..31f0eff --- /dev/null +++ b/src/ui/Checkbox.js @@ -0,0 +1,26 @@ +// components/Checkbox.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Checkbox = (props) => { + const { ui: uiProps, class: className, value, tooltip, toggle, label, ...rest } = props; + + const dynamicClasses = [ + ui('checkbox', uiProps), + className + ].filter(Boolean).join(' '); + + const checkEl = $html("input", { + ...rest, + type: "checkbox", + class: () => joinClass(val(toggle) ? "toggle" : "checkbox", dynamicClasses), + checked: value + }); + + const layout = $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ + checkEl, + label ? $html("span", { class: "label-text" }, label) : null, + ]); + + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; +}; \ No newline at end of file diff --git a/src/ui/Colorpicker.js b/src/ui/Colorpicker.js new file mode 100644 index 0000000..5a6a964 --- /dev/null +++ b/src/ui/Colorpicker.js @@ -0,0 +1,88 @@ +// components/Colorpicker.js +import { $, $html, $if } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Colorpicker = (props) => { + const { ui: uiProps, class: className, value, label, ...rest } = props; + const isOpen = $(false); + + const palette = [ + ...["#000", "#1A1A1A", "#333", "#4D4D4D", "#666", "#808080", "#B3B3B3", "#FFF"], + ...["#450a0a", "#7f1d1d", "#991b1b", "#b91c1c", "#dc2626", "#ef4444", "#f87171", "#fca5a5"], + ...["#431407", "#7c2d12", "#9a3412", "#c2410c", "#ea580c", "#f97316", "#fb923c", "#ffedd5"], + ...["#713f12", "#a16207", "#ca8a04", "#eab308", "#facc15", "#fde047", "#fef08a", "#fff9c4"], + ...["#064e3b", "#065f46", "#059669", "#10b981", "#34d399", "#4ade80", "#84cc16", "#d9f99d"], + ...["#082f49", "#075985", "#0284c7", "#0ea5e9", "#38bdf8", "#7dd3fc", "#22d3ee", "#cffafe"], + ...["#1e1b4b", "#312e81", "#4338ca", "#4f46e5", "#6366f1", "#818cf8", "#a5b4fc", "#e0e7ff"], + ...["#2e1065", "#4c1d95", "#6d28d9", "#7c3aed", "#8b5cf6", "#a855f7", "#d946ef", "#fae8ff"], + ]; + + const getColor = () => val(value) || "#000000"; + + const dynamicClasses = [ + ui('colorpicker', uiProps), + className + ].filter(Boolean).join(' '); + + const containerClasses = joinClass("relative w-fit", dynamicClasses); + + return $html("div", { class: containerClasses }, [ + $html( + "button", + { + type: "button", + class: "btn px-3 bg-base-100 border-base-300 hover:border-primary/50 flex items-center gap-2 shadow-sm font-normal normal-case", + onclick: (e) => { + e.stopPropagation(); + isOpen(!isOpen()); + }, + ...rest, + }, + [ + $html("div", { + class: "size-5 rounded-sm shadow-inner border border-black/10 shrink-0", + style: () => `background-color: ${getColor()}`, + }), + label ? $html("span", { class: "opacity-80" }, label) : null, + ], + ), + + $if(isOpen, () => + $html( + "div", + { + class: "absolute left-0 mt-2 p-3 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[110] w-64 select-none", + onclick: (e) => e.stopPropagation(), + }, + [ + $html( + "div", + { class: "grid grid-cols-8 gap-1" }, + palette.map((c) => + $html("button", { + type: "button", + style: `background-color: ${c}`, + class: () => { + const active = getColor().toLowerCase() === c.toLowerCase(); + return `size-6 rounded-sm cursor-pointer transition-all hover:scale-125 hover:z-10 active:scale-95 outline-none border border-black/5 + ${active ? "ring-2 ring-offset-1 ring-primary z-10 scale-110" : ""}`; + }, + onclick: () => { + if (typeof value === "function") value(c); + isOpen(false); + }, + }), + ), + ), + ], + ), + ), + + $if(isOpen, () => + $html("div", { + class: "fixed inset-0 z-[100]", + onclick: () => isOpen(false), + }), + ), + ]); +}; \ No newline at end of file diff --git a/src/ui/Datepicker.js b/src/ui/Datepicker.js new file mode 100644 index 0000000..e999aed --- /dev/null +++ b/src/ui/Datepicker.js @@ -0,0 +1,252 @@ +// components/Datepicker.js +import { $, $html, $if } from "sigpro"; +import { val, ui, joinClass, getIcon } from "../core/utils.js"; +import { Input } from "./Input.js"; + +export const Datepicker = (props) => { + const { ui: uiProps, class: className, value, range, label, placeholder, hour = false, ...rest } = props; + + const isOpen = $(false); + const internalDate = $(new Date()); + const hoverDate = $(null); + const startHour = $(0); + const endHour = $(0); + const isRangeMode = () => val(range) === true; + + const now = new Date(); + const todayStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`; + + const formatDate = (d) => { + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, "0"); + const day = String(d.getDate()).padStart(2, "0"); + return `${year}-${month}-${day}`; + }; + + const selectDate = (date) => { + const dateStr = formatDate(date); + const current = val(value); + + if (isRangeMode()) { + if (!current?.start || (current.start && current.end)) { + if (typeof value === "function") { + value({ + start: dateStr, + end: null, + ...(hour && { startHour: startHour() }), + }); + } + } else { + const start = current.start; + if (typeof value === "function") { + const newValue = dateStr < start ? { start: dateStr, end: start } : { start, end: dateStr }; + if (hour) { + newValue.startHour = current.startHour || startHour(); + newValue.endHour = current.endHour || endHour(); + } + value(newValue); + } + isOpen(false); + } + } else { + if (typeof value === "function") { + value(hour ? `${dateStr}T${String(startHour()).padStart(2, "0")}:00:00` : dateStr); + } + isOpen(false); + } + }; + + const displayValue = $(() => { + const v = val(value); + if (!v) return ""; + if (typeof v === "string") { + if (hour && v.includes("T")) return v.replace("T", " "); + return v; + } + if (v.start && v.end) { + const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + const endStr = hour && v.endHour ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end; + return `${startStr} - ${endStr}`; + } + if (v.start) { + const startStr = hour && v.startHour ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start; + return `${startStr}...`; + } + return ""; + }); + + const move = (m) => { + const d = internalDate(); + internalDate(new Date(d.getFullYear(), d.getMonth() + m, 1)); + }; + + const moveYear = (y) => { + const d = internalDate(); + internalDate(new Date(d.getFullYear() + y, d.getMonth(), 1)); + }; + + const HourSlider = ({ value: hVal, onChange }) => { + return $html("div", { class: "flex-1" }, [ + $html("div", { class: "flex gap-2 items-center" }, [ + $html("input", { + type: "range", + min: 0, + max: 23, + value: hVal, + class: "range range-xs flex-1", + oninput: (e) => { + const newHour = parseInt(e.target.value); + onChange(newHour); + }, + }), + $html("span", { class: "text-sm font-mono min-w-[48px] text-center" }, + () => String(val(hVal)).padStart(2, "0") + ":00" + ), + ]), + ]); + }; + + const dynamicClasses = [ + ui('datepicker', uiProps), + className + ].filter(Boolean).join(' '); + + const containerClasses = joinClass("relative w-full", dynamicClasses); + + return $html("div", { class: containerClasses }, [ + Input({ + label, + placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."), + value: displayValue, + readonly: true, + icon: getIcon("lucide--calendar"), + onclick: (e) => { + e.stopPropagation(); + isOpen(!isOpen()); + }, + ...rest, + }), + + $if(isOpen, () => + $html( + "div", + { + class: "absolute left-0 mt-2 p-4 bg-base-100 border border-base-300 shadow-2xl rounded-box z-[100] w-80 select-none", + onclick: (e) => e.stopPropagation(), + }, + [ + $html("div", { class: "flex justify-between items-center mb-4 gap-1" }, [ + $html("div", { class: "flex gap-0.5" }, [ + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(-1) }, + getIcon("lucide--chevrons-left") + ), + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(-1) }, + getIcon("lucide--chevron-left") + ), + ]), + $html("span", { class: "font-bold uppercase flex-1 text-center" }, [ + () => internalDate().toLocaleString("es-ES", { month: "short", year: "numeric" }), + ]), + $html("div", { class: "flex gap-0.5" }, [ + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => move(1) }, + getIcon("lucide--chevron-right") + ), + $html("button", { type: "button", class: "btn btn-ghost btn-xs px-1", onclick: () => moveYear(1) }, + getIcon("lucide--chevrons-right") + ), + ]), + ]), + + $html("div", { class: "grid grid-cols-7 gap-1", onmouseleave: () => hoverDate(null) }, [ + ...["L", "M", "X", "J", "V", "S", "D"].map((d) => $html("div", { class: "text-[10px] opacity-40 font-bold text-center" }, d)), + () => { + const d = internalDate(); + const year = d.getFullYear(); + const month = d.getMonth(); + const firstDay = new Date(year, month, 1).getDay(); + const offset = firstDay === 0 ? 6 : firstDay - 1; + const daysInMonth = new Date(year, month + 1, 0).getDate(); + + const nodes = []; + for (let i = 0; i < offset; i++) nodes.push($html("div")); + + for (let i = 1; i <= daysInMonth; i++) { + const date = new Date(year, month, i); + const dStr = formatDate(date); + + nodes.push( + $html( + "button", + { + type: "button", + class: () => { + const v = val(value); + const h = hoverDate(); + const isStart = typeof v === "string" ? v.split("T")[0] === dStr : v?.start === dStr; + const isEnd = v?.end === dStr; + let inRange = false; + + if (isRangeMode() && v?.start) { + const start = v.start; + if (!v.end && h) { + inRange = (dStr > start && dStr <= h) || (dStr < start && dStr >= h); + } else if (v.end) { + inRange = dStr > start && dStr < v.end; + } + } + + const base = "btn btn-xs p-0 aspect-square min-h-0 h-auto font-normal relative"; + const state = isStart || isEnd ? "btn-primary z-10" : inRange ? "bg-primary/20 border-none rounded-none" : "btn-ghost"; + const today = dStr === todayStr ? "ring-1 ring-primary ring-inset font-black text-primary" : ""; + + return `${base} ${state} ${today}`; + }, + onmouseenter: () => { if (isRangeMode()) hoverDate(dStr); }, + onclick: () => selectDate(date), + }, + [i.toString()], + ), + ); + } + return nodes; + }, + ]), + + hour ? $html("div", { class: "mt-3 pt-2 border-t border-base-300" }, [ + isRangeMode() + ? $html("div", { class: "flex gap-4" }, [ + HourSlider({ + value: startHour, + onChange: (newHour) => { + startHour(newHour); + const currentVal = val(value); + if (currentVal?.start) value({ ...currentVal, startHour: newHour }); + }, + }), + HourSlider({ + value: endHour, + onChange: (newHour) => { + endHour(newHour); + const currentVal = val(value); + if (currentVal?.end) value({ ...currentVal, endHour: newHour }); + }, + }), + ]) + : HourSlider({ + value: startHour, + onChange: (newHour) => { + startHour(newHour); + const currentVal = val(value); + if (currentVal && typeof currentVal === "string" && currentVal.includes("-")) { + value(currentVal.split("T")[0] + "T" + String(newHour).padStart(2, "0") + ":00:00"); + } + }, + }), + ]) : null, + ], + ), + ), + + $if(isOpen, () => $html("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })), + ]); +}; \ No newline at end of file diff --git a/src/ui/Drawer.js b/src/ui/Drawer.js new file mode 100644 index 0000000..26fa243 --- /dev/null +++ b/src/ui/Drawer.js @@ -0,0 +1,28 @@ +// components/Drawer.js +import { $html } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; + +export const Drawer = (props) => { + const { ui: uiProps, class: className, id, open, content, side, ...rest } = props; + + const dynamicClasses = [ + ui('drawer', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("drawer", dynamicClasses); + + return $html("div", { ...rest, class: classes }, [ + $html("input", { + id, + type: "checkbox", + class: "drawer-toggle", + checked: val(open), + }), + $html("div", { class: "drawer-content" }, content), + $html("div", { class: "drawer-side" }, [ + $html("label", { for: id, class: "drawer-overlay", onclick: () => open?.(false) }), + $html("div", { class: "min-h-full bg-base-200 w-80" }, side), + ]), + ]); +}; \ No newline at end of file diff --git a/src/ui/Dropdown.js b/src/ui/Dropdown.js new file mode 100644 index 0000000..c6d5174 --- /dev/null +++ b/src/ui/Dropdown.js @@ -0,0 +1,61 @@ +// components/Dropdown.js +import { $html, $for } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Dropdown = (props, children) => { + const { ui: uiProps, class: className, label, icon, items, ...rest } = props; + + const dynamicClasses = [ + ui('dropdown', uiProps), + className + ].filter(Boolean).join(' '); + + const containerClasses = joinClass("dropdown", dynamicClasses); + + const renderContent = () => { + if (items) { + const source = typeof items === "function" ? items : () => items; + return $html("ul", { + tabindex: 0, + class: "dropdown-content z-[50] menu p-2 shadow bg-base-100 rounded-box w-52 border border-base-300" + }, [ + $for(source, (item) => + $html("li", {}, [ + $html("a", { + class: item.class || "", + onclick: (e) => { + if (item.onclick) item.onclick(e); + if (document.activeElement) document.activeElement.blur(); + } + }, [ + item.icon ? $html("span", {}, item.icon) : null, + $html("span", {}, item.label) + ]) + ]) + ) + ]); + } + + return $html("div", { + tabindex: 0, + class: "dropdown-content z-[50] p-2 shadow bg-base-100 rounded-box min-w-max border border-base-300" + }, [ + typeof children === "function" ? children() : children + ]); + }; + + return $html("div", { + ...rest, + class: containerClasses, + }, [ + $html("div", { + tabindex: 0, + role: "button", + class: "btn m-1 flex items-center gap-2", + }, [ + icon ? (typeof icon === "function" ? icon() : icon) : null, + label ? (typeof label === "function" ? label() : label) : null + ]), + renderContent() + ]); +}; \ No newline at end of file diff --git a/src/ui/Fab.js b/src/ui/Fab.js new file mode 100644 index 0000000..f9871f6 --- /dev/null +++ b/src/ui/Fab.js @@ -0,0 +1,54 @@ +// components/Fab.js +import { $html } from "sigpro"; +import { val, ui, joinClass, getIcon } from "../core/utils.js"; + +export const Fab = (props) => { + const { ui: uiProps, class: className, icon, label, actions = [], position = "bottom-6 right-6", ...rest } = props; + + const dynamicClasses = [ + ui('fab', uiProps), + className + ].filter(Boolean).join(' '); + + const containerClasses = joinClass(`fab absolute ${position} flex flex-col-reverse items-end gap-3 z-[100]`, dynamicClasses); + + return $html( + "div", + { + ...rest, + class: containerClasses, + }, + [ + $html( + "div", + { + tabindex: 0, + role: "button", + class: "btn btn-lg btn-circle btn-primary shadow-2xl", + }, + [ + icon ? getIcon(icon) : null, + !icon && label ? label : null + ], + ), + + ...val(actions).map((act) => + $html("div", { class: "flex items-center gap-3 transition-all duration-300" }, [ + act.label ? $html("span", { class: "badge badge-ghost shadow-sm whitespace-nowrap" }, act.label) : null, + $html( + "button", + { + type: "button", + class: `btn btn-circle shadow-lg ${act.class || ""}`, + onclick: (e) => { + e.stopPropagation(); + act.onclick?.(e); + }, + }, + [act.icon ? getIcon(act.icon) : act.text || ""], + ), + ]), + ), + ], + ); +}; \ No newline at end of file diff --git a/src/ui/Fieldset.js b/src/ui/Fieldset.js new file mode 100644 index 0000000..97a00ac --- /dev/null +++ b/src/ui/Fieldset.js @@ -0,0 +1,29 @@ +// components/Fieldset.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Fieldset = (props, children) => { + const { ui: uiProps, class: className, legend, ...rest } = props; + + const dynamicClasses = [ + ui('fieldset', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("fieldset bg-base-200 border border-base-300 p-4 rounded-lg", dynamicClasses); + + return $html( + "fieldset", + { + ...rest, + class: classes, + }, + [ + () => { + const legendText = val(legend); + return legendText ? $html("legend", { class: "fieldset-legend font-bold" }, [legendText]) : null; + }, + children, + ], + ); +}; \ No newline at end of file diff --git a/src/ui/Fileinput.js b/src/ui/Fileinput.js new file mode 100644 index 0000000..eb07d63 --- /dev/null +++ b/src/ui/Fileinput.js @@ -0,0 +1,120 @@ +// components/Fileinput.js +import { $, $html, $if, $for } from "sigpro"; +import { val, ui, joinClass, getIcon } from "../core/utils.js"; + +export const Fileinput = (props) => { + const { ui: uiProps, class: className, tooltip, max = 2, accept = "*", onSelect, ...rest } = props; + + const selectedFiles = $([]); + const isDragging = $(false); + const error = $(null); + const MAX_BYTES = max * 1024 * 1024; + + const dynamicClasses = [ + ui('fileinput', uiProps), + className + ].filter(Boolean).join(' '); + + const fieldsetClasses = joinClass("fieldset w-full p-0", dynamicClasses); + + const handleFiles = (files) => { + const fileList = Array.from(files); + error(null); + const oversized = fileList.find((f) => f.size > MAX_BYTES); + + if (oversized) { + error(`Máx ${max}MB`); + return; + } + + selectedFiles([...selectedFiles(), ...fileList]); + onSelect?.(selectedFiles()); + }; + + const removeFile = (index) => { + const updated = selectedFiles().filter((_, i) => i !== index); + selectedFiles(updated); + onSelect?.(updated); + }; + + return $html("fieldset", { ...rest, class: fieldsetClasses }, [ + $html( + "div", + { + class: () => `w-full ${tooltip ? "tooltip tooltip-top before:z-50 after:z-50" : ""}`, + "data-tip": tooltip, + }, + [ + $html( + "label", + { + class: () => ` + relative flex items-center justify-between w-full h-12 px-4 + border-2 border-dashed rounded-lg cursor-pointer + transition-all duration-200 + ${isDragging() ? "border-primary bg-primary/10" : "border-base-content/20 bg-base-100 hover:bg-base-200"} + `, + ondragover: (e) => { + e.preventDefault(); + isDragging(true); + }, + ondragleave: () => isDragging(false), + ondrop: (e) => { + e.preventDefault(); + isDragging(false); + handleFiles(e.dataTransfer.files); + }, + }, + [ + $html("div", { class: "flex items-center gap-3 w-full" }, [ + getIcon("lucide--upload"), + $html("span", { class: "text-sm opacity-70 truncate grow text-left" }, "Arrastra o selecciona archivos..."), + $html("span", { class: "text-[10px] opacity-40 shrink-0" }, `Máx ${max}MB`), + ]), + $html("input", { + type: "file", + multiple: true, + accept: accept, + class: "hidden", + onchange: (e) => handleFiles(e.target.files), + }), + ], + ), + ], + ), + + () => (error() ? $html("span", { class: "text-[10px] text-error mt-1 px-1 font-medium" }, error()) : null), + + $if( + () => selectedFiles().length > 0, + () => + $html("ul", { class: "mt-2 space-y-1" }, [ + $for( + selectedFiles, + (file, index) => + $html("li", { class: "flex items-center justify-between p-1.5 pl-3 text-xs bg-base-200/50 rounded-md border border-base-300" }, [ + $html("div", { class: "flex items-center gap-2 truncate" }, [ + $html("span", { class: "opacity-50" }, "📄"), + $html("span", { class: "truncate font-medium max-w-[200px]" }, file.name), + $html("span", { class: "text-[9px] opacity-40" }, `(${(file.size / 1024).toFixed(0)} KB)`), + ]), + $html( + "button", + { + type: "button", + class: "btn btn-ghost btn-xs btn-circle", + onclick: (e) => { + e.preventDefault(); + e.stopPropagation(); + removeFile(index); + }, + }, + [getIcon("lucide--x")] + ), + ]), + (file) => file.name + file.lastModified, + ), + ]), + ), + ]); +}; \ No newline at end of file diff --git a/src/ui/Indicator.js b/src/ui/Indicator.js new file mode 100644 index 0000000..206f77d --- /dev/null +++ b/src/ui/Indicator.js @@ -0,0 +1,19 @@ +// components/Indicator.js +import { $html } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; + +export const Indicator = (props, children) => { + const { ui: uiProps, class: className, badge, badgeClass = "badge-secondary", ...rest } = props; + + const dynamicClasses = [ + ui('indicator', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("indicator", dynamicClasses); + + return $html("div", { ...rest, class: classes }, [ + children, + badge ? $html("span", { class: joinClass("indicator-item badge", badgeClass) }, val(badge)) : null, + ]); +}; \ No newline at end of file diff --git a/src/ui/Input.js b/src/ui/Input.js new file mode 100644 index 0000000..7b1e8bc --- /dev/null +++ b/src/ui/Input.js @@ -0,0 +1,76 @@ +// components/Input.js +import { $, $html } from "sigpro"; +import { val, ui, joinClass, getIcon } from "../core/utils.js"; +import { tt } from "../core/i18n.js"; + +export const Input = (props) => { + const { ui: uiProps, class: className, label, tip, value, error, isSearch, icon, type = "text", ...rest } = props; + const isPassword = type === "password"; + const visible = $(false); + + const iconMap = { + text: "lucide--text", + password: "lucide--lock", + date: "lucide--calendar", + number: "lucide--hash", + email: "lucide--mail", + search: "lucide--search", + }; + + const dynamicClasses = [ + ui('input', uiProps), + className + ].filter(Boolean).join(' '); + + const inputClasses = joinClass("input input-bordered floating-label flex items-center gap-2 w-full relative", val(error) ? "input-error" : ""); + + const inputEl = $html("input", { + ...rest, + type: () => (isPassword ? (visible() ? "text" : "password") : type), + placeholder: props.placeholder || label || (isSearch ? tt("search")() : " "), + class: joinClass("grow order-2 focus:outline-none", dynamicClasses), + value: value, + oninput: (e) => props.oninput?.(e), + disabled: () => val(props.disabled), + }); + + const leftIcon = icon + ? getIcon(icon) + : (iconMap[type] ? getIcon(iconMap[type]) : null); + + const passwordIcon = getIcon(visible() ? "lucide--eye-off" : "lucide--eye"); + + return $html( + "label", + { + class: inputClasses, + }, + [ + leftIcon ? $html("div", { class: "order-1 shrink-0" }, leftIcon) : null, + label ? $html("span", { class: "text-base-content/60 order-0" }, label) : null, + inputEl, + isPassword + ? $html( + "button", + { + type: "button", + class: "order-3 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100", + onclick: (e) => { + e.preventDefault(); + visible(!visible()); + }, + }, + () => passwordIcon + ) + : null, + tip + ? $html( + "div", + { class: "tooltip tooltip-left order-4", "data-tip": tip }, + $html("span", { class: "badge badge-ghost badge-xs cursor-help" }, "?"), + ) + : null, + () => (val(error) ? $html("span", { class: "text-error text-[10px] absolute -bottom-5 left-2" }, val(error)) : null), + ], + ); +}; \ No newline at end of file diff --git a/src/ui/List.js b/src/ui/List.js new file mode 100644 index 0000000..91c338a --- /dev/null +++ b/src/ui/List.js @@ -0,0 +1,37 @@ +// components/List.js +import { $html, $if, $for } from "sigpro"; +import { ui, joinClass, val } from "../core/utils.js"; + +export const List = (props) => { + const { + ui: uiProps, + class: className, + items, + header, + render, + keyFn = (item, index) => index, + ...rest + } = props; + + const dynamicClasses = [ + ui('list', uiProps), + className + ].filter(Boolean).join(' '); + + const listClasses = joinClass("list bg-base-100 rounded-box shadow-md", dynamicClasses); + + const listItems = $for( + items, + (item, index) => $html("li", { class: "list-row" }, [render(item, index)]), + keyFn + ); + + return $html( + "ul", + { + ...rest, + class: listClasses, + }, + header ? [$if(header, () => $html("li", { class: "p-4 pb-2 text-xs opacity-60" }, [val(header)])), listItems] : listItems + ); +}; \ No newline at end of file diff --git a/src/ui/Loading.js b/src/ui/Loading.js new file mode 100644 index 0000000..902c631 --- /dev/null +++ b/src/ui/Loading.js @@ -0,0 +1,13 @@ +import { $html, $if } from "sigpro"; + +/** LOADING (Overlay Component) */ +export const Loading = (props) => { + // Se espera un signal props.$show para controlar la visibilidad + return $if(props.$show, () => + $html("div", { + class: "fixed inset-0 z-[100] flex items-center justify-center backdrop-blur-sm bg-base-100/30" + }, [ + $html("span", { class: "loading loading-spinner loading-lg text-primary" }), + ]), + ); +}; diff --git a/src/ui/Menu.js b/src/ui/Menu.js new file mode 100644 index 0000000..d92275a --- /dev/null +++ b/src/ui/Menu.js @@ -0,0 +1,34 @@ +// components/Menu.js +import { $html, $for } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Menu = (props) => { + const { ui: uiProps, class: className, items, ...rest } = props; + + const dynamicClasses = [ + ui('menu', uiProps), + className + ].filter(Boolean).join(' '); + + const menuClasses = joinClass("menu bg-base-200 rounded-box", dynamicClasses); + + const renderItems = (items) => + $for( + () => items || [], + (it) => + $html("li", {}, [ + it.children + ? $html("details", { open: it.open }, [ + $html("summary", {}, [it.icon && $html("span", { class: "mr-2" }, it.icon), it.label]), + $html("ul", {}, renderItems(it.children)), + ]) + : $html("a", { class: () => (val(it.active) ? "active" : ""), onclick: it.onclick }, [ + it.icon && $html("span", { class: "mr-2" }, it.icon), + it.label, + ]), + ]), + (it, i) => it.label || i, + ); + + return $html("ul", { ...rest, class: menuClasses }, renderItems(items)); +}; \ No newline at end of file diff --git a/src/ui/Modal.js b/src/ui/Modal.js new file mode 100644 index 0000000..1615a18 --- /dev/null +++ b/src/ui/Modal.js @@ -0,0 +1,58 @@ +// components/Modal.js +import { $html, $watch } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; +import { tt } from "../core/i18n.js"; +import { Button } from "./Button.js"; + +export const Modal = (props, children) => { + const { ui: uiProps, class: className, title, buttons, open, ...rest } = props; + const dialogRef = { current: null }; + + const dynamicClasses = [ + ui('modal', uiProps), + className + ].filter(Boolean).join(' '); + + const modalClasses = joinClass("modal", dynamicClasses); + + $watch(() => { + const dialog = dialogRef.current; + if (!dialog) return; + + if (val(open)) { + if (!dialog.open) dialog.showModal(); + } else { + if (dialog.open) dialog.close(); + } + }); + + const close = (e) => { + if (e && e.preventDefault) e.preventDefault(); + if (typeof open === "function") open(false); + }; + + return $html("dialog", { + ...rest, + ref: dialogRef, + class: modalClasses, + oncancel: () => typeof open === "function" && open(false) + }, [ + $html("div", { class: "modal-box" }, [ + title ? $html("h3", { class: "text-lg font-bold mb-4" }, title) : null, + $html("div", { class: "py-2" }, [ + typeof children === "function" ? children() : children + ]), + $html("div", { class: "modal-action flex gap-2" }, [ + ...(Array.isArray(buttons) ? buttons : [buttons]).filter(Boolean), + Button({ type: "button", onclick: close }, tt("close")()), + ]), + ]), + $html("form", { + method: "dialog", + class: "modal-backdrop", + onsubmit: close + }, [ + $html("button", {}, "close") + ]) + ]); +}; \ No newline at end of file diff --git a/src/ui/Navbar.js b/src/ui/Navbar.js new file mode 100644 index 0000000..a75665f --- /dev/null +++ b/src/ui/Navbar.js @@ -0,0 +1,16 @@ +// components/Navbar.js +import { $html } from "sigpro"; +import { ui, joinClass } from "../core/utils.js"; + +export const Navbar = (props, children) => { + const { ui: uiProps, class: className, ...rest } = props; + + const dynamicClasses = [ + ui('navbar', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("navbar bg-base-100 shadow-sm px-4", dynamicClasses); + + return $html("div", { ...rest, class: classes }, children); +}; \ No newline at end of file diff --git a/src/ui/Radio.js b/src/ui/Radio.js new file mode 100644 index 0000000..b2593d5 --- /dev/null +++ b/src/ui/Radio.js @@ -0,0 +1,34 @@ +// components/Radio.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Radio = (props) => { + const { ui: uiProps, class: className, label, tooltip, value, inputValue, name, ...rest } = props; + + const dynamicClasses = [ + ui('radio', uiProps), + className + ].filter(Boolean).join(' '); + + const radioClasses = joinClass("radio", dynamicClasses); + + const radioEl = $html("input", { + ...rest, + type: "radio", + name: name, + class: radioClasses, + checked: () => val(value) === inputValue, + onclick: () => { + if (typeof value === "function") value(inputValue); + }, + }); + + if (!label && !tooltip) return radioEl; + + const layout = $html("label", { class: "label cursor-pointer justify-start gap-3" }, [ + radioEl, + label ? $html("span", { class: "label-text" }, label) : null, + ]); + + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; +}; \ No newline at end of file diff --git a/src/ui/Range.js b/src/ui/Range.js new file mode 100644 index 0000000..f93457b --- /dev/null +++ b/src/ui/Range.js @@ -0,0 +1,31 @@ +// components/Range.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Range = (props) => { + const { ui: uiProps, class: className, label, tooltip, value, ...rest } = props; + + const dynamicClasses = [ + ui('range', uiProps), + className + ].filter(Boolean).join(' '); + + const rangeClasses = joinClass("range", dynamicClasses); + + const rangeEl = $html("input", { + ...rest, + type: "range", + class: rangeClasses, + value: value, + disabled: () => val(props.disabled) + }); + + if (!label && !tooltip) return rangeEl; + + const layout = $html("div", { class: "flex flex-col gap-2" }, [ + label ? $html("span", { class: "label-text" }, label) : null, + rangeEl + ]); + + return tooltip ? $html("div", { class: "tooltip", "data-tip": tooltip }, layout) : layout; +}; \ No newline at end of file diff --git a/src/ui/Rating.js b/src/ui/Rating.js new file mode 100644 index 0000000..62c3879 --- /dev/null +++ b/src/ui/Rating.js @@ -0,0 +1,41 @@ +// components/Rating.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Rating = (props) => { + const { ui: uiProps, class: className, value, count = 5, mask = "mask-star", readonly = false, onchange, ...rest } = props; + + const dynamicClasses = [ + ui('rating', uiProps), + className + ].filter(Boolean).join(' '); + + const ratingGroup = `rating-${Math.random().toString(36).slice(2, 7)}`; + + return $html( + "div", + { + ...rest, + class: () => joinClass(`rating ${val(readonly) ? "pointer-events-none" : ""}`, dynamicClasses), + }, + Array.from({ length: val(count) }, (_, i) => { + const starValue = i + 1; + return $html("input", { + type: "radio", + name: ratingGroup, + class: `mask ${mask}`, + checked: () => Math.round(val(value)) === starValue, + onchange: () => { + if (!val(readonly)) { + if (typeof onchange === "function") { + onchange(starValue); + } + else if (typeof value === "function") { + value(starValue); + } + } + }, + }); + }) + ); +}; \ No newline at end of file diff --git a/src/ui/Select.js b/src/ui/Select.js new file mode 100644 index 0000000..f16a187 --- /dev/null +++ b/src/ui/Select.js @@ -0,0 +1,43 @@ +// components/Select.js +import { $html, $for } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Select = (props) => { + const { ui: uiProps, class: className, label, options, value, ...rest } = props; + + const dynamicClasses = [ + ui('select', uiProps), + className + ].filter(Boolean).join(' '); + + const selectClasses = joinClass("select select-bordered w-full", dynamicClasses); + + const selectEl = $html( + "select", + { + ...rest, + class: selectClasses, + value: value + }, + $for( + () => val(options) || [], + (opt) => + $html( + "option", + { + value: opt.value, + $selected: () => String(val(value)) === String(opt.value), + }, + opt.label, + ), + (opt) => opt.value, + ), + ); + + if (!label) return selectEl; + + return $html("label", { class: "fieldset-label flex flex-col gap-1" }, [ + $html("span", {}, label), + selectEl + ]); +}; \ No newline at end of file diff --git a/src/ui/Stack.js b/src/ui/Stack.js new file mode 100644 index 0000000..a38ac9c --- /dev/null +++ b/src/ui/Stack.js @@ -0,0 +1,16 @@ +// components/Stack.js +import { $html } from "sigpro"; +import { ui, joinClass } from "../core/utils.js"; + +export const Stack = (props, children) => { + const { ui: uiProps, class: className, ...rest } = props; + + const dynamicClasses = [ + ui('stack', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("stack", dynamicClasses); + + return $html("div", { ...rest, class: classes }, children); +}; \ No newline at end of file diff --git a/src/ui/Stat.js b/src/ui/Stat.js new file mode 100644 index 0000000..e8234b6 --- /dev/null +++ b/src/ui/Stat.js @@ -0,0 +1,21 @@ +// components/Stat.js +import { $html } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Stat = (props) => { + const { ui: uiProps, class: className, icon, label, value, desc, ...rest } = props; + + const dynamicClasses = [ + ui('stat', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("stat", dynamicClasses); + + return $html("div", { ...rest, class: classes }, [ + icon && $html("div", { class: "stat-figure text-secondary" }, icon), + label && $html("div", { class: "stat-title" }, label), + $html("div", { class: "stat-value" }, () => val(value) ?? value), + desc && $html("div", { class: "stat-desc" }, desc), + ]); +}; \ No newline at end of file diff --git a/src/ui/Swap.js b/src/ui/Swap.js new file mode 100644 index 0000000..369cb14 --- /dev/null +++ b/src/ui/Swap.js @@ -0,0 +1,23 @@ +// components/Swap.js +import { $html } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; + +export const Swap = (props) => { + const { ui: uiProps, class: className, value, on, off, ...rest } = props; + + const dynamicClasses = [ + ui('swap', uiProps), + className + ].filter(Boolean).join(' '); + + const classes = joinClass("swap", dynamicClasses); + + return $html("label", { ...rest, class: classes }, [ + $html("input", { + type: "checkbox", + checked: val(value) + }), + $html("div", { class: "swap-on" }, on), + $html("div", { class: "swap-off" }, off), + ]); +}; \ No newline at end of file diff --git a/src/ui/Table.js b/src/ui/Table.js new file mode 100644 index 0000000..6943e69 --- /dev/null +++ b/src/ui/Table.js @@ -0,0 +1,67 @@ +// components/Table.js +import { $html, $for, $if } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; +import { tt } from "../core/i18n.js"; + +export const Table = (props) => { + const { + ui: uiProps, + class: className, + items = [], + columns = [], + keyFn, + zebra = false, + pinRows = false, + empty = tt("nodata")(), + ...rest + } = props; + + const dynamicClasses = [ + ui('table', uiProps), + className + ].filter(Boolean).join(' '); + + const tableClass = () => joinClass( + "table", + `${val(zebra) ? "table-zebra" : ""} ${val(pinRows) ? "table-pin-rows" : ""} ${dynamicClasses}` + ); + + return $html("div", { class: "overflow-x-auto w-full bg-base-100 rounded-box border border-base-300" }, [ + $html("table", { ...rest, class: tableClass }, [ + $html("thead", {}, [ + $html("tr", {}, + columns.map(col => $html("th", { class: col.class || "" }, col.label)) + ) + ]), + $html("tbody", {}, [ + $for(items, (item, index) => { + return $html("tr", { class: "hover" }, + columns.map(col => { + const cellContent = () => { + if (col.render) return col.render(item, index); + const value = item[col.key]; + return val(value); + }; + return $html("td", { class: col.class || "" }, [cellContent]); + }) + ); + }, keyFn || ((item, idx) => item.id || idx)), + + $if(() => val(items).length === 0, () => + $html("tr", {}, [ + $html("td", { colspan: columns.length, class: "text-center p-10 opacity-50" }, [ + val(empty) + ]) + ]) + ) + ]), + $if(() => columns.some(c => c.footer), () => + $html("tfoot", {}, [ + $html("tr", {}, + columns.map(col => $html("th", {}, col.footer || "")) + ) + ]) + ) + ]) + ]); +}; \ No newline at end of file diff --git a/src/ui/Tabs.js b/src/ui/Tabs.js new file mode 100644 index 0000000..d9fa04d --- /dev/null +++ b/src/ui/Tabs.js @@ -0,0 +1,69 @@ +// components/Tabs.js +import { $, $html, $for } from "sigpro"; +import { val, ui, joinClass } from "../core/utils.js"; + +export const Tabs = (props) => { + const { ui: uiProps, class: className, items, activeIndex = $(0), ...rest } = props; + + const dynamicClasses = [ + ui('tabs', uiProps), + className + ].filter(Boolean).join(' '); + + const tabsClasses = joinClass("tabs tabs-box", dynamicClasses); + const itemsSignal = typeof items === "function" ? items : () => items || []; + + // Si no se provee activeIndex, creamos uno interno + const internalActive = $(0); + const currentActive = activeIndex !== undefined ? activeIndex : internalActive; + + const handleTabClick = (idx, onClick) => (e) => { + if (typeof currentActive === "function") { + currentActive(idx); + } + onClick?.(e); + }; + + return $html("div", { ...rest, class: "flex flex-col gap-4 w-full" }, [ + $html( + "div", + { + role: "tablist", + class: tabsClasses, + }, + $for( + itemsSignal, + (it, idx) => { + const isActive = val(it.active) ?? (currentActive() === idx); + + return $html( + "a", + { + role: "tab", + class: () => joinClass( + "tab", + isActive && "tab-active", + val(it.disabled) && "tab-disabled", + it.tip && "tooltip" + ), + "data-tip": it.tip, + onclick: !val(it.disabled) ? handleTabClick(idx, it.onclick) : undefined, + }, + it.label, + ); + }, + (t, idx) => t.label + idx, + ), + ), + () => { + const activeItem = itemsSignal().find((it, idx) => + val(it.active) ?? (currentActive() === idx) + ); + if (!activeItem) return null; + const content = val(activeItem.content); + return $html("div", { class: "p-4" }, [ + typeof content === "function" ? content() : content + ]); + }, + ]); +}; \ No newline at end of file diff --git a/src/ui/Timeline.js b/src/ui/Timeline.js new file mode 100644 index 0000000..1a3e72f --- /dev/null +++ b/src/ui/Timeline.js @@ -0,0 +1,54 @@ +// components/Timeline.js +import { $html, $for } from "sigpro"; +import { val, ui, joinClass, getIcon } from "../core/utils.js"; + +export const Timeline = (props) => { + const { ui: uiProps, class: className, items = [], vertical = true, compact = false, ...rest } = props; + + const dynamicClasses = [ + ui('timeline', uiProps), + className + ].filter(Boolean).join(' '); + + const iconMap = { + info: "lucide--info", + success: "lucide--check-circle", + warning: "lucide--alert-triangle", + error: "lucide--alert-circle", + }; + + return $html( + "ul", + { + ...rest, + class: () => joinClass( + `timeline ${val(vertical) ? "timeline-vertical" : "timeline-horizontal"} ${val(compact) ? "timeline-compact" : ""}`, + dynamicClasses + ), + }, + [ + $for( + items, + (item, i) => { + const isFirst = i === 0; + const isLast = i === val(items).length - 1; + const itemType = item.type || "success"; + const renderSlot = (content) => (typeof content === "function" ? content() : content); + + return $html("li", { class: "flex-1" }, [ + !isFirst ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null, + $html("div", { class: "timeline-start" }, [renderSlot(item.title)]), + $html("div", { class: "timeline-middle" }, [ + item.icon + ? getIcon(item.icon) + : getIcon(iconMap[itemType] || iconMap.success) + ]), + $html("div", { class: "timeline-end timeline-box shadow-sm" }, [renderSlot(item.detail)]), + !isLast ? $html("hr", { class: item.completed ? "bg-primary" : "" }) : null, + ]); + }, + (item, i) => item.id || i, + ), + ], + ); +}; \ No newline at end of file diff --git a/src/ui/Toast.js b/src/ui/Toast.js new file mode 100644 index 0000000..87d640a --- /dev/null +++ b/src/ui/Toast.js @@ -0,0 +1,67 @@ +// components/Toast.js +import { $html, $mount } from "sigpro"; +import { getIcon } from "../core/utils.js"; +import { Button } from "./Button.js"; + +/** TOAST (Imperative Function) */ +export const Toast = (message, type = "alert-success", duration = 3500) => { + let container = document.getElementById("sigpro-toast-container"); + + if (!container) { + container = $html("div", { + id: "sigpro-toast-container", + class: "fixed top-0 right-0 z-[9999] p-4 flex flex-col gap-2 pointer-events-none", + }); + document.body.appendChild(container); + } + + const toastHost = $html("div", { style: "display: contents" }); + container.appendChild(toastHost); + + let timeoutId; + + const close = () => { + clearTimeout(timeoutId); + const el = toastHost.firstElementChild; + if (el && !el.classList.contains("opacity-0")) { + el.classList.add("translate-x-full", "opacity-0"); + setTimeout(() => { + instance.destroy(); + toastHost.remove(); + if (!container.hasChildNodes()) container.remove(); + }, 300); + } else { + instance.destroy(); + toastHost.remove(); + } + }; + + const ToastComponent = () => { + const closeIcon = getIcon("lucide--x"); + + const el = $html( + "div", + { + class: `alert alert-soft ${type} shadow-lg transition-all duration-300 translate-x-10 opacity-0 pointer-events-auto`, + }, + [ + $html("span", {}, [typeof message === "function" ? message() : message]), + Button({ + class: "btn-xs btn-circle btn-ghost", + onclick: close + }, closeIcon) + ], + ); + + requestAnimationFrame(() => el.classList.remove("translate-x-10", "opacity-0")); + return el; + }; + + const instance = $mount(ToastComponent, toastHost); + + if (duration > 0) { + timeoutId = setTimeout(close, duration); + } + + return close; +}; \ No newline at end of file diff --git a/src/ui/Tooltip.js b/src/ui/Tooltip.js new file mode 100644 index 0000000..e04ecac --- /dev/null +++ b/src/ui/Tooltip.js @@ -0,0 +1,19 @@ +// components/Tooltip.js +import { $html } from "sigpro"; +import { ui, val, joinClass } from "../core/utils.js"; + +export const Tooltip = (props, children) => { + const { ui: uiProps, class: className, tip, position = "top", ...rest } = props; + + const dynamicClasses = [ + ui('tooltip', uiProps), + className + ].filter(Boolean).join(' '); + + const tipText = typeof tip === "function" ? tip() : tip; + const pos = typeof position === "function" ? position() : position; + + const classes = joinClass(`tooltip tooltip-${pos}`, dynamicClasses); + + return $html("div", { ...rest, class: classes, "data-tip": tipText }, children); +}; \ No newline at end of file diff --git a/src/ui/index.js b/src/ui/index.js new file mode 100644 index 0000000..c948fc7 --- /dev/null +++ b/src/ui/index.js @@ -0,0 +1,110 @@ +import * as AccordionModule from './Accordion.js'; +import * as AlertModule from './Alert.js'; +import * as AutocompleteModule from './Autocomplete.js'; +import * as BadgeModule from './Badge.js'; +import * as ButtonModule from './Button.js'; +import * as CheckboxModule from './Checkbox.js'; +import * as ColorpickerModule from './Colorpicker.js'; +import * as DatepickerModule from './Datepicker.js'; +import * as DrawerModule from './Drawer.js'; +import * as DropdownModule from './Dropdown.js'; +import * as FabModule from './Fab.js'; +import * as FieldsetModule from './Fieldset.js'; +import * as FileinputModule from './Fileinput.js'; +import * as IndicatorModule from './Indicator.js'; +import * as InputModule from './Input.js'; +import * as ListModule from './List.js'; +import * as LoadingModule from './Loading.js'; +import * as MenuModule from './Menu.js'; +import * as ModalModule from './Modal.js'; +import * as NavbarModule from './Navbar.js'; +import * as RadioModule from './Radio.js'; +import * as RangeModule from './Range.js'; +import * as RatingModule from './Rating.js'; +import * as SelectModule from './Select.js'; +import * as StackModule from './Stack.js'; +import * as StatModule from './Stat.js'; +import * as SwapModule from './Swap.js'; +import * as TableModule from './Table.js'; +import * as TabsModule from './Tabs.js'; +import * as TimelineModule from './Timeline.js'; +import * as ToastModule from './Toast.js'; +import * as TooltipModule from './Tooltip.js'; + +export * from './Accordion.js'; +export * from './Alert.js'; +export * from './Autocomplete.js'; +export * from './Badge.js'; +export * from './Button.js'; +export * from './Checkbox.js'; +export * from './Colorpicker.js'; +export * from './Datepicker.js'; +export * from './Drawer.js'; +export * from './Dropdown.js'; +export * from "./Fab.js"; +export * from './Fieldset.js'; +export * from './Fileinput.js'; +export * from './Indicator.js'; +export * from './Input.js'; +export * from './List.js'; +export * from './Loading.js'; +export * from './Menu.js'; +export * from './Modal.js'; +export * from './Navbar.js'; +export * from './Radio.js'; +export * from './Range.js'; +export * from './Rating.js'; +export * from './Select.js'; +export * from './Stack.js'; +export * from './Stat.js'; +export * from './Swap.js'; +export * from './Table.js'; +export * from './Tabs.js'; +export * from './Timeline.js'; +export * from './Toast.js'; +export * from './Tooltip.js'; + +const Components = { + ...AccordionModule, + ...AlertModule, + ...AutocompleteModule, + ...BadgeModule, + ...ButtonModule, + ...CheckboxModule, + ...ColorpickerModule, + ...DatepickerModule, + ...DrawerModule, + ...DropdownModule, + ...FabModule, + ...FieldsetModule, + ...FileinputModule, + ...IndicatorModule, + ...InputModule, + ...ListModule, + ...LoadingModule, + ...MenuModule, + ...ModalModule, + ...NavbarModule, + ...RadioModule, + ...RangeModule, + ...RatingModule, + ...SelectModule, + ...StackModule, + ...StatModule, + ...SwapModule, + ...TableModule, + ...TabsModule, + ...TimelineModule, + ...ToastModule, + ...TooltipModule +}; + +export default { + ...Components, + install: (target = window) => { + Object.entries(Components).forEach(([name, component]) => { + target[name] = component; + }); + console.log("🚀 SigproUI"); + } +};