@ckc-net/puck-extended 0.2.2 → 0.3.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Label","Label","LabelUI","CheckboxPrimitive","newValues: any[]","Label","InputPrimitive","Label","SelectPrimitive","Label","Label","RadioGroupPrimitive","RadioPrimitive","Label","FieldPrimitive","Label","Separator","TabsPrimitive","cssAnimationPresets","cssTransitionPresets","handleValueChange: AccordionProps[\"onValueChange\"]","value","AccordionPrimitive","handleItemOpenChange: AccordionItemProps[\"onOpenChange\"]","usePuck","result: OrganizedStructure","ungrouped: React.ReactNode[]","fieldName: string | null","TooltipPrimitive","ActionBar","DrawerItem","FieldGroups","Label","FieldCheckbox","FieldNumberUnit","FieldRadio","FieldSelect","FieldInput","FieldTextarea","typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"]","PopoverPrimitive","ScrollAreaPrimitive","DialogPrimitive","middle: number[]","items: (number | \"ellipsis\")[]","getEditorConfig","DEFAULT_VALUE: PagePickerValue","PAGE_SIZE","DEFAULT_VALUE","ColorPickerContent: React.FC<ColorPickerContentProps>","ColorPicker: React.FC<ColorPickerProps>","parts: string[]","DEFAULT_VALUE: MediaPickerValue","MenuPrimitive","SeparatorPrimitive","SwitchPrimitive","animationField: Fields","attributes: Record<string, string>","animationDefaultProps: AnimationTraitProps","displayField: Fields","classes: string[]","displayDefaultProps: DisplayTraitProps","fontWeightField: Fields","fontWeightDefaultProps: FontWeightTraitProps","lineHeightField: Fields","lineHeightDefaultProps: LineHeightTraitProps","marginField: Fields","classes: string[]","marginDefaultProps: MarginTraitProps","paddingField: Fields","classes: string[]","paddingDefaultProps: PaddingTraitProps","positionField: Fields","classes: string[]","positionDefaultProps: PositionTraitProps","sizeField: Fields","classes: string[]","sizeDefaultProps: SizeTraitProps","spacingDefaultProps: SpacingTraitProps","textAlignField: Fields","textAlignDefaultProps: TextAlignTraitProps","textColorField: Fields","Label","ColorPicker","textColorDefaultProps: TextColorTraitProps","textDecorationField: Fields","classes: string[]","textDecorationDefaultProps: TextDecorationTraitProps","textSizeField: Fields","textSizeDefaultProps: TextSizeTraitProps","textTransformField: Fields","textTransformDefaultProps: TextTransformTraitProps","typographyDefaultProps: TypographyTraitProps"],"sources":["../src/lib/utils.ts","../src/components/ui/label.tsx","../src/components/Fields/Label/index.tsx","../src/components/ui/checkbox.tsx","../src/components/Fields/Checkbox/index.tsx","../src/components/ui/input.tsx","../src/components/Fields/Input/index.tsx","../src/components/ui/select.tsx","../src/components/Fields/NumberUnit/index.tsx","../src/components/Fields/Select/index.tsx","../src/components/ui/radio.tsx","../src/components/Fields/Radio/index.tsx","../src/components/ui/textarea.tsx","../src/components/Fields/Textarea/index.tsx","../src/components/ActionBar/index.tsx","../src/components/ui/tabs.tsx","../src/components/ui/accordion.tsx","../src/components/FieldGroups/index.tsx","../src/components/ui/tooltip.tsx","../src/components/DrawerItem/index.tsx","../src/overrides/plugin.tsx","../src/components/ui/button.tsx","../src/components/ui/popover.tsx","../src/components/ui/badge.tsx","../src/components/ui/scroll-area.tsx","../src/components/ui/dialog.tsx","../src/components/ui/input-group.tsx","../src/components/ui/frame.tsx","../src/components/ui/pagination.tsx","../src/components/ui/table.tsx","../src/components/PickerModal/index.tsx","../src/components/PagePicker/index.tsx","../src/components/RichTextMenuLink/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/RichTextMenuColorPicker/index.tsx","../src/components/MediaPicker/index.tsx","../src/components/ui/menu.tsx","../src/components/ui/separator.tsx","../src/components/ui/switch.tsx","../src/components/ui/toast.tsx","../src/utils/animation.tsx","../src/utils/display.tsx","../src/utils/fontWeight.tsx","../src/utils/lineHeight.tsx","../src/utils/margin.tsx","../src/utils/padding.tsx","../src/utils/position.tsx","../src/utils/size.tsx","../src/utils/spacing.tsx","../src/utils/spacingOptions.ts","../src/utils/textAlign.tsx","../src/utils/textColor.tsx","../src/utils/textDecoration.tsx","../src/utils/textSize.tsx","../src/utils/textTransform.tsx","../src/utils/typography.tsx","../src/hooks/useOptimizedImage.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","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { LockIcon } from \"lucide-react\"\n\nfunction Label({\n className,\n readOnly,\n children,\n ...props\n}: React.ComponentProps<\"label\"> & { readOnly?: boolean }) {\n return (\n <label\n data-slot=\"label\"\n data-readonly={readOnly ? \"\" : undefined}\n className={cn(\n \"text-secondary-foreground/66 mb-3 flex items-center justify-between gap-2 text-sm leading-none font-normal select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n {readOnly && <LockIcon className=\"size-4\" />}\n </label>\n )\n}\n\nexport { Label }\n","import { Label as LabelUI } from \"../../ui/label\"\n\nconst Label = ({ label, readOnly }: { label?: string; readOnly?: boolean }) => (\n <LabelUI readOnly={readOnly}>\n {label}\n </LabelUI>\n)\n\nexport default Label\n","\"use client\"\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon } from \"lucide-react\"\n\ntype CheckboxLayout = \"horizontal\" | \"inline\"\n\ninterface CheckboxProps extends CheckboxPrimitive.Root.Props {\n layout?: CheckboxLayout\n}\n\nfunction Checkbox({\n className,\n layout = \"horizontal\",\n ...props\n}: CheckboxProps) {\n const isHorizontal = layout === \"horizontal\"\n\n if (isHorizontal) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[checked]:text-primary-500 border-input relative block flex shrink-0 cursor-pointer items-center justify-center rounded-md border bg-white p-2 transition-shadow outline-none hover:bg-stone-50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-stone-50 data-[checked]:font-semibold\",\n className\n )}\n {...props}\n />\n )\n }\n\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input size-5 shrink-0 rounded-sm border bg-white transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"cn-checkbox-indicator grid h-full place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\nexport type { CheckboxLayout }\n","import React from \"react\"\nimport { Field, FieldProps } from \"@puckeditor/core\"\nimport Label from \"../Label\"\nimport { Checkbox, CheckboxLayout } from \"../../ui/checkbox\"\n\ntype CheckboxProps = FieldProps<Field<any>> & {\n name: string\n field: Field<any> & {\n options?: ReadonlyArray<{ label: React.ReactNode; value: any }>\n layout?: CheckboxLayout\n }\n}\n\nconst FieldCheckbox = ({\n onChange,\n value,\n readOnly,\n field,\n label,\n}: CheckboxProps & { label: string }) => {\n if (!field.options || !Array.isArray(field.options)) {\n return null\n }\n\n const selectedValues = Array.isArray(value) ? value : []\n const layout = field.layout || \"horizontal\"\n\n const handleChange = (optionValue: any, checked: unknown) => {\n if (!readOnly && typeof checked === \"boolean\") {\n let newValues: any[]\n if (checked) {\n newValues = [...selectedValues, optionValue]\n } else {\n newValues = selectedValues.filter((v) => v !== optionValue)\n }\n onChange(newValues)\n }\n }\n\n const containerClassName =\n layout === \"horizontal\"\n ? \"flex w-fit flex-wrap gap-1.5\"\n : \"flex flex-col gap-3\"\n\n return (\n <>\n <Label label={label} readOnly={readOnly} />\n <div className={containerClassName}>\n {field.options.map((option, index) => {\n const optionValue = option.value\n const key = `${String(optionValue)}-${index}`\n const isChecked = selectedValues.includes(optionValue)\n\n if (layout === \"horizontal\") {\n return (\n <label key={key} className=\"flex-1\">\n <Checkbox\n layout=\"horizontal\"\n checked={isChecked}\n onCheckedChange={(checked) =>\n handleChange(optionValue, checked)\n }\n disabled={readOnly}\n >\n {option.label || option.value?.toString()}\n </Checkbox>\n </label>\n )\n }\n\n return (\n <label\n key={key}\n className=\"flex cursor-pointer items-center gap-3\"\n >\n <Checkbox\n layout=\"inline\"\n checked={isChecked}\n onCheckedChange={(checked) =>\n handleChange(optionValue, checked)\n }\n disabled={readOnly}\n />\n <span className=\"text-sm\">\n {option.label || option.value?.toString()}\n </span>\n </label>\n )\n })}\n </div>\n </>\n )\n}\n\nexport default FieldCheckbox\n","\"use client\"\n\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype InputProps = Omit<\n InputPrimitive.Props & React.RefAttributes<HTMLInputElement>,\n \"size\"\n> & {\n size?: \"sm\" | \"default\" | \"lg\" | number\n unstyled?: boolean\n nativeInput?: boolean\n}\n\nfunction Input({\n className,\n size = \"default\",\n unstyled = false,\n nativeInput = false,\n ...props\n}: InputProps) {\n const inputClassName = cn(\n \"h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none placeholder:text-muted-foreground/72 sm:h-7.5 sm:leading-7.5\",\n size === \"sm\" &&\n \"h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:h-6.5 sm:leading-6.5\",\n size === \"lg\" && \"h-9.5 leading-9.5 sm:h-8.5 sm:leading-8.5\",\n props.type === \"search\" &&\n \"[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none\",\n props.type === \"file\" &&\n \"text-muted-foreground file:me-3 file:bg-transparent file:font-medium file:text-foreground file:text-sm\"\n )\n\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"h-full border-input bg-background ring-ring/24 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/6%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className\n ) || undefined\n }\n data-size={size}\n data-slot=\"input-control\"\n >\n {nativeInput ? (\n <input\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n {...props}\n />\n ) : (\n <InputPrimitive\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n {...props}\n />\n )}\n </span>\n )\n}\n\nexport { Input, type InputProps }\n","import Label from \"../Label\"\nimport { Input } from \"../../ui/input\"\n\nconst FieldInput = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value?: string\n label?: string\n field: any\n readOnly?: boolean\n}) => (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} />}\n <Input\n type=\"text\"\n value={value || \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.currentTarget.value)}\n readOnly={field.readOnly || readOnly}\n />\n </>\n)\n\nexport default FieldInput\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport {\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ChevronUpIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst Select = SelectPrimitive.Root;\n\nconst selectTriggerVariants = cva(\n \"relative inline-flex min-h-9 w-full min-w-36 select-none items-center justify-between gap-2 rounded-lg border border-input bg-background not-dark:bg-clip-padding px-[calc(--spacing(3)-1px)] text-left text-base text-foreground shadow-xs/5 outline-none ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 focus-visible:border-ring focus-visible:ring-[3px] aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm dark:bg-input/32 dark:aria-invalid:ring-destructive/24 dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 [[data-disabled],:focus-visible,[aria-invalid],[data-pressed]]:shadow-none\",\n {\n defaultVariants: {\n size: \"default\",\n },\n variants: {\n size: {\n default: \"\",\n lg: \"min-h-10 sm:min-h-9\",\n sm: \"min-h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:min-h-7\",\n },\n },\n },\n);\n\nconst selectTriggerIconClassName = \"-me-1 size-4.5 opacity-80 sm:size-4\";\n\ninterface SelectButtonProps extends useRender.ComponentProps<\"button\"> {\n size?: VariantProps<typeof selectTriggerVariants>[\"size\"];\n}\n\nfunction SelectButton({\n className,\n size,\n render,\n children,\n ...props\n}: SelectButtonProps) {\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const defaultProps = {\n children: (\n <>\n <span className=\"flex-1 truncate in-data-placeholder:text-muted-foreground/72\">\n {children}\n </span>\n <ChevronsUpDownIcon className={selectTriggerIconClassName} />\n </>\n ),\n className: cn(selectTriggerVariants({ size }), \"min-w-0\", className),\n \"data-slot\": \"select-button\",\n type: typeValue,\n };\n\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & VariantProps<typeof selectTriggerVariants>) {\n return (\n <SelectPrimitive.Trigger\n className={cn(selectTriggerVariants({ size }), className)}\n data-slot=\"select-trigger\"\n {...props}\n >\n {children}\n <SelectPrimitive.Icon data-slot=\"select-icon\">\n <ChevronsUpDownIcon className={selectTriggerIconClassName} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n className={cn(\n \"flex-1 truncate data-placeholder:text-muted-foreground\",\n className,\n )}\n data-slot=\"select-value\"\n {...props}\n />\n );\n}\n\nfunction SelectPopup({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"start\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n anchor,\n ...props\n}: SelectPrimitive.Popup.Props & {\n side?: SelectPrimitive.Positioner.Props[\"side\"];\n sideOffset?: SelectPrimitive.Positioner.Props[\"sideOffset\"];\n align?: SelectPrimitive.Positioner.Props[\"align\"];\n alignOffset?: SelectPrimitive.Positioner.Props[\"alignOffset\"];\n alignItemWithTrigger?: SelectPrimitive.Positioner.Props[\"alignItemWithTrigger\"];\n anchor?: SelectPrimitive.Positioner.Props[\"anchor\"];\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n align={align}\n alignItemWithTrigger={alignItemWithTrigger}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"z-50 select-none\"\n data-slot=\"select-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <SelectPrimitive.Popup\n className=\"origin-(--transform-origin) text-foreground\"\n data-slot=\"select-popup\"\n {...props}\n >\n <SelectPrimitive.ScrollUpArrow\n className=\"top-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:top-px before:h-[200%] before:rounded-t-[calc(var(--radius-lg)-1px)] before:bg-linear-to-b before:from-50% before:from-popover\"\n data-slot=\"select-scroll-up-arrow\"\n >\n <ChevronUpIcon className=\"relative size-4.5 sm:size-4\" />\n </SelectPrimitive.ScrollUpArrow>\n <div className=\"relative h-full min-w-(--anchor-width) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\">\n <SelectPrimitive.List\n className={cn(\n \"max-h-(--available-height) overflow-y-auto p-1\",\n className,\n )}\n data-slot=\"select-list\"\n >\n {children}\n </SelectPrimitive.List>\n </div>\n <SelectPrimitive.ScrollDownArrow\n className=\"bottom-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:bottom-px before:h-[200%] before:rounded-b-[calc(var(--radius-lg)-1px)] before:bg-linear-to-t before:from-50% before:from-popover\"\n data-slot=\"select-scroll-down-arrow\"\n >\n <ChevronDownIcon className=\"relative size-4.5 sm:size-4\" />\n </SelectPrimitive.ScrollDownArrow>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"select-item\"\n {...props}\n >\n <SelectPrimitive.ItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/1500/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n <SelectPrimitive.ItemText className=\"col-start-2 min-w-0\">\n {children}\n </SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"select-separator\"\n {...props}\n />\n );\n}\n\nfunction SelectGroup(props: SelectPrimitive.Group.Props) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectGroupLabel(props: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n className=\"px-2 py-1.5 font-medium text-muted-foreground text-xs\"\n data-slot=\"select-group-label\"\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectButton,\n selectTriggerVariants,\n SelectValue,\n SelectPopup,\n SelectPopup as SelectContent,\n SelectItem,\n SelectSeparator,\n SelectGroup,\n SelectGroupLabel,\n};\n","import { Input } from \"../../ui/input\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\"\nimport Label from \"../Label\"\n\nexport type NumberUnitValue = {\n value: string\n unit: string\n}\n\nconst FieldNumberUnit = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: NumberUnitValue) => void\n value: NumberUnitValue\n label: string\n field: any\n readOnly?: boolean\n}) => {\n const currentValue = value || {\n value: \"\",\n unit: field.options?.[0]?.value || \"\",\n }\n\n const handleInputChange = (newValue: string) => {\n if (!readOnly) {\n onChange({\n ...currentValue,\n value: newValue,\n })\n }\n }\n\n const handleUnitChange = (newUnit: unknown) => {\n if (!readOnly && typeof newUnit === \"string\") {\n onChange({\n ...currentValue,\n unit: newUnit,\n })\n }\n }\n\n return (\n <>\n <Label label={label} readOnly={field.readOnly || readOnly} />\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Input\n className=\"rounded-r-none before:rounded-r-none\"\n type=\"text\"\n placeholder={field.placeholder || \"Value\"}\n value={currentValue.value}\n onChange={(e) =>\n handleInputChange(e.currentTarget.value)\n }\n readOnly={field.readOnly || readOnly}\n />\n </div>\n <div className=\"w-18\">\n <Select\n items={field.options || []}\n value={currentValue.unit}\n onValueChange={handleUnitChange}\n disabled={field.readOnly || readOnly}\n >\n <SelectTrigger className=\"rounded-l-none before:rounded-l-none border-l-0 min-w-fit\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup align=\"end\" side=\"bottom\">\n {(field.options || []).map((option: any) => (\n <SelectItem\n key={option.value}\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </div>\n </div>\n </>\n )\n}\n\nexport default FieldNumberUnit\n","import {\n Select,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectPopup,\n SelectGroup,\n SelectGroupLabel,\n} from \"../../ui/select\"\nimport Label from \"../Label\"\n\nconst FieldSelect = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value: any\n label: string\n field: any\n readOnly?: boolean\n}) => {\n const placeholder = field.placeholder || \"Select an option\"\n\n // Check if the first option has an empty string value (default option)\n const hasEmptyStringDefault = field.options?.[0]?.value === \"\"\n\n const itemsWithPlaceholder = [\n { label: placeholder, value: null },\n ...field.options.map((option: any) => ({\n label: option.label,\n value: option.value,\n })),\n ]\n\n const handleValueChange = (newValue: unknown) => {\n if (!readOnly && newValue !== null && typeof newValue === \"string\") {\n onChange(newValue)\n }\n }\n\n // If value is undefined/null and we have an empty string default option, use \"\" instead of null\n const selectValue =\n value === undefined || value === null\n ? hasEmptyStringDefault\n ? \"\"\n : null\n : value\n\n // Organize options by group\n const groupedOptions = field.options.reduce((acc: any, option: any) => {\n const groupName = option.group || \"__ungrouped\"\n if (!acc[groupName]) {\n acc[groupName] = []\n }\n acc[groupName].push(option)\n return acc\n }, {})\n\n const hasGroups = Object.keys(groupedOptions).some(\n (key) => key !== \"__ungrouped\"\n )\n\n return (\n <>\n <Label label={label} readOnly={field.readOnly || readOnly} />\n <Select\n items={itemsWithPlaceholder}\n value={selectValue}\n onValueChange={handleValueChange}\n disabled={field.readOnly || readOnly}\n >\n <SelectTrigger className=\"min-w-46\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup align=\"center\" side=\"bottom\">\n {hasGroups ? (\n <>\n {Object.keys(groupedOptions).map(\n (groupName) => {\n const options =\n groupedOptions[groupName]\n return (\n <SelectGroup key={groupName}>\n {groupName !==\n \"__ungrouped\" && (\n <SelectGroupLabel>\n {groupName}\n </SelectGroupLabel>\n )}\n {options.map((option: any) => (\n <SelectItem\n key={\n typeof option.label ===\n \"string\"\n ? option.label\n : JSON.stringify(\n option.value\n )\n }\n value={option.value}\n >\n {option.label}\n\n </SelectItem>\n ))}\n </SelectGroup>\n )\n }\n )}\n </>\n ) : (\n field.options.map((option: any) => (\n <SelectItem\n key={\n typeof option.label === \"string\"\n ? option.label\n : JSON.stringify(option.value)\n }\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ))\n )}\n </SelectPopup>\n </Select>\n </>\n )\n}\n\nexport default FieldSelect\n","\"use client\"\n\nimport { Radio as RadioPrimitive } from \"@base-ui/react/radio\"\nimport { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype RadioLayout = \"horizontal\" | \"inline\"\n\ninterface RadioGroupProps extends RadioGroupPrimitive.Props {\n layout?: RadioLayout\n}\n\ninterface RadioGroupItemProps extends RadioPrimitive.Root.Props {\n layout?: RadioLayout\n}\n\nfunction RadioGroup({\n className,\n layout = \"horizontal\",\n ...props\n}: RadioGroupProps) {\n return (\n <RadioGroupPrimitive\n data-slot=\"radio-group\"\n className={cn(\"cn-radio-group w-full\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n layout = \"horizontal\",\n ...props\n}: RadioGroupItemProps) {\n const isHorizontal = layout === \"horizontal\"\n\n if (isHorizontal) {\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 group/radio-group-item peer data-[checked]:text-primary-500 relative block flex h-full shrink-0 cursor-pointer items-center justify-center border border-transparent bg-white px-2 py-1.5 text-xs transition-[color,box-shadow] outline-none hover:bg-stone-50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-stone-50 data-[checked]:font-semibold\",\n className\n )}\n {...props}\n />\n )\n }\n\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 group/radio-group-item peer border-input relative aspect-square size-4 shrink-0 rounded-full border bg-white transition-[color,box-shadow] outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"cn-radio-group-indicator\"\n >\n <span className=\"bg-foreground m-1 block size-1.5 rounded-full\"></span>\n </RadioPrimitive.Indicator>\n </RadioPrimitive.Root>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\nexport type { RadioLayout }\n","import React from \"react\"\nimport { Field, FieldProps } from \"@puckeditor/core\"\nimport Label from \"../Label\"\nimport { RadioGroup, RadioGroupItem, RadioLayout } from \"../../ui/radio\"\n\ntype RadioProps = FieldProps<Field<any>> & {\n name: string\n field: Field<any> & {\n options?: ReadonlyArray<{ label: React.ReactNode; value: any }>\n layout?: RadioLayout\n }\n}\n\nconst FieldRadio = ({\n onChange,\n value,\n readOnly,\n field,\n label,\n}: RadioProps & { label: string }) => {\n if (!field.options || !Array.isArray(field.options)) {\n return null\n }\n\n const layout = field.layout || \"horizontal\"\n\n const handleChange = (newValue: unknown) => {\n if (!readOnly && newValue != null) {\n onChange(newValue)\n }\n }\n\n const groupClassName =\n layout === \"horizontal\"\n ? \"border-input flex w-fit flex-wrap divide-x divide-stone-200 overflow-hidden rounded-md border\"\n : \"flex flex-col gap-3\"\n\n return (\n <>\n <Label label={label} readOnly={readOnly} />\n <RadioGroup\n layout={layout}\n value={value?.toString() || \"\"}\n onValueChange={handleChange}\n disabled={readOnly}\n className={groupClassName}\n >\n {field.options.map((option, index) => {\n const optionValue = String(option.value ?? \"\")\n const key = `${optionValue}-${index}`\n\n if (layout === \"horizontal\") {\n return (\n <label key={key} className=\"flex-1\">\n <RadioGroupItem\n layout=\"horizontal\"\n value={optionValue}\n disabled={readOnly}\n >\n {option.label || option.value?.toString()}\n </RadioGroupItem>\n </label>\n )\n }\n\n return (\n <label\n key={key}\n className=\"flex cursor-pointer items-center gap-3\"\n >\n <RadioGroupItem\n layout=\"inline\"\n value={optionValue}\n disabled={readOnly}\n />\n <span className=\"text-sm\">\n {option.label || option.value?.toString()}\n </span>\n </label>\n )\n })}\n </RadioGroup>\n </>\n )\n}\n\nexport default FieldRadio\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype TextareaProps = React.ComponentProps<\"textarea\"> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n};\n\nfunction Textarea({\n className,\n size = \"default\",\n unstyled = false,\n ...props\n}: TextareaProps) {\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/6%)] sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"textarea-control\"\n >\n <FieldPrimitive.Control\n render={(defaultProps) => (\n <textarea\n className={cn(\n \"field-sizing-content min-h-17.5 w-full rounded-[inherit] px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] outline-none max-sm:min-h-20.5\",\n size === \"sm\" &&\n \"min-h-16.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)] max-sm:min-h-19.5\",\n size === \"lg\" &&\n \"min-h-18.5 py-[calc(--spacing(2)-1px)] max-sm:min-h-21.5\",\n )}\n data-slot=\"textarea\"\n {...mergeProps(defaultProps, props)}\n />\n )}\n />\n </span>\n );\n}\n\nexport { Textarea, type TextareaProps };\n","import { Textarea } from \"../../ui/textarea\"\nimport Label from \"../Label\"\n\nconst FieldTextarea = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value?: string\n label: string\n field: any\n readOnly?: boolean\n}) => (\n <>\n <Label label={label} readOnly={field.readOnly || readOnly} />\n <Textarea\n value={value || \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.currentTarget.value)}\n readOnly={field.readOnly || readOnly}\n />\n </>\n)\n\nexport default FieldTextarea\n","import { ReactNode, SyntheticEvent } from \"react\"\n/* import { Button } from \"../ui/button\"\nimport { SparklesIcon } from \"lucide-react\" */\n\nconst Action = ({\n children,\n label,\n onClick,\n}: {\n children: ReactNode\n label?: string\n onClick: (e: SyntheticEvent) => void\n}) => (\n <button\n type=\"button\"\n className=\"hover:text-primary-500 mx-1 flex cursor-pointer items-center justify-center rounded border-none bg-transparent p-1.5 text-stone-700 transition-colors duration-50 hover:bg-stone-50\"\n onClick={onClick}\n title={label}\n >\n {children}\n </button>\n)\n\nconst Group = ({ children }: { children: ReactNode }) => (\n <div className=\"mx-2 flex h-full items-center first:ml-0 last:mr-0 empty:hidden [&>*]:m-0\">\n {children}\n </div>\n)\n\nconst Label = ({ label }: { label: string }) => (\n <div className=\"text-sm font-[var(--puck-font-family)] font-medium overflow-ellipsis whitespace-nowrap text-stone-700\">\n {label}\n </div>\n)\n\nconst Separator = () => <div className=\"h-full w-px bg-border\" />\n\nconst ActionBar = ({\n label,\n parentAction,\n children,\n}: {\n label?: string\n parentAction?: ReactNode\n children?: ReactNode\n}) => (\n <div\n className=\"border-input flex w-auto items-center rounded-lg border bg-white p-2 shadow-lg shadow-black/5\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n >\n {parentAction && (\n <>\n <ActionBar.Group>{parentAction}</ActionBar.Group>\n <ActionBar.Separator />\n </>\n )}\n {label && (\n <>\n <ActionBar.Group>\n <ActionBar.Label label={label} />\n </ActionBar.Group>\n <ActionBar.Separator />\n </>\n )}\n <ActionBar.Group>{children}</ActionBar.Group>\n {/* <ActionBar.Separator />\n <ActionBar.Group>\n <Button variant=\"primary\" size=\"sm\">\n <SparklesIcon className=\"size-4\" />\n </Button>\n </ActionBar.Group> */}\n </div>\n)\n\nActionBar.Action = Action\nActionBar.Label = Label\nActionBar.Group = Group\nActionBar.Separator = Separator\n\nexport default ActionBar\n","\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype TabsVariant = \"default\" | \"underline\"\n\nfunction Tabs({ className, ...props }: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n className={cn(\n \"flex flex-col gap-2 data-[orientation=vertical]:flex-row\",\n className\n )}\n data-slot=\"tabs\"\n {...props}\n />\n )\n}\n\nfunction TabsList({\n variant = \"default\",\n className,\n children,\n ...props\n}: TabsPrimitive.List.Props & {\n variant?: TabsVariant\n}) {\n return (\n <TabsPrimitive.List\n className={cn(\n \"text-muted-foreground relative z-0 flex w-fit items-center justify-center gap-x-0.5\",\n \"data-[orientation=vertical]:flex-col\",\n variant === \"default\"\n ? \"bg-muted text-muted-foreground/72 rounded-lg p-0.5\"\n : \"*:data-[slot=tabs-tab]:hover:bg-accent data-[orientation=horizontal]:py-1 data-[orientation=vertical]:px-1\",\n className\n )}\n data-slot=\"tabs-list\"\n {...props}\n >\n {children}\n <TabsPrimitive.Indicator\n className={cn(\n \"absolute bottom-0 left-0 h-(--active-tab-height) w-(--active-tab-width) translate-x-(--active-tab-left) -translate-y-(--active-tab-bottom) transition-[width,translate] duration-200 ease-in-out\",\n variant === \"underline\"\n ? \"bg-primary z-10 data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:translate-y-px data-[orientation=vertical]:w-0.5 data-[orientation=vertical]:-translate-x-px\"\n : \"bg-background dark:bg-input -z-1 rounded-md shadow-sm/5\"\n )}\n data-slot=\"tab-indicator\"\n />\n </TabsPrimitive.List>\n )\n}\n\nfunction TabsTab({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n className={cn(\n \"hover:text-muted-foreground focus-visible:ring-ring data-active:text-foreground flex h-9 shrink-0 grow cursor-pointer items-center justify-center gap-1.5 rounded-md border border-transparent px-[calc(--spacing(2.5)-1px)] text-base font-medium whitespace-nowrap transition-[color,background-color,box-shadow] outline-none focus-visible:ring-2 data-disabled:pointer-events-none data-disabled:opacity-64 data-[orientation=vertical]:w-full data-[orientation=vertical]:justify-start sm:h-8 sm:text-sm [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n data-slot=\"tabs-tab\"\n {...props}\n />\n )\n}\n\nfunction TabsPanel({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n className={cn(\"flex-1 outline-none\", className)}\n data-slot=\"tabs-content\"\n {...props}\n />\n )\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTab,\n TabsTab as TabsTrigger,\n TabsPanel,\n TabsPanel as TabsContent,\n}\n","\"use client\"\n\nimport React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\"\n\nimport { cn } from \"../../lib/utils\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nconst cssAnimationPresets = {\n none: \"transition-none\",\n fade: [\n `[transition-property:opacity,height] [will-change:opacity,height]`,\n `data-starting-style:opacity-0 data-ending-style:opacity-0 data-starting-style:h-0 data-ending-style:h-0`,\n ],\n scale: [\n `[transition-property:scale,opacity,height] [will-change:scale,opacity,height] origin-left`,\n `data-starting-style:scale-85 data-starting-style:opacity-0 data-starting-style:h-0 data-ending-style:opacity-0 data-ending-style:h-0 data-ending-style:scale-85`,\n ],\n slide: [\n `[transition-property:translate,opacity,height] [will-change:translate,opacity,height]`,\n `data-starting-style:opacity-0 data-starting-style:translate-y-[10px] data-ending-style:translate-y-[10px] data-ending-style:opacity-0 data-ending-style:h-0 data-starting-style:h-0`,\n ],\n perspective: [\n `[transition-property:opacity,rotateX,rotateY,transform,height] [will-change:opacity,rotateX,rotateY,transform,height]`,\n `[transform:perspective(1000px)] origin-top`,\n `data-starting-style:h-0 data-ending-style:h-0`,\n `data-starting-style:opacity-0 data-ending-style:opacity-0`,\n `data-starting-style:-rotate-x-[90deg] data-ending-style:-rotate-x-[90deg]`,\n ],\n perspectiveBlur: [\n `[transition-property:opacity,rotateX,rotateY,transform,height,filter] [will-change:opacity,rotateX,rotateY,transform,height,filter]`,\n `[transform:perspective(1000px)] origin-top`,\n `data-starting-style:h-0 data-ending-style:h-0`,\n `data-starting-style:opacity-0 data-ending-style:opacity-0`,\n `data-starting-style:-rotate-x-[90deg] data-ending-style:-rotate-x-[90deg]`,\n `data-starting-style:blur-[9px] data-ending-style:blur-[9px]`,\n ],\n}\n\nconst cssTransitionPresets = {\n inExpo: `duration-[0.35s] ease-[cubic-bezier(0.95,0.05,0.795,0.035)]`,\n outExpo: `duration-[0.35s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n inOutExpo: `duration-[0.35s] ease-[cubic-bezier(1,0,0,1)]`,\n anticipate: `duration-[0.35s] ease-[cubic-bezier(1,-0.4,0.35,0.95)]`,\n quickOut: `duration-[0.35s] ease-out`,\n overshootOut: `duration-[0.35s] ease-[cubic-bezier(0.175,0.885,0.32,1.275)]`,\n swiftOut: `duration-[0.35s] ease-[cubic-bezier(0.175,0.885,0.32,1.1)]`,\n snappyOut: `duration-[0.35s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n in: `duration-[0.35s] ease-[cubic-bezier(0.42,0,1,1)]`,\n out: `duration-[0.35s] ease-[cubic-bezier(0,0,0.58,1)]`,\n inOut: `duration-[0.25s] ease-[cubic-bezier(0.42,0,0.58,1)]`,\n outIn: `duration-[0.35s] ease-[cubic-bezier(0.1,0.7,0.9,0.5)]`,\n inQuad: `duration-[0.35s] ease-[cubic-bezier(0.55,0.085,0.68,0.53)]`,\n outQuad: `duration-[0.25s] ease-[cubic-bezier(0.25,0.46,0.45,0.94)]`,\n inOutQuad: `duration-[0.32s] ease-[cubic-bezier(0.455,0.03,0.515,0.955)]`,\n inCubic: `duration-[0.35s] ease-[cubic-bezier(0.55,0.055,0.675,0.19)]`,\n outCubic: `duration-[0.35s] ease-[cubic-bezier(0.215,0.61,0.355,1)]`,\n inOutCubic: `duration-[0.35s] ease-[cubic-bezier(0.645,0.045,0.355,1)]`,\n inQuart: `duration-[0.35s] ease-[cubic-bezier(0.895,0.03,0.685,0.22)]`,\n outQuart: `duration-[0.35s] ease-[cubic-bezier(0.165,0.84,0.44,1)]`,\n inOutQuart: `duration-[0.35s] ease-[cubic-bezier(0.77,0,0.175,1)]`,\n inQuint: `duration-[0.35s] ease-[cubic-bezier(0.755,0.05,0.855,0.06)]`,\n outQuint: `duration-[0.35s] ease-[cubic-bezier(0.23,1,0.32,1)]`,\n inOutQuint: `duration-[0.35s] ease-[cubic-bezier(0.86,0,0.07,1)]`,\n inCirc: `duration-[0.35s] ease-[cubic-bezier(0.6,0.04,0.98,0.335)]`,\n outCirc: `duration-[0.35s] ease-[cubic-bezier(0.075,0.82,0.165,1)]`,\n inOutCirc: `duration-[0.35s] ease-[cubic-bezier(0.785,0.135,0.15,0.86)]`,\n inOutBase: `duration-[0.35s] ease-[cubic-bezier(0.25,0.1,0.25,1)]`,\n}\n\ntype CSSAnimationPreset = keyof typeof cssAnimationPresets\ntype CSSTransitionPreset = keyof typeof cssTransitionPresets\n\ntype AccordionVariant = \"default\" | \"card\" | \"swiss\"\n\ninterface AccordionContextType {\n animationPreset?: CSSAnimationPreset\n transitionPreset?: CSSTransitionPreset\n reduceMotion?: boolean\n value: AccordionProps[\"value\"]\n onValueChange: AccordionProps[\"onValueChange\"]\n variant?: AccordionVariant\n}\n\nconst AccordionContext = createContext<AccordionContextType | undefined>(\n undefined\n)\n\nfunction useAccordion() {\n const context = useContext(AccordionContext)\n if (!context) {\n throw new Error(\"useAccordion must be used within a AccordionProvider\")\n }\n return context\n}\n\ninterface AccordionProps extends AccordionPrimitive.Root.Props {\n animationPreset?: CSSAnimationPreset\n transitionPreset?: CSSTransitionPreset\n reduceMotion?: boolean\n variant?: AccordionVariant\n}\n\nfunction Accordion({\n value,\n defaultValue,\n onValueChange,\n animationPreset = \"fade\",\n transitionPreset = \"outQuad\",\n reduceMotion,\n variant = \"default\",\n className,\n multiple = false,\n ...props\n}: AccordionProps) {\n const [accordionValue, setAccordionValue] = useState(\n value ?? defaultValue ?? []\n )\n\n const handleValueChange: AccordionProps[\"onValueChange\"] = (\n value,\n eventDetails\n ) => {\n setAccordionValue(value)\n onValueChange?.(value, eventDetails)\n }\n\n return (\n <AccordionContext.Provider\n value={{\n value: accordionValue,\n onValueChange: handleValueChange,\n animationPreset,\n transitionPreset,\n reduceMotion,\n variant,\n }}\n >\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n value={accordionValue}\n onValueChange={handleValueChange}\n multiple={multiple}\n className={cn(\n \"w-full\",\n variant === \"default\" &&\n \"flex flex-col rounded-2xl border outline-hidden\",\n variant === \"card\" && \"flex flex-col gap-1.5\",\n variant === \"swiss\" && \"rounded-2xl\",\n className\n )}\n {...props}\n />\n </AccordionContext.Provider>\n )\n}\n\ninterface AccordionItemContextType {\n open: boolean\n onOpenChange: AccordionItemProps[\"onOpenChange\"]\n variant?: AccordionVariant\n}\n\nconst AccordionItemContext = createContext<\n AccordionItemContextType | undefined\n>(undefined)\n\nfunction useAccordionItem() {\n const context = useContext(AccordionItemContext)\n if (!context) {\n throw new Error(\n \"useAccordionItem must be used within a AccordionItemProvider\"\n )\n }\n return context\n}\n\ninterface AccordionItemProps extends AccordionPrimitive.Item.Props {}\n\nfunction AccordionItem({\n value: itemValue,\n onOpenChange,\n className,\n ...rest\n}: AccordionItemProps) {\n const { value, variant = \"default\" } = useAccordion()\n\n const [isOpen, setIsOpen] = useState(value?.includes(itemValue) ?? false)\n\n useEffect(() => {\n setIsOpen(value?.includes(itemValue) ?? false)\n }, [value, itemValue])\n\n const handleItemOpenChange: AccordionItemProps[\"onOpenChange\"] = (\n open,\n eventDetails\n ) => {\n setIsOpen(open)\n onOpenChange?.(open, eventDetails)\n }\n\n return (\n <AccordionItemContext.Provider\n value={{\n open: isOpen,\n onOpenChange: handleItemOpenChange,\n variant,\n }}\n >\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n value={itemValue}\n onOpenChange={handleItemOpenChange}\n className={cn(\n \"w-full outline-hidden contain-layout\",\n // Base transitions - smooth all property changes\n `[transition-property:border-radius,margin,border] duration-260 ease-[cubic-bezier(0.215,0.61,0.355,1)] will-change-[border-radius,margin,border]`,\n \"focus-within:relative focus-within:z-2\",\n variant === \"default\" &&\n \"border-border bg-card border-b first:rounded-t-2xl last:rounded-b-2xl last:border-b-0\",\n variant === \"card\" && \"rounded-[14px] border p-1\",\n variant === \"swiss\" && [\n \"bg-popover border-border/60 relative overflow-hidden border-x\",\n\n // Base state - closed items\n \"data-closed:border-border/60 data-closed:border-b\",\n\n // First and last items\n \"first:border-border/60 first:rounded-t-2xl first:border-t\",\n \"last:border-border/60 last:rounded-b-2xl last:border-b\",\n\n // Open state - full rounded with margins\n \"data-open:border-primary/70 data-open:z-2 data-open:rounded-2xl data-open:border\",\n \"data-open:my-6 data-open:first:mt-0 data-open:last:mb-0\",\n\n // Item before open item - gets bottom rounded corners\n \"has-[+_[data-slot='accordion-item'][data-open]]:rounded-b-2xl\",\n \"has-[+_[data-slot='accordion-item'][data-open]]:border-b!\",\n \"has-[+_[data-slot='accordion-item'][data-open]]:border-border/60\",\n\n // Item after open item - gets top rounded corners\n \"data-open:[&+[data-slot='accordion-item']]:rounded-t-2xl\",\n \"data-open:[&+[data-slot='accordion-item'][data-closed]]:border-t\",\n \"data-open:[&+[data-slot='accordion-item']]:border-border/60\",\n\n // Remove middle borders between closed items\n \"data-closed:first:border-t\",\n \"data-closed:last:border-b\",\n ],\n className\n )}\n {...rest}\n />\n </AccordionItemContext.Provider>\n )\n}\n\ninterface AccordionHeaderProps extends AccordionPrimitive.Header.Props {}\n\nfunction AccordionHeader({ className, ...props }: AccordionHeaderProps) {\n return (\n <AccordionPrimitive.Header\n data-slot=\"accordion-header\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\ninterface AccordionTriggerProps extends AccordionPrimitive.Trigger.Props {\n icon?: (props: { open: boolean }) => React.ReactNode\n}\n\nfunction AccordionTrigger({\n className,\n icon,\n children,\n ...props\n}: AccordionTriggerProps) {\n const { open, variant = \"default\" } = useAccordionItem()\n\n return (\n <AccordionHeader className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"hover:bg-muted bg-muted flex w-full cursor-pointer items-center px-4 py-3 text-left text-sm not-data-panel-open:bg-transparent\",\n \"[transition-property:background-color,border-radius] duration-200 ease-[cubic-bezier(0.215,0.61,0.355,1)] will-change-[background-color,border-radius]\",\n `focus-visible:bg-accent not-data-panel-open:dark:hover:bg-accent dark:focus-visible:bg-accent focus-visible:outline-ring font-medium focus-visible:outline-2 data-disabled:pointer-events-none data-disabled:cursor-not-allowed data-disabled:opacity-50`,\n variant === \"card\" && [\n `not-data-panel-open:bg-secondary/80 data-panel-open:bg-secondary/80 rounded-lg data-panel-open:rounded-b-none`,\n ],\n className\n )}\n {...props}\n >\n {children}\n\n <span className=\"ml-auto\">\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform duration-200\",\n open ? \"rotate-180\" : \"\"\n )}\n />\n </span>\n </AccordionPrimitive.Trigger>\n </AccordionHeader>\n )\n}\n\ninterface AccordionPanelProps extends AccordionPrimitive.Panel.Props {}\n\nfunction AccordionPanel({\n className,\n children,\n style,\n ...props\n}: AccordionPanelProps) {\n const {\n variant = \"default\",\n animationPreset = \"fade\",\n transitionPreset = \"snappyOut\",\n reduceMotion = false,\n } = useAccordion()\n\n const cssAnimationConfig = useMemo(() => {\n if (reduceMotion) return cssAnimationPresets.none\n\n if (animationPreset) {\n return cssAnimationPresets[animationPreset]\n }\n\n return cssAnimationPresets.fade\n }, [animationPreset, reduceMotion])\n\n const cssTransitionConfig = useMemo(() => {\n if (reduceMotion) return \"\"\n\n if (transitionPreset) {\n return cssTransitionPresets[transitionPreset]\n }\n\n return cssTransitionPresets.inOutExpo\n }, [transitionPreset, reduceMotion])\n\n return (\n <AccordionPrimitive.Panel\n data-slot=\"accordion-panel\"\n className={cn(\n \"h-(--accordion-panel-height) overflow-hidden text-sm\",\n cssAnimationConfig,\n cssTransitionConfig,\n className\n )}\n style={{\n willChange: \"height, opacity, transform\",\n ...style,\n }}\n {...props}\n >\n <div\n data-slot=\"accordion-panel-content\"\n className={cn(variant === \"default\" ? \"p-0\" : \"p-3 pl-4\")}\n >\n {children}\n </div>\n </AccordionPrimitive.Panel>\n )\n}\n\nexport {\n Accordion,\n AccordionItem,\n AccordionHeader,\n AccordionTrigger,\n AccordionPanel,\n}\n","import React, { useMemo, Children, isValidElement, cloneElement } from \"react\"\nimport { createUsePuck } from \"@puckeditor/core\"\nimport { Tabs, TabsList, TabsTab, TabsPanel } from \"../ui/tabs\"\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionPanel,\n} from \"../ui/accordion\"\n\n// Create typed usePuck hook with selector support\nconst usePuck = createUsePuck()\n\ntype ItemSelector = {\n path?: string\n index?: number\n}\n\ntype FieldGroupsProps = {\n children: React.ReactNode\n isLoading: boolean\n itemSelector?: ItemSelector | null\n}\n\n// Accordion configuration\ntype AccordionConfig = {\n title: string\n fields: string[]\n defaultExpanded?: boolean\n}\n\n// Tab configuration - can have direct accordion or nested accordions\ntype TabConfig = {\n title: string\n accordions: AccordionConfig | Record<string, AccordionConfig>\n}\n\n// Tabs configuration\ntype TabsConfig = Record<string, TabConfig>\n\n// Helper to check if accordions is a single accordion (has fields property)\nconst isSingleAccordion = (\n accordions: AccordionConfig | Record<string, AccordionConfig>\n): accordions is AccordionConfig => {\n return \"fields\" in accordions && Array.isArray(accordions.fields)\n}\n\nconst FieldGroups = ({ children }: FieldGroupsProps) => {\n // Use selectors to only subscribe to the specific data we need\n const config = usePuck((s) => s.config)\n const selectedItem = usePuck((s) => s.selectedItem)\n\n // Get the component config and tabs configuration\n const componentConfig = useMemo(() => {\n if (!selectedItem?.type) return null\n return config.components?.[selectedItem.type] || null\n }, [config, selectedItem])\n\n const tabsConfig = useMemo(() => {\n if (!componentConfig) return null\n const configWithTabs = componentConfig as any\n if (!configWithTabs.tabs) return null\n return configWithTabs.tabs as TabsConfig\n }, [componentConfig])\n\n // Create a map of field names to their location (tab and accordion)\n const fieldToLocationMap = useMemo(() => {\n const map = new Map<string, { tab: string; accordion: string }>()\n\n if (!tabsConfig) return map\n\n Object.entries(tabsConfig).forEach(([tabKey, tabConfig]) => {\n const { accordions } = tabConfig\n\n if (isSingleAccordion(accordions)) {\n // Single accordion case - use tab key as accordion key\n accordions.fields.forEach((fieldName) => {\n map.set(fieldName, {\n tab: tabKey,\n accordion: tabKey, // Use tab key for single accordion\n })\n })\n } else {\n // Multiple accordions case\n Object.entries(accordions).forEach(\n ([accordionKey, accordionConfig]) => {\n if (accordionConfig?.fields) {\n accordionConfig.fields.forEach((fieldName) => {\n map.set(fieldName, {\n tab: tabKey,\n accordion: accordionKey,\n })\n })\n }\n }\n )\n }\n })\n\n return map\n }, [tabsConfig])\n\n // Organize children by tabs and accordions\n const organizedChildren = useMemo(() => {\n const childArray = Children.toArray(children)\n type OrganizedStructure = Record<\n string,\n Record<string, React.ReactNode[]>\n >\n const result: OrganizedStructure = {}\n\n if (!tabsConfig) {\n return {\n __ungrouped: { default: childArray },\n } as OrganizedStructure\n }\n\n // Initialize structure for tabs and accordions\n Object.entries(tabsConfig).forEach(([tabKey, tabConfig]) => {\n result[tabKey] = {}\n const { accordions } = tabConfig\n\n if (isSingleAccordion(accordions)) {\n // Single accordion - use tab key as accordion key\n result[tabKey][tabKey] = []\n } else {\n // Multiple accordions\n Object.keys(accordions).forEach((accordionKey) => {\n result[tabKey][accordionKey] = []\n })\n }\n })\n\n const ungrouped: React.ReactNode[] = []\n\n // Organize children into their respective locations\n childArray.forEach((child) => {\n if (!isValidElement(child)) {\n ungrouped.push(child)\n return\n }\n\n // Try to extract field name from various sources\n const props = child.props as any\n let fieldName: string | null = null\n\n // Check different possible locations for field name\n if (props?.field) fieldName = props.field\n else if (props?.name) fieldName = props.name\n else if (props?.id) fieldName = props.id\n else if (child.key && typeof child.key === \"string\") {\n fieldName = child.key.replace(/^\\.\\$?/, \"\")\n }\n\n // If we found a field name, try to match it to a location\n if (fieldName) {\n const location = fieldToLocationMap.get(fieldName)\n if (location) {\n const newProps = {\n ...(child.props || {}),\n \"data-field-name\": fieldName,\n \"data-tab\": location.tab,\n \"data-accordion\": location.accordion,\n }\n const enhancedChild = cloneElement(child, newProps as any)\n\n if (!result[location.tab]) result[location.tab] = {}\n if (!result[location.tab][location.accordion])\n result[location.tab][location.accordion] = []\n result[location.tab][location.accordion].push(enhancedChild)\n return\n }\n }\n\n // If not matched to any location, add to ungrouped\n ungrouped.push(child)\n })\n\n return {\n ...result,\n __ungrouped: { default: ungrouped },\n } as OrganizedStructure\n }, [children, tabsConfig, fieldToLocationMap])\n\n // Get the first tab as default\n const defaultTab = useMemo(() => {\n if (!tabsConfig) return \"ungrouped\"\n return Object.keys(tabsConfig)[0] || \"ungrouped\"\n }, [tabsConfig])\n\n // Check if we have organized content\n const hasOrganizedFields = useMemo(() => {\n if (!tabsConfig) return false\n\n return Object.keys(tabsConfig).some((tabKey) => {\n const tabContent = organizedChildren[tabKey]\n if (!tabContent || typeof tabContent !== \"object\") return false\n return Object.keys(tabContent).some(\n (accordionKey) =>\n Array.isArray(tabContent[accordionKey]) &&\n tabContent[accordionKey].length > 0\n )\n })\n }, [tabsConfig, organizedChildren])\n\n // If no tabs configuration, render children as-is\n if (!tabsConfig) {\n return <div className=\"flex flex-col gap-y-3\">{children}</div>\n }\n\n // If no fields were matched to tabs, render children as-is\n if (!hasOrganizedFields) {\n return <div className=\"flex flex-col gap-y-3\">{children}</div>\n }\n\n // Render tabs with accordions\n return (\n <div className=\"puck-field-groups\">\n <Tabs defaultValue={defaultTab}>\n <div className=\"px-2 pt-2\">\n <TabsList className=\"w-full justify-center\">\n {Object.entries(tabsConfig).map(\n ([tabKey, tabConfig]) => {\n const tabContent = organizedChildren[tabKey]\n if (\n !tabContent ||\n typeof tabContent !== \"object\"\n )\n return null\n\n // Check if tab has any fields\n const hasFields = Object.keys(tabContent).some(\n (accordionKey) =>\n Array.isArray(\n tabContent[accordionKey]\n ) && tabContent[accordionKey].length > 0\n )\n if (!hasFields) return null\n\n return (\n <TabsTab\n key={tabKey}\n value={tabKey}\n className=\"flex-1\"\n >\n {tabConfig.title}\n </TabsTab>\n )\n }\n )}\n </TabsList>\n </div>\n {Object.entries(tabsConfig).map(([tabKey, tabConfig]) => {\n const tabContent = organizedChildren[tabKey]\n if (!tabContent || typeof tabContent !== \"object\")\n return null\n\n const { accordions } = tabConfig\n\n // Handle single accordion case\n if (isSingleAccordion(accordions)) {\n const fields = tabContent[tabKey]\n if (\n !fields ||\n !Array.isArray(fields) ||\n fields.length === 0\n )\n return null\n\n return (\n <TabsPanel key={tabKey} value={tabKey}>\n <Accordion\n defaultValue={\n accordions.defaultExpanded\n ? [tabKey]\n : []\n }\n className=\"rounded-none border-none\"\n >\n <AccordionItem value={tabKey}>\n <AccordionTrigger>\n {accordions.title}\n </AccordionTrigger>\n <AccordionPanel className=\"p-0\">\n <div className=\"flex flex-col\">\n {fields}\n </div>\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n </TabsPanel>\n )\n }\n\n // Handle multiple accordions case\n const accordionsRecord = accordions as Record<\n string,\n AccordionConfig\n >\n\n // Get default expanded accordions\n const defaultExpandedAccordions = Object.entries(\n accordionsRecord\n )\n .filter(\n ([, accordionConfig]) =>\n accordionConfig?.defaultExpanded\n )\n .map(([accordionKey]) => accordionKey)\n\n return (\n <TabsPanel key={tabKey} value={tabKey}>\n <Accordion\n multiple\n defaultValue={defaultExpandedAccordions}\n className=\"rounded-none border-none\"\n >\n {Object.entries(accordionsRecord).map(\n ([accordionKey, accordionConfig]) => {\n const fields = tabContent[accordionKey]\n if (\n !fields ||\n !Array.isArray(fields) ||\n fields.length === 0\n )\n return null\n\n return (\n <AccordionItem\n key={accordionKey}\n value={accordionKey}\n >\n <AccordionTrigger>\n {accordionConfig.title}\n </AccordionTrigger>\n <AccordionPanel className=\"p-0\">\n <div className=\"flex flex-col\">\n {fields}\n </div>\n </AccordionPanel>\n </AccordionItem>\n )\n }\n )}\n </Accordion>\n </TabsPanel>\n )\n })}\n </Tabs>\n\n {/* Render ungrouped fields below tabs */}\n {organizedChildren[\"__ungrouped\"]?.default &&\n Array.isArray(organizedChildren[\"__ungrouped\"].default) &&\n organizedChildren[\"__ungrouped\"].default.length > 0 && (\n <div className=\"mt-4 space-y-4 border-t pt-4\">\n {organizedChildren[\"__ungrouped\"].default}\n </div>\n )}\n </div>\n )\n}\n\nexport default FieldGroups\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst cssAnimationPresets = {\n none: \"transition-none\",\n scale: [\n `[transition-property:scale,opacity]`,\n `data-starting-style:scale-80 data-starting-style:opacity-0 data-ending-style:opacity-0 data-ending-style:scale-80`,\n ],\n fade: [\n `[transition-property:opacity,scale]`,\n `data-starting-style:scale-98 data-starting-style:opacity-0 data-ending-style:opacity-0 data-ending-style:scale-98`,\n ],\n slideOutside: [\n `[transition-property:translate,opacity]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:translate-y-[10px] data-[side=bottom]:data-ending-style:translate-y-[10px] data-[side=bottom]:data-ending-style:opacity-0`,\n // side=top\n `data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:translate-y-[-10px] data-[side=top]:data-ending-style:translate-y-[-10px] data-[side=top]:data-ending-style:opacity-0`,\n // side=left\n `data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:translate-x-[-10px] data-[side=left]:data-ending-style:translate-x-[-10px] data-[side=left]:data-ending-style:opacity-0`,\n // side=right\n `data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:translate-x-[10px] data-[side=right]:data-ending-style:translate-x-[10px] data-[side=right]:data-ending-style:opacity-0`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:translate-x-[-10px] data-[side=inline-start]:data-ending-style:translate-x-[-10px] data-[side=inline-start]:data-ending-style:opacity-0`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:translate-x-[10px] data-[side=inline-end]:data-ending-style:translate-x-[10px] data-[side=inline-end]:data-ending-style:opacity-0`,\n ],\n slideInside: [\n `[transition-property:translate,opacity]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:translate-y-[-10px] data-[side=bottom]:data-ending-style:translate-y-[-10px] data-[side=bottom]:data-ending-style:opacity-0`,\n // side=top\n `data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:translate-y-[10px] data-[side=top]:data-ending-style:translate-y-[10px] data-[side=top]:data-ending-style:opacity-0`,\n // side=left\n `data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:translate-x-[10px] data-[side=left]:data-ending-style:translate-x-[10px] data-[side=left]:data-ending-style:opacity-0`,\n // side=right\n `data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:translate-x-[-10px] data-[side=right]:data-ending-style:translate-x-[-10px] data-[side=right]:data-ending-style:opacity-0`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:translate-x-[10px] data-[side=inline-start]:data-ending-style:translate-x-[10px] data-[side=inline-start]:data-ending-style:opacity-0`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:translate-x-[-10px] data-[side=inline-end]:data-ending-style:translate-x-[-10px] data-[side=inline-end]:data-ending-style:opacity-0`,\n ],\n wipe: [\n `[transition-property:clip-path] [will-change:clip-path]`,\n `[clip-path:inset(0_0_0_0_round_var(--radius))] [-webkit-clip-path:inset(0_0_0_0_round_var(--radius))]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:[clip-path:inset(0_0_100%_0_round_var(--radius))] data-[side=bottom]:data-ending-style:[clip-path:inset(0_0_100%_0_round_var(--radius))]`,\n // side=top\n `data-[side=top]:data-starting-style:[clip-path:inset(100%_0_0_0_round_var(--radius))] data-[side=top]:data-ending-style:[clip-path:inset(100%_0_0_0_round_var(--radius))]`,\n // side=left\n `data-[side=left]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=left]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=right\n `data-[side=right]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=right]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=inline-start]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=inline-end]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n ],\n wipeScale: [\n `[transition-property:clip-path,scale] [will-change:clip-path,scale]`,\n `[clip-path:inset(0_0_0_0_round_var(--radius))] [-webkit-clip-path:inset(0_0_0_0_round_var(--radius))]`,\n `data-starting-style:scale-80 data-ending-style:scale-80`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:[clip-path:inset(0_0_100%_0_round_var(--radius))] data-[side=bottom]:data-ending-style:[clip-path:inset(0_0_100%_0_round_var(--radius))]`,\n // side=top\n `data-[side=top]:data-starting-style:[clip-path:inset(100%_0_0_0_round_var(--radius))] data-[side=top]:data-ending-style:[clip-path:inset(100%_0_0_0_round_var(--radius))]`,\n // side=left\n `data-[side=left]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=left]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=right\n `data-[side=right]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=right]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=inline-start]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=inline-end]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n ],\n motion: [\n `[transition-property:translate,scale,opacity,rotateX,rotateY,transform] [will-change:translate,scale,opacity,rotateX,rotateY,transform]`,\n `[transform:perspective(1000px)]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:translate-y-[7px] data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:scale-[0.26] data-[side=bottom]:data-starting-style:rotate-x-[70deg] data-[side=bottom]:data-ending-style:translate-y-[7px] data-[side=bottom]:data-ending-style:opacity-0 data-[side=bottom]:data-ending-style:scale-[0.26] data-[side=bottom]:data-ending-style:rotate-x-[70deg]`,\n // side=top\n `data-[side=top]:data-starting-style:translate-y-[7px] data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:scale-[0.26] data-[side=top]:data-starting-style:rotate-x-[70deg] data-[side=top]:data-ending-style:translate-y-[7px] data-[side=top]:data-ending-style:opacity-0 data-[side=top]:data-ending-style:scale-[0.26] data-[side=top]:data-ending-style:rotate-x-[70deg]`,\n // side=left\n `data-[side=left]:data-starting-style:translate-x-[-7px] data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:scale-[0.26] data-[side=left]:data-starting-style:rotate-y-[-40deg] data-[side=left]:data-ending-style:translate-x-[-7px] data-[side=left]:data-ending-style:opacity-0 data-[side=left]:data-ending-style:scale-[0.26] data-[side=left]:data-ending-style:rotate-y-[-40deg]`,\n // side=right\n `data-[side=right]:data-starting-style:translate-x-[7px] data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:scale-[0.26] data-[side=right]:data-starting-style:rotate-y-[40deg] data-[side=right]:data-ending-style:translate-x-[7px] data-[side=right]:data-ending-style:opacity-0 data-[side=right]:data-ending-style:scale-[0.26] data-[side=right]:data-ending-style:rotate-y-[40deg]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:translate-x-[-7px] data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:scale-[0.26] data-[side=inline-start]:data-starting-style:rotate-y-[-40deg] data-[side=inline-start]:data-ending-style:translate-x-[-7px] data-[side=inline-start]:data-ending-style:opacity-0 data-[side=inline-start]:data-ending-style:scale-[0.26] data-[side=inline-start]:data-ending-style:rotate-y-[-40deg]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:translate-x-[7px] data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:scale-[0.26] data-[side=inline-end]:data-starting-style:rotate-y-[40deg] data-[side=inline-end]:data-ending-style:translate-x-[7px] data-[side=inline-end]:data-ending-style:opacity-0 data-[side=inline-end]:data-ending-style:scale-[0.26] data-[side=inline-end]:data-ending-style:rotate-y-[40deg]`,\n ],\n motionBlur: [\n `[transition-property:translate,scale,opacity,rotateX,rotateY,transform,filter] [will-change:translate,scale,opacity,rotateX,rotateY,transform,filter]`,\n `[transform:perspective(1000px)]`,\n `data-starting-style:blur-[9px] data-ending-style:blur-[9px]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:translate-y-[7px] data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:scale-[0.26] data-[side=bottom]:data-starting-style:rotate-x-[70deg] data-[side=bottom]:data-ending-style:translate-y-[7px] data-[side=bottom]:data-ending-style:opacity-0 data-[side=bottom]:data-ending-style:scale-[0.26] data-[side=bottom]:data-ending-style:rotate-x-[70deg]`,\n // side=top\n `data-[side=top]:data-starting-style:translate-y-[7px] data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:scale-[0.26] data-[side=top]:data-starting-style:rotate-x-[70deg] data-[side=top]:data-ending-style:translate-y-[7px] data-[side=top]:data-ending-style:opacity-0 data-[side=top]:data-ending-style:scale-[0.26] data-[side=top]:data-ending-style:rotate-x-[70deg]`,\n // side=left\n `data-[side=left]:data-starting-style:translate-x-[-7px] data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:scale-[0.26] data-[side=left]:data-starting-style:rotate-y-[-40deg] data-[side=left]:data-ending-style:translate-x-[-7px] data-[side=left]:data-ending-style:opacity-0 data-[side=left]:data-ending-style:scale-[0.26] data-[side=left]:data-ending-style:rotate-y-[-40deg]`,\n // side=right\n `data-[side=right]:data-starting-style:translate-x-[7px] data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:scale-[0.26] data-[side=right]:data-starting-style:rotate-y-[40deg] data-[side=right]:data-ending-style:translate-x-[7px] data-[side=right]:data-ending-style:opacity-0 data-[side=right]:data-ending-style:scale-[0.26] data-[side=right]:data-ending-style:rotate-y-[40deg]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:translate-x-[-7px] data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:scale-[0.26] data-[side=inline-start]:data-starting-style:rotate-y-[-40deg] data-[side=inline-start]:data-ending-style:translate-x-[-7px] data-[side=inline-start]:data-ending-style:opacity-0 data-[side=inline-start]:data-ending-style:scale-[0.26] data-[side=inline-start]:data-ending-style:rotate-y-[-40deg]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:translate-x-[7px] data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:scale-[0.26] data-[side=inline-end]:data-starting-style:rotate-y-[40deg] data-[side=inline-end]:data-ending-style:translate-x-[7px] data-[side=inline-end]:data-ending-style:opacity-0 data-[side=inline-end]:data-ending-style:scale-[0.26] data-[side=inline-end]:data-ending-style:rotate-y-[40deg]`,\n ],\n}\n\nconst cssTransitionPresets = {\n inExpo: `duration-[0.25s] ease-[cubic-bezier(0.95,0.05,0.795,0.035)]`,\n outExpo: `duration-[0.25s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n inOutExpo: `duration-[0.25s] ease-[cubic-bezier(1,0,0,1)]`,\n anticipate: `duration-[0.25s] ease-[cubic-bezier(1,-0.4,0.35,0.95)]`,\n quickOut: `duration-[0.25s] ease-out`,\n overshootOut: `duration-[0.25s] ease-[cubic-bezier(0.175,0.885,0.32,1.275)]`,\n swiftOut: `duration-[0.25s] ease-[cubic-bezier(0.175,0.885,0.32,1.1)]`,\n snappyOut: `duration-[0.25s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n in: `duration-[0.25s] ease-[cubic-bezier(0.42,0,1,1)]`,\n out: `duration-[0.25s] ease-[cubic-bezier(0,0,0.58,1)]`,\n inOut: `duration-[0.25s] ease-[cubic-bezier(0.42,0,0.58,1)]`,\n outIn: `duration-[0.25s] ease-[cubic-bezier(0.1,0.7,0.9,0.5)]`,\n inQuad: `duration-[0.25s] ease-[cubic-bezier(0.55,0.085,0.68,0.53)]`,\n outQuad: `duration-[0.25s] ease-[cubic-bezier(0.25,0.46,0.45,0.94)]`,\n inOutQuad: `duration-[0.32s] ease-[cubic-bezier(0.455,0.03,0.515,0.955)]`,\n inCubic: `duration-[0.25s] ease-[cubic-bezier(0.55,0.055,0.675,0.19)]`,\n outCubic: `duration-[0.25s] ease-[cubic-bezier(0.215,0.61,0.355,1)]`,\n inOutCubic: `duration-[0.25s] ease-[cubic-bezier(0.645,0.045,0.355,1)]`,\n inQuart: `duration-[0.25s] ease-[cubic-bezier(0.895,0.03,0.685,0.22)]`,\n outQuart: `duration-[0.25s] ease-[cubic-bezier(0.165,0.84,0.44,1)]`,\n inOutQuart: `duration-[0.25s] ease-[cubic-bezier(0.77,0,0.175,1)]`,\n inQuint: `duration-[0.25s] ease-[cubic-bezier(0.755,0.05,0.855,0.06)]`,\n outQuint: `duration-[0.25s] ease-[cubic-bezier(0.23,1,0.32,1)]`,\n inOutQuint: `duration-[0.25s] ease-[cubic-bezier(0.86,0,0.07,1)]`,\n inCirc: `duration-[0.25s] ease-[cubic-bezier(0.6,0.04,0.98,0.335)]`,\n outCirc: `duration-[0.25s] ease-[cubic-bezier(0.075,0.82,0.165,1)]`,\n inOutCirc: `duration-[0.25s] ease-[cubic-bezier(0.785,0.135,0.15,0.86)]`,\n inOutBase: `duration-[0.25s] ease-[cubic-bezier(0.25,0.1,0.25,1)]`,\n none: `duration-0 ease-none`,\n}\n\ntype CSSAnimationPresets = keyof typeof cssAnimationPresets\ntype CSSTransitionPresets = keyof typeof cssTransitionPresets\n\ninterface TooltipProviderProps extends TooltipPrimitive.Provider.Props {}\n\nfunction TooltipProvider({ delay = 300, ...props }: TooltipProviderProps) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n )\n}\n\ninterface TooltipProps extends TooltipPrimitive.Root.Props {}\n\nfunction Tooltip({ ...props }: TooltipProps) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\ninterface TooltipTriggerProps extends TooltipPrimitive.Trigger.Props {}\n\nfunction TooltipTrigger(props: TooltipTriggerProps) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\ninterface TooltipPortalProps extends TooltipPrimitive.Portal.Props {}\n\nfunction TooltipPortal(props: TooltipPortalProps) {\n return <TooltipPrimitive.Portal data-slot=\"tooltip-portal\" {...props} />\n}\n\ninterface TooltipPositionerProps extends TooltipPrimitive.Positioner.Props {}\n\nfunction TooltipPositioner({\n className,\n side = \"top\",\n ...rest\n}: TooltipPositionerProps) {\n return (\n <TooltipPortal>\n <TooltipPrimitive.Positioner\n side={side}\n data-slot=\"tooltip-positioner\"\n className={cn(\n \"z-100\",\n (side === \"inline-end\" || side === \"inline-start\") &&\n \"**:data-[slot=tooltip-arrow]:hidden\",\n className\n )}\n {...rest}\n />\n </TooltipPortal>\n )\n}\n\ninterface TooltipPopupProps\n extends\n TooltipPrimitive.Popup.Props,\n Pick<\n TooltipPositionerProps,\n \"side\" | \"sideOffset\" | \"align\" | \"alignOffset\"\n > {\n animationPreset?: CSSAnimationPresets\n transitionPreset?: CSSTransitionPresets\n reduceMotion?: boolean\n showArrow?: boolean\n}\n\nfunction TooltipPopup({\n className,\n animationPreset = \"scale\",\n transitionPreset = \"outQuint\",\n reduceMotion = false,\n showArrow = false,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n ...rest\n}: TooltipPopupProps) {\n const cssAnimationConfig = useMemo(() => {\n if (reduceMotion) return \"none\"\n\n if (animationPreset) {\n return cssAnimationPresets[animationPreset]\n }\n\n return cssAnimationPresets.scale\n }, [animationPreset, reduceMotion, side])\n\n const cssTransitionConfig = useMemo(() => {\n if (reduceMotion) return \"none\"\n\n if (transitionPreset) {\n return cssTransitionPresets[transitionPreset]\n }\n\n return cssTransitionPresets.snappyOut\n }, [transitionPreset, reduceMotion, side])\n\n return (\n <TooltipPositioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-popup\"\n className={cn(\n \"[--radius:10px]\",\n \"bg-popover border-border pointer-events-auto w-fit origin-(--transform-origin) rounded-(--radius) border px-2 py-1 text-[13px] text-balance shadow-xs data-instant:duration-0!\",\n className,\n cssAnimationConfig,\n cssTransitionConfig,\n showArrow && [\n `before: before:bg-popover z-[-1] before:absolute before:h-2 before:w-2 before:rotate-45 before:content-['']`,\n side === \"top\" &&\n `before:border-border before:-bottom-[4.7px] before:left-1/2 before:-translate-x-1/2 before:border-r before:border-b`,\n side === \"right\" &&\n `before:border-border before:top-1/2 before:-left-[4.07px] before:-translate-y-1/2 before:border-b before:border-l`,\n side === \"bottom\" &&\n `before:border-border before:-top-[4.7px] before:left-1/2 before:-translate-x-1/2 before:border-t before:border-l`,\n side === \"left\" &&\n `before:border-border before:top-1/2 before:-right-[4.07px] before:-translate-y-1/2 before:border-t before:border-r`,\n side === \"inline-start\" &&\n `before:border-border before:top-1/2 before:-right-[4.07px] before:-translate-y-1/2 before:border-t before:border-r`,\n side === \"inline-end\" &&\n `before:border-border before:top-1/2 before:-left-[4.07px] before:-translate-y-1/2 before:border-b before:border-l`,\n ]\n )}\n {...rest}\n />\n </TooltipPositioner>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipPopup, TooltipProvider }\n","import { createUsePuck, type Config } from \"@puckeditor/core\"\nimport { useCallback } from \"react\"\nimport { GripVerticalIcon, BoxIcon } from \"lucide-react\"\n\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipPopup,\n TooltipProvider,\n} from \"../ui/tooltip\"\n\nconst usePuck = createUsePuck()\n\nconst DrawerItem = ({\n name,\n icon,\n}: {\n name: string\n icon?: React.ReactNode\n}) => {\n const configSelector = useCallback(\n (state: { config: Config }) => state.config,\n []\n )\n const config = usePuck(configSelector)\n\n const componentConfig = config.components?.[name]\n\n const iconOrImage = icon || componentConfig?.metadata?.icon\n const imageUrl = componentConfig?.metadata?.image\n const description = componentConfig?.metadata?.description\n const label = componentConfig?.label || name\n\n const displayIcon = iconOrImage || <BoxIcon size={16} />\n\n const hasTooltipContent = imageUrl || description\n\n const drawerContent = (\n <div className=\"hover:bg-muted group flex cursor-grab items-center justify-between gap-2 rounded-md bg-white p-0.5 transition-colors\">\n <div className=\"flex items-center gap-2 truncate\">\n <div className=\"border-border group-hover:border-muted rounded-sm border bg-white p-3\">\n {displayIcon}\n </div>\n <span className=\"truncate text-sm font-medium\">{label}</span>\n </div>\n <div className=\"text-foreground h-full flex-none rounded-sm bg-white px-1 py-3\">\n <GripVerticalIcon size={16} />\n </div>\n </div>\n )\n\n if (!hasTooltipContent) {\n return drawerContent\n }\n\n return (\n <TooltipProvider delay={200}>\n <Tooltip>\n <TooltipTrigger className=\"w-full\">\n {drawerContent}\n </TooltipTrigger>\n <TooltipPopup side=\"right\" sideOffset={8} className=\"w-64 p-2\">\n {imageUrl && (\n <img\n src={imageUrl}\n alt={name}\n className=\"h-auto w-full rounded-sm object-contain\"\n />\n )}\n {description && (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {description}\n </p>\n )}\n </TooltipPopup>\n </Tooltip>\n </TooltipProvider>\n )\n}\n\nexport default DrawerItem\n","import FieldCheckbox from \"../components/Fields/Checkbox\"\nimport FieldInput from \"../components/Fields/Input\"\nimport FieldNumberUnit from \"../components/Fields/NumberUnit\"\nimport Label from \"../components/Fields/Label\"\nimport FieldSelect from \"../components/Fields/Select\"\nimport FieldRadio from \"../components/Fields/Radio\"\nimport FieldTextarea from \"../components/Fields/Textarea\"\nimport ActionBar from \"../components/ActionBar\"\nimport FieldGroups from \"../components/FieldGroups\"\nimport DrawerItem from \"../components/DrawerItem\"\n\nconst createPuckOverridesPlugin = () => {\n return {\n overrides: {\n actionBar: ActionBar,\n drawer: ({ children }: { children: React.ReactNode }) => (\n <>{children}</>\n ),\n drawerItem: DrawerItem,\n fields: FieldGroups,\n fieldLabel: ({\n children,\n label,\n }: {\n children: React.ReactNode\n label: string\n }) => (\n <>\n <Label label={label} />\n {children}\n </>\n ),\n fieldTypes: {\n checkbox: FieldCheckbox,\n numberUnit: FieldNumberUnit,\n radio: FieldRadio,\n select: FieldSelect,\n text: FieldInput,\n textarea: FieldTextarea,\n },\n },\n }\n}\n\nexport default createPuckOverridesPlugin\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"[&_svg]:-mx-0.5 relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-9 px-[calc(--spacing(3)-1px)] sm:h-8\",\n icon: \"size-9 sm:size-8\",\n \"icon-lg\": \"size-10 sm:size-9\",\n \"icon-sm\": \"size-8 sm:size-7\",\n \"icon-xl\":\n \"size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n \"icon-xs\":\n \"size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9\",\n sm: \"h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7\",\n xl: \"h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n xs: \"h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n },\n variant: {\n default:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-primary bg-primary text-primary-foreground shadow-primary/24 [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-primary/90\",\n destructive:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-destructive bg-destructive text-white shadow-destructive/24 [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-destructive/90\",\n \"destructive-outline\":\n \"border-input bg-transparent not-dark:bg-clip-padding text-destructive-foreground not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/6%)] dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:border-destructive/32 [:hover,[data-pressed]]:bg-destructive/4\",\n ghost:\n \"border-transparent data-pressed:bg-accent [:hover,[data-pressed]]:bg-accent\",\n link: \"border-transparent underline-offset-4 [:hover,[data-pressed]]:underline\",\n outline:\n \"border-input bg-background not-dark:bg-clip-padding not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/6%)] dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-accent/50 dark:[:hover,[data-pressed]]:bg-input/64\",\n primary:\n \"border-transparent from-primary-600 to-primary-500 hover:from-primary-500 hover:to-primary-600 bg-linear-to-t text-white inset-shadow-[0_2px_0_0] inset-shadow-white/25 hover:text-white\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80 [:hover,[data-pressed]]:bg-secondary/90\",\n },\n },\n },\n);\n\ninterface ButtonProps extends useRender.ComponentProps<\"button\"> {\n variant?: VariantProps<typeof buttonVariants>[\"variant\"];\n size?: VariantProps<typeof buttonVariants>[\"size\"];\n}\n\nfunction Button({ className, variant, size, render, ...props }: ButtonProps) {\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const defaultProps = {\n className: cn(buttonVariants({ className, size, variant })),\n \"data-slot\": \"button\",\n type: typeValue,\n };\n\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n}\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst PopoverCreateHandle = PopoverPrimitive.createHandle;\n\nconst Popover = PopoverPrimitive.Root;\n\nfunction PopoverTrigger(props: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverPopup({\n children,\n className,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n tooltipStyle = false,\n ...props\n}: PopoverPrimitive.Popup.Props & {\n side?: PopoverPrimitive.Positioner.Props[\"side\"];\n align?: PopoverPrimitive.Positioner.Props[\"align\"];\n sideOffset?: PopoverPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: PopoverPrimitive.Positioner.Props[\"alignOffset\"];\n tooltipStyle?: boolean;\n}) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n className=\"z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom,transform] data-instant:transition-none\"\n data-slot=\"popover-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <PopoverPrimitive.Popup\n className={cn(\n \"relative flex h-(--popup-height,auto) w-(--popup-width,auto) origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding text-popover-foreground shadow-lg/5 transition-[width,height,scale,opacity] before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] data-starting-style:scale-98 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n tooltipStyle &&\n \"w-fit text-balance rounded-md text-xs shadow-md/5 before:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"popover-popup\"\n {...props}\n >\n <PopoverPrimitive.Viewport\n className={cn(\n \"relative size-full max-h-(--available-height) overflow-clip px-(--viewport-inline-padding) py-3 outline-none [--viewport-inline-padding:--spacing(3)] data-instant:transition-none **:data-current:data-ending-style:opacity-0 **:data-current:data-starting-style:opacity-0 **:data-previous:data-ending-style:opacity-0 **:data-previous:data-starting-style:opacity-0 **:data-current:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-current:opacity-100 **:data-previous:opacity-100 **:data-current:transition-opacity **:data-previous:transition-opacity\",\n tooltipStyle\n ? \"py-1 [--viewport-inline-padding:--spacing(2)]\"\n : \"not-data-transitioning:overflow-y-auto\",\n )}\n data-slot=\"popover-viewport\"\n >\n {children}\n </PopoverPrimitive.Viewport>\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverClose({ ...props }: PopoverPrimitive.Close.Props) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n className={cn(\"font-semibold text-lg leading-none\", className)}\n data-slot=\"popover-title\"\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"popover-description\"\n {...props}\n />\n );\n}\n\nexport {\n PopoverCreateHandle,\n Popover,\n PopoverTrigger,\n PopoverPopup,\n PopoverPopup as PopoverContent,\n PopoverTitle,\n PopoverDescription,\n PopoverClose,\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst badgeVariants = cva(\n \"relative inline-flex shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-md border border-transparent font-medium outline-none transition-shadow focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-3.5 sm:[&_svg:not([class*='size-'])]:size-3 [&_svg]:pointer-events-none [&_svg]:shrink-0 [button&,a&]:cursor-pointer [button&,a&]:pointer-coarse:after:absolute [button&,a&]:pointer-coarse:after:size-full [button&,a&]:pointer-coarse:after:min-h-11 [button&,a&]:pointer-coarse:after:min-w-11\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default:\n \"h-5.5 min-w-5.5 px-[calc(--spacing(1)-1px)] text-sm sm:h-4.5 sm:min-w-4.5 sm:text-xs\",\n lg: \"h-6.5 min-w-6.5 px-[calc(--spacing(1.5)-1px)] text-base sm:h-5.5 sm:min-w-5.5 sm:text-sm\",\n sm: \"h-5 min-w-5 rounded-[.25rem] px-[calc(--spacing(1)-1px)] text-xs sm:h-4 sm:min-w-4 sm:text-[.625rem]\",\n },\n variant: {\n default:\n \"bg-primary text-primary-foreground [button&,a&]:hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white [button&,a&]:hover:bg-destructive/90\",\n error:\n \"bg-destructive/8 text-destructive-foreground dark:bg-destructive/16\",\n info: \"bg-info/8 text-info-foreground dark:bg-info/16\",\n outline:\n \"border-input bg-background text-foreground dark:bg-input/32 [button&,a&]:hover:bg-accent/50 dark:[button&,a&]:hover:bg-input/48\",\n secondary:\n \"bg-secondary text-secondary-foreground [button&,a&]:hover:bg-secondary/90\",\n success: \"bg-success/8 text-success-foreground dark:bg-success/16\",\n warning: \"bg-warning/8 text-warning-foreground dark:bg-warning/16\",\n },\n },\n },\n);\n\ninterface BadgeProps extends useRender.ComponentProps<\"span\"> {\n variant?: VariantProps<typeof badgeVariants>[\"variant\"];\n size?: VariantProps<typeof badgeVariants>[\"size\"];\n}\n\nfunction Badge({ className, variant, size, render, ...props }: BadgeProps) {\n const defaultProps = {\n className: cn(badgeVariants({ className, size, variant })),\n \"data-slot\": \"badge\",\n };\n\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(defaultProps, props),\n render,\n });\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction ScrollArea({\n className,\n children,\n scrollFade = false,\n scrollbarGutter = false,\n ...props\n}: ScrollAreaPrimitive.Root.Props & {\n scrollFade?: boolean;\n scrollbarGutter?: boolean;\n}) {\n return (\n <ScrollAreaPrimitive.Root\n className={cn(\"size-full min-h-0\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n className={cn(\n \"h-full rounded-[inherit] outline-none transition-shadows focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-has-overflow-x:overscroll-x-contain\",\n scrollFade &&\n \"mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] [--fade-size:1.5rem]\",\n scrollbarGutter &&\n \"data-has-overflow-y:pe-2.5 data-has-overflow-x:pb-2.5\",\n )}\n data-slot=\"scroll-area-viewport\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation=\"vertical\" />\n <ScrollBar orientation=\"horizontal\" />\n <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n className={cn(\n \"m-1 flex opacity-0 transition-opacity delay-300 data-[orientation=horizontal]:h-1.5 data-[orientation=vertical]:w-1.5 data-[orientation=horizontal]:flex-col data-hovering:opacity-100 data-scrolling:opacity-100 data-hovering:delay-0 data-scrolling:delay-0 data-hovering:duration-100 data-scrolling:duration-100\",\n className,\n )}\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n className=\"relative flex-1 rounded-full bg-foreground/20\"\n data-slot=\"scroll-area-thumb\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { ScrollArea } from \"./scroll-area\";\n\nconst DialogCreateHandle = DialogPrimitive.createHandle;\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nfunction DialogTrigger(props: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogClose(props: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogBackdrop({\n className,\n ...props\n}: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n className={cn(\n \"fixed inset-0 z-50 bg-black/32 backdrop-blur-sm transition-all duration-200 data-ending-style:opacity-0 data-starting-style:opacity-0\",\n className,\n )}\n data-slot=\"dialog-backdrop\"\n {...props}\n />\n );\n}\n\nfunction DialogViewport({\n className,\n ...props\n}: DialogPrimitive.Viewport.Props) {\n return (\n <DialogPrimitive.Viewport\n className={cn(\n \"fixed inset-0 z-50 grid grid-rows-[1fr_auto_3fr] justify-items-center p-4\",\n className,\n )}\n data-slot=\"dialog-viewport\"\n {...props}\n />\n );\n}\n\nfunction DialogPopup({\n className,\n children,\n showCloseButton = true,\n bottomStickOnMobile = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean;\n bottomStickOnMobile?: boolean;\n}) {\n return (\n <DialogPortal>\n <DialogBackdrop />\n <DialogViewport\n className={cn(\n bottomStickOnMobile &&\n \"max-sm:grid-rows-[1fr_auto] max-sm:p-0 max-sm:pt-12\",\n )}\n >\n <DialogPrimitive.Popup\n className={cn(\n \"-translate-y-[calc(1.25rem*var(--nested-dialogs))] relative row-start-2 flex max-h-full min-h-0 w-full min-w-0 max-w-lg scale-[calc(1-0.1*var(--nested-dialogs))] flex-col rounded-2xl border bg-popover not-dark:bg-clip-padding text-popover-foreground opacity-[calc(1-0.1*var(--nested-dialogs))] shadow-lg/5 transition-[scale,opacity,translate] duration-200 ease-in-out will-change-transform before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] data-nested:data-ending-style:translate-y-8 data-nested:data-starting-style:translate-y-8 data-nested-dialog-open:origin-top data-ending-style:scale-98 data-starting-style:scale-98 data-ending-style:opacity-0 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n bottomStickOnMobile &&\n \"max-sm:max-w-none max-sm:rounded-none max-sm:border-x-0 max-sm:border-t max-sm:border-b-0 max-sm:opacity-[calc(1-min(var(--nested-dialogs),1))] max-sm:data-ending-style:translate-y-4 max-sm:data-starting-style:translate-y-4 max-sm:before:hidden max-sm:before:rounded-none\",\n className,\n )}\n data-slot=\"dialog-popup\"\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n aria-label=\"Close\"\n className=\"absolute end-2 top-2\"\n render={<Button size=\"icon\" variant=\"ghost\" />}\n >\n <XIcon />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogViewport>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-2 p-6 in-[[data-slot=dialog-popup]:has([data-slot=dialog-panel])]:pb-3 max-sm:pb-4\",\n className,\n )}\n data-slot=\"dialog-header\"\n {...props}\n />\n );\n}\n\nfunction DialogFooter({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & {\n variant?: \"default\" | \"bare\";\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse gap-2 px-6 sm:flex-row sm:justify-end sm:rounded-b-[calc(var(--radius-2xl)-1px)]\",\n variant === \"default\" && \"border-t bg-muted/72 py-4\",\n variant === \"bare\" &&\n \"in-[[data-slot=dialog-popup]:has([data-slot=dialog-panel])]:pt-3 pt-4 pb-6\",\n className,\n )}\n data-slot=\"dialog-footer\"\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n className={cn(\n \"font-heading font-semibold text-xl leading-none\",\n className,\n )}\n data-slot=\"dialog-title\"\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"dialog-description\"\n {...props}\n />\n );\n}\n\nfunction DialogPanel({\n className,\n scrollFade = true,\n ...props\n}: React.ComponentProps<\"div\"> & { scrollFade?: boolean }) {\n return (\n <ScrollArea scrollFade={scrollFade}>\n <div\n className={cn(\n \"px-6 in-[[data-slot=dialog-popup]:has([data-slot=dialog-header])]:pt-1 in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-header]))]:pt-6 in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-footer]))]:pb-6! in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-footer].border-t))]:pb-1 pb-6\",\n className,\n )}\n data-slot=\"dialog-panel\"\n {...props}\n />\n </ScrollArea>\n );\n}\n\nexport {\n DialogCreateHandle,\n Dialog,\n DialogTrigger,\n DialogPortal,\n DialogClose,\n DialogBackdrop,\n DialogBackdrop as DialogOverlay,\n DialogPopup,\n DialogPopup as DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n DialogPanel,\n DialogViewport,\n};\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Input, type InputProps } from \"./input\";\nimport { Textarea, type TextareaProps } from \"./textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/6%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"[&_svg]:-mx-0.5 flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 order-last pe-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 order-first ps-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(\"input, textarea\");\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"[&_svg]:-mx-0.5 line-clamp-1 flex items-center gap-2 text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: InputProps) {\n return <Input className={className} unstyled {...props} />;\n}\n\nfunction InputGroupTextarea({ className, ...props }: TextareaProps) {\n return <Textarea className={className} unstyled {...props} />;\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n","import type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Frame({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative flex flex-col rounded-xl bg-muted/72 p-1\",\n \"*:[[data-slot=frame-panel]+[data-slot=frame-panel]]:mt-1\",\n className,\n )}\n data-slot=\"frame\"\n {...props}\n />\n );\n}\n\nfunction FramePanel({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative rounded-xl border bg-background bg-clip-padding p-5 shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"frame-panel\"\n {...props}\n />\n );\n}\n\nfunction FrameHeader({ className, ...props }: React.ComponentProps<\"header\">) {\n return (\n <header\n className={cn(\"flex flex-col px-5 py-4\", className)}\n data-slot=\"frame-panel-header\"\n {...props}\n />\n );\n}\n\nfunction FrameTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"font-semibold text-sm\", className)}\n data-slot=\"frame-panel-title\"\n {...props}\n />\n );\n}\n\nfunction FrameDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"frame-panel-description\"\n {...props}\n />\n );\n}\n\nfunction FrameFooter({ className, ...props }: React.ComponentProps<\"footer\">) {\n return (\n <footer\n className={cn(\"px-5 py-4\", className)}\n data-slot=\"frame-panel-footer\"\n {...props}\n />\n );\n}\n\nexport {\n Frame,\n FramePanel,\n FrameHeader,\n FrameTitle,\n FrameDescription,\n FrameFooter,\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { type Button, buttonVariants } from \"./button\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n data-slot=\"pagination\"\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n className={cn(\"flex flex-row items-center gap-1\", className)}\n data-slot=\"pagination-content\"\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n size?: React.ComponentProps<typeof Button>[\"size\"];\n} & useRender.ComponentProps<\"a\">;\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n render,\n ...props\n}: PaginationLinkProps) {\n const defaultProps = {\n \"aria-current\": isActive ? (\"page\" as const) : undefined,\n className: render\n ? className\n : cn(\n buttonVariants({\n size,\n variant: isActive ? \"outline\" : \"ghost\",\n }),\n className,\n ),\n \"data-active\": isActive,\n \"data-slot\": \"pagination-link\",\n };\n\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(defaultProps, props),\n render,\n });\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n className={cn(\"max-sm:aspect-square max-sm:p-0\", className)}\n size=\"default\"\n {...props}\n >\n <ChevronLeftIcon className=\"sm:-ms-1\" />\n <span className=\"sm:hidden\">Previous</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n className={cn(\"max-sm:aspect-square max-sm:p-0\", className)}\n size=\"default\"\n {...props}\n >\n <span className=\"sm:hidden\">Next</span>\n <ChevronRightIcon className=\"sm:-me-1\" />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n className={cn(\"flex min-w-7 justify-center\", className)}\n data-slot=\"pagination-ellipsis\"\n {...props}\n >\n <MoreHorizontalIcon className=\"size-5 sm:size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n","import type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n className=\"relative w-full overflow-x-auto\"\n data-slot=\"table-container\"\n >\n <table\n className={cn(\n \"w-full caption-bottom in-data-[slot=frame]:border-separate in-data-[slot=frame]:border-spacing-0 text-sm\",\n className,\n )}\n data-slot=\"table\"\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n className={cn(\n \"[&_tr]:border-b in-data-[slot=frame]:**:[th]:h-9 in-data-[slot=frame]:*:[tr]:border-none in-data-[slot=frame]:*:[tr]:hover:bg-transparent\",\n className,\n )}\n data-slot=\"table-header\"\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n className={cn(\n \"relative in-data-[slot=frame]:rounded-xl in-data-[slot=frame]:shadow-xs/5 before:pointer-events-none before:absolute before:inset-px not-in-data-[slot=frame]:before:hidden before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/8%)] [&_tr:last-child]:border-0 in-data-[slot=frame]:*:[tr]:border-0 in-data-[slot=frame]:*:[tr]:*:[td]:border-b in-data-[slot=frame]:*:[tr]:*:[td]:bg-background in-data-[slot=frame]:*:[tr]:*:[td]:bg-clip-padding in-data-[slot=frame]:*:[tr]:first:*:[td]:first:rounded-ss-xl in-data-[slot=frame]:*:[tr]:*:[td]:first:border-s in-data-[slot=frame]:*:[tr]:first:*:[td]:border-t in-data-[slot=frame]:*:[tr]:last:*:[td]:last:rounded-ee-xl in-data-[slot=frame]:*:[tr]:*:[td]:last:border-e in-data-[slot=frame]:*:[tr]:first:*:[td]:last:rounded-se-xl in-data-[slot=frame]:*:[tr]:last:*:[td]:first:rounded-es-xl in-data-[slot=frame]:*:[tr]:hover:*:[td]:bg-transparent in-data-[slot=frame]:*:[tr]:data-[state=selected]:*:[td]:bg-muted/72\",\n className,\n )}\n data-slot=\"table-body\"\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n className={cn(\n \"border-t in-data-[slot=frame]:border-none bg-muted/72 in-data-[slot=frame]:bg-transparent font-medium [&>tr]:last:border-b-0 in-data-[slot=frame]:*:[tr]:hover:bg-transparent\",\n className,\n )}\n data-slot=\"table-footer\"\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n className={cn(\n \"border-b transition-colors hover:bg-muted/72 in-data-[slot=frame]:hover:bg-transparent data-[state=selected]:bg-muted/72 in-data-[slot=frame]:data-[state=selected]:bg-transparent\",\n className,\n )}\n data-slot=\"table-row\"\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n className={cn(\n \"h-10 whitespace-nowrap px-2.5 text-left align-middle font-medium text-muted-foreground leading-none has-[[role=checkbox]]:w-px has-[[role=checkbox]]:pe-0\",\n className,\n )}\n data-slot=\"table-head\"\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n className={cn(\n \"whitespace-nowrap p-2.5 align-middle leading-none in-data-[slot=frame]:first:p-[calc(--spacing(2.5)-1px)] in-data-[slot=frame]:last:p-[calc(--spacing(2.5)-1px)] has-[[role=checkbox]]:pe-0\",\n className,\n )}\n data-slot=\"table-cell\"\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n className={cn(\n \"in-data-[slot=frame]:my-4 mt-4 text-muted-foreground text-sm\",\n className,\n )}\n data-slot=\"table-caption\"\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","\"use client\"\n\nimport React from \"react\"\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type PaginationState,\n type SortingState,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport {\n ChevronDownIcon,\n ChevronUpIcon,\n ChevronsUpDownIcon,\n Loader2Icon,\n SearchIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport {\n DialogFooter,\n DialogHeader,\n DialogPanel,\n DialogPopup,\n DialogTitle,\n} from \"../ui/dialog\"\nimport { Frame, FrameFooter } from \"../ui/frame\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"../ui/pagination\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\"\n\n// ---------------------------------------------------------------------------\n// Pagination helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns an ordered list of page numbers and ellipsis markers to display.\n *\n * Rules (always-visible anchors: first 2 + last 2):\n * - Near start (currentPage ≤ 3) → show [1,2,3] … [n-1,n]\n * - Near end (currentPage ≥ totalPages-2) → show [1,2] … [n-2,n-1,n]\n * - Middle → show [1,2] … [p] … [n-1,n]\n *\n * Single-page gaps are filled automatically (no orphan ellipsis).\n */\nfunction getPageItems(currentPage: number, totalPages: number): (number | \"ellipsis\")[] {\n const left = [1, 2]\n const right = [totalPages - 1, totalPages]\n\n let middle: number[]\n if (currentPage <= 3) {\n middle = [3]\n } else if (currentPage >= totalPages - 2) {\n middle = [totalPages - 2]\n } else {\n middle = [currentPage]\n }\n\n const pagesSet = new Set(\n [...left, ...middle, ...right].filter((p) => p >= 1 && p <= totalPages)\n )\n const pages = Array.from(pagesSet).sort((a, b) => a - b)\n\n const items: (number | \"ellipsis\")[] = []\n for (let i = 0; i < pages.length; i++) {\n if (i > 0) {\n const gap = pages[i] - pages[i - 1]\n if (gap === 2) {\n // Fill single-page gap instead of showing ellipsis\n items.push(pages[i] - 1)\n } else if (gap > 2) {\n items.push(\"ellipsis\")\n }\n }\n items.push(pages[i])\n }\n\n return items\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type PickerModalProps<T extends { id: number | string }> = {\n title: string\n\n /** Search */\n searchQuery: string\n onSearch: (query: string) => void\n searchPlaceholder?: string\n\n /** Table data */\n columns: ColumnDef<T>[]\n data: T[]\n loading: boolean\n totalItems: number\n\n /** Highlighted row */\n selectedId?: number | string\n\n onRowClick: (item: T) => void\n\n /** Pagination — tanstack PaginationState */\n pagination: PaginationState\n onPaginationChange: React.Dispatch<React.SetStateAction<PaginationState>>\n\n /** Sorting (optional — pass undefined to disable entirely) */\n sorting?: SortingState\n onSortingChange?: React.Dispatch<React.SetStateAction<SortingState>>\n\n /** Page size selector options (defaults to [10, 25, 50, 100]) */\n pageSizeOptions?: number[]\n\n /** Empty state */\n emptyIcon?: React.ReactNode\n emptyMessage?: string\n\n /** Optional footer (e.g. upload zone) */\n footer?: React.ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// PickerModal\n// ---------------------------------------------------------------------------\n\nexport function PickerModal<T extends { id: number | string }>({\n title,\n searchQuery,\n onSearch,\n searchPlaceholder = \"Search...\",\n columns,\n data,\n loading,\n totalItems,\n selectedId,\n onRowClick,\n pagination,\n onPaginationChange,\n sorting = [],\n onSortingChange,\n pageSizeOptions = [10, 25, 50, 100],\n emptyIcon,\n emptyMessage = \"No results found\",\n footer,\n}: PickerModalProps<T>) {\n const totalPages = Math.max(1, Math.ceil(totalItems / pagination.pageSize))\n\n const table = useReactTable({\n data,\n columns,\n pageCount: totalPages,\n state: { pagination, sorting },\n onPaginationChange,\n ...(onSortingChange ? { onSortingChange } : {}),\n getCoreRowModel: getCoreRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableSortingRemoval: false,\n })\n\n const pageSize = table.getState().pagination.pageSize\n\n return (\n <DialogPopup className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogPanel className=\"flex flex-col gap-4\">\n <InputGroup>\n <InputGroupInput\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => onSearch(e.target.value)}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4\" />\n </InputGroupAddon>\n </InputGroup>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2Icon className=\"text-muted-foreground size-8 animate-spin\" />\n </div>\n ) : (\n <Frame className=\"w-full overflow-hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className=\"hover:bg-transparent\"\n >\n {headerGroup.headers.map((header) => {\n const columnSize = header.column.getSize()\n return (\n <TableHead\n key={header.id}\n style={\n columnSize\n ? { width: `${columnSize}px` }\n : undefined\n }\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <div\n className=\"flex h-full cursor-pointer select-none items-center justify-between gap-2\"\n onClick={header.column.getToggleSortingHandler()}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" ||\n e.key === \" \"\n ) {\n e.preventDefault()\n header.column.getToggleSortingHandler()?.(e)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {(\n {\n asc: (\n <ChevronUpIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-80\"\n />\n ),\n desc: (\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-80\"\n />\n ),\n } as Record<string, React.ReactNode>\n )[header.column.getIsSorted() as string] ?? (\n <ChevronsUpDownIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-40\"\n />\n )}\n </div>\n ) : (\n flexRender(\n header.column.columnDef.header,\n header.getContext()\n )\n )}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className={cn(\n \"hover:bg-muted/50 cursor-pointer transition-colors\",\n selectedId === row.original.id && \"bg-primary/5\"\n )}\n onClick={() => onRowClick(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"py-12 text-center\"\n >\n <div className=\"text-muted-foreground flex flex-col items-center justify-center text-sm\">\n {emptyIcon}\n <p>{emptyMessage}</p>\n </div>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n\n {totalItems > 0 && (\n <FrameFooter className=\"p-2\">\n <div className=\"grid grid-cols-[1fr_auto_1fr] items-center gap-x-4\">\n <div className=\"hidden sm:flex items-center gap-2 whitespace-nowrap justify-self-start\">\n <p className=\"text-muted-foreground text-sm\">Viewing</p>\n <Select\n value={(table.getState().pagination.pageIndex + 1).toString()}\n onValueChange={(val) =>\n table.setPageIndex(Number(val) - 1)\n }\n >\n <SelectTrigger\n aria-label=\"Select result range\"\n className=\"w-fit min-w-none\"\n size=\"sm\"\n >\n <SelectValue>\n {(() => {\n const idx = table.getState().pagination.pageIndex\n const start = idx * pageSize + 1\n const end = Math.min((idx + 1) * pageSize, totalItems)\n return `${start}–${end}`\n })()}\n </SelectValue>\n </SelectTrigger>\n <SelectPopup>\n {Array.from({ length: table.getPageCount() }, (_, i) => {\n const pageNum = i + 1\n const start = i * pageSize + 1\n const end = Math.min((i + 1) * pageSize, totalItems)\n return (\n <SelectItem key={pageNum} value={pageNum.toString()}>\n {`${start}–${end}`}\n </SelectItem>\n )\n })}\n </SelectPopup>\n </Select>\n <p className=\"text-muted-foreground text-sm\">\n of{\" \"}\n <strong className=\"font-medium text-foreground\">\n {totalItems}\n </strong>{\" \"}\n results\n </p>\n </div>\n\n <div className=\"flex items-center gap-2 whitespace-nowrap justify-self-center col-start-2\">\n <p className=\"text-muted-foreground text-sm\">Per page</p>\n <Select\n value={pageSize.toString()}\n onValueChange={(val) =>\n table.setPageSize(Number(val))\n }\n >\n <SelectTrigger\n aria-label=\"Rows per page\"\n className=\"w-fit min-w-none\"\n size=\"sm\"\n >\n <span className=\"flex-1 truncate\">{pageSize}</span>\n </SelectTrigger>\n <SelectPopup>\n {pageSizeOptions.map((size) => (\n <SelectItem\n key={size}\n value={size.toString()}\n >\n {size}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </div>\n\n <Pagination className=\"justify-self-end justify-end table-pagination\">\n <PaginationContent className=\"gap-0\">\n <PaginationItem>\n <PaginationPrevious\n className=\"max-sm:*:[svg]:hidden\"\n render={\n <Button\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n />\n </PaginationItem>\n\n {getPageItems(\n table.getState().pagination.pageIndex + 1,\n table.getPageCount()\n ).map((item, index) => (\n <PaginationItem key={index} className=\"hidden sm:block\">\n {item === \"ellipsis\" ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"pagination-ellipsis\"\n >\n <PaginationEllipsis />\n </Button>\n ) : (\n <PaginationLink\n isActive={item === table.getState().pagination.pageIndex + 1}\n size=\"sm\"\n render={\n <Button\n onClick={() => table.setPageIndex(item - 1)}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n >\n {item}\n </PaginationLink>\n )}\n </PaginationItem>\n ))}\n\n <PaginationItem>\n <PaginationNext\n className=\"max-sm:*:[svg]:hidden\"\n render={\n <Button\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </FrameFooter>\n )}\n </Frame>\n )}\n </DialogPanel>\n\n {footer && <DialogFooter>{footer}</DialogFooter>}\n </DialogPopup>\n )\n}\n\nexport default PickerModal\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\"\nimport {\n type ColumnDef,\n type PaginationState,\n type SortingState,\n} from \"@tanstack/react-table\"\nimport {\n DatabaseIcon,\n FileTextIcon,\n XIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogTrigger,\n} from \"../ui/dialog\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport { PickerModal } from \"../PickerModal\"\n\n// ---------------------------------------------------------------------------\n// Types — alignés sur le modèle PHP PageLang\n// ---------------------------------------------------------------------------\n\nexport type PageItem = {\n id: number\n name: string\n url: string\n /** Correspond au champ `published` (boolean) de PageLang */\n published: boolean\n}\n\n/**\n * Référence stable vers une page — ne contient jamais l'URL,\n * qui peut changer. Utiliser `usePageUrl` pour la résolution dynamique.\n */\nexport type PageReference = {\n id: number\n name: string\n url: string\n}\n\nexport type PagePickerValue = {\n type?: \"url\" | \"page\"\n url?: string\n page?: PageReference | null\n}\n\n// ---------------------------------------------------------------------------\n// Config & API helpers\n// ---------------------------------------------------------------------------\n\ntype PagePickerConfig = {\n pagesUrl: string\n langId?: string\n}\n\nconst getEditorConfig = (): PagePickerConfig => {\n const editorEl = document.getElementById(\"editor\")\n return {\n pagesUrl: editorEl?.dataset.pagesUrl || \"/admin/pages/puck/pages\",\n langId: editorEl?.dataset.langId || \"\",\n }\n}\n\nconst fetchPages = async ({\n query,\n filters,\n page = 1,\n limit = 10,\n sortBy,\n sortOrder,\n}: {\n query?: string\n filters?: Record<string, string>\n page?: number\n limit?: number\n sortBy?: string\n sortOrder?: \"asc\" | \"desc\"\n}) => {\n const { pagesUrl, langId } = getEditorConfig()\n\n const params = new URLSearchParams()\n if (query) params.append(\"search\", query)\n if (langId) params.append(\"lang_id\", langId)\n params.append(\"page\", page.toString())\n params.append(\"limit\", limit.toString())\n if (sortBy) params.append(\"sort_by\", sortBy)\n if (sortOrder) params.append(\"sort_order\", sortOrder)\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n params.append(key, value)\n })\n }\n\n const response = await fetch(`${pagesUrl}?${params.toString()}`, {\n credentials: \"same-origin\",\n })\n const data = await response.json()\n\n if (data.success && data.pages) {\n return {\n items: data.pages as PageItem[],\n total: (data.total as number) || data.pages.length,\n }\n }\n\n return { items: [], total: 0 }\n}\n\nconst fetchPageById = async (id: number): Promise<PageItem | null> => {\n try {\n const result = await fetchPages({ filters: { id: id.toString() }, limit: 1 })\n return result.items[0] ?? null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Status badge helper — basé sur le booléen `published` de PageLang\n// ---------------------------------------------------------------------------\n\ntype PublishedBadge = { label: string; dot: string }\n\nconst getPublishedBadge = (published: boolean): PublishedBadge =>\n published\n ? { label: \"Published\", dot: \"bg-emerald-500\" }\n : { label: \"Unpublished\", dot: \"bg-red-500\" }\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VALUE: PagePickerValue = { type: \"page\", page: null }\nconst PAGE_SIZE = 10\n\n// ---------------------------------------------------------------------------\n// PageLibraryModal\n// ---------------------------------------------------------------------------\n\ntype PageLibraryModalProps = {\n value: PageReference | null\n onChange: (page: PageReference) => void\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nconst PageLibraryModal = ({\n value,\n onChange,\n open,\n onOpenChange,\n}: PageLibraryModalProps) => {\n const [pages, setPages] = useState<PageItem[]>([])\n const [loading, setLoading] = useState(false)\n const [totalItems, setTotalItems] = useState(0)\n const [searchQuery, setSearchQuery] = useState(\"\")\n\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: PAGE_SIZE,\n })\n const [sorting, setSorting] = useState<SortingState>([])\n\n const loadPages = useCallback(\n async (\n pageIndex: number,\n pageSize: number,\n query: string,\n sort: SortingState\n ) => {\n setLoading(true)\n try {\n const sortItem = sort[0]\n const result = await fetchPages({\n page: pageIndex + 1,\n limit: pageSize,\n query,\n sortBy: sortItem?.id,\n sortOrder: sortItem ? (sortItem.desc ? \"desc\" : \"asc\") : undefined,\n })\n setPages(result.items)\n setTotalItems(result.total)\n } catch (error) {\n console.error(\"Error loading pages:\", error)\n } finally {\n setLoading(false)\n }\n },\n []\n )\n\n useEffect(() => {\n if (open) {\n loadPages(\n pagination.pageIndex,\n pagination.pageSize,\n searchQuery,\n sorting\n )\n }\n }, [open, pagination, sorting, searchQuery, loadPages])\n\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [])\n\n const handleRowClick = useCallback(\n (page: PageItem) => {\n onChange({ id: page.id, name: page.name, url: page.url })\n onOpenChange(false)\n },\n [onChange, onOpenChange]\n )\n\n const columns = useMemo<ColumnDef<PageItem>[]>(\n () => [\n {\n accessorKey: \"id\",\n header: \"ID\",\n size: 40,\n cell: ({ row }) => (\n <span className=\"text-muted-foreground font-mono text-xs\">\n #{row.getValue(\"id\")}\n </span>\n ),\n },\n {\n accessorKey: \"name\",\n header: \"Name\",\n size: 200,\n cell: ({ row }) => (\n <div className=\"font-medium\">{row.getValue(\"name\")}</div>\n ),\n },\n {\n accessorKey: \"url\",\n header: \"URL\",\n cell: ({ row }) => (\n <div className=\"text-muted-foreground font-mono text-xs truncate\">\n {toRelativeUrl(row.getValue(\"url\"))}\n </div>\n ),\n },\n {\n accessorKey: \"published\",\n header: \"Status\",\n size: 60,\n enableSorting: false,\n cell: ({ row }) => {\n const { label, dot } = getPublishedBadge(row.getValue(\"published\"))\n return (\n <Badge variant=\"outline\">\n <span aria-hidden=\"true\" className={cn(\"size-1.5 rounded-full\", dot)} />\n {label}\n </Badge>\n )\n },\n },\n ],\n []\n )\n\n return (\n <PickerModal<PageItem>\n title=\"Select Page\"\n searchQuery={searchQuery}\n onSearch={handleSearch}\n searchPlaceholder=\"Search pages...\"\n columns={columns}\n data={pages}\n loading={loading}\n totalItems={totalItems}\n selectedId={value?.id}\n onRowClick={handleRowClick}\n pagination={pagination}\n onPaginationChange={setPagination}\n sorting={sorting}\n onSortingChange={setSorting}\n emptyIcon={<FileTextIcon className=\"mb-2 size-12 opacity-20\" />}\n emptyMessage=\"No pages found\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// PagePicker (field component)\n// ---------------------------------------------------------------------------\n\nexport type PagePickerProps = {\n value?: PagePickerValue\n onChange: (value: PagePickerValue) => void\n}\n\nexport const PagePicker = ({ value, onChange }: PagePickerProps) => {\n const [open, setOpen] = useState(false)\n const currentValue = value || DEFAULT_VALUE\n\n const displayValue =\n currentValue.type === \"page\" && currentValue.page\n ? currentValue.page.name\n : currentValue.url || \"\"\n\n const hasValue = Boolean(\n (currentValue.type === \"page\" && currentValue.page) ||\n (currentValue.type === \"url\" && currentValue.url)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ type: \"url\", url: e.target.value })\n }\n\n const handlePageChange = (page: PageReference) => {\n onChange({ type: \"page\", page })\n }\n\n const handleClear = () => {\n onChange(DEFAULT_VALUE)\n }\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <InputGroup>\n {currentValue.type === \"page\" && currentValue.page && (\n <InputGroupAddon align=\"inline-start\">\n <span className=\"bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs\">\n #{currentValue.page.id}\n </span>\n </InputGroupAddon>\n )}\n <InputGroupInput\n placeholder=\"https://example.com/\"\n type=\"text\"\n value={displayValue}\n onChange={handleInputChange}\n />\n <InputGroupAddon align=\"inline-end\">\n {hasValue ? (\n <Button\n size=\"icon-xs\"\n variant=\"ghost\"\n onClick={handleClear}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <DialogTrigger\n render={\n <Button size=\"icon-xs\" variant=\"outline\">\n <DatabaseIcon className=\"size-3.5\" />\n </Button>\n }\n />\n )}\n </InputGroupAddon>\n </InputGroup>\n\n <PageLibraryModal\n value={currentValue.page || null}\n onChange={handlePageChange}\n open={open}\n onOpenChange={setOpen}\n />\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an absolute URL to a relative URL by extracting the pathname.\n * If the URL is already relative, returns it as-is.\n *\n * @example\n * toRelativeUrl(\"https://example.com/page?foo=bar#section\") // \"/page?foo=bar#section\"\n * toRelativeUrl(\"/page\") // \"/page\"\n * toRelativeUrl(\"\") // \"\"\n */\nexport const toRelativeUrl = (url: string): string => {\n if (!url) return \"\"\n if (url.startsWith(\"/\")) return url\n\n try {\n const { pathname, search, hash } = new URL(url)\n return pathname + search + hash\n } catch {\n return url\n }\n}\n\n/**\n * Hook React qui résout dynamiquement l'URL courante d'un `PagePickerValue`.\n *\n * Pour les références de page (`type: \"page\"`), l'URL est récupérée depuis\n * l'API à partir de l'`id` de la page — ce qui garantit que le lien reste\n * valide même si l'URL de la page a été modifiée après la sélection.\n *\n * @example\n * const { url, loading } = usePageUrl(value)\n * return loading ? <Spinner /> : <a href={url}>Lien</a>\n */\nexport const usePageUrl = (\n value?: PagePickerValue\n): { url: string | undefined; loading: boolean } => {\n const [url, setUrl] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n\n const pageId = value?.type === \"page\" ? value.page?.id : undefined\n const directUrl = value?.type === \"url\" ? value.url : undefined\n\n useEffect(() => {\n if (directUrl !== undefined) {\n setUrl(directUrl ? toRelativeUrl(directUrl) : undefined)\n return\n }\n\n if (pageId !== undefined) {\n let cancelled = false\n setLoading(true)\n fetchPageById(pageId)\n .then((page) => {\n if (!cancelled) setUrl(page ? toRelativeUrl(page.url) : undefined)\n })\n .catch(() => {\n if (!cancelled) setUrl(undefined)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n\n setUrl(undefined)\n }, [pageId, directUrl])\n\n return { url, loading }\n}\n\nexport default PagePicker\n","\"use client\";\n\nimport { LinkIcon } from \"lucide-react\";\nimport {\n type ComponentProps,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Popover,\n PopoverPopup,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n PagePicker,\n type PagePickerValue,\n toRelativeUrl,\n} from \"../PagePicker\";\n\ntype RichTextMenuLinkProps = {\n editor: Editor | null;\n};\n\n\nfunction RichTextMenuLink({\n editor,\n ...props\n}: RichTextMenuLinkProps &\n Omit<ComponentProps<\"div\">, keyof RichTextMenuLinkProps>) {\n const [pickerValue, setPickerValue] = useState<PagePickerValue>({\n type: \"url\",\n url: \"\",\n });\n const [open, setOpen] = useState(false);\n const selectionRef = useRef<{ from: number; to: number } | null>(null);\n\n useEffect(() => {\n if (open && editor) {\n const currentHref = editor.getAttributes(\"link\").href ?? \"\";\n setPickerValue({ type: \"url\", url: currentHref });\n }\n }, [open, editor]);\n\n const handleSetLink = useCallback(() => {\n if (!editor) return;\n\n let resolvedUrl = \"\";\n if (pickerValue.type === \"page\" && pickerValue.page?.url) {\n // Page URLs may be absolute — normalise to a relative path.\n resolvedUrl = toRelativeUrl(pickerValue.page.url);\n } else if (pickerValue.type === \"url\") {\n // Keep user-typed URLs as-is (supports external links).\n resolvedUrl = pickerValue.url?.trim() ?? \"\";\n }\n\n const sel = selectionRef.current;\n\n // Single chain = single ProseMirror transaction:\n // restore saved selection → extend mark range → set/unset link\n if (!resolvedUrl) {\n const chain = editor.chain().focus();\n if (sel) chain.setTextSelection(sel);\n chain.extendMarkRange(\"link\").unsetLink().run();\n } else {\n const chain = editor.chain().focus();\n if (sel) chain.setTextSelection(sel);\n chain.extendMarkRange(\"link\").setLink({ href: resolvedUrl }).run();\n }\n\n setOpen(false);\n }, [editor, pickerValue]);\n\n return (\n <div {...props}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n title=\"Link\"\n onPointerDown={() => {\n // Capture the editor's selection BEFORE the popover steals focus.\n // onPointerDown fires before click/focus change, so the\n // ProseMirror selection is still intact at this point.\n if (editor) {\n const { from, to } = editor.state.selection;\n selectionRef.current = { from, to };\n }\n }}\n onClick={(e) => {\n // Prevent the click from bubbling up — same pattern used by\n // Puck's built-in controls (Bold, Italic, etc.).\n e.stopPropagation();\n }}\n className={\n \"inline-flex border h-full aspect-square cursor-pointer items-center p-1.5 justify-center rounded-md transition-colors border-stone-200 bg-white text-black hover:border-stone-300 hover:bg-stone-50\"\n }\n />\n }\n >\n <LinkIcon className=\"size-4\" />\n </PopoverTrigger>\n\n <PopoverPopup\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n className=\"w-80\"\n >\n {/*\n * Puck's EditorInner checks e.relatedTarget.closest(\"[data-puck-rte-menu]\")\n * on blur to decide whether the editor should stay \"active\".\n * Because PopoverPopup renders inside a Portal (at <body> level),\n * it lives OUTSIDE the original [data-puck-rte-menu] wrapper.\n * Adding the attribute here tells Puck the popover is still\n * part of the menu, so it won't clear currentRichText when\n * focus moves to the URL input or the page picker.\n */}\n <div data-puck-rte-menu>\n <div className=\"flex items-center gap-2\">\n <PagePicker value={pickerValue} onChange={setPickerValue} />\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={handleSetLink}\n className=\"ml-auto h-8.5 sm:h-7.5\"\n >\n OK\n </Button>\n </div>\n </div>\n </PopoverPopup>\n </Popover>\n </div>\n );\n}\n\nexport { RichTextMenuLink };\n","\"use client\"\n\nimport React from \"react\"\nimport { HexColorPicker } from \"react-colorful\"\nimport { Popover, PopoverTrigger, PopoverPopup } from \"../ui/popover\"\nimport { Input } from \"../ui/input\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport type ColorPickerProps = {\n value?: string\n onChange: (value: string) => void\n}\n\nexport const PREDEFINED_COLORS = [\n { name: \"Blue\", value: \"#3B82F6\" },\n { name: \"Purple\", value: \"#8B5CF6\" },\n { name: \"Pink\", value: \"#EC4899\" },\n { name: \"Rose\", value: \"#F43F5E\" },\n { name: \"Red\", value: \"#EF4444\" },\n { name: \"Orange\", value: \"#F97316\" },\n { name: \"Amber\", value: \"#F59E0B\" },\n { name: \"Green\", value: \"#10B981\" },\n]\n\nexport const GRAY_COLORS = [\n { name: \"Black\", value: \"#000000\" },\n { name: \"Gray 900\", value: \"#18181B\" },\n { name: \"Gray 600\", value: \"#52525B\" },\n { name: \"Gray 300\", value: \"#D4D4D8\" },\n { name: \"Gray 200\", value: \"#E4E4E7\" },\n { name: \"Gray 100\", value: \"#F4F4F5\" },\n { name: \"White\", value: \"#FFFFFF\" },\n]\n\nexport type ColorPickerContentProps = {\n value?: string\n onChange: (value: string) => void\n onClear: () => void\n}\n\nexport const ColorPickerContent: React.FC<ColorPickerContentProps> = ({\n value,\n onChange,\n onClear,\n}) => {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-3\">\n <button\n type=\"button\"\n onClick={onClear}\n className=\"border-border after:bg-destructive relative size-5 cursor-pointer rounded-md border bg-white after:absolute after:inset-0 after:top-1/2 after:left-1/2 after:z-1 after:flex after:h-0.5 after:w-7 after:-translate-x-1/2 after:-translate-y-1/2 after:-rotate-45 after:rounded-full after:content-['']\"\n title=\"Clear color\"\n aria-label=\"Clear color\"\n />\n <div className=\"flex flex-wrap gap-1\">\n {PREDEFINED_COLORS.map((color) => (\n <button\n key={color.value}\n type=\"button\"\n className={cn(\n \"border-primary/20 size-5 cursor-pointer rounded-md border transition-all hover:scale-105\"\n )}\n style={{ backgroundColor: color.value }}\n onClick={() => onChange(color.value)}\n title={color.name}\n aria-label={color.name}\n />\n ))}\n {GRAY_COLORS.map((color) => (\n <button\n key={color.value}\n type=\"button\"\n className={cn(\n \"border-primary/20 size-5 cursor-pointer rounded-md border transition-all hover:scale-105\"\n )}\n style={{ backgroundColor: color.value }}\n onClick={() => onChange(color.value)}\n title={color.name}\n aria-label={color.name}\n />\n ))}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-xs font-medium\">Custom Color</div>\n <div className=\"flex flex-col gap-2\">\n <HexColorPicker\n color={value || \"#000000\"}\n onChange={onChange}\n className=\"!w-full !h-32 color-picker\"\n />\n <Input\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Select a color\"\n onKeyDown={(e) => e.stopPropagation()}\n />\n </div>\n </div>\n </div>\n )\n}\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n onChange,\n}) => {\n return (\n <Popover>\n <PopoverTrigger\n className={cn(\n \"border-input text-foreground focus-visible:border-primary hover:bg-accent w-full justify-between gap-2 rounded-lg border bg-white px-3 py-2 text-sm transition-colors\",\n \"flex items-center\"\n )}\n >\n {value ? (\n <>\n <div\n className=\"border-border size-5 rounded-md border\"\n style={{ backgroundColor: value }}\n />\n <span className=\"flex-1 text-left\">{value}</span>\n </>\n ) : (\n <div className=\"flex items-center justify-start gap-2\">\n <div className=\"border-border after:bg-destructive relative size-5 rounded-md border bg-white after:absolute after:inset-0 after:top-1/2 after:left-1/2 after:z-1 after:flex after:h-0.5 after:w-7 after:-translate-x-1/2 after:-translate-y-1/2 after:-rotate-45 after:rounded-full after:content-['']\"></div>\n <span>No color</span>\n </div>\n )}\n <ChevronDownIcon className=\"size-4\" />\n </PopoverTrigger>\n <PopoverPopup align=\"center\" side=\"bottom\" className=\"!w-full\">\n <ColorPickerContent\n value={value}\n onChange={onChange}\n onClear={() => onChange(\"\")}\n />\n </PopoverPopup>\n </Popover>\n )\n}\n\nexport default ColorPicker\n","\"use client\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { BaselineIcon } from \"lucide-react\";\nimport { type ComponentProps, useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { ColorPickerContent } from \"../ColorPicker\";\nimport {\n Popover,\n PopoverPopup,\n PopoverTrigger,\n} from \"../ui/popover\";\n\ntype RichTextMenuColorPickerProps = {\n editor: Editor | null;\n};\n\n/**\n * Pre-configured tiptap extensions for text color support.\n * Spread this into `tiptap.extensions` in your field config:\n * `extensions: [...richTextMenuColorPickerExtension]`\n */\nconst richTextMenuColorPickerExtension = [TextStyle, Color];\n\nfunction RichTextMenuColorPicker({\n editor,\n ...props\n}: RichTextMenuColorPickerProps &\n Omit<ComponentProps<\"div\">, keyof RichTextMenuColorPickerProps>) {\n const [open, setOpen] = useState(false);\n const selectionRef = useRef<{ from: number; to: number } | null>(null);\n const [localColor, setLocalColor] = useState<string | null>(null);\n\n useEffect(() => {\n if (open && editor) {\n setLocalColor(editor.getAttributes(\"textStyle\").color ?? null);\n }\n }, [open, editor]);\n\n const handleColorChange = useCallback(\n (color: string) => {\n setLocalColor(color || null);\n\n if (!editor) return;\n\n // Do NOT call .focus() here: it steals focus from the HexColorPicker\n // during drag and breaks the drag interaction. ProseMirror commands\n // apply to the editor state regardless of DOM focus.\n const chain = editor.chain();\n if (selectionRef.current) chain.setTextSelection(selectionRef.current);\n\n if (color === \"\") {\n chain.unsetColor().run();\n } else {\n chain.setColor(color).run();\n }\n },\n [editor],\n );\n\n return (\n <div {...props}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n title=\"Text color\"\n onPointerDown={() => {\n // Capture the editor's selection BEFORE the popover steals focus.\n if (editor) {\n const { from, to } = editor.state.selection;\n selectionRef.current = { from, to };\n }\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n className={\n \"inline-flex border h-full aspect-square cursor-pointer border-stone-200 bg-white items-center p-1.5 text-black hover:border-stone-300 hover:bg-stone-50 justify-center rounded-md transition-colors hover:bg-primary-500 hover:text-primary-500\"\n }\n />\n }\n >\n <BaselineIcon className=\"size-4.5\" />\n </PopoverTrigger>\n\n <PopoverPopup\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n className=\"max-w-54\">\n {/*\n * Adding data-puck-rte-menu tells Puck the popover is still\n * part of the menu, so it won't clear currentRichText when\n * focus moves inside the color picker.\n */}\n <div data-puck-rte-menu>\n <ColorPickerContent\n value={localColor ?? undefined}\n onChange={handleColorChange}\n onClear={() => handleColorChange(\"\")}\n />\n </div>\n </PopoverPopup>\n </Popover>\n </div>\n );\n}\n\nexport { RichTextMenuColorPicker, richTextMenuColorPickerExtension };\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\"\nimport { type ColumnDef, type PaginationState, type SortingState } from \"@tanstack/react-table\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogTrigger,\n} from \"../ui/dialog\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport { cn } from \"../../lib/utils\"\nimport {\n DatabaseIcon,\n FileIcon,\n Loader2Icon,\n UploadIcon,\n XIcon,\n} from \"lucide-react\"\nimport { Badge } from \"../ui/badge\"\nimport { PickerModal } from \"../PickerModal\"\n\nexport type MediaItem = {\n id: number\n name: string\n url: string\n thumbnail: string\n type: string\n}\n\nexport type MediaPickerValue = {\n type?: \"url\" | \"media\"\n url?: string\n media?: MediaItem | null\n}\n\ntype MediaPickerConfig = {\n mediasUrl: string\n uploadUrl: string\n langId?: string\n}\n\nconst getEditorConfig = (): MediaPickerConfig => {\n const editorEl = document.getElementById(\"editor\")\n return {\n mediasUrl: editorEl?.dataset.mediasUrl || \"/admin/pages/puck/medias\",\n uploadUrl:\n editorEl?.dataset.uploadUrl || \"/admin/pages/puck/medias/upload\",\n langId: editorEl?.dataset.langId || \"\",\n }\n}\n\nconst fetchMedias = async ({\n query,\n filters,\n page = 1,\n limit = 10,\n sortBy,\n sortOrder,\n}: {\n query?: string\n filters?: Record<string, string>\n page?: number\n limit?: number\n sortBy?: string\n sortOrder?: \"asc\" | \"desc\"\n}) => {\n const { mediasUrl, langId } = getEditorConfig()\n\n const params = new URLSearchParams()\n if (query) params.append(\"search\", query)\n if (langId) params.append(\"lang_id\", langId)\n params.append(\"page\", page.toString())\n params.append(\"limit\", limit.toString())\n if (sortBy) params.append(\"sort_by\", sortBy)\n if (sortOrder) params.append(\"sort_order\", sortOrder)\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n params.append(key, value)\n })\n }\n\n const response = await fetch(`${mediasUrl}?${params.toString()}`, {\n credentials: \"same-origin\",\n })\n const data = await response.json()\n\n if (data.success && data.medias) {\n return {\n items: data.medias as MediaItem[],\n total: data.total || data.medias.length,\n }\n }\n\n return { items: [], total: 0 }\n}\n\n// ---------------------------------------------------------------------------\n// MediaUploadZone\n// ---------------------------------------------------------------------------\n\ntype MediaUploadZoneProps = {\n onUploadSuccess?: (media: MediaItem) => void\n acceptedTypes?: string\n maxSize?: number\n}\n\nconst MediaUploadZone = ({\n onUploadSuccess,\n acceptedTypes = \"image/*,video/*,application/pdf\",\n maxSize = 10,\n}: MediaUploadZoneProps) => {\n const [uploading, setUploading] = useState(false)\n const [uploadProgress, setUploadProgress] = useState(0)\n const [dragActive, setDragActive] = useState(false)\n const [uploadQueue, setUploadQueue] = useState<{\n total: number\n completed: number\n }>({ total: 0, completed: 0 })\n\n const getAcceptedTypesLabel = () => {\n const parts: string[] = []\n if (acceptedTypes.includes(\"image\")) parts.push(\"Images\")\n if (acceptedTypes.includes(\"video\")) parts.push(\"Videos\")\n if (acceptedTypes.includes(\"pdf\")) parts.push(\"PDF\")\n if (acceptedTypes === \"*\" || acceptedTypes.includes(\"*/*\")) return \"All files\"\n return parts.length > 0 ? parts.join(\", \") : acceptedTypes\n }\n\n const handleUploadSingle = useCallback(\n (file: File): Promise<MediaItem | null> => {\n return new Promise((resolve, reject) => {\n try {\n const { uploadUrl, langId } = getEditorConfig()\n const csrfToken = document.querySelector(\n 'meta[name=\"csrf-token\"]'\n ) as HTMLMetaElement\n\n const formData = new FormData()\n formData.append(\"file\", file)\n if (langId) formData.append(\"lang_id\", langId)\n\n const xhr = new XMLHttpRequest()\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n setUploadProgress((e.loaded / e.total) * 100)\n }\n })\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText)\n if (response.success && response.media) {\n resolve(response.media)\n } else {\n reject(new Error(\"Upload failed\"))\n }\n } else {\n reject(new Error(\"Error during upload\"))\n }\n })\n\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Error during upload\"))\n })\n\n xhr.open(\"POST\", uploadUrl)\n if (csrfToken) {\n xhr.setRequestHeader(\"X-CSRF-TOKEN\", csrfToken.content)\n }\n xhr.send(formData)\n } catch (error) {\n reject(error)\n }\n })\n },\n []\n )\n\n const handleUpload = useCallback(\n async (files: FileList | File[]) => {\n const fileArray = Array.from(files)\n if (fileArray.length === 0) return\n\n setUploading(true)\n setUploadQueue({ total: fileArray.length, completed: 0 })\n\n try {\n for (let i = 0; i < fileArray.length; i++) {\n const file = fileArray[i]\n setUploadProgress(0)\n\n try {\n const media = await handleUploadSingle(file)\n if (media) {\n onUploadSuccess?.(media)\n }\n } catch (error) {\n console.error(`Error uploading ${file.name}:`, error)\n alert(`Error uploading ${file.name}`)\n }\n\n setUploadQueue((prev) => ({\n ...prev,\n completed: prev.completed + 1,\n }))\n }\n } finally {\n setUploading(false)\n setUploadProgress(0)\n setUploadQueue({ total: 0, completed: 0 })\n }\n },\n [handleUploadSingle, onUploadSuccess]\n )\n\n const handleDrag = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true)\n } else if (e.type === \"dragleave\") {\n setDragActive(false)\n }\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(false)\n\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n handleUpload(e.dataTransfer.files)\n }\n },\n [handleUpload]\n )\n\n const handleFileInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n handleUpload(e.target.files)\n }\n },\n [handleUpload]\n )\n\n const handleClick = useCallback(() => {\n if (!uploading) {\n document.getElementById(\"media-upload-input\")?.click()\n }\n }, [uploading])\n\n return (\n <div className=\"w-full\">\n <div\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n className={cn(\n \"border-border hover:border-primary/50 flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white p-6 transition-colors\",\n dragActive && \"border-primary bg-primary/5\",\n uploading && \"pointer-events-none opacity-60\"\n )}\n onClick={handleClick}\n >\n {uploading ? (\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2Icon className=\"text-primary size-6 animate-spin\" />\n <div className=\"text-sm font-medium\">\n {uploadQueue.total > 1\n ? `Uploading file ${uploadQueue.completed + 1} of ${uploadQueue.total}`\n : \"Uploading...\"}\n </div>\n <div className=\"bg-muted h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{ width: `${uploadProgress}%` }}\n />\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2\">\n <UploadIcon className=\"text-muted-foreground size-8\" />\n <div className=\"text-sm font-medium\">\n Drop files or click to upload\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {getAcceptedTypesLabel()} up to {maxSize}MB\n </div>\n </div>\n )}\n </div>\n <input\n id=\"media-upload-input\"\n type=\"file\"\n accept={acceptedTypes}\n onChange={handleFileInput}\n className=\"hidden\"\n disabled={uploading}\n multiple\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// MediaPreview\n// ---------------------------------------------------------------------------\n\ntype MediaPreviewProps = {\n media: MediaItem\n className?: string\n}\n\nconst MediaPreview = ({ media, className }: MediaPreviewProps) => {\n const isVideo = media.type.toLowerCase().startsWith(\"video/\")\n\n if (isVideo) {\n return (\n <video\n src={media.url}\n className={cn(\"h-auto w-full aspect-square border border-border rounded-md object-cover\", className)}\n controls\n preload=\"metadata\"\n />\n )\n }\n\n return (\n <img\n src={media.thumbnail}\n alt={media.name}\n className={cn(\"h-auto w-full aspect-square border border-border rounded-md object-cover\", className)}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VALUE: MediaPickerValue = { type: \"media\", media: null }\nconst PAGE_SIZE = 10\n\n// ---------------------------------------------------------------------------\n// MediaLibraryModal\n// ---------------------------------------------------------------------------\n\ntype MediaLibraryModalProps = {\n value: MediaItem | null\n onChange: (media: MediaItem | null) => void\n mediaType?: string\n open: boolean\n onOpenChange: (open: boolean) => void\n acceptedTypes?: string\n maxSize?: number\n}\n\nconst MediaLibraryModal = ({\n value,\n onChange,\n mediaType,\n open,\n onOpenChange,\n acceptedTypes,\n maxSize,\n}: MediaLibraryModalProps) => {\n const [medias, setMedias] = useState<MediaItem[]>([])\n const [loading, setLoading] = useState(false)\n const [totalItems, setTotalItems] = useState(0)\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: PAGE_SIZE,\n })\n const [sorting, setSorting] = useState<SortingState>([])\n\n const loadMedias = useCallback(\n async (pageIndex: number, pageSize: number, query?: string, sort: SortingState = []) => {\n setLoading(true)\n try {\n const sortItem = sort[0]\n const result = await fetchMedias({\n page: pageIndex + 1,\n limit: pageSize,\n query,\n sortBy: sortItem?.id,\n sortOrder: sortItem ? (sortItem.desc ? \"desc\" : \"asc\") : undefined,\n filters: mediaType ? { type: mediaType } : undefined,\n })\n setMedias(result.items)\n setTotalItems(result.total)\n } catch (error) {\n console.error(\"Error loading medias:\", error)\n } finally {\n setLoading(false)\n }\n },\n [mediaType]\n )\n\n useEffect(() => {\n if (open) {\n loadMedias(pagination.pageIndex, pagination.pageSize, searchQuery, sorting)\n }\n }, [open, pagination, sorting, searchQuery, loadMedias])\n\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [])\n\n const handleRowClick = useCallback(\n (media: MediaItem) => {\n onChange(media)\n onOpenChange(false)\n },\n [onChange, onOpenChange]\n )\n\n const handleUploadSuccess = useCallback(\n async (_media: MediaItem) => {\n await loadMedias(0, pagination.pageSize, searchQuery, sorting)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n },\n [loadMedias, pagination.pageSize, searchQuery, sorting]\n )\n\n const columns = useMemo<ColumnDef<MediaItem>[]>(\n () => [\n {\n id: \"thumbnail\",\n header: \"Preview\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <MediaPreview media={row.original} className=\"size-12\" />\n ),\n },\n {\n accessorKey: \"name\",\n header: \"Name\",\n cell: ({ row }) => (\n <div className=\"font-medium\">{row.getValue(\"name\")}</div>\n ),\n },\n {\n accessorKey: \"type\",\n header: \"Type\",\n size: 140,\n cell: ({ row }) => (\n <Badge variant=\"outline\">{row.getValue(\"type\")}</Badge>\n ),\n },\n ],\n []\n )\n\n return (\n <PickerModal<MediaItem>\n title=\"Select Media\"\n searchQuery={searchQuery}\n onSearch={handleSearch}\n columns={columns}\n data={medias}\n loading={loading}\n totalItems={totalItems}\n selectedId={value?.id}\n onRowClick={handleRowClick}\n pagination={pagination}\n onPaginationChange={setPagination}\n sorting={sorting}\n onSortingChange={setSorting}\n emptyIcon={<FileIcon className=\"mb-2 size-12 opacity-20\" />}\n emptyMessage=\"No media found\"\n footer={\n <MediaUploadZone\n onUploadSuccess={handleUploadSuccess}\n acceptedTypes={acceptedTypes}\n maxSize={maxSize}\n />\n }\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// MediaPicker (field component)\n// ---------------------------------------------------------------------------\n\nexport type MediaPickerProps = {\n value?: MediaPickerValue\n onChange: (value: MediaPickerValue) => void\n mediaType?: string\n acceptedTypes?: string\n maxSize?: number\n}\n\nexport const MediaPicker = ({\n value,\n onChange,\n mediaType,\n acceptedTypes = \"image/*,video/*,application/pdf\",\n maxSize = 10,\n}: MediaPickerProps) => {\n const [open, setOpen] = useState(false)\n const currentValue = value || DEFAULT_VALUE\n\n const displayValue =\n currentValue.type === \"media\" && currentValue.media\n ? currentValue.media.name\n : currentValue.url || \"\"\n\n const hasValue = Boolean(\n (currentValue.type === \"media\" && currentValue.media) ||\n (currentValue.type === \"url\" && currentValue.url)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ type: \"url\", url: e.target.value })\n }\n\n const handleMediaChange = (media: MediaItem | null) => {\n onChange({ type: \"media\", media })\n }\n\n const handleClear = () => {\n onChange(DEFAULT_VALUE)\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <Dialog open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center gap-2\">\n <InputGroup>\n\n {currentValue.type === \"media\" && currentValue.media && (\n <InputGroupAddon align=\"inline-start\" className=\"pl-1.5\">\n <MediaPreview\n media={currentValue.media}\n className=\"max-h-12 my-1.5\"\n />\n </InputGroupAddon>\n )}\n\n <InputGroupInput\n placeholder=\"https://example.com/image.jpg\"\n type=\"text\"\n value={displayValue}\n onChange={handleInputChange}\n />\n <InputGroupAddon align=\"inline-end\">\n {hasValue ? (\n <Button\n size=\"icon-xs\"\n variant=\"ghost\"\n onClick={handleClear}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <DialogTrigger\n render={\n <Button size=\"icon-xs\" variant=\"outline\">\n <DatabaseIcon className=\"size-3.5\" />\n </Button>\n }\n />\n )}\n </InputGroupAddon>\n </InputGroup>\n </div>\n\n <MediaLibraryModal\n value={currentValue.media || null}\n onChange={handleMediaChange}\n mediaType={mediaType}\n open={open}\n onOpenChange={setOpen}\n acceptedTypes={acceptedTypes}\n maxSize={maxSize}\n />\n </Dialog>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nexport const getMediaUrl = (value?: MediaPickerValue): string | undefined => {\n if (!value) return undefined\n if (value.type === \"media\" && value.media) {\n return value.media.url\n }\n return value.url\n}\n\nexport default MediaPicker\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst MenuCreateHandle = MenuPrimitive.createHandle;\n\nconst Menu = MenuPrimitive.Root;\n\nconst MenuPortal = MenuPrimitive.Portal;\n\nfunction MenuTrigger(props: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"menu-trigger\" {...props} />;\n}\n\nfunction MenuPopup({\n children,\n className,\n sideOffset = 4,\n align = \"center\",\n alignOffset,\n side = \"bottom\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n side?: MenuPrimitive.Positioner.Props[\"side\"];\n}) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n className=\"z-50\"\n data-slot=\"menu-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n className={cn(\n \"relative flex not-[class*='w-']:min-w-32 origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"menu-popup\"\n {...props}\n >\n <div className=\"max-h-(--available-height) w-full overflow-y-auto p-1\">\n {children}\n </div>\n </MenuPrimitive.Popup>\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction MenuGroup(props: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"menu-group\" {...props} />;\n}\n\nfunction MenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenuPrimitive.Item\n className={cn(\n \"[&>svg]:-mx-0.5 flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:shrink-0\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nfunction MenuCheckboxItem({\n className,\n children,\n checked,\n variant = \"default\",\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n variant?: \"default\" | \"switch\";\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n checked={checked}\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default items-center gap-2 rounded-sm py-1 ps-2 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n variant === \"switch\"\n ? \"grid-cols-[1fr_auto] gap-4 pe-1.5\"\n : \"grid-cols-[1rem_1fr] pe-4\",\n className,\n )}\n data-slot=\"menu-checkbox-item\"\n {...props}\n >\n {variant === \"switch\" ? (\n <>\n <span className=\"col-start-1\">{children}</span>\n <MenuPrimitive.CheckboxItemIndicator\n className=\"inset-shadow-[0_1px_--theme(--color-black/6%)] inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]\"\n keepMounted\n >\n <span className=\"pointer-events-none block aspect-square h-full in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] origin-left in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s]\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </>\n ) : (\n <>\n <MenuPrimitive.CheckboxItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.CheckboxItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </>\n )}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction MenuRadioGroup(props: MenuPrimitive.RadioGroup.Props) {\n return <MenuPrimitive.RadioGroup data-slot=\"menu-radio-group\" {...props} />;\n}\n\nfunction MenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props) {\n return (\n <MenuPrimitive.RadioItem\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"menu-radio-item\"\n {...props}\n >\n <MenuPrimitive.RadioItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.RadioItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </MenuPrimitive.RadioItem>\n );\n}\n\nfunction MenuGroupLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.GroupLabel\n className={cn(\n \"px-2 py-1.5 font-medium text-muted-foreground text-xs data-inset:ps-9 sm:data-inset:ps-8\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-label\"\n {...props}\n />\n );\n}\n\nfunction MenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"menu-separator\"\n {...props}\n />\n );\n}\n\nfunction MenuShortcut({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n className={cn(\n \"ms-auto font-medium font-sans text-muted-foreground/72 text-xs tracking-widest\",\n className,\n )}\n data-slot=\"menu-shortcut\"\n {...props}\n />\n );\n}\n\nfunction MenuSub(props: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"menu-sub\" {...props} />;\n}\n\nfunction MenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n className={cn(\n \"flex min-h-8 items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-popup-open:bg-accent data-inset:ps-8 data-highlighted:text-accent-foreground data-popup-open:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-sub-trigger\"\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"-me-0.5 ms-auto opacity-80\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction MenuSubPopup({\n className,\n sideOffset = 0,\n alignOffset,\n align = \"start\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n}) {\n const defaultAlignOffset = align !== \"center\" ? -5 : undefined;\n\n return (\n <MenuPopup\n align={align}\n alignOffset={alignOffset ?? defaultAlignOffset}\n className={className}\n data-slot=\"menu-sub-content\"\n side=\"inline-end\"\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nexport {\n MenuCreateHandle,\n MenuCreateHandle as DropdownMenuCreateHandle,\n Menu,\n Menu as DropdownMenu,\n MenuPortal,\n MenuPortal as DropdownMenuPortal,\n MenuTrigger,\n MenuTrigger as DropdownMenuTrigger,\n MenuPopup,\n MenuPopup as DropdownMenuContent,\n MenuGroup,\n MenuGroup as DropdownMenuGroup,\n MenuItem,\n MenuItem as DropdownMenuItem,\n MenuCheckboxItem,\n MenuCheckboxItem as DropdownMenuCheckboxItem,\n MenuRadioGroup,\n MenuRadioGroup as DropdownMenuRadioGroup,\n MenuRadioItem,\n MenuRadioItem as DropdownMenuRadioItem,\n MenuGroupLabel,\n MenuGroupLabel as DropdownMenuLabel,\n MenuSeparator,\n MenuSeparator as DropdownMenuSeparator,\n MenuShortcut,\n MenuShortcut as DropdownMenuShortcut,\n MenuSub,\n MenuSub as DropdownMenuSub,\n MenuSubTrigger,\n MenuSubTrigger as DropdownMenuSubTrigger,\n MenuSubPopup,\n MenuSubPopup as DropdownMenuSubContent,\n};\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Switch({ className, ...props }: SwitchPrimitive.Root.Props) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n \"inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(5)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(4)]\",\n className,\n )}\n data-slot=\"switch\"\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n \"pointer-events-none block aspect-square h-full origin-left in-[[role=switch]:active,[data-slot=label]:active,[data-slot=field-label]:active]:not-data-disabled:scale-x-110 in-[[role=switch]:active,[data-slot=label]:active,[data-slot=field-label]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.1)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s] data-checked:origin-[var(--thumb-size)_50%] data-checked:translate-x-[calc(var(--thumb-size)-4px)]\",\n )}\n data-slot=\"switch-thumb\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","\"use client\"\n\nimport { Toast } from \"@base-ui/react/toast\"\nimport {\n CircleAlertIcon,\n CircleCheckIcon,\n InfoIcon,\n LoaderCircleIcon,\n TriangleAlertIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nconst toastManager = Toast.createToastManager()\nconst anchoredToastManager = Toast.createToastManager()\n\nconst TOAST_ICONS = {\n error: CircleAlertIcon,\n info: InfoIcon,\n loading: LoaderCircleIcon,\n success: CircleCheckIcon,\n warning: TriangleAlertIcon,\n} as const\n\ntype ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\"\n\ninterface ToastProviderProps extends Toast.Provider.Props {\n position?: ToastPosition\n}\n\nfunction ToastProvider({\n children,\n position = \"bottom-right\",\n ...props\n}: ToastProviderProps) {\n return (\n <Toast.Provider toastManager={toastManager} {...props}>\n {children}\n <Toasts position={position} />\n </Toast.Provider>\n )\n}\n\nfunction Toasts({ position = \"bottom-right\" }: { position: ToastPosition }) {\n const { toasts } = Toast.useToastManager()\n const isTop = position.startsWith(\"top\")\n\n return (\n <Toast.Portal data-slot=\"toast-portal\">\n <Toast.Viewport\n className={cn(\n \"fixed z-50 mx-auto flex w-[calc(100%-var(--toast-inset)*2)] max-w-90 [--toast-inset:--spacing(4)] sm:[--toast-inset:--spacing(8)]\",\n // Vertical positioning\n \"data-[position*=top]:top-(--toast-inset)\",\n \"data-[position*=bottom]:bottom-(--toast-inset)\",\n // Horizontal positioning\n \"data-[position*=left]:left-(--toast-inset)\",\n \"data-[position*=right]:right-(--toast-inset)\",\n \"data-[position*=center]:left-1/2 data-[position*=center]:-translate-x-1/2\"\n )}\n data-position={position}\n data-slot=\"toast-viewport\"\n >\n {toasts.map((toast) => {\n const Icon = toast.type\n ? TOAST_ICONS[toast.type as keyof typeof TOAST_ICONS]\n : null\n\n return (\n <Toast.Root\n className={cn(\n \"bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 select-none [transition:transform_.5s_cubic-bezier(.22,1,.36,1),opacity_.5s,height_.15s] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n // Base positioning using data-position\n \"data-[position*=right]:right-0 data-[position*=right]:left-auto\",\n \"data-[position*=left]:right-auto data-[position*=left]:left-0\",\n \"data-[position*=center]:right-0 data-[position*=center]:left-0\",\n \"data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top\",\n \"data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom\",\n // Gap fill for hover\n \"after:absolute after:left-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full\",\n \"data-[position*=top]:after:top-full\",\n \"data-[position*=bottom]:after:bottom-full\",\n // Define some variables\n \"[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]\",\n // Define offset-y variable\n \"data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]\",\n \"data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]\",\n // Default state transform\n \"data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]\",\n \"data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]\",\n // Limited state\n \"data-limited:opacity-0\",\n // Expanded state\n \"data-expanded:h-(--toast-height)\",\n \"data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]\",\n // Starting and ending animations\n \"data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]\",\n \"data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]\",\n \"data-ending-style:opacity-0\",\n // Ending animations (direction-aware)\n \"data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]\",\n \"data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]\",\n \"data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]\",\n // Ending animations (expanded)\n \"data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]\"\n )}\n data-position={position}\n key={toast.id}\n swipeDirection={\n position.includes(\"center\")\n ? [isTop ? \"up\" : \"down\"]\n : position.includes(\"left\")\n ? [\"left\", isTop ? \"up\" : \"down\"]\n : [\"right\", isTop ? \"up\" : \"down\"]\n }\n toast={toast}\n >\n <Toast.Content className=\"pointer-events-auto flex items-center justify-between gap-1.5 overflow-hidden px-3.5 py-3 text-sm transition-opacity duration-250 data-behind:pointer-events-none data-behind:opacity-0 data-expanded:opacity-100\">\n <div className=\"flex gap-2\">\n {Icon && (\n <div\n className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg]:h-lh [&>svg]:w-4\"\n data-slot=\"toast-icon\"\n >\n <Icon className=\"in-data-[type=error]:text-destructive in-data-[type=info]:text-info in-data-[type=success]:text-success in-data-[type=warning]:text-warning in-data-[type=loading]:animate-spin in-data-[type=loading]:opacity-80\" />\n </div>\n )}\n\n <div className=\"flex flex-col gap-0.5\">\n <Toast.Title\n className=\"font-medium\"\n data-slot=\"toast-title\"\n />\n <Toast.Description\n className=\"text-muted-foreground\"\n data-slot=\"toast-description\"\n />\n </div>\n </div>\n {toast.actionProps && (\n <Toast.Action\n className={buttonVariants({\n size: \"xs\",\n })}\n data-slot=\"toast-action\"\n >\n {toast.actionProps.children}\n </Toast.Action>\n )}\n </Toast.Content>\n </Toast.Root>\n )\n })}\n </Toast.Viewport>\n </Toast.Portal>\n )\n}\n\nfunction AnchoredToastProvider({ children, ...props }: Toast.Provider.Props) {\n return (\n <Toast.Provider toastManager={anchoredToastManager} {...props}>\n {children}\n <AnchoredToasts />\n </Toast.Provider>\n )\n}\n\nfunction AnchoredToasts() {\n const { toasts } = Toast.useToastManager()\n\n return (\n <Toast.Portal data-slot=\"toast-portal-anchored\">\n <Toast.Viewport\n className=\"outline-none\"\n data-slot=\"toast-viewport-anchored\"\n >\n {toasts.map((toast) => {\n const Icon = toast.type\n ? TOAST_ICONS[toast.type as keyof typeof TOAST_ICONS]\n : null\n const tooltipStyle =\n (toast.data as { tooltipStyle?: boolean })\n ?.tooltipStyle ?? false\n const positionerProps = toast.positionerProps\n\n if (!positionerProps?.anchor) {\n return null\n }\n\n return (\n <Toast.Positioner\n className=\"z-50 max-w-[min(--spacing(64),var(--available-width))]\"\n data-slot=\"toast-positioner\"\n key={toast.id}\n sideOffset={positionerProps.sideOffset ?? 4}\n toast={toast}\n >\n <Toast.Root\n className={cn(\n \"bg-popover text-popover-foreground relative border text-xs text-balance transition-[scale,opacity] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:shadow-[0_1px_--theme(--color-black/6%)] data-ending-style:scale-98 data-ending-style:opacity-0 data-starting-style:scale-98 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n tooltipStyle\n ? \"rounded-md shadow-md/5 before:rounded-[calc(var(--radius-md)-1px)]\"\n : \"rounded-lg shadow-lg/5 before:rounded-[calc(var(--radius-lg)-1px)]\"\n )}\n data-slot=\"toast-popup\"\n toast={toast}\n >\n {tooltipStyle ? (\n <Toast.Content className=\"pointer-events-auto px-2 py-1\">\n <Toast.Title data-slot=\"toast-title\" />\n </Toast.Content>\n ) : (\n <Toast.Content className=\"pointer-events-auto flex items-center justify-between gap-1.5 overflow-hidden px-3.5 py-3 text-sm\">\n <div className=\"flex gap-2\">\n {Icon && (\n <div\n className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg]:h-lh [&>svg]:w-4\"\n data-slot=\"toast-icon\"\n >\n <Icon className=\"in-data-[type=error]:text-destructive in-data-[type=info]:text-info in-data-[type=success]:text-success in-data-[type=warning]:text-warning in-data-[type=loading]:animate-spin in-data-[type=loading]:opacity-80\" />\n </div>\n )}\n\n <div className=\"flex flex-col gap-0.5\">\n <Toast.Title\n className=\"font-medium\"\n data-slot=\"toast-title\"\n />\n <Toast.Description\n className=\"text-muted-foreground\"\n data-slot=\"toast-description\"\n />\n </div>\n </div>\n {toast.actionProps && (\n <Toast.Action\n className={buttonVariants({\n size: \"xs\",\n })}\n data-slot=\"toast-action\"\n >\n {toast.actionProps.children}\n </Toast.Action>\n )}\n </Toast.Content>\n )}\n </Toast.Root>\n </Toast.Positioner>\n )\n })}\n </Toast.Viewport>\n </Toast.Portal>\n )\n}\n\nexport {\n ToastProvider,\n type ToastPosition,\n toastManager,\n AnchoredToastProvider,\n anchoredToastManager,\n}\n","import React from \"react\"\nimport { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type AnimationTraitProps = {\n animation?:\n | \"\"\n | \"fade-in\"\n | \"fade-up\"\n | \"fade-down\"\n | \"fade-left\"\n | \"fade-right\"\n | \"fade-scale\"\n | \"scale-in\"\n | \"scale-up\"\n | \"scale-down\"\n | \"scale-out\"\n | \"slide-up\"\n | \"slide-down\"\n | \"slide-left\"\n | \"slide-right\"\n | \"blur-in\"\n | \"blur-up\"\n | \"blur-down\"\n}\n\nexport const animationField: Fields = {\n animation: {\n type: \"select\",\n label: \"Animation\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"Fade In\", value: \"fade-in\", group: \"Fade\" },\n { label: \"Fade Up\", value: \"fade-up\", group: \"Fade\" },\n { label: \"Fade Down\", value: \"fade-down\", group: \"Fade\" },\n { label: \"Fade Left\", value: \"fade-left\", group: \"Fade\" },\n { label: \"Fade Right\", value: \"fade-right\", group: \"Fade\" },\n { label: \"Fade Scale\", value: \"fade-scale\", group: \"Fade\" },\n { label: \"Scale In\", value: \"scale-in\", group: \"Scale\" },\n { label: \"Scale Up\", value: \"scale-up\", group: \"Scale\" },\n { label: \"Scale Down\", value: \"scale-down\", group: \"Scale\" },\n { label: \"Scale Out\", value: \"scale-out\", group: \"Scale\" },\n { label: \"Slide Up\", value: \"slide-up\", group: \"Slide\" },\n { label: \"Slide Down\", value: \"slide-down\", group: \"Slide\" },\n { label: \"Slide Left\", value: \"slide-left\", group: \"Slide\" },\n { label: \"Slide Right\", value: \"slide-right\", group: \"Slide\" },\n { label: \"Blur In\", value: \"blur-in\", group: \"Blur\" },\n { label: \"Blur Up\", value: \"blur-up\", group: \"Blur\" },\n { label: \"Blur Down\", value: \"blur-down\", group: \"Blur\" },\n ] as any,\n },\n}\n\nexport function animationToAttributes(\n animation?: AnimationTraitProps[\"animation\"]\n): Record<string, string> {\n const attributes: Record<string, string> = {}\n\n if (animation) {\n attributes[\"data-animation\"] = animation\n }\n\n return attributes\n}\n\nexport const animationDefaultProps: AnimationTraitProps = {\n animation: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type DisplayTraitProps = {\n display?:\n | \"hidden\"\n | \"inline\"\n | \"inline-block\"\n | \"block\"\n | \"flex\"\n | \"inline-flex\"\n}\n\nexport const displayField: Fields = {\n display: {\n type: \"select\",\n label: \"Display\",\n options: [\n { label: \"None (hidden)\", value: \"hidden\" },\n { label: \"Inline\", value: \"inline\" },\n { label: \"Inline Block\", value: \"inline-block\" },\n { label: \"Block\", value: \"block\" },\n { label: \"Flex\", value: \"flex\" },\n { label: \"Inline Flex\", value: \"inline-flex\" },\n ],\n },\n}\n\nexport function displayToClasses(\n display?:\n | \"hidden\"\n | \"inline\"\n | \"inline-block\"\n | \"block\"\n | \"flex\"\n | \"inline-flex\"\n): string {\n const classes: string[] = []\n\n if (display) {\n classes.push(display)\n }\n\n return classes.join(\" \")\n}\n\nexport const displayDefaultProps: DisplayTraitProps = {\n display: \"block\",\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type FontWeightTraitProps = {\n fontWeight?:\n | \"\"\n | \"thin\"\n | \"extralight\"\n | \"light\"\n | \"normal\"\n | \"medium\"\n | \"semibold\"\n | \"bold\"\n | \"extrabold\"\n | \"black\"\n}\n\nexport const fontWeightField: Fields = {\n fontWeight: {\n type: \"select\",\n label: \"Font weight\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"Thin (100)\", value: \"thin\" },\n { label: \"Extra Light (200)\", value: \"extralight\" },\n { label: \"Light (300)\", value: \"light\" },\n { label: \"Normal (400)\", value: \"normal\" },\n { label: \"Medium (500)\", value: \"medium\" },\n { label: \"Semibold (600)\", value: \"semibold\" },\n { label: \"Bold (700)\", value: \"bold\" },\n { label: \"Extra Bold (800)\", value: \"extrabold\" },\n { label: \"Black (900)\", value: \"black\" },\n ],\n } as any,\n}\n\nexport function fontWeightToClasses(fontWeight?: string): string {\n if (!fontWeight) return \"\"\n return `font-${fontWeight}`\n}\n\nexport const fontWeightDefaultProps: FontWeightTraitProps = {\n fontWeight: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type LineHeightTraitProps = {\n lineHeight?: \"\" | \"1\" | \"1.25\" | \"1.5\" | \"2\"\n}\n\nexport const lineHeightField: Fields = {\n lineHeight: {\n type: \"select\",\n label: \"Line height\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"1\", value: \"none\" },\n { label: \"1.25\", value: \"1.25\" },\n { label: \"1.5\", value: \"1.5\" },\n { label: \"2\", value: \"2\" },\n ],\n } as any,\n}\n\nexport function lineHeightToClasses(lineHeight?: string): string {\n if (!lineHeight) return \"\"\n return `leading-[${lineHeight}]`\n}\n\nexport const lineHeightDefaultProps: LineHeightTraitProps = {\n lineHeight: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type MarginValue = { value: string; unit: string }\n\nexport type MarginItem = {\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n direction: \"all\" | \"top\" | \"right\" | \"bottom\" | \"left\" | \"x\" | \"y\"\n margin: MarginValue\n}\n\nexport type MarginTraitProps = {\n margins?: Array<MarginItem>\n}\n\nconst MARGIN_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"em\", value: \"em\" },\n { label: \"%\", value: \"%\" },\n { label: \"auto\", value: \"auto\" },\n]\n\nfunction getMarginSummary(item: MarginItem): string {\n if (!item || !item.direction) return \"Margin\"\n\n const bp = item.breakpoint ? `${item.breakpoint.toUpperCase()} - ` : \"\"\n const dir =\n item.direction === \"all\"\n ? \"All 4 directions\"\n : item.direction === \"x\"\n ? \"Horizontal\"\n : item.direction === \"y\"\n ? \"Vertical\"\n : item.direction.charAt(0).toUpperCase() +\n item.direction.slice(1)\n const value = item.margin?.value || \"0\"\n const unit = item.margin?.unit || \"px\"\n return `${bp}${dir}: ${value}${unit}`\n}\n\nexport const marginField: Fields = {\n margins: {\n type: \"array\",\n label: \"Margins\",\n arrayFields: {\n breakpoint: {\n type: \"select\",\n label: \"Breakpoint\",\n options: [\n { label: \"Base\", value: \"\" },\n { label: \"XS\", value: \"xs\" },\n { label: \"SM\", value: \"sm\" },\n { label: \"MD\", value: \"md\" },\n { label: \"LG\", value: \"lg\" },\n { label: \"XL\", value: \"xl\" },\n { label: \"2XL\", value: \"2xl\" },\n ],\n },\n direction: {\n type: \"select\",\n label: \"Direction\",\n options: [\n { label: \"All 4 directions\", value: \"all\" },\n { label: \"Top\", value: \"top\" },\n { label: \"Right\", value: \"right\" },\n { label: \"Bottom\", value: \"bottom\" },\n { label: \"Left\", value: \"left\" },\n { label: \"Horizontal (X)\", value: \"x\" },\n { label: \"Vertical (Y)\", value: \"y\" },\n ],\n },\n margin: {\n type: \"numberUnit\" as any,\n label: \"Margin\",\n options: MARGIN_UNITS,\n },\n },\n defaultItemProps: {\n breakpoint: \"md\",\n direction: \"all\",\n margin: { value: \"0\", unit: \"px\" },\n },\n getItemSummary: (item: MarginItem) => getMarginSummary(item),\n },\n}\n\nexport function marginToClasses(margins?: Array<MarginItem>): string {\n if (!margins || margins.length === 0) return \"\"\n\n const classes: string[] = []\n\n margins.forEach((item) => {\n if (!item || !item.direction || !item.margin) return\n\n const prefix = item.breakpoint ? `${item.breakpoint}:` : \"\"\n const value = item.margin.value || \"0\"\n const unit = item.margin.unit || \"px\"\n\n // Skip if value is empty\n if (!value.trim()) return\n\n let marginClass = \"\"\n switch (item.direction) {\n case \"all\":\n marginClass = `${prefix}m-[${value}${unit}]`\n break\n case \"x\":\n marginClass = `${prefix}mx-[${value}${unit}]`\n break\n case \"y\":\n marginClass = `${prefix}my-[${value}${unit}]`\n break\n case \"top\":\n marginClass = `${prefix}mt-[${value}${unit}]`\n break\n case \"right\":\n marginClass = `${prefix}mr-[${value}${unit}]`\n break\n case \"bottom\":\n marginClass = `${prefix}mb-[${value}${unit}]`\n break\n case \"left\":\n marginClass = `${prefix}ml-[${value}${unit}]`\n break\n }\n\n if (marginClass) {\n classes.push(marginClass)\n }\n })\n\n return classes.join(\" \")\n}\n\nexport const marginDefaultProps: MarginTraitProps = {\n margins: [] as Array<MarginItem>,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type PaddingValue = { value: string; unit: string }\n\nexport type PaddingItem = {\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n direction: \"all\" | \"top\" | \"right\" | \"bottom\" | \"left\" | \"x\" | \"y\"\n padding: PaddingValue\n}\n\nexport type PaddingTraitProps = {\n paddings?: Array<PaddingItem>\n}\n\nconst PADDING_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"em\", value: \"em\" },\n { label: \"%\", value: \"%\" },\n]\n\nfunction getPaddingSummary(item: PaddingItem): string {\n if (!item || !item.direction) return \"Padding\"\n\n const bp = item.breakpoint ? `${item.breakpoint.toUpperCase()} - ` : \"\"\n const dir =\n item.direction === \"all\"\n ? \"All 4 directions\"\n : item.direction === \"x\"\n ? \"Horizontal\"\n : item.direction === \"y\"\n ? \"Vertical\"\n : item.direction.charAt(0).toUpperCase() +\n item.direction.slice(1)\n const value = item.padding?.value || \"0\"\n const unit = item.padding?.unit || \"px\"\n return `${bp}${dir}: ${value}${unit}`\n}\n\nexport const paddingField: Fields = {\n paddings: {\n type: \"array\",\n label: \"Paddings\",\n arrayFields: {\n breakpoint: {\n type: \"select\",\n label: \"Breakpoint\",\n options: [\n { label: \"Base\", value: \"\" },\n { label: \"XS\", value: \"xs\" },\n { label: \"SM\", value: \"sm\" },\n { label: \"MD\", value: \"md\" },\n { label: \"LG\", value: \"lg\" },\n { label: \"XL\", value: \"xl\" },\n { label: \"2XL\", value: \"2xl\" },\n ],\n },\n direction: {\n type: \"select\",\n label: \"Direction\",\n options: [\n { label: \"All 4 directions\", value: \"all\" },\n { label: \"Top\", value: \"top\" },\n { label: \"Right\", value: \"right\" },\n { label: \"Bottom\", value: \"bottom\" },\n { label: \"Left\", value: \"left\" },\n { label: \"Horizontal (X)\", value: \"x\" },\n { label: \"Vertical (Y)\", value: \"y\" },\n ],\n },\n padding: {\n type: \"numberUnit\" as any,\n label: \"Padding\",\n options: PADDING_UNITS,\n },\n },\n defaultItemProps: {\n breakpoint: \"md\",\n direction: \"all\",\n padding: { value: \"0\", unit: \"px\" },\n },\n getItemSummary: (item: PaddingItem) => getPaddingSummary(item),\n },\n}\n\nexport function paddingToClasses(paddings?: Array<PaddingItem>): string {\n if (!paddings || paddings.length === 0) return \"\"\n\n const classes: string[] = []\n\n paddings.forEach((item) => {\n if (!item || !item.direction || !item.padding) return\n\n const prefix = item.breakpoint ? `${item.breakpoint}:` : \"\"\n const value = item.padding.value || \"0\"\n const unit = item.padding.unit || \"px\"\n\n // Skip if value is empty\n if (!value.trim()) return\n\n let paddingClass = \"\"\n switch (item.direction) {\n case \"all\":\n paddingClass = `${prefix}p-[${value}${unit}]`\n break\n case \"x\":\n paddingClass = `${prefix}px-[${value}${unit}]`\n break\n case \"y\":\n paddingClass = `${prefix}py-[${value}${unit}]`\n break\n case \"top\":\n paddingClass = `${prefix}pt-[${value}${unit}]`\n break\n case \"right\":\n paddingClass = `${prefix}pr-[${value}${unit}]`\n break\n case \"bottom\":\n paddingClass = `${prefix}pb-[${value}${unit}]`\n break\n case \"left\":\n paddingClass = `${prefix}pl-[${value}${unit}]`\n break\n }\n\n if (paddingClass) {\n classes.push(paddingClass)\n }\n })\n\n return classes.join(\" \")\n}\n\nexport const paddingDefaultProps: PaddingTraitProps = {\n paddings: [] as Array<PaddingItem>,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type PositionTraitProps = {\n position?: \"static\" | \"relative\" | \"absolute\" | \"fixed\" | \"sticky\"\n top?: string\n right?: string\n bottom?: string\n left?: string\n zIndex?: number\n}\n\nexport const positionField: Fields = {\n position: {\n type: \"select\",\n label: \"Position\",\n options: [\n { label: \"Static\", value: \"static\" },\n { label: \"Relative\", value: \"relative\" },\n { label: \"Absolute\", value: \"absolute\" },\n { label: \"Fixed\", value: \"fixed\" },\n { label: \"Sticky\", value: \"sticky\" },\n ],\n },\n top: {\n type: \"text\",\n label: \"Top\",\n },\n right: {\n type: \"text\",\n label: \"Right\",\n },\n bottom: {\n type: \"text\",\n label: \"Bottom\",\n },\n left: {\n type: \"text\",\n label: \"Left\",\n },\n zIndex: {\n type: \"number\",\n label: \"Z-Index\",\n },\n}\n\nexport function positionToClasses(\n position?: \"static\" | \"relative\" | \"absolute\" | \"fixed\" | \"sticky\",\n top?: string,\n right?: string,\n bottom?: string,\n left?: string,\n zIndex?: number\n): string {\n const classes: string[] = []\n\n if (position) {\n classes.push(position)\n }\n\n if (top && top.trim()) {\n classes.push(`top-[${top}]`)\n }\n\n if (right && right.trim()) {\n classes.push(`right-[${right}]`)\n }\n\n if (bottom && bottom.trim()) {\n classes.push(`bottom-[${bottom}]`)\n }\n\n if (left && left.trim()) {\n classes.push(`left-[${left}]`)\n }\n\n if (zIndex !== undefined && zIndex !== null) {\n classes.push(`z-[${zIndex}]`)\n }\n\n return classes.join(\" \")\n}\n\nexport const positionDefaultProps: PositionTraitProps = {\n position: \"static\",\n top: \"\",\n right: \"\",\n bottom: \"\",\n left: \"\",\n zIndex: 0,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type SizeValue = { value: string; unit: string }\n\nexport type SizeTraitProps = {\n width?: SizeValue\n minWidth?: SizeValue\n maxWidth?: SizeValue\n height?: SizeValue\n minHeight?: SizeValue\n maxHeight?: SizeValue\n}\n\nconst WIDTH_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"%\", value: \"%\" },\n { label: \"em\", value: \"em\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"vw\", value: \"vw\" },\n]\n\nconst HEIGHT_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"%\", value: \"%\" },\n { label: \"em\", value: \"em\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"vh\", value: \"vh\" },\n]\n\nexport const sizeField: Fields = {\n width: {\n type: \"numberUnit\" as any,\n label: \"Width\",\n options: WIDTH_UNITS,\n },\n minWidth: {\n type: \"numberUnit\" as any,\n label: \"Min Width\",\n options: WIDTH_UNITS,\n },\n maxWidth: {\n type: \"numberUnit\" as any,\n label: \"Max Width\",\n options: WIDTH_UNITS,\n },\n height: {\n type: \"numberUnit\" as any,\n label: \"Height\",\n options: HEIGHT_UNITS,\n },\n minHeight: {\n type: \"numberUnit\" as any,\n label: \"Min Height\",\n options: HEIGHT_UNITS,\n },\n maxHeight: {\n type: \"numberUnit\" as any,\n label: \"Max Height\",\n options: HEIGHT_UNITS,\n },\n}\n\nconst addSizeClass = (\n classes: string[],\n size: SizeValue | undefined,\n prefix: string\n): void => {\n if (size && size.value && size.value.trim()) {\n classes.push(`${prefix}-[${size.value}${size.unit}]`)\n }\n}\n\nexport function sizeToClasses(\n width?: SizeValue,\n minWidth?: SizeValue,\n maxWidth?: SizeValue,\n height?: SizeValue,\n minHeight?: SizeValue,\n maxHeight?: SizeValue\n): string {\n const classes: string[] = []\n\n addSizeClass(classes, width, \"w\")\n addSizeClass(classes, minWidth, \"min-w\")\n addSizeClass(classes, maxWidth, \"max-w\")\n addSizeClass(classes, height, \"h\")\n addSizeClass(classes, minHeight, \"min-h\")\n addSizeClass(classes, maxHeight, \"max-h\")\n\n return classes.join(\" \")\n}\n\nexport const sizeDefaultProps: SizeTraitProps = {\n width: { value: \"\", unit: \"px\" },\n minWidth: { value: \"\", unit: \"px\" },\n maxWidth: { value: \"\", unit: \"px\" },\n height: { value: \"\", unit: \"px\" },\n minHeight: { value: \"\", unit: \"px\" },\n maxHeight: { value: \"\", unit: \"px\" },\n}\n","export * from \"./margin\"\nexport * from \"./padding\"\n\nimport {\n MarginTraitProps,\n marginField,\n marginDefaultProps,\n marginToClasses,\n} from \"./margin\"\nimport {\n PaddingTraitProps,\n paddingField,\n paddingDefaultProps,\n paddingToClasses,\n} from \"./padding\"\n\nexport type SpacingTraitProps = MarginTraitProps & PaddingTraitProps\n\nexport const spacingFields = {\n ...marginField,\n ...paddingField,\n}\n\nexport const spacingDefaultProps: SpacingTraitProps = {\n ...marginDefaultProps,\n ...paddingDefaultProps,\n}\n\nexport function spacingToClasses(props: Partial<SpacingTraitProps>): string {\n const classes = [\n marginToClasses(props.margins),\n paddingToClasses(props.paddings),\n ].filter(Boolean)\n\n return classes.join(\" \")\n}\n\nexport const spacingFieldNames = [\"margins\", \"paddings\"] as const\n","export const spacingOptions = [\n { label: \"0 rem\", value: \"0px\" },\n { label: \"0.25 rem\", value: \"4px\" },\n { label: \"0.5 rem\", value: \"8px\" },\n { label: \"0.75 rem\", value: \"12px\" },\n { label: \"1 rem\", value: \"16px\" },\n { label: \"1.25 rem\", value: \"20px\" },\n { label: \"1.5 rem\", value: \"24px\" },\n { label: \"1.75 rem\", value: \"28px\" },\n { label: \"2 rem\", value: \"32px\" },\n { label: \"2.25 rem\", value: \"36px\" },\n { label: \"2.5 rem\", value: \"40px\" },\n { label: \"2.75 rem\", value: \"44px\" },\n { label: \"3 rem\", value: \"48px\" },\n { label: \"3.25 rem\", value: \"52px\" },\n { label: \"3.5 rem\", value: \"56px\" },\n { label: \"3.75 rem\", value: \"60px\" },\n { label: \"4 rem\", value: \"64px\" },\n { label: \"4.25 rem\", value: \"68px\" },\n { label: \"4.5 rem\", value: \"72px\" },\n { label: \"4.75 rem\", value: \"76px\" },\n { label: \"5 rem\", value: \"80px\" },\n]\n","import { Fields } from \"@puckeditor/core\"\nimport {\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n AlignJustifyIcon,\n} from \"lucide-react\"\n\nexport type TextAlignTraitProps = {\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\"\n}\n\nexport const textAlignField: Fields = {\n textAlign: {\n type: \"radio\",\n label: \"Text align\",\n\n options: [\n { label: <AlignLeftIcon size={16} />, value: \"left\" },\n { label: <AlignCenterIcon size={16} />, value: \"center\" },\n { label: <AlignRightIcon size={16} />, value: \"right\" },\n { label: <AlignJustifyIcon size={16} />, value: \"justify\" },\n ],\n } as any,\n}\n\nexport function textAlignToClasses(textAlign?: string): string {\n if (!textAlign) return \"\"\n return `text-${textAlign}`\n}\n\nexport const textAlignDefaultProps: TextAlignTraitProps = {\n textAlign: \"left\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport ColorPicker from \"../components/ColorPicker\"\nimport Label from \"../components/Fields/Label\"\n\nexport type TextColorTraitProps = {\n textColor?: string\n}\n\nexport const textColorField: Fields = {\n textColor: {\n type: \"custom\",\n label: \"Text color\",\n render: ({ value, onChange, field }) => (\n <>\n <Label label={field.label} />\n <ColorPicker value={value} onChange={onChange} />\n </>\n ),\n },\n}\n\nexport function textColorToClasses(textColor?: string): string {\n if (!textColor) return \"\"\n return `text-[${textColor}]`\n}\n\nexport const textColorDefaultProps: TextColorTraitProps = {\n textColor: undefined as string | undefined,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikethroughIcon,\n LightbulbIcon,\n} from \"lucide-react\"\n\nexport type TextDecorationTraitProps = {\n textDecoration?: Array<\n \"bold\" | \"light\" | \"italic\" | \"underline\" | \"line-through\"\n >\n}\n\nexport const textDecorationField: Fields = {\n textDecoration: {\n type: \"checkbox\",\n label: \"Text decoration\",\n layout: \"horizontal\",\n options: [\n { label: <BoldIcon size={16} />, value: \"bold\" },\n { label: <LightbulbIcon size={16} />, value: \"light\" },\n { label: <ItalicIcon size={16} />, value: \"italic\" },\n { label: <UnderlineIcon size={16} />, value: \"underline\" },\n { label: <StrikethroughIcon size={16} />, value: \"line-through\" },\n ],\n } as any,\n}\n\nexport function textDecorationToClasses(\n textDecoration?: Array<\n \"bold\" | \"light\" | \"italic\" | \"underline\" | \"line-through\"\n >\n): string {\n if (!textDecoration || textDecoration.length === 0) {\n return \"\"\n }\n\n const classes: string[] = []\n\n if (textDecoration.includes(\"bold\")) {\n classes.push(\"font-bold\")\n }\n if (textDecoration.includes(\"light\")) {\n classes.push(\"font-light\")\n }\n if (textDecoration.includes(\"italic\")) {\n classes.push(\"italic\")\n }\n if (textDecoration.includes(\"underline\")) {\n classes.push(\"underline\")\n }\n if (textDecoration.includes(\"line-through\")) {\n classes.push(\"line-through\")\n }\n\n return classes.join(\" \")\n}\n\nexport const textDecorationDefaultProps: TextDecorationTraitProps = {\n textDecoration: [],\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type TextSizeTraitProps = {\n textSize?:\n | \"\"\n | \"xs\"\n | \"sm\"\n | \"base\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"5xl\"\n | \"6xl\"\n | \"7xl\"\n | \"8xl\"\n | \"9xl\"\n}\n\nexport const textSizeField: Fields = {\n textSize: {\n type: \"select\",\n label: \"Text size\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"XS (12px)\", value: \"xs\" },\n { label: \"SM (14px)\", value: \"sm\" },\n { label: \"Base (16px)\", value: \"base\" },\n { label: \"LG (18px)\", value: \"lg\" },\n { label: \"XL (20px)\", value: \"xl\" },\n { label: \"2XL (24px)\", value: \"2xl\" },\n { label: \"3XL (30px)\", value: \"3xl\" },\n { label: \"4XL (36px)\", value: \"4xl\" },\n { label: \"5XL (48px)\", value: \"5xl\" },\n { label: \"6XL (60px)\", value: \"6xl\" },\n { label: \"7XL (72px)\", value: \"7xl\" },\n { label: \"8XL (96px)\", value: \"8xl\" },\n { label: \"9XL (128px)\", value: \"9xl\" },\n ],\n } as any,\n}\n\nexport function textSizeToClasses(textSize?: string): string {\n if (!textSize) return \"\"\n return `text-${textSize}`\n}\n\nexport const textSizeDefaultProps: TextSizeTraitProps = {\n textSize: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport {\n CaseUpperIcon,\n CaseLowerIcon,\n CaseSensitiveIcon,\n MinusIcon,\n} from \"lucide-react\"\n\nexport type TextTransformTraitProps = {\n textTransform?: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\"\n}\n\nexport const textTransformField: Fields = {\n textTransform: {\n type: \"radio\",\n label: \"Text transform\",\n options: [\n { label: <MinusIcon size={16} />, value: \"none\" },\n { label: <CaseUpperIcon size={16} />, value: \"uppercase\" },\n { label: <CaseLowerIcon size={16} />, value: \"lowercase\" },\n { label: <CaseSensitiveIcon size={16} />, value: \"capitalize\" },\n ],\n } as any,\n}\n\nexport function textTransformToClasses(textTransform?: string): string {\n if (!textTransform || textTransform === \"none\") return \"\"\n return textTransform\n}\n\nexport const textTransformDefaultProps: TextTransformTraitProps = {\n textTransform: \"none\" as const,\n}\n","export * from \"./textAlign\"\nexport * from \"./textTransform\"\nexport * from \"./textDecoration\"\nexport * from \"./textSize\"\nexport * from \"./textColor\"\nexport * from \"./lineHeight\"\nexport * from \"./fontWeight\"\n\nimport {\n TextAlignTraitProps,\n textAlignField,\n textAlignDefaultProps,\n textAlignToClasses,\n} from \"./textAlign\"\nimport {\n TextTransformTraitProps,\n textTransformField,\n textTransformDefaultProps,\n textTransformToClasses,\n} from \"./textTransform\"\nimport {\n TextDecorationTraitProps,\n textDecorationField,\n textDecorationDefaultProps,\n textDecorationToClasses,\n} from \"./textDecoration\"\nimport {\n TextSizeTraitProps,\n textSizeField,\n textSizeDefaultProps,\n textSizeToClasses,\n} from \"./textSize\"\nimport {\n TextColorTraitProps,\n textColorField,\n textColorDefaultProps,\n textColorToClasses,\n} from \"./textColor\"\nimport {\n LineHeightTraitProps,\n lineHeightField,\n lineHeightDefaultProps,\n lineHeightToClasses,\n} from \"./lineHeight\"\nimport {\n FontWeightTraitProps,\n fontWeightField,\n fontWeightDefaultProps,\n fontWeightToClasses,\n} from \"./fontWeight\"\n\nexport type TypographyTraitProps = TextAlignTraitProps &\n TextTransformTraitProps &\n TextDecorationTraitProps &\n TextSizeTraitProps &\n TextColorTraitProps &\n LineHeightTraitProps &\n FontWeightTraitProps\n\nexport const typographyFields = {\n ...textAlignField,\n ...textTransformField,\n ...textDecorationField,\n ...textSizeField,\n ...textColorField,\n ...lineHeightField,\n ...fontWeightField,\n}\n\nexport const typographyDefaultProps: TypographyTraitProps = {\n ...textAlignDefaultProps,\n ...textTransformDefaultProps,\n ...textDecorationDefaultProps,\n ...textSizeDefaultProps,\n ...textColorDefaultProps,\n ...lineHeightDefaultProps,\n ...fontWeightDefaultProps,\n}\n\nexport function typographyToClasses(\n props: Partial<TypographyTraitProps>\n): string {\n const classes = [\n textAlignToClasses(props.textAlign),\n textTransformToClasses(props.textTransform),\n textDecorationToClasses(props.textDecoration),\n textSizeToClasses(props.textSize),\n textColorToClasses(props.textColor),\n lineHeightToClasses(props.lineHeight),\n fontWeightToClasses(props.fontWeight),\n ].filter(Boolean)\n\n return classes.join(\" \")\n}\n\nexport const typographyFieldNames = [\n \"textAlign\",\n \"textTransform\",\n \"textDecoration\",\n \"textSize\",\n \"textColor\",\n \"lineHeight\",\n \"fontWeight\",\n] as const\n","import { useMemo } from \"react\"\n\n// Breakpoints pour le srcset\nconst BREAKPOINTS = [576, 768, 992, 1200, 1400]\n\n// Extensions valides pour l'optimisation\nconst VALID_EXTENSIONS = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\"]\n\n/**\n * Génère une URL de média avec dimensions spécifiques\n * Ex: /media/1/image_800x600.jpg\n */\nfunction getResizedMediaUrl(\n baseUrl: string,\n width: number,\n height: number\n): string {\n const mediaMatch = baseUrl.match(\n /\\/media\\/(\\d+)\\/([^_]+)_(\\d+)x(\\d+)\\.(\\w+)$/\n )\n if (mediaMatch) {\n const [, id, filename, , , ext] = mediaMatch\n return `/media/${id}/${filename}_${width}x${height}.${ext}`\n }\n return baseUrl\n}\n\n/**\n * Génère le srcset et sizes pour les images responsives\n */\nfunction generateSrcset(\n baseUrl: string,\n currentWidth: number,\n currentHeight: number\n): { srcset: string; sizes: string } | null {\n const mediaMatch = baseUrl.match(\n /\\/media\\/(\\d+)\\/([^_]+)_(\\d+)x(\\d+)\\.(\\w+)$/\n )\n if (!mediaMatch) return null\n\n const extension = mediaMatch[5].toLowerCase()\n if (!VALID_EXTENSIONS.includes(extension)) return null\n\n let srcset = \"\"\n let sizes = \"\"\n let lastAddedBreakpoint = 0\n\n BREAKPOINTS.forEach((breakpointWidth, i) => {\n if (currentWidth > breakpointWidth) {\n const calculatedHeight = Math.floor(\n (currentHeight * breakpointWidth) / currentWidth\n )\n srcset += `${getResizedMediaUrl(baseUrl, breakpointWidth, calculatedHeight)} ${breakpointWidth}w,`\n lastAddedBreakpoint = breakpointWidth\n\n if (i === 0) {\n sizes += `(max-width: ${breakpointWidth - 1}px) ${breakpointWidth}px,`\n }\n const nextBreakpoint = BREAKPOINTS[i + 1]\n if (nextBreakpoint && nextBreakpoint <= currentWidth) {\n sizes += `(min-width: ${breakpointWidth}px) and (max-width: ${nextBreakpoint - 1}px) ${nextBreakpoint}px,`\n }\n }\n })\n\n if (currentWidth > lastAddedBreakpoint) {\n srcset += `${getResizedMediaUrl(baseUrl, currentWidth, currentHeight)} ${currentWidth}w`\n sizes += `(min-width: ${lastAddedBreakpoint}px) ${currentWidth}px`\n }\n\n srcset = srcset.replace(/,$/, \"\")\n sizes = sizes.replace(/,$/, \"\")\n\n return srcset && sizes ? { srcset, sizes } : null\n}\n\n/**\n * Génère les URLs webp à partir d'un srcset\n */\nfunction getWebpSrcset(srcset: string): string {\n return srcset.replace(/\\.(jpg|jpeg|png|gif|bmp)/gi, \".webp\")\n}\n\n/**\n * Extrait les dimensions depuis une URL de média\n */\nfunction extractDimensionsFromUrl(\n url: string\n): { width: number; height: number } | null {\n const match = url.match(/_(\\d+)x(\\d+)\\.\\w+$/)\n if (match) {\n return { width: parseInt(match[1], 10), height: parseInt(match[2], 10) }\n }\n return null\n}\n\nexport type OptimizedImageAttrs = {\n srcset?: string\n sizes?: string\n webpSrcset?: string\n}\n\n/**\n * Hook pour générer les attributs d'optimisation d'une image\n */\nexport function useOptimizedImage(\n src: string | undefined\n): OptimizedImageAttrs | null {\n return useMemo(() => {\n if (!src) return null\n\n const isMediaUrl = src.includes(\"/media/\")\n if (!isMediaUrl) return null\n\n const dimensions = extractDimensionsFromUrl(src)\n if (!dimensions) return null\n\n const responsive = generateSrcset(\n src,\n dimensions.width,\n dimensions.height\n )\n\n return {\n srcset: responsive?.srcset,\n sizes: responsive?.sizes,\n webpSrcset: responsive?.srcset\n ? getWebpSrcset(responsive.srcset)\n : undefined,\n }\n }, [src])\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"]","Label","TooltipPrimitive","Label","LabelUI","CheckboxPrimitive","newValues: any[]","Label","InputPrimitive","Label","SelectPrimitive","Label","Label","RadioGroupPrimitive","RadioPrimitive","Label","FieldPrimitive","Label","Group","Separator","TabsPrimitive","usePuck","result: OrganizedStructure","ungrouped: React.ReactNode[]","fieldName: string | null","usePuck","ActionBar","DrawerItem","FieldGroups","Label","FieldCheckbox","FieldNumberUnit","FieldRadio","FieldSelect","FieldInput","FieldTextarea","PopoverPrimitive","ScrollAreaPrimitive","DialogPrimitive","middle: number[]","items: (number | \"ellipsis\")[]","getEditorConfig","DEFAULT_VALUE: PagePickerValue","PAGE_SIZE","DEFAULT_VALUE","ColorPickerContent: React.FC<ColorPickerContentProps>","ColorPicker: React.FC<ColorPickerProps>","parts: string[]","DEFAULT_VALUE: MediaPickerValue","MenuPrimitive","SeparatorPrimitive","SwitchPrimitive","tpls: ApiTemplate[]","cached: TemplateData","data: Slot","created: ApiTemplate","updated: TemplateData","Label","allTemplates: TemplateData","Children","animationField: Fields","attributes: Record<string, string>","animationDefaultProps: AnimationTraitProps","Label","customClassesField: Fields","customClassesDefaultProps: CustomClassesTraitProps","pageField: Field<PagePickerValue>","Label","displayField: Fields","classes: string[]","displayDefaultProps: DisplayTraitProps","fontWeightField: Fields","fontWeightDefaultProps: FontWeightTraitProps","lineHeightField: Fields","lineHeightDefaultProps: LineHeightTraitProps","marginField: Fields","classes: string[]","marginDefaultProps: MarginTraitProps","paddingField: Fields","classes: string[]","paddingDefaultProps: PaddingTraitProps","positionField: Fields","classes: string[]","positionDefaultProps: PositionTraitProps","sizeField: Fields","classes: string[]","sizeDefaultProps: SizeTraitProps","spacingDefaultProps: SpacingTraitProps","textAlignField: Fields","textAlignDefaultProps: TextAlignTraitProps","textColorField: Fields","Label","ColorPicker","textColorDefaultProps: TextColorTraitProps","textDecorationField: Fields","classes: string[]","textDecorationDefaultProps: TextDecorationTraitProps","textSizeField: Fields","textSizeDefaultProps: TextSizeTraitProps","textTransformField: Fields","textTransformDefaultProps: TextTransformTraitProps","typographyDefaultProps: TypographyTraitProps"],"sources":["../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/components/Fields/Label/index.tsx","../src/components/ui/checkbox.tsx","../src/components/Fields/Checkbox/index.tsx","../src/components/ui/input.tsx","../src/components/Fields/Input/index.tsx","../src/components/ui/select.tsx","../src/components/Fields/NumberUnit/index.tsx","../src/components/Fields/Select/index.tsx","../src/components/ui/radio.tsx","../src/components/Fields/Radio/index.tsx","../src/components/ui/textarea.tsx","../src/components/Fields/Textarea/index.tsx","../src/components/ActionBar/index.tsx","../src/components/ui/tabs.tsx","../src/components/ui/accordion.tsx","../src/components/FieldGroups/index.tsx","../src/components/DrawerItem/index.tsx","../src/overrides/plugin.tsx","../src/components/ui/popover.tsx","../src/components/ui/badge.tsx","../src/components/ui/scroll-area.tsx","../src/components/ui/dialog.tsx","../src/components/ui/input-group.tsx","../src/components/ui/frame.tsx","../src/components/ui/pagination.tsx","../src/components/ui/table.tsx","../src/components/PickerModal/index.tsx","../src/components/PagePicker/index.tsx","../src/components/RichTextMenuLink/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/RichTextMenuColorPicker/index.tsx","../src/components/MediaPicker/index.tsx","../src/components/ui/menu.tsx","../src/components/ui/separator.tsx","../src/components/ui/switch.tsx","../src/components/ui/toast.tsx","../src/blocks/Template/index.tsx","../src/utils/animation.tsx","../src/components/ui/group.tsx","../src/utils/customClasses.tsx","../src/utils/pagePicker.tsx","../src/utils/display.tsx","../src/utils/fontWeight.tsx","../src/utils/lineHeight.tsx","../src/utils/margin.tsx","../src/utils/padding.tsx","../src/utils/position.tsx","../src/utils/size.tsx","../src/utils/spacing.tsx","../src/utils/spacingOptions.ts","../src/utils/textAlign.tsx","../src/utils/textColor.tsx","../src/utils/textDecoration.tsx","../src/utils/textSize.tsx","../src/utils/textTransform.tsx","../src/utils/typography.tsx","../src/hooks/useOptimizedImage.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 { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"[&_svg]:-mx-0.5 relative inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-lg border font-medium text-base outline-none transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 sm:text-sm [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-9 px-[calc(--spacing(3)-1px)] sm:h-8\",\n icon: \"size-9 sm:size-8\",\n \"icon-lg\": \"size-10 sm:size-9\",\n \"icon-sm\": \"size-8 sm:size-7\",\n \"icon-xl\":\n \"size-11 sm:size-10 [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n \"icon-xs\":\n \"size-7 rounded-md before:rounded-[calc(var(--radius-md)-1px)] sm:size-6 not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-4 sm:not-in-data-[slot=input-group]:[&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 px-[calc(--spacing(3.5)-1px)] sm:h-9\",\n sm: \"h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:h-7\",\n xl: \"h-11 px-[calc(--spacing(4)-1px)] text-lg sm:h-10 sm:text-base [&_svg:not([class*='size-'])]:size-5 sm:[&_svg:not([class*='size-'])]:size-4.5\",\n xs: \"h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5\",\n },\n variant: {\n default:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-primary bg-primary text-primary-foreground shadow-primary/24 [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-primary/90\",\n destructive:\n \"not-disabled:inset-shadow-[0_1px_--theme(--color-white/16%)] border-destructive bg-destructive text-white shadow-destructive/24 [:active,[data-pressed]]:inset-shadow-[0_1px_--theme(--color-black/8%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-destructive/90\",\n \"destructive-outline\":\n \"border-input bg-transparent not-dark:bg-clip-padding text-destructive-foreground not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/6%)] dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:border-destructive/32 [:hover,[data-pressed]]:bg-destructive/4\",\n ghost:\n \"border-transparent data-pressed:bg-accent [:hover,[data-pressed]]:bg-accent\",\n link: \"border-transparent underline-offset-4 [:hover,[data-pressed]]:underline\",\n outline:\n \"border-input bg-background not-dark:bg-clip-padding not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/6%)] dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-accent/50 dark:[:hover,[data-pressed]]:bg-input/64\",\n primary:\n \"border-transparent from-primary-600 to-primary-500 hover:from-primary-500 hover:to-primary-600 bg-linear-to-t text-white inset-shadow-[0_2px_0_0] inset-shadow-white/25 hover:text-white\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80 [:hover,[data-pressed]]:bg-secondary/90\",\n },\n },\n },\n);\n\ninterface ButtonProps extends useRender.ComponentProps<\"button\"> {\n variant?: VariantProps<typeof buttonVariants>[\"variant\"];\n size?: VariantProps<typeof buttonVariants>[\"size\"];\n}\n\nfunction Button({ className, variant, size, render, ...props }: ButtonProps) {\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const defaultProps = {\n className: cn(buttonVariants({ className, size, variant })),\n \"data-slot\": \"button\",\n type: typeValue,\n };\n\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { LockIcon } from \"lucide-react\"\n\nfunction Label({\n className,\n readOnly,\n children,\n ...props\n}: React.ComponentProps<\"label\"> & { readOnly?: boolean }) {\n return (\n <label\n data-slot=\"label\"\n data-readonly={readOnly ? \"\" : undefined}\n className={cn(\n \"text-secondary-foreground/66 mb-3 flex items-center justify-between gap-2 text-sm leading-none font-normal select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n >\n {children}\n {readOnly && <LockIcon className=\"size-4\" />}\n </label>\n )\n}\n\nexport { Label }\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst cssAnimationPresets = {\n none: \"transition-none\",\n scale: [\n `[transition-property:scale,opacity]`,\n `data-starting-style:scale-80 data-starting-style:opacity-0 data-ending-style:opacity-0 data-ending-style:scale-80`,\n ],\n fade: [\n `[transition-property:opacity,scale]`,\n `data-starting-style:scale-98 data-starting-style:opacity-0 data-ending-style:opacity-0 data-ending-style:scale-98`,\n ],\n slideOutside: [\n `[transition-property:translate,opacity]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:translate-y-[10px] data-[side=bottom]:data-ending-style:translate-y-[10px] data-[side=bottom]:data-ending-style:opacity-0`,\n // side=top\n `data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:translate-y-[-10px] data-[side=top]:data-ending-style:translate-y-[-10px] data-[side=top]:data-ending-style:opacity-0`,\n // side=left\n `data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:translate-x-[-10px] data-[side=left]:data-ending-style:translate-x-[-10px] data-[side=left]:data-ending-style:opacity-0`,\n // side=right\n `data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:translate-x-[10px] data-[side=right]:data-ending-style:translate-x-[10px] data-[side=right]:data-ending-style:opacity-0`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:translate-x-[-10px] data-[side=inline-start]:data-ending-style:translate-x-[-10px] data-[side=inline-start]:data-ending-style:opacity-0`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:translate-x-[10px] data-[side=inline-end]:data-ending-style:translate-x-[10px] data-[side=inline-end]:data-ending-style:opacity-0`,\n ],\n slideInside: [\n `[transition-property:translate,opacity]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:translate-y-[-10px] data-[side=bottom]:data-ending-style:translate-y-[-10px] data-[side=bottom]:data-ending-style:opacity-0`,\n // side=top\n `data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:translate-y-[10px] data-[side=top]:data-ending-style:translate-y-[10px] data-[side=top]:data-ending-style:opacity-0`,\n // side=left\n `data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:translate-x-[10px] data-[side=left]:data-ending-style:translate-x-[10px] data-[side=left]:data-ending-style:opacity-0`,\n // side=right\n `data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:translate-x-[-10px] data-[side=right]:data-ending-style:translate-x-[-10px] data-[side=right]:data-ending-style:opacity-0`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:translate-x-[10px] data-[side=inline-start]:data-ending-style:translate-x-[10px] data-[side=inline-start]:data-ending-style:opacity-0`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:translate-x-[-10px] data-[side=inline-end]:data-ending-style:translate-x-[-10px] data-[side=inline-end]:data-ending-style:opacity-0`,\n ],\n wipe: [\n `[transition-property:clip-path] [will-change:clip-path]`,\n `[clip-path:inset(0_0_0_0_round_var(--radius))] [-webkit-clip-path:inset(0_0_0_0_round_var(--radius))]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:[clip-path:inset(0_0_100%_0_round_var(--radius))] data-[side=bottom]:data-ending-style:[clip-path:inset(0_0_100%_0_round_var(--radius))]`,\n // side=top\n `data-[side=top]:data-starting-style:[clip-path:inset(100%_0_0_0_round_var(--radius))] data-[side=top]:data-ending-style:[clip-path:inset(100%_0_0_0_round_var(--radius))]`,\n // side=left\n `data-[side=left]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=left]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=right\n `data-[side=right]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=right]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=inline-start]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=inline-end]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n ],\n wipeScale: [\n `[transition-property:clip-path,scale] [will-change:clip-path,scale]`,\n `[clip-path:inset(0_0_0_0_round_var(--radius))] [-webkit-clip-path:inset(0_0_0_0_round_var(--radius))]`,\n `data-starting-style:scale-80 data-ending-style:scale-80`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:[clip-path:inset(0_0_100%_0_round_var(--radius))] data-[side=bottom]:data-ending-style:[clip-path:inset(0_0_100%_0_round_var(--radius))]`,\n // side=top\n `data-[side=top]:data-starting-style:[clip-path:inset(100%_0_0_0_round_var(--radius))] data-[side=top]:data-ending-style:[clip-path:inset(100%_0_0_0_round_var(--radius))]`,\n // side=left\n `data-[side=left]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=left]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=right\n `data-[side=right]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=right]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:[clip-path:inset(0_0_0_100%_round_var(--radius))] data-[side=inline-start]:data-ending-style:[clip-path:inset(0_0_0_100%_round_var(--radius))]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:[clip-path:inset(0_100%_0_0_round_var(--radius))] data-[side=inline-end]:data-ending-style:[clip-path:inset(0_100%_0_0_round_var(--radius))]`,\n ],\n motion: [\n `[transition-property:translate,scale,opacity,rotateX,rotateY,transform] [will-change:translate,scale,opacity,rotateX,rotateY,transform]`,\n `[transform:perspective(1000px)]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:translate-y-[7px] data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:scale-[0.26] data-[side=bottom]:data-starting-style:rotate-x-[70deg] data-[side=bottom]:data-ending-style:translate-y-[7px] data-[side=bottom]:data-ending-style:opacity-0 data-[side=bottom]:data-ending-style:scale-[0.26] data-[side=bottom]:data-ending-style:rotate-x-[70deg]`,\n // side=top\n `data-[side=top]:data-starting-style:translate-y-[7px] data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:scale-[0.26] data-[side=top]:data-starting-style:rotate-x-[70deg] data-[side=top]:data-ending-style:translate-y-[7px] data-[side=top]:data-ending-style:opacity-0 data-[side=top]:data-ending-style:scale-[0.26] data-[side=top]:data-ending-style:rotate-x-[70deg]`,\n // side=left\n `data-[side=left]:data-starting-style:translate-x-[-7px] data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:scale-[0.26] data-[side=left]:data-starting-style:rotate-y-[-40deg] data-[side=left]:data-ending-style:translate-x-[-7px] data-[side=left]:data-ending-style:opacity-0 data-[side=left]:data-ending-style:scale-[0.26] data-[side=left]:data-ending-style:rotate-y-[-40deg]`,\n // side=right\n `data-[side=right]:data-starting-style:translate-x-[7px] data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:scale-[0.26] data-[side=right]:data-starting-style:rotate-y-[40deg] data-[side=right]:data-ending-style:translate-x-[7px] data-[side=right]:data-ending-style:opacity-0 data-[side=right]:data-ending-style:scale-[0.26] data-[side=right]:data-ending-style:rotate-y-[40deg]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:translate-x-[-7px] data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:scale-[0.26] data-[side=inline-start]:data-starting-style:rotate-y-[-40deg] data-[side=inline-start]:data-ending-style:translate-x-[-7px] data-[side=inline-start]:data-ending-style:opacity-0 data-[side=inline-start]:data-ending-style:scale-[0.26] data-[side=inline-start]:data-ending-style:rotate-y-[-40deg]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:translate-x-[7px] data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:scale-[0.26] data-[side=inline-end]:data-starting-style:rotate-y-[40deg] data-[side=inline-end]:data-ending-style:translate-x-[7px] data-[side=inline-end]:data-ending-style:opacity-0 data-[side=inline-end]:data-ending-style:scale-[0.26] data-[side=inline-end]:data-ending-style:rotate-y-[40deg]`,\n ],\n motionBlur: [\n `[transition-property:translate,scale,opacity,rotateX,rotateY,transform,filter] [will-change:translate,scale,opacity,rotateX,rotateY,transform,filter]`,\n `[transform:perspective(1000px)]`,\n `data-starting-style:blur-[9px] data-ending-style:blur-[9px]`,\n // side=bottom\n `data-[side=bottom]:data-starting-style:translate-y-[7px] data-[side=bottom]:data-starting-style:opacity-0 data-[side=bottom]:data-starting-style:scale-[0.26] data-[side=bottom]:data-starting-style:rotate-x-[70deg] data-[side=bottom]:data-ending-style:translate-y-[7px] data-[side=bottom]:data-ending-style:opacity-0 data-[side=bottom]:data-ending-style:scale-[0.26] data-[side=bottom]:data-ending-style:rotate-x-[70deg]`,\n // side=top\n `data-[side=top]:data-starting-style:translate-y-[7px] data-[side=top]:data-starting-style:opacity-0 data-[side=top]:data-starting-style:scale-[0.26] data-[side=top]:data-starting-style:rotate-x-[70deg] data-[side=top]:data-ending-style:translate-y-[7px] data-[side=top]:data-ending-style:opacity-0 data-[side=top]:data-ending-style:scale-[0.26] data-[side=top]:data-ending-style:rotate-x-[70deg]`,\n // side=left\n `data-[side=left]:data-starting-style:translate-x-[-7px] data-[side=left]:data-starting-style:opacity-0 data-[side=left]:data-starting-style:scale-[0.26] data-[side=left]:data-starting-style:rotate-y-[-40deg] data-[side=left]:data-ending-style:translate-x-[-7px] data-[side=left]:data-ending-style:opacity-0 data-[side=left]:data-ending-style:scale-[0.26] data-[side=left]:data-ending-style:rotate-y-[-40deg]`,\n // side=right\n `data-[side=right]:data-starting-style:translate-x-[7px] data-[side=right]:data-starting-style:opacity-0 data-[side=right]:data-starting-style:scale-[0.26] data-[side=right]:data-starting-style:rotate-y-[40deg] data-[side=right]:data-ending-style:translate-x-[7px] data-[side=right]:data-ending-style:opacity-0 data-[side=right]:data-ending-style:scale-[0.26] data-[side=right]:data-ending-style:rotate-y-[40deg]`,\n // side=inline-start\n `data-[side=inline-start]:data-starting-style:translate-x-[-7px] data-[side=inline-start]:data-starting-style:opacity-0 data-[side=inline-start]:data-starting-style:scale-[0.26] data-[side=inline-start]:data-starting-style:rotate-y-[-40deg] data-[side=inline-start]:data-ending-style:translate-x-[-7px] data-[side=inline-start]:data-ending-style:opacity-0 data-[side=inline-start]:data-ending-style:scale-[0.26] data-[side=inline-start]:data-ending-style:rotate-y-[-40deg]`,\n // side=inline-end\n `data-[side=inline-end]:data-starting-style:translate-x-[7px] data-[side=inline-end]:data-starting-style:opacity-0 data-[side=inline-end]:data-starting-style:scale-[0.26] data-[side=inline-end]:data-starting-style:rotate-y-[40deg] data-[side=inline-end]:data-ending-style:translate-x-[7px] data-[side=inline-end]:data-ending-style:opacity-0 data-[side=inline-end]:data-ending-style:scale-[0.26] data-[side=inline-end]:data-ending-style:rotate-y-[40deg]`,\n ],\n}\n\nconst cssTransitionPresets = {\n inExpo: `duration-[0.25s] ease-[cubic-bezier(0.95,0.05,0.795,0.035)]`,\n outExpo: `duration-[0.25s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n inOutExpo: `duration-[0.25s] ease-[cubic-bezier(1,0,0,1)]`,\n anticipate: `duration-[0.25s] ease-[cubic-bezier(1,-0.4,0.35,0.95)]`,\n quickOut: `duration-[0.25s] ease-out`,\n overshootOut: `duration-[0.25s] ease-[cubic-bezier(0.175,0.885,0.32,1.275)]`,\n swiftOut: `duration-[0.25s] ease-[cubic-bezier(0.175,0.885,0.32,1.1)]`,\n snappyOut: `duration-[0.25s] ease-[cubic-bezier(0.19,1,0.22,1)]`,\n in: `duration-[0.25s] ease-[cubic-bezier(0.42,0,1,1)]`,\n out: `duration-[0.25s] ease-[cubic-bezier(0,0,0.58,1)]`,\n inOut: `duration-[0.25s] ease-[cubic-bezier(0.42,0,0.58,1)]`,\n outIn: `duration-[0.25s] ease-[cubic-bezier(0.1,0.7,0.9,0.5)]`,\n inQuad: `duration-[0.25s] ease-[cubic-bezier(0.55,0.085,0.68,0.53)]`,\n outQuad: `duration-[0.25s] ease-[cubic-bezier(0.25,0.46,0.45,0.94)]`,\n inOutQuad: `duration-[0.32s] ease-[cubic-bezier(0.455,0.03,0.515,0.955)]`,\n inCubic: `duration-[0.25s] ease-[cubic-bezier(0.55,0.055,0.675,0.19)]`,\n outCubic: `duration-[0.25s] ease-[cubic-bezier(0.215,0.61,0.355,1)]`,\n inOutCubic: `duration-[0.25s] ease-[cubic-bezier(0.645,0.045,0.355,1)]`,\n inQuart: `duration-[0.25s] ease-[cubic-bezier(0.895,0.03,0.685,0.22)]`,\n outQuart: `duration-[0.25s] ease-[cubic-bezier(0.165,0.84,0.44,1)]`,\n inOutQuart: `duration-[0.25s] ease-[cubic-bezier(0.77,0,0.175,1)]`,\n inQuint: `duration-[0.25s] ease-[cubic-bezier(0.755,0.05,0.855,0.06)]`,\n outQuint: `duration-[0.25s] ease-[cubic-bezier(0.23,1,0.32,1)]`,\n inOutQuint: `duration-[0.25s] ease-[cubic-bezier(0.86,0,0.07,1)]`,\n inCirc: `duration-[0.25s] ease-[cubic-bezier(0.6,0.04,0.98,0.335)]`,\n outCirc: `duration-[0.25s] ease-[cubic-bezier(0.075,0.82,0.165,1)]`,\n inOutCirc: `duration-[0.25s] ease-[cubic-bezier(0.785,0.135,0.15,0.86)]`,\n inOutBase: `duration-[0.25s] ease-[cubic-bezier(0.25,0.1,0.25,1)]`,\n none: `duration-0 ease-none`,\n}\n\ntype CSSAnimationPresets = keyof typeof cssAnimationPresets\ntype CSSTransitionPresets = keyof typeof cssTransitionPresets\n\ninterface TooltipProviderProps extends TooltipPrimitive.Provider.Props { }\n\nfunction TooltipProvider({ delay = 300, ...props }: TooltipProviderProps) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delay={delay}\n {...props}\n />\n )\n}\n\ninterface TooltipProps extends TooltipPrimitive.Root.Props { }\n\nfunction Tooltip({ ...props }: TooltipProps) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\ninterface TooltipTriggerProps extends TooltipPrimitive.Trigger.Props { }\n\nfunction TooltipTrigger(props: TooltipTriggerProps) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\ninterface TooltipPortalProps extends TooltipPrimitive.Portal.Props { }\n\nfunction TooltipPortal(props: TooltipPortalProps) {\n return <TooltipPrimitive.Portal data-slot=\"tooltip-portal\" {...props} />\n}\n\ninterface TooltipPositionerProps extends TooltipPrimitive.Positioner.Props { }\n\nfunction TooltipPositioner({\n className,\n side = \"top\",\n ...rest\n}: TooltipPositionerProps) {\n return (\n <TooltipPortal>\n <TooltipPrimitive.Positioner\n side={side}\n data-slot=\"tooltip-positioner\"\n className={cn(\n \"z-100\",\n (side === \"inline-end\" || side === \"inline-start\") &&\n \"**:data-[slot=tooltip-arrow]:hidden\",\n className\n )}\n {...rest}\n />\n </TooltipPortal>\n )\n}\n\ninterface TooltipPopupProps\n extends\n TooltipPrimitive.Popup.Props,\n Pick<\n TooltipPositionerProps,\n \"side\" | \"sideOffset\" | \"align\" | \"alignOffset\"\n > {\n animationPreset?: CSSAnimationPresets\n transitionPreset?: CSSTransitionPresets\n reduceMotion?: boolean\n showArrow?: boolean\n}\n\nfunction TooltipPopup({\n className,\n animationPreset = \"scale\",\n transitionPreset = \"outQuint\",\n reduceMotion = false,\n showArrow = false,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n ...rest\n}: TooltipPopupProps) {\n const cssAnimationConfig = useMemo(() => {\n if (reduceMotion) return \"none\"\n\n if (animationPreset) {\n return cssAnimationPresets[animationPreset]\n }\n\n return cssAnimationPresets.scale\n }, [animationPreset, reduceMotion, side])\n\n const cssTransitionConfig = useMemo(() => {\n if (reduceMotion) return \"none\"\n\n if (transitionPreset) {\n return cssTransitionPresets[transitionPreset]\n }\n\n return cssTransitionPresets.snappyOut\n }, [transitionPreset, reduceMotion, side])\n\n return (\n <TooltipPositioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n >\n <TooltipPrimitive.Popup\n data-slot=\"tooltip-popup\"\n className={cn(\n \"[--radius:10px]\",\n \"bg-popover border-border pointer-events-auto w-fit origin-(--transform-origin) rounded-(--radius) border px-2 py-1 text-[13px] text-balance shadow-xs data-instant:duration-0!\",\n className,\n cssAnimationConfig,\n cssTransitionConfig,\n showArrow && [\n `before: before:bg-popover z-[-1] before:absolute before:h-2 before:w-2 before:rotate-45 before:content-['']`,\n side === \"top\" &&\n `before:border-border before:-bottom-[4.7px] before:left-1/2 before:-translate-x-1/2 before:border-r before:border-b`,\n side === \"right\" &&\n `before:border-border before:top-1/2 before:-left-[4.07px] before:-translate-y-1/2 before:border-b before:border-l`,\n side === \"bottom\" &&\n `before:border-border before:-top-[4.7px] before:left-1/2 before:-translate-x-1/2 before:border-t before:border-l`,\n side === \"left\" &&\n `before:border-border before:top-1/2 before:-right-[4.07px] before:-translate-y-1/2 before:border-t before:border-r`,\n side === \"inline-start\" &&\n `before:border-border before:top-1/2 before:-right-[4.07px] before:-translate-y-1/2 before:border-t before:border-r`,\n side === \"inline-end\" &&\n `before:border-border before:top-1/2 before:-left-[4.07px] before:-translate-y-1/2 before:border-b before:border-l`,\n ]\n )}\n {...rest}\n />\n </TooltipPositioner>\n )\n}\n\nexport { Tooltip, TooltipTrigger, TooltipPopup, TooltipProvider }\n","import { Button } from \"../../ui/button\";\nimport { Label as LabelUI } from \"../../ui/label\"\n\nimport {\n Tooltip,\n TooltipPopup,\n TooltipTrigger,\n} from \"../../ui/tooltip\"\n\nconst Label = ({ label, readOnly, tooltip }: { label?: string; readOnly?: boolean; tooltip?: string }) => (\n <LabelUI readOnly={readOnly}>\n {label}\n {tooltip && (\n <Tooltip>\n <TooltipTrigger delay={200}>\n <Button variant=\"secondary\" className=\"!text-xs !rounded-full !p-0 !size-5 flex items-center justify-center\">?</Button>\n </TooltipTrigger>\n <TooltipPopup side=\"top\" align=\"end\" className=\"max-w-64 text-xs\">{tooltip}</TooltipPopup>\n </Tooltip>\n )}\n </LabelUI>\n)\n\nexport default Label\n","\"use client\"\n\nimport { Checkbox as CheckboxPrimitive } from \"@base-ui/react/checkbox\"\n\nimport { cn } from \"../../lib/utils\"\nimport { CheckIcon } from \"lucide-react\"\n\ntype CheckboxLayout = \"horizontal\" | \"inline\"\n\ninterface CheckboxProps extends CheckboxPrimitive.Root.Props {\n layout?: CheckboxLayout\n}\n\nfunction Checkbox({\n className,\n layout = \"horizontal\",\n ...props\n}: CheckboxProps) {\n const isHorizontal = layout === \"horizontal\"\n\n if (isHorizontal) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[checked]:text-primary-500 border-input relative block flex shrink-0 cursor-pointer items-center justify-center rounded-md border bg-white p-2 transition-shadow outline-none hover:bg-stone-50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-stone-50 data-[checked]:font-semibold\",\n className\n )}\n {...props}\n />\n )\n }\n\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input size-5 shrink-0 rounded-sm border bg-white transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"cn-checkbox-indicator grid h-full place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-4\" strokeWidth={3} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n}\n\nexport { Checkbox }\nexport type { CheckboxLayout }\n","import React from \"react\"\nimport { Field, FieldProps } from \"@puckeditor/core\"\nimport Label from \"../Label\"\nimport { Checkbox, CheckboxLayout } from \"../../ui/checkbox\"\n\ntype CheckboxProps = FieldProps<Field<any>> & {\n name: string\n field: Field<any> & {\n options?: ReadonlyArray<{ label: React.ReactNode; value: any }>\n layout?: CheckboxLayout\n readOnly?: boolean\n tooltip?: string\n }\n}\n\nconst FieldCheckbox = ({\n onChange,\n value,\n readOnly,\n field,\n label,\n}: CheckboxProps & { label: string }) => {\n if (!field.options || !Array.isArray(field.options)) {\n return null\n }\n\n const selectedValues = Array.isArray(value) ? value : []\n const layout = field.layout || \"horizontal\"\n\n const handleChange = (optionValue: any, checked: unknown) => {\n if (!readOnly && typeof checked === \"boolean\") {\n let newValues: any[]\n if (checked) {\n newValues = [...selectedValues, optionValue]\n } else {\n newValues = selectedValues.filter((v) => v !== optionValue)\n }\n onChange(newValues)\n }\n }\n\n const containerClassName =\n layout === \"horizontal\"\n ? \"flex w-fit flex-wrap gap-1.5\"\n : \"flex flex-col gap-3\"\n\n return (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <div className={containerClassName}>\n {field.options.map((option, index) => {\n const optionValue = option.value\n const key = `${String(optionValue)}-${index}`\n const isChecked = selectedValues.includes(optionValue)\n\n if (layout === \"horizontal\") {\n return (\n <label key={key} className=\"flex-1\">\n <Checkbox\n layout=\"horizontal\"\n checked={isChecked}\n onCheckedChange={(checked) =>\n handleChange(optionValue, checked)\n }\n disabled={readOnly}\n >\n {option.label || option.value?.toString()}\n </Checkbox>\n </label>\n )\n }\n\n return (\n <label\n key={key}\n className=\"flex cursor-pointer items-center gap-3\"\n >\n <Checkbox\n layout=\"inline\"\n checked={isChecked}\n onCheckedChange={(checked) =>\n handleChange(optionValue, checked)\n }\n disabled={readOnly}\n />\n <span className=\"text-sm\">\n {option.label || option.value?.toString()}\n </span>\n </label>\n )\n })}\n </div>\n </>\n )\n}\n\nexport default FieldCheckbox\n","\"use client\"\n\nimport { Input as InputPrimitive } from \"@base-ui/react/input\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype InputProps = Omit<\n InputPrimitive.Props & React.RefAttributes<HTMLInputElement>,\n \"size\"\n> & {\n size?: \"sm\" | \"default\" | \"lg\" | number\n unstyled?: boolean\n nativeInput?: boolean\n}\n\nfunction Input({\n className,\n size = \"default\",\n unstyled = false,\n nativeInput = false,\n ...props\n}: InputProps) {\n const inputClassName = cn(\n \"h-8.5 w-full min-w-0 rounded-[inherit] px-[calc(--spacing(3)-1px)] leading-8.5 outline-none placeholder:text-muted-foreground/72 sm:h-7.5 sm:leading-7.5\",\n size === \"sm\" &&\n \"h-7.5 px-[calc(--spacing(2.5)-1px)] leading-7.5 sm:h-6.5 sm:leading-6.5\",\n size === \"lg\" && \"h-9.5 leading-9.5 sm:h-8.5 sm:leading-8.5\",\n props.type === \"search\" &&\n \"[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none\",\n props.type === \"file\" &&\n \"text-muted-foreground file:me-3 file:bg-transparent file:font-medium file:text-foreground file:text-sm\"\n )\n\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"h-full border-input bg-background ring-ring/24 has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 relative inline-flex w-full rounded-lg border text-base transition-shadow not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/6%)] has-focus-visible:ring-[3px] has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none sm:text-sm dark:not-has-disabled:not-has-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className\n ) || undefined\n }\n data-size={size}\n data-slot=\"input-control\"\n >\n {nativeInput ? (\n <input\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n {...props}\n />\n ) : (\n <InputPrimitive\n className={inputClassName}\n data-slot=\"input\"\n size={typeof size === \"number\" ? size : undefined}\n {...props}\n />\n )}\n </span>\n )\n}\n\nexport { Input, type InputProps }\n","import Label from \"../Label\"\nimport { Input } from \"../../ui/input\"\n\nconst FieldInput = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value?: string\n label?: string\n field: any\n readOnly?: boolean\n}) => (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <Input\n type=\"text\"\n value={value || \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.currentTarget.value)}\n readOnly={field.readOnly || readOnly}\n />\n </>\n)\n\nexport default FieldInput\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport {\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ChevronUpIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst Select = SelectPrimitive.Root;\n\nconst selectTriggerVariants = cva(\n \"relative inline-flex min-h-9 w-full min-w-36 select-none items-center justify-between gap-2 rounded-lg border border-input bg-background not-dark:bg-clip-padding px-[calc(--spacing(3)-1px)] text-left text-base text-foreground shadow-xs/5 outline-none ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 focus-visible:border-ring focus-visible:ring-[3px] aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:min-h-8 sm:text-sm dark:bg-input/32 dark:aria-invalid:ring-destructive/24 dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 [[data-disabled],:focus-visible,[aria-invalid],[data-pressed]]:shadow-none\",\n {\n defaultVariants: {\n size: \"default\",\n },\n variants: {\n size: {\n default: \"\",\n lg: \"min-h-10 sm:min-h-9\",\n sm: \"min-h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:min-h-7\",\n },\n },\n },\n);\n\nconst selectTriggerIconClassName = \"-me-1 size-4.5 opacity-80 sm:size-4\";\n\ninterface SelectButtonProps extends useRender.ComponentProps<\"button\"> {\n size?: VariantProps<typeof selectTriggerVariants>[\"size\"];\n}\n\nfunction SelectButton({\n className,\n size,\n render,\n children,\n ...props\n}: SelectButtonProps) {\n const typeValue: React.ButtonHTMLAttributes<HTMLButtonElement>[\"type\"] =\n render ? undefined : \"button\";\n\n const defaultProps = {\n children: (\n <>\n <span className=\"flex-1 truncate in-data-placeholder:text-muted-foreground/72\">\n {children}\n </span>\n <ChevronsUpDownIcon className={selectTriggerIconClassName} />\n </>\n ),\n className: cn(selectTriggerVariants({ size }), \"min-w-0\", className),\n \"data-slot\": \"select-button\",\n type: typeValue,\n };\n\n return useRender({\n defaultTagName: \"button\",\n props: mergeProps<\"button\">(defaultProps, props),\n render,\n });\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & VariantProps<typeof selectTriggerVariants>) {\n return (\n <SelectPrimitive.Trigger\n className={cn(selectTriggerVariants({ size }), className)}\n data-slot=\"select-trigger\"\n {...props}\n >\n {children}\n <SelectPrimitive.Icon data-slot=\"select-icon\">\n <ChevronsUpDownIcon className={selectTriggerIconClassName} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n className={cn(\n \"flex-1 truncate data-placeholder:text-muted-foreground\",\n className,\n )}\n data-slot=\"select-value\"\n {...props}\n />\n );\n}\n\nfunction SelectPopup({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"start\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n anchor,\n ...props\n}: SelectPrimitive.Popup.Props & {\n side?: SelectPrimitive.Positioner.Props[\"side\"];\n sideOffset?: SelectPrimitive.Positioner.Props[\"sideOffset\"];\n align?: SelectPrimitive.Positioner.Props[\"align\"];\n alignOffset?: SelectPrimitive.Positioner.Props[\"alignOffset\"];\n alignItemWithTrigger?: SelectPrimitive.Positioner.Props[\"alignItemWithTrigger\"];\n anchor?: SelectPrimitive.Positioner.Props[\"anchor\"];\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n align={align}\n alignItemWithTrigger={alignItemWithTrigger}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"z-50 select-none\"\n data-slot=\"select-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <SelectPrimitive.Popup\n className=\"origin-(--transform-origin) text-foreground\"\n data-slot=\"select-popup\"\n {...props}\n >\n <SelectPrimitive.ScrollUpArrow\n className=\"top-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:top-px before:h-[200%] before:rounded-t-[calc(var(--radius-lg)-1px)] before:bg-linear-to-b before:from-50% before:from-popover\"\n data-slot=\"select-scroll-up-arrow\"\n >\n <ChevronUpIcon className=\"relative size-4.5 sm:size-4\" />\n </SelectPrimitive.ScrollUpArrow>\n <div className=\"relative h-full min-w-(--anchor-width) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\">\n <SelectPrimitive.List\n className={cn(\n \"max-h-(--available-height) overflow-y-auto p-1\",\n className,\n )}\n data-slot=\"select-list\"\n >\n {children}\n </SelectPrimitive.List>\n </div>\n <SelectPrimitive.ScrollDownArrow\n className=\"bottom-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:bottom-px before:h-[200%] before:rounded-b-[calc(var(--radius-lg)-1px)] before:bg-linear-to-t before:from-50% before:from-popover\"\n data-slot=\"select-scroll-down-arrow\"\n >\n <ChevronDownIcon className=\"relative size-4.5 sm:size-4\" />\n </SelectPrimitive.ScrollDownArrow>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"select-item\"\n {...props}\n >\n <SelectPrimitive.ItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/1500/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n <SelectPrimitive.ItemText className=\"col-start-2 min-w-0\">\n {children}\n </SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"select-separator\"\n {...props}\n />\n );\n}\n\nfunction SelectGroup(props: SelectPrimitive.Group.Props) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectGroupLabel(props: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n className=\"px-2 py-1.5 font-medium text-muted-foreground text-xs\"\n data-slot=\"select-group-label\"\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectButton,\n selectTriggerVariants,\n SelectValue,\n SelectPopup,\n SelectPopup as SelectContent,\n SelectItem,\n SelectSeparator,\n SelectGroup,\n SelectGroupLabel,\n};\n","import { Input } from \"../../ui/input\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\"\nimport Label from \"../Label\"\n\nexport type NumberUnitValue = {\n value: string\n unit: string\n}\n\nconst FieldNumberUnit = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: NumberUnitValue) => void\n value: NumberUnitValue\n label: string\n field: any\n readOnly?: boolean\n}) => {\n const currentValue = {\n value: value?.value ?? \"\",\n unit: value?.unit ?? field.options?.[0]?.value ?? \"\",\n }\n\n const handleInputChange = (newValue: string) => {\n if (!readOnly) {\n onChange({\n ...currentValue,\n value: newValue,\n })\n }\n }\n\n const handleUnitChange = (newUnit: unknown) => {\n if (!readOnly && typeof newUnit === \"string\") {\n onChange({\n ...currentValue,\n unit: newUnit,\n })\n }\n }\n\n return (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <div className=\"flex\">\n <div className=\"flex-1\">\n <Input\n className=\"rounded-r-none before:rounded-r-none\"\n type=\"text\"\n placeholder={field.placeholder || \"Value\"}\n value={currentValue.value}\n onChange={(e) =>\n handleInputChange(e.currentTarget.value)\n }\n readOnly={field.readOnly || readOnly}\n />\n </div>\n <div className=\"w-18\">\n <Select\n items={field.options || []}\n value={currentValue.unit}\n onValueChange={handleUnitChange}\n disabled={field.readOnly || readOnly}\n >\n <SelectTrigger className=\"rounded-l-none before:rounded-l-none border-l-0 min-w-fit\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup align=\"end\" side=\"bottom\">\n {(field.options || []).map((option: any) => (\n <SelectItem\n key={option.value}\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </div>\n </div>\n </>\n )\n}\n\nexport default FieldNumberUnit\n","import {\n Select,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectPopup,\n SelectGroup,\n SelectGroupLabel,\n} from \"../../ui/select\"\nimport Label from \"../Label\"\n\nconst FieldSelect = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value: any\n label: string\n field: any\n readOnly?: boolean\n}) => {\n const placeholder = field.placeholder || \"Select an option\"\n\n // Check if the first option has an empty string value (default option)\n const hasEmptyStringDefault = field.options?.[0]?.value === \"\"\n\n const itemsWithPlaceholder = [\n { label: placeholder, value: null },\n ...field.options.map((option: any) => ({\n label: option.label,\n value: option.value,\n })),\n ]\n\n const handleValueChange = (newValue: unknown) => {\n if (!readOnly && newValue !== null && typeof newValue === \"string\") {\n onChange(newValue)\n }\n }\n\n // If value is undefined/null and we have an empty string default option, use \"\" instead of null\n const selectValue =\n value === undefined || value === null\n ? hasEmptyStringDefault\n ? \"\"\n : null\n : value\n\n // Organize options by group\n const groupedOptions = field.options.reduce((acc: any, option: any) => {\n const groupName = option.group || \"__ungrouped\"\n if (!acc[groupName]) {\n acc[groupName] = []\n }\n acc[groupName].push(option)\n return acc\n }, {})\n\n const hasGroups = Object.keys(groupedOptions).some(\n (key) => key !== \"__ungrouped\"\n )\n\n return (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <Select\n items={itemsWithPlaceholder}\n value={selectValue}\n onValueChange={handleValueChange}\n disabled={field.readOnly || readOnly}\n >\n <SelectTrigger className=\"min-w-46\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup align=\"center\" side=\"bottom\">\n {hasGroups ? (\n <>\n {Object.keys(groupedOptions).map(\n (groupName) => {\n const options =\n groupedOptions[groupName]\n return (\n <SelectGroup key={groupName}>\n {groupName !==\n \"__ungrouped\" && (\n <SelectGroupLabel>\n {groupName}\n </SelectGroupLabel>\n )}\n {options.map((option: any) => (\n <SelectItem\n key={\n typeof option.label ===\n \"string\"\n ? option.label\n : JSON.stringify(\n option.value\n )\n }\n value={option.value}\n >\n {option.label}\n\n </SelectItem>\n ))}\n </SelectGroup>\n )\n }\n )}\n </>\n ) : (\n field.options.map((option: any) => (\n <SelectItem\n key={\n typeof option.label === \"string\"\n ? option.label\n : JSON.stringify(option.value)\n }\n value={option.value}\n >\n {option.label}\n </SelectItem>\n ))\n )}\n </SelectPopup>\n </Select>\n </>\n )\n}\n\nexport default FieldSelect\n","\"use client\"\n\nimport { Radio as RadioPrimitive } from \"@base-ui/react/radio\"\nimport { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype RadioLayout = \"horizontal\" | \"inline\"\n\ninterface RadioGroupProps extends RadioGroupPrimitive.Props {\n layout?: RadioLayout\n}\n\ninterface RadioGroupItemProps extends RadioPrimitive.Root.Props {\n layout?: RadioLayout\n}\n\nfunction RadioGroup({\n className,\n layout = \"horizontal\",\n ...props\n}: RadioGroupProps) {\n return (\n <RadioGroupPrimitive\n data-slot=\"radio-group\"\n className={cn(\"cn-radio-group w-full\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n layout = \"horizontal\",\n ...props\n}: RadioGroupItemProps) {\n const isHorizontal = layout === \"horizontal\"\n\n if (isHorizontal) {\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 group/radio-group-item peer data-[checked]:text-primary-500 relative block flex h-full shrink-0 cursor-pointer items-center justify-center border border-transparent bg-white px-2 py-1.5 text-xs transition-[color,box-shadow] outline-none hover:bg-stone-50 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[checked]:bg-stone-50 data-[checked]:font-semibold\",\n className\n )}\n {...props}\n />\n )\n }\n\n return (\n <RadioPrimitive.Root\n data-slot=\"radio-group-item\"\n className={cn(\n \"text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 group/radio-group-item peer border-input relative aspect-square size-4 shrink-0 rounded-full border bg-white transition-[color,box-shadow] outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"cn-radio-group-indicator\"\n >\n <span className=\"bg-foreground m-1 block size-1.5 rounded-full\"></span>\n </RadioPrimitive.Indicator>\n </RadioPrimitive.Root>\n )\n}\n\nexport { RadioGroup, RadioGroupItem }\nexport type { RadioLayout }\n","import React from \"react\"\nimport { Field, FieldProps } from \"@puckeditor/core\"\nimport Label from \"../Label\"\nimport { RadioGroup, RadioGroupItem, RadioLayout } from \"../../ui/radio\"\n\ntype RadioProps = FieldProps<Field<any>> & {\n name: string\n field: Field<any> & {\n options?: ReadonlyArray<{ label: React.ReactNode; value: any }>\n layout?: RadioLayout\n }\n}\n\nconst FieldRadio = ({\n onChange,\n value,\n readOnly,\n field,\n label,\n}: RadioProps & { label: string }) => {\n if (!field.options || !Array.isArray(field.options)) {\n return null\n }\n\n const layout = field.layout || \"horizontal\"\n\n const handleChange = (newValue: unknown) => {\n if (!readOnly && newValue != null) {\n onChange(newValue)\n }\n }\n\n const groupClassName =\n layout === \"horizontal\"\n ? \"border-input flex w-fit flex-wrap divide-x divide-stone-200 overflow-hidden rounded-md border\"\n : \"flex flex-col gap-3\"\n\n return (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <RadioGroup\n layout={layout}\n value={value?.toString() || \"\"}\n onValueChange={handleChange}\n disabled={readOnly}\n className={groupClassName}\n >\n {field.options.map((option, index) => {\n const optionValue = String(option.value ?? \"\")\n const key = `${optionValue}-${index}`\n\n if (layout === \"horizontal\") {\n return (\n <label key={key} className=\"flex-1\">\n <RadioGroupItem\n layout=\"horizontal\"\n value={optionValue}\n disabled={readOnly}\n >\n {option.label || option.value?.toString()}\n </RadioGroupItem>\n </label>\n )\n }\n\n return (\n <label\n key={key}\n className=\"flex cursor-pointer items-center gap-3\"\n >\n <RadioGroupItem\n layout=\"inline\"\n value={optionValue}\n disabled={readOnly}\n />\n <span className=\"text-sm\">\n {option.label || option.value?.toString()}\n </span>\n </label>\n )\n })}\n </RadioGroup>\n </>\n )\n}\n\nexport default FieldRadio\n","\"use client\";\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\";\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype TextareaProps = React.ComponentProps<\"textarea\"> & {\n size?: \"sm\" | \"default\" | \"lg\" | number;\n unstyled?: boolean;\n};\n\nfunction Textarea({\n className,\n size = \"default\",\n unstyled = false,\n ...props\n}: TextareaProps) {\n return (\n <span\n className={\n cn(\n !unstyled &&\n \"relative inline-flex w-full rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] has-focus-visible:has-aria-invalid:border-destructive/64 has-focus-visible:has-aria-invalid:ring-destructive/16 has-aria-invalid:border-destructive/36 has-focus-visible:border-ring has-disabled:opacity-64 has-[:disabled,:focus-visible,[aria-invalid]]:shadow-none has-focus-visible:ring-[3px] not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_1px_--theme(--color-black/6%)] sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-has-disabled:has-not-focus-visible:not-has-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n ) || undefined\n }\n data-size={size}\n data-slot=\"textarea-control\"\n >\n <FieldPrimitive.Control\n render={(defaultProps) => (\n <textarea\n className={cn(\n \"field-sizing-content min-h-17.5 w-full rounded-[inherit] px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] outline-none max-sm:min-h-20.5\",\n size === \"sm\" &&\n \"min-h-16.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)] max-sm:min-h-19.5\",\n size === \"lg\" &&\n \"min-h-18.5 py-[calc(--spacing(2)-1px)] max-sm:min-h-21.5\",\n )}\n data-slot=\"textarea\"\n {...mergeProps(defaultProps, props)}\n />\n )}\n />\n </span>\n );\n}\n\nexport { Textarea, type TextareaProps };\n","import { Textarea } from \"../../ui/textarea\"\nimport Label from \"../Label\"\n\nconst FieldTextarea = ({\n onChange,\n value,\n label,\n field,\n readOnly,\n}: {\n onChange: (value: any) => void\n value?: string\n label: string\n field: any\n readOnly?: boolean\n}) => (\n <>\n {label && <Label label={label} readOnly={field.readOnly || readOnly} tooltip={field.tooltip} />}\n <Textarea\n value={value || \"\"}\n placeholder={field.placeholder}\n onChange={(e) => onChange(e.currentTarget.value)}\n readOnly={field.readOnly || readOnly}\n />\n </>\n)\n\nexport default FieldTextarea\n","import { ReactNode, SyntheticEvent } from \"react\"\n/* import { Button } from \"../ui/button\"\nimport { SparklesIcon } from \"lucide-react\" */\n\nconst Action = ({\n children,\n label,\n onClick,\n}: {\n children: ReactNode\n label?: string\n onClick: (e: SyntheticEvent) => void\n}) => (\n <button\n type=\"button\"\n className=\"hover:text-primary-500 mx-1 flex cursor-pointer items-center justify-center rounded border-none bg-transparent p-1.5 text-stone-700 transition-colors duration-50 hover:bg-stone-50\"\n onClick={onClick}\n title={label}\n >\n {children}\n </button>\n)\n\nconst Group = ({ children }: { children: ReactNode }) => (\n <div className=\"mx-2 flex h-full items-center first:ml-0 last:mr-0 empty:hidden [&>*]:m-0\">\n {children}\n </div>\n)\n\nconst Label = ({ label }: { label: string }) => (\n <div className=\"text-sm font-[var(--puck-font-family)] font-medium overflow-ellipsis whitespace-nowrap text-stone-700\">\n {label}\n </div>\n)\n\nconst Separator = () => <div className=\"h-full w-px bg-border\" />\n\nconst ActionBar = ({\n label,\n parentAction,\n children,\n}: {\n label?: string\n parentAction?: ReactNode\n children?: ReactNode\n}) => (\n <div\n className=\"border-input flex w-auto items-center rounded-lg border bg-white p-2 shadow-lg shadow-black/5\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n >\n {parentAction && (\n <>\n <ActionBar.Group>{parentAction}</ActionBar.Group>\n <ActionBar.Separator />\n </>\n )}\n {label && (\n <>\n <ActionBar.Group>\n <ActionBar.Label label={label} />\n </ActionBar.Group>\n <ActionBar.Separator />\n </>\n )}\n <ActionBar.Group>{children}</ActionBar.Group>\n {/* <ActionBar.Separator />\n <ActionBar.Group>\n <Button variant=\"primary\" size=\"sm\">\n <SparklesIcon className=\"size-4\" />\n </Button>\n </ActionBar.Group> */}\n </div>\n)\n\nActionBar.Action = Action\nActionBar.Label = Label\nActionBar.Group = Group\nActionBar.Separator = Separator\n\nexport default ActionBar\n","\"use client\"\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\ntype TabsVariant = \"default\" | \"underline\"\n\nfunction Tabs({ className, ...props }: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n className={cn(\n \"flex flex-col gap-2 data-[orientation=vertical]:flex-row\",\n className\n )}\n data-slot=\"tabs\"\n {...props}\n />\n )\n}\n\nfunction TabsList({\n variant = \"default\",\n className,\n children,\n ...props\n}: TabsPrimitive.List.Props & {\n variant?: TabsVariant\n}) {\n return (\n <TabsPrimitive.List\n className={cn(\n \"text-muted-foreground relative z-0 flex w-fit items-center justify-center gap-x-0.5\",\n \"data-[orientation=vertical]:flex-col\",\n variant === \"default\"\n ? \"bg-muted text-muted-foreground/72 rounded-lg p-0.5\"\n : \"*:data-[slot=tabs-tab]:hover:bg-accent data-[orientation=horizontal]:py-1 data-[orientation=vertical]:px-1\",\n className\n )}\n data-slot=\"tabs-list\"\n {...props}\n >\n {children}\n <TabsPrimitive.Indicator\n className={cn(\n \"absolute bottom-0 left-0 h-(--active-tab-height) w-(--active-tab-width) translate-x-(--active-tab-left) -translate-y-(--active-tab-bottom) transition-[width,translate] duration-200 ease-in-out\",\n variant === \"underline\"\n ? \"bg-primary z-10 data-[orientation=horizontal]:h-0.5 data-[orientation=horizontal]:translate-y-px data-[orientation=vertical]:w-0.5 data-[orientation=vertical]:-translate-x-px\"\n : \"bg-background dark:bg-input -z-1 rounded-md shadow-sm/5\"\n )}\n data-slot=\"tab-indicator\"\n />\n </TabsPrimitive.List>\n )\n}\n\nfunction TabsTab({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n className={cn(\n \"hover:text-muted-foreground focus-visible:ring-ring data-active:text-foreground flex h-9 shrink-0 grow cursor-pointer items-center justify-center gap-1.5 rounded-md border border-transparent px-[calc(--spacing(2.5)-1px)] text-base font-medium whitespace-nowrap transition-[color,background-color,box-shadow] outline-none focus-visible:ring-2 data-disabled:pointer-events-none data-disabled:opacity-64 data-[orientation=vertical]:w-full data-[orientation=vertical]:justify-start sm:h-8 sm:text-sm [&_svg]:pointer-events-none [&_svg]:-mx-0.5 [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n data-slot=\"tabs-tab\"\n {...props}\n />\n )\n}\n\nfunction TabsPanel({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n className={cn(\"flex-1 outline-none\", className)}\n data-slot=\"tabs-content\"\n {...props}\n />\n )\n}\n\nexport {\n Tabs,\n TabsList,\n TabsTab,\n TabsTab as TabsTrigger,\n TabsPanel,\n TabsPanel as TabsContent,\n}\n","\"use client\";\n\nimport { Accordion as AccordionPrimitive } from \"@base-ui/react/accordion\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport type React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport function Accordion(\n props: AccordionPrimitive.Root.Props,\n): React.ReactElement {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />;\n}\n\nexport function AccordionItem({\n className,\n ...props\n}: AccordionPrimitive.Item.Props): React.ReactElement {\n return (\n <AccordionPrimitive.Item\n className={cn(\"border-b last:border-b-0\", className)}\n data-slot=\"accordion-item\"\n {...props}\n />\n );\n}\n\nexport function AccordionTrigger({\n className,\n children,\n ...props\n}: AccordionPrimitive.Trigger.Props): React.ReactElement {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n className={cn(\n \"flex flex-1 cursor-pointer items-start justify-between gap-4 py-3 text-left font-medium text-sm outline-none transition-all focus-visible:ring-[3px] focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-64 data-panel-open:*:data-[slot=accordion-indicator]:rotate-180 px-4 hover:bg-muted\",\n className,\n )}\n data-slot=\"accordion-trigger\"\n {...props}\n >\n {children}\n <ChevronDownIcon\n className=\"pointer-events-none size-4 shrink-0 translate-y-0.5 opacity-80 transition-transform duration-0 ease-in-out\"\n data-slot=\"accordion-indicator\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\nexport function AccordionPanel({\n className,\n children,\n ...props\n}: AccordionPrimitive.Panel.Props): React.ReactElement {\n return (\n <AccordionPrimitive.Panel\n className=\"h-(--accordion-panel-height) overflow-hidden text-muted-foreground text-sm transition-[height] duration-0 ease-in-out data-ending-style:h-0 data-starting-style:h-0\"\n data-slot=\"accordion-panel\"\n {...props}\n >\n <div className={cn(\"pt-0 pb-4\", className)}>{children}</div>\n </AccordionPrimitive.Panel>\n );\n}\n\nexport { AccordionPrimitive, AccordionPanel as AccordionContent };\n","import React, { useMemo, Children, isValidElement, cloneElement } from \"react\"\nimport { createUsePuck } from \"@puckeditor/core\"\nimport { Tabs, TabsList, TabsTab, TabsPanel } from \"../ui/tabs\"\nimport {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger\n} from \"../ui/accordion\"\n\n// Create typed usePuck hook with selector support\nconst usePuck = createUsePuck()\n\ntype ItemSelector = {\n path?: string\n index?: number\n}\n\ntype FieldGroupsProps = {\n children: React.ReactNode\n isLoading: boolean\n itemSelector?: ItemSelector | null\n}\n\n// Accordion configuration\ntype AccordionConfig = {\n title: string\n fields: string[]\n defaultExpanded?: boolean\n}\n\n// Tab configuration - can have direct accordion or nested accordions\ntype TabConfig = {\n title: string\n accordions: AccordionConfig | Record<string, AccordionConfig>\n}\n\n// Tabs configuration\ntype TabsConfig = Record<string, TabConfig>\n\n// Helper to check if accordions is a single accordion (has fields property)\nconst isSingleAccordion = (\n accordions: AccordionConfig | Record<string, AccordionConfig>\n): accordions is AccordionConfig => {\n return \"fields\" in accordions && Array.isArray(accordions.fields)\n}\n\nconst FieldGroups = ({ children }: FieldGroupsProps) => {\n // Use selectors to only subscribe to the specific data we need\n const config = usePuck((s) => s.config)\n const selectedItem = usePuck((s) => s.selectedItem)\n\n // Get the component config and tabs configuration\n const componentConfig = useMemo(() => {\n if (!selectedItem?.type) return null\n return config.components?.[selectedItem.type] || null\n }, [config, selectedItem])\n\n const tabsConfig = useMemo(() => {\n if (!componentConfig) return null\n const configWithTabs = componentConfig as any\n if (!configWithTabs.tabs) return null\n return configWithTabs.tabs as TabsConfig\n }, [componentConfig])\n\n // Create a map of field names to their location (tab and accordion)\n const fieldToLocationMap = useMemo(() => {\n const map = new Map<string, { tab: string; accordion: string }>()\n\n if (!tabsConfig) return map\n\n Object.entries(tabsConfig).forEach(([tabKey, tabConfig]) => {\n const { accordions } = tabConfig\n\n if (isSingleAccordion(accordions)) {\n // Single accordion case - use tab key as accordion key\n accordions.fields.forEach((fieldName) => {\n map.set(fieldName, {\n tab: tabKey,\n accordion: tabKey, // Use tab key for single accordion\n })\n })\n } else {\n // Multiple accordions case\n Object.entries(accordions).forEach(\n ([accordionKey, accordionConfig]) => {\n if (accordionConfig?.fields) {\n accordionConfig.fields.forEach((fieldName) => {\n map.set(fieldName, {\n tab: tabKey,\n accordion: accordionKey,\n })\n })\n }\n }\n )\n }\n })\n\n return map\n }, [tabsConfig])\n\n // Organize children by tabs and accordions\n const organizedChildren = useMemo(() => {\n const childArray = Children.toArray(children)\n type OrganizedStructure = Record<\n string,\n Record<string, React.ReactNode[]>\n >\n const result: OrganizedStructure = {}\n\n if (!tabsConfig) {\n return {\n __ungrouped: { default: childArray },\n } as OrganizedStructure\n }\n\n // Initialize structure for tabs and accordions\n Object.entries(tabsConfig).forEach(([tabKey, tabConfig]) => {\n result[tabKey] = {}\n const { accordions } = tabConfig\n\n if (isSingleAccordion(accordions)) {\n // Single accordion - use tab key as accordion key\n result[tabKey][tabKey] = []\n } else {\n // Multiple accordions\n Object.keys(accordions).forEach((accordionKey) => {\n result[tabKey][accordionKey] = []\n })\n }\n })\n\n const ungrouped: React.ReactNode[] = []\n\n // Organize children into their respective locations\n childArray.forEach((child) => {\n if (!isValidElement(child)) {\n ungrouped.push(child)\n return\n }\n\n // Try to extract field name from various sources\n const props = child.props as any\n let fieldName: string | null = null\n\n // Check different possible locations for field name\n if (props?.field) fieldName = props.field\n else if (props?.name) fieldName = props.name\n else if (props?.id) fieldName = props.id\n else if (child.key && typeof child.key === \"string\") {\n fieldName = child.key.replace(/^\\.\\$?/, \"\")\n }\n\n // If we found a field name, try to match it to a location\n if (fieldName) {\n const location = fieldToLocationMap.get(fieldName)\n if (location) {\n const newProps = {\n ...(child.props || {}),\n \"data-field-name\": fieldName,\n \"data-tab\": location.tab,\n \"data-accordion\": location.accordion,\n }\n const enhancedChild = cloneElement(child, newProps as any)\n\n if (!result[location.tab]) result[location.tab] = {}\n if (!result[location.tab][location.accordion])\n result[location.tab][location.accordion] = []\n result[location.tab][location.accordion].push(enhancedChild)\n return\n }\n }\n\n // If not matched to any location, add to ungrouped\n ungrouped.push(child)\n })\n\n return {\n ...result,\n __ungrouped: { default: ungrouped },\n } as OrganizedStructure\n }, [children, tabsConfig, fieldToLocationMap])\n\n // Get the first tab as default\n const defaultTab = useMemo(() => {\n if (!tabsConfig) return \"ungrouped\"\n return Object.keys(tabsConfig)[0] || \"ungrouped\"\n }, [tabsConfig])\n\n // Check if we have organized content\n const hasOrganizedFields = useMemo(() => {\n if (!tabsConfig) return false\n\n return Object.keys(tabsConfig).some((tabKey) => {\n const tabContent = organizedChildren[tabKey]\n if (!tabContent || typeof tabContent !== \"object\") return false\n return Object.keys(tabContent).some(\n (accordionKey) =>\n Array.isArray(tabContent[accordionKey]) &&\n tabContent[accordionKey].length > 0\n )\n })\n }, [tabsConfig, organizedChildren])\n\n // If no tabs configuration, render children as-is\n if (!tabsConfig) {\n return <div className=\"flex flex-col gap-y-3\">{children}</div>\n }\n\n // If no fields were matched to tabs, render children as-is\n if (!hasOrganizedFields) {\n return <div className=\"flex flex-col gap-y-3\">{children}</div>\n }\n\n // Render tabs with accordions\n return (\n <div className=\"puck-field-groups\">\n <Tabs defaultValue={defaultTab}>\n <div className=\"px-2 pt-2\">\n <TabsList className=\"w-full justify-center\">\n {Object.entries(tabsConfig).map(\n ([tabKey, tabConfig]) => {\n const tabContent = organizedChildren[tabKey]\n if (\n !tabContent ||\n typeof tabContent !== \"object\"\n )\n return null\n\n // Check if tab has any fields\n const hasFields = Object.keys(tabContent).some(\n (accordionKey) =>\n Array.isArray(\n tabContent[accordionKey]\n ) && tabContent[accordionKey].length > 0\n )\n if (!hasFields) return null\n\n return (\n <TabsTab\n key={tabKey}\n value={tabKey}\n className=\"flex-1\"\n >\n {tabConfig.title}\n </TabsTab>\n )\n }\n )}\n </TabsList>\n </div>\n {Object.entries(tabsConfig).map(([tabKey, tabConfig]) => {\n const tabContent = organizedChildren[tabKey]\n if (!tabContent || typeof tabContent !== \"object\")\n return null\n\n const { accordions } = tabConfig\n\n // Handle single accordion case\n if (isSingleAccordion(accordions)) {\n const fields = tabContent[tabKey]\n if (\n !fields ||\n !Array.isArray(fields) ||\n fields.length === 0\n )\n return null\n\n return (\n <TabsPanel key={tabKey} value={tabKey}>\n <Accordion\n defaultValue={\n accordions.defaultExpanded\n ? [tabKey]\n : []\n }\n className=\"rounded-none border-none\"\n >\n <AccordionItem value={tabKey}>\n <AccordionTrigger>\n {accordions.title}\n </AccordionTrigger>\n <AccordionPanel className=\"p-0\">\n <div className=\"flex flex-col\">\n {fields}\n </div>\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n </TabsPanel>\n )\n }\n\n // Handle multiple accordions case\n const accordionsRecord = accordions as Record<\n string,\n AccordionConfig\n >\n\n // Get default expanded accordions\n const defaultExpandedAccordions = Object.entries(\n accordionsRecord\n )\n .filter(\n ([, accordionConfig]) =>\n accordionConfig?.defaultExpanded\n )\n .map(([accordionKey]) => accordionKey)\n\n return (\n <TabsPanel key={tabKey} value={tabKey}>\n <Accordion\n multiple\n defaultValue={defaultExpandedAccordions}\n className=\"rounded-none border-none\"\n >\n {Object.entries(accordionsRecord).map(\n ([accordionKey, accordionConfig]) => {\n const fields = tabContent[accordionKey]\n if (\n !fields ||\n !Array.isArray(fields) ||\n fields.length === 0\n )\n return null\n\n return (\n <AccordionItem\n key={accordionKey}\n value={accordionKey}\n >\n <AccordionTrigger>\n {accordionConfig.title}\n </AccordionTrigger>\n <AccordionPanel className=\"p-0\">\n <div className=\"flex flex-col\">\n {fields}\n </div>\n </AccordionPanel>\n </AccordionItem>\n )\n }\n )}\n </Accordion>\n </TabsPanel>\n )\n })}\n </Tabs>\n\n {/* Render ungrouped fields below tabs */}\n {organizedChildren[\"__ungrouped\"]?.default &&\n Array.isArray(organizedChildren[\"__ungrouped\"].default) &&\n organizedChildren[\"__ungrouped\"].default.length > 0 && (\n <div className=\"mt-4 space-y-4 border-t pt-4\">\n {organizedChildren[\"__ungrouped\"].default}\n </div>\n )}\n </div>\n )\n}\n\nexport default FieldGroups\n","import { createUsePuck, type Config } from \"@puckeditor/core\"\nimport { useCallback } from \"react\"\nimport { GripVerticalIcon, BoxIcon } from \"lucide-react\"\n\nimport {\n Tooltip,\n TooltipPopup,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\n\nconst usePuck = createUsePuck()\n\nconst DrawerItem = ({\n name,\n icon,\n}: {\n name: string\n icon?: React.ReactNode\n}) => {\n const configSelector = useCallback(\n (state: { config: Config }) => state.config,\n []\n )\n const config = usePuck(configSelector)\n\n const componentConfig = config.components?.[name]\n\n const iconOrImage = icon || componentConfig?.metadata?.icon\n const imageUrl = componentConfig?.metadata?.image\n const description = componentConfig?.metadata?.description\n const label = componentConfig?.label || name\n\n const displayIcon = iconOrImage || <BoxIcon size={16} />\n\n const hasTooltipContent = imageUrl || description\n\n const drawerContent = (\n <div className=\"hover:bg-muted group flex cursor-grab items-center justify-between gap-2 rounded-md bg-white p-0.5 transition-colors\">\n <div className=\"flex items-center gap-2 truncate\">\n <div className=\"border-border group-hover:border-muted rounded-sm border bg-white p-3\">\n {displayIcon}\n </div>\n <span className=\"truncate text-sm font-medium\">{label}</span>\n </div>\n <div className=\"text-foreground h-full flex-none rounded-sm bg-white px-1 py-3\">\n <GripVerticalIcon size={16} />\n </div>\n </div>\n )\n\n if (!hasTooltipContent) {\n return drawerContent\n }\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger delay={200} className=\"w-full\">\n {drawerContent}\n </TooltipTrigger>\n <TooltipPopup side=\"right\" sideOffset={8} className=\"w-64 p-2\">\n {imageUrl && (\n <img\n src={imageUrl}\n alt={name}\n className=\"h-auto w-full rounded-sm object-contain\"\n />\n )}\n {description && (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {description}\n </p>\n )}\n </TooltipPopup>\n </Tooltip>\n </TooltipProvider>\n )\n}\n\nexport default DrawerItem\n","import FieldCheckbox from \"../components/Fields/Checkbox\"\nimport FieldInput from \"../components/Fields/Input\"\nimport FieldNumberUnit from \"../components/Fields/NumberUnit\"\nimport Label from \"../components/Fields/Label\"\nimport FieldSelect from \"../components/Fields/Select\"\nimport FieldRadio from \"../components/Fields/Radio\"\nimport FieldTextarea from \"../components/Fields/Textarea\"\nimport ActionBar from \"../components/ActionBar\"\nimport FieldGroups from \"../components/FieldGroups\"\nimport DrawerItem from \"../components/DrawerItem\"\n\nconst createPuckOverridesPlugin = () => {\n return {\n overrides: {\n actionBar: ActionBar,\n drawer: ({ children }: { children: React.ReactNode }) => (\n <>{children}</>\n ),\n drawerItem: DrawerItem,\n fields: FieldGroups,\n fieldLabel: ({\n children,\n label,\n field,\n tooltip,\n }: {\n children: React.ReactNode\n label?: string\n field?: any\n tooltip?: string\n }) => (\n <>\n {label && <Label label={label} tooltip={tooltip} />}\n {children}\n </>\n ),\n fieldTypes: {\n checkbox: FieldCheckbox,\n numberUnit: FieldNumberUnit,\n radio: FieldRadio,\n select: FieldSelect,\n text: FieldInput,\n textarea: FieldTextarea,\n },\n },\n }\n}\n\nexport default createPuckOverridesPlugin\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst PopoverCreateHandle = PopoverPrimitive.createHandle;\n\nconst Popover = PopoverPrimitive.Root;\n\nfunction PopoverTrigger(props: PopoverPrimitive.Trigger.Props) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverPopup({\n children,\n className,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n tooltipStyle = false,\n ...props\n}: PopoverPrimitive.Popup.Props & {\n side?: PopoverPrimitive.Positioner.Props[\"side\"];\n align?: PopoverPrimitive.Positioner.Props[\"align\"];\n sideOffset?: PopoverPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: PopoverPrimitive.Positioner.Props[\"alignOffset\"];\n tooltipStyle?: boolean;\n}) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n className=\"z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom,transform] data-instant:transition-none\"\n data-slot=\"popover-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <PopoverPrimitive.Popup\n className={cn(\n \"relative flex h-(--popup-height,auto) w-(--popup-width,auto) origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding text-popover-foreground shadow-lg/5 transition-[width,height,scale,opacity] before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] data-starting-style:scale-98 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n tooltipStyle &&\n \"w-fit text-balance rounded-md text-xs shadow-md/5 before:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"popover-popup\"\n {...props}\n >\n <PopoverPrimitive.Viewport\n className={cn(\n \"relative size-full max-h-(--available-height) overflow-clip px-(--viewport-inline-padding) py-3 outline-none [--viewport-inline-padding:--spacing(3)] data-instant:transition-none **:data-current:data-ending-style:opacity-0 **:data-current:data-starting-style:opacity-0 **:data-previous:data-ending-style:opacity-0 **:data-previous:data-starting-style:opacity-0 **:data-current:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-previous:w-[calc(var(--popup-width)-2*var(--viewport-inline-padding)-2px)] **:data-current:opacity-100 **:data-previous:opacity-100 **:data-current:transition-opacity **:data-previous:transition-opacity\",\n tooltipStyle\n ? \"py-1 [--viewport-inline-padding:--spacing(2)]\"\n : \"not-data-transitioning:overflow-y-auto\",\n )}\n data-slot=\"popover-viewport\"\n >\n {children}\n </PopoverPrimitive.Viewport>\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n );\n}\n\nfunction PopoverClose({ ...props }: PopoverPrimitive.Close.Props) {\n return <PopoverPrimitive.Close data-slot=\"popover-close\" {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n return (\n <PopoverPrimitive.Title\n className={cn(\"font-semibold text-lg leading-none\", className)}\n data-slot=\"popover-title\"\n {...props}\n />\n );\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: PopoverPrimitive.Description.Props) {\n return (\n <PopoverPrimitive.Description\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"popover-description\"\n {...props}\n />\n );\n}\n\nexport {\n PopoverCreateHandle,\n Popover,\n PopoverTrigger,\n PopoverPopup,\n PopoverPopup as PopoverContent,\n PopoverTitle,\n PopoverDescription,\n PopoverClose,\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst badgeVariants = cva(\n \"relative inline-flex shrink-0 items-center justify-center gap-1 whitespace-nowrap rounded-md border border-transparent font-medium outline-none transition-shadow focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-64 [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='size-'])]:size-3.5 sm:[&_svg:not([class*='size-'])]:size-3 [&_svg]:pointer-events-none [&_svg]:shrink-0 [button&,a&]:cursor-pointer [button&,a&]:pointer-coarse:after:absolute [button&,a&]:pointer-coarse:after:size-full [button&,a&]:pointer-coarse:after:min-h-11 [button&,a&]:pointer-coarse:after:min-w-11\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default:\n \"h-5.5 min-w-5.5 px-[calc(--spacing(1)-1px)] text-sm sm:h-4.5 sm:min-w-4.5 sm:text-xs\",\n lg: \"h-6.5 min-w-6.5 px-[calc(--spacing(1.5)-1px)] text-base sm:h-5.5 sm:min-w-5.5 sm:text-sm\",\n sm: \"h-5 min-w-5 rounded-[.25rem] px-[calc(--spacing(1)-1px)] text-xs sm:h-4 sm:min-w-4 sm:text-[.625rem]\",\n },\n variant: {\n default:\n \"bg-primary text-primary-foreground [button&,a&]:hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white [button&,a&]:hover:bg-destructive/90\",\n error:\n \"bg-destructive/8 text-destructive-foreground dark:bg-destructive/16\",\n info: \"bg-info/8 text-info-foreground dark:bg-info/16\",\n outline:\n \"border-input bg-background text-foreground dark:bg-input/32 [button&,a&]:hover:bg-accent/50 dark:[button&,a&]:hover:bg-input/48\",\n secondary:\n \"bg-secondary text-secondary-foreground [button&,a&]:hover:bg-secondary/90\",\n success: \"bg-success/8 text-success-foreground dark:bg-success/16\",\n warning: \"bg-warning/8 text-warning-foreground dark:bg-warning/16\",\n },\n },\n },\n);\n\ninterface BadgeProps extends useRender.ComponentProps<\"span\"> {\n variant?: VariantProps<typeof badgeVariants>[\"variant\"];\n size?: VariantProps<typeof badgeVariants>[\"size\"];\n}\n\nfunction Badge({ className, variant, size, render, ...props }: BadgeProps) {\n const defaultProps = {\n className: cn(badgeVariants({ className, size, variant })),\n \"data-slot\": \"badge\",\n };\n\n return useRender({\n defaultTagName: \"span\",\n props: mergeProps<\"span\">(defaultProps, props),\n render,\n });\n}\n\nexport { Badge, badgeVariants };\n","\"use client\";\n\nimport { ScrollArea as ScrollAreaPrimitive } from \"@base-ui/react/scroll-area\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction ScrollArea({\n className,\n children,\n scrollFade = false,\n scrollbarGutter = false,\n ...props\n}: ScrollAreaPrimitive.Root.Props & {\n scrollFade?: boolean;\n scrollbarGutter?: boolean;\n}) {\n return (\n <ScrollAreaPrimitive.Root\n className={cn(\"size-full min-h-0\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n className={cn(\n \"h-full rounded-[inherit] outline-none transition-shadows focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-has-overflow-x:overscroll-x-contain\",\n scrollFade &&\n \"mask-t-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-start)))] mask-b-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-y-end)))] mask-l-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-start)))] mask-r-from-[calc(100%-min(var(--fade-size),var(--scroll-area-overflow-x-end)))] [--fade-size:1.5rem]\",\n scrollbarGutter &&\n \"data-has-overflow-y:pe-2.5 data-has-overflow-x:pb-2.5\",\n )}\n data-slot=\"scroll-area-viewport\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation=\"vertical\" />\n <ScrollBar orientation=\"horizontal\" />\n <ScrollAreaPrimitive.Corner data-slot=\"scroll-area-corner\" />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaPrimitive.Scrollbar.Props) {\n return (\n <ScrollAreaPrimitive.Scrollbar\n className={cn(\n \"m-1 flex opacity-0 transition-opacity delay-300 data-[orientation=horizontal]:h-1.5 data-[orientation=vertical]:w-1.5 data-[orientation=horizontal]:flex-col data-hovering:opacity-100 data-scrolling:opacity-100 data-hovering:delay-0 data-scrolling:delay-0 data-hovering:duration-100 data-scrolling:duration-100\",\n className,\n )}\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n {...props}\n >\n <ScrollAreaPrimitive.Thumb\n className=\"relative flex-1 rounded-full bg-foreground/20\"\n data-slot=\"scroll-area-thumb\"\n />\n </ScrollAreaPrimitive.Scrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { ScrollArea } from \"./scroll-area\";\n\nconst DialogCreateHandle = DialogPrimitive.createHandle;\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nfunction DialogTrigger(props: DialogPrimitive.Trigger.Props) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogClose(props: DialogPrimitive.Close.Props) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogBackdrop({\n className,\n ...props\n}: DialogPrimitive.Backdrop.Props) {\n return (\n <DialogPrimitive.Backdrop\n className={cn(\n \"fixed inset-0 z-50 bg-black/32 backdrop-blur-sm transition-all duration-200 data-ending-style:opacity-0 data-starting-style:opacity-0\",\n className,\n )}\n data-slot=\"dialog-backdrop\"\n {...props}\n />\n );\n}\n\nfunction DialogViewport({\n className,\n ...props\n}: DialogPrimitive.Viewport.Props) {\n return (\n <DialogPrimitive.Viewport\n className={cn(\n \"fixed inset-0 z-50 grid grid-rows-[1fr_auto_3fr] justify-items-center p-4\",\n className,\n )}\n data-slot=\"dialog-viewport\"\n {...props}\n />\n );\n}\n\nfunction DialogPopup({\n className,\n children,\n showCloseButton = true,\n bottomStickOnMobile = true,\n ...props\n}: DialogPrimitive.Popup.Props & {\n showCloseButton?: boolean;\n bottomStickOnMobile?: boolean;\n}) {\n return (\n <DialogPortal>\n <DialogBackdrop />\n <DialogViewport\n className={cn(\n bottomStickOnMobile &&\n \"max-sm:grid-rows-[1fr_auto] max-sm:p-0 max-sm:pt-12\",\n )}\n >\n <DialogPrimitive.Popup\n className={cn(\n \"-translate-y-[calc(1.25rem*var(--nested-dialogs))] relative row-start-2 flex max-h-full min-h-0 w-full min-w-0 max-w-lg scale-[calc(1-0.1*var(--nested-dialogs))] flex-col rounded-2xl border bg-popover not-dark:bg-clip-padding text-popover-foreground opacity-[calc(1-0.1*var(--nested-dialogs))] shadow-lg/5 transition-[scale,opacity,translate] duration-200 ease-in-out will-change-transform before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] data-nested:data-ending-style:translate-y-8 data-nested:data-starting-style:translate-y-8 data-nested-dialog-open:origin-top data-ending-style:scale-98 data-starting-style:scale-98 data-ending-style:opacity-0 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n bottomStickOnMobile &&\n \"max-sm:max-w-none max-sm:rounded-none max-sm:border-x-0 max-sm:border-t max-sm:border-b-0 max-sm:opacity-[calc(1-min(var(--nested-dialogs),1))] max-sm:data-ending-style:translate-y-4 max-sm:data-starting-style:translate-y-4 max-sm:before:hidden max-sm:before:rounded-none\",\n className,\n )}\n data-slot=\"dialog-popup\"\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n aria-label=\"Close\"\n className=\"absolute end-2 top-2\"\n render={<Button size=\"icon\" variant=\"ghost\" />}\n >\n <XIcon />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Popup>\n </DialogViewport>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-2 p-6 in-[[data-slot=dialog-popup]:has([data-slot=dialog-panel])]:pb-3 max-sm:pb-4\",\n className,\n )}\n data-slot=\"dialog-header\"\n {...props}\n />\n );\n}\n\nfunction DialogFooter({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & {\n variant?: \"default\" | \"bare\";\n}) {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse gap-2 px-6 sm:flex-row sm:justify-end sm:rounded-b-[calc(var(--radius-2xl)-1px)]\",\n variant === \"default\" && \"border-t bg-muted/72 py-4\",\n variant === \"bare\" &&\n \"in-[[data-slot=dialog-popup]:has([data-slot=dialog-panel])]:pt-3 pt-4 pb-6\",\n className,\n )}\n data-slot=\"dialog-footer\"\n {...props}\n />\n );\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n return (\n <DialogPrimitive.Title\n className={cn(\n \"font-heading font-semibold text-xl leading-none\",\n className,\n )}\n data-slot=\"dialog-title\"\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: DialogPrimitive.Description.Props) {\n return (\n <DialogPrimitive.Description\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"dialog-description\"\n {...props}\n />\n );\n}\n\nfunction DialogPanel({\n className,\n scrollFade = true,\n ...props\n}: React.ComponentProps<\"div\"> & { scrollFade?: boolean }) {\n return (\n <ScrollArea scrollFade={scrollFade}>\n <div\n className={cn(\n \"px-6 in-[[data-slot=dialog-popup]:has([data-slot=dialog-header])]:pt-1 in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-header]))]:pt-6 in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-footer]))]:pb-6! in-[[data-slot=dialog-popup]:not(:has([data-slot=dialog-footer].border-t))]:pb-1 pb-6\",\n className,\n )}\n data-slot=\"dialog-panel\"\n {...props}\n />\n </ScrollArea>\n );\n}\n\nexport {\n DialogCreateHandle,\n Dialog,\n DialogTrigger,\n DialogPortal,\n DialogClose,\n DialogBackdrop,\n DialogBackdrop as DialogOverlay,\n DialogPopup,\n DialogPopup as DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n DialogPanel,\n DialogViewport,\n};\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Input, type InputProps } from \"./input\";\nimport { Textarea, type TextareaProps } from \"./textarea\";\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative inline-flex w-full min-w-0 items-center rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_1px_--theme(--color-black/6%)] has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/64 has-[input:focus-visible,textarea:focus-visible]:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/16 has-[textarea]:h-auto has-data-[align=block-end]:h-auto has-data-[align=block-start]:h-auto has-data-[align=block-end]:flex-col has-data-[align=block-start]:flex-col has-[input:focus-visible,textarea:focus-visible]:border-ring has-[input[aria-invalid],textarea[aria-invalid]]:border-destructive/36 has-[input:disabled,textarea:disabled]:opacity-64 has-[input:disabled,textarea:disabled,input:focus-visible,textarea:focus-visible,input[aria-invalid],textarea[aria-invalid]]:shadow-none has-[input:focus-visible,textarea:focus-visible]:ring-[3px] sm:text-sm dark:bg-input/32 dark:has-[input[aria-invalid],textarea[aria-invalid]]:ring-destructive/24 dark:not-has-[input:disabled,textarea:disabled]:not-has-[input:focus-visible,textarea:focus-visible]:not-has-[input[aria-invalid],textarea[aria-invalid]]:before:shadow-[0_-1px_--theme(--color-white/6%)] has-data-[align=inline-start]:**:[[data-size=sm]_input]:ps-1.5 has-data-[align=inline-end]:**:[[data-size=sm]_input]:pe-1.5 *:[[data-slot=input-control],[data-slot=textarea-control]]:contents *:[[data-slot=input-control],[data-slot=textarea-control]]:before:hidden has-[[data-align=block-start],[data-align=block-end]]:**:[input]:h-auto has-data-[align=inline-start]:**:[input]:ps-2 has-data-[align=inline-end]:**:[input]:pe-2 has-data-[align=block-end]:**:[input]:pt-1.5 has-data-[align=block-start]:**:[input]:pb-1.5 **:[textarea]:min-h-20.5 **:[textarea]:resize-none **:[textarea]:py-[calc(--spacing(3)-1px)] **:[textarea]:max-sm:min-h-23.5 **:[textarea_button]:rounded-[calc(var(--radius-md)-1px)]\",\n className,\n )}\n data-slot=\"input-group\"\n role=\"group\"\n {...props}\n />\n );\n}\n\nconst inputGroupAddonVariants = cva(\n \"[&_svg]:-mx-0.5 flex h-auto cursor-text select-none items-center justify-center gap-2 leading-none [&>kbd]:rounded-[calc(var(--radius)-5px)] in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 not-has-[button]:**:[svg:not([class*='opacity-'])]:opacity-80\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-[calc(--spacing(3)-1px)] pb-[calc(--spacing(3)-1px)] [.border-t]:pt-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"block-start\":\n \"order-first w-full justify-start px-[calc(--spacing(3)-1px)] pt-[calc(--spacing(3)-1px)] [.border-b]:pb-[calc(--spacing(3)-1px)] [[data-size=sm]+&]:px-[calc(--spacing(2.5)-1px)]\",\n \"inline-end\":\n \"has-[>:last-child[data-slot=badge]]:-me-1.5 has-[>button]:-me-2 order-last pe-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:me-[-0.35rem] [[data-size=sm]+&]:pe-[calc(--spacing(2.5)-1px)]\",\n \"inline-start\":\n \"has-[>:last-child[data-slot=badge]]:-ms-1.5 has-[>button]:-ms-2 order-first ps-[calc(--spacing(3)-1px)] has-[>kbd:last-child]:ms-[-0.35rem] [[data-size=sm]+&]:ps-[calc(--spacing(2.5)-1px)]\",\n },\n },\n },\n);\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n className={cn(inputGroupAddonVariants({ align }), className)}\n data-align={align}\n data-slot=\"input-group-addon\"\n onMouseDown={(e) => {\n const target = e.target as HTMLElement;\n const isInteractive = target.closest(\n \"button, a, input, select, textarea, [role='button'], [role='combobox'], [role='listbox'], [data-slot='select-trigger']\",\n );\n if (isInteractive) return;\n e.preventDefault();\n const parent = e.currentTarget.parentElement;\n const input = parent?.querySelector<\n HTMLInputElement | HTMLTextAreaElement\n >(\"input, textarea\");\n if (input && !parent?.querySelector(\"input:focus, textarea:focus\")) {\n input.focus();\n }\n }}\n {...props}\n />\n );\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"[&_svg]:-mx-0.5 line-clamp-1 flex items-center gap-2 text-muted-foreground leading-none in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4.5 sm:in-[[data-slot=input-group]:has([data-slot=input-control],[data-slot=textarea-control])]:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction InputGroupInput({ className, ...props }: InputProps) {\n return <Input className={className} unstyled {...props} />;\n}\n\nfunction InputGroupTextarea({ className, ...props }: TextareaProps) {\n return <Textarea className={className} unstyled {...props} />;\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n","import type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Frame({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative flex flex-col rounded-xl bg-muted/72 p-1\",\n \"*:[[data-slot=frame-panel]+[data-slot=frame-panel]]:mt-1\",\n className,\n )}\n data-slot=\"frame\"\n {...props}\n />\n );\n}\n\nfunction FramePanel({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\n \"relative rounded-xl border bg-background bg-clip-padding p-5 shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"frame-panel\"\n {...props}\n />\n );\n}\n\nfunction FrameHeader({ className, ...props }: React.ComponentProps<\"header\">) {\n return (\n <header\n className={cn(\"flex flex-col px-5 py-4\", className)}\n data-slot=\"frame-panel-header\"\n {...props}\n />\n );\n}\n\nfunction FrameTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"font-semibold text-sm\", className)}\n data-slot=\"frame-panel-title\"\n {...props}\n />\n );\n}\n\nfunction FrameDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"text-muted-foreground text-sm\", className)}\n data-slot=\"frame-panel-description\"\n {...props}\n />\n );\n}\n\nfunction FrameFooter({ className, ...props }: React.ComponentProps<\"footer\">) {\n return (\n <footer\n className={cn(\"px-5 py-4\", className)}\n data-slot=\"frame-panel-footer\"\n {...props}\n />\n );\n}\n\nexport {\n Frame,\n FramePanel,\n FrameHeader,\n FrameTitle,\n FrameDescription,\n FrameFooter,\n};\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n MoreHorizontalIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { type Button, buttonVariants } from \"./button\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n data-slot=\"pagination\"\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n className={cn(\"flex flex-row items-center gap-1\", className)}\n data-slot=\"pagination-content\"\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n size?: React.ComponentProps<typeof Button>[\"size\"];\n} & useRender.ComponentProps<\"a\">;\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n render,\n ...props\n}: PaginationLinkProps) {\n const defaultProps = {\n \"aria-current\": isActive ? (\"page\" as const) : undefined,\n className: render\n ? className\n : cn(\n buttonVariants({\n size,\n variant: isActive ? \"outline\" : \"ghost\",\n }),\n className,\n ),\n \"data-active\": isActive,\n \"data-slot\": \"pagination-link\",\n };\n\n return useRender({\n defaultTagName: \"a\",\n props: mergeProps<\"a\">(defaultProps, props),\n render,\n });\n}\n\nfunction PaginationPrevious({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to previous page\"\n className={cn(\"max-sm:aspect-square max-sm:p-0\", className)}\n size=\"default\"\n {...props}\n >\n <ChevronLeftIcon className=\"sm:-ms-1\" />\n <span className=\"sm:hidden\">Previous</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n aria-label=\"Go to next page\"\n className={cn(\"max-sm:aspect-square max-sm:p-0\", className)}\n size=\"default\"\n {...props}\n >\n <span className=\"sm:hidden\">Next</span>\n <ChevronRightIcon className=\"sm:-me-1\" />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n className={cn(\"flex min-w-7 justify-center\", className)}\n data-slot=\"pagination-ellipsis\"\n {...props}\n >\n <MoreHorizontalIcon className=\"size-5 sm:size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n};\n","import type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n className=\"relative w-full overflow-x-auto\"\n data-slot=\"table-container\"\n >\n <table\n className={cn(\n \"w-full caption-bottom in-data-[slot=frame]:border-separate in-data-[slot=frame]:border-spacing-0 text-sm\",\n className,\n )}\n data-slot=\"table\"\n {...props}\n />\n </div>\n );\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n className={cn(\n \"[&_tr]:border-b in-data-[slot=frame]:**:[th]:h-9 in-data-[slot=frame]:*:[tr]:border-none in-data-[slot=frame]:*:[tr]:hover:bg-transparent\",\n className,\n )}\n data-slot=\"table-header\"\n {...props}\n />\n );\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n className={cn(\n \"relative in-data-[slot=frame]:rounded-xl in-data-[slot=frame]:shadow-xs/5 before:pointer-events-none before:absolute before:inset-px not-in-data-[slot=frame]:before:hidden before:rounded-[calc(var(--radius-xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/8%)] [&_tr:last-child]:border-0 in-data-[slot=frame]:*:[tr]:border-0 in-data-[slot=frame]:*:[tr]:*:[td]:border-b in-data-[slot=frame]:*:[tr]:*:[td]:bg-background in-data-[slot=frame]:*:[tr]:*:[td]:bg-clip-padding in-data-[slot=frame]:*:[tr]:first:*:[td]:first:rounded-ss-xl in-data-[slot=frame]:*:[tr]:*:[td]:first:border-s in-data-[slot=frame]:*:[tr]:first:*:[td]:border-t in-data-[slot=frame]:*:[tr]:last:*:[td]:last:rounded-ee-xl in-data-[slot=frame]:*:[tr]:*:[td]:last:border-e in-data-[slot=frame]:*:[tr]:first:*:[td]:last:rounded-se-xl in-data-[slot=frame]:*:[tr]:last:*:[td]:first:rounded-es-xl in-data-[slot=frame]:*:[tr]:hover:*:[td]:bg-transparent in-data-[slot=frame]:*:[tr]:data-[state=selected]:*:[td]:bg-muted/72\",\n className,\n )}\n data-slot=\"table-body\"\n {...props}\n />\n );\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n className={cn(\n \"border-t in-data-[slot=frame]:border-none bg-muted/72 in-data-[slot=frame]:bg-transparent font-medium [&>tr]:last:border-b-0 in-data-[slot=frame]:*:[tr]:hover:bg-transparent\",\n className,\n )}\n data-slot=\"table-footer\"\n {...props}\n />\n );\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n className={cn(\n \"border-b transition-colors hover:bg-muted/72 in-data-[slot=frame]:hover:bg-transparent data-[state=selected]:bg-muted/72 in-data-[slot=frame]:data-[state=selected]:bg-transparent\",\n className,\n )}\n data-slot=\"table-row\"\n {...props}\n />\n );\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n className={cn(\n \"h-10 whitespace-nowrap px-2.5 text-left align-middle font-medium text-muted-foreground leading-none has-[[role=checkbox]]:w-px has-[[role=checkbox]]:pe-0\",\n className,\n )}\n data-slot=\"table-head\"\n {...props}\n />\n );\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n className={cn(\n \"whitespace-nowrap p-2.5 align-middle leading-none in-data-[slot=frame]:first:p-[calc(--spacing(2.5)-1px)] in-data-[slot=frame]:last:p-[calc(--spacing(2.5)-1px)] has-[[role=checkbox]]:pe-0\",\n className,\n )}\n data-slot=\"table-cell\"\n {...props}\n />\n );\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n className={cn(\n \"in-data-[slot=frame]:my-4 mt-4 text-muted-foreground text-sm\",\n className,\n )}\n data-slot=\"table-caption\"\n {...props}\n />\n );\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n};\n","\"use client\"\n\nimport React from \"react\"\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type PaginationState,\n type SortingState,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport {\n ChevronDownIcon,\n ChevronUpIcon,\n ChevronsUpDownIcon,\n Loader2Icon,\n SearchIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport {\n DialogFooter,\n DialogHeader,\n DialogPanel,\n DialogPopup,\n DialogTitle,\n} from \"../ui/dialog\"\nimport { Frame, FrameFooter } from \"../ui/frame\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"../ui/pagination\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../ui/table\"\n\n// ---------------------------------------------------------------------------\n// Pagination helper\n// ---------------------------------------------------------------------------\n\n/**\n * Returns an ordered list of page numbers and ellipsis markers to display.\n *\n * Rules (always-visible anchors: first 2 + last 2):\n * - Near start (currentPage ≤ 3) → show [1,2,3] … [n-1,n]\n * - Near end (currentPage ≥ totalPages-2) → show [1,2] … [n-2,n-1,n]\n * - Middle → show [1,2] … [p] … [n-1,n]\n *\n * Single-page gaps are filled automatically (no orphan ellipsis).\n */\nfunction getPageItems(currentPage: number, totalPages: number): (number | \"ellipsis\")[] {\n const left = [1, 2]\n const right = [totalPages - 1, totalPages]\n\n let middle: number[]\n if (currentPage <= 3) {\n middle = [3]\n } else if (currentPage >= totalPages - 2) {\n middle = [totalPages - 2]\n } else {\n middle = [currentPage]\n }\n\n const pagesSet = new Set(\n [...left, ...middle, ...right].filter((p) => p >= 1 && p <= totalPages)\n )\n const pages = Array.from(pagesSet).sort((a, b) => a - b)\n\n const items: (number | \"ellipsis\")[] = []\n for (let i = 0; i < pages.length; i++) {\n if (i > 0) {\n const gap = pages[i] - pages[i - 1]\n if (gap === 2) {\n // Fill single-page gap instead of showing ellipsis\n items.push(pages[i] - 1)\n } else if (gap > 2) {\n items.push(\"ellipsis\")\n }\n }\n items.push(pages[i])\n }\n\n return items\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type PickerModalProps<T extends { id: number | string }> = {\n title: string\n\n /** Search */\n searchQuery: string\n onSearch: (query: string) => void\n searchPlaceholder?: string\n\n /** Table data */\n columns: ColumnDef<T>[]\n data: T[]\n loading: boolean\n totalItems: number\n\n /** Highlighted row */\n selectedId?: number | string\n\n onRowClick: (item: T) => void\n\n /** Pagination — tanstack PaginationState */\n pagination: PaginationState\n onPaginationChange: React.Dispatch<React.SetStateAction<PaginationState>>\n\n /** Sorting (optional — pass undefined to disable entirely) */\n sorting?: SortingState\n onSortingChange?: React.Dispatch<React.SetStateAction<SortingState>>\n\n /** Page size selector options (defaults to [10, 25, 50, 100]) */\n pageSizeOptions?: number[]\n\n /** Empty state */\n emptyIcon?: React.ReactNode\n emptyMessage?: string\n\n /** Optional footer (e.g. upload zone) */\n footer?: React.ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// PickerModal\n// ---------------------------------------------------------------------------\n\nexport function PickerModal<T extends { id: number | string }>({\n title,\n searchQuery,\n onSearch,\n searchPlaceholder = \"Search...\",\n columns,\n data,\n loading,\n totalItems,\n selectedId,\n onRowClick,\n pagination,\n onPaginationChange,\n sorting = [],\n onSortingChange,\n pageSizeOptions = [10, 25, 50, 100],\n emptyIcon,\n emptyMessage = \"No results found\",\n footer,\n}: PickerModalProps<T>) {\n const totalPages = Math.max(1, Math.ceil(totalItems / pagination.pageSize))\n\n const table = useReactTable({\n data,\n columns,\n pageCount: totalPages,\n state: { pagination, sorting },\n onPaginationChange,\n ...(onSortingChange ? { onSortingChange } : {}),\n getCoreRowModel: getCoreRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableSortingRemoval: false,\n })\n\n const pageSize = table.getState().pagination.pageSize\n\n return (\n <DialogPopup className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogPanel className=\"flex flex-col gap-4\">\n <InputGroup>\n <InputGroupInput\n placeholder={searchPlaceholder}\n value={searchQuery}\n onChange={(e) => onSearch(e.target.value)}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4\" />\n </InputGroupAddon>\n </InputGroup>\n\n {loading ? (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2Icon className=\"text-muted-foreground size-8 animate-spin\" />\n </div>\n ) : (\n <Frame className=\"w-full overflow-hidden\">\n <Table className=\"table-fixed\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className=\"hover:bg-transparent\"\n >\n {headerGroup.headers.map((header) => {\n const columnSize = header.column.getSize()\n return (\n <TableHead\n key={header.id}\n style={\n columnSize\n ? { width: `${columnSize}px` }\n : undefined\n }\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <div\n className=\"flex h-full cursor-pointer select-none items-center justify-between gap-2\"\n onClick={header.column.getToggleSortingHandler()}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" ||\n e.key === \" \"\n ) {\n e.preventDefault()\n header.column.getToggleSortingHandler()?.(e)\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n {(\n {\n asc: (\n <ChevronUpIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-80\"\n />\n ),\n desc: (\n <ChevronDownIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-80\"\n />\n ),\n } as Record<string, React.ReactNode>\n )[header.column.getIsSorted() as string] ?? (\n <ChevronsUpDownIcon\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 opacity-40\"\n />\n )}\n </div>\n ) : (\n flexRender(\n header.column.columnDef.header,\n header.getContext()\n )\n )}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className={cn(\n \"hover:bg-muted/50 cursor-pointer transition-colors\",\n selectedId === row.original.id && \"bg-primary/5\"\n )}\n onClick={() => onRowClick(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"py-12 text-center\"\n >\n <div className=\"text-muted-foreground flex flex-col items-center justify-center text-sm\">\n {emptyIcon}\n <p>{emptyMessage}</p>\n </div>\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n\n {totalItems > 0 && (\n <FrameFooter className=\"p-2\">\n <div className=\"grid grid-cols-[1fr_auto_1fr] items-center gap-x-4\">\n <div className=\"hidden sm:flex items-center gap-2 whitespace-nowrap justify-self-start\">\n <p className=\"text-muted-foreground text-sm\">Viewing</p>\n <Select\n value={(table.getState().pagination.pageIndex + 1).toString()}\n onValueChange={(val) =>\n table.setPageIndex(Number(val) - 1)\n }\n >\n <SelectTrigger\n aria-label=\"Select result range\"\n className=\"w-fit min-w-none\"\n size=\"sm\"\n >\n <SelectValue>\n {(() => {\n const idx = table.getState().pagination.pageIndex\n const start = idx * pageSize + 1\n const end = Math.min((idx + 1) * pageSize, totalItems)\n return `${start}–${end}`\n })()}\n </SelectValue>\n </SelectTrigger>\n <SelectPopup>\n {Array.from({ length: table.getPageCount() }, (_, i) => {\n const pageNum = i + 1\n const start = i * pageSize + 1\n const end = Math.min((i + 1) * pageSize, totalItems)\n return (\n <SelectItem key={pageNum} value={pageNum.toString()}>\n {`${start}–${end}`}\n </SelectItem>\n )\n })}\n </SelectPopup>\n </Select>\n <p className=\"text-muted-foreground text-sm\">\n of{\" \"}\n <strong className=\"font-medium text-foreground\">\n {totalItems}\n </strong>{\" \"}\n results\n </p>\n </div>\n\n <div className=\"flex items-center gap-2 whitespace-nowrap justify-self-center col-start-2\">\n <p className=\"text-muted-foreground text-sm\">Per page</p>\n <Select\n value={pageSize.toString()}\n onValueChange={(val) =>\n table.setPageSize(Number(val))\n }\n >\n <SelectTrigger\n aria-label=\"Rows per page\"\n className=\"w-fit min-w-none\"\n size=\"sm\"\n >\n <span className=\"flex-1 truncate\">{pageSize}</span>\n </SelectTrigger>\n <SelectPopup>\n {pageSizeOptions.map((size) => (\n <SelectItem\n key={size}\n value={size.toString()}\n >\n {size}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </div>\n\n <Pagination className=\"justify-self-end justify-end table-pagination\">\n <PaginationContent className=\"gap-0\">\n <PaginationItem>\n <PaginationPrevious\n className=\"max-sm:*:[svg]:hidden\"\n render={\n <Button\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n />\n </PaginationItem>\n\n {getPageItems(\n table.getState().pagination.pageIndex + 1,\n table.getPageCount()\n ).map((item, index) => (\n <PaginationItem key={index} className=\"hidden sm:block\">\n {item === \"ellipsis\" ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"pagination-ellipsis\"\n >\n <PaginationEllipsis />\n </Button>\n ) : (\n <PaginationLink\n isActive={item === table.getState().pagination.pageIndex + 1}\n size=\"sm\"\n render={\n <Button\n onClick={() => table.setPageIndex(item - 1)}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n >\n {item}\n </PaginationLink>\n )}\n </PaginationItem>\n ))}\n\n <PaginationItem>\n <PaginationNext\n className=\"max-sm:*:[svg]:hidden\"\n render={\n <Button\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n size=\"sm\"\n variant=\"outline\"\n />\n }\n />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n </div>\n </FrameFooter>\n )}\n </Frame>\n )}\n </DialogPanel>\n\n {footer && <DialogFooter>{footer}</DialogFooter>}\n </DialogPopup>\n )\n}\n\nexport default PickerModal\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\"\nimport {\n type ColumnDef,\n type PaginationState,\n type SortingState,\n} from \"@tanstack/react-table\"\nimport {\n DatabaseIcon,\n FileTextIcon,\n XIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogTrigger,\n} from \"../ui/dialog\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport { PickerModal } from \"../PickerModal\"\n\n// ---------------------------------------------------------------------------\n// Types — alignés sur le modèle PHP PageLang\n// ---------------------------------------------------------------------------\n\nexport type PageItem = {\n id: number\n name: string\n url: string\n /** Correspond au champ `published` (boolean) de PageLang */\n published: boolean\n}\n\n/**\n * Référence stable vers une page — ne contient jamais l'URL,\n * qui peut changer. Utiliser `usePageUrl` pour la résolution dynamique.\n */\nexport type PageReference = {\n id: number\n name: string\n url: string\n}\n\nexport type PagePickerValue = {\n type?: \"url\" | \"page\"\n url?: string\n page?: PageReference | null\n}\n\n// ---------------------------------------------------------------------------\n// Config & API helpers\n// ---------------------------------------------------------------------------\n\ntype PagePickerConfig = {\n pagesUrl: string\n langId?: string\n}\n\nconst getEditorConfig = (): PagePickerConfig => {\n const editorEl = document.getElementById(\"editor\")\n return {\n pagesUrl: editorEl?.dataset.pagesUrl || \"/admin/pages/puck/pages\",\n langId: editorEl?.dataset.langId || \"\",\n }\n}\n\nconst fetchPages = async ({\n query,\n filters,\n page = 1,\n limit = 10,\n sortBy,\n sortOrder,\n}: {\n query?: string\n filters?: Record<string, string>\n page?: number\n limit?: number\n sortBy?: string\n sortOrder?: \"asc\" | \"desc\"\n}) => {\n const { pagesUrl, langId } = getEditorConfig()\n\n const params = new URLSearchParams()\n if (query) params.append(\"search\", query)\n if (langId) params.append(\"lang_id\", langId)\n params.append(\"page\", page.toString())\n params.append(\"limit\", limit.toString())\n if (sortBy) params.append(\"sort_by\", sortBy)\n if (sortOrder) params.append(\"sort_order\", sortOrder)\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n params.append(key, value)\n })\n }\n\n const response = await fetch(`${pagesUrl}?${params.toString()}`, {\n credentials: \"same-origin\",\n })\n const data = await response.json()\n\n if (data.success && data.pages) {\n return {\n items: data.pages as PageItem[],\n total: (data.total as number) || data.pages.length,\n }\n }\n\n return { items: [], total: 0 }\n}\n\nconst fetchPageById = async (id: number): Promise<PageItem | null> => {\n try {\n const result = await fetchPages({ filters: { id: id.toString() }, limit: 1 })\n return result.items[0] ?? null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Status badge helper — basé sur le booléen `published` de PageLang\n// ---------------------------------------------------------------------------\n\ntype PublishedBadge = { label: string; dot: string }\n\nconst getPublishedBadge = (published: boolean): PublishedBadge =>\n published\n ? { label: \"Published\", dot: \"bg-emerald-500\" }\n : { label: \"Unpublished\", dot: \"bg-red-500\" }\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VALUE: PagePickerValue = { type: \"page\", page: null }\nconst PAGE_SIZE = 10\n\n// ---------------------------------------------------------------------------\n// PageLibraryModal\n// ---------------------------------------------------------------------------\n\ntype PageLibraryModalProps = {\n value: PageReference | null\n onChange: (page: PageReference) => void\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nconst PageLibraryModal = ({\n value,\n onChange,\n open,\n onOpenChange,\n}: PageLibraryModalProps) => {\n const [pages, setPages] = useState<PageItem[]>([])\n const [loading, setLoading] = useState(false)\n const [totalItems, setTotalItems] = useState(0)\n const [searchQuery, setSearchQuery] = useState(\"\")\n\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: PAGE_SIZE,\n })\n const [sorting, setSorting] = useState<SortingState>([])\n\n const loadPages = useCallback(\n async (\n pageIndex: number,\n pageSize: number,\n query: string,\n sort: SortingState\n ) => {\n setLoading(true)\n try {\n const sortItem = sort[0]\n const result = await fetchPages({\n page: pageIndex + 1,\n limit: pageSize,\n query,\n sortBy: sortItem?.id,\n sortOrder: sortItem ? (sortItem.desc ? \"desc\" : \"asc\") : undefined,\n })\n setPages(result.items)\n setTotalItems(result.total)\n } catch (error) {\n console.error(\"Error loading pages:\", error)\n } finally {\n setLoading(false)\n }\n },\n []\n )\n\n useEffect(() => {\n if (open) {\n loadPages(\n pagination.pageIndex,\n pagination.pageSize,\n searchQuery,\n sorting\n )\n }\n }, [open, pagination, sorting, searchQuery, loadPages])\n\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [])\n\n const handleRowClick = useCallback(\n (page: PageItem) => {\n onChange({ id: page.id, name: page.name, url: page.url })\n onOpenChange(false)\n },\n [onChange, onOpenChange]\n )\n\n const columns = useMemo<ColumnDef<PageItem>[]>(\n () => [\n {\n accessorKey: \"id\",\n header: \"ID\",\n size: 40,\n cell: ({ row }) => (\n <span className=\"text-muted-foreground font-mono text-xs\">\n #{row.getValue(\"id\")}\n </span>\n ),\n },\n {\n accessorKey: \"name\",\n header: \"Name\",\n size: 200,\n cell: ({ row }) => (\n <div className=\"font-medium\">{row.getValue(\"name\")}</div>\n ),\n },\n {\n accessorKey: \"url\",\n header: \"URL\",\n cell: ({ row }) => (\n <div className=\"text-muted-foreground font-mono text-xs truncate\">\n {toRelativeUrl(row.getValue(\"url\"))}\n </div>\n ),\n },\n {\n accessorKey: \"published\",\n header: \"Status\",\n size: 60,\n enableSorting: false,\n cell: ({ row }) => {\n const { label, dot } = getPublishedBadge(row.getValue(\"published\"))\n return (\n <Badge variant=\"outline\">\n <span aria-hidden=\"true\" className={cn(\"size-1.5 rounded-full\", dot)} />\n {label}\n </Badge>\n )\n },\n },\n ],\n []\n )\n\n return (\n <PickerModal<PageItem>\n title=\"Select Page\"\n searchQuery={searchQuery}\n onSearch={handleSearch}\n searchPlaceholder=\"Search pages...\"\n columns={columns}\n data={pages}\n loading={loading}\n totalItems={totalItems}\n selectedId={value?.id}\n onRowClick={handleRowClick}\n pagination={pagination}\n onPaginationChange={setPagination}\n sorting={sorting}\n onSortingChange={setSorting}\n emptyIcon={<FileTextIcon className=\"mb-2 size-12 opacity-20\" />}\n emptyMessage=\"No pages found\"\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// PagePicker (field component)\n// ---------------------------------------------------------------------------\n\nexport type PagePickerProps = {\n value?: PagePickerValue\n onChange: (value: PagePickerValue) => void\n}\n\nexport const PagePicker = ({ value, onChange }: PagePickerProps) => {\n const [open, setOpen] = useState(false)\n const currentValue = value || DEFAULT_VALUE\n\n const displayValue =\n currentValue.type === \"page\" && currentValue.page\n ? currentValue.page.name\n : currentValue.url || \"\"\n\n const hasValue = Boolean(\n (currentValue.type === \"page\" && currentValue.page) ||\n (currentValue.type === \"url\" && currentValue.url)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ type: \"url\", url: e.target.value })\n }\n\n const handlePageChange = (page: PageReference) => {\n onChange({ type: \"page\", page })\n }\n\n const handleClear = () => {\n onChange(DEFAULT_VALUE)\n }\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <InputGroup>\n {currentValue.type === \"page\" && currentValue.page && (\n <InputGroupAddon align=\"inline-start\">\n <span className=\"bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs\">\n #{currentValue.page.id}\n </span>\n </InputGroupAddon>\n )}\n <InputGroupInput\n placeholder=\"https://example.com/\"\n type=\"text\"\n value={displayValue}\n onChange={handleInputChange}\n />\n <InputGroupAddon align=\"inline-end\">\n {hasValue ? (\n <Button\n size=\"icon-xs\"\n variant=\"ghost\"\n onClick={handleClear}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <DialogTrigger\n render={\n <Button size=\"icon-xs\" variant=\"outline\">\n <DatabaseIcon className=\"size-3.5\" />\n </Button>\n }\n />\n )}\n </InputGroupAddon>\n </InputGroup>\n\n <PageLibraryModal\n value={currentValue.page || null}\n onChange={handlePageChange}\n open={open}\n onOpenChange={setOpen}\n />\n </Dialog>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an absolute URL to a relative URL by extracting the pathname.\n * If the URL is already relative, returns it as-is.\n *\n * @example\n * toRelativeUrl(\"https://example.com/page?foo=bar#section\") // \"/page?foo=bar#section\"\n * toRelativeUrl(\"/page\") // \"/page\"\n * toRelativeUrl(\"\") // \"\"\n */\nexport const toRelativeUrl = (url: string): string => {\n if (!url) return \"\"\n if (url.startsWith(\"/\")) return url\n\n try {\n const { pathname, search, hash } = new URL(url)\n return pathname + search + hash\n } catch {\n return url\n }\n}\n\n/**\n * Hook React qui résout dynamiquement l'URL courante d'un `PagePickerValue`.\n *\n * Pour les références de page (`type: \"page\"`), l'URL est récupérée depuis\n * l'API à partir de l'`id` de la page — ce qui garantit que le lien reste\n * valide même si l'URL de la page a été modifiée après la sélection.\n *\n * @example\n * const { url, loading } = usePageUrl(value)\n * return loading ? <Spinner /> : <a href={url}>Lien</a>\n */\nexport const usePageUrl = (\n value?: PagePickerValue\n): { url: string | undefined; loading: boolean } => {\n const [url, setUrl] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n\n const pageId = value?.type === \"page\" ? value.page?.id : undefined\n const directUrl = value?.type === \"url\" ? value.url : undefined\n\n useEffect(() => {\n if (directUrl !== undefined) {\n setUrl(directUrl ? toRelativeUrl(directUrl) : undefined)\n return\n }\n\n if (pageId !== undefined) {\n let cancelled = false\n setLoading(true)\n fetchPageById(pageId)\n .then((page) => {\n if (!cancelled) setUrl(page ? toRelativeUrl(page.url) : undefined)\n })\n .catch(() => {\n if (!cancelled) setUrl(undefined)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n\n setUrl(undefined)\n }, [pageId, directUrl])\n\n return { url, loading }\n}\n\nexport default PagePicker\n","\"use client\";\n\nimport { LinkIcon } from \"lucide-react\";\nimport {\n type ComponentProps,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { Button } from \"../ui/button\";\nimport {\n Popover,\n PopoverPopup,\n PopoverTrigger,\n} from \"../ui/popover\";\nimport {\n PagePicker,\n type PagePickerValue,\n toRelativeUrl,\n} from \"../PagePicker\";\n\ntype RichTextMenuLinkProps = {\n editor: Editor | null;\n};\n\n\nfunction RichTextMenuLink({\n editor,\n ...props\n}: RichTextMenuLinkProps &\n Omit<ComponentProps<\"div\">, keyof RichTextMenuLinkProps>) {\n const [pickerValue, setPickerValue] = useState<PagePickerValue>({\n type: \"url\",\n url: \"\",\n });\n const [open, setOpen] = useState(false);\n const selectionRef = useRef<{ from: number; to: number } | null>(null);\n\n useEffect(() => {\n if (open && editor) {\n const currentHref = editor.getAttributes(\"link\").href ?? \"\";\n setPickerValue({ type: \"url\", url: currentHref });\n }\n }, [open, editor]);\n\n const handleSetLink = useCallback(() => {\n if (!editor) return;\n\n let resolvedUrl = \"\";\n if (pickerValue.type === \"page\" && pickerValue.page?.url) {\n // Page URLs may be absolute — normalise to a relative path.\n resolvedUrl = toRelativeUrl(pickerValue.page.url);\n } else if (pickerValue.type === \"url\") {\n // Keep user-typed URLs as-is (supports external links).\n resolvedUrl = pickerValue.url?.trim() ?? \"\";\n }\n\n const sel = selectionRef.current;\n\n // Single chain = single ProseMirror transaction:\n // restore saved selection → extend mark range → set/unset link\n if (!resolvedUrl) {\n const chain = editor.chain().focus();\n if (sel) chain.setTextSelection(sel);\n chain.extendMarkRange(\"link\").unsetLink().run();\n } else {\n const chain = editor.chain().focus();\n if (sel) chain.setTextSelection(sel);\n chain.extendMarkRange(\"link\").setLink({ href: resolvedUrl }).run();\n }\n\n setOpen(false);\n }, [editor, pickerValue]);\n\n return (\n <div {...props}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n title=\"Link\"\n onPointerDown={() => {\n // Capture the editor's selection BEFORE the popover steals focus.\n // onPointerDown fires before click/focus change, so the\n // ProseMirror selection is still intact at this point.\n if (editor) {\n const { from, to } = editor.state.selection;\n selectionRef.current = { from, to };\n }\n }}\n onClick={(e) => {\n // Prevent the click from bubbling up — same pattern used by\n // Puck's built-in controls (Bold, Italic, etc.).\n e.stopPropagation();\n }}\n className={\n \"inline-flex border h-full aspect-square cursor-pointer items-center p-1.5 justify-center rounded-md transition-colors border-stone-200 bg-white text-black hover:border-stone-300 hover:bg-stone-50\"\n }\n />\n }\n >\n <LinkIcon className=\"size-4\" />\n </PopoverTrigger>\n\n <PopoverPopup\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n className=\"w-80\"\n >\n {/*\n * Puck's EditorInner checks e.relatedTarget.closest(\"[data-puck-rte-menu]\")\n * on blur to decide whether the editor should stay \"active\".\n * Because PopoverPopup renders inside a Portal (at <body> level),\n * it lives OUTSIDE the original [data-puck-rte-menu] wrapper.\n * Adding the attribute here tells Puck the popover is still\n * part of the menu, so it won't clear currentRichText when\n * focus moves to the URL input or the page picker.\n */}\n <div data-puck-rte-menu>\n <div className=\"flex items-center gap-2\">\n <PagePicker value={pickerValue} onChange={setPickerValue} />\n <Button\n size=\"sm\"\n variant=\"default\"\n onClick={handleSetLink}\n className=\"ml-auto h-8.5 sm:h-7.5\"\n >\n OK\n </Button>\n </div>\n </div>\n </PopoverPopup>\n </Popover>\n </div>\n );\n}\n\nexport { RichTextMenuLink };\n","\"use client\"\n\nimport React from \"react\"\nimport { HexColorPicker } from \"react-colorful\"\nimport { Popover, PopoverTrigger, PopoverPopup } from \"../ui/popover\"\nimport { Input } from \"../ui/input\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport type ColorPickerProps = {\n value?: string\n onChange: (value: string) => void\n}\n\nexport const PREDEFINED_COLORS = [\n { name: \"Blue\", value: \"#3B82F6\" },\n { name: \"Purple\", value: \"#8B5CF6\" },\n { name: \"Pink\", value: \"#EC4899\" },\n { name: \"Rose\", value: \"#F43F5E\" },\n { name: \"Red\", value: \"#EF4444\" },\n { name: \"Orange\", value: \"#F97316\" },\n { name: \"Amber\", value: \"#F59E0B\" },\n { name: \"Green\", value: \"#10B981\" },\n]\n\nexport const GRAY_COLORS = [\n { name: \"Black\", value: \"#000000\" },\n { name: \"Gray 900\", value: \"#18181B\" },\n { name: \"Gray 600\", value: \"#52525B\" },\n { name: \"Gray 300\", value: \"#D4D4D8\" },\n { name: \"Gray 200\", value: \"#E4E4E7\" },\n { name: \"Gray 100\", value: \"#F4F4F5\" },\n { name: \"White\", value: \"#FFFFFF\" },\n]\n\nexport type ColorPickerContentProps = {\n value?: string\n onChange: (value: string) => void\n onClear: () => void\n}\n\nexport const ColorPickerContent: React.FC<ColorPickerContentProps> = ({\n value,\n onChange,\n onClear,\n}) => {\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-3\">\n <button\n type=\"button\"\n onClick={onClear}\n className=\"border-border after:bg-destructive relative size-5 cursor-pointer rounded-md border bg-white after:absolute after:inset-0 after:top-1/2 after:left-1/2 after:z-1 after:flex after:h-0.5 after:w-7 after:-translate-x-1/2 after:-translate-y-1/2 after:-rotate-45 after:rounded-full after:content-['']\"\n title=\"Clear color\"\n aria-label=\"Clear color\"\n />\n <div className=\"flex flex-wrap gap-1\">\n {PREDEFINED_COLORS.map((color) => (\n <button\n key={color.value}\n type=\"button\"\n className={cn(\n \"border-primary/20 size-5 cursor-pointer rounded-md border transition-all hover:scale-105\"\n )}\n style={{ backgroundColor: color.value }}\n onClick={() => onChange(color.value)}\n title={color.name}\n aria-label={color.name}\n />\n ))}\n {GRAY_COLORS.map((color) => (\n <button\n key={color.value}\n type=\"button\"\n className={cn(\n \"border-primary/20 size-5 cursor-pointer rounded-md border transition-all hover:scale-105\"\n )}\n style={{ backgroundColor: color.value }}\n onClick={() => onChange(color.value)}\n title={color.name}\n aria-label={color.name}\n />\n ))}\n </div>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"text-xs font-medium\">Custom Color</div>\n <div className=\"flex flex-col gap-2\">\n <HexColorPicker\n color={value || \"#000000\"}\n onChange={onChange}\n className=\"!w-full !h-32 color-picker\"\n />\n <Input\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"Select a color\"\n onKeyDown={(e) => e.stopPropagation()}\n />\n </div>\n </div>\n </div>\n )\n}\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n onChange,\n}) => {\n return (\n <Popover>\n <PopoverTrigger\n className={cn(\n \"border-input text-foreground focus-visible:border-primary hover:bg-accent w-full justify-between gap-2 rounded-lg border bg-white px-3 py-2 text-sm transition-colors\",\n \"flex items-center\"\n )}\n >\n {value ? (\n <>\n <div\n className=\"border-border size-5 rounded-md border\"\n style={{ backgroundColor: value }}\n />\n <span className=\"flex-1 text-left\">{value}</span>\n </>\n ) : (\n <div className=\"flex items-center justify-start gap-2\">\n <div className=\"border-border after:bg-destructive relative size-5 rounded-md border bg-white after:absolute after:inset-0 after:top-1/2 after:left-1/2 after:z-1 after:flex after:h-0.5 after:w-7 after:-translate-x-1/2 after:-translate-y-1/2 after:-rotate-45 after:rounded-full after:content-['']\"></div>\n <span>No color</span>\n </div>\n )}\n <ChevronDownIcon className=\"size-4\" />\n </PopoverTrigger>\n <PopoverPopup align=\"center\" side=\"bottom\" className=\"!w-full\">\n <ColorPickerContent\n value={value}\n onChange={onChange}\n onClear={() => onChange(\"\")}\n />\n </PopoverPopup>\n </Popover>\n )\n}\n\nexport default ColorPicker\n","\"use client\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { BaselineIcon } from \"lucide-react\";\nimport { type ComponentProps, useCallback, useEffect, useRef, useState } from \"react\";\nimport type { Editor } from \"@tiptap/react\";\n\nimport { ColorPickerContent } from \"../ColorPicker\";\nimport {\n Popover,\n PopoverPopup,\n PopoverTrigger,\n} from \"../ui/popover\";\n\ntype RichTextMenuColorPickerProps = {\n editor: Editor | null;\n};\n\n/**\n * Pre-configured tiptap extensions for text color support.\n * Spread this into `tiptap.extensions` in your field config:\n * `extensions: [...richTextMenuColorPickerExtension]`\n */\nconst richTextMenuColorPickerExtension = [TextStyle, Color];\n\nfunction RichTextMenuColorPicker({\n editor,\n ...props\n}: RichTextMenuColorPickerProps &\n Omit<ComponentProps<\"div\">, keyof RichTextMenuColorPickerProps>) {\n const [open, setOpen] = useState(false);\n const selectionRef = useRef<{ from: number; to: number } | null>(null);\n const [localColor, setLocalColor] = useState<string | null>(null);\n\n useEffect(() => {\n if (open && editor) {\n setLocalColor(editor.getAttributes(\"textStyle\").color ?? null);\n }\n }, [open, editor]);\n\n const handleColorChange = useCallback(\n (color: string) => {\n setLocalColor(color || null);\n\n if (!editor) return;\n\n // Do NOT call .focus() here: it steals focus from the HexColorPicker\n // during drag and breaks the drag interaction. ProseMirror commands\n // apply to the editor state regardless of DOM focus.\n const chain = editor.chain();\n if (selectionRef.current) chain.setTextSelection(selectionRef.current);\n\n if (color === \"\") {\n chain.unsetColor().run();\n } else {\n chain.setColor(color).run();\n }\n },\n [editor],\n );\n\n return (\n <div {...props}>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n title=\"Text color\"\n onPointerDown={() => {\n // Capture the editor's selection BEFORE the popover steals focus.\n if (editor) {\n const { from, to } = editor.state.selection;\n selectionRef.current = { from, to };\n }\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n className={\n \"inline-flex border h-full aspect-square cursor-pointer border-stone-200 bg-white items-center p-1.5 text-black hover:border-stone-300 hover:bg-stone-50 justify-center rounded-md transition-colors hover:bg-primary-500 hover:text-primary-500\"\n }\n />\n }\n >\n <BaselineIcon className=\"size-4.5\" />\n </PopoverTrigger>\n\n <PopoverPopup\n side=\"bottom\"\n align=\"start\"\n sideOffset={8}\n className=\"max-w-54\">\n {/*\n * Adding data-puck-rte-menu tells Puck the popover is still\n * part of the menu, so it won't clear currentRichText when\n * focus moves inside the color picker.\n */}\n <div data-puck-rte-menu>\n <ColorPickerContent\n value={localColor ?? undefined}\n onChange={handleColorChange}\n onClear={() => handleColorChange(\"\")}\n />\n </div>\n </PopoverPopup>\n </Popover>\n </div>\n );\n}\n\nexport { RichTextMenuColorPicker, richTextMenuColorPickerExtension };\n","\"use client\"\n\nimport React, { useState, useEffect, useCallback, useMemo } from \"react\"\nimport { type ColumnDef, type PaginationState, type SortingState } from \"@tanstack/react-table\"\nimport { Button } from \"../ui/button\"\nimport {\n Dialog,\n DialogTrigger,\n} from \"../ui/dialog\"\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"../ui/input-group\"\nimport { cn } from \"../../lib/utils\"\nimport {\n DatabaseIcon,\n FileIcon,\n Loader2Icon,\n UploadIcon,\n XIcon,\n} from \"lucide-react\"\nimport { Badge } from \"../ui/badge\"\nimport { PickerModal } from \"../PickerModal\"\n\nexport type MediaItem = {\n id: number\n name: string\n url: string\n thumbnail: string\n type: string\n}\n\n/**\n * Référence stable vers un média — ne contient jamais l'URL,\n * qui peut changer. Utiliser `useMediaUrl` pour la résolution dynamique.\n */\nexport type MediaReference = {\n id: number\n name: string\n thumbnail?: string\n}\n\nexport type MediaPickerValue = {\n type?: \"url\" | \"media\"\n url?: string\n media?: MediaReference | null\n}\n\ntype MediaPickerConfig = {\n mediasUrl: string\n uploadUrl: string\n langId?: string\n}\n\nconst getEditorConfig = (): MediaPickerConfig => {\n const editorEl = document.getElementById(\"editor\")\n return {\n mediasUrl: editorEl?.dataset.mediasUrl || \"/admin/pages/puck/medias\",\n uploadUrl:\n editorEl?.dataset.uploadUrl || \"/admin/pages/puck/medias/upload\",\n langId: editorEl?.dataset.langId || \"\",\n }\n}\n\nconst fetchMedias = async ({\n query,\n filters,\n page = 1,\n limit = 10,\n sortBy,\n sortOrder,\n}: {\n query?: string\n filters?: Record<string, string>\n page?: number\n limit?: number\n sortBy?: string\n sortOrder?: \"asc\" | \"desc\"\n}) => {\n const { mediasUrl, langId } = getEditorConfig()\n\n const params = new URLSearchParams()\n if (query) params.append(\"search\", query)\n if (langId) params.append(\"lang_id\", langId)\n params.append(\"page\", page.toString())\n params.append(\"limit\", limit.toString())\n if (sortBy) params.append(\"sort_by\", sortBy)\n if (sortOrder) params.append(\"sort_order\", sortOrder)\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n params.append(key, value)\n })\n }\n\n const response = await fetch(`${mediasUrl}?${params.toString()}`, {\n credentials: \"same-origin\",\n })\n const data = await response.json()\n\n if (data.success && data.medias) {\n return {\n items: data.medias as MediaItem[],\n total: data.total || data.medias.length,\n }\n }\n\n return { items: [], total: 0 }\n}\n\nconst fetchMediaById = async (id: number): Promise<MediaItem | null> => {\n try {\n const result = await fetchMedias({ filters: { id: id.toString() }, limit: 1 })\n return result.items[0] ?? null\n } catch {\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// MediaUploadZone\n// ---------------------------------------------------------------------------\n\ntype MediaUploadZoneProps = {\n onUploadSuccess?: (media: MediaItem) => void\n acceptedTypes?: string\n maxSize?: number\n}\n\nconst MediaUploadZone = ({\n onUploadSuccess,\n acceptedTypes = \"image/*,video/*,application/pdf\",\n maxSize = 10,\n}: MediaUploadZoneProps) => {\n const [uploading, setUploading] = useState(false)\n const [uploadProgress, setUploadProgress] = useState(0)\n const [dragActive, setDragActive] = useState(false)\n const [uploadQueue, setUploadQueue] = useState<{\n total: number\n completed: number\n }>({ total: 0, completed: 0 })\n\n const getAcceptedTypesLabel = () => {\n const parts: string[] = []\n if (acceptedTypes.includes(\"image\")) parts.push(\"Images\")\n if (acceptedTypes.includes(\"video\")) parts.push(\"Videos\")\n if (acceptedTypes.includes(\"pdf\")) parts.push(\"PDF\")\n if (acceptedTypes === \"*\" || acceptedTypes.includes(\"*/*\")) return \"All files\"\n return parts.length > 0 ? parts.join(\", \") : acceptedTypes\n }\n\n const handleUploadSingle = useCallback(\n (file: File): Promise<MediaItem | null> => {\n return new Promise((resolve, reject) => {\n try {\n const { uploadUrl, langId } = getEditorConfig()\n const csrfToken = document.querySelector(\n 'meta[name=\"csrf-token\"]'\n ) as HTMLMetaElement\n\n const formData = new FormData()\n formData.append(\"file\", file)\n if (langId) formData.append(\"lang_id\", langId)\n\n const xhr = new XMLHttpRequest()\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n setUploadProgress((e.loaded / e.total) * 100)\n }\n })\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText)\n if (response.success && response.media) {\n resolve(response.media)\n } else {\n reject(new Error(\"Upload failed\"))\n }\n } else {\n reject(new Error(\"Error during upload\"))\n }\n })\n\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Error during upload\"))\n })\n\n xhr.open(\"POST\", uploadUrl)\n if (csrfToken) {\n xhr.setRequestHeader(\"X-CSRF-TOKEN\", csrfToken.content)\n }\n xhr.send(formData)\n } catch (error) {\n reject(error)\n }\n })\n },\n []\n )\n\n const handleUpload = useCallback(\n async (files: FileList | File[]) => {\n const fileArray = Array.from(files)\n if (fileArray.length === 0) return\n\n setUploading(true)\n setUploadQueue({ total: fileArray.length, completed: 0 })\n\n try {\n for (let i = 0; i < fileArray.length; i++) {\n const file = fileArray[i]\n setUploadProgress(0)\n\n try {\n const media = await handleUploadSingle(file)\n if (media) {\n onUploadSuccess?.(media)\n }\n } catch (error) {\n console.error(`Error uploading ${file.name}:`, error)\n alert(`Error uploading ${file.name}`)\n }\n\n setUploadQueue((prev) => ({\n ...prev,\n completed: prev.completed + 1,\n }))\n }\n } finally {\n setUploading(false)\n setUploadProgress(0)\n setUploadQueue({ total: 0, completed: 0 })\n }\n },\n [handleUploadSingle, onUploadSuccess]\n )\n\n const handleDrag = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.type === \"dragenter\" || e.type === \"dragover\") {\n setDragActive(true)\n } else if (e.type === \"dragleave\") {\n setDragActive(false)\n }\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setDragActive(false)\n\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n handleUpload(e.dataTransfer.files)\n }\n },\n [handleUpload]\n )\n\n const handleFileInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n handleUpload(e.target.files)\n }\n },\n [handleUpload]\n )\n\n const handleClick = useCallback(() => {\n if (!uploading) {\n document.getElementById(\"media-upload-input\")?.click()\n }\n }, [uploading])\n\n return (\n <div className=\"w-full\">\n <div\n onDragEnter={handleDrag}\n onDragLeave={handleDrag}\n onDragOver={handleDrag}\n onDrop={handleDrop}\n className={cn(\n \"border-border hover:border-primary/50 flex cursor-pointer flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white p-6 transition-colors\",\n dragActive && \"border-primary bg-primary/5\",\n uploading && \"pointer-events-none opacity-60\"\n )}\n onClick={handleClick}\n >\n {uploading ? (\n <div className=\"flex flex-col items-center gap-2\">\n <Loader2Icon className=\"text-primary size-6 animate-spin\" />\n <div className=\"text-sm font-medium\">\n {uploadQueue.total > 1\n ? `Uploading file ${uploadQueue.completed + 1} of ${uploadQueue.total}`\n : \"Uploading...\"}\n </div>\n <div className=\"bg-muted h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{ width: `${uploadProgress}%` }}\n />\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {Math.round(uploadProgress)}%\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-2\">\n <UploadIcon className=\"text-muted-foreground size-8\" />\n <div className=\"text-sm font-medium\">\n Drop files or click to upload\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {getAcceptedTypesLabel()} up to {maxSize}MB\n </div>\n </div>\n )}\n </div>\n <input\n id=\"media-upload-input\"\n type=\"file\"\n accept={acceptedTypes}\n onChange={handleFileInput}\n className=\"hidden\"\n disabled={uploading}\n multiple\n />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// MediaPreview\n// ---------------------------------------------------------------------------\n\ntype MediaPreviewProps = {\n media: MediaItem\n className?: string\n}\n\nconst MediaPreview = ({ media, className }: MediaPreviewProps) => {\n const isVideo = media.type.toLowerCase().startsWith(\"video/\")\n\n if (isVideo) {\n return (\n <video\n src={media.url}\n className={cn(\"h-auto w-full aspect-square border border-border rounded-md object-cover\", className)}\n controls\n preload=\"metadata\"\n />\n )\n }\n\n return (\n <img\n src={media.thumbnail}\n alt={media.name}\n className={cn(\"h-auto w-full aspect-square border border-border rounded-md object-cover\", className)}\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VALUE: MediaPickerValue = { type: \"media\", media: null }\nconst PAGE_SIZE = 10\n\n// ---------------------------------------------------------------------------\n// MediaLibraryModal\n// ---------------------------------------------------------------------------\n\ntype MediaLibraryModalProps = {\n value: MediaReference | null\n onChange: (media: MediaItem) => void\n mediaType?: string\n open: boolean\n onOpenChange: (open: boolean) => void\n acceptedTypes?: string\n maxSize?: number\n}\n\nconst MediaLibraryModal = ({\n value,\n onChange,\n mediaType,\n open,\n onOpenChange,\n acceptedTypes,\n maxSize,\n}: MediaLibraryModalProps) => {\n const [medias, setMedias] = useState<MediaItem[]>([])\n const [loading, setLoading] = useState(false)\n const [totalItems, setTotalItems] = useState(0)\n const [searchQuery, setSearchQuery] = useState(\"\")\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: PAGE_SIZE,\n })\n const [sorting, setSorting] = useState<SortingState>([])\n\n const loadMedias = useCallback(\n async (pageIndex: number, pageSize: number, query?: string, sort: SortingState = []) => {\n setLoading(true)\n try {\n const sortItem = sort[0]\n const result = await fetchMedias({\n page: pageIndex + 1,\n limit: pageSize,\n query,\n sortBy: sortItem?.id,\n sortOrder: sortItem ? (sortItem.desc ? \"desc\" : \"asc\") : undefined,\n filters: mediaType ? { type: mediaType } : undefined,\n })\n setMedias(result.items)\n setTotalItems(result.total)\n } catch (error) {\n console.error(\"Error loading medias:\", error)\n } finally {\n setLoading(false)\n }\n },\n [mediaType]\n )\n\n useEffect(() => {\n if (open) {\n loadMedias(pagination.pageIndex, pagination.pageSize, searchQuery, sorting)\n }\n }, [open, pagination, sorting, searchQuery, loadMedias])\n\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n }, [])\n\n const handleRowClick = useCallback(\n (media: MediaItem) => {\n onChange(media)\n onOpenChange(false)\n },\n [onChange, onOpenChange]\n )\n\n const handleUploadSuccess = useCallback(\n async (_media: MediaItem) => {\n await loadMedias(0, pagination.pageSize, searchQuery, sorting)\n setPagination((prev) => ({ ...prev, pageIndex: 0 }))\n },\n [loadMedias, pagination.pageSize, searchQuery, sorting]\n )\n\n const columns = useMemo<ColumnDef<MediaItem>[]>(\n () => [\n {\n id: \"thumbnail\",\n header: \"Preview\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <MediaPreview media={row.original} className=\"size-12\" />\n ),\n },\n {\n accessorKey: \"name\",\n header: \"Name\",\n cell: ({ row }) => (\n <div className=\"font-medium\">{row.getValue(\"name\")}</div>\n ),\n },\n {\n accessorKey: \"type\",\n header: \"Type\",\n size: 140,\n cell: ({ row }) => (\n <Badge variant=\"outline\">{row.getValue(\"type\")}</Badge>\n ),\n },\n ],\n []\n )\n\n return (\n <PickerModal<MediaItem>\n title=\"Select Media\"\n searchQuery={searchQuery}\n onSearch={handleSearch}\n columns={columns}\n data={medias}\n loading={loading}\n totalItems={totalItems}\n selectedId={value?.id}\n onRowClick={handleRowClick}\n pagination={pagination}\n onPaginationChange={setPagination}\n sorting={sorting}\n onSortingChange={setSorting}\n emptyIcon={<FileIcon className=\"mb-2 size-12 opacity-20\" />}\n emptyMessage=\"No media found\"\n footer={\n <MediaUploadZone\n onUploadSuccess={handleUploadSuccess}\n acceptedTypes={acceptedTypes}\n maxSize={maxSize}\n />\n }\n />\n )\n}\n\n// ---------------------------------------------------------------------------\n// MediaPicker (field component)\n// ---------------------------------------------------------------------------\n\nexport type MediaPickerProps = {\n value?: MediaPickerValue\n onChange: (value: MediaPickerValue) => void\n mediaType?: string\n acceptedTypes?: string\n maxSize?: number\n}\n\nexport const MediaPicker = ({\n value,\n onChange,\n mediaType,\n acceptedTypes = \"image/*,video/*,application/pdf\",\n maxSize = 10,\n}: MediaPickerProps) => {\n const [open, setOpen] = useState(false)\n const currentValue = value || DEFAULT_VALUE\n\n const displayValue =\n currentValue.type === \"media\" && currentValue.media\n ? currentValue.media.name\n : currentValue.url || \"\"\n\n const hasValue = Boolean(\n (currentValue.type === \"media\" && currentValue.media) ||\n (currentValue.type === \"url\" && currentValue.url)\n )\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ type: \"url\", url: e.target.value })\n }\n\n const handleMediaChange = (media: MediaItem) => {\n onChange({\n type: \"media\",\n media: { id: media.id, name: media.name, thumbnail: media.thumbnail },\n })\n }\n\n const handleClear = () => {\n onChange(DEFAULT_VALUE)\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <Dialog open={open} onOpenChange={setOpen}>\n <div className=\"flex items-center gap-2\">\n <InputGroup>\n\n {currentValue.type === \"media\" && currentValue.media?.thumbnail && (\n <InputGroupAddon align=\"inline-start\" className=\"pl-1.5\">\n <img\n src={currentValue.media.thumbnail}\n alt={currentValue.media.name}\n className={cn(\"max-h-12 my-1.5 aspect-square border border-border rounded-md object-cover\")}\n />\n </InputGroupAddon>\n )}\n\n <InputGroupInput\n placeholder=\"https://example.com/image.jpg\"\n type=\"text\"\n value={displayValue}\n onChange={handleInputChange}\n />\n <InputGroupAddon align=\"inline-end\">\n {hasValue ? (\n <Button\n size=\"icon-xs\"\n variant=\"ghost\"\n onClick={handleClear}\n >\n <XIcon aria-hidden=\"true\" />\n </Button>\n ) : (\n <DialogTrigger\n render={\n <Button size=\"icon-xs\" variant=\"outline\">\n <DatabaseIcon className=\"size-3.5\" />\n </Button>\n }\n />\n )}\n </InputGroupAddon>\n </InputGroup>\n </div>\n\n <MediaLibraryModal\n value={currentValue.media || null}\n onChange={handleMediaChange}\n mediaType={mediaType}\n open={open}\n onOpenChange={setOpen}\n acceptedTypes={acceptedTypes}\n maxSize={maxSize}\n />\n </Dialog>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Retourne l'URL directe si le type est \"url\".\n * Pour les références média (`type: \"media\"`), utiliser `useMediaUrl` à la place.\n */\nexport const getMediaUrl = (value?: MediaPickerValue): string | undefined => {\n if (!value) return undefined\n if (value.type === \"url\") return value.url\n return undefined\n}\n\n/**\n * Hook React qui résout dynamiquement l'URL courante d'un `MediaPickerValue`.\n *\n * Pour les références média (`type: \"media\"`), l'URL est récupérée depuis\n * l'API à partir de l'`id` du média — ce qui garantit que le lien reste\n * valide même si l'URL du fichier a été modifiée après la sélection.\n *\n * @example\n * const { url, loading } = useMediaUrl(value)\n * return loading ? <Spinner /> : <img src={url} />\n */\nexport const useMediaUrl = (\n value?: MediaPickerValue\n): { url: string | undefined; loading: boolean } => {\n const [url, setUrl] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n\n const mediaId = value?.type === \"media\" ? value.media?.id : undefined\n const directUrl = value?.type === \"url\" ? value.url : undefined\n\n useEffect(() => {\n if (directUrl !== undefined) {\n setUrl(directUrl || undefined)\n return\n }\n\n if (mediaId !== undefined) {\n let cancelled = false\n setLoading(true)\n fetchMediaById(mediaId)\n .then((media) => {\n if (!cancelled) setUrl(media ? media.url : undefined)\n })\n .catch(() => {\n if (!cancelled) setUrl(undefined)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n\n setUrl(undefined)\n }, [mediaId, directUrl])\n\n return { url, loading }\n}\n\nexport default MediaPicker\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nconst MenuCreateHandle = MenuPrimitive.createHandle;\n\nconst Menu = MenuPrimitive.Root;\n\nconst MenuPortal = MenuPrimitive.Portal;\n\nfunction MenuTrigger(props: MenuPrimitive.Trigger.Props) {\n return <MenuPrimitive.Trigger data-slot=\"menu-trigger\" {...props} />;\n}\n\nfunction MenuPopup({\n children,\n className,\n sideOffset = 4,\n align = \"center\",\n alignOffset,\n side = \"bottom\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n side?: MenuPrimitive.Positioner.Props[\"side\"];\n}) {\n return (\n <MenuPrimitive.Portal>\n <MenuPrimitive.Positioner\n align={align}\n alignOffset={alignOffset}\n className=\"z-50\"\n data-slot=\"menu-positioner\"\n side={side}\n sideOffset={sideOffset}\n >\n <MenuPrimitive.Popup\n className={cn(\n \"relative flex not-[class*='w-']:min-w-32 origin-(--transform-origin) rounded-lg border bg-popover not-dark:bg-clip-padding shadow-lg/5 outline-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] focus:outline-none dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n className,\n )}\n data-slot=\"menu-popup\"\n {...props}\n >\n <div className=\"max-h-(--available-height) w-full overflow-y-auto p-1\">\n {children}\n </div>\n </MenuPrimitive.Popup>\n </MenuPrimitive.Positioner>\n </MenuPrimitive.Portal>\n );\n}\n\nfunction MenuGroup(props: MenuPrimitive.Group.Props) {\n return <MenuPrimitive.Group data-slot=\"menu-group\" {...props} />;\n}\n\nfunction MenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: MenuPrimitive.Item.Props & {\n inset?: boolean;\n variant?: \"default\" | \"destructive\";\n}) {\n return (\n <MenuPrimitive.Item\n className={cn(\n \"[&>svg]:-mx-0.5 flex min-h-8 cursor-default select-none items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-inset:ps-8 data-[variant=destructive]:text-destructive-foreground data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&>svg:not([class*='opacity-'])]:opacity-80 [&>svg:not([class*='size-'])]:size-4.5 sm:[&>svg:not([class*='size-'])]:size-4 [&>svg]:pointer-events-none [&>svg]:shrink-0\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-item\"\n data-variant={variant}\n {...props}\n />\n );\n}\n\nfunction MenuCheckboxItem({\n className,\n children,\n checked,\n variant = \"default\",\n ...props\n}: MenuPrimitive.CheckboxItem.Props & {\n variant?: \"default\" | \"switch\";\n}) {\n return (\n <MenuPrimitive.CheckboxItem\n checked={checked}\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default items-center gap-2 rounded-sm py-1 ps-2 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n variant === \"switch\"\n ? \"grid-cols-[1fr_auto] gap-4 pe-1.5\"\n : \"grid-cols-[1rem_1fr] pe-4\",\n className,\n )}\n data-slot=\"menu-checkbox-item\"\n {...props}\n >\n {variant === \"switch\" ? (\n <>\n <span className=\"col-start-1\">{children}</span>\n <MenuPrimitive.CheckboxItemIndicator\n className=\"inset-shadow-[0_1px_--theme(--color-black/6%)] inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(4)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(3)]\"\n keepMounted\n >\n <span className=\"pointer-events-none block aspect-square h-full in-[[data-slot=menu-checkbox-item][data-checked]]:origin-[var(--thumb-size)_50%] origin-left in-[[data-slot=menu-checkbox-item][data-checked]]:translate-x-[calc(var(--thumb-size)-4px)] in-[[data-slot=menu-checkbox-item]:active]:not-data-disabled:scale-x-110 in-[[data-slot=menu-checkbox-item]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.10)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s]\" />\n </MenuPrimitive.CheckboxItemIndicator>\n </>\n ) : (\n <>\n <MenuPrimitive.CheckboxItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.CheckboxItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </>\n )}\n </MenuPrimitive.CheckboxItem>\n );\n}\n\nfunction MenuRadioGroup(props: MenuPrimitive.RadioGroup.Props) {\n return <MenuPrimitive.RadioGroup data-slot=\"menu-radio-group\" {...props} />;\n}\n\nfunction MenuRadioItem({\n className,\n children,\n ...props\n}: MenuPrimitive.RadioItem.Props) {\n return (\n <MenuPrimitive.RadioItem\n className={cn(\n \"grid min-h-8 in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-highlighted:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n data-slot=\"menu-radio-item\"\n {...props}\n >\n <MenuPrimitive.RadioItemIndicator className=\"col-start-1\">\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </MenuPrimitive.RadioItemIndicator>\n <span className=\"col-start-2\">{children}</span>\n </MenuPrimitive.RadioItem>\n );\n}\n\nfunction MenuGroupLabel({\n className,\n inset,\n ...props\n}: MenuPrimitive.GroupLabel.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.GroupLabel\n className={cn(\n \"px-2 py-1.5 font-medium text-muted-foreground text-xs data-inset:ps-9 sm:data-inset:ps-8\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-label\"\n {...props}\n />\n );\n}\n\nfunction MenuSeparator({ className, ...props }: MenuPrimitive.Separator.Props) {\n return (\n <MenuPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"menu-separator\"\n {...props}\n />\n );\n}\n\nfunction MenuShortcut({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n className={cn(\n \"ms-auto font-medium font-sans text-muted-foreground/72 text-xs tracking-widest\",\n className,\n )}\n data-slot=\"menu-shortcut\"\n {...props}\n />\n );\n}\n\nfunction MenuSub(props: MenuPrimitive.SubmenuRoot.Props) {\n return <MenuPrimitive.SubmenuRoot data-slot=\"menu-sub\" {...props} />;\n}\n\nfunction MenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n inset?: boolean;\n}) {\n return (\n <MenuPrimitive.SubmenuTrigger\n className={cn(\n \"flex min-h-8 items-center gap-2 rounded-sm px-2 py-1 text-base text-foreground outline-none data-disabled:pointer-events-none data-highlighted:bg-accent data-popup-open:bg-accent data-inset:ps-8 data-highlighted:text-accent-foreground data-popup-open:text-accent-foreground data-disabled:opacity-64 sm:min-h-7 sm:text-sm [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className,\n )}\n data-inset={inset}\n data-slot=\"menu-sub-trigger\"\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"-me-0.5 ms-auto opacity-80\" />\n </MenuPrimitive.SubmenuTrigger>\n );\n}\n\nfunction MenuSubPopup({\n className,\n sideOffset = 0,\n alignOffset,\n align = \"start\",\n ...props\n}: MenuPrimitive.Popup.Props & {\n align?: MenuPrimitive.Positioner.Props[\"align\"];\n sideOffset?: MenuPrimitive.Positioner.Props[\"sideOffset\"];\n alignOffset?: MenuPrimitive.Positioner.Props[\"alignOffset\"];\n}) {\n const defaultAlignOffset = align !== \"center\" ? -5 : undefined;\n\n return (\n <MenuPopup\n align={align}\n alignOffset={alignOffset ?? defaultAlignOffset}\n className={className}\n data-slot=\"menu-sub-content\"\n side=\"inline-end\"\n sideOffset={sideOffset}\n {...props}\n />\n );\n}\n\nexport {\n MenuCreateHandle,\n MenuCreateHandle as DropdownMenuCreateHandle,\n Menu,\n Menu as DropdownMenu,\n MenuPortal,\n MenuPortal as DropdownMenuPortal,\n MenuTrigger,\n MenuTrigger as DropdownMenuTrigger,\n MenuPopup,\n MenuPopup as DropdownMenuContent,\n MenuGroup,\n MenuGroup as DropdownMenuGroup,\n MenuItem,\n MenuItem as DropdownMenuItem,\n MenuCheckboxItem,\n MenuCheckboxItem as DropdownMenuCheckboxItem,\n MenuRadioGroup,\n MenuRadioGroup as DropdownMenuRadioGroup,\n MenuRadioItem,\n MenuRadioItem as DropdownMenuRadioItem,\n MenuGroupLabel,\n MenuGroupLabel as DropdownMenuLabel,\n MenuSeparator,\n MenuSeparator as DropdownMenuSeparator,\n MenuShortcut,\n MenuShortcut as DropdownMenuShortcut,\n MenuSub,\n MenuSub as DropdownMenuSub,\n MenuSubTrigger,\n MenuSubTrigger as DropdownMenuSubTrigger,\n MenuSubPopup,\n MenuSubPopup as DropdownMenuSubContent,\n};\n","import { Separator as SeparatorPrimitive } from \"@base-ui/react/separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n ...props\n}: SeparatorPrimitive.Props) {\n return (\n <SeparatorPrimitive\n data-slot=\"separator\"\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\";\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Switch({ className, ...props }: SwitchPrimitive.Root.Props) {\n return (\n <SwitchPrimitive.Root\n className={cn(\n \"inline-flex h-[calc(var(--thumb-size)+2px)] w-[calc(var(--thumb-size)*2-2px)] shrink-0 items-center rounded-full p-px outline-none transition-[background-color,box-shadow] duration-200 [--thumb-size:--spacing(5)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-64 sm:[--thumb-size:--spacing(4)]\",\n className,\n )}\n data-slot=\"switch\"\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n \"pointer-events-none block aspect-square h-full origin-left in-[[role=switch]:active,[data-slot=label]:active,[data-slot=field-label]:active]:not-data-disabled:scale-x-110 in-[[role=switch]:active,[data-slot=label]:active,[data-slot=field-label]:active]:rounded-[var(--thumb-size)/calc(var(--thumb-size)*1.1)] rounded-(--thumb-size) bg-background shadow-sm/5 will-change-transform [transition:translate_.15s,border-radius_.15s,scale_.1s_.1s,transform-origin_.15s] data-checked:origin-[var(--thumb-size)_50%] data-checked:translate-x-[calc(var(--thumb-size)-4px)]\",\n )}\n data-slot=\"switch-thumb\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","\"use client\"\n\nimport { Toast } from \"@base-ui/react/toast\"\nimport {\n CircleAlertIcon,\n CircleCheckIcon,\n InfoIcon,\n LoaderCircleIcon,\n TriangleAlertIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nconst toastManager = Toast.createToastManager()\nconst anchoredToastManager = Toast.createToastManager()\n\nconst TOAST_ICONS = {\n error: CircleAlertIcon,\n info: InfoIcon,\n loading: LoaderCircleIcon,\n success: CircleCheckIcon,\n warning: TriangleAlertIcon,\n} as const\n\ntype ToastPosition =\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\"\n\ninterface ToastProviderProps extends Toast.Provider.Props {\n position?: ToastPosition\n}\n\nfunction ToastProvider({\n children,\n position = \"bottom-right\",\n ...props\n}: ToastProviderProps) {\n return (\n <Toast.Provider toastManager={toastManager} {...props}>\n {children}\n <Toasts position={position} />\n </Toast.Provider>\n )\n}\n\nfunction Toasts({ position = \"bottom-right\" }: { position: ToastPosition }) {\n const { toasts } = Toast.useToastManager()\n const isTop = position.startsWith(\"top\")\n\n return (\n <Toast.Portal data-slot=\"toast-portal\">\n <Toast.Viewport\n className={cn(\n \"fixed z-50 mx-auto flex w-[calc(100%-var(--toast-inset)*2)] max-w-90 [--toast-inset:--spacing(4)] sm:[--toast-inset:--spacing(8)]\",\n // Vertical positioning\n \"data-[position*=top]:top-(--toast-inset)\",\n \"data-[position*=bottom]:bottom-(--toast-inset)\",\n // Horizontal positioning\n \"data-[position*=left]:left-(--toast-inset)\",\n \"data-[position*=right]:right-(--toast-inset)\",\n \"data-[position*=center]:left-1/2 data-[position*=center]:-translate-x-1/2\"\n )}\n data-position={position}\n data-slot=\"toast-viewport\"\n >\n {toasts.map((toast) => {\n const Icon = toast.type\n ? TOAST_ICONS[toast.type as keyof typeof TOAST_ICONS]\n : null\n\n return (\n <Toast.Root\n className={cn(\n \"bg-popover text-popover-foreground absolute z-[calc(9999-var(--toast-index))] h-(--toast-calc-height) w-full rounded-lg border shadow-lg/5 select-none [transition:transform_.5s_cubic-bezier(.22,1,.36,1),opacity_.5s,height_.15s] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n // Base positioning using data-position\n \"data-[position*=right]:right-0 data-[position*=right]:left-auto\",\n \"data-[position*=left]:right-auto data-[position*=left]:left-0\",\n \"data-[position*=center]:right-0 data-[position*=center]:left-0\",\n \"data-[position*=top]:top-0 data-[position*=top]:bottom-auto data-[position*=top]:origin-top\",\n \"data-[position*=bottom]:top-auto data-[position*=bottom]:bottom-0 data-[position*=bottom]:origin-bottom\",\n // Gap fill for hover\n \"after:absolute after:left-0 after:h-[calc(var(--toast-gap)+1px)] after:w-full\",\n \"data-[position*=top]:after:top-full\",\n \"data-[position*=bottom]:after:bottom-full\",\n // Define some variables\n \"[--toast-calc-height:var(--toast-frontmost-height,var(--toast-height))] [--toast-gap:--spacing(3)] [--toast-peek:--spacing(3)] [--toast-scale:calc(max(0,1-(var(--toast-index)*.1)))] [--toast-shrink:calc(1-var(--toast-scale))]\",\n // Define offset-y variable\n \"data-[position*=top]:[--toast-calc-offset-y:calc(var(--toast-offset-y)+var(--toast-index)*var(--toast-gap)+var(--toast-swipe-movement-y))]\",\n \"data-[position*=bottom]:[--toast-calc-offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--toast-gap)*-1+var(--toast-swipe-movement-y))]\",\n // Default state transform\n \"data-[position*=top]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)+(var(--toast-index)*var(--toast-peek))+(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]\",\n \"data-[position*=bottom]:transform-[translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-(var(--toast-index)*var(--toast-peek))-(var(--toast-shrink)*var(--toast-calc-height))))_scale(var(--toast-scale))]\",\n // Limited state\n \"data-limited:opacity-0\",\n // Expanded state\n \"data-expanded:h-(--toast-height)\",\n \"data-position:data-expanded:transform-[translateX(var(--toast-swipe-movement-x))_translateY(var(--toast-calc-offset-y))]\",\n // Starting and ending animations\n \"data-[position*=top]:data-starting-style:transform-[translateY(calc(-100%-var(--toast-inset)))]\",\n \"data-[position*=bottom]:data-starting-style:transform-[translateY(calc(100%+var(--toast-inset)))]\",\n \"data-ending-style:opacity-0\",\n // Ending animations (direction-aware)\n \"data-ending-style:not-data-limited:not-data-swipe-direction:transform-[translateY(calc(100%+var(--toast-inset)))]\",\n \"data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]\",\n \"data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]\",\n // Ending animations (expanded)\n \"data-expanded:data-ending-style:data-[swipe-direction=left]:transform-[translateX(calc(var(--toast-swipe-movement-x)-100%-var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=right]:transform-[translateX(calc(var(--toast-swipe-movement-x)+100%+var(--toast-inset)))_translateY(var(--toast-calc-offset-y))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=up]:transform-[translateY(calc(var(--toast-swipe-movement-y)-100%-var(--toast-inset)))]\",\n \"data-expanded:data-ending-style:data-[swipe-direction=down]:transform-[translateY(calc(var(--toast-swipe-movement-y)+100%+var(--toast-inset)))]\"\n )}\n data-position={position}\n key={toast.id}\n swipeDirection={\n position.includes(\"center\")\n ? [isTop ? \"up\" : \"down\"]\n : position.includes(\"left\")\n ? [\"left\", isTop ? \"up\" : \"down\"]\n : [\"right\", isTop ? \"up\" : \"down\"]\n }\n toast={toast}\n >\n <Toast.Content className=\"pointer-events-auto flex items-center justify-between gap-1.5 overflow-hidden px-3.5 py-3 text-sm transition-opacity duration-250 data-behind:pointer-events-none data-behind:opacity-0 data-expanded:opacity-100\">\n <div className=\"flex gap-2\">\n {Icon && (\n <div\n className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg]:h-lh [&>svg]:w-4\"\n data-slot=\"toast-icon\"\n >\n <Icon className=\"in-data-[type=error]:text-destructive in-data-[type=info]:text-info in-data-[type=success]:text-success in-data-[type=warning]:text-warning in-data-[type=loading]:animate-spin in-data-[type=loading]:opacity-80\" />\n </div>\n )}\n\n <div className=\"flex flex-col gap-0.5\">\n <Toast.Title\n className=\"font-medium\"\n data-slot=\"toast-title\"\n />\n <Toast.Description\n className=\"text-muted-foreground\"\n data-slot=\"toast-description\"\n />\n </div>\n </div>\n {toast.actionProps && (\n <Toast.Action\n className={buttonVariants({\n size: \"xs\",\n })}\n data-slot=\"toast-action\"\n >\n {toast.actionProps.children}\n </Toast.Action>\n )}\n </Toast.Content>\n </Toast.Root>\n )\n })}\n </Toast.Viewport>\n </Toast.Portal>\n )\n}\n\nfunction AnchoredToastProvider({ children, ...props }: Toast.Provider.Props) {\n return (\n <Toast.Provider toastManager={anchoredToastManager} {...props}>\n {children}\n <AnchoredToasts />\n </Toast.Provider>\n )\n}\n\nfunction AnchoredToasts() {\n const { toasts } = Toast.useToastManager()\n\n return (\n <Toast.Portal data-slot=\"toast-portal-anchored\">\n <Toast.Viewport\n className=\"outline-none\"\n data-slot=\"toast-viewport-anchored\"\n >\n {toasts.map((toast) => {\n const Icon = toast.type\n ? TOAST_ICONS[toast.type as keyof typeof TOAST_ICONS]\n : null\n const tooltipStyle =\n (toast.data as { tooltipStyle?: boolean })\n ?.tooltipStyle ?? false\n const positionerProps = toast.positionerProps\n\n if (!positionerProps?.anchor) {\n return null\n }\n\n return (\n <Toast.Positioner\n className=\"z-50 max-w-[min(--spacing(64),var(--available-width))]\"\n data-slot=\"toast-positioner\"\n key={toast.id}\n sideOffset={positionerProps.sideOffset ?? 4}\n toast={toast}\n >\n <Toast.Root\n className={cn(\n \"bg-popover text-popover-foreground relative border text-xs text-balance transition-[scale,opacity] not-dark:bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:shadow-[0_1px_--theme(--color-black/6%)] data-ending-style:scale-98 data-ending-style:opacity-0 data-starting-style:scale-98 data-starting-style:opacity-0 dark:before:shadow-[0_-1px_--theme(--color-white/6%)]\",\n tooltipStyle\n ? \"rounded-md shadow-md/5 before:rounded-[calc(var(--radius-md)-1px)]\"\n : \"rounded-lg shadow-lg/5 before:rounded-[calc(var(--radius-lg)-1px)]\"\n )}\n data-slot=\"toast-popup\"\n toast={toast}\n >\n {tooltipStyle ? (\n <Toast.Content className=\"pointer-events-auto px-2 py-1\">\n <Toast.Title data-slot=\"toast-title\" />\n </Toast.Content>\n ) : (\n <Toast.Content className=\"pointer-events-auto flex items-center justify-between gap-1.5 overflow-hidden px-3.5 py-3 text-sm\">\n <div className=\"flex gap-2\">\n {Icon && (\n <div\n className=\"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&>svg]:h-lh [&>svg]:w-4\"\n data-slot=\"toast-icon\"\n >\n <Icon className=\"in-data-[type=error]:text-destructive in-data-[type=info]:text-info in-data-[type=success]:text-success in-data-[type=warning]:text-warning in-data-[type=loading]:animate-spin in-data-[type=loading]:opacity-80\" />\n </div>\n )}\n\n <div className=\"flex flex-col gap-0.5\">\n <Toast.Title\n className=\"font-medium\"\n data-slot=\"toast-title\"\n />\n <Toast.Description\n className=\"text-muted-foreground\"\n data-slot=\"toast-description\"\n />\n </div>\n </div>\n {toast.actionProps && (\n <Toast.Action\n className={buttonVariants({\n size: \"xs\",\n })}\n data-slot=\"toast-action\"\n >\n {toast.actionProps.children}\n </Toast.Action>\n )}\n </Toast.Content>\n )}\n </Toast.Root>\n </Toast.Positioner>\n )\n })}\n </Toast.Viewport>\n </Toast.Portal>\n )\n}\n\nexport {\n ToastProvider,\n type ToastPosition,\n toastManager,\n AnchoredToastProvider,\n anchoredToastManager,\n}\n","/* eslint-disable react-hooks/rules-of-hooks */\n\"use client\"\n\nimport React, { useState, useEffect } from \"react\"\nimport {\n AutoField,\n createUsePuck,\n walkTree,\n} from \"@puckeditor/core\"\nimport type {\n ComponentConfig,\n ComponentData,\n ComponentDataOptionalId,\n Content,\n Slot,\n} from \"@puckeditor/core\"\nimport { Loader2Icon, Trash2Icon } from \"lucide-react\"\nimport { Button } from \"@/src/components/ui/button\"\nimport { Input } from \"@/src/components/ui/input\"\nimport { Label } from \"@/src/components/ui/label\"\n\nconst usePuck = createUsePuck()\n\nexport type TemplateProps = {\n template: string\n children: Slot\n}\n\ntype ApiTemplate = {\n id: number\n name: string\n data: Slot\n}\n\ntype TemplateData = Record<string, { label: string; data: Slot }>\n\n/**\n * Module-level cache keyed by storageKey.\n * Populated when the field is rendered; consumed by resolveData.\n */\nconst _resolveCache = new Map<string, TemplateData>()\n\nexport type CreateTemplateBlockOptions = {\n /**\n * Namespace key — used as the localStorage key prefix (without API) or as\n * the `key` column value in the database (with API).\n * Must be unique per project.\n * @default \"puck-template\"\n */\n storageKey?: string\n\n /**\n * Static template presets always shown in the select (in addition to\n * \"Blank\"). Applied regardless of storage mode.\n */\n defaultTemplates?: TemplateData\n\n /**\n * Base URL for the templates REST API.\n * When provided, templates are stored in the database instead of\n * localStorage, making them shared across all users.\n *\n * Accepts a lazy function so the URL can be resolved from the DOM\n * (e.g. from a data-* attribute) without breaking SSR or module init.\n *\n * Expected contract:\n * GET {apiUrl}?key={storageKey} → { templates: ApiTemplate[] }\n * POST {apiUrl} → { template: ApiTemplate }\n * body: { key, name, data }\n * DELETE {apiUrl}/{id} → { success: true }\n */\n apiUrl?: string | (() => string)\n\n /**\n * Returns headers merged into every API request.\n * Use this to inject CSRF tokens or custom auth headers.\n *\n * @example\n * getHeaders: () => ({ 'X-CSRF-TOKEN': getCsrfToken() })\n */\n getHeaders?: () => Record<string, string>\n}\n\nconst resolveApiUrl = (\n apiUrl: string | (() => string) | undefined\n): string | undefined => {\n if (!apiUrl) return undefined\n return typeof apiUrl === \"function\" ? apiUrl() : apiUrl\n}\n\n/**\n * Factory that returns a ready-to-use Puck `ComponentConfig` for a Template\n * block.\n *\n * Without `apiUrl` — templates are saved in `localStorage` (per-browser).\n * With `apiUrl` — templates are saved in a database and shared across all\n * users and devices.\n *\n * @example\n * // Basic (localStorage)\n * Template: createTemplateBlock({ storageKey: 'my-project' })\n *\n * // Database-backed (shared)\n * Template: createTemplateBlock({\n * storageKey: 'my-project',\n * apiUrl: () => document.getElementById('editor')?.dataset.templatesUrl,\n * getHeaders: () => ({ 'X-CSRF-TOKEN': getCsrfToken() }),\n * })\n */\nexport function createTemplateBlock(\n options: CreateTemplateBlockOptions = {}\n): ComponentConfig<TemplateProps> {\n const {\n storageKey = \"puck-template\",\n defaultTemplates = {},\n apiUrl,\n getHeaders,\n } = options\n\n const localStorageKey = `puck-templates:${storageKey}`\n const useApi = !!apiUrl\n\n /** Read saved templates from the appropriate storage. */\n const getStoredTemplates = (): TemplateData => {\n if (useApi) return _resolveCache.get(storageKey) ?? {}\n try {\n return JSON.parse(localStorage.getItem(localStorageKey) ?? \"{}\")\n } catch {\n return {}\n }\n }\n\n return {\n fields: {\n template: {\n type: \"custom\",\n render: ({ name, value, onChange }) => {\n const config = usePuck((s) => s.config)\n const props = usePuck(\n (s) => s.selectedItem?.props\n ) as TemplateProps | undefined\n\n const [apiTemplates, setApiTemplates] = useState<\n ApiTemplate[]\n >([])\n const [localTemplates, setLocalTemplates] =\n useState<TemplateData>(\n useApi\n ? {}\n : JSON.parse(\n localStorage.getItem(localStorageKey) ??\n \"{}\"\n )\n )\n const [isLoading, setIsLoading] = useState(useApi)\n const [isSaving, setIsSaving] = useState(false)\n const [newTemplateName, setNewTemplateName] = useState(\"\")\n\n useEffect(() => {\n if (!useApi) return\n const url = resolveApiUrl(apiUrl)\n if (!url) {\n setIsLoading(false)\n return\n }\n\n setIsLoading(true)\n fetch(\n `${url}?key=${encodeURIComponent(storageKey)}`,\n {\n headers: {\n Accept: \"application/json\",\n ...(getHeaders?.() ?? {}),\n },\n credentials: \"same-origin\",\n }\n )\n .then((r) => r.json())\n .then((json) => {\n const tpls: ApiTemplate[] =\n json.templates ?? []\n setApiTemplates(tpls)\n syncCache(tpls)\n })\n .catch(() => { })\n .finally(() => setIsLoading(false))\n }, [])\n\n const syncCache = (tpls: ApiTemplate[]) => {\n const cached: TemplateData = {}\n tpls.forEach((t) => {\n cached[String(t.id)] = {\n label: t.name,\n data: t.data,\n }\n })\n _resolveCache.set(storageKey, cached)\n }\n\n const handleSave = async () => {\n if (!props?.children?.length) return\n setIsSaving(true)\n\n try {\n const data: Slot = props.children.map((child) => {\n const seeded = {\n type: child.type,\n props: {\n ...child.props,\n id: crypto.randomUUID(),\n },\n } as unknown as ComponentData\n\n return walkTree(\n seeded,\n config,\n (content: Content) =>\n content.map((item) => ({\n ...item,\n props: {\n ...item.props,\n id: crypto.randomUUID(),\n },\n }))\n ) as unknown as ComponentDataOptionalId\n })\n\n const label =\n newTemplateName.trim() ||\n new Date().toLocaleString()\n\n if (useApi) {\n const url = resolveApiUrl(apiUrl)!\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(getHeaders?.() ?? {}),\n },\n credentials: \"same-origin\",\n body: JSON.stringify({\n key: storageKey,\n name: label,\n data,\n }),\n })\n const json = await resp.json()\n const created: ApiTemplate = json.template\n const updated = [...apiTemplates, created]\n setApiTemplates(updated)\n syncCache(updated)\n onChange(String(created.id))\n } else {\n const templateId = crypto.randomUUID()\n const updated: TemplateData = {\n ...localTemplates,\n [templateId]: { label, data },\n }\n localStorage.setItem(\n localStorageKey,\n JSON.stringify(updated)\n )\n setLocalTemplates(updated)\n onChange(templateId)\n }\n\n setNewTemplateName(\"\")\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleDelete = async (templateValue: string) => {\n if (useApi) {\n const url = resolveApiUrl(apiUrl)!\n await fetch(`${url}/${templateValue}`, {\n method: \"DELETE\",\n headers: {\n Accept: \"application/json\",\n ...(getHeaders?.() ?? {}),\n },\n credentials: \"same-origin\",\n })\n const updated = apiTemplates.filter(\n (t) => String(t.id) !== templateValue\n )\n setApiTemplates(updated)\n syncCache(updated)\n } else {\n const { [templateValue]: _, ...rest } =\n localTemplates\n localStorage.setItem(\n localStorageKey,\n JSON.stringify(rest)\n )\n setLocalTemplates(rest)\n }\n\n if (value === templateValue) onChange(\"blank\")\n }\n\n const builtInOptions = [\n { label: \"Blank\", value: \"blank\" },\n ...Object.entries(defaultTemplates).map(\n ([k, t]) => ({ value: k, label: t.label })\n ),\n ]\n\n const savedOptions = useApi\n ? apiTemplates.map((t) => ({\n value: String(t.id),\n label: t.name,\n }))\n : Object.entries(localTemplates).map(([k, t]) => ({\n value: k,\n label: t.label,\n }))\n\n return (\n <>\n\n <div className=\"flex flex-col gap-3\">\n {isLoading ? (\n <Label className=\"justify-start\">\n <Loader2Icon\n size={16}\n className=\"animate-spin\"\n />\n Templates loading...\n </Label>\n ) : (\n <AutoField\n value={value}\n onChange={onChange}\n field={{\n label: \"Select a template\",\n type: \"select\",\n options: [\n ...builtInOptions,\n ...savedOptions,\n ],\n }}\n />\n )}\n\n {savedOptions.length > 0 && (\n <div\n style={{\n marginTop: 8,\n borderTop:\n \"1px solid var(--puck-color-grey-09)\",\n paddingTop: 8,\n }}\n >\n {savedOptions.map((opt) => (\n <div\n key={opt.value}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"3px 0\",\n fontSize: 11,\n color: \"var(--puck-color-grey-04)\",\n }}\n >\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginRight: 4,\n }}\n >\n {opt.label}\n </span>\n <button\n onClick={() =>\n handleDelete(opt.value)\n }\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 2,\n color: \"var(--puck-color-rose-06, #e11d48)\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n }}\n title=\"Supprimer ce template\"\n type=\"button\"\n >\n <Trash2Icon size={12} />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <Label className=\"mb-0\">\n Nom du template\n </Label>\n <Input\n type=\"text\"\n value={newTemplateName}\n onChange={(e) => setNewTemplateName((e.target as HTMLInputElement).value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !isSaving && props?.children?.length) {\n handleSave()\n }\n }}\n placeholder={new Date().toLocaleString()}\n />\n <Button\n variant=\"outline\"\n onClick={handleSave}\n disabled={\n isSaving || !props?.children?.length\n }\n >\n {isSaving ? \"Sauvegarde…\" : \"Sauvegarder comme template\"}\n </Button>\n </div>\n </>\n )\n },\n },\n children: {\n type: \"slot\",\n },\n },\n defaultProps: {\n template: \"blank\",\n children: [],\n },\n resolveData: async (data, { changed, trigger }) => {\n if (!changed.template || trigger === \"load\") return data\n\n const allTemplates: TemplateData = {\n blank: { label: \"Blank\", data: [] },\n ...defaultTemplates,\n ...getStoredTemplates(),\n }\n\n // If template not in cache and API is configured, fetch fresh\n if (useApi && !allTemplates[data.props.template]) {\n try {\n const url = resolveApiUrl(apiUrl)\n if (url) {\n const resp = await fetch(\n `${url}?key=${encodeURIComponent(storageKey)}`,\n {\n headers: {\n Accept: \"application/json\",\n ...(getHeaders?.() ?? {}),\n },\n credentials: \"same-origin\",\n }\n )\n const json = await resp.json()\n const tpls: ApiTemplate[] = json.templates ?? []\n const cached: TemplateData = {}\n tpls.forEach((t) => {\n cached[String(t.id)] = {\n label: t.name,\n data: t.data,\n }\n })\n _resolveCache.set(storageKey, cached)\n Object.assign(allTemplates, cached)\n }\n } catch { }\n }\n\n const children =\n allTemplates[data.props.template]?.data ??\n allTemplates[\"blank\"].data\n\n return {\n ...data,\n props: { ...data.props, children },\n }\n },\n render: ({ children: Children }) => (\n <div className=\"flex flex-col md:grid\">\n <Children />\n </div>\n ),\n }\n}\n","import React from \"react\"\nimport { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type AnimationTraitProps = {\n animation?:\n | \"\"\n | \"fade-in\"\n | \"fade-up\"\n | \"fade-down\"\n | \"fade-left\"\n | \"fade-right\"\n | \"fade-scale\"\n | \"scale-in\"\n | \"scale-up\"\n | \"scale-down\"\n | \"scale-out\"\n | \"slide-up\"\n | \"slide-down\"\n | \"slide-left\"\n | \"slide-right\"\n | \"blur-in\"\n | \"blur-up\"\n | \"blur-down\"\n}\n\nexport const animationField: Fields = {\n animation: {\n type: \"select\",\n label: \"Animation\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"Fade In\", value: \"fade-in\", group: \"Fade\" },\n { label: \"Fade Up\", value: \"fade-up\", group: \"Fade\" },\n { label: \"Fade Down\", value: \"fade-down\", group: \"Fade\" },\n { label: \"Fade Left\", value: \"fade-left\", group: \"Fade\" },\n { label: \"Fade Right\", value: \"fade-right\", group: \"Fade\" },\n { label: \"Fade Scale\", value: \"fade-scale\", group: \"Fade\" },\n { label: \"Scale In\", value: \"scale-in\", group: \"Scale\" },\n { label: \"Scale Up\", value: \"scale-up\", group: \"Scale\" },\n { label: \"Scale Down\", value: \"scale-down\", group: \"Scale\" },\n { label: \"Scale Out\", value: \"scale-out\", group: \"Scale\" },\n { label: \"Slide Up\", value: \"slide-up\", group: \"Slide\" },\n { label: \"Slide Down\", value: \"slide-down\", group: \"Slide\" },\n { label: \"Slide Left\", value: \"slide-left\", group: \"Slide\" },\n { label: \"Slide Right\", value: \"slide-right\", group: \"Slide\" },\n { label: \"Blur In\", value: \"blur-in\", group: \"Blur\" },\n { label: \"Blur Up\", value: \"blur-up\", group: \"Blur\" },\n { label: \"Blur Down\", value: \"blur-down\", group: \"Blur\" },\n ] as any,\n },\n}\n\nexport function animationToAttributes(\n animation?: AnimationTraitProps[\"animation\"]\n): Record<string, string> {\n const attributes: Record<string, string> = {}\n\n if (animation) {\n attributes[\"data-animation\"] = animation\n }\n\n return attributes\n}\n\nexport const animationDefaultProps: AnimationTraitProps = {\n animation: \"\" as const,\n}\n","\"use client\";\n\nimport { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Separator } from \"./separator\";\n\nconst groupVariants = cva(\n \"flex w-fit *:focus-visible:z-1 has-[>[data-slot=group]]:gap-2 *:has-focus-visible:z-1 dark:*:[[data-slot=separator]:has(~button:hover):not(:has(~[data-slot=separator]~[data-slot]:hover)),[data-slot=separator]:has(~[data-slot][data-pressed]):not(:has(~[data-slot=separator]~[data-slot][data-pressed]))]:before:bg-input/64 dark:*:[button:hover~[data-slot=separator]:not([data-slot]:hover~[data-slot=separator]~[data-slot=separator]),[data-slot][data-pressed]~[data-slot=separator]:not([data-slot][data-pressed]~[data-slot=separator]~[data-slot=separator])]:before:bg-input/64\",\n {\n defaultVariants: {\n orientation: \"horizontal\",\n },\n variants: {\n orientation: {\n horizontal:\n \"*:[[data-slot]~[data-slot]:not([data-slot=separator])]:before:-start-[0.5px] *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:-end-[0.5px] *:pointer-coarse:after:min-w-auto *:data-slot:has-[~[data-slot]]:rounded-e-none *:data-slot:has-[~[data-slot]]:border-e-0 *:data-slot:has-[~[data-slot]]:before:rounded-e-none *:[[data-slot]~[data-slot]]:rounded-s-none *:[[data-slot]~[data-slot]]:border-s-0 *:[[data-slot]~[data-slot]]:before:rounded-s-none\",\n vertical:\n \"*:[[data-slot]~[data-slot]:not([data-slot=separator])]:before:-top-[0.5px] *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:-bottom-[0.5px] flex-col *:pointer-coarse:after:min-h-auto *:data-slot:has-[~[data-slot]]:rounded-b-none *:data-slot:has-[~[data-slot]]:border-b-0 *:data-slot:not-data-[slot=separator]:has-[~[data-slot]]:before:hidden *:data-slot:has-[~[data-slot]]:before:rounded-b-none dark:*:last:before:hidden dark:*:first:before:block *:[[data-slot]~[data-slot]]:rounded-t-none *:[[data-slot]~[data-slot]]:border-t-0 *:[[data-slot]~[data-slot]]:before:rounded-t-none\",\n },\n },\n },\n);\n\nfunction Group({\n className,\n orientation,\n children,\n ...props\n}: {\n className?: string;\n orientation?: VariantProps<typeof groupVariants>[\"orientation\"];\n children: React.ReactNode;\n} & React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(groupVariants({ orientation }), className)}\n data-orientation={orientation}\n data-slot=\"group\"\n role=\"group\"\n {...props}\n >\n {children}\n </div>\n );\n}\n\nfunction GroupText({\n className,\n render,\n ...props\n}: useRender.ComponentProps<\"div\">) {\n const defaultProps = {\n className: cn(\n \"relative inline-flex items-center whitespace-nowrap gap-2 rounded-lg border border-input bg-muted not-dark:bg-clip-padding px-[calc(--spacing(3)-1px)] text-muted-foreground text-base sm:text-sm shadow-xs/5 outline-none transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-[0_1px_--theme(--color-black/6%)] dark:bg-input/64 dark:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 [&_svg]:-mx-0.5\",\n className,\n ),\n \"data-slot\": \"group-text\",\n };\n return useRender({\n defaultTagName: \"div\",\n props: mergeProps(defaultProps, props),\n render,\n });\n}\n\nfunction GroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: {\n className?: string;\n} & React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n className={cn(\n \"[[data-slot=input-control]:focus-within+&,[data-slot=input-group]:focus-within+&,[data-slot=select-trigger]:focus-visible+*+&,[data-slot=number-field]:focus-within+input+&]:-translate-x-px pointer-events-none relative z-2 bg-input before:absolute before:inset-0 has-[+[data-slot=input-control]:focus-within,+[data-slot=input-group]:focus-within,+[data-slot=select-trigger]:focus-visible+*,+[data-slot=number-field]:focus-within]:translate-x-px has-[+[data-slot=input-control]:focus-within,+[data-slot=input-group]:focus-within,+[data-slot=select-trigger]:focus-visible+*,+[data-slot=number-field]:focus-within]:bg-ring dark:before:bg-input/32 [[data-slot=input-control]:focus-within+&,[data-slot=input-group]:focus-within+&,[data-slot=select-trigger]:focus-visible+*+&,[data-slot=number-field]:focus-within+&,[data-slot=number-field]:focus-within+input+&]:bg-ring\",\n className,\n )}\n orientation={orientation}\n {...props}\n />\n );\n}\n\nexport {\n Group,\n Group as ButtonGroup,\n GroupText,\n GroupText as ButtonGroupText,\n GroupSeparator,\n GroupSeparator as ButtonGroupSeparator,\n groupVariants,\n};\n","import React, { useState } from \"react\"\nimport { Fields } from \"@puckeditor/core\"\nimport { PlusIcon, XIcon } from \"lucide-react\"\nimport Label from \"../components/Fields/Label\"\nimport { Button } from \"../components/ui/button\"\nimport { Group } from \"../components/ui/group\"\nimport { Input } from \"../components/ui/input\"\n\nexport type CustomClassesTraitProps = {\n customClasses?: string[]\n}\n\nfunction CustomClassesField({\n value,\n onChange,\n field,\n}: {\n value?: string[]\n onChange: (value: string[]) => void\n field: any\n}) {\n const [input, setInput] = useState(\"\")\n const tags = value || []\n\n const addTag = () => {\n const trimmed = input.trim()\n if (!trimmed || tags.includes(trimmed)) {\n setInput(\"\")\n return\n }\n onChange([...tags, trimmed])\n setInput(\"\")\n }\n\n const removeTag = (tag: string) => {\n onChange(tags.filter((t) => t !== tag))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n addTag()\n }\n }\n\n return (\n <>\n <Label label={field.label} />\n <div className=\"flex flex-col gap-y-2\">\n {tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <div\n key={tag}\n className=\"flex items-center gap-1 pl-1.5 pr-1 py-0.5 bg-secondary text-secondary-foreground rounded-md text-xs leading-none\"\n >\n {tag}\n <Button\n size=\"icon-xs\"\n variant=\"ghost\"\n className=\"!size-4 rounded-sm hover:text-destructive text-secondary-foreground/50\"\n type=\"button\"\n onClick={() => removeTag(tag)}\n aria-label={`Delete ${tag}`}\n >\n <XIcon size={10} />\n </Button>\n </div>\n ))}\n </div>\n )}\n <Group aria-label=\"Custom classes\" className=\"gap-2 w-full\">\n <Input\n type=\"text\"\n value={input}\n placeholder=\"Class name\"\n onChange={(e) => setInput(e.currentTarget.value)}\n onKeyDown={handleKeyDown}\n />\n <div>\n <Button\n size=\"icon\"\n variant=\"primary\"\n onClick={addTag}\n aria-label=\"Add\"\n >\n <PlusIcon />\n </Button>\n </div>\n </Group>\n </div>\n </>\n )\n}\n\nexport const customClassesField: Fields = {\n customClasses: {\n type: \"custom\",\n label: \"Classes\",\n render: ({ value, onChange, field }) => (\n <CustomClassesField value={value} onChange={onChange} field={field} />\n ),\n },\n}\n\nexport function customClassesToClasses(customClasses?: string[]): string {\n if (!customClasses || customClasses.length === 0) return \"\"\n return customClasses.join(\" \")\n}\n\nexport const customClassesDefaultProps: CustomClassesTraitProps = {\n customClasses: [],\n}\n","\"use client\"\n\nimport React from \"react\"\nimport { Field } from \"@puckeditor/core\"\nimport Label from \"../components/Fields/Label\"\nimport { PagePicker, type PagePickerValue } from \"../components/PagePicker\"\n\nexport const pageField: Field<PagePickerValue> = {\n type: \"custom\",\n render: ({ value, onChange, field }) => (\n <>\n {field.label && <Label label={field.label} tooltip={field.tooltip} />}\n <PagePicker value={value} onChange={onChange} />\n </>\n ),\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type DisplayTraitProps = {\n display?:\n | \"hidden\"\n | \"inline\"\n | \"inline-block\"\n | \"block\"\n | \"flex\"\n | \"inline-flex\"\n}\n\nexport const displayField: Fields = {\n display: {\n type: \"select\",\n label: \"Display\",\n options: [\n { label: \"None (hidden)\", value: \"hidden\" },\n { label: \"Inline\", value: \"inline\" },\n { label: \"Inline Block\", value: \"inline-block\" },\n { label: \"Block\", value: \"block\" },\n { label: \"Flex\", value: \"flex\" },\n { label: \"Inline Flex\", value: \"inline-flex\" },\n ],\n },\n}\n\nexport function displayToClasses(\n display?:\n | \"hidden\"\n | \"inline\"\n | \"inline-block\"\n | \"block\"\n | \"flex\"\n | \"inline-flex\"\n): string {\n const classes: string[] = []\n\n if (display) {\n classes.push(display)\n }\n\n return classes.join(\" \")\n}\n\nexport const displayDefaultProps: DisplayTraitProps = {\n display: \"block\",\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type FontWeightTraitProps = {\n fontWeight?:\n | \"\"\n | \"thin\"\n | \"extralight\"\n | \"light\"\n | \"normal\"\n | \"medium\"\n | \"semibold\"\n | \"bold\"\n | \"extrabold\"\n | \"black\"\n}\n\nexport const fontWeightField: Fields = {\n fontWeight: {\n type: \"select\",\n label: \"Font weight\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"Thin (100)\", value: \"thin\" },\n { label: \"Extra Light (200)\", value: \"extralight\" },\n { label: \"Light (300)\", value: \"light\" },\n { label: \"Normal (400)\", value: \"normal\" },\n { label: \"Medium (500)\", value: \"medium\" },\n { label: \"Semibold (600)\", value: \"semibold\" },\n { label: \"Bold (700)\", value: \"bold\" },\n { label: \"Extra Bold (800)\", value: \"extrabold\" },\n { label: \"Black (900)\", value: \"black\" },\n ],\n } as any,\n}\n\nexport function fontWeightToClasses(fontWeight?: string): string {\n if (!fontWeight) return \"\"\n return `font-${fontWeight}`\n}\n\nexport const fontWeightDefaultProps: FontWeightTraitProps = {\n fontWeight: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type LineHeightTraitProps = {\n lineHeight?: \"\" | \"1\" | \"1.25\" | \"1.5\" | \"2\"\n}\n\nexport const lineHeightField: Fields = {\n lineHeight: {\n type: \"select\",\n label: \"Line height\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"1\", value: \"none\" },\n { label: \"1.25\", value: \"1.25\" },\n { label: \"1.5\", value: \"1.5\" },\n { label: \"2\", value: \"2\" },\n ],\n } as any,\n}\n\nexport function lineHeightToClasses(lineHeight?: string): string {\n if (!lineHeight) return \"\"\n return `leading-[${lineHeight}]`\n}\n\nexport const lineHeightDefaultProps: LineHeightTraitProps = {\n lineHeight: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type MarginValue = { value: string; unit: string }\n\nexport type MarginItem = {\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n direction: \"all\" | \"top\" | \"right\" | \"bottom\" | \"left\" | \"x\" | \"y\"\n margin: MarginValue\n}\n\nexport type MarginTraitProps = {\n margins?: Array<MarginItem>\n}\n\nconst MARGIN_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"em\", value: \"em\" },\n { label: \"%\", value: \"%\" },\n { label: \"auto\", value: \"auto\" },\n]\n\nfunction getMarginSummary(item: MarginItem): string {\n if (!item || !item.direction) return \"Margin\"\n\n const bp = item.breakpoint ? `${item.breakpoint.toUpperCase()} - ` : \"\"\n const dir =\n item.direction === \"all\"\n ? \"All 4 directions\"\n : item.direction === \"x\"\n ? \"Horizontal\"\n : item.direction === \"y\"\n ? \"Vertical\"\n : item.direction.charAt(0).toUpperCase() +\n item.direction.slice(1)\n const value = item.margin?.value || \"0\"\n const unit = item.margin?.unit || \"px\"\n return `${bp}${dir}: ${value}${unit}`\n}\n\nexport const marginField: Fields = {\n margins: {\n type: \"array\",\n label: \"Margins\",\n arrayFields: {\n breakpoint: {\n type: \"select\",\n label: \"Breakpoint\",\n options: [\n { label: \"Base\", value: \"\" },\n { label: \"XS\", value: \"xs\" },\n { label: \"SM\", value: \"sm\" },\n { label: \"MD\", value: \"md\" },\n { label: \"LG\", value: \"lg\" },\n { label: \"XL\", value: \"xl\" },\n { label: \"2XL\", value: \"2xl\" },\n ],\n },\n direction: {\n type: \"select\",\n label: \"Direction\",\n options: [\n { label: \"All 4 directions\", value: \"all\" },\n { label: \"Top\", value: \"top\" },\n { label: \"Right\", value: \"right\" },\n { label: \"Bottom\", value: \"bottom\" },\n { label: \"Left\", value: \"left\" },\n { label: \"Horizontal (X)\", value: \"x\" },\n { label: \"Vertical (Y)\", value: \"y\" },\n ],\n },\n margin: {\n type: \"numberUnit\" as any,\n label: \"Margin\",\n options: MARGIN_UNITS,\n },\n },\n defaultItemProps: {\n breakpoint: \"md\",\n direction: \"all\",\n margin: { value: \"0\", unit: \"px\" },\n },\n getItemSummary: (item: MarginItem) => getMarginSummary(item),\n },\n}\n\nexport function marginToClasses(margins?: Array<MarginItem>): string {\n if (!margins || margins.length === 0) return \"\"\n\n const classes: string[] = []\n\n margins.forEach((item) => {\n if (!item || !item.direction || !item.margin) return\n\n const prefix = item.breakpoint ? `${item.breakpoint}:` : \"\"\n const value = item.margin.value || \"0\"\n const unit = item.margin.unit || \"px\"\n\n // Skip if value is empty\n if (!value.trim()) return\n\n let marginClass = \"\"\n switch (item.direction) {\n case \"all\":\n marginClass = `${prefix}m-[${value}${unit}]`\n break\n case \"x\":\n marginClass = `${prefix}mx-[${value}${unit}]`\n break\n case \"y\":\n marginClass = `${prefix}my-[${value}${unit}]`\n break\n case \"top\":\n marginClass = `${prefix}mt-[${value}${unit}]`\n break\n case \"right\":\n marginClass = `${prefix}mr-[${value}${unit}]`\n break\n case \"bottom\":\n marginClass = `${prefix}mb-[${value}${unit}]`\n break\n case \"left\":\n marginClass = `${prefix}ml-[${value}${unit}]`\n break\n }\n\n if (marginClass) {\n classes.push(marginClass)\n }\n })\n\n return classes.join(\" \")\n}\n\nexport const marginDefaultProps: MarginTraitProps = {\n margins: [] as Array<MarginItem>,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type PaddingValue = { value: string; unit: string }\n\nexport type PaddingItem = {\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n direction: \"all\" | \"top\" | \"right\" | \"bottom\" | \"left\" | \"x\" | \"y\"\n padding: PaddingValue\n}\n\nexport type PaddingTraitProps = {\n paddings?: Array<PaddingItem>\n}\n\nconst PADDING_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"em\", value: \"em\" },\n { label: \"%\", value: \"%\" },\n]\n\nfunction getPaddingSummary(item: PaddingItem): string {\n if (!item || !item.direction) return \"Padding\"\n\n const bp = item.breakpoint ? `${item.breakpoint.toUpperCase()} - ` : \"\"\n const dir =\n item.direction === \"all\"\n ? \"All 4 directions\"\n : item.direction === \"x\"\n ? \"Horizontal\"\n : item.direction === \"y\"\n ? \"Vertical\"\n : item.direction.charAt(0).toUpperCase() +\n item.direction.slice(1)\n const value = item.padding?.value || \"0\"\n const unit = item.padding?.unit || \"px\"\n return `${bp}${dir}: ${value}${unit}`\n}\n\nexport const paddingField: Fields = {\n paddings: {\n type: \"array\",\n label: \"Paddings\",\n arrayFields: {\n breakpoint: {\n type: \"select\",\n label: \"Breakpoint\",\n options: [\n { label: \"Base\", value: \"\" },\n { label: \"XS\", value: \"xs\" },\n { label: \"SM\", value: \"sm\" },\n { label: \"MD\", value: \"md\" },\n { label: \"LG\", value: \"lg\" },\n { label: \"XL\", value: \"xl\" },\n { label: \"2XL\", value: \"2xl\" },\n ],\n },\n direction: {\n type: \"select\",\n label: \"Direction\",\n options: [\n { label: \"All 4 directions\", value: \"all\" },\n { label: \"Top\", value: \"top\" },\n { label: \"Right\", value: \"right\" },\n { label: \"Bottom\", value: \"bottom\" },\n { label: \"Left\", value: \"left\" },\n { label: \"Horizontal (X)\", value: \"x\" },\n { label: \"Vertical (Y)\", value: \"y\" },\n ],\n },\n padding: {\n type: \"numberUnit\" as any,\n label: \"Padding\",\n options: PADDING_UNITS,\n },\n },\n defaultItemProps: {\n breakpoint: \"md\",\n direction: \"all\",\n padding: { value: \"0\", unit: \"px\" },\n },\n getItemSummary: (item: PaddingItem) => getPaddingSummary(item),\n },\n}\n\nexport function paddingToClasses(paddings?: Array<PaddingItem>): string {\n if (!paddings || paddings.length === 0) return \"\"\n\n const classes: string[] = []\n\n paddings.forEach((item) => {\n if (!item || !item.direction || !item.padding) return\n\n const prefix = item.breakpoint ? `${item.breakpoint}:` : \"\"\n const value = item.padding.value || \"0\"\n const unit = item.padding.unit || \"px\"\n\n // Skip if value is empty\n if (!value.trim()) return\n\n let paddingClass = \"\"\n switch (item.direction) {\n case \"all\":\n paddingClass = `${prefix}p-[${value}${unit}]`\n break\n case \"x\":\n paddingClass = `${prefix}px-[${value}${unit}]`\n break\n case \"y\":\n paddingClass = `${prefix}py-[${value}${unit}]`\n break\n case \"top\":\n paddingClass = `${prefix}pt-[${value}${unit}]`\n break\n case \"right\":\n paddingClass = `${prefix}pr-[${value}${unit}]`\n break\n case \"bottom\":\n paddingClass = `${prefix}pb-[${value}${unit}]`\n break\n case \"left\":\n paddingClass = `${prefix}pl-[${value}${unit}]`\n break\n }\n\n if (paddingClass) {\n classes.push(paddingClass)\n }\n })\n\n return classes.join(\" \")\n}\n\nexport const paddingDefaultProps: PaddingTraitProps = {\n paddings: [] as Array<PaddingItem>,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type PositionTraitProps = {\n position?: \"static\" | \"relative\" | \"absolute\" | \"fixed\" | \"sticky\"\n top?: string\n right?: string\n bottom?: string\n left?: string\n zIndex?: number\n}\n\nexport const positionField: Fields = {\n position: {\n type: \"select\",\n label: \"Position\",\n options: [\n { label: \"Static\", value: \"static\" },\n { label: \"Relative\", value: \"relative\" },\n { label: \"Absolute\", value: \"absolute\" },\n { label: \"Fixed\", value: \"fixed\" },\n { label: \"Sticky\", value: \"sticky\" },\n ],\n },\n top: {\n type: \"text\",\n label: \"Top\",\n },\n right: {\n type: \"text\",\n label: \"Right\",\n },\n bottom: {\n type: \"text\",\n label: \"Bottom\",\n },\n left: {\n type: \"text\",\n label: \"Left\",\n },\n zIndex: {\n type: \"number\",\n label: \"Z-Index\",\n },\n}\n\nexport function positionToClasses(\n position?: \"static\" | \"relative\" | \"absolute\" | \"fixed\" | \"sticky\",\n top?: string,\n right?: string,\n bottom?: string,\n left?: string,\n zIndex?: number\n): string {\n const classes: string[] = []\n\n if (position) {\n classes.push(position)\n }\n\n if (top && top.trim()) {\n classes.push(`top-[${top}]`)\n }\n\n if (right && right.trim()) {\n classes.push(`right-[${right}]`)\n }\n\n if (bottom && bottom.trim()) {\n classes.push(`bottom-[${bottom}]`)\n }\n\n if (left && left.trim()) {\n classes.push(`left-[${left}]`)\n }\n\n if (zIndex !== undefined && zIndex !== null) {\n classes.push(`z-[${zIndex}]`)\n }\n\n return classes.join(\" \")\n}\n\nexport const positionDefaultProps: PositionTraitProps = {\n position: \"static\",\n top: \"\",\n right: \"\",\n bottom: \"\",\n left: \"\",\n zIndex: 0,\n}\n","import { Fields } from \"@puckeditor/core\"\n\nexport type SizeValue = { value: string; unit: string }\n\nexport type SizeTraitProps = {\n width?: SizeValue\n minWidth?: SizeValue\n maxWidth?: SizeValue\n height?: SizeValue\n minHeight?: SizeValue\n maxHeight?: SizeValue\n}\n\nconst WIDTH_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"%\", value: \"%\" },\n { label: \"em\", value: \"em\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"vw\", value: \"vw\" },\n]\n\nconst HEIGHT_UNITS = [\n { label: \"px\", value: \"px\" },\n { label: \"%\", value: \"%\" },\n { label: \"em\", value: \"em\" },\n { label: \"rem\", value: \"rem\" },\n { label: \"vh\", value: \"vh\" },\n]\n\nexport const sizeField: Fields = {\n width: {\n type: \"numberUnit\" as any,\n label: \"Width\",\n options: WIDTH_UNITS,\n },\n minWidth: {\n type: \"numberUnit\" as any,\n label: \"Min Width\",\n options: WIDTH_UNITS,\n },\n maxWidth: {\n type: \"numberUnit\" as any,\n label: \"Max Width\",\n options: WIDTH_UNITS,\n },\n height: {\n type: \"numberUnit\" as any,\n label: \"Height\",\n options: HEIGHT_UNITS,\n },\n minHeight: {\n type: \"numberUnit\" as any,\n label: \"Min Height\",\n options: HEIGHT_UNITS,\n },\n maxHeight: {\n type: \"numberUnit\" as any,\n label: \"Max Height\",\n options: HEIGHT_UNITS,\n },\n}\n\nconst addSizeClass = (\n classes: string[],\n size: SizeValue | undefined,\n prefix: string\n): void => {\n if (size && size.value && size.value.trim()) {\n classes.push(`${prefix}-[${size.value}${size.unit}]`)\n }\n}\n\nexport function sizeToClasses(\n width?: SizeValue,\n minWidth?: SizeValue,\n maxWidth?: SizeValue,\n height?: SizeValue,\n minHeight?: SizeValue,\n maxHeight?: SizeValue\n): string {\n const classes: string[] = []\n\n addSizeClass(classes, width, \"w\")\n addSizeClass(classes, minWidth, \"min-w\")\n addSizeClass(classes, maxWidth, \"max-w\")\n addSizeClass(classes, height, \"h\")\n addSizeClass(classes, minHeight, \"min-h\")\n addSizeClass(classes, maxHeight, \"max-h\")\n\n return classes.join(\" \")\n}\n\nexport const sizeDefaultProps: SizeTraitProps = {\n width: { value: \"\", unit: \"px\" },\n minWidth: { value: \"\", unit: \"px\" },\n maxWidth: { value: \"\", unit: \"px\" },\n height: { value: \"\", unit: \"px\" },\n minHeight: { value: \"\", unit: \"px\" },\n maxHeight: { value: \"\", unit: \"px\" },\n}\n","export * from \"./margin\"\nexport * from \"./padding\"\n\nimport {\n MarginTraitProps,\n marginField,\n marginDefaultProps,\n marginToClasses,\n} from \"./margin\"\nimport {\n PaddingTraitProps,\n paddingField,\n paddingDefaultProps,\n paddingToClasses,\n} from \"./padding\"\n\nexport type SpacingTraitProps = MarginTraitProps & PaddingTraitProps\n\nexport const spacingFields = {\n ...marginField,\n ...paddingField,\n}\n\nexport const spacingDefaultProps: SpacingTraitProps = {\n ...marginDefaultProps,\n ...paddingDefaultProps,\n}\n\nexport function spacingToClasses(props: Partial<SpacingTraitProps>): string {\n const classes = [\n marginToClasses(props.margins),\n paddingToClasses(props.paddings),\n ].filter(Boolean)\n\n return classes.join(\" \")\n}\n\nexport const spacingFieldNames = [\"margins\", \"paddings\"] as const\n","export const spacingOptions = [\n { label: \"0 rem\", value: \"0px\" },\n { label: \"0.25 rem\", value: \"4px\" },\n { label: \"0.5 rem\", value: \"8px\" },\n { label: \"0.75 rem\", value: \"12px\" },\n { label: \"1 rem\", value: \"16px\" },\n { label: \"1.25 rem\", value: \"20px\" },\n { label: \"1.5 rem\", value: \"24px\" },\n { label: \"1.75 rem\", value: \"28px\" },\n { label: \"2 rem\", value: \"32px\" },\n { label: \"2.25 rem\", value: \"36px\" },\n { label: \"2.5 rem\", value: \"40px\" },\n { label: \"2.75 rem\", value: \"44px\" },\n { label: \"3 rem\", value: \"48px\" },\n { label: \"3.25 rem\", value: \"52px\" },\n { label: \"3.5 rem\", value: \"56px\" },\n { label: \"3.75 rem\", value: \"60px\" },\n { label: \"4 rem\", value: \"64px\" },\n { label: \"4.25 rem\", value: \"68px\" },\n { label: \"4.5 rem\", value: \"72px\" },\n { label: \"4.75 rem\", value: \"76px\" },\n { label: \"5 rem\", value: \"80px\" },\n]\n","import { Fields } from \"@puckeditor/core\"\nimport {\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n AlignJustifyIcon,\n} from \"lucide-react\"\n\nexport type TextAlignTraitProps = {\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\"\n}\n\nexport const textAlignField: Fields = {\n textAlign: {\n type: \"radio\",\n label: \"Text align\",\n\n options: [\n { label: <AlignLeftIcon size={16} />, value: \"left\" },\n { label: <AlignCenterIcon size={16} />, value: \"center\" },\n { label: <AlignRightIcon size={16} />, value: \"right\" },\n { label: <AlignJustifyIcon size={16} />, value: \"justify\" },\n ],\n } as any,\n}\n\nexport function textAlignToClasses(textAlign?: string): string {\n if (!textAlign) return \"\"\n return `text-${textAlign}`\n}\n\nexport const textAlignDefaultProps: TextAlignTraitProps = {\n textAlign: \"left\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport ColorPicker from \"../components/ColorPicker\"\nimport Label from \"../components/Fields/Label\"\n\nexport type TextColorTraitProps = {\n textColor?: string\n}\n\nexport const textColorField: Fields = {\n textColor: {\n type: \"custom\",\n label: \"Text color\",\n render: ({ value, onChange, field }) => (\n <>\n <Label label={field.label} />\n <ColorPicker value={value} onChange={onChange} />\n </>\n ),\n },\n}\n\nexport function textColorToClasses(textColor?: string): string {\n if (!textColor) return \"\"\n return `text-[${textColor}]`\n}\n\nexport const textColorDefaultProps: TextColorTraitProps = {\n textColor: undefined as string | undefined,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikethroughIcon,\n LightbulbIcon,\n} from \"lucide-react\"\n\nexport type TextDecorationTraitProps = {\n textDecoration?: Array<\n \"bold\" | \"light\" | \"italic\" | \"underline\" | \"line-through\"\n >\n}\n\nexport const textDecorationField: Fields = {\n textDecoration: {\n type: \"checkbox\",\n label: \"Text decoration\",\n layout: \"horizontal\",\n options: [\n { label: <BoldIcon size={16} />, value: \"bold\" },\n { label: <LightbulbIcon size={16} />, value: \"light\" },\n { label: <ItalicIcon size={16} />, value: \"italic\" },\n { label: <UnderlineIcon size={16} />, value: \"underline\" },\n { label: <StrikethroughIcon size={16} />, value: \"line-through\" },\n ],\n } as any,\n}\n\nexport function textDecorationToClasses(\n textDecoration?: Array<\n \"bold\" | \"light\" | \"italic\" | \"underline\" | \"line-through\"\n >\n): string {\n if (!textDecoration || textDecoration.length === 0) {\n return \"\"\n }\n\n const classes: string[] = []\n\n if (textDecoration.includes(\"bold\")) {\n classes.push(\"font-bold\")\n }\n if (textDecoration.includes(\"light\")) {\n classes.push(\"font-light\")\n }\n if (textDecoration.includes(\"italic\")) {\n classes.push(\"italic\")\n }\n if (textDecoration.includes(\"underline\")) {\n classes.push(\"underline\")\n }\n if (textDecoration.includes(\"line-through\")) {\n classes.push(\"line-through\")\n }\n\n return classes.join(\" \")\n}\n\nexport const textDecorationDefaultProps: TextDecorationTraitProps = {\n textDecoration: [],\n}\n","import { Fields } from \"@puckeditor/core\"\nimport { MinusIcon } from \"lucide-react\"\n\nexport type TextSizeTraitProps = {\n textSize?:\n | \"\"\n | \"xs\"\n | \"sm\"\n | \"base\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"5xl\"\n | \"6xl\"\n | \"7xl\"\n | \"8xl\"\n | \"9xl\"\n}\n\nexport const textSizeField: Fields = {\n textSize: {\n type: \"select\",\n label: \"Text size\",\n options: [\n { label: <MinusIcon size={16} />, value: \"\" },\n { label: \"XS (12px)\", value: \"xs\" },\n { label: \"SM (14px)\", value: \"sm\" },\n { label: \"Base (16px)\", value: \"base\" },\n { label: \"LG (18px)\", value: \"lg\" },\n { label: \"XL (20px)\", value: \"xl\" },\n { label: \"2XL (24px)\", value: \"2xl\" },\n { label: \"3XL (30px)\", value: \"3xl\" },\n { label: \"4XL (36px)\", value: \"4xl\" },\n { label: \"5XL (48px)\", value: \"5xl\" },\n { label: \"6XL (60px)\", value: \"6xl\" },\n { label: \"7XL (72px)\", value: \"7xl\" },\n { label: \"8XL (96px)\", value: \"8xl\" },\n { label: \"9XL (128px)\", value: \"9xl\" },\n ],\n } as any,\n}\n\nexport function textSizeToClasses(textSize?: string): string {\n if (!textSize) return \"\"\n return `text-${textSize}`\n}\n\nexport const textSizeDefaultProps: TextSizeTraitProps = {\n textSize: \"\" as const,\n}\n","import { Fields } from \"@puckeditor/core\"\nimport {\n CaseUpperIcon,\n CaseLowerIcon,\n CaseSensitiveIcon,\n MinusIcon,\n} from \"lucide-react\"\n\nexport type TextTransformTraitProps = {\n textTransform?: \"none\" | \"uppercase\" | \"lowercase\" | \"capitalize\"\n}\n\nexport const textTransformField: Fields = {\n textTransform: {\n type: \"radio\",\n label: \"Text transform\",\n options: [\n { label: <MinusIcon size={16} />, value: \"none\" },\n { label: <CaseUpperIcon size={16} />, value: \"uppercase\" },\n { label: <CaseLowerIcon size={16} />, value: \"lowercase\" },\n { label: <CaseSensitiveIcon size={16} />, value: \"capitalize\" },\n ],\n } as any,\n}\n\nexport function textTransformToClasses(textTransform?: string): string {\n if (!textTransform || textTransform === \"none\") return \"\"\n return textTransform\n}\n\nexport const textTransformDefaultProps: TextTransformTraitProps = {\n textTransform: \"none\" as const,\n}\n","export * from \"./textAlign\"\nexport * from \"./textTransform\"\nexport * from \"./textDecoration\"\nexport * from \"./textSize\"\nexport * from \"./textColor\"\nexport * from \"./lineHeight\"\nexport * from \"./fontWeight\"\n\nimport {\n TextAlignTraitProps,\n textAlignField,\n textAlignDefaultProps,\n textAlignToClasses,\n} from \"./textAlign\"\nimport {\n TextTransformTraitProps,\n textTransformField,\n textTransformDefaultProps,\n textTransformToClasses,\n} from \"./textTransform\"\nimport {\n TextDecorationTraitProps,\n textDecorationField,\n textDecorationDefaultProps,\n textDecorationToClasses,\n} from \"./textDecoration\"\nimport {\n TextSizeTraitProps,\n textSizeField,\n textSizeDefaultProps,\n textSizeToClasses,\n} from \"./textSize\"\nimport {\n TextColorTraitProps,\n textColorField,\n textColorDefaultProps,\n textColorToClasses,\n} from \"./textColor\"\nimport {\n LineHeightTraitProps,\n lineHeightField,\n lineHeightDefaultProps,\n lineHeightToClasses,\n} from \"./lineHeight\"\nimport {\n FontWeightTraitProps,\n fontWeightField,\n fontWeightDefaultProps,\n fontWeightToClasses,\n} from \"./fontWeight\"\n\nexport type TypographyTraitProps = TextAlignTraitProps &\n TextTransformTraitProps &\n TextDecorationTraitProps &\n TextSizeTraitProps &\n TextColorTraitProps &\n LineHeightTraitProps &\n FontWeightTraitProps\n\nexport const typographyFields = {\n ...textAlignField,\n ...textTransformField,\n ...textDecorationField,\n ...textSizeField,\n ...textColorField,\n ...lineHeightField,\n ...fontWeightField,\n}\n\nexport const typographyDefaultProps: TypographyTraitProps = {\n ...textAlignDefaultProps,\n ...textTransformDefaultProps,\n ...textDecorationDefaultProps,\n ...textSizeDefaultProps,\n ...textColorDefaultProps,\n ...lineHeightDefaultProps,\n ...fontWeightDefaultProps,\n}\n\nexport function typographyToClasses(\n props: Partial<TypographyTraitProps>\n): string {\n const classes = [\n textAlignToClasses(props.textAlign),\n textTransformToClasses(props.textTransform),\n textDecorationToClasses(props.textDecoration),\n textSizeToClasses(props.textSize),\n textColorToClasses(props.textColor),\n lineHeightToClasses(props.lineHeight),\n fontWeightToClasses(props.fontWeight),\n ].filter(Boolean)\n\n return classes.join(\" \")\n}\n\nexport const typographyFieldNames = [\n \"textAlign\",\n \"textTransform\",\n \"textDecoration\",\n \"textSize\",\n \"textColor\",\n \"lineHeight\",\n \"fontWeight\",\n] as const\n","import { useMemo } from \"react\"\n\n// Breakpoints pour le srcset\nconst BREAKPOINTS = [576, 768, 992, 1200, 1400]\n\n// Extensions valides pour l'optimisation\nconst VALID_EXTENSIONS = [\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\"]\n\n/**\n * Génère une URL de média avec dimensions spécifiques\n * Ex: /media/1/image_800x600.jpg\n */\nfunction getResizedMediaUrl(\n baseUrl: string,\n width: number,\n height: number\n): string {\n const mediaMatch = baseUrl.match(\n /\\/media\\/(\\d+)\\/([^_]+)_(\\d+)x(\\d+)\\.(\\w+)$/\n )\n if (mediaMatch) {\n const [, id, filename, , , ext] = mediaMatch\n return `/media/${id}/${filename}_${width}x${height}.${ext}`\n }\n return baseUrl\n}\n\n/**\n * Génère le srcset et sizes pour les images responsives\n */\nfunction generateSrcset(\n baseUrl: string,\n currentWidth: number,\n currentHeight: number\n): { srcset: string; sizes: string } | null {\n const mediaMatch = baseUrl.match(\n /\\/media\\/(\\d+)\\/([^_]+)_(\\d+)x(\\d+)\\.(\\w+)$/\n )\n if (!mediaMatch) return null\n\n const extension = mediaMatch[5].toLowerCase()\n if (!VALID_EXTENSIONS.includes(extension)) return null\n\n let srcset = \"\"\n let sizes = \"\"\n let lastAddedBreakpoint = 0\n\n BREAKPOINTS.forEach((breakpointWidth, i) => {\n if (currentWidth > breakpointWidth) {\n const calculatedHeight = Math.floor(\n (currentHeight * breakpointWidth) / currentWidth\n )\n srcset += `${getResizedMediaUrl(baseUrl, breakpointWidth, calculatedHeight)} ${breakpointWidth}w,`\n lastAddedBreakpoint = breakpointWidth\n\n if (i === 0) {\n sizes += `(max-width: ${breakpointWidth - 1}px) ${breakpointWidth}px,`\n }\n const nextBreakpoint = BREAKPOINTS[i + 1]\n if (nextBreakpoint && nextBreakpoint <= currentWidth) {\n sizes += `(min-width: ${breakpointWidth}px) and (max-width: ${nextBreakpoint - 1}px) ${nextBreakpoint}px,`\n }\n }\n })\n\n if (currentWidth > lastAddedBreakpoint) {\n srcset += `${getResizedMediaUrl(baseUrl, currentWidth, currentHeight)} ${currentWidth}w`\n sizes += `(min-width: ${lastAddedBreakpoint}px) ${currentWidth}px`\n }\n\n srcset = srcset.replace(/,$/, \"\")\n sizes = sizes.replace(/,$/, \"\")\n\n return srcset && sizes ? { srcset, sizes } : null\n}\n\n/**\n * Génère les URLs webp à partir d'un srcset\n */\nfunction getWebpSrcset(srcset: string): string {\n return srcset.replace(/\\.(jpg|jpeg|png|gif|bmp)/gi, \".webp\")\n}\n\n/**\n * Extrait les dimensions depuis une URL de média\n */\nfunction extractDimensionsFromUrl(\n url: string\n): { width: number; height: number } | null {\n const match = url.match(/_(\\d+)x(\\d+)\\.\\w+$/)\n if (match) {\n return { width: parseInt(match[1], 10), height: parseInt(match[2], 10) }\n }\n return null\n}\n\nexport type OptimizedImageAttrs = {\n srcset?: string\n sizes?: string\n webpSrcset?: string\n}\n\n/**\n * Hook pour générer les attributs d'optimisation d'une image\n */\nexport function useOptimizedImage(\n src: string | undefined\n): OptimizedImageAttrs | null {\n return useMemo(() => {\n if (!src) return null\n\n const isMediaUrl = src.includes(\"/media/\")\n if (!isMediaUrl) return null\n\n const dimensions = extractDimensionsFromUrl(src)\n if (!dimensions) return null\n\n const responsive = generateSrcset(\n src,\n dimensions.width,\n dimensions.height\n )\n\n return {\n srcset: responsive?.srcset,\n sizes: responsive?.sizes,\n webpSrcset: responsive?.srcset\n ? getWebpSrcset(responsive.srcset)\n : undefined,\n }\n }, [src])\n}\n"],"mappings":"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"}