acai-ui-library 0.1.13 → 0.1.14

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.
Files changed (63) hide show
  1. package/dist/components/alert.cjs +3 -2
  2. package/dist/components/alert.cjs.map +1 -1
  3. package/dist/components/alert.js +3 -2
  4. package/dist/components/alert.js.map +1 -1
  5. package/dist/components/card.cjs +1 -1
  6. package/dist/components/card.cjs.map +1 -1
  7. package/dist/components/card.js +1 -1
  8. package/dist/components/card.js.map +1 -1
  9. package/dist/components/checkbox.cjs +2 -1
  10. package/dist/components/checkbox.cjs.map +1 -1
  11. package/dist/components/checkbox.js +2 -1
  12. package/dist/components/checkbox.js.map +1 -1
  13. package/dist/components/data-table.cjs +2 -1
  14. package/dist/components/data-table.cjs.map +1 -1
  15. package/dist/components/data-table.js +2 -1
  16. package/dist/components/data-table.js.map +1 -1
  17. package/dist/components/date-picker.cjs.map +1 -1
  18. package/dist/components/date-picker.js.map +1 -1
  19. package/dist/components/impersonation-banner.cjs +137 -0
  20. package/dist/components/impersonation-banner.cjs.map +1 -0
  21. package/dist/components/impersonation-banner.d.cts +36 -0
  22. package/dist/components/impersonation-banner.d.ts +36 -0
  23. package/dist/components/impersonation-banner.js +101 -0
  24. package/dist/components/impersonation-banner.js.map +1 -0
  25. package/dist/components/input.cjs +2 -1
  26. package/dist/components/input.cjs.map +1 -1
  27. package/dist/components/input.js +2 -1
  28. package/dist/components/input.js.map +1 -1
  29. package/dist/components/item.cjs +1 -2
  30. package/dist/components/item.cjs.map +1 -1
  31. package/dist/components/item.js +1 -2
  32. package/dist/components/item.js.map +1 -1
  33. package/dist/components/pagination.cjs +3 -1
  34. package/dist/components/pagination.cjs.map +1 -1
  35. package/dist/components/pagination.d.cts +1 -1
  36. package/dist/components/pagination.d.ts +1 -1
  37. package/dist/components/pagination.js +3 -1
  38. package/dist/components/pagination.js.map +1 -1
  39. package/dist/components/read-only-guard.cjs +103 -0
  40. package/dist/components/read-only-guard.cjs.map +1 -0
  41. package/dist/components/read-only-guard.d.cts +40 -0
  42. package/dist/components/read-only-guard.d.ts +40 -0
  43. package/dist/components/read-only-guard.js +64 -0
  44. package/dist/components/read-only-guard.js.map +1 -0
  45. package/dist/components/stepper.cjs.map +1 -1
  46. package/dist/components/stepper.js.map +1 -1
  47. package/dist/components/typography.cjs +4 -4
  48. package/dist/components/typography.cjs.map +1 -1
  49. package/dist/components/typography.js +4 -4
  50. package/dist/components/typography.js.map +1 -1
  51. package/dist/index.cjs +236 -12
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.cts +3 -0
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.js +224 -12
  56. package/dist/index.js.map +1 -1
  57. package/dist/lib/impersonation.cjs +127 -0
  58. package/dist/lib/impersonation.cjs.map +1 -0
  59. package/dist/lib/impersonation.d.cts +45 -0
  60. package/dist/lib/impersonation.d.ts +45 -0
  61. package/dist/lib/impersonation.js +86 -0
  62. package/dist/lib/impersonation.js.map +1 -0
  63. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/input.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Eye, EyeOff, X } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst inputVariants = cva(\n \"flex w-full rounded-md border bg-background transition-[color,border-color,box-shadow] duration-150 file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-muted-foreground focus-within:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n variant: {\n default:\n \"border-input hover:border-muted-foreground focus-within:border-[var(--hc-primary-500)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-primary-500)_22%,transparent)]\",\n error:\n \"border-[var(--hc-color-destructive)] focus-within:border-[var(--hc-color-destructive)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-color-destructive)_22%,transparent)]\",\n success:\n \"border-[var(--hc-color-success)] focus-within:border-[var(--hc-color-success)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-color-success)_22%,transparent)]\",\n },\n inputSize: {\n default: \"h-10 px-3 py-2 text-sm\",\n sm: \"h-8 px-2.5 py-1.5 text-xs\",\n lg: \"h-12 px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n inputSize: \"default\",\n },\n }\n)\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof inputVariants> {\n label?: string\n hint?: string\n leadingIcon?: React.ReactNode\n trailingIcon?: React.ReactNode\n clearable?: boolean\n onClear?: () => void\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n type,\n label,\n hint,\n variant = \"default\",\n inputSize = \"default\",\n leadingIcon,\n trailingIcon,\n clearable,\n onClear,\n disabled,\n id,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref\n ) => {\n const inputId = id || React.useId()\n const isControlled = value !== undefined\n const [internalValue, setInternalValue] = React.useState<\n string | number | readonly string[] | undefined\n >(defaultValue)\n const innerRef = React.useRef<HTMLInputElement | null>(null)\n\n React.useImperativeHandle(\n ref,\n () => innerRef.current as HTMLInputElement,\n []\n )\n\n const currentValue = isControlled ? value : internalValue\n const hasValue =\n currentValue !== undefined &&\n currentValue !== null &&\n String(currentValue).length > 0\n\n const isPassword = type === \"password\"\n const [showPassword, setShowPassword] = React.useState(false)\n const resolvedType = isPassword ? (showPassword ? \"text\" : \"password\") : type\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value)\n }\n onChange?.(e)\n }\n\n const handleClear = () => {\n if (!isControlled) {\n setInternalValue(\"\")\n }\n // Fire a synthetic input event so consumers relying on onChange receive it.\n const input = innerRef.current\n if (input) {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\"\n )?.set\n nativeInputValueSetter?.call(input, \"\")\n const event = new Event(\"input\", { bubbles: true })\n input.dispatchEvent(event)\n input.focus()\n }\n onClear?.()\n }\n\n const showClearButton = clearable && hasValue && !isPassword && !disabled\n const showPasswordToggle = isPassword && !disabled\n\n const trailingSlots = [\n showClearButton ? 1 : 0,\n showPasswordToggle ? 1 : 0,\n trailingIcon ? 1 : 0,\n ].reduce((a, b) => a + b, 0)\n\n const inputPaddingEnd =\n trailingSlots >= 2 ? \"pe-14\" : trailingSlots === 1 ? \"pe-8\" : undefined\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"input-root\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"text-sm font-medium text-foreground\",\n disabled && \"text-muted-foreground\"\n )}\n >\n {label}\n </label>\n )}\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputVariants({ variant, inputSize }),\n \"relative flex items-center gap-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n className\n )}\n >\n {leadingIcon && (\n <span className=\"shrink-0 text-muted-foreground\">\n {leadingIcon}\n </span>\n )}\n <input\n id={inputId}\n type={resolvedType}\n disabled={disabled}\n className={cn(\n \"flex-1 min-w-0 bg-transparent outline-none text-inherit placeholder:text-muted-foreground disabled:cursor-not-allowed\",\n inputPaddingEnd\n )}\n ref={innerRef}\n value={isControlled ? value : internalValue}\n defaultValue={isControlled ? undefined : undefined}\n onChange={handleChange}\n {...props}\n />\n {(showClearButton || showPasswordToggle) && (\n <span\n className=\"pointer-events-none absolute end-2 top-1/2 -translate-y-1/2 flex items-center gap-1\"\n >\n {showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n onClick={handleClear}\n tabIndex={-1}\n className=\"pointer-events-auto inline-flex size-4 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n )}\n {showPasswordToggle && (\n <button\n type=\"button\"\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n onClick={() => setShowPassword((s) => !s)}\n tabIndex={-1}\n className=\"pointer-events-auto inline-flex size-4 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <Eye className=\"size-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </span>\n )}\n {trailingIcon && !showClearButton && !showPasswordToggle && (\n <span className=\"shrink-0 text-muted-foreground\">\n {trailingIcon}\n </span>\n )}\n </div>\n {hint && (\n <p\n className={cn(\n \"text-xs\",\n variant === \"default\" && \"text-muted-foreground\",\n variant === \"error\" && \"text-destructive\",\n variant === \"success\" && \"text-success\"\n )}\n >\n {hint}\n </p>\n )}\n </div>\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input, inputVariants }\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/input.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Eye, EyeOff, X } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst inputVariants = cva(\n \"flex w-full rounded-md border bg-background transition-[color,border-color,box-shadow] duration-150 file:border-0 file:bg-transparent file:font-medium file:text-foreground placeholder:text-muted-foreground focus-within:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n {\n variants: {\n variant: {\n default:\n \"border-input hover:border-muted-foreground focus-within:border-[var(--hc-primary-500)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-primary-500)_22%,transparent)]\",\n error:\n \"border-[var(--hc-color-destructive)] focus-within:border-[var(--hc-color-destructive)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-color-destructive)_22%,transparent)]\",\n success:\n \"border-[var(--hc-color-success)] focus-within:border-[var(--hc-color-success)] focus-within:ring-[3px] focus-within:ring-[color-mix(in_srgb,var(--hc-color-success)_22%,transparent)]\",\n },\n inputSize: {\n default: \"h-10 px-3 py-2 text-sm\",\n sm: \"h-8 px-2.5 py-1.5 text-xs\",\n lg: \"h-12 px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n inputSize: \"default\",\n },\n }\n)\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof inputVariants> {\n label?: string\n hint?: string\n leadingIcon?: React.ReactNode\n trailingIcon?: React.ReactNode\n clearable?: boolean\n onClear?: () => void\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n type,\n label,\n hint,\n variant = \"default\",\n inputSize = \"default\",\n leadingIcon,\n trailingIcon,\n clearable,\n onClear,\n disabled,\n id,\n value,\n defaultValue,\n onChange,\n ...props\n },\n ref\n ) => {\n const generatedId = React.useId()\n const inputId = id || generatedId\n const isControlled = value !== undefined\n const [internalValue, setInternalValue] = React.useState<\n string | number | readonly string[] | undefined\n >(defaultValue)\n const innerRef = React.useRef<HTMLInputElement | null>(null)\n\n React.useImperativeHandle(\n ref,\n () => innerRef.current as HTMLInputElement,\n []\n )\n\n const currentValue = isControlled ? value : internalValue\n const hasValue =\n currentValue !== undefined &&\n currentValue !== null &&\n String(currentValue).length > 0\n\n const isPassword = type === \"password\"\n const [showPassword, setShowPassword] = React.useState(false)\n const resolvedType = isPassword ? (showPassword ? \"text\" : \"password\") : type\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalValue(e.target.value)\n }\n onChange?.(e)\n }\n\n const handleClear = () => {\n if (!isControlled) {\n setInternalValue(\"\")\n }\n // Fire a synthetic input event so consumers relying on onChange receive it.\n const input = innerRef.current\n if (input) {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n \"value\"\n )?.set\n nativeInputValueSetter?.call(input, \"\")\n const event = new Event(\"input\", { bubbles: true })\n input.dispatchEvent(event)\n input.focus()\n }\n onClear?.()\n }\n\n const showClearButton = clearable && hasValue && !isPassword && !disabled\n const showPasswordToggle = isPassword && !disabled\n\n const trailingSlots = [\n showClearButton ? 1 : 0,\n showPasswordToggle ? 1 : 0,\n trailingIcon ? 1 : 0,\n ].reduce((a, b) => a + b, 0)\n\n const inputPaddingEnd =\n trailingSlots >= 2 ? \"pe-14\" : trailingSlots === 1 ? \"pe-8\" : undefined\n\n return (\n <div className=\"flex flex-col gap-1.5\" data-slot=\"input-root\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n \"text-sm font-medium text-foreground\",\n disabled && \"text-muted-foreground\"\n )}\n >\n {label}\n </label>\n )}\n <div\n data-slot=\"input-wrapper\"\n className={cn(\n inputVariants({ variant, inputSize }),\n \"relative flex items-center gap-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n className\n )}\n >\n {leadingIcon && (\n <span className=\"shrink-0 text-muted-foreground\">\n {leadingIcon}\n </span>\n )}\n <input\n id={inputId}\n type={resolvedType}\n disabled={disabled}\n className={cn(\n \"flex-1 min-w-0 bg-transparent outline-none text-inherit placeholder:text-muted-foreground disabled:cursor-not-allowed\",\n inputPaddingEnd\n )}\n ref={innerRef}\n value={isControlled ? value : internalValue}\n defaultValue={isControlled ? undefined : undefined}\n onChange={handleChange}\n {...props}\n />\n {(showClearButton || showPasswordToggle) && (\n <span\n className=\"pointer-events-none absolute end-2 top-1/2 -translate-y-1/2 flex items-center gap-1\"\n >\n {showClearButton && (\n <button\n type=\"button\"\n aria-label=\"Clear\"\n onClick={handleClear}\n tabIndex={-1}\n className=\"pointer-events-auto inline-flex size-4 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n )}\n {showPasswordToggle && (\n <button\n type=\"button\"\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n onClick={() => setShowPassword((s) => !s)}\n tabIndex={-1}\n className=\"pointer-events-auto inline-flex size-4 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] focus-visible:ring-offset-1 focus-visible:ring-offset-background\"\n >\n {showPassword ? (\n <EyeOff className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <Eye className=\"size-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </span>\n )}\n {trailingIcon && !showClearButton && !showPasswordToggle && (\n <span className=\"shrink-0 text-muted-foreground\">\n {trailingIcon}\n </span>\n )}\n </div>\n {hint && (\n <p\n className={cn(\n \"text-xs\",\n variant === \"default\" && \"text-muted-foreground\",\n variant === \"error\" && \"text-destructive\",\n variant === \"success\" && \"text-success\"\n )}\n >\n {hint}\n </p>\n )}\n </div>\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input, inputVariants }\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":"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","names":[]}
