# SigPro Demo – Comprehensive Examples --- ## Accordion
```js const accItems = $([ { title: "What is SigPro?", content: "A lightweight UI library built on DaisyUI and a fine‑grained reactivity system.", open: true, }, { title: "Why use it?", content: "No build step, minimal boilerplate, and all components are just JavaScript functions.", }, { title: "Browser support?", content: "All modern browsers that support ES2020+", }, ]); mount( div({ class: "flex flex-col gap-8" }, [ Accordion({ items: accItems, class: "collapse-arrow bg-base-100 border border-base-300", }), ]), "#demo-accordion", ); ``` --- ## Alert ```js mount( Alert({ class: "alert-info" }, [ span({ class: "icon-[lucide--info] text-lg" }), span({}, "You have 2 new messages"), ]), "#demo-alert", ); ``` --- ## Autocomplete ```js const selectedFruit = $(""); const fruitItems = [ { label: "Apple", value: "apple" }, { label: "Banana", value: "banana" }, { label: "Orange", value: "orange" }, { label: "Mango", value: "mango" }, { label: "Carrot", value: "carrot" }, { label: "Broccoli", value: "broccoli" }, { label: "Spinach", value: "spinach" }, { label: "Potato", value: "potato" }, ]; const selectedColor = $(""); const colorItems = [ "Red", "Blue", "Green", "Yellow", "Black", "White", "Purple", "Cyan", ]; mount( h("div", { class: "p-8 flex flex-col gap-10" }, [ h("div", {}, [ h("h3", { class: "font-bold mb-2" }, "Objetos:"), Autocomplete({ items: fruitItems, value: selectedFruit, placeholder: "Search fruit...", onselect: (v) => console.log("Obj:", v), }), h("span", { class: "text-xs" }, () => `Signal: ${selectedFruit()}`), ]), h("div", {}, [ h("h3", { class: "font-bold mb-2" }, "Array Plano:"), Autocomplete({ items: colorItems, value: selectedColor, placeholder: "Search color...", onselect: (v) => console.log("Str:", v), }), h("span", { class: "text-xs" }, () => `Signal: ${selectedColor()}`), ]), ]), "#demo-autocomplete", ); ``` --- ## Avatar & AvatarGroup ```js mount( div({ class: "flex flex-col gap-4" }, [ Avatar( { class: "w-24 rounded-full" }, img({ src: "https://img.daisyui.com/images/profile/demo/kenobee@192.webp", }), ), AvatarGroup({}, [ Avatar( { class: "w-12" }, img({ src: "https://img.daisyui.com/images/profile/demo/kenobee@192.webp", }), ), Avatar( { class: "w-12" }, img({ src: "https://img.daisyui.com/images/profile/demo/anakeen@192.webp", }), ), Avatar( { class: "w-12" }, img({ src: "https://img.daisyui.com/images/profile/demo/kenobee@192.webp", }), ), ]), ]), "#demo-avatar", ); ``` --- ## Badge ```js mount( div({ class: "flex gap-2" }, [ Badge({}, "New"), Badge({ class: "badge-outline" }, "Sale"), Badge({ class: "badge-error" }, "Deleted"), ]), "#demo-badge", ); ``` --- ## Breadcrumbs ```js mount( Breadcrumbs({}, [ ul({}, [ li({}, a({ href: "#" }, "Home")), li({}, a({ href: "#" }, "Docs")), li({}, span({ class: "font-bold" }, "Components")), ]), ]), "#demo-breadcrumbs", ); ``` --- ## Button ```js const count = $(0); mount( div({ class: "flex gap-2 items-center" }, [ Button( { class: "btn-primary", onclick: () => count(count() + 1), }, () => `Clicked ${count()} times`, ), Button({ class: "btn-outline", disabled: true }, "Disabled"), ]), "#demo-button", ); ``` --- ## Calendar ```js const calendarRange = $({ start: "2026-04-01", end: "2026-04-15", startHour: 9, endHour: 18, }); mount( Calendar({ value: calendarRange, range: true, hour: true, onChange: (val) => console.log("Range:", val), }), "#demo-calendar", ); ``` --- ## Card, CardTitle, CardBody & CardActions ```js mount( Card({ class: "w-80 bg-base-100 shadow-xl" }, [ CardBody({}, [ CardTitle({}, "Card Title"), p({}, "This is a card with title, body and actions."), CardActions({ class: "justify-end" }, [ Button({ class: "btn-primary btn-sm" }, "Buy"), ]), ]), ]), "#demo-card", ); ``` --- ## Carousel & CarouselItem ```js mount( Carousel({ class: "carousel-vertical rounded-box h-96" }, [ CarouselItem( { class: "h-full" }, img({ src: "https://img.daisyui.com/images/stock/photo-1559703248-dcaaec9fab78.webp", }), ), CarouselItem( { class: "h-full" }, img({ src: "https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp", }), ), CarouselItem( { class: "h-full" }, img({ src: "https://img.daisyui.com/images/stock/photo-1572635148818-ef6fd45eb394.webp", }), ), ]), "#demo-carousel", ); ``` --- ## Chat, ChatImage, ChatHeader, ChatBubble & ChatFooter ```js mount( div({ class: "flex flex-col gap-4" }, [ // Left side Chat({ class: "chat-start" }, [ ChatImage( {}, img({ src: "https://img.daisyui.com/images/profile/demo/kenobee@192.webp", alt: "Obi-Wan", }), ), ChatHeader({}, [ "Obi-Wan Kenobi", time({ class: "text-xs opacity-50" }, "12:45"), ]), ChatBubble({}, "You were the Chosen One!"), ChatFooter({ class: "opacity-50" }, "Delivered"), ]), // Right side Chat({ class: "chat-end" }, [ ChatImage( {}, img({ src: "https://img.daisyui.com/images/profile/demo/anakeen@192.webp", alt: "Anakin", }), ), ChatHeader({}, [ "Anakin", time({ class: "text-xs opacity-50" }, "12:46"), ]), ChatBubble({}, "I hate you!"), ChatFooter({ class: "opacity-50" }, "Seen at 12:46"), ]), ]), "#demo-chat", ); ``` --- ## Checkbox ```js const checked = $(false); mount( div({ class: "flex items-center gap-2" }, [ Checkbox({ checked, onchange: (e) => checked(e.target.checked), }), span({}, () => `Accept terms (${checked() ? "Yes" : "No"})`), ]), "#demo-checkbox", ); ``` --- ## Colorpicker & ColorPalette ```js const color = $("#000000"); mount( div({ class: "flex flex-col gap-4" }, [ Colorpicker({ value: color, label: "Pick a color", onchange: (c) => console.log("Color:", c), }), p({}, () => `Selected: ${color()}`), ColorPalette({ value: color, onchange: (c) => color(c), }), ]), "#demo-colorpicker", ); ``` --- ## Datepicker ```js const dateRange = $(""); mount( Datepicker({ value: dateRange, range: true, hour: true, placeholder: "Select a date range", onChange: (val) => console.log("Date:", val), }), "#demo-datepicker", ); ``` --- ## Divider ```js mount( div({ class: "flex flex-col gap-2" }, [ p( { class: "card bg-base-300 rounded-box grid h-20 place-items-center" }, "Above", ), Divider({}, "OR"), p( { class: "card bg-base-300 rounded-box grid h-20 place-items-center" }, "Below", ), ]), "#demo-divider", ); ``` --- ## Drawer ```js const leftOpen = $(false); const rightOpen = $(false); mount( Drawer({ open: leftOpen }, [ DrawerToggle({ id: "left-drawer", checked: leftOpen }), DrawerContent({}, [ Drawer({ open: rightOpen, class: "drawer-end" }, [ DrawerToggle({ id: "right-drawer", checked: rightOpen }), DrawerContent({}, [ div({ class: "p-4" }, [ h3({ class: "text-lg font-bold" }, "Central Panel"), label({ for: "left-drawer", class: "btn" }, "Open Left"), label({ for: "right-drawer", class: "btn ml-2" }, "Open Right"), p({}, "Main Content..."), ]), ]), DrawerSide({}, [ DrawerOverlay({ for: "right-drawer" }), div( { class: "min-h-full bg-base-200 w-60 p-4" }, h4({ class: "font-semibold" }, "Right Menu"), ), ]), ]), ]), DrawerSide({}, [ DrawerOverlay({ for: "left-drawer" }), div( { class: "min-h-full bg-base-200 w-60 p-4" }, h4({ class: "font-semibold" }, "Left Menu"), ), ]), ]), "#demo-drawer", ); ``` --- ## Dropdown, DropdownButton & DropdownContent ```js mount( div({ class: "flex gap-4" }, [ Dropdown({}, [ DropdownButton({}, "Options"), DropdownContent( { class: "menu bg-base-100 rounded-box w-52 p-2 shadow" }, [ Menu({ items: [ { label: "Edit", onclick: () => hide() }, { label: "Delete", onclick: () => hide() }, { label: "Archive" }, ], }), ], ), ]), Dropdown({ class: "dropdown-bottom dropdown-end" }, [ DropdownButton({}, "More"), DropdownContent( { class: "menu bg-base-100 rounded-box w-40 p-2 shadow" }, ul({}, [ li( {}, a( { href: "#", onclick: (e) => { e.preventDefault(); hide(); }, }, "Profile", ), ), li( {}, a( { href: "#", onclick: (e) => { e.preventDefault(); hide(); }, }, "Logout", ), ), ]), ), ]), ]), "#demo-dropdown", ); ``` --- ## Editor (Rich Text) ```js const htmlContent = $("Hello world!
"); mount( Editor({ value: htmlContent, onchange: (html) => console.log("Content updated"), class: "max-w-2xl", }), "#demo-editor", ); ``` --- ## Fab ```js mount( div({ class: "flex gap-4" }, [ Fab({ class: "btn-lg btn-circle btn-secondary", icon: "R" }, [ Button({}, "C"), Button({}, "B"), Button({}, "A"), ]), ]), "#demo-fab", ); ``` --- ## Fieldset ```js mount( div({ class: "flex gap-4 bg" }, [ Fieldset( { label: "Personal Info", class: "bg-base-200 border-base-300 rounded-box w-xs border gap-3 p-4", }, [ Input({ label: "Name", float: true, value: $("") }), Select({ label: "Country", float: true, items: ["Spain", "France", "Italy"], value: $(""), }), ], ), Fieldset({ class: "bg-base-200 p-4 rounded-box", label: "Any content" }, [ div({}, "Any content"), ]), ]), "#demo-fieldset", ); ``` --- ## Fileinput ```js const files = $([]); mount( Fileinput({ max: 5, accept: "image/*,.pdf", onselect: (selectedFiles) => console.log("Files:", selectedFiles), value: files, }), "#demo-fileinput", ); ``` --- ## Icon ```js mount( div({ class: "flex gap-4 text-xl" }, [ Icon({},"icon-[lucide--home]"), Icon({},"icon-[lucide--settings]"), "❤️", // emoji fallback ]), "#demo-icon", ); ``` --- ## Indicator ```js mount( Indicator({ value: "3" }, [ Button({ class: "btn-circle" }, Icon({},"icon-[lucide--bell]")), ]), "#demo-indicator", ); ``` --- ## Input ```js const username = $(""); const password = $(""); mount( div({ class: "flex flex-col gap-4 w-80" }, [ Input({ label: "Username", float: true, value: username, left: Icon({},"icon-[lucide--user]"), }), Input({ type: "password", label: "Password", float: true, value: password, left: Icon({},"icon-[lucide--lock]"), }), ]), "#demo-input", ); ``` --- ## Kbd ```js mount( p({}, ["Press ", Kbd({}, "Ctrl"), " + ", Kbd({}, "S"), " to save"]), "#demo-kbd", ); ``` --- ## List & ListRows ```js const people = $([ { name: "Alice", online: true }, { name: "Bob", online: false }, ]); mount( [ List({ class: "bg-base-100 rounded-box shadow-md" }, [ each(people, (p) => li({ class: "list-row" }, [ Badge({ class: p.online ? "badge-success" : "badge-ghost" }), p.name, ]), ), ]), Divider({}, "OR"), // _(Alternatively, using `ListRows`:)_ List({ class: "bg-base-100 rounded-box shadow-md" }, [ ListRows({ items: people, render: (p) => [ Badge({ class: p.online ? "badge-success" : "badge-ghost" }), p.name, ], }), ]), ], "#demo-list", ); ``` --- ## Loading ```js mount(Loading({ class: "loading-lg text-primary" }), "#demo-loading"); ``` --- ## Menu ```js const menuItems = $([ { label: "Dashboard", href: "#" }, { label: "Settings", children: [{ label: "Profile" }, { label: "Account" }] }, { label: "Logout", onclick: () => alert("Logout") }, ]); mount( Menu({ items: menuItems, class: "w-56 bg-base-200 rounded-box" }), "#demo-menu", ); ``` --- ## Modal ```js const modalOpen = $(false); mount( div({}, [ Button({ class: "btn", onclick: () => modalOpen(true) }, "Open modal"), Modal( { open: modalOpen, title: "Congratulations!", backdrop: true, actions: [ form( { method: "dialog" }, Button({ class: "btn", onclick: () => modalOpen(false) }, "Close"), ), ], }, [ p( {}, "You have successfully created a reactive DaisyUI modal with SigPro.", ), ], ), ]), "#demo-modal", ); ``` --- ## Navbar ```js mount( Navbar({ class: "bg-base-300 rounded-box" }, [ div({ class: "flex-1" }, a({ class: "btn btn-ghost text-xl" }, "SigPro")), div( { class: "flex-none" }, Button({ class: "btn-square btn-ghost" }, Icon({},"icon-[lucide--menu]")), ), ]), "#demo-navbar", ); ``` --- ## Progress ```js const progressVal = $(35); mount( div({ class: "flex flex-col gap-2" }, [ span({}, () => `${progressVal()}%`), Progress({ value: progressVal, max: 100, class: "w-56", }), ]), "#demo-progress", ); ``` --- ## Radial Progress ```js const radialVal = $(70); mount( Radial({ value: radialVal, class: "text-primary" }, () => `${radialVal()}%`), "#demo-radial", ); ``` --- ## Radio ```js const option = $("a"); mount( div({ class: "flex gap-4" }, [ label({ class: "flex items-center gap-2" }, [ Radio({ name: "demo-radio", value: "a", checked: () => option() === "a", onchange: () => option("a"), }), "Option A", ]), label({ class: "flex items-center gap-2" }, [ Radio({ name: "demo-radio", value: "b", checked: () => option() === "b", onchange: () => option("b"), }), "Option B", ]), ]), "#demo-radio", ); ``` --- ## Range ```js const rangeValue = $(25); mount( div({ class: "flex flex-col gap-2 w-60" }, [ Range({ min: 0, max: 100, value: rangeValue, class: "range-sm" }), span({}, () => `Value: ${rangeValue()}`), ]), "#demo-range", ); ``` --- ## Rating & RatingItems ```js const stars = $(3); mount( Rating({}, [ RatingItems({ count: 5, value: stars, name: "demo-rating", class: "mask-star-2", }), ]), "#demo-rating", ); ``` --- ## Select ```js const choice = $("css"); mount( Select({ items: ["HTML", "CSS", "JavaScript"], placeholder: "Pick a language", value: choice, float: true, label: "Tech", }), "#demo-select", ); ``` --- ## Skeleton & SkeletonText ```js mount( div({ class: "flex flex-col gap-4 w-52" }, [ Skeleton({ class: "h-32" }), SkeletonText({ class: "h-4" }), SkeletonText({ class: "h-4 w-3/4" }), ]), "#demo-skeleton", ); ``` --- ## Stack ```js mount( Stack({ class: "w-48" }, [ img({ src: "https://img.daisyui.com/images/stock/photo-1572635148818-ef6fd45eb394.webp", class: "rounded-box", }), img({ src: "https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp", class: "rounded-box", }), img({ src: "https://img.daisyui.com/images/stock/photo-1559703248-dcaaec9fab78.webp", class: "rounded-box", }), ]), "#demo-stack", ); ``` --- ## Stats & Stat ```js mount( Stats({ class: "w-full" }, [ Stat({ title: "Downloads", value: "1,200", desc: "↑ 21% from last month" }), Stat({ title: "New Users", value: "450", desc: "↑ 14% from last month" }), Stat({ title: "Revenue", value: "$89k", desc: "↓ 1% from last month" }), ]), "#demo-stats", ); ``` --- ## Steps & Step ```js mount( Steps({ class: "steps-horizontal w-full" }, [ Step({ dataContent: "1", class: "step-primary" }, "Register"), Step({ dataContent: "2", class: "step-primary" }, "Choose plan"), Step({ dataContent: "3" }, "Purchase"), Step({ dataContent: "4" }, "Enjoy"), ]), "#demo-steps", ); ``` --- ## Swap (Toggle) ```js const isDark = $(false); mount( Swap({ class: "text-2xl" }, [ SwapToggle({ value: isDark, class: "swap-rotate" }), SwapOn({}, span({ class: "icon-[lucide--moon]" })), SwapOff({}, span({ class: "icon-[lucide--sun]" })), ]), "#demo-swap", ); ``` --- ## Table & TableItems ```js const tableData = $([ { id: 1, name: "Alice", role: "Admin" }, { id: 2, name: "Bob", role: "User" }, { id: 3, name: "Charlie", role: "User" }, ]); const columns = [ { key: "name", label: "Name", class: "font-bold" }, { key: "role", label: "Role" }, { label: "Action", render: (item) => Button( { class: "btn-xs", onclick: () => alert(`Edit ${item.name}`) }, "Edit", ), }, ]; mount( Table({ class: "w-full" }, TableItems({ items: tableData, columns })), "#demo-table", ); ``` --- ## Tabs ```js const activeTab = $(0); const tabsData = $([ { label: "Tab A", content: "Content of tab A" }, { label: "Tab B", content: "Content of tab B", closable: true }, { label: "Tab C", content: "Content of tab C" }, ]); mount( Tabs({ class: "tabs-box", items: tabsData, activeIndex: activeTab }), "#demo-tabs", ); ``` --- ## Textarea ```js const bio = $(""); mount( Textarea({ class: "w-80", placeholder: "Write something...", value: bio }), "#demo-textarea", ); ``` --- ## Textrotate ```js mount( Textrotate({ class: "text-2xl font-bold" }, [ span({}, "Hello"), span({}, "Bonjour"), span({}, "Hola"), ]), "#demo-textrotate", ); ``` --- ## Timeline ```js mount( Timeline({ vertical: true }, [ li({}, [ div({ class: "timeline-start" }, "2024"), div( { class: "timeline-middle" }, span({ class: "icon-[lucide--check]" }), ), div({ class: "timeline-end timeline-box" }, "Project started"), ]), li({}, [ div({ class: "timeline-start" }, "2025"), div( { class: "timeline-middle" }, span({ class: "icon-[lucide--clock]" }), ), div({ class: "timeline-end timeline-box" }, "First prototype"), ]), ]), "#demo-timeline", ); ``` --- ## Toast ```js mount( div({ class: "flex flex-wrap gap-2" }, [ Button({ class: "btn", onclick: () => Toast("File saved!") }, "Simple"), Button( { class: "btn", onclick: () => Toast("Error!", "alert-error", 5000) }, "Error (5s)", ), Button( { class: "btn", onclick: () => Toast( div({ class: "flex items-center gap-2" }, [ span({ class: "icon-[lucide--check] text-lg" }), span({}, "Report generated"), ]), "alert-success", ), }, "With icon", ), Button( { class: "btn", onclick: () => Toast( div({ class: "flex flex-col" }, [ strong({}, "ATTENTION!"), span({}, "Error saving!"), button( { class: "btn btn-xs mt-1", onclick: () => console.log("Retry"), }, "Retry", ), ]), "alert-warning", 7000, ), }, "Complex", ), ]), "#demo-toast", ); ``` --- ## Toggle ```js const toggleActive = $(false); mount( Toggle({ checked: toggleActive, onchange: (e) => toggleActive(e.target.checked), class: "toggle-primary", }), "#demo-toggle", ); ``` --- ## Tooltip ```js mount( Tooltip( { tip: "Save changes", class: "tooltip-right tooltip-primary" }, Button({ class: "btn" }, "Save"), ), "#demo-tooltip", ); ```