@moondreamsdev/dreamer-ui 1.7.18 → 1.7.19-test.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs.js","sources":["../src/components/accordion/AccordionItem.tsx","../src/components/accordion/Accordion.tsx","../src/components/avatar/icons.tsx","../src/components/avatar/variants.ts","../src/components/avatar/Avatar.tsx","../src/components/badge/variants.ts","../src/components/badge/Badge.tsx","../src/components/button/LoadingDots.tsx","../src/components/button/variants.ts","../src/components/button/Button.tsx","../src/components/calendar/hooks.ts","../src/components/calendar/variants.ts","../src/components/calendar/Calendar.tsx","../src/components/callout/variants.ts","../src/components/callout/Callout.tsx","../src/components/card/variants.ts","../src/components/card/Card.tsx","../src/components/carousel/hooks.ts","../src/components/carousel/variants.ts","../src/components/carousel/Carousel.tsx","../src/components/checkbox/hooks.ts","../src/components/checkbox/Checkbox.tsx","../src/components/clickable/Clickable.tsx","../src/components/code/hooks.ts","../src/components/code/variants.ts","../src/components/code/Code.tsx","../src/components/code-block/classes.ts","../src/components/code-block/constants.ts","../src/components/code-block/tokenize.ts","../src/components/code-block/format.tsx","../src/components/code-block/hooks.ts","../src/components/code-block/util.ts","../src/components/code-block/CodeBlock.tsx","../src/components/disclosure/Disclosure.tsx","../src/components/drawer/hooks.ts","../src/components/drawer/Drawer.tsx","../src/components/popover/hooks.ts","../src/components/popover/variants.ts","../src/components/popover/Popover.tsx","../src/components/dropdown-menu/DropdownMenuOption.tsx","../src/components/dropdown-menu/DropdownMenuSub.tsx","../src/components/dropdown-menu/DropdownMenuBody.tsx","../src/components/dropdown-menu/hooks.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/dropdown-menu/factories.ts","../src/components/dynamic-list/hooks.ts","../src/components/dynamic-list/variants.ts","../src/components/dynamic-list/markers.tsx","../src/components/dynamic-list/DynamicList.tsx","../src/components/error-boundary/variants.ts","../src/components/error-boundary/ErrorBoundary.tsx","../src/components/form/factories.ts","../src/components/form/hooks.ts","../src/components/form/variants.ts","../src/components/label/Label.tsx","../src/shared/forms/StatusHelpMessage.tsx","../src/components/input/variants.ts","../src/components/input/Input.tsx","../src/components/textarea/CharacterCount.tsx","../src/components/textarea/hooks.ts","../src/components/textarea/variants.ts","../src/components/textarea/Textarea.tsx","../src/components/select/hooks.ts","../src/components/select/variants.ts","../src/components/scroll-area/hooks.ts","../src/components/scroll-area/ScrollArea.tsx","../src/components/select/Select.tsx","../src/components/radiogroup/RadioInput.tsx","../src/components/radiogroup/RadioGroupItem.tsx","../src/components/radiogroup/hooks.ts","../src/components/radiogroup/RadioGroup.tsx","../src/components/form/Form.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/help-icon/HelpIcon.tsx","../src/components/modal/hooks.ts","../src/components/modal/Modal.tsx","../src/components/pagination/variants.ts","../src/components/pagination/Pagination.tsx","../src/components/panel/hooks.ts","../src/components/panel/Panel.tsx","../src/components/separator/variants.ts","../src/components/separator/Separator.tsx","../src/components/skeleton/variants.ts","../src/components/skeleton/Skeleton.tsx","../src/components/slider/Slider.tsx","../src/components/table/hooks.ts","../src/components/table/variants.ts","../src/components/table/Table.tsx","../src/components/tabs/hooks.ts","../src/components/tabs/Tabs.tsx","../src/components/tabs/TabsContent.tsx","../src/components/tabs/variants.ts","../src/components/tabs/TabsList.tsx","../src/components/tabs/TabsTrigger.tsx","../src/components/toggle/variants.ts","../src/components/toggle/Toggle.tsx"],"sourcesContent":["import { useId } from 'react';\nimport { ChevronDown } from '../../symbols';\nimport { join } from '../../utils';\nimport { AccordionOption } from './Accordion';\n\nexport interface AccordionItemProps extends Omit<AccordionOption, 'defaultOpen'> {\n /** Content to render inside the accordion item. */\n children?: React.ReactNode;\n /** Additional CSS classes to apply to the accordion item. */\n className?: string;\n /** Whether the accordion item is currently open. */\n isOpen?: boolean;\n /** Callback function called when the accordion item is toggled. */\n onToggle?: () => void;\n /** Additional CSS classes to apply to the trigger button. */\n triggerClassName?: string;\n /** Additional CSS classes to apply to the content body. */\n bodyClassName?: string;\n}\n\n/**\n * Individual accordion item component with expandable content.\n * Provides keyboard navigation and accessibility features.\n * \n * @example\n * ```tsx\n * <AccordionItem\n * title=\"FAQ Question\"\n * content=\"This is the answer to the question\"\n * isOpen={false}\n * onToggle={() => console.log('toggled')}\n * />\n * ```\n */\nexport function AccordionItem({\n id,\n title,\n content,\n children,\n className = '',\n disabled = false,\n isOpen = false,\n onToggle,\n triggerClassName = '',\n bodyClassName = '',\n}: AccordionItemProps) {\n const fallbackId = useId();\n const itemId = id || `accordion-item-${fallbackId}`;\n const headerId = `${itemId}-header`;\n const panelId = `${itemId}-panel`;\n\n const handleToggle = () => {\n if (!disabled && onToggle) {\n onToggle();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <div className={join('border-b border-gray-200', disabled && 'opacity-60 cursor-not-allowed', className)}>\n <button\n id={headerId}\n type='button'\n className={join(\n 'w-full text-left py-3 px-4 flex justify-between items-center focus:outline focus:outline-secondary',\n disabled ? 'cursor-not-allowed' : 'hover:bg-gray-50/10 cursor-pointer',\n triggerClassName\n )}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n >\n <span>{title}</span>\n <span\n className={join(\n 'transform transition-transform duration-300 ease-linear',\n isOpen ? 'rotate-180' : 'rotate-0'\n )}\n aria-hidden='true'\n >\n <ChevronDown size={18} />\n </span>\n </button>\n\n <div\n id={panelId}\n role='region'\n aria-labelledby={headerId}\n className={join(\n 'transition-all duration-300 ease-linear px-4',\n isOpen ? 'max-h-96 opacity-100 overflow-auto py-3' : 'max-h-0 opacity-0 overflow-hidden',\n bodyClassName\n )}\n >\n {isOpen && (children || content)}\n </div>\n </div>\n );\n}\n","import React, { useId, useState } from 'react';\nimport { join } from '../../utils';\nimport { AccordionItem, AccordionItemProps } from './AccordionItem';\n\nexport interface AccordionOption {\n\t/** Unique identifier for the accordion item. */\n\tid?: string;\n\t/** The title/header content for the accordion item. */\n\ttitle: React.ReactNode;\n\t/** The main content that will be shown when the item is expanded. */\n\tcontent: React.ReactNode;\n\t/** Whether the accordion item is disabled and cannot be toggled. */\n\tdisabled?: boolean;\n\t/** Whether the accordion item should be open by default. */\n\tdefaultOpen?: boolean;\n}\n\nexport interface AccordionProps {\n\t/** Unique identifier for the accordion container. */\n\tid?: string;\n\t/** Array of accordion items with id, title, content, and optional disabled state. */\n\titems?: AccordionOption[];\n\t/** AccordionItem components when using the component approach. */\n\tchildren?: React.ReactElement<AccordionItemProps>[] | React.ReactElement<AccordionItemProps>;\n\t/** Additional CSS classes to apply to the accordion container. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to individual accordion items. */\n\titemClassName?: string;\n\t/** Whether multiple items can be open simultaneously. */\n\tallowMultiple?: boolean;\n\t/** Array of item IDs that should be open by default. */\n\tdefaultOpenItems?: string[];\n\t/** Additional CSS classes to apply to all trigger buttons. */\n\ttriggersClassName?: string;\n\t/** Additional CSS classes to apply to all content bodies. */\n\tbodiesClassName?: string;\n}\n\n/**\n * A flexible accordion component that supports expandable/collapsible content sections.\n * Can be used either with an items array or with AccordionItem child components.\n *\n * @example\n * ```tsx\n * // Using items prop\n * <Accordion\n * items={[\n * { id: \"1\", title: \"Section 1\", content: \"Content here\" },\n * { id: \"2\", title: \"Section 2\", content: \"More content\" }\n * ]}\n * allowMultiple={false}\n * />\n *\n * // Using children\n * <Accordion allowMultiple>\n * <AccordionItem title=\"Custom Section\" content=\"Custom content\" />\n * <AccordionItem title=\"Another Section\" content=\"Another content\" />\n * </Accordion>\n * ```\n */\nexport function Accordion({\n\tid,\n\titems = [],\n\tchildren,\n\tclassName = '',\n\titemClassName = '',\n\tallowMultiple = false,\n\tdefaultOpenItems = [],\n\ttriggersClassName = '',\n\tbodiesClassName = '',\n}: AccordionProps) {\n\tconst groupId = useId();\n\tconst groupName = id || `accordion-group-${groupId}`;\n\tconst [openItems, setOpenItems] = useState<Set<string>>(new Set(defaultOpenItems));\n\n\tconst toggleItem = (itemId: string) => {\n\t\tsetOpenItems((prev) => {\n\t\t\tconst newOpenItems = new Set(prev);\n\n\t\t\tif (newOpenItems.has(itemId)) {\n\t\t\t\tnewOpenItems.delete(itemId);\n\t\t\t} else {\n\t\t\t\tif (!allowMultiple) {\n\t\t\t\t\tnewOpenItems.clear();\n\t\t\t\t}\n\t\t\t\tnewOpenItems.add(itemId);\n\t\t\t}\n\n\t\t\treturn newOpenItems;\n\t\t});\n\t};\n\n\tconst getItemId = (index: number) => `${groupId}-item-${index}`;\n\tconst isItemOpen = (itemId: string) => openItems.has(itemId);\n\n\treturn (\n\t\t<div id={groupName} className={className}>\n\t\t\t{/* Render from items prop */}\n\t\t\t{items.length > 0 &&\n\t\t\t\titems.map((item, index) => {\n\t\t\t\t\tconst itemId = item.id || getItemId(index);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\tkey={itemId}\n\t\t\t\t\t\t\tid={itemId}\n\t\t\t\t\t\t\ttitle={item.title}\n\t\t\t\t\t\t\tcontent={item.content}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\tisOpen={isItemOpen(itemId)}\n\t\t\t\t\t\t\tonToggle={() => toggleItem(itemId)}\n\t\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\t\ttriggerClassName={triggersClassName}\n\t\t\t\t\t\t\tbodyClassName={bodiesClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\n\t\t\t{/* Render AccordionItem components */}\n\t\t\t{items.length === 0 &&\n\t\t\t\tchildren &&\n\t\t\t\tReact.Children.map(children, (child, index) => {\n\t\t\t\t\tif (React.isValidElement<AccordionItemProps>(child) && child.type === AccordionItem) {\n\t\t\t\t\t\tconst itemId = child.props.id || getItemId(index);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\t\t{...child.props}\n\t\t\t\t\t\t\t\tkey={itemId}\n\t\t\t\t\t\t\t\tid={itemId}\n\t\t\t\t\t\t\t\tclassName={join(itemClassName, child.props.className)}\n\t\t\t\t\t\t\t\tisOpen={isItemOpen(itemId)}\n\t\t\t\t\t\t\t\tonToggle={() => toggleItem(itemId)}\n\t\t\t\t\t\t\t\ttriggerClassName={join(triggersClassName, child.props.triggerClassName)}\n\t\t\t\t\t\t\t\tbodyClassName={join(bodiesClassName, child.props.bodyClassName)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t})}\n\t\t</div>\n\t);\n}\n","interface AvatarIconProps {\n\tsize: string;\n}\n\n// Astronaut Avatar\nexport function AstronautAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Helmet */}\n\t\t\t<circle cx='50' cy='40' r='32' fill='url(#astronautHelmet)' stroke='#4F46E5' strokeWidth='2' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='50' cy='40' r='24' fill='#FED7AA' />\n\t\t\t{/* Eyes */}\n\t\t\t<circle cx='43' cy='36' r='3' fill='#1F2937' />\n\t\t\t<circle cx='57' cy='36' r='3' fill='#1F2937' />\n\t\t\t{/* Mouth */}\n\t\t\t<path d='M46 46 Q50 50 54 46' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t{/* Body */}\n\t\t\t<rect x='38' y='65' width='24' height='30' rx='12' fill='#E5E7EB' />\n\t\t\t{/* Chest panel */}\n\t\t\t<rect x='44' y='70' width='12' height='8' rx='2' fill='#6366F1' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='astronautHelmet' cx='50%' cy='30%' r='70%'>\n\t\t\t\t\t<stop stopColor='#DBEAFE' />\n\t\t\t\t\t<stop offset='1' stopColor='#93C5FD' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Moon Avatar\nexport function MoonAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Moon body */}\n\t\t\t<circle cx='50' cy='50' r='40' fill='url(#moonGradient)' />\n\t\t\t{/* Craters */}\n\t\t\t<circle cx='38' cy='35' r='4' fill='#D1D5DB' />\n\t\t\t<circle cx='65' cy='42' r='3' fill='#D1D5DB' />\n\t\t\t<circle cx='42' cy='65' r='5' fill='#D1D5DB' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='45' cy='45' r='2.5' fill='#1F2937' />\n\t\t\t<circle cx='58' cy='45' r='2.5' fill='#1F2937' />\n\t\t\t<path d='M47 55 Q52 60 57 55' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='moonGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#F9FAFB' />\n\t\t\t\t\t<stop offset='1' stopColor='#E5E7EB' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Star Avatar\nexport function StarAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Star shape */}\n\t\t\t<path d='M50 15 L58 38 L82 38 L64 52 L72 75 L50 61 L28 75 L36 52 L18 38 L42 38 Z' fill='url(#starGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='44' cy='42' r='2' fill='#1F2937' />\n\t\t\t<circle cx='56' cy='42' r='2' fill='#1F2937' />\n\t\t\t<path d='M46 50 Q50 54 54 50' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t{/* Sparkles */}\n\t\t\t<circle cx='65' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='35' cy='30' r='1' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='starGradient' cx='50%' cy='40%' r='60%'>\n\t\t\t\t\t<stop stopColor='#FEF3C7' />\n\t\t\t\t\t<stop offset='1' stopColor='#FCD34D' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Galaxy Avatar\nexport function GalaxyAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Galaxy spiral */}\n\t\t\t<circle cx='50' cy='50' r='38' fill='url(#galaxyGradient)' />\n\t\t\t{/* Spiral arms */}\n\t\t\t<path d='M20 50 Q35 30 50 50 Q65 70 80 50' stroke='#8B5CF6' strokeWidth='3' opacity='0.7' />\n\t\t\t<path d='M50 20 Q70 35 50 50 Q30 65 50 80' stroke='#A78BFA' strokeWidth='2' opacity='0.5' />\n\t\t\t{/* Center face */}\n\t\t\t<circle cx='50' cy='50' r='12' fill='#1E1B4B' />\n\t\t\t<circle cx='46' cy='47' r='1.5' fill='#E0E7FF' />\n\t\t\t<circle cx='54' cy='47' r='1.5' fill='#E0E7FF' />\n\t\t\t<path d='M47 53 Q50 56 53 53' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='30' cy='25' r='1' fill='#FFF' />\n\t\t\t<circle cx='75' cy='70' r='1.5' fill='#FFF' />\n\t\t\t<circle cx='25' cy='75' r='1' fill='#FFF' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='galaxyGradient' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#4C1D95' />\n\t\t\t\t\t<stop offset='0.5' stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E1B4B' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Nebula Avatar\nexport function NebulaAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Nebula clouds */}\n\t\t\t<ellipse cx='50' cy='50' rx='35' ry='30' fill='url(#nebulaGradient)' opacity='0.8' />\n\t\t\t<ellipse cx='40' cy='45' rx='20' ry='25' fill='url(#nebulaPink)' opacity='0.6' />\n\t\t\t<ellipse cx='60' cy='55' rx='25' ry='20' fill='url(#nebulaBlue)' opacity='0.6' />\n\t\t\t{/* Face in the center */}\n\t\t\t<circle cx='50' cy='50' r='15' fill='#312E81' opacity='0.9' />\n\t\t\t<circle cx='46' cy='47' r='2' fill='#E0E7FF' />\n\t\t\t<circle cx='54' cy='47' r='2' fill='#E0E7FF' />\n\t\t\t<path d='M47 53 Q50 56 53 53' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Twinkling stars */}\n\t\t\t<circle cx='25' cy='30' r='1' fill='#FFF' opacity='0.9' />\n\t\t\t<circle cx='75' cy='25' r='1.5' fill='#FFF' opacity='0.8' />\n\t\t\t<circle cx='30' cy='75' r='1' fill='#FFF' opacity='0.9' />\n\t\t\t<circle cx='70' cy='75' r='1.5' fill='#FFF' opacity='0.7' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='nebulaGradient' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='1' stopColor='#312E81' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id='nebulaPink' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#F472B6' />\n\t\t\t\t\t<stop offset='1' stopColor='#BE185D' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id='nebulaBlue' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#3B82F6' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E40AF' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Planet Avatar\nexport function PlanetAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Planet body */}\n\t\t\t<circle cx='50' cy='50' r='32' fill='url(#planetGradient)' />\n\t\t\t{/* Ring */}\n\t\t\t<ellipse cx='50' cy='50' rx='45' ry='8' fill='none' stroke='#A78BFA' strokeWidth='2' opacity='0.7' />\n\t\t\t{/* Surface details */}\n\t\t\t<circle cx='38' cy='40' r='5' fill='#065F46' opacity='0.6' />\n\t\t\t<circle cx='62' cy='45' r='4' fill='#065F46' opacity='0.6' />\n\t\t\t<circle cx='45' cy='62' r='3' fill='#065F46' opacity='0.6' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='46' cy='48' r='2.5' fill='#1F2937' />\n\t\t\t<circle cx='54' cy='48' r='2.5' fill='#1F2937' />\n\t\t\t<path d='M47 55 Q50 58 53 55' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='planetGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#A7F3D0' />\n\t\t\t\t\t<stop offset='0.6' stopColor='#34D399' />\n\t\t\t\t\t<stop offset='1' stopColor='#059669' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Cosmic Cat Avatar\nexport function CosmicCatAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Cat head */}\n\t\t\t<circle cx='50' cy='55' r='28' fill='url(#catGradient)' />\n\t\t\t{/* Ears */}\n\t\t\t<path d='M28 40 L38 25 L42 45 Z' fill='#6366F1' />\n\t\t\t<path d='M58 45 L62 25 L72 40 Z' fill='#6366F1' />\n\t\t\t{/* Inner ears */}\n\t\t\t<path d='M32 38 L36 30 L38 40 Z' fill='#EC4899' />\n\t\t\t<path d='M62 40 L64 30 L68 38 Z' fill='#EC4899' />\n\t\t\t{/* Eyes */}\n\t\t\t<ellipse cx='43' cy='50' rx='4' ry='6' fill='#FCD34D' />\n\t\t\t<ellipse cx='57' cy='50' rx='4' ry='6' fill='#FCD34D' />\n\t\t\t<ellipse cx='43' cy='52' rx='1.5' ry='4' fill='#1F2937' />\n\t\t\t<ellipse cx='57' cy='52' rx='1.5' ry='4' fill='#1F2937' />\n\t\t\t{/* Nose */}\n\t\t\t<path d='M48 58 L50 60 L52 58 Z' fill='#EC4899' />\n\t\t\t{/* Mouth */}\n\t\t\t<path d='M50 60 Q46 64 42 62' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t<path d='M50 60 Q54 64 58 62' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Whiskers */}\n\t\t\t<line x1='25' y1='55' x2='35' y2='57' stroke='#1F2937' strokeWidth='1' />\n\t\t\t<line x1='65' y1='57' x2='75' y2='55' stroke='#1F2937' strokeWidth='1' />\n\t\t\t{/* Stars around */}\n\t\t\t<circle cx='20' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='80' cy='30' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='15' cy='70' r='1' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='catGradient' cx='50%' cy='40%' r='70%'>\n\t\t\t\t\t<stop stopColor='#A78BFA' />\n\t\t\t\t\t<stop offset='1' stopColor='#6366F1' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Dream Cloud Avatar\nexport function DreamCloudAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Cloud body */}\n\t\t\t<circle cx='35' cy='55' r='18' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='55' cy='50' r='22' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='45' cy='65' r='15' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='65' cy='60' r='16' fill='url(#cloudGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='48' cy='52' r='2.5' fill='#6366F1' />\n\t\t\t<circle cx='56' cy='52' r='2.5' fill='#6366F1' />\n\t\t\t<path d='M49 58 Q52 62 55 58' stroke='#6366F1' strokeWidth='2' fill='none' />\n\t\t\t{/* Dream bubbles */}\n\t\t\t<circle cx='70' cy='35' r='3' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t<circle cx='78' cy='28' r='2' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t<circle cx='83' cy='20' r='1.5' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t{/* Stars in bubbles */}\n\t\t\t<circle cx='70' cy='35' r='0.5' fill='#FCD34D' />\n\t\t\t<circle cx='78' cy='28' r='0.5' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='cloudGradient' cx='50%' cy='40%' r='70%'>\n\t\t\t\t\t<stop stopColor='#F8FAFC' />\n\t\t\t\t\t<stop offset='1' stopColor='#E2E8F0' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Rocket Avatar\nexport function RocketAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Rocket body */}\n\t\t\t<ellipse cx='50' cy='45' rx='15' ry='30' fill='url(#rocketGradient)' />\n\t\t\t{/* Nose cone */}\n\t\t\t<path d='M35 20 L50 10 L65 20 L50 25 Z' fill='#EF4444' />\n\t\t\t{/* Window */}\n\t\t\t<circle cx='50' cy='35' r='8' fill='#DBEAFE' stroke='#2563EB' strokeWidth='2' />\n\t\t\t{/* Face inside window */}\n\t\t\t<circle cx='47' cy='33' r='1.5' fill='#1F2937' />\n\t\t\t<circle cx='53' cy='33' r='1.5' fill='#1F2937' />\n\t\t\t<path d='M48 37 Q50 39 52 37' stroke='#1F2937' strokeWidth='1' fill='none' />\n\t\t\t{/* Fins */}\n\t\t\t<path d='M35 60 L25 70 L35 75 Z' fill='#6B7280' />\n\t\t\t<path d='M65 60 L75 70 L65 75 Z' fill='#6B7280' />\n\t\t\t{/* Exhaust */}\n\t\t\t<ellipse cx='50' cy='80' rx='8' ry='12' fill='#F59E0B' />\n\t\t\t<ellipse cx='50' cy='82' rx='5' ry='8' fill='#EF4444' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='25' cy='20' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='75' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='rocketGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#E5E7EB' />\n\t\t\t\t\t<stop offset='1' stopColor='#9CA3AF' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Constellation Avatar\nexport function ConstellationAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Background circle */}\n\t\t\t<circle cx='50' cy='50' r='38' fill='url(#constellationBg)' opacity='0.8' />\n\t\t\t{/* Constellation stars */}\n\t\t\t<circle cx='35' cy='25' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='50' cy='30' r='2.5' fill='#FCD34D' />\n\t\t\t<circle cx='65' cy='35' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='30' cy='50' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='70' cy='50' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='40' cy='70' r='2.5' fill='#FCD34D' />\n\t\t\t<circle cx='60' cy='75' r='1.5' fill='#FCD34D' />\n\t\t\t{/* Connection lines */}\n\t\t\t<line x1='35' y1='25' x2='50' y2='30' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='50' y1='30' x2='65' y2='35' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='30' y1='50' x2='50' y2='30' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='50' y1='30' x2='70' y2='50' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='30' y1='50' x2='40' y2='70' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='70' y1='50' x2='60' y2='75' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t{/* Face in center */}\n\t\t\t<circle cx='48' cy='48' r='2' fill='#E0E7FF' />\n\t\t\t<circle cx='52' cy='48' r='2' fill='#E0E7FF' />\n\t\t\t<path d='M48 54 Q50 56 52 54' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='constellationBg' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#1E1B4B' />\n\t\t\t\t\t<stop offset='1' stopColor='#0F0D2A' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Comet Avatar\nexport function CometAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Comet head */}\n\t\t\t<circle cx='35' cy='35' r='18' fill='url(#cometGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='31' cy='31' r='2' fill='#1F2937' />\n\t\t\t<circle cx='39' cy='31' r='2' fill='#1F2937' />\n\t\t\t<path d='M32 38 Q35 41 38 38' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Tail */}\n\t\t\t<path d='M50 50 Q65 65 85 85' stroke='url(#tailGradient1)' strokeWidth='8' opacity='0.7' />\n\t\t\t<path d='M48 52 Q60 68 75 88' stroke='url(#tailGradient2)' strokeWidth='6' opacity='0.5' />\n\t\t\t<path d='M52 48 Q70 62 90 82' stroke='url(#tailGradient3)' strokeWidth='4' opacity='0.3' />\n\t\t\t{/* Sparkles */}\n\t\t\t<circle cx='60' cy='60' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='70' cy='70' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='80' cy='80' r='0.8' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='cometGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#FEF3C7' />\n\t\t\t\t\t<stop offset='1' stopColor='#F59E0B' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<linearGradient id='tailGradient1' x1='50%' y1='50%' x2='85%' y2='85%'>\n\t\t\t\t\t<stop stopColor='#FCD34D' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t\t<linearGradient id='tailGradient2' x1='48%' y1='52%' x2='75%' y2='88%'>\n\t\t\t\t\t<stop stopColor='#F472B6' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t\t<linearGradient id='tailGradient3' x1='52%' y1='48%' x2='90%' y2='82%'>\n\t\t\t\t\t<stop stopColor='#A78BFA' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Twilight Avatar\nexport function TwilightAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Sky background */}\n\t\t\t<circle cx='50' cy='50' r='40' fill='url(#twilightGradient)' />\n\t\t\t{/* Silhouette */}\n\t\t\t<ellipse cx='50' cy='65' rx='25' ry='15' fill='#1F2937' opacity='0.8' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='30' cy='25' r='1.5' fill='#FFF' />\n\t\t\t<circle cx='70' cy='30' r='1' fill='#FFF' />\n\t\t\t<circle cx='40' cy='35' r='1.2' fill='#FFF' />\n\t\t\t<circle cx='60' cy='25' r='0.8' fill='#FFF' />\n\t\t\t{/* Moon crescent */}\n\t\t\t<path d='M20 40 Q15 35 20 30 Q25 35 20 40' fill='#FCD34D' />\n\t\t\t{/* Face in silhouette */}\n\t\t\t<circle cx='47' cy='62' r='1.5' fill='#E0E7FF' />\n\t\t\t<circle cx='53' cy='62' r='1.5' fill='#E0E7FF' />\n\t\t\t<path d='M48 67 Q50 69 52 67' stroke='#E0E7FF' strokeWidth='1' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='twilightGradient' cx='50%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='0.7' stopColor='#3730A3' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E1B4B' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Export preset mapping\nexport const AvatarPresets = {\n\tastronaut: AstronautAvatar,\n\tmoon: MoonAvatar,\n\tstar: StarAvatar,\n\tgalaxy: GalaxyAvatar,\n\tnebula: NebulaAvatar,\n\tplanet: PlanetAvatar,\n\t'cosmic-cat': CosmicCatAvatar,\n\t'dream-cloud': DreamCloudAvatar,\n\trocket: RocketAvatar,\n\tconstellation: ConstellationAvatar,\n\tcomet: CometAvatar,\n\ttwilight: TwilightAvatar,\n};\n","export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\nexport type AvatarShape = 'circle' | 'square';\nexport type AvatarPreset =\n\t| 'astronaut'\n\t| 'moon'\n\t| 'star'\n\t| 'galaxy'\n\t| 'nebula'\n\t| 'planet'\n\t| 'cosmic-cat'\n\t| 'dream-cloud'\n\t| 'rocket'\n\t| 'constellation'\n\t| 'comet'\n\t| 'twilight';\n\nexport const AvatarSizes: Record<AvatarSize, { size: string; iconSize: string }> = {\n\txs: { size: 'w-8 h-8', iconSize: '24' },\n\tsm: { size: 'w-10 h-10', iconSize: '32' },\n\tmd: { size: 'w-12 h-12', iconSize: '40' },\n\tlg: { size: 'w-16 h-16', iconSize: '56' },\n\txl: { size: 'w-20 h-20', iconSize: '72' },\n\t'2xl': { size: 'w-24 h-24', iconSize: '88' },\n};\n\nexport const AvatarShapes: Record<AvatarShape, string> = {\n\tcircle: 'rounded-full',\n\tsquare: 'rounded-lg',\n};\n","import React from 'react';\nimport { join } from '../../utils';\nimport { AvatarPresets } from './icons';\nimport { AvatarPreset, AvatarShape, AvatarShapes, AvatarSize, AvatarSizes } from './variants';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n\t/** The HTML id attribute for the avatar */\n\tid?: string;\n\t/** Reference to the avatar element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The size of the avatar */\n\tsize?: AvatarSize;\n\t/** The shape of the avatar */\n\tshape?: AvatarShape;\n\t/** Pre-defined cartoon-like avatar to display */\n\tpreset?: AvatarPreset;\n\t/** Alternative text for the avatar image */\n\talt?: string;\n\t/** Additional CSS classes to apply to the avatar */\n\tclassName?: string;\n\t/** Custom image source URL */\n\tsrc?: string;\n\t/** Initials to display when no preset or src is provided */\n\tinitials?: string;\n}\n\n/**\n * Displays user avatars with support for images, preset icons, or initials.\n * Provides various size and shape options with built-in fallback handling.\n * \n * @example\n * ```tsx\n * // With custom image\n * <Avatar src=\"/user-photo.jpg\" alt=\"John Doe\" size=\"lg\" />\n * \n * // With preset character\n * <Avatar preset=\"astronaut\" size=\"md\" shape=\"circle\" />\n * \n * // With initials fallback\n * <Avatar initials=\"JD\" size=\"sm\" />\n * ```\n */\nexport function Avatar({\n\tid,\n\tref,\n\tsize = 'md',\n\tshape = 'circle',\n\tpreset,\n\talt,\n\tclassName,\n\tsrc,\n\tinitials,\n\t...props\n}: AvatarProps) {\n\tconst sizeClasses = AvatarSizes[size];\n\tconst shapeClasses = AvatarShapes[shape];\n\n\tconst PresetComponent = preset ? AvatarPresets[preset] : null;\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join(\n\t\t\t\t'relative inline-flex items-center justify-center overflow-hidden bg-gray-100 border-2 border-border',\n\t\t\t\tsizeClasses.size,\n\t\t\t\tshapeClasses,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-size={size}\n\t\t\tdata-shape={shape}\n\t\t\tdata-preset={preset}\n\t\t\trole='img'\n\t\t\taria-label={alt || `Avatar ${preset ? `of ${preset}` : ''}`}\n\t\t\t{...props}\n\t\t>\n\t\t\t{src ? (\n\t\t\t\t<img src={src} alt={alt || 'User avatar'} className='w-full h-full object-cover' />\n\t\t\t) : PresetComponent ? (\n\t\t\t\t<PresetComponent size={sizeClasses.iconSize} />\n\t\t\t) : initials ? (\n\t\t\t\t<span className='text-gray-600 font-medium text-sm'>{initials.slice(0, 2).toUpperCase()}</span>\n\t\t\t) : (\n\t\t\t\t<div className='w-full h-full bg-gradient-to-br from-gray-300 to-gray-400' />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","// -- Badge Use\nexport type BadgeUse = 'decorative' | 'status' | 'alert';\n\nexport const BadgeUseAriaAttributes: Record<BadgeUse, object> = {\n\tdecorative: { 'aria-hidden': true },\n\tstatus: { role: 'status' },\n\talert: { role: 'alert' },\n};\n\n// -- Badge Variant\nexport type BadgeVariant = 'base' | 'primary' | 'secondary' | 'accent' | 'destructive' | 'success' | 'muted';\n\nexport const BadgeVariants: Record<BadgeVariant, string> = {\n\tbase: '',\n\tprimary: 'bg-primary text-primary-foreground',\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\taccent: 'bg-accent text-accent-foreground',\n\tdestructive: 'bg-destructive text-destructive-foreground',\n\tsuccess: 'bg-success text-success-foreground',\n\tmuted: 'bg-muted text-muted-foreground',\n};\n\nexport const BadgeVariantsOutline: Record<BadgeVariant, string> = {\n\tbase: '',\n\tprimary: 'border border-primary bg-transparent text-primary',\n\tsecondary: 'border border-secondary bg-transparent text-secondary',\n\taccent: 'border border-accent bg-transparent text-accent',\n\tdestructive: 'border border-destructive bg-transparent text-destructive',\n\tsuccess: 'border border-success bg-transparent text-success',\n\tmuted: 'border border-muted-foreground bg-transparent text-muted-foreground',\n};\n\n// -- Badge Size\nexport type BadgeSize = 'xs' | 'sm' | 'md';\n\ninterface BadgeSizeStyles {\n\ttext: string;\n\taspectSquare: string;\n\taspectVideo: string;\n}\n\nexport const BadgeSizes: Record<BadgeSize, BadgeSizeStyles> = {\n\txs: {\n\t\ttext: 'text-xs',\n\t\taspectSquare: 'p-1',\n\t\taspectVideo: 'px-2 py-0.5',\n\t},\n\tsm: {\n\t\ttext: 'text-sm',\n\t\taspectSquare: 'p-1.5',\n\t\taspectVideo: 'px-2.5 py-1',\n\t},\n\tmd: {\n\t\ttext: 'text-base',\n\t\taspectSquare: 'p-2',\n\t\taspectVideo: 'px-3 py-1.5',\n\t},\n};\n","import React from 'react';\nimport { join } from '../../utils';\nimport {\n\tBadgeSize,\n\tBadgeSizes,\n\tBadgeUse,\n\tBadgeUseAriaAttributes,\n\tBadgeVariant,\n\tBadgeVariants,\n\tBadgeVariantsOutline,\n} from './variants';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/** The HTML id attribute for the badge */\n\tid?: string;\n\t/** Reference to the badge element */\n\tref?: React.Ref<HTMLSpanElement>;\n\t/** The visual style variant of the badge */\n\tvariant?: BadgeVariant;\n\t/** Whether to render the badge with an outline style */\n\toutline?: boolean;\n\t/** The content to display inside the badge */\n\tchildren?: React.ReactNode;\n\t/** The aspect ratio of the badge - square for equal padding, video for horizontal padding */\n\taspect?: 'square' | 'video';\n\t/** The semantic use of the badge for accessibility purposes */\n\tuse?: BadgeUse;\n\t/** The size of the badge */\n\tsize?: BadgeSize;\n}\n\n/**\n * A small UI element for displaying status, labels, or categories.\n * Supports various colors, sizes, and semantic accessibility attributes.\n * \n * @example\n * ```tsx\n * // Status badge\n * <Badge variant=\"success\" use=\"status\">Active</Badge>\n * \n * // Notification count\n * <Badge variant=\"destructive\" aspect=\"square\" use=\"status\">5</Badge>\n * \n * // Category tag\n * <Badge variant=\"muted\" outline>JavaScript</Badge>\n * ```\n */\nexport function Badge({\n\tid,\n\tref,\n\tvariant = 'muted',\n\toutline = false,\n\tchildren,\n\tclassName,\n\taspect = 'video',\n\tuse = 'decorative',\n\tsize = 'xs',\n\t...props\n}: BadgeProps) {\n\treturn (\n\t\t<span\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join(\n\t\t\t\t'font-medium rounded-full inline-flex select-none',\n\t\t\t\tBadgeSizes[size].text,\n\t\t\t\taspect === 'square' && BadgeSizes[size].aspectSquare,\n\t\t\t\taspect === 'video' && BadgeSizes[size].aspectVideo,\n\t\t\t\toutline ? BadgeVariantsOutline[variant] : BadgeVariants[variant],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-variant={variant}\n\t\t\tdata-outline={outline}\n\t\t\tdata-aspect={aspect}\n\t\t\tdata-use={use}\n\t\t\tdata-size={size}\n\t\t\t{...BadgeUseAriaAttributes[use]}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n","import { useEffect, useState } from 'react';\nimport { join } from '../../utils';\n\n/**\n * An animated loading indicator with three bouncing dots.\n * Used internally by Button component to show loading state.\n * \n * @example\n * ```tsx\n * <LoadingDots />\n * ```\n */\nexport function LoadingDots() {\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setActiveIndex((prevIndex) => (prevIndex + 1) % 3);\n }, 500);\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <div className='absolute inset-0 inline-flex items-center justify-center gap-x-2 align-middle'>\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n className={join(\n 'rounded-full transition-all duration-500 ease-in-out size-[0.35em] bg-current',\n activeIndex === index && 'transform -translate-y-1'\n )}\n />\n ))}\n </div>\n );\n}","export const buttonVariants = {\n base: '',\n primary: 'bg-primary text-primary-foreground hover:bg-primary/85 disabled:bg-muted disabled:text-muted-foreground',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/85 disabled:bg-muted/80 disabled:text-muted-foreground/80',\n tertiary: 'text-primary hover:text-primary-foreground disabled:text-muted',\n outline: 'border border-primary text-primary hover:border-primary-foreground hover:text-primary-foreground disabled:border-muted disabled:text-muted',\n link: 'underline-offset-4 hover:underline disabled:underline disabled:text-muted',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/85 disabled:bg-muted disabled:text-muted-foreground',\n} as const;\nexport type ButtonVariant = keyof typeof buttonVariants;\n\nexport const sizeVariants = {\n stripped: '',\n fitted: 'size-fit leading-0',\n sm: 'px-2 py-1 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n icon: 'p-1 w-fit aspect-square',\n full: 'p-2 w-full',\n} as const;\nexport type ButtonSize = keyof typeof sizeVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n} as const;\nexport type ButtonRounded = keyof typeof roundedVariants;\n\nexport interface ButtonVariants {\n /** The visual style variant of the button. */\n variant: ButtonVariant;\n /** The size of the button. */\n size: ButtonSize;\n /** The border radius of the button. */\n rounded: ButtonRounded;\n}\n\nexport const buttonDefaults: ButtonVariants = {\n variant: 'primary',\n size: 'md',\n rounded: 'md',\n} as const;\n","// Button.tsx\nimport React, { ButtonHTMLAttributes, Ref } from 'react';\nimport { join } from '../../utils';\nimport { LoadingDots } from './LoadingDots';\nimport { ButtonSize, ButtonVariants, buttonDefaults, buttonVariants, roundedVariants, sizeVariants } from './variants';\n\ninterface ButtonButtonProps extends Partial<ButtonVariants>, ButtonHTMLAttributes<HTMLButtonElement> {\n\thref?: never;\n\t/** Reference to the button element. */\n\tref?: Ref<HTMLButtonElement>;\n\t/** Whether the button is in a loading state. */\n\tloading?: boolean;\n}\n\ninterface ButtonLinkProps\n\textends Partial<ButtonVariants>,\n\t\tOmit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'role'> {\n\t/** When provided, renders the button as a link. */\n\thref: string;\n\t/** Reference to the anchor element. */\n\tref?: Ref<HTMLAnchorElement>;\n\tloading?: never;\n\t/** Whether the button is disabled. */\n\tdisabled?: boolean;\n}\n\nexport type ButtonProps = ButtonButtonProps | ButtonLinkProps;\n\n/**\n * A versatile button component that can render as either a button or anchor element.\n * Supports loading states, various visual variants, and accessibility features.\n * \n * @example\n * ```tsx\n * // Regular button\n * <Button variant=\"primary\" onClick={() => save()}>Save</Button>\n * \n * // Loading state\n * <Button loading variant=\"primary\">Processing...</Button>\n * \n * // Link button\n * <Button href=\"/dashboard\" variant=\"secondary\">Go to Dashboard</Button>\n * ```\n */\nexport function Button({\n\tvariant = buttonDefaults.variant,\n\tsize,\n\trounded = buttonDefaults.rounded,\n\tloading,\n\tclassName,\n\t...rest\n}: ButtonProps) {\n\tlet adjustedSize: ButtonSize;\n\tif (variant === 'link' && !size) {\n\t\t// default links to fitted size\n\t\tadjustedSize = 'fitted';\n\t} else {\n\t\tadjustedSize = size || buttonDefaults.size;\n\t}\n\n\tconst baseClasses =\n\t\t'appearance-none focus:outline-none focus:ring not-disabled:hover:cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed transition-all';\n\n\tconst buttonClasses = join(\n\t\tbaseClasses,\n\t\tbuttonVariants[variant],\n\t\tsizeVariants[adjustedSize],\n\t\troundedVariants[rounded],\n\t\tloading && 'relative pointer-events-none',\n\t\tclassName\n\t);\n\n\tif (rest.href && !rest.disabled) {\n\t\treturn (\n\t\t\t<a\n\t\t\t\t{...rest}\n\t\t\t\trel={rest.rel ? rest.rel : rest.target === '_blank' ? 'noopener noreferrer' : undefined}\n\t\t\t\taria-label={rest['aria-label']}\n\t\t\t\taria-description={rest['aria-description']}\n\t\t\t\thref={rest.href}\n\t\t\t\tclassName={buttonClasses}\n\t\t\t>\n\t\t\t\t{rest.children}\n\t\t\t</a>\n\t\t);\n\t}\n\n\tconst buttonRest = rest as ButtonButtonProps; // necessary to cast to avoid TS complaining\n\tconst getButtonChildren = () => {\n\t\tif (!buttonRest.children) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof buttonRest.children === 'string' ||\n\t\t\ttypeof buttonRest.children === 'number' ||\n\t\t\ttypeof buttonRest.children === 'boolean'\n\t\t) {\n\t\t\treturn <span className={join(loading && 'invisible')}>{buttonRest.children}</span>;\n\t\t}\n\n\t\tconst clonedChildren = React.Children.map(buttonRest.children, (child, index) => {\n\t\t\tif (React.isValidElement(child)) {\n\t\t\t\tconst childrenProps = child.props as { className?: string };\n\t\t\t\treturn React.cloneElement(child, {\n\t\t\t\t\tkey: index,\n\t\t\t\t\tclassName: join(loading && 'invisible', childrenProps.className),\n\t\t\t\t} as Record<string, unknown>);\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\t\treturn clonedChildren;\n\t};\n\n\treturn (\n\t\t<button\n\t\t\t{...buttonRest}\n\t\t\taria-label={buttonRest['aria-label']}\n\t\t\taria-description={buttonRest['aria-description']}\n\t\t\taria-disabled={buttonRest.disabled || loading}\n\t\t\taria-busy={loading}\n\t\t\ttype={buttonRest.type ?? 'button'}\n\t\t\tclassName={buttonClasses}\n\t\t>\n\t\t\t{loading && <LoadingDots />}\n\t\t\t{getButtonChildren()}\n\t\t</button>\n\t);\n}\n","import { useCallback, useMemo, useState } from 'react';\n\nexport interface CalendarDateRange {\n\t/** The start date of the range, or null if not selected. */\n\tstart: Date | null;\n\t/** The end date of the range, or null if not selected. */\n\tend: Date | null;\n}\n\ninterface CalendarState {\n\tcurrentDate: Date;\n\tselectedDate: Date | null;\n\tselectedRange: CalendarDateRange | null;\n\tview: 'month' | 'week' | 'day';\n}\n\nexport interface UseCalendarOptions {\n\t/** The initial date to display and optionally select. */\n\tinitialDate?: Date;\n\t/** The selection mode - single date or date range selection. */\n\tmode?: 'single' | 'range';\n\t/** The minimum selectable date (dates before this will be disabled). */\n\tminDate?: Date;\n\t/** The maximum selectable date (dates after this will be disabled). */\n\tmaxDate?: Date;\n\t/** The calendar view to display. */\n\tview?: 'month' | 'week' | 'day';\n\t/** Callback fired when a date is selected in single mode. */\n\tonDateSelect?: (date: Date) => void;\n\t/** Callback fired when a date range is selected in range mode. */\n\tonRangeSelect?: (range: CalendarDateRange) => void;\n}\n\nexport function useCalendar(options: UseCalendarOptions = {}) {\n\tconst {\n\t\tinitialDate = new Date(),\n\t\tmode = 'single',\n\t\tminDate,\n\t\tmaxDate,\n\t\tview = 'month',\n\t\tonDateSelect,\n\t\tonRangeSelect,\n\t} = options;\n\n\tconst [state, setState] = useState<CalendarState>({\n\t\tcurrentDate: initialDate,\n\t\tselectedDate: mode === 'single' ? initialDate : null,\n\t\tselectedRange: mode === 'range' ? null : null,\n\t\tview,\n\t});\n\n\tconst isDateDisabled = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (minDate && date < minDate) return true;\n\t\t\tif (maxDate && date > maxDate) return true;\n\t\t\treturn false;\n\t\t},\n\t\t[minDate, maxDate]\n\t);\n\n\tconst selectDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (isDateDisabled(date)) return;\n\n\t\t\tif (mode === 'single') {\n\t\t\t\tsetState((prev) => ({ ...prev, selectedDate: date }));\n\t\t\t\tonDateSelect?.(date);\n\t\t\t} else if (mode === 'range') {\n\t\t\t\tsetState((prev) => {\n\t\t\t\t\tconst { selectedRange } = prev;\n\n\t\t\t\t\tif (!selectedRange?.start || (selectedRange.start && selectedRange.end)) {\n\t\t\t\t\t\t// Start new range\n\t\t\t\t\t\tconst newRange = { start: date, end: null };\n\t\t\t\t\t\tonRangeSelect?.(newRange);\n\t\t\t\t\t\treturn { ...prev, selectedRange: newRange };\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Complete range\n\t\t\t\t\t\tconst start = selectedRange.start;\n\t\t\t\t\t\tconst end = date;\n\t\t\t\t\t\tconst newRange = {\n\t\t\t\t\t\t\tstart: start < end ? start : end,\n\t\t\t\t\t\t\tend: start < end ? end : start,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tonRangeSelect?.(newRange);\n\t\t\t\t\t\treturn { ...prev, selectedRange: newRange };\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[mode, isDateDisabled, onDateSelect, onRangeSelect]\n\t);\n\n\tconst navigateMonth = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tif (direction === 'prev') {\n\t\t\t\tnewDate.setMonth(newDate.getMonth() - 1);\n\t\t\t} else {\n\t\t\t\tnewDate.setMonth(newDate.getMonth() + 1);\n\t\t\t}\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigateWeek = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tconst days = direction === 'prev' ? -7 : 7;\n\t\t\tnewDate.setDate(newDate.getDate() + days);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigateDay = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tconst days = direction === 'prev' ? -1 : 1;\n\t\t\tnewDate.setDate(newDate.getDate() + days);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigate = useCallback(\n\t\t(direction: 'prev' | 'next') => {\n\t\t\tif (state.view === 'month') {\n\t\t\t\tnavigateMonth(direction);\n\t\t\t} else if (state.view === 'week') {\n\t\t\t\tnavigateWeek(direction);\n\t\t\t} else {\n\t\t\t\tnavigateDay(direction);\n\t\t\t}\n\t\t},\n\t\t[state.view, navigateMonth, navigateWeek, navigateDay]\n\t);\n\n\tconst changeView = useCallback((newView: 'month' | 'week' | 'day') => {\n\t\tsetState((prev) => ({ ...prev, view: newView }));\n\t}, []);\n\n\tconst goToDate = useCallback((date: Date) => {\n\t\tsetState((prev) => ({ ...prev, currentDate: date }));\n\t}, []);\n\n\tconst changeMonth = useCallback((month: number) => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tnewDate.setMonth(month);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst changeYear = useCallback((year: number) => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tnewDate.setFullYear(year);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst getDaysInView = useMemo(() => {\n\t\tconst { currentDate, view } = state;\n\t\tconst days: Date[] = [];\n\n\t\tif (view === 'month') {\n\t\t\t// Get first day of month\n\t\t\tconst firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);\n\n\t\t\t// Get first Sunday of calendar view\n\t\t\tconst startDate = new Date(firstDay);\n\t\t\tstartDate.setDate(startDate.getDate() - firstDay.getDay());\n\n\t\t\t// Generate 42 days (6 weeks)\n\t\t\tfor (let i = 0; i < 42; i++) {\n\t\t\t\tconst day = new Date(startDate);\n\t\t\t\tday.setDate(day.getDate() + i);\n\t\t\t\tdays.push(day);\n\t\t\t}\n\t\t} else if (view === 'week') {\n\t\t\t// Get start of week (Sunday)\n\t\t\tconst startOfWeek = new Date(currentDate);\n\t\t\tstartOfWeek.setDate(currentDate.getDate() - currentDate.getDay());\n\n\t\t\t// Generate 7 days\n\t\t\tfor (let i = 0; i < 7; i++) {\n\t\t\t\tconst day = new Date(startOfWeek);\n\t\t\t\tday.setDate(day.getDate() + i);\n\t\t\t\tdays.push(day);\n\t\t\t}\n\t\t} else {\n\t\t\t// Day view - just current date\n\t\t\tdays.push(new Date(currentDate));\n\t\t}\n\n\t\treturn days;\n\t}, [state]);\n\n\tconst isDateSelected = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'single') {\n\t\t\t\treturn state.selectedDate && date.toDateString() === state.selectedDate.toDateString();\n\t\t\t} else if (mode === 'range' && state.selectedRange) {\n\t\t\t\tconst { start, end } = state.selectedRange;\n\t\t\t\tif (start && end) {\n\t\t\t\t\treturn date >= start && date <= end;\n\t\t\t\t} else if (start) {\n\t\t\t\t\treturn date.toDateString() === start.toDateString();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedDate, state.selectedRange]\n\t);\n\n\tconst isDateInRange = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.start && state.selectedRange?.end) {\n\t\t\t\tconst { start, end } = state.selectedRange;\n\t\t\t\treturn date > start && date < end;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\tconst isDateRangeStart = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.start) {\n\t\t\t\treturn date.toDateString() === state.selectedRange.start.toDateString();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\tconst isDateRangeEnd = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.end) {\n\t\t\t\treturn date.toDateString() === state.selectedRange.end.toDateString();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\treturn {\n\t\t// State\n\t\tcurrentDate: state.currentDate,\n\t\tselectedDate: state.selectedDate,\n\t\tselectedRange: state.selectedRange,\n\t\tview: state.view,\n\n\t\t// Data\n\t\tdaysInView: getDaysInView,\n\n\t\t// Actions\n\t\tselectDate,\n\t\tnavigate,\n\t\tchangeView,\n\t\tgoToDate,\n\t\tchangeMonth,\n\t\tchangeYear,\n\n\t\t// Checkers\n\t\tisDateSelected,\n\t\tisDateDisabled,\n\t\tisDateInRange,\n\t\tisDateRangeStart,\n\t\tisDateRangeEnd,\n\t};\n}\n","export const calendarSizeVariants = {\n\tsmall: {\n\t\tcontainer: 'text-xs',\n\t\tcell: 'w-7 h-7 text-xs',\n\t\theader: 'text-sm px-2 py-1',\n\t\tnavigation: 'p-1',\n\t\tweekdays: 'text-xs px-1 py-1',\n\t},\n\tmedium: {\n\t\tcontainer: 'text-sm',\n\t\tcell: 'w-9 h-9 text-sm',\n\t\theader: 'text-base px-3 py-2',\n\t\tnavigation: 'p-2',\n\t\tweekdays: 'text-sm px-2 py-2',\n\t},\n\tlarge: {\n\t\tcontainer: 'text-base',\n\t\tcell: 'w-12 h-12 text-base',\n\t\theader: 'text-lg px-4 py-3',\n\t\tnavigation: 'p-3',\n\t\tweekdays: 'text-base px-3 py-2',\n\t},\n\tauto: {\n\t\tcontainer: 'w-full h-full',\n\t\tcell: 'flex-1 min-h-[2rem] text-sm',\n\t\theader: 'text-base px-3 py-2',\n\t\tnavigation: 'p-2',\n\t\tweekdays: 'text-sm px-2 py-2',\n\t},\n} as const;\n\nexport type CalendarSize = keyof typeof calendarSizeVariants;\n\nexport const calendarViewVariants = {\n\tmonth: 'grid-cols-7',\n\tweek: 'grid-cols-7',\n\tday: 'grid-cols-1',\n} as const;\n\nexport type CalendarView = keyof typeof calendarViewVariants;\n\nexport const calendarDefaults = {\n\tsize: 'medium' as CalendarSize,\n\tview: 'month' as CalendarView,\n} as const;\n","import { ReactNode, Ref } from 'react';\nimport { ChevronLeft, ChevronRight } from '../../symbols';\nimport { join } from '../../utils';\nimport { CalendarDateRange, useCalendar, UseCalendarOptions } from './hooks';\nimport { calendarDefaults, CalendarSize, calendarSizeVariants, calendarViewVariants } from './variants';\n\nexport interface CalendarCustomStyles {\n\t/** Custom CSS classes for the main calendar container. */\n\tcontainerClassName?: string;\n\t/** Custom CSS classes for the calendar header. */\n\theaderClassName?: string;\n\t/** Custom CSS classes for the navigation button container. */\n\tnavigationClassName?: string;\n\t/** Custom CSS classes for the previous navigation button. */\n\tprevButtonClassName?: string;\n\t/** Custom CSS classes for the next navigation button. */\n\tnextButtonClassName?: string;\n\t/** Custom CSS classes for the calendar title. */\n\ttitleClassName?: string;\n\t/** Custom CSS classes for the view selector buttons. */\n\tviewSelectorClassName?: string;\n\t/** Custom CSS classes for the month and year dropdown selectors. */\n\tmonthYearSelectorsClassName?: string;\n\t/** Custom CSS classes for the today button. */\n\ttodayButtonClassName?: string;\n\t/** Custom CSS classes for the weekdays header row. */\n\tweekdaysClassName?: string;\n\t/** Custom CSS classes for individual weekday cells. */\n\tweekdayClassName?: string;\n\t/** Custom CSS classes for the month view grid. */\n\tmonthGridClassName?: string;\n\t/** Custom CSS classes for the week view grid. */\n\tweekGridClassName?: string;\n\t/** Custom CSS classes for the day view grid. */\n\tdayGridClassName?: string;\n\t/** Custom CSS classes for date cells. */\n\tcellClassName?: string;\n\t/** Custom CSS classes for selected date cells. */\n\tselectedCellClassName?: string;\n\t/** Custom CSS classes for today's date cell. */\n\ttodayCellClassName?: string;\n\t/** Custom CSS classes for disabled date cells. */\n\tdisabledCellClassName?: string;\n\t/** Custom CSS classes for date cells within a selected range. */\n\trangeCellClassName?: string;\n\t/** Custom CSS classes for the start date of a selected range. */\n\trangeStartCellClassName?: string;\n\t/** Custom CSS classes for the end date of a selected range. */\n\trangeEndCellClassName?: string;\n}\n\nexport interface CalendarProps extends Omit<UseCalendarOptions, 'onDateSelect' | 'onRangeSelect'> {\n\t/** The HTML id attribute for the calendar. */\n\tid?: string;\n\t/** Reference to the calendar container element. */\n\tref?: Ref<HTMLDivElement>;\n\t/** Additional CSS classes to apply to the calendar container. */\n\tclassName?: string;\n\t/** The size of the calendar component. */\n\tsize?: CalendarSize;\n\t/** Object containing custom CSS classes for different calendar elements. */\n\tcustomStyles?: CalendarCustomStyles;\n\t/** Custom render function for date cells. */\n\trenderCell?: (date: Date, isSelected: boolean, isDisabled: boolean, isToday: boolean) => ReactNode;\n\t/** Whether to show the view selector buttons. */\n\tshowViewSelector?: boolean;\n\t/** Whether to show the navigation buttons. */\n\tshowNavigation?: boolean;\n\t/** Layout of navigation buttons - adjacent (both on left) or around (on sides of title). */\n\tnavigationLayout?: 'adjacent' | 'around';\n\t/** Whether to show month and year as dropdown selectors for easier navigation. */\n\tuseMonthYearSelector?: boolean;\n\t/** Whether to show a button to quickly jump to the current date. */\n\tshowTodayButton?: boolean;\n\t/** Callback fired when a date is selected in single mode. */\n\tonDateSelect?: (date: Date) => void;\n\t/** Callback fired when a date range is selected in range mode. */\n\tonRangeSelect?: (range: CalendarDateRange) => void;\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\nconst YEAR_RANGE = 100;\n\n/**\n * A full-featured calendar component supporting single date selection, date ranges, \n * and multiple view modes (month/week/day). Includes navigation, accessibility features,\n * and extensive customization options.\n * \n * @example\n * ```tsx\n * // Basic date picker\n * <Calendar\n * mode=\"single\"\n * onDateSelect={(date) => setSelectedDate(date)}\n * initialDate={new Date()}\n * />\n * \n * // Date range picker\n * <Calendar\n * mode=\"range\"\n * onRangeSelect={(range) => setDateRange(range)}\n * showTodayButton\n * />\n * \n * // Multi-view calendar\n * <Calendar\n * showViewSelector\n * useMonthYearSelector\n * navigationLayout=\"adjacent\"\n * />\n * ```\n */\nexport function Calendar({\n\tid,\n\tref,\n\tclassName,\n\tsize = calendarDefaults.size,\n\tcustomStyles = {},\n\tview = calendarDefaults.view,\n\tmode = 'single',\n\tinitialDate,\n\tminDate,\n\tmaxDate,\n\trenderCell,\n\tshowViewSelector = false,\n\tshowNavigation = true,\n\tnavigationLayout = 'around',\n\tuseMonthYearSelector = false,\n\tshowTodayButton = false,\n\tonDateSelect,\n\tonRangeSelect,\n\t...rest\n}: CalendarProps) {\n\tconst calendar = useCalendar({\n\t\tinitialDate,\n\t\tmode,\n\t\tminDate,\n\t\tmaxDate,\n\t\tview,\n\t\tonDateSelect,\n\t\tonRangeSelect,\n\t});\n\n\tconst sizeStyles = calendarSizeVariants[size];\n\tconst viewStyles = calendarViewVariants[calendar.view];\n\n\tconst isToday = (date: Date) => {\n\t\tconst today = new Date();\n\t\treturn date.toDateString() === today.toDateString();\n\t};\n\n\tconst isCurrentMonth = (date: Date) => {\n\t\treturn (\n\t\t\tdate.getMonth() === calendar.currentDate.getMonth() && date.getFullYear() === calendar.currentDate.getFullYear()\n\t\t);\n\t};\n\n\tconst goToToday = () => {\n\t\tcalendar.goToDate(new Date());\n\t};\n\n\tconst formatTitle = () => {\n\t\tconst { currentDate, view } = calendar;\n\t\tconst month = MONTHS[currentDate.getMonth()];\n\t\tconst year = currentDate.getFullYear();\n\n\t\tif (view === 'month') {\n\t\t\treturn `${month} ${year}`;\n\t\t}\n\n\t\tif (view === 'week') {\n\t\t\tconst startOfWeek = new Date(currentDate);\n\t\t\tstartOfWeek.setDate(currentDate.getDate() - currentDate.getDay());\n\t\t\tconst endOfWeek = new Date(startOfWeek);\n\t\t\tendOfWeek.setDate(endOfWeek.getDate() + 6);\n\n\t\t\tif (startOfWeek.getMonth() === endOfWeek.getMonth()) {\n\t\t\t\treturn `${month} ${startOfWeek.getDate()}-${endOfWeek.getDate()}, ${year}`;\n\t\t\t}\n\n\t\t\treturn `${MONTHS[startOfWeek.getMonth()]} ${startOfWeek.getDate()} - ${\n\t\t\t\tMONTHS[endOfWeek.getMonth()]\n\t\t\t} ${endOfWeek.getDate()}, ${year}`;\n\t\t}\n\n\t\treturn `${month} ${currentDate.getDate()}, ${year}`;\n\t};\n\n\tconst renderViewSelector = () => {\n\t\tif (!showViewSelector) return null;\n\n\t\treturn (\n\t\t\t<div className={viewSelectorClasses}>\n\t\t\t\t{(['month', 'week', 'day'] as const).map((viewOption) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={viewOption}\n\t\t\t\t\t\tonClick={() => calendar.changeView(viewOption)}\n\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t'px-2 py-1 rounded capitalize transition-colors',\n\t\t\t\t\t\t\tcalendar.view === viewOption ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/20'\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{viewOption}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderMonthYearSelector = () => {\n\t\tif (!useMonthYearSelector) return null;\n\n\t\tconst currentMonth = calendar.currentDate.getMonth();\n\t\tconst currentYear = calendar.currentDate.getFullYear();\n\n\t\t// Generate year options (current year ± YEAR_RANGE years)\n\t\tconst startYear = currentYear - YEAR_RANGE;\n\t\tconst endYear = currentYear + YEAR_RANGE;\n\t\tconst yearOptions = [];\n\t\tfor (let year = startYear; year <= endYear; year++) {\n\t\t\tyearOptions.push(year);\n\t\t}\n\n\t\tconst monthYearSelectorsClasses = join(\n\t\t\t'border border-border rounded px-2 py-1 text-sm focus:outline-none focus:border-accent focus:ring-2 focus:ring-accent/50',\n\t\t\tcustomStyles.monthYearSelectorsClassName\n\t\t);\n\t\treturn (\n\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t<select\n\t\t\t\t\tvalue={currentMonth}\n\t\t\t\t\tonChange={(e) => calendar.changeMonth(parseInt(e.target.value))}\n\t\t\t\t\tclassName={monthYearSelectorsClasses}\n\t\t\t\t>\n\t\t\t\t\t{MONTHS.map((month, index) => (\n\t\t\t\t\t\t<option key={month} value={index}>\n\t\t\t\t\t\t\t{month}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t\t<select\n\t\t\t\t\tvalue={currentYear}\n\t\t\t\t\tonChange={(e) => calendar.changeYear(parseInt(e.target.value))}\n\t\t\t\t\tclassName={monthYearSelectorsClasses}\n\t\t\t\t>\n\t\t\t\t\t{yearOptions.map((year) => (\n\t\t\t\t\t\t<option key={year} value={year}>\n\t\t\t\t\t\t\t{year}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderTodayButton = () => {\n\t\tif (!showTodayButton) return null;\n\n\t\tconst todayButtonClasses = join(\n\t\t\t'px-3 py-1 text-xs rounded border border-border hover:bg-accent/20 transition-colors focus:outline-none focus:ring focus:ring-accent/50',\n\t\t\tcustomStyles.todayButtonClassName\n\t\t);\n\n\t\treturn (\n\t\t\t<button onClick={goToToday} className={todayButtonClasses} aria-label='Go to today'>\n\t\t\t\tToday\n\t\t\t</button>\n\t\t);\n\t};\n\n\tconst renderDateCell = (date: Date) => {\n\t\tconst isSelected = calendar.isDateSelected(date);\n\t\tconst isDisabled = calendar.isDateDisabled(date);\n\t\tconst isTodayDate = isToday(date);\n\t\tconst isInRange = calendar.isDateInRange(date);\n\t\tconst isRangeStart = calendar.isDateRangeStart(date);\n\t\tconst isRangeEnd = calendar.isDateRangeEnd(date);\n\t\tconst isCurrentMonthDate = isCurrentMonth(date);\n\n\t\tconst baseCellClasses = join(\n\t\t\t'w-full flex items-center justify-center transition-colors cursor-pointer',\n\t\t\t'focus:outline-none',\n\t\t\tsizeStyles.cell\n\t\t);\n\n\t\tconst cellClasses = join(\n\t\t\t!isInRange && 'rounded-md',\n\t\t\t!isSelected && 'hover:bg-accent/20 focus:bg-accent/20',\n\t\t\tbaseCellClasses,\n\t\t\tcustomStyles.cellClassName,\n\t\t\t// Selection states\n\t\t\tisSelected && join('bg-accent text-accent-foreground', customStyles.selectedCellClassName),\n\t\t\t// Range states\n\t\t\tisInRange && join('bg-accent/30', customStyles.rangeCellClassName),\n\t\t\tisRangeStart && join('bg-accent text-accent-foreground rounded-r-none', customStyles.rangeStartCellClassName),\n\t\t\tisRangeEnd && join('bg-accent text-accent-foreground rounded-l-none', customStyles.rangeEndCellClassName),\n\t\t\t// Today\n\t\t\tisTodayDate && !isSelected && join('border border-accent', customStyles.todayCellClassName),\n\t\t\t// Disabled\n\t\t\tisDisabled && join('opacity-50 cursor-not-allowed hover:bg-transparent', customStyles.disabledCellClassName),\n\t\t\t// Month view: dim dates from other months\n\t\t\tcalendar.view === 'month' && !isCurrentMonthDate && 'text-muted-foreground/50'\n\t\t);\n\n\t\tconst cellContent = renderCell ? renderCell(date, !!isSelected, isDisabled, isTodayDate) : date.getDate();\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tkey={date.toISOString()}\n\t\t\t\tonClick={() => calendar.selectDate(date)}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tclassName={cellClasses}\n\t\t\t\tdata-date={date.toISOString().split('T')[0]}\n\t\t\t\tdata-selected={!!isSelected}\n\t\t\t\tdata-disabled={isDisabled}\n\t\t\t\tdata-today={isTodayDate}\n\t\t\t\taria-label={`${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()}`}\n\t\t\t\taria-selected={!!isSelected}\n\t\t\t\taria-disabled={isDisabled}\n\t\t\t>\n\t\t\t\t{cellContent}\n\t\t\t</button>\n\t\t);\n\t};\n\n\tconst containerClasses = join(\n\t\t'bg-background border rounded-lg',\n\t\tsizeStyles.container,\n\t\tcustomStyles.containerClassName,\n\t\tclassName\n\t);\n\n\tconst headerClasses = join(\n\t\t'flex items-center border-b px-4 py-2',\n\t\tnavigationLayout === 'around' ? 'justify-between' : 'justify-between',\n\t\tsizeStyles.header,\n\t\tcustomStyles.headerClassName\n\t);\n\n\tconst navigationClasses = join('flex items-center gap-1', customStyles.navigationClassName);\n\n\tconst prevButtonClasses = join(\n\t\t'p-1 rounded hover:bg-accent/20 transition-colors',\n\t\tsizeStyles.navigation,\n\t\tcustomStyles.prevButtonClassName\n\t);\n\n\tconst nextButtonClasses = join(\n\t\t'p-1 rounded hover:bg-accent/20 transition-colors',\n\t\tsizeStyles.navigation,\n\t\tcustomStyles.nextButtonClassName\n\t);\n\n\tconst titleClasses = join('font-semibold text-foreground', customStyles.titleClassName);\n\n\tconst viewSelectorClasses = join('flex gap-1 text-xs', customStyles.viewSelectorClassName);\n\n\tconst weekdaysClasses = join(\n\t\t'grid grid-cols-7 border-b text-muted-foreground font-medium',\n\t\tsizeStyles.weekdays,\n\t\tcustomStyles.weekdaysClassName\n\t);\n\n\tconst weekdayClasses = join('text-center', customStyles.weekdayClassName);\n\n\tconst gridClasses = join(\n\t\t'grid gap-y-1 p-2',\n\t\tcalendar.view === 'month' && viewStyles,\n\t\tcalendar.view === 'week' && join(viewStyles, customStyles.weekGridClassName),\n\t\tcalendar.view === 'day' && join(viewStyles, customStyles.dayGridClassName),\n\t\tcalendar.view === 'month' && customStyles.monthGridClassName\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={containerClasses}\n\t\t\tdata-size={size}\n\t\t\tdata-view={calendar.view}\n\t\t\tdata-mode={mode}\n\t\t\trole='application'\n\t\t\taria-label='Calendar'\n\t\t\t{...rest}\n\t\t>\n\t\t\t{/* Header */}\n\t\t\t<div className={headerClasses}>\n\t\t\t\t{/* Adjacent layout: nav buttons on left, title on right */}\n\t\t\t\t{navigationLayout === 'adjacent' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className='flex items-center gap-4'>\n\t\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t\t<div className={navigationClasses}>\n\t\t\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('prev')} className={prevButtonClasses} aria-label='Previous'>\n\t\t\t\t\t\t\t\t\t\t<ChevronLeft className='w-4 h-4' />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('next')} className={nextButtonClasses} aria-label='Next'>\n\t\t\t\t\t\t\t\t\t\t<ChevronRight className='w-4 h-4' />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className='flex items-center gap-3'>\n\t\t\t\t\t\t\t\t{!useMonthYearSelector && <h2 className={titleClasses}>{formatTitle()}</h2>}\n\t\t\t\t\t\t\t\t{renderMonthYearSelector()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t\t\t\t{renderViewSelector()}\n\t\t\t\t\t\t\t{renderTodayButton()}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{/* Around layout: nav buttons on sides, title in center */}\n\t\t\t\t{navigationLayout === 'around' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('prev')} className={prevButtonClasses} aria-label='Previous'>\n\t\t\t\t\t\t\t\t<ChevronLeft className='w-4 h-4' />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className='flex flex-col items-center gap-2'>\n\t\t\t\t\t\t\t<div className='flex items-center gap-3'>\n\t\t\t\t\t\t\t\t{!useMonthYearSelector && <h2 className={titleClasses}>{formatTitle()}</h2>}\n\t\t\t\t\t\t\t\t{renderMonthYearSelector()}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t\t\t\t\t{renderViewSelector()}\n\t\t\t\t\t\t\t\t{renderTodayButton()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('next')} className={nextButtonClasses} aria-label='Next'>\n\t\t\t\t\t\t\t\t<ChevronRight className='w-4 h-4' />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Weekdays header for month and week views */}\n\t\t\t{(calendar.view === 'month' || calendar.view === 'week') && (\n\t\t\t\t<div className={weekdaysClasses}>\n\t\t\t\t\t{WEEKDAYS.map((day) => (\n\t\t\t\t\t\t<div key={day} className={weekdayClasses}>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar grid */}\n\t\t\t{/* Key forces React to re-render the entire grid when month/year/view changes,\n\t\t\t\t\tpreventing flickering of previous month's dates with incorrect opacity during navigation */}\n\t\t\t<div\n\t\t\t\tkey={`${calendar.currentDate.getFullYear()}-${calendar.currentDate.getMonth()}-${calendar.view}`}\n\t\t\t\tclassName={gridClasses}\n\t\t\t>\n\t\t\t\t{calendar.daysInView.map((date) => renderDateCell(date))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","interface CalloutVariantStyles {\n border: string;\n interior: string;\n core: string; // used for icon, title, and close button\n description: string;\n}\n\nexport type CalloutVariants = 'base' | 'info' | 'destructive' | 'success' | 'warning';\n\nexport const CalloutVariants: Record<CalloutVariants, CalloutVariantStyles> = {\n info: {\n border: 'border-blue-600',\n interior: 'bg-blue-800/20',\n core: 'text-blue-400',\n description: 'text-blue-200',\n },\n destructive: {\n border: 'border-destructive',\n interior: 'bg-destructive/10',\n core: 'text-destructive',\n description: 'text-destructive',\n },\n success: {\n border: 'border-success',\n interior: 'bg-success/10',\n core: 'text-success',\n description: 'text-success',\n },\n warning: {\n border: 'border-yellow-700',\n interior: 'bg-yellow-800/20',\n core: 'text-yellow-400',\n description: 'text-yellow-200',\n },\n base: {\n border: '',\n interior: '',\n core: '',\n description: 'opacity-90',\n }\n};\n","import React, { useId, useState } from 'react';\nimport { CheckCircled, CrossCircled, DeepRing, ExclamationTriangle, InfoCircled, X } from '../../symbols';\nimport { join } from '../../utils';\nimport { CalloutVariants } from './variants';\n\nexport interface CalloutProps {\n\t/** The id of the callout element */\n\tid?: string;\n\t/** Reference to the callout element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The visual style variant of the callout */\n\tvariant?: CalloutVariants;\n\t/** Custom icon to display. Will use default icon if not provided. Pass null to hide the icon */\n\ticon?: string | React.ReactElement | null;\n\t/** Optional title for the callout */\n\ttitle?: React.ReactNode;\n\t/** The main content to display inside the callout */\n\tdescription?: React.ReactNode;\n\t/** Additional CSS classes to apply to the callout */\n\tclassName?: string;\n\t/** Whether the callout can be dismissed */\n\tdismissible?: boolean;\n\t/** Callback fired when the dismiss button is clicked */\n\tonDismiss?: () => void;\n}\n\nconst VariantIcons: Record<CalloutVariants, React.ReactNode> = {\n\tinfo: <InfoCircled size={22} />,\n\tdestructive: <CrossCircled size={22} />,\n\tsuccess: <CheckCircled size={22} />,\n\twarning: <ExclamationTriangle size={20} />,\n\tbase: <DeepRing size={22} />,\n};\n\n/**\n * A prominent notice component for displaying important information, alerts, or status messages.\n * Supports different visual variants with appropriate icons and dismissible functionality.\n * \n * @example\n * ```tsx\n * // Info callout\n * <Callout variant=\"info\" title=\"Tip\" description=\"Save your work frequently\" />\n * \n * // Warning with custom content\n * <Callout \n * variant=\"warning\" \n * title=\"Unsaved Changes\"\n * description={<>You have <strong>3 unsaved</strong> documents.</>}\n * dismissible\n * />\n * \n * // Success notification\n * <Callout variant=\"success\" description=\"Profile updated successfully!\" />\n * ```\n */\nexport function Callout({\n\tid,\n\tref,\n\tvariant = 'base',\n\ticon,\n\ttitle,\n\tdescription,\n\tclassName,\n\tdismissible = false,\n\tonDismiss,\n}: CalloutProps) {\n\tconst generatedId = useId();\n\tconst calloutId = id || `callout-${generatedId}`;\n\tconst [isDismissed, setIsDismissed] = useState(false);\n\tconst variantStyles = CalloutVariants[variant];\n\tconst variantIcon = VariantIcons[variant];\n\n\tconst handleDismiss = () => {\n\t\tsetIsDismissed(true);\n\t\tif (onDismiss) {\n\t\t\tonDismiss();\n\t\t}\n\t};\n\n\tif (isDismissed) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tid={calloutId}\n\t\t\tref={ref}\n\t\t\tclassName={join('relative rounded-lg p-2 sm:p-4 border', variantStyles.border, variantStyles.interior, className)}\n\t\t\tdata-variant={variant}\n\t\t\trole='note'\n\t\t\taria-describedby={description ? `${calloutId}-description` : undefined}\n\t\t\taria-labelledby={title ? `${calloutId}-title` : undefined}\n\t\t>\n\t\t\t<div className='flex items-start gap-x-2'>\n\t\t\t\t{icon !== null && <span className={variantStyles.core}>{icon === undefined ? variantIcon : icon}</span>}\n\t\t\t\t{(title || description) && (\n\t\t\t\t\t<div className='flex-1'>\n\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t<div id={`${calloutId}-title`} className={join('font-medium', variantStyles.core)}>\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<div id={`${calloutId}-description`} className={join('mt-0.5 font-light', variantStyles.description)}>\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{dismissible && (\n\t\t\t\t<button\n\t\t\t\t\ttype='button'\n\t\t\t\t\tonClick={handleDismiss}\n\t\t\t\t\tdata-callout-close-button='true'\n\t\t\t\t\tclassName={join(\n\t\t\t\t\t\tvariantStyles.core,\n\t\t\t\t\t\t'rounded-md p-0.5 top-2.5 right-2.5 absolute focus:outline-none hover:ring focus:ring-2 focus:ring-current leading-0'\n\t\t\t\t\t)}\n\t\t\t\t\taria-label='Close callout'\n\t\t\t\t>\n\t\t\t\t\t<X size={18} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","interface CardVariantStyles {\n container: string;\n header: string;\n content: string;\n footer: string;\n paddingMulti: number;\n}\n\nexport type CardSize = 'sm' | 'md' | 'lg';\n\nexport const CardSizes: Record<CardSize, CardVariantStyles> = {\n sm: {\n container: 'text-sm',\n header: 'text-base font-medium',\n content: 'text-sm leading-relaxed',\n footer: 'text-xs',\n paddingMulti: 1 / 3,\n },\n md: {\n container: 'text-base',\n header: 'text-lg font-semibold',\n content: 'text-base leading-relaxed',\n footer: 'text-sm',\n paddingMulti: 1 / 2,\n },\n lg: {\n container: 'text-lg',\n header: 'text-xl font-bold',\n content: 'text-lg leading-relaxed',\n footer: 'text-base',\n paddingMulti: 1,\n },\n};","import { join } from '../../utils';\nimport { CardSize, CardSizes } from './variants';\n\nexport interface CardProps {\n\t/** The HTML id attribute for the card */\n\tid?: string;\n\t/** Additional CSS classes to apply to the card */\n\tclassName?: string;\n\t/** React ref for the card container */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The size variant of the card */\n\tsize?: CardSize;\n\t/** The amount of padding inside the card */\n\tpadding?: number;\n\t/** Content to display in the card header */\n\theader?: React.ReactNode;\n\t/** Content to display in the card footer */\n\tfooter?: React.ReactNode;\n\t/** The main content of the card */\n\tchildren?: React.ReactNode;\n\t/** Image source for the card */\n\timageSrc?: string;\n\t/** Alt text for the image */\n\timageAlt?: string;\n\t/** Custom image component */\n\timageComponent?: React.ReactNode;\n\t/** If true, the image will extend to the edges of the card, ignoring padding. Default is false. */\n\timageToEdge?: boolean;\n}\n\n/**\n * A flexible container component for displaying content in a structured format.\n * Supports headers, footers, images, and customizable padding with responsive design.\n * \n * @example\n * ```tsx\n * // Simple card\n * <Card header=\"Card Title\" size=\"lg\">\n * <p>Your content goes here</p>\n * </Card>\n * \n * // Card with image and footer\n * <Card \n * imageSrc=\"/photo.jpg\" \n * imageAlt=\"Product photo\"\n * header={<h3>Product Name</h3>}\n * footer={<Button>Buy Now</Button>}\n * >\n * Product description text here.\n * </Card>\n * ```\n */\nexport function Card({\n\tid,\n\tclassName,\n\tref,\n\tsize = 'md',\n\tpadding = 16,\n\theader,\n\tfooter,\n\tchildren,\n\timageSrc,\n\timageAlt,\n\timageComponent,\n\timageToEdge = true,\n\t...props\n}: CardProps) {\n\tconst sizeVariant = CardSizes[size];\n\tconst showImage = imageSrc || imageComponent;\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tdata-testid='card'\n\t\t\tdata-size={size}\n\t\t\tdata-padding={padding}\n\t\t\tclassName={join(\n\t\t\t\t// Base styles\n\t\t\t\t'border border-border rounded-lg shadow-sm overflow-hidden',\n\t\t\t\t// Responsive design\n\t\t\t\t'w-full max-w-full',\n\t\t\t\t// Size-specific styles\n\t\t\t\tsizeVariant.container,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Image Section */}\n\t\t\t{showImage && (\n\t\t\t\t<div\n\t\t\t\t\tstyle={imageToEdge ? undefined : { padding, paddingBottom: 0 }}\n\t\t\t\t\tclassName='w-full overflow-hidden'\n\t\t\t\t>\n\t\t\t\t\t{imageComponent ? (\n\t\t\t\t\t\timageComponent\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img src={imageSrc} alt={imageAlt || ''} className='w-full h-auto object-cover rounded-xs' loading='lazy' />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Card Content */}\n\t\t\t<div style={{ padding, rowGap: padding * sizeVariant.paddingMulti }} className='flex flex-col'>\n\t\t\t\t{/* Header */}\n\t\t\t\t{header && <div className={sizeVariant.header}>{header}</div>}\n\n\t\t\t\t{/* Main Content */}\n\t\t\t\t{children && <div className={sizeVariant.content}>{children}</div>}\n\n\t\t\t\t{/* Footer */}\n\t\t\t\t{footer && <div className={sizeVariant.footer}>{footer}</div>}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface UseCarouselProps {\n totalItems: number;\n itemsToShow: number;\n infinite: boolean;\n autoScroll: boolean;\n scrollInterval: number;\n pauseScrollOnHover: boolean;\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n}\n\nexport function useCarousel({\n totalItems,\n itemsToShow,\n infinite,\n autoScroll,\n scrollInterval,\n pauseScrollOnHover,\n currentIndex,\n onIndexChange,\n}: UseCarouselProps) {\n const [currentSlide, setCurrentSlide] = useState(currentIndex || 0);\n const [isHovered, setIsHovered] = useState(false);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const maxSlides = Math.ceil(totalItems / itemsToShow);\n const canGoPrev = infinite || currentSlide > 0;\n const canGoNext = infinite || currentSlide < maxSlides - 1;\n\n const goToSlide = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(0, Math.min(index, maxSlides - 1));\n setCurrentSlide(clampedIndex);\n onIndexChange?.(clampedIndex);\n },\n [maxSlides, onIndexChange]\n );\n\n const goToPrev = useCallback(() => {\n if (canGoPrev) {\n const newIndex = currentSlide === 0 && infinite ? maxSlides - 1 : currentSlide - 1;\n goToSlide(newIndex);\n }\n }, [currentSlide, canGoPrev, infinite, maxSlides, goToSlide]);\n\n const goToNext = useCallback(() => {\n if (canGoNext) {\n const newIndex = currentSlide === maxSlides - 1 && infinite ? 0 : currentSlide + 1;\n goToSlide(newIndex);\n }\n }, [currentSlide, canGoNext, infinite, maxSlides, goToSlide]);\n\n // Handle controlled mode\n useEffect(() => {\n if (currentIndex !== undefined && currentIndex !== currentSlide) {\n setCurrentSlide(currentIndex);\n }\n }, [currentIndex, currentSlide]);\n\n // Auto scroll functionality\n useEffect(() => {\n if (!autoScroll) return;\n\n const startInterval = () => {\n intervalRef.current = setInterval(() => {\n if (pauseScrollOnHover && isHovered) return;\n\n goToNext();\n }, scrollInterval);\n };\n\n const stopInterval = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n\n if (!isHovered || !pauseScrollOnHover) {\n startInterval();\n } else {\n stopInterval();\n }\n\n return stopInterval;\n }, [autoScroll, scrollInterval, pauseScrollOnHover, isHovered, goToNext]);\n\n // Reset to first slide when # of items to show changes\n useEffect(() => {\n setCurrentSlide(0);\n }, [itemsToShow]);\n\n return {\n currentSlide,\n canGoPrev,\n canGoNext,\n goToPrev,\n goToNext,\n goToSlide,\n isHovered,\n setIsHovered,\n };\n}\n","export const buttonSizeVariants = {\n sm: {\n button: 'h-6 w-6 text-xs',\n icon: 'size-3',\n },\n md: {\n button: 'h-8 w-8 text-sm',\n icon: 'size-4',\n },\n lg: {\n button: 'h-10 w-10 text-lg',\n icon: 'size-5',\n },\n};\n\nexport type ButtonSize = keyof typeof buttonSizeVariants;\n\nexport const buttonStyleVariants = {\n default: 'bg-accent text-accent-foreground hover:bg-accent-foreground hover:text-accent',\n outline: 'border border-border bg-background hover:bg-accent hover:text-accent-foreground hover:border-accent',\n ghost: 'hover:text-accent',\n};\n\nexport type ButtonStyle = keyof typeof buttonStyleVariants;\n\nexport const buttonPositionVariants = {\n aligned: {\n prev: 'absolute top-1/2 -translate-x-1/2 -translate-y-1/2 z-10',\n next: 'absolute right-0 top-1/2 translate-x-1/2 -translate-y-1/2 z-10',\n },\n exterior: {\n prev: 'absolute -left-10 top-1/2 -translate-y-1/2 z-10',\n next: 'absolute -right-10 top-1/2 -translate-y-1/2 z-10',\n },\n interior: {\n prev: 'absolute left-2 top-1/2 -translate-y-1/2 z-10',\n next: 'absolute right-2 top-1/2 -translate-y-1/2 z-10',\n },\n};\n\nexport type ButtonPosition = keyof typeof buttonPositionVariants;\n","import React, { useCallback, useMemo, useRef } from 'react';\nimport { join } from '../../utils';\nimport { useCarousel } from './hooks';\nimport {\n ButtonPosition,\n buttonPositionVariants,\n ButtonSize,\n buttonSizeVariants,\n ButtonStyle,\n buttonStyleVariants,\n} from './variants';\nimport { ChevronLeft, ChevronRight } from '../../symbols';\nimport { ScreenSize, useScreenSize } from '../../hooks';\n\ninterface ButtonElementProps {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n disabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n 'data-carousel-prev'?: string;\n 'data-carousel-next'?: string;\n}\n\nexport interface CarouselProps {\n children: React.ReactNode;\n id?: string;\n ref?: React.Ref<HTMLDivElement>;\n className?: string;\n /** Enable automatic scrolling */\n autoScroll?: boolean;\n /** Interval in milliseconds for auto scroll */\n scrollInterval?: number;\n /** Pause auto scroll on hover */\n pauseScrollOnHover?: boolean;\n /** Manually control the current index */\n currentIndex?: number;\n /** Callback when index changes */\n onIndexChange?: (index: number) => void;\n /** Hide previous/next navigation buttons */\n hidePrevNext?: boolean;\n /** Hide dot indicators */\n hideDots?: boolean;\n /** Number of items to show at once, or breakpoint object mapping screen sizes to item counts */\n itemsToShow?: number | Partial<Record<ScreenSize, number>>;\n /** Size variant for navigation buttons */\n buttonSize?: ButtonSize;\n /** Style variant for navigation buttons */\n buttonVariant?: ButtonStyle;\n /** Position of navigation buttons relative to carousel */\n buttonPosition?: ButtonPosition;\n /** Enable infinite scrolling */\n infinite?: boolean;\n /** Custom previous button content */\n prevButton?: React.ReactNode;\n /** Custom next button content */\n nextButton?: React.ReactNode;\n /** Additional class names for carousel items */\n itemsClassName?: string;\n /** Additional class names for the carousel container */\n containerClassName?: string;\n /** Additional class names for the dot indicators */\n dotsClassName?: string;\n /** Gap between carousel items in pixels */\n gap?: number;\n}\n\n/**\n * A responsive carousel component for displaying multiple items in a sliding interface.\n * Supports auto-scroll, infinite looping, responsive breakpoints, and extensive customization.\n * \n * @example\n * ```tsx\n * // Basic carousel\n * <Carousel itemsToShow={3} autoScroll infinite>\n * <div>Slide 1</div>\n * <div>Slide 2</div>\n * <div>Slide 3</div>\n * </Carousel>\n * \n * // Responsive carousel with breakpoints\n * <Carousel \n * itemsToShow={{ xs: 1, md: 2, lg: 3 }}\n * gap={16}\n * buttonPosition=\"aligned\"\n * >\n * {products.map(product => <ProductCard key={product.id} {...product} />)}\n * </Carousel>\n * ```\n */\nexport function Carousel({\n children,\n id,\n ref,\n className,\n autoScroll = false,\n scrollInterval = 3000,\n pauseScrollOnHover = true,\n currentIndex,\n onIndexChange,\n hidePrevNext = false,\n hideDots = false,\n itemsToShow = 1,\n buttonSize = 'md',\n buttonVariant = 'default',\n buttonPosition = 'exterior',\n infinite = true,\n prevButton,\n nextButton,\n itemsClassName,\n containerClassName,\n dotsClassName,\n gap = 8,\n}: CarouselProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const childrenArray = React.Children.toArray(children).filter(React.isValidElement);\n const totalItems = childrenArray.length;\n const { screenSize } = useScreenSize();\n\n // Resolve the current itemsToShow based on screen size or use the number value\n const currentItemsToShow = useMemo(() => {\n if (typeof itemsToShow === 'number') {\n return itemsToShow;\n }\n\n if (typeof itemsToShow === 'object' && itemsToShow && screenSize) {\n // Start from current screen size and work down to find a defined value\n const breakpointOrder: Array<ScreenSize> = ['2xl', 'xl', 'lg', 'md', 'sm', 'xs'];\n const currentIndex = breakpointOrder.indexOf(screenSize);\n\n for (let i = currentIndex; i < breakpointOrder.length; i++) {\n const breakpoint = breakpointOrder[i];\n if (itemsToShow[breakpoint] !== undefined) {\n return itemsToShow[breakpoint]!;\n }\n }\n }\n\n return 1; // Default fallback\n }, [itemsToShow, screenSize]);\n\n const { currentSlide, canGoPrev, canGoNext, goToPrev, goToNext, goToSlide, setIsHovered } = useCarousel({\n totalItems,\n itemsToShow: currentItemsToShow,\n infinite,\n autoScroll,\n scrollInterval,\n pauseScrollOnHover,\n currentIndex,\n onIndexChange,\n });\n\n const getSlideItemStyles = useCallback(\n (pos: number) => {\n // If only showing one item\n if (currentItemsToShow === 1) {\n return { leftWidth: 0, rightWidth: 0, widthReduction: 0 };\n }\n\n const widthReduction = (gap * (currentItemsToShow - 1)) / currentItemsToShow;\n // If item is first element of a slide\n if (pos % currentItemsToShow === 0) {\n return { leftWidth: 0, rightWidth: gap / 2, widthReduction };\n }\n\n // If item is last element of a slide\n if (pos % currentItemsToShow === currentItemsToShow - 1) {\n return { leftWidth: gap / 2, rightWidth: 0, widthReduction };\n }\n\n // If item is a middle element of a slide\n return { leftWidth: gap / 2, rightWidth: gap / 2, widthReduction };\n },\n [currentItemsToShow, gap]\n );\n\n const handlePrevClick = () => {\n goToPrev();\n };\n\n const handleNextClick = () => {\n goToNext();\n };\n\n const handleMouseEnter = () => {\n if (pauseScrollOnHover) {\n setIsHovered(true);\n }\n };\n\n const handleMouseLeave = () => {\n if (pauseScrollOnHover) {\n setIsHovered(false);\n }\n };\n\n const translateX = -(currentSlide * (100 / totalItems) * currentItemsToShow);\n\n // Base styles for carousel buttons\n const baseButtonStyles = join(\n 'inline-flex items-center justify-center rounded-md font-medium transition-all focus-visible:outline-none focus-visible:ring focus-visible:ring-ring disabled:pointer-events-none',\n buttonPosition === 'aligned' ? 'disabled:opacity-90' : 'disabled:opacity-50'\n );\n\n return (\n <div className={join('relative', className)} data-carousel-wrapper='true'>\n {/* Navigation Buttons - Previous */}\n {!hidePrevNext && (\n <>\n {prevButton ? (\n React.cloneElement(\n prevButton as React.ReactElement,\n {\n onClick: handlePrevClick,\n disabled: !canGoPrev,\n className: join(\n (prevButton as React.ReactElement<{ className?: string }>).props?.className || '',\n buttonPositionVariants[buttonPosition].prev\n ),\n role: 'button',\n 'aria-disabled': !canGoPrev,\n 'aria-label': 'Previous slide',\n 'data-carousel-prev': 'true',\n } as ButtonElementProps\n )\n ) : (\n <button\n type='button'\n onClick={handlePrevClick}\n disabled={!canGoPrev}\n className={join(\n baseButtonStyles,\n buttonSizeVariants[buttonSize].button,\n buttonStyleVariants[buttonVariant],\n buttonPositionVariants[buttonPosition].prev\n )}\n aria-disabled={!canGoPrev}\n aria-label='Previous slide'\n data-carousel-prev='true'\n >\n <ChevronLeft className={buttonSizeVariants[buttonSize].icon} />\n </button>\n )}\n </>\n )}\n\n <div\n id={id}\n ref={ref}\n className={join('relative overflow-hidden', containerClassName)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-carousel='true'\n data-current-index={currentSlide}\n data-items-to-show={currentItemsToShow}\n data-auto-scroll={autoScroll}\n data-button-position={buttonPosition}\n >\n {/* Carousel Track */}\n <div\n ref={containerRef}\n className='flex transition-transform duration-300 ease-in-out'\n style={{\n transform: `translateX(${translateX}%)`,\n width: `${(totalItems / currentItemsToShow) * 100}%`,\n }}\n >\n {childrenArray.map((child, index) => {\n const { leftWidth, rightWidth, widthReduction } = getSlideItemStyles(index);\n return (\n <div\n key={index}\n className={join('flex-shrink-0', itemsClassName)}\n style={{\n width: `calc(${100 / totalItems}% - ${widthReduction}px)`,\n marginRight: rightWidth > 0 ? `${rightWidth}px` : undefined,\n marginLeft: leftWidth > 0 ? `${leftWidth}px` : undefined,\n }}\n data-slide-index={index}\n >\n {child}\n </div>\n );\n })}\n </div>\n\n {/* Dots Indicator */}\n {!hideDots && (\n <div className='absolute bottom-4 left-1/2 -translate-x-1/2 flex space-x-2'>\n {Array.from({ length: Math.ceil(totalItems / currentItemsToShow) }).map((_, index) => (\n <button\n key={index}\n type='button'\n onClick={() => goToSlide(index)}\n className={join(\n 'w-2 h-2 rounded-full transition-colors duration-200',\n index === currentSlide ? 'bg-accent' : 'bg-muted hover:bg-muted-foreground/50',\n dotsClassName\n )}\n aria-label={`Go to slide ${index + 1}`}\n data-carousel-dot={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Navigation Buttons - Next */}\n {!hidePrevNext && (\n <>\n {nextButton ? (\n React.cloneElement(\n nextButton as React.ReactElement,\n {\n onClick: handleNextClick,\n disabled: !canGoNext,\n className: join(\n (nextButton as React.ReactElement<{ className?: string }>).props?.className || '',\n buttonPositionVariants[buttonPosition].next\n ),\n role: 'button',\n 'aria-disabled': !canGoNext,\n 'aria-label': 'Next slide',\n 'data-carousel-next': 'true',\n } as ButtonElementProps\n )\n ) : (\n <button\n type='button'\n onClick={handleNextClick}\n disabled={!canGoNext}\n className={join(\n baseButtonStyles,\n buttonSizeVariants[buttonSize].button,\n buttonStyleVariants[buttonVariant],\n buttonPositionVariants[buttonPosition].next\n )}\n aria-disabled={!canGoNext}\n aria-label='Next slide'\n data-carousel-next='true'\n >\n <ChevronRight className={buttonSizeVariants[buttonSize].icon} />\n </button>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useFilledBackgroundColor(id: string) {\n const [filledBackgroundColor, setFilledBackgroundColor] = useState<string>('');\n\n const getFirstNonTransparentBackgroundColor = useCallback((element: Element | null): string => {\n let currentElement = element;\n let color = '';\n while (currentElement && !color) {\n const backgroundColor = window.getComputedStyle(currentElement).backgroundColor;\n if (backgroundColor && backgroundColor !== 'transparent' && backgroundColor !== 'rgba(0, 0, 0, 0)') {\n color = backgroundColor;\n }\n currentElement = currentElement.parentElement;\n }\n return color || 'transparent';\n }, []);\n\n useEffect(() => {\n const checkbox = document.getElementById(id);\n if (checkbox) {\n const backgroundColor = getFirstNonTransparentBackgroundColor(checkbox.parentElement);\n setFilledBackgroundColor(backgroundColor);\n }\n }, [id, getFirstNonTransparentBackgroundColor]);\n\n return filledBackgroundColor;\n}\n","import React, { Ref, useEffect, useId, useMemo, useState } from 'react';\nimport { Check, Dash } from '../../symbols';\nimport { join } from '../../utils';\nimport { useFilledBackgroundColor } from './hooks';\n\nexport interface CheckboxProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n\t/** Reference to the checkbox element. */\n\tref?: Ref<HTMLButtonElement>;\n\t/** The size of the checkbox in pixels. */\n\tsize?: number;\n\t/** CSS color value or Tailwind class for the checkbox color. */\n\tcolor?: string; // can be adjusted with tailwindcss by using `text-<color>`\n\t/** Whether to fill the checkbox background when checked. */\n\tfilled?: boolean;\n\t/** Whether the checkbox should have rounded corners. */\n\trounded?: boolean;\n\t/** Whether the checkbox is checked (controlled). */\n\tchecked?: boolean;\n\t/** Whether the checkbox is in an indeterminate state. */\n\tindeterminate?: boolean;\n\t/** Callback fired when the checkbox state changes. */\n\tonCheckedChange?: (checked: boolean) => void;\n\t/** The display style of the checkbox. */\n\tdisplay?: 'inline' | 'block';\n}\n\n/**\n * A customizable checkbox component with support for checked, unchecked, and indeterminate states.\n * Provides keyboard navigation and accessibility features with flexible styling options.\n * \n * @example\n * ```tsx\n * // Basic checkbox\n * <Checkbox \n * checked={isChecked}\n * onCheckedChange={setIsChecked}\n * />\n * \n * // Styled checkbox\n * <Checkbox\n * size={24}\n * color=\"blue\"\n * filled\n * rounded={false}\n * onCheckedChange={(checked) => console.log(checked)}\n * />\n * \n * // Indeterminate state\n * <Checkbox indeterminate onCheckedChange={handleSelection} />\n * ```\n */\nexport function Checkbox({\n\tref,\n\tid,\n\tsize = 20,\n\tcolor,\n\tfilled = false,\n\trounded = true,\n\tchecked = false,\n\tindeterminate = false,\n\tonCheckedChange,\n\tdisabled,\n\tclassName = '',\n\tdisplay = 'inline',\n\t...props\n}: CheckboxProps) {\n\tconst generatedId = useId();\n\tconst checkboxId = useMemo(() => id || `checkbox-${generatedId}`, [id, generatedId]);\n\tconst parentBackgroundColor = useFilledBackgroundColor(checkboxId);\n\tconst [isChecked, setIsChecked] = useState(checked);\n\tconst [isIndeterminate, setIsIndeterminate] = useState(indeterminate);\n\n\tuseEffect(() => {\n\t\tsetIsChecked(checked);\n\t}, [checked]);\n\n\tuseEffect(() => {\n\t\tsetIsIndeterminate(indeterminate);\n\t}, [indeterminate]);\n\n\tconst handleChange = () => {\n\t\tif (!disabled) {\n\t\t\t// When indeterminate, clicking should make it checked\n\t\t\t// When checked, clicking should make it unchecked\n\t\t\t// When unchecked, clicking should make it checked\n\t\t\tconst newChecked = isIndeterminate ? true : !isChecked;\n\t\t\tsetIsChecked(newChecked);\n\t\t\tsetIsIndeterminate(false); // Clear indeterminate state on user interaction\n\t\t\tonCheckedChange?.(newChecked);\n\t\t}\n\t};\n\n\tconst handleOnKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\thandleChange();\n\t\t}\n\t};\n\n\tconst checkboxClasses = join(\n\t\t'items-center justify-center border outline outline-transparent focus:outline-current focus:outline-offset-2',\n\t\tdisplay === 'inline' ? 'inline-flex' : 'flex',\n\t\trounded && 'rounded',\n\t\tdisabled && 'opacity-40 cursor-not-allowed',\n\t\t!disabled && 'cursor-pointer',\n\t\tclassName\n\t);\n\n\treturn (\n\t\t<button\n\t\t\tid={checkboxId}\n\t\t\ttype='button'\n\t\t\tref={ref}\n\t\t\ttabIndex={0}\n\t\t\trole='checkbox'\n\t\t\tonClick={handleChange}\n\t\t\taria-checked={isIndeterminate ? 'mixed' : isChecked}\n\t\t\taria-disabled={disabled}\n\t\t\tonKeyDownCapture={handleOnKeyDown}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: size,\n\t\t\t\tcolor: color,\n\t\t\t\tbackgroundColor: (isChecked || isIndeterminate) && filled ? 'currentcolor' : 'transparent',\n\t\t\t}}\n\t\t\tclassName={checkboxClasses}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isIndeterminate ? (\n\t\t\t\t<Dash size={size} color={filled ? parentBackgroundColor : undefined} />\n\t\t\t) : (\n\t\t\t\t<Check\n\t\t\t\t\tsize={size}\n\t\t\t\t\tcolor={filled ? parentBackgroundColor : undefined}\n\t\t\t\t\tclassName={isChecked ? 'opacity-100' : 'opacity-0'}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</button>\n\t);\n}\n","import { join } from '../../utils';\n\nexport interface ClickableProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onClick'> {\n /** The content to make clickable. */\n children: React.ReactNode;\n /** URL for link functionality. When provided, renders an anchor element. */\n linkTo?: React.HTMLProps<HTMLAnchorElement>['href'];\n /** Additional props to pass to the anchor element when using linkTo. */\n linkProps?: Omit<React.HTMLProps<HTMLAnchorElement>, 'href'>;\n /** Click handler for button functionality. Ignored when linkTo is provided. */\n onButtonClick?: React.HTMLProps<HTMLButtonElement>['onClick'];\n /** Additional props to pass to the button element when using onButtonClick. */\n buttonProps?: Omit<React.HTMLProps<HTMLButtonElement>, 'onClick'>;\n}\n\n/**\n * A wrapper component that makes any content clickable by overlaying an invisible button or link.\n * Preserves the visual layout while adding interaction behavior.\n * \n * @example\n * ```tsx\n * // Make a card clickable as a link\n * <Clickable linkTo=\"/product/123\">\n * <Card>\n * <h3>Product Title</h3>\n * <p>Product description</p>\n * </Card>\n * </Clickable>\n * \n * // Make content clickable as a button\n * <Clickable onButtonClick={() => openModal()}>\n * <div className=\"flex items-center gap-2\">\n * <Icon />\n * <span>Click me</span>\n * </div>\n * </Clickable>\n * ```\n */\nexport function Clickable({\n children,\n className,\n linkTo,\n linkProps,\n onButtonClick,\n buttonProps,\n ...props\n}: ClickableProps) {\n if (linkTo && onButtonClick) {\n console.warn('Clickable: Both \"linkTo\" and \"onButtonClick\" props are provided. Only \"linkTo\" will be used.');\n }\n\n return (\n <div className={join('relative w-fit', className)} {...props}>\n {children}\n\n {/* Link */}\n {linkTo && (\n <a\n {...linkProps}\n rel={linkProps?.rel || 'noreferrer'}\n href={linkTo}\n className={join('absolute inset-0', linkProps?.className)}\n />\n )}\n\n {/* Button */}\n {!linkTo && onButtonClick && (\n <button\n {...buttonProps}\n type='button'\n onClick={onButtonClick}\n className={join('absolute inset-0 cursor-pointer', buttonProps?.className)}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\ninterface FontMetrics {\n fontSize: number;\n lineHeight: number;\n smallerFontSize: number;\n smallerLineHeight: number;\n}\n\nexport function useFontMetrics(id: string): FontMetrics | null {\n const [metrics, setMetrics] = useState<FontMetrics | null>(null);\n\n useEffect(() => {\n const element = document.getElementById(id)?.parentElement;\n if (!element) return;\n\n const computeMetrics = () => {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize);\n\n const lineHeight =\n computed.lineHeight === 'normal'\n ? fontSize * 1.2 // browser default approximation\n : parseFloat(computed.lineHeight);\n\n const smallerFontSize = fontSize - 2; // 2px smaller (accounts for vertical padding)\n const scale = smallerFontSize / fontSize;\n const smallerLineHeight = lineHeight * scale;\n\n setMetrics({\n fontSize,\n lineHeight,\n smallerFontSize,\n smallerLineHeight,\n });\n };\n\n computeMetrics();\n\n // Observe layout-affecting changes (i.e. breakpoint changes)\n const resizeObserver = new ResizeObserver(computeMetrics);\n resizeObserver.observe(element);\n\n // Observe inline style / class changes\n const mutationObserver = new MutationObserver(computeMetrics);\n mutationObserver.observe(element, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: false,\n });\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [id]);\n\n return metrics;\n}\n","export const codeVariants = {\n base: '',\n modest: 'opacity-90 bg-muted/10',\n accent: 'text-accent bg-muted/10',\n current: 'text-current bg-current/10',\n};\n\nexport type CodeVariant = keyof typeof codeVariants;\n","import React, { useId } from 'react';\nimport { join } from '../../utils';\nimport { useFontMetrics } from './hooks';\nimport { CodeVariant, codeVariants } from './variants';\n\nexport interface CodeProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {\n /** Unique identifier for the code element. */\n id?: string;\n /** Reference to the code element. */\n ref?: React.Ref<HTMLElement>;\n /** The code content to display. */\n content: string;\n /** The visual style variant of the code. */\n variant?: CodeVariant;\n}\n\n/**\n * An inline code component for displaying short code snippets within text.\n * Automatically adjusts font metrics and provides different visual variants.\n * \n * @example\n * ```tsx\n * // Basic inline code\n * <p>Use the <Code content=\"useState\" /> hook for state management.</p>\n * \n * // Different variants\n * <Code content=\"const foo = 'bar'\" variant=\"muted\" />\n * <Code content=\"npm install react\" variant=\"accent\" />\n * ```\n */\nexport function Code({ id, ref, content, variant = 'accent', className, style, ...props }: CodeProps) {\n const generatedId = useId();\n const codeId = id || `code-${generatedId}`;\n const fontMetrics = useFontMetrics(codeId);\n\n return (\n <code\n id={codeId}\n ref={ref}\n className={join('px-2 py-1 rounded', codeVariants[variant], className)}\n data-variant={variant}\n style={{\n fontSize: fontMetrics ? `${fontMetrics.smallerFontSize}px` : undefined,\n lineHeight: fontMetrics ? `${fontMetrics.smallerLineHeight}px` : undefined,\n ...style,\n }}\n {...props}\n >\n {content}\n </code>\n );\n}\n","import { BashTokenClasses, CSSTokenClasses, JsonTokenClasses, MarkdownTokenClasses, TSTokenClasses } from './types';\n\nexport const defaultBashTokenClasses: BashTokenClasses = {\n keyword: 'text-rose-400',\n runner: 'text-amber-400',\n comment: 'text-gray-500/80',\n command: 'text-gray-100',\n variable: 'text-blue-400',\n string: 'text-white/70',\n option: 'text-purple-400',\n plain: 'text-gray-200',\n operator: 'text-pink-500',\n substitution: 'text-green-300',\n};\n\nexport const defaultCSSTokenClasses: CSSTokenClasses = {\n selector: 'text-blue-400 font-medium',\n property: 'text-purple-400',\n value: 'text-green-400',\n punctuation: 'text-gray-400',\n atRule: 'text-pink-400 font-semibold',\n comment: 'text-gray-500 italic',\n string: 'text-green-400',\n number: 'text-green-400',\n plain: 'text-gray-100',\n function: 'text-cyan-400',\n};\n\nexport const defaultJsonTokenClasses: JsonTokenClasses = {\n key: 'text-purple-400 font-semibold',\n string: 'text-green-400',\n number: 'text-orange-400 font-medium',\n boolean: 'text-cyan-400 font-medium',\n punctuation: 'text-gray-400',\n plain: 'text-gray-100',\n};\n\nexport const defaultMarkdownTokenClasses: MarkdownTokenClasses = {\n heading: 'text-blue-400 font-bold',\n 'heading-hash': 'text-gray-500',\n bold: 'text-white font-bold',\n italic: 'text-white italic',\n 'bold-marker': 'text-gray-400',\n 'italic-marker': 'text-gray-400',\n link: 'text-blue-400 underline',\n 'link-text': 'text-blue-400',\n 'link-url': 'text-green-400',\n 'link-bracket': 'text-gray-400',\n 'link-paren': 'text-gray-400',\n code: 'text-pink-400 bg-gray-800 px-1 rounded text-sm',\n 'code-marker': 'text-gray-500',\n 'code-block': 'text-green-400',\n 'code-block-marker': 'text-gray-500',\n 'list-marker': 'text-orange-400 font-medium',\n 'list-item': 'text-gray-200',\n blockquote: 'text-gray-300 italic',\n 'blockquote-marker': 'text-gray-500',\n plain: 'text-gray-200',\n};\n\nexport const defaultTSTokenClasses: TSTokenClasses = {\n keyword: 'text-purple-400 font-semibold',\n type: 'text-cyan-400 font-medium',\n string: 'text-green-400',\n 'jsx-bracket': 'text-gray-400',\n 'jsx-tag': 'text-blue-400 font-medium',\n 'jsx-attribute': 'text-amber-400',\n 'jsx-brace': 'text-yellow-400',\n jsx: 'text-blue-400 font-medium', // fallback for old jsx type\n property: 'text-amber-400',\n number: 'text-orange-400 font-medium',\n comment: 'text-gray-500 italic',\n function: 'text-rose-400 font-semibold',\n hook: 'text-rose-400 font-semibold',\n operator: 'text-gray-300',\n plain: 'text-gray-100',\n};\n","// Bash\nexport const BASH_KEYWORDS = new Set([\n 'for',\n 'in',\n 'do',\n 'done',\n 'else',\n 'if',\n 'fi',\n 'then',\n 'while',\n 'until',\n 'case',\n 'esac',\n]);\nexport const BASH_RUNNERS = new Set(['npm', 'npx', 'pnpm', 'yarn', 'vite']);\n","import { BASH_KEYWORDS, BASH_RUNNERS } from './constants';\nimport { BashTokenType, CSSTokenClasses, JsonTokenClasses, MarkdownTokenType, TSTokenType } from './types';\n\n/**\n * Parse template literal content, treating everything as string except ${} expressions\n */\nfunction parseTemplateLiteral(input: string): { tokens: Array<{ text: string; type: TSTokenType }>; consumed: number } {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet pos = 0;\n\n\t// Add opening backtick\n\ttokens.push({ text: '`', type: 'string' });\n\tpos = 1;\n\n\twhile (pos < input.length) {\n\t\tconst char = input[pos];\n\n\t\t// End of template literal\n\t\tif (char === '`') {\n\t\t\ttokens.push({ text: '`', type: 'string' });\n\t\t\tpos++;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Template expression ${...}\n\t\tif (char === '$' && pos + 1 < input.length && input[pos + 1] === '{') {\n\t\t\t// Add ${ as string markers\n\t\t\ttokens.push({ text: '${', type: 'string' });\n\t\t\tpos += 2;\n\n\t\t\t// Find the matching closing brace\n\t\t\tlet braceDepth = 1;\n\t\t\tconst exprStart = pos;\n\t\t\twhile (pos < input.length && braceDepth > 0) {\n\t\t\t\tif (input[pos] === '{') {\n\t\t\t\t\tbraceDepth++;\n\t\t\t\t} else if (input[pos] === '}') {\n\t\t\t\t\tbraceDepth--;\n\t\t\t\t}\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (braceDepth === 0) {\n\t\t\t\t// Parse the expression inside ${} as regular TypeScript\n\t\t\t\tconst expression = input.slice(exprStart, pos);\n\t\t\t\tif (expression.trim().length > 0) {\n\t\t\t\t\tconst exprTokens = tokenizeTypeScript(expression, false, 0);\n\t\t\t\t\ttokens.push(...exprTokens);\n\t\t\t\t}\n\n\t\t\t\t// Add closing brace\n\t\t\t\ttokens.push({ text: '}', type: 'string' });\n\t\t\t\tpos++;\n\t\t\t} else {\n\t\t\t\t// Unmatched braces, treat as string\n\t\t\t\ttokens.push({ text: input.slice(exprStart, pos), type: 'string' });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular string content - collect until we hit $ or `\n\t\tconst stringStart = pos;\n\t\twhile (\n\t\t\tpos < input.length &&\n\t\t\tinput[pos] !== '`' &&\n\t\t\t!(input[pos] === '$' && pos + 1 < input.length && input[pos + 1] === '{')\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\n\t\tif (pos > stringStart) {\n\t\t\ttokens.push({ text: input.slice(stringStart, pos), type: 'string' });\n\t\t}\n\t}\n\n\treturn { tokens, consumed: pos };\n}\n\n/**\n * Parse template literal continuation (when we start mid-template from previous line)\n */\nfunction parseTemplateLiteralContinuation(input: string): { tokens: Array<{ text: string; type: TSTokenType }> } {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet pos = 0;\n\n\twhile (pos < input.length) {\n\t\tconst char = input[pos];\n\n\t\t// End of template literal\n\t\tif (char === '`') {\n\t\t\ttokens.push({ text: '`', type: 'string' });\n\t\t\tpos++;\n\n\t\t\t// After closing backtick, continue parsing normally\n\t\t\tif (pos < input.length) {\n\t\t\t\tconst remainingTokens = tokenizeTypeScript(input.slice(pos), false, 0, false);\n\t\t\t\ttokens.push(...remainingTokens);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Template expression ${...}\n\t\tif (char === '$' && pos + 1 < input.length && input[pos + 1] === '{') {\n\t\t\t// Add ${ as string markers\n\t\t\ttokens.push({ text: '${', type: 'string' });\n\t\t\tpos += 2;\n\n\t\t\t// Find the matching closing brace\n\t\t\tlet braceDepth = 1;\n\t\t\tconst exprStart = pos;\n\t\t\twhile (pos < input.length && braceDepth > 0) {\n\t\t\t\tif (input[pos] === '{') {\n\t\t\t\t\tbraceDepth++;\n\t\t\t\t} else if (input[pos] === '}') {\n\t\t\t\t\tbraceDepth--;\n\t\t\t\t}\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (braceDepth === 0) {\n\t\t\t\t// Parse the expression inside ${} as regular TypeScript\n\t\t\t\tconst expression = input.slice(exprStart, pos);\n\t\t\t\tif (expression.trim().length > 0) {\n\t\t\t\t\tconst exprTokens = tokenizeTypeScript(expression, false, 0, false);\n\t\t\t\t\ttokens.push(...exprTokens);\n\t\t\t\t}\n\n\t\t\t\t// Add closing brace\n\t\t\t\ttokens.push({ text: '}', type: 'string' });\n\t\t\t\tpos++;\n\t\t\t} else {\n\t\t\t\t// Unmatched braces, treat as string\n\t\t\t\ttokens.push({ text: input.slice(exprStart), type: 'string' });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular string content - collect until we hit $ or `\n\t\tconst stringStart = pos;\n\t\twhile (\n\t\t\tpos < input.length &&\n\t\t\tinput[pos] !== '`' &&\n\t\t\t!(input[pos] === '$' && pos + 1 < input.length && input[pos + 1] === '{')\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\n\t\tif (pos > stringStart) {\n\t\t\ttokens.push({ text: input.slice(stringStart, pos), type: 'string' });\n\t\t}\n\t}\n\n\treturn { tokens };\n}\n\nexport function tokenizeBash(codeLine: string): { text: string; type: BashTokenType }[] {\n\tconst tokens: { text: string; type: BashTokenType }[] = [];\n\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn tokens;\n\t}\n\n\tif (codeLine.trim().startsWith('#')) {\n\t\ttokens.push({ text: codeLine, type: 'comment' });\n\t\treturn tokens;\n\t}\n\n\tconst regex =\n\t\t/(\\$\\([^)]*\\)|\"[^\"]*\"|'[^']*'|\\$[\\w_]+|[a-zA-Z_]\\w*=|--?[a-zA-Z0-9][\\w-]*(?:=.*)?|>>|>|#.*|\\s+|[^\\s]+)/g;\n\n\tconst processToken = (token: string): { text: string; type: BashTokenType }[] => {\n\t\t// Handle command substitution recursively\n\t\tif (/^\\$\\([^)]*\\)$/.test(token)) {\n\t\t\tconst inner = token.slice(2, -1);\n\t\t\treturn [{ text: '$(', type: 'operator' }, ...tokenizeBash(inner), { text: ')', type: 'operator' }];\n\t\t}\n\n\t\t// Handle double-quoted strings with variables inside\n\t\tif (/^\".*\"$/.test(token)) {\n\t\t\tconst inner = token.slice(1, -1);\n\t\t\tconst innerTokens: { text: string; type: BashTokenType }[] = [];\n\t\t\tlet lastIndex = 0;\n\t\t\tconst varRegex = /\\$[\\w_]+/g;\n\t\t\tlet match;\n\t\t\twhile ((match = varRegex.exec(inner)) !== null) {\n\t\t\t\tif (match.index > lastIndex) {\n\t\t\t\t\tinnerTokens.push({\n\t\t\t\t\t\ttext: inner.slice(lastIndex, match.index),\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tinnerTokens.push({ text: match[0], type: 'variable' });\n\t\t\t\tlastIndex = match.index + match[0].length;\n\t\t\t}\n\t\t\tif (lastIndex < inner.length) {\n\t\t\t\tinnerTokens.push({ text: inner.slice(lastIndex), type: 'string' });\n\t\t\t}\n\t\t\treturn [{ text: '\"', type: 'string' }, ...innerTokens, { text: '\"', type: 'string' }];\n\t\t}\n\n\t\t// Single-quoted strings are literal\n\t\tif (/^'.*'$/.test(token)) {\n\t\t\treturn [{ text: token, type: 'string' }];\n\t\t}\n\n\t\tif (/^\\$[\\w_]+$/.test(token)) return [{ text: token, type: 'variable' }];\n\t\tif (/^[a-zA-Z_]\\w*=$/.test(token)) return [{ text: token, type: 'variable' }];\n\t\tif (/^--?[a-zA-Z0-9][\\w-]*(=.*)?$/.test(token)) return [{ text: token, type: 'option' }];\n\t\tif (/^>>|>$/.test(token)) return [{ text: token, type: 'operator' }];\n\t\tif (/^#.*$/.test(token)) return [{ text: token, type: 'comment' }];\n\t\tif (/^\\s+$/.test(token)) return [{ text: token, type: 'plain' }];\n\t\tif (BASH_KEYWORDS.has(token)) return [{ text: token, type: 'keyword' }];\n\t\tif (BASH_RUNNERS.has(token)) return [{ text: token, type: 'runner' }];\n\t\treturn [{ text: token, type: 'command' }];\n\t};\n\n\tlet match;\n\twhile ((match = regex.exec(codeLine)) !== null) {\n\t\ttokens.push(...processToken(match[0]));\n\t}\n\n\treturn tokens;\n}\n\nexport function tokenizeCSS(codeLine: string, isInComment: boolean = false) {\n\tconst tokens: Array<{ text: string; type: keyof CSSTokenClasses }> = [];\n\tlet inMultilineComment = isInComment;\n\n\t// Preserve empty lines as a non-breaking space\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn { tokens, inComment: inMultilineComment };\n\t}\n\n\t// Context tracking - initialize based on line content\n\tlet context: 'selector' | 'property' | 'value' = 'selector';\n\tlet braceDepth = 0;\n\n\t// If line starts with whitespace and has a colon, likely a property declaration\n\tif (codeLine.match(/^\\s+/) && codeLine.includes(':') && !codeLine.includes('{')) {\n\t\tcontext = 'property';\n\t\tbraceDepth = 1; // Assume we're inside a rule block\n\t}\n\n\tconst regex =\n\t\t/(\\/\\*[\\s\\S]*?\\*\\/|\\/\\*[\\s\\S]*$|\\*\\/)|(@[a-zA-Z-]+)|(\\{|\\}|:|;|,|\\(|\\))|(\"(?:[^\"]*)\"|'(?:[^']*)')|([a-zA-Z-]+)(?=\\()|([0-9.]+(?:px|rem|em|%|vh|vw|deg|s|ms|fr)?)|(#[a-fA-F0-9]{3,8})|([a-zA-Z0-9_-]+|[.#][a-zA-Z0-9_-]+)|(\\s+)|(\\S+)/g;\n\n\tlet match;\n\twhile ((match = regex.exec(codeLine))) {\n\t\tconst [, comment, atRule, punctuation, str, func, number, hexColor, identifier, whitespace, plain] = match;\n\n\t\tif (comment) {\n\t\t\t// Handle multiline comments\n\t\t\tif (comment.includes('/*') && !comment.includes('*/')) {\n\t\t\t\tinMultilineComment = true;\n\t\t\t} else if (comment.includes('*/')) {\n\t\t\t\tinMultilineComment = false;\n\t\t\t}\n\t\t\ttokens.push({ text: comment, type: 'comment' });\n\t\t} else if (inMultilineComment) {\n\t\t\t// Everything is a comment until we see */\n\t\t\tif (match[0].includes('*/')) {\n\t\t\t\tinMultilineComment = false;\n\t\t\t}\n\t\t\ttokens.push({ text: match[0], type: 'comment' });\n\t\t} else if (atRule) {\n\t\t\ttokens.push({ text: atRule, type: 'atRule' });\n\t\t} else if (func) {\n\t\t\ttokens.push({ text: func, type: 'function' });\n\t\t} else if (punctuation) {\n\t\t\tif (punctuation === '{') {\n\t\t\t\tbraceDepth++;\n\t\t\t\tcontext = 'property';\n\t\t\t} else if (punctuation === '}') {\n\t\t\t\tbraceDepth--;\n\t\t\t\tcontext = braceDepth > 0 ? 'property' : 'selector';\n\t\t\t} else if (punctuation === ':') {\n\t\t\t\t// Only switch to value context if we're currently in property context\n\t\t\t\tif (context === 'property') {\n\t\t\t\t\tcontext = 'value';\n\t\t\t\t}\n\t\t\t} else if (punctuation === ';') {\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tcontext = 'property';\n\t\t\t\t}\n\t\t\t} else if (punctuation === ',') {\n\t\t\t\t// Comma in selector context or value context - maintain current context\n\t\t\t\tif (braceDepth === 0) {\n\t\t\t\t\tcontext = 'selector';\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({ text: punctuation, type: 'punctuation' });\n\t\t} else if (str) {\n\t\t\ttokens.push({ text: str, type: 'string' });\n\t\t} else if (number) {\n\t\t\ttokens.push({ text: number, type: 'number' });\n\t\t} else if (hexColor) {\n\t\t\ttokens.push({ text: hexColor, type: 'value' });\n\t\t} else if (identifier) {\n\t\t\tlet tokenType: keyof CSSTokenClasses;\n\n\t\t\t// Special handling for selectors (class/id prefixes)\n\t\t\tif (identifier.startsWith('.') || identifier.startsWith('#')) {\n\t\t\t\ttokenType = 'selector';\n\t\t\t} else if (context === 'selector') {\n\t\t\t\ttokenType = 'selector';\n\t\t\t} else if (context === 'property') {\n\t\t\t\ttokenType = 'property';\n\t\t\t} else {\n\t\t\t\t// context === 'value'\n\t\t\t\ttokenType = 'value';\n\t\t\t}\n\n\t\t\ttokens.push({ text: identifier, type: tokenType });\n\t\t} else if (whitespace) {\n\t\t\ttokens.push({ text: whitespace.replace(/ /g, '\\u00A0'), type: 'plain' });\n\t\t} else if (plain) {\n\t\t\t// Default unknown tokens to value if we're in value context, otherwise plain\n\t\t\tconst type = context === 'value' ? 'value' : 'plain';\n\t\t\ttokens.push({ text: plain, type });\n\t\t}\n\t}\n\n\treturn { tokens, inComment: inMultilineComment };\n}\n\nexport function tokenizeJSON(codeLine: string) {\n\tconst regex = /(\"[^\"]*\")\\s*(:)|(\"[^\"]*\")|(\\d+)|(true|false|null)|(\\{|\\}|\\[|\\]|,)/g;\n\tconst tokens: { text: string; type: keyof JsonTokenClasses }[] = [];\n\tlet lastIndex = 0;\n\tlet match;\n\twhile ((match = regex.exec(codeLine)) !== null) {\n\t\tif (match.index > lastIndex) {\n\t\t\ttokens.push({ text: codeLine.slice(lastIndex, match.index), type: 'plain' });\n\t\t}\n\t\tif (match[1] && match[2]) {\n\t\t\ttokens.push({ text: match[1], type: 'key' });\n\t\t\ttokens.push({ text: match[2], type: 'punctuation' });\n\t\t} else if (match[3]) {\n\t\t\ttokens.push({ text: match[3], type: 'string' });\n\t\t} else if (match[4]) {\n\t\t\ttokens.push({ text: match[4], type: 'number' });\n\t\t} else if (match[5]) {\n\t\t\ttokens.push({ text: match[5], type: 'boolean' });\n\t\t} else if (match[6]) {\n\t\t\ttokens.push({ text: match[6], type: 'punctuation' });\n\t\t}\n\t\tlastIndex = regex.lastIndex;\n\t}\n\tif (lastIndex < codeLine.length) {\n\t\ttokens.push({ text: codeLine.slice(lastIndex), type: 'plain' });\n\t}\n\treturn tokens;\n}\n\nexport function tokenizeTypeScript(\n\tcodeLine: string,\n\tinheritedJSXContext: boolean = false,\n\tinheritedBraceDepth: number = 0,\n\tinTemplateLiteral: boolean = false\n) {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet remaining = codeLine;\n\tlet isInJSX = inheritedJSXContext;\n\tlet jsxBraceDepth = inheritedBraceDepth; // Track JSX expression depth\n\n\t// If we start in a template literal, treat the entire line as template literal content\n\tif (inTemplateLiteral) {\n\t\tconst templateResult = parseTemplateLiteralContinuation(remaining);\n\t\ttokens.push(...templateResult.tokens);\n\t\treturn tokens;\n\t}\n\n\twhile (remaining.length > 0) {\n\t\t// Multi-line comments\n\t\tconst multiComment = remaining.match(/^\\/\\*[\\s\\S]*?\\*\\//);\n\t\tif (multiComment) {\n\t\t\ttokens.push({ text: multiComment[0], type: 'comment' });\n\t\t\tremaining = remaining.slice(multiComment[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Single line comments\n\t\tconst singleComment = remaining.match(/^\\/\\/.*$/m);\n\t\tif (singleComment) {\n\t\t\ttokens.push({ text: singleComment[0], type: 'comment' });\n\t\t\tremaining = remaining.slice(singleComment[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Template literals (backticks) - handle interpolation\n\t\tconst templateLiteralMatch = remaining.match(/^`/);\n\t\tif (templateLiteralMatch) {\n\t\t\tconst templateResult = parseTemplateLiteral(remaining);\n\t\t\ttokens.push(...templateResult.tokens);\n\t\t\tremaining = remaining.slice(templateResult.consumed);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular strings (double and single quotes)\n\t\tconst stringMatch = remaining.match(/^(\"[^\"]*\"|'[^']*')/);\n\t\tif (stringMatch) {\n\t\t\ttokens.push({ text: stringMatch[0], type: 'string' });\n\t\t\tremaining = remaining.slice(stringMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX opening tag start\n\t\tconst jsxOpenStart = remaining.match(/^<([a-zA-Z][a-zA-Z0-9]*)/);\n\t\tif (jsxOpenStart) {\n\t\t\ttokens.push({ text: '<', type: 'jsx-bracket' });\n\t\t\ttokens.push({ text: jsxOpenStart[1], type: 'jsx-tag' });\n\t\t\tremaining = remaining.slice(jsxOpenStart[0].length);\n\t\t\tisInJSX = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX closing tag\n\t\tconst jsxClose = remaining.match(/^<\\/([a-zA-Z][a-zA-Z0-9]*)>/);\n\t\tif (jsxClose) {\n\t\t\ttokens.push({ text: '</', type: 'jsx-bracket' });\n\t\t\ttokens.push({ text: jsxClose[1], type: 'jsx-tag' });\n\t\t\ttokens.push({ text: '>', type: 'jsx-bracket' });\n\t\t\tremaining = remaining.slice(jsxClose[0].length);\n\t\t\tisInJSX = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX self-closing or tag end\n\t\tif (remaining.match(/^\\/?>/)) {\n\t\t\tconst tagEnd = remaining.match(/^(\\/?>\\s*)/);\n\t\t\tif (tagEnd) {\n\t\t\t\ttokens.push({ text: tagEnd[1].trim(), type: 'jsx-bracket' });\n\t\t\t\tremaining = remaining.slice(tagEnd[1].length);\n\t\t\t\tif (tagEnd[1].includes('>')) {\n\t\t\t\t\tisInJSX = false;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// JSX attribute (only when explicitly in JSX context, followed by =, and not inside braces)\n\t\tconst jsxAttr = remaining.match(/^([a-zA-Z][a-zA-Z0-9]*)(\\s*)(=)/);\n\t\tif (jsxAttr && isInJSX && jsxBraceDepth === 0) {\n\t\t\ttokens.push({ text: jsxAttr[1], type: 'jsx-attribute' });\n\t\t\tif (jsxAttr[2]) {\n\t\t\t\t// Whitespace before =\n\t\t\t\ttokens.push({ text: jsxAttr[2], type: 'plain' });\n\t\t\t}\n\t\t\ttokens.push({ text: '=', type: 'plain' });\n\t\t\tremaining = remaining.slice(jsxAttr[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX expression braces\n\t\tconst jsxBrace = remaining.match(/^[{}]/);\n\t\tif (jsxBrace) {\n\t\t\ttokens.push({ text: jsxBrace[0], type: 'jsx-brace' });\n\t\t\tif (jsxBrace[0] === '{') {\n\t\t\t\tjsxBraceDepth++;\n\t\t\t} else if (jsxBrace[0] === '}') {\n\t\t\t\tjsxBraceDepth--;\n\t\t\t}\n\t\t\tremaining = remaining.slice(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Whitespace (preserve spaces)\n\t\tconst whitespace = remaining.match(/^\\s+/);\n\t\tif (whitespace) {\n\t\t\ttokens.push({ text: whitespace[0], type: 'plain' });\n\t\t\tremaining = remaining.slice(whitespace[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Operators (including arrow functions)\n\t\tconst operator = remaining.match(/^(=>|===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%=<>!&|^~?:;,()[\\]{}.])/);\n\t\tif (operator) {\n\t\t\ttokens.push({ text: operator[0], type: 'operator' });\n\t\t\tremaining = remaining.slice(operator[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Keywords\n\t\tconst keyword = remaining.match(\n\t\t\t/^(const|let|var|function|if|else|for|while|return|import|export|class|extends|interface|type|enum|async|await|public|private|protected|static|from|as|default|new|this|super|try|catch|finally|throw|break|continue|switch|case|typeof|instanceof)\\b/\n\t\t);\n\t\tif (keyword) {\n\t\t\ttokens.push({ text: keyword[0], type: 'keyword' });\n\t\t\tremaining = remaining.slice(keyword[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// React hooks (before function calls to avoid conflicts)\n\t\tconst hook = remaining.match(/^(use[A-Z][a-zA-Z]*)\\b/);\n\t\tif (hook) {\n\t\t\ttokens.push({ text: hook[0], type: 'hook' });\n\t\t\tremaining = remaining.slice(hook[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Function calls (word followed by opening parenthesis or optional chaining)\n\t\tconst func = remaining.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=(\\?\\.)?\\()/);\n\t\tif (func) {\n\t\t\ttokens.push({ text: func[1], type: 'function' });\n\t\t\tremaining = remaining.slice(func[1].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Types\n\t\tconst type = remaining.match(\n\t\t\t/^(string|number|boolean|object|any|void|never|unknown|null|undefined|Promise|Array|React\\.FC|FC|JSX\\.Element|HTMLElement|Event|MouseEvent|KeyboardEvent|ChangeEvent)\\b/\n\t\t);\n\t\tif (type) {\n\t\t\ttokens.push({ text: type[0], type: 'type' });\n\t\t\tremaining = remaining.slice(type[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Numbers\n\t\tconst number = remaining.match(/^(\\d+\\.?\\d*)/);\n\t\tif (number) {\n\t\t\ttokens.push({ text: number[0], type: 'number' });\n\t\t\tremaining = remaining.slice(number[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Object properties (word followed by colon, not in JSX)\n\t\tconst property = remaining.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=:)/);\n\t\tif (property && !isInJSX) {\n\t\t\ttokens.push({ text: property[1], type: 'property' });\n\t\t\tremaining = remaining.slice(property[1].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If nothing matched, take one character as plain text\n\t\ttokens.push({ text: remaining[0], type: 'plain' });\n\t\tremaining = remaining.slice(1);\n\t}\n\n\treturn tokens;\n}\n\nexport function tokenizeMarkdown(codeLine: string): { text: string; type: MarkdownTokenType }[] {\n\tconst tokens: { text: string; type: MarkdownTokenType }[] = [];\n\n\t// Preserve empty lines as a non-breaking space\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn tokens;\n\t}\n\n\tconst remaining = codeLine;\n\n\t// Headers (# ## ### etc.)\n\tconst headerMatch = remaining.match(/^(#{1,6})\\s*(.*)$/);\n\tif (headerMatch) {\n\t\ttokens.push({ text: headerMatch[1], type: 'heading-hash' });\n\t\tif (headerMatch[2]) {\n\t\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\t\ttokens.push({ text: headerMatch[2], type: 'heading' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Blockquote\n\tconst blockquoteMatch = remaining.match(/^(>\\s*)(.*)$/);\n\tif (blockquoteMatch) {\n\t\ttokens.push({ text: blockquoteMatch[1], type: 'blockquote-marker' });\n\t\tif (blockquoteMatch[2]) {\n\t\t\ttokens.push({ text: blockquoteMatch[2], type: 'blockquote' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// List items (- * + or numbered)\n\tconst listMatch = remaining.match(/^(\\s*)([-*+]|\\d+\\.)\\s*(.*)$/);\n\tif (listMatch) {\n\t\tif (listMatch[1]) tokens.push({ text: listMatch[1], type: 'plain' });\n\t\ttokens.push({ text: listMatch[2], type: 'list-marker' });\n\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\tif (listMatch[3]) {\n\t\t\t// Parse the rest of the line for inline formatting\n\t\t\tparseInlineMarkdown(listMatch[3], tokens);\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Code blocks (```language)\n\tconst codeBlockMatch = remaining.match(/^(```)\\s*(.*)$/);\n\tif (codeBlockMatch) {\n\t\ttokens.push({ text: codeBlockMatch[1], type: 'code-block-marker' });\n\t\tif (codeBlockMatch[2]) {\n\t\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\t\ttokens.push({ text: codeBlockMatch[2], type: 'code-block' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Regular line - parse for inline formatting\n\tparseInlineMarkdown(remaining, tokens);\n\treturn tokens;\n}\n\nfunction parseInlineMarkdown(text: string, tokens: { text: string; type: MarkdownTokenType }[]) {\n\tlet remaining = text;\n\n\twhile (remaining.length > 0) {\n\t\t// Links [text](url)\n\t\tconst linkMatch = remaining.match(/^(\\[)([^\\]]*?)(\\])(\\()([^)]*?)(\\))/);\n\t\tif (linkMatch) {\n\t\t\ttokens.push({ text: linkMatch[1], type: 'link-bracket' });\n\t\t\ttokens.push({ text: linkMatch[2], type: 'link-text' });\n\t\t\ttokens.push({ text: linkMatch[3], type: 'link-bracket' });\n\t\t\ttokens.push({ text: linkMatch[4], type: 'link-paren' });\n\t\t\ttokens.push({ text: linkMatch[5], type: 'link-url' });\n\t\t\ttokens.push({ text: linkMatch[6], type: 'link-paren' });\n\t\t\tremaining = remaining.slice(linkMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Inline code `code`\n\t\tconst codeMatch = remaining.match(/^(`+)([^`]*?)\\1/);\n\t\tif (codeMatch) {\n\t\t\ttokens.push({ text: codeMatch[1], type: 'code-marker' });\n\t\t\ttokens.push({ text: codeMatch[2], type: 'code' });\n\t\t\ttokens.push({ text: codeMatch[1], type: 'code-marker' });\n\t\t\tremaining = remaining.slice(codeMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Bold **text** or __text__\n\t\tconst boldMatch = remaining.match(/^(\\*\\*|__)([^*_]*?)\\1/);\n\t\tif (boldMatch) {\n\t\t\ttokens.push({ text: boldMatch[1], type: 'bold-marker' });\n\t\t\ttokens.push({ text: boldMatch[2], type: 'bold' });\n\t\t\ttokens.push({ text: boldMatch[1], type: 'bold-marker' });\n\t\t\tremaining = remaining.slice(boldMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Italic *text* or _text_\n\t\tconst italicMatch = remaining.match(/^(\\*|_)([^*_]*?)\\1/);\n\t\tif (italicMatch) {\n\t\t\ttokens.push({ text: italicMatch[1], type: 'italic-marker' });\n\t\t\ttokens.push({ text: italicMatch[2], type: 'italic' });\n\t\t\ttokens.push({ text: italicMatch[1], type: 'italic-marker' });\n\t\t\tremaining = remaining.slice(italicMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If no special formatting, take one character as plain text\n\t\ttokens.push({ text: remaining[0], type: 'plain' });\n\t\tremaining = remaining.slice(1);\n\t}\n}\n","import {\n\tdefaultBashTokenClasses,\n\tdefaultCSSTokenClasses,\n\tdefaultJsonTokenClasses,\n\tdefaultMarkdownTokenClasses,\n\tdefaultTSTokenClasses,\n} from './classes';\nimport { tokenizeBash, tokenizeCSS, tokenizeJSON, tokenizeMarkdown, tokenizeTypeScript } from './tokenize';\nimport {\n\tBashTokenClasses,\n\tCSSTokenClasses,\n\tJsonTokenClasses,\n\tMarkdownTokenClasses,\n\tTSTokenClasses,\n\tTSTokenType,\n} from './types';\n\nexport function formatBash(codeLines: string[], customTokenClasses?: BashTokenClasses) {\n\tconst mergedTokenClasses = {\n\t\t...defaultBashTokenClasses,\n\t\t...customTokenClasses,\n\t};\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\tconst tokens = tokenizeBash(line);\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token, tokenIndex) => (\n\t\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t\t{token.text}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatCSS(codeLines: string[], customTokenClasses?: CSSTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultCSSTokenClasses, ...customTokenClasses };\n\n\tlet inMultilineComment = false;\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\tconst { tokens, inComment } = tokenizeCSS(line, inMultilineComment);\n\t\tinMultilineComment = inComment;\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token, tokenIndex) => (\n\t\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t\t{token.text}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatJson(codeLines: string[], customTokenClasses?: JsonTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultJsonTokenClasses, ...customTokenClasses };\n\n\treturn codeLines.map((line, lineIndex) => (\n\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t{tokenizeJSON(line).map((token, tokenIndex) => (\n\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t{token.text}\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</div>\n\t));\n}\n\nexport function formatTypescript(codeLines: string[], customTokenClasses?: TSTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultTSTokenClasses, ...customTokenClasses };\n\n\tlet globalJSXContext = false; // Track JSX context across lines\n\tlet globalBraceDepth = 0; // Track JSX expression depth across lines\n\tlet inTemplateLiteral = false; // Track template literal context across lines\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\t// Handle empty lines by adding a non-breaking space\n\t\tif (line.trim() === '') {\n\t\t\treturn (\n\t\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t\t&nbsp;\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tconst tokens = tokenizeTypeScript(line, globalJSXContext, globalBraceDepth, inTemplateLiteral);\n\n\t\t// Update template literal context\n\t\tconst backtickCount = (line.match(/`/g) || []).length;\n\t\tif (backtickCount % 2 === 1) {\n\t\t\tinTemplateLiteral = !inTemplateLiteral;\n\t\t}\n\n\t\t// Update global JSX context based on this line's content\n\t\tif (line.includes('<') && line.match(/<[a-zA-Z]/)) {\n\t\t\tglobalJSXContext = true;\n\t\t}\n\t\tif (line.includes('>') && !line.includes('<')) {\n\t\t\tglobalJSXContext = false;\n\t\t\tglobalBraceDepth = 0; // Reset brace depth when exiting JSX\n\t\t}\n\n\t\t// Update global brace depth\n\t\tconst openBraces = (line.match(/\\{/g) || []).length;\n\t\tconst closeBraces = (line.match(/\\}/g) || []).length;\n\t\tglobalBraceDepth += openBraces - closeBraces;\n\t\tif (globalBraceDepth < 0) globalBraceDepth = 0;\n\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token: { text: string; type: TSTokenType }, tokenIndex: number) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={tokenIndex}\n\t\t\t\t\t\t\tclassName={mergedTokenClasses[token.type as keyof TSTokenClasses] || 'text-gray-100'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{token.text}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatMarkdown(codeLines: string[], customTokenClasses?: MarkdownTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultMarkdownTokenClasses, ...customTokenClasses };\n\n\treturn codeLines.map((line, lineIndex) => (\n\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t{tokenizeMarkdown(line).map((token, tokenIndex) => (\n\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t{token.text}\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</div>\n\t));\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useCopyToClipboard(text: string) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n\n setTimeout(() => setCopied(false), 3000);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [text]);\n\n return { copied, handleCopy };\n}\n\n/**\n * Hook for managing fullscreen mode with focus management and body scroll prevention\n */\nexport function useFullscreenMode(isFullscreen: boolean, setIsFullscreen: (value: boolean) => void) {\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isFullscreen) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n // Prevent document scrolling\n document.body.style.overflow = 'hidden';\n\n // Focus the container in fullscreen mode\n setTimeout(() => {\n containerRef.current?.focus();\n }, 100);\n\n // Trap focus within the fullscreen container\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsFullscreen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Restore document scrolling\n document.body.style.overflow = '';\n };\n } else if (previousActiveElement.current) {\n // Restore focus when exiting fullscreen\n previousActiveElement.current.focus();\n previousActiveElement.current = null;\n }\n }, [isFullscreen, setIsFullscreen]);\n\n return { containerRef };\n}\n\n/**\n * Hook for keyboard navigation shortcuts\n */\nexport function useKeyboardShortcuts(\n allowCopy: boolean,\n allowFullscreen: boolean,\n onCopy: () => void,\n onToggleFullscreen: () => void\n) {\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'c' && (e.metaKey || e.ctrlKey) && allowCopy) {\n e.preventDefault();\n onCopy();\n } else if (e.key === 'f' && allowFullscreen) {\n e.preventDefault();\n onToggleFullscreen();\n }\n },\n [allowCopy, allowFullscreen, onCopy, onToggleFullscreen]\n );\n\n return { handleKeyDown };\n}\n","import { CodeBlockLanguages } from './CodeBlock';\n\nexport function getFileExtension(lang: CodeBlockLanguages): string {\n switch (lang) {\n case 'typescript':\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'json':\n return 'json';\n case 'bash':\n case 'sh':\n return 'sh';\n case 'css':\n return 'css';\n case 'markdown':\n case 'md':\n return 'md';\n default:\n return 'txt';\n }\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, Copy, Dash, Download, Window } from '../../symbols';\nimport { downloadFile, join } from '../../utils';\nimport { formatBash, formatJson, formatTypescript, formatCSS, formatMarkdown } from './format';\nimport { useCopyToClipboard, useFullscreenMode, useKeyboardShortcuts } from './hooks';\nimport { TokenClasses } from './types';\nimport { getFileExtension } from './util';\n\nexport type CodeBlockLanguages = 'typescript' | 'ts' | 'tsx' | 'json' | 'bash' | 'sh' | 'css' | 'markdown' | 'md';\n\nexport interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** The code content to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguages;\n /** Enable copy to clipboard functionality */\n allowCopy?: boolean;\n /** Enable download as file functionality */\n allowDownload?: boolean;\n /** Enable fullscreen viewing mode */\n allowFullscreen?: boolean;\n /** Optional filename to display in the header */\n filename?: string;\n /** Show macOS-style traffic light buttons in header */\n showTrafficLights?: boolean;\n /** Whether to show line numbers on the left side */\n showLineNumbers?: boolean;\n /** Hide the header completely for a minimal appearance */\n hideHeader?: boolean;\n /** Whether to hide the file type label */\n hideFiletype?: boolean;\n /** Maximum height in pixels before showing scroll */\n maxHeight?: number;\n /** Custom token classes for syntax highlighting */\n tokenClasses?: TokenClasses;\n /** Additional CSS classes */\n className?: string;\n /** Element ID */\n id?: string;\n /** Ref to the container element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A feature-rich code block component with syntax highlighting, copy functionality,\n * download options, and fullscreen viewing. Supports multiple programming languages.\n * \n * @example\n * ```tsx\n * // Basic code block\n * <CodeBlock \n * code=\"const greeting = 'Hello World';\" \n * language=\"typescript\"\n * filename=\"example.ts\"\n * />\n * \n * // Full-featured block\n * <CodeBlock\n * code={jsonData}\n * language=\"json\"\n * allowCopy\n * allowDownload\n * allowFullscreen\n * showLineNumbers\n * maxHeight={400}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n allowCopy = true,\n allowDownload = false,\n allowFullscreen = false,\n filename,\n showTrafficLights = true,\n showLineNumbers = false,\n hideHeader = false,\n hideFiletype = false,\n maxHeight,\n tokenClasses: customTokenClasses,\n className,\n id,\n ref,\n ...props\n}: CodeBlockProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const { containerRef } = useFullscreenMode(isFullscreen, setIsFullscreen);\n const { copied, handleCopy } = useCopyToClipboard(code);\n\n const handleDownload = useCallback(() => {\n const downloadFilename = filename || `code.${getFileExtension(language)}`;\n downloadFile(code, downloadFilename);\n }, [code, filename, language]);\n\n const toggleFullScreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n\n const { handleKeyDown } = useKeyboardShortcuts(allowCopy, allowFullscreen, handleCopy, toggleFullScreen);\n\n const codeLines = useMemo(() => code.split('\\n'), [code]);\n\n const renderButtons = useCallback(\n (inHeader = true) => (\n <div className={join('flex items-center space-x-2', !inHeader && 'absolute top-2 right-2 z-10')}>\n {!hideFiletype && (\n <span\n className='text-xs text-gray-400 uppercase tracking-wide font-medium'\n aria-label={`Code language: ${language}`}\n >\n {language}\n </span>\n )}\n {allowFullscreen && (\n <button\n onClick={toggleFullScreen}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen mode' : 'Enter fullscreen mode'}\n aria-pressed={isFullscreen}\n type='button'\n >\n {isFullscreen ? <Dash size={14} /> : <Window size={14} />}\n </button>\n )}\n {allowDownload && (\n <button\n onClick={handleDownload}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title='Download code'\n aria-label='Download code as file'\n type='button'\n >\n <Download size={14} />\n </button>\n )}\n {allowCopy && (\n <button\n onClick={handleCopy}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title={copied ? 'Code copied!' : 'Copy code'}\n aria-label={copied ? 'Code copied to clipboard' : 'Copy code to clipboard'}\n aria-live='polite'\n type='button'\n >\n {copied ? <Check size={14} className='text-green-400' /> : <Copy size={14} />}\n </button>\n )}\n </div>\n ),\n [\n hideFiletype,\n language,\n allowFullscreen,\n isFullscreen,\n allowDownload,\n handleDownload,\n allowCopy,\n handleCopy,\n copied,\n toggleFullScreen,\n ]\n );\n\n const formattedCode = useMemo(() => {\n if (language === 'json') {\n return formatJson(codeLines, customTokenClasses);\n }\n\n if (language === 'tsx' || language === 'ts' || language === 'typescript') {\n return formatTypescript(codeLines, customTokenClasses);\n }\n\n if (language === 'bash' || language === 'sh') {\n return formatBash(codeLines, customTokenClasses);\n }\n\n if (language === 'css') {\n return formatCSS(codeLines, customTokenClasses);\n }\n\n if (language === 'markdown' || language === 'md') {\n return formatMarkdown(codeLines, customTokenClasses);\n }\n\n return [\n <span key={0} className='text-gray-400'>\n Unsupported language\n </span>,\n ];\n }, [codeLines, customTokenClasses, language]);\n\n const lineNumbers = useMemo(() => {\n if (!showLineNumbers) return null;\n return codeLines.map((_, index) => (\n <div\n key={index}\n className='text-gray-500 text-right pl-3 pr-1 select-none min-w-8 text-sm font-mono leading-6'\n aria-hidden='true'\n role='presentation'\n >\n {index + 1}\n </div>\n ));\n }, [showLineNumbers, codeLines]);\n\n const codeStyle = useMemo(\n () => ({\n maxHeight:\n maxHeight && !isFullscreen\n ? `${maxHeight}px`\n : isFullscreen\n ? hideHeader\n ? 'calc(100vh - 5px)'\n : 'calc(100vh - 45px)'\n : undefined,\n overflow: maxHeight || isFullscreen ? 'auto' : 'visible',\n }),\n [maxHeight, isFullscreen, hideHeader]\n );\n\n const codeBlockContent = (\n <div\n id={id}\n ref={(node) => {\n containerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={join(\n 'bg-gray-900 rounded-lg border border-gray-700 overflow-hidden motion-reduce:transition-none',\n isFullscreen && 'fixed inset-0 z-[9999] max-h-fit',\n className\n )}\n data-language={language}\n data-filename={filename}\n data-fullscreen={isFullscreen}\n role='region'\n aria-label={`Code block${filename ? ` for ${filename}` : ''} in ${language}`}\n aria-describedby={showLineNumbers ? `${id}-description` : undefined}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {showLineNumbers && (\n <div id={`${id}-description`} className='sr-only'>\n Code block with line numbers. Use Cmd+C or Ctrl+C to copy code.\n {allowFullscreen && ' Press F to toggle fullscreen.'}\n </div>\n )}\n\n {/* Live region for copy feedback */}\n <div aria-live='polite' aria-atomic='true' className='sr-only'>\n {copied && 'Code copied to clipboard'}\n </div>\n\n {/* Header */}\n {!hideHeader && (\n <div className='flex items-center justify-between px-4 py-2 bg-gray-800 border-b border-gray-700'>\n <div className='flex items-center space-x-3'>\n {showTrafficLights && (\n <div className='flex space-x-2'>\n <div className='w-3 h-3 bg-red-500 rounded-full' />\n <div className='w-3 h-3 bg-yellow-500 rounded-full' />\n <div className='w-3 h-3 bg-green-500 rounded-full' />\n </div>\n )}\n {filename && <span className='text-sm text-gray-300 font-medium'>{filename}</span>}\n </div>\n {renderButtons(true)}\n </div>\n )}\n\n {/* Code Content */}\n <div className={join('flex overflow-hidden', hideHeader && 'relative')} style={codeStyle}>\n {hideHeader && renderButtons(false)}\n <div className='flex-1 overflow-x-auto'>\n <div className='flex'>\n {showLineNumbers && (\n <div\n className='bg-gray-800 py-4 border-r border-gray-700 flex flex-col flex-shrink-0'\n aria-hidden='true'\n role='presentation'\n >\n {lineNumbers}\n </div>\n )}\n <div className='flex-1 p-4'>\n <pre\n className='text-sm font-mono focus:outline-none'\n role='code'\n aria-label={`${language} code content`}\n tabIndex={-1}\n >\n <code>{formattedCode}</code>\n </pre>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n return (\n <>\n {!isFullscreen && codeBlockContent}\n {isFullscreen &&\n createPortal(\n <>\n <div\n className='fixed inset-0 bg-black z-[9998]'\n onClick={() => setIsFullscreen(false)}\n aria-hidden='true'\n />\n {codeBlockContent}\n </>,\n document.body\n )}\n </>\n );\n}\n","import React, { useEffect, useId, useState } from 'react';\nimport { CaretCollapse, CaretExpand } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface DisclosureProps {\n /** The content to show/hide */\n children: React.ReactNode;\n /** The label text or content for the disclosure button */\n label: React.ReactNode;\n /** Controls the open state (uncontrolled if not provided) */\n isOpen?: boolean;\n /** Called when disclosure is toggled */\n onToggle?: (open: boolean) => void;\n /** Optional id for accessibility and testing */\n id?: string;\n /** Optional ref to the root div */\n ref?: React.Ref<HTMLDivElement>;\n /** Whether the disclosure is disabled */\n disabled?: boolean;\n /** Additional CSS classes to apply to the disclosure */\n className?: string;\n /** Additional CSS classes to apply to the disclosure button */\n buttonClassName?: string;\n}\n\n/**\n * A simple disclosure component for showing and hiding content sections.\n * Provides keyboard navigation and accessibility features with expand/collapse functionality.\n * \n * @example\n * ```tsx\n * // Uncontrolled disclosure\n * <Disclosure label=\"Show Details\">\n * <p>Hidden content that will be revealed when expanded.</p>\n * </Disclosure>\n * \n * // Controlled disclosure\n * <Disclosure \n * label=\"Advanced Options\"\n * isOpen={showAdvanced}\n * onToggle={setShowAdvanced}\n * >\n * <div>Advanced configuration options...</div>\n * </Disclosure>\n * ```\n */\nexport function Disclosure({\n children,\n label,\n isOpen: open,\n onToggle,\n id,\n ref,\n disabled = false,\n className,\n buttonClassName,\n}: DisclosureProps) {\n const generatedId = useId();\n const activeId = id ?? generatedId;\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = open !== undefined ? open : internalOpen;\n\n const handleToggle = () => {\n if (disabled) return;\n if (open === undefined) {\n setInternalOpen((prev) => !prev);\n }\n onToggle?.(!isOpen);\n };\n\n useEffect(() => {\n setInternalOpen(open ?? false);\n }, [open]);\n\n return (\n <div ref={ref} id={activeId} data-open={isOpen} className={join('overflow-hidden', className)}>\n <button\n id={`${activeId}-button`}\n type='button'\n aria-expanded={isOpen}\n aria-controls={`${activeId}-panel`}\n disabled={disabled}\n tabIndex={0}\n className={join(\n 'w-full px-4 py-3 font-medium hover:bg-primary/10 disabled:opacity-50 disabled:cursor-not-allowed',\n buttonClassName\n )}\n onClick={handleToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n }}\n data-open={isOpen}\n data-label={typeof label === 'string' ? label : undefined}\n >\n <div className='flex items-center w-full gap-2'>\n <span className='flex-1 text-left'>{label}</span>\n {isOpen ? (\n <CaretCollapse className='size-5' aria-hidden='true' />\n ) : (\n <CaretExpand className='size-5' aria-hidden='true' />\n )}\n </div>\n </button>\n\n <div id={`${activeId}-panel`} role='region' aria-labelledby={activeId} aria-live='polite' hidden={!isOpen}>\n {children}\n </div>\n </div>\n );\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\nexport function useAnimationSlideIn(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n // Small delay to ensure the element is rendered before animation\n const timer = setTimeout(() => setShow(true), 10);\n return () => clearTimeout(timer);\n } else {\n setShow(false);\n // Wait for animation to complete before unmounting\n const timer = setTimeout(() => setShouldRender(false), 300);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function useDrawerDrag({\n isOpen,\n onClose,\n enabled = true,\n}: {\n isOpen: boolean;\n onClose: () => void;\n enabled?: boolean;\n}) {\n const [isDragging, setIsDragging] = useState(false);\n const [translateY, setTranslateY] = useState(0);\n const [startY, setStartY] = useState(0);\n\n const handleStart = useCallback((clientY: number) => {\n if (!enabled || !isOpen) return;\n \n setIsDragging(true);\n setStartY(clientY);\n \n // Prevent text selection during drag\n document.body.style.userSelect = 'none';\n }, [enabled, isOpen]);\n\n const handleMove = useCallback((clientY: number) => {\n if (!isDragging || !enabled) return;\n\n const deltaY = clientY - startY; // Positive when dragging down\n const clampedDeltaY = Math.max(0, deltaY); // Only allow downward drag\n \n setTranslateY(clampedDeltaY);\n }, [isDragging, enabled, startY]);\n\n const handleEnd = useCallback(() => {\n if (!isDragging || !enabled) return;\n\n setIsDragging(false);\n document.body.style.userSelect = '';\n\n // Close drawer if dragged down more than threshold\n const threshold = 100; // pixels\n if (translateY > threshold) {\n onClose();\n }\n\n // Reset translate\n setTranslateY(0);\n }, [isDragging, enabled, translateY, onClose]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n handleStart(e.clientY);\n }, [handleStart]);\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n handleMove(e.clientY);\n }, [handleMove]);\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n handleStart(e.touches[0].clientY);\n }, [handleStart]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n e.preventDefault();\n handleMove(e.touches[0].clientY);\n }, [handleMove]);\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Add global event listeners when dragging for when it goes outside the drawer\n useEffect(() => {\n if (!isDragging) return;\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleTouchEnd);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!enabled) return;\n\n if (e.key === 'ArrowDown' || e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n }, [enabled, onClose]);\n\n const dragHandlers = enabled ? {\n onMouseDown: handleMouseDown,\n onTouchStart: handleTouchStart,\n onKeyDown: handleKeyDown,\n } : {};\n\n return {\n dragHandlers,\n translateY,\n isDragging,\n };\n}\n\nexport function useDrawerFocus(drawerId: string, shouldRender: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n useEffect(() => {\n if (!shouldRender) return;\n\n // Store the previously focused element\n previousActiveElement.current = document.activeElement;\n\n const drawerElement = document.getElementById(drawerId);\n if (drawerElement) {\n // Focus the drawer container\n drawerElement.focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const drawerElement = document.getElementById(drawerId);\n if (!drawerElement) return;\n\n const focusableElements = drawerElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n \n // Restore focus to the previously active element\n if (previousActiveElement.current && typeof (previousActiveElement.current as HTMLElement).focus === 'function') {\n (previousActiveElement.current as HTMLElement).focus();\n }\n };\n }, [drawerId, shouldRender]);\n}\n\nexport function useDrawerDocumentChanges(shouldRender: boolean, onClose: () => void) {\n useEffect(() => {\n if (!shouldRender) return;\n\n // Prevent body scroll when drawer is open\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n // Handle escape key\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.style.overflow = originalStyle;\n document.removeEventListener('keydown', handleEscape);\n };\n }, [shouldRender, onClose]);\n}","import React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { join } from '../../utils';\nimport { useAnimationSlideIn, useDrawerDocumentChanges, useDrawerDrag, useDrawerFocus } from './hooks';\n\nexport interface DrawerProps {\n /** Reference to the drawer element */\n ref?: React.Ref<HTMLDivElement>;\n /** Unique identifier for the drawer */\n id?: string;\n /** Whether the drawer is open */\n isOpen: boolean;\n /** Callback fired when the drawer should close */\n onClose: () => void;\n /** Optional title for the drawer header */\n title?: React.ReactNode;\n /** The content to display inside the drawer */\n children: React.ReactNode;\n /** Optional footer content for the drawer */\n footer?: React.ReactNode;\n /** Additional CSS classes to apply to the drawer */\n className?: string;\n /** Additional CSS classes to apply to the overlay */\n overlayClassName?: string;\n /** Whether to show the close button in the top-right corner */\n showCloseButton?: boolean;\n /** Whether to disable closing when clicking the overlay */\n disableCloseOnOverlayClick?: boolean;\n /** Whether to enable drag gestures on the notch for closing */\n enableDragGestures?: boolean;\n /** ARIA labelledby attribute */\n ariaLabelledBy?: string;\n /** ARIA describedby attribute */\n ariaDescribedBy?: string;\n}\n\n/**\n * A bottom-slide drawer component for mobile-friendly overlays and forms.\n * Includes drag gestures, focus management, and smooth animations.\n * \n * @example\n * ```tsx\n * // Basic drawer\n * <Drawer\n * isOpen={showDrawer}\n * onClose={() => setShowDrawer(false)}\n * title=\"Settings\"\n * >\n * <p>Drawer content goes here</p>\n * </Drawer>\n * \n * // Full-featured drawer\n * <Drawer\n * isOpen={showForm}\n * onClose={handleClose}\n * title=\"Edit Profile\"\n * footer={<Button onClick={save}>Save Changes</Button>}\n * enableDragGestures\n * showCloseButton\n * >\n * <ProfileForm />\n * </Drawer>\n * ```\n */\nexport function Drawer({\n ref,\n id,\n isOpen,\n onClose,\n title,\n children,\n footer,\n className,\n overlayClassName,\n showCloseButton = false,\n disableCloseOnOverlayClick = false,\n enableDragGestures = true,\n ariaLabelledBy,\n ariaDescribedBy,\n}: DrawerProps) {\n const generatedId = useId();\n const drawerId = id || `drawer-${generatedId}`;\n const titleId = `${generatedId}-title`;\n\n const { show, shouldRender } = useAnimationSlideIn(isOpen);\n const { dragHandlers, translateY, isDragging } = useDrawerDrag({\n isOpen,\n onClose,\n enabled: enableDragGestures,\n });\n useDrawerFocus(drawerId, shouldRender);\n useDrawerDocumentChanges(shouldRender, onClose);\n\n if (!shouldRender) return null;\n\n const renderTitle = () => {\n if (!title) return null;\n\n if (React.isValidElement(title)) {\n return <div>{title}</div>;\n }\n\n return (\n <h2 className='text-2xl font-semibold' id={titleId}>\n {title}\n </h2>\n );\n };\n\n const renderFooter = () => {\n if (!footer) return null;\n\n if (React.isValidElement(footer)) {\n const footerElement = footer as React.ReactElement<{ className?: string }>;\n const existingClassName = footerElement.props.className || '';\n return React.cloneElement(footerElement, { className: join('px-6 py-4', existingClassName) } as Record<\n string,\n unknown\n >);\n }\n\n return <div className='px-6 py-4'>{footer}</div>;\n };\n\n return (\n <>\n {createPortal(\n <div\n aria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n aria-describedby={ariaDescribedBy}\n role='dialog'\n aria-modal='true'\n className='fixed inset-0 z-[100] overflow-hidden'\n data-drawer-open={isOpen}\n >\n <div\n className={join(\n 'fixed inset-0 bg-black/40 transition-opacity duration-300',\n show ? 'opacity-100' : 'opacity-0',\n overlayClassName\n )}\n onClick={() => {\n if (!disableCloseOnOverlayClick) {\n onClose();\n }\n }}\n />\n\n <div className='fixed inset-x-0 bottom-0 flex max-h-full'>\n <div\n id={drawerId}\n ref={ref}\n tabIndex={-1}\n className={join(\n 'relative w-screen transform shadow-xl bg-popover text-popover-foreground transition-transform duration-300 ease-in-out border-t border-border rounded-t-lg',\n show ? 'translate-y-0' : 'translate-y-full',\n className\n )}\n style={{\n transform: enableDragGestures && translateY !== 0 ? `translateY(${translateY}px)` : undefined,\n transition: translateY !== 0 ? 'none' : undefined,\n }}\n >\n <div className='flex h-full flex-col'>\n {enableDragGestures && (\n <div\n className={join(\n 'flex justify-center pt-3 pb-2 cursor-grab active:cursor-grabbing',\n enableDragGestures && 'select-none'\n )}\n {...dragHandlers}\n role={enableDragGestures ? 'button' : undefined}\n tabIndex={enableDragGestures ? 0 : undefined}\n aria-label={enableDragGestures ? 'Drag to resize drawer' : undefined}\n >\n <div\n className={join(\n 'w-12 h-1.5 bg-popover-foreground/25 rounded-full transition-colors',\n enableDragGestures && 'hover:bg-popover-foreground/50',\n isDragging && 'bg-popover-foreground/50'\n )}\n />\n </div>\n )}\n\n {title && <div className='px-6 pt-4'>{renderTitle()}</div>}\n\n {showCloseButton && (\n <button\n type='button'\n onClick={onClose}\n data-drawer-close-button='true'\n aria-label='Close drawer'\n className='rounded-md p-0.5 top-3 right-3 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n >\n <X size={18} />\n </button>\n )}\n\n <div className={join('flex-1 overflow-y-auto px-6 pb-6', title ? 'pt-6' : 'pt-4')}>{children}</div>\n\n {renderFooter()}\n </div>\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { PopoverPlacement } from './variants';\n\ninterface UseAutoSwitchPlacementProps {\n internalIsOpen: boolean;\n autoSwitchPlacement: boolean;\n placement: PopoverPlacement;\n offset: number;\n triggerRef: React.RefObject<HTMLElement | null>;\n popoverRef: React.RefObject<HTMLDivElement | null>;\n}\n\nfunction getOppositePlacement(placement: PopoverPlacement): PopoverPlacement {\n switch (placement) {\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n }\n}\n\nexport function useAutoSwitchPlacement({\n internalIsOpen,\n autoSwitchPlacement,\n placement,\n offset,\n triggerRef,\n popoverRef,\n}: UseAutoSwitchPlacementProps) {\n const [effectivePlacement, setEffectivePlacement] = useState<PopoverPlacement>(placement);\n\n useEffect(() => {\n if (!internalIsOpen || !autoSwitchPlacement) return;\n\n const updatePlacement = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newPlacement = placement;\n const opposite = getOppositePlacement(placement);\n\n if (placement === 'top' || placement === 'bottom') {\n const hasSpace =\n placement === 'top'\n ? triggerRect.top >= popoverRect.height + offset\n : viewportHeight - triggerRect.bottom >= popoverRect.height + offset;\n\n const hasSpaceOpposite =\n opposite === 'top'\n ? triggerRect.top >= popoverRect.height + offset\n : viewportHeight - triggerRect.bottom >= popoverRect.height + offset;\n\n if (!hasSpace && hasSpaceOpposite) newPlacement = opposite;\n } else {\n const hasSpace =\n placement === 'left'\n ? triggerRect.left >= popoverRect.width + offset\n : viewportWidth - triggerRect.right >= popoverRect.width + offset;\n\n const hasSpaceOpposite =\n opposite === 'left'\n ? triggerRect.left >= popoverRect.width + offset\n : viewportWidth - triggerRect.right >= popoverRect.width + offset;\n\n if (!hasSpace && hasSpaceOpposite) newPlacement = opposite;\n }\n\n setEffectivePlacement(newPlacement);\n };\n\n updatePlacement();\n\n const handleScrollOrResize = () => updatePlacement();\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n\n // Listen for size changes in trigger or popover\n const resizeObserver = new ResizeObserver(updatePlacement);\n if (triggerRef.current) {\n resizeObserver.observe(triggerRef.current);\n }\n if (popoverRef.current) {\n resizeObserver.observe(popoverRef.current);\n }\n\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n resizeObserver.disconnect();\n };\n }, [internalIsOpen, placement, offset, autoSwitchPlacement, triggerRef, popoverRef]);\n\n return effectivePlacement;\n}\n","export type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlignment = 'start' | 'center' | 'end';\n\nexport const placementVariants: Record<PopoverPlacement, Record<PopoverAlignment, string>> = {\n bottom: {\n start: 'top-full left-0 origin-top-left',\n center: 'top-full left-1/2 -translate-x-1/2 origin-top',\n end: 'top-full right-0 origin-top-right',\n },\n top: {\n start: 'bottom-full left-0 origin-bottom-left',\n center: 'bottom-full left-1/2 -translate-x-1/2 origin-bottom',\n end: 'bottom-full right-0 origin-bottom-right',\n },\n left: {\n start: 'right-full top-0 origin-top-right',\n center: 'right-full top-1/2 -translate-y-1/2 origin-right',\n end: 'right-full bottom-0 origin-bottom-right',\n },\n right: {\n start: 'left-full top-0 origin-top-left',\n center: 'left-full top-1/2 -translate-y-1/2 origin-left',\n end: 'left-full bottom-0 origin-bottom-left',\n },\n} as const;\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { join, mergeRefs } from '../../utils';\nimport { useAutoSwitchPlacement } from './hooks';\nimport { placementVariants, PopoverAlignment, PopoverPlacement } from './variants';\n\nexport interface PopoverProps {\n\t/** Unique identifier for the popover */\n\tid?: string;\n\t/** Reference to the popover element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Whether the popover is open (controlled) */\n\tisOpen?: boolean;\n\t/** Callback fired when the open state changes */\n\tonOpenChange?: (open: boolean) => void;\n\t/** The content to display in the popover */\n\tchildren: React.ReactNode;\n\t/** The element that triggers the popover */\n\ttrigger: React.ReactElement;\n\t/** The preferred side of the trigger to render against */\n\tplacement?: PopoverPlacement;\n\t/** The preferred alignment against the trigger */\n\talignment?: PopoverAlignment;\n\t/** Additional CSS classes to apply to the popover content */\n\tclassName?: string;\n\t/** Whether to close popover when clicking outside */\n\tcloseOnOverlayClick?: boolean;\n\t/** Whether to close popover when clicking the trigger again */\n\tcloseOnTriggerClick?: boolean;\n\t/** Offset of the popover from the trigger element in pixels */\n\toffset?: number;\n\t/** Automatically switch placement to opposite side if there is not enough space */\n\tautoSwitchPlacement?: boolean;\n\t/** Enable hover behavior - shows on hover, hides 200ms after mouse leaves */\n\thoverable?: boolean;\n}\n\nfunction getOffsetStyle(effectivePlacement: PopoverPlacement, offset: number) {\n\tswitch (effectivePlacement) {\n\t\tcase 'top':\n\t\t\treturn { marginBottom: `${offset}px` };\n\t\tcase 'bottom':\n\t\t\treturn { marginTop: `${offset}px` };\n\t\tcase 'left':\n\t\t\treturn { marginRight: `${offset}px` };\n\t\tcase 'right':\n\t\t\treturn { marginLeft: `${offset}px` };\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n\n/**\n * A floating content container that appears relative to a trigger element.\n * Supports hover and click interactions with intelligent positioning and focus management.\n * \n * @example\n * ```tsx\n * // Basic popover\n * <Popover \n * trigger={<Button>Click me</Button>}\n * placement=\"bottom\"\n * >\n * <div className=\"p-4\">\n * <h3>Popover Content</h3>\n * <p>This is the popover content.</p>\n * </div>\n * </Popover>\n * \n * // Hover popover\n * <Popover\n * trigger={<span>Hover me</span>}\n * hoverable\n * placement=\"top\"\n * alignment=\"start\"\n * >\n * <div className=\"p-2 text-sm\">Tooltip-like content</div>\n * </Popover>\n * \n * // Controlled popover\n * <Popover\n * trigger={<Button>Controlled</Button>}\n * isOpen={showPopover}\n * onOpenChange={setShowPopover}\n * >\n * <PopoverMenu />\n * </Popover>\n * ```\n */\nexport function Popover({\n\tid,\n\tref,\n\tisOpen,\n\tonOpenChange,\n\tchildren,\n\tclassName,\n\tcloseOnOverlayClick = true,\n\ttrigger,\n\tplacement = 'bottom',\n\talignment = 'center',\n\tcloseOnTriggerClick = true,\n\toffset = 8,\n\tautoSwitchPlacement = true,\n\thoverable = false,\n}: PopoverProps) {\n\tconst [internalIsOpen, setInternalIsOpen] = useState(isOpen ?? false);\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLElement>(null);\n\tconst previousFocusRef = useRef<HTMLElement | null>(null);\n\tconst popoverId = useId();\n\tconst hoverTimeoutRef = useRef<number | null>(null);\n\n\tconst effectivePlacement = useAutoSwitchPlacement({\n\t\tinternalIsOpen,\n\t\tautoSwitchPlacement,\n\t\tplacement,\n\t\toffset,\n\t\ttriggerRef,\n\t\tpopoverRef,\n\t});\n\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (onOpenChange) {\n\t\t\t\tonOpenChange(open);\n\t\t\t}\n\t\t\tif (isOpen === undefined) {\n\t\t\t\tsetInternalIsOpen(open);\n\t\t\t}\n\t\t},\n\t\t[isOpen, onOpenChange]\n\t);\n\n\t// Hover handling functions\n\tconst clearHoverTimeout = useCallback(() => {\n\t\tif (hoverTimeoutRef.current) {\n\t\t\tclearTimeout(hoverTimeoutRef.current);\n\t\t\thoverTimeoutRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst handleMouseEnter = useCallback(() => {\n\t\tif (!hoverable) return;\n\t\tclearHoverTimeout();\n\t\thandleOpenChange(true);\n\t}, [hoverable, clearHoverTimeout, handleOpenChange]);\n\n\tconst handleMouseLeave = useCallback(() => {\n\t\tif (!hoverable) return;\n\t\tclearHoverTimeout();\n\t\thoverTimeoutRef.current = setTimeout(() => {\n\t\t\thandleOpenChange(false);\n\t\t}, 200);\n\t}, [hoverable, clearHoverTimeout, handleOpenChange]);\n\n\tuseEffect(() => {\n\t\tif (isOpen !== undefined) {\n\t\t\tsetInternalIsOpen(isOpen);\n\t\t}\n\t}, [isOpen]);\n\n\t// Cleanup hover timeout on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (hoverTimeoutRef.current) {\n\t\t\t\tclearTimeout(hoverTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t// Handle keyboard navigation\n\tuseEffect(() => {\n\t\tif (!internalIsOpen) return;\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\thandleOpenChange(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [internalIsOpen, handleOpenChange]);\n\n\t// Handle click outside\n\tuseEffect(() => {\n\t\tif (!internalIsOpen || !closeOnOverlayClick) return;\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tconst target = event.target as Node;\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(target) &&\n\t\t\t\ttriggerRef.current &&\n\t\t\t\t!triggerRef.current.contains(target)\n\t\t\t) {\n\t\t\t\thandleOpenChange(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\treturn () => document.removeEventListener('mousedown', handleClickOutside);\n\t}, [internalIsOpen, closeOnOverlayClick, handleOpenChange]);\n\n\t// Handle focus management\n\tuseEffect(() => {\n\t\tif (internalIsOpen) {\n\t\t\tpreviousFocusRef.current = document.activeElement as HTMLElement;\n\t\t\tpopoverRef.current?.focus();\n\t\t} else {\n\t\t\tpreviousFocusRef.current?.focus();\n\t\t\tpreviousFocusRef.current = null;\n\t\t}\n\t}, [internalIsOpen]);\n\n\t// Trigger cloning\n\tconst triggerProps = trigger.props as {\n\t\tref?: React.Ref<HTMLElement>;\n\t\tonClick?: (e: React.MouseEvent<HTMLElement>) => void;\n\t\tonMouseEnter?: (e: React.MouseEvent<HTMLElement>) => void;\n\t\tonMouseLeave?: (e: React.MouseEvent<HTMLElement>) => void;\n\t};\n\tconst triggerElement = React.cloneElement(trigger, {\n\t\t'aria-expanded': internalIsOpen,\n\t\t'aria-haspopup': 'dialog',\n\t\t'aria-controls': popoverId,\n\t\tref: mergeRefs(triggerRef, triggerProps.ref),\n\t\tonClick: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onClick?.(e);\n\t\t\tif (hoverable) return; // Don't handle click events in hoverable mode\n\t\t\tif (!closeOnTriggerClick && internalIsOpen) return;\n\t\t\tif (isOpen === undefined) {\n\t\t\t\tif (e.defaultPrevented) return;\n\t\t\t\tif (popoverRef.current?.contains(e.target as Node)) return;\n\t\t\t\thandleOpenChange(!internalIsOpen);\n\t\t\t}\n\t\t},\n\t\tonMouseEnter: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onMouseEnter?.(e);\n\t\t\thandleMouseEnter();\n\t\t},\n\t\tonMouseLeave: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onMouseLeave?.(e);\n\t\t\thandleMouseLeave();\n\t\t},\n\t} as Record<string, unknown>);\n\n\treturn (\n\t\t<div id={id} ref={ref} className='relative inline-block'>\n\t\t\t{triggerElement}\n\t\t\t<div\n\t\t\t\tid={popoverId}\n\t\t\t\tref={popoverRef}\n\t\t\t\tclassName={join(\n\t\t\t\t\t'absolute z-[90] transform rounded-md shadow-lg bg-popover text-popover-foreground transition-all ease-out',\n\t\t\t\t\tinternalIsOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-75 pointer-events-none',\n\t\t\t\t\tplacementVariants[effectivePlacement][alignment],\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tstyle={getOffsetStyle(effectivePlacement, offset)}\n\t\t\t\trole='dialog'\n\t\t\t\taria-modal='true'\n\t\t\t\ttabIndex={-1}\n\t\t\t\tinert={!internalIsOpen ? true : undefined} // prevents focus and interaction when popover is closed\n\t\t\t\taria-hidden={!internalIsOpen ? true : undefined} // hide from screen readers when popover is closed\n\t\t\t\tonMouseEnter={hoverable ? handleMouseEnter : undefined}\n\t\t\t\tonMouseLeave={hoverable ? handleMouseLeave : undefined}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { ChevronRight } from '../../symbols';\nimport { join } from '../../utils';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { DropdownMenuOption } from './types';\n\ninterface MenuOptionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'aria-label'> {\n\toption: DropdownMenuOption;\n}\n\nexport function MenuOption({ option, ...props }: MenuOptionProps) {\n\tconst { onItemSelect } = useDropdownMenuContext();\n\n\tconst handleItemClick = () => {\n\t\tif (option.onClick) {\n\t\t\toption.onClick();\n\t\t}\n\t\tif (option.value) {\n\t\t\tonItemSelect(option.value);\n\t\t}\n\t};\n\n\tconst hasSubitems = option.subItems && option.subItems.length > 0;\n\tconst isLink = option.href && !option.disabled;\n\tconst Element = isLink ? 'a' : 'div';\n\treturn (\n\t\t<Element\n\t\t\thref={isLink ? option.href : undefined}\n\t\t\tclassName={join(\n\t\t\t\t'relative flex items-center gap-2 px-3 py-2 text-sm focus:outline-none focus:bg-popover-foreground/10',\n\t\t\t\toption.disabled ? 'opacity-50 cursor-default' : 'cursor-pointer'\n\t\t\t)}\n\t\t\tonClick={!option.disabled ? handleItemClick : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{option.icon && <span className='size-4'>{option.icon}</span>}\n\t\t\t<div className='flex-1'>\n\t\t\t\t<div>{option.label}</div>\n\t\t\t\t{option.description && <div className='text-xs text-popover-foreground/60'>{option.description}</div>}\n\t\t\t</div>\n\t\t\t{option.keyboardShortcut && <div className='text-xs text-popover-foreground/60'>{option.keyboardShortcut}</div>}\n\t\t\t{hasSubitems && <ChevronRight className='size-4' />}\n\t\t</Element>\n\t);\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { MenuBody } from './DropdownMenuBody';\nimport { MenuOption } from './DropdownMenuOption';\nimport { DropdownMenuOption } from './types';\n\nexport function SubMenu({ option, level, index }: { option: DropdownMenuOption; level: number; index: number }) {\n\tconst { focus, setFocus } = useDropdownMenuContext();\n\tconst [isSubMenuOpen, setIsSubMenuOpen] = useState(false);\n\tconst [hasExited, setHasExited] = useState(false); // if submenu was exited with keyboard\n\tconst itemRef = useRef<HTMLDivElement>(null);\n\tconst previousLevelRef = useRef<number | undefined>(undefined);\n\tconst submenuId = useId();\n\n\tconst handleMouseEnter = () => {\n\t\tif (option.disabled) return;\n\t\tsetFocus({ level, index });\n\t\thandleOpen();\n\t};\n\n\tconst handleMouseLeave = () => {\n\t\tsetFocus(null);\n\t\thandleClose();\n\t};\n\n\tconst handleOpen = () => {\n\t\tsetIsSubMenuOpen(true);\n\t};\n\n\tconst handleClose = () => {\n\t\tsetIsSubMenuOpen(false);\n\t};\n\n\t// Can re-open submenu if it was exited with keyboard\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tif (option.disabled) return;\n\t\t\tsetHasExited(false);\n\t\t}\n\t};\n\n\t// Detect if submenu was exited with keyboard navigation\n\tuseEffect(() => {\n\t\tconst focusLevel = focus?.level;\n\t\tconst previousLevel = previousLevelRef.current;\n\t\tconst submenuLevel = level + 1;\n\t\tif (focusLevel && previousLevel && previousLevel === submenuLevel && focusLevel === previousLevel - 1) {\n\t\t\tsetHasExited(true);\n\t\t} else {\n\t\t\tsetHasExited(false);\n\t\t}\n\t\tpreviousLevelRef.current = focusLevel;\n\t}, [focus, level]); // include entire object to reset when index changes as well (allows reopening same submenu item)\n\n\tconst hasSubitems = option.subItems !== undefined && option.subItems.length > 0;\n\tconst showingSubmenu = isSubMenuOpen && !hasExited && hasSubitems;\n\treturn (\n\t\t<div\n\t\t\tref={itemRef}\n\t\t\tclassName='relative focus:outline-none focus:bg-popover-foreground/10'\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonFocus={handleOpen}\n\t\t\tonBlur={handleClose}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\ttabIndex={0}\n\t\t\tdata-menu-item={option.value}\n\t\t\tdata-level={level}\n\t\t\tdata-index={index}\n\t\t\taria-haspopup={hasSubitems ? 'true' : undefined}\n\t\t\taria-expanded={showingSubmenu ? 'true' : 'false'}\n\t\t\taria-disabled={option.disabled ? 'true' : undefined}\n\t\t\taria-label={option.label}\n\t\t\taria-controls={showingSubmenu ? submenuId : undefined}\n\t\t>\n\t\t\t<MenuOption option={option} />\n\n\t\t\t{showingSubmenu && (\n\t\t\t\t<div className='absolute left-full top-0 z-30'>\n\t\t\t\t\t<MenuBody items={option.subItems ?? []} level={level + 1} id={submenuId} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { join } from '../../utils';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { MenuOption } from './DropdownMenuOption';\nimport { SubMenu } from './DropdownMenuSub';\nimport { DropdownMenuItem } from './types';\n\nexport function MenuBody({ items, level, id }: { items: DropdownMenuItem[]; level: number; id?: string }) {\n\tconst { setFocus, className = '' } = useDropdownMenuContext();\n\tlet itemIndex = 0;\n\n\tconst renderItem = (item: DropdownMenuItem, key: string) => {\n\t\tswitch (item.__type) {\n\t\t\tcase 'option':\n\t\t\t\tif (item.subItems && item.subItems.length > 0) {\n\t\t\t\t\treturn <SubMenu key={key} option={item} level={level} index={itemIndex++} />;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<MenuOption\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\toption={item}\n\t\t\t\t\t\tdata-menu-item={item.value}\n\t\t\t\t\t\tdata-level={level}\n\t\t\t\t\t\tdata-index={itemIndex++}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\taria-disabled={item.disabled ? 'true' : undefined}\n\t\t\t\t\t\tonMouseEnter={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (item.disabled) return;\n\t\t\t\t\t\t\tconst index = Number(e.currentTarget.getAttribute('data-index'));\n\t\t\t\t\t\t\tsetFocus({ level, index });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseLeave={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetFocus(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'group':\n\t\t\t\treturn (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t{item.title && (\n\t\t\t\t\t\t\t<div className='px-3 py-2 text-xs font-semibold text-popover-foreground/50 uppercase'>{item.title}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{item.items.map((groupItem, groupIndex) => renderItem(groupItem, `${key}-${groupIndex}`))}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\n\t\t\tcase 'separator':\n\t\t\t\treturn <div key={key} aria-hidden={true} className='my-1 mx-2 border-t border-popover-foreground/20' />;\n\n\t\t\tcase 'custom':\n\t\t\t\treturn <div key={key}>{item.render()}</div>;\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tclassName={join(\n\t\t\t\t'border py-1 border-popover-foreground/20 rounded-md min-w-52 shadow-lg bg-popover text-popover-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\ttabIndex={0}\n\t\t\tdata-level={level}\n\t\t\tdata-menu\n\t\t\trole='menu'\n\t\t\taria-label={`Dropdown menu level ${level}`}\n\t\t>\n\t\t\t{items.map((item, index) => renderItem(item, String(index)))}\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect } from 'react';\nimport { DropdownMenuContextFocus } from './DropdownContext';\n\nfunction getItemElements(menuEl: HTMLElement, level: number) {\n return Array.from(menuEl.querySelectorAll<HTMLElement>(`[data-menu-item][data-level=\"${level}\"]`));\n}\n\nfunction getNextMenuItemIndex(menuItems: HTMLElement[], currentIndex: number | null) {\n const startIndex =\n currentIndex === null ? 0 : (currentIndex + 1) % menuItems.length;\n\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex + i) % menuItems.length;\n const item = menuItems[index];\n if (!item.hasAttribute('aria-disabled')) {\n return index;\n }\n }\n return -1;\n}\n\nfunction getPreviousMenuItemIndex(menuItems: HTMLElement[], currentIndex: number | null) {\n const startIndex =\n currentIndex === null ? menuItems.length - 1 : (currentIndex - 1 + menuItems.length) % menuItems.length;\n\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex - i + menuItems.length) % menuItems.length;\n const item = menuItems[index];\n if (!item.hasAttribute('aria-disabled')) {\n return index;\n }\n }\n return -1;\n}\n\ninterface UseKeyboardNavigationProps {\n dropdownId: string;\n focus: DropdownMenuContextFocus | null;\n setFocus: (focus: DropdownMenuContextFocus | null) => void;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function useKeyboardNavigation({ dropdownId, focus, setFocus, isOpen, onClose }: UseKeyboardNavigationProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n const { level: focusLevel, index: focusedIndex } = focus || { level: 1, index: null };\n\n const menu = document.querySelector<HTMLElement>(`#${dropdownId} [data-menu][data-level=\"${focusLevel}\"]`) as HTMLElement;\n if (!menu) return;\n\n const itemElements = getItemElements(menu, focusLevel);\n if (itemElements.length === 0) return;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const nextIndex = getNextMenuItemIndex(itemElements, focusedIndex);\n if (nextIndex === -1) return;\n setFocus({ level: focusLevel, index: nextIndex });\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prevIndex = getPreviousMenuItemIndex(itemElements, focusedIndex);\n if (prevIndex === -1) return;\n setFocus({ level: focusLevel, index: prevIndex });\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (focusedIndex !== null) {\n const el = itemElements[focusedIndex];\n const submenu = el.querySelector<HTMLElement>('[data-menu]');\n\n if (submenu) {\n // focus first submenu item\n const firstSubItem = submenu.querySelector<HTMLElement>('[data-menu-item]');\n\n if (firstSubItem) {\n setFocus({ level: focusLevel + 1, index: 0 });\n }\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n // go back to parent menu if inside submenu\n const parentMenuItem = menu.parentElement?.closest<HTMLElement>('[data-menu-item]') as HTMLElement;\n\n if (!parentMenuItem) {\n console.error(`No parent menu found leaving menu level ${focusLevel}`);\n return;\n }\n\n const parentMenuIndex = parentMenuItem.getAttribute('data-index')\n ? Number(parentMenuItem.getAttribute('data-index'))\n : -1;\n\n if (parentMenuItem) {\n setFocus({ level: focusLevel - 1, index: parentMenuIndex === -1 ? 0 : parentMenuIndex });\n }\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (focusedIndex !== null) {\n const el = itemElements[focusedIndex];\n el?.click();\n setFocus(null);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n onClose?.();\n setFocus(null);\n break;\n }\n case 'Tab': {\n onClose();\n break;\n }\n }\n },\n [isOpen, focus, setFocus, onClose, dropdownId]\n );\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown, isOpen]);\n\n return { handleKeyDown };\n}\n","import React, { useCallback, useEffect, useId, useMemo, useState } from 'react';\nimport { join } from '../../utils';\nimport { Popover, PopoverProps } from '../popover';\nimport { DropdownMenuContext, DropdownMenuContextFocus, DropdownMenuContextValue } from './DropdownContext';\nimport { MenuBody } from './DropdownMenuBody';\nimport { useKeyboardNavigation } from './hooks';\nimport { DropdownMenuItem } from './types';\n\nexport interface DropdownMenuProps extends Omit<PopoverProps, 'children'> {\n\t/** Dropdown options, separators, groups, or custom items */\n\titems: DropdownMenuItem[];\n\t/** Callback when an item is selected, returns the value of the selected item */\n\tonItemSelect?: (value: string) => void;\n}\n\nfunction getMenuItem(dropdownId: string, level: number, index: number): HTMLElement | null {\n\treturn document.querySelector<HTMLElement>(\n\t\t`#${dropdownId} [data-menu-item][data-level=\"${level}\"][data-index=\"${index}\"]`\n\t);\n}\n\n/**\n * A fully-featured dropdown menu with keyboard navigation, nested submenus, and flexible item types.\n * Supports separators, groups, and custom content with accessibility features.\n * \n * @example\n * ```tsx\n * // Basic dropdown menu\n * <DropdownMenu\n * trigger={<Button>Options</Button>}\n * items={[\n * { type: 'item', label: 'Edit', value: 'edit' },\n * { type: 'item', label: 'Delete', value: 'delete' },\n * { type: 'separator' }\n * ]}\n * onItemSelect={(value) => handleAction(value)}\n * />\n * \n * // With nested submenus\n * <DropdownMenu\n * trigger={<Button>More Actions</Button>}\n * items={[\n * { \n * type: 'submenu', \n * label: 'Export',\n * items: [\n * { type: 'item', label: 'PDF', value: 'pdf' },\n * { type: 'item', label: 'CSV', value: 'csv' }\n * ]\n * }\n * ]}\n * placement=\"bottom-end\"\n * />\n * ```\n */\nexport function DropdownMenu({\n\tid,\n\titems,\n\tonItemSelect,\n\ttrigger,\n\tisOpen: open,\n\tplacement = 'bottom',\n\talignment = 'start',\n\tonOpenChange,\n\tclassName = '',\n\t...popoverProps\n}: DropdownMenuProps) {\n\tconst generatedId = useId();\n\tconst dropdownId = id || `dropdown-menu-${generatedId}`;\n\tconst [focus, setFocus] = useState<DropdownMenuContextFocus | null>(null);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isUncontrolled = open === undefined;\n\tconst isOpen = isUncontrolled ? internalOpen : open;\n\n\tconst handleClose = useCallback(() => {\n\t\tsetFocus(null);\n\t\tsetInternalOpen(false);\n\t}, []);\n\n\tconst handleItemSelect = useCallback(\n\t\t(value: string) => {\n\t\t\tif (onItemSelect) {\n\t\t\t\tonItemSelect(value);\n\t\t\t}\n\t\t\thandleClose();\n\t\t},\n\t\t[onItemSelect, handleClose]\n\t);\n\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (isUncontrolled) {\n\t\t\t\tsetInternalOpen(open);\n\t\t\t}\n\t\t\tif (onOpenChange) {\n\t\t\t\tonOpenChange(open);\n\t\t\t}\n\t\t},\n\t\t[isUncontrolled, onOpenChange]\n\t);\n\n\tconst value = useMemo<DropdownMenuContextValue>(\n\t\t() => ({\n\t\t\tid: dropdownId,\n\t\t\tfocus,\n\t\t\tsetFocus,\n\t\t\tisOpen,\n\t\t\tonItemSelect: handleItemSelect,\n\t\t\tonClose: handleClose,\n\t\t\tclassName,\n\t\t}),\n\t\t[focus, setFocus, handleItemSelect, handleClose, className, isOpen, dropdownId]\n\t);\n\n\tuseKeyboardNavigation({\n\t\tdropdownId,\n\t\tfocus,\n\t\tsetFocus,\n\t\tisOpen,\n\t\tonClose: handleClose,\n\t});\n\n\tconst dropdownTrigger = useMemo(() => {\n\t\treturn React.cloneElement(trigger, {\n\t\t\tonClick: (e: React.MouseEvent) => {\n\t\t\t\tif (isUncontrolled) {\n\t\t\t\t\tsetInternalOpen((prev) => !prev);\n\t\t\t\t}\n\t\t\t\tconst props = trigger.props as {\n\t\t\t\t\tonClick?: (e: React.MouseEvent) => void;\n\t\t\t\t};\n\t\t\t\tif (props.onClick) {\n\t\t\t\t\tprops.onClick(e);\n\t\t\t\t}\n\t\t\t},\n\t\t} as Record<string, unknown>);\n\t}, [isUncontrolled, setInternalOpen, trigger]);\n\n\tuseEffect(() => {\n\t\tif (focus) {\n\t\t\tconst el = getMenuItem(dropdownId, focus.level, focus.index);\n\t\t\tel?.focus();\n\t\t}\n\t}, [focus, dropdownId]);\n\n\treturn (\n\t\t<Popover\n\t\t\tid={dropdownId}\n\t\t\tisOpen={isUncontrolled ? internalOpen : isOpen}\n\t\t\ttrigger={dropdownTrigger}\n\t\t\tplacement={placement}\n\t\t\talignment={alignment}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t\tclassName={join('min-w-52', className)}\n\t\t\t{...popoverProps}\n\t\t>\n\t\t\t<DropdownMenuContext.Provider value={value}>\n\t\t\t\t<MenuBody items={items} level={1} />\n\t\t\t</DropdownMenuContext.Provider>\n\t\t</Popover>\n\t);\n}\n","import { DropdownMenuCustomItem, DropdownMenuItem, DropdownMenuOption, DropdownMenuOptionGroup, DropdownMenuSeparator } from './types';\n\nconst option = (item: Omit<DropdownMenuOption, '__type'>): DropdownMenuOption => ({\n __type: 'option',\n ...item,\n});\n\nconst group = (items: DropdownMenuItem[], title?: string): DropdownMenuOptionGroup => ({\n __type: 'group',\n title,\n items,\n});\n\nconst separator = (): DropdownMenuSeparator => ({\n __type: 'separator',\n});\n\nconst custom = (render: () => React.ReactNode): DropdownMenuCustomItem => ({\n __type: 'custom',\n render,\n});\n\nexport const DropdownMenuFactories = {\n option,\n group,\n separator,\n custom,\n};\n","import { useState, useCallback, useRef } from 'react';\n\nexport type DynamicListItem<T extends object> = T & {\n id: string;\n content: string;\n}\n\nexport function useDynamicList<T extends object>(initialItems: DynamicListItem<T>[] = []) {\n const [items, setItems] = useState<DynamicListItem<T>[]>(initialItems);\n const [draggedItem, setDraggedItem] = useState<DynamicListItem<T> | null>(null);\n const [draggedOverIndex, setDraggedOverIndex] = useState<number | null>(null);\n const draggedFromIndex = useRef<number | null>(null);\n\n const addItem = useCallback((content: string, extra?: Partial<T>) => {\n const newItem: DynamicListItem<T> = {\n ...(extra as T),\n id: `item-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n content,\n };\n setItems(prev => [...prev, newItem]);\n return newItem;\n }, []);\n\n const deleteItem = useCallback((id: string) => {\n setItems(prev => prev.filter(item => item.id !== id));\n }, []);\n\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) return;\n \n setItems(prev => {\n const newItems = [...prev];\n const [movedItem] = newItems.splice(fromIndex, 1);\n newItems.splice(toIndex, 0, movedItem);\n return newItems;\n });\n }, []);\n\n const moveItemUp = useCallback((index: number) => {\n if (index > 0) {\n moveItem(index, index - 1);\n }\n }, [moveItem]);\n\n const moveItemDown = useCallback((index: number) => {\n if (index < items.length - 1) {\n moveItem(index, index + 1);\n }\n }, [moveItem, items.length]);\n\n // Drag and drop handlers\n const handleDragStart = useCallback((item: DynamicListItem<T>, index: number) => {\n setDraggedItem(item);\n draggedFromIndex.current = index;\n setDraggedOverIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDraggedOverIndex(index);\n }, []);\n\n const handleDragEnd = useCallback(() => {\n if (draggedItem && draggedOverIndex !== null && draggedFromIndex.current !== null) {\n const fromIndex = draggedFromIndex.current;\n const toIndex = draggedOverIndex;\n \n if (fromIndex !== toIndex) {\n moveItem(fromIndex, toIndex);\n }\n }\n \n setDraggedItem(null);\n setDraggedOverIndex(null);\n draggedFromIndex.current = null;\n }, [draggedItem, draggedOverIndex, moveItem]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Get items with visual drag feedback\n const getVisualItems = useCallback(() => {\n if (!draggedItem || draggedOverIndex === null || draggedFromIndex.current === null) {\n return items;\n }\n\n const fromIndex = draggedFromIndex.current;\n const toIndex = draggedOverIndex;\n\n if (fromIndex === toIndex) {\n return items;\n }\n\n // Create a copy of items with the dragged item moved to the hover position\n const visualItems = [...items];\n const [movedItem] = visualItems.splice(fromIndex, 1);\n visualItems.splice(toIndex, 0, movedItem);\n \n return visualItems;\n }, [items, draggedItem, draggedOverIndex, draggedFromIndex]);\n\n return {\n items,\n visualItems: getVisualItems(),\n addItem,\n deleteItem,\n moveItem,\n moveItemUp,\n moveItemDown,\n draggedItem,\n draggedOverIndex,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n };\n}","export type DynamicListSize = 'sm' | 'md' | 'lg';\n\nexport const titleVariants: Record<DynamicListSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n} as const;\n\nexport const listVariants: Record<DynamicListSize, string> = {\n sm: 'text-sm gap-2',\n md: 'text-base gap-3',\n lg: 'text-lg gap-4',\n} as const;\n\nexport const iconSize: Record<DynamicListSize, number> = {\n sm: 14,\n md: 15,\n lg: 16,\n};","export function DiscMarker({ size = 8, className = '' }: { size?: number; className?: string }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`rounded-full flex-shrink-0 bg-current ${className}`}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: size,\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nexport function DashMarker({ size = 12, className = '' }: { size?: number; className?: string }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex-shrink-0 bg-current ${className}`}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: 2,\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport { useDynamicList, type DynamicListItem } from './hooks';\nimport { DynamicListSize, iconSize, listVariants, titleVariants } from './variants';\nimport { join } from '../../utils';\nimport { ChevronDown, ChevronUp, GripVertical, Plus, Trash } from '../../symbols';\nimport { DashMarker, DiscMarker } from './markers';\n\nexport type DynamicListMarkerType = 'disc' | 'dash' | 'decimal' | React.ReactElement;\n\nexport interface DynamicListProps<T extends object> {\n\t/** Items to display in the list */\n\titems?: DynamicListItem<T>[];\n\t/** Size variant */\n\tsize?: DynamicListSize;\n\t/** Optional ID for the component */\n\tid?: string;\n\t/** Additional CSS classes */\n\tclassName?: string;\n\t/** Reference to the list container element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Whether items can be added */\n\tallowAdd?: boolean;\n\t/** Whether items can be deleted */\n\tallowDelete?: boolean;\n\t/** Whether items can be reordered */\n\tallowReorder?: boolean;\n\t/** Placeholder text for new items */\n\taddPlaceholder?: string;\n\t/** Callback when items change */\n\tonItemsChange?: (items: DynamicListItem<T>[]) => void;\n\t/** Custom render function for items */\n\trenderItem?: (item: DynamicListItem<T>, index: number) => React.ReactNode;\n\t/** Marker type for list items */\n\tmarker?: DynamicListMarkerType;\n\t/** Custom item renderer function (alternative name for renderItem) */\n\titemRenderer?: (item: DynamicListItem<T>, index: number) => React.ReactNode;\n\t/** Whether to show dividers between items */\n\tshowDividers?: boolean;\n\t/** Whether to always show reorder buttons (if allowReorder is true) */\n\tshowReorderButtons?: boolean;\n\t/** Optional title for the list */\n\ttitle?: string | React.ReactElement;\n\t/** Whether to truncate long text in items (default: true) */\n\ttruncateText?: boolean;\n}\n\n/**\n * An interactive list component with add, delete, and reorder functionality.\n * Supports drag-and-drop reordering, keyboard navigation, and custom item rendering.\n * \n * @example\n * ```tsx\n * // Basic dynamic list\n * <DynamicList\n * items={[\n * { id: '1', content: 'First item' },\n * { id: '2', content: 'Second item' }\n * ]}\n * onItemsChange={(items) => setListItems(items)}\n * title=\"My Tasks\"\n * />\n * \n * // Custom rendering with limited functionality\n * <DynamicList\n * items={todos}\n * renderItem={(item, index) => (\n * <TodoItem {...item} onToggle={() => toggleTodo(item.id)} />\n * )}\n * allowDelete={false}\n * marker=\"decimal\"\n * />\n * ```\n */\nexport function DynamicList<T extends object>({\n\titems: initialItems = [],\n\tsize = 'md',\n\tid,\n\tclassName = '',\n\tref,\n\tallowAdd = true,\n\tallowDelete = true,\n\tallowReorder = true,\n\taddPlaceholder = 'Add new item...',\n\tonItemsChange,\n\trenderItem,\n\tmarker,\n\titemRenderer,\n\tshowDividers = true,\n\tshowReorderButtons = true,\n\ttitle,\n\ttruncateText = false,\n}: DynamicListProps<T>) {\n\tconst [newItemText, setNewItemText] = useState('');\n\tconst [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst generatedId = useId();\n\tconst hasMounted = useRef(false);\n\tconst lastOnChangeItems = useRef<DynamicListItem<T>[]>(initialItems);\n\tconst listId = id || `dynamic-list-${generatedId}`;\n\tconst titleId = `${listId}-title`;\n\n\tconst {\n\t\titems,\n\t\tvisualItems,\n\t\taddItem,\n\t\tdeleteItem,\n\t\tmoveItemUp,\n\t\tmoveItemDown,\n\t\tdraggedItem,\n\t\tdraggedOverIndex,\n\t\thandleDragStart,\n\t\thandleDragOver,\n\t\thandleDragEnd,\n\t\thandleDrop,\n\t} = useDynamicList<T>(initialItems);\n\n\t// Use itemRenderer if provided, otherwise use renderItem\n\tconst itemRenderFunction = itemRenderer || renderItem;\n\n\t// Call onChange callback when items change\n\t// Avoid calling onItemsChange on initial mount\n\tuseEffect(() => {\n\t\tif (!hasMounted.current) {\n\t\t\thasMounted.current = true;\n\t\t\treturn;\n\t\t}\n\t\tif (lastOnChangeItems.current !== items) {\n\t\t\tlastOnChangeItems.current = items;\n\t\t\tonItemsChange?.(items);\n\t\t}\n\t}, [items, onItemsChange]);\n\n\tconst getItemElementById = (itemId: string) =>\n\t\t// must escape special characters in ID for querySelector\n\t\tdocument.querySelector(`#${listId} #${CSS.escape(itemId)}`) as HTMLElement | null;\n\n\tconst handleAddItem = () => {\n\t\tif (newItemText.trim()) {\n\t\t\taddItem(newItemText.trim());\n\t\t\tsetNewItemText('');\n\t\t\tinputRef.current?.focus();\n\t\t}\n\t};\n\n\tconst handleDeleteItem = (e: React.MouseEvent | React.KeyboardEvent, index: number) => {\n\t\tif (!allowDelete) {\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst nextIndex = index < items.length - 1 ? index + 1 : index - 1;\n\t\tconst nextItem = items[nextIndex];\n\t\tdeleteItem(items[index].id);\n\n\t\t// After deletion, set focus to the next item or previous if last was deleted\n\t\tif (nextIndex >= 0 && nextItem) {\n\t\t\t// Use a timeout to ensure the item is removed from the DOM before focusing\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst nextElement = getItemElementById(nextItem.id);\n\t\t\t\tnextElement?.focus();\n\t\t\t}, 0);\n\t\t} else {\n\t\t\t// If no items left, focus the input for adding new items\n\t\t\tinputRef.current?.focus();\n\t\t\tsetHoveredIndex(null);\n\t\t}\n\t};\n\n\tconst handleKeyPress = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'Enter') {\n\t\t\thandleAddItem();\n\t\t}\n\t};\n\n\tconst handleItemKeyDown = (e: React.KeyboardEvent, index: number) => {\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (!allowReorder) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tmoveItemUp(index);\n\n\t\t\t\tif (index > 0) {\n\t\t\t\t\tsetHoveredIndex(index - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (!allowReorder) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tmoveItemDown(index);\n\n\t\t\t\tif (index < items.length - 1) {\n\t\t\t\t\tsetHoveredIndex(index + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Backspace':\n\t\t\tcase 'Delete':\n\t\t\t\thandleDeleteItem(e, index);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tconst renderTitle = () => {\n\t\tif (!title) return null;\n\n\t\tconst titleClasses = join('font-medium opacity-60', titleVariants[size]);\n\t\tif (typeof title === 'string') {\n\t\t\treturn (\n\t\t\t\t<h4 id={titleId} className={titleClasses}>\n\t\t\t\t\t{title}\n\t\t\t\t</h4>\n\t\t\t);\n\t\t}\n\n\t\tconst prop = title.props as { className?: string };\n\t\treturn React.cloneElement(title, { id: titleId, className: join(titleClasses, prop.className) } as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>);\n\t};\n\n\t// Render marker based on type\n\tconst renderMarker = (index: number) => {\n\t\tif (!marker) return null;\n\n\t\tif (React.isValidElement(marker)) {\n\t\t\treturn marker;\n\t\t}\n\n\t\tswitch (marker) {\n\t\t\tcase 'disc':\n\t\t\t\treturn <DiscMarker className='text-muted-foreground' />;\n\t\t\tcase 'dash':\n\t\t\t\treturn <DashMarker className='text-muted-foreground' />;\n\t\t\tcase 'decimal':\n\t\t\t\treturn (\n\t\t\t\t\t<span className='text-sm font-medium text-muted-foreground flex-shrink-0 min-w-4 text-right'>\n\t\t\t\t\t\t{index + 1}.\n\t\t\t\t\t</span>\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn <DiscMarker className='text-muted-foreground' />;\n\t\t}\n\t};\n\n\tconst sizeClasses = listVariants[size];\n\tconst iconSizeValue = iconSize[size];\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tid={listId}\n\t\t\tclassName={className}\n\t\t\tdata-size={size}\n\t\t\tdata-allow-add={allowAdd}\n\t\t\tdata-allow-delete={allowDelete}\n\t\t\tdata-allow-reorder={allowReorder}\n\t\t\tdata-marker={typeof marker === 'string' ? marker : 'custom'}\n\t\t>\n\t\t\t{/* Title */}\n\t\t\t{renderTitle()}\n\n\t\t\t{/* List Items */}\n\t\t\t<ul className={sizeClasses} role='list' aria-labelledby={title ? titleId : undefined}>\n\t\t\t\t{visualItems.map((item, visualIndex) => {\n\t\t\t\t\t// Find the original index of this item in the actual items array\n\t\t\t\t\tconst originalIndex = items.findIndex((originalItem) => originalItem.id === item.id);\n\t\t\t\t\tconst isDraggedItem = draggedItem?.id === item.id;\n\t\t\t\t\tconst isHovered = hoveredIndex === originalIndex;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={item.id}>\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\ttitle={truncateText ? item.content : undefined}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'flex items-center group relative transition-all duration-150',\n\t\t\t\t\t\t\t\t\tisDraggedItem && 'opacity-30',\n\t\t\t\t\t\t\t\t\t// Drag feedback styling\n\t\t\t\t\t\t\t\t\tdraggedItem && draggedOverIndex === visualIndex && !isDraggedItem ? 'border-t-2 border-primary' : ''\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdraggable={allowReorder}\n\t\t\t\t\t\t\t\tonDragStart={(e) => {\n\t\t\t\t\t\t\t\t\te.dataTransfer.effectAllowed = 'move';\n\t\t\t\t\t\t\t\t\thandleDragStart(item, originalIndex);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonDragOver={(e) => handleDragOver(e, visualIndex)}\n\t\t\t\t\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\t\t\t\t\tonDrop={handleDrop}\n\t\t\t\t\t\t\t\tonMouseEnter={() => setHoveredIndex(originalIndex)}\n\t\t\t\t\t\t\t\tonMouseLeave={() => setHoveredIndex(null)}\n\t\t\t\t\t\t\t\tonFocus={(e) => {\n\t\t\t\t\t\t\t\t\t// Check if the focused element is the current list item\n\t\t\t\t\t\t\t\t\tif (e.currentTarget === e.target) {\n\t\t\t\t\t\t\t\t\t\tsetHoveredIndex(originalIndex);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\trole='listitem'\n\t\t\t\t\t\t\t\taria-label={`List item ${originalIndex + 1}: ${item.content}`}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleItemKeyDown(e, originalIndex)}\n\t\t\t\t\t\t\t\taria-description={`${allowReorder ? 'Use up/down arrow keys to reorder. ' : ''}${\n\t\t\t\t\t\t\t\t\tallowDelete ? 'Press Backspace/Delete to remove this item.' : ''\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Drag Handle */}\n\t\t\t\t\t\t\t\t{allowReorder && (\n\t\t\t\t\t\t\t\t\t<div className={join('absolute -translate-x-full flex-shrink-0 pl-2 pr-1 py-2 cursor-move transition-opacity opacity-0', (isDraggedItem || (isHovered && !draggedItem)) && 'opacity-100')}>\n\t\t\t\t\t\t\t\t\t\t<GripVertical size={iconSizeValue + 2} />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Marker */}\n\t\t\t\t\t\t\t\t{marker && (\n\t\t\t\t\t\t\t\t\t<div className={join('flex-shrink-0 flex items-center justify-center py-2 pr-2')}>\n\t\t\t\t\t\t\t\t\t\t{renderMarker(originalIndex)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Item Content */}\n\t\t\t\t\t\t\t\t<div className={join('flex-1 flex min-w-0')}>\n\t\t\t\t\t\t\t\t\t<div className={join('flex-1 min-w-0 py-2 pr-2')}>\n\t\t\t\t\t\t\t\t\t\t{itemRenderFunction ? (\n\t\t\t\t\t\t\t\t\t\t\titemRenderFunction(item, originalIndex)\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span className={join('block', truncateText && 'truncate')}>{item.content}</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Control Buttons */}\n\t\t\t\t\t\t\t\t\t{!draggedItem && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex-shrink-0 flex items-center gap-1 pr-2 opacity-0 transition-opacity',\n\t\t\t\t\t\t\t\t\t\t\t\tisHovered && 'opacity-100'\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{/* Move Up/Down Buttons */}\n\t\t\t\t\t\t\t\t\t\t\t{allowReorder && showReorderButtons && (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => moveItemUp(originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={originalIndex === 0}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 opacity-50 leading-0 hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Prevent from tabbing to this button since the behavior is not ideal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => moveItemDown(originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={originalIndex === items.length - 1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 opacity-50 leading-0 hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Prevent from tabbing to this button since the behavior is not ideal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t\t{/* Delete Button */}\n\t\t\t\t\t\t\t\t\t\t\t{allowDelete && (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isHovered ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleDeleteItem(e, originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 text-destructive opacity-70 h-fit hover:opacity-90 rounded transition-colors focus:outline-none focus:ring-2 focus:ring-destructive'\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Delete item`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{showDividers && visualIndex < items.length - 1 && <hr className='border-border/50' />}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\n\t\t\t\t{/* Empty State */}\n\t\t\t\t{items.length === 0 && (\n\t\t\t\t\t<li className={join('text-center text-muted-foreground py-8', sizeClasses)}>\n\t\t\t\t\t\tNo items yet. {allowAdd && 'Add an item below to get started.'}\n\t\t\t\t\t</li>\n\t\t\t\t)}\n\t\t\t</ul>\n\n\t\t\t{/* Add New Item */}\n\t\t\t{allowAdd && (\n\t\t\t\t<div className={join('border-t border-border/50 flex items-center gap-2', sizeClasses)}>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={`${listId}-new-item-input`}\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\ttype='text'\n\t\t\t\t\t\tvalue={newItemText}\n\t\t\t\t\t\tonChange={(e) => setNewItemText(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyPress}\n\t\t\t\t\t\tplaceholder={addPlaceholder}\n\t\t\t\t\t\tclassName='flex-1 bg-transparent border-none outline-none placeholder-muted-foreground pt-1'\n\t\t\t\t\t\taria-label='Add new list item'\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\tonClick={handleAddItem}\n\t\t\t\t\t\tdisabled={!newItemText.trim()}\n\t\t\t\t\t\tclassName='flex-shrink-0 p-1.5 text-muted-foreground opacity-70 enabled:hover:opacity-100 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-opacity'\n\t\t\t\t\t\taria-label='Add item'\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus size={16} />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","interface ErrorBoundaryVariantStyles {\n container: string;\n icon: string;\n title: string;\n description: string;\n button: string;\n details: string;\n}\n\nexport type ErrorBoundaryVariants = 'danger' | 'warning' | 'info';\n\nexport const ErrorBoundaryVariants: Record<ErrorBoundaryVariants, ErrorBoundaryVariantStyles> = {\n danger: {\n container: 'border-destructive bg-destructive/10',\n icon: 'text-destructive',\n title: 'text-destructive',\n description: 'text-destructive/80',\n button: 'bg-destructive text-destructive-foreground hover:bg-destructive/90 focus:ring-destructive',\n details: 'bg-destructive/5 border-destructive/20 text-destructive',\n },\n warning: {\n container: 'border-yellow-600 bg-yellow-600/10',\n icon: 'text-yellow-600',\n title: 'text-yellow-600',\n description: 'text-yellow-600/80',\n button: 'bg-yellow-600 text-white hover:bg-yellow-600/90 focus:ring-yellow-600',\n details: 'bg-yellow-600/5 border-yellow-600/20 text-yellow-600',\n },\n info: {\n container: 'border-blue-600 bg-blue-600/10',\n icon: 'text-blue-600',\n title: 'text-blue-600',\n description: 'text-blue-600/80',\n button: 'bg-blue-600 text-white hover:bg-blue-600/90 focus:ring-blue-600',\n details: 'bg-blue-600/5 border-blue-600/20 text-blue-600',\n },\n};","import React, { Component, ErrorInfo, ReactNode } from 'react';\nimport { ErrorBoundaryVariants } from './variants';\nimport { ExclamationTriangle, InfoCircled } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface ErrorBoundaryProps {\n /** The HTML id attribute for the error boundary */\n id?: string;\n /** The visual style variant of the error boundary */\n variant?: ErrorBoundaryVariants;\n /** Whether to show a retry button in the error fallback UI */\n showRetry?: boolean;\n /** Custom error message to display in the fallback UI */\n fallbackMessage?: string;\n /** Custom fallback UI to render on error instead of the default error display */\n fallback?: ReactNode;\n /** Callback function executed when the retry button is clicked */\n onRetry?: () => void;\n /** Callback function when error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Additional classes to apply to the ErrorBoundary container */\n className?: string;\n /** The children to render inside the ErrorBoundary */\n children: ReactNode;\n /** Flag to indicate if the app is in development mode. For showing error details in development mode */\n inDevEnv?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nconst VariantIcons: Record<ErrorBoundaryVariants, React.ReactNode> = {\n danger: <ExclamationTriangle size={24} />,\n warning: <ExclamationTriangle size={24} />,\n info: <InfoCircled size={24} />,\n};\n\n/**\n * A React error boundary component that catches JavaScript errors in child components\n * and displays a fallback UI instead of crashing the entire application.\n * \n * @example\n * ```tsx\n * // Basic error boundary\n * <ErrorBoundary>\n * <MyComponent />\n * </ErrorBoundary>\n * \n * // With custom error handling and retry\n * <ErrorBoundary\n * variant=\"warning\"\n * fallbackMessage=\"Failed to load user profile\"\n * onError={(error) => logError(error)}\n * onRetry={() => refetchUserData()}\n * inDevEnv={process.env.NODE_ENV === 'development'}\n * >\n * <UserProfile />\n * </ErrorBoundary>\n * ```\n */\nexport function ErrorBoundary({\n id,\n variant = 'danger',\n showRetry = true,\n fallbackMessage,\n fallback,\n onRetry,\n onError,\n className,\n children,\n inDevEnv = false,\n}: ErrorBoundaryProps) {\n // Since functional components can't have error boundaries,\n // we need to use a class component wrapper\n return (\n <ErrorBoundaryClass\n id={id}\n variant={variant}\n showRetry={showRetry}\n fallbackMessage={fallbackMessage}\n fallback={fallback}\n onRetry={onRetry}\n onError={onError}\n className={className}\n inDevEnv={inDevEnv}\n >\n {children}\n </ErrorBoundaryClass>\n );\n}\n\nclass ErrorBoundaryClass extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ error, errorInfo });\n this.props.onError?.(error, errorInfo);\n \n // Log error for development\n if (this.props.inDevEnv) {\n console.error('ErrorBoundary caught an error:', error);\n console.error('Error info:', errorInfo);\n }\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n this.props.onRetry?.();\n };\n\n render() {\n const {\n id,\n variant = 'danger',\n showRetry = true,\n fallbackMessage = 'Something went wrong',\n fallback,\n className,\n inDevEnv,\n } = this.props;\n\n if (this.state.hasError) {\n // Use custom fallback if provided\n if (fallback) {\n return fallback;\n }\n\n const variantStyles = ErrorBoundaryVariants[variant];\n const icon = VariantIcons[variant];\n\n return (\n <div\n id={id}\n data-variant={variant}\n data-has-error={this.state.hasError}\n className={join(\n 'rounded-lg border p-6 text-center',\n variantStyles.container,\n className\n )}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <div className={join('mb-4 flex justify-center', variantStyles.icon)}>\n {icon}\n </div>\n \n <h3 className={join('text-lg font-semibold mb-2', variantStyles.title)}>\n Oops! Something went wrong\n </h3>\n \n <p className={join('text-sm mb-4', variantStyles.description)}>\n {fallbackMessage}\n </p>\n\n {inDevEnv && this.state.error && (\n <details className=\"mt-4 text-left\">\n <summary className=\"cursor-pointer text-sm font-medium mb-2\">\n Error Details (Development Only)\n </summary>\n <div className={join(\n 'rounded border p-3 text-xs font-mono whitespace-pre-wrap overflow-auto max-h-40',\n variantStyles.details\n )}>\n <div className=\"font-bold mb-1\">Error:</div>\n <div className=\"mb-2\">{this.state.error.toString()}</div>\n {this.state.errorInfo?.componentStack && (\n <>\n <div className=\"font-bold mb-1\">Component Stack:</div>\n <div>{this.state.errorInfo.componentStack}</div>\n </>\n )}\n </div>\n </details>\n )}\n\n {showRetry && (\n <button\n type=\"button\"\n onClick={this.handleRetry}\n className={join(\n 'inline-flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-transparent',\n variantStyles.button\n )}\n aria-label=\"Try again\"\n >\n Try Again\n </button>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}","import {\n FormInputField,\n FormTextareaField,\n FormSelectField,\n FormCheckboxField,\n FormRadioField\n} from './types';\n\nconst input = (field: Omit<FormInputField, '__type'>): FormInputField => ({\n __type: 'input',\n ...field,\n});\n\nconst textarea = (field: Omit<FormTextareaField, '__type'>): FormTextareaField => ({\n __type: 'textarea',\n ...field,\n});\n\nconst select = (field: Omit<FormSelectField, '__type'>): FormSelectField => ({\n __type: 'select',\n ...field,\n});\n\nconst checkbox = (field: Omit<FormCheckboxField, '__type'>): FormCheckboxField => ({\n __type: 'checkbox',\n ...field,\n});\n\nconst radio = (field: Omit<FormRadioField, '__type'>): FormRadioField => ({\n __type: 'radio',\n ...field,\n});\n\nexport const FormFactories = {\n input,\n textarea,\n select,\n checkbox,\n radio,\n};","import { useState, useCallback, useMemo } from 'react';\nimport { FormField, FormData, FormErrors, IsValidFunc } from './types';\n\nexport function useFormValidation(fields: FormField[], data: FormData) {\n const [errors, setErrors] = useState<FormErrors>({});\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validateField = useCallback((field: FormField, value: any): string | null => {\n // Check required fields\n if (field.required && (!value || (typeof value === 'string' && value.trim() === ''))) {\n return `${field.label} is required`;\n }\n\n // Run custom validation if provided\n if (field.isValid && value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isValidFunc = field.isValid as IsValidFunc<any>;\n const validation = isValidFunc(value);\n if (!validation.valid) {\n return validation.message || `${field.label} is invalid`;\n }\n }\n\n return null;\n }, []);\n\n const validateForm = useCallback((currentData: FormData = data) => {\n const newErrors: FormErrors = {};\n \n fields.forEach(field => {\n const error = validateField(field, currentData[field.name]);\n if (error) {\n newErrors[field.name] = error;\n }\n });\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, [fields, data, validateField]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validateSingleField = useCallback((fieldName: string, value: any) => {\n const field = fields.find(f => f.name === fieldName);\n if (!field) return;\n\n const error = validateField(field, value);\n setErrors(prev => {\n const newErrors = { ...prev };\n if (error) {\n newErrors[fieldName] = error;\n } else {\n delete newErrors[fieldName];\n }\n return newErrors;\n });\n\n return !error;\n }, [fields, validateField]);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n\n const hasErrors = useMemo(() => {\n return Object.values(errors).some(error => error);\n }, [errors]);\n\n const isFormValid = useMemo(() => {\n // Check if all required fields have values and pass validation\n return fields.every(field => {\n const value = data[field.name];\n \n // Check required fields\n if (field.required && (!value || (typeof value === 'string' && value.trim() === ''))) {\n return false;\n }\n \n // Check custom validation\n if (field.isValid && value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isValidFunc = field.isValid as IsValidFunc<any>;\n const validation = isValidFunc(value);\n return validation.valid;\n }\n \n return true;\n }) && !hasErrors;\n }, [fields, data, hasErrors]);\n\n return {\n errors,\n hasErrors,\n isFormValid,\n validateForm,\n validateSingleField,\n clearErrors,\n };\n}","export const formVariants = {\n spacing: {\n tight: 'gap-3',\n normal: 'gap-4', \n loose: 'gap-6',\n },\n columns: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2', \n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4',\n },\n colSpan: {\n 1: 'col-span-1',\n 2: 'col-span-1 md:col-span-2',\n 3: 'col-span-1 md:col-span-2 lg:col-span-3', \n 4: 'col-span-1 md:col-span-2 lg:col-span-4',\n full: 'col-span-full',\n },\n} as const;\n\nexport type FormSpacing = keyof typeof formVariants.spacing;\nexport type FormColumns = keyof typeof formVariants.columns;\nexport type FormColSpan = keyof typeof formVariants.colSpan;\n\nexport interface FormVariants {\n /** Spacing between form fields. */\n spacing: FormSpacing;\n /** Number of columns in the form grid layout. */\n columns?: FormColumns;\n /** Whether to collapse to single column on mobile devices. */\n responsive?: boolean;\n}\n\nexport const formDefaults: FormVariants = {\n spacing: 'normal',\n columns: 1,\n responsive: true,\n} as const;","import React, { useId } from 'react';\nimport { QuestionMarkCircled } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n /** The display type of the label. */\n display?: 'block' | 'inline';\n /** The width of the label element. */\n width?: React.CSSProperties['width'];\n /** Whether to show a required indicator (*) next to the label. */\n required?: boolean;\n /** Help text to display in a tooltip next to the label. */\n helpMessage?: string;\n /** Additional content to display after the label text. */\n suffix?: React.ReactNode;\n /** Description text to display below the label. */\n description?: string;\n}\n\n/**\n * A form label component with support for required indicators, help tooltips,\n * and description text. Provides accessibility features for form elements.\n * \n * @example\n * ```tsx\n * // Basic label\n * <Label htmlFor=\"email\">Email Address</Label>\n * \n * // Required field with description\n * <Label \n * htmlFor=\"password\"\n * required\n * description=\"Must be at least 8 characters\"\n * >\n * Password\n * </Label>\n * \n * // With help tooltip\n * <Label \n * htmlFor=\"username\"\n * helpMessage=\"Username will be visible to other users\"\n * >\n * Display Name\n * </Label>\n * ```\n */\nexport function Label({\n display = 'inline',\n width = 'fit-content',\n className = '',\n required,\n helpMessage,\n suffix,\n htmlFor,\n children,\n description,\n ...props\n}: LabelProps) {\n const id = useId();\n const showHelp = (helpMessage?.trim()?.length || 0) > 0;\n const showDescription = (description?.trim()?.length || 0) > 0;\n const helpId = showHelp ? `${htmlFor ?? id}-help` : undefined;\n const descriptionId = showDescription ? `${htmlFor ?? id}-description` : undefined;\n\n return (\n <div\n style={{ display: display === 'inline' ? 'inline-block' : 'block', width }}\n className={join('mb-0.5', className)}\n >\n <div className='relative flex'>\n <label className='font-medium' htmlFor={htmlFor} {...props}>\n {children}\n {required && (\n <span className='text-red-500 font-medium ml-1' aria-label='required'>\n *\n </span>\n )}\n </label>\n {showHelp && (\n <span\n className='text-gray-500 ml-1 size-fit -translate-y-1/3'\n aria-describedby={helpId}\n aria-label='Help information'\n title={helpMessage}\n >\n <QuestionMarkCircled />\n </span>\n )}\n {showHelp && (\n <div id={helpId} className='sr-only'>\n {helpMessage}\n </div>\n )}\n {suffix && <span className='ml-1'>{suffix}</span>}\n </div>\n {showDescription && (\n <small id={descriptionId} className='block opacity-80 mt-0.5' role='note'>\n {description}\n </small>\n )}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { CheckCircled, ExclamationTriangle } from '../../symbols';\nimport { join } from '../../utils';\n\ninterface StatusHelpMessageProps {\n elementId: string;\n type: 'error' | 'success';\n message?: string;\n}\n\nexport default function StatusHelpMessage({ elementId, type, message }: StatusHelpMessageProps) {\n useEffect(() => {\n const element = document.getElementById(elementId) as HTMLElement;\n if (!element) {\n return;\n }\n if (!message && type === 'error') {\n element.removeAttribute('data-error');\n return;\n }\n if (!message && type === 'success') {\n element.removeAttribute('data-success');\n return;\n }\n\n element.setAttribute('aria-describedby', `${elementId}-${type}-message`);\n element.setAttribute('aria-invalid', type === 'error' ? 'true' : 'false');\n\n if (type === 'error') {\n element.setAttribute('data-error', 'true');\n }\n if (type === 'success') {\n element.setAttribute('data-success', 'true');\n }\n\n return () => {\n element.removeAttribute('aria-describedby');\n element.removeAttribute('aria-invalid');\n element.removeAttribute('data-error');\n element.removeAttribute('data-success');\n };\n }, [elementId, type, message]);\n\n if (!message) {\n return null;\n }\n\n return (\n <small\n className={join(\n 'mt-0.5 text-sm inline-flex items-center gap-1 w-full justify-start',\n type === 'error' && 'text-destructive',\n type === 'success' && 'text-success'\n )}\n role='status'\n >\n {type === 'error' ? <ExclamationTriangle /> : <CheckCircled />}\n <span id={`${elementId}-${type}-message`}>{message}</span>\n </small>\n );\n}\n","export const inputVariants = {\n base: '',\n default:\n 'ring ring-transparent focus:ring-primary-foreground not-disabled:data-error:ring-destructive not-disabled:data-success:ring-success',\n underline:\n 'border-b border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n outline:\n 'border border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n} as const;\nexport type InputVariant = keyof typeof inputVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'px-3 rounded-full',\n} as const;\nexport type InputRounded = keyof typeof roundedVariants;\n\nexport interface InputVariants {\n /** The visual style variant of the input. */\n variant: InputVariant;\n /** The border radius of the input. */\n rounded: InputRounded;\n}\n\nexport const inputDefaults: InputVariants = {\n variant: 'default',\n rounded: 'none',\n} as const;\n","import { Ref, useId, useState } from 'react';\nimport { StatusHelpMessage } from '../../shared/forms';\nimport { EyeClosed, EyeOpened } from '../../symbols';\nimport { join } from '../../utils';\nimport './styles.css';\nimport { inputDefaults, inputVariants, InputVariants, roundedVariants } from './variants';\n\nexport interface InputProps extends Partial<InputVariants>, React.InputHTMLAttributes<HTMLInputElement> {\n /** Reference to the input element. */\n ref?: Ref<HTMLInputElement>;\n /** Whether the input is in read-only display mode. */\n displayOnlyMode?: boolean;\n /** Error message to display below the input when invalid. */\n errorMessage?: string;\n /** Success message to display below the input when valid. */\n successMessage?: string;\n}\n\n/**\n * A versatile input component with support for various types, validation states,\n * and password visibility toggle. Includes error/success message display.\n * \n * @example\n * ```tsx\n * // Basic input\n * <Input \n * placeholder=\"Enter your name\"\n * value={name}\n * onChange={(e) => setName(e.target.value)}\n * />\n * \n * // Password input with validation\n * <Input\n * type=\"password\"\n * placeholder=\"Enter password\"\n * errorMessage={passwordError}\n * variant=\"outline\"\n * rounded=\"lg\"\n * />\n * \n * // Read-only display mode\n * <Input value=\"John Doe\" displayOnlyMode />\n * ```\n */\nexport function Input({\n variant = inputDefaults.variant,\n rounded,\n displayOnlyMode = false,\n errorMessage,\n successMessage,\n type = 'text',\n className,\n ...rest\n}: InputProps) {\n const id = useId();\n const [showPassword, setShowPassword] = useState(false);\n\n // Default `round` of `md` for `outline` variant\n let adjustedRound = rounded;\n if (variant === 'outline' && !rounded) {\n adjustedRound = 'md';\n }\n adjustedRound = adjustedRound || inputDefaults.rounded;\n\n const baseClasses =\n 'appearance-none w-full focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed placeholder:text-muted/70 hide-number-input-arrows transition-all';\n const fileClasses =\n 'file:mr-2 file:border-0 file:rounded-md file:px-1.5 file:py-1 file:bg-primary hover:file:bg-primary/85 file:text-sm file:font-medium file:text-foreground file:transition-colors';\n\n const inputClasses = join(\n baseClasses,\n fileClasses,\n !displayOnlyMode && inputVariants[variant],\n !displayOnlyMode && roundedVariants[adjustedRound],\n type === 'password' && 'pr-10',\n !displayOnlyMode && 'px-2 py-1',\n displayOnlyMode && 'pointer-events-none',\n className\n );\n\n return (\n <div className={join(displayOnlyMode && 'cursor-text')} style={{ height: rest.height, width: rest.width }}>\n <div className={join(type === 'password' && 'relative')}>\n <input\n {...rest}\n id={id}\n type={type === 'password' && showPassword ? 'text' : type}\n aria-disabled={rest.disabled}\n readOnly={displayOnlyMode}\n aria-readonly={displayOnlyMode || rest['aria-readonly']}\n data-error={errorMessage ? true : undefined}\n data-success={successMessage ? true : undefined}\n className={inputClasses}\n />\n {type === 'password' && (\n <button\n onClick={() => setShowPassword(!showPassword)}\n className='absolute inset-y-0 right-0 px-2 hover:cursor-pointer'\n aria-label='Toggle password visibility'\n data-state={showPassword ? 'visible' : 'hidden'}\n >\n {showPassword ? <EyeOpened size={20} /> : <EyeClosed size={20} />}\n </button>\n )}\n </div>\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='error' message={errorMessage} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='success' message={successMessage} />}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { join } from '../../utils';\n\ninterface CharacterCountProps {\n elementId: string;\n maxLength: number;\n}\n\nexport default function CharacterCount({ elementId, maxLength }: CharacterCountProps) {\n const [characterCount, setCharacterCount] = useState(0);\n\n useEffect(() => {\n const textarea = document.getElementById(elementId) as HTMLTextAreaElement;\n if (!textarea) {\n return;\n }\n\n const updateCharacterCount = () => {\n const updatedCharacterCount = textarea.value.length;\n setCharacterCount(updatedCharacterCount);\n const isError = updatedCharacterCount >= maxLength;\n textarea.setAttribute('aria-describedby', `${elementId}-character-count`);\n textarea.setAttribute('aria-invalid', isError ? 'true' : 'false');\n\n if (isError) {\n textarea.setAttribute('data-error', 'true');\n } else {\n textarea.removeAttribute('data-error');\n }\n };\n\n updateCharacterCount();\n textarea.addEventListener('input', updateCharacterCount);\n textarea.setAttribute('maxlength', String(maxLength));\n\n return () => {\n textarea.removeEventListener('input', updateCharacterCount);\n textarea.removeAttribute('maxlength');\n textarea.removeAttribute('aria-describedby');\n textarea.removeAttribute('aria-invalid');\n textarea.removeAttribute('data-error');\n };\n }, [elementId, maxLength]);\n\n return (\n <small\n className={join(\n 'mt-0.5 text-sm inline-flex items-center gap-1 w-full justify-end',\n characterCount >= maxLength && 'text-destructive',\n characterCount < maxLength && 'text-current'\n )}\n role='status'\n >\n <span id={`${elementId}-character-count`}>\n {characterCount} / {maxLength} characters\n </span>\n </small>\n );\n}\n","import { useEffect } from 'react';\n\nexport function useAutoExpand(id: string, autoExpand: boolean) {\n useEffect(() => {\n const textarea = document.getElementById(id) as HTMLTextAreaElement;\n if (!textarea) {\n return;\n }\n\n if (!autoExpand) {\n textarea.style.height = 'auto';\n return;\n }\n\n const adjustHeight = () => {\n // necessary to reset the height to `auto` before calculating the new height\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n };\n\n adjustHeight();\n textarea.addEventListener('input', adjustHeight);\n textarea.addEventListener('resize', adjustHeight);\n window.addEventListener('resize', adjustHeight);\n\n return () => {\n textarea.removeEventListener('input', adjustHeight);\n textarea.removeEventListener('resize', adjustHeight);\n window.removeEventListener('resize', adjustHeight);\n };\n }, [id, autoExpand]);\n}\n","export const textareaVariants = {\n base: '',\n 'left-line':\n 'border-l border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n outline:\n 'border border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n} as const;\nexport type TextareaVariant = keyof typeof textareaVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'px-3 rounded-full',\n} as const;\nexport type TextareaRounded = keyof typeof roundedVariants;\n\nexport interface TextareaVariants {\n /** Visual style variant of the textarea. */\n variant: TextareaVariant;\n /** Border radius of the textarea. */\n rounded: TextareaRounded;\n}\n\nexport const textareaDefaults: TextareaVariants = {\n variant: 'outline',\n rounded: 'none',\n} as const;\n","import { Ref, useId } from 'react';\nimport { StatusHelpMessage } from '../../shared/forms';\nimport { join } from '../../utils';\nimport CharacterCount from './CharacterCount';\nimport { useAutoExpand } from './hooks';\nimport './styles.css';\nimport { roundedVariants, textareaDefaults, textareaVariants, TextareaVariants } from './variants';\n\nexport interface TextareaProps extends Partial<TextareaVariants>, React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Reference to the textarea element. */\n ref?: Ref<HTMLTextAreaElement>;\n /** Read-only mode for displaying text content without interaction styling. */\n displayOnlyMode?: boolean;\n /** Error message to display below the textarea. */\n errorMessage?: string;\n /** Success message to display below the textarea. */\n successMessage?: string;\n /** Whether to hide the resize handle (Webkit browsers only). */\n hideResizeHandle?: boolean; // only works for Webkit browsers\n /** Whether the textarea should automatically expand based on content. */\n autoExpand?: boolean;\n /** Maximum number of characters allowed. Shows character count when > 0. */\n characterLimit?: number;\n}\n\n/**\n * A versatile textarea component with auto-expand, character counting, and validation states.\n * Supports both interactive and display-only modes with various styling options.\n * \n * @example\n * ```tsx\n * // Basic textarea\n * <Textarea \n * placeholder=\"Enter your message...\"\n * rows={4}\n * value={message}\n * onChange={(e) => setMessage(e.target.value)}\n * />\n * \n * // Auto-expanding with character limit\n * <Textarea\n * autoExpand\n * characterLimit={500}\n * placeholder=\"Write your bio...\"\n * errorMessage={bioError}\n * variant=\"outline\"\n * />\n * \n * // Display-only mode\n * <Textarea \n * displayOnlyMode \n * value=\"Read-only content display\"\n * />\n * ```\n */\nexport function Textarea({\n variant = textareaDefaults.variant,\n rounded,\n displayOnlyMode = false,\n errorMessage,\n successMessage,\n hideResizeHandle = false,\n autoExpand = false,\n characterLimit = 0,\n className,\n ...rest\n}: TextareaProps) {\n const id = useId();\n useAutoExpand(id, autoExpand || displayOnlyMode);\n\n // Default `round` of `md` for `outline` variant\n let adjustedRound = rounded;\n if (variant === 'outline' && !rounded) {\n adjustedRound = 'md';\n }\n adjustedRound = adjustedRound || textareaDefaults.rounded;\n\n let adjustedHideResizeHandle = hideResizeHandle;\n if (displayOnlyMode || (variant === 'left-line' && !hideResizeHandle)) {\n adjustedHideResizeHandle = true;\n }\n\n const baseClasses =\n 'appearance-none w-full focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed placeholder:text-muted/70 hide-number-input-arrows transition-all';\n\n const inputClasses = join(\n baseClasses,\n !displayOnlyMode && textareaVariants[variant],\n !displayOnlyMode && roundedVariants[adjustedRound],\n !displayOnlyMode && 'px-2 py-1',\n displayOnlyMode && 'pointer-events-none',\n adjustedHideResizeHandle && 'no-resize-handle',\n\n className\n );\n\n return (\n <div className={join('-space-y-1.5', displayOnlyMode && 'cursor-text')}>\n <textarea\n {...rest}\n id={id}\n aria-disabled={rest.disabled}\n readOnly={displayOnlyMode}\n aria-readonly={displayOnlyMode || rest['aria-readonly']}\n style={{\n resize: autoExpand ? 'none' : undefined,\n }}\n className={inputClasses}\n />\n {characterLimit > 0 && <CharacterCount elementId={id} maxLength={characterLimit} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='error' message={errorMessage} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='success' message={successMessage} />}\n </div>\n );\n}\n","import { RefObject, useCallback, useEffect, useMemo, useState } from 'react';\n\nexport interface SelectOption {\n text: string;\n value: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport function useSelectDropdown(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 150);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\ninterface UseSelectKeyboardNavigationProps {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n filteredOptions: SelectOption[];\n highlightedIndex: number;\n setHighlightedIndex: (index: number) => void;\n onSelect: (option: SelectOption) => void;\n triggerRef: RefObject<HTMLButtonElement | null>;\n}\n\nexport function useSelectKeyboardNavigation({\n isOpen,\n setIsOpen,\n filteredOptions,\n highlightedIndex,\n setHighlightedIndex,\n onSelect,\n triggerRef,\n}: UseSelectKeyboardNavigationProps) {\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n const nextIndex = highlightedIndex < filteredOptions.length - 1 ? highlightedIndex + 1 : 0;\n // Skip disabled options\n let finalIndex = nextIndex;\n for (let i = 0; i < filteredOptions.length; i++) {\n const checkIndex = (nextIndex + i) % filteredOptions.length;\n if (!filteredOptions[checkIndex].disabled) {\n finalIndex = checkIndex;\n break;\n }\n }\n setHighlightedIndex(finalIndex);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n const prevIndex = highlightedIndex > 0 ? highlightedIndex - 1 : filteredOptions.length - 1;\n // Skip disabled options\n let finalIndex = prevIndex;\n for (let i = 0; i < filteredOptions.length; i++) {\n const checkIndex = (prevIndex - i + filteredOptions.length) % filteredOptions.length;\n if (!filteredOptions[checkIndex].disabled) {\n finalIndex = checkIndex;\n break;\n }\n }\n setHighlightedIndex(finalIndex);\n }\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else if (highlightedIndex >= 0 && highlightedIndex < filteredOptions.length) {\n const selectedOption = filteredOptions[highlightedIndex];\n if (!selectedOption.disabled) {\n onSelect(selectedOption);\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n break;\n\n case 'Tab':\n if (isOpen) {\n setIsOpen(false);\n }\n break;\n }\n },\n [isOpen, setIsOpen, filteredOptions, highlightedIndex, setHighlightedIndex, onSelect, triggerRef]\n );\n\n return { handleKeyDown };\n}\n\ninterface UseSelectHighlightProps {\n isOpen: boolean;\n filteredOptions: SelectOption[];\n selectedOption?: SelectOption;\n shouldRender: boolean;\n optionsContainerRef: RefObject<HTMLDivElement | null>;\n}\n\nexport function useSelectHighlight({\n isOpen,\n filteredOptions,\n selectedOption,\n shouldRender,\n optionsContainerRef,\n}: UseSelectHighlightProps) {\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n\n const selectedIndex = useMemo(() => {\n if (selectedOption) {\n return filteredOptions.findIndex((option) => option.value === selectedOption.value);\n }\n return -1;\n }, [filteredOptions, selectedOption]);\n\n // Set highlighted index when dropdown opens or options change\n useEffect(() => {\n if (isOpen && filteredOptions.length > 0) {\n if (selectedOption) {\n // Find the index of the selected option in filtered options\n setHighlightedIndex(selectedIndex >= 0 ? selectedIndex : 0);\n } else {\n // No selection, start from the first option\n setHighlightedIndex(0);\n }\n } else {\n // Reset highlighted index when dropdown closes\n setHighlightedIndex(-1);\n }\n }, [filteredOptions, isOpen, selectedOption, selectedIndex]);\n\n // Auto-scroll to highlighted option\n useEffect(() => {\n if (highlightedIndex >= 0 && optionsContainerRef.current && shouldRender) {\n const scrollToOption = () => {\n const container = optionsContainerRef.current;\n const highlightedOption = container?.querySelector(`[data-option-index=\"${highlightedIndex}\"]`) as HTMLElement;\n\n if (highlightedOption) {\n // Use immediate scroll when dropdown first opens with selected option, smooth scroll for keyboard navigation\n const behavior = isOpen && selectedOption && highlightedIndex === selectedIndex ? 'auto' : 'smooth';\n highlightedOption.scrollIntoView({\n behavior,\n block: 'nearest',\n });\n }\n };\n\n // Small delay to ensure DOM is rendered when dropdown opens\n if (isOpen && shouldRender && selectedOption) {\n setTimeout(scrollToOption, 10);\n } else {\n scrollToOption();\n }\n }\n }, [highlightedIndex, shouldRender, isOpen, selectedOption, filteredOptions, optionsContainerRef, selectedIndex]);\n\n return { highlightedIndex, setHighlightedIndex };\n}\n","export const sizeVariants = {\n sm: {\n trigger: 'px-2 py-1 text-sm',\n options: 'px-2 py-2 text-xs',\n },\n md: {\n trigger: 'px-3 py-2 text-base',\n options: 'px-3 py-2.5 text-sm',\n },\n lg: {\n trigger: 'px-4 py-3 text-lg',\n options: 'px-4 py-3 text-base',\n },\n} as const;\n\nexport type SelectSize = keyof typeof sizeVariants;\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useScrollArea(scrollbarThickness: number) {\n const viewportRef = useRef<HTMLDivElement>(null);\n const verticalThumbRef = useRef<HTMLDivElement>(null);\n const horizontalThumbRef = useRef<HTMLDivElement>(null);\n const [isScrolling, setIsScrolling] = useState(false);\n const [isFadingOut, setIsFadingOut] = useState(false);\n const [scrollbarVisible, setScrollbarVisible] = useState({\n vertical: false,\n horizontal: false,\n });\n const scrollTimeout = useRef<number | null>(null);\n const fadeTimeout = useRef<number | null>(null);\n\n // Check if content overflows and update scrollbar visibility\n const checkOverflow = useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n const hasVerticalScroll = viewport.scrollHeight > viewport.clientHeight;\n const hasHorizontalScroll = viewport.scrollWidth > viewport.clientWidth;\n\n setScrollbarVisible({\n vertical: hasVerticalScroll,\n horizontal: hasHorizontalScroll,\n });\n }, []);\n\n // Update thumb sizes and positions based on scroll state\n const updateThumbSizes = useCallback(() => {\n const viewport = viewportRef.current;\n const verticalThumb = verticalThumbRef.current;\n const horizontalThumb = horizontalThumbRef.current;\n\n if (!viewport) return;\n\n if (verticalThumb && scrollbarVisible.vertical) {\n // Calculate available height (subtract horizontal scrollbar thickness if present)\n const availableHeight = scrollbarVisible.horizontal \n ? viewport.clientHeight - scrollbarThickness \n : viewport.clientHeight;\n \n const scrollRatio = availableHeight / viewport.scrollHeight;\n const thumbHeight = Math.max(scrollRatio * 100, 10); // Minimum 10% height\n\n // Calculate scroll percentage (0 to 1)\n const maxScrollTop = viewport.scrollHeight - viewport.clientHeight;\n const scrollPercentage = maxScrollTop > 0 ? viewport.scrollTop / maxScrollTop : 0;\n\n // The thumb should move from 0% to (100% - thumbHeight%) of the available track\n const maxThumbPosition = 100 - thumbHeight;\n const thumbTop = scrollPercentage * maxThumbPosition;\n\n verticalThumb.style.height = `${thumbHeight}%`;\n verticalThumb.style.top = `${thumbTop}%`;\n verticalThumb.style.transform = 'none';\n }\n\n if (horizontalThumb && scrollbarVisible.horizontal) {\n // Calculate available width (subtract vertical scrollbar thickness if present)\n const availableWidth = scrollbarVisible.vertical \n ? viewport.clientWidth - scrollbarThickness \n : viewport.clientWidth;\n \n const scrollRatio = availableWidth / viewport.scrollWidth;\n const thumbWidth = Math.max(scrollRatio * 100, 10); // Minimum 10% width\n\n // Calculate scroll percentage (0 to 1)\n const maxScrollLeft = viewport.scrollWidth - viewport.clientWidth;\n const scrollPercentage = maxScrollLeft > 0 ? viewport.scrollLeft / maxScrollLeft : 0;\n\n // The thumb should move from 0% to (100% - thumbWidth%) of the available track\n const maxThumbPosition = 100 - thumbWidth;\n const thumbLeft = scrollPercentage * maxThumbPosition;\n\n horizontalThumb.style.width = `${thumbWidth}%`;\n horizontalThumb.style.left = `${thumbLeft}%`;\n horizontalThumb.style.transform = 'none';\n }\n }, [scrollbarVisible, scrollbarThickness]);\n\n // Handle scroll events\n const handleScroll = useCallback(() => {\n // Clear any existing timeouts\n if (scrollTimeout.current) {\n clearTimeout(scrollTimeout.current);\n }\n if (fadeTimeout.current) {\n clearTimeout(fadeTimeout.current);\n }\n\n setIsScrolling(true);\n setIsFadingOut(false);\n updateThumbSizes();\n\n // Start fade-out process after scroll stops\n scrollTimeout.current = setTimeout(() => {\n setIsFadingOut(true);\n \n // Remove scrollbars after fade animation completes\n fadeTimeout.current = setTimeout(() => {\n setIsScrolling(false);\n setIsFadingOut(false);\n }, 300); // 300ms for fade-out animation\n }, 1000); // 1s delay before fade starts\n }, [updateThumbSizes]);\n\n // Set up observers for content and size changes\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n checkOverflow();\n\n // Use ResizeObserver to watch for size changes\n const resizeObserver = new ResizeObserver(checkOverflow);\n resizeObserver.observe(viewport);\n\n // Also check on content changes\n const mutationObserver = new MutationObserver(checkOverflow);\n mutationObserver.observe(viewport, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [checkOverflow]);\n\n // Update thumb sizes when scrollbar visibility changes\n useEffect(() => {\n updateThumbSizes();\n }, [scrollbarVisible, updateThumbSizes]);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeout.current) {\n clearTimeout(scrollTimeout.current);\n }\n if (fadeTimeout.current) {\n clearTimeout(fadeTimeout.current);\n }\n };\n }, []);\n\n return {\n viewportRef,\n verticalThumbRef,\n horizontalThumbRef,\n isScrolling,\n isFadingOut,\n scrollbarVisible,\n handleScroll,\n };\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React from 'react';\nimport { useScrollArea } from './hooks';\n\nexport interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Custom CSS classes for the root container. Use this to set width/height */\n className?: string;\n /** Custom CSS classes for the scroll thumb */\n thumbClassName?: string;\n /** Custom CSS classes for the viewport (scrollable content area) */\n viewportClassName?: string;\n /** Custom CSS classes for the scrollbar track */\n scrollbarClassName?: string;\n /** Scrollbar thickness in pixels. Defaults to 10px */\n scrollbarThickness?: number;\n /** Children content to be scrolled */\n children: React.ReactNode;\n /** HTML id attribute */\n id?: string;\n /** Reference to the root element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A custom scrollable area component with styled scrollbars that appear on hover/scroll.\n * Provides cross-browser consistent scrolling experience with customizable appearance.\n * \n * @example\n * ```tsx\n * // Basic scroll area\n * <ScrollArea className=\"h-64 w-full border rounded\">\n * <div className=\"p-4 space-y-2\">\n * {Array.from({length: 50}).map((_, i) => (\n * <div key={i}>Item {i + 1}</div>\n * ))}\n * </div>\n * </ScrollArea>\n * \n * // Customized scrollbars\n * <ScrollArea \n * className=\"h-96 w-80\"\n * scrollbarThickness={12}\n * thumbClassName=\"bg-primary/60 hover:bg-primary/80\"\n * >\n * <LongContent />\n * </ScrollArea>\n * ```\n */\nexport function ScrollArea({\n className,\n thumbClassName,\n viewportClassName,\n scrollbarClassName,\n scrollbarThickness = 8,\n children,\n id,\n ref,\n ...props\n}: ScrollAreaProps) {\n const { viewportRef, verticalThumbRef, horizontalThumbRef, isScrolling, isFadingOut, scrollbarVisible, handleScroll } =\n useScrollArea(scrollbarThickness);\n\n const thumbsClassName = join(\n 'relative flex-1 rounded-full bg-slate-400/60 hover:bg-slate-400/80 active:bg-slate-400',\n thumbClassName\n );\n\n return (\n <div ref={ref} id={id} className={join('relative overflow-hidden', className)} data-scroll-area-root='' {...props}>\n <div\n ref={viewportRef}\n className={join(\n 'h-full w-full overflow-auto rounded-[inherit] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden',\n viewportClassName\n )}\n onScroll={handleScroll}\n data-scroll-area-viewport=''\n >\n {children}\n </div>\n\n {/* Vertical Scrollbar */}\n {scrollbarVisible.vertical && (isScrolling || isFadingOut) && (\n <div\n className={join(\n 'touch-none select-none transition-all duration-300',\n 'p-[1px]',\n 'absolute right-0 top-0',\n isFadingOut ? 'opacity-0' : 'opacity-100',\n scrollbarClassName\n )}\n data-scroll-area-scrollbar='vertical'\n data-state={isScrolling ? 'visible' : 'hidden'}\n style={{ \n width: `${scrollbarThickness}px`,\n height: scrollbarVisible.horizontal \n ? `calc(100% - ${scrollbarThickness}px)` \n : '100%'\n }}\n >\n <div\n ref={verticalThumbRef}\n className={join('absolute rounded-full', thumbsClassName)}\n data-scroll-area-thumb=''\n style={{ height: '20%', top: '0%', width: '100%' }}\n />\n </div>\n )}\n\n {/* Horizontal Scrollbar */}\n {scrollbarVisible.horizontal && (isScrolling || isFadingOut) && (\n <div\n className={join(\n 'touch-none select-none transition-all duration-300',\n 'p-[1px]',\n 'absolute bottom-0 left-0',\n isFadingOut ? 'opacity-0' : 'opacity-100',\n scrollbarClassName\n )}\n data-scroll-area-scrollbar='horizontal'\n data-state={isScrolling ? 'visible' : 'hidden'}\n style={{ \n height: `${scrollbarThickness}px`,\n width: scrollbarVisible.vertical \n ? `calc(100% - ${scrollbarThickness}px)` \n : '100%'\n }}\n >\n <div\n ref={horizontalThumbRef}\n className={join('absolute rounded-full', thumbsClassName)}\n data-scroll-area-thumb=''\n style={{ width: '20%', left: '0%', height: '100%' }}\n />\n </div>\n )}\n\n {/* Corner */}\n {scrollbarVisible.vertical && scrollbarVisible.horizontal && (\n <div \n className={join('bg-transparent', 'absolute bottom-0 right-0')} \n data-scroll-area-corner=''\n style={{ \n height: `${scrollbarThickness}px`, \n width: `${scrollbarThickness}px` \n }}\n />\n )}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, useMemo, useCallback, useId } from 'react';\nimport { useSelectDropdown, useSelectKeyboardNavigation, useSelectHighlight, SelectOption } from './hooks';\nimport { sizeVariants, SelectSize } from './variants';\nimport { join } from '../../utils';\nimport { Check, ChevronDown, X } from '../../symbols';\nimport { ScrollArea } from '../scroll-area';\n\nexport type { SelectOption };\n\nexport interface SelectProps {\n /** Array of option objects. SelectOption: { text: string, value: string, disabled?: boolean, description?: string } */\n options: SelectOption[];\n /** The current value of the select (controlled). */\n value?: string;\n /** Placeholder text to show when no option is selected. */\n placeholder?: string;\n /** Whether the select is searchable (combobox mode). */\n searchable?: boolean;\n /** Whether the entire select is disabled. */\n disabled?: boolean;\n /** Whether to show a clear button to reset selection. */\n clearable?: boolean;\n /** The size variant of the select. */\n size?: SelectSize;\n /** Additional CSS classes to apply to the select container. */\n className?: string;\n /** Additional CSS classes to apply to the trigger button. */\n triggerClassName?: string;\n /** Additional CSS classes to apply to the dropdown menu. */\n dropdownClassName?: string;\n /** The HTML id attribute for the select. */\n id?: string;\n /** Reference to the select container element. */\n ref?: React.Ref<HTMLDivElement>;\n /** Callback fired when the selection changes. */\n onChange?: (value: string) => void;\n /** Callback fired when search input changes (searchable mode). */\n onSearch?: (searchTerm: string) => void;\n /** Placeholder text for the search input (searchable mode). */\n searchPlaceholder?: string;\n}\n\n/**\n * A feature-rich select component with search, keyboard navigation, and accessibility.\n * Supports both simple selection and searchable combobox functionality.\n * \n * @example\n * ```tsx\n * // Basic select\n * const options = [\n * { text: 'Apple', value: 'apple' },\n * { text: 'Banana', value: 'banana' },\n * { text: 'Orange', value: 'orange' }\n * ];\n * \n * <Select\n * options={options}\n * value={selectedFruit}\n * onChange={setSelectedFruit}\n * placeholder=\"Choose a fruit\"\n * />\n * \n * // Searchable select with descriptions\n * <Select\n * options={[\n * { text: 'React', value: 'react', description: 'A library for building UIs' },\n * { text: 'Vue', value: 'vue', description: 'The progressive framework' }\n * ]}\n * searchable\n * clearable\n * placeholder=\"Select framework...\"\n * searchPlaceholder=\"Search frameworks...\"\n * onChange={setFramework}\n * />\n * ```\n */\nexport function Select({\n options,\n value,\n placeholder = 'Select an option...',\n searchable = false,\n disabled = false,\n clearable = false,\n size = 'md',\n className,\n triggerClassName,\n dropdownClassName,\n id,\n ref,\n onChange,\n onSearch,\n searchPlaceholder = 'Search options...',\n}: SelectProps) {\n const generatedId = useId();\n const activeId = id ?? generatedId;\n const listboxId = `${activeId}-listbox`;\n\n const getOptionId = (index: number) => `${listboxId}-option-${index}`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionsContainerRef = useRef<HTMLDivElement>(null);\n\n const { show, shouldRender } = useSelectDropdown(isOpen);\n\n // Filter options based on search term\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchTerm) return options;\n return options.filter(\n (option) =>\n option.text.toLowerCase().includes(searchTerm.toLowerCase()) ||\n option.description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchable, searchTerm]);\n\n const selectedOption = useMemo(() => options.find((option) => option.value === value), [options, value]);\n\n // Use the highlight hook\n const { highlightedIndex, setHighlightedIndex } = useSelectHighlight({\n isOpen,\n filteredOptions,\n selectedOption,\n shouldRender,\n optionsContainerRef,\n });\n\n const activeDescendantId = highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined;\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isOpen && shouldRender && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable, shouldRender]);\n\n const keyboardOnSelect = useCallback(\n (option: SelectOption) => {\n if (!option.disabled) {\n onChange?.(option.value);\n setIsOpen(false);\n setSearchTerm('');\n triggerRef.current?.focus();\n }\n },\n [onChange]\n );\n\n const { handleKeyDown } = useSelectKeyboardNavigation({\n isOpen,\n setIsOpen,\n filteredOptions,\n highlightedIndex,\n setHighlightedIndex,\n onSelect: keyboardOnSelect,\n triggerRef,\n });\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n !triggerRef.current?.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm('');\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n if (!isOpen) {\n setSearchTerm('');\n setHighlightedIndex(-1);\n }\n }\n };\n\n const handleOptionClick = (option: SelectOption) => {\n if (!option.disabled) {\n onChange?.(option.value);\n setIsOpen(false);\n setSearchTerm('');\n }\n };\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value;\n setSearchTerm(term);\n onSearch?.(term);\n setHighlightedIndex(-1);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.('');\n };\n\n return (\n <div\n className={join('relative', className)}\n id={id}\n ref={ref}\n data-select='true'\n data-value={value}\n data-searchable={searchable}\n data-disabled={disabled}\n data-clearable={clearable}\n >\n {/* Trigger Button */}\n <div className='relative'>\n <button\n ref={triggerRef}\n type='button'\n className={join(\n 'flex items-center justify-between w-full text-left bg-inherit border border-border rounded-md transition-colors',\n 'hover:border-primary focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary',\n disabled && 'opacity-50 cursor-not-allowed hover:border-border',\n isOpen && 'border-primary ring-1 ring-primary',\n sizeVariants[size].trigger,\n triggerClassName\n )}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-disabled={disabled}\n aria-haspopup='listbox'\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={isOpen && !searchable ? activeDescendantId : undefined}\n aria-label={selectedOption ? selectedOption.text : placeholder}\n data-select-trigger='true'\n >\n <span className={join('block truncate', !selectedOption && 'opacity-70')}>\n {selectedOption ? selectedOption.text : placeholder}\n </span>\n <div className='flex items-center ml-2'>\n <ChevronDown size={16} className={join('transition-transform duration-200', isOpen && 'rotate-180')} />\n </div>\n </button>\n {clearable && selectedOption && (\n <button\n type='button'\n onClick={handleClear}\n className='absolute right-8 top-1/2 -translate-y-1/2 p-0.5 rounded hover:bg-accent/20 transition-colors group z-10'\n aria-label='Clear selection'\n data-select-clear='true'\n >\n <X size={14} className='opacity-70 group-hover:opacity-100 transition-opacity' />\n </button>\n )}\n </div>\n\n {/* Dropdown */}\n {shouldRender && (\n <div\n ref={dropdownRef}\n className={join(\n 'absolute z-50 w-full mt-1 bg-popover text-popover-foreground border border-border rounded-md shadow-lg transition-all duration-150',\n show ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2',\n dropdownClassName\n )}\n id={listboxId}\n role='listbox'\n data-select-content='true'\n >\n {/* Search Input */}\n {searchable && (\n <div className='border-b border-border'>\n <input\n ref={searchInputRef}\n type='text'\n value={searchTerm}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n placeholder={searchPlaceholder}\n className='w-full px-2 py-2 text-inherit focus:outline-none'\n aria-autocomplete='list'\n aria-controls={listboxId}\n aria-activedescendant={activeDescendantId}\n data-select-search='true'\n />\n </div>\n )}\n\n {/* Options */}\n <ScrollArea ref={optionsContainerRef} viewportClassName='max-h-60'>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={option.value}\n id={getOptionId(index)}\n className={join(\n 'flex items-center cursor-pointer transition-colors',\n 'hover:bg-accent/10 focus:bg-accent/10',\n sizeVariants[size].options,\n option.disabled && 'opacity-50 cursor-not-allowed',\n index === highlightedIndex && 'bg-accent/20',\n value === option.value && 'bg-accent/30'\n )}\n onClick={() => handleOptionClick(option)}\n role='option'\n aria-selected={value === option.value}\n aria-disabled={option.disabled}\n data-select-option='true'\n data-value={option.value}\n data-highlighted={index === highlightedIndex}\n data-option-index={index}\n >\n <div className='flex-1 min-w-0'>\n <div className='font-medium'>{option.text}</div>\n {option.description && <div className='text-xs opacity-70 mt-0.5'>{option.description}</div>}\n </div>\n {value === option.value && <Check size={16} className='ml-2 text-primary flex-shrink-0' />}\n </div>\n ))\n ) : (\n <div className='px-3 py-2 text-sm opacity-70 text-center'>\n {searchable && searchTerm ? 'No results found' : 'No options available'}\n </div>\n )}\n </ScrollArea>\n </div>\n )}\n </div>\n );\n}\n","import { join } from '../../utils';\n\nexport type RadioInputProps = {\n itemId: string;\n checked: boolean;\n onChange: () => void;\n name: string;\n disabled?: boolean;\n className?: string;\n};\n\n// Custom RadioInput Component\nexport function RadioInput({ itemId, checked, onChange, name, disabled = false, className = '' }: RadioInputProps) {\n const baseClasses = 'relative inline-flex items-center justify-center rounded-full';\n\n const handleClick = () => {\n if (disabled) return;\n onChange();\n };\n\n const radioClasses = join(\n baseClasses,\n !checked && 'hover:border-current/60',\n !disabled && 'border-current cursor-pointer',\n disabled && 'border-muted/60 cursor-not-allowed',\n className\n );\n return (\n <div\n id={itemId}\n role='radio'\n tabIndex={-1} // necessary so that the radio button can be focused as div is not a focusable element\n aria-checked={checked}\n aria-disabled={disabled}\n aria-description={`Radio button for ${name}`}\n aria-labelledby={`${itemId}-label`}\n onClick={handleClick}\n className={radioClasses}\n style={{\n width: '1em',\n height: '1em',\n padding: '0.1em',\n borderWidth: '0.06em',\n }}\n >\n {checked && (\n <div\n className={join(`size-full aspect-square rounded-full`, disabled && 'bg-muted/60', !disabled && 'bg-current')}\n />\n )}\n </div>\n );\n}\n","import { useId } from 'react';\nimport { join } from '../../utils';\nimport { RadioInput } from './RadioInput';\n\nexport interface RadioGroupItemProps {\n /** The value associated with this radio item. */\n value: string;\n /** The content to display for this radio item. */\n children: React.ReactNode;\n /** Additional CSS classes to apply to this radio item. */\n className?: string;\n /** Whether this radio item is currently selected. */\n isSelected?: boolean;\n /** Callback fired when this radio item is selected. */\n onChange?: (value: string) => void;\n /** Whether this radio item is disabled. */\n disabled?: boolean;\n /** The name attribute for the radio input group. */\n name?: string;\n /** Whether to hide the native radio input element. */\n hideInput?: boolean;\n /** Optional description text for this radio item. */\n description?: string;\n}\n\nexport function RadioGroupItem({\n value,\n children,\n className = '',\n isSelected = false,\n onChange,\n disabled = false,\n hideInput = false,\n description,\n name,\n}: RadioGroupItemProps) {\n const id = useId();\n const itemId = `radio-${id}-${value}`;\n\n const handleChange = () => {\n if (!disabled) {\n onChange?.(value);\n }\n };\n\n return (\n <div\n title={description}\n className={join(\n 'relative flex items-center',\n className,\n // Uses text color for borders\n hideInput &&\n `p-2 border-2 focus-within:border-dashed focus-within:${\n disabled ? 'border-current/50' : 'border-current/80'\n }`,\n hideInput && !isSelected && `border-transparent ${disabled ? '' : 'not-focus-within:hover:border-border/60'}`,\n hideInput && isSelected && 'border-border',\n disabled && 'opacity-60 cursor-not-allowed'\n )}\n style={{\n gap: '0.5em',\n }}\n >\n {!hideInput && (\n <RadioInput\n itemId={itemId}\n name={name || ''}\n checked={isSelected}\n onChange={handleChange}\n disabled={disabled}\n className={join(hideInput && '')}\n />\n )}\n <div\n id={hideInput ? itemId : undefined}\n tabIndex={hideInput ? -1 : undefined}\n role={hideInput ? 'radio' : undefined}\n onClick={hideInput ? handleChange : undefined}\n aria-checked={!hideInput ? undefined : isSelected ? 'true' : 'false'}\n aria-disabled={hideInput ? disabled : undefined}\n aria-description={!hideInput ? undefined : description || `Radio button for ${name}`}\n aria-labelledby={hideInput ? `${itemId}-label` : undefined}\n className={join(hideInput && 'size-full', typeof children === 'object' && 'grow focus:outline-none')}\n >\n <label\n id={`${itemId}-label`}\n onClick={hideInput ? undefined : handleChange}\n className={join(disabled && 'cursor-not-allowed', !disabled && 'cursor-pointer')}\n >\n {children}\n </label>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useRadioFocus(id: string, selectedOptionIndex: number) {\n // Manage state locally to avoid race conditions, which can result in\n // the an option failing to be selected or incorrectly selected\n const [focusedIndex, setFocusedIndex] = useState<number>(selectedOptionIndex);\n const [clickedIndex, setClickedIndex] = useState<number>(-1);\n // Prevent onClicks from triggering focus events and automatically selecting the first option\n const [isMouseDown, setIsMouseDown] = useState<boolean>(false);\n\n const handleClicked = useCallback((options: HTMLElement[], index: number) => {\n const target = options[index] as HTMLElement;\n\n // Check if the target element is disabled\n const isDisabled = target.hasAttribute('disabled') || target.getAttribute('aria-disabled') === 'true';\n if (isDisabled) return;\n\n // Update the selected index\n options[index]?.click();\n setClickedIndex(index);\n }, []);\n\n const setInitialFocus = useCallback(\n (e: Event, options: HTMLElement[]) => {\n e.preventDefault();\n if (isMouseDown) return;\n if (!options.length) return;\n\n const indexToFocus = selectedOptionIndex !== -1 ? selectedOptionIndex : 0;\n options[indexToFocus]?.focus();\n setFocusedIndex(indexToFocus);\n\n // Only update the selected index if one is already set\n if (selectedOptionIndex !== -1) {\n handleClicked(options, indexToFocus);\n }\n },\n [selectedOptionIndex, isMouseDown, handleClicked]\n );\n\n /* Focus preceding element when Shift + Tab is pressed */\n const handleFocusPreceding = useCallback(\n (e: KeyboardEvent) => {\n // If the Shift key is not pressed while tab is entered, do nothing\n if (!e.shiftKey) {\n return;\n }\n\n e.preventDefault();\n const focusableElements = Array.from(\n document.querySelectorAll<HTMLElement>(\n 'a, button, input, textarea, select, details, [tabindex]:not([tabindex=\"-1\"])'\n )\n ).filter((el) => !el.hasAttribute('disabled') && el.tabIndex >= 0);\n const currentIndex = focusableElements.findIndex((el) => el.id === id);\n const previousIndex = currentIndex > 0 ? currentIndex - 1 : focusableElements.length - 1;\n focusableElements[previousIndex]?.focus();\n },\n [id]\n );\n\n const handleKeyboardNavigation = useCallback(\n (e: KeyboardEvent, options: HTMLElement[]) => {\n if (!options.length) return;\n\n // Ensure we only toggle options part of radio group\n const target = e.target as HTMLElement;\n const isGroupOption = options.some((option) => option.id === target.id);\n if (!isGroupOption) return;\n\n const currentIndex = focusedIndex !== -1 ? focusedIndex : 0;\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n e.preventDefault();\n newIndex = (currentIndex + 1) % options.length;\n break;\n\n // Select the option when the space key is pressed\n case ' ':\n e.preventDefault();\n handleClicked(options, currentIndex);\n return;\n\n case 'Tab':\n handleFocusPreceding(e);\n return;\n\n default:\n return;\n }\n\n options[newIndex]?.focus();\n setFocusedIndex(newIndex);\n // Only update the selected index if one is already set\n if (clickedIndex !== -1) {\n handleClicked(options, newIndex);\n }\n },\n [focusedIndex, clickedIndex, handleFocusPreceding, handleClicked]\n );\n\n const getRadioOptions = useCallback((): HTMLElement[] => {\n const radioGroup = document.querySelector(`[id=\"${id}\"][role=\"radiogroup\"]`);\n if (!radioGroup) return [];\n\n return Array.from(radioGroup.querySelectorAll('[role=\"radio\"]'));\n }, [id]);\n\n useEffect(() => {\n const radioGroup = document.querySelector(`[id=\"${id}\"][role=\"radiogroup\"]`);\n if (!radioGroup) return;\n\n const options = getRadioOptions();\n const handleFocus = (e: Event) => setInitialFocus(e, options);\n const handleKeyDown = (e: KeyboardEvent) => handleKeyboardNavigation(e, options);\n const handleMouseDown = () => setIsMouseDown(true);\n const handleMouseUp = () => setIsMouseDown(false);\n\n document.addEventListener('keydown', handleKeyDown);\n radioGroup.addEventListener('focus', handleFocus);\n radioGroup.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('mouseup', handleMouseUp); // place on document since mouseup event can occur outside of radio group\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n radioGroup.removeEventListener('focus', handleFocus);\n radioGroup.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [id, getRadioOptions, setInitialFocus, handleKeyboardNavigation]);\n}\n","import React, { useId, useMemo } from 'react';\nimport { join } from '../../utils';\nimport { RadioGroupItem, RadioGroupItemProps } from './RadioGroupItem';\nimport { useRadioFocus } from './hooks';\n\nexport type RadioOption = { label: string; value: string; disabled?: boolean; description?: string };\n\nexport type RadioGroupProps = {\n /** Array of option objects or strings. RadioOption: { label: string, value: string, disabled?: boolean, description?: string } */\n options?: (string | RadioOption)[];\n /** The current selected value (controlled). */\n value: string | undefined;\n /** Callback fired when the selected value changes. */\n onChange: (value: string) => void;\n /** The id for the radio group element. */\n id?: string;\n /** RadioGroupItem components when using the component approach. */\n children?: React.ReactElement<RadioGroupItemProps>[] | React.ReactElement<RadioGroupItemProps>;\n /** Additional CSS classes to apply to the radio group. */\n className?: string;\n /** Additional CSS classes to apply to each radio item. */\n childrenClassName?: string;\n /** Whether to hide the native radio input elements. */\n hideInputs?: boolean;\n};\n\n/**\n * A radio button group component for selecting one option from multiple choices.\n * Supports both array-based options and RadioGroupItem child components.\n * \n * @example\n * ```tsx\n * // Using options array\n * <RadioGroup\n * options={[\n * { label: 'Small', value: 's', description: 'Perfect for personal use' },\n * { label: 'Medium', value: 'm' },\n * { label: 'Large', value: 'l', disabled: true }\n * ]}\n * value={selectedSize}\n * onChange={setSelectedSize}\n * />\n * \n * // Using child components\n * <RadioGroup value={color} onChange={setColor}>\n * <RadioGroupItem value=\"red\">Red</RadioGroupItem>\n * <RadioGroupItem value=\"blue\">Blue</RadioGroupItem>\n * <RadioGroupItem value=\"green\">Green</RadioGroupItem>\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup({\n options = [],\n value,\n onChange,\n id,\n children,\n className = '',\n childrenClassName = '',\n hideInputs = false,\n}: RadioGroupProps) {\n const groupId = useId();\n const groupName = id || `radio-group-${groupId}`;\n useRadioFocus(\n groupName,\n options.findIndex((option) => option === value)\n );\n\n // Check for duplicates if string options are provided\n const processedOptions = useMemo(() => {\n return options.reduce<RadioOption[]>((acc, option) => {\n if (typeof option === 'string') {\n // Check if we already have this string option\n if (!acc.some((item) => item.value === option)) {\n acc.push({ label: option, value: option });\n }\n } else {\n acc.push(option);\n }\n return acc;\n }, []);\n }, [options]);\n\n return (\n <div id={groupName} role='radiogroup' tabIndex={0} className={join(className, 'focus:outline-none')}>\n {/* Render from options prop */}\n {processedOptions.length > 0 &&\n processedOptions.map((option, index) => (\n <RadioGroupItem\n key={`${option.value}-${index}`}\n value={option.value}\n isSelected={value === option.value}\n onChange={onChange}\n name={groupName}\n disabled={option.disabled}\n description={option.description}\n hideInput={hideInputs}\n className={childrenClassName}\n >\n {option.label}\n </RadioGroupItem>\n ))}\n\n {/* Render RadioGroupItem components */}\n {processedOptions.length === 0 &&\n children &&\n React.Children.map(children, (child) => {\n // TypeScript enforces that child is a RadioGroupItem\n if (React.isValidElement(child) && child.type === RadioGroupItem) {\n return (\n <RadioGroupItem\n {...child.props}\n className={join(childrenClassName, child.props.className)}\n hideInput={child.props.hideInput || hideInputs}\n isSelected={value === child.props.value}\n onChange={onChange}\n name={groupName}\n >\n {child.props.children}\n </RadioGroupItem>\n );\n }\n return null;\n })}\n </div>\n );\n}\n","import React, { cloneElement, isValidElement, useCallback, useState } from 'react';\nimport { useFormValidation } from './hooks';\nimport {\n\tFormCheckboxField,\n\tFormData,\n\tFormField,\n\tFormProps,\n\tFormInputField,\n\tFormRadioField,\n\tFormSelectField,\n\tFormTextareaField,\n} from './types';\nimport { formDefaults, formVariants, FormVariants } from './variants';\nimport { join } from '../../utils';\nimport { Label } from '../label';\nimport { Input } from '../input';\nimport { Textarea } from '../textarea';\nimport { Select } from '../select';\nimport { Checkbox } from '../checkbox';\nimport { RadioGroup } from '../radiogroup';\n\nexport interface FormComponentProps<T extends FormData = FormData> extends FormProps<T>, Partial<FormVariants> {}\n\n/**\n * A comprehensive form component with built-in validation, responsive layouts,\n * and support for various field types (input, textarea, select, checkbox, radio).\n * \n * @example\n * ```tsx\n * // Define form fields - should be stable (memoized or declared outside component)\n * const userForm = [\n * { __type: 'input', name: 'name', label: 'Full Name', required: true },\n * { __type: 'input', name: 'email', type: 'email', label: 'Email', required: true },\n * { __type: 'textarea', name: 'bio', label: 'Bio', rows: 4 },\n * { __type: 'checkbox', name: 'subscribe', text: 'Subscribe to newsletter' }\n * ];\n * \n * // Usage\n * <Form\n * form={userForm}\n * columns={2}\n * onSubmit={(data) => saveUser(data)}\n * submitButton={<Button type=\"submit\">Save User</Button>}\n * />\n * ```\n */\nexport function Form<T extends FormData = FormData>({\n\tform,\n\tinitialData = {} as T,\n\tonDataChange,\n\tonSubmit,\n\tsubmitButton,\n\tcolumns = formDefaults.columns,\n\tresponsive = formDefaults.responsive,\n\tspacing = formDefaults.spacing,\n\tclassName,\n\tid,\n\tref,\n}: FormComponentProps<T>) {\n\tconst [data, setData] = useState<T>(initialData);\n\tconst { errors, validateForm, validateSingleField, isFormValid } = useFormValidation(form, data);\n\n\tconst updateData = useCallback(\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t(fieldName: string, value: any) => {\n\t\t\tconst newData = { ...data, [fieldName]: value } as T;\n\t\t\tsetData(newData);\n\t\t\tonDataChange?.(newData);\n\n\t\t\t// Validate field on change\n\t\t\tvalidateSingleField(fieldName, value);\n\t\t},\n\t\t[data, onDataChange, validateSingleField]\n\t);\n\n\tconst handleSubmit = useCallback(\n\t\t(e: React.FormEvent) => {\n\t\t\te.preventDefault();\n\t\t\tif (validateForm(data) && onSubmit) {\n\t\t\t\tonSubmit(data);\n\t\t\t}\n\t\t},\n\t\t[data, validateForm, onSubmit]\n\t);\n\n\tconst getFieldStylesAndClasses = (field: FormField) => {\n\t\tconst classes = [];\n\t\tconst styles: React.CSSProperties = {};\n\n\t\t// Column span\n\t\tif (field.colSpan && columns! > 1) {\n\t\t\tclasses.push(formVariants.colSpan[field.colSpan]);\n\t\t}\n\n\t\treturn {\n\t\t\tclassName: join(classes.join(' '), field.className),\n\t\t\tstyle: styles,\n\t\t};\n\t};\n\n\tconst renderField = (field: FormField) => {\n\t\tconst fieldValue = data[field.name];\n\t\tconst fieldError = errors[field.name];\n\t\tconst fieldId = id ? `${id}-${field.name}` : field.name;\n\t\tconst { className: fieldClasses, style: fieldStyles } = getFieldStylesAndClasses(field);\n\n\t\tconst renderFieldContent = () => {\n\t\t\tswitch (field.__type) {\n\t\t\t\tcase 'input': {\n\t\t\t\t\tconst inputField = field as FormInputField;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\ttype={inputField.type || 'text'}\n\t\t\t\t\t\t\t\tplaceholder={inputField.placeholder}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(e) => updateData(field.name, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tvariant={inputField.variant}\n\t\t\t\t\t\t\t\trounded={inputField.rounded}\n\t\t\t\t\t\t\t\terrorMessage={fieldError}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'textarea': {\n\t\t\t\t\tconst textareaField = field as FormTextareaField;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tplaceholder={textareaField.placeholder}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(e) => updateData(field.name, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tvariant={textareaField.variant}\n\t\t\t\t\t\t\t\trounded={textareaField.rounded}\n\t\t\t\t\t\t\t\trows={textareaField.rows}\n\t\t\t\t\t\t\t\tautoExpand={textareaField.autoExpand}\n\t\t\t\t\t\t\t\tcharacterLimit={textareaField.characterLimit}\n\t\t\t\t\t\t\t\terrorMessage={fieldError}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'select': {\n\t\t\t\t\tconst selectField = field as FormSelectField;\n\t\t\t\t\t// Convert options to match Select component expected format\n\t\t\t\t\tconst selectOptions = selectField.options.map((opt) => ({\n\t\t\t\t\t\ttext: opt.label,\n\t\t\t\t\t\tvalue: opt.value,\n\t\t\t\t\t\tdisabled: opt.disabled,\n\t\t\t\t\t}));\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\toptions={selectOptions}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(value) => updateData(field.name, value)}\n\t\t\t\t\t\t\t\tplaceholder={selectField.placeholder}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tsearchable={selectField.searchable}\n\t\t\t\t\t\t\t\tclearable={selectField.clearable}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'checkbox': {\n\t\t\t\t\tconst checkboxField = field as FormCheckboxField;\n\t\t\t\t\tconst checkboxSize = 16;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className='space-x-2'>\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tchecked={fieldValue || false}\n\t\t\t\t\t\t\t\tonCheckedChange={(checked) => updateData(field.name, checked)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t\tsize={checkboxSize}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className='inline-block' style={{ maxWidth: `calc(100% - ${checkboxSize + 10}px)` }}>\n\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t{/* 8px for spacing, 2px for buffer */}\n\t\t\t\t\t\t\t\t{/* 8px for spacing, 2px for buffer */}\n\t\t\t\t\t\t\t\t<Label htmlFor={fieldId} className='cursor-pointer'>\n\t\t\t\t\t\t\t\t\t{checkboxField.text || field.label}\n\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t{field.description && <p className='text-sm opacity-80 mt-1'>{field.description}</p>}\n\t\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'radio': {\n\t\t\t\t\tconst radioField = field as FormRadioField;\n\t\t\t\t\t// Convert options to match RadioGroup expected format\n\t\t\t\t\tconst radioOptions = radioField.options.map((opt) => ({\n\t\t\t\t\t\tlabel: opt.label,\n\t\t\t\t\t\tvalue: opt.value,\n\t\t\t\t\t\tdisabled: opt.disabled,\n\t\t\t\t\t}));\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label required={field.required}>{field.label}</Label>\n\t\t\t\t\t\t\t{field.description && <p className='text-sm opacity-80 mb-2'>{field.description}</p>}\n\t\t\t\t\t\t\t<RadioGroup\n\t\t\t\t\t\t\t\toptions={radioOptions}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(value) => updateData(field.name, value)}\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div key={field.name} className={fieldClasses} style={fieldStyles}>\n\t\t\t\t{renderFieldContent()}\n\t\t\t</div>\n\t\t);\n\t};\n\n\t// Determine form grid classes\n\tconst formClasses = join(\n\t\t'grid',\n\t\tcolumns && columns > 1 ? formVariants.columns[columns] : 'grid-cols-1',\n\t\tformVariants.spacing[spacing],\n\t\tclassName\n\t);\n\n\t// Render submit button if provided\n\tconst renderSubmitButton = () => {\n\t\tif (!submitButton) return null;\n\n\t\tif (isValidElement(submitButton)) {\n\t\t\t// Clone the button and add disabled state based on form validity\n\t\t\treturn cloneElement(submitButton, {\n\t\t\t\tdisabled: !isFormValid,\n\t\t\t\t'aria-disabled': !isFormValid,\n\t\t\t\t...(submitButton.props ?? {}),\n\t\t\t} as Record<string, unknown>);\n\t\t}\n\n\t\treturn <div className='col-span-full'>{submitButton}</div>;\n\t};\n\n\treturn (\n\t\t<form\n\t\t\tref={ref}\n\t\t\tid={id}\n\t\t\tonSubmit={handleSubmit}\n\t\t\tclassName={formClasses}\n\t\t\tdata-form-fields={form.length}\n\t\t\tdata-form-columns={columns}\n\t\t\tdata-form-responsive={responsive}\n\t\t\tdata-form-valid={isFormValid}\n\t\t>\n\t\t\t{form.map(renderField)}\n\t\t\t{renderSubmitButton()}\n\t\t</form>\n\t);\n}\n","import React, { useId, useState, useRef, useCallback, useEffect } from 'react';\nimport { join } from '../../utils';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n\t/** The HTML id attribute for the tooltip. */\n\tid?: string;\n\t/** The element that triggers the tooltip on hover. */\n\tchildren: React.ReactElement;\n\t/** The content to display in the tooltip. */\n\tmessage: React.ReactNode;\n\t/** The preferred side of the trigger to render the tooltip. */\n\tplacement?: TooltipPlacement;\n\t/** Whether the tooltip is disabled and should not appear. */\n\tdisabled?: boolean;\n\t/** The delay in milliseconds before the tooltip appears. */\n\tdelay?: number;\n\t/** Whether to show the arrow pointing to the trigger element. */\n\tshowArrow?: boolean;\n\t/** Additional CSS classes to apply to the tooltip. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to the tooltip arrow. */\n\tarrowClassName?: string;\n}\n\nexport interface TooltipPosition {\n\tx: number;\n\ty: number;\n\tplacement: TooltipPlacement;\n\tarrow: {\n\t\tx: number;\n\t\ty: number;\n\t};\n}\n\n/**\n * A tooltip component that displays contextual information on hover or focus.\n * Automatically positions itself to stay within viewport bounds.\n *\n * @example\n * ```tsx\n * // Basic tooltip\n * <Tooltip message=\"This is helpful information\">\n * <Button>Hover me</Button>\n * </Tooltip>\n *\n * // Custom placement and delay\n * <Tooltip\n * message=\"Tooltip on the right side\"\n * placement=\"right\"\n * delay={500}\n * >\n * <span>Hover for delayed tooltip</span>\n * </Tooltip>\n *\n * // Tooltip without arrow\n * <Tooltip message=\"No arrow tooltip\" showArrow={false}>\n * <Button>No arrow</Button>\n * </Tooltip>\n *\n * // Rich content tooltip\n * <Tooltip message={<div>Complex <strong>HTML</strong> content</div>}>\n * <Icon name=\"info\" />\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n\tid,\n\tchildren,\n\tmessage,\n\tplacement = 'top',\n\tdisabled = false,\n\tdelay = 100,\n\tshowArrow = true,\n\tclassName,\n}: TooltipProps) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [isHoveringTrigger, setIsHoveringTrigger] = useState(false);\n\tconst [isHoveringTooltip, setIsHoveringTooltip] = useState(false);\n\tconst [isFocused, setIsFocused] = useState(false);\n\n\tconst timeoutRef = useRef<number | null>(null);\n\tconst reactId = useId();\n\tconst tooltipId = id ?? reactId;\n\n\tconst showTooltip = useCallback(() => {\n\t\tif (disabled) return;\n\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t}\n\n\t\ttimeoutRef.current = window.setTimeout(() => {\n\t\t\tsetIsVisible(true);\n\t\t}, delay);\n\t}, [disabled, delay]);\n\n\tconst hideTooltip = useCallback((forceHide = false) => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t}\n\n\t\tif (forceHide) {\n\t\t\tsetIsVisible(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Small delay to allow moving from trigger to tooltip\n\t\ttimeoutRef.current = window.setTimeout(() => {\n\t\t\tsetIsVisible(false);\n\t\t}, 100);\n\t}, []);\n\n\t// Handle hover state changes\n\tuseEffect(() => {\n\t\tif (!isHoveringTrigger && !isHoveringTooltip && !isFocused && isVisible) {\n\t\t\thideTooltip();\n\t\t}\n\t}, [isHoveringTrigger, isHoveringTooltip, isFocused, isVisible, hideTooltip]);\n\n\t// Hide tooltip on scroll\n\tuseEffect(() => {\n\t\tif (!isVisible) return;\n\n\t\tconst handleScroll = () => {\n\t\t\thideTooltip(true);\n\t\t};\n\n\t\twindow.addEventListener('scroll', handleScroll, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('scroll', handleScroll, true);\n\t\t};\n\t}, [isVisible, hideTooltip]);\n\n\t// Cleanup timeout on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst getTooltipClasses = () => {\n\t\tconst baseClasses =\n\t\t\t'absolute z-50 px-2 py-1 text-sm rounded shadow-lg bg-tooltip text-tooltip-foreground pointer-events-auto transition-all duration-150 ease-out w-max max-w-xs';\n\t\tconst visibilityClasses = isVisible ? 'opacity-100 scale-100' : 'opacity-0 scale-95 pointer-events-none';\n\n\t\tconst placementClasses = {\n\t\t\ttop: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n\t\t\tbottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n\t\t\tleft: 'right-full top-1/2 -translate-y-1/2 mr-2',\n\t\t\tright: 'left-full top-1/2 -translate-y-1/2 ml-2',\n\t\t};\n\n\t\tconst transformOrigins = {\n\t\t\ttop: 'origin-bottom',\n\t\t\tbottom: 'origin-top',\n\t\t\tleft: 'origin-right',\n\t\t\tright: 'origin-left',\n\t\t};\n\n\t\treturn join(baseClasses, placementClasses[placement], transformOrigins[placement], visibilityClasses, className);\n\t};\n\n\tconst getArrowClasses = () => {\n\t\tif (!showArrow) return '';\n\n\t\tconst baseArrow = 'absolute w-0 h-0 pointer-events-none';\n\t\tconst arrowClasses = {\n\t\t\ttop: 'top-full left-1/2 -translate-x-1/2 border-l-[6px] border-r-[6px] border-t-[6px] border-l-transparent border-r-transparent border-t-tooltip',\n\t\t\tbottom:\n\t\t\t\t'bottom-full left-1/2 -translate-x-1/2 border-l-[6px] border-r-[6px] border-b-[6px] border-l-transparent border-r-transparent border-b-tooltip',\n\t\t\tleft: 'left-full top-1/2 -translate-y-1/2 border-t-[6px] border-b-[6px] border-l-[6px] border-t-transparent border-b-transparent border-l-tooltip',\n\t\t\tright:\n\t\t\t\t'right-full top-1/2 -translate-y-1/2 border-t-[6px] border-b-[6px] border-r-[6px] border-t-transparent border-b-transparent border-r-tooltip',\n\t\t};\n\n\t\treturn join(baseArrow, arrowClasses[placement]);\n\t};\n\n\tconst childrenProps = children.props as {\n\t\tstyle?: React.CSSProperties;\n\t\tchildren?: React.ReactNode;\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{React.cloneElement(children, {\n\t\t\t\tstyle: {\n\t\t\t\t\t...childrenProps.style,\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t},\n\t\t\t\tonMouseEnter: () => {\n\t\t\t\t\tsetIsHoveringTrigger(true);\n\t\t\t\t\tshowTooltip();\n\t\t\t\t},\n\t\t\t\tonMouseLeave: () => {\n\t\t\t\t\tsetIsHoveringTrigger(false);\n\t\t\t\t},\n\t\t\t\tonFocus: () => {\n\t\t\t\t\tsetIsFocused(true);\n\t\t\t\t\tshowTooltip();\n\t\t\t\t},\n\t\t\t\tonBlur: () => {\n\t\t\t\t\tsetIsFocused(false);\n\t\t\t\t\thideTooltip(true);\n\t\t\t\t},\n\t\t\t\tonKeyDown: (e: React.KeyboardEvent) => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\thideTooltip(true);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'aria-describedby': disabled ? undefined : tooltipId,\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{childrenProps.children}\n\t\t\t\t\t\t{!disabled && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tid={tooltipId}\n\t\t\t\t\t\t\t\trole='tooltip'\n\t\t\t\t\t\t\t\tclassName={getTooltipClasses()}\n\t\t\t\t\t\t\t\taria-hidden={!isVisible}\n\t\t\t\t\t\t\t\taria-live={isVisible ? 'polite' : undefined}\n\t\t\t\t\t\t\t\tonMouseEnter={() => {\n\t\t\t\t\t\t\t\t\tsetIsHoveringTooltip(true);\n\t\t\t\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\t\t\t\t\tsetIsHoveringTooltip(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t\t\t{showArrow && <div className={getArrowClasses()} aria-hidden={true} />}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t} as Record<string, unknown>)}\n\t\t</>\n\t);\n}\n\nexport default Tooltip;\n","import React from 'react';\nimport { InfoCircled, InfoCircledFilled } from '../../symbols';\nimport { join } from '../../utils';\nimport { Tooltip, TooltipProps } from '../tooltip';\n\nexport interface HelpIconProps extends Omit<TooltipProps, 'children'> {\n\t/** HTML id attribute for the help icon. */\n\tid?: string;\n\t/** Ref for the icon element. */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The design variant of the help icon. */\n\tdesign?: 'filled' | 'outlined';\n\t/** The size of the help icon. */\n\ticonSize?: number;\n\t/** Additional CSS classes to apply to the icon container. */\n\tclassName?: string;\n}\n\n/**\n * A help icon component that combines the InfoCircled icon with a tooltip for displaying contextual help information.\n * Supports both filled and outlined design variants with multiple size options.\n *\n * @example\n * ```tsx\n * // Basic help icon with tooltip\n * <HelpIcon message=\"This field is required for account verification\" />\n *\n * // Custom design and size\n * <HelpIcon\n * message=\"Click here for more information about pricing\"\n * design=\"outlined\"\n * iconSize={20}\n * placement=\"bottom\"\n * />\n *\n * // Rich content tooltip\n * <HelpIcon\n * message={\n * <div>\n * <p className=\"font-semibold mb-1\">Password Requirements</p>\n * <ul className=\"text-xs space-y-1\">\n * <li>• At least 8 characters</li>\n * <li>• One uppercase letter</li>\n * <li>• One number or symbol</li>\n * </ul>\n * </div>\n * }\n * className=\"ml-2\"\n * />\n * ```\n */\nexport function HelpIcon({ id, ref, design = 'filled', iconSize = 14, className, ...tooltipProps }: HelpIconProps) {\n\tconst IconComponent = design === 'filled' ? InfoCircledFilled : InfoCircled;\n\n\treturn (\n\t\t<Tooltip {...tooltipProps}>\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join(\n\t\t\t\t\t'inline-block cursor-help text-muted-foreground transition-colors align-top',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tdata-help-icon='true'\n\t\t\t\tdata-design={design}\n\t\t\t\tdata-size={iconSize}\n\t\t\t>\n\t\t\t\t<IconComponent size={iconSize} className='fill-current' />\n\t\t\t</div>\n\t\t</Tooltip>\n\t);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useAnimationOpenClose(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 150);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function useDocumentChanges(isOpen: boolean, onClose: () => void) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n // Prevent background scrolling when modal is open\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'auto';\n };\n }, [isOpen, onClose]);\n}\n\nexport function useHandleFocus(modalId: string, isOpen: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n const focusAppropriateElement = useCallback(() => {\n const modalElement = document.getElementById(modalId);\n if (!modalElement) return;\n\n // 1. First, try to focus on the first action button, if available\n const modalActions = modalElement.querySelectorAll('[data-modal-action=\"true\"]');\n if (modalActions.length > 0) {\n (modalActions[0] as HTMLElement).focus();\n return;\n }\n\n // 2. Then try first focusable element in content (giving preference to non-close button)\n const focusableElements = modalElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements.length > 0) {\n const allBesidesCloseButton = Array.from(focusableElements).filter((el) => {\n return !(el instanceof HTMLButtonElement && el.getAttribute('data-modal-close-button') === 'true');\n });\n\n if (allBesidesCloseButton.length > 0) {\n (allBesidesCloseButton[0] as HTMLElement).focus();\n return;\n }\n\n (focusableElements[0] as HTMLElement).focus();\n return;\n }\n\n // 3. Fallback to modal container\n modalElement.focus();\n }, [modalId]);\n\n useEffect(() => {\n if (isOpen) {\n // Store the currently focused element to restore focus later\n previousActiveElement.current = document.activeElement;\n\n focusAppropriateElement();\n }\n\n return () => {\n document.body.style.overflow = 'auto';\n\n // Restore focus to the previously focused element when modal closes\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen, focusAppropriateElement]);\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { Button, ButtonProps } from '../button';\nimport { useAnimationOpenClose, useDocumentChanges, useHandleFocus } from './hooks';\n\ninterface ModalAction extends Omit<ButtonProps, 'children'> {\n\t/** The text label for the action button. */\n\tlabel: string;\n}\n\nexport interface ModalProps {\n\t/** Optional ID for the modal element. */\n\tid?: string;\n\t/** Whether the modal is open. */\n\tisOpen: boolean;\n\t/** Callback fired when the modal should close. */\n\tonClose: () => void;\n\t/** Optional title for the modal header. */\n\ttitle?: React.ReactNode;\n\t/** The content to display inside the modal. */\n\tchildren: React.ReactNode;\n\t/** When true, renders only the children with no default modal styling. */\n\tcontentOnly?: boolean;\n\t/** Additional CSS classes to apply to the modal content. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to the backdrop overlay. */\n\toverlayClassName?: string;\n\t/** Additional CSS classes to apply to the modal container. */\n\tcontainerClassName?: string;\n\t/** Whether to hide the X close button in the top-right corner. */\n\thideCloseButton?: boolean;\n\t/** Array of action buttons to display at the bottom of the modal. */\n\tactions?: ModalAction[];\n\t/** Whether clicking the backdrop/overlay closes the modal. */\n\tdisableCloseOnOverlayClick?: boolean;\n\t/** ID of an element that labels the modal. */\n\tariaLabelledBy?: string;\n\t/** ID of an element that describes the modal. */\n\tariaDescribedBy?: string;\n}\n\n/**\n * A flexible modal dialog component with focus management, animation, and action buttons.\n * Supports both styled and content-only modes with comprehensive accessibility features.\n * \n * @example\n * ```tsx\n * // Basic modal\n * <Modal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * title=\"Confirm Action\"\n * >\n * <p>Are you sure you want to proceed?</p>\n * </Modal>\n * \n * // Modal with actions\n * <Modal\n * isOpen={showDeleteModal}\n * onClose={handleClose}\n * title=\"Delete Item\"\n * actions={[\n * { label: \"Cancel\", variant: \"secondary\", onClick: handleClose },\n * { label: \"Delete\", variant: \"destructive\", onClick: handleDelete }\n * ]}\n * disableCloseOnOverlayClick\n * >\n * <p>This action cannot be undone.</p>\n * </Modal>\n * ```\n */\nexport function Modal({\n\tid,\n\tisOpen,\n\tonClose,\n\ttitle,\n\tchildren,\n\tcontentOnly = false,\n\tclassName,\n\toverlayClassName,\n\tcontainerClassName,\n\thideCloseButton = false,\n\tactions = [],\n\tdisableCloseOnOverlayClick = false,\n\tariaLabelledBy,\n\tariaDescribedBy,\n}: ModalProps) {\n\tconst generatedId = useId();\n\tconst modalId = id || `modal-${generatedId}`;\n\tconst titleId = id ? `${id}-title` : `modal-title-${generatedId}`;\n\n\tconst { show, shouldRender } = useAnimationOpenClose(isOpen);\n\tuseHandleFocus(modalId, shouldRender);\n\tuseDocumentChanges(shouldRender, onClose);\n\n\tif (!shouldRender) return null;\n\n\tconst renderTitle = () => {\n\t\tif (!title) return null;\n\n\t\tif (React.isValidElement(title)) {\n\t\t\treturn <div className='mb-4'>{title}</div>;\n\t\t}\n\n\t\treturn (\n\t\t\t<h2 className='mb-4 text-xl font-semibold' id={titleId}>\n\t\t\t\t{title}\n\t\t\t</h2>\n\t\t);\n\t};\n\n\tconst renderActions = () => {\n\t\tif (actions.length === 0) return null;\n\n\t\treturn (\n\t\t\t<div className='mt-6 not-sm:grid gap-y-2 sm:flex sm:justify-start sm:flex-row-reverse sm:gap-x-3'>\n\t\t\t\t{actions.map((action, index) => {\n\t\t\t\t\tconst { label, ...rest } = action;\n\t\t\t\t\tconst buttonProps = rest as ButtonProps;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button key={index} {...buttonProps} data-modal-action='true'>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{createPortal(\n\t\t\t\t<div\n\t\t\t\t\taria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\trole='dialog'\n\t\t\t\t\taria-modal='true'\n\t\t\t\t\tclassName='fixed inset-0 z-[100] overflow-y-auto'\n\t\t\t\t>\n\t\t\t\t\t<div className={join('flex min-h-screen items-center justify-center p-4', containerClassName)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={join('fixed inset-0 bg-black/20 transition-all', overlayClassName)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!disableCloseOnOverlayClick) {\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{contentOnly && <div className={join('relative w-fit', className)}>{children}</div>}\n\n\t\t\t\t\t\t{!contentOnly && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tid={modalId}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'relative w-full max-w-xl transform rounded-lg shadow-xl bg-popover text-popover-foreground transition-all p-6 focus:ring ease-in duration-75',\n\t\t\t\t\t\t\t\t\tshow ? 'opacity-100 scale-100' : 'opacity-0 scale-90',\n\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!hideCloseButton && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\t\tdata-modal-close-button='true'\n\t\t\t\t\t\t\t\t\t\tclassName='rounded-md p-0.5 top-2.5 right-2.5 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X size={18} />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{renderTitle()}\n\n\t\t\t\t\t\t\t\t{children}\n\n\t\t\t\t\t\t\t\t{renderActions()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>,\n\t\t\t\tdocument.body\n\t\t\t)}\n\t\t</>\n\t);\n}\n","export const paginationVariants = {\n link: 'text-primary hover:text-primary-foreground hover:bg-primary/10 aria-current:text-primary-foreground aria-current:bg-primary',\n outline: 'border border-primary text-primary hover:bg-primary hover:text-primary-foreground aria-current:bg-primary aria-current:text-primary-foreground aria-current:border-primary',\n filled: 'bg-secondary text-secondary-foreground hover:bg-primary hover:text-primary-foreground aria-current:bg-primary aria-current:text-primary-foreground',\n} as const;\n\nexport type PaginationVariant = keyof typeof paginationVariants;\n\nexport const paginationSizes = {\n sm: 'px-2 py-1 text-sm min-w-[32px] min-h-8',\n md: 'px-2 py-1 text-base min-w-[40px] min-h-10',\n} as const;\n\nexport type PaginationSize = keyof typeof paginationSizes;\n\nexport interface PaginationVariants {\n variant: PaginationVariant;\n size: PaginationSize;\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useCallback } from 'react';\nimport { ChevronDoubleLeft, ChevronDoubleRight, ChevronLeft, ChevronRight } from '../../symbols';\nimport { PaginationSize, paginationSizes, PaginationVariant, paginationVariants } from './variants';\n\nexport interface PaginationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The current active page (1-indexed) */\n page: number;\n /** Total number of pages. Use Infinity for infinite pagination */\n pageCount?: number;\n /** Maximum number of page buttons to show */\n maxVisiblePages?: number;\n /** Whether to show first and last page buttons */\n showFirstLast?: boolean;\n /** Button variant style */\n variant?: PaginationVariant;\n /** Button size */\n size?: PaginationSize;\n /** Callback fired when the page changes */\n onPageChange: (page: number) => void;\n /** Ref for the pagination container */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional CSS classes for the button elements */\n buttonsClassName?: string;\n}\n\n/**\n * A pagination component for navigating through multiple pages of content.\n * Supports both finite and infinite pagination with customizable appearance.\n * \n * @example\n * ```tsx\n * // Basic pagination\n * <Pagination\n * page={currentPage}\n * pageCount={totalPages}\n * onPageChange={setCurrentPage}\n * />\n * \n * // Infinite pagination\n * <Pagination\n * page={currentPage}\n * pageCount={Infinity}\n * onPageChange={handlePageChange}\n * showFirstLast={false}\n * />\n * \n * // Customized appearance\n * <Pagination\n * page={currentPage}\n * pageCount={100}\n * maxVisiblePages={7}\n * variant=\"outline\"\n * size=\"lg\"\n * onPageChange={setCurrentPage}\n * />\n * ```\n */\nexport function Pagination({\n page,\n pageCount = 5,\n maxVisiblePages = 5,\n showFirstLast = true,\n onPageChange,\n size = 'md',\n variant = 'link',\n className,\n ref,\n buttonsClassName,\n ...rest\n}: PaginationProps) {\n const isInfinite = pageCount === Infinity;\n\n // Generate page numbers to display\n const getVisiblePages = useCallback((): number[] => {\n if (isInfinite) return [];\n\n const totalPages = pageCount;\n const maxPages = Math.min(maxVisiblePages, totalPages);\n\n // If we have fewer pages than maxVisiblePages, show all\n if (totalPages <= maxPages) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n // Calculate the range of pages to show\n const half = Math.floor(maxPages / 2);\n let start = Math.max(1, page - half);\n let end = Math.min(totalPages, start + maxPages - 1);\n\n // Adjust start if we're near the end\n if (end - start + 1 < maxPages) {\n start = Math.max(1, end - maxPages + 1);\n end = Math.min(totalPages, start + maxPages - 1);\n }\n\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }, [isInfinite, maxVisiblePages, page, pageCount]);\n\n const visiblePages = getVisiblePages();\n const canGoPrevious = page > 1;\n const canGoNext = isInfinite || page < pageCount;\n const showFirstButton = showFirstLast && !isInfinite;\n const showLastButton = showFirstLast && !isInfinite;\n\n const handlePageChange = (newPage: number) => {\n if (newPage >= 1 && (isInfinite || newPage <= pageCount)) {\n onPageChange(newPage);\n }\n };\n\n // Helper function to get button classes based on variant and state\n const getButtonClasses = useCallback(() => {\n const baseClasses = join(\n 'flex items-center justify-center min-w-fit',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n paginationSizes[size],\n 'rounded-md'\n );\n\n return join(baseClasses, paginationVariants[variant], buttonsClassName);\n }, [variant, size, buttonsClassName]);\n\n return (\n <nav\n ref={ref}\n className={join('flex items-center justify-center gap-1', className)}\n role='navigation'\n aria-label='Pagination'\n data-page={page}\n data-page-count={isInfinite ? 'infinite' : pageCount}\n {...rest}\n >\n {/* First page button */}\n {showFirstButton && (\n <button\n onClick={() => handlePageChange(1)}\n className={getButtonClasses()}\n disabled={page === 1}\n aria-label='Go to first page'\n >\n <ChevronDoubleLeft size={size === 'sm' ? 12 : 15} />\n <span className='ml-1'>First</span>\n </button>\n )}\n\n {/* Previous button */}\n <button\n onClick={() => handlePageChange(page - 1)}\n className={getButtonClasses()}\n disabled={!canGoPrevious}\n aria-label='Go to previous page'\n >\n <ChevronLeft size={size === 'sm' ? 12 : 15} />\n <span className='ml-1'>Previous</span>\n </button>\n\n {/* Page number buttons (only for finite pagination) */}\n {!isInfinite &&\n visiblePages.map((pageNum) => (\n <button\n key={pageNum}\n onClick={() => handlePageChange(pageNum)}\n className={join(getButtonClasses(), 'aspect-square')}\n aria-label={`Go to page ${pageNum}`}\n aria-current={pageNum === page ? true : undefined}\n >\n {pageNum}\n </button>\n ))}\n\n {/* Next button */}\n <button\n onClick={() => handlePageChange(page + 1)}\n className={getButtonClasses()}\n disabled={!canGoNext}\n aria-label='Go to next page'\n >\n <span className='mr-1'>Next</span>\n <ChevronRight size={size === 'sm' ? 12 : 15} />\n </button>\n\n {/* Last page button */}\n {showLastButton && (\n <button\n onClick={() => handlePageChange(pageCount)}\n className={getButtonClasses()}\n disabled={page === pageCount}\n aria-label='Go to last page'\n >\n <span className='mr-1'>Last</span>\n <ChevronDoubleRight size={size === 'sm' ? 12 : 15} />\n </button>\n )}\n </nav>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useAnimationSlideIn(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 300);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function usePanelDocumentChanges(isOpen: boolean, onClose: () => void) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n // Prevent background scrolling when panel is open\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'auto';\n };\n }, [isOpen, onClose]);\n}\n\nexport function usePanelFocus(panelId: string, isOpen: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n const focusAppropriateElement = useCallback(() => {\n const panelElement = document.getElementById(panelId);\n if (!panelElement) return;\n\n // 1. First, try to focus on the first action button, if available\n const panelActions = panelElement.querySelectorAll('[data-panel-action=\"true\"]');\n if (panelActions.length > 0) {\n (panelActions[0] as HTMLElement).focus();\n return;\n }\n\n // 2. Then try first focusable element in content (giving preference to non-close button)\n const focusableElements = panelElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements.length > 0) {\n const allBesidesCloseButton = Array.from(focusableElements).filter((el) => {\n return !(el instanceof HTMLButtonElement && el.getAttribute('data-panel-close-button') === 'true');\n });\n\n if (allBesidesCloseButton.length > 0) {\n (allBesidesCloseButton[0] as HTMLElement).focus();\n return;\n }\n\n (focusableElements[0] as HTMLElement).focus();\n return;\n }\n\n // 3. Fallback to panel container\n panelElement.focus();\n }, [panelId]);\n\n useEffect(() => {\n if (isOpen) {\n // Store the currently focused element to restore focus later\n previousActiveElement.current = document.activeElement;\n\n focusAppropriateElement();\n }\n\n return () => {\n document.body.style.overflow = 'auto';\n\n // Restore focus to the previously focused element when panel closes\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen, focusAppropriateElement]);\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { useAnimationSlideIn, usePanelDocumentChanges, usePanelFocus } from './hooks';\n\nexport interface PanelProps {\n ref?: React.Ref<HTMLDivElement>;\n /** Unique identifier for the panel */\n id?: string;\n /** Whether the panel is open */\n isOpen: boolean;\n /** Callback when panel should close */\n onClose: () => void;\n /** Panel title - can be a string or React node */\n title?: React.ReactNode;\n /** Panel content */\n children: React.ReactNode;\n /** Panel footer - can be a string or React node */\n footer?: React.ReactNode;\n /** Additional CSS classes for the panel */\n className?: string;\n /** Additional CSS classes for the overlay */\n overlayClassName?: string;\n /** Whether to hide the close button */\n hideCloseButton?: boolean;\n /** Whether to disable closing when clicking the overlay */\n disableCloseOnOverlayClick?: boolean;\n /** ARIA labelledby attribute */\n ariaLabelledBy?: string;\n /** ARIA describedby attribute */\n ariaDescribedBy?: string;\n}\n\n/**\n * Panel component that slides in from the right side of the screen.\n * Provides an overlay and slide-in animation for side content display.\n */\nexport function Panel({\n ref,\n id,\n isOpen,\n onClose,\n title,\n children,\n footer,\n className,\n overlayClassName,\n hideCloseButton = false,\n disableCloseOnOverlayClick = false,\n ariaLabelledBy,\n ariaDescribedBy,\n}: PanelProps) {\n const generatedId = useId();\n const panelId = id || `panel-${generatedId}`;\n const titleId = id ? `${id}-title` : `panel-title-${generatedId}`;\n\n const { show, shouldRender } = useAnimationSlideIn(isOpen);\n usePanelFocus(panelId, shouldRender);\n usePanelDocumentChanges(shouldRender, onClose);\n\n if (!shouldRender) return null;\n\n const renderTitle = () => {\n if (!title) return null;\n\n if (React.isValidElement(title)) {\n return <div>{title}</div>;\n }\n\n return (\n <h2 className='text-2xl font-semibold' id={titleId}>\n {title}\n </h2>\n );\n };\n\n const renderFooter = () => {\n if (!footer) return null;\n\n if (React.isValidElement(footer)) {\n const footerElement = footer as React.ReactElement<{ className?: string }>;\n const existingClassName = footerElement.props.className || '';\n return React.cloneElement(footerElement, { className: join('px-6 py-4', existingClassName) } as Record<\n string,\n unknown\n >);\n }\n\n return <div className='px-6 py-4'>{footer}</div>;\n };\n\n return (\n <>\n {createPortal(\n <div\n aria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n aria-describedby={ariaDescribedBy}\n role='dialog'\n aria-modal='true'\n className='fixed inset-0 z-[100] overflow-hidden'\n data-panel-open={isOpen}\n >\n <div\n className={join(\n 'fixed inset-0 bg-black/40 transition-opacity duration-300',\n show ? 'opacity-100' : 'opacity-0',\n overlayClassName\n )}\n onClick={() => {\n if (!disableCloseOnOverlayClick) {\n onClose();\n }\n }}\n />\n\n <div className='fixed inset-y-0 right-0 flex max-w-full'>\n <div\n id={panelId}\n ref={ref}\n tabIndex={-1}\n className={join(\n 'relative h-full max-w-md transform shadow-xl bg-popover text-popover-foreground transition-transform duration-300 ease-in-out border-l border-border',\n show ? 'translate-x-0' : 'translate-x-full',\n className\n )}\n >\n <div className='flex h-full flex-col'>\n {title && <div className='px-6 pt-6'>{renderTitle()}</div>}\n\n {!hideCloseButton && (\n <button\n type='button'\n onClick={onClose}\n data-panel-close-button='true'\n aria-label='Close panel'\n className='rounded-md p-0.5 top-3 right-3 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n >\n <X size={18} />\n </button>\n )}\n\n <div className={join('flex-1 overflow-y-auto px-6 pb-6', title ? 'pt-6' : 'pt-10')}>{children}</div>\n\n {renderFooter()}\n </div>\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n","import { Orientation } from './Separator';\n\nexport const thicknessVariants: Record<Thickness, Record<Orientation, string>> = {\n thin: {\n horizontal: 'h-px',\n vertical: 'w-px',\n },\n medium: {\n horizontal: 'h-0.5',\n vertical: 'w-0.5',\n },\n thick: {\n horizontal: 'h-1',\n vertical: 'w-1',\n },\n 'extra-thick': {\n horizontal: 'h-2',\n vertical: 'w-2',\n },\n} as const;\n\nexport type Thickness = 'thin' | 'medium' | 'thick' | 'extra-thick';\n\nexport const sizeVariants: Record<Orientation, string> = {\n horizontal: 'w-full',\n vertical: 'min-h-4 h-full',\n} as const;\n\nexport const defaultVariants = {\n thickness: 'thin',\n};\n","import React, { Ref } from 'react';\nimport { join } from '../../utils';\nimport { sizeVariants, Thickness, thicknessVariants } from './variants';\n\nexport type Orientation = 'horizontal' | 'vertical';\n\nexport interface SeparatorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'role'> {\n /** Reference to the separator element */\n ref?: Ref<HTMLDivElement>;\n /** The orientation of the separator */\n orientation?: Orientation;\n /** Whether the separator is decorative only. When true, it's hidden from screen readers */\n decorative?: boolean;\n /** The thickness variant of the separator */\n thickness?: Thickness;\n}\n\n/**\n * A visual separator component for dividing content sections.\n * Supports both horizontal and vertical orientations with customizable thickness.\n * \n * @example\n * ```tsx\n * // Horizontal separator\n * <Separator />\n * \n * // Vertical separator\n * <Separator orientation=\"vertical\" className=\"h-6\" />\n * \n * // Thick separator\n * <Separator thickness=\"thick\" />\n * \n * // Decorative separator (hidden from screen readers)\n * <Separator decorative />\n * ```\n */\nexport function Separator({\n orientation = 'horizontal',\n decorative = false,\n thickness = 'thin',\n className,\n ...props\n}: SeparatorProps) {\n const separatorClasses = join(\n 'shrink-0 bg-border',\n sizeVariants[orientation],\n thicknessVariants[thickness][orientation],\n className\n );\n\n return (\n <div\n {...props}\n className={separatorClasses}\n role={decorative ? 'presentation' : 'separator'}\n aria-orientation={decorative ? undefined : orientation}\n aria-hidden={decorative}\n data-orientation={orientation}\n data-thickness={thickness}\n />\n );\n}\n","export const skeletonVariants = {\n shape: {\n rectangle: 'rounded-md min-h-1',\n circle: 'rounded-full aspect-square min-h-1',\n text: 'rounded-sm min-h-1 h-4',\n },\n lineSpacing: {\n xs: 'space-y-1',\n sm: 'space-y-2',\n md: 'space-y-3',\n lg: 'space-y-4',\n xl: 'space-y-6',\n },\n} as const;\n\nexport interface SkeletonVariants {\n /** The shape of the skeleton element */\n shape?: keyof typeof skeletonVariants.shape;\n /** Spacing between skeleton lines when multiple lines are used */\n lineSpacing?: keyof typeof skeletonVariants.lineSpacing;\n}\n","import React from 'react';\nimport { join } from '../../utils';\nimport { skeletonVariants, type SkeletonVariants } from './variants';\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, SkeletonVariants {\n /** Additional CSS classes to apply to the skeleton */\n className?: string;\n /** Number of skeleton lines to render (for text-like skeletons) */\n lines?: number;\n /** Whether the skeleton should animate with a pulse effect */\n animate?: boolean;\n /** Ref to be passed to the skeleton element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A loading placeholder component that mimics the structure of content being loaded.\n * Provides visual feedback during data fetching with customizable shapes and animations.\n * \n * @example\n * ```tsx\n * // Basic skeleton\n * <Skeleton className=\"h-4 w-48\" />\n * \n * // Multiple text lines\n * <Skeleton lines={3} lineSpacing=\"md\" />\n * \n * // Different shapes\n * <Skeleton shape=\"circle\" className=\"h-12 w-12\" />\n * <Skeleton shape=\"rounded\" className=\"h-32 w-full\" />\n * \n * // Without animation\n * <Skeleton animate={false} className=\"h-6 w-32\" />\n * ```\n */\nexport function Skeleton({\n shape = 'rectangle',\n lineSpacing = 'sm',\n className,\n lines = 1,\n animate = true,\n ref,\n ...props\n}: SkeletonProps) {\n const baseClasses = join('bg-muted/70', animate && 'animate-pulse', skeletonVariants.shape[shape], className);\n\n // If lines is greater than 1, render multiple skeleton lines\n if (lines > 1) {\n return (\n <div\n ref={ref}\n className={skeletonVariants.lineSpacing[lineSpacing]}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton-container'\n data-lines={lines}\n data-shape={shape}\n data-animate={animate}\n {...props}\n >\n {Array.from({ length: lines }, (_, index) => (\n <div\n key={index}\n className={join(\n baseClasses,\n // Make last line shorter for a more natural text appearance\n index === lines - 1 && 'w-3/4'\n )}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton-line'\n data-line-index={index}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={baseClasses}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton'\n data-shape={shape}\n data-animate={animate}\n {...props}\n />\n );\n}\n","import React, { useState, useRef, useCallback } from 'react';\nimport { join } from '@moondreamsdev/dreamer-ui/utils';\n\nexport interface SliderProps {\n id?: string;\n /** The controlled value of the slider */\n value?: number;\n /** The initial value of the slider (uncontrolled) */\n defaultValue?: number;\n /** Callback fired when the slider value changes */\n onValueChange?: (value: number) => void;\n /** The minimum value of the slider */\n min?: number;\n /** The maximum value of the slider */\n max?: number;\n /** The step increment of the slider */\n step?: number;\n /** Whether the slider is disabled */\n disabled?: boolean;\n /** Additional CSS classes to apply to the track element */\n trackClassName?: string;\n /** Additional CSS classes to apply to the filled range element */\n rangeClassName?: string;\n /** Additional CSS classes to apply to the thumb element */\n thumbClassName?: string;\n /** Additional CSS classes to apply to the slider */\n className?: string;\n /** Ref to the root element */\n ref?: React.Ref<HTMLDivElement>;\n /** ARIA label for accessibility */\n ariaLabel?: string;\n /** ARIA labelledby for accessibility */\n ariaLabelledBy?: string;\n}\n\n/**\n * A horizontal slider component for selecting numeric values within a specified range.\n * Supports both controlled and uncontrolled modes with keyboard navigation and touch support.\n * \n * @example\n * ```tsx\n * // Basic slider\n * <Slider\n * min={0}\n * max={100}\n * value={volume}\n * onValueChange={setVolume}\n * ariaLabel=\"Volume control\"\n * />\n * \n * // Uncontrolled with custom step\n * <Slider\n * defaultValue={50}\n * min={0}\n * max={200}\n * step={5}\n * onValueChange={(value) => console.log('Price:', value)}\n * />\n * \n * // Customized appearance\n * <Slider\n * value={opacity}\n * onValueChange={setOpacity}\n * min={0}\n * max={1}\n * step={0.1}\n * rangeClassName=\"bg-blue-500\"\n * thumbClassName=\"bg-blue-600 border-2 border-white\"\n * />\n * ```\n */\nexport function Slider({\n id,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n trackClassName,\n rangeClassName,\n thumbClassName,\n className,\n ref,\n ariaLabel,\n ariaLabelledBy,\n ...props\n}: SliderProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const trackRef = useRef<HTMLDivElement>(null);\n const isDraggingRef = useRef(false);\n const dragOffsetRef = useRef(0);\n\n const updateValue = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n const steppedValue = Math.round(clampedValue / step) * step;\n\n if (!isControlled) {\n setInternalValue(steppedValue);\n }\n onValueChange?.(steppedValue);\n },\n [min, max, step, isControlled, onValueChange]\n );\n\n const getValueFromPointerEvent = useCallback(\n (event: PointerEvent | React.PointerEvent, isDragging = false) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return currentValue;\n\n let clientX = event.clientX;\n\n // If we're dragging, account for the offset from where the user initially clicked on the thumb\n if (isDragging) {\n clientX = clientX - dragOffsetRef.current;\n }\n\n const percentage = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return min + (max - min) * percentage;\n },\n [min, max, currentValue]\n );\n\n const handleTrackPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n // Only handle track clicks, not thumb clicks\n if (event.target !== event.currentTarget) return;\n\n const newValue = getValueFromPointerEvent(event);\n updateValue(newValue);\n },\n [disabled, getValueFromPointerEvent, updateValue]\n );\n\n const handleThumbPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n // Prevent the track click handler from firing\n event.stopPropagation();\n\n isDraggingRef.current = true;\n\n // Calculate the offset from the click position to the center of the thumb\n const trackRect = trackRef.current?.getBoundingClientRect();\n const thumbRect = event.currentTarget.getBoundingClientRect();\n\n if (trackRect && thumbRect) {\n const thumbCenter = thumbRect.left + thumbRect.width / 2;\n dragOffsetRef.current = event.clientX - thumbCenter;\n }\n\n // Set pointer capture on the thumb element for better tracking\n event.currentTarget.setPointerCapture(event.pointerId);\n\n // Add global event listeners for smooth dragging\n const handleGlobalPointerMove = (e: PointerEvent) => {\n if (!isDraggingRef.current) return;\n const newValue = getValueFromPointerEvent(e, true);\n updateValue(newValue);\n };\n\n const handleGlobalPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== event.pointerId) return;\n isDraggingRef.current = false;\n dragOffsetRef.current = 0;\n\n // Try to release capture from both the thumb and document\n try {\n event.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // Ignore errors if element is no longer available\n }\n\n document.removeEventListener('pointermove', handleGlobalPointerMove);\n document.removeEventListener('pointerup', handleGlobalPointerUp);\n };\n\n document.addEventListener('pointermove', handleGlobalPointerMove);\n document.addEventListener('pointerup', handleGlobalPointerUp);\n },\n [disabled, getValueFromPointerEvent, updateValue]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n let newValue = currentValue;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = currentValue + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = currentValue - step;\n break;\n case 'Home':\n newValue = min;\n break;\n case 'End':\n newValue = max;\n break;\n case 'PageUp':\n newValue = currentValue + step * 10;\n break;\n case 'PageDown':\n newValue = currentValue - step * 10;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n updateValue(newValue);\n },\n [disabled, currentValue, step, min, max, updateValue]\n );\n\n // Calculate percentage for positioning\n const percentage = max === min ? 0 : ((currentValue - min) / (max - min)) * 100;\n\n return (\n <div\n id={id}\n ref={ref}\n className={join(\n 'relative flex items-center w-full touch-none select-none',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n data-disabled={disabled}\n data-value={currentValue}\n data-min={min}\n data-max={max}\n data-step={step}\n {...props}\n >\n <div\n ref={trackRef}\n className={join(\n 'relative h-1.5 w-full rounded-full bg-muted cursor-pointer',\n disabled && 'cursor-not-allowed',\n trackClassName\n )}\n onPointerDown={handleTrackPointerDown}\n >\n {/* Range (filled portion) */}\n <div\n className={join(\n 'absolute h-full rounded-full pointer-events-none', // pointer-events are disabled so that user interactions are handled by the track element, enabling correct slider behavior\n !isDraggingRef.current && 'transition-all',\n rangeClassName\n )}\n style={{ width: `${percentage}%` }}\n />\n\n {/* Thumb */}\n <div\n className={join(\n 'absolute size-5 -top-2 rounded-full shadow-md cursor-grab',\n disabled && 'cursor-not-allowed',\n !disabled && 'cursor-grab focus:outline-none focus:ring-2',\n isDraggingRef.current ? 'cursor-grabbing scale-110' : 'transition-all',\n thumbClassName\n )}\n style={{ left: `calc(${percentage}% - 10px)` }}\n tabIndex={disabled ? -1 : 0}\n role='slider'\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-disabled={disabled}\n onKeyDown={handleKeyDown}\n onPointerDown={handleThumbPointerDown}\n />\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\n\nexport type TableSortDirection = 'asc' | 'desc' | null;\n\nexport interface SortConfig<T> {\n\tkey: keyof T | null;\n\tdirection: TableSortDirection;\n}\n\nexport interface UseTableSortOptions<T> {\n\tdata: T[];\n\tinitialSort?: SortConfig<T>;\n}\n\nexport interface UseTableSortResult<T> {\n\tsortedData: T[];\n\tsortConfig: SortConfig<T>;\n\thandleSort: (key: keyof T, customSorter?: (a: T, b: T) => number) => void;\n}\n\nexport function useTableSort<T>({\n\tdata,\n\tinitialSort = { key: null, direction: null },\n}: UseTableSortOptions<T>): UseTableSortResult<T> {\n\tconst [sortConfig, setSortConfig] = useState<SortConfig<T>>(initialSort);\n\tconst [sortFn, setSortFn] = useState<(a: T, b: T) => number>();\n\n\tconst sortedData = useMemo(() => {\n\t\tif (!sortConfig.key || !sortConfig.direction) {\n\t\t\treturn data;\n\t\t}\n\n\t\treturn [...data].sort((a, b) => {\n\t\t\tif (sortFn) {\n\t\t\t\tconst result = sortFn(a, b);\n\t\t\t\treturn sortConfig.direction === 'desc' ? -result : result;\n\t\t\t}\n\n\t\t\tconst aValue = a[sortConfig.key!];\n\t\t\tconst bValue = b[sortConfig.key!];\n\n\t\t\tif (aValue === bValue) return 0;\n\n\t\t\tlet result = 0;\n\n\t\t\t// Handle different data types\n\t\t\tif (typeof aValue === 'string' && typeof bValue === 'string') {\n\t\t\t\tresult = aValue.localeCompare(bValue);\n\t\t\t} else if (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\tresult = aValue - bValue;\n\t\t\t} else if (aValue instanceof Date && bValue instanceof Date) {\n\t\t\t\tresult = aValue.getTime() - bValue.getTime();\n\t\t\t} else {\n\t\t\t\t// Fallback to string comparison\n\t\t\t\tresult = String(aValue).localeCompare(String(bValue));\n\t\t\t}\n\n\t\t\treturn sortConfig.direction === 'desc' ? -result : result;\n\t\t});\n\t}, [data, sortConfig, sortFn]);\n\n\tconst handleSort = (key: keyof T, customSorter?: (a: T, b: T) => number) => {\n\t\tsetSortFn(() => customSorter);\n\t\tsetSortConfig((prevConfig) => {\n\t\t\tif (prevConfig.key === key) {\n\t\t\t\t// Cycle through: asc -> desc -> null\n\t\t\t\tconst direction = prevConfig.direction === 'asc' ? 'desc' : prevConfig.direction === 'desc' ? null : 'asc';\n\t\t\t\treturn { key: direction ? key : null, direction };\n\t\t\t} else {\n\t\t\t\treturn { key, direction: 'asc' };\n\t\t\t}\n\t\t});\n\t};\n\n\treturn { sortedData, sortConfig, handleSort };\n}\n\nexport interface UseTableSelectionOptions {\n\tinitialSelected?: (string | number)[];\n}\n\nexport function useTableSelection({ initialSelected = [] }: UseTableSelectionOptions = {}) {\n\tconst [selectedRows, setSelectedRows] = useState<Set<string | number>>(new Set(initialSelected));\n\n\tconst isRowSelected = (id: string | number): boolean => {\n\t\treturn selectedRows.has(id);\n\t};\n\n\tconst selectRow = (id: string | number) => {\n\t\tsetSelectedRows((prev) => new Set([...prev, id]));\n\t};\n\n\tconst deselectRow = (id: string | number) => {\n\t\tsetSelectedRows((prev) => {\n\t\t\tconst newSet = new Set(prev);\n\t\t\tnewSet.delete(id);\n\t\t\treturn newSet;\n\t\t});\n\t};\n\n\tconst selectAll = (ids: (string | number)[]) => {\n\t\tsetSelectedRows(new Set(ids));\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetSelectedRows(new Set());\n\t};\n\n\tconst isAllSelected = (ids: (string | number)[]): boolean => {\n\t\treturn ids.length > 0 && ids.every((id) => selectedRows.has(id));\n\t};\n\n\tconst isPartiallySelected = (ids: (string | number)[]): boolean => {\n\t\tconst selectedCount = ids.filter((id) => selectedRows.has(id)).length;\n\t\treturn selectedCount > 0 && selectedCount < ids.length;\n\t};\n\n\treturn {\n\t\tselectedRows,\n\t\tisRowSelected,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t};\n}\n","interface TableVariantStyles {\n\tcontainer: string;\n\ttable: string;\n\theader: string;\n\theaderCell: string;\n\tsortButton: string;\n\tcell: string;\n\tselectedRow: string;\n\tcheckbox: string;\n\tcheckboxSize: number;\n}\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport const TableSizes: Record<TableSize, TableVariantStyles> = {\n\tsm: {\n\t\tcontainer: 'text-sm',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b border-border',\n\t\theaderCell: 'px-3 py-2.5 font-medium',\n\t\tsortButton: 'inline-flex items-center gap-1 hover:text-accent transition-colors',\n\t\tcell: 'px-3 py-2 text-sm',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-5 pr-2 text-left w-3',\n\t\tcheckboxSize: 12,\n\t},\n\tmd: {\n\t\tcontainer: 'text-base',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b-2 border-border',\n\t\theaderCell: 'px-4 py-3 font-semibold',\n\t\tsortButton: 'inline-flex items-center gap-2 hover:text-accent transition-colors',\n\t\tcell: 'px-4 py-3',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-6 pr-3 py-3 text-left w-6',\n\t\tcheckboxSize: 16,\n\t},\n\tlg: {\n\t\tcontainer: 'text-lg',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b-2 border-border',\n\t\theaderCell: 'px-6 py-4 font-bold',\n\t\tsortButton: 'inline-flex items-center gap-2 hover:text-accent transition-colors',\n\t\tcell: 'px-6 py-4',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-6 pr-3 py-4 text-left w-8',\n\t\tcheckboxSize: 18,\n\t},\n};\n","import React from 'react';\nimport { useTableSelection, useTableSort } from './hooks';\nimport { TableSize, TableSizes } from './variants';\nimport { join } from '../../utils';\nimport { Checkbox } from '../checkbox';\nimport { ChevronDown, ChevronUp } from '../../symbols';\n\nexport interface TableColumn<T extends object, U = unknown> {\n\t/** Unique key for the column. Used for cell value if no `accessor` is provided */\n\tkey: Extract<keyof T, string>;\n\t/** Column header label */\n\theader: string;\n\t/** Accessor function or property name to get cell value */\n\taccessor?: keyof T | ((item: T) => U);\n\t/** Custom cell renderer */\n\tcell?: (item: T, value: U) => React.ReactNode;\n\t/** Whether the column is sortable */\n\tsortable?: boolean;\n\t/** Custom sort function. Negative result indicates descending order */\n\tsortFunction?: (a: T, b: T) => number;\n\t/** Column width */\n\twidth?: string | number;\n\t/** Column alignment */\n\talign?: 'left' | 'center' | 'right';\n\t/** Additional header class names */\n\theaderClassName?: string;\n\t/** Additional cell class names */\n\tcellClassName?: string;\n /** Additional column class names */\n columnClassName?: string;\n}\n\nexport interface TableProps<T extends object> {\n\t/** Unique identifier for the table */\n\tid?: string;\n\t/** Custom CSS classes */\n\tclassName?: string;\n\t/** React ref for the table container */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Size variant affecting padding and font sizes */\n\tsize?: TableSize;\n\t/** Array of data objects to display in the table */\n\tdata: T[];\n\t/** Column definitions specifying headers, accessors, and rendering options */\n\tcolumns: TableColumn<T>[];\n\t/** Whether to show row selection checkboxes */\n\tselectable?: boolean;\n\t/** Function to get unique row ID */\n\tgetRowId?: (item: T, index: number) => string | number;\n\t/** Initial selected row IDs */\n\tinitialSelected?: (string | number)[];\n\t/** Callback fired when row selection changes */\n\tonSelectionChange?: (selectedIds: (string | number)[]) => void;\n\t/** Whether to show table header */\n\tshowHeader?: boolean;\n\t/** Whether to add striped row styling */\n\tstriped?: boolean;\n\t/** Whether to add hover effects */\n\thoverable?: boolean;\n\t/** Empty state content */\n\temptyState?: React.ReactNode;\n\t/** Whether to show loading state */\n\tloading?: boolean;\n\t/** Loading content */\n\tloadingContent?: React.ReactNode;\n\t/** Table caption for accessibility */\n\tcaption?: string;\n}\n\n/**\n * A feature-rich table component with sorting, selection, and accessibility features.\n * Supports custom cell rendering, row selection, and responsive design.\n * \n * **Important:** The `data` prop should be stable (either declared outside the component or memoized)\n * to prevent unnecessary re-renders and maintain performance.\n * \n * @example\n * ```tsx\n * // Define stable data and columns outside component or use useMemo\n * const tableData = [\n * { id: 1, name: 'John Doe', email: 'john@example.com' },\n * { id: 2, name: 'Jane Smith', email: 'jane@example.com' }\n * ];\n * \n * const columns = [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true },\n * { \n * key: 'actions', \n * header: 'Actions',\n * cell: (item) => <Button onClick={() => edit(item.id)}>Edit</Button>\n * }\n * ];\n * \n * <Table\n * data={tableData}\n * columns={columns}\n * selectable\n * onSelectionChange={(selected) => setSelectedIds(selected)}\n * />\n * ```\n */\nexport function Table<T extends object>({\n\tid,\n\tclassName,\n\tref,\n\tsize = 'md',\n\tdata,\n\tcolumns,\n\tselectable = false,\n\tgetRowId = (_, index) => index,\n\tinitialSelected = [],\n\tonSelectionChange,\n\tshowHeader = true,\n\tstriped = false,\n\thoverable = true,\n\temptyState,\n\tloading = false,\n\tloadingContent,\n\tcaption,\n\t...props\n}: TableProps<T>) {\n\tconst sizeVariant = TableSizes[size];\n\n\tconst { sortedData, sortConfig, handleSort } = useTableSort({\n\t\tdata,\n\t\tinitialSort: { key: null, direction: null },\n\t});\n\n\tconst {\n\t\tselectedRows,\n\t\tisRowSelected,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t} = useTableSelection({ initialSelected });\n\n\t// Get all row IDs for select all functionality\n\tconst allRowIds = data.map((item, index) => getRowId(item, index));\n\n\t// Handle selection changes\n\tReact.useEffect(() => {\n\t\tif (onSelectionChange) {\n\t\t\tonSelectionChange(Array.from(selectedRows));\n\t\t}\n\t}, [selectedRows, onSelectionChange]);\n\n\tconst handleSelectAll = () => {\n\t\tif (isAllSelected(allRowIds)) {\n\t\t\tdeselectAll();\n\t\t} else {\n\t\t\tselectAll(allRowIds);\n\t\t}\n\t};\n\n\tconst getCellValue = (item: T, column: TableColumn<T>) => {\n\t\tif (column.accessor) {\n\t\t\tif (typeof column.accessor === 'function') {\n\t\t\t\treturn column.accessor(item);\n\t\t\t} else {\n\t\t\t\treturn item[column.accessor];\n\t\t\t}\n\t\t}\n\t\treturn item[column.key];\n\t};\n\n\tconst renderCell = (item: T, column: TableColumn<T>) => {\n\t\tconst value = getCellValue(item, column);\n\n\t\tif (column.cell) {\n\t\t\treturn column.cell(item, value);\n\t\t}\n\n\t\treturn <>{value}</>;\n\t};\n\n\tconst getAlignmentClass = (align?: 'left' | 'center' | 'right') => {\n\t\tswitch (align) {\n\t\t\tcase 'center':\n\t\t\t\treturn 'text-center';\n\t\t\tcase 'right':\n\t\t\t\treturn 'text-right';\n\t\t\tdefault:\n\t\t\t\treturn 'text-left';\n\t\t}\n\t};\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join('flex items-center justify-center p-8', sizeVariant.container, className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{loadingContent || <div>Loading...</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (data.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join('flex items-center justify-center p-8', sizeVariant.container, className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{emptyState || <div className='text-muted-foreground'>No data available</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join('overflow-x-auto border border-border rounded-lg', sizeVariant.container, className)}\n\t\t\tdata-testid='table-container'\n\t\t\tdata-size={size}\n\t\t\tdata-selectable={selectable}\n\t\t\t{...props}\n\t\t>\n\t\t\t<table className={sizeVariant.table} role='table'>\n\t\t\t\t{caption && <caption className='sr-only'>{caption}</caption>}\n\n <colgroup>\n {selectable && <col style={{ width: '1%' }} />}\n {columns.map((column) => (\n <col key={column.key} style={column.width ? { width: column.width } : {}} className={column.columnClassName} />\n ))}\n </colgroup>\n\n\t\t\t\t{showHeader && (\n\t\t\t\t\t<thead className={sizeVariant.header} role='rowgroup'>\n\t\t\t\t\t\t<tr role='row'>\n\t\t\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t\t\t<th className={sizeVariant.checkbox} role='columnheader' aria-label='Select all rows'>\n\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize}\n\t\t\t\t\t\t\t\t\t\tchecked={isAllSelected(allRowIds)}\n\t\t\t\t\t\t\t\t\t\tindeterminate={isPartiallySelected(allRowIds)}\n\t\t\t\t\t\t\t\t\t\tonCheckedChange={handleSelectAll}\n\t\t\t\t\t\t\t\t\t\taria-label='Select all rows'\n\t\t\t\t\t\t\t\t\t\tclassName='align-middle'\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\tconst sortDirection = sortConfig.key === column.key ? sortConfig.direction : null;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\t\tclassName={join(sizeVariant.headerCell, getAlignmentClass(column.align), column.headerClassName)}\n\t\t\t\t\t\t\t\t\t\trole='columnheader'\n\t\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\t\tsortConfig.key === column.key\n\t\t\t\t\t\t\t\t\t\t\t\t? sortConfig.direction === 'asc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'ascending'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: sortConfig.direction === 'desc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'descending'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'none'\n\t\t\t\t\t\t\t\t\t\t\t\t: column.sortable\n\t\t\t\t\t\t\t\t\t\t\t\t? 'none'\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{column.sortable ? (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={sizeVariant.sortButton}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSort(column.key, column.sortFunction)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Sort by ${column.header}`}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{column.header}\n\t\t\t\t\t\t\t\t\t\t\t\t<div className='flex flex-col items-center -space-y-1'>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize - 4}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={sortDirection === 'asc' ? 'text-accent' : 'opacity-40'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize - 4}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={sortDirection === 'desc' ? 'text-accent' : 'opacity-40'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tcolumn.header\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t)}\n\n\t\t\t\t<tbody role='rowgroup'>\n\t\t\t\t\t{sortedData.map((item, index) => {\n\t\t\t\t\t\tconst rowId = getRowId(item, index);\n\t\t\t\t\t\tconst isSelected = isRowSelected(rowId);\n\t\t\t\t\t\tconst isFinalItem = index === sortedData.length - 1;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\tkey={rowId}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'transition-all',\n\t\t\t\t\t\t\t\t\t!isFinalItem && 'border-b border-border',\n\t\t\t\t\t\t\t\t\thoverable && 'hover:bg-accent/15',\n\t\t\t\t\t\t\t\t\tstriped && index % 2 === 1 && 'bg-accent/25',\n\t\t\t\t\t\t\t\t\tisSelected && sizeVariant.selectedRow\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\trole='row'\n\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\tdata-testid='table-row'\n\t\t\t\t\t\t\t\tdata-row-id={rowId}\n\t\t\t\t\t\t\t\tdata-selected={isSelected}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t\t\t\t<td className={sizeVariant.checkbox} role='cell'>\n\t\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectRow(rowId);\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeselectRow(rowId);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Select row ${index + 1}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\t\tclassName={join(sizeVariant.cell, getAlignmentClass(column.align), column.cellClassName)}\n\t\t\t\t\t\t\t\t\t\trole='cell'\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderCell(item, column)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t);\n}\n","import { useState, useCallback } from 'react';\n\nexport interface UseTabsProps {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n}\n\nexport const useTabs = ({ defaultValue, value, onValueChange }: UseTabsProps = {}) => {\n const [internalValue, setInternalValue] = useState<string>(defaultValue || '');\n \n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n \n const handleValueChange = useCallback((newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n }, [isControlled, onValueChange]);\n\n return {\n value: currentValue,\n onValueChange: handleValueChange\n };\n};\n","import React from 'react';\nimport { useTabs } from './hooks';\nimport { TabsContext, TabsContextValue } from './TabsContext';\nimport { TabsVariant, TabsWidth } from './variants';\n\nexport interface TabsProps {\n id?: string;\n /** The value of the tab that should be active when initially rendered */\n defaultValue?: string;\n /** The controlled value of the tab to activate */\n value?: string;\n /** Event handler called when the value changes */\n onValueChange?: (value: string) => void;\n /** How the tabs should be sized. \"fit\" sizes tabs to content, \"full\" makes them equal width */\n tabsWidth?: TabsWidth;\n /** The visual style variant of the tabs */\n variant?: TabsVariant;\n /** Additional CSS classes to apply to the tabs container */\n className?: string;\n /** The tab list and content elements */\n children?: React.ReactNode;\n /** Ref to the tabs container */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional CSS classes to apply to the tab triggers */\n triggersClassName?: string;\n /** Additional CSS classes to apply to the tab content */\n contentClassName?: string;\n}\n\n/**\n * A tabs component for organizing content into switchable sections.\n * Works with TabsList, TabsTrigger, and TabsContent child components.\n * \n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\" variant=\"underline\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Overview</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Details</TabsTrigger>\n * <TabsTrigger value=\"tab3\">Settings</TabsTrigger>\n * </TabsList>\n * \n * <TabsContent value=\"tab1\">\n * <h3>Overview Content</h3>\n * </TabsContent>\n * <TabsContent value=\"tab2\">\n * <h3>Details Content</h3>\n * </TabsContent>\n * <TabsContent value=\"tab3\">\n * <h3>Settings Content</h3>\n * </TabsContent>\n * </Tabs>\n * ```\n */\nexport function Tabs({\n defaultValue,\n value,\n onValueChange,\n tabsWidth = 'fit',\n variant = 'underline',\n className,\n children,\n ref,\n id,\n triggersClassName,\n contentClassName,\n}: TabsProps) {\n const { value: selectedValue, onValueChange: handleValueChange } = useTabs({\n defaultValue,\n value,\n onValueChange,\n });\n\n const contextValue: TabsContextValue = {\n selectedValue,\n onValueChange: handleValueChange,\n tabsWidth,\n variant,\n triggersClassName,\n contentClassName,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div id={id} ref={ref} className={className} data-tabs-width={tabsWidth} data-variant={variant}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\n\nexport interface TabsContentProps {\n ref?: React.Ref<HTMLDivElement>;\n /** The value that identifies this tab content */\n value: string;\n /** Additional class names */\n className?: string;\n /** Tab content */\n children?: React.ReactNode;\n}\n\nexport function TabsContent({ value, className, children, ref }: TabsContentProps) {\n const { selectedValue, contentClassName } = useTabsContext();\n const isActive = selectedValue === value;\n\n if (!isActive) {\n return null;\n }\n\n const baseClassName =\n 'mt-4 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2';\n\n return (\n <div\n ref={ref}\n role='tabpanel'\n id={`tabs-content-${value}`}\n aria-labelledby={`tabs-trigger-${value}`}\n data-state={isActive ? 'active' : 'inactive'}\n data-value={value}\n className={join(baseClassName, contentClassName, className)}\n tabIndex={0}\n >\n {children}\n </div>\n );\n}\n","export type TabsWidth = 'fit' | 'full';\nexport type TabsVariant = 'underline' | 'pills' | 'bordered';\n\nexport const tabsListVariants = {\n width: {\n fit: 'w-fit',\n full: 'w-full *:flex-1',\n },\n variant: {\n underline: 'border-b border-border',\n pills: '',\n bordered: 'border border-border rounded-lg p-1',\n },\n};\n\nexport const tabTriggerVariants = {\n underline:\n 'border-b-2 border-transparent data-[state=active]:border-accent data-[state=active]:text-accent hover:text-accent-foreground',\n pills: 'rounded-md data-[state=active]:bg-accent data-[state=active]:text-accent-foreground hover:bg-accent/30',\n bordered: 'rounded data-[state=active]:bg-accent data-[state=active]:text-accent-foreground hover:bg-accent/30',\n};\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\nimport { tabsListVariants } from './variants';\n\nexport interface TabsListProps {\n id?: string;\n ref?: React.Ref<HTMLDivElement>;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function TabsList({ children, className, id, ref }: TabsListProps) {\n const { tabsWidth, variant } = useTabsContext();\n\n return (\n <div\n id={id}\n ref={ref}\n role='tablist'\n className={join('flex', tabsListVariants.width[tabsWidth], tabsListVariants.variant[variant], className)}\n data-tabs-width={tabsWidth}\n data-variant={variant}\n >\n {children}\n </div>\n );\n}\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\nimport { tabTriggerVariants } from './variants';\n\nexport interface TabsTriggerProps {\n id?: string;\n ref?: React.Ref<HTMLButtonElement>;\n /** The value that identifies this tab */\n value: string;\n /** Whether this trigger is disabled */\n disabled?: boolean;\n /** Additional class names */\n className?: string;\n /** Tab trigger content */\n children?: React.ReactNode;\n /** Click handler */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport function TabsTrigger({ value, disabled = false, className, children, onClick, id, ref }: TabsTriggerProps) {\n const { selectedValue, onValueChange, variant, triggersClassName } = useTabsContext();\n const isActive = selectedValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (!disabled) {\n onValueChange(value);\n }\n onClick?.(event);\n };\n\n const baseClassName =\n 'inline-flex items-center justify-center whitespace-nowrap px-3 py-2 text-sm ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50';\n\n return (\n <button\n id={id}\n ref={ref}\n role='tab'\n type='button'\n aria-selected={isActive}\n aria-controls={`tabs-content-${value}`}\n data-state={isActive ? 'active' : 'inactive'}\n data-value={value}\n disabled={disabled}\n className={join(\n baseClassName,\n isActive ? 'font-medium' : 'font-light',\n tabTriggerVariants[variant],\n triggersClassName,\n className\n )}\n onClick={handleClick}\n >\n {children}\n </button>\n );\n}\n","export const sizeVariants = {\n sm: {\n container: 'h-5 min-w-9 w-9',\n thumb: 'h-4 w-4',\n translate: 'translate-x-4',\n },\n md: {\n container: 'h-6 min-w-11 w-11',\n thumb: 'h-5 w-5',\n translate: 'translate-x-5',\n },\n lg: {\n container: 'h-7 min-w-13 w-13',\n thumb: 'h-6 w-6',\n translate: 'translate-x-6',\n },\n};\nexport type ToggleSize = keyof typeof sizeVariants;\n\nexport interface ToggleBackgroundClasses {\n unchecked?: string;\n checked?: string;\n}\n\nexport const variantStyles: Record<ToggleVariant, ToggleBackgroundClasses> = {\n default: {\n unchecked: 'bg-muted',\n checked: 'bg-primary',\n },\n success: {\n unchecked: 'bg-muted',\n checked: 'bg-success',\n },\n destructive: {\n unchecked: 'bg-muted',\n checked: 'bg-destructive',\n },\n};\nexport type ToggleVariant = 'default' | 'success' | 'destructive';\n\nexport interface ToggleVariants {\n variant: ToggleVariant;\n size: ToggleSize;\n}\n\nexport const toggleDefaults: ToggleVariants = {\n variant: 'default',\n size: 'md',\n} as const;\n","import React, { Ref, useEffect, useId, useMemo, useState } from 'react';\nimport { join } from '../../utils';\nimport {\n sizeVariants,\n ToggleBackgroundClasses,\n toggleDefaults,\n ToggleSize,\n ToggleVariant,\n variantStyles,\n} from './variants';\n\nexport interface ToggleProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /** Reference to the toggle button element. */\n ref?: Ref<HTMLButtonElement>;\n /** The size of the toggle switch. */\n size?: ToggleSize;\n /** The color variant of the toggle switch. */\n variant?: ToggleVariant;\n /** Whether the toggle is checked. If not provided, the toggle will be uncontrolled. */\n checked?: boolean;\n /** Callback fired when the toggle state changes. */\n onCheckedChange?: (checked: boolean) => void;\n /** Whether the toggle is disabled. */\n disabled?: boolean;\n /** Additional CSS classes to apply to the toggle thumb. */\n thumbClassName?: string;\n /** Custom background CSS classes for different toggle states. */\n backgroundClassNames?: ToggleBackgroundClasses;\n}\n\n/**\n * A toggle switch component for binary on/off states with smooth animations.\n * Supports both controlled and uncontrolled modes with keyboard navigation.\n * \n * @example\n * ```tsx\n * // Uncontrolled toggle\n * <Toggle onCheckedChange={(checked) => console.log('Toggled:', checked)} />\n * \n * // Controlled toggle\n * <Toggle \n * checked={isEnabled}\n * onCheckedChange={setIsEnabled}\n * size=\"lg\"\n * variant=\"success\"\n * />\n * \n * // Disabled state\n * <Toggle disabled checked />\n * ```\n */\nexport function Toggle({\n ref,\n id,\n size = toggleDefaults.size,\n variant = toggleDefaults.variant,\n checked,\n onCheckedChange,\n disabled = false,\n className,\n thumbClassName,\n backgroundClassNames,\n ...props\n}: ToggleProps) {\n const generatedId = useId();\n const toggleId = useMemo(() => id || `toggle-${generatedId}`, [id, generatedId]);\n const [isChecked, setIsChecked] = useState(checked);\n\n useEffect(() => {\n setIsChecked(checked);\n }, [checked]);\n\n const handleToggle = () => {\n if (!disabled) {\n const newChecked = !isChecked;\n\n if (checked === undefined) {\n // Only update state if the toggle is uncontrolled\n setIsChecked(newChecked);\n }\n onCheckedChange?.(newChecked);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n const sizeConfig = sizeVariants[size];\n const variantConfig = variantStyles[variant];\n\n const toggleClasses = join(\n // Base styles\n 'relative inline-flex items-center rounded-full transition-all duration-200 ease-in-out',\n 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n // Size\n sizeConfig.container,\n // Variant and state\n isChecked\n ? backgroundClassNames?.checked || variantConfig.checked\n : backgroundClassNames?.unchecked || variantConfig.unchecked,\n // Disabled state\n disabled && 'opacity-50 cursor-not-allowed',\n !disabled && 'cursor-pointer',\n className\n );\n\n const thumbClasses = join(\n // Base thumb styles\n 'absolute left-0.5 top-1/2 -translate-y-1/2 rounded-full bg-white shadow-sm transition-transform duration-200 ease-in-out',\n // Size\n sizeConfig.thumb,\n // Position based on state\n isChecked && sizeConfig.translate,\n thumbClassName\n );\n\n return (\n <button\n ref={ref}\n id={toggleId}\n type='button'\n role='switch'\n tabIndex={0}\n aria-checked={isChecked}\n aria-disabled={disabled}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={toggleClasses}\n {...props}\n >\n <span className={thumbClasses} />\n <span className='sr-only'>{isChecked ? 'Enabled' : 'Disabled'}</span>\n </button>\n );\n}\n"],"names":["AccordionItem","id","title","content","children","className","disabled","isOpen","onToggle","triggerClassName","bodyClassName","fallbackId","useId","itemId","headerId","panelId","handleToggle","handleKeyDown","e","jsxs","join","jsx","ChevronDown","Accordion","items","itemClassName","allowMultiple","defaultOpenItems","triggersClassName","bodiesClassName","groupId","groupName","openItems","setOpenItems","useState","toggleItem","prev","newOpenItems","getItemId","index","isItemOpen","item","React","child","createElement","AstronautAvatar","size","MoonAvatar","StarAvatar","GalaxyAvatar","NebulaAvatar","PlanetAvatar","CosmicCatAvatar","DreamCloudAvatar","RocketAvatar","ConstellationAvatar","CometAvatar","TwilightAvatar","AvatarPresets","AvatarSizes","AvatarShapes","Avatar","ref","shape","preset","alt","src","initials","props","sizeClasses","shapeClasses","PresetComponent","BadgeUseAriaAttributes","BadgeVariants","BadgeVariantsOutline","BadgeSizes","Badge","variant","outline","aspect","use","LoadingDots","activeIndex","setActiveIndex","useEffect","interval","prevIndex","buttonVariants","sizeVariants","roundedVariants","buttonDefaults","Button","rounded","loading","rest","adjustedSize","buttonClasses","buttonRest","getButtonChildren","childrenProps","useCalendar","options","initialDate","mode","minDate","maxDate","view","onDateSelect","onRangeSelect","state","setState","isDateDisabled","useCallback","date","selectDate","selectedRange","newRange","start","end","navigateMonth","direction","newDate","navigateWeek","days","navigateDay","navigate","changeView","newView","goToDate","changeMonth","month","changeYear","year","getDaysInView","useMemo","currentDate","firstDay","startDate","i","day","startOfWeek","isDateSelected","isDateInRange","_a","_b","isDateRangeStart","isDateRangeEnd","calendarSizeVariants","calendarViewVariants","calendarDefaults","WEEKDAYS","MONTHS","YEAR_RANGE","Calendar","customStyles","renderCell","showViewSelector","showNavigation","navigationLayout","useMonthYearSelector","showTodayButton","calendar","sizeStyles","viewStyles","isToday","today","isCurrentMonth","goToToday","formatTitle","endOfWeek","renderViewSelector","viewSelectorClasses","viewOption","renderMonthYearSelector","currentMonth","currentYear","startYear","endYear","yearOptions","monthYearSelectorsClasses","renderTodayButton","todayButtonClasses","renderDateCell","isSelected","isDisabled","isTodayDate","isInRange","isRangeStart","isRangeEnd","isCurrentMonthDate","baseCellClasses","cellClasses","cellContent","containerClasses","headerClasses","navigationClasses","prevButtonClasses","nextButtonClasses","titleClasses","weekdaysClasses","weekdayClasses","gridClasses","Fragment","ChevronLeft","ChevronRight","CalloutVariants","VariantIcons","InfoCircled","CrossCircled","CheckCircled","ExclamationTriangle","DeepRing","Callout","icon","description","dismissible","onDismiss","generatedId","calloutId","isDismissed","setIsDismissed","variantStyles","variantIcon","handleDismiss","X","CardSizes","Card","padding","header","footer","imageSrc","imageAlt","imageComponent","imageToEdge","sizeVariant","showImage","useCarousel","totalItems","itemsToShow","infinite","autoScroll","scrollInterval","pauseScrollOnHover","currentIndex","onIndexChange","currentSlide","setCurrentSlide","isHovered","setIsHovered","intervalRef","useRef","maxSlides","canGoPrev","canGoNext","goToSlide","clampedIndex","goToPrev","newIndex","goToNext","startInterval","stopInterval","buttonSizeVariants","buttonStyleVariants","buttonPositionVariants","Carousel","hidePrevNext","hideDots","buttonSize","buttonVariant","buttonPosition","prevButton","nextButton","itemsClassName","containerClassName","dotsClassName","gap","containerRef","childrenArray","screenSize","useScreenSize","currentItemsToShow","breakpointOrder","breakpoint","getSlideItemStyles","pos","widthReduction","handlePrevClick","handleNextClick","handleMouseEnter","handleMouseLeave","translateX","baseButtonStyles","leftWidth","rightWidth","_","useFilledBackgroundColor","filledBackgroundColor","setFilledBackgroundColor","getFirstNonTransparentBackgroundColor","element","currentElement","color","backgroundColor","checkbox","Checkbox","filled","checked","indeterminate","onCheckedChange","display","checkboxId","parentBackgroundColor","isChecked","setIsChecked","isIndeterminate","setIsIndeterminate","handleChange","newChecked","handleOnKeyDown","checkboxClasses","Dash","Check","Clickable","linkTo","linkProps","onButtonClick","buttonProps","useFontMetrics","metrics","setMetrics","computeMetrics","computed","fontSize","lineHeight","smallerFontSize","scale","smallerLineHeight","resizeObserver","mutationObserver","codeVariants","Code","style","codeId","fontMetrics","defaultBashTokenClasses","defaultCSSTokenClasses","defaultJsonTokenClasses","defaultMarkdownTokenClasses","defaultTSTokenClasses","BASH_KEYWORDS","BASH_RUNNERS","parseTemplateLiteral","input","tokens","char","braceDepth","exprStart","expression","exprTokens","tokenizeTypeScript","stringStart","parseTemplateLiteralContinuation","remainingTokens","tokenizeBash","codeLine","regex","processToken","token","inner","innerTokens","lastIndex","varRegex","match","tokenizeCSS","isInComment","inMultilineComment","context","comment","atRule","punctuation","str","func","number","hexColor","identifier","whitespace","plain","tokenType","type","tokenizeJSON","inheritedJSXContext","inheritedBraceDepth","inTemplateLiteral","remaining","isInJSX","jsxBraceDepth","templateResult","multiComment","singleComment","stringMatch","jsxOpenStart","jsxClose","tagEnd","jsxAttr","jsxBrace","operator","keyword","hook","property","tokenizeMarkdown","headerMatch","blockquoteMatch","listMatch","parseInlineMarkdown","codeBlockMatch","text","linkMatch","codeMatch","boldMatch","italicMatch","formatBash","codeLines","customTokenClasses","mergedTokenClasses","line","lineIndex","tokenIndex","formatCSS","inComment","formatJson","formatTypescript","globalJSXContext","globalBraceDepth","openBraces","closeBraces","formatMarkdown","useCopyToClipboard","copied","setCopied","handleCopy","err","useFullscreenMode","isFullscreen","setIsFullscreen","previousActiveElement","useKeyboardShortcuts","allowCopy","allowFullscreen","onCopy","onToggleFullscreen","getFileExtension","lang","CodeBlock","code","language","allowDownload","filename","showTrafficLights","showLineNumbers","hideHeader","hideFiletype","maxHeight","handleDownload","downloadFilename","downloadFile","toggleFullScreen","renderButtons","inHeader","Window","Download","Copy","formattedCode","lineNumbers","codeStyle","codeBlockContent","node","createPortal","Disclosure","label","open","buttonClassName","activeId","internalOpen","setInternalOpen","CaretCollapse","CaretExpand","useAnimationSlideIn","show","setShow","shouldRender","setShouldRender","timer","useDrawerDrag","onClose","enabled","isDragging","setIsDragging","translateY","setTranslateY","startY","setStartY","handleStart","clientY","handleMove","deltaY","clampedDeltaY","handleEnd","handleMouseDown","handleMouseMove","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","useDrawerFocus","drawerId","drawerElement","event","focusableElements","firstElement","lastElement","useDrawerDocumentChanges","originalStyle","handleEscape","Drawer","overlayClassName","showCloseButton","disableCloseOnOverlayClick","enableDragGestures","ariaLabelledBy","ariaDescribedBy","titleId","dragHandlers","renderTitle","renderFooter","footerElement","existingClassName","getOppositePlacement","placement","useAutoSwitchPlacement","internalIsOpen","autoSwitchPlacement","offset","triggerRef","popoverRef","effectivePlacement","setEffectivePlacement","updatePlacement","triggerRect","popoverRect","viewportWidth","viewportHeight","newPlacement","opposite","hasSpace","hasSpaceOpposite","handleScrollOrResize","placementVariants","getOffsetStyle","Popover","onOpenChange","closeOnOverlayClick","trigger","alignment","closeOnTriggerClick","hoverable","setInternalIsOpen","previousFocusRef","popoverId","hoverTimeoutRef","handleOpenChange","clearHoverTimeout","handleClickOutside","target","triggerProps","triggerElement","mergeRefs","MenuOption","option","onItemSelect","useDropdownMenuContext","handleItemClick","hasSubitems","isLink","Element","SubMenu","level","focus","setFocus","isSubMenuOpen","setIsSubMenuOpen","hasExited","setHasExited","itemRef","previousLevelRef","submenuId","handleOpen","handleClose","focusLevel","previousLevel","submenuLevel","showingSubmenu","MenuBody","itemIndex","renderItem","key","groupItem","groupIndex","getItemElements","menuEl","getNextMenuItemIndex","menuItems","startIndex","getPreviousMenuItemIndex","useKeyboardNavigation","dropdownId","focusedIndex","menu","itemElements","nextIndex","submenu","parentMenuItem","parentMenuIndex","el","getMenuItem","DropdownMenu","popoverProps","isUncontrolled","handleItemSelect","value","dropdownTrigger","DropdownMenuContext","group","separator","custom","render","DropdownMenuFactories","useDynamicList","initialItems","setItems","draggedItem","setDraggedItem","draggedOverIndex","setDraggedOverIndex","draggedFromIndex","addItem","extra","newItem","deleteItem","moveItem","fromIndex","toIndex","newItems","movedItem","moveItemUp","moveItemDown","handleDragStart","handleDragOver","handleDragEnd","handleDrop","getVisualItems","visualItems","titleVariants","listVariants","iconSize","DiscMarker","DashMarker","DynamicList","allowAdd","allowDelete","allowReorder","addPlaceholder","onItemsChange","marker","itemRenderer","showDividers","showReorderButtons","truncateText","newItemText","setNewItemText","hoveredIndex","setHoveredIndex","inputRef","hasMounted","lastOnChangeItems","listId","itemRenderFunction","getItemElementById","handleAddItem","handleDeleteItem","nextItem","nextElement","handleKeyPress","handleItemKeyDown","prop","renderMarker","iconSizeValue","visualIndex","originalIndex","originalItem","isDraggedItem","GripVertical","ChevronUp","Trash","Plus","ErrorBoundaryVariants","ErrorBoundary","showRetry","fallbackMessage","fallback","onRetry","onError","inDevEnv","ErrorBoundaryClass","Component","__publicField","error","errorInfo","field","textarea","select","radio","FormFactories","useFormValidation","fields","data","errors","setErrors","validateField","isValidFunc","validation","validateForm","currentData","newErrors","validateSingleField","fieldName","f","clearErrors","hasErrors","isFormValid","formVariants","formDefaults","Label","width","required","helpMessage","suffix","htmlFor","showHelp","showDescription","helpId","descriptionId","QuestionMarkCircled","StatusHelpMessage","elementId","message","inputVariants","inputDefaults","Input","displayOnlyMode","errorMessage","successMessage","showPassword","setShowPassword","adjustedRound","inputClasses","EyeOpened","EyeClosed","CharacterCount","maxLength","characterCount","setCharacterCount","updateCharacterCount","updatedCharacterCount","isError","useAutoExpand","autoExpand","adjustHeight","textareaVariants","textareaDefaults","Textarea","hideResizeHandle","characterLimit","adjustedHideResizeHandle","useSelectDropdown","useSelectKeyboardNavigation","setIsOpen","filteredOptions","highlightedIndex","setHighlightedIndex","onSelect","finalIndex","checkIndex","selectedOption","useSelectHighlight","optionsContainerRef","selectedIndex","scrollToOption","container","highlightedOption","behavior","useScrollArea","scrollbarThickness","viewportRef","verticalThumbRef","horizontalThumbRef","isScrolling","setIsScrolling","isFadingOut","setIsFadingOut","scrollbarVisible","setScrollbarVisible","scrollTimeout","fadeTimeout","checkOverflow","viewport","hasVerticalScroll","hasHorizontalScroll","updateThumbSizes","verticalThumb","horizontalThumb","scrollRatio","thumbHeight","maxScrollTop","scrollPercentage","maxThumbPosition","thumbTop","thumbWidth","maxScrollLeft","thumbLeft","handleScroll","ScrollArea","thumbClassName","viewportClassName","scrollbarClassName","thumbsClassName","Select","placeholder","searchable","clearable","dropdownClassName","onChange","onSearch","searchPlaceholder","listboxId","getOptionId","searchTerm","setSearchTerm","searchInputRef","dropdownRef","activeDescendantId","keyboardOnSelect","handleOptionClick","handleSearchChange","term","handleClear","RadioInput","name","baseClasses","handleClick","radioClasses","RadioGroupItem","hideInput","useRadioFocus","selectedOptionIndex","setFocusedIndex","clickedIndex","setClickedIndex","isMouseDown","setIsMouseDown","handleClicked","setInitialFocus","indexToFocus","handleFocusPreceding","previousIndex","handleKeyboardNavigation","getRadioOptions","radioGroup","handleFocus","RadioGroup","childrenClassName","hideInputs","processedOptions","acc","Form","form","initialData","onDataChange","onSubmit","submitButton","columns","responsive","spacing","setData","updateData","newData","handleSubmit","getFieldStylesAndClasses","classes","styles","renderField","fieldValue","fieldError","fieldId","fieldClasses","fieldStyles","renderFieldContent","inputField","textareaField","selectField","selectOptions","opt","checkboxField","checkboxSize","radioOptions","formClasses","renderSubmitButton","isValidElement","cloneElement","Tooltip","delay","showArrow","isVisible","setIsVisible","isHoveringTrigger","setIsHoveringTrigger","isHoveringTooltip","setIsHoveringTooltip","isFocused","setIsFocused","timeoutRef","reactId","tooltipId","showTooltip","hideTooltip","forceHide","getTooltipClasses","visibilityClasses","placementClasses","transformOrigins","getArrowClasses","baseArrow","arrowClasses","HelpIcon","design","tooltipProps","IconComponent","InfoCircledFilled","useAnimationOpenClose","useDocumentChanges","useHandleFocus","modalId","focusAppropriateElement","modalElement","modalActions","allBesidesCloseButton","Modal","contentOnly","hideCloseButton","actions","renderActions","action","paginationVariants","paginationSizes","Pagination","page","pageCount","maxVisiblePages","showFirstLast","onPageChange","buttonsClassName","isInfinite","visiblePages","totalPages","maxPages","half","canGoPrevious","showFirstButton","showLastButton","handlePageChange","newPage","getButtonClasses","ChevronDoubleLeft","pageNum","ChevronDoubleRight","usePanelDocumentChanges","usePanelFocus","panelElement","panelActions","Panel","thicknessVariants","Separator","orientation","decorative","thickness","separatorClasses","skeletonVariants","Skeleton","lineSpacing","lines","animate","Slider","defaultValue","onValueChange","min","max","step","trackClassName","rangeClassName","ariaLabel","internalValue","setInternalValue","isControlled","currentValue","trackRef","isDraggingRef","dragOffsetRef","updateValue","newValue","clampedValue","steppedValue","getValueFromPointerEvent","rect","clientX","percentage","handleTrackPointerDown","handleThumbPointerDown","trackRect","thumbRect","thumbCenter","handleGlobalPointerMove","handleGlobalPointerUp","useTableSort","initialSort","sortConfig","setSortConfig","sortFn","setSortFn","a","b","result","aValue","bValue","customSorter","prevConfig","useTableSelection","initialSelected","selectedRows","setSelectedRows","newSet","ids","selectedCount","TableSizes","Table","selectable","getRowId","onSelectionChange","showHeader","striped","emptyState","loadingContent","caption","sortedData","handleSort","isRowSelected","selectRow","deselectRow","selectAll","deselectAll","isAllSelected","isPartiallySelected","allRowIds","handleSelectAll","getCellValue","column","getAlignmentClass","align","sortDirection","rowId","isFinalItem","useTabs","handleValueChange","Tabs","tabsWidth","contentClassName","selectedValue","contextValue","TabsContext","TabsContent","useTabsContext","isActive","tabsListVariants","tabTriggerVariants","TabsList","TabsTrigger","onClick","toggleDefaults","Toggle","backgroundClassNames","toggleId","sizeConfig","variantConfig","toggleClasses","thumbClasses"],"mappings":"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"}
1
+ {"version":3,"file":"components.cjs.js","sources":["../src/components/accordion/AccordionItem.tsx","../src/components/accordion/Accordion.tsx","../src/components/avatar/icons.tsx","../src/components/avatar/variants.ts","../src/components/avatar/Avatar.tsx","../src/components/badge/variants.ts","../src/components/badge/Badge.tsx","../src/components/button/LoadingDots.tsx","../src/components/button/variants.ts","../src/components/button/Button.tsx","../src/components/calendar/hooks.ts","../src/components/calendar/variants.ts","../src/components/calendar/Calendar.tsx","../src/components/callout/variants.ts","../src/components/callout/Callout.tsx","../src/components/card/variants.ts","../src/components/card/Card.tsx","../src/components/carousel/hooks.ts","../src/components/carousel/variants.ts","../src/components/carousel/Carousel.tsx","../src/components/checkbox/hooks.ts","../src/components/checkbox/Checkbox.tsx","../src/components/clickable/Clickable.tsx","../src/components/code/hooks.ts","../src/components/code/variants.ts","../src/components/code/Code.tsx","../src/components/code-block/classes.ts","../src/components/code-block/constants.ts","../src/components/code-block/tokenize.ts","../src/components/code-block/format.tsx","../src/components/code-block/hooks.ts","../src/components/code-block/util.ts","../src/components/code-block/CodeBlock.tsx","../src/components/disclosure/Disclosure.tsx","../src/components/drawer/hooks.ts","../src/components/drawer/Drawer.tsx","../src/components/popover/hooks.ts","../src/components/popover/variants.ts","../src/components/popover/Popover.tsx","../src/components/dropdown-menu/DropdownMenuOption.tsx","../src/components/dropdown-menu/DropdownMenuSub.tsx","../src/components/dropdown-menu/DropdownMenuBody.tsx","../src/components/dropdown-menu/hooks.ts","../src/components/dropdown-menu/DropdownMenu.tsx","../src/components/dropdown-menu/factories.ts","../src/components/dynamic-list/hooks.ts","../src/components/dynamic-list/variants.ts","../src/components/dynamic-list/markers.tsx","../src/components/dynamic-list/DynamicList.tsx","../src/components/error-boundary/variants.ts","../src/components/error-boundary/ErrorBoundary.tsx","../src/components/form/factories.ts","../src/components/form/hooks.ts","../src/components/form/variants.ts","../src/components/label/Label.tsx","../src/shared/forms/StatusHelpMessage.tsx","../src/components/input/variants.ts","../src/components/input/Input.tsx","../src/components/textarea/CharacterCount.tsx","../src/components/textarea/hooks.ts","../src/components/textarea/variants.ts","../src/components/textarea/Textarea.tsx","../src/components/select/hooks.ts","../src/components/select/variants.ts","../src/components/scroll-area/hooks.ts","../src/components/scroll-area/ScrollArea.tsx","../src/components/select/Select.tsx","../src/components/radiogroup/RadioInput.tsx","../src/components/radiogroup/RadioGroupItem.tsx","../src/components/radiogroup/hooks.ts","../src/components/radiogroup/RadioGroup.tsx","../src/components/form/Form.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/help-icon/HelpIcon.tsx","../src/components/modal/hooks.ts","../src/components/modal/Modal.tsx","../src/components/pagination/variants.ts","../src/components/pagination/Pagination.tsx","../src/components/panel/hooks.ts","../src/components/panel/Panel.tsx","../src/components/separator/variants.ts","../src/components/separator/Separator.tsx","../src/components/skeleton/variants.ts","../src/components/skeleton/Skeleton.tsx","../src/components/slider/Slider.tsx","../src/components/table/hooks.ts","../src/components/table/variants.ts","../src/components/table/Table.tsx","../src/components/tabs/hooks.ts","../src/components/tabs/Tabs.tsx","../src/components/tabs/TabsContent.tsx","../src/components/tabs/variants.ts","../src/components/tabs/TabsList.tsx","../src/components/tabs/TabsTrigger.tsx","../src/components/toggle/variants.ts","../src/components/toggle/Toggle.tsx"],"sourcesContent":["import { useId } from 'react';\nimport { ChevronDown } from '../../symbols';\nimport { join } from '../../utils';\nimport { AccordionOption } from './Accordion';\n\nexport interface AccordionItemProps extends Omit<AccordionOption, 'defaultOpen'> {\n /** Content to render inside the accordion item. */\n children?: React.ReactNode;\n /** Additional CSS classes to apply to the accordion item. */\n className?: string;\n /** Whether the accordion item is currently open. */\n isOpen?: boolean;\n /** Callback function called when the accordion item is toggled. */\n onToggle?: () => void;\n /** Additional CSS classes to apply to the trigger button. */\n triggerClassName?: string;\n /** Additional CSS classes to apply to the content body. */\n bodyClassName?: string;\n}\n\n/**\n * Individual accordion item component with expandable content.\n * Provides keyboard navigation and accessibility features.\n * \n * @example\n * ```tsx\n * <AccordionItem\n * title=\"FAQ Question\"\n * content=\"This is the answer to the question\"\n * isOpen={false}\n * onToggle={() => console.log('toggled')}\n * />\n * ```\n */\nexport function AccordionItem({\n id,\n title,\n content,\n children,\n className = '',\n disabled = false,\n isOpen = false,\n onToggle,\n triggerClassName = '',\n bodyClassName = '',\n}: AccordionItemProps) {\n const fallbackId = useId();\n const itemId = id || `accordion-item-${fallbackId}`;\n const headerId = `${itemId}-header`;\n const panelId = `${itemId}-panel`;\n\n const handleToggle = () => {\n if (!disabled && onToggle) {\n onToggle();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n return (\n <div className={join('border-b border-gray-200', disabled && 'opacity-60 cursor-not-allowed', className)}>\n <button\n id={headerId}\n type='button'\n className={join(\n 'w-full text-left py-3 px-4 flex justify-between items-center focus:outline focus:outline-secondary',\n disabled ? 'cursor-not-allowed' : 'hover:bg-gray-50/10 cursor-pointer',\n triggerClassName\n )}\n aria-expanded={isOpen}\n aria-controls={panelId}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n >\n <span>{title}</span>\n <span\n className={join(\n 'transform transition-transform duration-300 ease-linear',\n isOpen ? 'rotate-180' : 'rotate-0'\n )}\n aria-hidden='true'\n >\n <ChevronDown size={18} />\n </span>\n </button>\n\n <div\n id={panelId}\n role='region'\n aria-labelledby={headerId}\n className={join(\n 'transition-all duration-300 ease-linear px-4',\n isOpen ? 'max-h-96 opacity-100 overflow-auto py-3' : 'max-h-0 opacity-0 overflow-hidden',\n bodyClassName\n )}\n >\n {isOpen && (children || content)}\n </div>\n </div>\n );\n}\n","import React, { useId, useState } from 'react';\nimport { join } from '../../utils';\nimport { AccordionItem, AccordionItemProps } from './AccordionItem';\n\nexport interface AccordionOption {\n\t/** Unique identifier for the accordion item. */\n\tid?: string;\n\t/** The title/header content for the accordion item. */\n\ttitle: React.ReactNode;\n\t/** The main content that will be shown when the item is expanded. */\n\tcontent: React.ReactNode;\n\t/** Whether the accordion item is disabled and cannot be toggled. */\n\tdisabled?: boolean;\n\t/** Whether the accordion item should be open by default. */\n\tdefaultOpen?: boolean;\n}\n\nexport interface AccordionProps {\n\t/** Unique identifier for the accordion container. */\n\tid?: string;\n\t/** Array of accordion items with id, title, content, and optional disabled state. */\n\titems?: AccordionOption[];\n\t/** AccordionItem components when using the component approach. */\n\tchildren?: React.ReactElement<AccordionItemProps>[] | React.ReactElement<AccordionItemProps>;\n\t/** Additional CSS classes to apply to the accordion container. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to individual accordion items. */\n\titemClassName?: string;\n\t/** Whether multiple items can be open simultaneously. */\n\tallowMultiple?: boolean;\n\t/** Array of item IDs that should be open by default. */\n\tdefaultOpenItems?: string[];\n\t/** Additional CSS classes to apply to all trigger buttons. */\n\ttriggersClassName?: string;\n\t/** Additional CSS classes to apply to all content bodies. */\n\tbodiesClassName?: string;\n}\n\n/**\n * A flexible accordion component that supports expandable/collapsible content sections.\n * Can be used either with an items array or with AccordionItem child components.\n *\n * @example\n * ```tsx\n * // Using items prop\n * <Accordion\n * items={[\n * { id: \"1\", title: \"Section 1\", content: \"Content here\" },\n * { id: \"2\", title: \"Section 2\", content: \"More content\" }\n * ]}\n * allowMultiple={false}\n * />\n *\n * // Using children\n * <Accordion allowMultiple>\n * <AccordionItem title=\"Custom Section\" content=\"Custom content\" />\n * <AccordionItem title=\"Another Section\" content=\"Another content\" />\n * </Accordion>\n * ```\n */\nexport function Accordion({\n\tid,\n\titems = [],\n\tchildren,\n\tclassName = '',\n\titemClassName = '',\n\tallowMultiple = false,\n\tdefaultOpenItems = [],\n\ttriggersClassName = '',\n\tbodiesClassName = '',\n}: AccordionProps) {\n\tconst groupId = useId();\n\tconst groupName = id || `accordion-group-${groupId}`;\n\tconst [openItems, setOpenItems] = useState<Set<string>>(new Set(defaultOpenItems));\n\n\tconst toggleItem = (itemId: string) => {\n\t\tsetOpenItems((prev) => {\n\t\t\tconst newOpenItems = new Set(prev);\n\n\t\t\tif (newOpenItems.has(itemId)) {\n\t\t\t\tnewOpenItems.delete(itemId);\n\t\t\t} else {\n\t\t\t\tif (!allowMultiple) {\n\t\t\t\t\tnewOpenItems.clear();\n\t\t\t\t}\n\t\t\t\tnewOpenItems.add(itemId);\n\t\t\t}\n\n\t\t\treturn newOpenItems;\n\t\t});\n\t};\n\n\tconst getItemId = (index: number) => `${groupId}-item-${index}`;\n\tconst isItemOpen = (itemId: string) => openItems.has(itemId);\n\n\treturn (\n\t\t<div id={groupName} className={className}>\n\t\t\t{/* Render from items prop */}\n\t\t\t{items.length > 0 &&\n\t\t\t\titems.map((item, index) => {\n\t\t\t\t\tconst itemId = item.id || getItemId(index);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\tkey={itemId}\n\t\t\t\t\t\t\tid={itemId}\n\t\t\t\t\t\t\ttitle={item.title}\n\t\t\t\t\t\t\tcontent={item.content}\n\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\tisOpen={isItemOpen(itemId)}\n\t\t\t\t\t\t\tonToggle={() => toggleItem(itemId)}\n\t\t\t\t\t\t\tclassName={itemClassName}\n\t\t\t\t\t\t\ttriggerClassName={triggersClassName}\n\t\t\t\t\t\t\tbodyClassName={bodiesClassName}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\n\t\t\t{/* Render AccordionItem components */}\n\t\t\t{items.length === 0 &&\n\t\t\t\tchildren &&\n\t\t\t\tReact.Children.map(children, (child, index) => {\n\t\t\t\t\tif (React.isValidElement<AccordionItemProps>(child) && child.type === AccordionItem) {\n\t\t\t\t\t\tconst itemId = child.props.id || getItemId(index);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<AccordionItem\n\t\t\t\t\t\t\t\t{...child.props}\n\t\t\t\t\t\t\t\tkey={itemId}\n\t\t\t\t\t\t\t\tid={itemId}\n\t\t\t\t\t\t\t\tclassName={join(itemClassName, child.props.className)}\n\t\t\t\t\t\t\t\tisOpen={isItemOpen(itemId)}\n\t\t\t\t\t\t\t\tonToggle={() => toggleItem(itemId)}\n\t\t\t\t\t\t\t\ttriggerClassName={join(triggersClassName, child.props.triggerClassName)}\n\t\t\t\t\t\t\t\tbodyClassName={join(bodiesClassName, child.props.bodyClassName)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t})}\n\t\t</div>\n\t);\n}\n","interface AvatarIconProps {\n\tsize: string;\n}\n\n// Astronaut Avatar\nexport function AstronautAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Helmet */}\n\t\t\t<circle cx='50' cy='40' r='32' fill='url(#astronautHelmet)' stroke='#4F46E5' strokeWidth='2' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='50' cy='40' r='24' fill='#FED7AA' />\n\t\t\t{/* Eyes */}\n\t\t\t<circle cx='43' cy='36' r='3' fill='#1F2937' />\n\t\t\t<circle cx='57' cy='36' r='3' fill='#1F2937' />\n\t\t\t{/* Mouth */}\n\t\t\t<path d='M46 46 Q50 50 54 46' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t{/* Body */}\n\t\t\t<rect x='38' y='65' width='24' height='30' rx='12' fill='#E5E7EB' />\n\t\t\t{/* Chest panel */}\n\t\t\t<rect x='44' y='70' width='12' height='8' rx='2' fill='#6366F1' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='astronautHelmet' cx='50%' cy='30%' r='70%'>\n\t\t\t\t\t<stop stopColor='#DBEAFE' />\n\t\t\t\t\t<stop offset='1' stopColor='#93C5FD' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Moon Avatar\nexport function MoonAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Moon body */}\n\t\t\t<circle cx='50' cy='50' r='40' fill='url(#moonGradient)' />\n\t\t\t{/* Craters */}\n\t\t\t<circle cx='38' cy='35' r='4' fill='#D1D5DB' />\n\t\t\t<circle cx='65' cy='42' r='3' fill='#D1D5DB' />\n\t\t\t<circle cx='42' cy='65' r='5' fill='#D1D5DB' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='45' cy='45' r='2.5' fill='#1F2937' />\n\t\t\t<circle cx='58' cy='45' r='2.5' fill='#1F2937' />\n\t\t\t<path d='M47 55 Q52 60 57 55' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='moonGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#F9FAFB' />\n\t\t\t\t\t<stop offset='1' stopColor='#E5E7EB' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Star Avatar\nexport function StarAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Star shape */}\n\t\t\t<path d='M50 15 L58 38 L82 38 L64 52 L72 75 L50 61 L28 75 L36 52 L18 38 L42 38 Z' fill='url(#starGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='44' cy='42' r='2' fill='#1F2937' />\n\t\t\t<circle cx='56' cy='42' r='2' fill='#1F2937' />\n\t\t\t<path d='M46 50 Q50 54 54 50' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t{/* Sparkles */}\n\t\t\t<circle cx='65' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='35' cy='30' r='1' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='starGradient' cx='50%' cy='40%' r='60%'>\n\t\t\t\t\t<stop stopColor='#FEF3C7' />\n\t\t\t\t\t<stop offset='1' stopColor='#FCD34D' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Galaxy Avatar\nexport function GalaxyAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Galaxy spiral */}\n\t\t\t<circle cx='50' cy='50' r='38' fill='url(#galaxyGradient)' />\n\t\t\t{/* Spiral arms */}\n\t\t\t<path d='M20 50 Q35 30 50 50 Q65 70 80 50' stroke='#8B5CF6' strokeWidth='3' opacity='0.7' />\n\t\t\t<path d='M50 20 Q70 35 50 50 Q30 65 50 80' stroke='#A78BFA' strokeWidth='2' opacity='0.5' />\n\t\t\t{/* Center face */}\n\t\t\t<circle cx='50' cy='50' r='12' fill='#1E1B4B' />\n\t\t\t<circle cx='46' cy='47' r='1.5' fill='#E0E7FF' />\n\t\t\t<circle cx='54' cy='47' r='1.5' fill='#E0E7FF' />\n\t\t\t<path d='M47 53 Q50 56 53 53' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='30' cy='25' r='1' fill='#FFF' />\n\t\t\t<circle cx='75' cy='70' r='1.5' fill='#FFF' />\n\t\t\t<circle cx='25' cy='75' r='1' fill='#FFF' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='galaxyGradient' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#4C1D95' />\n\t\t\t\t\t<stop offset='0.5' stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E1B4B' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Nebula Avatar\nexport function NebulaAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Nebula clouds */}\n\t\t\t<ellipse cx='50' cy='50' rx='35' ry='30' fill='url(#nebulaGradient)' opacity='0.8' />\n\t\t\t<ellipse cx='40' cy='45' rx='20' ry='25' fill='url(#nebulaPink)' opacity='0.6' />\n\t\t\t<ellipse cx='60' cy='55' rx='25' ry='20' fill='url(#nebulaBlue)' opacity='0.6' />\n\t\t\t{/* Face in the center */}\n\t\t\t<circle cx='50' cy='50' r='15' fill='#312E81' opacity='0.9' />\n\t\t\t<circle cx='46' cy='47' r='2' fill='#E0E7FF' />\n\t\t\t<circle cx='54' cy='47' r='2' fill='#E0E7FF' />\n\t\t\t<path d='M47 53 Q50 56 53 53' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Twinkling stars */}\n\t\t\t<circle cx='25' cy='30' r='1' fill='#FFF' opacity='0.9' />\n\t\t\t<circle cx='75' cy='25' r='1.5' fill='#FFF' opacity='0.8' />\n\t\t\t<circle cx='30' cy='75' r='1' fill='#FFF' opacity='0.9' />\n\t\t\t<circle cx='70' cy='75' r='1.5' fill='#FFF' opacity='0.7' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='nebulaGradient' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='1' stopColor='#312E81' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id='nebulaPink' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#F472B6' />\n\t\t\t\t\t<stop offset='1' stopColor='#BE185D' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<radialGradient id='nebulaBlue' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#3B82F6' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E40AF' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Planet Avatar\nexport function PlanetAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Planet body */}\n\t\t\t<circle cx='50' cy='50' r='32' fill='url(#planetGradient)' />\n\t\t\t{/* Ring */}\n\t\t\t<ellipse cx='50' cy='50' rx='45' ry='8' fill='none' stroke='#A78BFA' strokeWidth='2' opacity='0.7' />\n\t\t\t{/* Surface details */}\n\t\t\t<circle cx='38' cy='40' r='5' fill='#065F46' opacity='0.6' />\n\t\t\t<circle cx='62' cy='45' r='4' fill='#065F46' opacity='0.6' />\n\t\t\t<circle cx='45' cy='62' r='3' fill='#065F46' opacity='0.6' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='46' cy='48' r='2.5' fill='#1F2937' />\n\t\t\t<circle cx='54' cy='48' r='2.5' fill='#1F2937' />\n\t\t\t<path d='M47 55 Q50 58 53 55' stroke='#1F2937' strokeWidth='2' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='planetGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#A7F3D0' />\n\t\t\t\t\t<stop offset='0.6' stopColor='#34D399' />\n\t\t\t\t\t<stop offset='1' stopColor='#059669' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Cosmic Cat Avatar\nexport function CosmicCatAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Cat head */}\n\t\t\t<circle cx='50' cy='55' r='28' fill='url(#catGradient)' />\n\t\t\t{/* Ears */}\n\t\t\t<path d='M28 40 L38 25 L42 45 Z' fill='#6366F1' />\n\t\t\t<path d='M58 45 L62 25 L72 40 Z' fill='#6366F1' />\n\t\t\t{/* Inner ears */}\n\t\t\t<path d='M32 38 L36 30 L38 40 Z' fill='#EC4899' />\n\t\t\t<path d='M62 40 L64 30 L68 38 Z' fill='#EC4899' />\n\t\t\t{/* Eyes */}\n\t\t\t<ellipse cx='43' cy='50' rx='4' ry='6' fill='#FCD34D' />\n\t\t\t<ellipse cx='57' cy='50' rx='4' ry='6' fill='#FCD34D' />\n\t\t\t<ellipse cx='43' cy='52' rx='1.5' ry='4' fill='#1F2937' />\n\t\t\t<ellipse cx='57' cy='52' rx='1.5' ry='4' fill='#1F2937' />\n\t\t\t{/* Nose */}\n\t\t\t<path d='M48 58 L50 60 L52 58 Z' fill='#EC4899' />\n\t\t\t{/* Mouth */}\n\t\t\t<path d='M50 60 Q46 64 42 62' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t<path d='M50 60 Q54 64 58 62' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Whiskers */}\n\t\t\t<line x1='25' y1='55' x2='35' y2='57' stroke='#1F2937' strokeWidth='1' />\n\t\t\t<line x1='65' y1='57' x2='75' y2='55' stroke='#1F2937' strokeWidth='1' />\n\t\t\t{/* Stars around */}\n\t\t\t<circle cx='20' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='80' cy='30' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='15' cy='70' r='1' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='catGradient' cx='50%' cy='40%' r='70%'>\n\t\t\t\t\t<stop stopColor='#A78BFA' />\n\t\t\t\t\t<stop offset='1' stopColor='#6366F1' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Dream Cloud Avatar\nexport function DreamCloudAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Cloud body */}\n\t\t\t<circle cx='35' cy='55' r='18' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='55' cy='50' r='22' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='45' cy='65' r='15' fill='url(#cloudGradient)' />\n\t\t\t<circle cx='65' cy='60' r='16' fill='url(#cloudGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='48' cy='52' r='2.5' fill='#6366F1' />\n\t\t\t<circle cx='56' cy='52' r='2.5' fill='#6366F1' />\n\t\t\t<path d='M49 58 Q52 62 55 58' stroke='#6366F1' strokeWidth='2' fill='none' />\n\t\t\t{/* Dream bubbles */}\n\t\t\t<circle cx='70' cy='35' r='3' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t<circle cx='78' cy='28' r='2' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t<circle cx='83' cy='20' r='1.5' fill='rgba(167, 139, 250, 0.3)' stroke='#A78BFA' />\n\t\t\t{/* Stars in bubbles */}\n\t\t\t<circle cx='70' cy='35' r='0.5' fill='#FCD34D' />\n\t\t\t<circle cx='78' cy='28' r='0.5' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='cloudGradient' cx='50%' cy='40%' r='70%'>\n\t\t\t\t\t<stop stopColor='#F8FAFC' />\n\t\t\t\t\t<stop offset='1' stopColor='#E2E8F0' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Rocket Avatar\nexport function RocketAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Rocket body */}\n\t\t\t<ellipse cx='50' cy='45' rx='15' ry='30' fill='url(#rocketGradient)' />\n\t\t\t{/* Nose cone */}\n\t\t\t<path d='M35 20 L50 10 L65 20 L50 25 Z' fill='#EF4444' />\n\t\t\t{/* Window */}\n\t\t\t<circle cx='50' cy='35' r='8' fill='#DBEAFE' stroke='#2563EB' strokeWidth='2' />\n\t\t\t{/* Face inside window */}\n\t\t\t<circle cx='47' cy='33' r='1.5' fill='#1F2937' />\n\t\t\t<circle cx='53' cy='33' r='1.5' fill='#1F2937' />\n\t\t\t<path d='M48 37 Q50 39 52 37' stroke='#1F2937' strokeWidth='1' fill='none' />\n\t\t\t{/* Fins */}\n\t\t\t<path d='M35 60 L25 70 L35 75 Z' fill='#6B7280' />\n\t\t\t<path d='M65 60 L75 70 L65 75 Z' fill='#6B7280' />\n\t\t\t{/* Exhaust */}\n\t\t\t<ellipse cx='50' cy='80' rx='8' ry='12' fill='#F59E0B' />\n\t\t\t<ellipse cx='50' cy='82' rx='5' ry='8' fill='#EF4444' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='25' cy='20' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='75' cy='25' r='1.5' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='rocketGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#E5E7EB' />\n\t\t\t\t\t<stop offset='1' stopColor='#9CA3AF' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Constellation Avatar\nexport function ConstellationAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Background circle */}\n\t\t\t<circle cx='50' cy='50' r='38' fill='url(#constellationBg)' opacity='0.8' />\n\t\t\t{/* Constellation stars */}\n\t\t\t<circle cx='35' cy='25' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='50' cy='30' r='2.5' fill='#FCD34D' />\n\t\t\t<circle cx='65' cy='35' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='30' cy='50' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='70' cy='50' r='2' fill='#FCD34D' />\n\t\t\t<circle cx='40' cy='70' r='2.5' fill='#FCD34D' />\n\t\t\t<circle cx='60' cy='75' r='1.5' fill='#FCD34D' />\n\t\t\t{/* Connection lines */}\n\t\t\t<line x1='35' y1='25' x2='50' y2='30' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='50' y1='30' x2='65' y2='35' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='30' y1='50' x2='50' y2='30' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='50' y1='30' x2='70' y2='50' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='30' y1='50' x2='40' y2='70' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t<line x1='70' y1='50' x2='60' y2='75' stroke='#A78BFA' strokeWidth='1' opacity='0.7' />\n\t\t\t{/* Face in center */}\n\t\t\t<circle cx='48' cy='48' r='2' fill='#E0E7FF' />\n\t\t\t<circle cx='52' cy='48' r='2' fill='#E0E7FF' />\n\t\t\t<path d='M48 54 Q50 56 52 54' stroke='#E0E7FF' strokeWidth='1.5' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='constellationBg' cx='50%' cy='50%' r='70%'>\n\t\t\t\t\t<stop stopColor='#1E1B4B' />\n\t\t\t\t\t<stop offset='1' stopColor='#0F0D2A' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Comet Avatar\nexport function CometAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Comet head */}\n\t\t\t<circle cx='35' cy='35' r='18' fill='url(#cometGradient)' />\n\t\t\t{/* Face */}\n\t\t\t<circle cx='31' cy='31' r='2' fill='#1F2937' />\n\t\t\t<circle cx='39' cy='31' r='2' fill='#1F2937' />\n\t\t\t<path d='M32 38 Q35 41 38 38' stroke='#1F2937' strokeWidth='1.5' fill='none' />\n\t\t\t{/* Tail */}\n\t\t\t<path d='M50 50 Q65 65 85 85' stroke='url(#tailGradient1)' strokeWidth='8' opacity='0.7' />\n\t\t\t<path d='M48 52 Q60 68 75 88' stroke='url(#tailGradient2)' strokeWidth='6' opacity='0.5' />\n\t\t\t<path d='M52 48 Q70 62 90 82' stroke='url(#tailGradient3)' strokeWidth='4' opacity='0.3' />\n\t\t\t{/* Sparkles */}\n\t\t\t<circle cx='60' cy='60' r='1.5' fill='#FCD34D' />\n\t\t\t<circle cx='70' cy='70' r='1' fill='#FCD34D' />\n\t\t\t<circle cx='80' cy='80' r='0.8' fill='#FCD34D' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='cometGradient' cx='30%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#FEF3C7' />\n\t\t\t\t\t<stop offset='1' stopColor='#F59E0B' />\n\t\t\t\t</radialGradient>\n\t\t\t\t<linearGradient id='tailGradient1' x1='50%' y1='50%' x2='85%' y2='85%'>\n\t\t\t\t\t<stop stopColor='#FCD34D' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t\t<linearGradient id='tailGradient2' x1='48%' y1='52%' x2='75%' y2='88%'>\n\t\t\t\t\t<stop stopColor='#F472B6' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t\t<linearGradient id='tailGradient3' x1='52%' y1='48%' x2='90%' y2='82%'>\n\t\t\t\t\t<stop stopColor='#A78BFA' />\n\t\t\t\t\t<stop offset='1' stopColor='transparent' />\n\t\t\t\t</linearGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Twilight Avatar\nexport function TwilightAvatar({ size }: AvatarIconProps) {\n\treturn (\n\t\t<svg width={size} height={size} viewBox='0 0 100 100' fill='none'>\n\t\t\t{/* Sky background */}\n\t\t\t<circle cx='50' cy='50' r='40' fill='url(#twilightGradient)' />\n\t\t\t{/* Silhouette */}\n\t\t\t<ellipse cx='50' cy='65' rx='25' ry='15' fill='#1F2937' opacity='0.8' />\n\t\t\t{/* Stars */}\n\t\t\t<circle cx='30' cy='25' r='1.5' fill='#FFF' />\n\t\t\t<circle cx='70' cy='30' r='1' fill='#FFF' />\n\t\t\t<circle cx='40' cy='35' r='1.2' fill='#FFF' />\n\t\t\t<circle cx='60' cy='25' r='0.8' fill='#FFF' />\n\t\t\t{/* Moon crescent */}\n\t\t\t<path d='M20 40 Q15 35 20 30 Q25 35 20 40' fill='#FCD34D' />\n\t\t\t{/* Face in silhouette */}\n\t\t\t<circle cx='47' cy='62' r='1.5' fill='#E0E7FF' />\n\t\t\t<circle cx='53' cy='62' r='1.5' fill='#E0E7FF' />\n\t\t\t<path d='M48 67 Q50 69 52 67' stroke='#E0E7FF' strokeWidth='1' fill='none' />\n\t\t\t<defs>\n\t\t\t\t<radialGradient id='twilightGradient' cx='50%' cy='30%' r='80%'>\n\t\t\t\t\t<stop stopColor='#7C3AED' />\n\t\t\t\t\t<stop offset='0.7' stopColor='#3730A3' />\n\t\t\t\t\t<stop offset='1' stopColor='#1E1B4B' />\n\t\t\t\t</radialGradient>\n\t\t\t</defs>\n\t\t</svg>\n\t);\n}\n\n// Export preset mapping\nexport const AvatarPresets = {\n\tastronaut: AstronautAvatar,\n\tmoon: MoonAvatar,\n\tstar: StarAvatar,\n\tgalaxy: GalaxyAvatar,\n\tnebula: NebulaAvatar,\n\tplanet: PlanetAvatar,\n\t'cosmic-cat': CosmicCatAvatar,\n\t'dream-cloud': DreamCloudAvatar,\n\trocket: RocketAvatar,\n\tconstellation: ConstellationAvatar,\n\tcomet: CometAvatar,\n\ttwilight: TwilightAvatar,\n};\n","export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\nexport type AvatarShape = 'circle' | 'square';\nexport type AvatarPreset =\n\t| 'astronaut'\n\t| 'moon'\n\t| 'star'\n\t| 'galaxy'\n\t| 'nebula'\n\t| 'planet'\n\t| 'cosmic-cat'\n\t| 'dream-cloud'\n\t| 'rocket'\n\t| 'constellation'\n\t| 'comet'\n\t| 'twilight';\n\nexport const AvatarSizes: Record<AvatarSize, { size: string; iconSize: string }> = {\n\txs: { size: 'w-8 h-8', iconSize: '24' },\n\tsm: { size: 'w-10 h-10', iconSize: '32' },\n\tmd: { size: 'w-12 h-12', iconSize: '40' },\n\tlg: { size: 'w-16 h-16', iconSize: '56' },\n\txl: { size: 'w-20 h-20', iconSize: '72' },\n\t'2xl': { size: 'w-24 h-24', iconSize: '88' },\n};\n\nexport const AvatarShapes: Record<AvatarShape, string> = {\n\tcircle: 'rounded-full',\n\tsquare: 'rounded-lg',\n};\n","import React from 'react';\nimport { join } from '../../utils';\nimport { AvatarPresets } from './icons';\nimport { AvatarPreset, AvatarShape, AvatarShapes, AvatarSize, AvatarSizes } from './variants';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n\t/** The HTML id attribute for the avatar */\n\tid?: string;\n\t/** Reference to the avatar element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The size of the avatar */\n\tsize?: AvatarSize;\n\t/** The shape of the avatar */\n\tshape?: AvatarShape;\n\t/** Pre-defined cartoon-like avatar to display */\n\tpreset?: AvatarPreset;\n\t/** Alternative text for the avatar image */\n\talt?: string;\n\t/** Additional CSS classes to apply to the avatar */\n\tclassName?: string;\n\t/** Custom image source URL */\n\tsrc?: string;\n\t/** Initials to display when no preset or src is provided */\n\tinitials?: string;\n}\n\n/**\n * Displays user avatars with support for images, preset icons, or initials.\n * Provides various size and shape options with built-in fallback handling.\n * \n * @example\n * ```tsx\n * // With custom image\n * <Avatar src=\"/user-photo.jpg\" alt=\"John Doe\" size=\"lg\" />\n * \n * // With preset character\n * <Avatar preset=\"astronaut\" size=\"md\" shape=\"circle\" />\n * \n * // With initials fallback\n * <Avatar initials=\"JD\" size=\"sm\" />\n * ```\n */\nexport function Avatar({\n\tid,\n\tref,\n\tsize = 'md',\n\tshape = 'circle',\n\tpreset,\n\talt,\n\tclassName,\n\tsrc,\n\tinitials,\n\t...props\n}: AvatarProps) {\n\tconst sizeClasses = AvatarSizes[size];\n\tconst shapeClasses = AvatarShapes[shape];\n\n\tconst PresetComponent = preset ? AvatarPresets[preset] : null;\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join(\n\t\t\t\t'relative inline-flex items-center justify-center overflow-hidden bg-gray-100 border-2 border-border',\n\t\t\t\tsizeClasses.size,\n\t\t\t\tshapeClasses,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-size={size}\n\t\t\tdata-shape={shape}\n\t\t\tdata-preset={preset}\n\t\t\trole='img'\n\t\t\taria-label={alt || `Avatar ${preset ? `of ${preset}` : ''}`}\n\t\t\t{...props}\n\t\t>\n\t\t\t{src ? (\n\t\t\t\t<img src={src} alt={alt || 'User avatar'} className='w-full h-full object-cover' />\n\t\t\t) : PresetComponent ? (\n\t\t\t\t<PresetComponent size={sizeClasses.iconSize} />\n\t\t\t) : initials ? (\n\t\t\t\t<span className='text-gray-600 font-medium text-sm'>{initials.slice(0, 2).toUpperCase()}</span>\n\t\t\t) : (\n\t\t\t\t<div className='w-full h-full bg-gradient-to-br from-gray-300 to-gray-400' />\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","// -- Badge Use\nexport type BadgeUse = 'decorative' | 'status' | 'alert';\n\nexport const BadgeUseAriaAttributes: Record<BadgeUse, object> = {\n\tdecorative: { 'aria-hidden': true },\n\tstatus: { role: 'status' },\n\talert: { role: 'alert' },\n};\n\n// -- Badge Variant\nexport type BadgeVariant = 'base' | 'primary' | 'secondary' | 'accent' | 'destructive' | 'success' | 'muted';\n\nexport const BadgeVariants: Record<BadgeVariant, string> = {\n\tbase: '',\n\tprimary: 'bg-primary text-primary-foreground',\n\tsecondary: 'bg-secondary text-secondary-foreground',\n\taccent: 'bg-accent text-accent-foreground',\n\tdestructive: 'bg-destructive text-destructive-foreground',\n\tsuccess: 'bg-success text-success-foreground',\n\tmuted: 'bg-muted text-muted-foreground',\n};\n\nexport const BadgeVariantsOutline: Record<BadgeVariant, string> = {\n\tbase: '',\n\tprimary: 'border border-primary bg-transparent text-primary',\n\tsecondary: 'border border-secondary bg-transparent text-secondary',\n\taccent: 'border border-accent bg-transparent text-accent',\n\tdestructive: 'border border-destructive bg-transparent text-destructive',\n\tsuccess: 'border border-success bg-transparent text-success',\n\tmuted: 'border border-muted-foreground bg-transparent text-muted-foreground',\n};\n\n// -- Badge Size\nexport type BadgeSize = 'xs' | 'sm' | 'md';\n\ninterface BadgeSizeStyles {\n\ttext: string;\n\taspectSquare: string;\n\taspectVideo: string;\n}\n\nexport const BadgeSizes: Record<BadgeSize, BadgeSizeStyles> = {\n\txs: {\n\t\ttext: 'text-xs',\n\t\taspectSquare: 'p-1',\n\t\taspectVideo: 'px-2 py-0.5',\n\t},\n\tsm: {\n\t\ttext: 'text-sm',\n\t\taspectSquare: 'p-1.5',\n\t\taspectVideo: 'px-2.5 py-1',\n\t},\n\tmd: {\n\t\ttext: 'text-base',\n\t\taspectSquare: 'p-2',\n\t\taspectVideo: 'px-3 py-1.5',\n\t},\n};\n","import React from 'react';\nimport { join } from '../../utils';\nimport {\n\tBadgeSize,\n\tBadgeSizes,\n\tBadgeUse,\n\tBadgeUseAriaAttributes,\n\tBadgeVariant,\n\tBadgeVariants,\n\tBadgeVariantsOutline,\n} from './variants';\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/** The HTML id attribute for the badge */\n\tid?: string;\n\t/** Reference to the badge element */\n\tref?: React.Ref<HTMLSpanElement>;\n\t/** The visual style variant of the badge */\n\tvariant?: BadgeVariant;\n\t/** Whether to render the badge with an outline style */\n\toutline?: boolean;\n\t/** The content to display inside the badge */\n\tchildren?: React.ReactNode;\n\t/** The aspect ratio of the badge - square for equal padding, video for horizontal padding */\n\taspect?: 'square' | 'video';\n\t/** The semantic use of the badge for accessibility purposes */\n\tuse?: BadgeUse;\n\t/** The size of the badge */\n\tsize?: BadgeSize;\n}\n\n/**\n * A small UI element for displaying status, labels, or categories.\n * Supports various colors, sizes, and semantic accessibility attributes.\n * \n * @example\n * ```tsx\n * // Status badge\n * <Badge variant=\"success\" use=\"status\">Active</Badge>\n * \n * // Notification count\n * <Badge variant=\"destructive\" aspect=\"square\" use=\"status\">5</Badge>\n * \n * // Category tag\n * <Badge variant=\"muted\" outline>JavaScript</Badge>\n * ```\n */\nexport function Badge({\n\tid,\n\tref,\n\tvariant = 'muted',\n\toutline = false,\n\tchildren,\n\tclassName,\n\taspect = 'video',\n\tuse = 'decorative',\n\tsize = 'xs',\n\t...props\n}: BadgeProps) {\n\treturn (\n\t\t<span\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join(\n\t\t\t\t'font-medium rounded-full inline-flex select-none',\n\t\t\t\tBadgeSizes[size].text,\n\t\t\t\taspect === 'square' && BadgeSizes[size].aspectSquare,\n\t\t\t\taspect === 'video' && BadgeSizes[size].aspectVideo,\n\t\t\t\toutline ? BadgeVariantsOutline[variant] : BadgeVariants[variant],\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tdata-variant={variant}\n\t\t\tdata-outline={outline}\n\t\t\tdata-aspect={aspect}\n\t\t\tdata-use={use}\n\t\t\tdata-size={size}\n\t\t\t{...BadgeUseAriaAttributes[use]}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n","import { useEffect, useState } from 'react';\nimport { join } from '../../utils';\n\n/**\n * An animated loading indicator with three bouncing dots.\n * Used internally by Button component to show loading state.\n * \n * @example\n * ```tsx\n * <LoadingDots />\n * ```\n */\nexport function LoadingDots() {\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setActiveIndex((prevIndex) => (prevIndex + 1) % 3);\n }, 500);\n\n return () => clearInterval(interval);\n }, []);\n\n return (\n <div className='absolute inset-0 inline-flex items-center justify-center gap-x-2 align-middle'>\n {[0, 1, 2].map((index) => (\n <div\n key={index}\n className={join(\n 'rounded-full transition-all duration-500 ease-in-out size-[0.35em] bg-current',\n activeIndex === index && 'transform -translate-y-1'\n )}\n />\n ))}\n </div>\n );\n}","export const buttonVariants = {\n base: '',\n primary: 'bg-primary text-primary-foreground hover:bg-primary/85 disabled:bg-muted disabled:text-muted-foreground',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/85 disabled:bg-muted/80 disabled:text-muted-foreground/80',\n tertiary: 'text-primary hover:text-primary-foreground disabled:text-muted-foreground',\n outline: 'border border-primary text-primary hover:border-primary-foreground hover:text-primary-foreground disabled:border-muted disabled:text-muted',\n link: 'underline-offset-4 hover:underline disabled:underline disabled:text-muted-foreground',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/85 disabled:bg-muted disabled:text-muted-foreground',\n} as const;\nexport type ButtonVariant = keyof typeof buttonVariants;\n\nexport const sizeVariants = {\n stripped: '',\n fitted: 'size-fit leading-0',\n sm: 'px-2 py-1 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n icon: 'p-1 w-fit aspect-square',\n full: 'p-2 w-full',\n} as const;\nexport type ButtonSize = keyof typeof sizeVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n} as const;\nexport type ButtonRounded = keyof typeof roundedVariants;\n\nexport interface ButtonVariants {\n /** The visual style variant of the button. */\n variant: ButtonVariant;\n /** The size of the button. */\n size: ButtonSize;\n /** The border radius of the button. */\n rounded: ButtonRounded;\n}\n\nexport const buttonDefaults: ButtonVariants = {\n variant: 'primary',\n size: 'md',\n rounded: 'md',\n} as const;\n","// Button.tsx\nimport React, { ButtonHTMLAttributes, Ref } from 'react';\nimport { join } from '../../utils';\nimport { LoadingDots } from './LoadingDots';\nimport { ButtonSize, ButtonVariants, buttonDefaults, buttonVariants, roundedVariants, sizeVariants } from './variants';\n\ninterface ButtonButtonProps extends Partial<ButtonVariants>, ButtonHTMLAttributes<HTMLButtonElement> {\n\thref?: never;\n\t/** Reference to the button element. */\n\tref?: Ref<HTMLButtonElement>;\n\t/** Whether the button is in a loading state. */\n\tloading?: boolean;\n}\n\ninterface ButtonLinkProps\n\textends Partial<ButtonVariants>,\n\t\tOmit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href' | 'role'> {\n\t/** When provided, renders the button as a link. */\n\thref: string;\n\t/** Reference to the anchor element. */\n\tref?: Ref<HTMLAnchorElement>;\n\tloading?: never;\n\t/** Whether the button is disabled. */\n\tdisabled?: boolean;\n}\n\nexport type ButtonProps = ButtonButtonProps | ButtonLinkProps;\n\n/**\n * A versatile button component that can render as either a button or anchor element.\n * Supports loading states, various visual variants, and accessibility features.\n * \n * @example\n * ```tsx\n * // Regular button\n * <Button variant=\"primary\" onClick={() => save()}>Save</Button>\n * \n * // Loading state\n * <Button loading variant=\"primary\">Processing...</Button>\n * \n * // Link button\n * <Button href=\"/dashboard\" variant=\"secondary\">Go to Dashboard</Button>\n * ```\n */\nexport function Button({\n\tvariant = buttonDefaults.variant,\n\tsize,\n\trounded = buttonDefaults.rounded,\n\tloading,\n\tclassName,\n\t...rest\n}: ButtonProps) {\n\tlet adjustedSize: ButtonSize;\n\tif (variant === 'link' && !size) {\n\t\t// default links to fitted size\n\t\tadjustedSize = 'fitted';\n\t} else {\n\t\tadjustedSize = size || buttonDefaults.size;\n\t}\n\n\tconst baseClasses =\n\t\t'appearance-none focus:outline-none focus:ring not-disabled:hover:cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed transition-all';\n\n\tconst buttonClasses = join(\n\t\tbaseClasses,\n\t\tbuttonVariants[variant],\n\t\tsizeVariants[adjustedSize],\n\t\troundedVariants[rounded],\n\t\tloading && 'relative pointer-events-none',\n\t\tclassName\n\t);\n\n\tif (rest.href && !rest.disabled) {\n\t\treturn (\n\t\t\t<a\n\t\t\t\t{...rest}\n\t\t\t\trel={rest.rel ? rest.rel : rest.target === '_blank' ? 'noopener noreferrer' : undefined}\n\t\t\t\taria-label={rest['aria-label']}\n\t\t\t\taria-description={rest['aria-description']}\n\t\t\t\thref={rest.href}\n\t\t\t\tclassName={buttonClasses}\n\t\t\t>\n\t\t\t\t{rest.children}\n\t\t\t</a>\n\t\t);\n\t}\n\n\tconst buttonRest = rest as ButtonButtonProps; // necessary to cast to avoid TS complaining\n\tconst getButtonChildren = () => {\n\t\tif (!buttonRest.children) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (\n\t\t\ttypeof buttonRest.children === 'string' ||\n\t\t\ttypeof buttonRest.children === 'number' ||\n\t\t\ttypeof buttonRest.children === 'boolean'\n\t\t) {\n\t\t\treturn <span className={join(loading && 'invisible')}>{buttonRest.children}</span>;\n\t\t}\n\n\t\tconst clonedChildren = React.Children.map(buttonRest.children, (child, index) => {\n\t\t\tif (React.isValidElement(child)) {\n\t\t\t\tconst childrenProps = child.props as { className?: string };\n\t\t\t\treturn React.cloneElement(child, {\n\t\t\t\t\tkey: index,\n\t\t\t\t\tclassName: join(loading && 'invisible', childrenProps.className),\n\t\t\t\t} as Record<string, unknown>);\n\t\t\t}\n\t\t\treturn child;\n\t\t});\n\t\treturn clonedChildren;\n\t};\n\n\treturn (\n\t\t<button\n\t\t\t{...buttonRest}\n\t\t\taria-label={buttonRest['aria-label']}\n\t\t\taria-description={buttonRest['aria-description']}\n\t\t\taria-disabled={buttonRest.disabled || loading}\n\t\t\taria-busy={loading}\n\t\t\ttype={buttonRest.type ?? 'button'}\n\t\t\tclassName={buttonClasses}\n\t\t>\n\t\t\t{loading && <LoadingDots />}\n\t\t\t{getButtonChildren()}\n\t\t</button>\n\t);\n}\n","import { useCallback, useMemo, useState } from 'react';\n\nexport interface CalendarDateRange {\n\t/** The start date of the range, or null if not selected. */\n\tstart: Date | null;\n\t/** The end date of the range, or null if not selected. */\n\tend: Date | null;\n}\n\ninterface CalendarState {\n\tcurrentDate: Date;\n\tselectedDate: Date | null;\n\tselectedRange: CalendarDateRange | null;\n\tview: 'month' | 'week' | 'day';\n}\n\nexport interface UseCalendarOptions {\n\t/** The initial date to display and optionally select. */\n\tinitialDate?: Date;\n\t/** The selection mode - single date or date range selection. */\n\tmode?: 'single' | 'range';\n\t/** The minimum selectable date (dates before this will be disabled). */\n\tminDate?: Date;\n\t/** The maximum selectable date (dates after this will be disabled). */\n\tmaxDate?: Date;\n\t/** The calendar view to display. */\n\tview?: 'month' | 'week' | 'day';\n\t/** Callback fired when a date is selected in single mode. */\n\tonDateSelect?: (date: Date) => void;\n\t/** Callback fired when a date range is selected in range mode. */\n\tonRangeSelect?: (range: CalendarDateRange) => void;\n}\n\nexport function useCalendar(options: UseCalendarOptions = {}) {\n\tconst {\n\t\tinitialDate = new Date(),\n\t\tmode = 'single',\n\t\tminDate,\n\t\tmaxDate,\n\t\tview = 'month',\n\t\tonDateSelect,\n\t\tonRangeSelect,\n\t} = options;\n\n\tconst [state, setState] = useState<CalendarState>({\n\t\tcurrentDate: initialDate,\n\t\tselectedDate: mode === 'single' ? initialDate : null,\n\t\tselectedRange: mode === 'range' ? null : null,\n\t\tview,\n\t});\n\n\tconst isDateDisabled = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (minDate && date < minDate) return true;\n\t\t\tif (maxDate && date > maxDate) return true;\n\t\t\treturn false;\n\t\t},\n\t\t[minDate, maxDate]\n\t);\n\n\tconst selectDate = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (isDateDisabled(date)) return;\n\n\t\t\tif (mode === 'single') {\n\t\t\t\tsetState((prev) => ({ ...prev, selectedDate: date }));\n\t\t\t\tonDateSelect?.(date);\n\t\t\t} else if (mode === 'range') {\n\t\t\t\tsetState((prev) => {\n\t\t\t\t\tconst { selectedRange } = prev;\n\n\t\t\t\t\tif (!selectedRange?.start || (selectedRange.start && selectedRange.end)) {\n\t\t\t\t\t\t// Start new range\n\t\t\t\t\t\tconst newRange = { start: date, end: null };\n\t\t\t\t\t\tonRangeSelect?.(newRange);\n\t\t\t\t\t\treturn { ...prev, selectedRange: newRange };\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Complete range\n\t\t\t\t\t\tconst start = selectedRange.start;\n\t\t\t\t\t\tconst end = date;\n\t\t\t\t\t\tconst newRange = {\n\t\t\t\t\t\t\tstart: start < end ? start : end,\n\t\t\t\t\t\t\tend: start < end ? end : start,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tonRangeSelect?.(newRange);\n\t\t\t\t\t\treturn { ...prev, selectedRange: newRange };\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[mode, isDateDisabled, onDateSelect, onRangeSelect]\n\t);\n\n\tconst navigateMonth = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tif (direction === 'prev') {\n\t\t\t\tnewDate.setMonth(newDate.getMonth() - 1);\n\t\t\t} else {\n\t\t\t\tnewDate.setMonth(newDate.getMonth() + 1);\n\t\t\t}\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigateWeek = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tconst days = direction === 'prev' ? -7 : 7;\n\t\t\tnewDate.setDate(newDate.getDate() + days);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigateDay = useCallback((direction: 'prev' | 'next') => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tconst days = direction === 'prev' ? -1 : 1;\n\t\t\tnewDate.setDate(newDate.getDate() + days);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst navigate = useCallback(\n\t\t(direction: 'prev' | 'next') => {\n\t\t\tif (state.view === 'month') {\n\t\t\t\tnavigateMonth(direction);\n\t\t\t} else if (state.view === 'week') {\n\t\t\t\tnavigateWeek(direction);\n\t\t\t} else {\n\t\t\t\tnavigateDay(direction);\n\t\t\t}\n\t\t},\n\t\t[state.view, navigateMonth, navigateWeek, navigateDay]\n\t);\n\n\tconst changeView = useCallback((newView: 'month' | 'week' | 'day') => {\n\t\tsetState((prev) => ({ ...prev, view: newView }));\n\t}, []);\n\n\tconst goToDate = useCallback((date: Date) => {\n\t\tsetState((prev) => ({ ...prev, currentDate: date }));\n\t}, []);\n\n\tconst changeMonth = useCallback((month: number) => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tnewDate.setMonth(month);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst changeYear = useCallback((year: number) => {\n\t\tsetState((prev) => {\n\t\t\tconst newDate = new Date(prev.currentDate);\n\t\t\tnewDate.setFullYear(year);\n\t\t\treturn { ...prev, currentDate: newDate };\n\t\t});\n\t}, []);\n\n\tconst getDaysInView = useMemo(() => {\n\t\tconst { currentDate, view } = state;\n\t\tconst days: Date[] = [];\n\n\t\tif (view === 'month') {\n\t\t\t// Get first day of month\n\t\t\tconst firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);\n\n\t\t\t// Get first Sunday of calendar view\n\t\t\tconst startDate = new Date(firstDay);\n\t\t\tstartDate.setDate(startDate.getDate() - firstDay.getDay());\n\n\t\t\t// Generate 42 days (6 weeks)\n\t\t\tfor (let i = 0; i < 42; i++) {\n\t\t\t\tconst day = new Date(startDate);\n\t\t\t\tday.setDate(day.getDate() + i);\n\t\t\t\tdays.push(day);\n\t\t\t}\n\t\t} else if (view === 'week') {\n\t\t\t// Get start of week (Sunday)\n\t\t\tconst startOfWeek = new Date(currentDate);\n\t\t\tstartOfWeek.setDate(currentDate.getDate() - currentDate.getDay());\n\n\t\t\t// Generate 7 days\n\t\t\tfor (let i = 0; i < 7; i++) {\n\t\t\t\tconst day = new Date(startOfWeek);\n\t\t\t\tday.setDate(day.getDate() + i);\n\t\t\t\tdays.push(day);\n\t\t\t}\n\t\t} else {\n\t\t\t// Day view - just current date\n\t\t\tdays.push(new Date(currentDate));\n\t\t}\n\n\t\treturn days;\n\t}, [state]);\n\n\tconst isDateSelected = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'single') {\n\t\t\t\treturn state.selectedDate && date.toDateString() === state.selectedDate.toDateString();\n\t\t\t} else if (mode === 'range' && state.selectedRange) {\n\t\t\t\tconst { start, end } = state.selectedRange;\n\t\t\t\tif (start && end) {\n\t\t\t\t\treturn date >= start && date <= end;\n\t\t\t\t} else if (start) {\n\t\t\t\t\treturn date.toDateString() === start.toDateString();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedDate, state.selectedRange]\n\t);\n\n\tconst isDateInRange = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.start && state.selectedRange?.end) {\n\t\t\t\tconst { start, end } = state.selectedRange;\n\t\t\t\treturn date > start && date < end;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\tconst isDateRangeStart = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.start) {\n\t\t\t\treturn date.toDateString() === state.selectedRange.start.toDateString();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\tconst isDateRangeEnd = useCallback(\n\t\t(date: Date) => {\n\t\t\tif (mode === 'range' && state.selectedRange?.end) {\n\t\t\t\treturn date.toDateString() === state.selectedRange.end.toDateString();\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\t[mode, state.selectedRange]\n\t);\n\n\treturn {\n\t\t// State\n\t\tcurrentDate: state.currentDate,\n\t\tselectedDate: state.selectedDate,\n\t\tselectedRange: state.selectedRange,\n\t\tview: state.view,\n\n\t\t// Data\n\t\tdaysInView: getDaysInView,\n\n\t\t// Actions\n\t\tselectDate,\n\t\tnavigate,\n\t\tchangeView,\n\t\tgoToDate,\n\t\tchangeMonth,\n\t\tchangeYear,\n\n\t\t// Checkers\n\t\tisDateSelected,\n\t\tisDateDisabled,\n\t\tisDateInRange,\n\t\tisDateRangeStart,\n\t\tisDateRangeEnd,\n\t};\n}\n","export const calendarSizeVariants = {\n\tsmall: {\n\t\tcontainer: 'text-xs',\n\t\tcell: 'w-7 h-7 text-xs',\n\t\theader: 'text-sm px-2 py-1',\n\t\tnavigation: 'p-1',\n\t\tweekdays: 'text-xs px-1 py-1',\n\t},\n\tmedium: {\n\t\tcontainer: 'text-sm',\n\t\tcell: 'w-9 h-9 text-sm',\n\t\theader: 'text-base px-3 py-2',\n\t\tnavigation: 'p-2',\n\t\tweekdays: 'text-sm px-2 py-2',\n\t},\n\tlarge: {\n\t\tcontainer: 'text-base',\n\t\tcell: 'w-12 h-12 text-base',\n\t\theader: 'text-lg px-4 py-3',\n\t\tnavigation: 'p-3',\n\t\tweekdays: 'text-base px-3 py-2',\n\t},\n\tauto: {\n\t\tcontainer: 'w-full h-full',\n\t\tcell: 'flex-1 min-h-[2rem] text-sm',\n\t\theader: 'text-base px-3 py-2',\n\t\tnavigation: 'p-2',\n\t\tweekdays: 'text-sm px-2 py-2',\n\t},\n} as const;\n\nexport type CalendarSize = keyof typeof calendarSizeVariants;\n\nexport const calendarViewVariants = {\n\tmonth: 'grid-cols-7',\n\tweek: 'grid-cols-7',\n\tday: 'grid-cols-1',\n} as const;\n\nexport type CalendarView = keyof typeof calendarViewVariants;\n\nexport const calendarDefaults = {\n\tsize: 'medium' as CalendarSize,\n\tview: 'month' as CalendarView,\n} as const;\n","import { ReactNode, Ref } from 'react';\nimport { ChevronLeft, ChevronRight } from '../../symbols';\nimport { join } from '../../utils';\nimport { CalendarDateRange, useCalendar, UseCalendarOptions } from './hooks';\nimport { calendarDefaults, CalendarSize, calendarSizeVariants, calendarViewVariants } from './variants';\n\nexport interface CalendarCustomStyles {\n\t/** Custom CSS classes for the main calendar container. */\n\tcontainerClassName?: string;\n\t/** Custom CSS classes for the calendar header. */\n\theaderClassName?: string;\n\t/** Custom CSS classes for the navigation button container. */\n\tnavigationClassName?: string;\n\t/** Custom CSS classes for the previous navigation button. */\n\tprevButtonClassName?: string;\n\t/** Custom CSS classes for the next navigation button. */\n\tnextButtonClassName?: string;\n\t/** Custom CSS classes for the calendar title. */\n\ttitleClassName?: string;\n\t/** Custom CSS classes for the view selector buttons. */\n\tviewSelectorClassName?: string;\n\t/** Custom CSS classes for the month and year dropdown selectors. */\n\tmonthYearSelectorsClassName?: string;\n\t/** Custom CSS classes for the today button. */\n\ttodayButtonClassName?: string;\n\t/** Custom CSS classes for the weekdays header row. */\n\tweekdaysClassName?: string;\n\t/** Custom CSS classes for individual weekday cells. */\n\tweekdayClassName?: string;\n\t/** Custom CSS classes for the month view grid. */\n\tmonthGridClassName?: string;\n\t/** Custom CSS classes for the week view grid. */\n\tweekGridClassName?: string;\n\t/** Custom CSS classes for the day view grid. */\n\tdayGridClassName?: string;\n\t/** Custom CSS classes for date cells. */\n\tcellClassName?: string;\n\t/** Custom CSS classes for selected date cells. */\n\tselectedCellClassName?: string;\n\t/** Custom CSS classes for today's date cell. */\n\ttodayCellClassName?: string;\n\t/** Custom CSS classes for disabled date cells. */\n\tdisabledCellClassName?: string;\n\t/** Custom CSS classes for date cells within a selected range. */\n\trangeCellClassName?: string;\n\t/** Custom CSS classes for the start date of a selected range. */\n\trangeStartCellClassName?: string;\n\t/** Custom CSS classes for the end date of a selected range. */\n\trangeEndCellClassName?: string;\n}\n\nexport interface CalendarProps extends Omit<UseCalendarOptions, 'onDateSelect' | 'onRangeSelect'> {\n\t/** The HTML id attribute for the calendar. */\n\tid?: string;\n\t/** Reference to the calendar container element. */\n\tref?: Ref<HTMLDivElement>;\n\t/** Additional CSS classes to apply to the calendar container. */\n\tclassName?: string;\n\t/** The size of the calendar component. */\n\tsize?: CalendarSize;\n\t/** Object containing custom CSS classes for different calendar elements. */\n\tcustomStyles?: CalendarCustomStyles;\n\t/** Custom render function for date cells. */\n\trenderCell?: (date: Date, isSelected: boolean, isDisabled: boolean, isToday: boolean) => ReactNode;\n\t/** Whether to show the view selector buttons. */\n\tshowViewSelector?: boolean;\n\t/** Whether to show the navigation buttons. */\n\tshowNavigation?: boolean;\n\t/** Layout of navigation buttons - adjacent (both on left) or around (on sides of title). */\n\tnavigationLayout?: 'adjacent' | 'around';\n\t/** Whether to show month and year as dropdown selectors for easier navigation. */\n\tuseMonthYearSelector?: boolean;\n\t/** Whether to show a button to quickly jump to the current date. */\n\tshowTodayButton?: boolean;\n\t/** Callback fired when a date is selected in single mode. */\n\tonDateSelect?: (date: Date) => void;\n\t/** Callback fired when a date range is selected in range mode. */\n\tonRangeSelect?: (range: CalendarDateRange) => void;\n}\n\nconst WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MONTHS = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\nconst YEAR_RANGE = 100;\n\n/**\n * A full-featured calendar component supporting single date selection, date ranges, \n * and multiple view modes (month/week/day). Includes navigation, accessibility features,\n * and extensive customization options.\n * \n * @example\n * ```tsx\n * // Basic date picker\n * <Calendar\n * mode=\"single\"\n * onDateSelect={(date) => setSelectedDate(date)}\n * initialDate={new Date()}\n * />\n * \n * // Date range picker\n * <Calendar\n * mode=\"range\"\n * onRangeSelect={(range) => setDateRange(range)}\n * showTodayButton\n * />\n * \n * // Multi-view calendar\n * <Calendar\n * showViewSelector\n * useMonthYearSelector\n * navigationLayout=\"adjacent\"\n * />\n * ```\n */\nexport function Calendar({\n\tid,\n\tref,\n\tclassName,\n\tsize = calendarDefaults.size,\n\tcustomStyles = {},\n\tview = calendarDefaults.view,\n\tmode = 'single',\n\tinitialDate,\n\tminDate,\n\tmaxDate,\n\trenderCell,\n\tshowViewSelector = false,\n\tshowNavigation = true,\n\tnavigationLayout = 'around',\n\tuseMonthYearSelector = false,\n\tshowTodayButton = false,\n\tonDateSelect,\n\tonRangeSelect,\n\t...rest\n}: CalendarProps) {\n\tconst calendar = useCalendar({\n\t\tinitialDate,\n\t\tmode,\n\t\tminDate,\n\t\tmaxDate,\n\t\tview,\n\t\tonDateSelect,\n\t\tonRangeSelect,\n\t});\n\n\tconst sizeStyles = calendarSizeVariants[size];\n\tconst viewStyles = calendarViewVariants[calendar.view];\n\n\tconst isToday = (date: Date) => {\n\t\tconst today = new Date();\n\t\treturn date.toDateString() === today.toDateString();\n\t};\n\n\tconst isCurrentMonth = (date: Date) => {\n\t\treturn (\n\t\t\tdate.getMonth() === calendar.currentDate.getMonth() && date.getFullYear() === calendar.currentDate.getFullYear()\n\t\t);\n\t};\n\n\tconst goToToday = () => {\n\t\tcalendar.goToDate(new Date());\n\t};\n\n\tconst formatTitle = () => {\n\t\tconst { currentDate, view } = calendar;\n\t\tconst month = MONTHS[currentDate.getMonth()];\n\t\tconst year = currentDate.getFullYear();\n\n\t\tif (view === 'month') {\n\t\t\treturn `${month} ${year}`;\n\t\t}\n\n\t\tif (view === 'week') {\n\t\t\tconst startOfWeek = new Date(currentDate);\n\t\t\tstartOfWeek.setDate(currentDate.getDate() - currentDate.getDay());\n\t\t\tconst endOfWeek = new Date(startOfWeek);\n\t\t\tendOfWeek.setDate(endOfWeek.getDate() + 6);\n\n\t\t\tif (startOfWeek.getMonth() === endOfWeek.getMonth()) {\n\t\t\t\treturn `${month} ${startOfWeek.getDate()}-${endOfWeek.getDate()}, ${year}`;\n\t\t\t}\n\n\t\t\treturn `${MONTHS[startOfWeek.getMonth()]} ${startOfWeek.getDate()} - ${\n\t\t\t\tMONTHS[endOfWeek.getMonth()]\n\t\t\t} ${endOfWeek.getDate()}, ${year}`;\n\t\t}\n\n\t\treturn `${month} ${currentDate.getDate()}, ${year}`;\n\t};\n\n\tconst renderViewSelector = () => {\n\t\tif (!showViewSelector) return null;\n\n\t\treturn (\n\t\t\t<div className={viewSelectorClasses}>\n\t\t\t\t{(['month', 'week', 'day'] as const).map((viewOption) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={viewOption}\n\t\t\t\t\t\tonClick={() => calendar.changeView(viewOption)}\n\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t'px-2 py-1 rounded capitalize transition-colors',\n\t\t\t\t\t\t\tcalendar.view === viewOption ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/20'\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{viewOption}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderMonthYearSelector = () => {\n\t\tif (!useMonthYearSelector) return null;\n\n\t\tconst currentMonth = calendar.currentDate.getMonth();\n\t\tconst currentYear = calendar.currentDate.getFullYear();\n\n\t\t// Generate year options (current year ± YEAR_RANGE years)\n\t\tconst startYear = currentYear - YEAR_RANGE;\n\t\tconst endYear = currentYear + YEAR_RANGE;\n\t\tconst yearOptions = [];\n\t\tfor (let year = startYear; year <= endYear; year++) {\n\t\t\tyearOptions.push(year);\n\t\t}\n\n\t\tconst monthYearSelectorsClasses = join(\n\t\t\t'border border-border rounded px-2 py-1 text-sm focus:outline-none focus:border-accent focus:ring-2 focus:ring-accent/50',\n\t\t\tcustomStyles.monthYearSelectorsClassName\n\t\t);\n\t\treturn (\n\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t<select\n\t\t\t\t\tvalue={currentMonth}\n\t\t\t\t\tonChange={(e) => calendar.changeMonth(parseInt(e.target.value))}\n\t\t\t\t\tclassName={monthYearSelectorsClasses}\n\t\t\t\t>\n\t\t\t\t\t{MONTHS.map((month, index) => (\n\t\t\t\t\t\t<option key={month} value={index}>\n\t\t\t\t\t\t\t{month}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t\t<select\n\t\t\t\t\tvalue={currentYear}\n\t\t\t\t\tonChange={(e) => calendar.changeYear(parseInt(e.target.value))}\n\t\t\t\t\tclassName={monthYearSelectorsClasses}\n\t\t\t\t>\n\t\t\t\t\t{yearOptions.map((year) => (\n\t\t\t\t\t\t<option key={year} value={year}>\n\t\t\t\t\t\t\t{year}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderTodayButton = () => {\n\t\tif (!showTodayButton) return null;\n\n\t\tconst todayButtonClasses = join(\n\t\t\t'px-3 py-1 text-xs rounded border border-border hover:bg-accent/20 transition-colors focus:outline-none focus:ring focus:ring-accent/50',\n\t\t\tcustomStyles.todayButtonClassName\n\t\t);\n\n\t\treturn (\n\t\t\t<button onClick={goToToday} className={todayButtonClasses} aria-label='Go to today'>\n\t\t\t\tToday\n\t\t\t</button>\n\t\t);\n\t};\n\n\tconst renderDateCell = (date: Date) => {\n\t\tconst isSelected = calendar.isDateSelected(date);\n\t\tconst isDisabled = calendar.isDateDisabled(date);\n\t\tconst isTodayDate = isToday(date);\n\t\tconst isInRange = calendar.isDateInRange(date);\n\t\tconst isRangeStart = calendar.isDateRangeStart(date);\n\t\tconst isRangeEnd = calendar.isDateRangeEnd(date);\n\t\tconst isCurrentMonthDate = isCurrentMonth(date);\n\n\t\tconst baseCellClasses = join(\n\t\t\t'w-full flex items-center justify-center transition-colors cursor-pointer',\n\t\t\t'focus:outline-none',\n\t\t\tsizeStyles.cell\n\t\t);\n\n\t\tconst cellClasses = join(\n\t\t\t!isInRange && 'rounded-md',\n\t\t\t!isSelected && 'hover:bg-accent/20 focus:bg-accent/20',\n\t\t\tbaseCellClasses,\n\t\t\tcustomStyles.cellClassName,\n\t\t\t// Selection states\n\t\t\tisSelected && join('bg-accent text-accent-foreground', customStyles.selectedCellClassName),\n\t\t\t// Range states\n\t\t\tisInRange && join('bg-accent/30', customStyles.rangeCellClassName),\n\t\t\tisRangeStart && join('bg-accent text-accent-foreground rounded-r-none', customStyles.rangeStartCellClassName),\n\t\t\tisRangeEnd && join('bg-accent text-accent-foreground rounded-l-none', customStyles.rangeEndCellClassName),\n\t\t\t// Today\n\t\t\tisTodayDate && !isSelected && join('border border-accent', customStyles.todayCellClassName),\n\t\t\t// Disabled\n\t\t\tisDisabled && join('opacity-50 cursor-not-allowed hover:bg-transparent', customStyles.disabledCellClassName),\n\t\t\t// Month view: dim dates from other months\n\t\t\tcalendar.view === 'month' && !isCurrentMonthDate && 'text-muted-foreground/50'\n\t\t);\n\n\t\tconst cellContent = renderCell ? renderCell(date, !!isSelected, isDisabled, isTodayDate) : date.getDate();\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tkey={date.toISOString()}\n\t\t\t\tonClick={() => calendar.selectDate(date)}\n\t\t\t\tdisabled={isDisabled}\n\t\t\t\tclassName={cellClasses}\n\t\t\t\tdata-date={date.toISOString().split('T')[0]}\n\t\t\t\tdata-selected={!!isSelected}\n\t\t\t\tdata-disabled={isDisabled}\n\t\t\t\tdata-today={isTodayDate}\n\t\t\t\taria-label={`${date.getDate()} ${MONTHS[date.getMonth()]} ${date.getFullYear()}`}\n\t\t\t\taria-selected={!!isSelected}\n\t\t\t\taria-disabled={isDisabled}\n\t\t\t>\n\t\t\t\t{cellContent}\n\t\t\t</button>\n\t\t);\n\t};\n\n\tconst containerClasses = join(\n\t\t'bg-background border rounded-lg',\n\t\tsizeStyles.container,\n\t\tcustomStyles.containerClassName,\n\t\tclassName\n\t);\n\n\tconst headerClasses = join(\n\t\t'flex items-center border-b px-4 py-2',\n\t\tnavigationLayout === 'around' ? 'justify-between' : 'justify-between',\n\t\tsizeStyles.header,\n\t\tcustomStyles.headerClassName\n\t);\n\n\tconst navigationClasses = join('flex items-center gap-1', customStyles.navigationClassName);\n\n\tconst prevButtonClasses = join(\n\t\t'p-1 rounded hover:bg-accent/20 transition-colors',\n\t\tsizeStyles.navigation,\n\t\tcustomStyles.prevButtonClassName\n\t);\n\n\tconst nextButtonClasses = join(\n\t\t'p-1 rounded hover:bg-accent/20 transition-colors',\n\t\tsizeStyles.navigation,\n\t\tcustomStyles.nextButtonClassName\n\t);\n\n\tconst titleClasses = join('font-semibold text-foreground', customStyles.titleClassName);\n\n\tconst viewSelectorClasses = join('flex gap-1 text-xs', customStyles.viewSelectorClassName);\n\n\tconst weekdaysClasses = join(\n\t\t'grid grid-cols-7 border-b text-muted-foreground font-medium',\n\t\tsizeStyles.weekdays,\n\t\tcustomStyles.weekdaysClassName\n\t);\n\n\tconst weekdayClasses = join('text-center', customStyles.weekdayClassName);\n\n\tconst gridClasses = join(\n\t\t'grid gap-y-1 p-2',\n\t\tcalendar.view === 'month' && viewStyles,\n\t\tcalendar.view === 'week' && join(viewStyles, customStyles.weekGridClassName),\n\t\tcalendar.view === 'day' && join(viewStyles, customStyles.dayGridClassName),\n\t\tcalendar.view === 'month' && customStyles.monthGridClassName\n\t);\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={containerClasses}\n\t\t\tdata-size={size}\n\t\t\tdata-view={calendar.view}\n\t\t\tdata-mode={mode}\n\t\t\trole='application'\n\t\t\taria-label='Calendar'\n\t\t\t{...rest}\n\t\t>\n\t\t\t{/* Header */}\n\t\t\t<div className={headerClasses}>\n\t\t\t\t{/* Adjacent layout: nav buttons on left, title on right */}\n\t\t\t\t{navigationLayout === 'adjacent' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className='flex items-center gap-4'>\n\t\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t\t<div className={navigationClasses}>\n\t\t\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('prev')} className={prevButtonClasses} aria-label='Previous'>\n\t\t\t\t\t\t\t\t\t\t<ChevronLeft className='w-4 h-4' />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('next')} className={nextButtonClasses} aria-label='Next'>\n\t\t\t\t\t\t\t\t\t\t<ChevronRight className='w-4 h-4' />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className='flex items-center gap-3'>\n\t\t\t\t\t\t\t\t{!useMonthYearSelector && <h2 className={titleClasses}>{formatTitle()}</h2>}\n\t\t\t\t\t\t\t\t{renderMonthYearSelector()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t\t\t\t{renderViewSelector()}\n\t\t\t\t\t\t\t{renderTodayButton()}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{/* Around layout: nav buttons on sides, title in center */}\n\t\t\t\t{navigationLayout === 'around' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('prev')} className={prevButtonClasses} aria-label='Previous'>\n\t\t\t\t\t\t\t\t<ChevronLeft className='w-4 h-4' />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className='flex flex-col items-center gap-2'>\n\t\t\t\t\t\t\t<div className='flex items-center gap-3'>\n\t\t\t\t\t\t\t\t{!useMonthYearSelector && <h2 className={titleClasses}>{formatTitle()}</h2>}\n\t\t\t\t\t\t\t\t{renderMonthYearSelector()}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className='flex items-center gap-2'>\n\t\t\t\t\t\t\t\t{renderViewSelector()}\n\t\t\t\t\t\t\t\t{renderTodayButton()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{showNavigation && (\n\t\t\t\t\t\t\t<button onClick={() => calendar.navigate('next')} className={nextButtonClasses} aria-label='Next'>\n\t\t\t\t\t\t\t\t<ChevronRight className='w-4 h-4' />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Weekdays header for month and week views */}\n\t\t\t{(calendar.view === 'month' || calendar.view === 'week') && (\n\t\t\t\t<div className={weekdaysClasses}>\n\t\t\t\t\t{WEEKDAYS.map((day) => (\n\t\t\t\t\t\t<div key={day} className={weekdayClasses}>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Calendar grid */}\n\t\t\t{/* Key forces React to re-render the entire grid when month/year/view changes,\n\t\t\t\t\tpreventing flickering of previous month's dates with incorrect opacity during navigation */}\n\t\t\t<div\n\t\t\t\tkey={`${calendar.currentDate.getFullYear()}-${calendar.currentDate.getMonth()}-${calendar.view}`}\n\t\t\t\tclassName={gridClasses}\n\t\t\t>\n\t\t\t\t{calendar.daysInView.map((date) => renderDateCell(date))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","interface CalloutVariantStyles {\n border: string;\n interior: string;\n core: string; // used for icon, title, and close button\n description: string;\n}\n\nexport type CalloutVariants = 'base' | 'info' | 'destructive' | 'success' | 'warning';\n\nexport const CalloutVariants: Record<CalloutVariants, CalloutVariantStyles> = {\n info: {\n border: 'border-blue-600',\n interior: 'bg-blue-800/20',\n core: 'text-blue-400',\n description: 'text-blue-200',\n },\n destructive: {\n border: 'border-destructive',\n interior: 'bg-destructive/10',\n core: 'text-destructive',\n description: 'text-destructive',\n },\n success: {\n border: 'border-success',\n interior: 'bg-success/10',\n core: 'text-success',\n description: 'text-success',\n },\n warning: {\n border: 'border-yellow-700',\n interior: 'bg-yellow-800/20',\n core: 'text-yellow-400',\n description: 'text-yellow-200',\n },\n base: {\n border: '',\n interior: '',\n core: '',\n description: 'opacity-90',\n }\n};\n","import React, { useId, useState } from 'react';\nimport { CheckCircled, CrossCircled, DeepRing, ExclamationTriangle, InfoCircled, X } from '../../symbols';\nimport { join } from '../../utils';\nimport { CalloutVariants } from './variants';\n\nexport interface CalloutProps {\n\t/** The id of the callout element */\n\tid?: string;\n\t/** Reference to the callout element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The visual style variant of the callout */\n\tvariant?: CalloutVariants;\n\t/** Custom icon to display. Will use default icon if not provided. Pass null to hide the icon */\n\ticon?: string | React.ReactElement | null;\n\t/** Optional title for the callout */\n\ttitle?: React.ReactNode;\n\t/** The main content to display inside the callout */\n\tdescription?: React.ReactNode;\n\t/** Additional CSS classes to apply to the callout */\n\tclassName?: string;\n\t/** Whether the callout can be dismissed */\n\tdismissible?: boolean;\n\t/** Callback fired when the dismiss button is clicked */\n\tonDismiss?: () => void;\n}\n\nconst VariantIcons: Record<CalloutVariants, React.ReactNode> = {\n\tinfo: <InfoCircled size={22} />,\n\tdestructive: <CrossCircled size={22} />,\n\tsuccess: <CheckCircled size={22} />,\n\twarning: <ExclamationTriangle size={20} />,\n\tbase: <DeepRing size={22} />,\n};\n\n/**\n * A prominent notice component for displaying important information, alerts, or status messages.\n * Supports different visual variants with appropriate icons and dismissible functionality.\n * \n * @example\n * ```tsx\n * // Info callout\n * <Callout variant=\"info\" title=\"Tip\" description=\"Save your work frequently\" />\n * \n * // Warning with custom content\n * <Callout \n * variant=\"warning\" \n * title=\"Unsaved Changes\"\n * description={<>You have <strong>3 unsaved</strong> documents.</>}\n * dismissible\n * />\n * \n * // Success notification\n * <Callout variant=\"success\" description=\"Profile updated successfully!\" />\n * ```\n */\nexport function Callout({\n\tid,\n\tref,\n\tvariant = 'base',\n\ticon,\n\ttitle,\n\tdescription,\n\tclassName,\n\tdismissible = false,\n\tonDismiss,\n}: CalloutProps) {\n\tconst generatedId = useId();\n\tconst calloutId = id || `callout-${generatedId}`;\n\tconst [isDismissed, setIsDismissed] = useState(false);\n\tconst variantStyles = CalloutVariants[variant];\n\tconst variantIcon = VariantIcons[variant];\n\n\tconst handleDismiss = () => {\n\t\tsetIsDismissed(true);\n\t\tif (onDismiss) {\n\t\t\tonDismiss();\n\t\t}\n\t};\n\n\tif (isDismissed) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tid={calloutId}\n\t\t\tref={ref}\n\t\t\tclassName={join('relative rounded-lg p-2 sm:p-4 border', variantStyles.border, variantStyles.interior, className)}\n\t\t\tdata-variant={variant}\n\t\t\trole='note'\n\t\t\taria-describedby={description ? `${calloutId}-description` : undefined}\n\t\t\taria-labelledby={title ? `${calloutId}-title` : undefined}\n\t\t>\n\t\t\t<div className='flex items-start gap-x-2'>\n\t\t\t\t{icon !== null && <span className={variantStyles.core}>{icon === undefined ? variantIcon : icon}</span>}\n\t\t\t\t{(title || description) && (\n\t\t\t\t\t<div className='flex-1'>\n\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t<div id={`${calloutId}-title`} className={join('font-medium', variantStyles.core)}>\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t<div id={`${calloutId}-description`} className={join('mt-0.5 font-light', variantStyles.description)}>\n\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{dismissible && (\n\t\t\t\t<button\n\t\t\t\t\ttype='button'\n\t\t\t\t\tonClick={handleDismiss}\n\t\t\t\t\tdata-callout-close-button='true'\n\t\t\t\t\tclassName={join(\n\t\t\t\t\t\tvariantStyles.core,\n\t\t\t\t\t\t'rounded-md p-0.5 top-2.5 right-2.5 absolute focus:outline-none hover:ring focus:ring-2 focus:ring-current leading-0'\n\t\t\t\t\t)}\n\t\t\t\t\taria-label='Close callout'\n\t\t\t\t>\n\t\t\t\t\t<X size={18} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","interface CardVariantStyles {\n container: string;\n header: string;\n content: string;\n footer: string;\n paddingMulti: number;\n}\n\nexport type CardSize = 'sm' | 'md' | 'lg';\n\nexport const CardSizes: Record<CardSize, CardVariantStyles> = {\n sm: {\n container: 'text-sm',\n header: 'text-base font-medium',\n content: 'text-sm leading-relaxed',\n footer: 'text-xs',\n paddingMulti: 1 / 3,\n },\n md: {\n container: 'text-base',\n header: 'text-lg font-semibold',\n content: 'text-base leading-relaxed',\n footer: 'text-sm',\n paddingMulti: 1 / 2,\n },\n lg: {\n container: 'text-lg',\n header: 'text-xl font-bold',\n content: 'text-lg leading-relaxed',\n footer: 'text-base',\n paddingMulti: 1,\n },\n};","import { join } from '../../utils';\nimport { CardSize, CardSizes } from './variants';\n\nexport interface CardProps {\n\t/** The HTML id attribute for the card */\n\tid?: string;\n\t/** Additional CSS classes to apply to the card */\n\tclassName?: string;\n\t/** React ref for the card container */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The size variant of the card */\n\tsize?: CardSize;\n\t/** The amount of padding inside the card */\n\tpadding?: number;\n\t/** Content to display in the card header */\n\theader?: React.ReactNode;\n\t/** Content to display in the card footer */\n\tfooter?: React.ReactNode;\n\t/** The main content of the card */\n\tchildren?: React.ReactNode;\n\t/** Image source for the card */\n\timageSrc?: string;\n\t/** Alt text for the image */\n\timageAlt?: string;\n\t/** Custom image component */\n\timageComponent?: React.ReactNode;\n\t/** If true, the image will extend to the edges of the card, ignoring padding. Default is false. */\n\timageToEdge?: boolean;\n}\n\n/**\n * A flexible container component for displaying content in a structured format.\n * Supports headers, footers, images, and customizable padding with responsive design.\n * \n * @example\n * ```tsx\n * // Simple card\n * <Card header=\"Card Title\" size=\"lg\">\n * <p>Your content goes here</p>\n * </Card>\n * \n * // Card with image and footer\n * <Card \n * imageSrc=\"/photo.jpg\" \n * imageAlt=\"Product photo\"\n * header={<h3>Product Name</h3>}\n * footer={<Button>Buy Now</Button>}\n * >\n * Product description text here.\n * </Card>\n * ```\n */\nexport function Card({\n\tid,\n\tclassName,\n\tref,\n\tsize = 'md',\n\tpadding = 16,\n\theader,\n\tfooter,\n\tchildren,\n\timageSrc,\n\timageAlt,\n\timageComponent,\n\timageToEdge = true,\n\t...props\n}: CardProps) {\n\tconst sizeVariant = CardSizes[size];\n\tconst showImage = imageSrc || imageComponent;\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tdata-testid='card'\n\t\t\tdata-size={size}\n\t\t\tdata-padding={padding}\n\t\t\tclassName={join(\n\t\t\t\t// Base styles\n\t\t\t\t'border border-border rounded-lg shadow-sm overflow-hidden',\n\t\t\t\t// Responsive design\n\t\t\t\t'w-full max-w-full',\n\t\t\t\t// Size-specific styles\n\t\t\t\tsizeVariant.container,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Image Section */}\n\t\t\t{showImage && (\n\t\t\t\t<div\n\t\t\t\t\tstyle={imageToEdge ? undefined : { padding, paddingBottom: 0 }}\n\t\t\t\t\tclassName='w-full overflow-hidden'\n\t\t\t\t>\n\t\t\t\t\t{imageComponent ? (\n\t\t\t\t\t\timageComponent\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img src={imageSrc} alt={imageAlt || ''} className='w-full h-auto object-cover rounded-xs' loading='lazy' />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Card Content */}\n\t\t\t<div style={{ padding, rowGap: padding * sizeVariant.paddingMulti }} className='flex flex-col'>\n\t\t\t\t{/* Header */}\n\t\t\t\t{header && <div className={sizeVariant.header}>{header}</div>}\n\n\t\t\t\t{/* Main Content */}\n\t\t\t\t{children && <div className={sizeVariant.content}>{children}</div>}\n\n\t\t\t\t{/* Footer */}\n\t\t\t\t{footer && <div className={sizeVariant.footer}>{footer}</div>}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface UseCarouselProps {\n totalItems: number;\n itemsToShow: number;\n infinite: boolean;\n autoScroll: boolean;\n scrollInterval: number;\n pauseScrollOnHover: boolean;\n currentIndex?: number;\n onIndexChange?: (index: number) => void;\n}\n\nexport function useCarousel({\n totalItems,\n itemsToShow,\n infinite,\n autoScroll,\n scrollInterval,\n pauseScrollOnHover,\n currentIndex,\n onIndexChange,\n}: UseCarouselProps) {\n const [currentSlide, setCurrentSlide] = useState(currentIndex || 0);\n const [isHovered, setIsHovered] = useState(false);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const maxSlides = Math.ceil(totalItems / itemsToShow);\n const canGoPrev = infinite || currentSlide > 0;\n const canGoNext = infinite || currentSlide < maxSlides - 1;\n\n const goToSlide = useCallback(\n (index: number) => {\n const clampedIndex = Math.max(0, Math.min(index, maxSlides - 1));\n setCurrentSlide(clampedIndex);\n onIndexChange?.(clampedIndex);\n },\n [maxSlides, onIndexChange]\n );\n\n const goToPrev = useCallback(() => {\n if (canGoPrev) {\n const newIndex = currentSlide === 0 && infinite ? maxSlides - 1 : currentSlide - 1;\n goToSlide(newIndex);\n }\n }, [currentSlide, canGoPrev, infinite, maxSlides, goToSlide]);\n\n const goToNext = useCallback(() => {\n if (canGoNext) {\n const newIndex = currentSlide === maxSlides - 1 && infinite ? 0 : currentSlide + 1;\n goToSlide(newIndex);\n }\n }, [currentSlide, canGoNext, infinite, maxSlides, goToSlide]);\n\n // Handle controlled mode\n useEffect(() => {\n if (currentIndex !== undefined && currentIndex !== currentSlide) {\n setCurrentSlide(currentIndex);\n }\n }, [currentIndex, currentSlide]);\n\n // Auto scroll functionality\n useEffect(() => {\n if (!autoScroll) return;\n\n const startInterval = () => {\n intervalRef.current = setInterval(() => {\n if (pauseScrollOnHover && isHovered) return;\n\n goToNext();\n }, scrollInterval);\n };\n\n const stopInterval = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n\n if (!isHovered || !pauseScrollOnHover) {\n startInterval();\n } else {\n stopInterval();\n }\n\n return stopInterval;\n }, [autoScroll, scrollInterval, pauseScrollOnHover, isHovered, goToNext]);\n\n // Reset to first slide when # of items to show changes\n useEffect(() => {\n setCurrentSlide(0);\n }, [itemsToShow]);\n\n return {\n currentSlide,\n canGoPrev,\n canGoNext,\n goToPrev,\n goToNext,\n goToSlide,\n isHovered,\n setIsHovered,\n };\n}\n","export const buttonSizeVariants = {\n sm: {\n button: 'h-6 w-6 text-xs',\n icon: 'size-3',\n },\n md: {\n button: 'h-8 w-8 text-sm',\n icon: 'size-4',\n },\n lg: {\n button: 'h-10 w-10 text-lg',\n icon: 'size-5',\n },\n};\n\nexport type ButtonSize = keyof typeof buttonSizeVariants;\n\nexport const buttonStyleVariants = {\n default: 'bg-accent text-accent-foreground hover:bg-accent-foreground hover:text-accent',\n outline: 'border border-border bg-background hover:bg-accent hover:text-accent-foreground hover:border-accent',\n ghost: 'hover:text-accent',\n};\n\nexport type ButtonStyle = keyof typeof buttonStyleVariants;\n\nexport const buttonPositionVariants = {\n aligned: {\n prev: 'absolute top-1/2 -translate-x-1/2 -translate-y-1/2 z-10',\n next: 'absolute right-0 top-1/2 translate-x-1/2 -translate-y-1/2 z-10',\n },\n exterior: {\n prev: 'absolute -left-10 top-1/2 -translate-y-1/2 z-10',\n next: 'absolute -right-10 top-1/2 -translate-y-1/2 z-10',\n },\n interior: {\n prev: 'absolute left-2 top-1/2 -translate-y-1/2 z-10',\n next: 'absolute right-2 top-1/2 -translate-y-1/2 z-10',\n },\n};\n\nexport type ButtonPosition = keyof typeof buttonPositionVariants;\n","import React, { useCallback, useMemo, useRef } from 'react';\nimport { join } from '../../utils';\nimport { useCarousel } from './hooks';\nimport {\n ButtonPosition,\n buttonPositionVariants,\n ButtonSize,\n buttonSizeVariants,\n ButtonStyle,\n buttonStyleVariants,\n} from './variants';\nimport { ChevronLeft, ChevronRight } from '../../symbols';\nimport { ScreenSize, useScreenSize } from '../../hooks';\n\ninterface ButtonElementProps {\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n disabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n 'data-carousel-prev'?: string;\n 'data-carousel-next'?: string;\n}\n\nexport interface CarouselProps {\n children: React.ReactNode;\n id?: string;\n ref?: React.Ref<HTMLDivElement>;\n className?: string;\n /** Enable automatic scrolling */\n autoScroll?: boolean;\n /** Interval in milliseconds for auto scroll */\n scrollInterval?: number;\n /** Pause auto scroll on hover */\n pauseScrollOnHover?: boolean;\n /** Manually control the current index */\n currentIndex?: number;\n /** Callback when index changes */\n onIndexChange?: (index: number) => void;\n /** Hide previous/next navigation buttons */\n hidePrevNext?: boolean;\n /** Hide dot indicators */\n hideDots?: boolean;\n /** Number of items to show at once, or breakpoint object mapping screen sizes to item counts */\n itemsToShow?: number | Partial<Record<ScreenSize, number>>;\n /** Size variant for navigation buttons */\n buttonSize?: ButtonSize;\n /** Style variant for navigation buttons */\n buttonVariant?: ButtonStyle;\n /** Position of navigation buttons relative to carousel */\n buttonPosition?: ButtonPosition;\n /** Enable infinite scrolling */\n infinite?: boolean;\n /** Custom previous button content */\n prevButton?: React.ReactNode;\n /** Custom next button content */\n nextButton?: React.ReactNode;\n /** Additional class names for carousel items */\n itemsClassName?: string;\n /** Additional class names for the carousel container */\n containerClassName?: string;\n /** Additional class names for the dot indicators */\n dotsClassName?: string;\n /** Gap between carousel items in pixels */\n gap?: number;\n}\n\n/**\n * A responsive carousel component for displaying multiple items in a sliding interface.\n * Supports auto-scroll, infinite looping, responsive breakpoints, and extensive customization.\n * \n * @example\n * ```tsx\n * // Basic carousel\n * <Carousel itemsToShow={3} autoScroll infinite>\n * <div>Slide 1</div>\n * <div>Slide 2</div>\n * <div>Slide 3</div>\n * </Carousel>\n * \n * // Responsive carousel with breakpoints\n * <Carousel \n * itemsToShow={{ xs: 1, md: 2, lg: 3 }}\n * gap={16}\n * buttonPosition=\"aligned\"\n * >\n * {products.map(product => <ProductCard key={product.id} {...product} />)}\n * </Carousel>\n * ```\n */\nexport function Carousel({\n children,\n id,\n ref,\n className,\n autoScroll = false,\n scrollInterval = 3000,\n pauseScrollOnHover = true,\n currentIndex,\n onIndexChange,\n hidePrevNext = false,\n hideDots = false,\n itemsToShow = 1,\n buttonSize = 'md',\n buttonVariant = 'default',\n buttonPosition = 'exterior',\n infinite = true,\n prevButton,\n nextButton,\n itemsClassName,\n containerClassName,\n dotsClassName,\n gap = 8,\n}: CarouselProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const childrenArray = React.Children.toArray(children).filter(React.isValidElement);\n const totalItems = childrenArray.length;\n const { screenSize } = useScreenSize();\n\n // Resolve the current itemsToShow based on screen size or use the number value\n const currentItemsToShow = useMemo(() => {\n if (typeof itemsToShow === 'number') {\n return itemsToShow;\n }\n\n if (typeof itemsToShow === 'object' && itemsToShow && screenSize) {\n // Start from current screen size and work down to find a defined value\n const breakpointOrder: Array<ScreenSize> = ['2xl', 'xl', 'lg', 'md', 'sm', 'xs'];\n const currentIndex = breakpointOrder.indexOf(screenSize);\n\n for (let i = currentIndex; i < breakpointOrder.length; i++) {\n const breakpoint = breakpointOrder[i];\n if (itemsToShow[breakpoint] !== undefined) {\n return itemsToShow[breakpoint]!;\n }\n }\n }\n\n return 1; // Default fallback\n }, [itemsToShow, screenSize]);\n\n const { currentSlide, canGoPrev, canGoNext, goToPrev, goToNext, goToSlide, setIsHovered } = useCarousel({\n totalItems,\n itemsToShow: currentItemsToShow,\n infinite,\n autoScroll,\n scrollInterval,\n pauseScrollOnHover,\n currentIndex,\n onIndexChange,\n });\n\n const getSlideItemStyles = useCallback(\n (pos: number) => {\n // If only showing one item\n if (currentItemsToShow === 1) {\n return { leftWidth: 0, rightWidth: 0, widthReduction: 0 };\n }\n\n const widthReduction = (gap * (currentItemsToShow - 1)) / currentItemsToShow;\n // If item is first element of a slide\n if (pos % currentItemsToShow === 0) {\n return { leftWidth: 0, rightWidth: gap / 2, widthReduction };\n }\n\n // If item is last element of a slide\n if (pos % currentItemsToShow === currentItemsToShow - 1) {\n return { leftWidth: gap / 2, rightWidth: 0, widthReduction };\n }\n\n // If item is a middle element of a slide\n return { leftWidth: gap / 2, rightWidth: gap / 2, widthReduction };\n },\n [currentItemsToShow, gap]\n );\n\n const handlePrevClick = () => {\n goToPrev();\n };\n\n const handleNextClick = () => {\n goToNext();\n };\n\n const handleMouseEnter = () => {\n if (pauseScrollOnHover) {\n setIsHovered(true);\n }\n };\n\n const handleMouseLeave = () => {\n if (pauseScrollOnHover) {\n setIsHovered(false);\n }\n };\n\n const translateX = -(currentSlide * (100 / totalItems) * currentItemsToShow);\n\n // Base styles for carousel buttons\n const baseButtonStyles = join(\n 'inline-flex items-center justify-center rounded-md font-medium transition-all focus-visible:outline-none focus-visible:ring focus-visible:ring-ring disabled:pointer-events-none',\n buttonPosition === 'aligned' ? 'disabled:opacity-90' : 'disabled:opacity-50'\n );\n\n return (\n <div className={join('relative', className)} data-carousel-wrapper='true'>\n {/* Navigation Buttons - Previous */}\n {!hidePrevNext && (\n <>\n {prevButton ? (\n React.cloneElement(\n prevButton as React.ReactElement,\n {\n onClick: handlePrevClick,\n disabled: !canGoPrev,\n className: join(\n (prevButton as React.ReactElement<{ className?: string }>).props?.className || '',\n buttonPositionVariants[buttonPosition].prev\n ),\n role: 'button',\n 'aria-disabled': !canGoPrev,\n 'aria-label': 'Previous slide',\n 'data-carousel-prev': 'true',\n } as ButtonElementProps\n )\n ) : (\n <button\n type='button'\n onClick={handlePrevClick}\n disabled={!canGoPrev}\n className={join(\n baseButtonStyles,\n buttonSizeVariants[buttonSize].button,\n buttonStyleVariants[buttonVariant],\n buttonPositionVariants[buttonPosition].prev\n )}\n aria-disabled={!canGoPrev}\n aria-label='Previous slide'\n data-carousel-prev='true'\n >\n <ChevronLeft className={buttonSizeVariants[buttonSize].icon} />\n </button>\n )}\n </>\n )}\n\n <div\n id={id}\n ref={ref}\n className={join('relative overflow-hidden', containerClassName)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n data-carousel='true'\n data-current-index={currentSlide}\n data-items-to-show={currentItemsToShow}\n data-auto-scroll={autoScroll}\n data-button-position={buttonPosition}\n >\n {/* Carousel Track */}\n <div\n ref={containerRef}\n className='flex transition-transform duration-300 ease-in-out'\n style={{\n transform: `translateX(${translateX}%)`,\n width: `${(totalItems / currentItemsToShow) * 100}%`,\n }}\n >\n {childrenArray.map((child, index) => {\n const { leftWidth, rightWidth, widthReduction } = getSlideItemStyles(index);\n return (\n <div\n key={index}\n className={join('flex-shrink-0', itemsClassName)}\n style={{\n width: `calc(${100 / totalItems}% - ${widthReduction}px)`,\n marginRight: rightWidth > 0 ? `${rightWidth}px` : undefined,\n marginLeft: leftWidth > 0 ? `${leftWidth}px` : undefined,\n }}\n data-slide-index={index}\n >\n {child}\n </div>\n );\n })}\n </div>\n\n {/* Dots Indicator */}\n {!hideDots && (\n <div className='absolute bottom-4 left-1/2 -translate-x-1/2 flex space-x-2'>\n {Array.from({ length: Math.ceil(totalItems / currentItemsToShow) }).map((_, index) => (\n <button\n key={index}\n type='button'\n onClick={() => goToSlide(index)}\n className={join(\n 'w-2 h-2 rounded-full transition-colors duration-200',\n index === currentSlide ? 'bg-accent' : 'bg-muted hover:bg-muted-foreground/50',\n dotsClassName\n )}\n aria-label={`Go to slide ${index + 1}`}\n data-carousel-dot={index}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Navigation Buttons - Next */}\n {!hidePrevNext && (\n <>\n {nextButton ? (\n React.cloneElement(\n nextButton as React.ReactElement,\n {\n onClick: handleNextClick,\n disabled: !canGoNext,\n className: join(\n (nextButton as React.ReactElement<{ className?: string }>).props?.className || '',\n buttonPositionVariants[buttonPosition].next\n ),\n role: 'button',\n 'aria-disabled': !canGoNext,\n 'aria-label': 'Next slide',\n 'data-carousel-next': 'true',\n } as ButtonElementProps\n )\n ) : (\n <button\n type='button'\n onClick={handleNextClick}\n disabled={!canGoNext}\n className={join(\n baseButtonStyles,\n buttonSizeVariants[buttonSize].button,\n buttonStyleVariants[buttonVariant],\n buttonPositionVariants[buttonPosition].next\n )}\n aria-disabled={!canGoNext}\n aria-label='Next slide'\n data-carousel-next='true'\n >\n <ChevronRight className={buttonSizeVariants[buttonSize].icon} />\n </button>\n )}\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useFilledBackgroundColor(id: string) {\n const [filledBackgroundColor, setFilledBackgroundColor] = useState<string>('');\n\n const getFirstNonTransparentBackgroundColor = useCallback((element: Element | null): string => {\n let currentElement = element;\n let color = '';\n while (currentElement && !color) {\n const backgroundColor = window.getComputedStyle(currentElement).backgroundColor;\n if (backgroundColor && backgroundColor !== 'transparent' && backgroundColor !== 'rgba(0, 0, 0, 0)') {\n color = backgroundColor;\n }\n currentElement = currentElement.parentElement;\n }\n return color || 'transparent';\n }, []);\n\n useEffect(() => {\n const checkbox = document.getElementById(id);\n if (checkbox) {\n const backgroundColor = getFirstNonTransparentBackgroundColor(checkbox.parentElement);\n setFilledBackgroundColor(backgroundColor);\n }\n }, [id, getFirstNonTransparentBackgroundColor]);\n\n return filledBackgroundColor;\n}\n","import React, { Ref, useEffect, useId, useMemo, useState } from 'react';\nimport { Check, Dash } from '../../symbols';\nimport { join } from '../../utils';\nimport { useFilledBackgroundColor } from './hooks';\n\nexport interface CheckboxProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n\t/** Reference to the checkbox element. */\n\tref?: Ref<HTMLButtonElement>;\n\t/** The size of the checkbox in pixels. */\n\tsize?: number;\n\t/** CSS color value or Tailwind class for the checkbox color. */\n\tcolor?: string; // can be adjusted with tailwindcss by using `text-<color>`\n\t/** Whether to fill the checkbox background when checked. */\n\tfilled?: boolean;\n\t/** Whether the checkbox should have rounded corners. */\n\trounded?: boolean;\n\t/** Whether the checkbox is checked (controlled). */\n\tchecked?: boolean;\n\t/** Whether the checkbox is in an indeterminate state. */\n\tindeterminate?: boolean;\n\t/** Callback fired when the checkbox state changes. */\n\tonCheckedChange?: (checked: boolean) => void;\n\t/** The display style of the checkbox. */\n\tdisplay?: 'inline' | 'block';\n}\n\n/**\n * A customizable checkbox component with support for checked, unchecked, and indeterminate states.\n * Provides keyboard navigation and accessibility features with flexible styling options.\n * \n * @example\n * ```tsx\n * // Basic checkbox\n * <Checkbox \n * checked={isChecked}\n * onCheckedChange={setIsChecked}\n * />\n * \n * // Styled checkbox\n * <Checkbox\n * size={24}\n * color=\"blue\"\n * filled\n * rounded={false}\n * onCheckedChange={(checked) => console.log(checked)}\n * />\n * \n * // Indeterminate state\n * <Checkbox indeterminate onCheckedChange={handleSelection} />\n * ```\n */\nexport function Checkbox({\n\tref,\n\tid,\n\tsize = 20,\n\tcolor,\n\tfilled = false,\n\trounded = true,\n\tchecked = false,\n\tindeterminate = false,\n\tonCheckedChange,\n\tdisabled,\n\tclassName = '',\n\tdisplay = 'inline',\n\t...props\n}: CheckboxProps) {\n\tconst generatedId = useId();\n\tconst checkboxId = useMemo(() => id || `checkbox-${generatedId}`, [id, generatedId]);\n\tconst parentBackgroundColor = useFilledBackgroundColor(checkboxId);\n\tconst [isChecked, setIsChecked] = useState(checked);\n\tconst [isIndeterminate, setIsIndeterminate] = useState(indeterminate);\n\n\tuseEffect(() => {\n\t\tsetIsChecked(checked);\n\t}, [checked]);\n\n\tuseEffect(() => {\n\t\tsetIsIndeterminate(indeterminate);\n\t}, [indeterminate]);\n\n\tconst handleChange = () => {\n\t\tif (!disabled) {\n\t\t\t// When indeterminate, clicking should make it checked\n\t\t\t// When checked, clicking should make it unchecked\n\t\t\t// When unchecked, clicking should make it checked\n\t\t\tconst newChecked = isIndeterminate ? true : !isChecked;\n\t\t\tsetIsChecked(newChecked);\n\t\t\tsetIsIndeterminate(false); // Clear indeterminate state on user interaction\n\t\t\tonCheckedChange?.(newChecked);\n\t\t}\n\t};\n\n\tconst handleOnKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\thandleChange();\n\t\t}\n\t};\n\n\tconst checkboxClasses = join(\n\t\t'items-center justify-center border outline outline-transparent focus:outline-current focus:outline-offset-2',\n\t\tdisplay === 'inline' ? 'inline-flex' : 'flex',\n\t\trounded && 'rounded',\n\t\tdisabled && 'opacity-40 cursor-not-allowed',\n\t\t!disabled && 'cursor-pointer',\n\t\tclassName\n\t);\n\n\treturn (\n\t\t<button\n\t\t\tid={checkboxId}\n\t\t\ttype='button'\n\t\t\tref={ref}\n\t\t\ttabIndex={0}\n\t\t\trole='checkbox'\n\t\t\tonClick={handleChange}\n\t\t\taria-checked={isIndeterminate ? 'mixed' : isChecked}\n\t\t\taria-disabled={disabled}\n\t\t\tonKeyDownCapture={handleOnKeyDown}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: size,\n\t\t\t\tcolor: color,\n\t\t\t\tbackgroundColor: (isChecked || isIndeterminate) && filled ? 'currentcolor' : 'transparent',\n\t\t\t}}\n\t\t\tclassName={checkboxClasses}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isIndeterminate ? (\n\t\t\t\t<Dash size={size} color={filled ? parentBackgroundColor : undefined} />\n\t\t\t) : (\n\t\t\t\t<Check\n\t\t\t\t\tsize={size}\n\t\t\t\t\tcolor={filled ? parentBackgroundColor : undefined}\n\t\t\t\t\tclassName={isChecked ? 'opacity-100' : 'opacity-0'}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</button>\n\t);\n}\n","import { join } from '../../utils';\n\nexport interface ClickableProps extends Omit<React.HTMLProps<HTMLDivElement>, 'onClick'> {\n /** The content to make clickable. */\n children: React.ReactNode;\n /** URL for link functionality. When provided, renders an anchor element. */\n linkTo?: React.HTMLProps<HTMLAnchorElement>['href'];\n /** Additional props to pass to the anchor element when using linkTo. */\n linkProps?: Omit<React.HTMLProps<HTMLAnchorElement>, 'href'>;\n /** Click handler for button functionality. Ignored when linkTo is provided. */\n onButtonClick?: React.HTMLProps<HTMLButtonElement>['onClick'];\n /** Additional props to pass to the button element when using onButtonClick. */\n buttonProps?: Omit<React.HTMLProps<HTMLButtonElement>, 'onClick'>;\n}\n\n/**\n * A wrapper component that makes any content clickable by overlaying an invisible button or link.\n * Preserves the visual layout while adding interaction behavior.\n * \n * @example\n * ```tsx\n * // Make a card clickable as a link\n * <Clickable linkTo=\"/product/123\">\n * <Card>\n * <h3>Product Title</h3>\n * <p>Product description</p>\n * </Card>\n * </Clickable>\n * \n * // Make content clickable as a button\n * <Clickable onButtonClick={() => openModal()}>\n * <div className=\"flex items-center gap-2\">\n * <Icon />\n * <span>Click me</span>\n * </div>\n * </Clickable>\n * ```\n */\nexport function Clickable({\n children,\n className,\n linkTo,\n linkProps,\n onButtonClick,\n buttonProps,\n ...props\n}: ClickableProps) {\n if (linkTo && onButtonClick) {\n console.warn('Clickable: Both \"linkTo\" and \"onButtonClick\" props are provided. Only \"linkTo\" will be used.');\n }\n\n return (\n <div className={join('relative w-fit', className)} {...props}>\n {children}\n\n {/* Link */}\n {linkTo && (\n <a\n {...linkProps}\n rel={linkProps?.rel || 'noreferrer'}\n href={linkTo}\n className={join('absolute inset-0', linkProps?.className)}\n />\n )}\n\n {/* Button */}\n {!linkTo && onButtonClick && (\n <button\n {...buttonProps}\n type='button'\n onClick={onButtonClick}\n className={join('absolute inset-0 cursor-pointer', buttonProps?.className)}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\ninterface FontMetrics {\n fontSize: number;\n lineHeight: number;\n smallerFontSize: number;\n smallerLineHeight: number;\n}\n\nexport function useFontMetrics(id: string): FontMetrics | null {\n const [metrics, setMetrics] = useState<FontMetrics | null>(null);\n\n useEffect(() => {\n const element = document.getElementById(id)?.parentElement;\n if (!element) return;\n\n const computeMetrics = () => {\n const computed = window.getComputedStyle(element);\n const fontSize = parseFloat(computed.fontSize);\n\n const lineHeight =\n computed.lineHeight === 'normal'\n ? fontSize * 1.2 // browser default approximation\n : parseFloat(computed.lineHeight);\n\n const smallerFontSize = fontSize - 2; // 2px smaller (accounts for vertical padding)\n const scale = smallerFontSize / fontSize;\n const smallerLineHeight = lineHeight * scale;\n\n setMetrics({\n fontSize,\n lineHeight,\n smallerFontSize,\n smallerLineHeight,\n });\n };\n\n computeMetrics();\n\n // Observe layout-affecting changes (i.e. breakpoint changes)\n const resizeObserver = new ResizeObserver(computeMetrics);\n resizeObserver.observe(element);\n\n // Observe inline style / class changes\n const mutationObserver = new MutationObserver(computeMetrics);\n mutationObserver.observe(element, {\n attributes: true,\n attributeFilter: ['style', 'class'],\n subtree: false,\n });\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [id]);\n\n return metrics;\n}\n","export const codeVariants = {\n base: '',\n modest: 'opacity-90 bg-muted/10',\n accent: 'text-accent bg-muted/10',\n current: 'text-current bg-current/10',\n};\n\nexport type CodeVariant = keyof typeof codeVariants;\n","import React, { useId } from 'react';\nimport { join } from '../../utils';\nimport { useFontMetrics } from './hooks';\nimport { CodeVariant, codeVariants } from './variants';\n\nexport interface CodeProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {\n /** Unique identifier for the code element. */\n id?: string;\n /** Reference to the code element. */\n ref?: React.Ref<HTMLElement>;\n /** The code content to display. */\n content: string;\n /** The visual style variant of the code. */\n variant?: CodeVariant;\n}\n\n/**\n * An inline code component for displaying short code snippets within text.\n * Automatically adjusts font metrics and provides different visual variants.\n * \n * @example\n * ```tsx\n * // Basic inline code\n * <p>Use the <Code content=\"useState\" /> hook for state management.</p>\n * \n * // Different variants\n * <Code content=\"const foo = 'bar'\" variant=\"muted\" />\n * <Code content=\"npm install react\" variant=\"accent\" />\n * ```\n */\nexport function Code({ id, ref, content, variant = 'accent', className, style, ...props }: CodeProps) {\n const generatedId = useId();\n const codeId = id || `code-${generatedId}`;\n const fontMetrics = useFontMetrics(codeId);\n\n return (\n <code\n id={codeId}\n ref={ref}\n className={join('px-2 py-1 rounded', codeVariants[variant], className)}\n data-variant={variant}\n style={{\n fontSize: fontMetrics ? `${fontMetrics.smallerFontSize}px` : undefined,\n lineHeight: fontMetrics ? `${fontMetrics.smallerLineHeight}px` : undefined,\n ...style,\n }}\n {...props}\n >\n {content}\n </code>\n );\n}\n","import { BashTokenClasses, CSSTokenClasses, JsonTokenClasses, MarkdownTokenClasses, TSTokenClasses } from './types';\n\nexport const defaultBashTokenClasses: BashTokenClasses = {\n keyword: 'text-rose-400',\n runner: 'text-amber-400',\n comment: 'text-gray-500/80',\n command: 'text-gray-100',\n variable: 'text-blue-400',\n string: 'text-white/70',\n option: 'text-purple-400',\n plain: 'text-gray-200',\n operator: 'text-pink-500',\n substitution: 'text-green-300',\n};\n\nexport const defaultCSSTokenClasses: CSSTokenClasses = {\n selector: 'text-blue-400 font-medium',\n property: 'text-purple-400',\n value: 'text-green-400',\n punctuation: 'text-gray-400',\n atRule: 'text-pink-400 font-semibold',\n comment: 'text-gray-500 italic',\n string: 'text-green-400',\n number: 'text-green-400',\n plain: 'text-gray-100',\n function: 'text-cyan-400',\n};\n\nexport const defaultJsonTokenClasses: JsonTokenClasses = {\n key: 'text-purple-400 font-semibold',\n string: 'text-green-400',\n number: 'text-orange-400 font-medium',\n boolean: 'text-cyan-400 font-medium',\n punctuation: 'text-gray-400',\n plain: 'text-gray-100',\n};\n\nexport const defaultMarkdownTokenClasses: MarkdownTokenClasses = {\n heading: 'text-blue-400 font-bold',\n 'heading-hash': 'text-gray-500',\n bold: 'text-white font-bold',\n italic: 'text-white italic',\n 'bold-marker': 'text-gray-400',\n 'italic-marker': 'text-gray-400',\n link: 'text-blue-400 underline',\n 'link-text': 'text-blue-400',\n 'link-url': 'text-green-400',\n 'link-bracket': 'text-gray-400',\n 'link-paren': 'text-gray-400',\n code: 'text-pink-400 bg-gray-800 px-1 rounded text-sm',\n 'code-marker': 'text-gray-500',\n 'code-block': 'text-green-400',\n 'code-block-marker': 'text-gray-500',\n 'list-marker': 'text-orange-400 font-medium',\n 'list-item': 'text-gray-200',\n blockquote: 'text-gray-300 italic',\n 'blockquote-marker': 'text-gray-500',\n plain: 'text-gray-200',\n};\n\nexport const defaultTSTokenClasses: TSTokenClasses = {\n keyword: 'text-purple-400 font-semibold',\n type: 'text-cyan-400 font-medium',\n string: 'text-green-400',\n 'jsx-bracket': 'text-gray-400',\n 'jsx-tag': 'text-blue-400 font-medium',\n 'jsx-attribute': 'text-amber-400',\n 'jsx-brace': 'text-yellow-400',\n jsx: 'text-blue-400 font-medium', // fallback for old jsx type\n property: 'text-amber-400',\n number: 'text-orange-400 font-medium',\n comment: 'text-gray-500 italic',\n function: 'text-rose-400 font-semibold',\n hook: 'text-rose-400 font-semibold',\n operator: 'text-gray-300',\n plain: 'text-gray-100',\n};\n","// Bash\nexport const BASH_KEYWORDS = new Set([\n 'for',\n 'in',\n 'do',\n 'done',\n 'else',\n 'if',\n 'fi',\n 'then',\n 'while',\n 'until',\n 'case',\n 'esac',\n]);\nexport const BASH_RUNNERS = new Set(['npm', 'npx', 'pnpm', 'yarn', 'vite']);\n","import { BASH_KEYWORDS, BASH_RUNNERS } from './constants';\nimport { BashTokenType, CSSTokenClasses, JsonTokenClasses, MarkdownTokenType, TSTokenType } from './types';\n\n/**\n * Parse template literal content, treating everything as string except ${} expressions\n */\nfunction parseTemplateLiteral(input: string): { tokens: Array<{ text: string; type: TSTokenType }>; consumed: number } {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet pos = 0;\n\n\t// Add opening backtick\n\ttokens.push({ text: '`', type: 'string' });\n\tpos = 1;\n\n\twhile (pos < input.length) {\n\t\tconst char = input[pos];\n\n\t\t// End of template literal\n\t\tif (char === '`') {\n\t\t\ttokens.push({ text: '`', type: 'string' });\n\t\t\tpos++;\n\t\t\tbreak;\n\t\t}\n\n\t\t// Template expression ${...}\n\t\tif (char === '$' && pos + 1 < input.length && input[pos + 1] === '{') {\n\t\t\t// Add ${ as string markers\n\t\t\ttokens.push({ text: '${', type: 'string' });\n\t\t\tpos += 2;\n\n\t\t\t// Find the matching closing brace\n\t\t\tlet braceDepth = 1;\n\t\t\tconst exprStart = pos;\n\t\t\twhile (pos < input.length && braceDepth > 0) {\n\t\t\t\tif (input[pos] === '{') {\n\t\t\t\t\tbraceDepth++;\n\t\t\t\t} else if (input[pos] === '}') {\n\t\t\t\t\tbraceDepth--;\n\t\t\t\t}\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (braceDepth === 0) {\n\t\t\t\t// Parse the expression inside ${} as regular TypeScript\n\t\t\t\tconst expression = input.slice(exprStart, pos);\n\t\t\t\tif (expression.trim().length > 0) {\n\t\t\t\t\tconst exprTokens = tokenizeTypeScript(expression, false, 0);\n\t\t\t\t\ttokens.push(...exprTokens);\n\t\t\t\t}\n\n\t\t\t\t// Add closing brace\n\t\t\t\ttokens.push({ text: '}', type: 'string' });\n\t\t\t\tpos++;\n\t\t\t} else {\n\t\t\t\t// Unmatched braces, treat as string\n\t\t\t\ttokens.push({ text: input.slice(exprStart, pos), type: 'string' });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular string content - collect until we hit $ or `\n\t\tconst stringStart = pos;\n\t\twhile (\n\t\t\tpos < input.length &&\n\t\t\tinput[pos] !== '`' &&\n\t\t\t!(input[pos] === '$' && pos + 1 < input.length && input[pos + 1] === '{')\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\n\t\tif (pos > stringStart) {\n\t\t\ttokens.push({ text: input.slice(stringStart, pos), type: 'string' });\n\t\t}\n\t}\n\n\treturn { tokens, consumed: pos };\n}\n\n/**\n * Parse template literal continuation (when we start mid-template from previous line)\n */\nfunction parseTemplateLiteralContinuation(input: string): { tokens: Array<{ text: string; type: TSTokenType }> } {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet pos = 0;\n\n\twhile (pos < input.length) {\n\t\tconst char = input[pos];\n\n\t\t// End of template literal\n\t\tif (char === '`') {\n\t\t\ttokens.push({ text: '`', type: 'string' });\n\t\t\tpos++;\n\n\t\t\t// After closing backtick, continue parsing normally\n\t\t\tif (pos < input.length) {\n\t\t\t\tconst remainingTokens = tokenizeTypeScript(input.slice(pos), false, 0, false);\n\t\t\t\ttokens.push(...remainingTokens);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Template expression ${...}\n\t\tif (char === '$' && pos + 1 < input.length && input[pos + 1] === '{') {\n\t\t\t// Add ${ as string markers\n\t\t\ttokens.push({ text: '${', type: 'string' });\n\t\t\tpos += 2;\n\n\t\t\t// Find the matching closing brace\n\t\t\tlet braceDepth = 1;\n\t\t\tconst exprStart = pos;\n\t\t\twhile (pos < input.length && braceDepth > 0) {\n\t\t\t\tif (input[pos] === '{') {\n\t\t\t\t\tbraceDepth++;\n\t\t\t\t} else if (input[pos] === '}') {\n\t\t\t\t\tbraceDepth--;\n\t\t\t\t}\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tpos++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (braceDepth === 0) {\n\t\t\t\t// Parse the expression inside ${} as regular TypeScript\n\t\t\t\tconst expression = input.slice(exprStart, pos);\n\t\t\t\tif (expression.trim().length > 0) {\n\t\t\t\t\tconst exprTokens = tokenizeTypeScript(expression, false, 0, false);\n\t\t\t\t\ttokens.push(...exprTokens);\n\t\t\t\t}\n\n\t\t\t\t// Add closing brace\n\t\t\t\ttokens.push({ text: '}', type: 'string' });\n\t\t\t\tpos++;\n\t\t\t} else {\n\t\t\t\t// Unmatched braces, treat as string\n\t\t\t\ttokens.push({ text: input.slice(exprStart), type: 'string' });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular string content - collect until we hit $ or `\n\t\tconst stringStart = pos;\n\t\twhile (\n\t\t\tpos < input.length &&\n\t\t\tinput[pos] !== '`' &&\n\t\t\t!(input[pos] === '$' && pos + 1 < input.length && input[pos + 1] === '{')\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\n\t\tif (pos > stringStart) {\n\t\t\ttokens.push({ text: input.slice(stringStart, pos), type: 'string' });\n\t\t}\n\t}\n\n\treturn { tokens };\n}\n\nexport function tokenizeBash(codeLine: string): { text: string; type: BashTokenType }[] {\n\tconst tokens: { text: string; type: BashTokenType }[] = [];\n\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn tokens;\n\t}\n\n\tif (codeLine.trim().startsWith('#')) {\n\t\ttokens.push({ text: codeLine, type: 'comment' });\n\t\treturn tokens;\n\t}\n\n\tconst regex =\n\t\t/(\\$\\([^)]*\\)|\"[^\"]*\"|'[^']*'|\\$[\\w_]+|[a-zA-Z_]\\w*=|--?[a-zA-Z0-9][\\w-]*(?:=.*)?|>>|>|#.*|\\s+|[^\\s]+)/g;\n\n\tconst processToken = (token: string): { text: string; type: BashTokenType }[] => {\n\t\t// Handle command substitution recursively\n\t\tif (/^\\$\\([^)]*\\)$/.test(token)) {\n\t\t\tconst inner = token.slice(2, -1);\n\t\t\treturn [{ text: '$(', type: 'operator' }, ...tokenizeBash(inner), { text: ')', type: 'operator' }];\n\t\t}\n\n\t\t// Handle double-quoted strings with variables inside\n\t\tif (/^\".*\"$/.test(token)) {\n\t\t\tconst inner = token.slice(1, -1);\n\t\t\tconst innerTokens: { text: string; type: BashTokenType }[] = [];\n\t\t\tlet lastIndex = 0;\n\t\t\tconst varRegex = /\\$[\\w_]+/g;\n\t\t\tlet match;\n\t\t\twhile ((match = varRegex.exec(inner)) !== null) {\n\t\t\t\tif (match.index > lastIndex) {\n\t\t\t\t\tinnerTokens.push({\n\t\t\t\t\t\ttext: inner.slice(lastIndex, match.index),\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tinnerTokens.push({ text: match[0], type: 'variable' });\n\t\t\t\tlastIndex = match.index + match[0].length;\n\t\t\t}\n\t\t\tif (lastIndex < inner.length) {\n\t\t\t\tinnerTokens.push({ text: inner.slice(lastIndex), type: 'string' });\n\t\t\t}\n\t\t\treturn [{ text: '\"', type: 'string' }, ...innerTokens, { text: '\"', type: 'string' }];\n\t\t}\n\n\t\t// Single-quoted strings are literal\n\t\tif (/^'.*'$/.test(token)) {\n\t\t\treturn [{ text: token, type: 'string' }];\n\t\t}\n\n\t\tif (/^\\$[\\w_]+$/.test(token)) return [{ text: token, type: 'variable' }];\n\t\tif (/^[a-zA-Z_]\\w*=$/.test(token)) return [{ text: token, type: 'variable' }];\n\t\tif (/^--?[a-zA-Z0-9][\\w-]*(=.*)?$/.test(token)) return [{ text: token, type: 'option' }];\n\t\tif (/^>>|>$/.test(token)) return [{ text: token, type: 'operator' }];\n\t\tif (/^#.*$/.test(token)) return [{ text: token, type: 'comment' }];\n\t\tif (/^\\s+$/.test(token)) return [{ text: token, type: 'plain' }];\n\t\tif (BASH_KEYWORDS.has(token)) return [{ text: token, type: 'keyword' }];\n\t\tif (BASH_RUNNERS.has(token)) return [{ text: token, type: 'runner' }];\n\t\treturn [{ text: token, type: 'command' }];\n\t};\n\n\tlet match;\n\twhile ((match = regex.exec(codeLine)) !== null) {\n\t\ttokens.push(...processToken(match[0]));\n\t}\n\n\treturn tokens;\n}\n\nexport function tokenizeCSS(codeLine: string, isInComment: boolean = false) {\n\tconst tokens: Array<{ text: string; type: keyof CSSTokenClasses }> = [];\n\tlet inMultilineComment = isInComment;\n\n\t// Preserve empty lines as a non-breaking space\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn { tokens, inComment: inMultilineComment };\n\t}\n\n\t// Context tracking - initialize based on line content\n\tlet context: 'selector' | 'property' | 'value' = 'selector';\n\tlet braceDepth = 0;\n\n\t// If line starts with whitespace and has a colon, likely a property declaration\n\tif (codeLine.match(/^\\s+/) && codeLine.includes(':') && !codeLine.includes('{')) {\n\t\tcontext = 'property';\n\t\tbraceDepth = 1; // Assume we're inside a rule block\n\t}\n\n\tconst regex =\n\t\t/(\\/\\*[\\s\\S]*?\\*\\/|\\/\\*[\\s\\S]*$|\\*\\/)|(@[a-zA-Z-]+)|(\\{|\\}|:|;|,|\\(|\\))|(\"(?:[^\"]*)\"|'(?:[^']*)')|([a-zA-Z-]+)(?=\\()|([0-9.]+(?:px|rem|em|%|vh|vw|deg|s|ms|fr)?)|(#[a-fA-F0-9]{3,8})|([a-zA-Z0-9_-]+|[.#][a-zA-Z0-9_-]+)|(\\s+)|(\\S+)/g;\n\n\tlet match;\n\twhile ((match = regex.exec(codeLine))) {\n\t\tconst [, comment, atRule, punctuation, str, func, number, hexColor, identifier, whitespace, plain] = match;\n\n\t\tif (comment) {\n\t\t\t// Handle multiline comments\n\t\t\tif (comment.includes('/*') && !comment.includes('*/')) {\n\t\t\t\tinMultilineComment = true;\n\t\t\t} else if (comment.includes('*/')) {\n\t\t\t\tinMultilineComment = false;\n\t\t\t}\n\t\t\ttokens.push({ text: comment, type: 'comment' });\n\t\t} else if (inMultilineComment) {\n\t\t\t// Everything is a comment until we see */\n\t\t\tif (match[0].includes('*/')) {\n\t\t\t\tinMultilineComment = false;\n\t\t\t}\n\t\t\ttokens.push({ text: match[0], type: 'comment' });\n\t\t} else if (atRule) {\n\t\t\ttokens.push({ text: atRule, type: 'atRule' });\n\t\t} else if (func) {\n\t\t\ttokens.push({ text: func, type: 'function' });\n\t\t} else if (punctuation) {\n\t\t\tif (punctuation === '{') {\n\t\t\t\tbraceDepth++;\n\t\t\t\tcontext = 'property';\n\t\t\t} else if (punctuation === '}') {\n\t\t\t\tbraceDepth--;\n\t\t\t\tcontext = braceDepth > 0 ? 'property' : 'selector';\n\t\t\t} else if (punctuation === ':') {\n\t\t\t\t// Only switch to value context if we're currently in property context\n\t\t\t\tif (context === 'property') {\n\t\t\t\t\tcontext = 'value';\n\t\t\t\t}\n\t\t\t} else if (punctuation === ';') {\n\t\t\t\tif (braceDepth > 0) {\n\t\t\t\t\tcontext = 'property';\n\t\t\t\t}\n\t\t\t} else if (punctuation === ',') {\n\t\t\t\t// Comma in selector context or value context - maintain current context\n\t\t\t\tif (braceDepth === 0) {\n\t\t\t\t\tcontext = 'selector';\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push({ text: punctuation, type: 'punctuation' });\n\t\t} else if (str) {\n\t\t\ttokens.push({ text: str, type: 'string' });\n\t\t} else if (number) {\n\t\t\ttokens.push({ text: number, type: 'number' });\n\t\t} else if (hexColor) {\n\t\t\ttokens.push({ text: hexColor, type: 'value' });\n\t\t} else if (identifier) {\n\t\t\tlet tokenType: keyof CSSTokenClasses;\n\n\t\t\t// Special handling for selectors (class/id prefixes)\n\t\t\tif (identifier.startsWith('.') || identifier.startsWith('#')) {\n\t\t\t\ttokenType = 'selector';\n\t\t\t} else if (context === 'selector') {\n\t\t\t\ttokenType = 'selector';\n\t\t\t} else if (context === 'property') {\n\t\t\t\ttokenType = 'property';\n\t\t\t} else {\n\t\t\t\t// context === 'value'\n\t\t\t\ttokenType = 'value';\n\t\t\t}\n\n\t\t\ttokens.push({ text: identifier, type: tokenType });\n\t\t} else if (whitespace) {\n\t\t\ttokens.push({ text: whitespace.replace(/ /g, '\\u00A0'), type: 'plain' });\n\t\t} else if (plain) {\n\t\t\t// Default unknown tokens to value if we're in value context, otherwise plain\n\t\t\tconst type = context === 'value' ? 'value' : 'plain';\n\t\t\ttokens.push({ text: plain, type });\n\t\t}\n\t}\n\n\treturn { tokens, inComment: inMultilineComment };\n}\n\nexport function tokenizeJSON(codeLine: string) {\n\tconst regex = /(\"[^\"]*\")\\s*(:)|(\"[^\"]*\")|(\\d+)|(true|false|null)|(\\{|\\}|\\[|\\]|,)/g;\n\tconst tokens: { text: string; type: keyof JsonTokenClasses }[] = [];\n\tlet lastIndex = 0;\n\tlet match;\n\twhile ((match = regex.exec(codeLine)) !== null) {\n\t\tif (match.index > lastIndex) {\n\t\t\ttokens.push({ text: codeLine.slice(lastIndex, match.index), type: 'plain' });\n\t\t}\n\t\tif (match[1] && match[2]) {\n\t\t\ttokens.push({ text: match[1], type: 'key' });\n\t\t\ttokens.push({ text: match[2], type: 'punctuation' });\n\t\t} else if (match[3]) {\n\t\t\ttokens.push({ text: match[3], type: 'string' });\n\t\t} else if (match[4]) {\n\t\t\ttokens.push({ text: match[4], type: 'number' });\n\t\t} else if (match[5]) {\n\t\t\ttokens.push({ text: match[5], type: 'boolean' });\n\t\t} else if (match[6]) {\n\t\t\ttokens.push({ text: match[6], type: 'punctuation' });\n\t\t}\n\t\tlastIndex = regex.lastIndex;\n\t}\n\tif (lastIndex < codeLine.length) {\n\t\ttokens.push({ text: codeLine.slice(lastIndex), type: 'plain' });\n\t}\n\treturn tokens;\n}\n\nexport function tokenizeTypeScript(\n\tcodeLine: string,\n\tinheritedJSXContext: boolean = false,\n\tinheritedBraceDepth: number = 0,\n\tinTemplateLiteral: boolean = false\n) {\n\tconst tokens: Array<{ text: string; type: TSTokenType }> = [];\n\tlet remaining = codeLine;\n\tlet isInJSX = inheritedJSXContext;\n\tlet jsxBraceDepth = inheritedBraceDepth; // Track JSX expression depth\n\n\t// If we start in a template literal, treat the entire line as template literal content\n\tif (inTemplateLiteral) {\n\t\tconst templateResult = parseTemplateLiteralContinuation(remaining);\n\t\ttokens.push(...templateResult.tokens);\n\t\treturn tokens;\n\t}\n\n\twhile (remaining.length > 0) {\n\t\t// Multi-line comments\n\t\tconst multiComment = remaining.match(/^\\/\\*[\\s\\S]*?\\*\\//);\n\t\tif (multiComment) {\n\t\t\ttokens.push({ text: multiComment[0], type: 'comment' });\n\t\t\tremaining = remaining.slice(multiComment[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Single line comments\n\t\tconst singleComment = remaining.match(/^\\/\\/.*$/m);\n\t\tif (singleComment) {\n\t\t\ttokens.push({ text: singleComment[0], type: 'comment' });\n\t\t\tremaining = remaining.slice(singleComment[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Template literals (backticks) - handle interpolation\n\t\tconst templateLiteralMatch = remaining.match(/^`/);\n\t\tif (templateLiteralMatch) {\n\t\t\tconst templateResult = parseTemplateLiteral(remaining);\n\t\t\ttokens.push(...templateResult.tokens);\n\t\t\tremaining = remaining.slice(templateResult.consumed);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Regular strings (double and single quotes)\n\t\tconst stringMatch = remaining.match(/^(\"[^\"]*\"|'[^']*')/);\n\t\tif (stringMatch) {\n\t\t\ttokens.push({ text: stringMatch[0], type: 'string' });\n\t\t\tremaining = remaining.slice(stringMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX opening tag start\n\t\tconst jsxOpenStart = remaining.match(/^<([a-zA-Z][a-zA-Z0-9]*)/);\n\t\tif (jsxOpenStart) {\n\t\t\ttokens.push({ text: '<', type: 'jsx-bracket' });\n\t\t\ttokens.push({ text: jsxOpenStart[1], type: 'jsx-tag' });\n\t\t\tremaining = remaining.slice(jsxOpenStart[0].length);\n\t\t\tisInJSX = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX closing tag\n\t\tconst jsxClose = remaining.match(/^<\\/([a-zA-Z][a-zA-Z0-9]*)>/);\n\t\tif (jsxClose) {\n\t\t\ttokens.push({ text: '</', type: 'jsx-bracket' });\n\t\t\ttokens.push({ text: jsxClose[1], type: 'jsx-tag' });\n\t\t\ttokens.push({ text: '>', type: 'jsx-bracket' });\n\t\t\tremaining = remaining.slice(jsxClose[0].length);\n\t\t\tisInJSX = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX self-closing or tag end\n\t\tif (remaining.match(/^\\/?>/)) {\n\t\t\tconst tagEnd = remaining.match(/^(\\/?>\\s*)/);\n\t\t\tif (tagEnd) {\n\t\t\t\ttokens.push({ text: tagEnd[1].trim(), type: 'jsx-bracket' });\n\t\t\t\tremaining = remaining.slice(tagEnd[1].length);\n\t\t\t\tif (tagEnd[1].includes('>')) {\n\t\t\t\t\tisInJSX = false;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// JSX attribute (only when explicitly in JSX context, followed by =, and not inside braces)\n\t\tconst jsxAttr = remaining.match(/^([a-zA-Z][a-zA-Z0-9]*)(\\s*)(=)/);\n\t\tif (jsxAttr && isInJSX && jsxBraceDepth === 0) {\n\t\t\ttokens.push({ text: jsxAttr[1], type: 'jsx-attribute' });\n\t\t\tif (jsxAttr[2]) {\n\t\t\t\t// Whitespace before =\n\t\t\t\ttokens.push({ text: jsxAttr[2], type: 'plain' });\n\t\t\t}\n\t\t\ttokens.push({ text: '=', type: 'plain' });\n\t\t\tremaining = remaining.slice(jsxAttr[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// JSX expression braces\n\t\tconst jsxBrace = remaining.match(/^[{}]/);\n\t\tif (jsxBrace) {\n\t\t\ttokens.push({ text: jsxBrace[0], type: 'jsx-brace' });\n\t\t\tif (jsxBrace[0] === '{') {\n\t\t\t\tjsxBraceDepth++;\n\t\t\t} else if (jsxBrace[0] === '}') {\n\t\t\t\tjsxBraceDepth--;\n\t\t\t}\n\t\t\tremaining = remaining.slice(1);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Whitespace (preserve spaces)\n\t\tconst whitespace = remaining.match(/^\\s+/);\n\t\tif (whitespace) {\n\t\t\ttokens.push({ text: whitespace[0], type: 'plain' });\n\t\t\tremaining = remaining.slice(whitespace[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Operators (including arrow functions)\n\t\tconst operator = remaining.match(/^(=>|===|!==|==|!=|<=|>=|&&|\\|\\||[+\\-*/%=<>!&|^~?:;,()[\\]{}.])/);\n\t\tif (operator) {\n\t\t\ttokens.push({ text: operator[0], type: 'operator' });\n\t\t\tremaining = remaining.slice(operator[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Keywords\n\t\tconst keyword = remaining.match(\n\t\t\t/^(const|let|var|function|if|else|for|while|return|import|export|class|extends|interface|type|enum|async|await|public|private|protected|static|from|as|default|new|this|super|try|catch|finally|throw|break|continue|switch|case|typeof|instanceof)\\b/\n\t\t);\n\t\tif (keyword) {\n\t\t\ttokens.push({ text: keyword[0], type: 'keyword' });\n\t\t\tremaining = remaining.slice(keyword[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// React hooks (before function calls to avoid conflicts)\n\t\tconst hook = remaining.match(/^(use[A-Z][a-zA-Z]*)\\b/);\n\t\tif (hook) {\n\t\t\ttokens.push({ text: hook[0], type: 'hook' });\n\t\t\tremaining = remaining.slice(hook[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Function calls (word followed by opening parenthesis or optional chaining)\n\t\tconst func = remaining.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=(\\?\\.)?\\()/);\n\t\tif (func) {\n\t\t\ttokens.push({ text: func[1], type: 'function' });\n\t\t\tremaining = remaining.slice(func[1].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Types\n\t\tconst type = remaining.match(\n\t\t\t/^(string|number|boolean|object|any|void|never|unknown|null|undefined|Promise|Array|React\\.FC|FC|JSX\\.Element|HTMLElement|Event|MouseEvent|KeyboardEvent|ChangeEvent)\\b/\n\t\t);\n\t\tif (type) {\n\t\t\ttokens.push({ text: type[0], type: 'type' });\n\t\t\tremaining = remaining.slice(type[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Numbers\n\t\tconst number = remaining.match(/^(\\d+\\.?\\d*)/);\n\t\tif (number) {\n\t\t\ttokens.push({ text: number[0], type: 'number' });\n\t\t\tremaining = remaining.slice(number[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Object properties (word followed by colon, not in JSX)\n\t\tconst property = remaining.match(/^([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*(?=:)/);\n\t\tif (property && !isInJSX) {\n\t\t\ttokens.push({ text: property[1], type: 'property' });\n\t\t\tremaining = remaining.slice(property[1].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If nothing matched, take one character as plain text\n\t\ttokens.push({ text: remaining[0], type: 'plain' });\n\t\tremaining = remaining.slice(1);\n\t}\n\n\treturn tokens;\n}\n\nexport function tokenizeMarkdown(codeLine: string): { text: string; type: MarkdownTokenType }[] {\n\tconst tokens: { text: string; type: MarkdownTokenType }[] = [];\n\n\t// Preserve empty lines as a non-breaking space\n\tif (codeLine.trim() === '') {\n\t\ttokens.push({ text: '\\u00A0', type: 'plain' });\n\t\treturn tokens;\n\t}\n\n\tconst remaining = codeLine;\n\n\t// Headers (# ## ### etc.)\n\tconst headerMatch = remaining.match(/^(#{1,6})\\s*(.*)$/);\n\tif (headerMatch) {\n\t\ttokens.push({ text: headerMatch[1], type: 'heading-hash' });\n\t\tif (headerMatch[2]) {\n\t\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\t\ttokens.push({ text: headerMatch[2], type: 'heading' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Blockquote\n\tconst blockquoteMatch = remaining.match(/^(>\\s*)(.*)$/);\n\tif (blockquoteMatch) {\n\t\ttokens.push({ text: blockquoteMatch[1], type: 'blockquote-marker' });\n\t\tif (blockquoteMatch[2]) {\n\t\t\ttokens.push({ text: blockquoteMatch[2], type: 'blockquote' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// List items (- * + or numbered)\n\tconst listMatch = remaining.match(/^(\\s*)([-*+]|\\d+\\.)\\s*(.*)$/);\n\tif (listMatch) {\n\t\tif (listMatch[1]) tokens.push({ text: listMatch[1], type: 'plain' });\n\t\ttokens.push({ text: listMatch[2], type: 'list-marker' });\n\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\tif (listMatch[3]) {\n\t\t\t// Parse the rest of the line for inline formatting\n\t\t\tparseInlineMarkdown(listMatch[3], tokens);\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Code blocks (```language)\n\tconst codeBlockMatch = remaining.match(/^(```)\\s*(.*)$/);\n\tif (codeBlockMatch) {\n\t\ttokens.push({ text: codeBlockMatch[1], type: 'code-block-marker' });\n\t\tif (codeBlockMatch[2]) {\n\t\t\ttokens.push({ text: ' ', type: 'plain' });\n\t\t\ttokens.push({ text: codeBlockMatch[2], type: 'code-block' });\n\t\t}\n\t\treturn tokens;\n\t}\n\n\t// Regular line - parse for inline formatting\n\tparseInlineMarkdown(remaining, tokens);\n\treturn tokens;\n}\n\nfunction parseInlineMarkdown(text: string, tokens: { text: string; type: MarkdownTokenType }[]) {\n\tlet remaining = text;\n\n\twhile (remaining.length > 0) {\n\t\t// Links [text](url)\n\t\tconst linkMatch = remaining.match(/^(\\[)([^\\]]*?)(\\])(\\()([^)]*?)(\\))/);\n\t\tif (linkMatch) {\n\t\t\ttokens.push({ text: linkMatch[1], type: 'link-bracket' });\n\t\t\ttokens.push({ text: linkMatch[2], type: 'link-text' });\n\t\t\ttokens.push({ text: linkMatch[3], type: 'link-bracket' });\n\t\t\ttokens.push({ text: linkMatch[4], type: 'link-paren' });\n\t\t\ttokens.push({ text: linkMatch[5], type: 'link-url' });\n\t\t\ttokens.push({ text: linkMatch[6], type: 'link-paren' });\n\t\t\tremaining = remaining.slice(linkMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Inline code `code`\n\t\tconst codeMatch = remaining.match(/^(`+)([^`]*?)\\1/);\n\t\tif (codeMatch) {\n\t\t\ttokens.push({ text: codeMatch[1], type: 'code-marker' });\n\t\t\ttokens.push({ text: codeMatch[2], type: 'code' });\n\t\t\ttokens.push({ text: codeMatch[1], type: 'code-marker' });\n\t\t\tremaining = remaining.slice(codeMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Bold **text** or __text__\n\t\tconst boldMatch = remaining.match(/^(\\*\\*|__)([^*_]*?)\\1/);\n\t\tif (boldMatch) {\n\t\t\ttokens.push({ text: boldMatch[1], type: 'bold-marker' });\n\t\t\ttokens.push({ text: boldMatch[2], type: 'bold' });\n\t\t\ttokens.push({ text: boldMatch[1], type: 'bold-marker' });\n\t\t\tremaining = remaining.slice(boldMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Italic *text* or _text_\n\t\tconst italicMatch = remaining.match(/^(\\*|_)([^*_]*?)\\1/);\n\t\tif (italicMatch) {\n\t\t\ttokens.push({ text: italicMatch[1], type: 'italic-marker' });\n\t\t\ttokens.push({ text: italicMatch[2], type: 'italic' });\n\t\t\ttokens.push({ text: italicMatch[1], type: 'italic-marker' });\n\t\t\tremaining = remaining.slice(italicMatch[0].length);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If no special formatting, take one character as plain text\n\t\ttokens.push({ text: remaining[0], type: 'plain' });\n\t\tremaining = remaining.slice(1);\n\t}\n}\n","import {\n\tdefaultBashTokenClasses,\n\tdefaultCSSTokenClasses,\n\tdefaultJsonTokenClasses,\n\tdefaultMarkdownTokenClasses,\n\tdefaultTSTokenClasses,\n} from './classes';\nimport { tokenizeBash, tokenizeCSS, tokenizeJSON, tokenizeMarkdown, tokenizeTypeScript } from './tokenize';\nimport {\n\tBashTokenClasses,\n\tCSSTokenClasses,\n\tJsonTokenClasses,\n\tMarkdownTokenClasses,\n\tTSTokenClasses,\n\tTSTokenType,\n} from './types';\n\nexport function formatBash(codeLines: string[], customTokenClasses?: BashTokenClasses) {\n\tconst mergedTokenClasses = {\n\t\t...defaultBashTokenClasses,\n\t\t...customTokenClasses,\n\t};\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\tconst tokens = tokenizeBash(line);\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token, tokenIndex) => (\n\t\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t\t{token.text}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatCSS(codeLines: string[], customTokenClasses?: CSSTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultCSSTokenClasses, ...customTokenClasses };\n\n\tlet inMultilineComment = false;\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\tconst { tokens, inComment } = tokenizeCSS(line, inMultilineComment);\n\t\tinMultilineComment = inComment;\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token, tokenIndex) => (\n\t\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t\t{token.text}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatJson(codeLines: string[], customTokenClasses?: JsonTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultJsonTokenClasses, ...customTokenClasses };\n\n\treturn codeLines.map((line, lineIndex) => (\n\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t{tokenizeJSON(line).map((token, tokenIndex) => (\n\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t{token.text}\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</div>\n\t));\n}\n\nexport function formatTypescript(codeLines: string[], customTokenClasses?: TSTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultTSTokenClasses, ...customTokenClasses };\n\n\tlet globalJSXContext = false; // Track JSX context across lines\n\tlet globalBraceDepth = 0; // Track JSX expression depth across lines\n\tlet inTemplateLiteral = false; // Track template literal context across lines\n\n\treturn codeLines.map((line, lineIndex) => {\n\t\t// Handle empty lines by adding a non-breaking space\n\t\tif (line.trim() === '') {\n\t\t\treturn (\n\t\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t\t&nbsp;\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tconst tokens = tokenizeTypeScript(line, globalJSXContext, globalBraceDepth, inTemplateLiteral);\n\n\t\t// Update template literal context\n\t\tconst backtickCount = (line.match(/`/g) || []).length;\n\t\tif (backtickCount % 2 === 1) {\n\t\t\tinTemplateLiteral = !inTemplateLiteral;\n\t\t}\n\n\t\t// Update global JSX context based on this line's content\n\t\tif (line.includes('<') && line.match(/<[a-zA-Z]/)) {\n\t\t\tglobalJSXContext = true;\n\t\t}\n\t\tif (line.includes('>') && !line.includes('<')) {\n\t\t\tglobalJSXContext = false;\n\t\t\tglobalBraceDepth = 0; // Reset brace depth when exiting JSX\n\t\t}\n\n\t\t// Update global brace depth\n\t\tconst openBraces = (line.match(/\\{/g) || []).length;\n\t\tconst closeBraces = (line.match(/\\}/g) || []).length;\n\t\tglobalBraceDepth += openBraces - closeBraces;\n\t\tif (globalBraceDepth < 0) globalBraceDepth = 0;\n\n\t\treturn (\n\t\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t\t{tokens.map((token: { text: string; type: TSTokenType }, tokenIndex: number) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={tokenIndex}\n\t\t\t\t\t\t\tclassName={mergedTokenClasses[token.type as keyof TSTokenClasses] || 'text-gray-100'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{token.text}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t});\n}\n\nexport function formatMarkdown(codeLines: string[], customTokenClasses?: MarkdownTokenClasses) {\n\tconst mergedTokenClasses = { ...defaultMarkdownTokenClasses, ...customTokenClasses };\n\n\treturn codeLines.map((line, lineIndex) => (\n\t\t<div key={lineIndex} className='leading-6'>\n\t\t\t{tokenizeMarkdown(line).map((token, tokenIndex) => (\n\t\t\t\t<span key={tokenIndex} className={mergedTokenClasses[token.type] || 'text-gray-100'}>\n\t\t\t\t\t{token.text}\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</div>\n\t));\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useCopyToClipboard(text: string) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n\n setTimeout(() => setCopied(false), 3000);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [text]);\n\n return { copied, handleCopy };\n}\n\n/**\n * Hook for managing fullscreen mode with focus management and body scroll prevention\n */\nexport function useFullscreenMode(isFullscreen: boolean, setIsFullscreen: (value: boolean) => void) {\n const previousActiveElement = useRef<HTMLElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isFullscreen) {\n previousActiveElement.current = document.activeElement as HTMLElement;\n\n // Prevent document scrolling\n document.body.style.overflow = 'hidden';\n\n // Focus the container in fullscreen mode\n setTimeout(() => {\n containerRef.current?.focus();\n }, 100);\n\n // Trap focus within the fullscreen container\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsFullscreen(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n // Restore document scrolling\n document.body.style.overflow = '';\n };\n } else if (previousActiveElement.current) {\n // Restore focus when exiting fullscreen\n previousActiveElement.current.focus();\n previousActiveElement.current = null;\n }\n }, [isFullscreen, setIsFullscreen]);\n\n return { containerRef };\n}\n\n/**\n * Hook for keyboard navigation shortcuts\n */\nexport function useKeyboardShortcuts(\n allowCopy: boolean,\n allowFullscreen: boolean,\n onCopy: () => void,\n onToggleFullscreen: () => void\n) {\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'c' && (e.metaKey || e.ctrlKey) && allowCopy) {\n e.preventDefault();\n onCopy();\n } else if (e.key === 'f' && allowFullscreen) {\n e.preventDefault();\n onToggleFullscreen();\n }\n },\n [allowCopy, allowFullscreen, onCopy, onToggleFullscreen]\n );\n\n return { handleKeyDown };\n}\n","import { CodeBlockLanguages } from './CodeBlock';\n\nexport function getFileExtension(lang: CodeBlockLanguages): string {\n switch (lang) {\n case 'typescript':\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'json':\n return 'json';\n case 'bash':\n case 'sh':\n return 'sh';\n case 'css':\n return 'css';\n case 'markdown':\n case 'md':\n return 'md';\n default:\n return 'txt';\n }\n}\n","import { useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, Copy, Dash, Download, Window } from '../../symbols';\nimport { downloadFile, join } from '../../utils';\nimport { formatBash, formatJson, formatTypescript, formatCSS, formatMarkdown } from './format';\nimport { useCopyToClipboard, useFullscreenMode, useKeyboardShortcuts } from './hooks';\nimport { TokenClasses } from './types';\nimport { getFileExtension } from './util';\n\nexport type CodeBlockLanguages = 'typescript' | 'ts' | 'tsx' | 'json' | 'bash' | 'sh' | 'css' | 'markdown' | 'md';\n\nexport interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** The code content to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: CodeBlockLanguages;\n /** Enable copy to clipboard functionality */\n allowCopy?: boolean;\n /** Enable download as file functionality */\n allowDownload?: boolean;\n /** Enable fullscreen viewing mode */\n allowFullscreen?: boolean;\n /** Optional filename to display in the header */\n filename?: string;\n /** Show macOS-style traffic light buttons in header */\n showTrafficLights?: boolean;\n /** Whether to show line numbers on the left side */\n showLineNumbers?: boolean;\n /** Hide the header completely for a minimal appearance */\n hideHeader?: boolean;\n /** Whether to hide the file type label */\n hideFiletype?: boolean;\n /** Maximum height in pixels before showing scroll */\n maxHeight?: number;\n /** Custom token classes for syntax highlighting */\n tokenClasses?: TokenClasses;\n /** Additional CSS classes */\n className?: string;\n /** Element ID */\n id?: string;\n /** Ref to the container element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A feature-rich code block component with syntax highlighting, copy functionality,\n * download options, and fullscreen viewing. Supports multiple programming languages.\n * \n * @example\n * ```tsx\n * // Basic code block\n * <CodeBlock \n * code=\"const greeting = 'Hello World';\" \n * language=\"typescript\"\n * filename=\"example.ts\"\n * />\n * \n * // Full-featured block\n * <CodeBlock\n * code={jsonData}\n * language=\"json\"\n * allowCopy\n * allowDownload\n * allowFullscreen\n * showLineNumbers\n * maxHeight={400}\n * />\n * ```\n */\nexport function CodeBlock({\n code,\n language = 'typescript',\n allowCopy = true,\n allowDownload = false,\n allowFullscreen = false,\n filename,\n showTrafficLights = true,\n showLineNumbers = false,\n hideHeader = false,\n hideFiletype = false,\n maxHeight,\n tokenClasses: customTokenClasses,\n className,\n id,\n ref,\n ...props\n}: CodeBlockProps) {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const { containerRef } = useFullscreenMode(isFullscreen, setIsFullscreen);\n const { copied, handleCopy } = useCopyToClipboard(code);\n\n const handleDownload = useCallback(() => {\n const downloadFilename = filename || `code.${getFileExtension(language)}`;\n downloadFile(code, downloadFilename);\n }, [code, filename, language]);\n\n const toggleFullScreen = useCallback(() => {\n setIsFullscreen((prev) => !prev);\n }, []);\n\n const { handleKeyDown } = useKeyboardShortcuts(allowCopy, allowFullscreen, handleCopy, toggleFullScreen);\n\n const codeLines = useMemo(() => code.split('\\n'), [code]);\n\n const renderButtons = useCallback(\n (inHeader = true) => (\n <div className={join('flex items-center space-x-2', !inHeader && 'absolute top-2 right-2 z-10')}>\n {!hideFiletype && (\n <span\n className='text-xs text-gray-400 uppercase tracking-wide font-medium'\n aria-label={`Code language: ${language}`}\n >\n {language}\n </span>\n )}\n {allowFullscreen && (\n <button\n onClick={toggleFullScreen}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title={isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}\n aria-label={isFullscreen ? 'Exit fullscreen mode' : 'Enter fullscreen mode'}\n aria-pressed={isFullscreen}\n type='button'\n >\n {isFullscreen ? <Dash size={14} /> : <Window size={14} />}\n </button>\n )}\n {allowDownload && (\n <button\n onClick={handleDownload}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title='Download code'\n aria-label='Download code as file'\n type='button'\n >\n <Download size={14} />\n </button>\n )}\n {allowCopy && (\n <button\n onClick={handleCopy}\n className='p-1.5 leading-0 text-gray-400 hover:text-white hover:bg-gray-700 rounded transition-colors motion-reduce:transition-none min-h-[44px] min-w-[44px] flex items-center justify-center md:min-h-auto md:min-w-auto md:p-1.5'\n title={copied ? 'Code copied!' : 'Copy code'}\n aria-label={copied ? 'Code copied to clipboard' : 'Copy code to clipboard'}\n aria-live='polite'\n type='button'\n >\n {copied ? <Check size={14} className='text-green-400' /> : <Copy size={14} />}\n </button>\n )}\n </div>\n ),\n [\n hideFiletype,\n language,\n allowFullscreen,\n isFullscreen,\n allowDownload,\n handleDownload,\n allowCopy,\n handleCopy,\n copied,\n toggleFullScreen,\n ]\n );\n\n const formattedCode = useMemo(() => {\n if (language === 'json') {\n return formatJson(codeLines, customTokenClasses);\n }\n\n if (language === 'tsx' || language === 'ts' || language === 'typescript') {\n return formatTypescript(codeLines, customTokenClasses);\n }\n\n if (language === 'bash' || language === 'sh') {\n return formatBash(codeLines, customTokenClasses);\n }\n\n if (language === 'css') {\n return formatCSS(codeLines, customTokenClasses);\n }\n\n if (language === 'markdown' || language === 'md') {\n return formatMarkdown(codeLines, customTokenClasses);\n }\n\n return [\n <span key={0} className='text-gray-400'>\n Unsupported language\n </span>,\n ];\n }, [codeLines, customTokenClasses, language]);\n\n const lineNumbers = useMemo(() => {\n if (!showLineNumbers) return null;\n return codeLines.map((_, index) => (\n <div\n key={index}\n className='text-gray-500 text-right pl-3 pr-1 select-none min-w-8 text-sm font-mono leading-6'\n aria-hidden='true'\n role='presentation'\n >\n {index + 1}\n </div>\n ));\n }, [showLineNumbers, codeLines]);\n\n const codeStyle = useMemo(\n () => ({\n maxHeight:\n maxHeight && !isFullscreen\n ? `${maxHeight}px`\n : isFullscreen\n ? hideHeader\n ? 'calc(100vh - 5px)'\n : 'calc(100vh - 45px)'\n : undefined,\n overflow: maxHeight || isFullscreen ? 'auto' : 'visible',\n }),\n [maxHeight, isFullscreen, hideHeader]\n );\n\n const codeBlockContent = (\n <div\n id={id}\n ref={(node) => {\n containerRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={join(\n 'bg-gray-900 rounded-lg border border-gray-700 overflow-hidden motion-reduce:transition-none',\n isFullscreen && 'fixed inset-0 z-[9999] max-h-fit',\n className\n )}\n data-language={language}\n data-filename={filename}\n data-fullscreen={isFullscreen}\n role='region'\n aria-label={`Code block${filename ? ` for ${filename}` : ''} in ${language}`}\n aria-describedby={showLineNumbers ? `${id}-description` : undefined}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {showLineNumbers && (\n <div id={`${id}-description`} className='sr-only'>\n Code block with line numbers. Use Cmd+C or Ctrl+C to copy code.\n {allowFullscreen && ' Press F to toggle fullscreen.'}\n </div>\n )}\n\n {/* Live region for copy feedback */}\n <div aria-live='polite' aria-atomic='true' className='sr-only'>\n {copied && 'Code copied to clipboard'}\n </div>\n\n {/* Header */}\n {!hideHeader && (\n <div className='flex items-center justify-between px-4 py-2 bg-gray-800 border-b border-gray-700'>\n <div className='flex items-center space-x-3'>\n {showTrafficLights && (\n <div className='flex space-x-2'>\n <div className='w-3 h-3 bg-red-500 rounded-full' />\n <div className='w-3 h-3 bg-yellow-500 rounded-full' />\n <div className='w-3 h-3 bg-green-500 rounded-full' />\n </div>\n )}\n {filename && <span className='text-sm text-gray-300 font-medium'>{filename}</span>}\n </div>\n {renderButtons(true)}\n </div>\n )}\n\n {/* Code Content */}\n <div className={join('flex overflow-hidden', hideHeader && 'relative')} style={codeStyle}>\n {hideHeader && renderButtons(false)}\n <div className='flex-1 overflow-x-auto'>\n <div className='flex'>\n {showLineNumbers && (\n <div\n className='bg-gray-800 py-4 border-r border-gray-700 flex flex-col flex-shrink-0'\n aria-hidden='true'\n role='presentation'\n >\n {lineNumbers}\n </div>\n )}\n <div className='flex-1 p-4'>\n <pre\n className='text-sm font-mono focus:outline-none'\n role='code'\n aria-label={`${language} code content`}\n tabIndex={-1}\n >\n <code>{formattedCode}</code>\n </pre>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n\n return (\n <>\n {!isFullscreen && codeBlockContent}\n {isFullscreen &&\n createPortal(\n <>\n <div\n className='fixed inset-0 bg-black z-[9998]'\n onClick={() => setIsFullscreen(false)}\n aria-hidden='true'\n />\n {codeBlockContent}\n </>,\n document.body\n )}\n </>\n );\n}\n","import React, { useEffect, useId, useState } from 'react';\nimport { CaretCollapse, CaretExpand } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface DisclosureProps {\n /** The content to show/hide */\n children: React.ReactNode;\n /** The label text or content for the disclosure button */\n label: React.ReactNode;\n /** Controls the open state (uncontrolled if not provided) */\n isOpen?: boolean;\n /** Called when disclosure is toggled */\n onToggle?: (open: boolean) => void;\n /** Optional id for accessibility and testing */\n id?: string;\n /** Optional ref to the root div */\n ref?: React.Ref<HTMLDivElement>;\n /** Whether the disclosure is disabled */\n disabled?: boolean;\n /** Additional CSS classes to apply to the disclosure */\n className?: string;\n /** Additional CSS classes to apply to the disclosure button */\n buttonClassName?: string;\n}\n\n/**\n * A simple disclosure component for showing and hiding content sections.\n * Provides keyboard navigation and accessibility features with expand/collapse functionality.\n * \n * @example\n * ```tsx\n * // Uncontrolled disclosure\n * <Disclosure label=\"Show Details\">\n * <p>Hidden content that will be revealed when expanded.</p>\n * </Disclosure>\n * \n * // Controlled disclosure\n * <Disclosure \n * label=\"Advanced Options\"\n * isOpen={showAdvanced}\n * onToggle={setShowAdvanced}\n * >\n * <div>Advanced configuration options...</div>\n * </Disclosure>\n * ```\n */\nexport function Disclosure({\n children,\n label,\n isOpen: open,\n onToggle,\n id,\n ref,\n disabled = false,\n className,\n buttonClassName,\n}: DisclosureProps) {\n const generatedId = useId();\n const activeId = id ?? generatedId;\n const [internalOpen, setInternalOpen] = useState(false);\n const isOpen = open !== undefined ? open : internalOpen;\n\n const handleToggle = () => {\n if (disabled) return;\n if (open === undefined) {\n setInternalOpen((prev) => !prev);\n }\n onToggle?.(!isOpen);\n };\n\n useEffect(() => {\n setInternalOpen(open ?? false);\n }, [open]);\n\n return (\n <div ref={ref} id={activeId} data-open={isOpen} className={join('overflow-hidden', className)}>\n <button\n id={`${activeId}-button`}\n type='button'\n aria-expanded={isOpen}\n aria-controls={`${activeId}-panel`}\n disabled={disabled}\n tabIndex={0}\n className={join(\n 'w-full px-4 py-3 font-medium hover:bg-primary/10 disabled:opacity-50 disabled:cursor-not-allowed',\n buttonClassName\n )}\n onClick={handleToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n }}\n data-open={isOpen}\n data-label={typeof label === 'string' ? label : undefined}\n >\n <div className='flex items-center w-full gap-2'>\n <span className='flex-1 text-left'>{label}</span>\n {isOpen ? (\n <CaretCollapse className='size-5' aria-hidden='true' />\n ) : (\n <CaretExpand className='size-5' aria-hidden='true' />\n )}\n </div>\n </button>\n\n <div id={`${activeId}-panel`} role='region' aria-labelledby={activeId} aria-live='polite' hidden={!isOpen}>\n {children}\n </div>\n </div>\n );\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\nexport function useAnimationSlideIn(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n // Small delay to ensure the element is rendered before animation\n const timer = setTimeout(() => setShow(true), 10);\n return () => clearTimeout(timer);\n } else {\n setShow(false);\n // Wait for animation to complete before unmounting\n const timer = setTimeout(() => setShouldRender(false), 300);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function useDrawerDrag({\n isOpen,\n onClose,\n enabled = true,\n}: {\n isOpen: boolean;\n onClose: () => void;\n enabled?: boolean;\n}) {\n const [isDragging, setIsDragging] = useState(false);\n const [translateY, setTranslateY] = useState(0);\n const [startY, setStartY] = useState(0);\n\n const handleStart = useCallback((clientY: number) => {\n if (!enabled || !isOpen) return;\n \n setIsDragging(true);\n setStartY(clientY);\n \n // Prevent text selection during drag\n document.body.style.userSelect = 'none';\n }, [enabled, isOpen]);\n\n const handleMove = useCallback((clientY: number) => {\n if (!isDragging || !enabled) return;\n\n const deltaY = clientY - startY; // Positive when dragging down\n const clampedDeltaY = Math.max(0, deltaY); // Only allow downward drag\n \n setTranslateY(clampedDeltaY);\n }, [isDragging, enabled, startY]);\n\n const handleEnd = useCallback(() => {\n if (!isDragging || !enabled) return;\n\n setIsDragging(false);\n document.body.style.userSelect = '';\n\n // Close drawer if dragged down more than threshold\n const threshold = 100; // pixels\n if (translateY > threshold) {\n onClose();\n }\n\n // Reset translate\n setTranslateY(0);\n }, [isDragging, enabled, translateY, onClose]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n handleStart(e.clientY);\n }, [handleStart]);\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n handleMove(e.clientY);\n }, [handleMove]);\n\n const handleMouseUp = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n handleStart(e.touches[0].clientY);\n }, [handleStart]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n e.preventDefault();\n handleMove(e.touches[0].clientY);\n }, [handleMove]);\n\n const handleTouchEnd = useCallback(() => {\n handleEnd();\n }, [handleEnd]);\n\n // Add global event listeners when dragging for when it goes outside the drawer\n useEffect(() => {\n if (!isDragging) return;\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleTouchEnd);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleTouchEnd);\n };\n }, [isDragging, handleMouseMove, handleMouseUp, handleTouchMove, handleTouchEnd]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!enabled) return;\n\n if (e.key === 'ArrowDown' || e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n }, [enabled, onClose]);\n\n const dragHandlers = enabled ? {\n onMouseDown: handleMouseDown,\n onTouchStart: handleTouchStart,\n onKeyDown: handleKeyDown,\n } : {};\n\n return {\n dragHandlers,\n translateY,\n isDragging,\n };\n}\n\nexport function useDrawerFocus(drawerId: string, shouldRender: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n useEffect(() => {\n if (!shouldRender) return;\n\n // Store the previously focused element\n previousActiveElement.current = document.activeElement;\n\n const drawerElement = document.getElementById(drawerId);\n if (drawerElement) {\n // Focus the drawer container\n drawerElement.focus();\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const drawerElement = document.getElementById(drawerId);\n if (!drawerElement) return;\n\n const focusableElements = drawerElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n \n // Restore focus to the previously active element\n if (previousActiveElement.current && typeof (previousActiveElement.current as HTMLElement).focus === 'function') {\n (previousActiveElement.current as HTMLElement).focus();\n }\n };\n }, [drawerId, shouldRender]);\n}\n\nexport function useDrawerDocumentChanges(shouldRender: boolean, onClose: () => void) {\n useEffect(() => {\n if (!shouldRender) return;\n\n // Prevent body scroll when drawer is open\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n // Handle escape key\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.body.style.overflow = originalStyle;\n document.removeEventListener('keydown', handleEscape);\n };\n }, [shouldRender, onClose]);\n}","import React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { join } from '../../utils';\nimport { useAnimationSlideIn, useDrawerDocumentChanges, useDrawerDrag, useDrawerFocus } from './hooks';\n\nexport interface DrawerProps {\n /** Reference to the drawer element */\n ref?: React.Ref<HTMLDivElement>;\n /** Unique identifier for the drawer */\n id?: string;\n /** Whether the drawer is open */\n isOpen: boolean;\n /** Callback fired when the drawer should close */\n onClose: () => void;\n /** Optional title for the drawer header */\n title?: React.ReactNode;\n /** The content to display inside the drawer */\n children: React.ReactNode;\n /** Optional footer content for the drawer */\n footer?: React.ReactNode;\n /** Additional CSS classes to apply to the drawer */\n className?: string;\n /** Additional CSS classes to apply to the overlay */\n overlayClassName?: string;\n /** Whether to show the close button in the top-right corner */\n showCloseButton?: boolean;\n /** Whether to disable closing when clicking the overlay */\n disableCloseOnOverlayClick?: boolean;\n /** Whether to enable drag gestures on the notch for closing */\n enableDragGestures?: boolean;\n /** ARIA labelledby attribute */\n ariaLabelledBy?: string;\n /** ARIA describedby attribute */\n ariaDescribedBy?: string;\n}\n\n/**\n * A bottom-slide drawer component for mobile-friendly overlays and forms.\n * Includes drag gestures, focus management, and smooth animations.\n * \n * @example\n * ```tsx\n * // Basic drawer\n * <Drawer\n * isOpen={showDrawer}\n * onClose={() => setShowDrawer(false)}\n * title=\"Settings\"\n * >\n * <p>Drawer content goes here</p>\n * </Drawer>\n * \n * // Full-featured drawer\n * <Drawer\n * isOpen={showForm}\n * onClose={handleClose}\n * title=\"Edit Profile\"\n * footer={<Button onClick={save}>Save Changes</Button>}\n * enableDragGestures\n * showCloseButton\n * >\n * <ProfileForm />\n * </Drawer>\n * ```\n */\nexport function Drawer({\n ref,\n id,\n isOpen,\n onClose,\n title,\n children,\n footer,\n className,\n overlayClassName,\n showCloseButton = false,\n disableCloseOnOverlayClick = false,\n enableDragGestures = true,\n ariaLabelledBy,\n ariaDescribedBy,\n}: DrawerProps) {\n const generatedId = useId();\n const drawerId = id || `drawer-${generatedId}`;\n const titleId = `${generatedId}-title`;\n\n const { show, shouldRender } = useAnimationSlideIn(isOpen);\n const { dragHandlers, translateY, isDragging } = useDrawerDrag({\n isOpen,\n onClose,\n enabled: enableDragGestures,\n });\n useDrawerFocus(drawerId, shouldRender);\n useDrawerDocumentChanges(shouldRender, onClose);\n\n if (!shouldRender) return null;\n\n const renderTitle = () => {\n if (!title) return null;\n\n if (React.isValidElement(title)) {\n return <div>{title}</div>;\n }\n\n return (\n <h2 className='text-2xl font-semibold' id={titleId}>\n {title}\n </h2>\n );\n };\n\n const renderFooter = () => {\n if (!footer) return null;\n\n if (React.isValidElement(footer)) {\n const footerElement = footer as React.ReactElement<{ className?: string }>;\n const existingClassName = footerElement.props.className || '';\n return React.cloneElement(footerElement, { className: join('px-6 py-4', existingClassName) } as Record<\n string,\n unknown\n >);\n }\n\n return <div className='px-6 py-4'>{footer}</div>;\n };\n\n return (\n <>\n {createPortal(\n <div\n aria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n aria-describedby={ariaDescribedBy}\n role='dialog'\n aria-modal='true'\n className='fixed inset-0 z-[100] overflow-hidden'\n data-drawer-open={isOpen}\n >\n <div\n className={join(\n 'fixed inset-0 bg-black/40 transition-opacity duration-300',\n show ? 'opacity-100' : 'opacity-0',\n overlayClassName\n )}\n onClick={() => {\n if (!disableCloseOnOverlayClick) {\n onClose();\n }\n }}\n />\n\n <div className='fixed inset-x-0 bottom-0 flex max-h-full'>\n <div\n id={drawerId}\n ref={ref}\n tabIndex={-1}\n className={join(\n 'relative w-screen transform shadow-xl bg-popover text-popover-foreground transition-transform duration-300 ease-in-out border-t border-border rounded-t-lg',\n show ? 'translate-y-0' : 'translate-y-full',\n className\n )}\n style={{\n transform: enableDragGestures && translateY !== 0 ? `translateY(${translateY}px)` : undefined,\n transition: translateY !== 0 ? 'none' : undefined,\n }}\n >\n <div className='flex h-full flex-col'>\n {enableDragGestures && (\n <div\n className={join(\n 'flex justify-center pt-3 pb-2 cursor-grab active:cursor-grabbing',\n enableDragGestures && 'select-none'\n )}\n {...dragHandlers}\n role={enableDragGestures ? 'button' : undefined}\n tabIndex={enableDragGestures ? 0 : undefined}\n aria-label={enableDragGestures ? 'Drag to resize drawer' : undefined}\n >\n <div\n className={join(\n 'w-12 h-1.5 bg-popover-foreground/25 rounded-full transition-colors',\n enableDragGestures && 'hover:bg-popover-foreground/50',\n isDragging && 'bg-popover-foreground/50'\n )}\n />\n </div>\n )}\n\n {title && <div className='px-6 pt-4'>{renderTitle()}</div>}\n\n {showCloseButton && (\n <button\n type='button'\n onClick={onClose}\n data-drawer-close-button='true'\n aria-label='Close drawer'\n className='rounded-md p-0.5 top-3 right-3 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n >\n <X size={18} />\n </button>\n )}\n\n <div className={join('flex-1 overflow-y-auto px-6 pb-6', title ? 'pt-6' : 'pt-4')}>{children}</div>\n\n {renderFooter()}\n </div>\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { PopoverPlacement } from './variants';\n\ninterface UseAutoSwitchPlacementProps {\n internalIsOpen: boolean;\n autoSwitchPlacement: boolean;\n placement: PopoverPlacement;\n offset: number;\n triggerRef: React.RefObject<HTMLElement | null>;\n popoverRef: React.RefObject<HTMLDivElement | null>;\n}\n\nfunction getOppositePlacement(placement: PopoverPlacement): PopoverPlacement {\n switch (placement) {\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n case 'left':\n return 'right';\n case 'right':\n return 'left';\n }\n}\n\nexport function useAutoSwitchPlacement({\n internalIsOpen,\n autoSwitchPlacement,\n placement,\n offset,\n triggerRef,\n popoverRef,\n}: UseAutoSwitchPlacementProps) {\n const [effectivePlacement, setEffectivePlacement] = useState<PopoverPlacement>(placement);\n\n useEffect(() => {\n if (!internalIsOpen || !autoSwitchPlacement) return;\n\n const updatePlacement = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const popoverRect = popoverRef.current.getBoundingClientRect();\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newPlacement = placement;\n const opposite = getOppositePlacement(placement);\n\n if (placement === 'top' || placement === 'bottom') {\n const hasSpace =\n placement === 'top'\n ? triggerRect.top >= popoverRect.height + offset\n : viewportHeight - triggerRect.bottom >= popoverRect.height + offset;\n\n const hasSpaceOpposite =\n opposite === 'top'\n ? triggerRect.top >= popoverRect.height + offset\n : viewportHeight - triggerRect.bottom >= popoverRect.height + offset;\n\n if (!hasSpace && hasSpaceOpposite) newPlacement = opposite;\n } else {\n const hasSpace =\n placement === 'left'\n ? triggerRect.left >= popoverRect.width + offset\n : viewportWidth - triggerRect.right >= popoverRect.width + offset;\n\n const hasSpaceOpposite =\n opposite === 'left'\n ? triggerRect.left >= popoverRect.width + offset\n : viewportWidth - triggerRect.right >= popoverRect.width + offset;\n\n if (!hasSpace && hasSpaceOpposite) newPlacement = opposite;\n }\n\n setEffectivePlacement(newPlacement);\n };\n\n updatePlacement();\n\n const handleScrollOrResize = () => updatePlacement();\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n\n // Listen for size changes in trigger or popover\n const resizeObserver = new ResizeObserver(updatePlacement);\n if (triggerRef.current) {\n resizeObserver.observe(triggerRef.current);\n }\n if (popoverRef.current) {\n resizeObserver.observe(popoverRef.current);\n }\n\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n resizeObserver.disconnect();\n };\n }, [internalIsOpen, placement, offset, autoSwitchPlacement, triggerRef, popoverRef]);\n\n return effectivePlacement;\n}\n","export type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverAlignment = 'start' | 'center' | 'end';\n\nexport const placementVariants: Record<PopoverPlacement, Record<PopoverAlignment, string>> = {\n bottom: {\n start: 'top-full left-0 origin-top-left',\n center: 'top-full left-1/2 -translate-x-1/2 origin-top',\n end: 'top-full right-0 origin-top-right',\n },\n top: {\n start: 'bottom-full left-0 origin-bottom-left',\n center: 'bottom-full left-1/2 -translate-x-1/2 origin-bottom',\n end: 'bottom-full right-0 origin-bottom-right',\n },\n left: {\n start: 'right-full top-0 origin-top-right',\n center: 'right-full top-1/2 -translate-y-1/2 origin-right',\n end: 'right-full bottom-0 origin-bottom-right',\n },\n right: {\n start: 'left-full top-0 origin-top-left',\n center: 'left-full top-1/2 -translate-y-1/2 origin-left',\n end: 'left-full bottom-0 origin-bottom-left',\n },\n} as const;\n","import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { join, mergeRefs } from '../../utils';\nimport { useAutoSwitchPlacement } from './hooks';\nimport { placementVariants, PopoverAlignment, PopoverPlacement } from './variants';\n\nexport interface PopoverProps {\n\t/** Unique identifier for the popover */\n\tid?: string;\n\t/** Reference to the popover element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Whether the popover is open (controlled) */\n\tisOpen?: boolean;\n\t/** Callback fired when the open state changes */\n\tonOpenChange?: (open: boolean) => void;\n\t/** The content to display in the popover */\n\tchildren: React.ReactNode;\n\t/** The element that triggers the popover */\n\ttrigger: React.ReactElement;\n\t/** The preferred side of the trigger to render against */\n\tplacement?: PopoverPlacement;\n\t/** The preferred alignment against the trigger */\n\talignment?: PopoverAlignment;\n\t/** Additional CSS classes to apply to the popover content */\n\tclassName?: string;\n\t/** Whether to close popover when clicking outside */\n\tcloseOnOverlayClick?: boolean;\n\t/** Whether to close popover when clicking the trigger again */\n\tcloseOnTriggerClick?: boolean;\n\t/** Offset of the popover from the trigger element in pixels */\n\toffset?: number;\n\t/** Automatically switch placement to opposite side if there is not enough space */\n\tautoSwitchPlacement?: boolean;\n\t/** Enable hover behavior - shows on hover, hides 200ms after mouse leaves */\n\thoverable?: boolean;\n}\n\nfunction getOffsetStyle(effectivePlacement: PopoverPlacement, offset: number) {\n\tswitch (effectivePlacement) {\n\t\tcase 'top':\n\t\t\treturn { marginBottom: `${offset}px` };\n\t\tcase 'bottom':\n\t\t\treturn { marginTop: `${offset}px` };\n\t\tcase 'left':\n\t\t\treturn { marginRight: `${offset}px` };\n\t\tcase 'right':\n\t\t\treturn { marginLeft: `${offset}px` };\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n\n/**\n * A floating content container that appears relative to a trigger element.\n * Supports hover and click interactions with intelligent positioning and focus management.\n * \n * @example\n * ```tsx\n * // Basic popover\n * <Popover \n * trigger={<Button>Click me</Button>}\n * placement=\"bottom\"\n * >\n * <div className=\"p-4\">\n * <h3>Popover Content</h3>\n * <p>This is the popover content.</p>\n * </div>\n * </Popover>\n * \n * // Hover popover\n * <Popover\n * trigger={<span>Hover me</span>}\n * hoverable\n * placement=\"top\"\n * alignment=\"start\"\n * >\n * <div className=\"p-2 text-sm\">Tooltip-like content</div>\n * </Popover>\n * \n * // Controlled popover\n * <Popover\n * trigger={<Button>Controlled</Button>}\n * isOpen={showPopover}\n * onOpenChange={setShowPopover}\n * >\n * <PopoverMenu />\n * </Popover>\n * ```\n */\nexport function Popover({\n\tid,\n\tref,\n\tisOpen,\n\tonOpenChange,\n\tchildren,\n\tclassName,\n\tcloseOnOverlayClick = true,\n\ttrigger,\n\tplacement = 'bottom',\n\talignment = 'center',\n\tcloseOnTriggerClick = true,\n\toffset = 8,\n\tautoSwitchPlacement = true,\n\thoverable = false,\n}: PopoverProps) {\n\tconst [internalIsOpen, setInternalIsOpen] = useState(isOpen ?? false);\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\tconst triggerRef = useRef<HTMLElement>(null);\n\tconst previousFocusRef = useRef<HTMLElement | null>(null);\n\tconst popoverId = useId();\n\tconst hoverTimeoutRef = useRef<number | null>(null);\n\n\tconst effectivePlacement = useAutoSwitchPlacement({\n\t\tinternalIsOpen,\n\t\tautoSwitchPlacement,\n\t\tplacement,\n\t\toffset,\n\t\ttriggerRef,\n\t\tpopoverRef,\n\t});\n\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (onOpenChange) {\n\t\t\t\tonOpenChange(open);\n\t\t\t}\n\t\t\tif (isOpen === undefined) {\n\t\t\t\tsetInternalIsOpen(open);\n\t\t\t}\n\t\t},\n\t\t[isOpen, onOpenChange]\n\t);\n\n\t// Hover handling functions\n\tconst clearHoverTimeout = useCallback(() => {\n\t\tif (hoverTimeoutRef.current) {\n\t\t\tclearTimeout(hoverTimeoutRef.current);\n\t\t\thoverTimeoutRef.current = null;\n\t\t}\n\t}, []);\n\n\tconst handleMouseEnter = useCallback(() => {\n\t\tif (!hoverable) return;\n\t\tclearHoverTimeout();\n\t\thandleOpenChange(true);\n\t}, [hoverable, clearHoverTimeout, handleOpenChange]);\n\n\tconst handleMouseLeave = useCallback(() => {\n\t\tif (!hoverable) return;\n\t\tclearHoverTimeout();\n\t\thoverTimeoutRef.current = setTimeout(() => {\n\t\t\thandleOpenChange(false);\n\t\t}, 200);\n\t}, [hoverable, clearHoverTimeout, handleOpenChange]);\n\n\tuseEffect(() => {\n\t\tif (isOpen !== undefined) {\n\t\t\tsetInternalIsOpen(isOpen);\n\t\t}\n\t}, [isOpen]);\n\n\t// Cleanup hover timeout on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (hoverTimeoutRef.current) {\n\t\t\t\tclearTimeout(hoverTimeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\t// Handle keyboard navigation\n\tuseEffect(() => {\n\t\tif (!internalIsOpen) return;\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\thandleOpenChange(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [internalIsOpen, handleOpenChange]);\n\n\t// Handle click outside\n\tuseEffect(() => {\n\t\tif (!internalIsOpen || !closeOnOverlayClick) return;\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tconst target = event.target as Node;\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(target) &&\n\t\t\t\ttriggerRef.current &&\n\t\t\t\t!triggerRef.current.contains(target)\n\t\t\t) {\n\t\t\t\thandleOpenChange(false);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\treturn () => document.removeEventListener('mousedown', handleClickOutside);\n\t}, [internalIsOpen, closeOnOverlayClick, handleOpenChange]);\n\n\t// Handle focus management\n\tuseEffect(() => {\n\t\tif (internalIsOpen) {\n\t\t\tpreviousFocusRef.current = document.activeElement as HTMLElement;\n\t\t\tpopoverRef.current?.focus();\n\t\t} else {\n\t\t\tpreviousFocusRef.current?.focus();\n\t\t\tpreviousFocusRef.current = null;\n\t\t}\n\t}, [internalIsOpen]);\n\n\t// Trigger cloning\n\tconst triggerProps = trigger.props as {\n\t\tref?: React.Ref<HTMLElement>;\n\t\tonClick?: (e: React.MouseEvent<HTMLElement>) => void;\n\t\tonMouseEnter?: (e: React.MouseEvent<HTMLElement>) => void;\n\t\tonMouseLeave?: (e: React.MouseEvent<HTMLElement>) => void;\n\t};\n\tconst triggerElement = React.cloneElement(trigger, {\n\t\t'aria-expanded': internalIsOpen,\n\t\t'aria-haspopup': 'dialog',\n\t\t'aria-controls': popoverId,\n\t\tref: mergeRefs(triggerRef, triggerProps.ref),\n\t\tonClick: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onClick?.(e);\n\t\t\tif (hoverable) return; // Don't handle click events in hoverable mode\n\t\t\tif (!closeOnTriggerClick && internalIsOpen) return;\n\t\t\tif (isOpen === undefined) {\n\t\t\t\tif (e.defaultPrevented) return;\n\t\t\t\tif (popoverRef.current?.contains(e.target as Node)) return;\n\t\t\t\thandleOpenChange(!internalIsOpen);\n\t\t\t}\n\t\t},\n\t\tonMouseEnter: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onMouseEnter?.(e);\n\t\t\thandleMouseEnter();\n\t\t},\n\t\tonMouseLeave: (e: React.MouseEvent<HTMLElement>) => {\n\t\t\ttriggerProps.onMouseLeave?.(e);\n\t\t\thandleMouseLeave();\n\t\t},\n\t} as Record<string, unknown>);\n\n\treturn (\n\t\t<div id={id} ref={ref} className='relative inline-block'>\n\t\t\t{triggerElement}\n\t\t\t<div\n\t\t\t\tid={popoverId}\n\t\t\t\tref={popoverRef}\n\t\t\t\tclassName={join(\n\t\t\t\t\t'absolute z-[90] transform rounded-md shadow-lg bg-popover text-popover-foreground transition-all ease-out',\n\t\t\t\t\tinternalIsOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-75 pointer-events-none',\n\t\t\t\t\tplacementVariants[effectivePlacement][alignment],\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tstyle={getOffsetStyle(effectivePlacement, offset)}\n\t\t\t\trole='dialog'\n\t\t\t\taria-modal='true'\n\t\t\t\ttabIndex={-1}\n\t\t\t\tinert={!internalIsOpen ? true : undefined} // prevents focus and interaction when popover is closed\n\t\t\t\taria-hidden={!internalIsOpen ? true : undefined} // hide from screen readers when popover is closed\n\t\t\t\tonMouseEnter={hoverable ? handleMouseEnter : undefined}\n\t\t\t\tonMouseLeave={hoverable ? handleMouseLeave : undefined}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { ChevronRight } from '../../symbols';\nimport { join } from '../../utils';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { DropdownMenuOption } from './types';\n\ninterface MenuOptionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick' | 'aria-label'> {\n\toption: DropdownMenuOption;\n}\n\nexport function MenuOption({ option, ...props }: MenuOptionProps) {\n\tconst { onItemSelect } = useDropdownMenuContext();\n\n\tconst handleItemClick = () => {\n\t\tif (option.onClick) {\n\t\t\toption.onClick();\n\t\t}\n\t\tif (option.value) {\n\t\t\tonItemSelect(option.value);\n\t\t}\n\t};\n\n\tconst hasSubitems = option.subItems && option.subItems.length > 0;\n\tconst isLink = option.href && !option.disabled;\n\tconst Element = isLink ? 'a' : 'div';\n\treturn (\n\t\t<Element\n\t\t\thref={isLink ? option.href : undefined}\n\t\t\tclassName={join(\n\t\t\t\t'relative flex items-center gap-2 px-3 py-2 text-sm focus:outline-none focus:bg-popover-foreground/10',\n\t\t\t\toption.disabled ? 'opacity-50 cursor-default' : 'cursor-pointer'\n\t\t\t)}\n\t\t\tonClick={!option.disabled ? handleItemClick : undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t{option.icon && <span className='size-4'>{option.icon}</span>}\n\t\t\t<div className='flex-1'>\n\t\t\t\t<div>{option.label}</div>\n\t\t\t\t{option.description && <div className='text-xs text-popover-foreground/60'>{option.description}</div>}\n\t\t\t</div>\n\t\t\t{option.keyboardShortcut && <div className='text-xs text-popover-foreground/60'>{option.keyboardShortcut}</div>}\n\t\t\t{hasSubitems && <ChevronRight className='size-4' />}\n\t\t</Element>\n\t);\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { MenuBody } from './DropdownMenuBody';\nimport { MenuOption } from './DropdownMenuOption';\nimport { DropdownMenuOption } from './types';\n\nexport function SubMenu({ option, level, index }: { option: DropdownMenuOption; level: number; index: number }) {\n\tconst { focus, setFocus } = useDropdownMenuContext();\n\tconst [isSubMenuOpen, setIsSubMenuOpen] = useState(false);\n\tconst [hasExited, setHasExited] = useState(false); // if submenu was exited with keyboard\n\tconst itemRef = useRef<HTMLDivElement>(null);\n\tconst previousLevelRef = useRef<number | undefined>(undefined);\n\tconst submenuId = useId();\n\n\tconst handleMouseEnter = () => {\n\t\tif (option.disabled) return;\n\t\tsetFocus({ level, index });\n\t\thandleOpen();\n\t};\n\n\tconst handleMouseLeave = () => {\n\t\tsetFocus(null);\n\t\thandleClose();\n\t};\n\n\tconst handleOpen = () => {\n\t\tsetIsSubMenuOpen(true);\n\t};\n\n\tconst handleClose = () => {\n\t\tsetIsSubMenuOpen(false);\n\t};\n\n\t// Can re-open submenu if it was exited with keyboard\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tif (option.disabled) return;\n\t\t\tsetHasExited(false);\n\t\t}\n\t};\n\n\t// Detect if submenu was exited with keyboard navigation\n\tuseEffect(() => {\n\t\tconst focusLevel = focus?.level;\n\t\tconst previousLevel = previousLevelRef.current;\n\t\tconst submenuLevel = level + 1;\n\t\tif (focusLevel && previousLevel && previousLevel === submenuLevel && focusLevel === previousLevel - 1) {\n\t\t\tsetHasExited(true);\n\t\t} else {\n\t\t\tsetHasExited(false);\n\t\t}\n\t\tpreviousLevelRef.current = focusLevel;\n\t}, [focus, level]); // include entire object to reset when index changes as well (allows reopening same submenu item)\n\n\tconst hasSubitems = option.subItems !== undefined && option.subItems.length > 0;\n\tconst showingSubmenu = isSubMenuOpen && !hasExited && hasSubitems;\n\treturn (\n\t\t<div\n\t\t\tref={itemRef}\n\t\t\tclassName='relative focus:outline-none focus:bg-popover-foreground/10'\n\t\t\tonMouseEnter={handleMouseEnter}\n\t\t\tonMouseLeave={handleMouseLeave}\n\t\t\tonFocus={handleOpen}\n\t\t\tonBlur={handleClose}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\ttabIndex={0}\n\t\t\tdata-menu-item={option.value}\n\t\t\tdata-level={level}\n\t\t\tdata-index={index}\n\t\t\taria-haspopup={hasSubitems ? 'true' : undefined}\n\t\t\taria-expanded={showingSubmenu ? 'true' : 'false'}\n\t\t\taria-disabled={option.disabled ? 'true' : undefined}\n\t\t\taria-label={option.label}\n\t\t\taria-controls={showingSubmenu ? submenuId : undefined}\n\t\t>\n\t\t\t<MenuOption option={option} />\n\n\t\t\t{showingSubmenu && (\n\t\t\t\t<div className='absolute left-full top-0 z-30'>\n\t\t\t\t\t<MenuBody items={option.subItems ?? []} level={level + 1} id={submenuId} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { join } from '../../utils';\nimport { useDropdownMenuContext } from './DropdownContext';\nimport { MenuOption } from './DropdownMenuOption';\nimport { SubMenu } from './DropdownMenuSub';\nimport { DropdownMenuItem } from './types';\n\nexport function MenuBody({ items, level, id }: { items: DropdownMenuItem[]; level: number; id?: string }) {\n\tconst { setFocus, className = '' } = useDropdownMenuContext();\n\tlet itemIndex = 0;\n\n\tconst renderItem = (item: DropdownMenuItem, key: string) => {\n\t\tswitch (item.__type) {\n\t\t\tcase 'option':\n\t\t\t\tif (item.subItems && item.subItems.length > 0) {\n\t\t\t\t\treturn <SubMenu key={key} option={item} level={level} index={itemIndex++} />;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<MenuOption\n\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\toption={item}\n\t\t\t\t\t\tdata-menu-item={item.value}\n\t\t\t\t\t\tdata-level={level}\n\t\t\t\t\t\tdata-index={itemIndex++}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\taria-disabled={item.disabled ? 'true' : undefined}\n\t\t\t\t\t\tonMouseEnter={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tif (item.disabled) return;\n\t\t\t\t\t\t\tconst index = Number(e.currentTarget.getAttribute('data-index'));\n\t\t\t\t\t\t\tsetFocus({ level, index });\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseLeave={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tsetFocus(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t);\n\n\t\t\tcase 'group':\n\t\t\t\treturn (\n\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t{item.title && (\n\t\t\t\t\t\t\t<div className='px-3 py-2 text-xs font-semibold text-popover-foreground/50 uppercase'>{item.title}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{item.items.map((groupItem, groupIndex) => renderItem(groupItem, `${key}-${groupIndex}`))}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\n\t\t\tcase 'separator':\n\t\t\t\treturn <div key={key} aria-hidden={true} className='my-1 mx-2 border-t border-popover-foreground/20' />;\n\n\t\t\tcase 'custom':\n\t\t\t\treturn <div key={key}>{item.render()}</div>;\n\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tclassName={join(\n\t\t\t\t'border py-1 border-popover-foreground/20 rounded-md min-w-52 shadow-lg bg-popover text-popover-foreground',\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\ttabIndex={0}\n\t\t\tdata-level={level}\n\t\t\tdata-menu\n\t\t\trole='menu'\n\t\t\taria-label={`Dropdown menu level ${level}`}\n\t\t>\n\t\t\t{items.map((item, index) => renderItem(item, String(index)))}\n\t\t</div>\n\t);\n}\n","import { useCallback, useEffect } from 'react';\nimport { DropdownMenuContextFocus } from './DropdownContext';\n\nfunction getItemElements(menuEl: HTMLElement, level: number) {\n return Array.from(menuEl.querySelectorAll<HTMLElement>(`[data-menu-item][data-level=\"${level}\"]`));\n}\n\nfunction getNextMenuItemIndex(menuItems: HTMLElement[], currentIndex: number | null) {\n const startIndex =\n currentIndex === null ? 0 : (currentIndex + 1) % menuItems.length;\n\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex + i) % menuItems.length;\n const item = menuItems[index];\n if (!item.hasAttribute('aria-disabled')) {\n return index;\n }\n }\n return -1;\n}\n\nfunction getPreviousMenuItemIndex(menuItems: HTMLElement[], currentIndex: number | null) {\n const startIndex =\n currentIndex === null ? menuItems.length - 1 : (currentIndex - 1 + menuItems.length) % menuItems.length;\n\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex - i + menuItems.length) % menuItems.length;\n const item = menuItems[index];\n if (!item.hasAttribute('aria-disabled')) {\n return index;\n }\n }\n return -1;\n}\n\ninterface UseKeyboardNavigationProps {\n dropdownId: string;\n focus: DropdownMenuContextFocus | null;\n setFocus: (focus: DropdownMenuContextFocus | null) => void;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function useKeyboardNavigation({ dropdownId, focus, setFocus, isOpen, onClose }: UseKeyboardNavigationProps) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n const { level: focusLevel, index: focusedIndex } = focus || { level: 1, index: null };\n\n const menu = document.querySelector<HTMLElement>(`#${dropdownId} [data-menu][data-level=\"${focusLevel}\"]`) as HTMLElement;\n if (!menu) return;\n\n const itemElements = getItemElements(menu, focusLevel);\n if (itemElements.length === 0) return;\n\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const nextIndex = getNextMenuItemIndex(itemElements, focusedIndex);\n if (nextIndex === -1) return;\n setFocus({ level: focusLevel, index: nextIndex });\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const prevIndex = getPreviousMenuItemIndex(itemElements, focusedIndex);\n if (prevIndex === -1) return;\n setFocus({ level: focusLevel, index: prevIndex });\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n if (focusedIndex !== null) {\n const el = itemElements[focusedIndex];\n const submenu = el.querySelector<HTMLElement>('[data-menu]');\n\n if (submenu) {\n // focus first submenu item\n const firstSubItem = submenu.querySelector<HTMLElement>('[data-menu-item]');\n\n if (firstSubItem) {\n setFocus({ level: focusLevel + 1, index: 0 });\n }\n }\n }\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n // go back to parent menu if inside submenu\n const parentMenuItem = menu.parentElement?.closest<HTMLElement>('[data-menu-item]') as HTMLElement;\n\n if (!parentMenuItem) {\n console.error(`No parent menu found leaving menu level ${focusLevel}`);\n return;\n }\n\n const parentMenuIndex = parentMenuItem.getAttribute('data-index')\n ? Number(parentMenuItem.getAttribute('data-index'))\n : -1;\n\n if (parentMenuItem) {\n setFocus({ level: focusLevel - 1, index: parentMenuIndex === -1 ? 0 : parentMenuIndex });\n }\n break;\n }\n case 'Enter': {\n event.preventDefault();\n if (focusedIndex !== null) {\n const el = itemElements[focusedIndex];\n el?.click();\n setFocus(null);\n }\n break;\n }\n case 'Escape': {\n event.preventDefault();\n onClose?.();\n setFocus(null);\n break;\n }\n case 'Tab': {\n onClose();\n break;\n }\n }\n },\n [isOpen, focus, setFocus, onClose, dropdownId]\n );\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [handleKeyDown, isOpen]);\n\n return { handleKeyDown };\n}\n","import React, { useCallback, useEffect, useId, useMemo, useState } from 'react';\nimport { join } from '../../utils';\nimport { Popover, PopoverProps } from '../popover';\nimport { DropdownMenuContext, DropdownMenuContextFocus, DropdownMenuContextValue } from './DropdownContext';\nimport { MenuBody } from './DropdownMenuBody';\nimport { useKeyboardNavigation } from './hooks';\nimport { DropdownMenuItem } from './types';\n\nexport interface DropdownMenuProps extends Omit<PopoverProps, 'children'> {\n\t/** Dropdown options, separators, groups, or custom items */\n\titems: DropdownMenuItem[];\n\t/** Callback when an item is selected, returns the value of the selected item */\n\tonItemSelect?: (value: string) => void;\n}\n\nfunction getMenuItem(dropdownId: string, level: number, index: number): HTMLElement | null {\n\treturn document.querySelector<HTMLElement>(\n\t\t`#${dropdownId} [data-menu-item][data-level=\"${level}\"][data-index=\"${index}\"]`\n\t);\n}\n\n/**\n * A fully-featured dropdown menu with keyboard navigation, nested submenus, and flexible item types.\n * Supports separators, groups, and custom content with accessibility features.\n * \n * @example\n * ```tsx\n * // Basic dropdown menu\n * <DropdownMenu\n * trigger={<Button>Options</Button>}\n * items={[\n * { type: 'item', label: 'Edit', value: 'edit' },\n * { type: 'item', label: 'Delete', value: 'delete' },\n * { type: 'separator' }\n * ]}\n * onItemSelect={(value) => handleAction(value)}\n * />\n * \n * // With nested submenus\n * <DropdownMenu\n * trigger={<Button>More Actions</Button>}\n * items={[\n * { \n * type: 'submenu', \n * label: 'Export',\n * items: [\n * { type: 'item', label: 'PDF', value: 'pdf' },\n * { type: 'item', label: 'CSV', value: 'csv' }\n * ]\n * }\n * ]}\n * placement=\"bottom-end\"\n * />\n * ```\n */\nexport function DropdownMenu({\n\tid,\n\titems,\n\tonItemSelect,\n\ttrigger,\n\tisOpen: open,\n\tplacement = 'bottom',\n\talignment = 'start',\n\tonOpenChange,\n\tclassName = '',\n\t...popoverProps\n}: DropdownMenuProps) {\n\tconst generatedId = useId();\n\tconst dropdownId = id || `dropdown-menu-${generatedId}`;\n\tconst [focus, setFocus] = useState<DropdownMenuContextFocus | null>(null);\n\tconst [internalOpen, setInternalOpen] = useState(false);\n\tconst isUncontrolled = open === undefined;\n\tconst isOpen = isUncontrolled ? internalOpen : open;\n\n\tconst handleClose = useCallback(() => {\n\t\tsetFocus(null);\n\t\tsetInternalOpen(false);\n\t}, []);\n\n\tconst handleItemSelect = useCallback(\n\t\t(value: string) => {\n\t\t\tif (onItemSelect) {\n\t\t\t\tonItemSelect(value);\n\t\t\t}\n\t\t\thandleClose();\n\t\t},\n\t\t[onItemSelect, handleClose]\n\t);\n\n\tconst handleOpenChange = useCallback(\n\t\t(open: boolean) => {\n\t\t\tif (isUncontrolled) {\n\t\t\t\tsetInternalOpen(open);\n\t\t\t}\n\t\t\tif (onOpenChange) {\n\t\t\t\tonOpenChange(open);\n\t\t\t}\n\t\t},\n\t\t[isUncontrolled, onOpenChange]\n\t);\n\n\tconst value = useMemo<DropdownMenuContextValue>(\n\t\t() => ({\n\t\t\tid: dropdownId,\n\t\t\tfocus,\n\t\t\tsetFocus,\n\t\t\tisOpen,\n\t\t\tonItemSelect: handleItemSelect,\n\t\t\tonClose: handleClose,\n\t\t\tclassName,\n\t\t}),\n\t\t[focus, setFocus, handleItemSelect, handleClose, className, isOpen, dropdownId]\n\t);\n\n\tuseKeyboardNavigation({\n\t\tdropdownId,\n\t\tfocus,\n\t\tsetFocus,\n\t\tisOpen,\n\t\tonClose: handleClose,\n\t});\n\n\tconst dropdownTrigger = useMemo(() => {\n\t\treturn React.cloneElement(trigger, {\n\t\t\tonClick: (e: React.MouseEvent) => {\n\t\t\t\tif (isUncontrolled) {\n\t\t\t\t\tsetInternalOpen((prev) => !prev);\n\t\t\t\t}\n\t\t\t\tconst props = trigger.props as {\n\t\t\t\t\tonClick?: (e: React.MouseEvent) => void;\n\t\t\t\t};\n\t\t\t\tif (props.onClick) {\n\t\t\t\t\tprops.onClick(e);\n\t\t\t\t}\n\t\t\t},\n\t\t} as Record<string, unknown>);\n\t}, [isUncontrolled, setInternalOpen, trigger]);\n\n\tuseEffect(() => {\n\t\tif (focus) {\n\t\t\tconst el = getMenuItem(dropdownId, focus.level, focus.index);\n\t\t\tel?.focus();\n\t\t}\n\t}, [focus, dropdownId]);\n\n\treturn (\n\t\t<Popover\n\t\t\tid={dropdownId}\n\t\t\tisOpen={isUncontrolled ? internalOpen : isOpen}\n\t\t\ttrigger={dropdownTrigger}\n\t\t\tplacement={placement}\n\t\t\talignment={alignment}\n\t\t\tonOpenChange={handleOpenChange}\n\t\t\tclassName={join('min-w-52', className)}\n\t\t\t{...popoverProps}\n\t\t>\n\t\t\t<DropdownMenuContext.Provider value={value}>\n\t\t\t\t<MenuBody items={items} level={1} />\n\t\t\t</DropdownMenuContext.Provider>\n\t\t</Popover>\n\t);\n}\n","import { DropdownMenuCustomItem, DropdownMenuItem, DropdownMenuOption, DropdownMenuOptionGroup, DropdownMenuSeparator } from './types';\n\nconst option = (item: Omit<DropdownMenuOption, '__type'>): DropdownMenuOption => ({\n __type: 'option',\n ...item,\n});\n\nconst group = (items: DropdownMenuItem[], title?: string): DropdownMenuOptionGroup => ({\n __type: 'group',\n title,\n items,\n});\n\nconst separator = (): DropdownMenuSeparator => ({\n __type: 'separator',\n});\n\nconst custom = (render: () => React.ReactNode): DropdownMenuCustomItem => ({\n __type: 'custom',\n render,\n});\n\nexport const DropdownMenuFactories = {\n option,\n group,\n separator,\n custom,\n};\n","import { useState, useCallback, useRef } from 'react';\n\nexport type DynamicListItem<T extends object> = T & {\n id: string;\n content: string;\n}\n\nexport function useDynamicList<T extends object>(initialItems: DynamicListItem<T>[] = []) {\n const [items, setItems] = useState<DynamicListItem<T>[]>(initialItems);\n const [draggedItem, setDraggedItem] = useState<DynamicListItem<T> | null>(null);\n const [draggedOverIndex, setDraggedOverIndex] = useState<number | null>(null);\n const draggedFromIndex = useRef<number | null>(null);\n\n const addItem = useCallback((content: string, extra?: Partial<T>) => {\n const newItem: DynamicListItem<T> = {\n ...(extra as T),\n id: `item-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n content,\n };\n setItems(prev => [...prev, newItem]);\n return newItem;\n }, []);\n\n const deleteItem = useCallback((id: string) => {\n setItems(prev => prev.filter(item => item.id !== id));\n }, []);\n\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n if (fromIndex === toIndex) return;\n \n setItems(prev => {\n const newItems = [...prev];\n const [movedItem] = newItems.splice(fromIndex, 1);\n newItems.splice(toIndex, 0, movedItem);\n return newItems;\n });\n }, []);\n\n const moveItemUp = useCallback((index: number) => {\n if (index > 0) {\n moveItem(index, index - 1);\n }\n }, [moveItem]);\n\n const moveItemDown = useCallback((index: number) => {\n if (index < items.length - 1) {\n moveItem(index, index + 1);\n }\n }, [moveItem, items.length]);\n\n // Drag and drop handlers\n const handleDragStart = useCallback((item: DynamicListItem<T>, index: number) => {\n setDraggedItem(item);\n draggedFromIndex.current = index;\n setDraggedOverIndex(index);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent, index: number) => {\n e.preventDefault();\n setDraggedOverIndex(index);\n }, []);\n\n const handleDragEnd = useCallback(() => {\n if (draggedItem && draggedOverIndex !== null && draggedFromIndex.current !== null) {\n const fromIndex = draggedFromIndex.current;\n const toIndex = draggedOverIndex;\n \n if (fromIndex !== toIndex) {\n moveItem(fromIndex, toIndex);\n }\n }\n \n setDraggedItem(null);\n setDraggedOverIndex(null);\n draggedFromIndex.current = null;\n }, [draggedItem, draggedOverIndex, moveItem]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n handleDragEnd();\n }, [handleDragEnd]);\n\n // Get items with visual drag feedback\n const getVisualItems = useCallback(() => {\n if (!draggedItem || draggedOverIndex === null || draggedFromIndex.current === null) {\n return items;\n }\n\n const fromIndex = draggedFromIndex.current;\n const toIndex = draggedOverIndex;\n\n if (fromIndex === toIndex) {\n return items;\n }\n\n // Create a copy of items with the dragged item moved to the hover position\n const visualItems = [...items];\n const [movedItem] = visualItems.splice(fromIndex, 1);\n visualItems.splice(toIndex, 0, movedItem);\n \n return visualItems;\n }, [items, draggedItem, draggedOverIndex, draggedFromIndex]);\n\n return {\n items,\n visualItems: getVisualItems(),\n addItem,\n deleteItem,\n moveItem,\n moveItemUp,\n moveItemDown,\n draggedItem,\n draggedOverIndex,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n };\n}","export type DynamicListSize = 'sm' | 'md' | 'lg';\n\nexport const titleVariants: Record<DynamicListSize, string> = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n} as const;\n\nexport const listVariants: Record<DynamicListSize, string> = {\n sm: 'text-sm gap-2',\n md: 'text-base gap-3',\n lg: 'text-lg gap-4',\n} as const;\n\nexport const iconSize: Record<DynamicListSize, number> = {\n sm: 14,\n md: 15,\n lg: 16,\n};","export function DiscMarker({ size = 8, className = '' }: { size?: number; className?: string }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`rounded-full flex-shrink-0 bg-current ${className}`}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: size,\n\t\t\t}}\n\t\t/>\n\t);\n}\n\nexport function DashMarker({ size = 12, className = '' }: { size?: number; className?: string }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex-shrink-0 bg-current ${className}`}\n\t\t\tstyle={{\n\t\t\t\twidth: size,\n\t\t\t\theight: 2,\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport { useDynamicList, type DynamicListItem } from './hooks';\nimport { DynamicListSize, iconSize, listVariants, titleVariants } from './variants';\nimport { join } from '../../utils';\nimport { ChevronDown, ChevronUp, GripVertical, Plus, Trash } from '../../symbols';\nimport { DashMarker, DiscMarker } from './markers';\n\nexport type DynamicListMarkerType = 'disc' | 'dash' | 'decimal' | React.ReactElement;\n\nexport interface DynamicListProps<T extends object> {\n\t/** Items to display in the list */\n\titems?: DynamicListItem<T>[];\n\t/** Size variant */\n\tsize?: DynamicListSize;\n\t/** Optional ID for the component */\n\tid?: string;\n\t/** Additional CSS classes */\n\tclassName?: string;\n\t/** Reference to the list container element */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Whether items can be added */\n\tallowAdd?: boolean;\n\t/** Whether items can be deleted */\n\tallowDelete?: boolean;\n\t/** Whether items can be reordered */\n\tallowReorder?: boolean;\n\t/** Placeholder text for new items */\n\taddPlaceholder?: string;\n\t/** Callback when items change */\n\tonItemsChange?: (items: DynamicListItem<T>[]) => void;\n\t/** Custom render function for items */\n\trenderItem?: (item: DynamicListItem<T>, index: number) => React.ReactNode;\n\t/** Marker type for list items */\n\tmarker?: DynamicListMarkerType;\n\t/** Custom item renderer function (alternative name for renderItem) */\n\titemRenderer?: (item: DynamicListItem<T>, index: number) => React.ReactNode;\n\t/** Whether to show dividers between items */\n\tshowDividers?: boolean;\n\t/** Whether to always show reorder buttons (if allowReorder is true) */\n\tshowReorderButtons?: boolean;\n\t/** Optional title for the list */\n\ttitle?: string | React.ReactElement;\n\t/** Whether to truncate long text in items (default: true) */\n\ttruncateText?: boolean;\n}\n\n/**\n * An interactive list component with add, delete, and reorder functionality.\n * Supports drag-and-drop reordering, keyboard navigation, and custom item rendering.\n * \n * @example\n * ```tsx\n * // Basic dynamic list\n * <DynamicList\n * items={[\n * { id: '1', content: 'First item' },\n * { id: '2', content: 'Second item' }\n * ]}\n * onItemsChange={(items) => setListItems(items)}\n * title=\"My Tasks\"\n * />\n * \n * // Custom rendering with limited functionality\n * <DynamicList\n * items={todos}\n * renderItem={(item, index) => (\n * <TodoItem {...item} onToggle={() => toggleTodo(item.id)} />\n * )}\n * allowDelete={false}\n * marker=\"decimal\"\n * />\n * ```\n */\nexport function DynamicList<T extends object>({\n\titems: initialItems = [],\n\tsize = 'md',\n\tid,\n\tclassName = '',\n\tref,\n\tallowAdd = true,\n\tallowDelete = true,\n\tallowReorder = true,\n\taddPlaceholder = 'Add new item...',\n\tonItemsChange,\n\trenderItem,\n\tmarker,\n\titemRenderer,\n\tshowDividers = true,\n\tshowReorderButtons = true,\n\ttitle,\n\ttruncateText = false,\n}: DynamicListProps<T>) {\n\tconst [newItemText, setNewItemText] = useState('');\n\tconst [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst generatedId = useId();\n\tconst hasMounted = useRef(false);\n\tconst lastOnChangeItems = useRef<DynamicListItem<T>[]>(initialItems);\n\tconst listId = id || `dynamic-list-${generatedId}`;\n\tconst titleId = `${listId}-title`;\n\n\tconst {\n\t\titems,\n\t\tvisualItems,\n\t\taddItem,\n\t\tdeleteItem,\n\t\tmoveItemUp,\n\t\tmoveItemDown,\n\t\tdraggedItem,\n\t\tdraggedOverIndex,\n\t\thandleDragStart,\n\t\thandleDragOver,\n\t\thandleDragEnd,\n\t\thandleDrop,\n\t} = useDynamicList<T>(initialItems);\n\n\t// Use itemRenderer if provided, otherwise use renderItem\n\tconst itemRenderFunction = itemRenderer || renderItem;\n\n\t// Call onChange callback when items change\n\t// Avoid calling onItemsChange on initial mount\n\tuseEffect(() => {\n\t\tif (!hasMounted.current) {\n\t\t\thasMounted.current = true;\n\t\t\treturn;\n\t\t}\n\t\tif (lastOnChangeItems.current !== items) {\n\t\t\tlastOnChangeItems.current = items;\n\t\t\tonItemsChange?.(items);\n\t\t}\n\t}, [items, onItemsChange]);\n\n\tconst getItemElementById = (itemId: string) =>\n\t\t// must escape special characters in ID for querySelector\n\t\tdocument.querySelector(`#${listId} #${CSS.escape(itemId)}`) as HTMLElement | null;\n\n\tconst handleAddItem = () => {\n\t\tif (newItemText.trim()) {\n\t\t\taddItem(newItemText.trim());\n\t\t\tsetNewItemText('');\n\t\t\tinputRef.current?.focus();\n\t\t}\n\t};\n\n\tconst handleDeleteItem = (e: React.MouseEvent | React.KeyboardEvent, index: number) => {\n\t\tif (!allowDelete) {\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst nextIndex = index < items.length - 1 ? index + 1 : index - 1;\n\t\tconst nextItem = items[nextIndex];\n\t\tdeleteItem(items[index].id);\n\n\t\t// After deletion, set focus to the next item or previous if last was deleted\n\t\tif (nextIndex >= 0 && nextItem) {\n\t\t\t// Use a timeout to ensure the item is removed from the DOM before focusing\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst nextElement = getItemElementById(nextItem.id);\n\t\t\t\tnextElement?.focus();\n\t\t\t}, 0);\n\t\t} else {\n\t\t\t// If no items left, focus the input for adding new items\n\t\t\tinputRef.current?.focus();\n\t\t\tsetHoveredIndex(null);\n\t\t}\n\t};\n\n\tconst handleKeyPress = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'Enter') {\n\t\t\thandleAddItem();\n\t\t}\n\t};\n\n\tconst handleItemKeyDown = (e: React.KeyboardEvent, index: number) => {\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (!allowReorder) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tmoveItemUp(index);\n\n\t\t\t\tif (index > 0) {\n\t\t\t\t\tsetHoveredIndex(index - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (!allowReorder) return;\n\t\t\t\te.preventDefault();\n\t\t\t\tmoveItemDown(index);\n\n\t\t\t\tif (index < items.length - 1) {\n\t\t\t\t\tsetHoveredIndex(index + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Backspace':\n\t\t\tcase 'Delete':\n\t\t\t\thandleDeleteItem(e, index);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tconst renderTitle = () => {\n\t\tif (!title) return null;\n\n\t\tconst titleClasses = join('font-medium opacity-60', titleVariants[size]);\n\t\tif (typeof title === 'string') {\n\t\t\treturn (\n\t\t\t\t<h4 id={titleId} className={titleClasses}>\n\t\t\t\t\t{title}\n\t\t\t\t</h4>\n\t\t\t);\n\t\t}\n\n\t\tconst prop = title.props as { className?: string };\n\t\treturn React.cloneElement(title, { id: titleId, className: join(titleClasses, prop.className) } as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>);\n\t};\n\n\t// Render marker based on type\n\tconst renderMarker = (index: number) => {\n\t\tif (!marker) return null;\n\n\t\tif (React.isValidElement(marker)) {\n\t\t\treturn marker;\n\t\t}\n\n\t\tswitch (marker) {\n\t\t\tcase 'disc':\n\t\t\t\treturn <DiscMarker className='text-muted-foreground' />;\n\t\t\tcase 'dash':\n\t\t\t\treturn <DashMarker className='text-muted-foreground' />;\n\t\t\tcase 'decimal':\n\t\t\t\treturn (\n\t\t\t\t\t<span className='text-sm font-medium text-muted-foreground flex-shrink-0 min-w-4 text-right'>\n\t\t\t\t\t\t{index + 1}.\n\t\t\t\t\t</span>\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn <DiscMarker className='text-muted-foreground' />;\n\t\t}\n\t};\n\n\tconst sizeClasses = listVariants[size];\n\tconst iconSizeValue = iconSize[size];\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tid={listId}\n\t\t\tclassName={className}\n\t\t\tdata-size={size}\n\t\t\tdata-allow-add={allowAdd}\n\t\t\tdata-allow-delete={allowDelete}\n\t\t\tdata-allow-reorder={allowReorder}\n\t\t\tdata-marker={typeof marker === 'string' ? marker : 'custom'}\n\t\t>\n\t\t\t{/* Title */}\n\t\t\t{renderTitle()}\n\n\t\t\t{/* List Items */}\n\t\t\t<ul className={sizeClasses} role='list' aria-labelledby={title ? titleId : undefined}>\n\t\t\t\t{visualItems.map((item, visualIndex) => {\n\t\t\t\t\t// Find the original index of this item in the actual items array\n\t\t\t\t\tconst originalIndex = items.findIndex((originalItem) => originalItem.id === item.id);\n\t\t\t\t\tconst isDraggedItem = draggedItem?.id === item.id;\n\t\t\t\t\tconst isHovered = hoveredIndex === originalIndex;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={item.id}>\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\ttitle={truncateText ? item.content : undefined}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'flex items-center group relative transition-all duration-150',\n\t\t\t\t\t\t\t\t\tisDraggedItem && 'opacity-30',\n\t\t\t\t\t\t\t\t\t// Drag feedback styling\n\t\t\t\t\t\t\t\t\tdraggedItem && draggedOverIndex === visualIndex && !isDraggedItem ? 'border-t-2 border-primary' : ''\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tdraggable={allowReorder}\n\t\t\t\t\t\t\t\tonDragStart={(e) => {\n\t\t\t\t\t\t\t\t\te.dataTransfer.effectAllowed = 'move';\n\t\t\t\t\t\t\t\t\thandleDragStart(item, originalIndex);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonDragOver={(e) => handleDragOver(e, visualIndex)}\n\t\t\t\t\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\t\t\t\t\tonDrop={handleDrop}\n\t\t\t\t\t\t\t\tonMouseEnter={() => setHoveredIndex(originalIndex)}\n\t\t\t\t\t\t\t\tonMouseLeave={() => setHoveredIndex(null)}\n\t\t\t\t\t\t\t\tonFocus={(e) => {\n\t\t\t\t\t\t\t\t\t// Check if the focused element is the current list item\n\t\t\t\t\t\t\t\t\tif (e.currentTarget === e.target) {\n\t\t\t\t\t\t\t\t\t\tsetHoveredIndex(originalIndex);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t\t\t\trole='listitem'\n\t\t\t\t\t\t\t\taria-label={`List item ${originalIndex + 1}: ${item.content}`}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => handleItemKeyDown(e, originalIndex)}\n\t\t\t\t\t\t\t\taria-description={`${allowReorder ? 'Use up/down arrow keys to reorder. ' : ''}${\n\t\t\t\t\t\t\t\t\tallowDelete ? 'Press Backspace/Delete to remove this item.' : ''\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Drag Handle */}\n\t\t\t\t\t\t\t\t{allowReorder && (\n\t\t\t\t\t\t\t\t\t<div className={join('absolute -translate-x-full flex-shrink-0 pl-2 pr-1 py-2 cursor-move transition-opacity opacity-0', (isDraggedItem || (isHovered && !draggedItem)) && 'opacity-100')}>\n\t\t\t\t\t\t\t\t\t\t<GripVertical size={iconSizeValue + 2} />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Marker */}\n\t\t\t\t\t\t\t\t{marker && (\n\t\t\t\t\t\t\t\t\t<div className={join('flex-shrink-0 flex items-center justify-center py-2 pr-2')}>\n\t\t\t\t\t\t\t\t\t\t{renderMarker(originalIndex)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Item Content */}\n\t\t\t\t\t\t\t\t<div className={join('flex-1 flex min-w-0')}>\n\t\t\t\t\t\t\t\t\t<div className={join('flex-1 min-w-0 py-2 pr-2')}>\n\t\t\t\t\t\t\t\t\t\t{itemRenderFunction ? (\n\t\t\t\t\t\t\t\t\t\t\titemRenderFunction(item, originalIndex)\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span className={join('block', truncateText && 'truncate')}>{item.content}</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Control Buttons */}\n\t\t\t\t\t\t\t\t\t{!draggedItem && (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t\t\t\t'flex-shrink-0 flex items-center gap-1 pr-2 opacity-0 transition-opacity',\n\t\t\t\t\t\t\t\t\t\t\t\tisHovered && 'opacity-100'\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{/* Move Up/Down Buttons */}\n\t\t\t\t\t\t\t\t\t\t\t{allowReorder && showReorderButtons && (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => moveItemUp(originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={originalIndex === 0}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 opacity-50 leading-0 hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Prevent from tabbing to this button since the behavior is not ideal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => moveItemDown(originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={originalIndex === items.length - 1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 opacity-50 leading-0 hover:opacity-80 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-colors'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Prevent from tabbing to this button since the behavior is not ideal\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden={true}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t\t{/* Delete Button */}\n\t\t\t\t\t\t\t\t\t\t\t{allowDelete && (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={isHovered ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleDeleteItem(e, originalIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName='p-0.5 text-destructive opacity-70 h-fit hover:opacity-90 rounded transition-colors focus:outline-none focus:ring-2 focus:ring-destructive'\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Delete item`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash size={iconSizeValue} />\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{showDividers && visualIndex < items.length - 1 && <hr className='border-border/50' />}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\n\t\t\t\t{/* Empty State */}\n\t\t\t\t{items.length === 0 && (\n\t\t\t\t\t<li className={join('text-center text-muted-foreground py-8', sizeClasses)}>\n\t\t\t\t\t\tNo items yet. {allowAdd && 'Add an item below to get started.'}\n\t\t\t\t\t</li>\n\t\t\t\t)}\n\t\t\t</ul>\n\n\t\t\t{/* Add New Item */}\n\t\t\t{allowAdd && (\n\t\t\t\t<div className={join('border-t border-border/50 flex items-center gap-2', sizeClasses)}>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={`${listId}-new-item-input`}\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\ttype='text'\n\t\t\t\t\t\tvalue={newItemText}\n\t\t\t\t\t\tonChange={(e) => setNewItemText(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyPress}\n\t\t\t\t\t\tplaceholder={addPlaceholder}\n\t\t\t\t\t\tclassName='flex-1 bg-transparent border-none outline-none placeholder-muted-foreground pt-1'\n\t\t\t\t\t\taria-label='Add new list item'\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\tonClick={handleAddItem}\n\t\t\t\t\t\tdisabled={!newItemText.trim()}\n\t\t\t\t\t\tclassName='flex-shrink-0 p-1.5 text-muted-foreground opacity-70 enabled:hover:opacity-100 disabled:opacity-30 disabled:cursor-not-allowed rounded transition-opacity'\n\t\t\t\t\t\taria-label='Add item'\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus size={16} />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","interface ErrorBoundaryVariantStyles {\n container: string;\n icon: string;\n title: string;\n description: string;\n button: string;\n details: string;\n}\n\nexport type ErrorBoundaryVariants = 'danger' | 'warning' | 'info';\n\nexport const ErrorBoundaryVariants: Record<ErrorBoundaryVariants, ErrorBoundaryVariantStyles> = {\n danger: {\n container: 'border-destructive bg-destructive/10',\n icon: 'text-destructive',\n title: 'text-destructive',\n description: 'text-destructive/80',\n button: 'bg-destructive text-destructive-foreground hover:bg-destructive/90 focus:ring-destructive',\n details: 'bg-destructive/5 border-destructive/20 text-destructive',\n },\n warning: {\n container: 'border-yellow-600 bg-yellow-600/10',\n icon: 'text-yellow-600',\n title: 'text-yellow-600',\n description: 'text-yellow-600/80',\n button: 'bg-yellow-600 text-white hover:bg-yellow-600/90 focus:ring-yellow-600',\n details: 'bg-yellow-600/5 border-yellow-600/20 text-yellow-600',\n },\n info: {\n container: 'border-blue-600 bg-blue-600/10',\n icon: 'text-blue-600',\n title: 'text-blue-600',\n description: 'text-blue-600/80',\n button: 'bg-blue-600 text-white hover:bg-blue-600/90 focus:ring-blue-600',\n details: 'bg-blue-600/5 border-blue-600/20 text-blue-600',\n },\n};","import React, { Component, ErrorInfo, ReactNode } from 'react';\nimport { ErrorBoundaryVariants } from './variants';\nimport { ExclamationTriangle, InfoCircled } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface ErrorBoundaryProps {\n /** The HTML id attribute for the error boundary */\n id?: string;\n /** The visual style variant of the error boundary */\n variant?: ErrorBoundaryVariants;\n /** Whether to show a retry button in the error fallback UI */\n showRetry?: boolean;\n /** Custom error message to display in the fallback UI */\n fallbackMessage?: string;\n /** Custom fallback UI to render on error instead of the default error display */\n fallback?: ReactNode;\n /** Callback function executed when the retry button is clicked */\n onRetry?: () => void;\n /** Callback function when error occurs */\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n /** Additional classes to apply to the ErrorBoundary container */\n className?: string;\n /** The children to render inside the ErrorBoundary */\n children: ReactNode;\n /** Flag to indicate if the app is in development mode. For showing error details in development mode */\n inDevEnv?: boolean;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nconst VariantIcons: Record<ErrorBoundaryVariants, React.ReactNode> = {\n danger: <ExclamationTriangle size={24} />,\n warning: <ExclamationTriangle size={24} />,\n info: <InfoCircled size={24} />,\n};\n\n/**\n * A React error boundary component that catches JavaScript errors in child components\n * and displays a fallback UI instead of crashing the entire application.\n * \n * @example\n * ```tsx\n * // Basic error boundary\n * <ErrorBoundary>\n * <MyComponent />\n * </ErrorBoundary>\n * \n * // With custom error handling and retry\n * <ErrorBoundary\n * variant=\"warning\"\n * fallbackMessage=\"Failed to load user profile\"\n * onError={(error) => logError(error)}\n * onRetry={() => refetchUserData()}\n * inDevEnv={process.env.NODE_ENV === 'development'}\n * >\n * <UserProfile />\n * </ErrorBoundary>\n * ```\n */\nexport function ErrorBoundary({\n id,\n variant = 'danger',\n showRetry = true,\n fallbackMessage,\n fallback,\n onRetry,\n onError,\n className,\n children,\n inDevEnv = false,\n}: ErrorBoundaryProps) {\n // Since functional components can't have error boundaries,\n // we need to use a class component wrapper\n return (\n <ErrorBoundaryClass\n id={id}\n variant={variant}\n showRetry={showRetry}\n fallbackMessage={fallbackMessage}\n fallback={fallback}\n onRetry={onRetry}\n onError={onError}\n className={className}\n inDevEnv={inDevEnv}\n >\n {children}\n </ErrorBoundaryClass>\n );\n}\n\nclass ErrorBoundaryClass extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ error, errorInfo });\n this.props.onError?.(error, errorInfo);\n \n // Log error for development\n if (this.props.inDevEnv) {\n console.error('ErrorBoundary caught an error:', error);\n console.error('Error info:', errorInfo);\n }\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n this.props.onRetry?.();\n };\n\n render() {\n const {\n id,\n variant = 'danger',\n showRetry = true,\n fallbackMessage = 'Something went wrong',\n fallback,\n className,\n inDevEnv,\n } = this.props;\n\n if (this.state.hasError) {\n // Use custom fallback if provided\n if (fallback) {\n return fallback;\n }\n\n const variantStyles = ErrorBoundaryVariants[variant];\n const icon = VariantIcons[variant];\n\n return (\n <div\n id={id}\n data-variant={variant}\n data-has-error={this.state.hasError}\n className={join(\n 'rounded-lg border p-6 text-center',\n variantStyles.container,\n className\n )}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <div className={join('mb-4 flex justify-center', variantStyles.icon)}>\n {icon}\n </div>\n \n <h3 className={join('text-lg font-semibold mb-2', variantStyles.title)}>\n Oops! Something went wrong\n </h3>\n \n <p className={join('text-sm mb-4', variantStyles.description)}>\n {fallbackMessage}\n </p>\n\n {inDevEnv && this.state.error && (\n <details className=\"mt-4 text-left\">\n <summary className=\"cursor-pointer text-sm font-medium mb-2\">\n Error Details (Development Only)\n </summary>\n <div className={join(\n 'rounded border p-3 text-xs font-mono whitespace-pre-wrap overflow-auto max-h-40',\n variantStyles.details\n )}>\n <div className=\"font-bold mb-1\">Error:</div>\n <div className=\"mb-2\">{this.state.error.toString()}</div>\n {this.state.errorInfo?.componentStack && (\n <>\n <div className=\"font-bold mb-1\">Component Stack:</div>\n <div>{this.state.errorInfo.componentStack}</div>\n </>\n )}\n </div>\n </details>\n )}\n\n {showRetry && (\n <button\n type=\"button\"\n onClick={this.handleRetry}\n className={join(\n 'inline-flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-transparent',\n variantStyles.button\n )}\n aria-label=\"Try again\"\n >\n Try Again\n </button>\n )}\n </div>\n );\n }\n\n return this.props.children;\n }\n}","import {\n FormInputField,\n FormTextareaField,\n FormSelectField,\n FormCheckboxField,\n FormRadioField\n} from './types';\n\nconst input = (field: Omit<FormInputField, '__type'>): FormInputField => ({\n __type: 'input',\n ...field,\n});\n\nconst textarea = (field: Omit<FormTextareaField, '__type'>): FormTextareaField => ({\n __type: 'textarea',\n ...field,\n});\n\nconst select = (field: Omit<FormSelectField, '__type'>): FormSelectField => ({\n __type: 'select',\n ...field,\n});\n\nconst checkbox = (field: Omit<FormCheckboxField, '__type'>): FormCheckboxField => ({\n __type: 'checkbox',\n ...field,\n});\n\nconst radio = (field: Omit<FormRadioField, '__type'>): FormRadioField => ({\n __type: 'radio',\n ...field,\n});\n\nexport const FormFactories = {\n input,\n textarea,\n select,\n checkbox,\n radio,\n};","import { useState, useCallback, useMemo } from 'react';\nimport { FormField, FormData, FormErrors, IsValidFunc } from './types';\n\nexport function useFormValidation(fields: FormField[], data: FormData) {\n const [errors, setErrors] = useState<FormErrors>({});\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validateField = useCallback((field: FormField, value: any): string | null => {\n // Check required fields\n if (field.required && (!value || (typeof value === 'string' && value.trim() === ''))) {\n return `${field.label} is required`;\n }\n\n // Run custom validation if provided\n if (field.isValid && value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isValidFunc = field.isValid as IsValidFunc<any>;\n const validation = isValidFunc(value);\n if (!validation.valid) {\n return validation.message || `${field.label} is invalid`;\n }\n }\n\n return null;\n }, []);\n\n const validateForm = useCallback((currentData: FormData = data) => {\n const newErrors: FormErrors = {};\n \n fields.forEach(field => {\n const error = validateField(field, currentData[field.name]);\n if (error) {\n newErrors[field.name] = error;\n }\n });\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, [fields, data, validateField]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validateSingleField = useCallback((fieldName: string, value: any) => {\n const field = fields.find(f => f.name === fieldName);\n if (!field) return;\n\n const error = validateField(field, value);\n setErrors(prev => {\n const newErrors = { ...prev };\n if (error) {\n newErrors[fieldName] = error;\n } else {\n delete newErrors[fieldName];\n }\n return newErrors;\n });\n\n return !error;\n }, [fields, validateField]);\n\n const clearErrors = useCallback(() => {\n setErrors({});\n }, []);\n\n const hasErrors = useMemo(() => {\n return Object.values(errors).some(error => error);\n }, [errors]);\n\n const isFormValid = useMemo(() => {\n // Check if all required fields have values and pass validation\n return fields.every(field => {\n const value = data[field.name];\n \n // Check required fields\n if (field.required && (!value || (typeof value === 'string' && value.trim() === ''))) {\n return false;\n }\n \n // Check custom validation\n if (field.isValid && value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isValidFunc = field.isValid as IsValidFunc<any>;\n const validation = isValidFunc(value);\n return validation.valid;\n }\n \n return true;\n }) && !hasErrors;\n }, [fields, data, hasErrors]);\n\n return {\n errors,\n hasErrors,\n isFormValid,\n validateForm,\n validateSingleField,\n clearErrors,\n };\n}","export const formVariants = {\n spacing: {\n tight: 'gap-3',\n normal: 'gap-4', \n loose: 'gap-6',\n },\n columns: {\n 1: 'grid-cols-1',\n 2: 'grid-cols-1 md:grid-cols-2', \n 3: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4',\n },\n colSpan: {\n 1: 'col-span-1',\n 2: 'col-span-1 md:col-span-2',\n 3: 'col-span-1 md:col-span-2 lg:col-span-3', \n 4: 'col-span-1 md:col-span-2 lg:col-span-4',\n full: 'col-span-full',\n },\n} as const;\n\nexport type FormSpacing = keyof typeof formVariants.spacing;\nexport type FormColumns = keyof typeof formVariants.columns;\nexport type FormColSpan = keyof typeof formVariants.colSpan;\n\nexport interface FormVariants {\n /** Spacing between form fields. */\n spacing: FormSpacing;\n /** Number of columns in the form grid layout. */\n columns?: FormColumns;\n /** Whether to collapse to single column on mobile devices. */\n responsive?: boolean;\n}\n\nexport const formDefaults: FormVariants = {\n spacing: 'normal',\n columns: 1,\n responsive: true,\n} as const;","import React, { useId } from 'react';\nimport { QuestionMarkCircled } from '../../symbols';\nimport { join } from '../../utils';\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n /** The display type of the label. */\n display?: 'block' | 'inline';\n /** The width of the label element. */\n width?: React.CSSProperties['width'];\n /** Whether to show a required indicator (*) next to the label. */\n required?: boolean;\n /** Help text to display in a tooltip next to the label. */\n helpMessage?: string;\n /** Additional content to display after the label text. */\n suffix?: React.ReactNode;\n /** Description text to display below the label. */\n description?: string;\n}\n\n/**\n * A form label component with support for required indicators, help tooltips,\n * and description text. Provides accessibility features for form elements.\n * \n * @example\n * ```tsx\n * // Basic label\n * <Label htmlFor=\"email\">Email Address</Label>\n * \n * // Required field with description\n * <Label \n * htmlFor=\"password\"\n * required\n * description=\"Must be at least 8 characters\"\n * >\n * Password\n * </Label>\n * \n * // With help tooltip\n * <Label \n * htmlFor=\"username\"\n * helpMessage=\"Username will be visible to other users\"\n * >\n * Display Name\n * </Label>\n * ```\n */\nexport function Label({\n display = 'inline',\n width = 'fit-content',\n className = '',\n required,\n helpMessage,\n suffix,\n htmlFor,\n children,\n description,\n ...props\n}: LabelProps) {\n const id = useId();\n const showHelp = (helpMessage?.trim()?.length || 0) > 0;\n const showDescription = (description?.trim()?.length || 0) > 0;\n const helpId = showHelp ? `${htmlFor ?? id}-help` : undefined;\n const descriptionId = showDescription ? `${htmlFor ?? id}-description` : undefined;\n\n return (\n <div\n style={{ display: display === 'inline' ? 'inline-block' : 'block', width }}\n className={join('mb-0.5', className)}\n >\n <div className='relative flex'>\n <label className='font-medium' htmlFor={htmlFor} {...props}>\n {children}\n {required && (\n <span className='text-red-500 font-medium ml-1' aria-label='required'>\n *\n </span>\n )}\n </label>\n {showHelp && (\n <span\n className='text-gray-500 ml-1 size-fit -translate-y-1/3'\n aria-describedby={helpId}\n aria-label='Help information'\n title={helpMessage}\n >\n <QuestionMarkCircled />\n </span>\n )}\n {showHelp && (\n <div id={helpId} className='sr-only'>\n {helpMessage}\n </div>\n )}\n {suffix && <span className='ml-1'>{suffix}</span>}\n </div>\n {showDescription && (\n <small id={descriptionId} className='block opacity-80 mt-0.5' role='note'>\n {description}\n </small>\n )}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { CheckCircled, ExclamationTriangle } from '../../symbols';\nimport { join } from '../../utils';\n\ninterface StatusHelpMessageProps {\n elementId: string;\n type: 'error' | 'success';\n message?: string;\n}\n\nexport default function StatusHelpMessage({ elementId, type, message }: StatusHelpMessageProps) {\n useEffect(() => {\n const element = document.getElementById(elementId) as HTMLElement;\n if (!element) {\n return;\n }\n if (!message && type === 'error') {\n element.removeAttribute('data-error');\n return;\n }\n if (!message && type === 'success') {\n element.removeAttribute('data-success');\n return;\n }\n\n element.setAttribute('aria-describedby', `${elementId}-${type}-message`);\n element.setAttribute('aria-invalid', type === 'error' ? 'true' : 'false');\n\n if (type === 'error') {\n element.setAttribute('data-error', 'true');\n }\n if (type === 'success') {\n element.setAttribute('data-success', 'true');\n }\n\n return () => {\n element.removeAttribute('aria-describedby');\n element.removeAttribute('aria-invalid');\n element.removeAttribute('data-error');\n element.removeAttribute('data-success');\n };\n }, [elementId, type, message]);\n\n if (!message) {\n return null;\n }\n\n return (\n <small\n className={join(\n 'mt-0.5 text-sm inline-flex items-center gap-1 w-full justify-start',\n type === 'error' && 'text-destructive',\n type === 'success' && 'text-success'\n )}\n role='status'\n >\n {type === 'error' ? <ExclamationTriangle /> : <CheckCircled />}\n <span id={`${elementId}-${type}-message`}>{message}</span>\n </small>\n );\n}\n","export const inputVariants = {\n base: '',\n default:\n 'ring ring-transparent focus:ring-primary-foreground not-disabled:data-error:ring-destructive not-disabled:data-success:ring-success',\n underline:\n 'border-b border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n outline:\n 'border border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n} as const;\nexport type InputVariant = keyof typeof inputVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'px-3 rounded-full',\n} as const;\nexport type InputRounded = keyof typeof roundedVariants;\n\nexport interface InputVariants {\n /** The visual style variant of the input. */\n variant: InputVariant;\n /** The border radius of the input. */\n rounded: InputRounded;\n}\n\nexport const inputDefaults: InputVariants = {\n variant: 'default',\n rounded: 'none',\n} as const;\n","import { Ref, useId, useState } from 'react';\nimport { StatusHelpMessage } from '../../shared/forms';\nimport { EyeClosed, EyeOpened } from '../../symbols';\nimport { join } from '../../utils';\nimport './styles.css';\nimport { inputDefaults, inputVariants, InputVariants, roundedVariants } from './variants';\n\nexport interface InputProps extends Partial<InputVariants>, React.InputHTMLAttributes<HTMLInputElement> {\n /** Reference to the input element. */\n ref?: Ref<HTMLInputElement>;\n /** Whether the input is in read-only display mode. */\n displayOnlyMode?: boolean;\n /** Error message to display below the input when invalid. */\n errorMessage?: string;\n /** Success message to display below the input when valid. */\n successMessage?: string;\n}\n\n/**\n * A versatile input component with support for various types, validation states,\n * and password visibility toggle. Includes error/success message display.\n * \n * @example\n * ```tsx\n * // Basic input\n * <Input \n * placeholder=\"Enter your name\"\n * value={name}\n * onChange={(e) => setName(e.target.value)}\n * />\n * \n * // Password input with validation\n * <Input\n * type=\"password\"\n * placeholder=\"Enter password\"\n * errorMessage={passwordError}\n * variant=\"outline\"\n * rounded=\"lg\"\n * />\n * \n * // Read-only display mode\n * <Input value=\"John Doe\" displayOnlyMode />\n * ```\n */\nexport function Input({\n variant = inputDefaults.variant,\n rounded,\n displayOnlyMode = false,\n errorMessage,\n successMessage,\n type = 'text',\n className,\n ...rest\n}: InputProps) {\n const id = useId();\n const [showPassword, setShowPassword] = useState(false);\n\n // Default `round` of `md` for `outline` variant\n let adjustedRound = rounded;\n if (variant === 'outline' && !rounded) {\n adjustedRound = 'md';\n }\n adjustedRound = adjustedRound || inputDefaults.rounded;\n\n const baseClasses =\n 'appearance-none w-full focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed placeholder:text-muted-foreground/70 hide-number-input-arrows transition-all';\n const fileClasses =\n 'file:mr-2 file:border-0 file:rounded-md file:px-1.5 file:py-1 file:bg-primary hover:file:bg-primary/85 file:text-sm file:font-medium file:text-foreground file:transition-colors';\n\n const inputClasses = join(\n baseClasses,\n fileClasses,\n !displayOnlyMode && inputVariants[variant],\n !displayOnlyMode && roundedVariants[adjustedRound],\n type === 'password' && 'pr-10',\n !displayOnlyMode && 'px-2 py-1',\n displayOnlyMode && 'pointer-events-none',\n className\n );\n\n return (\n <div className={join(displayOnlyMode && 'cursor-text')} style={{ height: rest.height, width: rest.width }}>\n <div className={join(type === 'password' && 'relative')}>\n <input\n {...rest}\n id={id}\n type={type === 'password' && showPassword ? 'text' : type}\n aria-disabled={rest.disabled}\n readOnly={displayOnlyMode}\n aria-readonly={displayOnlyMode || rest['aria-readonly']}\n data-error={errorMessage ? true : undefined}\n data-success={successMessage ? true : undefined}\n className={inputClasses}\n />\n {type === 'password' && (\n <button\n onClick={() => setShowPassword(!showPassword)}\n className='absolute inset-y-0 right-0 px-2 hover:cursor-pointer'\n aria-label='Toggle password visibility'\n data-state={showPassword ? 'visible' : 'hidden'}\n >\n {showPassword ? <EyeOpened size={20} /> : <EyeClosed size={20} />}\n </button>\n )}\n </div>\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='error' message={errorMessage} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='success' message={successMessage} />}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { join } from '../../utils';\n\ninterface CharacterCountProps {\n elementId: string;\n maxLength: number;\n}\n\nexport default function CharacterCount({ elementId, maxLength }: CharacterCountProps) {\n const [characterCount, setCharacterCount] = useState(0);\n\n useEffect(() => {\n const textarea = document.getElementById(elementId) as HTMLTextAreaElement;\n if (!textarea) {\n return;\n }\n\n const updateCharacterCount = () => {\n const updatedCharacterCount = textarea.value.length;\n setCharacterCount(updatedCharacterCount);\n const isError = updatedCharacterCount >= maxLength;\n textarea.setAttribute('aria-describedby', `${elementId}-character-count`);\n textarea.setAttribute('aria-invalid', isError ? 'true' : 'false');\n\n if (isError) {\n textarea.setAttribute('data-error', 'true');\n } else {\n textarea.removeAttribute('data-error');\n }\n };\n\n updateCharacterCount();\n textarea.addEventListener('input', updateCharacterCount);\n textarea.setAttribute('maxlength', String(maxLength));\n\n return () => {\n textarea.removeEventListener('input', updateCharacterCount);\n textarea.removeAttribute('maxlength');\n textarea.removeAttribute('aria-describedby');\n textarea.removeAttribute('aria-invalid');\n textarea.removeAttribute('data-error');\n };\n }, [elementId, maxLength]);\n\n return (\n <small\n className={join(\n 'mt-0.5 text-sm inline-flex items-center gap-1 w-full justify-end',\n characterCount >= maxLength && 'text-destructive',\n characterCount < maxLength && 'text-current'\n )}\n role='status'\n >\n <span id={`${elementId}-character-count`}>\n {characterCount} / {maxLength} characters\n </span>\n </small>\n );\n}\n","import { useEffect } from 'react';\n\nexport function useAutoExpand(id: string, autoExpand: boolean) {\n useEffect(() => {\n const textarea = document.getElementById(id) as HTMLTextAreaElement;\n if (!textarea) {\n return;\n }\n\n if (!autoExpand) {\n textarea.style.height = 'auto';\n return;\n }\n\n const adjustHeight = () => {\n // necessary to reset the height to `auto` before calculating the new height\n textarea.style.height = 'auto';\n textarea.style.height = `${textarea.scrollHeight}px`;\n };\n\n adjustHeight();\n textarea.addEventListener('input', adjustHeight);\n textarea.addEventListener('resize', adjustHeight);\n window.addEventListener('resize', adjustHeight);\n\n return () => {\n textarea.removeEventListener('input', adjustHeight);\n textarea.removeEventListener('resize', adjustHeight);\n window.removeEventListener('resize', adjustHeight);\n };\n }, [id, autoExpand]);\n}\n","export const textareaVariants = {\n base: '',\n 'left-line':\n 'border-l border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n outline:\n 'border border-border focus:border-primary-foreground disabled:border-muted/30 not-disabled:data-error:border-destructive not-disabled:data-success:border-success',\n} as const;\nexport type TextareaVariant = keyof typeof textareaVariants;\n\nexport const roundedVariants = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'px-3 rounded-full',\n} as const;\nexport type TextareaRounded = keyof typeof roundedVariants;\n\nexport interface TextareaVariants {\n /** Visual style variant of the textarea. */\n variant: TextareaVariant;\n /** Border radius of the textarea. */\n rounded: TextareaRounded;\n}\n\nexport const textareaDefaults: TextareaVariants = {\n variant: 'outline',\n rounded: 'none',\n} as const;\n","import { Ref, useId } from 'react';\nimport { StatusHelpMessage } from '../../shared/forms';\nimport { join } from '../../utils';\nimport CharacterCount from './CharacterCount';\nimport { useAutoExpand } from './hooks';\nimport './styles.css';\nimport { roundedVariants, textareaDefaults, textareaVariants, TextareaVariants } from './variants';\n\nexport interface TextareaProps extends Partial<TextareaVariants>, React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Reference to the textarea element. */\n ref?: Ref<HTMLTextAreaElement>;\n /** Read-only mode for displaying text content without interaction styling. */\n displayOnlyMode?: boolean;\n /** Error message to display below the textarea. */\n errorMessage?: string;\n /** Success message to display below the textarea. */\n successMessage?: string;\n /** Whether to hide the resize handle (Webkit browsers only). */\n hideResizeHandle?: boolean; // only works for Webkit browsers\n /** Whether the textarea should automatically expand based on content. */\n autoExpand?: boolean;\n /** Maximum number of characters allowed. Shows character count when > 0. */\n characterLimit?: number;\n}\n\n/**\n * A versatile textarea component with auto-expand, character counting, and validation states.\n * Supports both interactive and display-only modes with various styling options.\n * \n * @example\n * ```tsx\n * // Basic textarea\n * <Textarea \n * placeholder=\"Enter your message...\"\n * rows={4}\n * value={message}\n * onChange={(e) => setMessage(e.target.value)}\n * />\n * \n * // Auto-expanding with character limit\n * <Textarea\n * autoExpand\n * characterLimit={500}\n * placeholder=\"Write your bio...\"\n * errorMessage={bioError}\n * variant=\"outline\"\n * />\n * \n * // Display-only mode\n * <Textarea \n * displayOnlyMode \n * value=\"Read-only content display\"\n * />\n * ```\n */\nexport function Textarea({\n variant = textareaDefaults.variant,\n rounded,\n displayOnlyMode = false,\n errorMessage,\n successMessage,\n hideResizeHandle = false,\n autoExpand = false,\n characterLimit = 0,\n className,\n ...rest\n}: TextareaProps) {\n const id = useId();\n useAutoExpand(id, autoExpand || displayOnlyMode);\n\n // Default `round` of `md` for `outline` variant\n let adjustedRound = rounded;\n if (variant === 'outline' && !rounded) {\n adjustedRound = 'md';\n }\n adjustedRound = adjustedRound || textareaDefaults.rounded;\n\n let adjustedHideResizeHandle = hideResizeHandle;\n if (displayOnlyMode || (variant === 'left-line' && !hideResizeHandle)) {\n adjustedHideResizeHandle = true;\n }\n\n const baseClasses =\n 'appearance-none w-full focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed placeholder:text-muted-foreground/70 hide-number-input-arrows transition-all';\n\n const inputClasses = join(\n baseClasses,\n !displayOnlyMode && textareaVariants[variant],\n !displayOnlyMode && roundedVariants[adjustedRound],\n !displayOnlyMode && 'px-2 py-1',\n displayOnlyMode && 'pointer-events-none',\n adjustedHideResizeHandle && 'no-resize-handle',\n\n className\n );\n\n return (\n <div className={join('-space-y-1.5', displayOnlyMode && 'cursor-text')}>\n <textarea\n {...rest}\n id={id}\n aria-disabled={rest.disabled}\n readOnly={displayOnlyMode}\n aria-readonly={displayOnlyMode || rest['aria-readonly']}\n style={{\n resize: autoExpand ? 'none' : undefined,\n }}\n className={inputClasses}\n />\n {characterLimit > 0 && <CharacterCount elementId={id} maxLength={characterLimit} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='error' message={errorMessage} />}\n {!displayOnlyMode && <StatusHelpMessage elementId={id} type='success' message={successMessage} />}\n </div>\n );\n}\n","import { RefObject, useCallback, useEffect, useMemo, useState } from 'react';\n\nexport interface SelectOption {\n text: string;\n value: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport function useSelectDropdown(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 150);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\ninterface UseSelectKeyboardNavigationProps {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n filteredOptions: SelectOption[];\n highlightedIndex: number;\n setHighlightedIndex: (index: number) => void;\n onSelect: (option: SelectOption) => void;\n triggerRef: RefObject<HTMLButtonElement | null>;\n}\n\nexport function useSelectKeyboardNavigation({\n isOpen,\n setIsOpen,\n filteredOptions,\n highlightedIndex,\n setHighlightedIndex,\n onSelect,\n triggerRef,\n}: UseSelectKeyboardNavigationProps) {\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n const nextIndex = highlightedIndex < filteredOptions.length - 1 ? highlightedIndex + 1 : 0;\n // Skip disabled options\n let finalIndex = nextIndex;\n for (let i = 0; i < filteredOptions.length; i++) {\n const checkIndex = (nextIndex + i) % filteredOptions.length;\n if (!filteredOptions[checkIndex].disabled) {\n finalIndex = checkIndex;\n break;\n }\n }\n setHighlightedIndex(finalIndex);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else {\n const prevIndex = highlightedIndex > 0 ? highlightedIndex - 1 : filteredOptions.length - 1;\n // Skip disabled options\n let finalIndex = prevIndex;\n for (let i = 0; i < filteredOptions.length; i++) {\n const checkIndex = (prevIndex - i + filteredOptions.length) % filteredOptions.length;\n if (!filteredOptions[checkIndex].disabled) {\n finalIndex = checkIndex;\n break;\n }\n }\n setHighlightedIndex(finalIndex);\n }\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else if (highlightedIndex >= 0 && highlightedIndex < filteredOptions.length) {\n const selectedOption = filteredOptions[highlightedIndex];\n if (!selectedOption.disabled) {\n onSelect(selectedOption);\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n break;\n\n case 'Tab':\n if (isOpen) {\n setIsOpen(false);\n }\n break;\n }\n },\n [isOpen, setIsOpen, filteredOptions, highlightedIndex, setHighlightedIndex, onSelect, triggerRef]\n );\n\n return { handleKeyDown };\n}\n\ninterface UseSelectHighlightProps {\n isOpen: boolean;\n filteredOptions: SelectOption[];\n selectedOption?: SelectOption;\n shouldRender: boolean;\n optionsContainerRef: RefObject<HTMLDivElement | null>;\n}\n\nexport function useSelectHighlight({\n isOpen,\n filteredOptions,\n selectedOption,\n shouldRender,\n optionsContainerRef,\n}: UseSelectHighlightProps) {\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n\n const selectedIndex = useMemo(() => {\n if (selectedOption) {\n return filteredOptions.findIndex((option) => option.value === selectedOption.value);\n }\n return -1;\n }, [filteredOptions, selectedOption]);\n\n // Set highlighted index when dropdown opens or options change\n useEffect(() => {\n if (isOpen && filteredOptions.length > 0) {\n if (selectedOption) {\n // Find the index of the selected option in filtered options\n setHighlightedIndex(selectedIndex >= 0 ? selectedIndex : 0);\n } else {\n // No selection, start from the first option\n setHighlightedIndex(0);\n }\n } else {\n // Reset highlighted index when dropdown closes\n setHighlightedIndex(-1);\n }\n }, [filteredOptions, isOpen, selectedOption, selectedIndex]);\n\n // Auto-scroll to highlighted option\n useEffect(() => {\n if (highlightedIndex >= 0 && optionsContainerRef.current && shouldRender) {\n const scrollToOption = () => {\n const container = optionsContainerRef.current;\n const highlightedOption = container?.querySelector(`[data-option-index=\"${highlightedIndex}\"]`) as HTMLElement;\n\n if (highlightedOption) {\n // Use immediate scroll when dropdown first opens with selected option, smooth scroll for keyboard navigation\n const behavior = isOpen && selectedOption && highlightedIndex === selectedIndex ? 'auto' : 'smooth';\n highlightedOption.scrollIntoView({\n behavior,\n block: 'nearest',\n });\n }\n };\n\n // Small delay to ensure DOM is rendered when dropdown opens\n if (isOpen && shouldRender && selectedOption) {\n setTimeout(scrollToOption, 10);\n } else {\n scrollToOption();\n }\n }\n }, [highlightedIndex, shouldRender, isOpen, selectedOption, filteredOptions, optionsContainerRef, selectedIndex]);\n\n return { highlightedIndex, setHighlightedIndex };\n}\n","export const sizeVariants = {\n sm: {\n trigger: 'px-2 py-1 text-sm',\n options: 'px-2 py-2 text-xs',\n },\n md: {\n trigger: 'px-3 py-2 text-base',\n options: 'px-3 py-2.5 text-sm',\n },\n lg: {\n trigger: 'px-4 py-3 text-lg',\n options: 'px-4 py-3 text-base',\n },\n} as const;\n\nexport type SelectSize = keyof typeof sizeVariants;\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useScrollArea(scrollbarThickness: number) {\n const viewportRef = useRef<HTMLDivElement>(null);\n const verticalThumbRef = useRef<HTMLDivElement>(null);\n const horizontalThumbRef = useRef<HTMLDivElement>(null);\n const [isScrolling, setIsScrolling] = useState(false);\n const [isFadingOut, setIsFadingOut] = useState(false);\n const [scrollbarVisible, setScrollbarVisible] = useState({\n vertical: false,\n horizontal: false,\n });\n const scrollTimeout = useRef<number | null>(null);\n const fadeTimeout = useRef<number | null>(null);\n\n // Check if content overflows and update scrollbar visibility\n const checkOverflow = useCallback(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n const hasVerticalScroll = viewport.scrollHeight > viewport.clientHeight;\n const hasHorizontalScroll = viewport.scrollWidth > viewport.clientWidth;\n\n setScrollbarVisible({\n vertical: hasVerticalScroll,\n horizontal: hasHorizontalScroll,\n });\n }, []);\n\n // Update thumb sizes and positions based on scroll state\n const updateThumbSizes = useCallback(() => {\n const viewport = viewportRef.current;\n const verticalThumb = verticalThumbRef.current;\n const horizontalThumb = horizontalThumbRef.current;\n\n if (!viewport) return;\n\n if (verticalThumb && scrollbarVisible.vertical) {\n // Calculate available height (subtract horizontal scrollbar thickness if present)\n const availableHeight = scrollbarVisible.horizontal \n ? viewport.clientHeight - scrollbarThickness \n : viewport.clientHeight;\n \n const scrollRatio = availableHeight / viewport.scrollHeight;\n const thumbHeight = Math.max(scrollRatio * 100, 10); // Minimum 10% height\n\n // Calculate scroll percentage (0 to 1)\n const maxScrollTop = viewport.scrollHeight - viewport.clientHeight;\n const scrollPercentage = maxScrollTop > 0 ? viewport.scrollTop / maxScrollTop : 0;\n\n // The thumb should move from 0% to (100% - thumbHeight%) of the available track\n const maxThumbPosition = 100 - thumbHeight;\n const thumbTop = scrollPercentage * maxThumbPosition;\n\n verticalThumb.style.height = `${thumbHeight}%`;\n verticalThumb.style.top = `${thumbTop}%`;\n verticalThumb.style.transform = 'none';\n }\n\n if (horizontalThumb && scrollbarVisible.horizontal) {\n // Calculate available width (subtract vertical scrollbar thickness if present)\n const availableWidth = scrollbarVisible.vertical \n ? viewport.clientWidth - scrollbarThickness \n : viewport.clientWidth;\n \n const scrollRatio = availableWidth / viewport.scrollWidth;\n const thumbWidth = Math.max(scrollRatio * 100, 10); // Minimum 10% width\n\n // Calculate scroll percentage (0 to 1)\n const maxScrollLeft = viewport.scrollWidth - viewport.clientWidth;\n const scrollPercentage = maxScrollLeft > 0 ? viewport.scrollLeft / maxScrollLeft : 0;\n\n // The thumb should move from 0% to (100% - thumbWidth%) of the available track\n const maxThumbPosition = 100 - thumbWidth;\n const thumbLeft = scrollPercentage * maxThumbPosition;\n\n horizontalThumb.style.width = `${thumbWidth}%`;\n horizontalThumb.style.left = `${thumbLeft}%`;\n horizontalThumb.style.transform = 'none';\n }\n }, [scrollbarVisible, scrollbarThickness]);\n\n // Handle scroll events\n const handleScroll = useCallback(() => {\n // Clear any existing timeouts\n if (scrollTimeout.current) {\n clearTimeout(scrollTimeout.current);\n }\n if (fadeTimeout.current) {\n clearTimeout(fadeTimeout.current);\n }\n\n setIsScrolling(true);\n setIsFadingOut(false);\n updateThumbSizes();\n\n // Start fade-out process after scroll stops\n scrollTimeout.current = setTimeout(() => {\n setIsFadingOut(true);\n \n // Remove scrollbars after fade animation completes\n fadeTimeout.current = setTimeout(() => {\n setIsScrolling(false);\n setIsFadingOut(false);\n }, 300); // 300ms for fade-out animation\n }, 1000); // 1s delay before fade starts\n }, [updateThumbSizes]);\n\n // Set up observers for content and size changes\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n checkOverflow();\n\n // Use ResizeObserver to watch for size changes\n const resizeObserver = new ResizeObserver(checkOverflow);\n resizeObserver.observe(viewport);\n\n // Also check on content changes\n const mutationObserver = new MutationObserver(checkOverflow);\n mutationObserver.observe(viewport, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [checkOverflow]);\n\n // Update thumb sizes when scrollbar visibility changes\n useEffect(() => {\n updateThumbSizes();\n }, [scrollbarVisible, updateThumbSizes]);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeout.current) {\n clearTimeout(scrollTimeout.current);\n }\n if (fadeTimeout.current) {\n clearTimeout(fadeTimeout.current);\n }\n };\n }, []);\n\n return {\n viewportRef,\n verticalThumbRef,\n horizontalThumbRef,\n isScrolling,\n isFadingOut,\n scrollbarVisible,\n handleScroll,\n };\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React from 'react';\nimport { useScrollArea } from './hooks';\n\nexport interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Custom CSS classes for the root container. Use this to set width/height */\n className?: string;\n /** Custom CSS classes for the scroll thumb */\n thumbClassName?: string;\n /** Custom CSS classes for the viewport (scrollable content area) */\n viewportClassName?: string;\n /** Custom CSS classes for the scrollbar track */\n scrollbarClassName?: string;\n /** Scrollbar thickness in pixels. Defaults to 10px */\n scrollbarThickness?: number;\n /** Children content to be scrolled */\n children: React.ReactNode;\n /** HTML id attribute */\n id?: string;\n /** Reference to the root element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A custom scrollable area component with styled scrollbars that appear on hover/scroll.\n * Provides cross-browser consistent scrolling experience with customizable appearance.\n * \n * @example\n * ```tsx\n * // Basic scroll area\n * <ScrollArea className=\"h-64 w-full border rounded\">\n * <div className=\"p-4 space-y-2\">\n * {Array.from({length: 50}).map((_, i) => (\n * <div key={i}>Item {i + 1}</div>\n * ))}\n * </div>\n * </ScrollArea>\n * \n * // Customized scrollbars\n * <ScrollArea \n * className=\"h-96 w-80\"\n * scrollbarThickness={12}\n * thumbClassName=\"bg-primary/60 hover:bg-primary/80\"\n * >\n * <LongContent />\n * </ScrollArea>\n * ```\n */\nexport function ScrollArea({\n className,\n thumbClassName,\n viewportClassName,\n scrollbarClassName,\n scrollbarThickness = 8,\n children,\n id,\n ref,\n ...props\n}: ScrollAreaProps) {\n const { viewportRef, verticalThumbRef, horizontalThumbRef, isScrolling, isFadingOut, scrollbarVisible, handleScroll } =\n useScrollArea(scrollbarThickness);\n\n const thumbsClassName = join(\n 'relative flex-1 rounded-full bg-slate-400/60 hover:bg-slate-400/80 active:bg-slate-400',\n thumbClassName\n );\n\n return (\n <div ref={ref} id={id} className={join('relative overflow-hidden', className)} data-scroll-area-root='' {...props}>\n <div\n ref={viewportRef}\n className={join(\n 'h-full w-full overflow-auto rounded-[inherit] [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden',\n viewportClassName\n )}\n onScroll={handleScroll}\n data-scroll-area-viewport=''\n >\n {children}\n </div>\n\n {/* Vertical Scrollbar */}\n {scrollbarVisible.vertical && (isScrolling || isFadingOut) && (\n <div\n className={join(\n 'touch-none select-none transition-all duration-300',\n 'p-[1px]',\n 'absolute right-0 top-0',\n isFadingOut ? 'opacity-0' : 'opacity-100',\n scrollbarClassName\n )}\n data-scroll-area-scrollbar='vertical'\n data-state={isScrolling ? 'visible' : 'hidden'}\n style={{ \n width: `${scrollbarThickness}px`,\n height: scrollbarVisible.horizontal \n ? `calc(100% - ${scrollbarThickness}px)` \n : '100%'\n }}\n >\n <div\n ref={verticalThumbRef}\n className={join('absolute rounded-full', thumbsClassName)}\n data-scroll-area-thumb=''\n style={{ height: '20%', top: '0%', width: '100%' }}\n />\n </div>\n )}\n\n {/* Horizontal Scrollbar */}\n {scrollbarVisible.horizontal && (isScrolling || isFadingOut) && (\n <div\n className={join(\n 'touch-none select-none transition-all duration-300',\n 'p-[1px]',\n 'absolute bottom-0 left-0',\n isFadingOut ? 'opacity-0' : 'opacity-100',\n scrollbarClassName\n )}\n data-scroll-area-scrollbar='horizontal'\n data-state={isScrolling ? 'visible' : 'hidden'}\n style={{ \n height: `${scrollbarThickness}px`,\n width: scrollbarVisible.vertical \n ? `calc(100% - ${scrollbarThickness}px)` \n : '100%'\n }}\n >\n <div\n ref={horizontalThumbRef}\n className={join('absolute rounded-full', thumbsClassName)}\n data-scroll-area-thumb=''\n style={{ width: '20%', left: '0%', height: '100%' }}\n />\n </div>\n )}\n\n {/* Corner */}\n {scrollbarVisible.vertical && scrollbarVisible.horizontal && (\n <div \n className={join('bg-transparent', 'absolute bottom-0 right-0')} \n data-scroll-area-corner=''\n style={{ \n height: `${scrollbarThickness}px`, \n width: `${scrollbarThickness}px` \n }}\n />\n )}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect, useMemo, useCallback, useId } from 'react';\nimport { useSelectDropdown, useSelectKeyboardNavigation, useSelectHighlight, SelectOption } from './hooks';\nimport { sizeVariants, SelectSize } from './variants';\nimport { join } from '../../utils';\nimport { Check, ChevronDown, X } from '../../symbols';\nimport { ScrollArea } from '../scroll-area';\n\nexport type { SelectOption };\n\nexport interface SelectProps {\n /** Array of option objects. SelectOption: { text: string, value: string, disabled?: boolean, description?: string } */\n options: SelectOption[];\n /** The current value of the select (controlled). */\n value?: string;\n /** Placeholder text to show when no option is selected. */\n placeholder?: string;\n /** Whether the select is searchable (combobox mode). */\n searchable?: boolean;\n /** Whether the entire select is disabled. */\n disabled?: boolean;\n /** Whether to show a clear button to reset selection. */\n clearable?: boolean;\n /** The size variant of the select. */\n size?: SelectSize;\n /** Additional CSS classes to apply to the select container. */\n className?: string;\n /** Additional CSS classes to apply to the trigger button. */\n triggerClassName?: string;\n /** Additional CSS classes to apply to the dropdown menu. */\n dropdownClassName?: string;\n /** The HTML id attribute for the select. */\n id?: string;\n /** Reference to the select container element. */\n ref?: React.Ref<HTMLDivElement>;\n /** Callback fired when the selection changes. */\n onChange?: (value: string) => void;\n /** Callback fired when search input changes (searchable mode). */\n onSearch?: (searchTerm: string) => void;\n /** Placeholder text for the search input (searchable mode). */\n searchPlaceholder?: string;\n}\n\n/**\n * A feature-rich select component with search, keyboard navigation, and accessibility.\n * Supports both simple selection and searchable combobox functionality.\n * \n * @example\n * ```tsx\n * // Basic select\n * const options = [\n * { text: 'Apple', value: 'apple' },\n * { text: 'Banana', value: 'banana' },\n * { text: 'Orange', value: 'orange' }\n * ];\n * \n * <Select\n * options={options}\n * value={selectedFruit}\n * onChange={setSelectedFruit}\n * placeholder=\"Choose a fruit\"\n * />\n * \n * // Searchable select with descriptions\n * <Select\n * options={[\n * { text: 'React', value: 'react', description: 'A library for building UIs' },\n * { text: 'Vue', value: 'vue', description: 'The progressive framework' }\n * ]}\n * searchable\n * clearable\n * placeholder=\"Select framework...\"\n * searchPlaceholder=\"Search frameworks...\"\n * onChange={setFramework}\n * />\n * ```\n */\nexport function Select({\n options,\n value,\n placeholder = 'Select an option...',\n searchable = false,\n disabled = false,\n clearable = false,\n size = 'md',\n className,\n triggerClassName,\n dropdownClassName,\n id,\n ref,\n onChange,\n onSearch,\n searchPlaceholder = 'Search options...',\n}: SelectProps) {\n const generatedId = useId();\n const activeId = id ?? generatedId;\n const listboxId = `${activeId}-listbox`;\n\n const getOptionId = (index: number) => `${listboxId}-option-${index}`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionsContainerRef = useRef<HTMLDivElement>(null);\n\n const { show, shouldRender } = useSelectDropdown(isOpen);\n\n // Filter options based on search term\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchTerm) return options;\n return options.filter(\n (option) =>\n option.text.toLowerCase().includes(searchTerm.toLowerCase()) ||\n option.description?.toLowerCase().includes(searchTerm.toLowerCase())\n );\n }, [options, searchable, searchTerm]);\n\n const selectedOption = useMemo(() => options.find((option) => option.value === value), [options, value]);\n\n // Use the highlight hook\n const { highlightedIndex, setHighlightedIndex } = useSelectHighlight({\n isOpen,\n filteredOptions,\n selectedOption,\n shouldRender,\n optionsContainerRef,\n });\n\n const activeDescendantId = highlightedIndex >= 0 ? getOptionId(highlightedIndex) : undefined;\n\n // Focus search input when dropdown opens\n useEffect(() => {\n if (isOpen && shouldRender && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable, shouldRender]);\n\n const keyboardOnSelect = useCallback(\n (option: SelectOption) => {\n if (!option.disabled) {\n onChange?.(option.value);\n setIsOpen(false);\n setSearchTerm('');\n triggerRef.current?.focus();\n }\n },\n [onChange]\n );\n\n const { handleKeyDown } = useSelectKeyboardNavigation({\n isOpen,\n setIsOpen,\n filteredOptions,\n highlightedIndex,\n setHighlightedIndex,\n onSelect: keyboardOnSelect,\n triggerRef,\n });\n\n // Close dropdown when clicking outside\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n !triggerRef.current?.contains(event.target as Node)\n ) {\n setIsOpen(false);\n setSearchTerm('');\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n if (!isOpen) {\n setSearchTerm('');\n setHighlightedIndex(-1);\n }\n }\n };\n\n const handleOptionClick = (option: SelectOption) => {\n if (!option.disabled) {\n onChange?.(option.value);\n setIsOpen(false);\n setSearchTerm('');\n }\n };\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const term = e.target.value;\n setSearchTerm(term);\n onSearch?.(term);\n setHighlightedIndex(-1);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.('');\n };\n\n return (\n <div\n className={join('relative', className)}\n id={id}\n ref={ref}\n data-select='true'\n data-value={value}\n data-searchable={searchable}\n data-disabled={disabled}\n data-clearable={clearable}\n >\n {/* Trigger Button */}\n <div className='relative'>\n <button\n ref={triggerRef}\n type='button'\n className={join(\n 'flex items-center justify-between w-full text-left bg-inherit border border-border rounded-md transition-colors',\n 'hover:border-primary focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary',\n disabled && 'opacity-50 cursor-not-allowed hover:border-border',\n isOpen && 'border-primary ring-1 ring-primary',\n sizeVariants[size].trigger,\n triggerClassName\n )}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-disabled={disabled}\n aria-haspopup='listbox'\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={isOpen && !searchable ? activeDescendantId : undefined}\n aria-label={selectedOption ? selectedOption.text : placeholder}\n data-select-trigger='true'\n >\n <span className={join('block truncate', !selectedOption && 'opacity-70')}>\n {selectedOption ? selectedOption.text : placeholder}\n </span>\n <div className='flex items-center ml-2'>\n <ChevronDown size={16} className={join('transition-transform duration-200', isOpen && 'rotate-180')} />\n </div>\n </button>\n {clearable && selectedOption && (\n <button\n type='button'\n onClick={handleClear}\n className='absolute right-8 top-1/2 -translate-y-1/2 p-0.5 rounded hover:bg-accent/20 transition-colors group z-10'\n aria-label='Clear selection'\n data-select-clear='true'\n >\n <X size={14} className='opacity-70 group-hover:opacity-100 transition-opacity' />\n </button>\n )}\n </div>\n\n {/* Dropdown */}\n {shouldRender && (\n <div\n ref={dropdownRef}\n className={join(\n 'absolute z-50 w-full mt-1 bg-popover text-popover-foreground border border-border rounded-md shadow-lg transition-all duration-150',\n show ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2',\n dropdownClassName\n )}\n id={listboxId}\n role='listbox'\n data-select-content='true'\n >\n {/* Search Input */}\n {searchable && (\n <div className='border-b border-border'>\n <input\n ref={searchInputRef}\n type='text'\n value={searchTerm}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n placeholder={searchPlaceholder}\n className='w-full px-2 py-2 text-inherit focus:outline-none'\n aria-autocomplete='list'\n aria-controls={listboxId}\n aria-activedescendant={activeDescendantId}\n data-select-search='true'\n />\n </div>\n )}\n\n {/* Options */}\n <ScrollArea ref={optionsContainerRef} viewportClassName='max-h-60'>\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={option.value}\n id={getOptionId(index)}\n className={join(\n 'flex items-center cursor-pointer transition-colors',\n 'hover:bg-accent/10 focus:bg-accent/10',\n sizeVariants[size].options,\n option.disabled && 'opacity-50 cursor-not-allowed',\n index === highlightedIndex && 'bg-accent/20',\n value === option.value && 'bg-accent/30'\n )}\n onClick={() => handleOptionClick(option)}\n role='option'\n aria-selected={value === option.value}\n aria-disabled={option.disabled}\n data-select-option='true'\n data-value={option.value}\n data-highlighted={index === highlightedIndex}\n data-option-index={index}\n >\n <div className='flex-1 min-w-0'>\n <div className='font-medium'>{option.text}</div>\n {option.description && <div className='text-xs opacity-70 mt-0.5'>{option.description}</div>}\n </div>\n {value === option.value && <Check size={16} className='ml-2 text-primary flex-shrink-0' />}\n </div>\n ))\n ) : (\n <div className='px-3 py-2 text-sm opacity-70 text-center'>\n {searchable && searchTerm ? 'No results found' : 'No options available'}\n </div>\n )}\n </ScrollArea>\n </div>\n )}\n </div>\n );\n}\n","import { join } from '../../utils';\n\nexport type RadioInputProps = {\n itemId: string;\n checked: boolean;\n onChange: () => void;\n name: string;\n disabled?: boolean;\n className?: string;\n};\n\n// Custom RadioInput Component\nexport function RadioInput({ itemId, checked, onChange, name, disabled = false, className = '' }: RadioInputProps) {\n const baseClasses = 'relative inline-flex items-center justify-center rounded-full';\n\n const handleClick = () => {\n if (disabled) return;\n onChange();\n };\n\n const radioClasses = join(\n baseClasses,\n !checked && 'hover:border-current/60',\n !disabled && 'border-current cursor-pointer',\n disabled && 'border-muted/60 cursor-not-allowed',\n className\n );\n return (\n <div\n id={itemId}\n role='radio'\n tabIndex={-1} // necessary so that the radio button can be focused as div is not a focusable element\n aria-checked={checked}\n aria-disabled={disabled}\n aria-description={`Radio button for ${name}`}\n aria-labelledby={`${itemId}-label`}\n onClick={handleClick}\n className={radioClasses}\n style={{\n width: '1em',\n height: '1em',\n padding: '0.1em',\n borderWidth: '0.06em',\n }}\n >\n {checked && (\n <div\n className={join(`size-full aspect-square rounded-full`, disabled && 'bg-muted/60', !disabled && 'bg-current')}\n />\n )}\n </div>\n );\n}\n","import { useId } from 'react';\nimport { join } from '../../utils';\nimport { RadioInput } from './RadioInput';\n\nexport interface RadioGroupItemProps {\n /** The value associated with this radio item. */\n value: string;\n /** The content to display for this radio item. */\n children: React.ReactNode;\n /** Additional CSS classes to apply to this radio item. */\n className?: string;\n /** Whether this radio item is currently selected. */\n isSelected?: boolean;\n /** Callback fired when this radio item is selected. */\n onChange?: (value: string) => void;\n /** Whether this radio item is disabled. */\n disabled?: boolean;\n /** The name attribute for the radio input group. */\n name?: string;\n /** Whether to hide the native radio input element. */\n hideInput?: boolean;\n /** Optional description text for this radio item. */\n description?: string;\n}\n\nexport function RadioGroupItem({\n value,\n children,\n className = '',\n isSelected = false,\n onChange,\n disabled = false,\n hideInput = false,\n description,\n name,\n}: RadioGroupItemProps) {\n const id = useId();\n const itemId = `radio-${id}-${value}`;\n\n const handleChange = () => {\n if (!disabled) {\n onChange?.(value);\n }\n };\n\n return (\n <div\n title={description}\n className={join(\n 'relative flex items-center',\n className,\n // Uses text color for borders\n hideInput &&\n `p-2 border-2 focus-within:border-dashed focus-within:${\n disabled ? 'border-current/50' : 'border-current/80'\n }`,\n hideInput && !isSelected && `border-transparent ${disabled ? '' : 'not-focus-within:hover:border-border/60'}`,\n hideInput && isSelected && 'border-border',\n disabled && 'opacity-60 cursor-not-allowed'\n )}\n style={{\n gap: '0.5em',\n }}\n >\n {!hideInput && (\n <RadioInput\n itemId={itemId}\n name={name || ''}\n checked={isSelected}\n onChange={handleChange}\n disabled={disabled}\n className={join(hideInput && '')}\n />\n )}\n <div\n id={hideInput ? itemId : undefined}\n tabIndex={hideInput ? -1 : undefined}\n role={hideInput ? 'radio' : undefined}\n onClick={hideInput ? handleChange : undefined}\n aria-checked={!hideInput ? undefined : isSelected ? 'true' : 'false'}\n aria-disabled={hideInput ? disabled : undefined}\n aria-description={!hideInput ? undefined : description || `Radio button for ${name}`}\n aria-labelledby={hideInput ? `${itemId}-label` : undefined}\n className={join(hideInput && 'size-full', typeof children === 'object' && 'grow focus:outline-none')}\n >\n <label\n id={`${itemId}-label`}\n onClick={hideInput ? undefined : handleChange}\n className={join(disabled && 'cursor-not-allowed', !disabled && 'cursor-pointer')}\n >\n {children}\n </label>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\n\nexport function useRadioFocus(id: string, selectedOptionIndex: number) {\n // Manage state locally to avoid race conditions, which can result in\n // the an option failing to be selected or incorrectly selected\n const [focusedIndex, setFocusedIndex] = useState<number>(selectedOptionIndex);\n const [clickedIndex, setClickedIndex] = useState<number>(-1);\n // Prevent onClicks from triggering focus events and automatically selecting the first option\n const [isMouseDown, setIsMouseDown] = useState<boolean>(false);\n\n const handleClicked = useCallback((options: HTMLElement[], index: number) => {\n const target = options[index] as HTMLElement;\n\n // Check if the target element is disabled\n const isDisabled = target.hasAttribute('disabled') || target.getAttribute('aria-disabled') === 'true';\n if (isDisabled) return;\n\n // Update the selected index\n options[index]?.click();\n setClickedIndex(index);\n }, []);\n\n const setInitialFocus = useCallback(\n (e: Event, options: HTMLElement[]) => {\n e.preventDefault();\n if (isMouseDown) return;\n if (!options.length) return;\n\n const indexToFocus = selectedOptionIndex !== -1 ? selectedOptionIndex : 0;\n options[indexToFocus]?.focus();\n setFocusedIndex(indexToFocus);\n\n // Only update the selected index if one is already set\n if (selectedOptionIndex !== -1) {\n handleClicked(options, indexToFocus);\n }\n },\n [selectedOptionIndex, isMouseDown, handleClicked]\n );\n\n /* Focus preceding element when Shift + Tab is pressed */\n const handleFocusPreceding = useCallback(\n (e: KeyboardEvent) => {\n // If the Shift key is not pressed while tab is entered, do nothing\n if (!e.shiftKey) {\n return;\n }\n\n e.preventDefault();\n const focusableElements = Array.from(\n document.querySelectorAll<HTMLElement>(\n 'a, button, input, textarea, select, details, [tabindex]:not([tabindex=\"-1\"])'\n )\n ).filter((el) => !el.hasAttribute('disabled') && el.tabIndex >= 0);\n const currentIndex = focusableElements.findIndex((el) => el.id === id);\n const previousIndex = currentIndex > 0 ? currentIndex - 1 : focusableElements.length - 1;\n focusableElements[previousIndex]?.focus();\n },\n [id]\n );\n\n const handleKeyboardNavigation = useCallback(\n (e: KeyboardEvent, options: HTMLElement[]) => {\n if (!options.length) return;\n\n // Ensure we only toggle options part of radio group\n const target = e.target as HTMLElement;\n const isGroupOption = options.some((option) => option.id === target.id);\n if (!isGroupOption) return;\n\n const currentIndex = focusedIndex !== -1 ? focusedIndex : 0;\n let newIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n e.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n e.preventDefault();\n newIndex = (currentIndex + 1) % options.length;\n break;\n\n // Select the option when the space key is pressed\n case ' ':\n e.preventDefault();\n handleClicked(options, currentIndex);\n return;\n\n case 'Tab':\n handleFocusPreceding(e);\n return;\n\n default:\n return;\n }\n\n options[newIndex]?.focus();\n setFocusedIndex(newIndex);\n // Only update the selected index if one is already set\n if (clickedIndex !== -1) {\n handleClicked(options, newIndex);\n }\n },\n [focusedIndex, clickedIndex, handleFocusPreceding, handleClicked]\n );\n\n const getRadioOptions = useCallback((): HTMLElement[] => {\n const radioGroup = document.querySelector(`[id=\"${id}\"][role=\"radiogroup\"]`);\n if (!radioGroup) return [];\n\n return Array.from(radioGroup.querySelectorAll('[role=\"radio\"]'));\n }, [id]);\n\n useEffect(() => {\n const radioGroup = document.querySelector(`[id=\"${id}\"][role=\"radiogroup\"]`);\n if (!radioGroup) return;\n\n const options = getRadioOptions();\n const handleFocus = (e: Event) => setInitialFocus(e, options);\n const handleKeyDown = (e: KeyboardEvent) => handleKeyboardNavigation(e, options);\n const handleMouseDown = () => setIsMouseDown(true);\n const handleMouseUp = () => setIsMouseDown(false);\n\n document.addEventListener('keydown', handleKeyDown);\n radioGroup.addEventListener('focus', handleFocus);\n radioGroup.addEventListener('mousedown', handleMouseDown);\n document.addEventListener('mouseup', handleMouseUp); // place on document since mouseup event can occur outside of radio group\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n radioGroup.removeEventListener('focus', handleFocus);\n radioGroup.removeEventListener('mousedown', handleMouseDown);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [id, getRadioOptions, setInitialFocus, handleKeyboardNavigation]);\n}\n","import React, { useId, useMemo } from 'react';\nimport { join } from '../../utils';\nimport { RadioGroupItem, RadioGroupItemProps } from './RadioGroupItem';\nimport { useRadioFocus } from './hooks';\n\nexport type RadioOption = { label: string; value: string; disabled?: boolean; description?: string };\n\nexport type RadioGroupProps = {\n /** Array of option objects or strings. RadioOption: { label: string, value: string, disabled?: boolean, description?: string } */\n options?: (string | RadioOption)[];\n /** The current selected value (controlled). */\n value: string | undefined;\n /** Callback fired when the selected value changes. */\n onChange: (value: string) => void;\n /** The id for the radio group element. */\n id?: string;\n /** RadioGroupItem components when using the component approach. */\n children?: React.ReactElement<RadioGroupItemProps>[] | React.ReactElement<RadioGroupItemProps>;\n /** Additional CSS classes to apply to the radio group. */\n className?: string;\n /** Additional CSS classes to apply to each radio item. */\n childrenClassName?: string;\n /** Whether to hide the native radio input elements. */\n hideInputs?: boolean;\n};\n\n/**\n * A radio button group component for selecting one option from multiple choices.\n * Supports both array-based options and RadioGroupItem child components.\n * \n * @example\n * ```tsx\n * // Using options array\n * <RadioGroup\n * options={[\n * { label: 'Small', value: 's', description: 'Perfect for personal use' },\n * { label: 'Medium', value: 'm' },\n * { label: 'Large', value: 'l', disabled: true }\n * ]}\n * value={selectedSize}\n * onChange={setSelectedSize}\n * />\n * \n * // Using child components\n * <RadioGroup value={color} onChange={setColor}>\n * <RadioGroupItem value=\"red\">Red</RadioGroupItem>\n * <RadioGroupItem value=\"blue\">Blue</RadioGroupItem>\n * <RadioGroupItem value=\"green\">Green</RadioGroupItem>\n * </RadioGroup>\n * ```\n */\nexport function RadioGroup({\n options = [],\n value,\n onChange,\n id,\n children,\n className = '',\n childrenClassName = '',\n hideInputs = false,\n}: RadioGroupProps) {\n const groupId = useId();\n const groupName = id || `radio-group-${groupId}`;\n useRadioFocus(\n groupName,\n options.findIndex((option) => option === value)\n );\n\n // Check for duplicates if string options are provided\n const processedOptions = useMemo(() => {\n return options.reduce<RadioOption[]>((acc, option) => {\n if (typeof option === 'string') {\n // Check if we already have this string option\n if (!acc.some((item) => item.value === option)) {\n acc.push({ label: option, value: option });\n }\n } else {\n acc.push(option);\n }\n return acc;\n }, []);\n }, [options]);\n\n return (\n <div id={groupName} role='radiogroup' tabIndex={0} className={join(className, 'focus:outline-none')}>\n {/* Render from options prop */}\n {processedOptions.length > 0 &&\n processedOptions.map((option, index) => (\n <RadioGroupItem\n key={`${option.value}-${index}`}\n value={option.value}\n isSelected={value === option.value}\n onChange={onChange}\n name={groupName}\n disabled={option.disabled}\n description={option.description}\n hideInput={hideInputs}\n className={childrenClassName}\n >\n {option.label}\n </RadioGroupItem>\n ))}\n\n {/* Render RadioGroupItem components */}\n {processedOptions.length === 0 &&\n children &&\n React.Children.map(children, (child) => {\n // TypeScript enforces that child is a RadioGroupItem\n if (React.isValidElement(child) && child.type === RadioGroupItem) {\n return (\n <RadioGroupItem\n {...child.props}\n className={join(childrenClassName, child.props.className)}\n hideInput={child.props.hideInput || hideInputs}\n isSelected={value === child.props.value}\n onChange={onChange}\n name={groupName}\n >\n {child.props.children}\n </RadioGroupItem>\n );\n }\n return null;\n })}\n </div>\n );\n}\n","import React, { cloneElement, isValidElement, useCallback, useState } from 'react';\nimport { useFormValidation } from './hooks';\nimport {\n\tFormCheckboxField,\n\tFormData,\n\tFormField,\n\tFormProps,\n\tFormInputField,\n\tFormRadioField,\n\tFormSelectField,\n\tFormTextareaField,\n} from './types';\nimport { formDefaults, formVariants, FormVariants } from './variants';\nimport { join } from '../../utils';\nimport { Label } from '../label';\nimport { Input } from '../input';\nimport { Textarea } from '../textarea';\nimport { Select } from '../select';\nimport { Checkbox } from '../checkbox';\nimport { RadioGroup } from '../radiogroup';\n\nexport interface FormComponentProps<T extends FormData = FormData> extends FormProps<T>, Partial<FormVariants> {}\n\n/**\n * A comprehensive form component with built-in validation, responsive layouts,\n * and support for various field types (input, textarea, select, checkbox, radio).\n * \n * @example\n * ```tsx\n * // Define form fields - should be stable (memoized or declared outside component)\n * const userForm = [\n * { __type: 'input', name: 'name', label: 'Full Name', required: true },\n * { __type: 'input', name: 'email', type: 'email', label: 'Email', required: true },\n * { __type: 'textarea', name: 'bio', label: 'Bio', rows: 4 },\n * { __type: 'checkbox', name: 'subscribe', text: 'Subscribe to newsletter' }\n * ];\n * \n * // Usage\n * <Form\n * form={userForm}\n * columns={2}\n * onSubmit={(data) => saveUser(data)}\n * submitButton={<Button type=\"submit\">Save User</Button>}\n * />\n * ```\n */\nexport function Form<T extends FormData = FormData>({\n\tform,\n\tinitialData = {} as T,\n\tonDataChange,\n\tonSubmit,\n\tsubmitButton,\n\tcolumns = formDefaults.columns,\n\tresponsive = formDefaults.responsive,\n\tspacing = formDefaults.spacing,\n\tclassName,\n\tid,\n\tref,\n}: FormComponentProps<T>) {\n\tconst [data, setData] = useState<T>(initialData);\n\tconst { errors, validateForm, validateSingleField, isFormValid } = useFormValidation(form, data);\n\n\tconst updateData = useCallback(\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t(fieldName: string, value: any) => {\n\t\t\tconst newData = { ...data, [fieldName]: value } as T;\n\t\t\tsetData(newData);\n\t\t\tonDataChange?.(newData);\n\n\t\t\t// Validate field on change\n\t\t\tvalidateSingleField(fieldName, value);\n\t\t},\n\t\t[data, onDataChange, validateSingleField]\n\t);\n\n\tconst handleSubmit = useCallback(\n\t\t(e: React.FormEvent) => {\n\t\t\te.preventDefault();\n\t\t\tif (validateForm(data) && onSubmit) {\n\t\t\t\tonSubmit(data);\n\t\t\t}\n\t\t},\n\t\t[data, validateForm, onSubmit]\n\t);\n\n\tconst getFieldStylesAndClasses = (field: FormField) => {\n\t\tconst classes = [];\n\t\tconst styles: React.CSSProperties = {};\n\n\t\t// Column span\n\t\tif (field.colSpan && columns! > 1) {\n\t\t\tclasses.push(formVariants.colSpan[field.colSpan]);\n\t\t}\n\n\t\treturn {\n\t\t\tclassName: join(classes.join(' '), field.className),\n\t\t\tstyle: styles,\n\t\t};\n\t};\n\n\tconst renderField = (field: FormField) => {\n\t\tconst fieldValue = data[field.name];\n\t\tconst fieldError = errors[field.name];\n\t\tconst fieldId = id ? `${id}-${field.name}` : field.name;\n\t\tconst { className: fieldClasses, style: fieldStyles } = getFieldStylesAndClasses(field);\n\n\t\tconst renderFieldContent = () => {\n\t\t\tswitch (field.__type) {\n\t\t\t\tcase 'input': {\n\t\t\t\t\tconst inputField = field as FormInputField;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\ttype={inputField.type || 'text'}\n\t\t\t\t\t\t\t\tplaceholder={inputField.placeholder}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(e) => updateData(field.name, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tvariant={inputField.variant}\n\t\t\t\t\t\t\t\trounded={inputField.rounded}\n\t\t\t\t\t\t\t\terrorMessage={fieldError}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'textarea': {\n\t\t\t\t\tconst textareaField = field as FormTextareaField;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tplaceholder={textareaField.placeholder}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(e) => updateData(field.name, e.target.value)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tvariant={textareaField.variant}\n\t\t\t\t\t\t\t\trounded={textareaField.rounded}\n\t\t\t\t\t\t\t\trows={textareaField.rows}\n\t\t\t\t\t\t\t\tautoExpand={textareaField.autoExpand}\n\t\t\t\t\t\t\t\tcharacterLimit={textareaField.characterLimit}\n\t\t\t\t\t\t\t\terrorMessage={fieldError}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'select': {\n\t\t\t\t\tconst selectField = field as FormSelectField;\n\t\t\t\t\t// Convert options to match Select component expected format\n\t\t\t\t\tconst selectOptions = selectField.options.map((opt) => ({\n\t\t\t\t\t\ttext: opt.label,\n\t\t\t\t\t\tvalue: opt.value,\n\t\t\t\t\t\tdisabled: opt.disabled,\n\t\t\t\t\t}));\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label htmlFor={fieldId} required={field.required} description={field.description}>\n\t\t\t\t\t\t\t\t{field.label}\n\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\toptions={selectOptions}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(value) => updateData(field.name, value)}\n\t\t\t\t\t\t\t\tplaceholder={selectField.placeholder}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tsearchable={selectField.searchable}\n\t\t\t\t\t\t\t\tclearable={selectField.clearable}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'checkbox': {\n\t\t\t\t\tconst checkboxField = field as FormCheckboxField;\n\t\t\t\t\tconst checkboxSize = 16;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className='space-x-2'>\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tchecked={fieldValue || false}\n\t\t\t\t\t\t\t\tonCheckedChange={(checked) => updateData(field.name, checked)}\n\t\t\t\t\t\t\t\tdisabled={field.disabled}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t\tsize={checkboxSize}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className='inline-block' style={{ maxWidth: `calc(100% - ${checkboxSize + 10}px)` }}>\n\t\t\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t\t\t{/* 8px for spacing, 2px for buffer */}\n\t\t\t\t\t\t\t\t{/* 8px for spacing, 2px for buffer */}\n\t\t\t\t\t\t\t\t<Label htmlFor={fieldId} className='cursor-pointer'>\n\t\t\t\t\t\t\t\t\t{checkboxField.text || field.label}\n\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t{field.description && <p className='text-sm opacity-80 mt-1'>{field.description}</p>}\n\t\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tcase 'radio': {\n\t\t\t\t\tconst radioField = field as FormRadioField;\n\t\t\t\t\t// Convert options to match RadioGroup expected format\n\t\t\t\t\tconst radioOptions = radioField.options.map((opt) => ({\n\t\t\t\t\t\tlabel: opt.label,\n\t\t\t\t\t\tvalue: opt.value,\n\t\t\t\t\t\tdisabled: opt.disabled,\n\t\t\t\t\t}));\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Label required={field.required}>{field.label}</Label>\n\t\t\t\t\t\t\t{field.description && <p className='text-sm opacity-80 mb-2'>{field.description}</p>}\n\t\t\t\t\t\t\t<RadioGroup\n\t\t\t\t\t\t\t\toptions={radioOptions}\n\t\t\t\t\t\t\t\tvalue={fieldValue || ''}\n\t\t\t\t\t\t\t\tonChange={(value) => updateData(field.name, value)}\n\t\t\t\t\t\t\t\tid={fieldId}\n\t\t\t\t\t\t\t\tdata-field-name={field.name}\n\t\t\t\t\t\t\t\tdata-field-type={field.__type}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{fieldError && (\n\t\t\t\t\t\t\t\t<p className='text-sm text-destructive mt-1' role='alert'>\n\t\t\t\t\t\t\t\t\t{fieldError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<div key={field.name} className={fieldClasses} style={fieldStyles}>\n\t\t\t\t{renderFieldContent()}\n\t\t\t</div>\n\t\t);\n\t};\n\n\t// Determine form grid classes\n\tconst formClasses = join(\n\t\t'grid',\n\t\tcolumns && columns > 1 ? formVariants.columns[columns] : 'grid-cols-1',\n\t\tformVariants.spacing[spacing],\n\t\tclassName\n\t);\n\n\t// Render submit button if provided\n\tconst renderSubmitButton = () => {\n\t\tif (!submitButton) return null;\n\n\t\tif (isValidElement(submitButton)) {\n\t\t\t// Clone the button and add disabled state based on form validity\n\t\t\treturn cloneElement(submitButton, {\n\t\t\t\tdisabled: !isFormValid,\n\t\t\t\t'aria-disabled': !isFormValid,\n\t\t\t\t...(submitButton.props ?? {}),\n\t\t\t} as Record<string, unknown>);\n\t\t}\n\n\t\treturn <div className='col-span-full'>{submitButton}</div>;\n\t};\n\n\treturn (\n\t\t<form\n\t\t\tref={ref}\n\t\t\tid={id}\n\t\t\tonSubmit={handleSubmit}\n\t\t\tclassName={formClasses}\n\t\t\tdata-form-fields={form.length}\n\t\t\tdata-form-columns={columns}\n\t\t\tdata-form-responsive={responsive}\n\t\t\tdata-form-valid={isFormValid}\n\t\t>\n\t\t\t{form.map(renderField)}\n\t\t\t{renderSubmitButton()}\n\t\t</form>\n\t);\n}\n","import React, { useId, useState, useRef, useCallback, useEffect } from 'react';\nimport { join } from '../../utils';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n\t/** The HTML id attribute for the tooltip. */\n\tid?: string;\n\t/** The element that triggers the tooltip on hover. */\n\tchildren: React.ReactElement;\n\t/** The content to display in the tooltip. */\n\tmessage: React.ReactNode;\n\t/** The preferred side of the trigger to render the tooltip. */\n\tplacement?: TooltipPlacement;\n\t/** Whether the tooltip is disabled and should not appear. */\n\tdisabled?: boolean;\n\t/** The delay in milliseconds before the tooltip appears. */\n\tdelay?: number;\n\t/** Whether to show the arrow pointing to the trigger element. */\n\tshowArrow?: boolean;\n\t/** Additional CSS classes to apply to the tooltip. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to the tooltip arrow. */\n\tarrowClassName?: string;\n}\n\nexport interface TooltipPosition {\n\tx: number;\n\ty: number;\n\tplacement: TooltipPlacement;\n\tarrow: {\n\t\tx: number;\n\t\ty: number;\n\t};\n}\n\n/**\n * A tooltip component that displays contextual information on hover or focus.\n * Automatically positions itself to stay within viewport bounds.\n *\n * @example\n * ```tsx\n * // Basic tooltip\n * <Tooltip message=\"This is helpful information\">\n * <Button>Hover me</Button>\n * </Tooltip>\n *\n * // Custom placement and delay\n * <Tooltip\n * message=\"Tooltip on the right side\"\n * placement=\"right\"\n * delay={500}\n * >\n * <span>Hover for delayed tooltip</span>\n * </Tooltip>\n *\n * // Tooltip without arrow\n * <Tooltip message=\"No arrow tooltip\" showArrow={false}>\n * <Button>No arrow</Button>\n * </Tooltip>\n *\n * // Rich content tooltip\n * <Tooltip message={<div>Complex <strong>HTML</strong> content</div>}>\n * <Icon name=\"info\" />\n * </Tooltip>\n * ```\n */\nexport function Tooltip({\n\tid,\n\tchildren,\n\tmessage,\n\tplacement = 'top',\n\tdisabled = false,\n\tdelay = 100,\n\tshowArrow = true,\n\tclassName,\n}: TooltipProps) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst [isHoveringTrigger, setIsHoveringTrigger] = useState(false);\n\tconst [isHoveringTooltip, setIsHoveringTooltip] = useState(false);\n\tconst [isFocused, setIsFocused] = useState(false);\n\n\tconst timeoutRef = useRef<number | null>(null);\n\tconst reactId = useId();\n\tconst tooltipId = id ?? reactId;\n\n\tconst showTooltip = useCallback(() => {\n\t\tif (disabled) return;\n\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t}\n\n\t\ttimeoutRef.current = window.setTimeout(() => {\n\t\t\tsetIsVisible(true);\n\t\t}, delay);\n\t}, [disabled, delay]);\n\n\tconst hideTooltip = useCallback((forceHide = false) => {\n\t\tif (timeoutRef.current) {\n\t\t\tclearTimeout(timeoutRef.current);\n\t\t}\n\n\t\tif (forceHide) {\n\t\t\tsetIsVisible(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Small delay to allow moving from trigger to tooltip\n\t\ttimeoutRef.current = window.setTimeout(() => {\n\t\t\tsetIsVisible(false);\n\t\t}, 100);\n\t}, []);\n\n\t// Handle hover state changes\n\tuseEffect(() => {\n\t\tif (!isHoveringTrigger && !isHoveringTooltip && !isFocused && isVisible) {\n\t\t\thideTooltip();\n\t\t}\n\t}, [isHoveringTrigger, isHoveringTooltip, isFocused, isVisible, hideTooltip]);\n\n\t// Hide tooltip on scroll\n\tuseEffect(() => {\n\t\tif (!isVisible) return;\n\n\t\tconst handleScroll = () => {\n\t\t\thideTooltip(true);\n\t\t};\n\n\t\twindow.addEventListener('scroll', handleScroll, true);\n\t\treturn () => {\n\t\t\twindow.removeEventListener('scroll', handleScroll, true);\n\t\t};\n\t}, [isVisible, hideTooltip]);\n\n\t// Cleanup timeout on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst getTooltipClasses = () => {\n\t\tconst baseClasses =\n\t\t\t'absolute z-50 px-2 py-1 text-sm rounded shadow-lg bg-tooltip text-tooltip-foreground pointer-events-auto transition-all duration-150 ease-out w-max max-w-xs';\n\t\tconst visibilityClasses = isVisible ? 'opacity-100 scale-100' : 'opacity-0 scale-95 pointer-events-none';\n\n\t\tconst placementClasses = {\n\t\t\ttop: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n\t\t\tbottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n\t\t\tleft: 'right-full top-1/2 -translate-y-1/2 mr-2',\n\t\t\tright: 'left-full top-1/2 -translate-y-1/2 ml-2',\n\t\t};\n\n\t\tconst transformOrigins = {\n\t\t\ttop: 'origin-bottom',\n\t\t\tbottom: 'origin-top',\n\t\t\tleft: 'origin-right',\n\t\t\tright: 'origin-left',\n\t\t};\n\n\t\treturn join(baseClasses, placementClasses[placement], transformOrigins[placement], visibilityClasses, className);\n\t};\n\n\tconst getArrowClasses = () => {\n\t\tif (!showArrow) return '';\n\n\t\tconst baseArrow = 'absolute w-0 h-0 pointer-events-none';\n\t\tconst arrowClasses = {\n\t\t\ttop: 'top-full left-1/2 -translate-x-1/2 border-l-[6px] border-r-[6px] border-t-[6px] border-l-transparent border-r-transparent border-t-tooltip',\n\t\t\tbottom:\n\t\t\t\t'bottom-full left-1/2 -translate-x-1/2 border-l-[6px] border-r-[6px] border-b-[6px] border-l-transparent border-r-transparent border-b-tooltip',\n\t\t\tleft: 'left-full top-1/2 -translate-y-1/2 border-t-[6px] border-b-[6px] border-l-[6px] border-t-transparent border-b-transparent border-l-tooltip',\n\t\t\tright:\n\t\t\t\t'right-full top-1/2 -translate-y-1/2 border-t-[6px] border-b-[6px] border-r-[6px] border-t-transparent border-b-transparent border-r-tooltip',\n\t\t};\n\n\t\treturn join(baseArrow, arrowClasses[placement]);\n\t};\n\n\tconst childrenProps = children.props as {\n\t\tstyle?: React.CSSProperties;\n\t\tchildren?: React.ReactNode;\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{React.cloneElement(children, {\n\t\t\t\tstyle: {\n\t\t\t\t\t...childrenProps.style,\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t},\n\t\t\t\tonMouseEnter: () => {\n\t\t\t\t\tsetIsHoveringTrigger(true);\n\t\t\t\t\tshowTooltip();\n\t\t\t\t},\n\t\t\t\tonMouseLeave: () => {\n\t\t\t\t\tsetIsHoveringTrigger(false);\n\t\t\t\t},\n\t\t\t\tonFocus: () => {\n\t\t\t\t\tsetIsFocused(true);\n\t\t\t\t\tshowTooltip();\n\t\t\t\t},\n\t\t\t\tonBlur: () => {\n\t\t\t\t\tsetIsFocused(false);\n\t\t\t\t\thideTooltip(true);\n\t\t\t\t},\n\t\t\t\tonKeyDown: (e: React.KeyboardEvent) => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\thideTooltip(true);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'aria-describedby': disabled ? undefined : tooltipId,\n\t\t\t\tchildren: (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{childrenProps.children}\n\t\t\t\t\t\t{!disabled && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tid={tooltipId}\n\t\t\t\t\t\t\t\trole='tooltip'\n\t\t\t\t\t\t\t\tclassName={getTooltipClasses()}\n\t\t\t\t\t\t\t\taria-hidden={!isVisible}\n\t\t\t\t\t\t\t\taria-live={isVisible ? 'polite' : undefined}\n\t\t\t\t\t\t\t\tonMouseEnter={() => {\n\t\t\t\t\t\t\t\t\tsetIsHoveringTooltip(true);\n\t\t\t\t\t\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\t\t\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\t\t\t\t\tsetIsHoveringTooltip(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t\t\t{showArrow && <div className={getArrowClasses()} aria-hidden={true} />}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t),\n\t\t\t} as Record<string, unknown>)}\n\t\t</>\n\t);\n}\n\nexport default Tooltip;\n","import React from 'react';\nimport { InfoCircled, InfoCircledFilled } from '../../symbols';\nimport { join } from '../../utils';\nimport { Tooltip, TooltipProps } from '../tooltip';\n\nexport interface HelpIconProps extends Omit<TooltipProps, 'children'> {\n\t/** HTML id attribute for the help icon. */\n\tid?: string;\n\t/** Ref for the icon element. */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** The design variant of the help icon. */\n\tdesign?: 'filled' | 'outlined';\n\t/** The size of the help icon. */\n\ticonSize?: number;\n\t/** Additional CSS classes to apply to the icon container. */\n\tclassName?: string;\n}\n\n/**\n * A help icon component that combines the InfoCircled icon with a tooltip for displaying contextual help information.\n * Supports both filled and outlined design variants with multiple size options.\n *\n * @example\n * ```tsx\n * // Basic help icon with tooltip\n * <HelpIcon message=\"This field is required for account verification\" />\n *\n * // Custom design and size\n * <HelpIcon\n * message=\"Click here for more information about pricing\"\n * design=\"outlined\"\n * iconSize={20}\n * placement=\"bottom\"\n * />\n *\n * // Rich content tooltip\n * <HelpIcon\n * message={\n * <div>\n * <p className=\"font-semibold mb-1\">Password Requirements</p>\n * <ul className=\"text-xs space-y-1\">\n * <li>• At least 8 characters</li>\n * <li>• One uppercase letter</li>\n * <li>• One number or symbol</li>\n * </ul>\n * </div>\n * }\n * className=\"ml-2\"\n * />\n * ```\n */\nexport function HelpIcon({ id, ref, design = 'filled', iconSize = 14, className, ...tooltipProps }: HelpIconProps) {\n\tconst IconComponent = design === 'filled' ? InfoCircledFilled : InfoCircled;\n\n\treturn (\n\t\t<Tooltip {...tooltipProps}>\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join(\n\t\t\t\t\t'inline-block cursor-help text-muted-foreground transition-colors align-top',\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tdata-help-icon='true'\n\t\t\t\tdata-design={design}\n\t\t\t\tdata-size={iconSize}\n\t\t\t>\n\t\t\t\t<IconComponent size={iconSize} className='fill-current' />\n\t\t\t</div>\n\t\t</Tooltip>\n\t);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useAnimationOpenClose(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 150);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function useDocumentChanges(isOpen: boolean, onClose: () => void) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n // Prevent background scrolling when modal is open\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'auto';\n };\n }, [isOpen, onClose]);\n}\n\nexport function useHandleFocus(modalId: string, isOpen: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n const focusAppropriateElement = useCallback(() => {\n const modalElement = document.getElementById(modalId);\n if (!modalElement) return;\n\n // 1. First, try to focus on the first action button, if available\n const modalActions = modalElement.querySelectorAll('[data-modal-action=\"true\"]');\n if (modalActions.length > 0) {\n (modalActions[0] as HTMLElement).focus();\n return;\n }\n\n // 2. Then try first focusable element in content (giving preference to non-close button)\n const focusableElements = modalElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements.length > 0) {\n const allBesidesCloseButton = Array.from(focusableElements).filter((el) => {\n return !(el instanceof HTMLButtonElement && el.getAttribute('data-modal-close-button') === 'true');\n });\n\n if (allBesidesCloseButton.length > 0) {\n (allBesidesCloseButton[0] as HTMLElement).focus();\n return;\n }\n\n (focusableElements[0] as HTMLElement).focus();\n return;\n }\n\n // 3. Fallback to modal container\n modalElement.focus();\n }, [modalId]);\n\n useEffect(() => {\n if (isOpen) {\n // Store the currently focused element to restore focus later\n previousActiveElement.current = document.activeElement;\n\n focusAppropriateElement();\n }\n\n return () => {\n document.body.style.overflow = 'auto';\n\n // Restore focus to the previously focused element when modal closes\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen, focusAppropriateElement]);\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { Button, ButtonProps } from '../button';\nimport { useAnimationOpenClose, useDocumentChanges, useHandleFocus } from './hooks';\n\ninterface ModalAction extends Omit<ButtonProps, 'children'> {\n\t/** The text label for the action button. */\n\tlabel: string;\n}\n\nexport interface ModalProps {\n\t/** Optional ID for the modal element. */\n\tid?: string;\n\t/** Whether the modal is open. */\n\tisOpen: boolean;\n\t/** Callback fired when the modal should close. */\n\tonClose: () => void;\n\t/** Optional title for the modal header. */\n\ttitle?: React.ReactNode;\n\t/** The content to display inside the modal. */\n\tchildren: React.ReactNode;\n\t/** When true, renders only the children with no default modal styling. */\n\tcontentOnly?: boolean;\n\t/** Additional CSS classes to apply to the modal content. */\n\tclassName?: string;\n\t/** Additional CSS classes to apply to the backdrop overlay. */\n\toverlayClassName?: string;\n\t/** Additional CSS classes to apply to the modal container. */\n\tcontainerClassName?: string;\n\t/** Whether to hide the X close button in the top-right corner. */\n\thideCloseButton?: boolean;\n\t/** Array of action buttons to display at the bottom of the modal. */\n\tactions?: ModalAction[];\n\t/** Whether clicking the backdrop/overlay closes the modal. */\n\tdisableCloseOnOverlayClick?: boolean;\n\t/** ID of an element that labels the modal. */\n\tariaLabelledBy?: string;\n\t/** ID of an element that describes the modal. */\n\tariaDescribedBy?: string;\n}\n\n/**\n * A flexible modal dialog component with focus management, animation, and action buttons.\n * Supports both styled and content-only modes with comprehensive accessibility features.\n * \n * @example\n * ```tsx\n * // Basic modal\n * <Modal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * title=\"Confirm Action\"\n * >\n * <p>Are you sure you want to proceed?</p>\n * </Modal>\n * \n * // Modal with actions\n * <Modal\n * isOpen={showDeleteModal}\n * onClose={handleClose}\n * title=\"Delete Item\"\n * actions={[\n * { label: \"Cancel\", variant: \"secondary\", onClick: handleClose },\n * { label: \"Delete\", variant: \"destructive\", onClick: handleDelete }\n * ]}\n * disableCloseOnOverlayClick\n * >\n * <p>This action cannot be undone.</p>\n * </Modal>\n * ```\n */\nexport function Modal({\n\tid,\n\tisOpen,\n\tonClose,\n\ttitle,\n\tchildren,\n\tcontentOnly = false,\n\tclassName,\n\toverlayClassName,\n\tcontainerClassName,\n\thideCloseButton = false,\n\tactions = [],\n\tdisableCloseOnOverlayClick = false,\n\tariaLabelledBy,\n\tariaDescribedBy,\n}: ModalProps) {\n\tconst generatedId = useId();\n\tconst modalId = id || `modal-${generatedId}`;\n\tconst titleId = id ? `${id}-title` : `modal-title-${generatedId}`;\n\n\tconst { show, shouldRender } = useAnimationOpenClose(isOpen);\n\tuseHandleFocus(modalId, shouldRender);\n\tuseDocumentChanges(shouldRender, onClose);\n\n\tif (!shouldRender) return null;\n\n\tconst renderTitle = () => {\n\t\tif (!title) return null;\n\n\t\tif (React.isValidElement(title)) {\n\t\t\treturn <div className='mb-4'>{title}</div>;\n\t\t}\n\n\t\treturn (\n\t\t\t<h2 className='mb-4 text-xl font-semibold' id={titleId}>\n\t\t\t\t{title}\n\t\t\t</h2>\n\t\t);\n\t};\n\n\tconst renderActions = () => {\n\t\tif (actions.length === 0) return null;\n\n\t\treturn (\n\t\t\t<div className='mt-6 not-sm:grid gap-y-2 sm:flex sm:justify-start sm:flex-row-reverse sm:gap-x-3'>\n\t\t\t\t{actions.map((action, index) => {\n\t\t\t\t\tconst { label, ...rest } = action;\n\t\t\t\t\tconst buttonProps = rest as ButtonProps;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Button key={index} {...buttonProps} data-modal-action='true'>\n\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{createPortal(\n\t\t\t\t<div\n\t\t\t\t\taria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\trole='dialog'\n\t\t\t\t\taria-modal='true'\n\t\t\t\t\tclassName='fixed inset-0 z-[100] overflow-y-auto'\n\t\t\t\t>\n\t\t\t\t\t<div className={join('flex min-h-screen items-center justify-center p-4', containerClassName)}>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={join('fixed inset-0 bg-black/20 transition-all', overlayClassName)}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (!disableCloseOnOverlayClick) {\n\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{contentOnly && <div className={join('relative w-fit', className)}>{children}</div>}\n\n\t\t\t\t\t\t{!contentOnly && (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tid={modalId}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'relative w-full max-w-xl transform rounded-lg shadow-xl bg-popover text-popover-foreground transition-all p-6 focus:ring ease-in duration-75',\n\t\t\t\t\t\t\t\t\tshow ? 'opacity-100 scale-100' : 'opacity-0 scale-90',\n\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!hideCloseButton && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype='button'\n\t\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\t\tdata-modal-close-button='true'\n\t\t\t\t\t\t\t\t\t\tclassName='rounded-md p-0.5 top-2.5 right-2.5 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X size={18} />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{renderTitle()}\n\n\t\t\t\t\t\t\t\t{children}\n\n\t\t\t\t\t\t\t\t{renderActions()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>,\n\t\t\t\tdocument.body\n\t\t\t)}\n\t\t</>\n\t);\n}\n","export const paginationVariants = {\n link: 'text-primary hover:text-primary-foreground hover:bg-primary/10 aria-current:text-primary-foreground aria-current:bg-primary',\n outline: 'border border-primary text-primary hover:bg-primary hover:text-primary-foreground aria-current:bg-primary aria-current:text-primary-foreground aria-current:border-primary',\n filled: 'bg-secondary text-secondary-foreground hover:bg-primary hover:text-primary-foreground aria-current:bg-primary aria-current:text-primary-foreground',\n} as const;\n\nexport type PaginationVariant = keyof typeof paginationVariants;\n\nexport const paginationSizes = {\n sm: 'px-2 py-1 text-sm min-w-[32px] min-h-8',\n md: 'px-2 py-1 text-base min-w-[40px] min-h-10',\n} as const;\n\nexport type PaginationSize = keyof typeof paginationSizes;\n\nexport interface PaginationVariants {\n variant: PaginationVariant;\n size: PaginationSize;\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useCallback } from 'react';\nimport { ChevronDoubleLeft, ChevronDoubleRight, ChevronLeft, ChevronRight } from '../../symbols';\nimport { PaginationSize, paginationSizes, PaginationVariant, paginationVariants } from './variants';\n\nexport interface PaginationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The current active page (1-indexed) */\n page: number;\n /** Total number of pages. Use Infinity for infinite pagination */\n pageCount?: number;\n /** Maximum number of page buttons to show */\n maxVisiblePages?: number;\n /** Whether to show first and last page buttons */\n showFirstLast?: boolean;\n /** Button variant style */\n variant?: PaginationVariant;\n /** Button size */\n size?: PaginationSize;\n /** Callback fired when the page changes */\n onPageChange: (page: number) => void;\n /** Ref for the pagination container */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional CSS classes for the button elements */\n buttonsClassName?: string;\n}\n\n/**\n * A pagination component for navigating through multiple pages of content.\n * Supports both finite and infinite pagination with customizable appearance.\n * \n * @example\n * ```tsx\n * // Basic pagination\n * <Pagination\n * page={currentPage}\n * pageCount={totalPages}\n * onPageChange={setCurrentPage}\n * />\n * \n * // Infinite pagination\n * <Pagination\n * page={currentPage}\n * pageCount={Infinity}\n * onPageChange={handlePageChange}\n * showFirstLast={false}\n * />\n * \n * // Customized appearance\n * <Pagination\n * page={currentPage}\n * pageCount={100}\n * maxVisiblePages={7}\n * variant=\"outline\"\n * size=\"lg\"\n * onPageChange={setCurrentPage}\n * />\n * ```\n */\nexport function Pagination({\n page,\n pageCount = 5,\n maxVisiblePages = 5,\n showFirstLast = true,\n onPageChange,\n size = 'md',\n variant = 'link',\n className,\n ref,\n buttonsClassName,\n ...rest\n}: PaginationProps) {\n const isInfinite = pageCount === Infinity;\n\n // Generate page numbers to display\n const getVisiblePages = useCallback((): number[] => {\n if (isInfinite) return [];\n\n const totalPages = pageCount;\n const maxPages = Math.min(maxVisiblePages, totalPages);\n\n // If we have fewer pages than maxVisiblePages, show all\n if (totalPages <= maxPages) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n // Calculate the range of pages to show\n const half = Math.floor(maxPages / 2);\n let start = Math.max(1, page - half);\n let end = Math.min(totalPages, start + maxPages - 1);\n\n // Adjust start if we're near the end\n if (end - start + 1 < maxPages) {\n start = Math.max(1, end - maxPages + 1);\n end = Math.min(totalPages, start + maxPages - 1);\n }\n\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }, [isInfinite, maxVisiblePages, page, pageCount]);\n\n const visiblePages = getVisiblePages();\n const canGoPrevious = page > 1;\n const canGoNext = isInfinite || page < pageCount;\n const showFirstButton = showFirstLast && !isInfinite;\n const showLastButton = showFirstLast && !isInfinite;\n\n const handlePageChange = (newPage: number) => {\n if (newPage >= 1 && (isInfinite || newPage <= pageCount)) {\n onPageChange(newPage);\n }\n };\n\n // Helper function to get button classes based on variant and state\n const getButtonClasses = useCallback(() => {\n const baseClasses = join(\n 'flex items-center justify-center min-w-fit',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n paginationSizes[size],\n 'rounded-md'\n );\n\n return join(baseClasses, paginationVariants[variant], buttonsClassName);\n }, [variant, size, buttonsClassName]);\n\n return (\n <nav\n ref={ref}\n className={join('flex items-center justify-center gap-1', className)}\n role='navigation'\n aria-label='Pagination'\n data-page={page}\n data-page-count={isInfinite ? 'infinite' : pageCount}\n {...rest}\n >\n {/* First page button */}\n {showFirstButton && (\n <button\n onClick={() => handlePageChange(1)}\n className={getButtonClasses()}\n disabled={page === 1}\n aria-label='Go to first page'\n >\n <ChevronDoubleLeft size={size === 'sm' ? 12 : 15} />\n <span className='ml-1'>First</span>\n </button>\n )}\n\n {/* Previous button */}\n <button\n onClick={() => handlePageChange(page - 1)}\n className={getButtonClasses()}\n disabled={!canGoPrevious}\n aria-label='Go to previous page'\n >\n <ChevronLeft size={size === 'sm' ? 12 : 15} />\n <span className='ml-1'>Previous</span>\n </button>\n\n {/* Page number buttons (only for finite pagination) */}\n {!isInfinite &&\n visiblePages.map((pageNum) => (\n <button\n key={pageNum}\n onClick={() => handlePageChange(pageNum)}\n className={join(getButtonClasses(), 'aspect-square')}\n aria-label={`Go to page ${pageNum}`}\n aria-current={pageNum === page ? true : undefined}\n >\n {pageNum}\n </button>\n ))}\n\n {/* Next button */}\n <button\n onClick={() => handlePageChange(page + 1)}\n className={getButtonClasses()}\n disabled={!canGoNext}\n aria-label='Go to next page'\n >\n <span className='mr-1'>Next</span>\n <ChevronRight size={size === 'sm' ? 12 : 15} />\n </button>\n\n {/* Last page button */}\n {showLastButton && (\n <button\n onClick={() => handlePageChange(pageCount)}\n className={getButtonClasses()}\n disabled={page === pageCount}\n aria-label='Go to last page'\n >\n <span className='mr-1'>Last</span>\n <ChevronDoubleRight size={size === 'sm' ? 12 : 15} />\n </button>\n )}\n </nav>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport function useAnimationSlideIn(isOpen: boolean) {\n const [show, setShow] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n setShouldRender(true);\n setTimeout(() => setShow(true), 10);\n } else {\n setShow(false);\n setTimeout(() => setShouldRender(false), 300);\n }\n }, [isOpen]);\n\n return { show, shouldRender };\n}\n\nexport function usePanelDocumentChanges(isOpen: boolean, onClose: () => void) {\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n // Prevent background scrolling when panel is open\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = 'auto';\n };\n }, [isOpen, onClose]);\n}\n\nexport function usePanelFocus(panelId: string, isOpen: boolean) {\n const previousActiveElement = useRef<Element | null>(null);\n\n const focusAppropriateElement = useCallback(() => {\n const panelElement = document.getElementById(panelId);\n if (!panelElement) return;\n\n // 1. First, try to focus on the first action button, if available\n const panelActions = panelElement.querySelectorAll('[data-panel-action=\"true\"]');\n if (panelActions.length > 0) {\n (panelActions[0] as HTMLElement).focus();\n return;\n }\n\n // 2. Then try first focusable element in content (giving preference to non-close button)\n const focusableElements = panelElement.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n if (focusableElements.length > 0) {\n const allBesidesCloseButton = Array.from(focusableElements).filter((el) => {\n return !(el instanceof HTMLButtonElement && el.getAttribute('data-panel-close-button') === 'true');\n });\n\n if (allBesidesCloseButton.length > 0) {\n (allBesidesCloseButton[0] as HTMLElement).focus();\n return;\n }\n\n (focusableElements[0] as HTMLElement).focus();\n return;\n }\n\n // 3. Fallback to panel container\n panelElement.focus();\n }, [panelId]);\n\n useEffect(() => {\n if (isOpen) {\n // Store the currently focused element to restore focus later\n previousActiveElement.current = document.activeElement;\n\n focusAppropriateElement();\n }\n\n return () => {\n document.body.style.overflow = 'auto';\n\n // Restore focus to the previously focused element when panel closes\n if (previousActiveElement.current instanceof HTMLElement) {\n previousActiveElement.current.focus();\n }\n };\n }, [isOpen, focusAppropriateElement]);\n}\n","import { join } from '@moondreamsdev/dreamer-ui/utils';\nimport React, { useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from '../../symbols';\nimport { useAnimationSlideIn, usePanelDocumentChanges, usePanelFocus } from './hooks';\n\nexport interface PanelProps {\n ref?: React.Ref<HTMLDivElement>;\n /** Unique identifier for the panel */\n id?: string;\n /** Whether the panel is open */\n isOpen: boolean;\n /** Callback when panel should close */\n onClose: () => void;\n /** Panel title - can be a string or React node */\n title?: React.ReactNode;\n /** Panel content */\n children: React.ReactNode;\n /** Panel footer - can be a string or React node */\n footer?: React.ReactNode;\n /** Additional CSS classes for the panel */\n className?: string;\n /** Additional CSS classes for the overlay */\n overlayClassName?: string;\n /** Whether to hide the close button */\n hideCloseButton?: boolean;\n /** Whether to disable closing when clicking the overlay */\n disableCloseOnOverlayClick?: boolean;\n /** ARIA labelledby attribute */\n ariaLabelledBy?: string;\n /** ARIA describedby attribute */\n ariaDescribedBy?: string;\n}\n\n/**\n * Panel component that slides in from the right side of the screen.\n * Provides an overlay and slide-in animation for side content display.\n */\nexport function Panel({\n ref,\n id,\n isOpen,\n onClose,\n title,\n children,\n footer,\n className,\n overlayClassName,\n hideCloseButton = false,\n disableCloseOnOverlayClick = false,\n ariaLabelledBy,\n ariaDescribedBy,\n}: PanelProps) {\n const generatedId = useId();\n const panelId = id || `panel-${generatedId}`;\n const titleId = id ? `${id}-title` : `panel-title-${generatedId}`;\n\n const { show, shouldRender } = useAnimationSlideIn(isOpen);\n usePanelFocus(panelId, shouldRender);\n usePanelDocumentChanges(shouldRender, onClose);\n\n if (!shouldRender) return null;\n\n const renderTitle = () => {\n if (!title) return null;\n\n if (React.isValidElement(title)) {\n return <div>{title}</div>;\n }\n\n return (\n <h2 className='text-2xl font-semibold' id={titleId}>\n {title}\n </h2>\n );\n };\n\n const renderFooter = () => {\n if (!footer) return null;\n\n if (React.isValidElement(footer)) {\n const footerElement = footer as React.ReactElement<{ className?: string }>;\n const existingClassName = footerElement.props.className || '';\n return React.cloneElement(footerElement, { className: join('px-6 py-4', existingClassName) } as Record<\n string,\n unknown\n >);\n }\n\n return <div className='px-6 py-4'>{footer}</div>;\n };\n\n return (\n <>\n {createPortal(\n <div\n aria-labelledby={ariaLabelledBy ?? title ? titleId : undefined}\n aria-describedby={ariaDescribedBy}\n role='dialog'\n aria-modal='true'\n className='fixed inset-0 z-[100] overflow-hidden'\n data-panel-open={isOpen}\n >\n <div\n className={join(\n 'fixed inset-0 bg-black/40 transition-opacity duration-300',\n show ? 'opacity-100' : 'opacity-0',\n overlayClassName\n )}\n onClick={() => {\n if (!disableCloseOnOverlayClick) {\n onClose();\n }\n }}\n />\n\n <div className='fixed inset-y-0 right-0 flex max-w-full'>\n <div\n id={panelId}\n ref={ref}\n tabIndex={-1}\n className={join(\n 'relative h-full max-w-md transform shadow-xl bg-popover text-popover-foreground transition-transform duration-300 ease-in-out border-l border-border',\n show ? 'translate-x-0' : 'translate-x-full',\n className\n )}\n >\n <div className='flex h-full flex-col'>\n {title && <div className='px-6 pt-6'>{renderTitle()}</div>}\n\n {!hideCloseButton && (\n <button\n type='button'\n onClick={onClose}\n data-panel-close-button='true'\n aria-label='Close panel'\n className='rounded-md p-0.5 top-3 right-3 absolute opacity-80 hover:opacity-100 transition-opacity focus:outline-none focus:ring-2 focus:ring-gray-500 leading-0'\n >\n <X size={18} />\n </button>\n )}\n\n <div className={join('flex-1 overflow-y-auto px-6 pb-6', title ? 'pt-6' : 'pt-10')}>{children}</div>\n\n {renderFooter()}\n </div>\n </div>\n </div>\n </div>,\n document.body\n )}\n </>\n );\n}\n","import { Orientation } from './Separator';\n\nexport const thicknessVariants: Record<Thickness, Record<Orientation, string>> = {\n thin: {\n horizontal: 'h-px',\n vertical: 'w-px',\n },\n medium: {\n horizontal: 'h-0.5',\n vertical: 'w-0.5',\n },\n thick: {\n horizontal: 'h-1',\n vertical: 'w-1',\n },\n 'extra-thick': {\n horizontal: 'h-2',\n vertical: 'w-2',\n },\n} as const;\n\nexport type Thickness = 'thin' | 'medium' | 'thick' | 'extra-thick';\n\nexport const sizeVariants: Record<Orientation, string> = {\n horizontal: 'w-full',\n vertical: 'min-h-4 h-full',\n} as const;\n\nexport const defaultVariants = {\n thickness: 'thin',\n};\n","import React, { Ref } from 'react';\nimport { join } from '../../utils';\nimport { sizeVariants, Thickness, thicknessVariants } from './variants';\n\nexport type Orientation = 'horizontal' | 'vertical';\n\nexport interface SeparatorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'role'> {\n /** Reference to the separator element */\n ref?: Ref<HTMLDivElement>;\n /** The orientation of the separator */\n orientation?: Orientation;\n /** Whether the separator is decorative only. When true, it's hidden from screen readers */\n decorative?: boolean;\n /** The thickness variant of the separator */\n thickness?: Thickness;\n}\n\n/**\n * A visual separator component for dividing content sections.\n * Supports both horizontal and vertical orientations with customizable thickness.\n * \n * @example\n * ```tsx\n * // Horizontal separator\n * <Separator />\n * \n * // Vertical separator\n * <Separator orientation=\"vertical\" className=\"h-6\" />\n * \n * // Thick separator\n * <Separator thickness=\"thick\" />\n * \n * // Decorative separator (hidden from screen readers)\n * <Separator decorative />\n * ```\n */\nexport function Separator({\n orientation = 'horizontal',\n decorative = false,\n thickness = 'thin',\n className,\n ...props\n}: SeparatorProps) {\n const separatorClasses = join(\n 'shrink-0 bg-border',\n sizeVariants[orientation],\n thicknessVariants[thickness][orientation],\n className\n );\n\n return (\n <div\n {...props}\n className={separatorClasses}\n role={decorative ? 'presentation' : 'separator'}\n aria-orientation={decorative ? undefined : orientation}\n aria-hidden={decorative}\n data-orientation={orientation}\n data-thickness={thickness}\n />\n );\n}\n","export const skeletonVariants = {\n shape: {\n rectangle: 'rounded-md min-h-1',\n circle: 'rounded-full aspect-square min-h-1',\n text: 'rounded-sm min-h-1 h-4',\n },\n lineSpacing: {\n xs: 'space-y-1',\n sm: 'space-y-2',\n md: 'space-y-3',\n lg: 'space-y-4',\n xl: 'space-y-6',\n },\n} as const;\n\nexport interface SkeletonVariants {\n /** The shape of the skeleton element */\n shape?: keyof typeof skeletonVariants.shape;\n /** Spacing between skeleton lines when multiple lines are used */\n lineSpacing?: keyof typeof skeletonVariants.lineSpacing;\n}\n","import React from 'react';\nimport { join } from '../../utils';\nimport { skeletonVariants, type SkeletonVariants } from './variants';\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, SkeletonVariants {\n /** Additional CSS classes to apply to the skeleton */\n className?: string;\n /** Number of skeleton lines to render (for text-like skeletons) */\n lines?: number;\n /** Whether the skeleton should animate with a pulse effect */\n animate?: boolean;\n /** Ref to be passed to the skeleton element */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * A loading placeholder component that mimics the structure of content being loaded.\n * Provides visual feedback during data fetching with customizable shapes and animations.\n * \n * @example\n * ```tsx\n * // Basic skeleton\n * <Skeleton className=\"h-4 w-48\" />\n * \n * // Multiple text lines\n * <Skeleton lines={3} lineSpacing=\"md\" />\n * \n * // Different shapes\n * <Skeleton shape=\"circle\" className=\"h-12 w-12\" />\n * <Skeleton shape=\"rounded\" className=\"h-32 w-full\" />\n * \n * // Without animation\n * <Skeleton animate={false} className=\"h-6 w-32\" />\n * ```\n */\nexport function Skeleton({\n shape = 'rectangle',\n lineSpacing = 'sm',\n className,\n lines = 1,\n animate = true,\n ref,\n ...props\n}: SkeletonProps) {\n const baseClasses = join('bg-muted/70', animate && 'animate-pulse', skeletonVariants.shape[shape], className);\n\n // If lines is greater than 1, render multiple skeleton lines\n if (lines > 1) {\n return (\n <div\n ref={ref}\n className={skeletonVariants.lineSpacing[lineSpacing]}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton-container'\n data-lines={lines}\n data-shape={shape}\n data-animate={animate}\n {...props}\n >\n {Array.from({ length: lines }, (_, index) => (\n <div\n key={index}\n className={join(\n baseClasses,\n // Make last line shorter for a more natural text appearance\n index === lines - 1 && 'w-3/4'\n )}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton-line'\n data-line-index={index}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={baseClasses}\n role='presentation'\n aria-hidden='true'\n data-testid='skeleton'\n data-shape={shape}\n data-animate={animate}\n {...props}\n />\n );\n}\n","import React, { useState, useRef, useCallback } from 'react';\nimport { join } from '@moondreamsdev/dreamer-ui/utils';\n\nexport interface SliderProps {\n id?: string;\n /** The controlled value of the slider */\n value?: number;\n /** The initial value of the slider (uncontrolled) */\n defaultValue?: number;\n /** Callback fired when the slider value changes */\n onValueChange?: (value: number) => void;\n /** The minimum value of the slider */\n min?: number;\n /** The maximum value of the slider */\n max?: number;\n /** The step increment of the slider */\n step?: number;\n /** Whether the slider is disabled */\n disabled?: boolean;\n /** Additional CSS classes to apply to the track element */\n trackClassName?: string;\n /** Additional CSS classes to apply to the filled range element */\n rangeClassName?: string;\n /** Additional CSS classes to apply to the thumb element */\n thumbClassName?: string;\n /** Additional CSS classes to apply to the slider */\n className?: string;\n /** Ref to the root element */\n ref?: React.Ref<HTMLDivElement>;\n /** ARIA label for accessibility */\n ariaLabel?: string;\n /** ARIA labelledby for accessibility */\n ariaLabelledBy?: string;\n}\n\n/**\n * A horizontal slider component for selecting numeric values within a specified range.\n * Supports both controlled and uncontrolled modes with keyboard navigation and touch support.\n * \n * @example\n * ```tsx\n * // Basic slider\n * <Slider\n * min={0}\n * max={100}\n * value={volume}\n * onValueChange={setVolume}\n * ariaLabel=\"Volume control\"\n * />\n * \n * // Uncontrolled with custom step\n * <Slider\n * defaultValue={50}\n * min={0}\n * max={200}\n * step={5}\n * onValueChange={(value) => console.log('Price:', value)}\n * />\n * \n * // Customized appearance\n * <Slider\n * value={opacity}\n * onValueChange={setOpacity}\n * min={0}\n * max={1}\n * step={0.1}\n * rangeClassName=\"bg-blue-500\"\n * thumbClassName=\"bg-blue-600 border-2 border-white\"\n * />\n * ```\n */\nexport function Slider({\n id,\n value,\n defaultValue = 0,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n trackClassName,\n rangeClassName,\n thumbClassName,\n className,\n ref,\n ariaLabel,\n ariaLabelledBy,\n ...props\n}: SliderProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const trackRef = useRef<HTMLDivElement>(null);\n const isDraggingRef = useRef(false);\n const dragOffsetRef = useRef(0);\n\n const updateValue = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n const steppedValue = Math.round(clampedValue / step) * step;\n\n if (!isControlled) {\n setInternalValue(steppedValue);\n }\n onValueChange?.(steppedValue);\n },\n [min, max, step, isControlled, onValueChange]\n );\n\n const getValueFromPointerEvent = useCallback(\n (event: PointerEvent | React.PointerEvent, isDragging = false) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return currentValue;\n\n let clientX = event.clientX;\n\n // If we're dragging, account for the offset from where the user initially clicked on the thumb\n if (isDragging) {\n clientX = clientX - dragOffsetRef.current;\n }\n\n const percentage = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return min + (max - min) * percentage;\n },\n [min, max, currentValue]\n );\n\n const handleTrackPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n // Only handle track clicks, not thumb clicks\n if (event.target !== event.currentTarget) return;\n\n const newValue = getValueFromPointerEvent(event);\n updateValue(newValue);\n },\n [disabled, getValueFromPointerEvent, updateValue]\n );\n\n const handleThumbPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n // Prevent the track click handler from firing\n event.stopPropagation();\n\n isDraggingRef.current = true;\n\n // Calculate the offset from the click position to the center of the thumb\n const trackRect = trackRef.current?.getBoundingClientRect();\n const thumbRect = event.currentTarget.getBoundingClientRect();\n\n if (trackRect && thumbRect) {\n const thumbCenter = thumbRect.left + thumbRect.width / 2;\n dragOffsetRef.current = event.clientX - thumbCenter;\n }\n\n // Set pointer capture on the thumb element for better tracking\n event.currentTarget.setPointerCapture(event.pointerId);\n\n // Add global event listeners for smooth dragging\n const handleGlobalPointerMove = (e: PointerEvent) => {\n if (!isDraggingRef.current) return;\n const newValue = getValueFromPointerEvent(e, true);\n updateValue(newValue);\n };\n\n const handleGlobalPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== event.pointerId) return;\n isDraggingRef.current = false;\n dragOffsetRef.current = 0;\n\n // Try to release capture from both the thumb and document\n try {\n event.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // Ignore errors if element is no longer available\n }\n\n document.removeEventListener('pointermove', handleGlobalPointerMove);\n document.removeEventListener('pointerup', handleGlobalPointerUp);\n };\n\n document.addEventListener('pointermove', handleGlobalPointerMove);\n document.addEventListener('pointerup', handleGlobalPointerUp);\n },\n [disabled, getValueFromPointerEvent, updateValue]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n let newValue = currentValue;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = currentValue + step;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = currentValue - step;\n break;\n case 'Home':\n newValue = min;\n break;\n case 'End':\n newValue = max;\n break;\n case 'PageUp':\n newValue = currentValue + step * 10;\n break;\n case 'PageDown':\n newValue = currentValue - step * 10;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n updateValue(newValue);\n },\n [disabled, currentValue, step, min, max, updateValue]\n );\n\n // Calculate percentage for positioning\n const percentage = max === min ? 0 : ((currentValue - min) / (max - min)) * 100;\n\n return (\n <div\n id={id}\n ref={ref}\n className={join(\n 'relative flex items-center w-full touch-none select-none',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n data-disabled={disabled}\n data-value={currentValue}\n data-min={min}\n data-max={max}\n data-step={step}\n {...props}\n >\n <div\n ref={trackRef}\n className={join(\n 'relative h-1.5 w-full rounded-full bg-muted cursor-pointer',\n disabled && 'cursor-not-allowed',\n trackClassName\n )}\n onPointerDown={handleTrackPointerDown}\n >\n {/* Range (filled portion) */}\n <div\n className={join(\n 'absolute h-full rounded-full pointer-events-none', // pointer-events are disabled so that user interactions are handled by the track element, enabling correct slider behavior\n !isDraggingRef.current && 'transition-all',\n rangeClassName\n )}\n style={{ width: `${percentage}%` }}\n />\n\n {/* Thumb */}\n <div\n className={join(\n 'absolute size-5 -top-2 rounded-full shadow-md cursor-grab',\n disabled && 'cursor-not-allowed',\n !disabled && 'cursor-grab focus:outline-none focus:ring-2',\n isDraggingRef.current ? 'cursor-grabbing scale-110' : 'transition-all',\n thumbClassName\n )}\n style={{ left: `calc(${percentage}% - 10px)` }}\n tabIndex={disabled ? -1 : 0}\n role='slider'\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-disabled={disabled}\n onKeyDown={handleKeyDown}\n onPointerDown={handleThumbPointerDown}\n />\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\n\nexport type TableSortDirection = 'asc' | 'desc' | null;\n\nexport interface SortConfig<T> {\n\tkey: keyof T | null;\n\tdirection: TableSortDirection;\n}\n\nexport interface UseTableSortOptions<T> {\n\tdata: T[];\n\tinitialSort?: SortConfig<T>;\n}\n\nexport interface UseTableSortResult<T> {\n\tsortedData: T[];\n\tsortConfig: SortConfig<T>;\n\thandleSort: (key: keyof T, customSorter?: (a: T, b: T) => number) => void;\n}\n\nexport function useTableSort<T>({\n\tdata,\n\tinitialSort = { key: null, direction: null },\n}: UseTableSortOptions<T>): UseTableSortResult<T> {\n\tconst [sortConfig, setSortConfig] = useState<SortConfig<T>>(initialSort);\n\tconst [sortFn, setSortFn] = useState<(a: T, b: T) => number>();\n\n\tconst sortedData = useMemo(() => {\n\t\tif (!sortConfig.key || !sortConfig.direction) {\n\t\t\treturn data;\n\t\t}\n\n\t\treturn [...data].sort((a, b) => {\n\t\t\tif (sortFn) {\n\t\t\t\tconst result = sortFn(a, b);\n\t\t\t\treturn sortConfig.direction === 'desc' ? -result : result;\n\t\t\t}\n\n\t\t\tconst aValue = a[sortConfig.key!];\n\t\t\tconst bValue = b[sortConfig.key!];\n\n\t\t\tif (aValue === bValue) return 0;\n\n\t\t\tlet result = 0;\n\n\t\t\t// Handle different data types\n\t\t\tif (typeof aValue === 'string' && typeof bValue === 'string') {\n\t\t\t\tresult = aValue.localeCompare(bValue);\n\t\t\t} else if (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\tresult = aValue - bValue;\n\t\t\t} else if (aValue instanceof Date && bValue instanceof Date) {\n\t\t\t\tresult = aValue.getTime() - bValue.getTime();\n\t\t\t} else {\n\t\t\t\t// Fallback to string comparison\n\t\t\t\tresult = String(aValue).localeCompare(String(bValue));\n\t\t\t}\n\n\t\t\treturn sortConfig.direction === 'desc' ? -result : result;\n\t\t});\n\t}, [data, sortConfig, sortFn]);\n\n\tconst handleSort = (key: keyof T, customSorter?: (a: T, b: T) => number) => {\n\t\tsetSortFn(() => customSorter);\n\t\tsetSortConfig((prevConfig) => {\n\t\t\tif (prevConfig.key === key) {\n\t\t\t\t// Cycle through: asc -> desc -> null\n\t\t\t\tconst direction = prevConfig.direction === 'asc' ? 'desc' : prevConfig.direction === 'desc' ? null : 'asc';\n\t\t\t\treturn { key: direction ? key : null, direction };\n\t\t\t} else {\n\t\t\t\treturn { key, direction: 'asc' };\n\t\t\t}\n\t\t});\n\t};\n\n\treturn { sortedData, sortConfig, handleSort };\n}\n\nexport interface UseTableSelectionOptions {\n\tinitialSelected?: (string | number)[];\n}\n\nexport function useTableSelection({ initialSelected = [] }: UseTableSelectionOptions = {}) {\n\tconst [selectedRows, setSelectedRows] = useState<Set<string | number>>(new Set(initialSelected));\n\n\tconst isRowSelected = (id: string | number): boolean => {\n\t\treturn selectedRows.has(id);\n\t};\n\n\tconst selectRow = (id: string | number) => {\n\t\tsetSelectedRows((prev) => new Set([...prev, id]));\n\t};\n\n\tconst deselectRow = (id: string | number) => {\n\t\tsetSelectedRows((prev) => {\n\t\t\tconst newSet = new Set(prev);\n\t\t\tnewSet.delete(id);\n\t\t\treturn newSet;\n\t\t});\n\t};\n\n\tconst selectAll = (ids: (string | number)[]) => {\n\t\tsetSelectedRows(new Set(ids));\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetSelectedRows(new Set());\n\t};\n\n\tconst isAllSelected = (ids: (string | number)[]): boolean => {\n\t\treturn ids.length > 0 && ids.every((id) => selectedRows.has(id));\n\t};\n\n\tconst isPartiallySelected = (ids: (string | number)[]): boolean => {\n\t\tconst selectedCount = ids.filter((id) => selectedRows.has(id)).length;\n\t\treturn selectedCount > 0 && selectedCount < ids.length;\n\t};\n\n\treturn {\n\t\tselectedRows,\n\t\tisRowSelected,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t};\n}\n","interface TableVariantStyles {\n\tcontainer: string;\n\ttable: string;\n\theader: string;\n\theaderCell: string;\n\tsortButton: string;\n\tcell: string;\n\tselectedRow: string;\n\tcheckbox: string;\n\tcheckboxSize: number;\n}\n\nexport type TableSize = 'sm' | 'md' | 'lg';\n\nexport const TableSizes: Record<TableSize, TableVariantStyles> = {\n\tsm: {\n\t\tcontainer: 'text-sm',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b border-border',\n\t\theaderCell: 'px-3 py-2.5 font-medium',\n\t\tsortButton: 'inline-flex items-center gap-1 hover:text-accent transition-colors',\n\t\tcell: 'px-3 py-2 text-sm',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-5 pr-2 text-left w-3',\n\t\tcheckboxSize: 12,\n\t},\n\tmd: {\n\t\tcontainer: 'text-base',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b-2 border-border',\n\t\theaderCell: 'px-4 py-3 font-semibold',\n\t\tsortButton: 'inline-flex items-center gap-2 hover:text-accent transition-colors',\n\t\tcell: 'px-4 py-3',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-6 pr-3 py-3 text-left w-6',\n\t\tcheckboxSize: 16,\n\t},\n\tlg: {\n\t\tcontainer: 'text-lg',\n\t\ttable: 'w-full border-collapse',\n\t\theader: 'border-b-2 border-border',\n\t\theaderCell: 'px-6 py-4 font-bold',\n\t\tsortButton: 'inline-flex items-center gap-2 hover:text-accent transition-colors',\n\t\tcell: 'px-6 py-4',\n\t\tselectedRow: 'bg-accent/10 hover:bg-accent/20',\n\t\tcheckbox: 'pl-6 pr-3 py-4 text-left w-8',\n\t\tcheckboxSize: 18,\n\t},\n};\n","import React from 'react';\nimport { useTableSelection, useTableSort } from './hooks';\nimport { TableSize, TableSizes } from './variants';\nimport { join } from '../../utils';\nimport { Checkbox } from '../checkbox';\nimport { ChevronDown, ChevronUp } from '../../symbols';\n\nexport interface TableColumn<T extends object, U = unknown> {\n\t/** Unique key for the column. Used for cell value if no `accessor` is provided */\n\tkey: Extract<keyof T, string>;\n\t/** Column header label */\n\theader: string;\n\t/** Accessor function or property name to get cell value */\n\taccessor?: keyof T | ((item: T) => U);\n\t/** Custom cell renderer */\n\tcell?: (item: T, value: U) => React.ReactNode;\n\t/** Whether the column is sortable */\n\tsortable?: boolean;\n\t/** Custom sort function. Negative result indicates descending order */\n\tsortFunction?: (a: T, b: T) => number;\n\t/** Column width */\n\twidth?: string | number;\n\t/** Column alignment */\n\talign?: 'left' | 'center' | 'right';\n\t/** Additional header class names */\n\theaderClassName?: string;\n\t/** Additional cell class names */\n\tcellClassName?: string;\n /** Additional column class names */\n columnClassName?: string;\n}\n\nexport interface TableProps<T extends object> {\n\t/** Unique identifier for the table */\n\tid?: string;\n\t/** Custom CSS classes */\n\tclassName?: string;\n\t/** React ref for the table container */\n\tref?: React.Ref<HTMLDivElement>;\n\t/** Size variant affecting padding and font sizes */\n\tsize?: TableSize;\n\t/** Array of data objects to display in the table */\n\tdata: T[];\n\t/** Column definitions specifying headers, accessors, and rendering options */\n\tcolumns: TableColumn<T>[];\n\t/** Whether to show row selection checkboxes */\n\tselectable?: boolean;\n\t/** Function to get unique row ID */\n\tgetRowId?: (item: T, index: number) => string | number;\n\t/** Initial selected row IDs */\n\tinitialSelected?: (string | number)[];\n\t/** Callback fired when row selection changes */\n\tonSelectionChange?: (selectedIds: (string | number)[]) => void;\n\t/** Whether to show table header */\n\tshowHeader?: boolean;\n\t/** Whether to add striped row styling */\n\tstriped?: boolean;\n\t/** Whether to add hover effects */\n\thoverable?: boolean;\n\t/** Empty state content */\n\temptyState?: React.ReactNode;\n\t/** Whether to show loading state */\n\tloading?: boolean;\n\t/** Loading content */\n\tloadingContent?: React.ReactNode;\n\t/** Table caption for accessibility */\n\tcaption?: string;\n}\n\n/**\n * A feature-rich table component with sorting, selection, and accessibility features.\n * Supports custom cell rendering, row selection, and responsive design.\n * \n * **Important:** The `data` prop should be stable (either declared outside the component or memoized)\n * to prevent unnecessary re-renders and maintain performance.\n * \n * @example\n * ```tsx\n * // Define stable data and columns outside component or use useMemo\n * const tableData = [\n * { id: 1, name: 'John Doe', email: 'john@example.com' },\n * { id: 2, name: 'Jane Smith', email: 'jane@example.com' }\n * ];\n * \n * const columns = [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true },\n * { \n * key: 'actions', \n * header: 'Actions',\n * cell: (item) => <Button onClick={() => edit(item.id)}>Edit</Button>\n * }\n * ];\n * \n * <Table\n * data={tableData}\n * columns={columns}\n * selectable\n * onSelectionChange={(selected) => setSelectedIds(selected)}\n * />\n * ```\n */\nexport function Table<T extends object>({\n\tid,\n\tclassName,\n\tref,\n\tsize = 'md',\n\tdata,\n\tcolumns,\n\tselectable = false,\n\tgetRowId = (_, index) => index,\n\tinitialSelected = [],\n\tonSelectionChange,\n\tshowHeader = true,\n\tstriped = false,\n\thoverable = true,\n\temptyState,\n\tloading = false,\n\tloadingContent,\n\tcaption,\n\t...props\n}: TableProps<T>) {\n\tconst sizeVariant = TableSizes[size];\n\n\tconst { sortedData, sortConfig, handleSort } = useTableSort({\n\t\tdata,\n\t\tinitialSort: { key: null, direction: null },\n\t});\n\n\tconst {\n\t\tselectedRows,\n\t\tisRowSelected,\n\t\tselectRow,\n\t\tdeselectRow,\n\t\tselectAll,\n\t\tdeselectAll,\n\t\tisAllSelected,\n\t\tisPartiallySelected,\n\t} = useTableSelection({ initialSelected });\n\n\t// Get all row IDs for select all functionality\n\tconst allRowIds = data.map((item, index) => getRowId(item, index));\n\n\t// Handle selection changes\n\tReact.useEffect(() => {\n\t\tif (onSelectionChange) {\n\t\t\tonSelectionChange(Array.from(selectedRows));\n\t\t}\n\t}, [selectedRows, onSelectionChange]);\n\n\tconst handleSelectAll = () => {\n\t\tif (isAllSelected(allRowIds)) {\n\t\t\tdeselectAll();\n\t\t} else {\n\t\t\tselectAll(allRowIds);\n\t\t}\n\t};\n\n\tconst getCellValue = (item: T, column: TableColumn<T>) => {\n\t\tif (column.accessor) {\n\t\t\tif (typeof column.accessor === 'function') {\n\t\t\t\treturn column.accessor(item);\n\t\t\t} else {\n\t\t\t\treturn item[column.accessor];\n\t\t\t}\n\t\t}\n\t\treturn item[column.key];\n\t};\n\n\tconst renderCell = (item: T, column: TableColumn<T>) => {\n\t\tconst value = getCellValue(item, column);\n\n\t\tif (column.cell) {\n\t\t\treturn column.cell(item, value);\n\t\t}\n\n\t\treturn <>{value}</>;\n\t};\n\n\tconst getAlignmentClass = (align?: 'left' | 'center' | 'right') => {\n\t\tswitch (align) {\n\t\t\tcase 'center':\n\t\t\t\treturn 'text-center';\n\t\t\tcase 'right':\n\t\t\t\treturn 'text-right';\n\t\t\tdefault:\n\t\t\t\treturn 'text-left';\n\t\t}\n\t};\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join('flex items-center justify-center p-8', sizeVariant.container, className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{loadingContent || <div>Loading...</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (data.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tid={id}\n\t\t\t\tref={ref}\n\t\t\t\tclassName={join('flex items-center justify-center p-8', sizeVariant.container, className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{emptyState || <div className='text-muted-foreground'>No data available</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tid={id}\n\t\t\tref={ref}\n\t\t\tclassName={join('overflow-x-auto border border-border rounded-lg', sizeVariant.container, className)}\n\t\t\tdata-testid='table-container'\n\t\t\tdata-size={size}\n\t\t\tdata-selectable={selectable}\n\t\t\t{...props}\n\t\t>\n\t\t\t<table className={sizeVariant.table} role='table'>\n\t\t\t\t{caption && <caption className='sr-only'>{caption}</caption>}\n\n <colgroup>\n {selectable && <col style={{ width: '1%' }} />}\n {columns.map((column) => (\n <col key={column.key} style={column.width ? { width: column.width } : {}} className={column.columnClassName} />\n ))}\n </colgroup>\n\n\t\t\t\t{showHeader && (\n\t\t\t\t\t<thead className={sizeVariant.header} role='rowgroup'>\n\t\t\t\t\t\t<tr role='row'>\n\t\t\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t\t\t<th className={sizeVariant.checkbox} role='columnheader' aria-label='Select all rows'>\n\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize}\n\t\t\t\t\t\t\t\t\t\tchecked={isAllSelected(allRowIds)}\n\t\t\t\t\t\t\t\t\t\tindeterminate={isPartiallySelected(allRowIds)}\n\t\t\t\t\t\t\t\t\t\tonCheckedChange={handleSelectAll}\n\t\t\t\t\t\t\t\t\t\taria-label='Select all rows'\n\t\t\t\t\t\t\t\t\t\tclassName='align-middle'\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\tconst sortDirection = sortConfig.key === column.key ? sortConfig.direction : null;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<th\n\t\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\t\tclassName={join(sizeVariant.headerCell, getAlignmentClass(column.align), column.headerClassName)}\n\t\t\t\t\t\t\t\t\t\trole='columnheader'\n\t\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\t\tsortConfig.key === column.key\n\t\t\t\t\t\t\t\t\t\t\t\t? sortConfig.direction === 'asc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'ascending'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: sortConfig.direction === 'desc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'descending'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'none'\n\t\t\t\t\t\t\t\t\t\t\t\t: column.sortable\n\t\t\t\t\t\t\t\t\t\t\t\t? 'none'\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{column.sortable ? (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={sizeVariant.sortButton}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSort(column.key, column.sortFunction)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Sort by ${column.header}`}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{column.header}\n\t\t\t\t\t\t\t\t\t\t\t\t<div className='flex flex-col items-center -space-y-1'>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronUp\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize - 4}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={sortDirection === 'asc' ? 'text-accent' : 'opacity-40'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChevronDown\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize - 4}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={sortDirection === 'desc' ? 'text-accent' : 'opacity-40'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tcolumn.header\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t)}\n\n\t\t\t\t<tbody role='rowgroup'>\n\t\t\t\t\t{sortedData.map((item, index) => {\n\t\t\t\t\t\tconst rowId = getRowId(item, index);\n\t\t\t\t\t\tconst isSelected = isRowSelected(rowId);\n\t\t\t\t\t\tconst isFinalItem = index === sortedData.length - 1;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\tkey={rowId}\n\t\t\t\t\t\t\t\tclassName={join(\n\t\t\t\t\t\t\t\t\t'transition-all',\n\t\t\t\t\t\t\t\t\t!isFinalItem && 'border-b border-border',\n\t\t\t\t\t\t\t\t\thoverable && 'hover:bg-accent/15',\n\t\t\t\t\t\t\t\t\tstriped && index % 2 === 1 && 'bg-accent/25',\n\t\t\t\t\t\t\t\t\tisSelected && sizeVariant.selectedRow\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\trole='row'\n\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\tdata-testid='table-row'\n\t\t\t\t\t\t\t\tdata-row-id={rowId}\n\t\t\t\t\t\t\t\tdata-selected={isSelected}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t\t\t\t<td className={sizeVariant.checkbox} role='cell'>\n\t\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\t\tsize={sizeVariant.checkboxSize}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectRow(rowId);\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeselectRow(rowId);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Select row ${index + 1}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\t\tclassName={join(sizeVariant.cell, getAlignmentClass(column.align), column.cellClassName)}\n\t\t\t\t\t\t\t\t\t\trole='cell'\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{renderCell(item, column)}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t);\n}\n","import { useState, useCallback } from 'react';\n\nexport interface UseTabsProps {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n}\n\nexport const useTabs = ({ defaultValue, value, onValueChange }: UseTabsProps = {}) => {\n const [internalValue, setInternalValue] = useState<string>(defaultValue || '');\n \n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n \n const handleValueChange = useCallback((newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n }, [isControlled, onValueChange]);\n\n return {\n value: currentValue,\n onValueChange: handleValueChange\n };\n};\n","import React from 'react';\nimport { useTabs } from './hooks';\nimport { TabsContext, TabsContextValue } from './TabsContext';\nimport { TabsVariant, TabsWidth } from './variants';\n\nexport interface TabsProps {\n id?: string;\n /** The value of the tab that should be active when initially rendered */\n defaultValue?: string;\n /** The controlled value of the tab to activate */\n value?: string;\n /** Event handler called when the value changes */\n onValueChange?: (value: string) => void;\n /** How the tabs should be sized. \"fit\" sizes tabs to content, \"full\" makes them equal width */\n tabsWidth?: TabsWidth;\n /** The visual style variant of the tabs */\n variant?: TabsVariant;\n /** Additional CSS classes to apply to the tabs container */\n className?: string;\n /** The tab list and content elements */\n children?: React.ReactNode;\n /** Ref to the tabs container */\n ref?: React.Ref<HTMLDivElement>;\n /** Additional CSS classes to apply to the tab triggers */\n triggersClassName?: string;\n /** Additional CSS classes to apply to the tab content */\n contentClassName?: string;\n}\n\n/**\n * A tabs component for organizing content into switchable sections.\n * Works with TabsList, TabsTrigger, and TabsContent child components.\n * \n * @example\n * ```tsx\n * <Tabs defaultValue=\"tab1\" variant=\"underline\">\n * <TabsList>\n * <TabsTrigger value=\"tab1\">Overview</TabsTrigger>\n * <TabsTrigger value=\"tab2\">Details</TabsTrigger>\n * <TabsTrigger value=\"tab3\">Settings</TabsTrigger>\n * </TabsList>\n * \n * <TabsContent value=\"tab1\">\n * <h3>Overview Content</h3>\n * </TabsContent>\n * <TabsContent value=\"tab2\">\n * <h3>Details Content</h3>\n * </TabsContent>\n * <TabsContent value=\"tab3\">\n * <h3>Settings Content</h3>\n * </TabsContent>\n * </Tabs>\n * ```\n */\nexport function Tabs({\n defaultValue,\n value,\n onValueChange,\n tabsWidth = 'fit',\n variant = 'underline',\n className,\n children,\n ref,\n id,\n triggersClassName,\n contentClassName,\n}: TabsProps) {\n const { value: selectedValue, onValueChange: handleValueChange } = useTabs({\n defaultValue,\n value,\n onValueChange,\n });\n\n const contextValue: TabsContextValue = {\n selectedValue,\n onValueChange: handleValueChange,\n tabsWidth,\n variant,\n triggersClassName,\n contentClassName,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div id={id} ref={ref} className={className} data-tabs-width={tabsWidth} data-variant={variant}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\n\nexport interface TabsContentProps {\n ref?: React.Ref<HTMLDivElement>;\n /** The value that identifies this tab content */\n value: string;\n /** Additional class names */\n className?: string;\n /** Tab content */\n children?: React.ReactNode;\n}\n\nexport function TabsContent({ value, className, children, ref }: TabsContentProps) {\n const { selectedValue, contentClassName } = useTabsContext();\n const isActive = selectedValue === value;\n\n if (!isActive) {\n return null;\n }\n\n const baseClassName =\n 'mt-4 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2';\n\n return (\n <div\n ref={ref}\n role='tabpanel'\n id={`tabs-content-${value}`}\n aria-labelledby={`tabs-trigger-${value}`}\n data-state={isActive ? 'active' : 'inactive'}\n data-value={value}\n className={join(baseClassName, contentClassName, className)}\n tabIndex={0}\n >\n {children}\n </div>\n );\n}\n","export type TabsWidth = 'fit' | 'full';\nexport type TabsVariant = 'underline' | 'pills' | 'bordered';\n\nexport const tabsListVariants = {\n width: {\n fit: 'w-fit',\n full: 'w-full *:flex-1',\n },\n variant: {\n underline: 'border-b border-border',\n pills: '',\n bordered: 'border border-border rounded-lg p-1',\n },\n};\n\nexport const tabTriggerVariants = {\n underline:\n 'border-b-2 border-transparent data-[state=active]:border-accent data-[state=active]:text-accent hover:text-accent-foreground',\n pills: 'rounded-md data-[state=active]:bg-accent data-[state=active]:text-accent-foreground hover:bg-accent/30',\n bordered: 'rounded data-[state=active]:bg-accent data-[state=active]:text-accent-foreground hover:bg-accent/30',\n};\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\nimport { tabsListVariants } from './variants';\n\nexport interface TabsListProps {\n id?: string;\n ref?: React.Ref<HTMLDivElement>;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function TabsList({ children, className, id, ref }: TabsListProps) {\n const { tabsWidth, variant } = useTabsContext();\n\n return (\n <div\n id={id}\n ref={ref}\n role='tablist'\n className={join('flex', tabsListVariants.width[tabsWidth], tabsListVariants.variant[variant], className)}\n data-tabs-width={tabsWidth}\n data-variant={variant}\n >\n {children}\n </div>\n );\n}\n","import { join } from '../../utils';\nimport { useTabsContext } from './TabsContext';\nimport { tabTriggerVariants } from './variants';\n\nexport interface TabsTriggerProps {\n id?: string;\n ref?: React.Ref<HTMLButtonElement>;\n /** The value that identifies this tab */\n value: string;\n /** Whether this trigger is disabled */\n disabled?: boolean;\n /** Additional class names */\n className?: string;\n /** Tab trigger content */\n children?: React.ReactNode;\n /** Click handler */\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport function TabsTrigger({ value, disabled = false, className, children, onClick, id, ref }: TabsTriggerProps) {\n const { selectedValue, onValueChange, variant, triggersClassName } = useTabsContext();\n const isActive = selectedValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (!disabled) {\n onValueChange(value);\n }\n onClick?.(event);\n };\n\n const baseClassName =\n 'inline-flex items-center justify-center whitespace-nowrap px-3 py-2 text-sm ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50';\n\n return (\n <button\n id={id}\n ref={ref}\n role='tab'\n type='button'\n aria-selected={isActive}\n aria-controls={`tabs-content-${value}`}\n data-state={isActive ? 'active' : 'inactive'}\n data-value={value}\n disabled={disabled}\n className={join(\n baseClassName,\n isActive ? 'font-medium' : 'font-light',\n tabTriggerVariants[variant],\n triggersClassName,\n className\n )}\n onClick={handleClick}\n >\n {children}\n </button>\n );\n}\n","export const sizeVariants = {\n sm: {\n container: 'h-5 min-w-9 w-9',\n thumb: 'h-4 w-4',\n translate: 'translate-x-4',\n },\n md: {\n container: 'h-6 min-w-11 w-11',\n thumb: 'h-5 w-5',\n translate: 'translate-x-5',\n },\n lg: {\n container: 'h-7 min-w-13 w-13',\n thumb: 'h-6 w-6',\n translate: 'translate-x-6',\n },\n};\nexport type ToggleSize = keyof typeof sizeVariants;\n\nexport interface ToggleBackgroundClasses {\n unchecked?: string;\n checked?: string;\n}\n\nexport const variantStyles: Record<ToggleVariant, ToggleBackgroundClasses> = {\n default: {\n unchecked: 'bg-muted',\n checked: 'bg-primary',\n },\n success: {\n unchecked: 'bg-muted',\n checked: 'bg-success',\n },\n destructive: {\n unchecked: 'bg-muted',\n checked: 'bg-destructive',\n },\n};\nexport type ToggleVariant = 'default' | 'success' | 'destructive';\n\nexport interface ToggleVariants {\n variant: ToggleVariant;\n size: ToggleSize;\n}\n\nexport const toggleDefaults: ToggleVariants = {\n variant: 'default',\n size: 'md',\n} as const;\n","import React, { Ref, useEffect, useId, useMemo, useState } from 'react';\nimport { join } from '../../utils';\nimport {\n sizeVariants,\n ToggleBackgroundClasses,\n toggleDefaults,\n ToggleSize,\n ToggleVariant,\n variantStyles,\n} from './variants';\n\nexport interface ToggleProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n /** Reference to the toggle button element. */\n ref?: Ref<HTMLButtonElement>;\n /** The size of the toggle switch. */\n size?: ToggleSize;\n /** The color variant of the toggle switch. */\n variant?: ToggleVariant;\n /** Whether the toggle is checked. If not provided, the toggle will be uncontrolled. */\n checked?: boolean;\n /** Callback fired when the toggle state changes. */\n onCheckedChange?: (checked: boolean) => void;\n /** Whether the toggle is disabled. */\n disabled?: boolean;\n /** Additional CSS classes to apply to the toggle thumb. */\n thumbClassName?: string;\n /** Custom background CSS classes for different toggle states. */\n backgroundClassNames?: ToggleBackgroundClasses;\n}\n\n/**\n * A toggle switch component for binary on/off states with smooth animations.\n * Supports both controlled and uncontrolled modes with keyboard navigation.\n * \n * @example\n * ```tsx\n * // Uncontrolled toggle\n * <Toggle onCheckedChange={(checked) => console.log('Toggled:', checked)} />\n * \n * // Controlled toggle\n * <Toggle \n * checked={isEnabled}\n * onCheckedChange={setIsEnabled}\n * size=\"lg\"\n * variant=\"success\"\n * />\n * \n * // Disabled state\n * <Toggle disabled checked />\n * ```\n */\nexport function Toggle({\n ref,\n id,\n size = toggleDefaults.size,\n variant = toggleDefaults.variant,\n checked,\n onCheckedChange,\n disabled = false,\n className,\n thumbClassName,\n backgroundClassNames,\n ...props\n}: ToggleProps) {\n const generatedId = useId();\n const toggleId = useMemo(() => id || `toggle-${generatedId}`, [id, generatedId]);\n const [isChecked, setIsChecked] = useState(checked);\n\n useEffect(() => {\n setIsChecked(checked);\n }, [checked]);\n\n const handleToggle = () => {\n if (!disabled) {\n const newChecked = !isChecked;\n\n if (checked === undefined) {\n // Only update state if the toggle is uncontrolled\n setIsChecked(newChecked);\n }\n onCheckedChange?.(newChecked);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handleToggle();\n }\n };\n\n const sizeConfig = sizeVariants[size];\n const variantConfig = variantStyles[variant];\n\n const toggleClasses = join(\n // Base styles\n 'relative inline-flex items-center rounded-full transition-all duration-200 ease-in-out',\n 'focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n // Size\n sizeConfig.container,\n // Variant and state\n isChecked\n ? backgroundClassNames?.checked || variantConfig.checked\n : backgroundClassNames?.unchecked || variantConfig.unchecked,\n // Disabled state\n disabled && 'opacity-50 cursor-not-allowed',\n !disabled && 'cursor-pointer',\n className\n );\n\n const thumbClasses = join(\n // Base thumb styles\n 'absolute left-0.5 top-1/2 -translate-y-1/2 rounded-full bg-white shadow-sm transition-transform duration-200 ease-in-out',\n // Size\n sizeConfig.thumb,\n // Position based on state\n isChecked && sizeConfig.translate,\n thumbClassName\n );\n\n return (\n <button\n ref={ref}\n id={toggleId}\n type='button'\n role='switch'\n tabIndex={0}\n aria-checked={isChecked}\n aria-disabled={disabled}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={toggleClasses}\n {...props}\n >\n <span className={thumbClasses} />\n <span className='sr-only'>{isChecked ? 'Enabled' : 'Disabled'}</span>\n </button>\n );\n}\n"],"names":["AccordionItem","id","title","content","children","className","disabled","isOpen","onToggle","triggerClassName","bodyClassName","fallbackId","useId","itemId","headerId","panelId","handleToggle","handleKeyDown","e","jsxs","join","jsx","ChevronDown","Accordion","items","itemClassName","allowMultiple","defaultOpenItems","triggersClassName","bodiesClassName","groupId","groupName","openItems","setOpenItems","useState","toggleItem","prev","newOpenItems","getItemId","index","isItemOpen","item","React","child","createElement","AstronautAvatar","size","MoonAvatar","StarAvatar","GalaxyAvatar","NebulaAvatar","PlanetAvatar","CosmicCatAvatar","DreamCloudAvatar","RocketAvatar","ConstellationAvatar","CometAvatar","TwilightAvatar","AvatarPresets","AvatarSizes","AvatarShapes","Avatar","ref","shape","preset","alt","src","initials","props","sizeClasses","shapeClasses","PresetComponent","BadgeUseAriaAttributes","BadgeVariants","BadgeVariantsOutline","BadgeSizes","Badge","variant","outline","aspect","use","LoadingDots","activeIndex","setActiveIndex","useEffect","interval","prevIndex","buttonVariants","sizeVariants","roundedVariants","buttonDefaults","Button","rounded","loading","rest","adjustedSize","buttonClasses","buttonRest","getButtonChildren","childrenProps","useCalendar","options","initialDate","mode","minDate","maxDate","view","onDateSelect","onRangeSelect","state","setState","isDateDisabled","useCallback","date","selectDate","selectedRange","newRange","start","end","navigateMonth","direction","newDate","navigateWeek","days","navigateDay","navigate","changeView","newView","goToDate","changeMonth","month","changeYear","year","getDaysInView","useMemo","currentDate","firstDay","startDate","i","day","startOfWeek","isDateSelected","isDateInRange","_a","_b","isDateRangeStart","isDateRangeEnd","calendarSizeVariants","calendarViewVariants","calendarDefaults","WEEKDAYS","MONTHS","YEAR_RANGE","Calendar","customStyles","renderCell","showViewSelector","showNavigation","navigationLayout","useMonthYearSelector","showTodayButton","calendar","sizeStyles","viewStyles","isToday","today","isCurrentMonth","goToToday","formatTitle","endOfWeek","renderViewSelector","viewSelectorClasses","viewOption","renderMonthYearSelector","currentMonth","currentYear","startYear","endYear","yearOptions","monthYearSelectorsClasses","renderTodayButton","todayButtonClasses","renderDateCell","isSelected","isDisabled","isTodayDate","isInRange","isRangeStart","isRangeEnd","isCurrentMonthDate","baseCellClasses","cellClasses","cellContent","containerClasses","headerClasses","navigationClasses","prevButtonClasses","nextButtonClasses","titleClasses","weekdaysClasses","weekdayClasses","gridClasses","Fragment","ChevronLeft","ChevronRight","CalloutVariants","VariantIcons","InfoCircled","CrossCircled","CheckCircled","ExclamationTriangle","DeepRing","Callout","icon","description","dismissible","onDismiss","generatedId","calloutId","isDismissed","setIsDismissed","variantStyles","variantIcon","handleDismiss","X","CardSizes","Card","padding","header","footer","imageSrc","imageAlt","imageComponent","imageToEdge","sizeVariant","showImage","useCarousel","totalItems","itemsToShow","infinite","autoScroll","scrollInterval","pauseScrollOnHover","currentIndex","onIndexChange","currentSlide","setCurrentSlide","isHovered","setIsHovered","intervalRef","useRef","maxSlides","canGoPrev","canGoNext","goToSlide","clampedIndex","goToPrev","newIndex","goToNext","startInterval","stopInterval","buttonSizeVariants","buttonStyleVariants","buttonPositionVariants","Carousel","hidePrevNext","hideDots","buttonSize","buttonVariant","buttonPosition","prevButton","nextButton","itemsClassName","containerClassName","dotsClassName","gap","containerRef","childrenArray","screenSize","useScreenSize","currentItemsToShow","breakpointOrder","breakpoint","getSlideItemStyles","pos","widthReduction","handlePrevClick","handleNextClick","handleMouseEnter","handleMouseLeave","translateX","baseButtonStyles","leftWidth","rightWidth","_","useFilledBackgroundColor","filledBackgroundColor","setFilledBackgroundColor","getFirstNonTransparentBackgroundColor","element","currentElement","color","backgroundColor","checkbox","Checkbox","filled","checked","indeterminate","onCheckedChange","display","checkboxId","parentBackgroundColor","isChecked","setIsChecked","isIndeterminate","setIsIndeterminate","handleChange","newChecked","handleOnKeyDown","checkboxClasses","Dash","Check","Clickable","linkTo","linkProps","onButtonClick","buttonProps","useFontMetrics","metrics","setMetrics","computeMetrics","computed","fontSize","lineHeight","smallerFontSize","scale","smallerLineHeight","resizeObserver","mutationObserver","codeVariants","Code","style","codeId","fontMetrics","defaultBashTokenClasses","defaultCSSTokenClasses","defaultJsonTokenClasses","defaultMarkdownTokenClasses","defaultTSTokenClasses","BASH_KEYWORDS","BASH_RUNNERS","parseTemplateLiteral","input","tokens","char","braceDepth","exprStart","expression","exprTokens","tokenizeTypeScript","stringStart","parseTemplateLiteralContinuation","remainingTokens","tokenizeBash","codeLine","regex","processToken","token","inner","innerTokens","lastIndex","varRegex","match","tokenizeCSS","isInComment","inMultilineComment","context","comment","atRule","punctuation","str","func","number","hexColor","identifier","whitespace","plain","tokenType","type","tokenizeJSON","inheritedJSXContext","inheritedBraceDepth","inTemplateLiteral","remaining","isInJSX","jsxBraceDepth","templateResult","multiComment","singleComment","stringMatch","jsxOpenStart","jsxClose","tagEnd","jsxAttr","jsxBrace","operator","keyword","hook","property","tokenizeMarkdown","headerMatch","blockquoteMatch","listMatch","parseInlineMarkdown","codeBlockMatch","text","linkMatch","codeMatch","boldMatch","italicMatch","formatBash","codeLines","customTokenClasses","mergedTokenClasses","line","lineIndex","tokenIndex","formatCSS","inComment","formatJson","formatTypescript","globalJSXContext","globalBraceDepth","openBraces","closeBraces","formatMarkdown","useCopyToClipboard","copied","setCopied","handleCopy","err","useFullscreenMode","isFullscreen","setIsFullscreen","previousActiveElement","useKeyboardShortcuts","allowCopy","allowFullscreen","onCopy","onToggleFullscreen","getFileExtension","lang","CodeBlock","code","language","allowDownload","filename","showTrafficLights","showLineNumbers","hideHeader","hideFiletype","maxHeight","handleDownload","downloadFilename","downloadFile","toggleFullScreen","renderButtons","inHeader","Window","Download","Copy","formattedCode","lineNumbers","codeStyle","codeBlockContent","node","createPortal","Disclosure","label","open","buttonClassName","activeId","internalOpen","setInternalOpen","CaretCollapse","CaretExpand","useAnimationSlideIn","show","setShow","shouldRender","setShouldRender","timer","useDrawerDrag","onClose","enabled","isDragging","setIsDragging","translateY","setTranslateY","startY","setStartY","handleStart","clientY","handleMove","deltaY","clampedDeltaY","handleEnd","handleMouseDown","handleMouseMove","handleMouseUp","handleTouchStart","handleTouchMove","handleTouchEnd","useDrawerFocus","drawerId","drawerElement","event","focusableElements","firstElement","lastElement","useDrawerDocumentChanges","originalStyle","handleEscape","Drawer","overlayClassName","showCloseButton","disableCloseOnOverlayClick","enableDragGestures","ariaLabelledBy","ariaDescribedBy","titleId","dragHandlers","renderTitle","renderFooter","footerElement","existingClassName","getOppositePlacement","placement","useAutoSwitchPlacement","internalIsOpen","autoSwitchPlacement","offset","triggerRef","popoverRef","effectivePlacement","setEffectivePlacement","updatePlacement","triggerRect","popoverRect","viewportWidth","viewportHeight","newPlacement","opposite","hasSpace","hasSpaceOpposite","handleScrollOrResize","placementVariants","getOffsetStyle","Popover","onOpenChange","closeOnOverlayClick","trigger","alignment","closeOnTriggerClick","hoverable","setInternalIsOpen","previousFocusRef","popoverId","hoverTimeoutRef","handleOpenChange","clearHoverTimeout","handleClickOutside","target","triggerProps","triggerElement","mergeRefs","MenuOption","option","onItemSelect","useDropdownMenuContext","handleItemClick","hasSubitems","isLink","Element","SubMenu","level","focus","setFocus","isSubMenuOpen","setIsSubMenuOpen","hasExited","setHasExited","itemRef","previousLevelRef","submenuId","handleOpen","handleClose","focusLevel","previousLevel","submenuLevel","showingSubmenu","MenuBody","itemIndex","renderItem","key","groupItem","groupIndex","getItemElements","menuEl","getNextMenuItemIndex","menuItems","startIndex","getPreviousMenuItemIndex","useKeyboardNavigation","dropdownId","focusedIndex","menu","itemElements","nextIndex","submenu","parentMenuItem","parentMenuIndex","el","getMenuItem","DropdownMenu","popoverProps","isUncontrolled","handleItemSelect","value","dropdownTrigger","DropdownMenuContext","group","separator","custom","render","DropdownMenuFactories","useDynamicList","initialItems","setItems","draggedItem","setDraggedItem","draggedOverIndex","setDraggedOverIndex","draggedFromIndex","addItem","extra","newItem","deleteItem","moveItem","fromIndex","toIndex","newItems","movedItem","moveItemUp","moveItemDown","handleDragStart","handleDragOver","handleDragEnd","handleDrop","getVisualItems","visualItems","titleVariants","listVariants","iconSize","DiscMarker","DashMarker","DynamicList","allowAdd","allowDelete","allowReorder","addPlaceholder","onItemsChange","marker","itemRenderer","showDividers","showReorderButtons","truncateText","newItemText","setNewItemText","hoveredIndex","setHoveredIndex","inputRef","hasMounted","lastOnChangeItems","listId","itemRenderFunction","getItemElementById","handleAddItem","handleDeleteItem","nextItem","nextElement","handleKeyPress","handleItemKeyDown","prop","renderMarker","iconSizeValue","visualIndex","originalIndex","originalItem","isDraggedItem","GripVertical","ChevronUp","Trash","Plus","ErrorBoundaryVariants","ErrorBoundary","showRetry","fallbackMessage","fallback","onRetry","onError","inDevEnv","ErrorBoundaryClass","Component","__publicField","error","errorInfo","field","textarea","select","radio","FormFactories","useFormValidation","fields","data","errors","setErrors","validateField","isValidFunc","validation","validateForm","currentData","newErrors","validateSingleField","fieldName","f","clearErrors","hasErrors","isFormValid","formVariants","formDefaults","Label","width","required","helpMessage","suffix","htmlFor","showHelp","showDescription","helpId","descriptionId","QuestionMarkCircled","StatusHelpMessage","elementId","message","inputVariants","inputDefaults","Input","displayOnlyMode","errorMessage","successMessage","showPassword","setShowPassword","adjustedRound","inputClasses","EyeOpened","EyeClosed","CharacterCount","maxLength","characterCount","setCharacterCount","updateCharacterCount","updatedCharacterCount","isError","useAutoExpand","autoExpand","adjustHeight","textareaVariants","textareaDefaults","Textarea","hideResizeHandle","characterLimit","adjustedHideResizeHandle","useSelectDropdown","useSelectKeyboardNavigation","setIsOpen","filteredOptions","highlightedIndex","setHighlightedIndex","onSelect","finalIndex","checkIndex","selectedOption","useSelectHighlight","optionsContainerRef","selectedIndex","scrollToOption","container","highlightedOption","behavior","useScrollArea","scrollbarThickness","viewportRef","verticalThumbRef","horizontalThumbRef","isScrolling","setIsScrolling","isFadingOut","setIsFadingOut","scrollbarVisible","setScrollbarVisible","scrollTimeout","fadeTimeout","checkOverflow","viewport","hasVerticalScroll","hasHorizontalScroll","updateThumbSizes","verticalThumb","horizontalThumb","scrollRatio","thumbHeight","maxScrollTop","scrollPercentage","maxThumbPosition","thumbTop","thumbWidth","maxScrollLeft","thumbLeft","handleScroll","ScrollArea","thumbClassName","viewportClassName","scrollbarClassName","thumbsClassName","Select","placeholder","searchable","clearable","dropdownClassName","onChange","onSearch","searchPlaceholder","listboxId","getOptionId","searchTerm","setSearchTerm","searchInputRef","dropdownRef","activeDescendantId","keyboardOnSelect","handleOptionClick","handleSearchChange","term","handleClear","RadioInput","name","baseClasses","handleClick","radioClasses","RadioGroupItem","hideInput","useRadioFocus","selectedOptionIndex","setFocusedIndex","clickedIndex","setClickedIndex","isMouseDown","setIsMouseDown","handleClicked","setInitialFocus","indexToFocus","handleFocusPreceding","previousIndex","handleKeyboardNavigation","getRadioOptions","radioGroup","handleFocus","RadioGroup","childrenClassName","hideInputs","processedOptions","acc","Form","form","initialData","onDataChange","onSubmit","submitButton","columns","responsive","spacing","setData","updateData","newData","handleSubmit","getFieldStylesAndClasses","classes","styles","renderField","fieldValue","fieldError","fieldId","fieldClasses","fieldStyles","renderFieldContent","inputField","textareaField","selectField","selectOptions","opt","checkboxField","checkboxSize","radioOptions","formClasses","renderSubmitButton","isValidElement","cloneElement","Tooltip","delay","showArrow","isVisible","setIsVisible","isHoveringTrigger","setIsHoveringTrigger","isHoveringTooltip","setIsHoveringTooltip","isFocused","setIsFocused","timeoutRef","reactId","tooltipId","showTooltip","hideTooltip","forceHide","getTooltipClasses","visibilityClasses","placementClasses","transformOrigins","getArrowClasses","baseArrow","arrowClasses","HelpIcon","design","tooltipProps","IconComponent","InfoCircledFilled","useAnimationOpenClose","useDocumentChanges","useHandleFocus","modalId","focusAppropriateElement","modalElement","modalActions","allBesidesCloseButton","Modal","contentOnly","hideCloseButton","actions","renderActions","action","paginationVariants","paginationSizes","Pagination","page","pageCount","maxVisiblePages","showFirstLast","onPageChange","buttonsClassName","isInfinite","visiblePages","totalPages","maxPages","half","canGoPrevious","showFirstButton","showLastButton","handlePageChange","newPage","getButtonClasses","ChevronDoubleLeft","pageNum","ChevronDoubleRight","usePanelDocumentChanges","usePanelFocus","panelElement","panelActions","Panel","thicknessVariants","Separator","orientation","decorative","thickness","separatorClasses","skeletonVariants","Skeleton","lineSpacing","lines","animate","Slider","defaultValue","onValueChange","min","max","step","trackClassName","rangeClassName","ariaLabel","internalValue","setInternalValue","isControlled","currentValue","trackRef","isDraggingRef","dragOffsetRef","updateValue","newValue","clampedValue","steppedValue","getValueFromPointerEvent","rect","clientX","percentage","handleTrackPointerDown","handleThumbPointerDown","trackRect","thumbRect","thumbCenter","handleGlobalPointerMove","handleGlobalPointerUp","useTableSort","initialSort","sortConfig","setSortConfig","sortFn","setSortFn","a","b","result","aValue","bValue","customSorter","prevConfig","useTableSelection","initialSelected","selectedRows","setSelectedRows","newSet","ids","selectedCount","TableSizes","Table","selectable","getRowId","onSelectionChange","showHeader","striped","emptyState","loadingContent","caption","sortedData","handleSort","isRowSelected","selectRow","deselectRow","selectAll","deselectAll","isAllSelected","isPartiallySelected","allRowIds","handleSelectAll","getCellValue","column","getAlignmentClass","align","sortDirection","rowId","isFinalItem","useTabs","handleValueChange","Tabs","tabsWidth","contentClassName","selectedValue","contextValue","TabsContext","TabsContent","useTabsContext","isActive","tabsListVariants","tabTriggerVariants","TabsList","TabsTrigger","onClick","toggleDefaults","Toggle","backgroundClassNames","toggleId","sizeConfig","variantConfig","toggleClasses","thumbClasses"],"mappings":"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"}