@@ -54,7 +54,7 @@ var Item = React.forwardRef(
54
54
  ({ className, clickable, onClick, children, ...props }, ref) => {
55
55
  const baseClasses = "flex items-center gap-3 px-4 py-3 rounded-md";
56
56
  const interactiveClasses = "cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start";
57
- if (clickable) {
57
+ if (clickable || onClick) {
58
58
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
59
59
  "button",
60
60
  {
@@ -71,7 +71,6 @@ var Item = React.forwardRef(
71
71
  "div",
72
72
  {
73
73
  ref,
74
- onClick,
75
74
  className: cn(baseClasses, className),
76
75
  ...props,
77
76
  children
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/item.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ItemProps extends React.HTMLAttributes<HTMLElement> {\n /** When true, renders as a focusable button with hover/focus styles */\n clickable?: boolean\n /** Click handler; works for both clickable and non-clickable items */\n onClick?: React.MouseEventHandler<HTMLElement>\n}\n\nconst Item = React.forwardRef<HTMLElement, ItemProps>(\n ({ className, clickable, onClick, children, ...props }, ref) => {\n const baseClasses = \"flex items-center gap-3 px-4 py-3 rounded-md\"\n const interactiveClasses =\n \"cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start\"\n\n if (clickable) {\n return (\n <button\n type=\"button\"\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={cn(baseClasses, interactiveClasses, className)}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n )\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n onClick={onClick as React.MouseEventHandler<HTMLDivElement>}\n className={cn(baseClasses, className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </div>\n )\n }\n)\nItem.displayName = \"Item\"\n\nconst ItemMedia = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center\", className)}\n {...props}\n />\n))\nItemMedia.displayName = \"ItemMedia\"\n\nconst ItemContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex-1 min-w-0 flex flex-col gap-0.5\", className)}\n {...props}\n />\n))\nItemContent.displayName = \"ItemContent\"\n\nconst ItemTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm font-medium text-foreground truncate\", className)}\n {...props}\n />\n))\nItemTitle.displayName = \"ItemTitle\"\n\nconst ItemDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-xs text-muted-foreground truncate\", className)}\n {...props}\n />\n))\nItemDescription.displayName = \"ItemDescription\"\n\nconst ItemActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center gap-1 ms-auto\", className)}\n {...props}\n />\n))\nItemActions.displayName = \"ItemActions\"\n\nconst ItemGroup = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col divide-y divide-[var(--hc-color-border-subtle)] rounded-md border border-[var(--hc-color-border-subtle)] bg-background overflow-hidden\",\n className\n )}\n {...props}\n />\n))\nItemGroup.displayName = \"ItemGroup\"\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemTitle,\n ItemDescription,\n ItemActions,\n ItemGroup,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;;;ACAvB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADaQ;AARR,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,WAAW,SAAS,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC9D,UAAM,cAAc;AACpB,UAAM,qBACJ;AAEF,QAAI,WAAW;AACb,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,WAAW,GAAG,aAAa,oBAAoB,SAAS;AAAA,UACvD,GAAI;AAAA,UAEJ;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW,GAAG,aAAa,SAAS;AAAA,QACnC,GAAI;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAEnB,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wCAAwC,SAAS;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,iBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/components/item.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ItemProps extends React.HTMLAttributes<HTMLElement> {\n /** When true, renders as a focusable button with hover/focus styles */\n clickable?: boolean\n /** Click handler; works for both clickable and non-clickable items */\n onClick?: React.MouseEventHandler<HTMLElement>\n}\n\nconst Item = React.forwardRef<HTMLElement, ItemProps>(\n ({ className, clickable, onClick, children, ...props }, ref) => {\n const baseClasses = \"flex items-center gap-3 px-4 py-3 rounded-md\"\n const interactiveClasses =\n \"cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start\"\n\n if (clickable || onClick) {\n return (\n <button\n type=\"button\"\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={cn(baseClasses, interactiveClasses, className)}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n )\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={cn(baseClasses, className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </div>\n )\n }\n)\nItem.displayName = \"Item\"\n\nconst ItemMedia = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center\", className)}\n {...props}\n />\n))\nItemMedia.displayName = \"ItemMedia\"\n\nconst ItemContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex-1 min-w-0 flex flex-col gap-0.5\", className)}\n {...props}\n />\n))\nItemContent.displayName = \"ItemContent\"\n\nconst ItemTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm font-medium text-foreground truncate\", className)}\n {...props}\n />\n))\nItemTitle.displayName = \"ItemTitle\"\n\nconst ItemDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-xs text-muted-foreground truncate\", className)}\n {...props}\n />\n))\nItemDescription.displayName = \"ItemDescription\"\n\nconst ItemActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center gap-1 ms-auto\", className)}\n {...props}\n />\n))\nItemActions.displayName = \"ItemActions\"\n\nconst ItemGroup = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col divide-y divide-[var(--hc-color-border-subtle)] rounded-md border border-[var(--hc-color-border-subtle)] bg-background overflow-hidden\",\n className\n )}\n {...props}\n />\n))\nItemGroup.displayName = \"ItemGroup\"\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemTitle,\n ItemDescription,\n ItemActions,\n ItemGroup,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;;;ACAvB,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADaQ;AARR,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,WAAW,SAAS,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC9D,UAAM,cAAc;AACpB,UAAM,qBACJ;AAEF,QAAI,aAAa,SAAS;AACxB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,WAAW,GAAG,aAAa,oBAAoB,SAAS;AAAA,UACvD,GAAI;AAAA,UAEJ;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,aAAa,SAAS;AAAA,QACnC,GAAI;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAEnB,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wCAAwC,SAAS;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,iBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;","names":[]}
@@ -14,7 +14,7 @@ var Item = React.forwardRef(
14
14
  ({ className, clickable, onClick, children, ...props }, ref) => {
15
15
  const baseClasses = "flex items-center gap-3 px-4 py-3 rounded-md";
16
16
  const interactiveClasses = "cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start";
17
- if (clickable) {
17
+ if (clickable || onClick) {
18
18
  return /* @__PURE__ */ jsx(
19
19
  "button",
20
20
  {
@@ -31,7 +31,6 @@ var Item = React.forwardRef(
31
31
  "div",
32
32
  {
33
33
  ref,
34
- onClick,
35
34
  className: cn(baseClasses, className),
36
35
  ...props,
37
36
  children
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/item.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ItemProps extends React.HTMLAttributes<HTMLElement> {\n /** When true, renders as a focusable button with hover/focus styles */\n clickable?: boolean\n /** Click handler; works for both clickable and non-clickable items */\n onClick?: React.MouseEventHandler<HTMLElement>\n}\n\nconst Item = React.forwardRef<HTMLElement, ItemProps>(\n ({ className, clickable, onClick, children, ...props }, ref) => {\n const baseClasses = \"flex items-center gap-3 px-4 py-3 rounded-md\"\n const interactiveClasses =\n \"cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start\"\n\n if (clickable) {\n return (\n <button\n type=\"button\"\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={cn(baseClasses, interactiveClasses, className)}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n )\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n onClick={onClick as React.MouseEventHandler<HTMLDivElement>}\n className={cn(baseClasses, className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </div>\n )\n }\n)\nItem.displayName = \"Item\"\n\nconst ItemMedia = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center\", className)}\n {...props}\n />\n))\nItemMedia.displayName = \"ItemMedia\"\n\nconst ItemContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex-1 min-w-0 flex flex-col gap-0.5\", className)}\n {...props}\n />\n))\nItemContent.displayName = \"ItemContent\"\n\nconst ItemTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm font-medium text-foreground truncate\", className)}\n {...props}\n />\n))\nItemTitle.displayName = \"ItemTitle\"\n\nconst ItemDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-xs text-muted-foreground truncate\", className)}\n {...props}\n />\n))\nItemDescription.displayName = \"ItemDescription\"\n\nconst ItemActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center gap-1 ms-auto\", className)}\n {...props}\n />\n))\nItemActions.displayName = \"ItemActions\"\n\nconst ItemGroup = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col divide-y divide-[var(--hc-color-border-subtle)] rounded-md border border-[var(--hc-color-border-subtle)] bg-background overflow-hidden\",\n className\n )}\n {...props}\n />\n))\nItemGroup.displayName = \"ItemGroup\"\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemTitle,\n ItemDescription,\n ItemActions,\n ItemGroup,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";AAAA,YAAY,WAAW;;;ACAvB,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADaQ;AARR,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,WAAW,SAAS,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC9D,UAAM,cAAc;AACpB,UAAM,qBACJ;AAEF,QAAI,WAAW;AACb,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,WAAW,GAAG,aAAa,oBAAoB,SAAS;AAAA,UACvD,GAAI;AAAA,UAEJ;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW,GAAG,aAAa,SAAS;AAAA,QACnC,GAAI;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAEnB,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wCAAwC,SAAS;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,iBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/components/item.tsx","../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\n\nexport interface ItemProps extends React.HTMLAttributes<HTMLElement> {\n /** When true, renders as a focusable button with hover/focus styles */\n clickable?: boolean\n /** Click handler; works for both clickable and non-clickable items */\n onClick?: React.MouseEventHandler<HTMLElement>\n}\n\nconst Item = React.forwardRef<HTMLElement, ItemProps>(\n ({ className, clickable, onClick, children, ...props }, ref) => {\n const baseClasses = \"flex items-center gap-3 px-4 py-3 rounded-md\"\n const interactiveClasses =\n \"cursor-pointer transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--hc-primary-500)] w-full text-start\"\n\n if (clickable || onClick) {\n return (\n <button\n type=\"button\"\n ref={ref as React.Ref<HTMLButtonElement>}\n onClick={onClick}\n className={cn(baseClasses, interactiveClasses, className)}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {children}\n </button>\n )\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={cn(baseClasses, className)}\n {...(props as React.HTMLAttributes<HTMLDivElement>)}\n >\n {children}\n </div>\n )\n }\n)\nItem.displayName = \"Item\"\n\nconst ItemMedia = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center\", className)}\n {...props}\n />\n))\nItemMedia.displayName = \"ItemMedia\"\n\nconst ItemContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex-1 min-w-0 flex flex-col gap-0.5\", className)}\n {...props}\n />\n))\nItemContent.displayName = \"ItemContent\"\n\nconst ItemTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm font-medium text-foreground truncate\", className)}\n {...props}\n />\n))\nItemTitle.displayName = \"ItemTitle\"\n\nconst ItemDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-xs text-muted-foreground truncate\", className)}\n {...props}\n />\n))\nItemDescription.displayName = \"ItemDescription\"\n\nconst ItemActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"shrink-0 flex items-center gap-1 ms-auto\", className)}\n {...props}\n />\n))\nItemActions.displayName = \"ItemActions\"\n\nconst ItemGroup = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col divide-y divide-[var(--hc-color-border-subtle)] rounded-md border border-[var(--hc-color-border-subtle)] bg-background overflow-hidden\",\n className\n )}\n {...props}\n />\n))\nItemGroup.displayName = \"ItemGroup\"\n\nexport {\n Item,\n ItemMedia,\n ItemContent,\n ItemTitle,\n ItemDescription,\n ItemActions,\n ItemGroup,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":";AAAA,YAAY,WAAW;;;ACAvB,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADaQ;AARR,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,WAAW,SAAS,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC9D,UAAM,cAAc;AACpB,UAAM,qBACJ;AAEF,QAAI,aAAa,SAAS;AACxB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,WAAW,GAAG,aAAa,oBAAoB,SAAS;AAAA,UACvD,GAAI;AAAA,UAEJ;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,aAAa,SAAS;AAAA,QACnC,GAAI;AAAA,QAEJ;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAEnB,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,wCAAwC,SAAS;AAAA,IAC9D,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,IACtE,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;AAExB,IAAM,kBAAwB,iBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAAc;AAE9B,IAAM,cAAoB,iBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAAc;AAE1B,IAAM,YAAkB,iBAGtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,UAAU,cAAc;","names":[]}
@@ -153,6 +153,7 @@ var PaginationLink = ({
153
153
  className,
154
154
  isActive,
155
155
  size = "icon",
156
+ children,
156
157
  ...props
157
158
  }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
158
159
  "a",
@@ -165,7 +166,8 @@ var PaginationLink = ({
165
166
  }),
166
167
  className
167
168
  ),
168
- ...props
169
+ ...props,
170
+ children
169
171
  }
170
172
  );
171
173
  PaginationLink.displayName = "PaginationLink";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/pagination.tsx","../../src/lib/utils.ts","../../src/components/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\nimport { buttonVariants, type ButtonProps } from \"./button\"\n\n/* ----------------------------------- Nav ---------------------------------- */\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\n/* --------------------------------- Content -------------------------------- */\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\n/* ---------------------------------- Item ---------------------------------- */\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\n/* ---------------------------------- Link ---------------------------------- */\n\ntype PaginationLinkProps = {\n isActive?: boolean\n size?: ButtonProps[\"size\"]\n} & React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"default\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\n/* -------------------------------- Previous -------------------------------- */\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"size-4\" />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\n/* ---------------------------------- Next ---------------------------------- */\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRight className=\"size-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\n/* -------------------------------- Ellipsis -------------------------------- */\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex size-10 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\n/* ---------------------------------- Info ---------------------------------- */\n\ninterface PaginationInfoProps extends React.ComponentProps<\"div\"> {\n currentPage: number\n totalPages: number\n formatPage?: (page: number) => string\n}\n\nconst PaginationInfo = ({\n currentPage,\n totalPages,\n formatPage = (p) => String(p).padStart(2, \"0\"),\n className,\n ...props\n}: PaginationInfoProps) => (\n <div\n className={cn(\"inline-flex items-center gap-1.5 text-sm\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Page</span>\n <span className=\"font-medium text-foreground\">{formatPage(currentPage)}</span>\n <span className=\"text-muted-foreground\">of</span>\n <span className=\"font-medium text-foreground\">{formatPage(totalPages)}</span>\n </div>\n)\nPaginationInfo.displayName = \"PaginationInfo\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationInfo,\n type PaginationLinkProps,\n type PaginationInfoProps,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Loader2 } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary-hover\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive-hover\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary-hover\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link:\n \"text-primary underline-offset-4 hover:underline\",\n success:\n \"bg-success text-success-foreground hover:bg-success-hover\",\n },\n size: {\n xs: \"h-7 px-2.5 text-xs\",\n sm: \"h-9 px-3\",\n default: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n \"icon-sm\": \"h-8 w-8\",\n },\n shape: {\n default: \"rounded-md\",\n rounded: \"rounded-lg\",\n pill: \"rounded-full\",\n square: \"rounded-none\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n prefixIcon?: React.ReactNode\n suffixIcon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n shape,\n asChild = false,\n loading = false,\n prefixIcon,\n suffixIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const isDisabled = disabled || loading\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, shape, className }))}\n ref={ref}\n disabled={isDisabled}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" />}\n {!loading && prefixIcon}\n {children}\n {suffixIcon}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,SAAuB;AACvB,IAAAC,uBAA0D;;;ACD1D,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACJA,YAAuB;AACvB,wBAAqB;AACrB,sCAAuC;AACvC,0BAAwB;AA4ElB;AAzEN,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OACE;AAAA,QACF,MACE;AAAA,QACF,SACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAWA,IAAM,SAAe;AAAA,EACnB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,OAAO,UAAU,yBAAO;AAC9B,UAAM,aAAa,YAAY;AAE/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,OAAO,UAAU,CAAC,CAAC;AAAA,QACjE;AAAA,QACA,UAAU;AAAA,QACT,GAAG;AAAA,QAEH;AAAA,qBAAW,4CAAC,+BAAQ,WAAU,gBAAe;AAAA,UAC7C,CAAC,WAAW;AAAA,UACZ;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;AFtFnB,IAAAC,sBAAA;AADF,IAAM,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,MACxC;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,cAAW;AAAA,IACX,WAAW,GAAG,sCAAsC,SAAS;AAAA,IAC5D,GAAG;AAAA;AACN;AAEF,WAAW,cAAc;AAIzB,IAAM,oBAA0B,kBAG9B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,WAAW,GAAG,oCAAoC,SAAS;AAAA,IAC1D,GAAG;AAAA;AACN,CACD;AACD,kBAAkB,cAAc;AAIhC,IAAM,iBAAuB,kBAG3B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,6CAAC,QAAG,KAAU,WAAW,GAAG,IAAI,SAAS,GAAI,GAAG,OAAO,CACxD;AACD,eAAe,cAAc;AAS7B,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,gBAAc,WAAW,SAAS;AAAA,IAClC,WAAW;AAAA,MACT,eAAe;AAAA,QACb,SAAS,WAAW,YAAY;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAEF,eAAe,cAAc;AAI7B,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,cAAW;AAAA,IACX,MAAK;AAAA,IACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,IACtC,GAAG;AAAA,IAEJ;AAAA,mDAAC,oCAAY,WAAU,UAAS;AAAA,MAChC,6CAAC,UAAK,WAAU,mBAAkB,sBAAQ;AAAA;AAAA;AAC5C;AAEF,mBAAmB,cAAc;AAIjC,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,cAAW;AAAA,IACX,MAAK;AAAA,IACL,WAAW,GAAG,gBAAgB,SAAS;AAAA,IACtC,GAAG;AAAA,IAEJ;AAAA,mDAAC,UAAK,WAAU,mBAAkB,kBAAI;AAAA,MACtC,6CAAC,qCAAa,WAAU,UAAS;AAAA;AAAA;AACnC;AAEF,eAAe,cAAc;AAI7B,IAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,eAAW;AAAA,IACX,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA,IAEJ;AAAA,mDAAC,uCAAe,WAAU,UAAS;AAAA,MACnC,6CAAC,UAAK,WAAU,WAAU,wBAAU;AAAA;AAAA;AACtC;AAEF,mBAAmB,cAAc;AAUjC,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,aAAa,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAC7C;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA,IAEJ;AAAA,mDAAC,UAAK,WAAU,yBAAwB,kBAAI;AAAA,MAC5C,6CAAC,UAAK,WAAU,+BAA+B,qBAAW,WAAW,GAAE;AAAA,MACvE,6CAAC,UAAK,WAAU,yBAAwB,gBAAE;AAAA,MAC1C,6CAAC,UAAK,WAAU,+BAA+B,qBAAW,UAAU,GAAE;AAAA;AAAA;AACxE;AAEF,eAAe,cAAc;","names":["React","import_lucide_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/components/pagination.tsx","../../src/lib/utils.ts","../../src/components/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\nimport { buttonVariants, type ButtonProps } from \"./button\"\n\n/* ----------------------------------- Nav ---------------------------------- */\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\n/* --------------------------------- Content -------------------------------- */\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\n/* ---------------------------------- Item ---------------------------------- */\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\n/* ---------------------------------- Link ---------------------------------- */\n\ntype PaginationLinkProps = {\n isActive?: boolean\n size?: ButtonProps[\"size\"]\n} & React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n children,\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"default\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </a>\n)\nPaginationLink.displayName = \"PaginationLink\"\n\n/* -------------------------------- Previous -------------------------------- */\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"size-4\" />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\n/* ---------------------------------- Next ---------------------------------- */\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRight className=\"size-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\n/* -------------------------------- Ellipsis -------------------------------- */\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex size-10 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\n/* ---------------------------------- Info ---------------------------------- */\n\ninterface PaginationInfoProps extends React.ComponentProps<\"div\"> {\n currentPage: number\n totalPages: number\n formatPage?: (page: number) => string\n}\n\nconst PaginationInfo = ({\n currentPage,\n totalPages,\n formatPage = (p) => String(p).padStart(2, \"0\"),\n className,\n ...props\n}: PaginationInfoProps) => (\n <div\n className={cn(\"inline-flex items-center gap-1.5 text-sm\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Page</span>\n <span className=\"font-medium text-foreground\">{formatPage(currentPage)}</span>\n <span className=\"text-muted-foreground\">of</span>\n <span className=\"font-medium text-foreground\">{formatPage(totalPages)}</span>\n </div>\n)\nPaginationInfo.displayName = \"PaginationInfo\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationInfo,\n type PaginationLinkProps,\n type PaginationInfoProps,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Loader2 } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary-hover\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive-hover\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary-hover\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link:\n \"text-primary underline-offset-4 hover:underline\",\n success:\n \"bg-success text-success-foreground hover:bg-success-hover\",\n },\n size: {\n xs: \"h-7 px-2.5 text-xs\",\n sm: \"h-9 px-3\",\n default: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n \"icon-sm\": \"h-8 w-8\",\n },\n shape: {\n default: \"rounded-md\",\n rounded: \"rounded-lg\",\n pill: \"rounded-full\",\n square: \"rounded-none\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n prefixIcon?: React.ReactNode\n suffixIcon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n shape,\n asChild = false,\n loading = false,\n prefixIcon,\n suffixIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const isDisabled = disabled || loading\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, shape, className }))}\n ref={ref}\n disabled={isDisabled}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" />}\n {!loading && prefixIcon}\n {children}\n {suffixIcon}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n"],"mappings":"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","names":["React","import_lucide_react","import_jsx_runtime"]}
@@ -15,7 +15,7 @@ type PaginationLinkProps = {
15
15
  size?: ButtonProps["size"];
16
16
  } & React.ComponentProps<"a">;
17
17
  declare const PaginationLink: {
18
- ({ className, isActive, size, ...props }: PaginationLinkProps): react_jsx_runtime.JSX.Element;
18
+ ({ className, isActive, size, children, ...props }: PaginationLinkProps): react_jsx_runtime.JSX.Element;
19
19
  displayName: string;
20
20
  };
21
21
  declare const PaginationPrevious: {
@@ -15,7 +15,7 @@ type PaginationLinkProps = {
15
15
  size?: ButtonProps["size"];
16
16
  } & React.ComponentProps<"a">;
17
17
  declare const PaginationLink: {
18
- ({ className, isActive, size, ...props }: PaginationLinkProps): react_jsx_runtime.JSX.Element;
18
+ ({ className, isActive, size, children, ...props }: PaginationLinkProps): react_jsx_runtime.JSX.Element;
19
19
  displayName: string;
20
20
  };
21
21
  declare const PaginationPrevious: {
@@ -112,6 +112,7 @@ var PaginationLink = ({
112
112
  className,
113
113
  isActive,
114
114
  size = "icon",
115
+ children,
115
116
  ...props
116
117
  }) => /* @__PURE__ */ jsx2(
117
118
  "a",
@@ -124,7 +125,8 @@ var PaginationLink = ({
124
125
  }),
125
126
  className
126
127
  ),
127
- ...props
128
+ ...props,
129
+ children
128
130
  }
129
131
  );
130
132
  PaginationLink.displayName = "PaginationLink";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/pagination.tsx","../../src/lib/utils.ts","../../src/components/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\nimport { buttonVariants, type ButtonProps } from \"./button\"\n\n/* ----------------------------------- Nav ---------------------------------- */\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\n/* --------------------------------- Content -------------------------------- */\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\n/* ---------------------------------- Item ---------------------------------- */\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\n/* ---------------------------------- Link ---------------------------------- */\n\ntype PaginationLinkProps = {\n isActive?: boolean\n size?: ButtonProps[\"size\"]\n} & React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"default\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\n/* -------------------------------- Previous -------------------------------- */\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"size-4\" />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\n/* ---------------------------------- Next ---------------------------------- */\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRight className=\"size-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\n/* -------------------------------- Ellipsis -------------------------------- */\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex size-10 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\n/* ---------------------------------- Info ---------------------------------- */\n\ninterface PaginationInfoProps extends React.ComponentProps<\"div\"> {\n currentPage: number\n totalPages: number\n formatPage?: (page: number) => string\n}\n\nconst PaginationInfo = ({\n currentPage,\n totalPages,\n formatPage = (p) => String(p).padStart(2, \"0\"),\n className,\n ...props\n}: PaginationInfoProps) => (\n <div\n className={cn(\"inline-flex items-center gap-1.5 text-sm\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Page</span>\n <span className=\"font-medium text-foreground\">{formatPage(currentPage)}</span>\n <span className=\"text-muted-foreground\">of</span>\n <span className=\"font-medium text-foreground\">{formatPage(totalPages)}</span>\n </div>\n)\nPaginationInfo.displayName = \"PaginationInfo\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationInfo,\n type PaginationLinkProps,\n type PaginationInfoProps,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Loader2 } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary-hover\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive-hover\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary-hover\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link:\n \"text-primary underline-offset-4 hover:underline\",\n success:\n \"bg-success text-success-foreground hover:bg-success-hover\",\n },\n size: {\n xs: \"h-7 px-2.5 text-xs\",\n sm: \"h-9 px-3\",\n default: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n \"icon-sm\": \"h-8 w-8\",\n },\n shape: {\n default: \"rounded-md\",\n rounded: \"rounded-lg\",\n pill: \"rounded-full\",\n square: \"rounded-none\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n prefixIcon?: React.ReactNode\n suffixIcon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n shape,\n asChild = false,\n loading = false,\n prefixIcon,\n suffixIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const isDisabled = disabled || loading\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, shape, className }))}\n ref={ref}\n disabled={isDisabled}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" />}\n {!loading && prefixIcon}\n {children}\n {suffixIcon}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n"],"mappings":"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","names":["React","jsx","jsxs"]}
1
+ {"version":3,"sources":["../../src/components/pagination.tsx","../../src/lib/utils.ts","../../src/components/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\nimport { buttonVariants, type ButtonProps } from \"./button\"\n\n/* ----------------------------------- Nav ---------------------------------- */\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\n/* --------------------------------- Content -------------------------------- */\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\n/* ---------------------------------- Item ---------------------------------- */\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\n/* ---------------------------------- Link ---------------------------------- */\n\ntype PaginationLinkProps = {\n isActive?: boolean\n size?: ButtonProps[\"size\"]\n} & React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n children,\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"default\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </a>\n)\nPaginationLink.displayName = \"PaginationLink\"\n\n/* -------------------------------- Previous -------------------------------- */\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"size-4\" />\n <span className=\"hidden sm:block\">Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\n/* ---------------------------------- Next ---------------------------------- */\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 px-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">Next</span>\n <ChevronRight className=\"size-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\n/* -------------------------------- Ellipsis -------------------------------- */\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex size-10 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\n/* ---------------------------------- Info ---------------------------------- */\n\ninterface PaginationInfoProps extends React.ComponentProps<\"div\"> {\n currentPage: number\n totalPages: number\n formatPage?: (page: number) => string\n}\n\nconst PaginationInfo = ({\n currentPage,\n totalPages,\n formatPage = (p) => String(p).padStart(2, \"0\"),\n className,\n ...props\n}: PaginationInfoProps) => (\n <div\n className={cn(\"inline-flex items-center gap-1.5 text-sm\", className)}\n {...props}\n >\n <span className=\"text-muted-foreground\">Page</span>\n <span className=\"font-medium text-foreground\">{formatPage(currentPage)}</span>\n <span className=\"text-muted-foreground\">of</span>\n <span className=\"font-medium text-foreground\">{formatPage(totalPages)}</span>\n </div>\n)\nPaginationInfo.displayName = \"PaginationInfo\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationInfo,\n type PaginationLinkProps,\n type PaginationInfoProps,\n}\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Loader2 } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:size-4\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary-hover\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive-hover\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary-hover\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground\",\n link:\n \"text-primary underline-offset-4 hover:underline\",\n success:\n \"bg-success text-success-foreground hover:bg-success-hover\",\n },\n size: {\n xs: \"h-7 px-2.5 text-xs\",\n sm: \"h-9 px-3\",\n default: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n icon: \"h-10 w-10\",\n \"icon-sm\": \"h-8 w-8\",\n },\n shape: {\n default: \"rounded-md\",\n rounded: \"rounded-lg\",\n pill: \"rounded-full\",\n square: \"rounded-none\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n shape: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n loading?: boolean\n prefixIcon?: React.ReactNode\n suffixIcon?: React.ReactNode\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n shape,\n asChild = false,\n loading = false,\n prefixIcon,\n suffixIcon,\n children,\n disabled,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const isDisabled = disabled || loading\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, shape, className }))}\n ref={ref}\n disabled={isDisabled}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" />}\n {!loading && prefixIcon}\n {children}\n {suffixIcon}\n </Comp>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n"],"mappings":"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","names":["React","jsx","jsxs"]}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/components/read-only-guard.tsx
31
+ var read_only_guard_exports = {};
32
+ __export(read_only_guard_exports, {
33
+ READ_ONLY_REASON: () => READ_ONLY_REASON,
34
+ ReadOnlyGuard: () => ReadOnlyGuard,
35
+ isGuarded: () => isGuarded
36
+ });
37
+ module.exports = __toCommonJS(read_only_guard_exports);
38
+
39
+ // src/lib/utils.ts
40
+ var import_clsx = require("clsx");
41
+ var import_tailwind_merge = require("tailwind-merge");
42
+ function cn(...inputs) {
43
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
44
+ }
45
+
46
+ // src/components/tooltip.tsx
47
+ var React = __toESM(require("react"), 1);
48
+ var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"), 1);
49
+ var import_jsx_runtime = require("react/jsx-runtime");
50
+ var TooltipProvider = TooltipPrimitive.Provider;
51
+ var Tooltip = TooltipPrimitive.Root;
52
+ var TooltipTrigger = TooltipPrimitive.Trigger;
53
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ TooltipPrimitive.Content,
55
+ {
56
+ ref,
57
+ sideOffset,
58
+ className: cn(
59
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
60
+ className
61
+ ),
62
+ ...props
63
+ }
64
+ ));
65
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
66
+
67
+ // src/components/read-only-guard.tsx
68
+ var import_jsx_runtime2 = require("react/jsx-runtime");
69
+ var READ_ONLY_REASON = "Read-only support session: this action is turned off.";
70
+ function isGuarded({ mode, ops, op = "WRITE" }) {
71
+ if (ops) return !ops.includes(op);
72
+ return mode === "READ";
73
+ }
74
+ function ReadOnlyGuard({ mode, ops, op = "WRITE", reason = READ_ONLY_REASON, className, children }) {
75
+ if (!isGuarded({ mode, ops, op })) return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_jsx_runtime2.Fragment, { children });
76
+ const swallow = (e) => {
77
+ e.preventDefault();
78
+ e.stopPropagation();
79
+ };
80
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Tooltip, { children: [
81
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
82
+ "span",
83
+ {
84
+ tabIndex: 0,
85
+ "data-read-only": "",
86
+ "aria-disabled": "true",
87
+ className: cn("inline-flex cursor-not-allowed", className),
88
+ onClickCapture: swallow,
89
+ onSubmitCapture: swallow,
90
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("fieldset", { disabled: true, className: "contents", children })
91
+ }
92
+ ) }),
93
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TooltipContent, { children: reason })
94
+ ] }) });
95
+ }
96
+ ReadOnlyGuard.displayName = "ReadOnlyGuard";
97
+ // Annotate the CommonJS export names for ESM import in node:
98
+ 0 && (module.exports = {
99
+ READ_ONLY_REASON,
100
+ ReadOnlyGuard,
101
+ isGuarded
102
+ });
103
+ //# sourceMappingURL=read-only-guard.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/read-only-guard.tsx","../../src/lib/utils.ts","../../src/components/tooltip.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\"\nimport type { ImpersonationMode, OperationClass } from \"../lib/impersonation\"\n\nexport interface ReadOnlyGuardProps {\n /**\n * The session mode from useImpersonation (imp_mode). READ disables the children. null or undefined (no support\n * session) leaves them alone.\n */\n mode?: ImpersonationMode | null\n /**\n * Approved operation classes from useImpersonation (imp_ops). When given, the children are disabled unless `op` is\n * in the list. Takes precedence over `mode`.\n */\n ops?: readonly OperationClass[] | null\n /** The class the wrapped action needs. Default WRITE. FINANCIAL and SECURITY are never approved in a support session. */\n op?: OperationClass\n /** Tooltip text while disabled. */\n reason?: string\n className?: string\n children: React.ReactNode\n}\n\nexport const READ_ONLY_REASON = \"Read-only support session: this action is turned off.\"\n\n/** Whether a guard with these props disables its children. */\nexport function isGuarded({ mode, ops, op = \"WRITE\" }: Pick<ReadOnlyGuardProps, \"mode\" | \"ops\" | \"op\">): boolean {\n if (ops) return !ops.includes(op)\n return mode === \"READ\"\n}\n\n/**\n * Disables what it wraps during a support session that may not perform the action (acai-ai-platform#1274).\n *\n * In READ mode (or when `op` is not among the approved `ops`) the children sit in a disabled <fieldset>, so every\n * native button, input, select and textarea inside is disabled, and clicks on anything else (links) are swallowed. A\n * tooltip explains why. Outside a support session it renders the children unchanged.\n *\n * This is a display aid. The backend refuses the request anyway (403 IMPERSONATION_OP_NOT_APPROVED).\n */\nfunction ReadOnlyGuard({ mode, ops, op = \"WRITE\", reason = READ_ONLY_REASON, className, children }: ReadOnlyGuardProps) {\n if (!isGuarded({ mode, ops, op })) return <>{children}</>\n\n const swallow = (e: React.SyntheticEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n return (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n // The wrapper takes focus so keyboard users also get the explanation; the controls inside cannot.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n data-read-only=\"\"\n aria-disabled=\"true\"\n className={cn(\"inline-flex cursor-not-allowed\", className)}\n onClickCapture={swallow}\n onSubmitCapture={swallow}\n >\n <fieldset disabled className=\"contents\">\n {children}\n </fieldset>\n </span>\n </TooltipTrigger>\n <TooltipContent>{reason}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\nReadOnlyGuard.displayName = \"ReadOnlyGuard\"\n\nexport { ReadOnlyGuard }\n","import { type ClassValue, clsx } 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\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\nimport { cn } from \"../lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACLA,YAAuB;AACvB,uBAAkC;AAahC;AAVF,IAAM,kBAAmC;AAEzC,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,iBAG3B,CAAC,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,QAC1C;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA+B,yBAAQ;;;AFkBV,IAAAA,sBAAA;AAlBrC,IAAM,mBAAmB;AAGzB,SAAS,UAAU,EAAE,MAAM,KAAK,KAAK,QAAQ,GAA6D;AAC/G,MAAI,IAAK,QAAO,CAAC,IAAI,SAAS,EAAE;AAChC,SAAO,SAAS;AAClB;AAWA,SAAS,cAAc,EAAE,MAAM,KAAK,KAAK,SAAS,SAAS,kBAAkB,WAAW,SAAS,GAAuB;AACtH,MAAI,CAAC,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,EAAG,QAAO,6EAAG,UAAS;AAEtD,QAAM,UAAU,CAAC,MAA4B;AAC3C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB;AAEA,SACE,6CAAC,mBAAgB,eAAe,KAC9B,wDAAC,WACC;AAAA,iDAAC,kBAAe,SAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QAGC,UAAU;AAAA,QACV,kBAAe;AAAA,QACf,iBAAc;AAAA,QACd,WAAW,GAAG,kCAAkC,SAAS;AAAA,QACzD,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QAEjB,uDAAC,cAAS,UAAQ,MAAC,WAAU,YAC1B,UACH;AAAA;AAAA,IACF,GACF;AAAA,IACA,6CAAC,kBAAgB,kBAAO;AAAA,KAC1B,GACF;AAEJ;AACA,cAAc,cAAc;","names":["import_jsx_runtime"]}
@@ -0,0 +1,40 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ImpersonationMode, OperationClass } from '../lib/impersonation.cjs';
4
+
5
+ interface ReadOnlyGuardProps {
6
+ /**
7
+ * The session mode from useImpersonation (imp_mode). READ disables the children. null or undefined (no support
8
+ * session) leaves them alone.
9
+ */
10
+ mode?: ImpersonationMode | null;
11
+ /**
12
+ * Approved operation classes from useImpersonation (imp_ops). When given, the children are disabled unless `op` is
13
+ * in the list. Takes precedence over `mode`.
14
+ */
15
+ ops?: readonly OperationClass[] | null;
16
+ /** The class the wrapped action needs. Default WRITE. FINANCIAL and SECURITY are never approved in a support session. */
17
+ op?: OperationClass;
18
+ /** Tooltip text while disabled. */
19
+ reason?: string;
20
+ className?: string;
21
+ children: React.ReactNode;
22
+ }
23
+ declare const READ_ONLY_REASON = "Read-only support session: this action is turned off.";
24
+ /** Whether a guard with these props disables its children. */
25
+ declare function isGuarded({ mode, ops, op }: Pick<ReadOnlyGuardProps, "mode" | "ops" | "op">): boolean;
26
+ /**
27
+ * Disables what it wraps during a support session that may not perform the action (acai-ai-platform#1274).
28
+ *
29
+ * In READ mode (or when `op` is not among the approved `ops`) the children sit in a disabled <fieldset>, so every
30
+ * native button, input, select and textarea inside is disabled, and clicks on anything else (links) are swallowed. A
31
+ * tooltip explains why. Outside a support session it renders the children unchanged.
32
+ *
33
+ * This is a display aid. The backend refuses the request anyway (403 IMPERSONATION_OP_NOT_APPROVED).
34
+ */
35
+ declare function ReadOnlyGuard({ mode, ops, op, reason, className, children }: ReadOnlyGuardProps): react_jsx_runtime.JSX.Element;
36
+ declare namespace ReadOnlyGuard {
37
+ var displayName: string;
38
+ }
39
+
40
+ export { READ_ONLY_REASON, ReadOnlyGuard, type ReadOnlyGuardProps, isGuarded };
@@ -0,0 +1,40 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ImpersonationMode, OperationClass } from '../lib/impersonation.js';
4
+
5
+ interface ReadOnlyGuardProps {
6
+ /**
7
+ * The session mode from useImpersonation (imp_mode). READ disables the children. null or undefined (no support
8
+ * session) leaves them alone.
9
+ */
10
+ mode?: ImpersonationMode | null;
11
+ /**
12
+ * Approved operation classes from useImpersonation (imp_ops). When given, the children are disabled unless `op` is
13
+ * in the list. Takes precedence over `mode`.
14
+ */
15
+ ops?: readonly OperationClass[] | null;
16
+ /** The class the wrapped action needs. Default WRITE. FINANCIAL and SECURITY are never approved in a support session. */
17
+ op?: OperationClass;
18
+ /** Tooltip text while disabled. */
19
+ reason?: string;
20
+ className?: string;
21
+ children: React.ReactNode;
22
+ }
23
+ declare const READ_ONLY_REASON = "Read-only support session: this action is turned off.";
24
+ /** Whether a guard with these props disables its children. */
25
+ declare function isGuarded({ mode, ops, op }: Pick<ReadOnlyGuardProps, "mode" | "ops" | "op">): boolean;
26
+ /**
27
+ * Disables what it wraps during a support session that may not perform the action (acai-ai-platform#1274).
28
+ *
29
+ * In READ mode (or when `op` is not among the approved `ops`) the children sit in a disabled <fieldset>, so every
30
+ * native button, input, select and textarea inside is disabled, and clicks on anything else (links) are swallowed. A
31
+ * tooltip explains why. Outside a support session it renders the children unchanged.
32
+ *
33
+ * This is a display aid. The backend refuses the request anyway (403 IMPERSONATION_OP_NOT_APPROVED).
34
+ */
35
+ declare function ReadOnlyGuard({ mode, ops, op, reason, className, children }: ReadOnlyGuardProps): react_jsx_runtime.JSX.Element;
36
+ declare namespace ReadOnlyGuard {
37
+ var displayName: string;
38
+ }
39
+
40
+ export { READ_ONLY_REASON, ReadOnlyGuard, type ReadOnlyGuardProps, isGuarded };
@@ -0,0 +1,64 @@
1
+ // src/lib/utils.ts
2
+ import { clsx } from "clsx";
3
+ import { twMerge } from "tailwind-merge";
4
+ function cn(...inputs) {
5
+ return twMerge(clsx(inputs));
6
+ }
7
+
8
+ // src/components/tooltip.tsx
9
+ import * as React from "react";
10
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
11
+ import { jsx } from "react/jsx-runtime";
12
+ var TooltipProvider = TooltipPrimitive.Provider;
13
+ var Tooltip = TooltipPrimitive.Root;
14
+ var TooltipTrigger = TooltipPrimitive.Trigger;
15
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(
16
+ TooltipPrimitive.Content,
17
+ {
18
+ ref,
19
+ sideOffset,
20
+ className: cn(
21
+ "z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
22
+ className
23
+ ),
24
+ ...props
25
+ }
26
+ ));
27
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
28
+
29
+ // src/components/read-only-guard.tsx
30
+ import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
31
+ var READ_ONLY_REASON = "Read-only support session: this action is turned off.";
32
+ function isGuarded({ mode, ops, op = "WRITE" }) {
33
+ if (ops) return !ops.includes(op);
34
+ return mode === "READ";
35
+ }
36
+ function ReadOnlyGuard({ mode, ops, op = "WRITE", reason = READ_ONLY_REASON, className, children }) {
37
+ if (!isGuarded({ mode, ops, op })) return /* @__PURE__ */ jsx2(Fragment, { children });
38
+ const swallow = (e) => {
39
+ e.preventDefault();
40
+ e.stopPropagation();
41
+ };
42
+ return /* @__PURE__ */ jsx2(TooltipProvider, { delayDuration: 150, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
43
+ /* @__PURE__ */ jsx2(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx2(
44
+ "span",
45
+ {
46
+ tabIndex: 0,
47
+ "data-read-only": "",
48
+ "aria-disabled": "true",
49
+ className: cn("inline-flex cursor-not-allowed", className),
50
+ onClickCapture: swallow,
51
+ onSubmitCapture: swallow,
52
+ children: /* @__PURE__ */ jsx2("fieldset", { disabled: true, className: "contents", children })
53
+ }
54
+ ) }),
55
+ /* @__PURE__ */ jsx2(TooltipContent, { children: reason })
56
+ ] }) });
57
+ }
58
+ ReadOnlyGuard.displayName = "ReadOnlyGuard";
59
+ export {
60
+ READ_ONLY_REASON,
61
+ ReadOnlyGuard,
62
+ isGuarded
63
+ };
64
+ //# sourceMappingURL=read-only-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/components/tooltip.tsx","../../src/components/read-only-guard.tsx"],"sourcesContent":["import { type ClassValue, clsx } 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\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\nimport { cn } from \"../lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\"\nimport type { ImpersonationMode, OperationClass } from \"../lib/impersonation\"\n\nexport interface ReadOnlyGuardProps {\n /**\n * The session mode from useImpersonation (imp_mode). READ disables the children. null or undefined (no support\n * session) leaves them alone.\n */\n mode?: ImpersonationMode | null\n /**\n * Approved operation classes from useImpersonation (imp_ops). When given, the children are disabled unless `op` is\n * in the list. Takes precedence over `mode`.\n */\n ops?: readonly OperationClass[] | null\n /** The class the wrapped action needs. Default WRITE. FINANCIAL and SECURITY are never approved in a support session. */\n op?: OperationClass\n /** Tooltip text while disabled. */\n reason?: string\n className?: string\n children: React.ReactNode\n}\n\nexport const READ_ONLY_REASON = \"Read-only support session: this action is turned off.\"\n\n/** Whether a guard with these props disables its children. */\nexport function isGuarded({ mode, ops, op = \"WRITE\" }: Pick<ReadOnlyGuardProps, \"mode\" | \"ops\" | \"op\">): boolean {\n if (ops) return !ops.includes(op)\n return mode === \"READ\"\n}\n\n/**\n * Disables what it wraps during a support session that may not perform the action (acai-ai-platform#1274).\n *\n * In READ mode (or when `op` is not among the approved `ops`) the children sit in a disabled <fieldset>, so every\n * native button, input, select and textarea inside is disabled, and clicks on anything else (links) are swallowed. A\n * tooltip explains why. Outside a support session it renders the children unchanged.\n *\n * This is a display aid. The backend refuses the request anyway (403 IMPERSONATION_OP_NOT_APPROVED).\n */\nfunction ReadOnlyGuard({ mode, ops, op = \"WRITE\", reason = READ_ONLY_REASON, className, children }: ReadOnlyGuardProps) {\n if (!isGuarded({ mode, ops, op })) return <>{children}</>\n\n const swallow = (e: React.SyntheticEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n return (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n // The wrapper takes focus so keyboard users also get the explanation; the controls inside cannot.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n data-read-only=\"\"\n aria-disabled=\"true\"\n className={cn(\"inline-flex cursor-not-allowed\", className)}\n onClickCapture={swallow}\n onSubmitCapture={swallow}\n >\n <fieldset disabled className=\"contents\">\n {children}\n </fieldset>\n </span>\n </TooltipTrigger>\n <TooltipContent>{reason}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n}\nReadOnlyGuard.displayName = \"ReadOnlyGuard\"\n\nexport { ReadOnlyGuard }\n"],"mappings":";AAAA,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ACLA,YAAY,WAAW;AACvB,YAAY,sBAAsB;AAahC;AAVF,IAAM,kBAAmC;AAEzC,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,iBAG3B,CAAC,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,QAC1C;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA+B,yBAAQ;;;ACkBV,0BAAAA,MAStC,YATsC;AAlBrC,IAAM,mBAAmB;AAGzB,SAAS,UAAU,EAAE,MAAM,KAAK,KAAK,QAAQ,GAA6D;AAC/G,MAAI,IAAK,QAAO,CAAC,IAAI,SAAS,EAAE;AAChC,SAAO,SAAS;AAClB;AAWA,SAAS,cAAc,EAAE,MAAM,KAAK,KAAK,SAAS,SAAS,kBAAkB,WAAW,SAAS,GAAuB;AACtH,MAAI,CAAC,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,EAAG,QAAO,gBAAAA,KAAA,YAAG,UAAS;AAEtD,QAAM,UAAU,CAAC,MAA4B;AAC3C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB;AAEA,SACE,gBAAAA,KAAC,mBAAgB,eAAe,KAC9B,+BAAC,WACC;AAAA,oBAAAA,KAAC,kBAAe,SAAO,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QAGC,UAAU;AAAA,QACV,kBAAe;AAAA,QACf,iBAAc;AAAA,QACd,WAAW,GAAG,kCAAkC,SAAS;AAAA,QACzD,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QAEjB,0BAAAA,KAAC,cAAS,UAAQ,MAAC,WAAU,YAC1B,UACH;AAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAAA,KAAC,kBAAgB,kBAAO;AAAA,KAC1B,GACF;AAEJ;AACA,cAAc,cAAc;","names":["jsx"]}