@sigx/daisyui 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/Avatar.d.ts +15 -0
- package/dist/data/Avatar.d.ts.map +1 -0
- package/dist/data/Stats.d.ts +48 -0
- package/dist/data/Stats.d.ts.map +1 -0
- package/dist/data/Table.d.ts +63 -77
- package/dist/data/Table.d.ts.map +1 -1
- package/dist/data/index.d.ts +6 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +2 -2
- package/dist/{data-wxNpnX83.js → data-Cn32We_0.js} +45 -44
- package/dist/data-Cn32We_0.js.map +1 -0
- package/dist/feedback/Accordion.d.ts +2 -2
- package/dist/feedback/Modal.d.ts +1 -1
- package/dist/feedback/Steps.d.ts +1 -1
- package/dist/feedback/Timeline.d.ts +1 -0
- package/dist/feedback/Timeline.d.ts.map +1 -1
- package/dist/forms/Checkbox.d.ts +1 -1
- package/dist/forms/Checkbox.d.ts.map +1 -1
- package/dist/forms/Input.d.ts +1 -1
- package/dist/forms/Input.d.ts.map +1 -1
- package/dist/forms/Radio.d.ts +2 -2
- package/dist/forms/Range.d.ts +1 -1
- package/dist/forms/Range.d.ts.map +1 -1
- package/dist/forms/Select.d.ts +1 -1
- package/dist/forms/Select.d.ts.map +1 -1
- package/dist/forms/Textarea.d.ts +1 -1
- package/dist/forms/Textarea.d.ts.map +1 -1
- package/dist/forms/Toggle.d.ts +1 -1
- package/dist/forms/Toggle.d.ts.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/{forms-CuvlRMro.js → forms-DzJd0M2D.js} +62 -79
- package/dist/forms-DzJd0M2D.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -5
- package/dist/index.js.map +1 -0
- package/dist/layout/Card.d.ts +1 -0
- package/dist/layout/Card.d.ts.map +1 -1
- package/dist/layout/Carousel.d.ts +1 -0
- package/dist/layout/Carousel.d.ts.map +1 -1
- package/dist/layout/Chat.d.ts +1 -0
- package/dist/layout/Chat.d.ts.map +1 -1
- package/dist/layout/Hero.d.ts +1 -0
- package/dist/layout/Hero.d.ts.map +1 -1
- package/dist/layout/Join.d.ts +1 -0
- package/dist/layout/Join.d.ts.map +1 -1
- package/dist/navigation/MenuComponent.d.ts +1 -1
- package/dist/navigation/MenuComponent.d.ts.map +1 -1
- package/dist/navigation/index.js +1 -1
- package/dist/{navigation-4cwyfLvr.js → navigation-BdJ6csEU.js} +2 -7
- package/dist/navigation-BdJ6csEU.js.map +1 -0
- package/dist/shared/Icon.d.ts +17 -0
- package/dist/shared/Icon.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.d.ts +19 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/{theme-D9CUMvuT.js → theme-DMFZ4kf5.js} +3 -2
- package/dist/theme-DMFZ4kf5.js.map +1 -0
- package/package.json +6 -6
- package/dist/data-wxNpnX83.js.map +0 -1
- package/dist/forms-CuvlRMro.js.map +0 -1
- package/dist/navigation-4cwyfLvr.js.map +0 -1
- package/dist/theme-D9CUMvuT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-BdJ6csEU.js","names":[],"sources":["../src/navigation/Tabs.tsx","../src/navigation/MenuComponent.tsx","../src/navigation/Dropdown.tsx","../src/navigation/Drawer.tsx","../src/navigation/Breadcrumbs.tsx","../src/navigation/Navbar.tsx","../src/navigation/Pagination.tsx"],"sourcesContent":["import { component, DefineProp, DefineEvent, JSXElement } from 'sigx';\r\n\r\nexport interface Tab {\r\n id: string;\r\n label: string | JSXElement;\r\n content?: string | JSXElement;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type TabsVariant = 'border' | 'lift' | 'box';\r\nexport type TabsSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\nexport type TabsPosition = 'top' | 'bottom';\r\n\r\nexport type TabsProps = \r\n & DefineProp<'tabs', Tab[]>\r\n & DefineProp<'activeTab', string>\r\n & DefineProp<'variant', TabsVariant, false>\r\n & DefineProp<'size', TabsSize, false>\r\n & DefineProp<'position', TabsPosition, false>\r\n & DefineProp<'name', string, false>\r\n & DefineProp<'contentClass', string, false>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'change', string>;\r\n\r\nconst tabsSizeClasses: Record<TabsSize, string> = {\r\n xs: 'tabs-xs',\r\n sm: 'tabs-sm',\r\n md: '',\r\n lg: 'tabs-lg',\r\n xl: 'tabs-xl'\r\n};\r\n\r\nlet tabsCounter = 0;\r\n\r\n/**\r\n * Tabs component with DaisyUI styling.\r\n * Uses radio inputs for native tab switching with content panels.\r\n * \r\n * @example Basic tabs without content\r\n * ```tsx\r\n * const tabs = [\r\n * { id: 'tab1', label: 'Tab 1' },\r\n * { id: 'tab2', label: 'Tab 2' }\r\n * ];\r\n * <Tabs tabs={tabs} activeTab={activeTab.value} onChange={(id) => activeTab.value = id} />\r\n * ```\r\n * \r\n * @example Tabs with content\r\n * ```tsx\r\n * const tabs = [\r\n * { id: 'tab1', label: 'Tab 1', content: 'Content for tab 1' },\r\n * { id: 'tab2', label: 'Tab 2', content: <div>Rich content for tab 2</div> }\r\n * ];\r\n * <Tabs tabs={tabs} activeTab={activeTab.value} onChange={(id) => activeTab.value = id} variant=\"lift\" />\r\n * ```\r\n */\r\nexport const Tabs = component<TabsProps>(({ props, emit }) => {\r\n // Generate stable name once per component instance\r\n const instanceId = ++tabsCounter;\r\n const getTabGroupName = () => props.name || `sigx_tabs_${instanceId}`;\r\n \r\n const hasContent = () => props.tabs?.some(tab => tab.content != null);\r\n \r\n const getContainerClasses = () => {\r\n const classes = ['tabs'];\r\n \r\n // DaisyUI v5 uses tabs-border, tabs-lift, tabs-box\r\n if (props.variant === 'border') classes.push('tabs-border');\r\n if (props.variant === 'lift') classes.push('tabs-lift');\r\n if (props.variant === 'box') classes.push('tabs-box');\r\n \r\n // Position\r\n if (props.position === 'bottom') classes.push('tabs-bottom');\r\n \r\n if (props.size) {\r\n const sizeClass = tabsSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n \r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n \r\n const getContentClasses = () => {\r\n const classes = ['tab-content', 'bg-base-100', 'border-base-300', 'p-6'];\r\n if (props.contentClass) classes.push(props.contentClass);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => {\r\n const showContent = hasContent();\r\n \r\n // If tabs have content, use radio input pattern (DaisyUI's native tab content switching)\r\n if (showContent) {\r\n return (\r\n <div role=\"tablist\" class={getContainerClasses()}>\r\n {props.tabs?.map(tab => [\r\n <input\r\n type=\"radio\"\r\n name={getTabGroupName()}\r\n class={`tab ${tab.disabled ? 'tab-disabled' : ''}`}\r\n aria-label={typeof tab.label === 'string' ? tab.label : tab.id}\r\n checked={props.activeTab === tab.id}\r\n disabled={tab.disabled}\r\n onChange={() => !tab.disabled && emit('change', tab.id)}\r\n />,\r\n <div class={getContentClasses()}>\r\n {tab.content}\r\n </div>\r\n ])}\r\n </div>\r\n );\r\n }\r\n \r\n // Without content, use simple button/link tabs\r\n return (\r\n <div role=\"tablist\" class={getContainerClasses()}>\r\n {props.tabs?.map(tab => (\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class={`tab ${props.activeTab === tab.id ? 'tab-active' : ''} ${tab.disabled ? 'tab-disabled' : ''}`}\r\n disabled={tab.disabled}\r\n onClick={() => !tab.disabled && emit('change', tab.id)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n };\r\n});\r\n","import { component, compound, DefineProp, DefineSlot, DefineEvent, DefineModel } from 'sigx';\r\n\r\nexport type MenuSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\nconst menuSizeClasses: Record<MenuSize, string> = {\r\n xs: 'menu-xs',\r\n sm: 'menu-sm',\r\n md: '',\r\n lg: 'menu-lg'\r\n};\r\n\r\nexport type MenuProps = \r\n & DefineModel<string>\r\n & DefineProp<'size', MenuSize, false>\r\n & DefineProp<'horizontal', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>\r\n & DefineEvent<'update:modelValue', string>;\r\n\r\nexport type MenuItemProps =\r\n & DefineProp<'value', string, false>\r\n & DefineProp<'active', boolean, false>\r\n & DefineProp<'disabled', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\nexport type MenuTitleProps =\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Menu item sub-component for use inside Menu.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu.Item value=\"home\"><a>Home</a></Menu.Item>\r\n * <Menu.Item disabled><a>Disabled</a></Menu.Item>\r\n * ```\r\n */\r\nconst MenuItem = component<MenuItemProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes: string[] = [];\r\n if (props.disabled) classes.push('disabled');\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ') || undefined;\r\n };\r\n\r\n const getAnchorClasses = () => {\r\n const classes: string[] = [];\r\n if (props.active) classes.push('active');\r\n return classes.join(' ') || undefined;\r\n };\r\n\r\n return () => (\r\n <li class={getClasses()} data-value={props.value}>\r\n {slots.default?.()}\r\n </li>\r\n );\r\n});\r\n\r\n/**\r\n * Menu title/header sub-component for grouping menu items.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu.Title>Category</Menu.Title>\r\n * ```\r\n */\r\nconst MenuTitle = component<MenuTitleProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['menu-title'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <li class={getClasses()}>\r\n {slots.default?.()}\r\n </li>\r\n );\r\n});\r\n\r\n\r\n\r\n/**\r\n * Menu component with DaisyUI styling. Supports compound sub-components.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu model={() => activeItem} size=\"lg\" class=\"bg-base-200 rounded-box w-56\">\r\n * <Menu.Title>Navigation</Menu.Title>\r\n * <Menu.Item value=\"home\"><a>Home</a></Menu.Item>\r\n * <Menu.Item value=\"about\"><a>About</a></Menu.Item>\r\n * <Menu.Item disabled><a>Disabled</a></Menu.Item>\r\n * </Menu>\r\n * ```\r\n */\r\nconst _Menu = component<MenuProps>(({ props, slots, emit }) => {\r\n const getClasses = () => {\r\n const classes = ['menu'];\r\n \r\n if (props.size) {\r\n const sizeClass = menuSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n \r\n if (props.horizontal) classes.push('menu-horizontal');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n const handleClick = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n const li = target.closest('li[data-value]');\r\n if (li) {\r\n const value = li.getAttribute('data-value');\r\n if (value && !li.classList.contains('disabled')) {\r\n emit('update:modelValue', value);\r\n }\r\n }\r\n };\r\n\r\n return () => (\r\n <ul class={getClasses()} onClick={handleClick}>\r\n {slots.default?.()}\r\n </ul>\r\n );\r\n});\r\n\r\n/**\r\n * Menu compound component with Item and Title sub-components.\r\n */\r\nexport const Menu = compound(_Menu, {\r\n Item: MenuItem,\r\n Title: MenuTitle,\r\n});\r\n","import { component, DefineProp, DefineSlot } from 'sigx';\r\n\r\nexport type DropdownPosition = 'end' | 'top' | 'bottom' | 'left' | 'right';\r\n\r\nexport type DropdownProps = \r\n & DefineProp<'position', DropdownPosition, false>\r\n & DefineProp<'hover', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineProp<'menuClass', string, false>\r\n & DefineSlot<'trigger'>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Dropdown component with DaisyUI styling.\r\n * Uses slots for maximum flexibility - any component can be the trigger.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Dropdown\r\n * slots={{\r\n * trigger: () => <Button>Open Menu</Button>\r\n * }}\r\n * >\r\n * <a>Item 1</a>\r\n * <a>Item 2</a>\r\n * </Dropdown>\r\n * ```\r\n * \r\n * @example With Menu component\r\n * ```tsx\r\n * <Dropdown\r\n * position=\"end\"\r\n * slots={{\r\n * trigger: () => <Button variant=\"primary\">Actions</Button>\r\n * }}\r\n * >\r\n * <Menu class=\"w-52\">\r\n * <Menu.Item><a>Edit</a></Menu.Item>\r\n * <Menu.Item><a>Delete</a></Menu.Item>\r\n * </Menu>\r\n * </Dropdown>\r\n * ```\r\n */\r\nexport const Dropdown = component<DropdownProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['dropdown'];\r\n \r\n if (props.position === 'end') classes.push('dropdown-end');\r\n if (props.position === 'top') classes.push('dropdown-top');\r\n if (props.position === 'left') classes.push('dropdown-left');\r\n if (props.position === 'right') classes.push('dropdown-right');\r\n if (props.hover) classes.push('dropdown-hover');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n const getMenuClasses = () => {\r\n const classes = ['dropdown-content', 'z-[1]', 'menu', 'p-2', 'shadow', 'bg-base-100', 'rounded-box'];\r\n if (props.menuClass) classes.push(props.menuClass);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.trigger && (\r\n <div tabIndex={0} role=\"button\">\r\n {slots.trigger()}\r\n </div>\r\n )}\r\n <ul tabIndex={0} class={getMenuClasses()}>\r\n {slots.default?.()}\r\n </ul>\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineModel, DefineSlot } from 'sigx';\r\n\r\nexport type DrawerProps = \r\n & DefineModel<boolean>\r\n & DefineProp<'side', 'left' | 'right', false>\r\n & DefineProp<'responsive', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>\r\n & DefineSlot<'side'>;\r\n\r\n/**\r\n * Drawer component with DaisyUI styling.\r\n * Slide-out side panel for navigation, filters, and mobile menus.\r\n * \r\n * @example\r\n * ```tsx\r\n * const open = signal(false);\r\n * <Drawer \r\n * model={open} \r\n * slots={{\r\n * side: () => <Menu items={navItems} />\r\n * }}\r\n * >\r\n * <main>Main content</main>\r\n * </Drawer>\r\n * ```\r\n */\r\nexport const Drawer = component<DrawerProps>(({ props, slots, emit }) => {\r\n const drawerId = `drawer-${Math.random().toString(36).slice(2)}`;\r\n\r\n const handleCheckboxChange = (e: Event) => {\r\n const checked = (e.target as HTMLInputElement).checked;\r\n if (props.model) props.model.value = checked;\r\n };\r\n\r\n return () => {\r\n const classes = ['drawer'];\r\n if (props.side === 'right') classes.push('drawer-end');\r\n if (props.responsive) classes.push('lg:drawer-open');\r\n if (props.class) classes.push(props.class);\r\n\r\n // Determine drawer side classes - add z-index for proper layering\r\n const drawerSideClasses = ['drawer-side', 'z-[999]'];\r\n // If not responsive, we need the drawer-side to respect the toggle\r\n // The DaisyUI CSS handles visibility via :checked ~ .drawer-side\r\n\r\n return (\r\n <div class={classes.join(' ')}>\r\n <input \r\n id={drawerId} \r\n type=\"checkbox\" \r\n class=\"drawer-toggle\" \r\n checked={props.model?.value ?? false}\r\n onChange={handleCheckboxChange}\r\n />\r\n <div class=\"drawer-content\">\r\n {slots.default?.()}\r\n </div>\r\n <div class={drawerSideClasses.join(' ')}>\r\n <label \r\n htmlFor={drawerId} \r\n aria-label=\"close sidebar\" \r\n class=\"drawer-overlay\"\r\n ></label>\r\n {slots.side?.()}\r\n </div>\r\n </div>\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineEvent } from 'sigx';\r\n\r\nexport interface BreadcrumbItem {\r\n id: string;\r\n label: string;\r\n href?: string;\r\n}\r\n\r\nexport type BreadcrumbsProps = \r\n & DefineProp<'items', BreadcrumbItem[]>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'navigate', string>;\r\n\r\n/**\r\n * Breadcrumbs component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * const items = [\r\n * { id: 'home', label: 'Home', href: '/' },\r\n * { id: 'docs', label: 'Docs', href: '/docs' },\r\n * { id: 'current', label: 'Current Page' }\r\n * ];\r\n * <Breadcrumbs items={items} onNavigate={(id) => navigate(id)} />\r\n * ```\r\n */\r\nexport const Breadcrumbs = component<BreadcrumbsProps>(({ props, emit }) => {\r\n const getClasses = () => {\r\n const classes = ['breadcrumbs', 'text-sm'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n <ul>\r\n {props.items?.map(item => (\r\n <li>\r\n <a onClick={() => emit('navigate', item.id)}>\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineSlot } from 'sigx';\r\n\r\nexport type NavbarProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'start'>\r\n & DefineSlot<'center'>\r\n & DefineSlot<'end'>;\r\n\r\n/**\r\n * Navbar component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Navbar\r\n * slots={{\r\n * start: () => <a class=\"btn btn-ghost text-xl\">Logo</a>,\r\n * end: () => <Button>Login</Button>\r\n * }}\r\n * />\r\n * ```\r\n */\r\nexport const Navbar = component<NavbarProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['navbar', 'bg-base-100'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.start && <div class=\"navbar-start\">{slots.start()}</div>}\r\n {slots.center && <div class=\"navbar-center\">{slots.center()}</div>}\r\n {slots.end && <div class=\"navbar-end\">{slots.end()}</div>}\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineEvent } from 'sigx';\r\n\r\nexport type PaginationProps = \r\n & DefineProp<'currentPage', number>\r\n & DefineProp<'totalPages', number>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'change', number>;\r\n\r\n/**\r\n * Pagination component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Pagination currentPage={1} totalPages={10} onChange={(page) => setPage(page)} />\r\n * ```\r\n */\r\nexport const Pagination = component<PaginationProps>(({ props, emit }) => {\r\n const getClasses = () => {\r\n const classes = ['join'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n const getPages = () => {\r\n const pages: (number | '...')[] = [];\r\n const current = props.currentPage ?? 1;\r\n const total = props.totalPages ?? 1;\r\n \r\n if (total <= 7) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n if (current <= 4) {\r\n for (let i = 1; i <= 5; i++) pages.push(i);\r\n pages.push('...');\r\n pages.push(total);\r\n } else if (current >= total - 3) {\r\n pages.push(1);\r\n pages.push('...');\r\n for (let i = total - 4; i <= total; i++) pages.push(i);\r\n } else {\r\n pages.push(1);\r\n pages.push('...');\r\n for (let i = current - 1; i <= current + 1; i++) pages.push(i);\r\n pages.push('...');\r\n pages.push(total);\r\n }\r\n }\r\n \r\n return pages;\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {getPages().map(page => \r\n page === '...' ? (\r\n <button class=\"join-item btn btn-disabled\">...</button>\r\n ) : (\r\n <button \r\n class={`join-item btn ${page === props.currentPage ? 'btn-active' : ''}`}\r\n onClick={() => emit('change', page)}\r\n >\r\n {page}\r\n </button>\r\n )\r\n )}\r\n </div>\r\n );\r\n});\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DefineProp } from 'sigx';
|
|
2
|
+
export type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
|
|
3
|
+
export type IconProps = DefineProp<'icon', string> & DefineProp<'size', IconSize, false> & DefineProp<'class', string, false>;
|
|
4
|
+
/**
|
|
5
|
+
* Generic icon component that renders an `<i>` tag with the given icon classes.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { Icon } from '@sigx/daisyui';
|
|
10
|
+
*
|
|
11
|
+
* <Icon icon="fa-solid fa-check" />
|
|
12
|
+
* <Icon icon="fa-solid fa-gear" size="lg" />
|
|
13
|
+
* <Icon icon="fa-solid fa-bolt" size="xl" class="text-yellow-400" />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare const Icon: import("@sigx/runtime-core").ComponentFactory<IconProps, void, {}>;
|
|
17
|
+
//# sourceMappingURL=Icon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.d.ts","sourceRoot":"","sources":["../../src/shared/Icon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,MAAM,CAAC;AAM7C,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAEhE,MAAM,MAAM,SAAS,GACf,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,GACnC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAWzC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,oEAMf,CAAC"}
|
|
@@ -36,6 +36,25 @@ export declare function initializeTheme(config?: ThemeConfig): void;
|
|
|
36
36
|
* Toggle between light and dark themes
|
|
37
37
|
*/
|
|
38
38
|
export declare function toggleDarkMode(lightTheme?: DaisyTheme, darkTheme?: DaisyTheme): void;
|
|
39
|
+
/**
|
|
40
|
+
* Returns an inline `<script>` string that prevents theme flicker (FOUC).
|
|
41
|
+
* Place this in your HTML `<head>` — it runs synchronously before first paint,
|
|
42
|
+
* reading the user's saved theme from localStorage and applying it immediately.
|
|
43
|
+
*
|
|
44
|
+
* @param defaultTheme - Fallback theme when nothing is stored (default: 'light')
|
|
45
|
+
* @param respectSystemPref - Whether to check prefers-color-scheme (default: true)
|
|
46
|
+
* @example
|
|
47
|
+
* ```html
|
|
48
|
+
* <!-- In index.html <head> -->
|
|
49
|
+
* <script>...getThemeInitScript()...</script>
|
|
50
|
+
* ```
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* // In SSR server, inject into <head>
|
|
54
|
+
* html = html.replace('</head>', getThemeInitScript() + '</head>');
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function getThemeInitScript(defaultTheme?: string, respectSystemPref?: boolean): string;
|
|
39
58
|
export type ThemeProviderProps = DefineProp<'theme', DaisyTheme | string, false> & DefineProp<'defaultTheme', DaisyTheme | string, false> & DefineProp<'darkMode', boolean, false> & DefineProp<'class', string, false> & DefineSlot<'default'>;
|
|
40
59
|
/**
|
|
41
60
|
* ThemeProvider component that wraps your app and manages theme state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,UAAU,EAAU,MAAM,MAAM,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,UAAU,GAEhB,OAAO,GACP,SAAS,GACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,OAAO,GACP,WAAW,GACX,WAAW,GACX,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,GACV,QAAQ,GACR,MAAM,GAEN,MAAM,GACN,WAAW,GACX,WAAW,GACX,QAAQ,GACR,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,KAAK,GACL,QAAQ,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACnC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAG/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,GAAE,UAAU,GAAG,MAAgB,GAAG,UAAU,GAAG,MAAM,CAalG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAc1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,GAAE,UAAoB,EAAE,SAAS,GAAE,UAAmB,GAAG,IAAI,CAGrG;AAMD,MAAM,MAAM,kBAAkB,GACxB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GAC/C,UAAU,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GACtD,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,GACtC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAClC,UAAU,CAAC,SAAS,CAAC,CAAC;AAE5B;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa;;
|
|
1
|
+
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,UAAU,EAAU,MAAM,MAAM,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,UAAU,GAEhB,OAAO,GACP,SAAS,GACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,OAAO,GACP,WAAW,GACX,WAAW,GACX,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,WAAW,GACX,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,GACV,QAAQ,GACR,MAAM,GAEN,MAAM,GACN,WAAW,GACX,WAAW,GACX,QAAQ,GACR,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,GACP,QAAQ,GACR,KAAK,GACL,QAAQ,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACnC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAG/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,GAAE,UAAU,GAAG,MAAgB,GAAG,UAAU,GAAG,MAAM,CAalG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAc1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,GAAE,UAAoB,EAAE,SAAS,GAAE,UAAmB,GAAG,IAAI,CAGrG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,GAAE,MAAgB,EAAE,iBAAiB,GAAE,OAAc,GAAG,MAAM,CAM5G;AAMD,MAAM,MAAM,kBAAkB,GACxB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GAC/C,UAAU,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GACtD,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,GACtC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAClC,UAAU,CAAC,SAAS,CAAC,CAAC;AAE5B;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa;;EAwBxB,CAAC;AAMH,MAAM,MAAM,kBAAkB,GACxB,UAAU,CAAC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GACpD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAWzC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,6EAqBxB,CAAC;AAMH,MAAM,MAAM,gBAAgB,GACtB,UAAU,CAAC,YAAY,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GACpD,UAAU,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,EAAE,KAAK,CAAC,GACnD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,2EAwCtB,CAAC"}
|
package/dist/theme/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as getPreferredTheme, c as toggleDarkMode, i as getCurrentTheme, n as ThemeSelector, o as initializeTheme, r as ThemeToggle, s as setTheme, t as ThemeProvider } from "../theme-
|
|
1
|
+
import { a as getPreferredTheme, c as toggleDarkMode, i as getCurrentTheme, n as ThemeSelector, o as initializeTheme, r as ThemeToggle, s as setTheme, t as ThemeProvider } from "../theme-DMFZ4kf5.js";
|
|
2
2
|
export { ThemeProvider, ThemeSelector, ThemeToggle, getCurrentTheme, getPreferredTheme, initializeTheme, setTheme, toggleDarkMode };
|
|
@@ -27,7 +27,8 @@ function toggleDarkMode(lightTheme = "light", darkTheme = "dark") {
|
|
|
27
27
|
}
|
|
28
28
|
const ThemeProvider = component(({ props, slots }) => {
|
|
29
29
|
if (typeof document !== "undefined") {
|
|
30
|
-
|
|
30
|
+
const theme = props.theme ?? getPreferredTheme(props.defaultTheme);
|
|
31
|
+
if (getCurrentTheme() !== theme) setTheme(theme);
|
|
31
32
|
if (props.darkMode && typeof window !== "undefined") window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (e) => {
|
|
32
33
|
if (!localStorage.getItem("daisy-theme")) setTheme(e.matches ? "dark" : props.defaultTheme ?? "light");
|
|
33
34
|
});
|
|
@@ -115,4 +116,4 @@ const ThemeToggle = component(({ props }) => {
|
|
|
115
116
|
});
|
|
116
117
|
export { getPreferredTheme as a, toggleDarkMode as c, getCurrentTheme as i, ThemeSelector as n, initializeTheme as o, ThemeToggle as r, setTheme as s, ThemeProvider as t };
|
|
117
118
|
|
|
118
|
-
//# sourceMappingURL=theme-
|
|
119
|
+
//# sourceMappingURL=theme-DMFZ4kf5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-DMFZ4kf5.js","names":[],"sources":["../src/theme/ThemeProvider.tsx"],"sourcesContent":["import { component, DefineProp, DefineSlot, signal } from 'sigx';\r\n\r\n/**\r\n * Built-in DaisyUI themes\r\n */\r\nexport type DaisyTheme = \r\n // Light themes\r\n | 'light'\r\n | 'cupcake'\r\n | 'bumblebee'\r\n | 'emerald'\r\n | 'corporate'\r\n | 'retro'\r\n | 'cyberpunk'\r\n | 'valentine'\r\n | 'garden'\r\n | 'lofi'\r\n | 'pastel'\r\n | 'fantasy'\r\n | 'wireframe'\r\n | 'cmyk'\r\n | 'autumn'\r\n | 'acid'\r\n | 'lemonade'\r\n | 'winter'\r\n | 'nord'\r\n // Dark themes\r\n | 'dark'\r\n | 'synthwave'\r\n | 'halloween'\r\n | 'forest'\r\n | 'aqua'\r\n | 'black'\r\n | 'luxury'\r\n | 'dracula'\r\n | 'business'\r\n | 'night'\r\n | 'coffee'\r\n | 'dim'\r\n | 'sunset';\r\n\r\n/**\r\n * Theme configuration options\r\n */\r\nexport interface ThemeConfig {\r\n /** Default theme to use */\r\n defaultTheme?: DaisyTheme | string;\r\n /** List of themes to include (for custom CSS generation) */\r\n themes?: (DaisyTheme | string)[];\r\n /** Whether to enable dark mode detection */\r\n darkMode?: boolean;\r\n /** Custom theme definitions */\r\n customThemes?: Record<string, Record<string, string>>;\r\n}\r\n\r\n/**\r\n * Get the current theme from the document\r\n */\r\nexport function getCurrentTheme(): string | null {\r\n if (typeof document === 'undefined') return null;\r\n return document.documentElement.getAttribute('data-theme');\r\n}\r\n\r\n/**\r\n * Set the theme on the document\r\n */\r\nexport function setTheme(theme: DaisyTheme | string): void {\r\n if (typeof document === 'undefined') return;\r\n document.documentElement.setAttribute('data-theme', theme);\r\n \r\n // Persist to localStorage\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.setItem('daisy-theme', theme);\r\n }\r\n}\r\n\r\n/**\r\n * Get the preferred theme from localStorage or system preference\r\n */\r\nexport function getPreferredTheme(defaultTheme: DaisyTheme | string = 'light'): DaisyTheme | string {\r\n if (typeof window === 'undefined') return defaultTheme;\r\n \r\n // Check localStorage first\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (stored) return stored;\r\n \r\n // Check system preference\r\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return defaultTheme;\r\n}\r\n\r\n/**\r\n * Initialize theme based on user preference or default\r\n */\r\nexport function initializeTheme(config?: ThemeConfig): void {\r\n const theme = getPreferredTheme(config?.defaultTheme);\r\n setTheme(theme);\r\n \r\n // Listen for system theme changes if darkMode is enabled\r\n if (config?.darkMode && typeof window !== 'undefined') {\r\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\r\n // Only auto-switch if user hasn't manually selected a theme\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (!stored) {\r\n setTheme(e.matches ? 'dark' : (config.defaultTheme ?? 'light'));\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Toggle between light and dark themes\r\n */\r\nexport function toggleDarkMode(lightTheme: DaisyTheme = 'light', darkTheme: DaisyTheme = 'dark'): void {\r\n const current = getCurrentTheme();\r\n setTheme(current === darkTheme ? lightTheme : darkTheme);\r\n}\r\n\r\n/**\r\n * Returns an inline `<script>` string that prevents theme flicker (FOUC).\r\n * Place this in your HTML `<head>` — it runs synchronously before first paint,\r\n * reading the user's saved theme from localStorage and applying it immediately.\r\n *\r\n * @param defaultTheme - Fallback theme when nothing is stored (default: 'light')\r\n * @param respectSystemPref - Whether to check prefers-color-scheme (default: true)\r\n * @example\r\n * ```html\r\n * <!-- In index.html <head> -->\r\n * <script>...getThemeInitScript()...</script>\r\n * ```\r\n * @example\r\n * ```ts\r\n * // In SSR server, inject into <head>\r\n * html = html.replace('</head>', getThemeInitScript() + '</head>');\r\n * ```\r\n */\r\nexport function getThemeInitScript(defaultTheme: string = 'light', respectSystemPref: boolean = true): string {\r\n return `<script>(function(){try{var t=localStorage.getItem('daisy-theme');${\r\n respectSystemPref\r\n ? `if(!t&&window.matchMedia('(prefers-color-scheme:dark)').matches)t='dark';`\r\n : ''\r\n }if(t)document.documentElement.setAttribute('data-theme',t);}catch(e){}})()</script>`;\r\n}\r\n\r\n// ============================================\r\n// ThemeProvider Component\r\n// ============================================\r\n\r\nexport type ThemeProviderProps = \r\n & DefineProp<'theme', DaisyTheme | string, false>\r\n & DefineProp<'defaultTheme', DaisyTheme | string, false>\r\n & DefineProp<'darkMode', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * ThemeProvider component that wraps your app and manages theme state.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeProvider defaultTheme=\"cupcake\" darkMode>\r\n * <App />\r\n * </ThemeProvider>\r\n * ```\r\n */\r\nexport const ThemeProvider = component<ThemeProviderProps>(({ props, slots }) => {\r\n // Initialize theme on mount — skip if inline script already set the correct theme\r\n if (typeof document !== 'undefined') {\r\n const theme = props.theme ?? getPreferredTheme(props.defaultTheme);\r\n if (getCurrentTheme() !== theme) {\r\n setTheme(theme);\r\n }\r\n \r\n // Set up dark mode listener if enabled\r\n if (props.darkMode && typeof window !== 'undefined') {\r\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (!stored) {\r\n setTheme(e.matches ? 'dark' : (props.defaultTheme ?? 'light'));\r\n }\r\n });\r\n }\r\n }\r\n\r\n return () => (\r\n <div class={props.class}>\r\n {slots.default?.()}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================\r\n// ThemeSelector Component\r\n// ============================================\r\n\r\nexport type ThemeSelectorProps = \r\n & DefineProp<'themes', (DaisyTheme | string)[], false>\r\n & DefineProp<'class', string, false>;\r\n\r\nconst defaultThemes: DaisyTheme[] = [\r\n 'light', 'dark', 'cupcake', 'bumblebee', 'emerald', 'corporate', \r\n 'synthwave', 'retro', 'cyberpunk', 'valentine', 'halloween', \r\n 'garden', 'forest', 'aqua', 'lofi', 'pastel', 'fantasy', \r\n 'wireframe', 'black', 'luxury', 'dracula', 'cmyk', 'autumn',\r\n 'business', 'acid', 'lemonade', 'night', 'coffee', 'winter',\r\n 'dim', 'nord', 'sunset'\r\n];\r\n\r\n/**\r\n * A dropdown selector for switching themes.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeSelector themes={['light', 'dark', 'cupcake', 'cyberpunk']} />\r\n * ```\r\n */\r\nexport const ThemeSelector = component<ThemeSelectorProps>(({ props }) => {\r\n const themes = () => props.themes ?? defaultThemes;\r\n \r\n const handleChange = (e: Event) => {\r\n const select = e.target as HTMLSelectElement;\r\n setTheme(select.value);\r\n };\r\n\r\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\r\n\r\n return () => (\r\n <select \r\n class={`select select-bordered ${props.class ?? ''}`}\r\n onChange={handleChange}\r\n value={getCurrentTheme() ?? 'light'}\r\n >\r\n {themes().map(theme => (\r\n <option value={theme}>{capitalize(theme)}</option>\r\n ))}\r\n </select>\r\n );\r\n});\r\n\r\n// ============================================\r\n// ThemeToggle Component (Light/Dark toggle)\r\n// ============================================\r\n\r\nexport type ThemeToggleProps = \r\n & DefineProp<'lightTheme', DaisyTheme | string, false>\r\n & DefineProp<'darkTheme', DaisyTheme | string, false>\r\n & DefineProp<'class', string, false>;\r\n\r\n/**\r\n * A toggle button for switching between light and dark themes.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeToggle lightTheme=\"light\" darkTheme=\"dark\" />\r\n * ```\r\n */\r\nexport const ThemeToggle = component<ThemeToggleProps>(({ props }) => {\r\n const lightTheme = () => props.lightTheme ?? 'light';\r\n const darkTheme = () => props.darkTheme ?? 'dark';\r\n \r\n // Use a signal to track theme state for reactivity\r\n const isDark = signal(getCurrentTheme() === (props.darkTheme ?? 'dark'));\r\n \r\n const handleToggle = () => {\r\n toggleDarkMode(lightTheme() as DaisyTheme, darkTheme() as DaisyTheme);\r\n // Update the signal to trigger re-render\r\n isDark.value = getCurrentTheme() === darkTheme();\r\n };\r\n\r\n return () => (\r\n <button \r\n class={props.class ?? 'btn btn-ghost btn-circle text-base-content'}\r\n onClick={handleToggle}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {isDark.value ? (\r\n /* Sun icon - show in dark mode to switch to light */\r\n <svg \r\n class=\"w-6 h-6\" \r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\"/>\r\n </svg>\r\n ) : (\r\n /* Moon icon - show in light mode to switch to dark */\r\n <svg \r\n class=\"w-6 h-6\" \r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\"/>\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n});\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sigx/daisyui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "DaisyUI component library for SignalX - Beautiful, accessible UI components with full theme support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -70,15 +70,15 @@
|
|
|
70
70
|
"tailwindcss": ">=4.0.0"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@sigx/
|
|
74
|
-
"@sigx/
|
|
75
|
-
"@sigx/runtime-
|
|
73
|
+
"@sigx/runtime-core": "^0.1.8",
|
|
74
|
+
"@sigx/reactivity": "^0.1.8",
|
|
75
|
+
"@sigx/runtime-dom": "^0.1.8"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"typescript": "^5.9.3",
|
|
79
79
|
"vite": "^8.0.0-beta.9",
|
|
80
|
-
"@sigx/vite": "^0.1.
|
|
81
|
-
"sigx": "^0.1.
|
|
80
|
+
"@sigx/vite": "^0.1.8",
|
|
81
|
+
"sigx": "^0.1.8"
|
|
82
82
|
},
|
|
83
83
|
"scripts": {
|
|
84
84
|
"build": "vite build && tsc --emitDeclarationOnly",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-wxNpnX83.js","names":[],"sources":["../src/data/Table.tsx"],"sourcesContent":["import { component, DefineProp, DefineSlot } from 'sigx';\r\n\r\n// ============================================\r\n// Table Component\r\n// ============================================\r\n\r\nexport type TableSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\nexport type TableProps = \r\n & DefineProp<'zebra', boolean, false>\r\n & DefineProp<'pinRows', boolean, false>\r\n & DefineProp<'pinCols', boolean, false>\r\n & DefineProp<'size', TableSize, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\nconst tableSizeClasses: Record<TableSize, string> = {\r\n xs: 'table-xs',\r\n sm: 'table-sm',\r\n md: '',\r\n lg: 'table-lg'\r\n};\r\n\r\n/**\r\n * Table component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Table zebra>\r\n * <Thead>\r\n * <Tr><Th>Name</Th><Th>Age</Th></Tr>\r\n * </Thead>\r\n * <Tbody>\r\n * <Tr><Td>John</Td><Td>25</Td></Tr>\r\n * </Tbody>\r\n * </Table>\r\n * ```\r\n */\r\nexport const Table = component<TableProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['table'];\r\n \r\n if (props.zebra) classes.push('table-zebra');\r\n if (props.pinRows) classes.push('table-pin-rows');\r\n if (props.pinCols) classes.push('table-pin-cols');\r\n if (props.size) {\r\n const sizeClass = tableSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class=\"overflow-x-auto\">\r\n <table class={getClasses()}>\r\n {slots.default?.()}\r\n </table>\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Thead Component\r\n// ============================================\r\n\r\nexport type TheadProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Table head component.\r\n */\r\nexport const Thead = component<TheadProps>(({ props, slots }) => {\r\n return () => (\r\n <thead class={props.class}>\r\n {slots.default?.()}\r\n </thead>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Tbody Component\r\n// ============================================\r\n\r\nexport type TbodyProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Table body component.\r\n */\r\nexport const Tbody = component<TbodyProps>(({ props, slots }) => {\r\n return () => (\r\n <tbody class={props.class}>\r\n {slots.default?.()}\r\n </tbody>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Tr Component\r\n// ============================================\r\n\r\nexport type TrProps = \r\n & DefineProp<'hover', boolean, false>\r\n & DefineProp<'active', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Table row component.\r\n */\r\nexport const Tr = component<TrProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes: string[] = [];\r\n \r\n if (props.hover) classes.push('hover');\r\n if (props.active) classes.push('active');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <tr class={getClasses()}>\r\n {slots.default?.()}\r\n </tr>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Th Component\r\n// ============================================\r\n\r\nexport type ThProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Table header cell component.\r\n */\r\nexport const Th = component<ThProps>(({ props, slots }) => {\r\n return () => (\r\n <th class={props.class}>\r\n {slots.default?.()}\r\n </th>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Td Component\r\n// ============================================\r\n\r\nexport type TdProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Table data cell component.\r\n */\r\nexport const Td = component<TdProps>(({ props, slots }) => {\r\n return () => (\r\n <td class={props.class}>\r\n {slots.default?.()}\r\n </td>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Avatar Component\r\n// ============================================\r\n\r\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\nexport type AvatarShape = 'circle' | 'rounded' | 'square';\r\n\r\nexport type AvatarProps = \r\n & DefineProp<'src', string, false>\r\n & DefineProp<'alt', string, false>\r\n & DefineProp<'size', AvatarSize, false>\r\n & DefineProp<'shape', AvatarShape, false>\r\n & DefineProp<'online', boolean, false>\r\n & DefineProp<'offline', boolean, false>\r\n & DefineProp<'placeholder', string, false>\r\n & DefineProp<'class', string, false>;\r\n\r\nconst avatarSizeClasses: Record<AvatarSize, string> = {\r\n xs: 'w-8',\r\n sm: 'w-12',\r\n md: 'w-16',\r\n lg: 'w-20',\r\n xl: 'w-24'\r\n};\r\n\r\nconst avatarShapeClasses: Record<AvatarShape, string> = {\r\n circle: 'rounded-full',\r\n rounded: 'rounded-xl',\r\n square: ''\r\n};\r\n\r\n/**\r\n * Avatar component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Avatar src=\"/user.jpg\" size=\"md\" shape=\"circle\" online />\r\n * <Avatar placeholder=\"JD\" size=\"lg\" />\r\n * ```\r\n */\r\nexport const Avatar = component<AvatarProps>(({ props }) => {\r\n const getContainerClasses = () => {\r\n const classes = ['avatar'];\r\n \r\n if (props.online) classes.push('online');\r\n if (props.offline) classes.push('offline');\r\n if (!props.src && props.placeholder) classes.push('placeholder');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n const getImageClasses = () => {\r\n const classes: string[] = [];\r\n \r\n classes.push(avatarSizeClasses[props.size ?? 'md']);\r\n classes.push(avatarShapeClasses[props.shape ?? 'circle']);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getContainerClasses()}>\r\n {props.src ? (\r\n <div class={getImageClasses()}>\r\n <img src={props.src} alt={props.alt ?? 'Avatar'} />\r\n </div>\r\n ) : props.placeholder ? (\r\n <div class={`bg-neutral text-neutral-content ${getImageClasses()}`}>\r\n <span class=\"text-xl\">{props.placeholder}</span>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Stat Component\r\n// ============================================\r\n\r\nexport type StatProps = \r\n & DefineProp<'title', string>\r\n & DefineProp<'value', string | number>\r\n & DefineProp<'description', string, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'figure'>;\r\n\r\n/**\r\n * Stat component for displaying statistics.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Stats>\r\n * <Stat title=\"Total Users\" value=\"1,200\" description=\"↗︎ 400 (22%)\" />\r\n * <Stat title=\"Revenue\" value=\"$2.6M\" description=\"↘︎ 90 (14%)\" />\r\n * </Stats>\r\n * ```\r\n */\r\nexport const Stat = component<StatProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['stat'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.figure && <div class=\"stat-figure\">{slots.figure()}</div>}\r\n <div class=\"stat-title\">{props.title}</div>\r\n <div class=\"stat-value\">{props.value}</div>\r\n {props.description && <div class=\"stat-desc\">{props.description}</div>}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================\r\n// Stats Container Component\r\n// ============================================\r\n\r\nexport type StatsProps = \r\n & DefineProp<'vertical', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Stats container component.\r\n */\r\nexport const Stats = component<StatsProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['stats', 'shadow'];\r\n if (props.vertical) classes.push('stats-vertical');\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.default?.()}\r\n </div>\r\n );\r\n});\r\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"forms-CuvlRMro.js","names":[],"sources":["../src/forms/Input.tsx","../src/forms/Textarea.tsx","../src/forms/Select.tsx","../src/forms/FormField.tsx","../src/forms/Toggle.tsx","../src/forms/Checkbox.tsx","../src/forms/Radio.tsx","../src/forms/Range.tsx"],"sourcesContent":["import { component, DefineProp, DefineEvent, DefineModel } from \"sigx\";\r\n\r\n// ============================================\r\n// Input Component\r\n// ============================================\r\n\r\nexport type InputSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\nexport type InputVariant = \"bordered\" | \"ghost\";\r\nexport type InputColor = \"primary\" | \"secondary\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\n// Support both model binding and manual value+onInput\r\n// Using string | number to support both text inputs and number inputs\r\nexport type InputProps =\r\n & DefineModel<string | number>\r\n & DefineProp<\"placeholder\", string, false>\r\n & DefineProp<\"type\", \"text\" | \"password\" | \"email\" | \"number\" | \"search\" | \"url\", false>\r\n & DefineProp<\"size\", InputSize, false>\r\n & DefineProp<\"variant\", InputVariant, false>\r\n & DefineProp<\"color\", InputColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"readOnly\", boolean, false>\r\n & DefineProp<\"maxLength\", number, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineEvent<\"input\", InputEvent>\r\n & DefineEvent<\"change\", Event>\r\n & DefineEvent<\"focus\", FocusEvent>\r\n & DefineEvent<\"blur\", FocusEvent>;\r\n\r\nconst inputSizeClasses: Record<InputSize, string> = {\r\n xs: \"input-xs\",\r\n sm: \"input-sm\",\r\n md: \"\",\r\n lg: \"input-lg\"\r\n};\r\n\r\nconst inputColorClasses: Record<InputColor, string> = {\r\n primary: \"input-primary\",\r\n secondary: \"input-secondary\",\r\n accent: \"input-accent\",\r\n info: \"input-info\",\r\n success: \"input-success\",\r\n warning: \"input-warning\",\r\n error: \"input-error\"\r\n};\r\n\r\n/**\r\n * Input component with DaisyUI styling.\r\n * \r\n * Uses the new model binding architecture for efficient two-way binding.\r\n * The model tuple is forwarded directly to the native input element.\r\n * \r\n * @example\r\n * ```tsx\r\n * const form = signal({ name: \"\" });\r\n * <Input model={() => form.name} placeholder=\"Enter your name\" variant=\"bordered\" />\r\n * ```\r\n */\r\nexport const Input = component<InputProps>(({ props, emit }) => {\r\n function getClasses() {\r\n const classes = [\"input\", \"w-full\"];\r\n\r\n if (props.size) {\r\n const sizeClass = inputSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n\r\n if (props.variant === \"bordered\") classes.push(\"input-bordered\");\r\n if (props.variant === \"ghost\") classes.push(\"input-ghost\");\r\n\r\n if (props.color) classes.push(inputColorClasses[props.color]);\r\n if (props.class) classes.push(props.class);\r\n\r\n return classes.join(\" \");\r\n }\r\n\r\n return () => {\r\n return (\r\n <input\r\n type={props.type ?? \"text\"}\r\n class={getClasses()}\r\n value={props.model?.value != null ? String(props.model.value) : \"\"}\r\n placeholder={props.placeholder}\r\n disabled={props.disabled}\r\n readOnly={props.readOnly}\r\n maxLength={props.maxLength}\r\n onInput={(e) => {\r\n const value = (e.target as HTMLInputElement).value;\r\n if (props.model) {\r\n props.model.value = value;\r\n }\r\n emit(\"input\", e);\r\n }}\r\n onChange={(e) => emit(\"change\", e)}\r\n onFocus={(e) => emit(\"focus\", e)}\r\n onBlur={(e) => emit(\"blur\", e)}\r\n />\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineEvent, DefineModel } from \"sigx\";\r\nimport type { InputSize, InputVariant, InputColor } from \"./Input\";\r\n\r\n// ============================================\r\n// Textarea Component\r\n// ============================================\r\n\r\nexport type TextareaProps = \r\n & DefineModel<string> // modelValue + onUpdate:modelValue for model binding\r\n & DefineProp<\"placeholder\", string, false>\r\n & DefineProp<\"rows\", number, false>\r\n & DefineProp<\"size\", InputSize, false>\r\n & DefineProp<\"variant\", InputVariant, false>\r\n & DefineProp<\"color\", InputColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineEvent<\"input\", string>\r\n & DefineEvent<\"change\", string>;\r\n\r\n/**\r\n * Textarea component with DaisyUI styling.\r\n * \r\n * Uses the new model binding architecture for efficient two-way binding.\r\n * The model tuple is forwarded directly to the native textarea element.\r\n * \r\n * @example\r\n * ```tsx\r\n * const form = signal({ bio: \"\" });\r\n * <Textarea model={() => form.bio} placeholder=\"Tell us about yourself\" rows={5} />\r\n * ```\r\n */\r\nexport const Textarea = component<TextareaProps>(({ props, emit }) => {\r\n function getClasses() {\r\n const classes = [\"textarea\", \"w-full\"];\r\n \r\n if (props.size === \"xs\") classes.push(\"textarea-xs\");\r\n if (props.size === \"sm\") classes.push(\"textarea-sm\");\r\n if (props.size === \"lg\") classes.push(\"textarea-lg\");\r\n \r\n if (props.variant === \"bordered\") classes.push(\"textarea-bordered\");\r\n if (props.variant === \"ghost\") classes.push(\"textarea-ghost\");\r\n \r\n if (props.color) classes.push(`textarea-${props.color}`);\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(\" \");\r\n }\r\n\r\n return () => {\r\n // Only include model prop if a model binding exists\r\n // Native elements expect [obj, key] tuple, so we extract just the first two elements\r\n const modelProps = props.model \r\n ? { model: [props.model.binding[0], props.model.binding[1]] as [object, string] } \r\n : {};\r\n \r\n return (\r\n <textarea\r\n class={getClasses()}\r\n rows={props.rows ?? 3}\r\n placeholder={props.placeholder}\r\n disabled={props.disabled}\r\n {...modelProps}\r\n onInput={(e) => emit(\"input\", (e.target as HTMLTextAreaElement).value)}\r\n onChange={(e) => emit(\"change\", (e.target as HTMLTextAreaElement).value)}\r\n />\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineSlot, DefineEvent, DefineModel } from \"sigx\";\r\nimport type { InputSize, InputVariant, InputColor } from \"./Input\";\r\n\r\n// ============================================\r\n// Select Component\r\n// ============================================\r\n\r\nexport interface SelectOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type SelectProps = \r\n & DefineModel<string> // modelValue + onUpdate:modelValue for model binding\r\n & DefineProp<\"options\", SelectOption[], false>\r\n & DefineProp<\"placeholder\", string, false>\r\n & DefineProp<\"size\", InputSize, false>\r\n & DefineProp<\"variant\", InputVariant, false>\r\n & DefineProp<\"color\", InputColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineSlot<\"default\"> // Allow custom options via slot\r\n & DefineEvent<\"change\", string>;\r\n\r\nconst selectSizeClasses: Record<InputSize, string> = {\r\n xs: \"select-xs\",\r\n sm: \"select-sm\",\r\n md: \"\",\r\n lg: \"select-lg\"\r\n};\r\n\r\nconst selectColorClasses: Record<InputColor, string> = {\r\n primary: \"select-primary\",\r\n secondary: \"select-secondary\",\r\n accent: \"select-accent\",\r\n info: \"select-info\",\r\n success: \"select-success\",\r\n warning: \"select-warning\",\r\n error: \"select-error\"\r\n};\r\n\r\n/**\r\n * Select component with DaisyUI styling and model binding support.\r\n * \r\n * Uses the new model binding architecture for efficient two-way binding.\r\n * The model tuple is forwarded directly to the native select element.\r\n * \r\n * @example\r\n * ```tsx\r\n * const form = signal({ choice: \"\" });\r\n * const options = [\r\n * { value: \"a\", label: \"Option A\" },\r\n * { value: \"b\", label: \"Option B\" }\r\n * ];\r\n * <Select model={() => form.choice} options={options} placeholder=\"Select an option\" />\r\n * ```\r\n */\r\nexport const Select = component<SelectProps>(({ props, slots, emit }) => {\r\n function getClasses() {\r\n const classes = [\"select\", \"w-full\"];\r\n \r\n if (props.size) {\r\n const sizeClass = selectSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n \r\n if (props.variant === \"bordered\") classes.push(\"select-bordered\");\r\n if (props.variant === \"ghost\") classes.push(\"select-ghost\");\r\n \r\n if (props.color) classes.push(selectColorClasses[props.color]);\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(\" \");\r\n }\r\n\r\n return () => {\r\n // Only include model prop if a model binding exists\r\n // Native elements expect [obj, key] tuple, so we extract just the first two elements\r\n const modelProps = props.model \r\n ? { model: [props.model.binding[0], props.model.binding[1]] as [object, string] } \r\n : {};\r\n \r\n return (\r\n <select\r\n class={getClasses()}\r\n disabled={props.disabled}\r\n {...modelProps}\r\n onChange={(e) => emit(\"change\", (e.target as HTMLSelectElement).value)}\r\n >\r\n {props.placeholder && (\r\n <option value=\"\" disabled>\r\n {props.placeholder}\r\n </option>\r\n )}\r\n {props.options?.map(opt => (\r\n <option \r\n value={opt.value} \r\n disabled={opt.disabled}\r\n >\r\n {opt.label}\r\n </option>\r\n ))}\r\n {slots.default?.()}\r\n </select>\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineSlot } from \"sigx\";\r\n\r\n// ============================================\r\n// FormField Component (Label + Input wrapper)\r\n// ============================================\r\n\r\nexport type FormFieldProps = \r\n & DefineProp<\"label\", string, false>\r\n & DefineProp<\"error\", string, false>\r\n & DefineProp<\"hint\", string, false>\r\n & DefineProp<\"required\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineSlot<\"default\">;\r\n\r\n/**\r\n * FormField wrapper component that provides label, error, and hint support.\r\n * \r\n * @example\r\n * ```tsx\r\n * <FormField label=\"Email\" error={emailError} required>\r\n * <Input sync={email} type=\"email\" />\r\n * </FormField>\r\n * ```\r\n */\r\nexport const FormField = component<FormFieldProps>(({ props, slots }) => {\r\n return () => (\r\n <div class={`form-control w-full ${props.class ?? \"\"}`}>\r\n {props.label && (\r\n <label class=\"label\">\r\n <span class=\"label-text\">\r\n {props.label}\r\n {props.required && <span class=\"text-error ml-1\">*</span>}\r\n </span>\r\n </label>\r\n )}\r\n {slots.default?.()}\r\n {(props.error || props.hint) && (\r\n <label class=\"label\">\r\n {props.error ? (\r\n <span class=\"label-text-alt text-error\">{props.error}</span>\r\n ) : (\r\n <span class=\"label-text-alt\">{props.hint}</span>\r\n )}\r\n </label>\r\n )}\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineEvent, DefineModel } from \"sigx\";\r\n\r\n// ============================================\r\n// Toggle Component\r\n// ============================================\r\n\r\nexport type ToggleSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\nexport type ToggleColor = \"primary\" | \"secondary\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nexport type ToggleProps =\r\n & DefineModel<boolean>\r\n & DefineProp<\"size\", ToggleSize, false>\r\n & DefineProp<\"color\", ToggleColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineProp<\"label\", string, false>\r\n & DefineEvent<\"change\", boolean>;\r\n\r\nconst toggleSizeClasses: Record<ToggleSize, string> = {\r\n xs: \"toggle-xs\",\r\n sm: \"toggle-sm\",\r\n md: \"\",\r\n lg: \"toggle-lg\"\r\n};\r\n\r\nconst toggleColorClasses: Record<ToggleColor, string> = {\r\n primary: \"toggle-primary\",\r\n secondary: \"toggle-secondary\",\r\n accent: \"toggle-accent\",\r\n info: \"toggle-info\",\r\n success: \"toggle-success\",\r\n warning: \"toggle-warning\",\r\n error: \"toggle-error\"\r\n};\r\n\r\n/**\r\n * Toggle/switch component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * const enabled = signal(false);\r\n * <Toggle model={enabled} label=\"Enable notifications\" color=\"primary\" />\r\n * ```\r\n */\r\nexport const Toggle = component<ToggleProps>(({ props, emit }) => {\r\n function handleChange(e: Event) {\r\n const checked = (e.target as HTMLInputElement).checked;\r\n if (props.model) props.model.value = checked;\r\n emit(\"change\", checked);\r\n }\r\n\r\n return () => {\r\n const sizeClass = toggleSizeClasses[props.size ?? \"md\"];\r\n const colorClass = props.color ? toggleColorClasses[props.color] : \"\";\r\n\r\n return (\r\n <label class={`flex items-center gap-2 cursor-pointer ${props.class ?? \"\"}`}>\r\n <input\r\n type=\"checkbox\"\r\n class={`toggle ${sizeClass} ${colorClass}`}\r\n checked={props.model?.value ?? false}\r\n disabled={props.disabled}\r\n onChange={handleChange}\r\n />\r\n {props.label && <span class=\"label-text\">{props.label}</span>}\r\n </label>\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineEvent, DefineModel } from \"sigx\";\r\n\r\n// ============================================\r\n// Checkbox Component\r\n// ============================================\r\n\r\nexport type CheckboxSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\nexport type CheckboxColor = \"primary\" | \"secondary\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nexport type CheckboxProps =\r\n & DefineModel<boolean>\r\n & DefineProp<\"size\", CheckboxSize, false>\r\n & DefineProp<\"color\", CheckboxColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineProp<\"label\", string, false>\r\n & DefineEvent<\"change\", boolean>;\r\n\r\nconst checkboxSizeClasses: Record<CheckboxSize, string> = {\r\n xs: \"checkbox-xs\",\r\n sm: \"checkbox-sm\",\r\n md: \"\",\r\n lg: \"checkbox-lg\"\r\n};\r\n\r\nconst checkboxColorClasses: Record<CheckboxColor, string> = {\r\n primary: \"checkbox-primary\",\r\n secondary: \"checkbox-secondary\",\r\n accent: \"checkbox-accent\",\r\n info: \"checkbox-info\",\r\n success: \"checkbox-success\",\r\n warning: \"checkbox-warning\",\r\n error: \"checkbox-error\"\r\n};\r\n\r\n/**\r\n * Checkbox component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * const agreed = signal(false);\r\n * <Checkbox model={agreed} label=\"I agree to the terms\" color=\"primary\" />\r\n * ```\r\n */\r\nexport const Checkbox = component<CheckboxProps>(({ props, emit }) => {\r\n function handleChange(e: Event) {\r\n const checked = (e.target as HTMLInputElement).checked;\r\n if (props.model) props.model.value = checked;\r\n emit(\"change\", checked);\r\n }\r\n\r\n return () => {\r\n const sizeClass = checkboxSizeClasses[props.size ?? \"md\"];\r\n const colorClass = props.color ? checkboxColorClasses[props.color] : \"\";\r\n\r\n return (\r\n <label class={`flex items-center gap-2 cursor-pointer ${props.class ?? \"\"}`}>\r\n <input\r\n type=\"checkbox\"\r\n class={`checkbox ${sizeClass} ${colorClass}`}\r\n checked={props.model?.value ?? false}\r\n disabled={props.disabled}\r\n onChange={handleChange}\r\n />\r\n {props.label && <span class=\"label-text\">{props.label}</span>}\r\n </label>\r\n );\r\n };\r\n});\r\n","import { component, compound, DefineProp, DefineSlot, DefineEvent, DefineModel, defineProvide, defineInjectable } from \"sigx\";\r\n\r\n// ============================================\r\n// Radio Component Types\r\n// ============================================\r\n\r\nexport type RadioSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\nexport type RadioColor = \"primary\" | \"secondary\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nconst radioSizeClasses: Record<RadioSize, string> = {\r\n xs: \"radio-xs\",\r\n sm: \"radio-sm\",\r\n md: \"\",\r\n lg: \"radio-lg\"\r\n};\r\n\r\nconst radioColorClasses: Record<RadioColor, string> = {\r\n primary: \"radio-primary\",\r\n secondary: \"radio-secondary\",\r\n accent: \"radio-accent\",\r\n info: \"radio-info\",\r\n success: \"radio-success\",\r\n warning: \"radio-warning\",\r\n error: \"radio-error\"\r\n};\r\n\r\n// ============================================\r\n// RadioGroup Context\r\n// ============================================\r\n\r\ninterface RadioGroupContext {\r\n name: string;\r\n value: () => string | undefined;\r\n size?: RadioSize;\r\n color?: RadioColor;\r\n disabled?: boolean;\r\n onChange: (value: string) => void;\r\n}\r\n\r\nconst useRadioGroup = defineInjectable<RadioGroupContext | null>(() => null);\r\n\r\n// ============================================\r\n// RadioGroup Component\r\n// ============================================\r\n\r\nexport type RadioGroupProps =\r\n & DefineModel<string>\r\n & DefineProp<\"name\", string> // Required\r\n & DefineProp<\"size\", RadioSize, false>\r\n & DefineProp<\"color\", RadioColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineProp<\"direction\", \"horizontal\" | \"vertical\", false>\r\n & DefineSlot<\"default\">\r\n & DefineEvent<\"change\", string>;\r\n\r\n/**\r\n * RadioGroup component that manages a group of Radio buttons.\r\n * Provides context to child Radio.Item components.\r\n * \r\n * @example\r\n * ```tsx\r\n * const color = signal(\"red\");\r\n * <Radio model={color} name=\"color\">\r\n * <Radio.Item value=\"red\" label=\"Red\" />\r\n * <Radio.Item value=\"blue\" label=\"Blue\" />\r\n * <Radio.Item value=\"green\" label=\"Green\" />\r\n * </Radio>\r\n * ```\r\n */\r\nconst _RadioGroup = component<RadioGroupProps>(({ props, slots, emit }) => {\r\n // Provide context to child Radio.Item components\r\n defineProvide(useRadioGroup, () => ({\r\n name: props.name!, // name is required\r\n value: () => props.model?.value,\r\n size: props.size,\r\n color: props.color,\r\n disabled: props.disabled,\r\n onChange: (value: string) => {\r\n if (props.model) props.model.value = value;\r\n emit(\"change\", value);\r\n }\r\n }));\r\n\r\n return () => {\r\n const directionClass = props.direction === \"horizontal\" \r\n ? \"flex flex-row gap-4\" \r\n : \"flex flex-col gap-2\";\r\n\r\n return (\r\n <div class={`${directionClass} ${props.class ?? \"\"}`}>\r\n {slots.default?.()}\r\n </div>\r\n );\r\n };\r\n});\r\n\r\n// ============================================\r\n// RadioItem Component\r\n// ============================================\r\n\r\nexport type RadioItemProps =\r\n & DefineProp<\"value\", string> // Required\r\n & DefineProp<\"label\", string, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>;\r\n\r\n/**\r\n * Individual radio button item. Must be used within a Radio (RadioGroup) component.\r\n */\r\nconst RadioItem = component<RadioItemProps>(({ props }) => {\r\n const context = useRadioGroup();\r\n\r\n function handleChange() {\r\n if (context && !props.disabled && !context.disabled) {\r\n context.onChange(props.value!); // value is required\r\n }\r\n }\r\n\r\n return () => {\r\n if (!context) {\r\n console.warn(\"Radio.Item must be used within a Radio component\");\r\n return null;\r\n }\r\n\r\n const sizeClass = radioSizeClasses[context.size ?? \"md\"];\r\n const colorClass = context.color ? radioColorClasses[context.color] : \"\";\r\n const isDisabled = props.disabled || context.disabled;\r\n const isChecked = context.value() === props.value;\r\n\r\n return (\r\n <label class={`flex items-center gap-2 cursor-pointer ${props.class ?? \"\"}`}>\r\n <input\r\n type=\"radio\"\r\n name={context.name}\r\n value={props.value}\r\n class={`radio ${sizeClass} ${colorClass}`}\r\n checked={isChecked}\r\n disabled={isDisabled}\r\n onChange={handleChange}\r\n />\r\n {props.label && <span class=\"label-text\">{props.label}</span>}\r\n </label>\r\n );\r\n };\r\n});\r\n\r\n// ============================================\r\n// Standalone Radio Component (without group)\r\n// ============================================\r\n\r\nexport type StandaloneRadioProps =\r\n & DefineProp<\"checked\", boolean, false>\r\n & DefineProp<\"name\", string>\r\n & DefineProp<\"value\", string>\r\n & DefineProp<\"size\", RadioSize, false>\r\n & DefineProp<\"color\", RadioColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineProp<\"label\", string, false>\r\n & DefineEvent<\"change\", string>;\r\n\r\n/**\r\n * Standalone Radio button component (for use without RadioGroup).\r\n */\r\nconst StandaloneRadio = component<StandaloneRadioProps>(({ props, emit }) => {\r\n function handleChange(e: Event) {\r\n const value = (e.target as HTMLInputElement).value;\r\n emit(\"change\", value);\r\n }\r\n\r\n return () => {\r\n const sizeClass = radioSizeClasses[props.size ?? \"md\"];\r\n const colorClass = props.color ? radioColorClasses[props.color] : \"\";\r\n\r\n return (\r\n <label class={`flex items-center gap-2 cursor-pointer ${props.class ?? \"\"}`}>\r\n <input\r\n type=\"radio\"\r\n name={props.name}\r\n value={props.value}\r\n class={`radio ${sizeClass} ${colorClass}`}\r\n checked={props.checked ?? false}\r\n disabled={props.disabled}\r\n onChange={handleChange}\r\n />\r\n {props.label && <span class=\"label-text\">{props.label}</span>}\r\n </label>\r\n );\r\n };\r\n});\r\n\r\n// ============================================\r\n// Compound Export\r\n// ============================================\r\n\r\n/**\r\n * Radio compound component with Item sub-component for grouped radio buttons.\r\n * \r\n * @example Using compound pattern (recommended):\r\n * ```tsx\r\n * const color = signal(\"red\");\r\n * <Radio model={color} name=\"color\">\r\n * <Radio.Item value=\"red\" label=\"Red\" />\r\n * <Radio.Item value=\"blue\" label=\"Blue\" />\r\n * </Radio>\r\n * ```\r\n * \r\n * @example Using standalone Radio buttons:\r\n * ```tsx\r\n * <Radio.Standalone name=\"color\" value=\"red\" label=\"Red\" checked={color === \"red\"} onChange={setColor} />\r\n * <Radio.Standalone name=\"color\" value=\"blue\" label=\"Blue\" checked={color === \"blue\"} onChange={setColor} />\r\n * ```\r\n */\r\nexport const Radio = compound(_RadioGroup, {\r\n Item: RadioItem,\r\n Standalone: StandaloneRadio,\r\n});\r\n","import { component, DefineProp, DefineEvent, DefineModel } from \"sigx\";\r\n\r\n// ============================================\r\n// Range Component\r\n// ============================================\r\n\r\nexport type RangeSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\r\nexport type RangeColor = \"primary\" | \"secondary\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"error\";\r\n\r\nexport type RangeProps =\r\n & DefineModel<number>\r\n & DefineProp<\"min\", number, false>\r\n & DefineProp<\"max\", number, false>\r\n & DefineProp<\"step\", number, false>\r\n & DefineProp<\"size\", RangeSize, false>\r\n & DefineProp<\"color\", RangeColor, false>\r\n & DefineProp<\"disabled\", boolean, false>\r\n & DefineProp<\"class\", string, false>\r\n & DefineEvent<\"change\", number>;\r\n\r\nconst rangeSizeClasses: Record<RangeSize, string> = {\r\n xs: \"range-xs\",\r\n sm: \"range-sm\",\r\n md: \"\",\r\n lg: \"range-lg\"\r\n};\r\n\r\nconst rangeColorClasses: Record<RangeColor, string> = {\r\n primary: \"range-primary\",\r\n secondary: \"range-secondary\",\r\n accent: \"range-accent\",\r\n info: \"range-info\",\r\n success: \"range-success\",\r\n warning: \"range-warning\",\r\n error: \"range-error\"\r\n};\r\n\r\n/**\r\n * Range slider component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * const volume = signal(50);\r\n * <Range model={volume} min={0} max={100} step={1} color=\"primary\" />\r\n * ```\r\n */\r\nexport const Range = component<RangeProps>(({ props, emit }) => {\r\n function handleInput(e: Event) {\r\n const value = parseFloat((e.target as HTMLInputElement).value);\r\n if (props.model) props.model.value = value;\r\n emit(\"change\", value);\r\n }\r\n\r\n return () => {\r\n const sizeClass = rangeSizeClasses[props.size ?? \"md\"];\r\n const colorClass = props.color ? rangeColorClasses[props.color] : \"\";\r\n\r\n return (\r\n <input\r\n type=\"range\"\r\n class={`range ${sizeClass} ${colorClass} ${props.class ?? \"\"}`}\r\n min={props.min ?? 0}\r\n max={props.max ?? 100}\r\n step={props.step ?? 1}\r\n value={String(props.model?.value ?? 0)}\r\n disabled={props.disabled}\r\n onInput={handleInput}\r\n />\r\n );\r\n };\r\n});\r\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-4cwyfLvr.js","names":[],"sources":["../src/navigation/Tabs.tsx","../src/navigation/MenuComponent.tsx","../src/navigation/Dropdown.tsx","../src/navigation/Drawer.tsx","../src/navigation/Breadcrumbs.tsx","../src/navigation/Navbar.tsx","../src/navigation/Pagination.tsx"],"sourcesContent":["import { component, DefineProp, DefineEvent, JSXElement } from 'sigx';\r\n\r\nexport interface Tab {\r\n id: string;\r\n label: string | JSXElement;\r\n content?: string | JSXElement;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type TabsVariant = 'border' | 'lift' | 'box';\r\nexport type TabsSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\nexport type TabsPosition = 'top' | 'bottom';\r\n\r\nexport type TabsProps = \r\n & DefineProp<'tabs', Tab[]>\r\n & DefineProp<'activeTab', string>\r\n & DefineProp<'variant', TabsVariant, false>\r\n & DefineProp<'size', TabsSize, false>\r\n & DefineProp<'position', TabsPosition, false>\r\n & DefineProp<'name', string, false>\r\n & DefineProp<'contentClass', string, false>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'change', string>;\r\n\r\nconst tabsSizeClasses: Record<TabsSize, string> = {\r\n xs: 'tabs-xs',\r\n sm: 'tabs-sm',\r\n md: '',\r\n lg: 'tabs-lg',\r\n xl: 'tabs-xl'\r\n};\r\n\r\nlet tabsCounter = 0;\r\n\r\n/**\r\n * Tabs component with DaisyUI styling.\r\n * Uses radio inputs for native tab switching with content panels.\r\n * \r\n * @example Basic tabs without content\r\n * ```tsx\r\n * const tabs = [\r\n * { id: 'tab1', label: 'Tab 1' },\r\n * { id: 'tab2', label: 'Tab 2' }\r\n * ];\r\n * <Tabs tabs={tabs} activeTab={activeTab.value} onChange={(id) => activeTab.value = id} />\r\n * ```\r\n * \r\n * @example Tabs with content\r\n * ```tsx\r\n * const tabs = [\r\n * { id: 'tab1', label: 'Tab 1', content: 'Content for tab 1' },\r\n * { id: 'tab2', label: 'Tab 2', content: <div>Rich content for tab 2</div> }\r\n * ];\r\n * <Tabs tabs={tabs} activeTab={activeTab.value} onChange={(id) => activeTab.value = id} variant=\"lift\" />\r\n * ```\r\n */\r\nexport const Tabs = component<TabsProps>(({ props, emit }) => {\r\n // Generate stable name once per component instance\r\n const instanceId = ++tabsCounter;\r\n const getTabGroupName = () => props.name || `sigx_tabs_${instanceId}`;\r\n \r\n const hasContent = () => props.tabs?.some(tab => tab.content != null);\r\n \r\n const getContainerClasses = () => {\r\n const classes = ['tabs'];\r\n \r\n // DaisyUI v5 uses tabs-border, tabs-lift, tabs-box\r\n if (props.variant === 'border') classes.push('tabs-border');\r\n if (props.variant === 'lift') classes.push('tabs-lift');\r\n if (props.variant === 'box') classes.push('tabs-box');\r\n \r\n // Position\r\n if (props.position === 'bottom') classes.push('tabs-bottom');\r\n \r\n if (props.size) {\r\n const sizeClass = tabsSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n \r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n \r\n const getContentClasses = () => {\r\n const classes = ['tab-content', 'bg-base-100', 'border-base-300', 'p-6'];\r\n if (props.contentClass) classes.push(props.contentClass);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => {\r\n const showContent = hasContent();\r\n \r\n // If tabs have content, use radio input pattern (DaisyUI's native tab content switching)\r\n if (showContent) {\r\n return (\r\n <div role=\"tablist\" class={getContainerClasses()}>\r\n {props.tabs?.map(tab => [\r\n <input\r\n type=\"radio\"\r\n name={getTabGroupName()}\r\n class={`tab ${tab.disabled ? 'tab-disabled' : ''}`}\r\n aria-label={typeof tab.label === 'string' ? tab.label : tab.id}\r\n checked={props.activeTab === tab.id}\r\n disabled={tab.disabled}\r\n onChange={() => !tab.disabled && emit('change', tab.id)}\r\n />,\r\n <div class={getContentClasses()}>\r\n {tab.content}\r\n </div>\r\n ])}\r\n </div>\r\n );\r\n }\r\n \r\n // Without content, use simple button/link tabs\r\n return (\r\n <div role=\"tablist\" class={getContainerClasses()}>\r\n {props.tabs?.map(tab => (\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class={`tab ${props.activeTab === tab.id ? 'tab-active' : ''} ${tab.disabled ? 'tab-disabled' : ''}`}\r\n disabled={tab.disabled}\r\n onClick={() => !tab.disabled && emit('change', tab.id)}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n };\r\n});\r\n","import { component, compound, DefineProp, DefineSlot, DefineEvent, defineProvide, defineInjectable, DefineModel } from 'sigx';\r\n\r\nexport type MenuSize = 'xs' | 'sm' | 'md' | 'lg';\r\n\r\nconst menuSizeClasses: Record<MenuSize, string> = {\r\n xs: 'menu-xs',\r\n sm: 'menu-sm',\r\n md: '',\r\n lg: 'menu-lg'\r\n};\r\n\r\nexport type MenuProps = \r\n & DefineModel<string>\r\n & DefineProp<'size', MenuSize, false>\r\n & DefineProp<'horizontal', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>\r\n & DefineEvent<'update:modelValue', string>;\r\n\r\nexport type MenuItemProps =\r\n & DefineProp<'value', string, false>\r\n & DefineProp<'active', boolean, false>\r\n & DefineProp<'disabled', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\nexport type MenuTitleProps =\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n //const test = defineInjectable(() => { return { item: 'test'} });\r\ntype ItemGetter = (() => string) | undefined;\r\nconst test = defineInjectable((): { model: ItemGetter } => {\r\n return {\r\n model: undefined,\r\n };\r\n});\r\n\r\n/**\r\n * Menu item sub-component for use inside Menu.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu.Item value=\"home\"><a>Home</a></Menu.Item>\r\n * <Menu.Item disabled><a>Disabled</a></Menu.Item>\r\n * ```\r\n */\r\nconst MenuItem = component<MenuItemProps>(({ props, slots }) => {\r\n\r\n const me = test();\r\n \r\n const getClasses = () => {\r\n const classes: string[] = [];\r\n if (props.disabled) classes.push('disabled');\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ') || undefined;\r\n };\r\n\r\n const getAnchorClasses = () => {\r\n const classes: string[] = [];\r\n if (props.active) classes.push('active');\r\n return classes.join(' ') || undefined;\r\n };\r\n\r\n return () => (\r\n <li class={getClasses()} data-value={props.value}>\r\n {slots.default?.()}\r\n </li>\r\n );\r\n});\r\n\r\n/**\r\n * Menu title/header sub-component for grouping menu items.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu.Title>Category</Menu.Title>\r\n * ```\r\n */\r\nconst MenuTitle = component<MenuTitleProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['menu-title'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <li class={getClasses()}>\r\n {slots.default?.()}\r\n </li>\r\n );\r\n});\r\n\r\n\r\n\r\n/**\r\n * Menu component with DaisyUI styling. Supports compound sub-components.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Menu model={() => activeItem} size=\"lg\" class=\"bg-base-200 rounded-box w-56\">\r\n * <Menu.Title>Navigation</Menu.Title>\r\n * <Menu.Item value=\"home\"><a>Home</a></Menu.Item>\r\n * <Menu.Item value=\"about\"><a>About</a></Menu.Item>\r\n * <Menu.Item disabled><a>Disabled</a></Menu.Item>\r\n * </Menu>\r\n * ```\r\n */\r\nconst _Menu = component<MenuProps>(({ props, slots, emit }) => {\r\n\r\n const hepp = test();\r\n //hepp.model = props;\r\n \r\n \r\n \r\n const getClasses = () => {\r\n const classes = ['menu'];\r\n \r\n if (props.size) {\r\n const sizeClass = menuSizeClasses[props.size];\r\n if (sizeClass) classes.push(sizeClass);\r\n }\r\n \r\n if (props.horizontal) classes.push('menu-horizontal');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n const handleClick = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n const li = target.closest('li[data-value]');\r\n if (li) {\r\n const value = li.getAttribute('data-value');\r\n if (value && !li.classList.contains('disabled')) {\r\n emit('update:modelValue', value);\r\n }\r\n }\r\n };\r\n\r\n return () => (\r\n <ul class={getClasses()} onClick={handleClick}>\r\n {slots.default?.()}\r\n </ul>\r\n );\r\n});\r\n\r\n/**\r\n * Menu compound component with Item and Title sub-components.\r\n */\r\nexport const Menu = compound(_Menu, {\r\n Item: MenuItem,\r\n Title: MenuTitle,\r\n});\r\n","import { component, DefineProp, DefineSlot } from 'sigx';\r\n\r\nexport type DropdownPosition = 'end' | 'top' | 'bottom' | 'left' | 'right';\r\n\r\nexport type DropdownProps = \r\n & DefineProp<'position', DropdownPosition, false>\r\n & DefineProp<'hover', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineProp<'menuClass', string, false>\r\n & DefineSlot<'trigger'>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * Dropdown component with DaisyUI styling.\r\n * Uses slots for maximum flexibility - any component can be the trigger.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Dropdown\r\n * slots={{\r\n * trigger: () => <Button>Open Menu</Button>\r\n * }}\r\n * >\r\n * <a>Item 1</a>\r\n * <a>Item 2</a>\r\n * </Dropdown>\r\n * ```\r\n * \r\n * @example With Menu component\r\n * ```tsx\r\n * <Dropdown\r\n * position=\"end\"\r\n * slots={{\r\n * trigger: () => <Button variant=\"primary\">Actions</Button>\r\n * }}\r\n * >\r\n * <Menu class=\"w-52\">\r\n * <Menu.Item><a>Edit</a></Menu.Item>\r\n * <Menu.Item><a>Delete</a></Menu.Item>\r\n * </Menu>\r\n * </Dropdown>\r\n * ```\r\n */\r\nexport const Dropdown = component<DropdownProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['dropdown'];\r\n \r\n if (props.position === 'end') classes.push('dropdown-end');\r\n if (props.position === 'top') classes.push('dropdown-top');\r\n if (props.position === 'left') classes.push('dropdown-left');\r\n if (props.position === 'right') classes.push('dropdown-right');\r\n if (props.hover) classes.push('dropdown-hover');\r\n if (props.class) classes.push(props.class);\r\n \r\n return classes.join(' ');\r\n };\r\n\r\n const getMenuClasses = () => {\r\n const classes = ['dropdown-content', 'z-[1]', 'menu', 'p-2', 'shadow', 'bg-base-100', 'rounded-box'];\r\n if (props.menuClass) classes.push(props.menuClass);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.trigger && (\r\n <div tabIndex={0} role=\"button\">\r\n {slots.trigger()}\r\n </div>\r\n )}\r\n <ul tabIndex={0} class={getMenuClasses()}>\r\n {slots.default?.()}\r\n </ul>\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineModel, DefineSlot } from 'sigx';\r\n\r\nexport type DrawerProps = \r\n & DefineModel<boolean>\r\n & DefineProp<'side', 'left' | 'right', false>\r\n & DefineProp<'responsive', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>\r\n & DefineSlot<'side'>;\r\n\r\n/**\r\n * Drawer component with DaisyUI styling.\r\n * Slide-out side panel for navigation, filters, and mobile menus.\r\n * \r\n * @example\r\n * ```tsx\r\n * const open = signal(false);\r\n * <Drawer \r\n * model={open} \r\n * slots={{\r\n * side: () => <Menu items={navItems} />\r\n * }}\r\n * >\r\n * <main>Main content</main>\r\n * </Drawer>\r\n * ```\r\n */\r\nexport const Drawer = component<DrawerProps>(({ props, slots, emit }) => {\r\n const drawerId = `drawer-${Math.random().toString(36).slice(2)}`;\r\n\r\n const handleCheckboxChange = (e: Event) => {\r\n const checked = (e.target as HTMLInputElement).checked;\r\n if (props.model) props.model.value = checked;\r\n };\r\n\r\n return () => {\r\n const classes = ['drawer'];\r\n if (props.side === 'right') classes.push('drawer-end');\r\n if (props.responsive) classes.push('lg:drawer-open');\r\n if (props.class) classes.push(props.class);\r\n\r\n // Determine drawer side classes - add z-index for proper layering\r\n const drawerSideClasses = ['drawer-side', 'z-[999]'];\r\n // If not responsive, we need the drawer-side to respect the toggle\r\n // The DaisyUI CSS handles visibility via :checked ~ .drawer-side\r\n\r\n return (\r\n <div class={classes.join(' ')}>\r\n <input \r\n id={drawerId} \r\n type=\"checkbox\" \r\n class=\"drawer-toggle\" \r\n checked={props.model?.value ?? false}\r\n onChange={handleCheckboxChange}\r\n />\r\n <div class=\"drawer-content\">\r\n {slots.default?.()}\r\n </div>\r\n <div class={drawerSideClasses.join(' ')}>\r\n <label \r\n htmlFor={drawerId} \r\n aria-label=\"close sidebar\" \r\n class=\"drawer-overlay\"\r\n ></label>\r\n {slots.side?.()}\r\n </div>\r\n </div>\r\n );\r\n };\r\n});\r\n","import { component, DefineProp, DefineEvent } from 'sigx';\r\n\r\nexport interface BreadcrumbItem {\r\n id: string;\r\n label: string;\r\n href?: string;\r\n}\r\n\r\nexport type BreadcrumbsProps = \r\n & DefineProp<'items', BreadcrumbItem[]>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'navigate', string>;\r\n\r\n/**\r\n * Breadcrumbs component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * const items = [\r\n * { id: 'home', label: 'Home', href: '/' },\r\n * { id: 'docs', label: 'Docs', href: '/docs' },\r\n * { id: 'current', label: 'Current Page' }\r\n * ];\r\n * <Breadcrumbs items={items} onNavigate={(id) => navigate(id)} />\r\n * ```\r\n */\r\nexport const Breadcrumbs = component<BreadcrumbsProps>(({ props, emit }) => {\r\n const getClasses = () => {\r\n const classes = ['breadcrumbs', 'text-sm'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n <ul>\r\n {props.items?.map(item => (\r\n <li>\r\n <a onClick={() => emit('navigate', item.id)}>\r\n {item.label}\r\n </a>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineSlot } from 'sigx';\r\n\r\nexport type NavbarProps = \r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'start'>\r\n & DefineSlot<'center'>\r\n & DefineSlot<'end'>;\r\n\r\n/**\r\n * Navbar component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Navbar\r\n * slots={{\r\n * start: () => <a class=\"btn btn-ghost text-xl\">Logo</a>,\r\n * end: () => <Button>Login</Button>\r\n * }}\r\n * />\r\n * ```\r\n */\r\nexport const Navbar = component<NavbarProps>(({ props, slots }) => {\r\n const getClasses = () => {\r\n const classes = ['navbar', 'bg-base-100'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {slots.start && <div class=\"navbar-start\">{slots.start()}</div>}\r\n {slots.center && <div class=\"navbar-center\">{slots.center()}</div>}\r\n {slots.end && <div class=\"navbar-end\">{slots.end()}</div>}\r\n </div>\r\n );\r\n});\r\n","import { component, DefineProp, DefineEvent } from 'sigx';\r\n\r\nexport type PaginationProps = \r\n & DefineProp<'currentPage', number>\r\n & DefineProp<'totalPages', number>\r\n & DefineProp<'class', string, false>\r\n & DefineEvent<'change', number>;\r\n\r\n/**\r\n * Pagination component with DaisyUI styling.\r\n * \r\n * @example\r\n * ```tsx\r\n * <Pagination currentPage={1} totalPages={10} onChange={(page) => setPage(page)} />\r\n * ```\r\n */\r\nexport const Pagination = component<PaginationProps>(({ props, emit }) => {\r\n const getClasses = () => {\r\n const classes = ['join'];\r\n if (props.class) classes.push(props.class);\r\n return classes.join(' ');\r\n };\r\n\r\n const getPages = () => {\r\n const pages: (number | '...')[] = [];\r\n const current = props.currentPage ?? 1;\r\n const total = props.totalPages ?? 1;\r\n \r\n if (total <= 7) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n if (current <= 4) {\r\n for (let i = 1; i <= 5; i++) pages.push(i);\r\n pages.push('...');\r\n pages.push(total);\r\n } else if (current >= total - 3) {\r\n pages.push(1);\r\n pages.push('...');\r\n for (let i = total - 4; i <= total; i++) pages.push(i);\r\n } else {\r\n pages.push(1);\r\n pages.push('...');\r\n for (let i = current - 1; i <= current + 1; i++) pages.push(i);\r\n pages.push('...');\r\n pages.push(total);\r\n }\r\n }\r\n \r\n return pages;\r\n };\r\n\r\n return () => (\r\n <div class={getClasses()}>\r\n {getPages().map(page => \r\n page === '...' ? (\r\n <button class=\"join-item btn btn-disabled\">...</button>\r\n ) : (\r\n <button \r\n class={`join-item btn ${page === props.currentPage ? 'btn-active' : ''}`}\r\n onClick={() => emit('change', page)}\r\n >\r\n {page}\r\n </button>\r\n )\r\n )}\r\n </div>\r\n );\r\n});\r\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"theme-D9CUMvuT.js","names":[],"sources":["../src/theme/ThemeProvider.tsx"],"sourcesContent":["import { component, DefineProp, DefineSlot, signal } from 'sigx';\r\n\r\n/**\r\n * Built-in DaisyUI themes\r\n */\r\nexport type DaisyTheme = \r\n // Light themes\r\n | 'light'\r\n | 'cupcake'\r\n | 'bumblebee'\r\n | 'emerald'\r\n | 'corporate'\r\n | 'retro'\r\n | 'cyberpunk'\r\n | 'valentine'\r\n | 'garden'\r\n | 'lofi'\r\n | 'pastel'\r\n | 'fantasy'\r\n | 'wireframe'\r\n | 'cmyk'\r\n | 'autumn'\r\n | 'acid'\r\n | 'lemonade'\r\n | 'winter'\r\n | 'nord'\r\n // Dark themes\r\n | 'dark'\r\n | 'synthwave'\r\n | 'halloween'\r\n | 'forest'\r\n | 'aqua'\r\n | 'black'\r\n | 'luxury'\r\n | 'dracula'\r\n | 'business'\r\n | 'night'\r\n | 'coffee'\r\n | 'dim'\r\n | 'sunset';\r\n\r\n/**\r\n * Theme configuration options\r\n */\r\nexport interface ThemeConfig {\r\n /** Default theme to use */\r\n defaultTheme?: DaisyTheme | string;\r\n /** List of themes to include (for custom CSS generation) */\r\n themes?: (DaisyTheme | string)[];\r\n /** Whether to enable dark mode detection */\r\n darkMode?: boolean;\r\n /** Custom theme definitions */\r\n customThemes?: Record<string, Record<string, string>>;\r\n}\r\n\r\n/**\r\n * Get the current theme from the document\r\n */\r\nexport function getCurrentTheme(): string | null {\r\n if (typeof document === 'undefined') return null;\r\n return document.documentElement.getAttribute('data-theme');\r\n}\r\n\r\n/**\r\n * Set the theme on the document\r\n */\r\nexport function setTheme(theme: DaisyTheme | string): void {\r\n if (typeof document === 'undefined') return;\r\n document.documentElement.setAttribute('data-theme', theme);\r\n \r\n // Persist to localStorage\r\n if (typeof localStorage !== 'undefined') {\r\n localStorage.setItem('daisy-theme', theme);\r\n }\r\n}\r\n\r\n/**\r\n * Get the preferred theme from localStorage or system preference\r\n */\r\nexport function getPreferredTheme(defaultTheme: DaisyTheme | string = 'light'): DaisyTheme | string {\r\n if (typeof window === 'undefined') return defaultTheme;\r\n \r\n // Check localStorage first\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (stored) return stored;\r\n \r\n // Check system preference\r\n if (window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\r\n return 'dark';\r\n }\r\n \r\n return defaultTheme;\r\n}\r\n\r\n/**\r\n * Initialize theme based on user preference or default\r\n */\r\nexport function initializeTheme(config?: ThemeConfig): void {\r\n const theme = getPreferredTheme(config?.defaultTheme);\r\n setTheme(theme);\r\n \r\n // Listen for system theme changes if darkMode is enabled\r\n if (config?.darkMode && typeof window !== 'undefined') {\r\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\r\n // Only auto-switch if user hasn't manually selected a theme\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (!stored) {\r\n setTheme(e.matches ? 'dark' : (config.defaultTheme ?? 'light'));\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Toggle between light and dark themes\r\n */\r\nexport function toggleDarkMode(lightTheme: DaisyTheme = 'light', darkTheme: DaisyTheme = 'dark'): void {\r\n const current = getCurrentTheme();\r\n setTheme(current === darkTheme ? lightTheme : darkTheme);\r\n}\r\n\r\n// ============================================\r\n// ThemeProvider Component\r\n// ============================================\r\n\r\nexport type ThemeProviderProps = \r\n & DefineProp<'theme', DaisyTheme | string, false>\r\n & DefineProp<'defaultTheme', DaisyTheme | string, false>\r\n & DefineProp<'darkMode', boolean, false>\r\n & DefineProp<'class', string, false>\r\n & DefineSlot<'default'>;\r\n\r\n/**\r\n * ThemeProvider component that wraps your app and manages theme state.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeProvider defaultTheme=\"cupcake\" darkMode>\r\n * <App />\r\n * </ThemeProvider>\r\n * ```\r\n */\r\nexport const ThemeProvider = component<ThemeProviderProps>(({ props, slots }) => {\r\n // Initialize theme on mount\r\n if (typeof document !== 'undefined') {\r\n const theme = props.theme ?? getPreferredTheme(props.defaultTheme);\r\n setTheme(theme);\r\n \r\n // Set up dark mode listener if enabled\r\n if (props.darkMode && typeof window !== 'undefined') {\r\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\r\n const stored = localStorage.getItem('daisy-theme');\r\n if (!stored) {\r\n setTheme(e.matches ? 'dark' : (props.defaultTheme ?? 'light'));\r\n }\r\n });\r\n }\r\n }\r\n\r\n return () => (\r\n <div class={props.class}>\r\n {slots.default?.()}\r\n </div>\r\n );\r\n});\r\n\r\n// ============================================\r\n// ThemeSelector Component\r\n// ============================================\r\n\r\nexport type ThemeSelectorProps = \r\n & DefineProp<'themes', (DaisyTheme | string)[], false>\r\n & DefineProp<'class', string, false>;\r\n\r\nconst defaultThemes: DaisyTheme[] = [\r\n 'light', 'dark', 'cupcake', 'bumblebee', 'emerald', 'corporate', \r\n 'synthwave', 'retro', 'cyberpunk', 'valentine', 'halloween', \r\n 'garden', 'forest', 'aqua', 'lofi', 'pastel', 'fantasy', \r\n 'wireframe', 'black', 'luxury', 'dracula', 'cmyk', 'autumn',\r\n 'business', 'acid', 'lemonade', 'night', 'coffee', 'winter',\r\n 'dim', 'nord', 'sunset'\r\n];\r\n\r\n/**\r\n * A dropdown selector for switching themes.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeSelector themes={['light', 'dark', 'cupcake', 'cyberpunk']} />\r\n * ```\r\n */\r\nexport const ThemeSelector = component<ThemeSelectorProps>(({ props }) => {\r\n const themes = () => props.themes ?? defaultThemes;\r\n \r\n const handleChange = (e: Event) => {\r\n const select = e.target as HTMLSelectElement;\r\n setTheme(select.value);\r\n };\r\n\r\n const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\r\n\r\n return () => (\r\n <select \r\n class={`select select-bordered ${props.class ?? ''}`}\r\n onChange={handleChange}\r\n value={getCurrentTheme() ?? 'light'}\r\n >\r\n {themes().map(theme => (\r\n <option value={theme}>{capitalize(theme)}</option>\r\n ))}\r\n </select>\r\n );\r\n});\r\n\r\n// ============================================\r\n// ThemeToggle Component (Light/Dark toggle)\r\n// ============================================\r\n\r\nexport type ThemeToggleProps = \r\n & DefineProp<'lightTheme', DaisyTheme | string, false>\r\n & DefineProp<'darkTheme', DaisyTheme | string, false>\r\n & DefineProp<'class', string, false>;\r\n\r\n/**\r\n * A toggle button for switching between light and dark themes.\r\n * \r\n * @example\r\n * ```tsx\r\n * <ThemeToggle lightTheme=\"light\" darkTheme=\"dark\" />\r\n * ```\r\n */\r\nexport const ThemeToggle = component<ThemeToggleProps>(({ props }) => {\r\n const lightTheme = () => props.lightTheme ?? 'light';\r\n const darkTheme = () => props.darkTheme ?? 'dark';\r\n \r\n // Use a signal to track theme state for reactivity\r\n const isDark = signal(getCurrentTheme() === (props.darkTheme ?? 'dark'));\r\n \r\n const handleToggle = () => {\r\n toggleDarkMode(lightTheme() as DaisyTheme, darkTheme() as DaisyTheme);\r\n // Update the signal to trigger re-render\r\n isDark.value = getCurrentTheme() === darkTheme();\r\n };\r\n\r\n return () => (\r\n <button \r\n class={props.class ?? 'btn btn-ghost btn-circle text-base-content'}\r\n onClick={handleToggle}\r\n aria-label=\"Toggle theme\"\r\n >\r\n {isDark.value ? (\r\n /* Sun icon - show in dark mode to switch to light */\r\n <svg \r\n class=\"w-6 h-6\" \r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z\"/>\r\n </svg>\r\n ) : (\r\n /* Moon icon - show in light mode to switch to dark */\r\n <svg \r\n class=\"w-6 h-6\" \r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z\"/>\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n});\r\n"],"mappings":"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"}
|