@efiche/design 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +804 -363
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +0 -886
- package/dist/index.css.map +1 -1
- package/dist/index.js +813 -372
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ThemeProvider.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.tsx","../src/components/Alert/Alert.module.css","../src/components/Avatar/Avatar.module.css","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Breadcrumb/Breadcrumb.module.css","../src/components/Button/Button.tsx","../src/components/Card/Card.module.css","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/CopyButton/CopyButton.tsx","../src/components/CopyButton/CopyButton.module.css","../src/components/FileUpload/FileUpload.tsx","../src/components/FileUpload/FileUpload.module.css","../src/components/Input/Input.module.css","../src/components/Input/Input.tsx","../src/components/Label/Label.module.css","../src/components/Label/Label.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/Progress/Progress.module.css","../src/components/Progress/Progress.tsx","../src/components/RadioGroup/RadioGroup.tsx","../src/components/RadioGroup/RadioGroup.module.css","../src/components/Select/Select.tsx","../src/components/Select/Select.module.css","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Slider/Slider.tsx","../src/components/Slider/Slider.module.css","../src/components/Spinner/Spinner.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Switch/Switch.tsx","../src/components/Switch/Switch.module.css","../src/components/Table/Table.module.css","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/Tabs.module.css","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["'use client'\nimport React, { createContext, useContext, useState } from 'react'\nimport '../styles/globals.css'\n\ntype Theme = 'light' | 'dark'\n\ninterface ThemeContextValue {\n theme: Theme\n toggle: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: {\n children: React.ReactNode\n defaultTheme?: Theme\n}) => {\n const [theme, setTheme] = useState<Theme>(defaultTheme)\n return (\n <ThemeContext.Provider value={{ theme, toggle: () => setTheme(t => t === 'light' ? 'dark' : 'light') }}>\n <div className={theme === 'dark' ? 'ds-theme-dark' : undefined}>\n {children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContext)\n if (!ctx) throw new Error('useTheme must be used inside <ThemeProvider>')\n return ctx\n}\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\n\nexport interface AccordionItem {\n value: string\n trigger: string\n content: string\n}\n\ninterface AccordionProps {\n items: AccordionItem[]\n defaultValue?: string | string[]\n multiple?: boolean\n}\n\nconst Accordion: FC<AccordionProps> = ({ items, defaultValue, multiple = false }) => {\n const [open, setOpen] = useState<Set<string>>(() => {\n if (!defaultValue) return new Set()\n if (Array.isArray(defaultValue)) return new Set(defaultValue)\n return new Set([defaultValue])\n })\n const [hovered, setHovered] = useState<string | null>(null)\n\n const toggle = (value: string) => {\n setOpen(prev => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n if (!multiple) next.clear()\n next.add(value)\n }\n return next\n })\n }\n\n return (\n <div style={{\n border: '1px solid var(--ds-border, #e2e8f0)',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}>\n {items.map((item, index) => {\n const isOpen = open.has(item.value)\n const isHovered = hovered === item.value\n const isLast = index === items.length - 1\n return (\n <div\n key={item.value}\n style={{\n borderBottom: isLast ? 'none' : '1px solid var(--ds-border, #e2e8f0)',\n }}\n >\n <button\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n background: isHovered ? 'var(--ds-muted, #f1f5f9)' : 'transparent',\n border: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n color: 'var(--ds-text-primary, #0f172a)',\n transition: 'background-color 0.15s',\n }}\n onClick={() => toggle(item.value)}\n onMouseEnter={() => setHovered(item.value)}\n onMouseLeave={() => setHovered(null)}\n aria-expanded={isOpen}\n >\n <span>{item.trigger}</span>\n <ChevronDown\n size={16}\n style={{\n flexShrink: 0,\n color: 'var(--ds-text-secondary, #64748b)',\n transition: 'transform 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </button>\n <div style={{\n maxHeight: isOpen ? '300px' : '0',\n overflow: 'hidden',\n transition: 'max-height 0.25s ease',\n }}>\n <div style={{\n padding: '0 1rem 1rem',\n fontSize: '0.875rem',\n color: 'var(--ds-text-secondary, #64748b)',\n }}>\n {item.content}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Accordion\n\n/*\n * Accordion\n *\n * Renders a list of collapsible sections; by default only one section can be open at a time.\n *\n * Props:\n * items (AccordionItem[], required) — array of sections, each with:\n * value (string) — unique identifier\n * trigger (string) — heading text shown on the clickable row\n * content (string) — body text revealed when the section is open\n * defaultValue (string | string[], optional) — value(s) of sections that start open\n * multiple (boolean, optional) — when true, more than one section can be open simultaneously; defaults to false\n *\n * Usage:\n * <Accordion\n * items={[\n * { value: 'q1', trigger: 'What is eFiche?', content: 'eFiche is a medical records platform.' },\n * { value: 'q2', trigger: 'How do I log in?', content: 'Use your credentials at the login page.' },\n * ]}\n * />\n *\n * // Multiple sections open, first one pre-opened:\n * <Accordion items={faqItems} multiple defaultValue=\"q1\" />\n */\n","import React, { FC, ReactNode } from 'react'\nimport { Info, CheckCircle2, AlertTriangle, AlertCircle } from 'lucide-react'\nimport styles from './Alert.module.css'\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'danger'\n\ninterface AlertProps {\n variant?: AlertVariant\n title: string\n description: string\n}\n\nconst icons: Record<AlertVariant, ReactNode> = {\n info: <Info size={16} />,\n success: <CheckCircle2 size={16} />,\n warning: <AlertTriangle size={16} />,\n danger: <AlertCircle size={16} />,\n}\n\nconst Alert: FC<AlertProps> = ({ variant = 'info', title, description }) => (\n <div className={`${styles.alert} ${styles[variant]}`} role=\"alert\">\n <span className={styles.icon}>{icons[variant]}</span>\n <div className={styles.content}>\n <p className={styles.title}>{title}</p>\n <p className={styles.description}>{description}</p>\n </div>\n </div>\n)\n\nexport default Alert\n\n/*\n * Alert\n *\n * Displays an inline alert banner with an icon, a bold title, and a description line.\n *\n * Props:\n * title (string, required) — short heading for the alert\n * description (string, required) — supporting detail shown below the title\n * variant (\"info\" | \"success\" | \"warning\" | \"danger\", optional) — color and icon style; defaults to \"info\"\n *\n * Usage:\n * <Alert title=\"Saved\" description=\"Your changes have been saved.\" variant=\"success\" />\n *\n * // Warning:\n * <Alert title=\"Low storage\" description=\"You are using 90% of your quota.\" variant=\"warning\" />\n *\n * // Danger:\n * <Alert title=\"Error\" description=\"Something went wrong. Please try again.\" variant=\"danger\" />\n */\n",".alert {\n display: flex;\n gap: 0.75rem;\n padding: 1rem;\n border-radius: 0.5rem;\n border-left: 4px solid;\n}\n\n.icon {\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.content {\n flex: 1;\n}\n\n.title {\n font-weight: 600;\n font-size: 0.875rem;\n margin-bottom: 0.25rem;\n margin-top: 0;\n}\n\n.description {\n font-size: 0.875rem;\n margin: 0;\n}\n\n/* Info */\n.info {\n background-color: var(--ds-info-bg, #eff6ff);\n border-left-color: var(--ds-info, #3b82f6);\n}\n.info .icon { color: var(--ds-info, #3b82f6); }\n.info .title { color: var(--ds-info-title, #1e3a8a); }\n.info .description { color: var(--ds-info-desc, #1e40af); }\n\n/* Success */\n.success {\n background-color: var(--ds-success-bg, #f0fdf4);\n border-left-color: var(--ds-success, #22c55e);\n}\n.success .icon { color: var(--ds-success, #22c55e); }\n.success .title { color: var(--ds-success-title, #14532d); }\n.success .description { color: var(--ds-success-desc, #166534); }\n\n/* Warning */\n.warning {\n background-color: var(--ds-warning-bg, #fffbeb);\n border-left-color: var(--ds-warning, #f59e0b);\n}\n.warning .icon { color: var(--ds-warning, #f59e0b); }\n.warning .title { color: var(--ds-warning-title, #78350f); }\n.warning .description { color: var(--ds-warning-desc, #92400e); }\n\n/* Danger */\n.danger {\n background-color: var(--ds-danger-bg, #fef2f2);\n border-left-color: var(--ds-danger, #ef4444);\n}\n.danger .icon { color: var(--ds-danger, #ef4444); }\n.danger .title { color: var(--ds-danger-title, #7f1d1d); }\n.danger .description { color: var(--ds-danger-desc, #991b1b); }\n",".avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n background-color: var(--ds-accent, #f1f5f9);\n color: var(--ds-text-primary, #0f172a);\n font-weight: 600;\n flex-shrink: 0;\n user-select: none;\n}\n\n.sm { width: 2rem; height: 2rem; font-size: 0.625rem; }\n.md { width: 2.5rem; height: 2.5rem; font-size: 0.875rem; }\n.lg { width: 4rem; height: 4rem; font-size: 1.25rem; }\n","import React, { FC } from 'react'\nimport styles from './Avatar.module.css'\n\ntype AvatarSize = 'sm' | 'md' | 'lg'\n\ninterface AvatarProps {\n fallback: string\n size?: AvatarSize\n style?: React.CSSProperties\n className?: string\n}\n\nconst Avatar: FC<AvatarProps> = ({ fallback, size = 'md', style, className }) => (\n <div\n className={`${styles.avatar} ${styles[size]}${className ? ` ${className}` : ''}`}\n style={style}\n aria-label={fallback}\n >\n {fallback}\n </div>\n)\n\nexport default Avatar\n\n/*\n * Avatar\n *\n * Renders a circular (or rounded) container showing initials or a short text fallback.\n *\n * Props:\n * fallback (string, required) — text displayed inside the avatar, typically initials (e.g. \"AB\")\n * size (\"sm\" | \"md\" | \"lg\", optional) — controls the diameter of the circle; defaults to \"md\"\n * style (React.CSSProperties, optional) — inline styles for custom background color, etc.\n * className (string, optional) — extra CSS class names\n *\n * Usage:\n * <Avatar fallback=\"JD\" />\n *\n * // Large avatar with a custom background:\n * <Avatar fallback=\"MB\" size=\"lg\" style={{ background: '#6366f1' }} />\n */\n",".badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n border-radius: 9999px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n/* Sizes */\n.sm { padding: 0.125rem 0.5rem; font-size: 0.625rem; }\n.md { padding: 0.25rem 0.625rem; font-size: 0.75rem; }\n.lg { padding: 0.375rem 0.875rem; font-size: 0.875rem; }\n\n/* Variants */\n.default { background-color: var(--ds-primary, #3b82f6); color: #fff; }\n.secondary { background-color: var(--ds-muted, #f1f5f9); color: var(--ds-text-secondary, #64748b); }\n.outline { background-color: transparent; border: 1px solid var(--ds-border, #e2e8f0); color: var(--ds-text-primary, #0f172a); }\n.danger { background-color: var(--ds-danger, #ef4444); color: #fff; }\n.success { background-color: var(--ds-success, #22c55e); color: #fff; }\n.warning { background-color: var(--ds-warning, #f59e0b); color: #fff; }\n.info { background-color: var(--ds-info, #3b82f6); color: #fff; }\n","import React, { FC, ReactNode } from 'react'\nimport styles from './Badge.module.css'\n\ntype BadgeVariant = 'default' | 'secondary' | 'outline' | 'danger' | 'success' | 'warning' | 'info'\ntype BadgeSize = 'sm' | 'md' | 'lg'\n\ninterface BadgeProps {\n variant?: BadgeVariant\n size?: BadgeSize\n children: ReactNode\n style?: React.CSSProperties\n}\n\nconst Badge: FC<BadgeProps> = ({ variant = 'default', size = 'md', children, style }) => (\n <span className={`${styles.badge} ${styles[variant]} ${styles[size]}`} style={style}>\n {children}\n </span>\n)\n\nexport default Badge\n\n/*\n * Badge\n *\n * Renders a small inline label used to highlight status, categories, or counts.\n *\n * Props:\n * variant (\"default\" | \"secondary\" | \"outline\" | \"danger\" | \"success\" | \"warning\" | \"info\", optional) — color style; defaults to \"default\"\n * size (\"sm\" | \"md\" | \"lg\", optional) — text and padding size; defaults to \"md\"\n * children (ReactNode, required) — the content shown inside the badge\n * style (React.CSSProperties, optional) — inline styles applied to the badge element\n *\n * Usage:\n * <Badge>New</Badge>\n *\n * // Status badges:\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"danger\" size=\"sm\">Overdue</Badge>\n */\n","import React, { FC } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport styles from './Breadcrumb.module.css'\n\nexport interface BreadcrumbItem {\n label: string\n href?: string\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[]\n}\n\nconst Breadcrumb: FC<BreadcrumbProps> = ({ items }) => (\n <nav aria-label=\"Breadcrumb\">\n <ol className={styles.list}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n return (\n <li key={item.label} className={styles.item}>\n {i > 0 && <ChevronRight size={14} className={styles.separator} aria-hidden />}\n {isLast || !item.href ? (\n <span className={`${styles.link} ${isLast ? styles.current : ''}`}>\n {item.label}\n </span>\n ) : (\n <a href={item.href} className={styles.link}>\n {item.label}\n </a>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n)\n\nexport default Breadcrumb\n\n/*\n * Breadcrumb\n *\n * Renders a navigation breadcrumb trail with chevron separators; the last item is plain text, earlier items are links when an href is provided.\n *\n * Props:\n * items (BreadcrumbItem[], required) — ordered array of crumbs, each with:\n * label (string) — display text\n * href (string, optional) — link target; if omitted the crumb renders as plain text\n *\n * Usage:\n * <Breadcrumb\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Patients', href: '/patients' },\n * { label: 'Visit summary' },\n * ]}\n * />\n */\n",".list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n list-style: none;\n padding: 0;\n margin: 0;\n font-size: 0.875rem;\n}\n\n.item {\n display: flex;\n align-items: center;\n}\n\n.separator {\n color: var(--ds-text-secondary, #64748b);\n margin: 0 0.25rem;\n flex-shrink: 0;\n}\n\n.link {\n color: var(--ds-text-secondary, #64748b);\n text-decoration: none;\n transition: color 0.15s;\n}\n\n.link:hover {\n color: var(--ds-text-primary, #0f172a);\n text-decoration: underline;\n}\n\n.current {\n color: var(--ds-text-primary, #0f172a);\n font-weight: 500;\n cursor: default;\n}\n\n.current:hover {\n color: var(--ds-text-primary, #0f172a);\n text-decoration: none;\n}\n","'use client'\n\nimport { LoaderCircle } from \"lucide-react\";\nimport React, { FC, ButtonHTMLAttributes, ReactNode, useEffect, useState } from \"react\";\n\ntype ButtonVariant = \"solid\" | \"outline\" | \"ghost\" | \"danger\" | \"warning\" | \"info\" | \"success\";\ntype ButtonSize = \"sm\" | \"md\" | \"lg\";\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n text?: string;\n loading?: boolean;\n icon?: ReactNode;\n iconPosition?: \"left\" | \"right\";\n // variant shorthand booleans\n outline?: boolean;\n ghost?: boolean;\n danger?: boolean;\n warning?: boolean;\n info?: boolean;\n success?: boolean;\n variant?: ButtonVariant;\n // size shorthand booleans\n small?: boolean;\n large?: boolean;\n size?: ButtonSize;\n}\n\nconst variantStyles: Record<ButtonVariant, React.CSSProperties> = {\n solid: { backgroundColor: 'var(--ds-primary, #3b82f6)', color: '#fff', borderColor: 'transparent' },\n outline: { backgroundColor: 'transparent', color: 'var(--ds-primary, #3b82f6)', borderColor: 'var(--ds-primary, #3b82f6)' },\n ghost: { backgroundColor: 'var(--ds-muted, #f1f5f9)', color: 'var(--ds-text-primary, #0f172a)', borderColor: 'transparent' },\n danger: { backgroundColor: 'var(--ds-danger, #ef4444)', color: '#fff', borderColor: 'transparent' },\n warning: { backgroundColor: 'var(--ds-warning, #f59e0b)', color: '#fff', borderColor: 'transparent' },\n info: { backgroundColor: 'var(--ds-info, #3b82f6)', color: '#fff', borderColor: 'transparent' },\n success: { backgroundColor: 'var(--ds-success, #22c55e)', color: '#fff', borderColor: 'transparent' },\n}\n\nconst variantHoverStyles: Record<ButtonVariant, React.CSSProperties> = {\n solid: { opacity: 0.88 },\n outline: { backgroundColor: 'var(--ds-muted, #f1f5f9)' },\n ghost: { backgroundColor: 'var(--ds-card, #ffffff)' },\n danger: { opacity: 0.88 },\n warning: { opacity: 0.88 },\n info: { opacity: 0.88 },\n success: { opacity: 0.88 },\n}\n\nconst sizeStyles: Record<ButtonSize, React.CSSProperties> = {\n sm: { padding: '0.25rem 0.625rem', fontSize: '0.8rem' },\n md: { padding: '0.5rem 1rem', fontSize: '0.875rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1rem' },\n}\n\nfunction injectSpinKeyframe() {\n if (typeof document === 'undefined') return\n if (document.getElementById('ds-spin-keyframe')) return\n const style = document.createElement('style')\n style.id = 'ds-spin-keyframe'\n style.textContent = '@keyframes ds-spin { to { transform: rotate(360deg); } }'\n document.head.appendChild(style)\n}\n\nconst Button: FC<ButtonProps> = ({\n text,\n children,\n loading = false,\n disabled = false,\n icon,\n iconPosition = \"left\",\n outline = false,\n ghost = false,\n danger = false,\n warning = false,\n info = false,\n success = false,\n variant,\n small = false,\n large = false,\n size,\n style: styleProp,\n ...props\n}) => {\n const [hovered, setHovered] = useState(false)\n\n useEffect(() => { injectSpinKeyframe() }, [])\n\n const resolvedVariant: ButtonVariant =\n variant ??\n (danger ? \"danger\" :\n warning ? \"warning\" :\n info ? \"info\" :\n success ? \"success\" :\n ghost ? \"ghost\" :\n outline ? \"outline\" :\n \"solid\")\n\n const resolvedSize: ButtonSize = size ?? (small ? \"sm\" : large ? \"lg\" : \"md\")\n const isDisabled = disabled || loading\n const content = children ?? text\n const showIcon = icon && !loading\n\n const computedStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n border: '1px solid transparent',\n borderRadius: '0.375rem',\n fontWeight: 500,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n transition: 'opacity 0.15s, background-color 0.15s',\n opacity: isDisabled ? 0.5 : 1,\n pointerEvents: loading ? 'none' : undefined,\n ...variantStyles[resolvedVariant],\n ...sizeStyles[resolvedSize],\n ...(hovered && !isDisabled ? variantHoverStyles[resolvedVariant] : {}),\n ...styleProp,\n }\n\n return (\n <button\n disabled={isDisabled}\n style={computedStyle}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n {...props}\n >\n {loading\n ? <LoaderCircle\n aria-hidden\n style={{ width: '1em', height: '1em', animation: 'ds-spin 0.75s linear infinite' }}\n />\n : null}\n {showIcon && iconPosition === \"left\" ? icon : null}\n {content}\n {showIcon && iconPosition === \"right\" ? icon : null}\n </button>\n )\n}\n\nexport default Button\n\n/*\n * Button\n *\n * Renders a styled button with support for variants, sizes, icons, and a loading state.\n *\n * Props:\n * text (string, optional) — button label; can use children instead\n * loading (boolean, optional) — shows a spinner and disables the button while true\n * disabled (boolean, optional) — disables the button\n * icon (ReactNode, optional) — icon to display alongside the label\n * iconPosition (\"left\" | \"right\", optional) — which side the icon appears on; defaults to \"left\"\n * variant (\"solid\" | \"outline\" | \"ghost\" | \"danger\" | \"warning\" | \"info\" | \"success\", optional) — visual style; defaults to \"solid\"\n * outline (boolean, optional) — shorthand for variant=\"outline\"\n * ghost (boolean, optional) — shorthand for variant=\"ghost\"\n * danger (boolean, optional) — shorthand for variant=\"danger\"\n * warning (boolean, optional) — shorthand for variant=\"warning\"\n * info (boolean, optional) — shorthand for variant=\"info\"\n * success (boolean, optional) — shorthand for variant=\"success\"\n * size (\"sm\" | \"md\" | \"lg\", optional) — button size; defaults to \"md\"\n * small (boolean, optional) — shorthand for size=\"sm\"\n * large (boolean, optional) — shorthand for size=\"lg\"\n * ...rest — any valid HTML button attribute (onClick, type, etc.)\n *\n * Usage:\n * <Button text=\"Save\" onClick={handleSave} />\n *\n * // Danger variant with loading state:\n * <Button danger loading={isDeleting} text=\"Delete\" />\n *\n * // Icon on the right, large size:\n * <Button large icon={<ArrowRight />} iconPosition=\"right\">Continue</Button>\n */\n",".card {\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.5rem;\n background-color: var(--ds-card, #ffffff);\n}\n\n.header {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n padding: 1.5rem 1.5rem 0;\n}\n\n.title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--ds-text-primary, #0f172a);\n margin: 0;\n line-height: 1.4;\n}\n\n.description {\n font-size: 0.875rem;\n color: var(--ds-text-secondary, #64748b);\n margin: 0;\n}\n\n.content {\n padding: 1.5rem;\n}\n\n.footer {\n display: flex;\n align-items: center;\n padding: 0 1.5rem 1.5rem;\n}\n","import React, { FC, HTMLAttributes } from 'react'\nimport styles from './Card.module.css'\n\nexport const Card: FC<HTMLAttributes<HTMLDivElement>> = ({ className, ...props }) => (\n <div className={`${styles.card}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const CardHeader: FC<HTMLAttributes<HTMLDivElement>> = ({ className, ...props }) => (\n <div className={`${styles.header}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const CardTitle: FC<HTMLAttributes<HTMLHeadingElement>> = ({ className, ...props }) => (\n <h3 className={`${styles.title}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const CardDescription: FC<HTMLAttributes<HTMLParagraphElement>> = ({ className, ...props }) => (\n <p className={`${styles.description}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const CardContent: FC<HTMLAttributes<HTMLDivElement>> = ({ className, ...props }) => (\n <div className={`${styles.content}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const CardFooter: FC<HTMLAttributes<HTMLDivElement>> = ({ className, ...props }) => (\n <div className={`${styles.footer}${className ? ` ${className}` : ''}`} {...props} />\n)\n\n/*\n * Card / CardHeader / CardTitle / CardDescription / CardContent / CardFooter\n *\n * A set of composable container components for building card-style layouts.\n *\n * Card — outer wrapper with a bordered, rounded container\n * CardHeader — top section, typically holds CardTitle and CardDescription\n * CardTitle — heading rendered as an <h3>\n * CardDescription — muted paragraph below the title\n * CardContent — main body area of the card\n * CardFooter — bottom section, typically holds actions\n *\n * All sub-components accept:\n * className (string, optional) — extra CSS class names\n * ...rest — any valid HTML div/h3/p attribute\n *\n * Usage:\n * <Card>\n * <CardHeader>\n * <CardTitle>Patient Summary</CardTitle>\n * <CardDescription>Last visit on 12 May 2026</CardDescription>\n * </CardHeader>\n * <CardContent>\n * <p>Diagnosis: Hypertension</p>\n * </CardContent>\n * <CardFooter>\n * <Button text=\"View full record\" />\n * </CardFooter>\n * </Card>\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport styles from './Checkbox.module.css'\n\ninterface CheckboxProps {\n label?: string\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n id?: string\n onChange?: (checked: boolean) => void\n}\n\nconst Checkbox: FC<CheckboxProps> = ({\n label,\n checked,\n defaultChecked = false,\n disabled,\n id,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultChecked)\n const isChecked = checked !== undefined ? checked : internal\n\n const handleChange = () => {\n if (disabled) return\n const next = !isChecked\n setInternal(next)\n onChange?.(next)\n }\n\n return (\n <label className={`${styles.container} ${disabled ? styles.disabled : ''}`} htmlFor={id}>\n <input\n type=\"checkbox\"\n id={id}\n checked={isChecked}\n disabled={disabled}\n onChange={handleChange}\n className={styles.input}\n />\n <span className={`${styles.box} ${isChecked ? styles.checked : ''}`}>\n {isChecked && (\n <svg viewBox=\"0 0 12 10\" fill=\"none\" className={styles.checkmark}>\n <path d=\"M1 5l3.5 3.5L11 1\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n )\n}\n\nexport default Checkbox\n\n/*\n * Checkbox\n *\n * Renders a styled checkbox that can be used as controlled or uncontrolled, with an optional text label.\n *\n * Props:\n * label (string, optional) — text displayed next to the checkbox\n * checked (boolean, optional) — controlled checked state\n * defaultChecked (boolean, optional) — initial checked state for uncontrolled use; defaults to false\n * disabled (boolean, optional) — prevents interaction and applies a disabled style\n * id (string, optional) — HTML id for the underlying input, useful for pairing with a Label\n * onChange ((checked: boolean) => void, optional) — called with the new boolean value on each change\n *\n * Usage:\n * <Checkbox label=\"Accept terms\" onChange={val => setAccepted(val)} />\n *\n * // Controlled:\n * <Checkbox checked={isChecked} onChange={setIsChecked} label=\"Remember me\" />\n *\n * // Disabled with a default:\n * <Checkbox label=\"Auto-renew\" defaultChecked disabled />\n */\n",".container {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n}\n\n.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.box {\n width: 1.125rem;\n height: 1.125rem;\n border: 2px solid var(--ds-border, #e2e8f0);\n border-radius: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background-color 0.15s, border-color 0.15s;\n background-color: var(--ds-card, #fff);\n}\n\n.checked {\n background-color: var(--ds-primary, #3b82f6);\n border-color: var(--ds-primary, #3b82f6);\n}\n\n.checkmark {\n width: 0.625rem;\n height: 0.625rem;\n}\n\n.label {\n font-size: 0.875rem;\n color: var(--ds-text-primary, #0f172a);\n}\n","'use client'\n\nimport { Check, Copy } from 'lucide-react'\nimport React, { FC, useState } from 'react'\nimport styles from './CopyButton.module.css'\n\ninterface CopyButtonProps {\n text: string\n}\n\nconst CopyButton: FC<CopyButtonProps> = ({ text }) => {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = () => {\n navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <button\n className={styles.copyButton}\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : `Copy ${text}`}\n >\n {copied ? <Check className={styles.icon} /> : <Copy className={styles.icon} />}\n </button>\n )\n}\n\nexport default CopyButton\n\n/*\n * CopyButton\n *\n * Renders an icon button that copies a string to the clipboard; shows a checkmark for 2 seconds after copying.\n *\n * Props:\n * text (string, required) — the string that gets copied to the clipboard when clicked\n *\n * Usage:\n * <CopyButton text=\"npm install react lucide-react\" />\n *\n * // Next to a code snippet:\n * <div className=\"code-block\">\n * <code>{snippet}</code>\n * <CopyButton text={snippet} />\n * </div>\n */\n\n",".copyButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0.25rem;\n border: none;\n border-radius: 0.25rem;\n background-color: transparent;\n color: var(--muted-foreground);\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s;\n}\n\n.copyButton:hover {\n background-color: var(--ds-accent, #f1f5f9);\n color: var(--ds-text-primary, #0f172a);\n}\n\n.icon {\n width: 1rem;\n height: 1rem;\n}\n","'use client'\n\nimport { Upload } from 'lucide-react'\nimport React, { FC, useRef, useState } from 'react'\nimport styles from './FileUpload.module.css'\n\ninterface FileUploadProps {\n accept?: string\n multiple?: boolean\n disabled?: boolean\n onFileSelect?: (files: FileList) => void\n}\n\nconst FileUpload: FC<FileUploadProps> = ({ accept, multiple, disabled, onFileSelect }) => {\n const [isDragging, setIsDragging] = useState(false)\n const [fileNames, setFileNames] = useState<string[]>([])\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleFiles = (list: FileList) => {\n setFileNames(Array.from(list).map(f => f.name))\n onFileSelect?.(list)\n }\n\n return (\n <div\n className={`${styles.zone} ${isDragging ? styles.dragging : ''} ${disabled ? styles.disabled : ''}`}\n onClick={() => !disabled && inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setIsDragging(true) }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => {\n e.preventDefault()\n setIsDragging(false)\n if (!disabled && e.dataTransfer.files.length) handleFiles(e.dataTransfer.files)\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className={styles.input}\n onChange={(e) => e.target.files && handleFiles(e.target.files)}\n />\n <Upload size={32} className={styles.icon} />\n {fileNames.length > 0\n ? <p className={styles.fileName}>{fileNames.join(', ')}</p>\n : <p className={styles.hint}><strong>Click to upload</strong> or drag and drop</p>\n }\n </div>\n )\n}\n\nexport default FileUpload\n\n/*\n * FileUpload\n *\n * Renders a click-to-browse and drag-and-drop file upload zone; displays selected file names after a pick.\n *\n * Props:\n * accept (string, optional) — file type filter passed to the hidden input (e.g. \"image/*\", \".pdf\")\n * multiple (boolean, optional) — allows selecting more than one file at a time\n * disabled (boolean, optional) — prevents clicking and dropping\n * onFileSelect ((files: FileList) => void, optional) — called with the FileList whenever files are chosen\n *\n * Usage:\n * <FileUpload onFileSelect={files => uploadFiles(files)} />\n *\n * // Images only, multiple files:\n * <FileUpload accept=\"image/*\" multiple onFileSelect={handleImages} />\n */\n",".zone {\n border: 2px dashed var(--ds-border, #e2e8f0);\n border-radius: 0.5rem;\n padding: 2rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n background-color: var(--ds-muted, #f1f5f9);\n transition: border-color 0.15s, background-color 0.15s;\n text-align: center;\n}\n\n.zone:hover,\n.dragging {\n border-color: var(--ds-primary, #3b82f6);\n background-color: var(--ds-primary-50, #eff6ff);\n}\n\n.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.input {\n display: none;\n}\n\n.icon {\n color: var(--ds-text-secondary, #64748b);\n}\n\n.hint {\n font-size: 0.875rem;\n color: var(--ds-text-secondary, #64748b);\n}\n\n.fileName {\n font-size: 0.875rem;\n color: var(--ds-primary, #3b82f6);\n font-weight: 500;\n}\n",".wrapper {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.input {\n width: 100%;\n height: 2.25rem;\n padding: 0 0.75rem;\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.375rem;\n font-size: 0.875rem;\n background-color: var(--ds-card, #fff);\n color: var(--ds-text-primary, #0f172a);\n outline: none;\n transition: border-color 0.15s, box-shadow 0.15s;\n font-family: inherit;\n}\n\n.input::placeholder {\n color: var(--ds-text-secondary, #64748b);\n}\n\n.input:focus {\n border-color: var(--ds-primary, #3b82f6);\n box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15);\n}\n\n.input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background-color: var(--ds-muted, #f1f5f9);\n}\n\n/* --- Error --- */\n.error .input {\n border-color: var(--ds-danger, #ef4444);\n}\n\n.error .input:focus {\n border-color: var(--ds-danger, #ef4444);\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15);\n}\n\n/* --- Success --- */\n.success .input {\n border-color: var(--ds-success, #22c55e);\n}\n\n.success .input:focus {\n border-color: var(--ds-success, #22c55e);\n box-shadow: 0 0 0 3px rgb(34 197 94 / 0.15);\n}\n\n/* --- Icons --- */\n.hasLeft .input { padding-left: 2.25rem; }\n.hasRight .input { padding-right: 2.25rem; }\n\n.leftIcon,\n.rightIcon {\n position: absolute;\n display: flex;\n align-items: center;\n color: var(--ds-text-secondary, #64748b);\n pointer-events: none;\n}\n\n.leftIcon { left: 0.625rem; }\n.rightIcon { right: 0.625rem; }\n","import React, { FC, InputHTMLAttributes, ReactNode } from 'react'\nimport styles from './Input.module.css'\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: boolean\n success?: boolean\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n}\n\nconst Input: FC<InputProps> = ({\n error,\n success,\n leftIcon,\n rightIcon,\n className,\n ...props\n}) => {\n const wrapperClasses = [\n styles.wrapper,\n error ? styles.error : '',\n success ? styles.success : '',\n leftIcon ? styles.hasLeft : '',\n rightIcon ? styles.hasRight : '',\n className ?? '',\n ].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperClasses}>\n {leftIcon && <span className={styles.leftIcon}>{leftIcon}</span>}\n <input className={styles.input} {...props} />\n {rightIcon && <span className={styles.rightIcon}>{rightIcon}</span>}\n </div>\n )\n}\n\nexport default Input\n\n/*\n * Input\n *\n * Renders a text input with optional left/right icons and error or success border states.\n *\n * Props:\n * error (boolean, optional) — applies an error border style\n * success (boolean, optional) — applies a success border style\n * leftIcon (ReactNode, optional) — icon displayed inside the left side of the input\n * rightIcon (ReactNode, optional) — icon displayed inside the right side of the input\n * className (string, optional) — extra CSS class names applied to the wrapper div\n * ...rest — any valid HTML input attribute (placeholder, value, onChange, disabled, etc.)\n *\n * Usage:\n * <Input placeholder=\"Search...\" onChange={handleChange} />\n *\n * // With a left icon and error state:\n * <Input leftIcon={<SearchIcon />} error placeholder=\"Not found\" />\n *\n * // Controlled with a success state:\n * <Input value={email} onChange={e => setEmail(e.target.value)} success />\n */\n",".label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--ds-text-primary, #0f172a);\n margin-bottom: 0.375rem;\n}\n\n.required {\n color: var(--ds-danger, #ef4444);\n margin-left: 0.25rem;\n}\n","import React, { FC, LabelHTMLAttributes } from 'react'\nimport styles from './Label.module.css'\n\ninterface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n}\n\nconst Label: FC<LabelProps> = ({ children, required, className, ...props }) => {\n return (\n <label className={`${styles.label} ${className ?? ''}`} {...props}>\n {children}\n {required && <span className={styles.required}>*</span>}\n </label>\n )\n}\n\nexport default Label\n\n/*\n * Label\n *\n * Renders a styled form label, optionally appending a red asterisk when the field is required.\n *\n * Props:\n * required (boolean, optional) — appends a \"*\" marker after the label text\n * className (string, optional) — extra CSS class names\n * ...rest — any valid HTML label attribute (htmlFor, etc.)\n *\n * Usage:\n * <Label htmlFor=\"email\">Email</Label>\n *\n * // Required field:\n * <Label htmlFor=\"name\" required>Full name</Label>\n */\n","'use client'\n\nimport { Eye, EyeOff } from 'lucide-react'\nimport React, { FC, InputHTMLAttributes, useState } from 'react'\nimport Input from '../Input/Input'\n\ntype PasswordInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>\n\nconst PasswordInput: FC<PasswordInputProps> = (props) => {\n const [visible, setVisible] = useState(false)\n\n return (\n <Input\n {...props}\n type={visible ? 'text' : 'password'}\n rightIcon={\n <button\n type=\"button\"\n onClick={() => setVisible(v => !v)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 0, display: 'flex', pointerEvents: 'all' }}\n tabIndex={-1}\n >\n {visible ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n }\n />\n )\n}\n\nexport default PasswordInput\n\n/*\n * PasswordInput\n *\n * Renders a password input with an eye/eye-off toggle button that shows or hides the typed text.\n *\n * Props:\n * ...rest — any valid HTML input attribute except \"type\" (e.g. placeholder, value, onChange, disabled)\n * also accepts Input's error and success props for border states\n *\n * Usage:\n * <PasswordInput placeholder=\"Enter password\" onChange={e => setPassword(e.target.value)} />\n *\n * // With error state:\n * <PasswordInput value={password} onChange={handleChange} error />\n */\n",".track {\n width: 100%;\n height: 0.5rem;\n background-color: var(--ds-border, #e2e8f0);\n border-radius: 9999px;\n overflow: hidden;\n}\n\n.fill {\n height: 100%;\n background-color: var(--ds-primary, #3b82f6);\n border-radius: 9999px;\n transition: width 0.3s ease;\n}\n","import React, { FC } from 'react'\nimport styles from './Progress.module.css'\n\ninterface ProgressProps {\n value?: number\n}\n\nconst Progress: FC<ProgressProps> = ({ value = 0 }) => {\n const pct = Math.min(100, Math.max(0, value))\n return (\n <div\n className={styles.track}\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div className={styles.fill} style={{ width: `${pct}%` }} />\n </div>\n )\n}\n\nexport default Progress\n\n/*\n * Progress\n *\n * Displays a horizontal progress bar that fills from left to right based on a 0–100 value.\n *\n * Props:\n * value (number, optional) — current progress percentage (0–100); clamped to that range; defaults to 0\n *\n * Usage:\n * <Progress value={60} />\n *\n * // Dynamic upload progress:\n * <Progress value={uploadPercent} />\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport styles from './RadioGroup.module.css'\n\ninterface RadioOption {\n value: string\n label: string\n}\n\ninterface RadioGroupProps {\n options: RadioOption[]\n name: string\n value?: string\n defaultValue?: string\n disabled?: boolean\n onChange?: (value: string) => void\n}\n\nconst RadioGroup: FC<RadioGroupProps> = ({\n options,\n name,\n value,\n defaultValue = '',\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const selected = value !== undefined ? value : internal\n\n const handleChange = (val: string) => {\n if (disabled) return\n setInternal(val)\n onChange?.(val)\n }\n\n return (\n <div className={styles.group}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`${styles.item} ${disabled ? styles.disabled : ''}`}\n >\n <input\n type=\"radio\"\n name={name}\n value={option.value}\n checked={selected === option.value}\n disabled={disabled}\n onChange={() => handleChange(option.value)}\n className={styles.input}\n />\n <span className={`${styles.dot} ${selected === option.value ? styles.checked : ''}`}>\n {selected === option.value && <span className={styles.inner} />}\n </span>\n <span className={styles.label}>{option.label}</span>\n </label>\n ))}\n </div>\n )\n}\n\nexport default RadioGroup\n\n/*\n * RadioGroup\n *\n * Renders a group of radio buttons from an array of options, supporting both controlled and uncontrolled use.\n *\n * Props:\n * options (RadioOption[], required) — array of { value: string, label: string } items to render\n * name (string, required) — shared name attribute for the radio inputs (required for HTML form grouping)\n * value (string, optional) — controlled selected value\n * defaultValue (string, optional) — initial selected value for uncontrolled use; defaults to \"\"\n * disabled (boolean, optional) — disables all options\n * onChange ((value: string) => void, optional) — called with the selected option's value on change\n *\n * Usage:\n * <RadioGroup\n * name=\"size\"\n * options={[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]}\n * onChange={val => setSize(val)}\n * />\n *\n * // Controlled:\n * <RadioGroup name=\"plan\" options={planOptions} value={plan} onChange={setPlan} />\n */\n",".group {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.item {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n user-select: none;\n}\n\n.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.dot {\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 9999px;\n border: 2px solid var(--ds-border, #e2e8f0);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background-color: var(--ds-card, #fff);\n transition: border-color 0.15s;\n}\n\n.checked {\n border-color: var(--ds-primary, #3b82f6);\n}\n\n.inner {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 9999px;\n background-color: var(--ds-primary, #3b82f6);\n}\n\n.label {\n font-size: 0.875rem;\n color: var(--ds-text-primary, #0f172a);\n}\n","'use client'\n\nimport { Check, ChevronDown } from 'lucide-react'\nimport React, { FC, useEffect, useRef, useState } from 'react'\nimport styles from './Select.module.css'\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectProps {\n options: SelectOption[]\n value?: string\n defaultValue?: string\n placeholder?: string\n disabled?: boolean\n onChange?: (value: string) => void\n}\n\nconst Select: FC<SelectProps> = ({\n options,\n value,\n defaultValue = '',\n placeholder = 'Choose an option',\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n const selected = value !== undefined ? value : internal\n const selectedLabel = options.find(o => o.value === selected)?.label\n\n const handleSelect = (val: string) => {\n setInternal(val)\n setOpen(false)\n onChange?.(val)\n }\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handleOutside)\n return () => document.removeEventListener('mousedown', handleOutside)\n }, [])\n\n return (\n <div ref={ref} className={`${styles.wrapper} ${disabled ? styles.disabled : ''}`}>\n <button\n type=\"button\"\n className={`${styles.trigger} ${open ? styles.open : ''}`}\n onClick={() => !disabled && setOpen(o => !o)}\n disabled={disabled}\n >\n <span className={selectedLabel ? styles.value : styles.placeholder}>\n {selectedLabel ?? placeholder}\n </span>\n <ChevronDown size={16} className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`} />\n </button>\n {open && (\n <div className={styles.dropdown}>\n {options.map((option) => (\n <div\n key={option.value}\n className={`${styles.option} ${selected === option.value ? styles.selected : ''}`}\n onClick={() => handleSelect(option.value)}\n >\n {selected === option.value\n ? <Check size={14} className={styles.checkIcon} />\n : <span className={styles.checkSpacer} />\n }\n {option.label}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default Select\n\n/*\n * Select\n *\n * Renders a custom dropdown that lets the user pick one option from a list, supporting controlled and uncontrolled use.\n *\n * Props:\n * options (SelectOption[], required) — array of { value: string, label: string } items to display\n * value (string, optional) — controlled selected value\n * defaultValue (string, optional) — initial selected value for uncontrolled use; defaults to \"\"\n * placeholder (string, optional) — text shown when nothing is selected; defaults to \"Choose an option\"\n * disabled (boolean, optional) — prevents opening the dropdown\n * onChange ((value: string) => void, optional) — called with the selected value when the user picks an option\n *\n * Usage:\n * <Select\n * options={[{ value: 'fr', label: 'French' }, { value: 'en', label: 'English' }]}\n * onChange={val => setLanguage(val)}\n * />\n *\n * // Controlled with placeholder:\n * <Select options={countryOptions} value={country} placeholder=\"Pick a country\" onChange={setCountry} />\n */\n",".wrapper {\n position: relative;\n width: 100%;\n}\n\n.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.trigger {\n width: 100%;\n height: 2.25rem;\n padding: 0 0.75rem;\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.375rem;\n font-size: 0.875rem;\n background-color: var(--ds-card, #fff);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n transition: border-color 0.15s, box-shadow 0.15s;\n text-align: left;\n font-family: inherit;\n}\n\n.trigger:focus {\n outline: none;\n border-color: var(--ds-primary, #3b82f6);\n box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15);\n}\n\n.open {\n border-color: var(--ds-primary, #3b82f6);\n box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15);\n}\n\n.placeholder { color: var(--ds-text-secondary, #64748b); }\n.value { color: var(--ds-text-primary, #0f172a); }\n\n.chevron {\n flex-shrink: 0;\n color: var(--ds-text-secondary, #64748b);\n transition: transform 0.15s;\n}\n\n.chevronOpen {\n transform: rotate(180deg);\n}\n\n.dropdown {\n position: absolute;\n top: calc(100% + 0.25rem);\n left: 0;\n right: 0;\n z-index: 50;\n background-color: var(--ds-card, #fff);\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.375rem;\n box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n overflow: hidden;\n}\n\n.option {\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n color: var(--ds-text-primary, #0f172a);\n transition: background-color 0.1s;\n}\n\n.option:hover { background-color: var(--ds-muted, #f1f5f9); }\n.selected { background-color: var(--ds-muted, #f1f5f9); font-weight: 500; }\n\n.checkIcon { color: var(--ds-primary, #3b82f6); flex-shrink: 0; }\n.checkSpacer { width: 14px; flex-shrink: 0; }\n",".skeleton {\n background-color: var(--ds-muted, #f1f5f9);\n border-radius: 0.375rem;\n animation: pulse 1.5s ease-in-out infinite;\n}\n\n.circle {\n border-radius: 9999px;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n}\n","import React, { FC } from 'react'\nimport styles from './Skeleton.module.css'\n\ninterface SkeletonProps {\n height?: string\n width?: string\n circle?: boolean\n}\n\nconst Skeleton: FC<SkeletonProps> = ({ height = '1rem', width = '100%', circle = false }) => (\n <div\n className={`${styles.skeleton} ${circle ? styles.circle : ''}`}\n style={{ height, width }}\n aria-hidden=\"true\"\n />\n)\n\nexport default Skeleton\n\n/*\n * Skeleton\n *\n * Renders an animated placeholder block used to indicate loading content before data arrives.\n *\n * Props:\n * height (string, optional) — CSS height of the block; defaults to \"1rem\"\n * width (string, optional) — CSS width of the block; defaults to \"100%\"\n * circle (boolean, optional) — makes the block fully round (equal height and width) for avatar placeholders\n *\n * Usage:\n * <Skeleton width=\"200px\" height=\"1rem\" />\n *\n * // Avatar placeholder:\n * <Skeleton circle width=\"40px\" height=\"40px\" />\n *\n * // Full-width paragraph lines:\n * <Skeleton height=\"1rem\" />\n * <Skeleton height=\"1rem\" width=\"80%\" />\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport styles from './Slider.module.css'\n\ninterface SliderProps {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n onChange?: (value: number) => void\n}\n\nconst Slider: FC<SliderProps> = ({\n value,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const current = value !== undefined ? value : internal\n const fill = `${((current - min) / (max - min)) * 100}%`\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = Number(e.target.value)\n setInternal(val)\n onChange?.(val)\n }\n\n return (\n <div className={`${styles.wrapper} ${disabled ? styles.disabled : ''}`}>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n disabled={disabled}\n onChange={handleChange}\n className={styles.range}\n style={{ '--fill': fill } as React.CSSProperties}\n />\n </div>\n )\n}\n\nexport default Slider\n\n/*\n * Slider\n *\n * Renders a range slider with a filled track that reflects the current value, supporting controlled and uncontrolled use.\n *\n * Props:\n * value (number, optional) — controlled current value\n * defaultValue (number, optional) — initial value for uncontrolled use; defaults to 50\n * min (number, optional) — minimum value; defaults to 0\n * max (number, optional) — maximum value; defaults to 100\n * step (number, optional) — increment between values; defaults to 1\n * disabled (boolean, optional) — prevents interaction and applies a disabled style\n * onChange ((value: number) => void, optional) — called with the new numeric value on each change\n *\n * Usage:\n * <Slider onChange={val => setVolume(val)} />\n *\n * // Controlled with custom range and step:\n * <Slider value={opacity} min={0} max={1} step={0.01} onChange={setOpacity} />\n */\n",".wrapper {\n width: 100%;\n padding: 0.25rem 0;\n}\n\n.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.range {\n width: 100%;\n height: 0.375rem;\n -webkit-appearance: none;\n appearance: none;\n border-radius: 9999px;\n outline: none;\n cursor: pointer;\n background: linear-gradient(\n to right,\n var(--ds-primary, #3b82f6) 0%,\n var(--ds-primary, #3b82f6) var(--fill, 50%),\n var(--ds-border, #e2e8f0) var(--fill, 50%),\n var(--ds-border, #e2e8f0) 100%\n );\n}\n\n.range::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 9999px;\n background-color: var(--ds-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid #fff;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);\n transition: transform 0.1s;\n}\n\n.range::-webkit-slider-thumb:hover {\n transform: scale(1.2);\n}\n\n.range::-moz-range-thumb {\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 9999px;\n background-color: var(--ds-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid #fff;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);\n}\n\n.disabled .range {\n cursor: not-allowed;\n}\n","import React, { FC } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport styles from './Spinner.module.css'\n\ntype SpinnerSize = 'sm' | 'md' | 'lg'\n\ninterface SpinnerProps {\n size?: SpinnerSize\n}\n\nconst sizePx: Record<SpinnerSize, number> = { sm: 16, md: 24, lg: 32 }\n\nconst Spinner: FC<SpinnerProps> = ({ size = 'md' }) => (\n <Loader2 size={sizePx[size]} className={styles.spinner} aria-label=\"Loading\" />\n)\n\nexport default Spinner\n\n/*\n * Spinner\n *\n * Displays an animated loading indicator at one of three sizes.\n *\n * Props:\n * size (\"sm\" | \"md\" | \"lg\", optional) — icon size: sm = 16px, md = 24px, lg = 32px; defaults to \"md\"\n *\n * Usage:\n * <Spinner />\n *\n * // Large spinner while page loads:\n * {isLoading && <Spinner size=\"lg\" />}\n */\n",".spinner {\n color: var(--ds-primary, #3b82f6);\n animation: spin 0.75s linear infinite;\n}\n\n@keyframes spin {\n to { transform: rotate(360deg); }\n}\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport styles from './Switch.module.css'\n\ninterface SwitchProps {\n label?: string\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n id?: string\n onChange?: (checked: boolean) => void\n}\n\nconst Switch: FC<SwitchProps> = ({\n label,\n checked,\n defaultChecked = false,\n disabled,\n id,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultChecked)\n const isOn = checked !== undefined ? checked : internal\n\n const handleToggle = () => {\n if (disabled) return\n const next = !isOn\n setInternal(next)\n onChange?.(next)\n }\n\n return (\n <label className={`${styles.container} ${disabled ? styles.disabled : ''}`} htmlFor={id}>\n <input\n type=\"checkbox\"\n id={id}\n checked={isOn}\n disabled={disabled}\n onChange={handleToggle}\n className={styles.input}\n />\n <span className={`${styles.track} ${isOn ? styles.on : ''}`}>\n <span className={`${styles.thumb} ${isOn ? styles.thumbOn : ''}`} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n )\n}\n\nexport default Switch\n\n/*\n * Switch\n *\n * Renders a toggle switch that can be used as controlled or uncontrolled, with an optional text label.\n *\n * Props:\n * label (string, optional) — text displayed next to the switch\n * checked (boolean, optional) — controlled on/off state\n * defaultChecked (boolean, optional) — initial state for uncontrolled use; defaults to false\n * disabled (boolean, optional) — prevents interaction and applies a disabled style\n * id (string, optional) — HTML id for the underlying input\n * onChange ((checked: boolean) => void, optional) — called with the new boolean value on each toggle\n *\n * Usage:\n * <Switch label=\"Enable notifications\" onChange={val => setEnabled(val)} />\n *\n * // Controlled:\n * <Switch checked={darkMode} onChange={setDarkMode} label=\"Dark mode\" />\n */\n",".container {\n display: inline-flex;\n align-items: center;\n gap: 0.625rem;\n cursor: pointer;\n user-select: none;\n}\n\n.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.track {\n width: 2.75rem;\n height: 1.5rem;\n border-radius: 9999px;\n background-color: var(--ds-border, #e2e8f0);\n position: relative;\n transition: background-color 0.2s;\n flex-shrink: 0;\n}\n\n.on {\n background-color: var(--ds-primary, #3b82f6);\n}\n\n.thumb {\n position: absolute;\n top: 0.175rem;\n left: 0.175rem;\n width: 1.15rem;\n height: 1.15rem;\n border-radius: 9999px;\n background-color: #fff;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.15);\n transition: transform 0.2s;\n}\n\n.thumbOn {\n transform: translateX(1.25rem);\n}\n\n.label {\n font-size: 0.875rem;\n color: var(--ds-text-primary, #0f172a);\n}\n",".wrapper {\n width: 100%;\n overflow-x: auto;\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.5rem;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n}\n\n.th {\n padding: 0.75rem 1rem;\n text-align: left;\n font-weight: 500;\n color: var(--ds-text-secondary, #64748b);\n background-color: var(--ds-muted, #f1f5f9);\n border-bottom: 1px solid var(--ds-border, #e2e8f0);\n white-space: nowrap;\n}\n\n.td {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--ds-border, #e2e8f0);\n color: var(--ds-text-primary, #0f172a);\n}\n\n.row:last-child .td {\n border-bottom: none;\n}\n\n.row:hover .td {\n background-color: var(--ds-muted, #f1f5f9);\n}\n\nthead .row:hover .th {\n background-color: var(--ds-muted, #f1f5f9);\n}\n","import React, { FC, HTMLAttributes, ThHTMLAttributes, TdHTMLAttributes } from 'react'\nimport styles from './Table.module.css'\n\nexport const Table: FC<HTMLAttributes<HTMLTableElement>> = ({ className, ...props }) => (\n <div className={styles.wrapper}>\n <table className={`${styles.table}${className ? ` ${className}` : ''}`} {...props} />\n </div>\n)\n\nexport const TableHead: FC<HTMLAttributes<HTMLTableSectionElement>> = (props) => (\n <thead {...props} />\n)\n\nexport const TableBody: FC<HTMLAttributes<HTMLTableSectionElement>> = (props) => (\n <tbody {...props} />\n)\n\nexport const TableRow: FC<HTMLAttributes<HTMLTableRowElement>> = ({ className, ...props }) => (\n <tr className={`${styles.row}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const TableHeader: FC<ThHTMLAttributes<HTMLTableCellElement>> = ({ className, ...props }) => (\n <th className={`${styles.th}${className ? ` ${className}` : ''}`} {...props} />\n)\n\nexport const TableCell: FC<TdHTMLAttributes<HTMLTableCellElement>> = ({ className, ...props }) => (\n <td className={`${styles.td}${className ? ` ${className}` : ''}`} {...props} />\n)\n\n/*\n * Table / TableHead / TableBody / TableRow / TableHeader / TableCell\n *\n * A set of composable table components that wrap standard HTML table elements with consistent styles.\n *\n * Table — outer wrapper with a scrollable container and a styled <table>\n * TableHead — maps to <thead>\n * TableBody — maps to <tbody>\n * TableRow — styled <tr>\n * TableHeader — styled <th> for column headings\n * TableCell — styled <td> for data cells\n *\n * All sub-components accept:\n * className (string, optional) — extra CSS class names\n * ...rest — any valid HTML attribute for the underlying element\n *\n * Usage:\n * <Table>\n * <TableHead>\n * <TableRow>\n * <TableHeader>Name</TableHeader>\n * <TableHeader>Status</TableHeader>\n * </TableRow>\n * </TableHead>\n * <TableBody>\n * <TableRow>\n * <TableCell>Visit 001</TableCell>\n * <TableCell>Completed</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n */\n","'use client'\n\nimport React, { FC, ReactNode, useState } from 'react'\nimport styles from './Tabs.module.css'\n\nexport interface TabItem {\n value: string\n label: string\n content: ReactNode\n icon?: ReactNode\n}\n\ninterface TabsProps {\n tabs: TabItem[]\n defaultValue?: string\n}\n\nconst Tabs: FC<TabsProps> = ({ tabs, defaultValue }) => {\n const [active, setActive] = useState(defaultValue ?? tabs[0]?.value ?? '')\n const activeTab = tabs.find(t => t.value === active)\n\n return (\n <div className={styles.root}>\n <div className={styles.list} role=\"tablist\">\n {tabs.map(tab => (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={active === tab.value}\n className={`${styles.trigger} ${active === tab.value ? styles.active : ''}`}\n onClick={() => setActive(tab.value)}\n >\n {tab.icon && <span className={styles['trigger-icon']}>{tab.icon}</span>}\n {tab.label}\n </button>\n ))}\n </div>\n <div className={styles.content} role=\"tabpanel\">\n {activeTab?.content}\n </div>\n </div>\n )\n}\n\nexport default Tabs\n\n/*\n * Tabs\n *\n * Renders a tab bar and displays the content panel of the currently active tab.\n *\n * Props:\n * tabs (TabItem[], required) — array of tab definitions, each with:\n * value (string) — unique identifier for the tab\n * label (string) — text shown on the tab button\n * content (ReactNode) — panel content shown when this tab is active\n * icon (ReactNode, optional) — icon shown before the label in the tab button\n * defaultValue (string, optional) — value of the tab that is active on first render; defaults to the first tab\n *\n * Usage:\n * <Tabs\n * tabs={[\n * { value: 'overview', label: 'Overview', content: <Overview /> },\n * { value: 'settings', label: 'Settings', content: <Settings /> },\n * ]}\n * />\n *\n * // Start on a specific tab:\n * <Tabs tabs={tabs} defaultValue=\"settings\" />\n */\n",".root {\n display: flex;\n flex-direction: column;\n}\n\n.list {\n display: inline-flex;\n background-color: var(--ds-muted, #f1f5f9);\n border-radius: 0.5rem;\n padding: 0.25rem;\n gap: 0.125rem;\n}\n\n.trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.75rem;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 0.375rem;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--ds-text-secondary, #64748b);\n transition: color 0.15s, background-color 0.15s, box-shadow 0.15s;\n white-space: nowrap;\n}\n\n.trigger:hover {\n color: var(--ds-text-primary, #0f172a);\n}\n\n.active {\n background-color: var(--ds-card, #ffffff);\n color: var(--ds-text-primary, #0f172a);\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n}\n\n.trigger-icon {\n display: flex;\n align-items: center;\n}\n\n.content {\n padding-top: 1rem;\n font-size: 0.875rem;\n color: var(--ds-text-secondary, #64748b);\n}\n",".textarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--ds-border, #e2e8f0);\n border-radius: 0.375rem;\n font-size: 0.875rem;\n background-color: var(--ds-card, #fff);\n color: var(--ds-text-primary, #0f172a);\n outline: none;\n resize: vertical;\n transition: border-color 0.15s, box-shadow 0.15s;\n font-family: inherit;\n min-height: 6rem;\n}\n\n.textarea::placeholder {\n color: var(--ds-text-secondary, #64748b);\n}\n\n.textarea:focus {\n border-color: var(--ds-primary, #3b82f6);\n box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15);\n}\n\n.textarea:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background-color: var(--ds-muted, #f1f5f9);\n}\n\n.error {\n border-color: var(--ds-danger, #ef4444);\n}\n\n.error:focus {\n border-color: var(--ds-danger, #ef4444);\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15);\n}\n","import React, { FC, TextareaHTMLAttributes } from 'react'\nimport styles from './Textarea.module.css'\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean\n}\n\nconst Textarea: FC<TextareaProps> = ({ error, className, ...props }) => {\n const classes = [\n styles.textarea,\n error ? styles.error : '',\n className ?? '',\n ].filter(Boolean).join(' ')\n\n return <textarea className={classes} {...props} />\n}\n\nexport default Textarea\n\n/*\n * Textarea\n *\n * Renders a styled multi-line text area with an optional error border state.\n *\n * Props:\n * error (boolean, optional) — applies an error border style\n * className (string, optional) — extra CSS class names\n * ...rest — any valid HTML textarea attribute (placeholder, value, onChange, rows, disabled, etc.)\n *\n * Usage:\n * <Textarea placeholder=\"Write your message...\" rows={4} onChange={handleChange} />\n *\n * // With error state:\n * <Textarea error value={notes} onChange={e => setNotes(e.target.value)} />\n */\n",".wrapper {\n position: relative;\n display: inline-flex;\n}\n\n.tooltip {\n position: absolute;\n z-index: 50;\n padding: 0.375rem 0.625rem;\n background-color: var(--ds-tooltip-bg, #0f172a);\n color: var(--ds-tooltip-text, #ffffff);\n font-size: 0.75rem;\n line-height: 1.4;\n border-radius: 0.375rem;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.15s;\n}\n\n.wrapper:hover .tooltip,\n.wrapper:focus-within .tooltip {\n opacity: 1;\n}\n\n.tooltip::before {\n content: '';\n position: absolute;\n border: 5px solid transparent;\n}\n\n/* Top */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.top::before {\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-top-color: var(--ds-tooltip-bg, #0f172a);\n}\n\n/* Bottom */\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom::before {\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n border-bottom-color: var(--ds-tooltip-bg, #0f172a);\n}\n\n/* Left */\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.left::before {\n left: 100%;\n top: 50%;\n transform: translateY(-50%);\n border-left-color: var(--ds-tooltip-bg, #0f172a);\n}\n\n/* Right */\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right::before {\n right: 100%;\n top: 50%;\n transform: translateY(-50%);\n border-right-color: var(--ds-tooltip-bg, #0f172a);\n}\n","import React, { FC, ReactNode } from 'react'\nimport styles from './Tooltip.module.css'\n\ninterface TooltipProps {\n content: string\n children: ReactNode\n position?: 'top' | 'bottom' | 'left' | 'right'\n}\n\nconst Tooltip: FC<TooltipProps> = ({ content, children, position = 'top' }) => (\n <span className={styles.wrapper}>\n {children}\n <span className={`${styles.tooltip} ${styles[position]}`} role=\"tooltip\">\n {content}\n </span>\n </span>\n)\n\nexport default Tooltip\n\n/*\n * Tooltip\n *\n * Wraps any element and shows a text tooltip on hover in the given direction.\n *\n * Props:\n * content (string, required) — the text shown inside the tooltip\n * children (ReactNode, required) — the element the tooltip is attached to\n * position (\"top\" | \"bottom\" | \"left\" | \"right\", optional) — which side the tooltip appears on; defaults to \"top\"\n *\n * Usage:\n * <Tooltip content=\"Delete this item\">\n * <button>Delete</button>\n * </Tooltip>\n *\n * // Positioned to the right:\n * <Tooltip content=\"More info\" position=\"right\">\n * <InfoIcon />\n * </Tooltip>\n */\n"],"mappings":"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","names":["useState","jsx","jsx","jsxs","Alert_default","jsx","Avatar_default","jsx","Badge_default","jsx","jsxs","Breadcrumb_default","useState","jsx","jsxs","useState","jsx","useState","jsx","jsxs","useState","Checkbox_default","useState","jsx","useState","CopyButton_default","useState","jsx","jsxs","useState","FileUpload_default","jsx","jsxs","Input_default","jsx","jsxs","Label_default","useState","jsx","useState","Input_default","jsx","Progress_default","useState","jsx","jsxs","useState","RadioGroup_default","Check","ChevronDown","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","ChevronDown","Check","Select_default","jsx","Skeleton_default","useState","jsx","useState","Slider_default","jsx","Spinner_default","useState","jsx","jsxs","useState","Switch_default","jsx","useState","jsx","jsxs","useState","Tabs_default","jsx","Textarea_default","jsx","jsxs","Tooltip_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ThemeProvider.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Alert/Alert.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Breadcrumb/Breadcrumb.tsx","../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Input/Input.tsx","../src/components/Label/Label.tsx","../src/components/PasswordInput/PasswordInput.tsx","../src/components/Progress/Progress.tsx","../src/components/RadioGroup/RadioGroup.tsx","../src/components/Select/Select.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Slider/Slider.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Switch/Switch.tsx","../src/components/Table/Table.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["'use client'\nimport React, { createContext, useContext, useState } from 'react'\nimport '../styles/globals.css'\n\ntype Theme = 'light' | 'dark'\n\ninterface ThemeContextValue {\n theme: Theme\n toggle: () => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nexport const ThemeProvider = ({\n children,\n defaultTheme = 'light',\n}: {\n children: React.ReactNode\n defaultTheme?: Theme\n}) => {\n const [theme, setTheme] = useState<Theme>(defaultTheme)\n return (\n <ThemeContext.Provider value={{ theme, toggle: () => setTheme(t => t === 'light' ? 'dark' : 'light') }}>\n <div className={theme === 'dark' ? 'ds-theme-dark' : undefined}>\n {children}\n </div>\n </ThemeContext.Provider>\n )\n}\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContext)\n if (!ctx) throw new Error('useTheme must be used inside <ThemeProvider>')\n return ctx\n}\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\n\nexport interface AccordionItem {\n value: string\n trigger: string\n content: string\n}\n\ninterface AccordionProps {\n items: AccordionItem[]\n defaultValue?: string | string[]\n multiple?: boolean\n}\n\nconst Accordion: FC<AccordionProps> = ({ items, defaultValue, multiple = false }) => {\n const [open, setOpen] = useState<Set<string>>(() => {\n if (!defaultValue) return new Set()\n if (Array.isArray(defaultValue)) return new Set(defaultValue)\n return new Set([defaultValue])\n })\n const [hovered, setHovered] = useState<string | null>(null)\n\n const toggle = (value: string) => {\n setOpen(prev => {\n const next = new Set(prev)\n if (next.has(value)) {\n next.delete(value)\n } else {\n if (!multiple) next.clear()\n next.add(value)\n }\n return next\n })\n }\n\n return (\n <div style={{\n border: '1px solid var(--ds-border, #e2e8f0)',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}>\n {items.map((item, index) => {\n const isOpen = open.has(item.value)\n const isHovered = hovered === item.value\n const isLast = index === items.length - 1\n return (\n <div\n key={item.value}\n style={{\n borderBottom: isLast ? 'none' : '1px solid var(--ds-border, #e2e8f0)',\n }}\n >\n <button\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '1rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n background: isHovered ? 'var(--ds-muted, #f1f5f9)' : 'transparent',\n border: 'none',\n cursor: 'pointer',\n textAlign: 'left',\n color: 'var(--ds-text-primary, #0f172a)',\n transition: 'background-color 0.15s',\n }}\n onClick={() => toggle(item.value)}\n onMouseEnter={() => setHovered(item.value)}\n onMouseLeave={() => setHovered(null)}\n aria-expanded={isOpen}\n >\n <span>{item.trigger}</span>\n <ChevronDown\n size={16}\n style={{\n flexShrink: 0,\n color: 'var(--ds-text-secondary, #64748b)',\n transition: 'transform 0.2s ease',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </button>\n <div style={{\n maxHeight: isOpen ? '300px' : '0',\n overflow: 'hidden',\n transition: 'max-height 0.25s ease',\n }}>\n <div style={{\n padding: '0 1rem 1rem',\n fontSize: '0.875rem',\n color: 'var(--ds-text-secondary, #64748b)',\n }}>\n {item.content}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default Accordion\n\n/*\n * Accordion\n *\n * Renders a list of collapsible sections; by default only one section can be open at a time.\n *\n * Props:\n * items (AccordionItem[], required) — array of sections, each with:\n * value (string) — unique identifier\n * trigger (string) — heading text shown on the clickable row\n * content (string) — body text revealed when the section is open\n * defaultValue (string | string[], optional) — value(s) of sections that start open\n * multiple (boolean, optional) — when true, more than one section can be open simultaneously; defaults to false\n *\n * Usage:\n * <Accordion\n * items={[\n * { value: 'q1', trigger: 'What is eFiche?', content: 'eFiche is a medical records platform.' },\n * { value: 'q2', trigger: 'How do I log in?', content: 'Use your credentials at the login page.' },\n * ]}\n * />\n *\n * // Multiple sections open, first one pre-opened:\n * <Accordion items={faqItems} multiple defaultValue=\"q1\" />\n */\n","import React, { FC, ReactNode } from 'react'\nimport { Info, CheckCircle2, AlertTriangle, AlertCircle } from 'lucide-react'\n\ntype AlertVariant = 'info' | 'success' | 'warning' | 'danger'\n\ninterface AlertProps {\n variant?: AlertVariant\n title: string\n description: string\n}\n\nconst variantMap: Record<AlertVariant, { bg: string; border: string; icon: string; title: string; desc: string }> = {\n info: { bg: 'var(--ds-info-bg, #eff6ff)', border: 'var(--ds-info, #3b82f6)', icon: 'var(--ds-info, #3b82f6)', title: 'var(--ds-info-title, #1e3a8a)', desc: 'var(--ds-info-desc, #1e40af)' },\n success: { bg: 'var(--ds-success-bg, #f0fdf4)', border: 'var(--ds-success, #22c55e)', icon: 'var(--ds-success, #22c55e)', title: 'var(--ds-success-title, #14532d)', desc: 'var(--ds-success-desc, #166534)' },\n warning: { bg: 'var(--ds-warning-bg, #fffbeb)', border: 'var(--ds-warning, #f59e0b)', icon: 'var(--ds-warning, #f59e0b)', title: 'var(--ds-warning-title, #78350f)', desc: 'var(--ds-warning-desc, #92400e)' },\n danger: { bg: 'var(--ds-danger-bg, #fef2f2)', border: 'var(--ds-danger, #ef4444)', icon: 'var(--ds-danger, #ef4444)', title: 'var(--ds-danger-title, #7f1d1d)', desc: 'var(--ds-danger-desc, #991b1b)' },\n}\n\nconst icons: Record<AlertVariant, ReactNode> = {\n info: <Info size={16} />,\n success: <CheckCircle2 size={16} />,\n warning: <AlertTriangle size={16} />,\n danger: <AlertCircle size={16} />,\n}\n\nconst Alert: FC<AlertProps> = ({ variant = 'info', title, description }) => {\n const v = variantMap[variant]\n return (\n <div role=\"alert\" style={{\n display: 'flex',\n gap: '0.75rem',\n padding: '1rem',\n borderRadius: '0.5rem',\n borderLeft: `4px solid ${v.border}`,\n backgroundColor: v.bg,\n }}>\n <span style={{ flexShrink: 0, marginTop: '0.125rem', color: v.icon }}>{icons[variant]}</span>\n <div style={{ flex: 1 }}>\n <p style={{ fontWeight: 600, fontSize: '0.875rem', marginBottom: '0.25rem', marginTop: 0, color: v.title }}>{title}</p>\n <p style={{ fontSize: '0.875rem', margin: 0, color: v.desc }}>{description}</p>\n </div>\n </div>\n )\n}\n\nexport default Alert\n\n/*\n * Alert\n *\n * Displays an inline alert banner with an icon, a bold title, and a description line.\n *\n * Props:\n * title (string, required) — short heading for the alert\n * description (string, required) — supporting detail shown below the title\n * variant (\"info\" | \"success\" | \"warning\" | \"danger\", optional) — color and icon style; defaults to \"info\"\n *\n * Usage:\n * <Alert title=\"Saved\" description=\"Your changes have been saved.\" variant=\"success\" />\n */\n","import React, { FC } from 'react'\n\ntype AvatarSize = 'sm' | 'md' | 'lg'\n\ninterface AvatarProps {\n fallback: string\n size?: AvatarSize\n style?: React.CSSProperties\n className?: string\n}\n\nconst sizeMap: Record<AvatarSize, React.CSSProperties> = {\n sm: { width: '2rem', height: '2rem', fontSize: '0.625rem' },\n md: { width: '2.5rem', height: '2.5rem', fontSize: '0.875rem' },\n lg: { width: '4rem', height: '4rem', fontSize: '1.25rem' },\n}\n\nconst Avatar: FC<AvatarProps> = ({ fallback, size = 'md', style, className }) => (\n <div\n className={className}\n aria-label={fallback}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '9999px',\n backgroundColor: 'var(--ds-accent, #f1f5f9)',\n color: 'var(--ds-text-primary, #0f172a)',\n fontWeight: 600,\n flexShrink: 0,\n userSelect: 'none',\n ...sizeMap[size],\n ...style,\n }}\n >\n {fallback}\n </div>\n)\n\nexport default Avatar\n\n/*\n * Avatar\n *\n * Renders a circular container showing initials or a short text fallback.\n *\n * Props:\n * fallback (string, required) — text displayed inside the avatar, typically initials (e.g. \"AB\")\n * size (\"sm\" | \"md\" | \"lg\", optional) — controls the diameter; defaults to \"md\"\n * style (React.CSSProperties, optional) — inline styles for custom background color, etc.\n * className (string, optional) — extra CSS class names\n *\n * Usage:\n * <Avatar fallback=\"JD\" />\n * <Avatar fallback=\"MB\" size=\"lg\" style={{ background: '#6366f1' }} />\n */\n","import React, { FC, ReactNode } from 'react'\n\ntype BadgeVariant = 'default' | 'secondary' | 'outline' | 'danger' | 'success' | 'warning' | 'info'\ntype BadgeSize = 'sm' | 'md' | 'lg'\n\ninterface BadgeProps {\n variant?: BadgeVariant\n size?: BadgeSize\n children: ReactNode\n style?: React.CSSProperties\n}\n\nconst variantMap: Record<BadgeVariant, React.CSSProperties> = {\n default: { backgroundColor: 'var(--ds-primary, #3b82f6)', color: '#fff' },\n secondary: { backgroundColor: 'var(--ds-muted, #f1f5f9)', color: 'var(--ds-text-secondary, #64748b)' },\n outline: { backgroundColor: 'transparent', border: '1px solid var(--ds-border, #e2e8f0)', color: 'var(--ds-text-primary, #0f172a)' },\n danger: { backgroundColor: 'var(--ds-danger, #ef4444)', color: '#fff' },\n success: { backgroundColor: 'var(--ds-success, #22c55e)', color: '#fff' },\n warning: { backgroundColor: 'var(--ds-warning, #f59e0b)', color: '#fff' },\n info: { backgroundColor: 'var(--ds-info, #3b82f6)', color: '#fff' },\n}\n\nconst sizeMap: Record<BadgeSize, React.CSSProperties> = {\n sm: { padding: '0.125rem 0.5rem', fontSize: '0.625rem' },\n md: { padding: '0.25rem 0.625rem', fontSize: '0.75rem' },\n lg: { padding: '0.375rem 0.875rem', fontSize: '0.875rem' },\n}\n\nconst Badge: FC<BadgeProps> = ({ variant = 'default', size = 'md', children, style }) => (\n <span style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n borderRadius: '9999px',\n fontWeight: 500,\n whiteSpace: 'nowrap',\n ...variantMap[variant],\n ...sizeMap[size],\n ...style,\n }}>\n {children}\n </span>\n)\n\nexport default Badge\n\n/*\n * Badge\n *\n * Renders a small inline label used to highlight status, categories, or counts.\n *\n * Props:\n * variant (\"default\" | \"secondary\" | \"outline\" | \"danger\" | \"success\" | \"warning\" | \"info\", optional) — defaults to \"default\"\n * size (\"sm\" | \"md\" | \"lg\", optional) — defaults to \"md\"\n * children (ReactNode, required) — content shown inside the badge\n * style (React.CSSProperties, optional) — inline styles applied to the badge element\n *\n * Usage:\n * <Badge>New</Badge>\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"danger\" size=\"sm\">Overdue</Badge>\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\nimport { ChevronRight } from 'lucide-react'\n\nexport interface BreadcrumbItem {\n label: string\n href?: string\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[]\n}\n\nconst Breadcrumb: FC<BreadcrumbProps> = ({ items }) => {\n const [hovered, setHovered] = useState<string | null>(null)\n\n return (\n <nav aria-label=\"Breadcrumb\">\n <ol style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n listStyle: 'none',\n padding: 0,\n margin: 0,\n fontSize: '0.875rem',\n }}>\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n const isHovered = hovered === item.label\n return (\n <li key={item.label} style={{ display: 'flex', alignItems: 'center' }}>\n {i > 0 && (\n <ChevronRight\n size={14}\n aria-hidden\n style={{ color: 'var(--ds-text-secondary, #64748b)', margin: '0 0.25rem', flexShrink: 0 }}\n />\n )}\n {isLast || !item.href ? (\n <span style={{\n color: isLast ? 'var(--ds-text-primary, #0f172a)' : 'var(--ds-text-secondary, #64748b)',\n fontWeight: isLast ? 500 : undefined,\n cursor: isLast ? 'default' : undefined,\n }}>\n {item.label}\n </span>\n ) : (\n <a\n href={item.href}\n onMouseEnter={() => setHovered(item.label)}\n onMouseLeave={() => setHovered(null)}\n style={{\n color: 'var(--ds-text-secondary, #64748b)',\n textDecoration: isHovered ? 'underline' : 'none',\n transition: 'color 0.15s',\n }}\n >\n {item.label}\n </a>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n\nexport default Breadcrumb\n\n/*\n * Breadcrumb\n *\n * Renders a navigation breadcrumb trail with chevron separators.\n *\n * Props:\n * items (BreadcrumbItem[], required) — ordered array of crumbs, each with:\n * label (string) — display text\n * href (string, optional) — link target; if omitted renders as plain text\n *\n * Usage:\n * <Breadcrumb items={[{ label: 'Home', href: '/' }, { label: 'Patients', href: '/patients' }, { label: 'Visit summary' }]} />\n */\n","'use client'\n\nimport { LoaderCircle } from \"lucide-react\";\nimport React, { FC, ButtonHTMLAttributes, ReactNode, useState } from \"react\";\n\ntype ButtonVariant = \"solid\" | \"outline\" | \"ghost\" | \"danger\" | \"warning\" | \"info\" | \"success\";\ntype ButtonSize = \"sm\" | \"md\" | \"lg\";\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n text?: string;\n loading?: boolean;\n icon?: ReactNode;\n iconPosition?: \"left\" | \"right\";\n // variant shorthand booleans\n outline?: boolean;\n ghost?: boolean;\n danger?: boolean;\n warning?: boolean;\n info?: boolean;\n success?: boolean;\n variant?: ButtonVariant;\n // size shorthand booleans\n small?: boolean;\n large?: boolean;\n size?: ButtonSize;\n}\n\nconst variantStyles: Record<ButtonVariant, React.CSSProperties> = {\n solid: { backgroundColor: 'var(--ds-primary, #3b82f6)', color: '#fff', borderColor: 'transparent' },\n outline: { backgroundColor: 'transparent', color: 'var(--ds-primary, #3b82f6)', borderColor: 'var(--ds-primary, #3b82f6)' },\n ghost: { backgroundColor: 'var(--ds-muted, #f1f5f9)', color: 'var(--ds-text-primary, #0f172a)', borderColor: 'transparent' },\n danger: { backgroundColor: 'var(--ds-danger, #ef4444)', color: '#fff', borderColor: 'transparent' },\n warning: { backgroundColor: 'var(--ds-warning, #f59e0b)', color: '#fff', borderColor: 'transparent' },\n info: { backgroundColor: 'var(--ds-info, #3b82f6)', color: '#fff', borderColor: 'transparent' },\n success: { backgroundColor: 'var(--ds-success, #22c55e)', color: '#fff', borderColor: 'transparent' },\n}\n\nconst variantHoverStyles: Record<ButtonVariant, React.CSSProperties> = {\n solid: { opacity: 0.88 },\n outline: { backgroundColor: 'var(--ds-muted, #f1f5f9)' },\n ghost: { backgroundColor: 'var(--ds-card, #ffffff)' },\n danger: { opacity: 0.88 },\n warning: { opacity: 0.88 },\n info: { opacity: 0.88 },\n success: { opacity: 0.88 },\n}\n\nconst sizeStyles: Record<ButtonSize, React.CSSProperties> = {\n sm: { padding: '0.25rem 0.625rem', fontSize: '0.8rem' },\n md: { padding: '0.5rem 1rem', fontSize: '0.875rem' },\n lg: { padding: '0.75rem 1.5rem', fontSize: '1rem' },\n}\n\nconst Button: FC<ButtonProps> = ({\n text,\n children,\n loading = false,\n disabled = false,\n icon,\n iconPosition = \"left\",\n outline = false,\n ghost = false,\n danger = false,\n warning = false,\n info = false,\n success = false,\n variant,\n small = false,\n large = false,\n size,\n style: styleProp,\n ...props\n}) => {\n const [hovered, setHovered] = useState(false)\n\n const resolvedVariant: ButtonVariant =\n variant ??\n (danger ? \"danger\" :\n warning ? \"warning\" :\n info ? \"info\" :\n success ? \"success\" :\n ghost ? \"ghost\" :\n outline ? \"outline\" :\n \"solid\")\n\n const resolvedSize: ButtonSize = size ?? (small ? \"sm\" : large ? \"lg\" : \"md\")\n const isDisabled = disabled || loading\n const content = children ?? text\n const showIcon = icon && !loading\n\n const computedStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n border: '1px solid transparent',\n borderRadius: '0.375rem',\n fontWeight: 500,\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n transition: 'opacity 0.15s, background-color 0.15s',\n opacity: isDisabled ? 0.5 : 1,\n pointerEvents: loading ? 'none' : undefined,\n ...variantStyles[resolvedVariant],\n ...sizeStyles[resolvedSize],\n ...(hovered && !isDisabled ? variantHoverStyles[resolvedVariant] : {}),\n ...styleProp,\n }\n\n return (\n <>\n {/* React 19 hoists and deduplicates this style tag automatically */}\n <style href=\"ds-spin\" precedence=\"low\">{`@keyframes ds-spin { to { transform: rotate(360deg); } }`}</style>\n <button\n disabled={isDisabled}\n style={computedStyle}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n {...props}\n >\n {loading\n ? <LoaderCircle\n aria-hidden\n style={{ width: '1em', height: '1em', animation: 'ds-spin 0.75s linear infinite' }}\n />\n : null}\n {showIcon && iconPosition === \"left\" ? icon : null}\n {content}\n {showIcon && iconPosition === \"right\" ? icon : null}\n </button>\n </>\n )\n}\n\nexport default Button\n\n/*\n * Button\n *\n * Renders a styled button with support for variants, sizes, icons, and a loading state.\n *\n * Props:\n * text (string, optional) — button label; can use children instead\n * loading (boolean, optional) — shows a spinner and disables the button while true\n * disabled (boolean, optional) — disables the button\n * icon (ReactNode, optional) — icon to display alongside the label\n * iconPosition (\"left\" | \"right\", optional) — which side the icon appears on; defaults to \"left\"\n * variant (\"solid\" | \"outline\" | \"ghost\" | \"danger\" | \"warning\" | \"info\" | \"success\", optional) — visual style; defaults to \"solid\"\n * outline (boolean, optional) — shorthand for variant=\"outline\"\n * ghost (boolean, optional) — shorthand for variant=\"ghost\"\n * danger (boolean, optional) — shorthand for variant=\"danger\"\n * warning (boolean, optional) — shorthand for variant=\"warning\"\n * info (boolean, optional) — shorthand for variant=\"info\"\n * success (boolean, optional) — shorthand for variant=\"success\"\n * size (\"sm\" | \"md\" | \"lg\", optional) — button size; defaults to \"md\"\n * small (boolean, optional) — shorthand for size=\"sm\"\n * large (boolean, optional) — shorthand for size=\"lg\"\n * ...rest — any valid HTML button attribute (onClick, type, etc.)\n *\n * Usage:\n * <Button text=\"Save\" onClick={handleSave} />\n *\n * // Danger variant with loading state:\n * <Button danger loading={isDeleting} text=\"Delete\" />\n *\n * // Icon on the right, large size:\n * <Button large icon={<ArrowRight />} iconPosition=\"right\">Continue</Button>\n */\n","import React, { FC, HTMLAttributes } from 'react'\n\nexport const Card: FC<HTMLAttributes<HTMLDivElement>> = ({ style, ...props }) => (\n <div style={{\n border: '1px solid var(--ds-border, #e2e8f0)',\n borderRadius: '0.5rem',\n backgroundColor: 'var(--ds-card, #ffffff)',\n ...style,\n }} {...props} />\n)\n\nexport const CardHeader: FC<HTMLAttributes<HTMLDivElement>> = ({ style, ...props }) => (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: '0.375rem',\n padding: '1.5rem 1.5rem 0',\n ...style,\n }} {...props} />\n)\n\nexport const CardTitle: FC<HTMLAttributes<HTMLHeadingElement>> = ({ style, ...props }) => (\n <h3 style={{\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--ds-text-primary, #0f172a)',\n margin: 0,\n lineHeight: 1.4,\n ...style,\n }} {...props} />\n)\n\nexport const CardDescription: FC<HTMLAttributes<HTMLParagraphElement>> = ({ style, ...props }) => (\n <p style={{\n fontSize: '0.875rem',\n color: 'var(--ds-text-secondary, #64748b)',\n margin: 0,\n ...style,\n }} {...props} />\n)\n\nexport const CardContent: FC<HTMLAttributes<HTMLDivElement>> = ({ style, ...props }) => (\n <div style={{ padding: '1.5rem', ...style }} {...props} />\n)\n\nexport const CardFooter: FC<HTMLAttributes<HTMLDivElement>> = ({ style, ...props }) => (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n padding: '0 1.5rem 1.5rem',\n ...style,\n }} {...props} />\n)\n\n/*\n * Card / CardHeader / CardTitle / CardDescription / CardContent / CardFooter\n *\n * Composable container components for card-style layouts.\n *\n * Usage:\n * <Card>\n * <CardHeader>\n * <CardTitle>Patient Summary</CardTitle>\n * <CardDescription>Last visit on 12 May 2026</CardDescription>\n * </CardHeader>\n * <CardContent><p>Diagnosis: Hypertension</p></CardContent>\n * <CardFooter><Button text=\"View full record\" /></CardFooter>\n * </Card>\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\n\ninterface CheckboxProps {\n label?: string\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n id?: string\n onChange?: (checked: boolean) => void\n}\n\nconst Checkbox: FC<CheckboxProps> = ({\n label,\n checked,\n defaultChecked = false,\n disabled,\n id,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultChecked)\n const isChecked = checked !== undefined ? checked : internal\n\n const handleChange = () => {\n if (disabled) return\n const next = !isChecked\n setInternal(next)\n onChange?.(next)\n }\n\n return (\n <label htmlFor={id} style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n opacity: disabled ? 0.5 : 1,\n }}>\n <input\n type=\"checkbox\"\n id={id}\n checked={isChecked}\n disabled={disabled}\n onChange={handleChange}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span style={{\n width: '1.125rem',\n height: '1.125rem',\n border: `2px solid ${isChecked ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-border, #e2e8f0)'}`,\n borderRadius: '0.25rem',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'background-color 0.15s, border-color 0.15s',\n backgroundColor: isChecked ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-card, #fff)',\n }}>\n {isChecked && (\n <svg viewBox=\"0 0 12 10\" fill=\"none\" style={{ width: '0.625rem', height: '0.625rem' }}>\n <path d=\"M1 5l3.5 3.5L11 1\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </span>\n {label && (\n <span style={{ fontSize: '0.875rem', color: 'var(--ds-text-primary, #0f172a)' }}>{label}</span>\n )}\n </label>\n )\n}\n\nexport default Checkbox\n\n/*\n * Checkbox\n *\n * Renders a styled checkbox — controlled or uncontrolled — with an optional text label.\n *\n * Props:\n * label (string, optional) — text displayed next to the checkbox\n * checked (boolean, optional) — controlled checked state\n * defaultChecked (boolean, optional) — initial state for uncontrolled use; defaults to false\n * disabled (boolean, optional) — prevents interaction\n * id (string, optional) — HTML id for the underlying input\n * onChange ((checked: boolean) => void, optional) — called with the new boolean on each change\n *\n * Usage:\n * <Checkbox label=\"Accept terms\" onChange={val => setAccepted(val)} />\n * <Checkbox checked={isChecked} onChange={setIsChecked} label=\"Remember me\" />\n */\n","'use client'\n\nimport { Check, Copy } from 'lucide-react'\nimport React, { FC, useState } from 'react'\n\ninterface CopyButtonProps {\n text: string\n}\n\nconst CopyButton: FC<CopyButtonProps> = ({ text }) => {\n const [copied, setCopied] = useState(false)\n const [hovered, setHovered] = useState(false)\n\n const handleCopy = () => {\n navigator.clipboard.writeText(text)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <button\n onClick={handleCopy}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n aria-label={copied ? 'Copied' : `Copy ${text}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0.25rem',\n border: 'none',\n borderRadius: '0.25rem',\n backgroundColor: hovered ? 'var(--ds-accent, #f1f5f9)' : 'transparent',\n color: hovered ? 'var(--ds-text-primary, #0f172a)' : 'var(--ds-text-secondary, #64748b)',\n cursor: 'pointer',\n transition: 'background-color 0.15s, color 0.15s',\n }}\n >\n {copied\n ? <Check style={{ width: '1rem', height: '1rem' }} />\n : <Copy style={{ width: '1rem', height: '1rem' }} />\n }\n </button>\n )\n}\n\nexport default CopyButton\n\n/*\n * CopyButton\n *\n * Renders an icon button that copies a string to the clipboard; shows a checkmark for 2 seconds after copying.\n *\n * Props:\n * text (string, required) — the string that gets copied to the clipboard when clicked\n *\n * Usage:\n * <CopyButton text=\"npm install @efiche/design\" />\n */\n","'use client'\n\nimport { Upload } from 'lucide-react'\nimport React, { FC, useRef, useState } from 'react'\n\ninterface FileUploadProps {\n accept?: string\n multiple?: boolean\n disabled?: boolean\n onFileSelect?: (files: FileList) => void\n}\n\nconst FileUpload: FC<FileUploadProps> = ({ accept, multiple, disabled, onFileSelect }) => {\n const [isDragging, setIsDragging] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const [fileNames, setFileNames] = useState<string[]>([])\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleFiles = (list: FileList) => {\n setFileNames(Array.from(list).map(f => f.name))\n onFileSelect?.(list)\n }\n\n const isActive = isDragging || isHovered\n\n return (\n <div\n onClick={() => !disabled && inputRef.current?.click()}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onDragOver={(e) => { e.preventDefault(); setIsDragging(true) }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={(e) => {\n e.preventDefault()\n setIsDragging(false)\n if (!disabled && e.dataTransfer.files.length) handleFiles(e.dataTransfer.files)\n }}\n style={{\n border: `2px dashed ${isActive ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-border, #e2e8f0)'}`,\n borderRadius: '0.5rem',\n padding: '2rem',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '0.5rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n backgroundColor: isActive ? 'var(--ds-primary-50, #eff6ff)' : 'var(--ds-muted, #f1f5f9)',\n transition: 'border-color 0.15s, background-color 0.15s',\n textAlign: 'center',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n style={{ display: 'none' }}\n onChange={(e) => e.target.files && handleFiles(e.target.files)}\n />\n <Upload size={32} style={{ color: 'var(--ds-text-secondary, #64748b)' }} />\n {fileNames.length > 0\n ? <p style={{ fontSize: '0.875rem', color: 'var(--ds-primary, #3b82f6)', fontWeight: 500, margin: 0 }}>\n {fileNames.join(', ')}\n </p>\n : <p style={{ fontSize: '0.875rem', color: 'var(--ds-text-secondary, #64748b)', margin: 0 }}>\n <strong>Click to upload</strong> or drag and drop\n </p>\n }\n </div>\n )\n}\n\nexport default FileUpload\n\n/*\n * FileUpload\n *\n * Renders a click-to-browse and drag-and-drop file upload zone.\n *\n * Props:\n * accept (string, optional) — file type filter (e.g. \"image/*\", \".pdf\")\n * multiple (boolean, optional) — allows selecting more than one file\n * disabled (boolean, optional) — prevents clicking and dropping\n * onFileSelect ((files: FileList) => void, optional) — called whenever files are chosen\n *\n * Usage:\n * <FileUpload onFileSelect={files => uploadFiles(files)} />\n * <FileUpload accept=\"image/*\" multiple onFileSelect={handleImages} />\n */\n","import React, { FC, InputHTMLAttributes, ReactNode } from 'react'\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: boolean\n success?: boolean\n leftIcon?: ReactNode\n rightIcon?: ReactNode\n}\n\nconst inputCSS = `\n[data-ds-input]::placeholder { color: var(--ds-text-secondary, #64748b); }\n[data-ds-input]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }\n[data-ds-input]:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--ds-muted, #f1f5f9); }\n[data-ds-input][data-error=\"true\"]:focus { border-color: var(--ds-danger, #ef4444); box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15); }\n[data-ds-input][data-success=\"true\"]:focus { border-color: var(--ds-success, #22c55e); box-shadow: 0 0 0 3px rgb(34 197 94 / 0.15); }\n`\n\nconst Input: FC<InputProps> = ({ error, success, leftIcon, rightIcon, style, ...props }) => (\n <>\n <style href=\"ds-input\" precedence=\"low\">{inputCSS}</style>\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center', width: '100%' }}>\n {leftIcon && (\n <span style={{\n position: 'absolute',\n left: '0.625rem',\n display: 'flex',\n alignItems: 'center',\n color: 'var(--ds-text-secondary, #64748b)',\n pointerEvents: 'none',\n }}>\n {leftIcon}\n </span>\n )}\n <input\n data-ds-input=\"\"\n data-error={error ? 'true' : undefined}\n data-success={success ? 'true' : undefined}\n style={{\n width: '100%',\n height: '2.25rem',\n paddingTop: 0,\n paddingBottom: 0,\n paddingLeft: leftIcon ? '2.25rem' : '0.75rem',\n paddingRight: rightIcon ? '2.25rem' : '0.75rem',\n border: `1px solid ${error ? 'var(--ds-danger, #ef4444)' : success ? 'var(--ds-success, #22c55e)' : 'var(--ds-border, #e2e8f0)'}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n backgroundColor: 'var(--ds-card, #fff)',\n color: 'var(--ds-text-primary, #0f172a)',\n fontFamily: 'inherit',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n ...style,\n }}\n {...props}\n />\n {rightIcon && (\n <span style={{\n position: 'absolute',\n right: '0.625rem',\n display: 'flex',\n alignItems: 'center',\n color: 'var(--ds-text-secondary, #64748b)',\n pointerEvents: 'none',\n }}>\n {rightIcon}\n </span>\n )}\n </div>\n </>\n)\n\nexport default Input\n\n/*\n * Input\n *\n * Renders a text input with optional left/right icons and error or success border states.\n *\n * Props:\n * error (boolean, optional) — applies an error border style\n * success (boolean, optional) — applies a success border style\n * leftIcon (ReactNode, optional) — icon inside the left side\n * rightIcon (ReactNode, optional) — icon inside the right side\n * ...rest — any valid HTML input attribute (placeholder, value, onChange, disabled, etc.)\n *\n * Usage:\n * <Input placeholder=\"Search...\" onChange={handleChange} />\n * <Input leftIcon={<SearchIcon />} error placeholder=\"Not found\" />\n */\n","import React, { FC, LabelHTMLAttributes } from 'react'\n\ninterface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n}\n\nconst Label: FC<LabelProps> = ({ children, required, style, ...props }) => (\n <label style={{\n display: 'block',\n fontSize: '0.875rem',\n fontWeight: 500,\n color: 'var(--ds-text-primary, #0f172a)',\n marginBottom: '0.375rem',\n ...style,\n }} {...props}>\n {children}\n {required && (\n <span style={{ color: 'var(--ds-danger, #ef4444)', marginLeft: '0.25rem' }}>*</span>\n )}\n </label>\n)\n\nexport default Label\n\n/*\n * Label\n *\n * Renders a styled form label, optionally appending a red asterisk when the field is required.\n *\n * Props:\n * required (boolean, optional) — appends a \"*\" marker after the label text\n * ...rest — any valid HTML label attribute (htmlFor, etc.)\n *\n * Usage:\n * <Label htmlFor=\"email\">Email</Label>\n * <Label htmlFor=\"name\" required>Full name</Label>\n */\n","'use client'\n\nimport { Eye, EyeOff } from 'lucide-react'\nimport React, { FC, InputHTMLAttributes, useState } from 'react'\nimport Input from '../Input/Input'\n\ntype PasswordInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type'>\n\nconst PasswordInput: FC<PasswordInputProps> = (props) => {\n const [visible, setVisible] = useState(false)\n\n return (\n <Input\n {...props}\n type={visible ? 'text' : 'password'}\n rightIcon={\n <button\n type=\"button\"\n onClick={() => setVisible(v => !v)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 0, display: 'flex', pointerEvents: 'all' }}\n tabIndex={-1}\n >\n {visible ? <EyeOff size={16} /> : <Eye size={16} />}\n </button>\n }\n />\n )\n}\n\nexport default PasswordInput\n\n/*\n * PasswordInput\n *\n * Renders a password input with an eye/eye-off toggle button that shows or hides the typed text.\n *\n * Props:\n * ...rest — any valid HTML input attribute except \"type\" (e.g. placeholder, value, onChange, disabled)\n * also accepts Input's error and success props for border states\n *\n * Usage:\n * <PasswordInput placeholder=\"Enter password\" onChange={e => setPassword(e.target.value)} />\n *\n * // With error state:\n * <PasswordInput value={password} onChange={handleChange} error />\n */\n","import React, { FC } from 'react'\n\ninterface ProgressProps {\n value?: number\n}\n\nconst Progress: FC<ProgressProps> = ({ value = 0 }) => {\n const pct = Math.min(100, Math.max(0, value))\n return (\n <div\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n style={{\n width: '100%',\n height: '0.5rem',\n backgroundColor: 'var(--ds-border, #e2e8f0)',\n borderRadius: '9999px',\n overflow: 'hidden',\n }}\n >\n <div style={{\n height: '100%',\n width: `${pct}%`,\n backgroundColor: 'var(--ds-primary, #3b82f6)',\n borderRadius: '9999px',\n transition: 'width 0.3s ease',\n }} />\n </div>\n )\n}\n\nexport default Progress\n\n/*\n * Progress\n *\n * Displays a horizontal progress bar that fills from left to right based on a 0–100 value.\n *\n * Props:\n * value (number, optional) — current progress percentage (0–100); clamped to that range; defaults to 0\n *\n * Usage:\n * <Progress value={60} />\n * <Progress value={uploadPercent} />\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\n\ninterface RadioOption {\n value: string\n label: string\n}\n\ninterface RadioGroupProps {\n options: RadioOption[]\n name: string\n value?: string\n defaultValue?: string\n disabled?: boolean\n onChange?: (value: string) => void\n}\n\nconst RadioGroup: FC<RadioGroupProps> = ({\n options,\n name,\n value,\n defaultValue = '',\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const selected = value !== undefined ? value : internal\n\n const handleChange = (val: string) => {\n if (disabled) return\n setInternal(val)\n onChange?.(val)\n }\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {options.map((option) => {\n const isSelected = selected === option.value\n return (\n <label key={option.value} style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n opacity: disabled ? 0.5 : 1,\n }}>\n <input\n type=\"radio\"\n name={name}\n value={option.value}\n checked={isSelected}\n disabled={disabled}\n onChange={() => handleChange(option.value)}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span style={{\n width: '1.125rem',\n height: '1.125rem',\n borderRadius: '9999px',\n border: `2px solid ${isSelected ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-border, #e2e8f0)'}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n backgroundColor: 'var(--ds-card, #fff)',\n transition: 'border-color 0.15s',\n }}>\n {isSelected && (\n <span style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '9999px',\n backgroundColor: 'var(--ds-primary, #3b82f6)',\n }} />\n )}\n </span>\n <span style={{ fontSize: '0.875rem', color: 'var(--ds-text-primary, #0f172a)' }}>\n {option.label}\n </span>\n </label>\n )\n })}\n </div>\n )\n}\n\nexport default RadioGroup\n\n/*\n * RadioGroup\n *\n * Renders a group of radio buttons from an array of options; controlled or uncontrolled.\n *\n * Props:\n * options (RadioOption[], required) — array of { value, label } items\n * name (string, required) — shared name attribute for the radio inputs\n * value (string, optional) — controlled selected value\n * defaultValue (string, optional) — initial value for uncontrolled use; defaults to \"\"\n * disabled (boolean, optional) — disables all options\n * onChange ((value: string) => void, optional) — called with the selected value on change\n *\n * Usage:\n * <RadioGroup name=\"size\" options={[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]} onChange={setSize} />\n */\n","'use client'\n\nimport { Check, ChevronDown } from 'lucide-react'\nimport React, { FC, useEffect, useRef, useState } from 'react'\n\ninterface SelectOption {\n value: string\n label: string\n}\n\ninterface SelectProps {\n options: SelectOption[]\n value?: string\n defaultValue?: string\n placeholder?: string\n disabled?: boolean\n onChange?: (value: string) => void\n}\n\nconst selectCSS = `\n[data-ds-select-trigger]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }\n`\n\nconst Select: FC<SelectProps> = ({\n options,\n value,\n defaultValue = '',\n placeholder = 'Choose an option',\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const [open, setOpen] = useState(false)\n const [hoveredOption, setHoveredOption] = useState<string | null>(null)\n const ref = useRef<HTMLDivElement>(null)\n\n const selected = value !== undefined ? value : internal\n const selectedLabel = options.find(o => o.value === selected)?.label\n\n const handleSelect = (val: string) => {\n setInternal(val)\n setOpen(false)\n onChange?.(val)\n }\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handleOutside)\n return () => document.removeEventListener('mousedown', handleOutside)\n }, [])\n\n return (\n <>\n <style href=\"ds-select\" precedence=\"low\">{selectCSS}</style>\n <div ref={ref} style={{\n position: 'relative',\n width: '100%',\n opacity: disabled ? 0.5 : 1,\n pointerEvents: disabled ? 'none' : undefined,\n }}>\n <button\n type=\"button\"\n data-ds-select-trigger=\"\"\n onClick={() => !disabled && setOpen(o => !o)}\n disabled={disabled}\n style={{\n width: '100%',\n height: '2.25rem',\n padding: '0 0.75rem',\n border: `1px solid ${open ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-border, #e2e8f0)'}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n backgroundColor: 'var(--ds-card, #fff)',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '0.5rem',\n boxShadow: open ? '0 0 0 3px rgb(59 130 246 / 0.15)' : 'none',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n textAlign: 'left',\n fontFamily: 'inherit',\n }}\n >\n <span style={{ color: selectedLabel ? 'var(--ds-text-primary, #0f172a)' : 'var(--ds-text-secondary, #64748b)' }}>\n {selectedLabel ?? placeholder}\n </span>\n <ChevronDown\n size={16}\n style={{\n flexShrink: 0,\n color: 'var(--ds-text-secondary, #64748b)',\n transition: 'transform 0.15s',\n transform: open ? 'rotate(180deg)' : 'rotate(0deg)',\n }}\n />\n </button>\n {open && (\n <div style={{\n position: 'absolute',\n top: 'calc(100% + 0.25rem)',\n left: 0,\n right: 0,\n zIndex: 50,\n backgroundColor: 'var(--ds-card, #fff)',\n border: '1px solid var(--ds-border, #e2e8f0)',\n borderRadius: '0.375rem',\n boxShadow: '0 10px 15px -3px rgb(0 0 0 / 0.1)',\n overflow: 'hidden',\n }}>\n {options.map((option) => {\n const isSelected = selected === option.value\n const isHovered = hoveredOption === option.value\n return (\n <div\n key={option.value}\n onClick={() => handleSelect(option.value)}\n onMouseEnter={() => setHoveredOption(option.value)}\n onMouseLeave={() => setHoveredOption(null)}\n style={{\n padding: '0.5rem 0.75rem',\n fontSize: '0.875rem',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n color: 'var(--ds-text-primary, #0f172a)',\n backgroundColor: isSelected || isHovered ? 'var(--ds-muted, #f1f5f9)' : 'transparent',\n fontWeight: isSelected ? 500 : undefined,\n transition: 'background-color 0.1s',\n }}\n >\n {isSelected\n ? <Check size={14} style={{ color: 'var(--ds-primary, #3b82f6)', flexShrink: 0 }} />\n : <span style={{ width: 14, flexShrink: 0 }} />\n }\n {option.label}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </>\n )\n}\n\nexport default Select\n\n/*\n * Select\n *\n * Renders a custom dropdown — controlled or uncontrolled — for picking one option.\n *\n * Props:\n * options (SelectOption[], required) — array of { value, label } items\n * value (string, optional) — controlled selected value\n * defaultValue (string, optional) — initial value for uncontrolled use; defaults to \"\"\n * placeholder (string, optional) — text shown when nothing is selected; defaults to \"Choose an option\"\n * disabled (boolean, optional) — prevents opening the dropdown\n * onChange ((value: string) => void, optional) — called with the selected value on pick\n *\n * Usage:\n * <Select options={[{ value: 'fr', label: 'French' }, { value: 'en', label: 'English' }]} onChange={setLanguage} />\n */\n","import React, { FC } from 'react'\n\ninterface SkeletonProps {\n height?: string\n width?: string\n circle?: boolean\n}\n\nconst Skeleton: FC<SkeletonProps> = ({ height = '1rem', width = '100%', circle = false }) => (\n <>\n <style href=\"ds-skeleton\" precedence=\"low\">{`\n @keyframes ds-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }\n [data-ds-skeleton] { animation: ds-pulse 1.5s ease-in-out infinite; }\n `}</style>\n <div\n data-ds-skeleton=\"\"\n aria-hidden=\"true\"\n style={{\n height,\n width,\n backgroundColor: 'var(--ds-muted, #f1f5f9)',\n borderRadius: circle ? '9999px' : '0.375rem',\n }}\n />\n </>\n)\n\nexport default Skeleton\n\n/*\n * Skeleton\n *\n * Renders an animated placeholder block for loading states.\n *\n * Props:\n * height (string, optional) — CSS height; defaults to \"1rem\"\n * width (string, optional) — CSS width; defaults to \"100%\"\n * circle (boolean, optional) — makes the block fully round for avatar placeholders\n *\n * Usage:\n * <Skeleton width=\"200px\" height=\"1rem\" />\n * <Skeleton circle width=\"40px\" height=\"40px\" />\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\n\ninterface SliderProps {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n disabled?: boolean\n onChange?: (value: number) => void\n}\n\nconst sliderCSS = `\n[data-ds-slider] {\n -webkit-appearance: none;\n appearance: none;\n width: 100%;\n height: 0.375rem;\n border-radius: 9999px;\n outline: none;\n cursor: pointer;\n background: linear-gradient(\n to right,\n var(--ds-primary, #3b82f6) 0%,\n var(--ds-primary, #3b82f6) var(--fill, 50%),\n var(--ds-border, #e2e8f0) var(--fill, 50%),\n var(--ds-border, #e2e8f0) 100%\n );\n}\n[data-ds-slider]::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 9999px;\n background-color: var(--ds-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid #fff;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);\n transition: transform 0.1s;\n}\n[data-ds-slider]::-webkit-slider-thumb:hover { transform: scale(1.2); }\n[data-ds-slider]::-moz-range-thumb {\n width: 1.125rem;\n height: 1.125rem;\n border-radius: 9999px;\n background-color: var(--ds-primary, #3b82f6);\n cursor: pointer;\n border: 2px solid #fff;\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.2);\n}\n[data-ds-slider]:disabled { cursor: not-allowed; }\n`\n\nconst Slider: FC<SliderProps> = ({\n value,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultValue)\n const current = value !== undefined ? value : internal\n const fill = `${((current - min) / (max - min)) * 100}%`\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = Number(e.target.value)\n setInternal(val)\n onChange?.(val)\n }\n\n return (\n <>\n <style href=\"ds-slider\" precedence=\"low\">{sliderCSS}</style>\n <div style={{\n width: '100%',\n padding: '0.25rem 0',\n opacity: disabled ? 0.5 : 1,\n }}>\n <input\n type=\"range\"\n data-ds-slider=\"\"\n min={min}\n max={max}\n step={step}\n value={current}\n disabled={disabled}\n onChange={handleChange}\n style={{ '--fill': fill } as React.CSSProperties}\n />\n </div>\n </>\n )\n}\n\nexport default Slider\n\n/*\n * Slider\n *\n * Renders a range slider with a filled track — controlled or uncontrolled.\n *\n * Props:\n * value (number, optional) — controlled current value\n * defaultValue (number, optional) — initial value for uncontrolled use; defaults to 50\n * min (number, optional) — minimum value; defaults to 0\n * max (number, optional) — maximum value; defaults to 100\n * step (number, optional) — increment between values; defaults to 1\n * disabled (boolean, optional) — prevents interaction\n * onChange ((value: number) => void, optional) — called with the new value on each change\n *\n * Usage:\n * <Slider onChange={val => setVolume(val)} />\n * <Slider value={opacity} min={0} max={1} step={0.01} onChange={setOpacity} />\n */\n","import React, { FC } from 'react'\nimport { Loader2 } from 'lucide-react'\n\ntype SpinnerSize = 'sm' | 'md' | 'lg'\n\ninterface SpinnerProps {\n size?: SpinnerSize\n}\n\nconst sizePx: Record<SpinnerSize, number> = { sm: 16, md: 24, lg: 32 }\n\nconst Spinner: FC<SpinnerProps> = ({ size = 'md' }) => (\n <>\n <style href=\"ds-spin\" precedence=\"low\">{`@keyframes ds-spin { to { transform: rotate(360deg); } }`}</style>\n <Loader2\n size={sizePx[size]}\n aria-label=\"Loading\"\n style={{ color: 'var(--ds-primary, #3b82f6)', animation: 'ds-spin 0.75s linear infinite' }}\n />\n </>\n)\n\nexport default Spinner\n\n/*\n * Spinner\n *\n * Displays an animated loading indicator at one of three sizes.\n *\n * Props:\n * size (\"sm\" | \"md\" | \"lg\", optional) — sm = 16px, md = 24px, lg = 32px; defaults to \"md\"\n *\n * Usage:\n * <Spinner />\n * {isLoading && <Spinner size=\"lg\" />}\n */\n","'use client'\n\nimport React, { FC, useState } from 'react'\n\ninterface SwitchProps {\n label?: string\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n id?: string\n onChange?: (checked: boolean) => void\n}\n\nconst Switch: FC<SwitchProps> = ({\n label,\n checked,\n defaultChecked = false,\n disabled,\n id,\n onChange,\n}) => {\n const [internal, setInternal] = useState(defaultChecked)\n const isOn = checked !== undefined ? checked : internal\n\n const handleToggle = () => {\n if (disabled) return\n const next = !isOn\n setInternal(next)\n onChange?.(next)\n }\n\n return (\n <label htmlFor={id} style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.625rem',\n cursor: disabled ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n opacity: disabled ? 0.5 : 1,\n }}>\n <input\n type=\"checkbox\"\n id={id}\n checked={isOn}\n disabled={disabled}\n onChange={handleToggle}\n style={{ position: 'absolute', opacity: 0, width: 0, height: 0 }}\n />\n <span style={{\n width: '2.75rem',\n height: '1.5rem',\n borderRadius: '9999px',\n backgroundColor: isOn ? 'var(--ds-primary, #3b82f6)' : 'var(--ds-border, #e2e8f0)',\n position: 'relative',\n transition: 'background-color 0.2s',\n flexShrink: 0,\n }}>\n <span style={{\n position: 'absolute',\n top: '0.175rem',\n left: '0.175rem',\n width: '1.15rem',\n height: '1.15rem',\n borderRadius: '9999px',\n backgroundColor: '#fff',\n boxShadow: '0 1px 3px 0 rgb(0 0 0 / 0.15)',\n transition: 'transform 0.2s',\n transform: isOn ? 'translateX(1.25rem)' : 'translateX(0)',\n }} />\n </span>\n {label && (\n <span style={{ fontSize: '0.875rem', color: 'var(--ds-text-primary, #0f172a)' }}>{label}</span>\n )}\n </label>\n )\n}\n\nexport default Switch\n\n/*\n * Switch\n *\n * Renders a toggle switch — controlled or uncontrolled — with an optional text label.\n *\n * Props:\n * label (string, optional) — text displayed next to the switch\n * checked (boolean, optional) — controlled on/off state\n * defaultChecked (boolean, optional) — initial state for uncontrolled use; defaults to false\n * disabled (boolean, optional) — prevents interaction\n * id (string, optional) — HTML id for the underlying input\n * onChange ((checked: boolean) => void, optional) — called with the new boolean on each toggle\n *\n * Usage:\n * <Switch label=\"Enable notifications\" onChange={setEnabled} />\n * <Switch checked={darkMode} onChange={setDarkMode} label=\"Dark mode\" />\n */\n","'use client'\n\nimport React, { FC, HTMLAttributes, ThHTMLAttributes, TdHTMLAttributes, useState } from 'react'\n\nconst tableCSS = `\n[data-ds-table-row]:hover [data-ds-table-cell] { background-color: var(--ds-muted, #f1f5f9); }\n`\n\nexport const Table: FC<HTMLAttributes<HTMLTableElement>> = ({ style, ...props }) => (\n <>\n <style href=\"ds-table\" precedence=\"low\">{tableCSS}</style>\n <div style={{\n width: '100%',\n overflowX: 'auto',\n border: '1px solid var(--ds-border, #e2e8f0)',\n borderRadius: '0.5rem',\n }}>\n <table style={{\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: '0.875rem',\n ...style,\n }} {...props} />\n </div>\n </>\n)\n\nexport const TableHead: FC<HTMLAttributes<HTMLTableSectionElement>> = (props) => (\n <thead {...props} />\n)\n\nexport const TableBody: FC<HTMLAttributes<HTMLTableSectionElement>> = (props) => (\n <tbody {...props} />\n)\n\nexport const TableRow: FC<HTMLAttributes<HTMLTableRowElement>> = ({ style, ...props }) => (\n <tr data-ds-table-row=\"\" style={style} {...props} />\n)\n\nexport const TableHeader: FC<ThHTMLAttributes<HTMLTableCellElement>> = ({ style, ...props }) => (\n <th style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontWeight: 500,\n color: 'var(--ds-text-secondary, #64748b)',\n backgroundColor: 'var(--ds-muted, #f1f5f9)',\n borderBottom: '1px solid var(--ds-border, #e2e8f0)',\n whiteSpace: 'nowrap',\n ...style,\n }} {...props} />\n)\n\nexport const TableCell: FC<TdHTMLAttributes<HTMLTableCellElement>> = ({ style, ...props }) => (\n <td\n data-ds-table-cell=\"\"\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid var(--ds-border, #e2e8f0)',\n color: 'var(--ds-text-primary, #0f172a)',\n transition: 'background-color 0.1s',\n ...style,\n }}\n {...props}\n />\n)\n\n/*\n * Table / TableHead / TableBody / TableRow / TableHeader / TableCell\n *\n * Composable table components with consistent styles.\n *\n * Usage:\n * <Table>\n * <TableHead><TableRow><TableHeader>Name</TableHeader><TableHeader>Status</TableHeader></TableRow></TableHead>\n * <TableBody><TableRow><TableCell>Visit 001</TableCell><TableCell>Completed</TableCell></TableRow></TableBody>\n * </Table>\n */\n","'use client'\n\nimport React, { FC, ReactNode, useState } from 'react'\n\nexport interface TabItem {\n value: string\n label: string\n content: ReactNode\n icon?: ReactNode\n}\n\ninterface TabsProps {\n tabs: TabItem[]\n defaultValue?: string\n}\n\nconst Tabs: FC<TabsProps> = ({ tabs, defaultValue }) => {\n const [active, setActive] = useState(defaultValue ?? tabs[0]?.value ?? '')\n const [hovered, setHovered] = useState<string | null>(null)\n const activeTab = tabs.find(t => t.value === active)\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div role=\"tablist\" style={{\n display: 'inline-flex',\n backgroundColor: 'var(--ds-muted, #f1f5f9)',\n borderRadius: '0.5rem',\n padding: '0.25rem',\n gap: '0.125rem',\n }}>\n {tabs.map(tab => {\n const isActive = active === tab.value\n const isHovered = hovered === tab.value\n return (\n <button\n key={tab.value}\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => setActive(tab.value)}\n onMouseEnter={() => setHovered(tab.value)}\n onMouseLeave={() => setHovered(null)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.375rem',\n padding: '0.375rem 0.75rem',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderRadius: '0.375rem',\n background: isActive ? 'var(--ds-card, #ffffff)' : 'transparent',\n border: 'none',\n cursor: 'pointer',\n color: isActive || isHovered ? 'var(--ds-text-primary, #0f172a)' : 'var(--ds-text-secondary, #64748b)',\n boxShadow: isActive ? '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)' : 'none',\n transition: 'color 0.15s, background-color 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap',\n }}\n >\n {tab.icon && <span style={{ display: 'flex', alignItems: 'center' }}>{tab.icon}</span>}\n {tab.label}\n </button>\n )\n })}\n </div>\n <div role=\"tabpanel\" style={{\n paddingTop: '1rem',\n fontSize: '0.875rem',\n color: 'var(--ds-text-secondary, #64748b)',\n }}>\n {activeTab?.content}\n </div>\n </div>\n )\n}\n\nexport default Tabs\n\n/*\n * Tabs\n *\n * Renders a tab bar and displays the content panel of the active tab.\n *\n * Props:\n * tabs (TabItem[], required) — array of { value, label, content, icon? }\n * defaultValue (string, optional) — value of the tab active on first render; defaults to the first tab\n *\n * Usage:\n * <Tabs tabs={[{ value: 'overview', label: 'Overview', content: <Overview /> }, { value: 'settings', label: 'Settings', content: <Settings /> }]} />\n */\n","import React, { FC, TextareaHTMLAttributes } from 'react'\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean\n}\n\nconst textareaCSS = `\n[data-ds-textarea]::placeholder { color: var(--ds-text-secondary, #64748b); }\n[data-ds-textarea]:focus { outline: none; border-color: var(--ds-primary, #3b82f6); box-shadow: 0 0 0 3px rgb(59 130 246 / 0.15); }\n[data-ds-textarea]:disabled { opacity: 0.5; cursor: not-allowed; background-color: var(--ds-muted, #f1f5f9); }\n[data-ds-textarea][data-error=\"true\"] { border-color: var(--ds-danger, #ef4444); }\n[data-ds-textarea][data-error=\"true\"]:focus { border-color: var(--ds-danger, #ef4444); box-shadow: 0 0 0 3px rgb(239 68 68 / 0.15); }\n`\n\nconst Textarea: FC<TextareaProps> = ({ error, style, ...props }) => (\n <>\n <style href=\"ds-textarea\" precedence=\"low\">{textareaCSS}</style>\n <textarea\n data-ds-textarea=\"\"\n data-error={error ? 'true' : undefined}\n style={{\n width: '100%',\n padding: '0.5rem 0.75rem',\n border: `1px solid ${error ? 'var(--ds-danger, #ef4444)' : 'var(--ds-border, #e2e8f0)'}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n backgroundColor: 'var(--ds-card, #fff)',\n color: 'var(--ds-text-primary, #0f172a)',\n fontFamily: 'inherit',\n resize: 'vertical',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n minHeight: '6rem',\n boxSizing: 'border-box',\n ...style,\n }}\n {...props}\n />\n </>\n)\n\nexport default Textarea\n\n/*\n * Textarea\n *\n * Renders a styled multi-line text area with an optional error border state.\n *\n * Props:\n * error (boolean, optional) — applies an error border style\n * ...rest — any valid HTML textarea attribute (placeholder, value, onChange, rows, disabled, etc.)\n *\n * Usage:\n * <Textarea placeholder=\"Write your message...\" rows={4} onChange={handleChange} />\n * <Textarea error value={notes} onChange={e => setNotes(e.target.value)} />\n */\n","'use client'\n\nimport React, { FC, ReactNode, useState } from 'react'\n\ninterface TooltipProps {\n content: string\n children: ReactNode\n position?: 'top' | 'bottom' | 'left' | 'right'\n}\n\ntype TooltipPosition = 'top' | 'bottom' | 'left' | 'right'\n\nconst positionStyle: Record<TooltipPosition, React.CSSProperties> = {\n top: { bottom: 'calc(100% + 8px)', left: '50%', transform: 'translateX(-50%)' },\n bottom: { top: 'calc(100% + 8px)', left: '50%', transform: 'translateX(-50%)' },\n left: { right: 'calc(100% + 8px)', top: '50%', transform: 'translateY(-50%)' },\n right: { left: 'calc(100% + 8px)', top: '50%', transform: 'translateY(-50%)' },\n}\n\nconst tooltipCSS = `\n[data-ds-tt]::before {\n content: '';\n position: absolute;\n border: 5px solid transparent;\n}\n[data-ds-tt=\"top\"]::before { top: 100%; left: 50%; transform: translateX(-50%); border-top-color: var(--ds-tooltip-bg, #0f172a); }\n[data-ds-tt=\"bottom\"]::before { bottom: 100%; left: 50%; transform: translateX(-50%); border-bottom-color: var(--ds-tooltip-bg, #0f172a); }\n[data-ds-tt=\"left\"]::before { left: 100%; top: 50%; transform: translateY(-50%); border-left-color: var(--ds-tooltip-bg, #0f172a); }\n[data-ds-tt=\"right\"]::before { right: 100%; top: 50%; transform: translateY(-50%); border-right-color: var(--ds-tooltip-bg, #0f172a); }\n`\n\nconst Tooltip: FC<TooltipProps> = ({ content, children, position = 'top' }) => {\n const [visible, setVisible] = useState(false)\n\n return (\n <>\n <style href=\"ds-tooltip\" precedence=\"low\">{tooltipCSS}</style>\n <span\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n onFocus={() => setVisible(true)}\n onBlur={() => setVisible(false)}\n >\n {children}\n <span\n role=\"tooltip\"\n data-ds-tt={position}\n style={{\n position: 'absolute',\n zIndex: 50,\n padding: '0.375rem 0.625rem',\n backgroundColor: 'var(--ds-tooltip-bg, #0f172a)',\n color: 'var(--ds-tooltip-text, #ffffff)',\n fontSize: '0.75rem',\n lineHeight: 1.4,\n borderRadius: '0.375rem',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n opacity: visible ? 1 : 0,\n transition: 'opacity 0.15s',\n ...positionStyle[position],\n }}\n >\n {content}\n </span>\n </span>\n </>\n )\n}\n\nexport default Tooltip\n\n/*\n * Tooltip\n *\n * Wraps any element and shows a text tooltip on hover in the given direction.\n *\n * Props:\n * content (string, required) — text shown inside the tooltip\n * children (ReactNode, required) — the element the tooltip is attached to\n * position (\"top\" | \"bottom\" | \"left\" | \"right\", optional) — defaults to \"top\"\n *\n * Usage:\n * <Tooltip content=\"Delete this item\"><button>Delete</button></Tooltip>\n * <Tooltip content=\"More info\" position=\"right\"><InfoIcon /></Tooltip>\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAgB,eAAe,YAAY,gBAAgB;AAsB/C;AAZZ,IAAM,eAAe,cAAwC,IAAI;AAE1D,IAAM,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EACA,eAAe;AACnB,MAGM;AACF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,YAAY;AACtD,SACI,oBAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,OAAO,QAAQ,MAAM,SAAS,OAAK,MAAM,UAAU,SAAS,OAAO,EAAE,GACjG,8BAAC,SAAI,WAAW,UAAU,SAAS,kBAAkB,QAChD,UACL,GACJ;AAER;AAEO,IAAM,WAAW,MAAM;AAC1B,QAAM,MAAM,WAAW,YAAY;AACnC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8CAA8C;AACxE,SAAO;AACX;;;AChCA,SAAoB,YAAAA,iBAAgB;AACpC,SAAS,mBAAmB;AAoDJ,SAqBI,OAAAC,MArBJ;AAtCxB,IAAM,YAAgC,CAAC,EAAE,OAAO,cAAc,WAAW,MAAM,MAAM;AACjF,QAAM,CAAC,MAAM,OAAO,IAAID,UAAsB,MAAM;AAChD,QAAI,CAAC,aAAc,QAAO,oBAAI,IAAI;AAClC,QAAI,MAAM,QAAQ,YAAY,EAAG,QAAO,IAAI,IAAI,YAAY;AAC5D,WAAO,oBAAI,IAAI,CAAC,YAAY,CAAC;AAAA,EACjC,CAAC;AACD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAE1D,QAAM,SAAS,CAAC,UAAkB;AAC9B,YAAQ,UAAQ;AACZ,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,KAAK,GAAG;AACjB,aAAK,OAAO,KAAK;AAAA,MACrB,OAAO;AACH,YAAI,CAAC,SAAU,MAAK,MAAM;AAC1B,aAAK,IAAI,KAAK;AAAA,MAClB;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,SACI,gBAAAC,KAAC,SAAI,OAAO;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,EACd,GACK,gBAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,SAAS,KAAK,IAAI,KAAK,KAAK;AAClC,UAAM,YAAY,YAAY,KAAK;AACnC,UAAM,SAAS,UAAU,MAAM,SAAS;AACxC,WACI;AAAA,MAAC;AAAA;AAAA,QAEG,OAAO;AAAA,UACH,cAAc,SAAS,SAAS;AAAA,QACpC;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,gBACH,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY,YAAY,6BAA6B;AAAA,gBACrD,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,YAAY;AAAA,cAChB;AAAA,cACA,SAAS,MAAM,OAAO,KAAK,KAAK;AAAA,cAChC,cAAc,MAAM,WAAW,KAAK,KAAK;AAAA,cACzC,cAAc,MAAM,WAAW,IAAI;AAAA,cACnC,iBAAe;AAAA,cAEf;AAAA,gCAAAA,KAAC,UAAM,eAAK,SAAQ;AAAA,gBACpB,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAM;AAAA,oBACN,OAAO;AAAA,sBACH,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,WAAW,SAAS,mBAAmB;AAAA,oBAC3C;AAAA;AAAA,gBACJ;AAAA;AAAA;AAAA,UACJ;AAAA,UACA,gBAAAA,KAAC,SAAI,OAAO;AAAA,YACR,WAAW,SAAS,UAAU;AAAA,YAC9B,UAAU;AAAA,YACV,YAAY;AAAA,UAChB,GACI,0BAAAA,KAAC,SAAI,OAAO;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO;AAAA,UACX,GACK,eAAK,SACV,GACJ;AAAA;AAAA;AAAA,MAjDK,KAAK;AAAA,IAkDd;AAAA,EAER,CAAC,GACL;AAER;AAEA,IAAO,oBAAQ;;;AC1Gf,SAAS,MAAM,cAAc,eAAe,mBAAmB;AAkBlD,gBAAAC,MAkBD,QAAAC,aAlBC;AARb,IAAM,aAA8G;AAAA,EAChH,MAAS,EAAE,IAAI,8BAAiC,QAAQ,2BAA8B,MAAM,2BAA8B,OAAO,iCAAoC,MAAM,+BAA+B;AAAA,EAC1M,SAAS,EAAE,IAAI,iCAAiC,QAAQ,8BAA8B,MAAM,8BAA8B,OAAO,oCAAoC,MAAM,kCAAkC;AAAA,EAC7M,SAAS,EAAE,IAAI,iCAAiC,QAAQ,8BAA8B,MAAM,8BAA8B,OAAO,oCAAoC,MAAM,kCAAkC;AAAA,EAC7M,QAAS,EAAE,IAAI,gCAAiC,QAAQ,6BAA8B,MAAM,6BAA8B,OAAO,mCAAmC,MAAM,iCAAiC;AAC/M;AAEA,IAAM,QAAyC;AAAA,EAC3C,MAAS,gBAAAD,KAAC,QAAK,MAAM,IAAI;AAAA,EACzB,SAAS,gBAAAA,KAAC,gBAAa,MAAM,IAAI;AAAA,EACjC,SAAS,gBAAAA,KAAC,iBAAc,MAAM,IAAI;AAAA,EAClC,QAAS,gBAAAA,KAAC,eAAY,MAAM,IAAI;AACpC;AAEA,IAAM,QAAwB,CAAC,EAAE,UAAU,QAAQ,OAAO,YAAY,MAAM;AACxE,QAAM,IAAI,WAAW,OAAO;AAC5B,SACI,gBAAAC,MAAC,SAAI,MAAK,SAAQ,OAAO;AAAA,IACrB,SAAS;AAAA,IACT,KAAK;AAAA,IACL,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY,aAAa,EAAE,MAAM;AAAA,IACjC,iBAAiB,EAAE;AAAA,EACvB,GACI;AAAA,oBAAAD,KAAC,UAAK,OAAO,EAAE,YAAY,GAAG,WAAW,YAAY,OAAO,EAAE,KAAK,GAAI,gBAAM,OAAO,GAAE;AAAA,IACtF,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GAClB;AAAA,sBAAAD,KAAC,OAAE,OAAO,EAAE,YAAY,KAAK,UAAU,YAAY,cAAc,WAAW,WAAW,GAAG,OAAO,EAAE,MAAM,GAAI,iBAAM;AAAA,MACnH,gBAAAA,KAAC,OAAE,OAAO,EAAE,UAAU,YAAY,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAI,uBAAY;AAAA,OAC/E;AAAA,KACJ;AAER;AAEA,IAAO,gBAAQ;;;AC3BX,gBAAAE,YAAA;AAPJ,IAAM,UAAmD;AAAA,EACrD,IAAI,EAAE,OAAO,QAAU,QAAQ,QAAU,UAAU,WAAW;AAAA,EAC9D,IAAI,EAAE,OAAO,UAAU,QAAQ,UAAU,UAAU,WAAW;AAAA,EAC9D,IAAI,EAAE,OAAO,QAAU,QAAQ,QAAU,UAAU,UAAW;AAClE;AAEA,IAAM,SAA0B,CAAC,EAAE,UAAU,OAAO,MAAM,OAAO,UAAU,MACvE,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,cAAY;AAAA,IACZ,OAAO;AAAA,MACH,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,OACT,QAAQ,IAAI,IACZ;AAAA,IAGN;AAAA;AACL;AAGJ,IAAO,iBAAQ;;;ACVX,gBAAAC,YAAA;AAjBJ,IAAMC,cAAwD;AAAA,EAC1D,SAAW,EAAE,iBAAiB,8BAA8B,OAAO,OAAO;AAAA,EAC1E,WAAW,EAAE,iBAAiB,4BAA8B,OAAO,oCAAoC;AAAA,EACvG,SAAW,EAAE,iBAAiB,eAAe,QAAQ,uCAAuC,OAAO,kCAAkC;AAAA,EACrI,QAAW,EAAE,iBAAiB,6BAA8B,OAAO,OAAO;AAAA,EAC1E,SAAW,EAAE,iBAAiB,8BAA8B,OAAO,OAAO;AAAA,EAC1E,SAAW,EAAE,iBAAiB,8BAA8B,OAAO,OAAO;AAAA,EAC1E,MAAW,EAAE,iBAAiB,2BAA8B,OAAO,OAAO;AAC9E;AAEA,IAAMC,WAAkD;AAAA,EACpD,IAAI,EAAE,SAAS,mBAAsB,UAAU,WAAW;AAAA,EAC1D,IAAI,EAAE,SAAS,oBAAsB,UAAU,UAAW;AAAA,EAC1D,IAAI,EAAE,SAAS,qBAAsB,UAAU,WAAW;AAC9D;AAEA,IAAM,QAAwB,CAAC,EAAE,UAAU,WAAW,OAAO,MAAM,UAAU,MAAM,MAC/E,gBAAAF,KAAC,UAAK,OAAO;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,GACTC,YAAW,OAAO,IAClBC,SAAQ,IAAI,IACZ,QAEF,UACL;AAGJ,IAAO,gBAAQ;;;AC1Cf,SAAoB,YAAAC,iBAAgB;AACpC,SAAS,oBAAoB;AA6BL,SAEQ,OAAAC,MAFR,QAAAC,aAAA;AAlBxB,IAAM,aAAkC,CAAC,EAAE,MAAM,MAAM;AACnD,QAAM,CAAC,SAAS,UAAU,IAAIF,UAAwB,IAAI;AAE1D,SACI,gBAAAC,KAAC,SAAI,cAAW,cACZ,0BAAAA,KAAC,QAAG,OAAO;AAAA,IACP,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,EACd,GACK,gBAAM,IAAI,CAAC,MAAM,MAAM;AACpB,UAAM,SAAS,MAAM,MAAM,SAAS;AACpC,UAAM,YAAY,YAAY,KAAK;AACnC,WACI,gBAAAC,MAAC,QAAoB,OAAO,EAAE,SAAS,QAAQ,YAAY,SAAS,GAC/D;AAAA,UAAI,KACD,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,MAAM;AAAA,UACN,eAAW;AAAA,UACX,OAAO,EAAE,OAAO,qCAAqC,QAAQ,aAAa,YAAY,EAAE;AAAA;AAAA,MAC5F;AAAA,MAEH,UAAU,CAAC,KAAK,OACb,gBAAAA,KAAC,UAAK,OAAO;AAAA,QACT,OAAO,SAAS,oCAAoC;AAAA,QACpD,YAAY,SAAS,MAAM;AAAA,QAC3B,QAAQ,SAAS,YAAY;AAAA,MACjC,GACK,eAAK,OACV,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAM,KAAK;AAAA,UACX,cAAc,MAAM,WAAW,KAAK,KAAK;AAAA,UACzC,cAAc,MAAM,WAAW,IAAI;AAAA,UACnC,OAAO;AAAA,YACH,OAAO;AAAA,YACP,gBAAgB,YAAY,cAAc;AAAA,YAC1C,YAAY;AAAA,UAChB;AAAA,UAEC,eAAK;AAAA;AAAA,MACV;AAAA,SA5BC,KAAK,KA8Bd;AAAA,EAER,CAAC,GACL,GACJ;AAER;AAEA,IAAO,qBAAQ;;;ACpEf,SAAS,oBAAoB;AAC7B,SAAqD,YAAAE,iBAAgB;AAyG7D,mBAEA,OAAAC,MACA,QAAAC,aAHA;AAjFR,IAAM,gBAA4D;AAAA,EAC9D,OAAS,EAAE,iBAAiB,8BAA+B,OAAO,QAAQ,aAAa,cAAc;AAAA,EACrG,SAAS,EAAE,iBAAiB,eAAgC,OAAO,8BAA8B,aAAa,6BAA6B;AAAA,EAC3I,OAAS,EAAE,iBAAiB,4BAA+B,OAAO,mCAAmC,aAAa,cAAc;AAAA,EAChI,QAAS,EAAE,iBAAiB,6BAA+B,OAAO,QAAQ,aAAa,cAAc;AAAA,EACrG,SAAS,EAAE,iBAAiB,8BAA+B,OAAO,QAAQ,aAAa,cAAc;AAAA,EACrG,MAAS,EAAE,iBAAiB,2BAA+B,OAAO,QAAQ,aAAa,cAAc;AAAA,EACrG,SAAS,EAAE,iBAAiB,8BAA+B,OAAO,QAAQ,aAAa,cAAc;AACzG;AAEA,IAAM,qBAAiE;AAAA,EACnE,OAAS,EAAE,SAAS,KAAK;AAAA,EACzB,SAAS,EAAE,iBAAiB,2BAA2B;AAAA,EACvD,OAAS,EAAE,iBAAiB,0BAA0B;AAAA,EACtD,QAAS,EAAE,SAAS,KAAK;AAAA,EACzB,SAAS,EAAE,SAAS,KAAK;AAAA,EACzB,MAAS,EAAE,SAAS,KAAK;AAAA,EACzB,SAAS,EAAE,SAAS,KAAK;AAC7B;AAEA,IAAM,aAAsD;AAAA,EACxD,IAAI,EAAE,SAAS,oBAAoB,UAAU,SAAS;AAAA,EACtD,IAAI,EAAE,SAAS,eAAoB,UAAU,WAAW;AAAA,EACxD,IAAI,EAAE,SAAS,kBAAoB,UAAU,OAAO;AACxD;AAEA,IAAM,SAA0B,CAAC,OAmB3B;AAnB2B,eAC7B;AAAA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA,eAAe;AAAA,IACf,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,OAAO;AAAA,EAtEX,IAqDiC,IAkB1B,kBAlB0B,IAkB1B;AAAA,IAjBH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAGA,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAE5C,QAAM,kBACF,4BACC,SAAS,WACN,UAAU,YACN,OAAO,SACH,UAAU,YACN,QAAQ,UACJ,UAAU,YACN;AAE5B,QAAM,eAA2B,sBAAS,QAAQ,OAAO,QAAQ,OAAO;AACxE,QAAM,aAAa,YAAY;AAC/B,QAAM,UAAU,8BAAY;AAC5B,QAAM,WAAW,QAAQ,CAAC;AAE1B,QAAM,gBAAqC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ,aAAa,gBAAgB;AAAA,IACrC,YAAY;AAAA,IACZ,SAAS,aAAa,MAAM;AAAA,IAC5B,eAAe,UAAU,SAAS;AAAA,KAC/B,cAAc,eAAe,IAC7B,WAAW,YAAY,IACtB,WAAW,CAAC,aAAa,mBAAmB,eAAe,IAAI,CAAC,IACjE;AAGP,SACI,gBAAAD,MAAA,YAEA;AAAA,oBAAAD,KAAC,WAAM,MAAK,WAAU,YAAW,OAAO,sEAA2D;AAAA,IACnG,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,UAAU;AAAA,QACV,OAAO;AAAA,QACP,cAAc,MAAM,WAAW,IAAI;AAAA,QACnC,cAAc,MAAM,WAAW,KAAK;AAAA,SAChC,QALP;AAAA,QAOI;AAAA,oBACK,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,OAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,WAAW,gCAAgC;AAAA;AAAA,UACnF,IACA;AAAA,UACL,YAAY,iBAAiB,SAAS,OAAO;AAAA,UAC7C;AAAA,UACA,YAAY,iBAAiB,UAAU,OAAO;AAAA;AAAA;AAAA,IACnD;AAAA,KACA;AAER;AAEA,IAAO,iBAAQ;;;ACjIX,gBAAAG,YAAA;AADG,IAAM,OAA2C,CAAC,OAAqB;AAArB,eAAE,QAF3D,IAEyD,IAAY,kBAAZ,IAAY,CAAV;AACvD,yBAAAA,KAAC,wBAAI,OAAO;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,iBAAiB;AAAA,KACd,UACA,MAAO;AAAA;AAGX,IAAM,aAAiD,CAAC,OAAqB;AAArB,eAAE,QAXjE,IAW+D,IAAY,kBAAZ,IAAY,CAAV;AAC7D,yBAAAA,KAAC,wBAAI,OAAO;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,SAAS;AAAA,KACN,UACA,MAAO;AAAA;AAGX,IAAM,YAAoD,CAAC,OAAqB;AAArB,eAAE,QArBpE,IAqBkE,IAAY,kBAAZ,IAAY,CAAV;AAChE,yBAAAA,KAAC,uBAAG,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,KACT,UACA,MAAO;AAAA;AAGX,IAAM,kBAA4D,CAAC,OAAqB;AAArB,eAAE,QAhC5E,IAgC0E,IAAY,kBAAZ,IAAY,CAAV;AACxE,yBAAAA,KAAC,sBAAE,OAAO;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,KACL,UACA,MAAO;AAAA;AAGX,IAAM,cAAkD,CAAC,OAAqB;AAArB,eAAE,QAzClE,IAyCgE,IAAY,kBAAZ,IAAY,CAAV;AAC9D,yBAAAA,KAAC,wBAAI,OAAO,iBAAE,SAAS,YAAa,UAAa,MAAO;AAAA;AAGrD,IAAM,aAAiD,CAAC,OAAqB;AAArB,eAAE,QA7CjE,IA6C+D,IAAY,kBAAZ,IAAY,CAAV;AAC7D,yBAAAA,KAAC,wBAAI,OAAO;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,KACN,UACA,MAAO;AAAA;;;ACjDlB,SAAoB,YAAAC,iBAAgB;AA8B5B,SAQI,OAAAC,MARJ,QAAAC,aAAA;AAnBR,IAAM,WAA8B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,UAAU,WAAW,IAAIF,UAAS,cAAc;AACvD,QAAM,YAAY,YAAY,SAAY,UAAU;AAEpD,QAAM,eAAe,MAAM;AACvB,QAAI,SAAU;AACd,UAAM,OAAO,CAAC;AACd,gBAAY,IAAI;AAChB,yCAAW;AAAA,EACf;AAEA,SACI,gBAAAE,MAAC,WAAM,SAAS,IAAI,OAAO;AAAA,IACvB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ,WAAW,gBAAgB;AAAA,IACnC,YAAY;AAAA,IACZ,SAAS,WAAW,MAAM;AAAA,EAC9B,GACI;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,OAAO,EAAE,UAAU,YAAY,SAAS,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA;AAAA,IACnE;AAAA,IACA,gBAAAA,KAAC,UAAK,OAAO;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,aAAa,YAAY,+BAA+B,2BAA2B;AAAA,MAC3F,cAAc;AAAA,MACd,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,iBAAiB,YAAY,+BAA+B;AAAA,IAChE,GACK,uBACG,gBAAAA,KAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,OAAO,EAAE,OAAO,YAAY,QAAQ,WAAW,GAChF,0BAAAA,KAAC,UAAK,GAAE,qBAAoB,QAAO,SAAQ,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAQ,GAC5G,GAER;AAAA,IACC,SACG,gBAAAA,KAAC,UAAK,OAAO,EAAE,UAAU,YAAY,OAAO,kCAAkC,GAAI,iBAAM;AAAA,KAEhG;AAER;AAEA,IAAO,mBAAQ;;;ACvEf,SAAS,OAAO,YAAY;AAC5B,SAAoB,YAAAE,iBAAgB;AAoClB,gBAAAC,aAAA;AA9BlB,IAAM,aAAkC,CAAC,EAAE,KAAK,MAAM;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAID,UAAS,KAAK;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,aAAa,MAAM;AACrB,cAAU,UAAU,UAAU,IAAI;AAClC,cAAU,IAAI;AACd,eAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EAC3C;AAEA,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,SAAS;AAAA,MACT,cAAc,MAAM,WAAW,IAAI;AAAA,MACnC,cAAc,MAAM,WAAW,KAAK;AAAA,MACpC,cAAY,SAAS,WAAW,QAAQ,IAAI;AAAA,MAC5C,OAAO;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,iBAAiB,UAAU,8BAA8B;AAAA,QACzD,OAAO,UAAU,oCAAoC;AAAA,QACrD,QAAQ;AAAA,QACR,YAAY;AAAA,MAChB;AAAA,MAEC,mBACK,gBAAAA,MAAC,SAAM,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG,IACjD,gBAAAA,MAAC,QAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG;AAAA;AAAA,EAE1D;AAER;AAEA,IAAO,qBAAQ;;;AC5Cf,SAAS,cAAc;AACvB,SAAoB,QAAQ,YAAAC,iBAAgB;AAiDhC,gBAAAC,OAcM,QAAAC,aAdN;AAxCZ,IAAM,aAAkC,CAAC,EAAE,QAAQ,UAAU,UAAU,aAAa,MAAM;AACtF,QAAM,CAAC,YAAY,aAAa,IAAIF,UAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAmB,CAAC,CAAC;AACvD,QAAM,WAAW,OAAyB,IAAI;AAE9C,QAAM,cAAc,CAAC,SAAmB;AACpC,iBAAa,MAAM,KAAK,IAAI,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC;AAC9C,iDAAe;AAAA,EACnB;AAEA,QAAM,WAAW,cAAc;AAE/B,SACI,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACG,SAAS,MAAG;AA3BxB;AA2B2B,gBAAC,cAAY,cAAS,YAAT,mBAAkB;AAAA;AAAA,MAC9C,cAAc,MAAM,CAAC,YAAY,aAAa,IAAI;AAAA,MAClD,cAAc,MAAM,aAAa,KAAK;AAAA,MACtC,YAAY,CAAC,MAAM;AAAE,UAAE,eAAe;AAAG,sBAAc,IAAI;AAAA,MAAE;AAAA,MAC7D,aAAa,MAAM,cAAc,KAAK;AAAA,MACtC,QAAQ,CAAC,MAAM;AACX,UAAE,eAAe;AACjB,sBAAc,KAAK;AACnB,YAAI,CAAC,YAAY,EAAE,aAAa,MAAM,OAAQ,aAAY,EAAE,aAAa,KAAK;AAAA,MAClF;AAAA,MACA,OAAO;AAAA,QACH,QAAQ,cAAc,WAAW,+BAA+B,2BAA2B;AAAA,QAC3F,cAAc;AAAA,QACd,SAAS;AAAA,QACT,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,QAAQ,WAAW,gBAAgB;AAAA,QACnC,iBAAiB,WAAW,kCAAkC;AAAA,QAC9D,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS,WAAW,MAAM;AAAA,MAC9B;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,MAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,EAAE,SAAS,OAAO;AAAA,YACzB,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS,YAAY,EAAE,OAAO,KAAK;AAAA;AAAA,QACjE;AAAA,QACA,gBAAAA,MAAC,UAAO,MAAM,IAAI,OAAO,EAAE,OAAO,oCAAoC,GAAG;AAAA,QACxE,UAAU,SAAS,IACd,gBAAAA,MAAC,OAAE,OAAO,EAAE,UAAU,YAAY,OAAO,8BAA8B,YAAY,KAAK,QAAQ,EAAE,GAC/F,oBAAU,KAAK,IAAI,GACtB,IACA,gBAAAC,MAAC,OAAE,OAAO,EAAE,UAAU,YAAY,OAAO,qCAAqC,QAAQ,EAAE,GACtF;AAAA,0BAAAD,MAAC,YAAO,6BAAe;AAAA,UAAS;AAAA,WAClC;AAAA;AAAA;AAAA,EAEV;AAER;AAEA,IAAO,qBAAQ;;;ACxDX,qBAAAE,WACI,OAAAC,OACA,QAAAC,aAFJ;AATJ,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjB,IAAM,QAAwB,CAAC,OAA0D;AAA1D,eAAE,SAAO,SAAS,UAAU,WAAW,MAjBtE,IAiB+B,IAAiD,kBAAjD,IAAiD,CAA/C,SAAO,WAAS,YAAU,aAAW;AAClE,yBAAAA,MAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,YAAW,YAAW,OAAO,oBAAS;AAAA,IAClD,gBAAAC,MAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,QAAQ,YAAY,UAAU,OAAO,OAAO,GACpF;AAAA,kBACG,gBAAAD,MAAC,UAAK,OAAO;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,eAAe;AAAA,MACnB,GACK,oBACL;AAAA,MAEJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,iBAAc;AAAA,UACd,cAAY,QAAQ,SAAS;AAAA,UAC7B,gBAAc,UAAU,SAAS;AAAA,UACjC,OAAO;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,aAAa,WAAW,YAAY;AAAA,YACpC,cAAc,YAAY,YAAY;AAAA,YACtC,QAAQ,aAAa,QAAQ,8BAA8B,UAAU,+BAA+B,2BAA2B;AAAA,YAC/H,cAAc;AAAA,YACd,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,YAAY;AAAA,aACT;AAAA,WAEH;AAAA,MACR;AAAA,MACC,aACG,gBAAAA,MAAC,UAAK,OAAO;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,eAAe;AAAA,MACnB,GACK,qBACL;AAAA,OAER;AAAA,KACJ;AAAA;AAGJ,IAAO,gBAAQ;;;AChEX,SAUQ,OAAAE,OAVR,QAAAC,aAAA;AADJ,IAAM,QAAwB,CAAC,OAAyC;AAAzC,eAAE,YAAU,UAAU,MANrD,IAM+B,IAAgC,kBAAhC,IAAgC,CAA9B,YAAU,YAAU;AACjD,yBAAAA,MAAC,wCAAM,OAAO;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,cAAc;AAAA,KACX,UACA,QAPN,EAQI;AAAA;AAAA,IACA,YACG,gBAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,6BAA6B,YAAY,UAAU,GAAG,eAAC;AAAA,MAErF;AAAA;AAGJ,IAAO,gBAAQ;;;ACpBf,SAAS,KAAK,cAAc;AAC5B,SAAyC,YAAAE,iBAAgB;AAmB1B,gBAAAC,aAAA;AAd/B,IAAM,gBAAwC,CAAC,UAAU;AACrD,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAE5C,SACI,gBAAAD;AAAA,IAAC;AAAA,qCACO,QADP;AAAA,MAEG,MAAM,UAAU,SAAS;AAAA,MACzB,WACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,MAAM,WAAW,OAAK,CAAC,CAAC;AAAA,UACjC,OAAO,EAAE,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,SAAS,GAAG,SAAS,QAAQ,eAAe,MAAM;AAAA,UAClH,UAAU;AAAA,UAET,oBAAU,gBAAAA,MAAC,UAAO,MAAM,IAAI,IAAK,gBAAAA,MAAC,OAAI,MAAM,IAAI;AAAA;AAAA,MACrD;AAAA;AAAA,EAER;AAER;AAEA,IAAO,wBAAQ;;;ACPH,gBAAAE,aAAA;AAhBZ,IAAM,WAA8B,CAAC,EAAE,QAAQ,EAAE,MAAM;AACnD,QAAM,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAC5C,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,OAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,UAAU;AAAA,MACd;AAAA,MAEA,0BAAAA,MAAC,SAAI,OAAO;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,GAAG,GAAG;AAAA,QACb,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,YAAY;AAAA,MAChB,GAAG;AAAA;AAAA,EACP;AAER;AAEA,IAAO,mBAAQ;;;AC/Bf,SAAoB,YAAAC,iBAAgB;AAsChB,SAQI,OAAAC,OARJ,QAAAC,aAAA;AAtBpB,IAAM,aAAkC,CAAC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,UAAU,WAAW,IAAIF,UAAS,YAAY;AACrD,QAAM,WAAW,UAAU,SAAY,QAAQ;AAE/C,QAAM,eAAe,CAAC,QAAgB;AAClC,QAAI,SAAU;AACd,gBAAY,GAAG;AACf,yCAAW;AAAA,EACf;AAEA,SACI,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAS,GACjE,kBAAQ,IAAI,CAAC,WAAW;AACrB,UAAM,aAAa,aAAa,OAAO;AACvC,WACI,gBAAAC,MAAC,WAAyB,OAAO;AAAA,MAC7B,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,QAAQ,WAAW,gBAAgB;AAAA,MACnC,YAAY;AAAA,MACZ,SAAS,WAAW,MAAM;AAAA,IAC9B,GACI;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL;AAAA,UACA,OAAO,OAAO;AAAA,UACd,SAAS;AAAA,UACT;AAAA,UACA,UAAU,MAAM,aAAa,OAAO,KAAK;AAAA,UACzC,OAAO,EAAE,UAAU,YAAY,SAAS,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA;AAAA,MACnE;AAAA,MACA,gBAAAA,MAAC,UAAK,OAAO;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,QAAQ,aAAa,aAAa,+BAA+B,2BAA2B;AAAA,QAC5F,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,YAAY;AAAA,MAChB,GACK,wBACG,gBAAAA,MAAC,UAAK,OAAO;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,iBAAiB;AAAA,MACrB,GAAG,GAEX;AAAA,MACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,YAAY,OAAO,kCAAkC,GACzE,iBAAO,OACZ;AAAA,SAxCQ,OAAO,KAyCnB;AAAA,EAER,CAAC,GACL;AAER;AAEA,IAAO,qBAAQ;;;ACtFf,SAAS,SAAAE,QAAO,eAAAC,oBAAmB;AACnC,SAAoB,WAAW,UAAAC,SAAQ,YAAAC,kBAAgB;AAmD/C,qBAAAC,WACI,OAAAC,OAOI,QAAAC,cARR;AAnCR,IAAM,YAAY;AAAA;AAAA;AAIlB,IAAM,SAA0B,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd;AAAA,EACA;AACJ,MAAM;AA9BN;AA+BI,QAAM,CAAC,UAAU,WAAW,IAAIH,WAAS,YAAY;AACrD,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAwB,IAAI;AACtE,QAAM,MAAMD,QAAuB,IAAI;AAEvC,QAAM,WAAW,UAAU,SAAY,QAAQ;AAC/C,QAAM,iBAAgB,aAAQ,KAAK,OAAK,EAAE,UAAU,QAAQ,MAAtC,mBAAyC;AAE/D,QAAM,eAAe,CAAC,QAAgB;AAClC,gBAAY,GAAG;AACf,YAAQ,KAAK;AACb,yCAAW;AAAA,EACf;AAEA,YAAU,MAAM;AACZ,UAAM,gBAAgB,CAAC,MAAkB;AACrC,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAc,EAAG,SAAQ,KAAK;AAAA,IAC7E;AACA,aAAS,iBAAiB,aAAa,aAAa;AACpD,WAAO,MAAM,SAAS,oBAAoB,aAAa,aAAa;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,SACI,gBAAAI,OAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,aAAY,YAAW,OAAO,qBAAU;AAAA,IACpD,gBAAAC,OAAC,SAAI,KAAU,OAAO;AAAA,MAClB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS,WAAW,MAAM;AAAA,MAC1B,eAAe,WAAW,SAAS;AAAA,IACvC,GACI;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,0BAAuB;AAAA,UACvB,SAAS,MAAM,CAAC,YAAY,QAAQ,OAAK,CAAC,CAAC;AAAA,UAC3C;AAAA,UACA,OAAO;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,QAAQ,aAAa,OAAO,+BAA+B,2BAA2B;AAAA,YACtF,cAAc;AAAA,YACd,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,KAAK;AAAA,YACL,WAAW,OAAO,qCAAqC;AAAA,YACvD,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,YAAY;AAAA,UAChB;AAAA,UAEA;AAAA,4BAAAD,MAAC,UAAK,OAAO,EAAE,OAAO,gBAAgB,oCAAoC,oCAAoC,GACzG,kDAAiB,aACtB;AAAA,YACA,gBAAAA;AAAA,cAACJ;AAAA,cAAA;AAAA,gBACG,MAAM;AAAA,gBACN,OAAO;AAAA,kBACH,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,WAAW,OAAO,mBAAmB;AAAA,gBACzC;AAAA;AAAA,YACJ;AAAA;AAAA;AAAA,MACJ;AAAA,MACC,QACG,gBAAAI,MAAC,SAAI,OAAO;AAAA,QACR,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,MACd,GACK,kBAAQ,IAAI,CAAC,WAAW;AACrB,cAAM,aAAa,aAAa,OAAO;AACvC,cAAM,YAAY,kBAAkB,OAAO;AAC3C,eACI,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEG,SAAS,MAAM,aAAa,OAAO,KAAK;AAAA,YACxC,cAAc,MAAM,iBAAiB,OAAO,KAAK;AAAA,YACjD,cAAc,MAAM,iBAAiB,IAAI;AAAA,YACzC,OAAO;AAAA,cACH,SAAS;AAAA,cACT,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,OAAO;AAAA,cACP,iBAAiB,cAAc,YAAY,6BAA6B;AAAA,cACxE,YAAY,aAAa,MAAM;AAAA,cAC/B,YAAY;AAAA,YAChB;AAAA,YAEC;AAAA,2BACK,gBAAAD,MAACL,QAAA,EAAM,MAAM,IAAI,OAAO,EAAE,OAAO,8BAA8B,YAAY,EAAE,GAAG,IAChF,gBAAAK,MAAC,UAAK,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,GAAG;AAAA,cAEhD,OAAO;AAAA;AAAA;AAAA,UArBH,OAAO;AAAA,QAsBhB;AAAA,MAER,CAAC,GACL;AAAA,OAER;AAAA,KACJ;AAER;AAEA,IAAO,iBAAQ;;;AC5IX,qBAAAE,WACI,OAAAC,OADJ,QAAAC,cAAA;AADJ,IAAM,WAA8B,CAAC,EAAE,SAAS,QAAQ,QAAQ,QAAQ,SAAS,MAAM,MACnF,gBAAAA,OAAAF,WAAA,EACI;AAAA,kBAAAC,MAAC,WAAM,MAAK,eAAc,YAAW,OAAO;AAAA;AAAA;AAAA,WAG1C;AAAA,EACF,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,oBAAiB;AAAA,MACjB,eAAY;AAAA,MACZ,OAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,cAAc,SAAS,WAAW;AAAA,MACtC;AAAA;AAAA,EACJ;AAAA,GACJ;AAGJ,IAAO,mBAAQ;;;ACzBf,SAAoB,YAAAE,kBAAgB;AA0E5B,qBAAAC,WACI,OAAAC,OADJ,QAAAC,cAAA;AA9DR,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0ClB,IAAM,SAA0B,CAAC;AAAA,EAC7B;AAAA,EACA,eAAe;AAAA,EACf,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,UAAU,WAAW,IAAIH,WAAS,YAAY;AACrD,QAAM,UAAU,UAAU,SAAY,QAAQ;AAC9C,QAAM,OAAO,IAAK,UAAU,QAAQ,MAAM,OAAQ,GAAG;AAErD,QAAM,eAAe,CAAC,MAA2C;AAC7D,UAAM,MAAM,OAAO,EAAE,OAAO,KAAK;AACjC,gBAAY,GAAG;AACf,yCAAW;AAAA,EACf;AAEA,SACI,gBAAAG,OAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,aAAY,YAAW,OAAO,qBAAU;AAAA,IACpD,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,SAAS,WAAW,MAAM;AAAA,IAC9B,GACI,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,kBAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,UAAU;AAAA,QACV,OAAO,EAAE,UAAU,KAAK;AAAA;AAAA,IAC5B,GACJ;AAAA,KACJ;AAER;AAEA,IAAO,iBAAQ;;;AClGf,SAAS,eAAe;AAWpB,qBAAAE,WACI,OAAAC,OADJ,QAAAC,cAAA;AAHJ,IAAM,SAAsC,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAErE,IAAM,UAA4B,CAAC,EAAE,OAAO,KAAK,MAC7C,gBAAAA,OAAAF,WAAA,EACI;AAAA,kBAAAC,MAAC,WAAM,MAAK,WAAU,YAAW,OAAO,sEAA2D;AAAA,EACnG,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAM,OAAO,IAAI;AAAA,MACjB,cAAW;AAAA,MACX,OAAO,EAAE,OAAO,8BAA8B,WAAW,gCAAgC;AAAA;AAAA,EAC7F;AAAA,GACJ;AAGJ,IAAO,kBAAQ;;;ACpBf,SAAoB,YAAAE,kBAAgB;AA8B5B,SAQI,OAAAC,OARJ,QAAAC,cAAA;AAnBR,IAAM,SAA0B,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,UAAU,WAAW,IAAIF,WAAS,cAAc;AACvD,QAAM,OAAO,YAAY,SAAY,UAAU;AAE/C,QAAM,eAAe,MAAM;AACvB,QAAI,SAAU;AACd,UAAM,OAAO,CAAC;AACd,gBAAY,IAAI;AAChB,yCAAW;AAAA,EACf;AAEA,SACI,gBAAAE,OAAC,WAAM,SAAS,IAAI,OAAO;AAAA,IACvB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,QAAQ,WAAW,gBAAgB;AAAA,IACnC,YAAY;AAAA,IACZ,SAAS,WAAW,MAAM;AAAA,EAC9B,GACI;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,OAAO,EAAE,UAAU,YAAY,SAAS,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA;AAAA,IACnE;AAAA,IACA,gBAAAA,MAAC,UAAK,OAAO;AAAA,MACT,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB,OAAO,+BAA+B;AAAA,MACvD,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,YAAY;AAAA,IAChB,GACI,0BAAAA,MAAC,UAAK,OAAO;AAAA,MACT,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,OAAO,wBAAwB;AAAA,IAC9C,GAAG,GACP;AAAA,IACC,SACG,gBAAAA,MAAC,UAAK,OAAO,EAAE,UAAU,YAAY,OAAO,kCAAkC,GAAI,iBAAM;AAAA,KAEhG;AAER;AAEA,IAAO,iBAAQ;;;ACpEX,qBAAAE,WACI,OAAAC,OADJ,QAAAC,cAAA;AALJ,IAAM,WAAW;AAAA;AAAA;AAIV,IAAM,QAA8C,CAAC,OAAqB;AAArB,eAAE,QAR9D,IAQ4D,IAAY,kBAAZ,IAAY,CAAV;AAC1D,yBAAAA,OAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,YAAW,YAAW,OAAO,oBAAS;AAAA,IAClD,gBAAAA,MAAC,SAAI,OAAO;AAAA,MACR,OAAO;AAAA,MACP,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,cAAc;AAAA,IAClB,GACI,0BAAAA,MAAC,0BAAM,OAAO;AAAA,MACV,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,UAAU;AAAA,OACP,UACA,MAAO,GAClB;AAAA,KACJ;AAAA;AAGG,IAAM,YAAyD,CAAC,UACnE,gBAAAA,MAAC,4BAAU,MAAO;AAGf,IAAM,YAAyD,CAAC,UACnE,gBAAAA,MAAC,4BAAU,MAAO;AAGf,IAAM,WAAoD,CAAC,OAAqB;AAArB,eAAE,QAnCpE,IAmCkE,IAAY,kBAAZ,IAAY,CAAV;AAChE,yBAAAA,MAAC,uBAAG,qBAAkB,IAAG,SAAkB,MAAO;AAAA;AAG/C,IAAM,cAA0D,CAAC,OAAqB;AAArB,eAAE,QAvC1E,IAuCwE,IAAY,kBAAZ,IAAY,CAAV;AACtE,yBAAAA,MAAC,uBAAG,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,YAAY;AAAA,KACT,UACA,MAAO;AAAA;AAGX,IAAM,YAAwD,CAAC,OAAqB;AAArB,eAAE,QApDxE,IAoDsE,IAAY,kBAAZ,IAAY,CAAV;AACpE,yBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,sBAAmB;AAAA,MACnB,OAAO;AAAA,QACH,SAAS;AAAA,QACT,cAAc;AAAA,QACd,OAAO;AAAA,QACP,YAAY;AAAA,SACT;AAAA,OAEH;AAAA,EACR;AAAA;;;AC7DJ,SAA+B,YAAAE,kBAAgB;AAgCvB,SAwBiB,OAAAC,OAxBjB,QAAAC,cAAA;AAlBxB,IAAM,OAAsB,CAAC,EAAE,MAAM,aAAa,MAAM;AAhBxD;AAiBI,QAAM,CAAC,QAAQ,SAAS,IAAIF,YAAS,4CAAgB,UAAK,CAAC,MAAN,mBAAS,UAAzB,YAAkC,EAAE;AACzE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAC1D,QAAM,YAAY,KAAK,KAAK,OAAK,EAAE,UAAU,MAAM;AAEnD,SACI,gBAAAE,OAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,SAAS,GACnD;AAAA,oBAAAD,MAAC,SAAI,MAAK,WAAU,OAAO;AAAA,MACvB,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,KAAK;AAAA,IACT,GACK,eAAK,IAAI,SAAO;AACb,YAAM,WAAW,WAAW,IAAI;AAChC,YAAM,YAAY,YAAY,IAAI;AAClC,aACI,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEG,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,SAAS,MAAM,UAAU,IAAI,KAAK;AAAA,UAClC,cAAc,MAAM,WAAW,IAAI,KAAK;AAAA,UACxC,cAAc,MAAM,WAAW,IAAI;AAAA,UACnC,OAAO;AAAA,YACH,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,YAAY,WAAW,4BAA4B;AAAA,YACnD,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,OAAO,YAAY,YAAY,oCAAoC;AAAA,YACnE,WAAW,WAAW,kEAAkE;AAAA,YACxF,YAAY;AAAA,YACZ,YAAY;AAAA,UAChB;AAAA,UAEC;AAAA,gBAAI,QAAQ,gBAAAD,MAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,SAAS,GAAI,cAAI,MAAK;AAAA,YAC9E,IAAI;AAAA;AAAA;AAAA,QAxBA,IAAI;AAAA,MAyBb;AAAA,IAER,CAAC,GACL;AAAA,IACA,gBAAAA,MAAC,SAAI,MAAK,YAAW,OAAO;AAAA,MACxB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,OAAO;AAAA,IACX,GACK,iDAAW,SAChB;AAAA,KACJ;AAER;AAEA,IAAO,eAAQ;;;AC5DX,qBAAAE,WACI,OAAAC,OADJ,QAAAC,cAAA;AATJ,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpB,IAAM,WAA8B,CAAC,OAA4B;AAA5B,eAAE,SAAO,MAd9C,IAcqC,IAAmB,kBAAnB,IAAmB,CAAjB,SAAO;AAC1C,yBAAAA,OAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,eAAc,YAAW,OAAO,uBAAY;AAAA,IACxD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,oBAAiB;AAAA,QACjB,cAAY,QAAQ,SAAS;AAAA,QAC7B,OAAO;AAAA,UACH,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ,aAAa,QAAQ,8BAA8B,2BAA2B;AAAA,UACtF,cAAc;AAAA,UACd,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,WAAW;AAAA,WACR;AAAA,SAEH;AAAA,IACR;AAAA,KACJ;AAAA;AAGJ,IAAO,mBAAQ;;;ACtCf,SAA+B,YAAAE,kBAAgB;AAiCvC,qBAAAC,WACI,OAAAC,OACA,QAAAC,cAFJ;AAvBR,IAAM,gBAA8D;AAAA,EAChE,KAAQ,EAAE,QAAQ,oBAAoB,MAAM,OAAiB,WAAW,mBAAmB;AAAA,EAC3F,QAAQ,EAAE,KAAK,oBAAuB,MAAM,OAAiB,WAAW,mBAAmB;AAAA,EAC3F,MAAQ,EAAE,OAAO,oBAAoB,KAAK,OAAmB,WAAW,mBAAmB;AAAA,EAC3F,OAAQ,EAAE,MAAM,oBAAqB,KAAK,OAAmB,WAAW,mBAAmB;AAC/F;AAEA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYnB,IAAM,UAA4B,CAAC,EAAE,SAAS,UAAU,WAAW,MAAM,MAAM;AAC3E,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,KAAK;AAE5C,SACI,gBAAAD,OAAAF,WAAA,EACI;AAAA,oBAAAC,MAAC,WAAM,MAAK,cAAa,YAAW,OAAO,sBAAW;AAAA,IACtD,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,OAAO,EAAE,UAAU,YAAY,SAAS,cAAc;AAAA,QACtD,cAAc,MAAM,WAAW,IAAI;AAAA,QACnC,cAAc,MAAM,WAAW,KAAK;AAAA,QACpC,SAAS,MAAM,WAAW,IAAI;AAAA,QAC9B,QAAQ,MAAM,WAAW,KAAK;AAAA,QAE7B;AAAA;AAAA,UACD,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,cAAY;AAAA,cACZ,OAAO;AAAA,gBACH,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,SAAS,UAAU,IAAI;AAAA,gBACvB,YAAY;AAAA,iBACT,cAAc,QAAQ;AAAA,cAG5B;AAAA;AAAA,UACL;AAAA;AAAA;AAAA,IACJ;AAAA,KACJ;AAER;AAEA,IAAO,kBAAQ;","names":["useState","jsx","jsx","jsxs","jsx","jsx","variantMap","sizeMap","useState","jsx","jsxs","useState","jsx","jsxs","useState","jsx","useState","jsx","jsxs","useState","jsx","useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","useState","jsx","useState","jsx","useState","jsx","jsxs","Check","ChevronDown","useRef","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState"]}
|