@prototyperco/ui 0.5.0-alpha.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion.cjs +154 -0
- package/dist/components/accordion.cjs.map +1 -0
- package/dist/components/accordion.d.cts +14 -0
- package/dist/components/accordion.d.ts +14 -0
- package/dist/components/accordion.js +127 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.cjs +324 -0
- package/dist/components/alert-dialog.cjs.map +1 -0
- package/dist/components/alert-dialog.d.cts +30 -0
- package/dist/components/alert-dialog.d.ts +30 -0
- package/dist/components/alert-dialog.js +289 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/alert.cjs +105 -0
- package/dist/components/alert.cjs.map +1 -0
- package/dist/components/alert.d.cts +17 -0
- package/dist/components/alert.d.ts +17 -0
- package/dist/components/alert.js +78 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/autocomplete.cjs +512 -0
- package/dist/components/autocomplete.cjs.map +1 -0
- package/dist/components/autocomplete.d.cts +31 -0
- package/dist/components/autocomplete.d.ts +31 -0
- package/dist/components/autocomplete.js +472 -0
- package/dist/components/autocomplete.js.map +1 -0
- package/dist/components/avatar.cjs +144 -0
- package/dist/components/avatar.cjs.map +1 -0
- package/dist/components/avatar.d.cts +18 -0
- package/dist/components/avatar.d.ts +18 -0
- package/dist/components/avatar.js +115 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.cjs +81 -0
- package/dist/components/badge.cjs.map +1 -0
- package/dist/components/badge.d.cts +13 -0
- package/dist/components/badge.d.ts +13 -0
- package/dist/components/badge.js +56 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/breadcrumb.cjs +142 -0
- package/dist/components/breadcrumb.cjs.map +1 -0
- package/dist/components/breadcrumb.d.cts +20 -0
- package/dist/components/breadcrumb.d.ts +20 -0
- package/dist/components/breadcrumb.js +112 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.cjs +145 -0
- package/dist/components/button.cjs.map +1 -0
- package/dist/components/button.d.cts +16 -0
- package/dist/components/button.d.ts +16 -0
- package/dist/components/button.js +120 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.cjs +141 -0
- package/dist/components/card.cjs.map +1 -0
- package/dist/components/card.d.cts +23 -0
- package/dist/components/card.d.ts +23 -0
- package/dist/components/card.js +111 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/checkbox-group.cjs +56 -0
- package/dist/components/checkbox-group.cjs.map +1 -0
- package/dist/components/checkbox-group.d.cts +8 -0
- package/dist/components/checkbox-group.d.ts +8 -0
- package/dist/components/checkbox-group.js +32 -0
- package/dist/components/checkbox-group.js.map +1 -0
- package/dist/components/checkbox.cjs +152 -0
- package/dist/components/checkbox.cjs.map +1 -0
- package/dist/components/checkbox.d.cts +12 -0
- package/dist/components/checkbox.d.ts +12 -0
- package/dist/components/checkbox.js +126 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.cjs +89 -0
- package/dist/components/collapsible.cjs.map +1 -0
- package/dist/components/collapsible.d.cts +12 -0
- package/dist/components/collapsible.d.ts +12 -0
- package/dist/components/collapsible.js +63 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/color-picker.cjs +983 -0
- package/dist/components/color-picker.cjs.map +1 -0
- package/dist/components/color-picker.d.cts +41 -0
- package/dist/components/color-picker.d.ts +41 -0
- package/dist/components/color-picker.js +939 -0
- package/dist/components/color-picker.js.map +1 -0
- package/dist/components/columns.cjs +163 -0
- package/dist/components/columns.cjs.map +1 -0
- package/dist/components/columns.d.cts +16 -0
- package/dist/components/columns.d.ts +16 -0
- package/dist/components/columns.js +136 -0
- package/dist/components/columns.js.map +1 -0
- package/dist/components/combobox.cjs +633 -0
- package/dist/components/combobox.cjs.map +1 -0
- package/dist/components/combobox.d.cts +40 -0
- package/dist/components/combobox.d.ts +40 -0
- package/dist/components/combobox.js +576 -0
- package/dist/components/combobox.js.map +1 -0
- package/dist/components/command-palette.cjs +370 -0
- package/dist/components/command-palette.cjs.map +1 -0
- package/dist/components/command-palette.d.cts +42 -0
- package/dist/components/command-palette.d.ts +42 -0
- package/dist/components/command-palette.js +329 -0
- package/dist/components/command-palette.js.map +1 -0
- package/dist/components/container.cjs +80 -0
- package/dist/components/container.cjs.map +1 -0
- package/dist/components/container.d.cts +27 -0
- package/dist/components/container.d.ts +27 -0
- package/dist/components/container.js +54 -0
- package/dist/components/container.js.map +1 -0
- package/dist/components/context-menu.cjs +309 -0
- package/dist/components/context-menu.cjs.map +1 -0
- package/dist/components/context-menu.d.cts +37 -0
- package/dist/components/context-menu.d.ts +37 -0
- package/dist/components/context-menu.js +271 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/dialog.cjs +319 -0
- package/dist/components/dialog.cjs.map +1 -0
- package/dist/components/dialog.d.cts +32 -0
- package/dist/components/dialog.d.ts +32 -0
- package/dist/components/dialog.js +285 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.cjs +185 -0
- package/dist/components/drawer.cjs.map +1 -0
- package/dist/components/drawer.d.cts +32 -0
- package/dist/components/drawer.d.ts +32 -0
- package/dist/components/drawer.js +151 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/field.cjs +334 -0
- package/dist/components/field.cjs.map +1 -0
- package/dist/components/field.d.cts +39 -0
- package/dist/components/field.d.ts +39 -0
- package/dist/components/field.js +299 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/fieldset.cjs +75 -0
- package/dist/components/fieldset.cjs.map +1 -0
- package/dist/components/fieldset.d.cts +12 -0
- package/dist/components/fieldset.d.ts +12 -0
- package/dist/components/fieldset.js +50 -0
- package/dist/components/fieldset.js.map +1 -0
- package/dist/components/form.cjs +52 -0
- package/dist/components/form.cjs.map +1 -0
- package/dist/components/form.d.cts +8 -0
- package/dist/components/form.d.ts +8 -0
- package/dist/components/form.js +28 -0
- package/dist/components/form.js.map +1 -0
- package/dist/components/input-group.cjs +338 -0
- package/dist/components/input-group.cjs.map +1 -0
- package/dist/components/input-group.d.cts +27 -0
- package/dist/components/input-group.d.ts +27 -0
- package/dist/components/input-group.js +307 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.cjs +63 -0
- package/dist/components/input.cjs.map +1 -0
- package/dist/components/input.d.cts +8 -0
- package/dist/components/input.d.ts +8 -0
- package/dist/components/input.js +39 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/label.cjs +54 -0
- package/dist/components/label.cjs.map +1 -0
- package/dist/components/label.d.cts +8 -0
- package/dist/components/label.d.ts +8 -0
- package/dist/components/label.js +28 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/menu.cjs +305 -0
- package/dist/components/menu.cjs.map +1 -0
- package/dist/components/menu.d.cts +37 -0
- package/dist/components/menu.d.ts +37 -0
- package/dist/components/menu.js +267 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/menubar.cjs +503 -0
- package/dist/components/menubar.cjs.map +1 -0
- package/dist/components/menubar.d.cts +37 -0
- package/dist/components/menubar.d.ts +37 -0
- package/dist/components/menubar.js +464 -0
- package/dist/components/menubar.js.map +1 -0
- package/dist/components/meter.cjs +152 -0
- package/dist/components/meter.cjs.map +1 -0
- package/dist/components/meter.d.cts +23 -0
- package/dist/components/meter.d.ts +23 -0
- package/dist/components/meter.js +122 -0
- package/dist/components/meter.js.map +1 -0
- package/dist/components/navigation-menu.cjs +315 -0
- package/dist/components/navigation-menu.cjs.map +1 -0
- package/dist/components/navigation-menu.d.cts +22 -0
- package/dist/components/navigation-menu.d.ts +22 -0
- package/dist/components/navigation-menu.js +283 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/number-field.cjs +217 -0
- package/dist/components/number-field.cjs.map +1 -0
- package/dist/components/number-field.d.cts +23 -0
- package/dist/components/number-field.d.ts +23 -0
- package/dist/components/number-field.js +185 -0
- package/dist/components/number-field.js.map +1 -0
- package/dist/components/popover.cjs +125 -0
- package/dist/components/popover.cjs.map +1 -0
- package/dist/components/popover.d.cts +16 -0
- package/dist/components/popover.d.ts +16 -0
- package/dist/components/popover.js +96 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/preview-card.cjs +86 -0
- package/dist/components/preview-card.cjs.map +1 -0
- package/dist/components/preview-card.d.cts +12 -0
- package/dist/components/preview-card.d.ts +12 -0
- package/dist/components/preview-card.js +60 -0
- package/dist/components/preview-card.js.map +1 -0
- package/dist/components/progress.cjs +167 -0
- package/dist/components/progress.cjs.map +1 -0
- package/dist/components/progress.d.cts +23 -0
- package/dist/components/progress.d.ts +23 -0
- package/dist/components/progress.js +137 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.cjs +98 -0
- package/dist/components/radio-group.cjs.map +1 -0
- package/dist/components/radio-group.d.cts +11 -0
- package/dist/components/radio-group.d.ts +11 -0
- package/dist/components/radio-group.js +73 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/resizable-panel.cjs +91 -0
- package/dist/components/resizable-panel.cjs.map +1 -0
- package/dist/components/resizable-panel.d.cts +14 -0
- package/dist/components/resizable-panel.d.ts +14 -0
- package/dist/components/resizable-panel.js +69 -0
- package/dist/components/resizable-panel.js.map +1 -0
- package/dist/components/row.cjs +94 -0
- package/dist/components/row.cjs.map +1 -0
- package/dist/components/row.d.cts +27 -0
- package/dist/components/row.d.ts +27 -0
- package/dist/components/row.js +68 -0
- package/dist/components/row.js.map +1 -0
- package/dist/components/scroll-area.cjs +96 -0
- package/dist/components/scroll-area.cjs.map +1 -0
- package/dist/components/scroll-area.d.cts +10 -0
- package/dist/components/scroll-area.d.ts +10 -0
- package/dist/components/scroll-area.js +71 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/section.cjs +104 -0
- package/dist/components/section.cjs.map +1 -0
- package/dist/components/section.d.cts +26 -0
- package/dist/components/section.d.ts +26 -0
- package/dist/components/section.js +79 -0
- package/dist/components/section.js.map +1 -0
- package/dist/components/segmented-control.cjs +117 -0
- package/dist/components/segmented-control.cjs.map +1 -0
- package/dist/components/segmented-control.d.cts +16 -0
- package/dist/components/segmented-control.d.ts +16 -0
- package/dist/components/segmented-control.js +91 -0
- package/dist/components/segmented-control.js.map +1 -0
- package/dist/components/select.cjs +273 -0
- package/dist/components/select.cjs.map +1 -0
- package/dist/components/select.d.cts +26 -0
- package/dist/components/select.d.ts +26 -0
- package/dist/components/select.js +239 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.cjs +60 -0
- package/dist/components/separator.cjs.map +1 -0
- package/dist/components/separator.d.cts +8 -0
- package/dist/components/separator.d.ts +8 -0
- package/dist/components/separator.js +36 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/skeleton.cjs +54 -0
- package/dist/components/skeleton.cjs.map +1 -0
- package/dist/components/skeleton.d.cts +8 -0
- package/dist/components/skeleton.d.ts +8 -0
- package/dist/components/skeleton.js +28 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.cjs +221 -0
- package/dist/components/slider.cjs.map +1 -0
- package/dist/components/slider.d.cts +16 -0
- package/dist/components/slider.d.ts +16 -0
- package/dist/components/slider.js +182 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/spinner.cjs +97 -0
- package/dist/components/spinner.cjs.map +1 -0
- package/dist/components/spinner.d.cts +13 -0
- package/dist/components/spinner.d.ts +13 -0
- package/dist/components/spinner.js +72 -0
- package/dist/components/spinner.js.map +1 -0
- package/dist/components/switch.cjs +177 -0
- package/dist/components/switch.cjs.map +1 -0
- package/dist/components/switch.d.cts +22 -0
- package/dist/components/switch.d.ts +22 -0
- package/dist/components/switch.js +139 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.cjs +123 -0
- package/dist/components/tabs.cjs.map +1 -0
- package/dist/components/tabs.d.cts +19 -0
- package/dist/components/tabs.d.ts +19 -0
- package/dist/components/tabs.js +95 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/text-field.cjs +290 -0
- package/dist/components/text-field.cjs.map +1 -0
- package/dist/components/text-field.d.cts +27 -0
- package/dist/components/text-field.d.ts +27 -0
- package/dist/components/text-field.js +262 -0
- package/dist/components/text-field.js.map +1 -0
- package/dist/components/textarea.cjs +60 -0
- package/dist/components/textarea.cjs.map +1 -0
- package/dist/components/textarea.d.cts +8 -0
- package/dist/components/textarea.d.ts +8 -0
- package/dist/components/textarea.js +34 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toast.cjs +167 -0
- package/dist/components/toast.cjs.map +1 -0
- package/dist/components/toast.d.cts +28 -0
- package/dist/components/toast.d.ts +28 -0
- package/dist/components/toast.js +147 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/toggle-group.cjs +171 -0
- package/dist/components/toggle-group.cjs.map +1 -0
- package/dist/components/toggle-group.d.cts +18 -0
- package/dist/components/toggle-group.d.ts +18 -0
- package/dist/components/toggle-group.js +136 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.cjs +92 -0
- package/dist/components/toggle.cjs.map +1 -0
- package/dist/components/toggle.d.cts +14 -0
- package/dist/components/toggle.d.ts +14 -0
- package/dist/components/toggle.js +67 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/toolbar.cjs +160 -0
- package/dist/components/toolbar.cjs.map +1 -0
- package/dist/components/toolbar.d.cts +14 -0
- package/dist/components/toolbar.d.ts +14 -0
- package/dist/components/toolbar.js +131 -0
- package/dist/components/toolbar.js.map +1 -0
- package/dist/components/tooltip.cjs +116 -0
- package/dist/components/tooltip.cjs.map +1 -0
- package/dist/components/tooltip.d.cts +13 -0
- package/dist/components/tooltip.d.ts +13 -0
- package/dist/components/tooltip.js +89 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tree-view.cjs +472 -0
- package/dist/components/tree-view.cjs.map +1 -0
- package/dist/components/tree-view.d.cts +33 -0
- package/dist/components/tree-view.d.ts +33 -0
- package/dist/components/tree-view.js +435 -0
- package/dist/components/tree-view.js.map +1 -0
- package/dist/index.cjs +11 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +101 -903
- package/dist/index.d.ts +101 -903
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/color-utils.cjs +315 -0
- package/dist/lib/color-utils.cjs.map +1 -0
- package/dist/lib/color-utils.d.cts +24 -0
- package/dist/lib/color-utils.d.ts +24 -0
- package/dist/lib/color-utils.js +280 -0
- package/dist/lib/color-utils.js.map +1 -0
- package/dist/lib/utils.cjs +35 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.d.cts +5 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +10 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +24 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/color-picker.tsx","../../src/lib/utils.ts","../../src/lib/color-utils.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport { Pipette } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n type OklchColor,\n type ColorFormat,\n parseColor,\n formatColor,\n oklchToRgb,\n clamp,\n renderAreaGradient,\n maxChromaForLH,\n gamutMapChroma,\n} from \"../lib/color-utils\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ColorPickerContextValue {\n color: OklchColor;\n setChannel: (channel: \"l\" | \"c\" | \"h\" | \"a\", value: number) => void;\n setColor: (color: OklchColor) => void;\n setColorFromString: (css: string) => void;\n cssValue: string;\n outputFormat: ColorFormat;\n disabled: boolean;\n enableAlpha: boolean;\n isDragging: boolean;\n setIsDragging: (v: boolean) => void;\n onInteractionEnd: () => void;\n}\n\nconst ColorPickerCtx = React.createContext<ColorPickerContextValue | null>(\n null,\n);\n\nfunction useColorPicker() {\n const ctx = React.useContext(ColorPickerCtx);\n if (!ctx)\n throw new Error(\n \"ColorPicker sub-components must be used within <ColorPicker>\",\n );\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Root — <ColorPicker>\n// ---------------------------------------------------------------------------\n\ninterface ColorPickerProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onValueCommit?: (value: string) => void;\n outputFormat?: ColorFormat;\n name?: string;\n disabled?: boolean;\n enableAlpha?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n className?: string;\n}\n\nfunction ColorPicker({\n value: controlledValue,\n defaultValue = \"#6366f1\",\n onValueChange,\n onValueCommit,\n outputFormat = \"hex\",\n name,\n disabled = false,\n enableAlpha = false,\n open,\n onOpenChange,\n children,\n className,\n}: ColorPickerProps) {\n const [internal, setInternal] = React.useState<OklchColor>(\n () =>\n parseColor(controlledValue ?? defaultValue) ?? {\n l: 0.55,\n c: 0.25,\n h: 264,\n a: 1,\n },\n );\n const [isDragging, setIsDragging] = React.useState(false);\n\n // Update internal when controlled value changes\n const prevControlled = React.useRef(controlledValue);\n React.useEffect(() => {\n if (\n controlledValue !== undefined &&\n controlledValue !== prevControlled.current\n ) {\n prevControlled.current = controlledValue;\n const parsed = parseColor(controlledValue);\n if (parsed) setInternal(parsed);\n }\n }, [controlledValue]);\n\n const color = React.useMemo(() => {\n if (controlledValue !== undefined) {\n return parseColor(controlledValue) ?? internal;\n }\n return internal;\n }, [controlledValue, internal]);\n\n const cssValue = React.useMemo(\n () => formatColor(color, outputFormat),\n [color, outputFormat],\n );\n\n const updateColor = React.useCallback(\n (next: OklchColor) => {\n setInternal(next);\n const formatted = formatColor(next, outputFormat);\n onValueChange?.(formatted);\n },\n [outputFormat, onValueChange],\n );\n\n const setChannel = React.useCallback(\n (channel: \"l\" | \"c\" | \"h\" | \"a\", value: number) => {\n updateColor({ ...color, [channel]: value });\n },\n [color, updateColor],\n );\n\n const setColor = React.useCallback(\n (next: OklchColor) => {\n updateColor(next);\n },\n [updateColor],\n );\n\n const setColorFromString = React.useCallback(\n (css: string) => {\n const parsed = parseColor(css);\n if (parsed) updateColor(parsed);\n },\n [updateColor],\n );\n\n const onInteractionEnd = React.useCallback(() => {\n const formatted = formatColor(color, outputFormat);\n onValueCommit?.(formatted);\n }, [color, outputFormat, onValueCommit]);\n\n const ctx = React.useMemo<ColorPickerContextValue>(\n () => ({\n color,\n setChannel,\n setColor,\n setColorFromString,\n cssValue,\n outputFormat,\n disabled,\n enableAlpha,\n isDragging,\n setIsDragging,\n onInteractionEnd,\n }),\n [\n color,\n setChannel,\n setColor,\n setColorFromString,\n cssValue,\n outputFormat,\n disabled,\n enableAlpha,\n isDragging,\n setIsDragging,\n onInteractionEnd,\n ],\n );\n\n return (\n <ColorPickerCtx value={ctx}>\n <PopoverPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <div data-slot=\"color-picker\" className={cn(\"inline-flex\", className)}>\n {children}\n {name && <input type=\"hidden\" name={name} value={cssValue} />}\n </div>\n </PopoverPrimitive.Root>\n </ColorPickerCtx>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trigger — <ColorPickerTrigger>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerTrigger({\n className,\n children,\n ...props\n}: PopoverPrimitive.Trigger.Props) {\n const { cssValue, disabled } = useColorPicker();\n\n return (\n <PopoverPrimitive.Trigger\n data-slot=\"color-picker-trigger\"\n disabled={disabled}\n className={cn(\n \"inline-flex items-center gap-2 rounded-md border border-border bg-surface px-3 py-2 text-sm\",\n \"focus-visible:focus-ring\",\n \"disabled:status-disabled\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n className,\n )}\n {...props}\n >\n <span\n className=\"size-5 shrink-0 rounded-sm border border-border/50 shadow-sm\"\n style={{ backgroundColor: cssValue }}\n />\n {children ?? (\n <span className=\"font-mono text-xs uppercase\">{cssValue}</span>\n )}\n </PopoverPrimitive.Trigger>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Content — <ColorPickerContent>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerContent({\n className,\n sideOffset = 8,\n align = \"start\",\n ...props\n}: PopoverPrimitive.Popup.Props &\n Pick<PopoverPrimitive.Positioner.Props, \"sideOffset\" | \"align\">) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n sideOffset={sideOffset}\n align={align}\n className=\"isolate z-50\"\n >\n <PopoverPrimitive.Popup\n data-slot=\"color-picker-content\"\n className={cn(\n \"flex w-64 flex-col gap-3 rounded-lg bg-overlay p-3 shadow-overlay outline-none\",\n \"origin-(--transform-origin)\",\n \"data-open:animate-in data-open:duration-150 data-open:[animation-timing-function:var(--ease-out-fluid)]\",\n \"data-closed:animate-out data-closed:duration-100 data-closed:[animation-timing-function:var(--ease-in-quart)]\",\n \"data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-entering:will-change-[opacity,transform] data-exiting:will-change-[opacity,transform]\",\n \"motion-reduce:animate-none motion-reduce:transition-none\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Area — <ColorPickerArea> + <ColorPickerAreaThumb>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerArea({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { color, setColor, disabled, setIsDragging, onInteractionEnd } =\n useColorPicker();\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const prevHue = React.useRef<number>(color.h);\n\n // Re-render canvas when hue changes\n React.useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!ctx) return;\n\n const w = 128;\n const h = 128;\n canvas.width = w;\n canvas.height = h;\n\n const imageData = renderAreaGradient(w, h, color.h);\n ctx.putImageData(imageData, 0, 0);\n prevHue.current = color.h;\n }, [color.h]);\n\n const computeFromPointer = React.useCallback(\n (clientX: number, clientY: number) => {\n const el = containerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const x = clamp((clientX - rect.left) / rect.width, 0, 1);\n const y = clamp((clientY - rect.top) / rect.height, 0, 1);\n const c = x * 0.4;\n const l = 1 - y;\n const clamped = gamutMapChroma(l, c, color.h);\n setColor({ ...color, l, c: Math.min(c, clamped) });\n },\n [color, setColor],\n );\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n setIsDragging(true);\n computeFromPointer(e.clientX, e.clientY);\n },\n [disabled, setIsDragging, computeFromPointer],\n );\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (!(e.currentTarget as HTMLElement).hasPointerCapture(e.pointerId))\n return;\n computeFromPointer(e.clientX, e.clientY);\n },\n [computeFromPointer],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n onInteractionEnd();\n }, [setIsDragging, onInteractionEnd]);\n\n // Keyboard nav for area\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n const step = e.shiftKey ? 0.005 : 0.02;\n let { l, c } = color;\n let handled = true;\n\n switch (e.key) {\n case \"ArrowRight\":\n c = Math.min(c + step, 0.4);\n break;\n case \"ArrowLeft\":\n c = Math.max(c - step, 0);\n break;\n case \"ArrowUp\":\n l = Math.min(l + step, 1);\n break;\n case \"ArrowDown\":\n l = Math.max(l - step, 0);\n break;\n case \"Home\":\n c = 0;\n break;\n case \"End\":\n c = 0.4;\n break;\n case \"PageUp\":\n l = 1;\n break;\n case \"PageDown\":\n l = 0;\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n const clamped = gamutMapChroma(l, c, color.h);\n setColor({ ...color, l, c: Math.min(c, clamped) });\n onInteractionEnd();\n }\n },\n [color, setColor, disabled, onInteractionEnd],\n );\n\n // Thumb position\n const thumbX = clamp(color.c / 0.4, 0, 1) * 100;\n const thumbY = (1 - color.l) * 100;\n\n return (\n <div\n ref={containerRef}\n data-slot=\"color-picker-area\"\n role=\"slider\"\n aria-label=\"Color area\"\n aria-valuetext={`Lightness ${Math.round(color.l * 100)}%, Chroma ${Math.round((color.c / 0.4) * 100)}%`}\n tabIndex={disabled ? -1 : 0}\n className={cn(\n \"relative aspect-square w-full cursor-crosshair overflow-hidden rounded-md touch-none select-none\",\n \"focus-visible:focus-ring\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onKeyDown={handleKeyDown}\n {...props}\n >\n <canvas\n ref={canvasRef}\n className=\"pointer-events-none absolute inset-0 size-full\"\n style={{ imageRendering: \"auto\" }}\n />\n {children ?? (\n <ColorPickerAreaThumb\n style={{ left: `${thumbX}%`, top: `${thumbY}%` }}\n />\n )}\n </div>\n );\n}\n\nfunction ColorPickerAreaThumb({\n className,\n style,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { color, isDragging } = useColorPicker();\n const [r, g, b] = oklchToRgb(color.l, color.c, color.h);\n\n return (\n <div\n data-slot=\"color-picker-area-thumb\"\n className={cn(\n \"pointer-events-none absolute size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-md\",\n \"transition-transform duration-150 ease-smooth motion-reduce:transition-none\",\n isDragging && \"scale-110 shadow-lg\",\n className,\n )}\n style={{\n backgroundColor: `rgb(${r}, ${g}, ${b})`,\n ...style,\n }}\n {...props}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Slider — <ColorPickerSlider> + <ColorPickerSliderThumb>\n// ---------------------------------------------------------------------------\n\ninterface ColorPickerSliderProps extends Omit<\n React.ComponentProps<\"div\">,\n \"onChange\"\n> {\n channel: \"hue\" | \"alpha\";\n}\n\nfunction ColorPickerSlider({\n channel,\n className,\n children,\n ...props\n}: ColorPickerSliderProps) {\n const {\n color,\n setChannel,\n disabled,\n setIsDragging,\n onInteractionEnd,\n enableAlpha,\n } = useColorPicker();\n const trackRef = React.useRef<HTMLDivElement>(null);\n\n if (channel === \"alpha\" && !enableAlpha) return null;\n\n const isHue = channel === \"hue\";\n const value = isHue ? color.h : color.a;\n const min = 0;\n const max = isHue ? 360 : 1;\n\n const pct = ((value - min) / (max - min)) * 100;\n\n const computeValue = React.useCallback(\n (clientX: number) => {\n const el = trackRef.current;\n if (!el) return value;\n const rect = el.getBoundingClientRect();\n const ratio = clamp((clientX - rect.left) / rect.width, 0, 1);\n return min + ratio * (max - min);\n },\n [min, max, value],\n );\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n setIsDragging(true);\n const v = computeValue(e.clientX);\n setChannel(isHue ? \"h\" : \"a\", v);\n },\n [disabled, setIsDragging, computeValue, setChannel, isHue],\n );\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (!(e.currentTarget as HTMLElement).hasPointerCapture(e.pointerId))\n return;\n const v = computeValue(e.clientX);\n setChannel(isHue ? \"h\" : \"a\", v);\n },\n [computeValue, setChannel, isHue],\n );\n\n const handlePointerUp = React.useCallback(() => {\n setIsDragging(false);\n onInteractionEnd();\n }, [setIsDragging, onInteractionEnd]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n const coarseStep = isHue ? 10 : 0.05;\n const fineStep = isHue ? 1 : 0.01;\n const step = e.shiftKey ? fineStep : coarseStep;\n let v = value;\n let handled = true;\n\n switch (e.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n v = Math.min(v + step, max);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n v = Math.max(v - step, min);\n break;\n case \"Home\":\n v = min;\n break;\n case \"End\":\n v = max;\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n setChannel(isHue ? \"h\" : \"a\", v);\n onInteractionEnd();\n }\n },\n [disabled, isHue, value, min, max, setChannel, onInteractionEnd],\n );\n\n // Build gradient\n const gradient = isHue\n ? `linear-gradient(to right, ${Array.from({ length: 13 }, (_, i) => {\n const h = (i / 12) * 360;\n const [r, g, b] = oklchToRgb(0.7, 0.15, h);\n return `rgb(${r},${g},${b})`;\n }).join(\",\")})`\n : (() => {\n const [r, g, b] = oklchToRgb(color.l, color.c, color.h);\n return `linear-gradient(to right, transparent, rgb(${r},${g},${b}))`;\n })();\n\n return (\n <div\n ref={trackRef}\n data-slot=\"color-picker-slider\"\n data-channel={channel}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={isHue ? \"Hue\" : \"Alpha\"}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={Math.round(isHue ? value : value * 100)}\n className={cn(\n \"group relative h-3 w-full cursor-pointer rounded-full touch-none select-none\",\n \"focus-visible:focus-ring\",\n disabled && \"pointer-events-none opacity-50\",\n !isHue && \"checkerboard\",\n className,\n )}\n style={isHue ? { background: gradient } : undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {/* Alpha: gradient overlay on top of checkerboard */}\n {!isHue && (\n <div\n className=\"absolute inset-0 rounded-full\"\n style={{ background: gradient }}\n />\n )}\n {children ?? <ColorPickerSliderThumb style={{ left: `${pct}%` }} />}\n </div>\n );\n}\n\nfunction ColorPickerSliderThumb({\n className,\n style,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { isDragging } = useColorPicker();\n\n return (\n <div\n data-slot=\"color-picker-slider-thumb\"\n className={cn(\n \"pointer-events-none absolute top-1/2 size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white bg-white shadow-md\",\n \"transition-transform duration-150 ease-smooth motion-reduce:transition-none\",\n isDragging && \"scale-110 shadow-lg\",\n className,\n )}\n style={style}\n {...props}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Input — <ColorPickerInput>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerInput({\n className,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"value\" | \"onChange\">) {\n const { cssValue, setColorFromString, disabled, onInteractionEnd } =\n useColorPicker();\n const [local, setLocal] = React.useState(cssValue);\n const [focused, setFocused] = React.useState(false);\n\n // Sync local with ctx when not focused\n React.useEffect(() => {\n if (!focused) setLocal(cssValue);\n }, [cssValue, focused]);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n setLocal(v);\n setColorFromString(v);\n },\n [setColorFromString],\n );\n\n const handleBlur = React.useCallback(() => {\n setFocused(false);\n setLocal(cssValue);\n onInteractionEnd();\n }, [cssValue, onInteractionEnd]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n setColorFromString(local);\n onInteractionEnd();\n (e.target as HTMLInputElement).blur();\n }\n },\n [local, setColorFromString, onInteractionEnd],\n );\n\n return (\n <input\n data-slot=\"color-picker-input\"\n type=\"text\"\n value={local}\n disabled={disabled}\n className={cn(\n \"h-8 w-full min-w-0 flex-1 rounded-md border border-field-border bg-field-background shadow-field px-2 font-mono text-xs\",\n \"hover-only:hover:border-field-border-hover\",\n \"focus-visible:focus-field-ring\",\n \"disabled:status-disabled\",\n className,\n )}\n onChange={handleChange}\n onFocus={() => setFocused(true)}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n {...props}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// EyeDropper — <ColorPickerEyeDropper>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerEyeDropper({\n className,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { setColorFromString, disabled, onInteractionEnd } = useColorPicker();\n const [supported, setSupported] = React.useState(false);\n\n React.useEffect(() => {\n setSupported(\"EyeDropper\" in window);\n }, []);\n\n const handleClick = React.useCallback(async () => {\n try {\n const dropper = new (window as any).EyeDropper();\n const result = await dropper.open();\n if (result?.sRGBHex) {\n setColorFromString(result.sRGBHex);\n onInteractionEnd();\n }\n } catch {\n // User cancelled\n }\n }, [setColorFromString, onInteractionEnd]);\n\n if (!supported) return null;\n\n return (\n <button\n type=\"button\"\n data-slot=\"color-picker-eye-dropper\"\n aria-label=\"Pick color from screen\"\n disabled={disabled}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-md border border-border bg-surface text-muted-foreground\",\n \"hover-only:hover:bg-surface-secondary hover-only:hover:text-foreground\",\n \"focus-visible:focus-ring\",\n \"disabled:status-disabled\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n <Pipette className=\"size-3.5\" />\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Swatches — <ColorPickerSwatches> + <ColorPickerSwatch>\n// ---------------------------------------------------------------------------\n\nfunction ColorPickerSwatches({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"color-picker-swatches\"\n className={cn(\"flex flex-wrap gap-1\", className)}\n {...props}\n />\n );\n}\n\ninterface ColorPickerSwatchProps extends React.ComponentProps<\"button\"> {\n value: string;\n}\n\nfunction ColorPickerSwatch({\n value,\n className,\n ...props\n}: ColorPickerSwatchProps) {\n const { setColorFromString, disabled, onInteractionEnd, cssValue } =\n useColorPicker();\n\n // Parse the swatch value to compare\n const parsed = React.useMemo(() => parseColor(value), [value]);\n const swatchCss = React.useMemo(\n () => (parsed ? formatColor(parsed, \"hex\") : value),\n [parsed, value],\n );\n\n const handleClick = React.useCallback(() => {\n setColorFromString(value);\n onInteractionEnd();\n }, [value, setColorFromString, onInteractionEnd]);\n\n // Simple active check\n const isActive = cssValue.toLowerCase() === swatchCss.toLowerCase();\n\n return (\n <button\n type=\"button\"\n data-slot=\"color-picker-swatch\"\n data-active={isActive || undefined}\n disabled={disabled}\n className={cn(\n \"size-6 rounded-sm border border-border/50 shadow-sm\",\n \"motion-safe:hover-only:hover:scale-110 focus-visible:focus-ring\",\n \"disabled:status-disabled\",\n \"transition-transform duration-150 ease-smooth motion-reduce:transition-none\",\n \"data-active:ring-2 data-active:ring-ring data-active:ring-offset-1 data-active:ring-offset-overlay\",\n className,\n )}\n style={{ backgroundColor: value }}\n onClick={handleClick}\n title={value}\n {...props}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Inline wrapper — use <ColorPicker> + <ColorPickerContent> without popover\n// ---------------------------------------------------------------------------\n// Users can just not use Trigger/Content and render sub-components directly.\n// The Popover primitives are only activated when Trigger + Content are used.\n\n// ---------------------------------------------------------------------------\n// Exports\n// ---------------------------------------------------------------------------\n\nexport {\n ColorPicker,\n ColorPickerTrigger,\n ColorPickerContent,\n ColorPickerArea,\n ColorPickerAreaThumb,\n ColorPickerSlider,\n ColorPickerSliderThumb,\n ColorPickerInput,\n ColorPickerEyeDropper,\n ColorPickerSwatches,\n ColorPickerSwatch,\n};\n\nexport type { ColorPickerProps };\nexport type ColorPickerTriggerProps = React.ComponentProps<\n typeof ColorPickerTrigger\n>;\nexport type ColorPickerContentProps = React.ComponentProps<\n typeof ColorPickerContent\n>;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/* ============================================================\n * color-utils — OKLCH-native color conversion & gamut mapping\n * ============================================================\n * Pure math, no React.\n * All internal state uses OKLCH { l, c, h, a }.\n * Provides parsing from CSS strings and formatting to hex/oklch/rgb/hsl.\n * ============================================================ */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface OklchColor {\n l: number; // 0 – 1 (lightness)\n c: number; // 0 – 0.4 (chroma)\n h: number; // 0 – 360 (hue, degrees)\n a: number; // 0 – 1 (alpha)\n}\n\nexport type ColorFormat = \"hex\" | \"oklch\" | \"rgb\" | \"hsl\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEG = Math.PI / 180;\nconst MAX_CHROMA = 0.4;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n\nfunction round(v: number, d: number): number {\n const f = 10 ** d;\n return Math.round(v * f) / f;\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH ↔ OKLab\n// ---------------------------------------------------------------------------\n\nfunction oklchToOklab(l: number, c: number, h: number) {\n const hRad = h * DEG;\n return { L: l, a: c * Math.cos(hRad), b: c * Math.sin(hRad) };\n}\n\nfunction oklabToOklch(L: number, a: number, b: number) {\n const c = Math.sqrt(a * a + b * b);\n let h = Math.atan2(b, a) / DEG;\n if (h < 0) h += 360;\n return { l: L, c, h };\n}\n\n// ---------------------------------------------------------------------------\n// OKLab ↔ Linear sRGB\n// ---------------------------------------------------------------------------\n\nfunction oklabToLinearRgb(L: number, a: number, b: number) {\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n const s_ = L - 0.0894841775 * a - 1.291485548 * b;\n\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n\n return {\n r: +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n g: -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n b: -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n };\n}\n\nfunction linearRgbToOklab(r: number, g: number, b: number) {\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n\n return {\n L: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Linear sRGB ↔ sRGB (gamma)\n// ---------------------------------------------------------------------------\n\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH → sRGB (clamped 0-255)\n// ---------------------------------------------------------------------------\n\nexport function oklchToRgb(\n l: number,\n c: number,\n h: number,\n): [number, number, number] {\n const lab = oklchToOklab(l, c, h);\n const lin = oklabToLinearRgb(lab.L, lab.a, lab.b);\n return [\n clamp(Math.round(linearToSrgb(lin.r) * 255), 0, 255),\n clamp(Math.round(linearToSrgb(lin.g) * 255), 0, 255),\n clamp(Math.round(linearToSrgb(lin.b) * 255), 0, 255),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// sRGB → OKLCH\n// ---------------------------------------------------------------------------\n\nexport function rgbToOklch(\n r: number,\n g: number,\n b: number,\n): { l: number; c: number; h: number } {\n const lr = srgbToLinear(r / 255);\n const lg = srgbToLinear(g / 255);\n const lb = srgbToLinear(b / 255);\n const lab = linearRgbToOklab(lr, lg, lb);\n return oklabToOklch(lab.L, lab.a, lab.b);\n}\n\n// ---------------------------------------------------------------------------\n// Gamut check — is (l, c, h) within sRGB?\n// ---------------------------------------------------------------------------\n\nexport function isInGamut(l: number, c: number, h: number): boolean {\n const lab = oklchToOklab(l, c, h);\n const lin = oklabToLinearRgb(lab.L, lab.a, lab.b);\n const eps = 0.001;\n return (\n lin.r >= -eps &&\n lin.r <= 1 + eps &&\n lin.g >= -eps &&\n lin.g <= 1 + eps &&\n lin.b >= -eps &&\n lin.b <= 1 + eps\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gamut mapping — reduce chroma until in gamut (binary search)\n// ---------------------------------------------------------------------------\n\nexport function gamutMapChroma(l: number, c: number, h: number): number {\n if (isInGamut(l, c, h)) return c;\n let lo = 0;\n let hi = c;\n while (hi - lo > 0.001) {\n const mid = (lo + hi) / 2;\n if (isInGamut(l, mid, h)) lo = mid;\n else hi = mid;\n }\n return lo;\n}\n\n// ---------------------------------------------------------------------------\n// Max chroma for a given (l, h) — for area rendering\n// ---------------------------------------------------------------------------\n\nexport function maxChromaForLH(l: number, h: number): number {\n let lo = 0;\n let hi = MAX_CHROMA;\n while (hi - lo > 0.001) {\n const mid = (lo + hi) / 2;\n if (isInGamut(l, mid, h)) lo = mid;\n else hi = mid;\n }\n return lo;\n}\n\n// ---------------------------------------------------------------------------\n// Hex parsing & formatting\n// ---------------------------------------------------------------------------\n\nexport function hexToRgb(hex: string): [number, number, number, number] {\n hex = hex.replace(/^#/, \"\");\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n}\n\nexport function rgbToHex(r: number, g: number, b: number, a?: number): string {\n const hex = [r, g, b]\n .map((v) => clamp(Math.round(v), 0, 255).toString(16).padStart(2, \"0\"))\n .join(\"\");\n if (a !== undefined && a < 1) {\n return `#${hex}${clamp(Math.round(a * 255), 0, 255)\n .toString(16)\n .padStart(2, \"0\")}`;\n }\n return `#${hex}`;\n}\n\n// ---------------------------------------------------------------------------\n// Parse any CSS color string → OklchColor\n// ---------------------------------------------------------------------------\n\nexport function parseColor(input: string): OklchColor | null {\n const s = input.trim().toLowerCase();\n\n // hex: #rgb, #rgba, #rrggbb, #rrggbbaa\n if (s.startsWith(\"#\")) {\n const [r, g, b, a] = hexToRgb(s);\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n const oklch = rgbToOklch(r, g, b);\n return { l: oklch.l, c: oklch.c, h: oklch.h, a };\n }\n\n // oklch(l% c h) or oklch(l% c h / a)\n const oklchMatch = s.match(\n /oklch\\(\\s*([\\d.]+)%?\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)/,\n );\n if (oklchMatch) {\n let l = parseFloat(oklchMatch[1]);\n if (l > 1) l /= 100; // handle percentage\n const c = parseFloat(oklchMatch[2]);\n const h = parseFloat(oklchMatch[3]);\n let a = 1;\n if (oklchMatch[4]) {\n a = oklchMatch[4].endsWith(\"%\")\n ? parseFloat(oklchMatch[4]) / 100\n : parseFloat(oklchMatch[4]);\n }\n return { l, c, h, a };\n }\n\n // rgb(r, g, b) or rgb(r g b) or rgba(r, g, b, a)\n const rgbMatch = s.match(\n /rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)(?:[,\\s/]+([\\d.]+%?))?\\s*\\)/,\n );\n if (rgbMatch) {\n const r = parseFloat(rgbMatch[1]);\n const g = parseFloat(rgbMatch[2]);\n const b = parseFloat(rgbMatch[3]);\n let a = 1;\n if (rgbMatch[4]) {\n a = rgbMatch[4].endsWith(\"%\")\n ? parseFloat(rgbMatch[4]) / 100\n : parseFloat(rgbMatch[4]);\n }\n const oklch = rgbToOklch(r, g, b);\n return { l: oklch.l, c: oklch.c, h: oklch.h, a };\n }\n\n // hsl(h, s%, l%) or hsla(h, s%, l%, a)\n const hslMatch = s.match(\n /hsla?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)%[,\\s]+([\\d.]+)%(?:[,\\s/]+([\\d.]+%?))?\\s*\\)/,\n );\n if (hslMatch) {\n const [r, g, b] = hslToRgb(\n parseFloat(hslMatch[1]),\n parseFloat(hslMatch[2]),\n parseFloat(hslMatch[3]),\n );\n let a = 1;\n if (hslMatch[4]) {\n a = hslMatch[4].endsWith(\"%\")\n ? parseFloat(hslMatch[4]) / 100\n : parseFloat(hslMatch[4]);\n }\n const oklch = rgbToOklch(r, g, b);\n return { l: oklch.l, c: oklch.c, h: oklch.h, a };\n }\n\n // Named colors — small subset for common use\n const named: Record<string, string> = {\n white: \"#ffffff\",\n black: \"#000000\",\n red: \"#ff0000\",\n green: \"#008000\",\n blue: \"#0000ff\",\n yellow: \"#ffff00\",\n cyan: \"#00ffff\",\n magenta: \"#ff00ff\",\n orange: \"#ffa500\",\n transparent: \"#00000000\",\n };\n if (named[s]) return parseColor(named[s]);\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// HSL ↔ RGB helpers\n// ---------------------------------------------------------------------------\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n s /= 100;\n l /= 100;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0,\n g = 0,\n b = 0;\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n return [\n Math.round((r + m) * 255),\n Math.round((g + m) * 255),\n Math.round((b + m) * 255),\n ];\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l * 100];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h * 360, s * 100, l * 100];\n}\n\n// ---------------------------------------------------------------------------\n// Format OklchColor → CSS string\n// ---------------------------------------------------------------------------\n\nexport function formatColor(color: OklchColor, format: ColorFormat): string {\n const hasAlpha = color.a < 1;\n\n switch (format) {\n case \"hex\": {\n const [r, g, b] = oklchToRgb(color.l, color.c, color.h);\n return rgbToHex(r, g, b, hasAlpha ? color.a : undefined);\n }\n case \"oklch\": {\n const l = round(color.l * 100, 1);\n const c = round(color.c, 3);\n const h = round(color.h, 1);\n return hasAlpha\n ? `oklch(${l}% ${c} ${h} / ${round(color.a, 2)})`\n : `oklch(${l}% ${c} ${h})`;\n }\n case \"rgb\": {\n const [r, g, b] = oklchToRgb(color.l, color.c, color.h);\n return hasAlpha\n ? `rgba(${r}, ${g}, ${b}, ${round(color.a, 2)})`\n : `rgb(${r}, ${g}, ${b})`;\n }\n case \"hsl\": {\n const [r, g, b] = oklchToRgb(color.l, color.c, color.h);\n const [h, s, l] = rgbToHsl(r, g, b);\n return hasAlpha\n ? `hsla(${round(h, 0)}, ${round(s, 1)}%, ${round(l, 1)}%, ${round(color.a, 2)})`\n : `hsl(${round(h, 0)}, ${round(s, 1)}%, ${round(l, 1)}%)`;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Render a 2D area gradient (lightness × chroma) for a given hue\n// Returns ImageData to draw onto a canvas\n// ---------------------------------------------------------------------------\n\nexport function renderAreaGradient(\n width: number,\n height: number,\n hue: number,\n): ImageData {\n const data = new ImageData(width, height);\n const buf = data.data;\n\n for (let y = 0; y < height; y++) {\n const l = 1 - y / (height - 1); // top = 1 (light), bottom = 0 (dark)\n for (let x = 0; x < width; x++) {\n const c = (x / (width - 1)) * MAX_CHROMA;\n const [r, g, b] = oklchToRgb(l, c, hue);\n const idx = (y * width + x) * 4;\n buf[idx] = r;\n buf[idx + 1] = g;\n buf[idx + 2] = b;\n buf[idx + 3] = 255;\n }\n }\n\n return data;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/components/columns.tsx
|
|
22
|
+
var columns_exports = {};
|
|
23
|
+
__export(columns_exports, {
|
|
24
|
+
Column: () => Column,
|
|
25
|
+
Columns: () => Columns
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(columns_exports);
|
|
28
|
+
|
|
29
|
+
// src/lib/utils.ts
|
|
30
|
+
var import_clsx = require("clsx");
|
|
31
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
32
|
+
function cn(...inputs) {
|
|
33
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/components/columns.tsx
|
|
37
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
38
|
+
var gapMap = {
|
|
39
|
+
0: "gap-0",
|
|
40
|
+
1: "gap-1",
|
|
41
|
+
2: "gap-2",
|
|
42
|
+
3: "gap-3",
|
|
43
|
+
4: "gap-4",
|
|
44
|
+
5: "gap-5",
|
|
45
|
+
6: "gap-6",
|
|
46
|
+
8: "gap-8",
|
|
47
|
+
10: "gap-10",
|
|
48
|
+
12: "gap-12"
|
|
49
|
+
};
|
|
50
|
+
var colClasses = {
|
|
51
|
+
sm: {
|
|
52
|
+
1: "sm:grid-cols-1",
|
|
53
|
+
2: "sm:grid-cols-2",
|
|
54
|
+
3: "sm:grid-cols-3",
|
|
55
|
+
4: "sm:grid-cols-4",
|
|
56
|
+
5: "sm:grid-cols-5",
|
|
57
|
+
6: "sm:grid-cols-6"
|
|
58
|
+
},
|
|
59
|
+
md: {
|
|
60
|
+
1: "md:grid-cols-1",
|
|
61
|
+
2: "md:grid-cols-2",
|
|
62
|
+
3: "md:grid-cols-3",
|
|
63
|
+
4: "md:grid-cols-4",
|
|
64
|
+
5: "md:grid-cols-5",
|
|
65
|
+
6: "md:grid-cols-6"
|
|
66
|
+
},
|
|
67
|
+
lg: {
|
|
68
|
+
1: "lg:grid-cols-1",
|
|
69
|
+
2: "lg:grid-cols-2",
|
|
70
|
+
3: "lg:grid-cols-3",
|
|
71
|
+
4: "lg:grid-cols-4",
|
|
72
|
+
5: "lg:grid-cols-5",
|
|
73
|
+
6: "lg:grid-cols-6"
|
|
74
|
+
},
|
|
75
|
+
never: {
|
|
76
|
+
1: "grid-cols-1",
|
|
77
|
+
2: "grid-cols-2",
|
|
78
|
+
3: "grid-cols-3",
|
|
79
|
+
4: "grid-cols-4",
|
|
80
|
+
5: "grid-cols-5",
|
|
81
|
+
6: "grid-cols-6"
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var spanClasses = {
|
|
85
|
+
sm: {
|
|
86
|
+
1: "sm:col-span-1",
|
|
87
|
+
2: "sm:col-span-2",
|
|
88
|
+
3: "sm:col-span-3",
|
|
89
|
+
4: "sm:col-span-4",
|
|
90
|
+
5: "sm:col-span-5",
|
|
91
|
+
6: "sm:col-span-6"
|
|
92
|
+
},
|
|
93
|
+
md: {
|
|
94
|
+
1: "md:col-span-1",
|
|
95
|
+
2: "md:col-span-2",
|
|
96
|
+
3: "md:col-span-3",
|
|
97
|
+
4: "md:col-span-4",
|
|
98
|
+
5: "md:col-span-5",
|
|
99
|
+
6: "md:col-span-6"
|
|
100
|
+
},
|
|
101
|
+
lg: {
|
|
102
|
+
1: "lg:col-span-1",
|
|
103
|
+
2: "lg:col-span-2",
|
|
104
|
+
3: "lg:col-span-3",
|
|
105
|
+
4: "lg:col-span-4",
|
|
106
|
+
5: "lg:col-span-5",
|
|
107
|
+
6: "lg:col-span-6"
|
|
108
|
+
},
|
|
109
|
+
never: {
|
|
110
|
+
1: "col-span-1",
|
|
111
|
+
2: "col-span-2",
|
|
112
|
+
3: "col-span-3",
|
|
113
|
+
4: "col-span-4",
|
|
114
|
+
5: "col-span-5",
|
|
115
|
+
6: "col-span-6"
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
function Columns({
|
|
119
|
+
className,
|
|
120
|
+
count = 3,
|
|
121
|
+
gap = 4,
|
|
122
|
+
collapse = "md",
|
|
123
|
+
children,
|
|
124
|
+
...props
|
|
125
|
+
}) {
|
|
126
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
"data-slot": "columns",
|
|
130
|
+
className: cn(
|
|
131
|
+
"grid grid-cols-1",
|
|
132
|
+
colClasses[collapse]?.[count],
|
|
133
|
+
gapMap[gap],
|
|
134
|
+
className
|
|
135
|
+
),
|
|
136
|
+
...props,
|
|
137
|
+
children
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function Column({
|
|
142
|
+
className,
|
|
143
|
+
span = 1,
|
|
144
|
+
collapse = "md",
|
|
145
|
+
children,
|
|
146
|
+
...props
|
|
147
|
+
}) {
|
|
148
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
"data-slot": "column",
|
|
152
|
+
className: cn(span > 1 && spanClasses[collapse]?.[span], className),
|
|
153
|
+
...props,
|
|
154
|
+
children
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
159
|
+
0 && (module.exports = {
|
|
160
|
+
Column,
|
|
161
|
+
Columns
|
|
162
|
+
});
|
|
163
|
+
//# sourceMappingURL=columns.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/columns.tsx","../../src/lib/utils.ts"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"../lib/utils\";\n\nconst gapMap: Record<number, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 5: \"gap-5\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n 10: \"gap-10\",\n 12: \"gap-12\",\n};\n\n// Responsive: 1 col by default, N cols at breakpoint\nconst colClasses: Record<string, Record<number, string>> = {\n sm: {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n },\n md: {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n },\n lg: {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n },\n never: {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n },\n};\n\nconst spanClasses: Record<string, Record<number, string>> = {\n sm: {\n 1: \"sm:col-span-1\",\n 2: \"sm:col-span-2\",\n 3: \"sm:col-span-3\",\n 4: \"sm:col-span-4\",\n 5: \"sm:col-span-5\",\n 6: \"sm:col-span-6\",\n },\n md: {\n 1: \"md:col-span-1\",\n 2: \"md:col-span-2\",\n 3: \"md:col-span-3\",\n 4: \"md:col-span-4\",\n 5: \"md:col-span-5\",\n 6: \"md:col-span-6\",\n },\n lg: {\n 1: \"lg:col-span-1\",\n 2: \"lg:col-span-2\",\n 3: \"lg:col-span-3\",\n 4: \"lg:col-span-4\",\n 5: \"lg:col-span-5\",\n 6: \"lg:col-span-6\",\n },\n never: {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n },\n};\n\nfunction Columns({\n className,\n count = 3,\n gap = 4,\n collapse = \"md\",\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n count?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: number;\n collapse?: \"sm\" | \"md\" | \"lg\" | \"never\";\n}) {\n return (\n <div\n data-slot=\"columns\"\n className={cn(\n \"grid grid-cols-1\",\n colClasses[collapse]?.[count],\n gapMap[gap],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nfunction Column({\n className,\n span = 1,\n collapse = \"md\",\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n span?: 1 | 2 | 3 | 4 | 5 | 6;\n collapse?: \"sm\" | \"md\" | \"lg\" | \"never\";\n}) {\n return (\n <div\n data-slot=\"column\"\n className={cn(span > 1 && spanClasses[collapse]?.[span], className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport { Columns, Column };\n\nexport type ColumnsProps = React.ComponentProps<typeof Columns>;\nexport type ColumnProps = React.ComponentProps<typeof Column>;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADgGI;AAjGJ,IAAM,SAAiC;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,aAAqD;AAAA,EACzD,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,IAAM,cAAsD;AAAA,EAC1D,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,IAAI,KAAK;AAAA,QAC5B,OAAO,GAAG;AAAA,QACV;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,OAAO,KAAK,YAAY,QAAQ,IAAI,IAAI,GAAG,SAAS;AAAA,MACjE,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
declare function Columns({ className, count, gap, collapse, children, ...props }: React.ComponentProps<"div"> & {
|
|
4
|
+
count?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
+
gap?: number;
|
|
6
|
+
collapse?: "sm" | "md" | "lg" | "never";
|
|
7
|
+
}): react_jsx_runtime.JSX.Element;
|
|
8
|
+
declare function Column({ className, span, collapse, children, ...props }: React.ComponentProps<"div"> & {
|
|
9
|
+
span?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
10
|
+
collapse?: "sm" | "md" | "lg" | "never";
|
|
11
|
+
}): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
type ColumnsProps = React.ComponentProps<typeof Columns>;
|
|
14
|
+
type ColumnProps = React.ComponentProps<typeof Column>;
|
|
15
|
+
|
|
16
|
+
export { Column, type ColumnProps, Columns, type ColumnsProps };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
declare function Columns({ className, count, gap, collapse, children, ...props }: React.ComponentProps<"div"> & {
|
|
4
|
+
count?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
5
|
+
gap?: number;
|
|
6
|
+
collapse?: "sm" | "md" | "lg" | "never";
|
|
7
|
+
}): react_jsx_runtime.JSX.Element;
|
|
8
|
+
declare function Column({ className, span, collapse, children, ...props }: React.ComponentProps<"div"> & {
|
|
9
|
+
span?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
10
|
+
collapse?: "sm" | "md" | "lg" | "never";
|
|
11
|
+
}): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
type ColumnsProps = React.ComponentProps<typeof Columns>;
|
|
14
|
+
type ColumnProps = React.ComponentProps<typeof Column>;
|
|
15
|
+
|
|
16
|
+
export { Column, type ColumnProps, Columns, type ColumnsProps };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/lib/utils.ts
|
|
4
|
+
import { clsx } from "clsx";
|
|
5
|
+
import { twMerge } from "tailwind-merge";
|
|
6
|
+
function cn(...inputs) {
|
|
7
|
+
return twMerge(clsx(inputs));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// src/components/columns.tsx
|
|
11
|
+
import { jsx } from "react/jsx-runtime";
|
|
12
|
+
var gapMap = {
|
|
13
|
+
0: "gap-0",
|
|
14
|
+
1: "gap-1",
|
|
15
|
+
2: "gap-2",
|
|
16
|
+
3: "gap-3",
|
|
17
|
+
4: "gap-4",
|
|
18
|
+
5: "gap-5",
|
|
19
|
+
6: "gap-6",
|
|
20
|
+
8: "gap-8",
|
|
21
|
+
10: "gap-10",
|
|
22
|
+
12: "gap-12"
|
|
23
|
+
};
|
|
24
|
+
var colClasses = {
|
|
25
|
+
sm: {
|
|
26
|
+
1: "sm:grid-cols-1",
|
|
27
|
+
2: "sm:grid-cols-2",
|
|
28
|
+
3: "sm:grid-cols-3",
|
|
29
|
+
4: "sm:grid-cols-4",
|
|
30
|
+
5: "sm:grid-cols-5",
|
|
31
|
+
6: "sm:grid-cols-6"
|
|
32
|
+
},
|
|
33
|
+
md: {
|
|
34
|
+
1: "md:grid-cols-1",
|
|
35
|
+
2: "md:grid-cols-2",
|
|
36
|
+
3: "md:grid-cols-3",
|
|
37
|
+
4: "md:grid-cols-4",
|
|
38
|
+
5: "md:grid-cols-5",
|
|
39
|
+
6: "md:grid-cols-6"
|
|
40
|
+
},
|
|
41
|
+
lg: {
|
|
42
|
+
1: "lg:grid-cols-1",
|
|
43
|
+
2: "lg:grid-cols-2",
|
|
44
|
+
3: "lg:grid-cols-3",
|
|
45
|
+
4: "lg:grid-cols-4",
|
|
46
|
+
5: "lg:grid-cols-5",
|
|
47
|
+
6: "lg:grid-cols-6"
|
|
48
|
+
},
|
|
49
|
+
never: {
|
|
50
|
+
1: "grid-cols-1",
|
|
51
|
+
2: "grid-cols-2",
|
|
52
|
+
3: "grid-cols-3",
|
|
53
|
+
4: "grid-cols-4",
|
|
54
|
+
5: "grid-cols-5",
|
|
55
|
+
6: "grid-cols-6"
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var spanClasses = {
|
|
59
|
+
sm: {
|
|
60
|
+
1: "sm:col-span-1",
|
|
61
|
+
2: "sm:col-span-2",
|
|
62
|
+
3: "sm:col-span-3",
|
|
63
|
+
4: "sm:col-span-4",
|
|
64
|
+
5: "sm:col-span-5",
|
|
65
|
+
6: "sm:col-span-6"
|
|
66
|
+
},
|
|
67
|
+
md: {
|
|
68
|
+
1: "md:col-span-1",
|
|
69
|
+
2: "md:col-span-2",
|
|
70
|
+
3: "md:col-span-3",
|
|
71
|
+
4: "md:col-span-4",
|
|
72
|
+
5: "md:col-span-5",
|
|
73
|
+
6: "md:col-span-6"
|
|
74
|
+
},
|
|
75
|
+
lg: {
|
|
76
|
+
1: "lg:col-span-1",
|
|
77
|
+
2: "lg:col-span-2",
|
|
78
|
+
3: "lg:col-span-3",
|
|
79
|
+
4: "lg:col-span-4",
|
|
80
|
+
5: "lg:col-span-5",
|
|
81
|
+
6: "lg:col-span-6"
|
|
82
|
+
},
|
|
83
|
+
never: {
|
|
84
|
+
1: "col-span-1",
|
|
85
|
+
2: "col-span-2",
|
|
86
|
+
3: "col-span-3",
|
|
87
|
+
4: "col-span-4",
|
|
88
|
+
5: "col-span-5",
|
|
89
|
+
6: "col-span-6"
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
function Columns({
|
|
93
|
+
className,
|
|
94
|
+
count = 3,
|
|
95
|
+
gap = 4,
|
|
96
|
+
collapse = "md",
|
|
97
|
+
children,
|
|
98
|
+
...props
|
|
99
|
+
}) {
|
|
100
|
+
return /* @__PURE__ */ jsx(
|
|
101
|
+
"div",
|
|
102
|
+
{
|
|
103
|
+
"data-slot": "columns",
|
|
104
|
+
className: cn(
|
|
105
|
+
"grid grid-cols-1",
|
|
106
|
+
colClasses[collapse]?.[count],
|
|
107
|
+
gapMap[gap],
|
|
108
|
+
className
|
|
109
|
+
),
|
|
110
|
+
...props,
|
|
111
|
+
children
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
function Column({
|
|
116
|
+
className,
|
|
117
|
+
span = 1,
|
|
118
|
+
collapse = "md",
|
|
119
|
+
children,
|
|
120
|
+
...props
|
|
121
|
+
}) {
|
|
122
|
+
return /* @__PURE__ */ jsx(
|
|
123
|
+
"div",
|
|
124
|
+
{
|
|
125
|
+
"data-slot": "column",
|
|
126
|
+
className: cn(span > 1 && spanClasses[collapse]?.[span], className),
|
|
127
|
+
...props,
|
|
128
|
+
children
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
export {
|
|
133
|
+
Column,
|
|
134
|
+
Columns
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/components/columns.tsx"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { cn } from \"../lib/utils\";\n\nconst gapMap: Record<number, string> = {\n 0: \"gap-0\",\n 1: \"gap-1\",\n 2: \"gap-2\",\n 3: \"gap-3\",\n 4: \"gap-4\",\n 5: \"gap-5\",\n 6: \"gap-6\",\n 8: \"gap-8\",\n 10: \"gap-10\",\n 12: \"gap-12\",\n};\n\n// Responsive: 1 col by default, N cols at breakpoint\nconst colClasses: Record<string, Record<number, string>> = {\n sm: {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n },\n md: {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n },\n lg: {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n },\n never: {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n },\n};\n\nconst spanClasses: Record<string, Record<number, string>> = {\n sm: {\n 1: \"sm:col-span-1\",\n 2: \"sm:col-span-2\",\n 3: \"sm:col-span-3\",\n 4: \"sm:col-span-4\",\n 5: \"sm:col-span-5\",\n 6: \"sm:col-span-6\",\n },\n md: {\n 1: \"md:col-span-1\",\n 2: \"md:col-span-2\",\n 3: \"md:col-span-3\",\n 4: \"md:col-span-4\",\n 5: \"md:col-span-5\",\n 6: \"md:col-span-6\",\n },\n lg: {\n 1: \"lg:col-span-1\",\n 2: \"lg:col-span-2\",\n 3: \"lg:col-span-3\",\n 4: \"lg:col-span-4\",\n 5: \"lg:col-span-5\",\n 6: \"lg:col-span-6\",\n },\n never: {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n },\n};\n\nfunction Columns({\n className,\n count = 3,\n gap = 4,\n collapse = \"md\",\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n count?: 1 | 2 | 3 | 4 | 5 | 6;\n gap?: number;\n collapse?: \"sm\" | \"md\" | \"lg\" | \"never\";\n}) {\n return (\n <div\n data-slot=\"columns\"\n className={cn(\n \"grid grid-cols-1\",\n colClasses[collapse]?.[count],\n gapMap[gap],\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nfunction Column({\n className,\n span = 1,\n collapse = \"md\",\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n span?: 1 | 2 | 3 | 4 | 5 | 6;\n collapse?: \"sm\" | \"md\" | \"lg\" | \"never\";\n}) {\n return (\n <div\n data-slot=\"column\"\n className={cn(span > 1 && spanClasses[collapse]?.[span], className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport { Columns, Column };\n\nexport type ColumnsProps = React.ComponentProps<typeof Columns>;\nexport type ColumnProps = React.ComponentProps<typeof Column>;\n"],"mappings":";;;AAAA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACgGI;AAjGJ,IAAM,SAAiC;AAAA,EACrC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,aAAqD;AAAA,EACzD,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,IAAM,cAAsD;AAAA,EAC1D,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,IAAI,KAAK;AAAA,QAC5B,OAAO,GAAG;AAAA,QACV;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,OAAO,KAAK,YAAY,QAAQ,IAAI,IAAI,GAAG,SAAS;AAAA,MACjE,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
|