@texturehq/edges 1.25.1 → 1.25.3

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 (34) hide show
  1. package/dist/{RichTextEditor-BGQenUvv.d.cts → RichTextEditor-BhX77nTp.d.cts} +16 -2
  2. package/dist/{RichTextEditor-BGQenUvv.d.ts → RichTextEditor-BhX77nTp.d.ts} +16 -2
  3. package/dist/{TimeField-Blk2Ci2M.d.ts → TimeField-C2O3KVaW.d.ts} +43 -5
  4. package/dist/{TimeField-p31z8xSR.d.cts → TimeField-DC3iyts9.d.cts} +43 -5
  5. package/dist/{colors-Bw6dREwE.d.ts → colors-DCUq7Ywi.d.ts} +1 -1
  6. package/dist/{colors-nZbxzpnU.d.cts → colors-DVn78Aex.d.cts} +1 -1
  7. package/dist/components.manifest.json +5 -5
  8. package/dist/form/index.cjs +1 -1
  9. package/dist/form/index.cjs.map +1 -1
  10. package/dist/form/index.d.cts +1 -1
  11. package/dist/form/index.d.ts +1 -1
  12. package/dist/form/index.js +1 -1
  13. package/dist/form/index.js.map +1 -1
  14. package/dist/{index-DKA9NMRw.d.ts → index-Dkhk7IbI.d.cts} +5 -1
  15. package/dist/{index-DKA9NMRw.d.cts → index-Dkhk7IbI.d.ts} +5 -1
  16. package/dist/index.cjs +9 -9
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +24 -13
  19. package/dist/index.d.ts +24 -13
  20. package/dist/index.js +9 -9
  21. package/dist/index.js.map +1 -1
  22. package/dist/rhf/index.cjs +1 -1
  23. package/dist/rhf/index.cjs.map +1 -1
  24. package/dist/rhf/index.d.cts +2 -2
  25. package/dist/rhf/index.d.ts +2 -2
  26. package/dist/rhf/index.js +1 -1
  27. package/dist/rhf/index.js.map +1 -1
  28. package/dist/server.d.cts +2 -2
  29. package/dist/server.d.ts +2 -2
  30. package/dist/styles/utilities.css +15 -2
  31. package/dist/styles.css +62 -2
  32. package/dist/utilities.manifest.json +1 -1
  33. package/package.json +1 -1
  34. package/scripts/setup-cursor-rules.js +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/Dialog/Dialog.tsx","../../src/hooks/useMediaQuery.ts","../../src/utils/index.ts","../../src/utils/controlStyles.ts","../../src/components/Icon/Icon.tsx","../../src/components/Button/Button.tsx","../../src/components/DialogFooter/DialogFooter.tsx","../../src/components/Heading/Heading.tsx","../../src/components/DialogHeader/DialogHeader.tsx","../../src/components/Skeleton/Skeleton.tsx","../../src/components/Card/Card.tsx","../../src/components/ErrorBoundary/ErrorBoundary.tsx","../../src/components/ModalBackdrop/ModalBackdrop.tsx","../../src/components/Tray/Tray.tsx","../../src/components/Form/Form.tsx","../../src/form/DialogForm.tsx","../../src/components/Drawer/Drawer.tsx","../../src/form/DrawerForm.tsx","../../src/form/FormActions.tsx","../../src/form/FormGrid.tsx","../../src/components/Field/Field.tsx","../../src/form/FormSection.tsx","../../src/form/FormStepper.tsx","../../src/form/SaveBar.tsx","../../src/form/UnsavedChangesPrompt.tsx","../../src/form/useWizard.tsx"],"names":["useMediaQuery","query","defaultValue","matches","setMatches","useState","useEffect","mediaQueryList","handleChange","event","focusRing","showDefaultOutline","controlStyles","sizePresets","Icon","memo","name","size","color","weight","className","ariaLabel","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","twMerge","jsx","IconWithContainer","variant","shape","containerSize","containerClassName","ref","iconSize","resolvedContainerSize","containerClasses","baseStyles","variantStyles","widthStyles","disabledStyles","enabledStyles","badgePositionStyles","badgeVariantStyles","normalizeVariant","getButtonStyles","isDisabled","fullWidth","isLoading","normalizedVariant","styles","focusRingColor","Button","icon","children","loadingText","loadingIndicator","iconPosition","iconWeight","href","badgeNumber","badgeVariant","badgePosition","style","target","rel","restProps","iconElement","content","jsxs","Fragment","loadingNode","hasBadge","composedClassName","linkProps","_onPress","_onPressStart","_onPressEnd","_onPressChange","_onPressUp","_onAuxClick","_onContextMenu","_onDoubleClick","safeRestProps","buttonOrLink","RACLink","renderProps","RACButton","DialogFooter","primaryAction","secondaryAction","footerContent","hasActions","sizeVariants","heightVariants","Heading","Tag","height","sizeClasses","heightClasses","DialogHeader","title","onClose","hideCloseIcon","titleAlign","hasBackArrow","onBack","headerContent","Skeleton","width","animation","gradient","flex","stack","responsive","delay","adjustAnimationSpeedBasedOnWidth","dataTestId","visible","setVisible","timer","baseClasses","animationSpeed","numWidth","animationClasses","shapeClasses","layoutClasses","responsiveStyles","breakpoint","value","lineWidth","index","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","CardHeader","subtitle","actions","CardMedia","src","alt","aspectRatio","CardContent","defaultPadding","CardFooter","align","ErrorBoundary","Component","__publicField","error","errorInfo","ModalBackdrop","transparent","ModalOverlay","composeRenderProps","SWIPE_DISMISS_THRESHOLD","SWIPE_VELOCITY_THRESHOLD","Tray","isOpen","isDismissable","transparentOverlay","maxHeight","maxWidth","contentPadding","showHandle","animationVariant","isHandleAnimating","setIsHandleAnimating","dragOffset","setDragOffset","isTransitioning","setIsTransitioning","containerRef","useRef","transitionTimeoutRef","dragStateRef","handlePointerDown","useCallback","e","handlePointerMove","isDragging","startY","pointerId","deltaY","handlePointerEnd","startTime","elapsed","velocity","threshold","hasHeader","hasFooter","open","Modal","RACDialog","Dialog","minWidth","mobileMaxHeight","mobileHeight","isControlled","Form","RACForm","DialogForm","formId","onSubmit","primaryLabel","secondaryLabel","onCancel","primaryVariant","secondaryVariant","dialogProps","form","Drawer","slideInFrom","isAnimating","setIsAnimating","DrawerForm","drawerProps","FormActions","rest","gapClass","colsToClass","cols","base","md","lg","FormGrid","gap","Description","FormSection","description","showDivider","FormDivider","FormStepper","steps","currentStepId","onStepClick","currentIndex","s","_","step","isActive","isCompleted","isClickable","SaveBar","show","isSubmitting","UnsavedChangesPrompt","when","message","Ke","handler","useWizard","initialStepId","canNavigate","setCurrentStepId","Ze","stepIndex","hasPrev","hasNext","goTo","id"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\nimport { Tray } from \"../Tray\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"./types\";\n\nexport interface DialogProps extends Omit<DialogHeaderConfig, \"onClose\">, DialogFooterConfig {\n /**\n * Whether the dialog is open (controlled mode)\n * When using DialogTrigger, leave this undefined for automatic state management\n * @default undefined\n */\n isOpen?: boolean;\n /**\n * Callback when the dialog is closed (controlled mode)\n * When using DialogTrigger, leave this undefined for automatic state management\n * @default undefined\n */\n onClose?: () => void;\n /**\n * Dialog content\n */\n children: React.ReactNode;\n /**\n * Whether to use a transparent backdrop\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Maximum width of the dialog\n * @default \"600px\"\n */\n maxWidth?: string;\n /**\n * Minimum width of the dialog (desktop only, mobile uses full width)\n * @default \"400px\"\n */\n minWidth?: string;\n /**\n * Maximum height of the dialog on desktop\n * @default \"85vh\"\n */\n maxHeight?: string;\n /**\n * Explicit height of the dialog on desktop (overrides maxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n height?: string;\n /**\n * Maximum height of the dialog on mobile (tray version)\n * @default \"90vh\"\n */\n mobileMaxHeight?: string;\n /**\n * Explicit height of the dialog on mobile (overrides mobileMaxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n mobileHeight?: string;\n /**\n * Whether to include padding inside the content area\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * Dialog\n *\n * Responsive modal dialog component with backdrop.\n *\n * **Desktop (≥768px):** Centered modal with scale and fade animation\n * **Mobile (<768px):** Uses Tray component for native bottom sheet experience with drag handle\n *\n * Includes optional header with title/back button and footer with action buttons.\n *\n * ## Usage Patterns\n *\n * ### Uncontrolled with DialogTrigger (Recommended)\n * ```tsx\n * import { DialogTrigger, Dialog, Button } from \"@texturehq/edges\";\n *\n * <DialogTrigger>\n * <Button>Open Dialog</Button>\n * <Dialog title=\"My Dialog\">\n * <p>Dialog content</p>\n * </Dialog>\n * </DialogTrigger>\n * ```\n *\n * ### Controlled (Advanced)\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * <Dialog isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"My Dialog\">\n * <p>Dialog content</p>\n * </Dialog>\n * ```\n */\nexport function Dialog({\n isOpen,\n onClose,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n children,\n primaryAction,\n secondaryAction,\n footerContent,\n transparentOverlay = false,\n maxWidth = \"600px\",\n minWidth = \"400px\",\n maxHeight = \"85vh\",\n height,\n mobileMaxHeight = \"90vh\",\n mobileHeight,\n contentPadding = true,\n className,\n}: DialogProps) {\n // In controlled mode, don't render if closed\n if (isOpen === false) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || footerContent;\n\n // Determine if we're in controlled mode\n const isControlled = isOpen !== undefined;\n\n // Check if we're on mobile\n const isMobile = useMediaQuery(\"(max-width: 767px)\");\n\n // On mobile, use Tray component\n if (isMobile) {\n // In uncontrolled mode (when used with DialogTrigger), we need to return the Tray\n // but let DialogTrigger handle the state. We can't use Tray directly in uncontrolled mode\n // because Tray requires isOpen prop. So we need to wrap it similarly to desktop.\n if (!isControlled) {\n // For uncontrolled mode, render nothing - DialogTrigger will handle rendering\n // This is a limitation: mobile will fall through to desktop rendering for uncontrolled mode\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isDismissable\n transparent={transparentOverlay}\n className=\"flex items-end justify-center\"\n >\n <Modal className=\"w-full p-0\">\n <RACDialog\n className={twMerge(\n \"relative flex w-full flex-col\",\n \"bg-background-surface dark:bg-gray-800\",\n \"shadow-2xl shadow-black/20\",\n \"border-t border-x border-border-default/40\",\n \"max-h-[90vh]\",\n \"rounded-t-xl\",\n \"overflow-hidden\",\n \"animate-in slide-in-from-bottom\",\n \"duration-300 ease-out\",\n \"data-[exiting]:animate-out data-[exiting]:slide-out-to-bottom\",\n \"data-[exiting]:duration-200 data-[exiting]:ease-in\",\n className\n )}\n style={{\n ...(mobileHeight ? { height: mobileHeight } : { maxHeight: mobileMaxHeight }),\n }}\n >\n <div className=\"flex justify-center pt-2\">\n <div className=\"h-1.5 w-12 rounded-full bg-border-muted\" />\n </div>\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={onBack!}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto overscroll-contain\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n }\n\n // Controlled mode - use Tray\n return (\n <Tray\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n hasBackArrow={hasBackArrow}\n onBack={onBack}\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n transparentOverlay={transparentOverlay}\n maxHeight={mobileMaxHeight}\n height={mobileHeight}\n maxWidth={maxWidth}\n contentPadding={contentPadding}\n showHandle={true}\n animationVariant=\"scale\"\n className={className}\n >\n {children}\n </Tray>\n );\n }\n\n // On desktop, use centered modal\n return (\n <ErrorBoundary>\n <ModalBackdrop\n // Only pass isOpen/onOpenChange in controlled mode\n {...(isControlled\n ? {\n isOpen: isOpen,\n onOpenChange: (open) => {\n if (!open && onClose) onClose();\n },\n }\n : {})}\n isDismissable\n transparent={transparentOverlay}\n className=\"flex items-center justify-center\"\n >\n <Modal className=\"w-full p-4\" style={{ maxWidth }}>\n <RACDialog\n className={twMerge(\n // Base structure\n \"relative flex w-full flex-col\",\n // Visual styling\n \"bg-background-surface dark:bg-gray-800\",\n \"shadow-2xl shadow-black/20\",\n \"border border-border-default/50\",\n // Layout\n \"rounded-md\",\n \"overflow-hidden\",\n // Remove browser focus outline/ring on the dialog container\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n // Desktop: scale and fade animation\n \"animate-in fade-in zoom-in-96 slide-in-from-bottom-2\",\n \"duration-300 ease-out\",\n // Exit animations\n \"data-[exiting]:animate-out data-[exiting]:fade-out data-[exiting]:zoom-out-95\",\n \"data-[exiting]:duration-200 data-[exiting]:ease-in\",\n className\n )}\n style={{\n minWidth,\n ...(height ? { height } : { maxHeight }),\n }}\n >\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={onBack!}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\n// Export types\nexport type { DialogAction, DialogFooterConfig, DialogHeaderConfig } from \"./types\";\n","import { useEffect, useState } from \"react\";\n\n/**\n * Hook to check if a media query matches the current viewport\n *\n * @param query - A CSS media query string (e.g., \"(min-width: 768px)\")\n * @param defaultValue - The default value to return during SSR or before the first render\n * @returns A boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const prefersReducedMotion = useMediaQuery('(prefers-reduced-motion: reduce)');\n * const isLandscape = useMediaQuery('(orientation: landscape)');\n * ```\n */\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n const [matches, setMatches] = useState<boolean>(defaultValue);\n\n useEffect(() => {\n // Return early if window is not available (SSR)\n if (typeof window === \"undefined\") return;\n\n const mediaQueryList = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQueryList.matches);\n\n // Handler for when the media query match state changes\n const handleChange = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Listen for changes\n mediaQueryList.addEventListener(\"change\", handleChange);\n\n // Cleanup\n return () => {\n mediaQueryList.removeEventListener(\"change\", handleChange);\n };\n }, [query]);\n\n return matches;\n}\n","import { composeRenderProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport { ColorModeProvider, useColorMode } from \"./ColorModeProvider\";\n\n// Re-export formatting utilities from the new formatting module\nexport * from \"./formatting\";\n\n// Re-export time formatting utilities\nexport * from \"./timeFormat\";\n\nexport function focusRing(showDefaultOutline: boolean = false) {\n // Use data-[focus-visible] instead of :focus-visible to work with React Aria's focus management\n const baseClasses = showDefaultOutline\n ? \"outline outline-1 outline-border-input data-[focus-visible]:outline-2 data-[focus-visible]:outline-action-default data-[focus-visible]:outline-offset-0 invalid:outline-2 invalid:outline-feedback-error-border group-invalid:outline-2 group-invalid:outline-feedback-error-border forced-colors:focus:outline-[Highlight] forced-colors:focus:outline-2 forced-colors:focus:outline-offset-2\"\n : \"outline-none data-[focus-visible]:outline data-[focus-visible]:outline-2 data-[focus-visible]:outline-action-default data-[focus-visible]:outline-offset-0 invalid:outline-2 invalid:outline-feedback-error-border group-invalid:outline-2 group-invalid:outline-feedback-error-border forced-colors:focus:outline-[Highlight] forced-colors:focus:outline-2 forced-colors:focus:outline-offset-2\";\n return `${baseClasses}`;\n}\n\nexport function composeTailwindRenderProps<T>(\n className: string | ((v: T) => string) | undefined,\n tw: string\n): string | ((v: T) => string) {\n return composeRenderProps(className, (className) => twMerge(tw, className));\n}\n","/**\n * Control-specific style utilities for form elements and interactive components.\n * These styles use CSS variables defined in the theme for consistent sizing\n * and spacing across all control elements.\n *\n * Text sizes follow the relationships defined in theme.css:\n * sm: --control-text-sm (maps to --text-xs)\n * md: --control-text-md (maps to --text-sm)\n * lg: --control-text-lg (maps to --text-base)\n * xl: --control-text-xl (maps to --text-lg)\n */\n\nexport type Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport const controlStyles = {\n sm: {\n text: \"text-[length:var(--control-text-sm)]\",\n height: \"h-[var(--control-sm-height)]\",\n padding: \"px-[var(--control-padding-sm)]\",\n paddingY: \"py-[var(--control-gap-sm)]\",\n gap: \"gap-[var(--control-gap-sm)]\",\n },\n md: {\n text: \"text-[length:var(--control-text-md)]\",\n height: \"h-[var(--control-md-height)]\",\n padding: \"px-[var(--control-padding-md)]\",\n paddingY: \"py-[var(--control-gap-md)]\",\n gap: \"gap-[var(--control-gap-md)]\",\n },\n lg: {\n text: \"text-[length:var(--control-text-lg)]\",\n height: \"h-[var(--control-lg-height)]\",\n padding: \"px-[var(--control-padding-lg)]\",\n paddingY: \"py-[var(--control-gap-lg)]\",\n gap: \"gap-[var(--control-gap-lg)]\",\n },\n xl: {\n text: \"text-[length:var(--control-text-xl)]\",\n height: \"h-[var(--control-xl-height)]\",\n padding: \"px-[var(--control-padding-xl)]\",\n paddingY: \"py-[var(--control-gap-xl)]\",\n gap: \"gap-[var(--control-gap-xl)]\",\n },\n} as const;\n","\"use client\";\nimport type { IconProps as PhosphorIconProps } from \"@phosphor-icons/react\";\nimport * as PhosphorIcons from \"@phosphor-icons/react\";\nimport { memo } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Type for any Phosphor icon component\ntype PhosphorIconComponent = typeof PhosphorIcons.House;\n\n// Extract all icon names from the Phosphor package\nexport type PhosphorIconName = keyof typeof PhosphorIcons;\n\n// For backwards compatibility, export IconName as an alias\nexport type IconName = PhosphorIconName;\n\n// Standard size presets for the design system\nconst sizePresets = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 40,\n \"2xl\": 48,\n} as const;\n\ntype SizePreset = keyof typeof sizePresets;\n\ninterface IconProps extends Omit<PhosphorIconProps, \"size\"> {\n /**\n * The name of the Phosphor icon to render\n * Any valid icon from @phosphor-icons/react\n */\n name: PhosphorIconName;\n\n /**\n * Size of the icon - can be a preset or custom number\n */\n size?: SizePreset | number;\n\n /**\n * Accessibility label (maps to aria-label)\n */\n ariaLabel?: string;\n}\n\n/**\n * Icon\n *\n * Phosphor icon wrapper component with standardized sizing and styling.\n * Provides access to the full Phosphor icon library with tree-shaking support and design system presets.\n * - TypeScript autocomplete for all icon names\n *\n * Usage:\n * ```tsx\n * <Icon name=\"House\" size=\"md\" />\n * <Icon name=\"User\" size={32} className=\"text-brand\" />\n * ```\n */\nexport const Icon = memo(\n ({ name, size = \"md\", color, weight = \"regular\", className, ariaLabel, ...props }: IconProps) => {\n // Get the icon component from the Phosphor package\n const IconComponent = PhosphorIcons[name] as PhosphorIconComponent | undefined;\n\n if (!IconComponent) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(`Icon \"${name}\" not found in @phosphor-icons/react`);\n }\n return null;\n }\n\n // Resolve size to pixel value\n const resolvedSize =\n typeof size === \"string\" && size in sizePresets ? sizePresets[size as SizePreset] : size;\n\n // Build className with design system defaults\n const iconClassName = twMerge(\n // Default styles\n \"inline-block flex-shrink-0\",\n // Allow color inheritance from parent\n !color && \"text-current\",\n // Custom classes\n className\n );\n\n return (\n <IconComponent\n {...props}\n size={resolvedSize as number}\n color={color}\n weight={weight}\n className={iconClassName}\n aria-label={ariaLabel || `${name} icon`}\n data-testid={`icon-${name}`}\n />\n );\n }\n);\n\nIcon.displayName = \"Icon\";\n\n/**\n * Helper component for icons with containers\n */\ninterface IconWithContainerProps extends IconProps {\n /**\n * Container variant\n */\n variant?: \"subtle\" | \"solid\" | \"outline\";\n\n /**\n * Container shape\n */\n shape?: \"square\" | \"circle\";\n\n /**\n * Container size (adds padding around icon)\n */\n containerSize?: SizePreset | number;\n\n /**\n * Container background color\n */\n containerClassName?: string;\n}\n\nexport const IconWithContainer = memo(\n ({\n variant = \"subtle\",\n shape = \"square\",\n containerSize,\n containerClassName,\n size = \"md\",\n className,\n name,\n color,\n weight,\n ariaLabel,\n ref,\n ...props\n }: IconWithContainerProps & { ref?: React.Ref<HTMLDivElement> }) => {\n // Calculate container size if not specified\n const iconSize =\n typeof size === \"string\" && size in sizePresets ? sizePresets[size as SizePreset] : size;\n const resolvedContainerSize = containerSize\n ? typeof containerSize === \"string\" && containerSize in sizePresets\n ? sizePresets[containerSize as SizePreset]\n : containerSize\n : (iconSize as number) * 1.75; // Default to 1.75x icon size\n\n const containerClasses = twMerge(\n // Base styles\n \"inline-flex items-center justify-center flex-shrink-0\",\n\n // Shape\n shape === \"circle\" ? \"rounded-full\" : \"rounded-lg\",\n\n // Variant styles using Tailwind 4 CSS variables\n variant === \"subtle\" && \"bg-gray-100 dark:bg-gray-800\",\n variant === \"solid\" && \"bg-brand text-white\",\n variant === \"outline\" && \"border-2 border-current\",\n\n // Container className for overrides\n containerClassName\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n width: resolvedContainerSize,\n height: resolvedContainerSize,\n }}\n >\n <Icon\n {...props}\n name={name}\n size={size}\n color={color}\n weight={weight}\n className={className}\n ariaLabel={ariaLabel}\n />\n </div>\n );\n }\n);\n\nIconWithContainer.displayName = \"IconWithContainer\";\n","import type { ComponentProps, ReactNode } from \"react\";\nimport {\n ButtonRenderProps,\n LinkRenderProps,\n Button as RACButton,\n ButtonProps as RACButtonProps,\n Link as RACLink,\n LinkProps as RACLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { controlStyles } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon\";\n\ntype IconName = ComponentProps<typeof Icon>[\"name\"];\n\ntype BaseButtonProps = Omit<RACButtonProps, \"className\">;\n\n/**\n * Button\n *\n * A versatile action component that supports multiple visual variants, sizes,\n * optional icons, a loading state, and badge indicators. Follows the Edges\n * design system tokens and composes `react-aria-components` under the hood.\n *\n * Example usage:\n * ```tsx\n * <Button variant=\"brand\" size=\"md\" icon=\"Check\">Save</Button>\n * ```\n */\nexport interface ButtonProps extends BaseButtonProps {\n variant?:\n | \"default\"\n | \"brand\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\"\n | \"primary\";\n size?: Size;\n badgeNumber?: number;\n badgeVariant?: \"primary\" | \"destructive\";\n badgePosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n fullWidth?: boolean;\n icon?: IconName;\n iconWeight?: \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\";\n iconPosition?: \"left\" | \"right\";\n isLoading?: boolean;\n loadingText?: string;\n loadingIndicator?: React.ReactNode;\n className?: string;\n href?: string;\n target?: string;\n rel?: string;\n style?: React.CSSProperties;\n}\n\nconst baseStyles =\n \"flex font-medium justify-center items-center gap-2 text-center transition rounded-[var(--control-border-radius)] whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default:\n \"bg-action-default text-[color:var(--color-action-default-text)] hover:bg-action-default-hover forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n brand:\n \"bg-action-brand text-[color:var(--color-action-brand-text)] hover:bg-action-brand-hover forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n secondary:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/5 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n ghost:\n \"border-none text-text-body hover:bg-text-body/5 forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace]\",\n destructive:\n \"bg-transparent text-feedback-error-text border-2 border-border-muted hover:bg-feedback-error-background/50 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[Mark]\",\n link: \"!text-action-brand hover:text-action-brand/90 hover:underline hover:decoration-2 hover:underline-offset-4\",\n icon: \"border-none text-text-body hover:bg-background-hover hover:text-text-heading forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace] p-1 flex-shrink-0 rounded-[var(--control-border-radius)]\",\n unstyled: \"bg-transparent\",\n} as const;\n\nconst widthStyles = {\n full: \"w-full\",\n default: \"w-fit\",\n};\n\nconst disabledStyles = \"opacity-50 cursor-not-allowed pointer-events-none\";\nconst enabledStyles = \"opacity-100 cursor-pointer\";\n\nconst badgePositionStyles = {\n \"top-right\": \"-right-2 -top-2\",\n \"top-left\": \"-left-2 -top-2\",\n \"bottom-right\": \"-right-2 -bottom-2\",\n \"bottom-left\": \"-left-2 -bottom-2\",\n} as const;\n\nconst badgeVariantStyles = {\n primary: \"bg-action-brand text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\n\nfunction normalizeVariant(\n variant: ButtonProps[\"variant\"]\n): \"default\" | \"brand\" | \"secondary\" | \"destructive\" | \"icon\" | \"link\" | \"unstyled\" | \"ghost\" {\n if (!variant) {\n return \"default\";\n }\n\n if (variant === \"primary\") {\n return \"brand\";\n }\n\n return variant;\n}\n\nfunction getButtonStyles(props: ButtonProps) {\n const {\n variant = \"default\",\n size = \"md\",\n isDisabled,\n fullWidth = false,\n isLoading = false,\n } = props;\n\n const normalizedVariant = normalizeVariant(variant);\n\n let styles =\n normalizedVariant === \"unstyled\" ? \"\" : `${baseStyles} ${variantStyles[normalizedVariant]}`;\n\n // Add size styles using controlStyles\n if (normalizedVariant !== \"unstyled\") {\n styles += ` ${controlStyles[size].text} ${controlStyles[size].height} ${controlStyles[size].padding} ${controlStyles[size].gap}`;\n }\n\n if (isDisabled || isLoading) {\n styles += ` ${disabledStyles}`;\n } else {\n styles += ` ${enabledStyles}`;\n }\n\n if (fullWidth) {\n styles += ` ${widthStyles.full}`;\n } else {\n styles += ` ${widthStyles.default}`;\n }\n\n const focusRingColor =\n normalizedVariant === \"brand\" ? \"focus-visible:outline-action-brand\" : undefined;\n\n return [styles, focusRing(), focusRingColor].filter(Boolean).join(\" \");\n}\n\n/**\n * Renders an Edges Button. When `href` is provided, renders a link-styled\n * button using the same visual system.\n */\nexport function Button(props: ButtonProps) {\n const {\n icon,\n children,\n isLoading = false,\n loadingText,\n loadingIndicator,\n size = \"md\",\n iconPosition = \"left\",\n iconWeight,\n href,\n className,\n badgeNumber,\n badgeVariant = \"primary\",\n badgePosition = \"top-right\",\n style,\n target,\n rel,\n ...restProps\n } = props;\n\n // Shared icon logic\n const iconElement = icon ? <Icon name={icon} size={size} weight={iconWeight} /> : null;\n\n // Shared content logic\n const content = (\n <>\n {iconPosition === \"left\" && iconElement}\n {typeof children === \"function\" ? null : children}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n\n // Loading state\n const loadingNode = (\n <div className=\"relative inline-flex items-center justify-center\">\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {loadingIndicator || (\n <Icon name=\"CircleNotch\" size={size} className=\"animate-spin\" aria-hidden=\"true\" />\n )}\n </div>\n <div className=\"invisible\" aria-hidden=\"true\">\n {content}\n </div>\n {loadingText && (\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {loadingText}\n </span>\n )}\n </div>\n );\n\n // Compose className using twMerge to properly handle Tailwind class conflicts\n const hasBadge = (badgeNumber ?? 0) > 0;\n const composedClassName = twMerge(getButtonStyles(props), className);\n\n // Create link-specific props by filtering out button-specific props\n const linkProps: Partial<RACLinkProps> = href\n ? {\n href,\n target,\n rel,\n // Only include props that are valid for both Button and Link\n ...(restProps as Record<string, unknown>),\n }\n : {};\n\n // Remove button-specific event handlers that don't apply to links\n if (href) {\n const {\n onPress: _onPress,\n onPressStart: _onPressStart,\n onPressEnd: _onPressEnd,\n onPressChange: _onPressChange,\n onPressUp: _onPressUp,\n onAuxClick: _onAuxClick,\n onContextMenu: _onContextMenu,\n onDoubleClick: _onDoubleClick,\n ...safeRestProps\n } = restProps as Record<string, unknown>;\n Object.assign(linkProps, safeRestProps);\n }\n\n // Compose the button or link element\n const buttonOrLink = href ? (\n <RACLink\n {...linkProps}\n {...(isLoading && { \"aria-busy\": true })}\n style={hasBadge ? undefined : style}\n className={composedClassName}\n >\n {isLoading\n ? loadingNode\n : typeof children === \"function\"\n ? (function (renderProps: LinkRenderProps & { defaultChildren: ReactNode }) {\n return (\n <>\n {iconPosition === \"left\" && iconElement}\n {children(\n renderProps as unknown as ButtonRenderProps & { defaultChildren: ReactNode }\n )}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n } as (props: LinkRenderProps & { defaultChildren: ReactNode }) => ReactNode)\n : content}\n </RACLink>\n ) : (\n <RACButton\n {...restProps}\n {...(isLoading && { \"aria-busy\": true })}\n style={hasBadge ? undefined : style}\n className={composedClassName}\n >\n {isLoading\n ? loadingNode\n : typeof children === \"function\"\n ? (function (renderProps: ButtonRenderProps & { defaultChildren: ReactNode }) {\n return (\n <>\n {iconPosition === \"left\" && iconElement}\n {children(renderProps)}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n } as (props: ButtonRenderProps & { defaultChildren: ReactNode }) => ReactNode)\n : content}\n </RACButton>\n );\n\n // Render badge if badgeNumber is provided and > 0\n if (hasBadge) {\n return (\n <div className={twMerge(\"relative flex\", className)} style={style}>\n {buttonOrLink}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs font-medium`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return buttonOrLink;\n}\n","import React from \"react\";\nimport { Button } from \"../Button\";\nimport type { DialogAction } from \"../Dialog/types\";\n\nexport interface DialogFooterProps {\n /**\n * Primary action button configuration\n */\n primaryAction?: DialogAction;\n /**\n * Secondary action button configuration\n */\n secondaryAction?: DialogAction;\n /**\n * Custom footer content above the action buttons\n */\n footerContent?: React.ReactNode;\n}\n\n/**\n * DialogFooter\n *\n * Shared footer component for Dialog and Drawer.\n * Renders action buttons with consistent styling.\n */\nexport function DialogFooter({ primaryAction, secondaryAction, footerContent }: DialogFooterProps) {\n const hasActions = primaryAction || secondaryAction;\n\n if (!hasActions && !footerContent) {\n return null;\n }\n\n return (\n <div className=\"flex h-28 w-full flex-col items-center justify-center border-t p-4\">\n {footerContent && <div className=\"flex h-10 justify-center\">{footerContent}</div>}\n {hasActions && (\n <div className=\"flex h-full w-full items-center justify-end gap-3\">\n {secondaryAction && (\n <Button\n size={secondaryAction.size || \"lg\"}\n variant={secondaryAction.variant || \"secondary\"}\n onPress={secondaryAction.onPress}\n isLoading={secondaryAction.isLoading}\n isDisabled={secondaryAction.isDisabled}\n >\n {secondaryAction.label}\n </Button>\n )}\n {primaryAction && (\n <Button\n size={primaryAction.size || \"lg\"}\n variant={primaryAction.variant}\n onPress={primaryAction.onPress}\n isLoading={primaryAction.isLoading}\n isDisabled={primaryAction.isDisabled}\n >\n {primaryAction.label}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst sizeVariants = {\n xs: \"text-lg font-semibold\",\n sm: \"text-xl font-semibold\",\n md: \"text-2xl font-semibold\",\n lg: \"text-3xl font-semibold\",\n xl: \"text-4xl font-semibold\",\n} as const;\n\nconst heightVariants = {\n page: \"h-16 leading-[62px]\",\n} as const;\n\nexport type HeadingSize = keyof typeof sizeVariants;\nexport type HeadingHeight = keyof typeof heightVariants;\n\n/**\n * Heading\n *\n * Typography component for page/section headings with size and height options.\n */\nexport interface HeadingProps {\n tag?: React.ElementType;\n size?: HeadingSize;\n height?: HeadingHeight;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function Heading({\n tag: Tag = \"h1\",\n size = \"lg\",\n height,\n className = \"\",\n children,\n}: HeadingProps) {\n const sizeClasses = sizeVariants[size];\n const heightClasses = height ? heightVariants[height] : \"\";\n\n return <Tag className={twMerge(sizeClasses, heightClasses, className)}>{children}</Tag>;\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Heading } from \"../Heading\";\nimport { Icon } from \"../Icon\";\n\ntype BaseDialogHeaderProps = {\n title?: string;\n onClose?: () => void;\n hideCloseIcon?: boolean;\n titleAlign?: \"left\" | \"center\";\n headerContent?: React.ReactNode;\n};\n\ntype WithBackArrow = BaseDialogHeaderProps & {\n hasBackArrow: true;\n onBack: () => void;\n};\n\ntype WithoutBackArrow = BaseDialogHeaderProps & {\n hasBackArrow?: false;\n onBack?: never;\n};\n\n/**\n * DialogHeader\n *\n * Header area for dialogs with optional back arrow.\n */\nexport type DialogHeaderProps = WithBackArrow | WithoutBackArrow;\n\nexport const DialogHeader: React.FC<DialogHeaderProps> = ({\n title,\n onClose,\n hideCloseIcon = false,\n titleAlign = \"left\",\n hasBackArrow = false,\n onBack,\n headerContent,\n}) => {\n return (\n <div\n className={twMerge(\n \"relative flex h-16 w-full flex-shrink-0 items-center justify-between border-b px-6\",\n title && \"border-b\",\n titleAlign === \"center\" ? \"justify-center\" : \"\"\n )}\n >\n {hasBackArrow && (\n <Button variant=\"icon\" onPress={onBack} className=\"absolute left-6\" aria-label=\"Go back\">\n <Icon name=\"CaretLeft\" data-testid=\"back-arrow\" />\n </Button>\n )}\n {headerContent || (\n <>\n {title && <Heading size=\"xs\">{title}</Heading>}\n {onClose && !hideCloseIcon && (\n <Button variant=\"icon\" onPress={onClose} aria-label=\"Close dialog\">\n <Icon name=\"X\" data-testid=\"close-button\" />\n </Button>\n )}\n </>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ninterface SkeletonProps {\n width?: number | string;\n height?: number | string;\n variant?: \"text\" | \"rect\" | \"circle\";\n animation?: \"pulse\" | \"wave\" | \"none\";\n gradient?: boolean;\n flex?: boolean;\n stack?: (number | string)[]; // Array of widths for stacked skeletons\n responsive?: Record<string, string | number>;\n delay?: number;\n adjustAnimationSpeedBasedOnWidth?: boolean;\n ariaLabel?: string;\n className?: string;\n \"data-testid\"?: string;\n}\n\n/**\n * Skeleton\n *\n * Loading placeholder component that mimics content structure.\n * Supports various shapes, animations, and responsive configurations for skeleton screens.\n */\nexport const Skeleton: React.FC<SkeletonProps> = ({\n width,\n height,\n variant = \"rect\",\n animation = \"pulse\",\n gradient = false,\n flex = false,\n stack,\n responsive,\n delay = 0,\n adjustAnimationSpeedBasedOnWidth = false,\n ariaLabel,\n className,\n \"data-testid\": dataTestId,\n}) => {\n const [visible, setVisible] = useState(delay === 0);\n\n useEffect(() => {\n if (delay > 0) {\n const timer = setTimeout(() => setVisible(true), delay);\n return () => clearTimeout(timer);\n }\n }, [delay]);\n\n if (!visible) return null;\n\n // Base styles\n const baseClasses = gradient\n ? \"bg-gradient-to-r from-[var(--color-skeleton-base)] via-[var(--color-skeleton-highlight)] to-[var(--color-skeleton-base)]\"\n : \"bg-[var(--color-skeleton-base)]\";\n\n // Adjust animation speed dynamically based on width\n const animationSpeed =\n adjustAnimationSpeedBasedOnWidth && width\n ? (() => {\n const numWidth = typeof width === \"number\" ? width : parseFloat(String(width));\n return !isNaN(numWidth) ? `animation-duration-[${Math.max(0.8, numWidth / 100)}s]` : \"\";\n })()\n : \"\";\n\n // Animation styles\n const animationClasses =\n animation === \"pulse\"\n ? `animate-pulse ${animationSpeed}`\n : animation === \"wave\"\n ? `relative overflow-hidden before:absolute before:inset-0 before:bg-gradient-to-r before:from-transparent before:via-[var(--color-skeleton-wave)] before:to-transparent before:animate-wave ${animationSpeed}`\n : \"\";\n\n // Shape-specific styles\n let shapeClasses = \"rounded-sm\";\n if (variant === \"circle\") shapeClasses = \"rounded-full\";\n if (variant === \"text\") shapeClasses = \"h-4 w-full rounded-sm\";\n\n // Dynamic layout handling\n const layoutClasses = flex ? \"flex-1 min-w-0\" : \"\";\n\n // Responsive styles\n const responsiveStyles = responsive\n ? Object.entries(responsive)\n .map(([breakpoint, value]) => `${breakpoint}:w-[${value}]`)\n .join(\" \")\n : \"\";\n\n // Stacking Multiple Skeletons\n if (stack) {\n return (\n <div className=\"space-y-2\" data-testid={dataTestId}>\n {stack.map((lineWidth, index) => (\n <div\n key={index}\n className={twMerge(\n baseClasses,\n animationClasses,\n shapeClasses,\n layoutClasses,\n responsiveStyles,\n className\n )}\n style={{\n width: lineWidth,\n height,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={twMerge(\n baseClasses,\n animationClasses,\n shapeClasses,\n layoutClasses,\n responsiveStyles,\n className\n )}\n style={{\n width,\n height,\n }}\n role=\"presentation\"\n aria-hidden={!ariaLabel}\n aria-label={ariaLabel ?? undefined}\n data-testid={dataTestId}\n />\n );\n};\n\ninterface SkeletonGroupProps {\n count?: number;\n children: React.ReactNode;\n className?: string;\n \"data-testid\"?: string;\n}\n\nexport const SkeletonGroup: React.FC<SkeletonGroupProps> = ({\n count = 1,\n children,\n className,\n \"data-testid\": dataTestId,\n}) => {\n return (\n <div className={className} data-testid={dataTestId}>\n {Array.from({ length: count }).map((_, index) => (\n <div key={index}>{children}</div>\n ))}\n </div>\n );\n};\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\nimport { Skeleton } from \"../Skeleton\";\n\n/**\n * Card - Enterprise surface container component\n *\n * A flexible, composable card component following enterprise design system best practices.\n * Supports modular content sections with consistent styling and accessibility.\n *\n * Usage:\n * ```tsx\n * <Card variant=\"outlined\" size=\"md\">\n * <Card.Header\n * title=\"Card Title\"\n * subtitle=\"Optional subtitle\"\n * actions={<Button variant=\"ghost\" icon=\"MoreHorizontal\" />}\n * />\n * <Card.Media src=\"image.jpg\" alt=\"Description\" />\n * <Card.Content>\n * <p>Main content goes here</p>\n * </Card.Content>\n * <Card.Footer>\n * <Button variant=\"brand\">Action</Button>\n * </Card.Footer>\n * </Card>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type CardVariant = \"outlined\" | \"elevated\" | \"filled\" | \"ghost\";\nexport interface CardProps {\n variant?: CardVariant;\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardHeaderProps {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n isLoading?: boolean;\n}\n\nexport interface CardMediaProps {\n src?: string;\n alt?: string;\n aspectRatio?: \"square\" | \"video\" | \"wide\" | \"auto\";\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardContentProps {\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardFooterProps {\n className?: string;\n children?: React.ReactNode;\n align?: \"start\" | \"end\" | \"center\" | \"between\";\n isLoading?: boolean;\n}\n\n// ——————————————————————————————————————————\n// Styles\n// ——————————————————————————————————————————\n\nconst cardVariantStyles: Record<CardVariant, string> = {\n outlined: \"bg-background-surface border border-border-default\",\n elevated: \"bg-background-surface border-0 shadow-md\",\n filled: \"bg-background-muted border-0\",\n ghost: \"bg-transparent border-0 shadow-none\",\n};\n\nconst cardBaseStyles = \"rounded-lg\";\n\nconst aspectRatioStyles = {\n square: \"aspect-square\",\n video: \"aspect-video\",\n wide: \"aspect-[2/1]\",\n auto: \"\",\n};\n\nconst footerAlignStyles = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n};\n\n// ——————————————————————————————————————————\n// Main Card Component\n// ——————————————————————————————————————————\n\nexport function Card({ variant = \"outlined\", className, children, isLoading = false }: CardProps) {\n return (\n <div\n className={twMerge(\n \"w-full overflow-hidden\",\n cardVariantStyles[variant],\n cardBaseStyles,\n className\n )}\n data-testid=\"card\"\n >\n {isLoading ? (\n // Skeleton fills the card completely - respects height set on card\n <Skeleton width=\"100%\" height=\"100%\" className=\"rounded-none\" />\n ) : (\n children\n )}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Header\n// ——————————————————————————————————————————\n\nexport function CardHeader({\n title,\n subtitle,\n actions,\n className,\n isLoading = false,\n}: CardHeaderProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"p-6 pb-4\", className)}>\n <div className=\"flex justify-between items-start mb-1\">\n <Skeleton width={120} height={20} />\n <Skeleton width={24} height={24} />\n </div>\n {subtitle && <Skeleton width={200} height={16} />}\n </div>\n );\n }\n\n if (!title && !subtitle && !actions) {\n return null;\n }\n\n return (\n <div className={twMerge(\"p-6 pb-4\", className)}>\n <div className=\"flex justify-between items-start gap-4\">\n <div className=\"min-w-0 flex-1\">\n {title && (\n <div className=\"mb-1\">\n {typeof title === \"string\" ? (\n <Heading tag=\"h3\" size=\"sm\" className=\"text-text-heading\">\n {title}\n </Heading>\n ) : (\n title\n )}\n </div>\n )}\n {subtitle && <div className=\"text-sm text-text-muted\">{subtitle}</div>}\n </div>\n {actions && <div className=\"flex-shrink-0\">{actions}</div>}\n </div>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Media\n// ——————————————————————————————————————————\n\nexport function CardMedia({\n src,\n alt,\n aspectRatio = \"auto\",\n className,\n children,\n isLoading = false,\n}: CardMediaProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"bg-background-muted\", aspectRatioStyles[aspectRatio], className)}>\n <Skeleton width=\"100%\" height=\"100%\" />\n </div>\n );\n }\n\n if (children) {\n return (\n <div className={twMerge(\"overflow-hidden\", aspectRatioStyles[aspectRatio], className)}>\n {children}\n </div>\n );\n }\n\n if (!src) {\n return null;\n }\n\n return (\n <div className={twMerge(\"overflow-hidden\", aspectRatioStyles[aspectRatio], className)}>\n <img src={src} alt={alt || \"\"} className=\"w-full h-full object-cover\" loading=\"lazy\" />\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Content\n// ——————————————————————————————————————————\n\nexport function CardContent({ className, children, isLoading = false }: CardContentProps) {\n // Extract padding classes from className - if any padding class is set, respect it\n const hasPadding = className?.match(/p(?:t|b|l|r|x|y)?-(?:\\d+(?:\\.\\d+)?|px|\\[.+?\\])/);\n const defaultPadding = hasPadding ? \"\" : \"px-6 py-4\";\n\n if (isLoading) {\n return (\n <div className={twMerge(defaultPadding, className)}>\n <div className=\"space-y-2\">\n <Skeleton width=\"100%\" height={16} />\n <Skeleton width=\"80%\" height={16} />\n <Skeleton width=\"60%\" height={16} />\n </div>\n </div>\n );\n }\n\n if (!children) {\n return null;\n }\n\n return <div className={twMerge(\"px-6 py-4 text-text-body\", className)}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Card Footer\n// ——————————————————————————————————————————\n\nexport function CardFooter({\n className,\n children,\n align = \"end\",\n isLoading = false,\n}: CardFooterProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"px-6 py-4 flex gap-2 justify-end\", className)}>\n <Skeleton width={80} height={32} />\n <Skeleton width={60} height={32} />\n </div>\n );\n }\n\n if (!children) {\n return null;\n }\n\n return (\n <div\n className={twMerge(\"px-6 py-4 flex items-center gap-2\", footerAlignStyles[align], className)}\n >\n {children}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound Component API\n// ——————————————————————————————————————————\n\nCard.Header = CardHeader;\nCard.Media = CardMedia;\nCard.Content = CardContent;\nCard.Footer = CardFooter;\n","import { Component, ErrorInfo, ReactNode } from \"react\";\nimport { Card } from \"../Card\";\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n title?: string;\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n}\n\n/**\n * ErrorBoundary\n *\n * React error boundary component for graceful error handling.\n * Catches JavaScript errors in child components and displays a fallback UI with retry option.\n */\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Error Boundary caught an error:\", error, errorInfo);\n }\n\n private handleRetry = () => {\n this.setState({ hasError: false, error: undefined });\n if (typeof window !== \"undefined\") {\n window.location.reload();\n }\n };\n\n public render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <Card>\n {this.props.title && <Card.Header title={this.props.title} />}\n <Card.Content>\n <div\n className=\"flex flex-col items-center justify-center gap-4\"\n data-testid=\"error-boundary\"\n >\n <p className=\"text-red-500\">{this.state.error?.message || \"Something went wrong\"}</p>\n <button\n className=\"rounded bg-blue-500 px-4 py-2 text-white hover:bg-blue-600\"\n onClick={this.handleRetry}\n >\n Retry\n </button>\n </div>\n </Card.Content>\n </Card>\n );\n }\n\n return this.props.children;\n }\n}\n","import { composeRenderProps, ModalOverlay, ModalOverlayProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface ModalBackdropProps extends ModalOverlayProps {\n /**\n * Whether to use a transparent backdrop instead of dark overlay\n * @default false\n */\n transparent?: boolean;\n /**\n * Additional CSS classes for the backdrop\n */\n className?: string;\n}\n\n/**\n * ModalBackdrop\n *\n * Shared backdrop/overlay component used by Dialog and Drawer.\n * Wraps React Aria's ModalOverlay with consistent styling and smooth animations.\n */\nexport function ModalBackdrop({\n transparent = false,\n className,\n children,\n ...props\n}: ModalBackdropProps) {\n return (\n <ModalOverlay\n {...props}\n className={composeRenderProps(className, (className, renderProps) => {\n return twMerge(\n // Base positioning and layering\n \"fixed inset-0 z-50\",\n // Backdrop styling - subtle gradient for depth\n transparent\n ? \"bg-transparent\"\n : [\n \"bg-gradient-to-br from-black/20 via-black/15 to-black/20\",\n \"backdrop-blur-[2px]\",\n \"supports-[backdrop-filter]:bg-black/15\",\n ].join(\" \"),\n // Smooth animations\n renderProps.isEntering && [\"animate-in fade-in\", \"duration-300 ease-out\"].join(\" \"),\n renderProps.isExiting && [\"animate-out fade-out\", \"duration-200 ease-in\"].join(\" \"),\n className\n );\n })}\n >\n {children}\n </ModalOverlay>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"../Dialog/types\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\n\nconst SWIPE_DISMISS_THRESHOLD = 0.3;\nconst SWIPE_VELOCITY_THRESHOLD = 0.5;\n\nexport interface TrayProps extends DialogHeaderConfig, DialogFooterConfig {\n /**\n * Tray content\n */\n children?: React.ReactNode;\n /**\n * Controls whether the tray is visible\n */\n isOpen: boolean;\n /**\n * Called when the tray should close\n */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop should dismiss the tray\n * @default true\n */\n isDismissable?: boolean;\n /**\n * Whether to use a transparent overlay behind the tray\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Maximum height for the tray content area\n * @default \"80vh\"\n */\n maxHeight?: string;\n /**\n * Explicit height for the tray (overrides maxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n height?: string;\n /**\n * Maximum width of the tray\n * @default \"640px\"\n */\n maxWidth?: string;\n /**\n * Whether to include padding around tray content\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Whether to show the drag handle indicator on mobile\n * @default true\n */\n showHandle?: boolean;\n /**\n * Animation variant for the tray entrance/exit\n * @default \"scale\" - Slide with subtle scale effect for depth\n * \"slide\" - Simple slide up/down\n */\n animationVariant?: \"slide\" | \"scale\";\n /**\n * Additional CSS classes for the tray container\n */\n className?: string;\n}\n\n/**\n * Tray\n *\n * Bottom anchored overlay optimized for mobile experiences.\n * Provides optional header/footer slots that align with Dialog & Drawer APIs.\n */\nexport function Tray({\n children,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n isOpen,\n onClose,\n isDismissable = true,\n transparentOverlay = false,\n primaryAction,\n secondaryAction,\n footerContent,\n maxHeight = \"80vh\",\n height,\n maxWidth = \"640px\",\n contentPadding = true,\n showHandle = true,\n animationVariant = \"scale\",\n className,\n}: TrayProps) {\n const [isHandleAnimating, setIsHandleAnimating] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const transitionTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragStateRef = useRef<{\n isDragging: boolean;\n startY: number;\n startTime: number;\n pointerId: number | null;\n }>({\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n });\n\n // Trigger a subtle handle animation when tray opens\n useEffect(() => {\n if (isOpen) {\n const timer = setTimeout(() => {\n setIsHandleAnimating(true);\n setTimeout(() => setIsHandleAnimating(false), 600);\n }, 400);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n // Reset drag state when tray closes\n useEffect(() => {\n if (!isOpen) {\n setDragOffset(0);\n setIsTransitioning(false);\n dragStateRef.current = {\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n };\n }\n }, [isOpen]);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (!isDismissable) return;\n if (e.pointerType !== \"touch\" && e.pointerType !== \"pen\") return;\n\n // Clear any pending transition timeout from previous gesture\n if (transitionTimeoutRef.current) {\n clearTimeout(transitionTimeoutRef.current);\n transitionTimeoutRef.current = null;\n }\n\n dragStateRef.current = {\n isDragging: true,\n startY: e.clientY,\n startTime: Date.now(),\n pointerId: e.pointerId,\n };\n setIsTransitioning(false);\n e.currentTarget.setPointerCapture(e.pointerId);\n },\n [isDismissable]\n );\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const { isDragging, startY, pointerId } = dragStateRef.current;\n if (!isDragging || e.pointerId !== pointerId) return;\n\n const deltaY = e.clientY - startY;\n setDragOffset(Math.max(0, deltaY));\n }, []);\n\n const handlePointerEnd = useCallback(\n (e: React.PointerEvent) => {\n const { isDragging, startY, startTime, pointerId } = dragStateRef.current;\n if (!isDragging || e.pointerId !== pointerId) return;\n\n const deltaY = e.clientY - startY;\n const elapsed = Date.now() - startTime;\n const velocity = deltaY / elapsed;\n\n dragStateRef.current = {\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n };\n\n const containerHeight = containerRef.current?.getBoundingClientRect().height ?? 0;\n const threshold = containerHeight * SWIPE_DISMISS_THRESHOLD;\n const shouldDismiss =\n deltaY > threshold || (velocity > SWIPE_VELOCITY_THRESHOLD && deltaY > 50);\n\n if (shouldDismiss && isDismissable) {\n onClose?.();\n setDragOffset(0);\n } else {\n setIsTransitioning(true);\n setDragOffset(0);\n transitionTimeoutRef.current = setTimeout(() => {\n setIsTransitioning(false);\n transitionTimeoutRef.current = null;\n }, 200);\n }\n },\n [isDismissable, onClose]\n );\n\n if (!isOpen) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose?.();\n }}\n isDismissable={isDismissable}\n transparent={transparentOverlay}\n className=\"flex items-end justify-center p-0 sm:p-4\"\n >\n <Modal className=\"w-full max-w-full p-0 sm:p-2\" isDismissable={isDismissable}>\n <div\n ref={containerRef}\n className={twMerge(\"w-full\", isTransitioning && \"transition-transform duration-200\")}\n style={{\n transform: dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined,\n }}\n >\n <RACDialog\n className={twMerge(\n // Base structure\n \"relative flex w-full flex-col overflow-hidden\",\n // Background and borders with elevation\n \"bg-background-surface\",\n \"shadow-2xl shadow-black/30 dark:shadow-black/60\",\n \"border-t border-x border-border-default/40\",\n // Suppress browser focus outline/rings on the dialog container itself\n // This is safe: React Aria manages focus on interactive elements inside the dialog.\n // The container doesn't need a focus indicator as it's not directly interactive.\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0 focus:shadow-none\",\n // Transform origin for scale animation\n \"origin-bottom\",\n // Entrance animations using combined keyframes with enterprise-grade timing\n animationVariant === \"scale\"\n ? \"animate-[tray-enter-scale_400ms_cubic-bezier(0.32,0.72,0,1)]\"\n : \"animate-[tray-enter_400ms_cubic-bezier(0.32,0.72,0,1)]\",\n // Exit animations using data-[exiting] state - snappier for responsiveness\n animationVariant === \"scale\"\n ? \"data-[exiting]:animate-[tray-exit-scale_250ms_cubic-bezier(0.32,0,0.67,0)]\"\n : \"data-[exiting]:animate-[tray-exit_250ms_cubic-bezier(0.32,0,0.67,0)]\",\n className\n )}\n style={{\n maxWidth,\n ...(height ? { height } : { maxHeight }),\n }}\n >\n {showHandle && (\n <div\n className=\"absolute top-0 left-0 right-0 h-8 z-10 flex justify-center items-start pt-2 touch-none cursor-grab active:cursor-grabbing\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerEnd}\n onPointerCancel={handlePointerEnd}\n >\n <div\n className={twMerge(\n \"h-1 w-12 rounded-full bg-border-muted transition-all duration-300\",\n \"hover:bg-border-default hover:w-16\",\n isHandleAnimating && \"animate-[handle-wiggle_0.6s_ease-in-out]\"\n )}\n />\n </div>\n )}\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={\n onBack ??\n (() => {\n /* no-op */\n })\n }\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto overscroll-contain\",\n contentPadding ? \"p-4\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </div>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\nTray.displayName = \"Tray\";\n\n// Export types\nexport type { DialogAction } from \"../Dialog/types\";\n","import { FormProps, Form as RACForm } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Form\n *\n * Accessibility-first form wrapper with consistent spacing.\n * Defaults to ARIA validation to use custom error styling instead of native browser tooltips.\n */\nexport function Form(props: FormProps) {\n return (\n <RACForm\n validationBehavior=\"aria\"\n {...props}\n className={twMerge(\"flex flex-col gap-6\", props.className)}\n />\n );\n}\n","import * as React from \"react\";\nimport { Dialog, type DialogProps } from \"@/components/Dialog\";\nimport { Form } from \"@/components/Form\";\n\nexport interface DialogFormProps extends Omit<DialogProps, \"children\" | \"footerContent\"> {\n formId?: string;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n primaryLabel?: string;\n secondaryLabel?: string;\n onCancel?: () => void;\n primaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n secondaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n children?: React.ReactNode;\n}\n\nexport function DialogForm({\n formId = \"dialog-form\",\n onSubmit,\n primaryLabel = \"Save\",\n secondaryLabel = \"Cancel\",\n onCancel,\n primaryVariant,\n secondaryVariant = \"secondary\",\n children,\n title,\n ...dialogProps\n}: DialogFormProps) {\n const handleFormSubmit = () => {\n // The form element itself will handle the submit event\n const form = document.getElementById(formId) as HTMLFormElement;\n if (form) {\n form.requestSubmit();\n }\n };\n\n return (\n <Dialog\n title={title}\n primaryAction={{\n label: primaryLabel,\n onPress: handleFormSubmit,\n variant: primaryVariant,\n }}\n secondaryAction={\n onCancel\n ? {\n label: secondaryLabel,\n onPress: onCancel,\n variant: secondaryVariant,\n }\n : undefined\n }\n {...dialogProps}\n >\n <Form id={formId} onSubmit={onSubmit}>\n {children}\n </Form>\n </Dialog>\n );\n}\n","import type React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"../Dialog/types\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\n\nexport interface DrawerProps extends DialogHeaderConfig, DialogFooterConfig {\n /**\n * Drawer content\n */\n children?: React.ReactNode;\n /**\n * Whether the drawer is open\n */\n isOpen: boolean;\n /**\n * Side to slide in from\n * @default \"right\"\n */\n slideInFrom?: \"left\" | \"right\";\n /**\n * Whether to use a transparent backdrop\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Callback when the drawer is closed\n */\n onClose?: () => void;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Whether to include padding inside the content area\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Maximum width of the drawer\n * @default \"400px\"\n */\n maxWidth?: string;\n}\n\n/**\n * Drawer\n *\n * Sliding panel that anchors to screen edges.\n */\nexport function Drawer({\n children,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n isOpen,\n slideInFrom = \"right\",\n transparentOverlay = false,\n onClose,\n className,\n primaryAction,\n secondaryAction,\n footerContent,\n contentPadding = true,\n maxWidth = \"400px\",\n}: DrawerProps) {\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // Small delay to ensure the element is positioned before animation starts\n const timer = setTimeout(() => setIsAnimating(true), 10);\n return () => clearTimeout(timer);\n }\n setIsAnimating(false);\n return undefined;\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isOpen={isOpen}\n onOpenChange={(open) => !open && onClose?.()}\n isDismissable\n transparent={transparentOverlay}\n >\n <Modal className=\"flex justify-end\" isDismissable>\n <RACDialog\n className={twMerge(\n \"fixed bottom-0 top-0 z-50 flex w-full flex-col bg-background-surface shadow-xl duration-300 h-full min-h-0 overflow-hidden dark:bg-gray-800\",\n \"outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-action-default focus-visible:outline-offset-0\",\n isAnimating\n ? slideInFrom === \"right\"\n ? \"animate-in slide-in-from-right\"\n : \"animate-in slide-in-from-left\"\n : \"\",\n className\n )}\n style={{\n // Explicit positioning\n [slideInFrom === \"right\" ? \"right\" : \"left\"]: 0,\n // Dynamic max width\n maxWidth: maxWidth,\n // Initial transform to position off-screen\n transform: !isAnimating\n ? slideInFrom === \"right\"\n ? \"translateX(100%)\"\n : \"translateX(-100%)\"\n : undefined,\n }}\n >\n {hasHeader &&\n (hasBackArrow && onBack ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n hasBackArrow={true}\n onBack={onBack}\n onClose={onClose}\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n onClose={onClose}\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 overflow-y-auto overscroll-contain\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\nDrawer.displayName = \"Drawer\";\n\n// Export types\nexport type { DialogAction } from \"../Dialog/types\";\n","import * as React from \"react\";\nimport { Drawer, type DrawerProps } from \"@/components/Drawer\";\nimport { Form } from \"@/components/Form\";\n\nexport interface DrawerFormProps extends Omit<DrawerProps, \"children\" | \"footerContent\"> {\n formId?: string;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n primaryLabel?: string;\n secondaryLabel?: string;\n onCancel?: () => void;\n primaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n secondaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n children?: React.ReactNode;\n}\n\nexport function DrawerForm({\n formId = \"drawer-form\",\n onSubmit,\n primaryLabel = \"Save\",\n secondaryLabel = \"Cancel\",\n onCancel,\n primaryVariant,\n secondaryVariant = \"secondary\",\n children,\n ...drawerProps\n}: DrawerFormProps) {\n const handleFormSubmit = () => {\n const form = document.getElementById(formId) as HTMLFormElement;\n if (form) {\n form.requestSubmit();\n }\n };\n\n return (\n <Drawer\n primaryAction={{\n label: primaryLabel,\n onPress: handleFormSubmit,\n variant: primaryVariant,\n }}\n secondaryAction={\n onCancel\n ? {\n label: secondaryLabel,\n onPress: onCancel,\n variant: secondaryVariant,\n }\n : undefined\n }\n {...drawerProps}\n >\n <Form id={formId} onSubmit={onSubmit} className=\"mt-2\">\n {children}\n </Form>\n </Drawer>\n );\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface FormActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"start\" | \"end\" | \"between\";\n}\n\nexport function FormActions({ align = \"end\", className, ...rest }: FormActionsProps) {\n const justify =\n align === \"start\" ? \"justify-start\" : align === \"between\" ? \"justify-between\" : \"justify-end\";\n return <div {...rest} className={twMerge(\"flex gap-2\", justify, className)} />;\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: { base?: 1 | 2 | 3 | 4; md?: 1 | 2 | 3 | 4; lg?: 1 | 2 | 3 | 4 };\n gap?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst gapClass = {\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n} as const;\n\nfunction colsToClass(cols?: FormGridProps[\"cols\"]) {\n if (!cols) return \"\";\n const base = cols.base ? `grid-cols-${cols.base}` : \"\";\n const md = cols.md ? `md:grid-cols-${cols.md}` : \"\";\n const lg = cols.lg ? `lg:grid-cols-${cols.lg}` : \"\";\n return [base, md, lg].filter(Boolean).join(\" \");\n}\n\nexport function FormGrid({ cols = { base: 1 }, gap = \"lg\", className, ...rest }: FormGridProps) {\n return <div {...rest} className={twMerge(\"grid\", colsToClass(cols), gapClass[gap], className)} />;\n}\n","\"use client\";\n/**\n * Field Component System\n *\n * A comprehensive system for building form fields and input components with consistent\n * styling, accessibility, and behavior. This module provides both base components and\n * styling utilities that can be composed to create complex form controls.\n *\n * Key Features:\n * - Consistent styling across all form elements\n * - Built-in state handling (invalid, disabled, focused)\n * - Accessibility support out of the box\n * - Flexible composition through style utilities\n *\n * @example Basic Usage\n * ```tsx\n * <Label htmlFor=\"name\">Name</Label>\n * <Input id=\"name\" size=\"md\" />\n * ```\n *\n * @example Complex Field with All Components\n * ```tsx\n * <div>\n * <Label htmlFor=\"email\" tooltip=\"Enter your work email\">Email</Label>\n * <Input\n * id=\"email\"\n * type=\"email\"\n * isInvalid={hasError}\n * isDisabled={isSubmitting}\n * />\n * <Description>We'll never share your email</Description>\n * {hasError && <FieldError>Please enter a valid email</FieldError>}\n * </div>\n * ```\n */\n\nimport React from \"react\";\nimport type { TextProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon/Icon\";\n\n// Base style props interface for all input-like components\nexport interface InputStyleProps {\n /** Whether the input is in an invalid state */\n isInvalid?: boolean;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input should have a transparent background */\n transparent?: boolean;\n /** The size variant of the input */\n size?: Size;\n /** Whether the input is currently focused */\n isFocused?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n}\n\n// Common interfaces\nexport interface BaseProps {\n /** The size variant of the component */\n size?: Size;\n /** Additional CSS classes to apply */\n className?: string;\n}\n\nexport interface BaseInputProps extends BaseProps {\n /** Whether the input should have a transparent background */\n transparent?: boolean;\n /** Whether to show a clear button when the input has a value */\n isClearable?: boolean;\n /** Callback when the clear button is clicked */\n onClear?: () => void;\n /** Whether to show a search icon */\n showSearchIcon?: boolean;\n /**\n * Whether to reserve space for error messages to prevent layout shift\n * @default true\n */\n reserveErrorSpace?: boolean;\n}\n\nexport interface LabelProps extends BaseProps {\n /** The label content */\n children: React.ReactNode;\n /** Optional tooltip text to show next to the label */\n tooltip?: string;\n /** Whether to show a required field indicator (*) */\n isRequired?: boolean;\n /** The ID of the input this label is associated with */\n htmlFor?: string;\n}\n\nexport interface FieldErrorProps extends BaseProps {\n /** The error message to display */\n children: React.ReactNode;\n}\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n InputStyleProps {\n /** The size variant of the input */\n size?: Size;\n}\n\nexport interface DescriptionProps extends Omit<TextProps, \"className\">, BaseProps {\n /** The description content */\n children: React.ReactNode;\n}\n\nexport interface FieldGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">,\n InputStyleProps {\n /** Whether any child of the group is focused */\n isFocusWithin?: boolean;\n /** Children can be either a ReactNode or a render function */\n children?: React.ReactNode | ((props: InputStyleProps) => React.ReactNode);\n}\n\n/**\n * Hook for managing input focus state\n */\nexport function useInputFocus() {\n const [isFocused, setIsFocused] = React.useState(false);\n\n const handleFocus = React.useCallback(\n (\n e: React.FocusEvent<HTMLInputElement>,\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void\n ) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n []\n );\n\n const handleBlur = React.useCallback(\n (\n e: React.FocusEvent<HTMLInputElement>,\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void\n ) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n []\n );\n\n return { isFocused, handleFocus, handleBlur };\n}\n\n/**\n * Wrapper component for input containers\n */\nexport function InputWrapper({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={twMerge(\"relative w-full\", className)}>{children}</div>;\n}\n\n/**\n * Clear button component for inputs\n */\nexport function ClearButton({\n onClick,\n size = \"md\",\n className,\n}: {\n onClick: () => void;\n size?: Size;\n className?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className={twMerge(\n \"absolute right-2 top-1/2 -translate-y-1/2 transform text-text-muted hover:text-text-body\",\n className\n )}\n aria-label=\"Clear input\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Icon name=\"X\" size={size === \"sm\" ? 16 : 20} />\n </button>\n );\n}\n\n/**\n * Generates state-specific styles for inputs based on their current state\n * (invalid, disabled, focused).\n *\n * State Priority:\n * 1. Disabled (overrides all other states)\n * 2. Invalid + Focused\n * 3. Invalid\n * 4. Focused\n * 5. Default\n *\n * @example\n * ```tsx\n * const styles = getInputStateStyles({ isInvalid: true, isFocused: true });\n * ```\n */\nexport function getInputStateStyles(props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n}) {\n const { isInvalid, isDisabled, isFocused } = props;\n const baseStyles = \"border rounded-[var(--control-border-radius)] !outline-none \";\n\n // Disabled state overrides all others\n if (isDisabled) {\n return `${baseStyles} border-border-muted`;\n }\n\n // Handle combinations of invalid and focus states\n if (isInvalid && isFocused) {\n return `${baseStyles} border-feedback-error-border shadow-[inset_0_0_0_1px_var(--color-feedback-error-border)]`;\n }\n\n if (isInvalid) {\n return `${baseStyles} border-feedback-error-border`;\n }\n\n if (isFocused) {\n return `${baseStyles} border-border-focus shadow-[inset_0_0_0_1px_var(--color-border-focus)]`;\n }\n\n // Default state - explicitly set border color\n return `${baseStyles} border-border-input`;\n}\n\n/**\n * Generates background styles based on the transparent and disabled props.\n * Uses Tailwind classes for consistent styling across light/dark modes.\n */\nexport function getInputBackgroundStyles(props: { transparent?: boolean; isDisabled?: boolean }) {\n if (props.isDisabled) {\n return \"bg-background-muted\";\n }\n return props.transparent ? \"bg-transparent\" : \"bg-background-input\";\n}\n\n/**\n * Returns the mobile font-size override class for input components.\n * iOS Safari zooms in on inputs with font-size < 16px when focused.\n * This ensures inputs use at least 16px on mobile to prevent auto-zoom,\n * while preserving the original size on desktop (768px+).\n *\n * Uses Tailwind responsive classes for proper handling by twMerge.\n */\nfunction getInputMobileFontClass(size: Size): string {\n // Only sm and md sizes need the override (they're < 16px)\n // lg and xl are already >= 16px\n // Use text-base (16px) on mobile, restore original size on md: breakpoint\n if (size === \"sm\") {\n return \"!text-base md:!text-[length:var(--control-text-sm)]\";\n }\n if (size === \"md\") {\n return \"!text-base md:!text-[length:var(--control-text-md)]\";\n }\n return \"\";\n}\n\n/**\n * Generates the complete set of base styles for input components.\n * This includes state styles, background, sizing, and custom classes.\n *\n * @example\n * ```tsx\n * const styles = getInputBaseStyles({\n * isInvalid: formState.hasError,\n * isDisabled: isLoading,\n * size: \"md\"\n * });\n * ```\n */\nexport function getInputBaseStyles(props: InputStyleProps) {\n const { isInvalid, isDisabled, isFocused, transparent, size = \"md\", className } = props;\n\n return twMerge(\n \"w-full\",\n getInputStateStyles({ isInvalid, isDisabled, isFocused }),\n getInputBackgroundStyles({ transparent, isDisabled }),\n controlStyles[size].text,\n controlStyles[size].height,\n controlStyles[size].padding,\n getInputMobileFontClass(size),\n className\n );\n}\n\n/**\n * Generates styles for grouped form elements (like input with buttons)\n *\n * @example\n * ```tsx\n * <div className={getFieldGroupStyles({ size: \"md\" })}>\n * <Input />\n * <Button>Submit</Button>\n * </div>\n * ```\n */\nexport function getFieldGroupStyles(props: FieldGroupProps) {\n const { size = \"md\", isFocusWithin, isInvalid, isDisabled, transparent, className } = props;\n\n return twMerge(\n \"group flex items-center rounded-[var(--control-border-radius)] overflow-hidden\",\n getInputBackgroundStyles({ transparent, isDisabled }),\n controlStyles[size].height,\n getInputStateStyles({ isFocused: isFocusWithin, isInvalid, isDisabled }),\n className\n );\n}\n\n// Components\n\n/**\n * Label component for form fields. Supports tooltips and required field indicators.\n *\n * @example\n * ```tsx\n * <Label\n * htmlFor=\"email\"\n * tooltip=\"Enter your work email\"\n * isRequired\n * >\n * Email Address\n * </Label>\n * ```\n */\nexport function Label({\n children,\n size = \"md\",\n tooltip,\n isRequired,\n className,\n htmlFor,\n}: LabelProps) {\n return (\n <label\n htmlFor={htmlFor}\n className={twMerge(\n controlStyles[size].text,\n \"!text-text-label font-semibold flex items-center gap-1\",\n className\n )}\n >\n {children}\n {isRequired && <span>*</span>}\n {tooltip && (\n <span className=\"text-text-muted\">\n <Icon name=\"Info\" size={size === \"sm\" ? 16 : 20} />\n </span>\n )}\n </label>\n );\n}\n\n/**\n * Description component for providing additional context about a form field.\n *\n * @example\n * ```tsx\n * <Description>Must be at least 8 characters</Description>\n * ```\n */\nexport function Description({ size = \"md\", className, children, ...props }: DescriptionProps) {\n return (\n <div\n {...props}\n className={twMerge(\"leading-[2.25] text-text-caption\", controlStyles[size].text, className)}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Error message component for form fields. Automatically handles\n * accessibility attributes for screen readers.\n *\n * @example\n * ```tsx\n * {hasError && <FieldError>This field is required</FieldError>}\n * ```\n */\nexport function FieldError({ children, size = \"md\", className }: FieldErrorProps) {\n return (\n <div\n role=\"alert\"\n className={twMerge(controlStyles[size].text, \"text-feedback-error-text\", className)}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Base input component with consistent styling and state handling.\n * Extends the native input element with our custom styling system.\n *\n * @example\n * ```tsx\n * <Input\n * size=\"md\"\n * isInvalid={hasError}\n * isDisabled={isLoading}\n * transparent={false}\n * />\n * ```\n */\nexport function Input({\n size = \"md\",\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n className,\n ...props\n}: InputProps) {\n return (\n <input\n className={getInputBaseStyles({\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n size,\n className,\n })}\n {...props}\n />\n );\n}\n\n/**\n * Container for grouping form elements with consistent styling.\n * Useful for creating compound components like input with buttons.\n *\n * @example\n * ```tsx\n * <FieldGroup>\n * <Input placeholder=\"Search...\" />\n * <Button>Search</Button>\n * </FieldGroup>\n * ```\n */\nexport function FieldGroup(props: FieldGroupProps) {\n const { children, ...rest } = props;\n return (\n <div {...rest} className={getFieldGroupStyles(props)}>\n {typeof children === \"function\" ? children(props) : children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Description } from \"@/components/Field\";\nimport { Heading } from \"@/components/Heading\";\n\nexport interface FormSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: string | React.ReactNode;\n description?: string | React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function FormSection({\n title,\n description,\n showDivider,\n className,\n children,\n ...rest\n}: FormSectionProps) {\n return (\n <section {...rest} className={twMerge(\"flex flex-col\", className)}>\n {(title || description) && (\n <div className=\"flex flex-col gap-1 mb-6\">\n {typeof title === \"string\" ? (\n <Heading tag=\"h3\" size=\"sm\">\n {title}\n </Heading>\n ) : (\n title\n )}\n {description ? <Description size=\"lg\">{description}</Description> : null}\n </div>\n )}\n <div className=\"flex flex-col gap-6\">{children}</div>\n {showDivider && <hr className=\"mt-2 border-border-muted\" />}\n </section>\n );\n}\n\nexport function FormDivider() {\n return <hr className=\"border-border-muted\" />;\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"@/components/Icon\";\n\nexport interface Step {\n id: string;\n title: string;\n description?: string;\n}\n\nexport interface FormStepperProps {\n steps: Step[];\n currentStepId: string;\n onStepClick?: (id: string) => void;\n className?: string;\n}\n\nexport function FormStepper({ steps, currentStepId, onStepClick, className }: FormStepperProps) {\n const currentIndex = steps.findIndex((s) => s.id === currentStepId);\n\n return (\n <nav aria-label=\"Progress\" className={twMerge(\"w-full\", className)}>\n {/* Connecting lines container - behind everything */}\n <div className=\"relative mb-20\">\n <div className=\"absolute top-5 left-0 right-0 flex items-center justify-between\">\n {/* Left spacer for first circle */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Lines */}\n {steps.slice(0, -1).map((_, index) => (\n <div\n key={index}\n className={twMerge(\n \"h-0.5 flex-1 transition-colors\",\n index < currentIndex ? \"bg-action-default\" : \"bg-border-default\"\n )}\n />\n ))}\n\n {/* Right spacer for last circle */}\n <div className=\"w-10 flex-shrink-0\" />\n </div>\n\n {/* Steps */}\n <ol className=\"relative flex items-start justify-between\">\n {steps.map((step, index) => {\n const isActive = step.id === currentStepId;\n const isCompleted = index < currentIndex;\n const isClickable = onStepClick && (isCompleted || isActive);\n\n return (\n <li key={step.id} className=\"flex flex-col items-center\">\n {/* Step Circle */}\n <button\n type=\"button\"\n disabled={!isClickable}\n onClick={() => isClickable && onStepClick?.(step.id)}\n className={twMerge(\n \"relative z-10 flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full border-2 transition-colors bg-background-body\",\n isCompleted &&\n \"border-action-default bg-action-default text-text-onPrimary hover:bg-action-default/90\",\n isActive && \"border-action-default bg-background-body text-action-default\",\n !isCompleted &&\n !isActive &&\n \"border-border-default bg-background-body text-text-muted\",\n isClickable && \"cursor-pointer\",\n !isClickable && \"cursor-default\"\n )}\n aria-current={isActive ? \"step\" : undefined}\n >\n {isCompleted ? (\n <Icon name=\"Check\" size={20} weight=\"bold\" />\n ) : (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </button>\n\n {/* Step Label */}\n <div className=\"mt-3 flex flex-col items-center text-center w-32\">\n <span\n className={twMerge(\n \"text-sm font-medium\",\n isActive && \"text-text-default\",\n isCompleted && \"text-text-body\",\n !isActive && !isCompleted && \"text-text-muted\"\n )}\n >\n {step.title}\n </span>\n {step.description && (\n <span className=\"mt-1 text-xs text-text-caption\">{step.description}</span>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n </nav>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Button } from \"@/components/Button\";\n\nexport interface SaveBarProps {\n formId?: string;\n show: boolean;\n isSubmitting?: boolean;\n onCancel?: () => void;\n primaryLabel?: string;\n secondaryLabel?: string;\n className?: string;\n}\n\nexport function SaveBar({\n formId,\n show,\n isSubmitting,\n onCancel,\n primaryLabel = \"Save changes\",\n secondaryLabel = \"Cancel\",\n className,\n}: SaveBarProps) {\n if (!show) return null;\n\n return (\n <div\n className={twMerge(\n \"fixed inset-x-0 bottom-0 z-40 border-t border-border-muted bg-background-surface/95 backdrop-blur supports-[backdrop-filter]:bg-background-surface/70\",\n className\n )}\n >\n <div className=\"mx-auto flex max-w-screen-lg items-center justify-between gap-3 p-3\">\n <div className=\"text-sm text-text-muted\">You have unsaved changes</div>\n <div className=\"flex gap-2\">\n <Button variant=\"secondary\" onPress={onCancel}>\n {secondaryLabel}\n </Button>\n <Button type=\"submit\" form={formId} isDisabled={!!isSubmitting}>\n {isSubmitting ? \"Saving...\" : primaryLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nexport interface UnsavedChangesPromptProps {\n when: boolean;\n message?: string;\n}\n\nexport function UnsavedChangesPrompt({\n when,\n message = \"You have unsaved changes. Leave anyway?\",\n}: UnsavedChangesPromptProps) {\n React.useEffect(() => {\n if (!when) return;\n const handler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = message;\n return message;\n };\n window.addEventListener(\"beforeunload\", handler);\n return () => window.removeEventListener(\"beforeunload\", handler);\n }, [when, message]);\n\n return null;\n}\n","import * as React from \"react\";\n\nexport interface WizardStep {\n id: string;\n title: string;\n description?: string;\n}\n\nexport interface UseWizardOptions {\n steps: WizardStep[];\n initialStepId?: string;\n canNavigate?: (fromId: string, toId: string) => Promise<boolean> | boolean;\n}\n\nexport function useWizard({ steps, initialStepId, canNavigate }: UseWizardOptions) {\n if (steps.length === 0) {\n throw new Error(\"useWizard: steps array cannot be empty\");\n }\n\n const [currentStepId, setCurrentStepId] = React.useState<string>(initialStepId || steps[0].id);\n\n const stepIndex = steps.findIndex((s) => s.id === currentStepId);\n const hasPrev = stepIndex > 0;\n const hasNext = stepIndex < steps.length - 1;\n\n const goTo = async (id: string) => {\n if (id === currentStepId) return true;\n if (canNavigate) {\n const ok = await canNavigate(currentStepId, id);\n if (!ok) return false;\n }\n setCurrentStepId(id);\n return true;\n };\n\n const next = async () => {\n if (!hasNext || stepIndex === -1) return false;\n return goTo(steps[stepIndex + 1].id);\n };\n\n const prev = async () => {\n if (!hasPrev || stepIndex === -1) return false;\n return goTo(steps[stepIndex - 1].id);\n };\n\n return { steps, currentStepId, setCurrentStepId: goTo, next, prev, hasNext, hasPrev, stepIndex };\n}\n"]}
1
+ {"version":3,"sources":["../../src/components/Dialog/Dialog.tsx","../../src/hooks/useMediaQuery.ts","../../src/utils/index.ts","../../src/utils/controlStyles.ts","../../src/components/Icon/Icon.tsx","../../src/components/Button/Button.tsx","../../src/components/DialogFooter/DialogFooter.tsx","../../src/components/Heading/Heading.tsx","../../src/components/DialogHeader/DialogHeader.tsx","../../src/components/Skeleton/Skeleton.tsx","../../src/components/Card/Card.tsx","../../src/components/ErrorBoundary/ErrorBoundary.tsx","../../src/components/ModalBackdrop/ModalBackdrop.tsx","../../src/components/Tray/Tray.tsx","../../src/components/Form/Form.tsx","../../src/form/DialogForm.tsx","../../src/components/Drawer/Drawer.tsx","../../src/form/DrawerForm.tsx","../../src/form/FormActions.tsx","../../src/form/FormGrid.tsx","../../src/components/Field/Field.tsx","../../src/form/FormSection.tsx","../../src/form/FormStepper.tsx","../../src/form/SaveBar.tsx","../../src/form/UnsavedChangesPrompt.tsx","../../src/form/useWizard.tsx"],"names":["useMediaQuery","query","defaultValue","matches","setMatches","useState","useEffect","mediaQueryList","handleChange","event","focusRing","showDefaultOutline","controlStyles","sizePresets","Icon","memo","name","size","color","weight","className","ariaLabel","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","twMerge","jsx","IconWithContainer","variant","shape","containerSize","containerClassName","ref","iconSize","resolvedContainerSize","containerClasses","baseStyles","variantStyles","widthStyles","disabledStyles","enabledStyles","badgePositionStyles","badgeVariantStyles","normalizeVariant","getButtonStyles","isDisabled","fullWidth","isLoading","normalizedVariant","styles","focusRingColor","Button","icon","children","loadingText","loadingIndicator","iconPosition","iconWeight","href","badgeNumber","badgeVariant","badgePosition","style","target","rel","restProps","iconElement","content","jsxs","Fragment","loadingNode","hasBadge","composedClassName","linkProps","_onPress","_onPressStart","_onPressEnd","_onPressChange","_onPressUp","_onAuxClick","_onContextMenu","_onDoubleClick","safeRestProps","buttonOrLink","RACLink","renderProps","RACButton","DialogFooter","primaryAction","secondaryAction","tertiaryAction","footerContent","hasActions","sizeVariants","heightVariants","Heading","Tag","height","sizeClasses","heightClasses","DialogHeader","title","onClose","hideCloseIcon","titleAlign","hasBackArrow","onBack","headerContent","Skeleton","width","animation","gradient","flex","stack","responsive","delay","adjustAnimationSpeedBasedOnWidth","dataTestId","visible","setVisible","timer","baseClasses","animationSpeed","numWidth","animationClasses","shapeClasses","layoutClasses","responsiveStyles","breakpoint","value","lineWidth","index","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","CardHeader","subtitle","actions","CardMedia","src","alt","aspectRatio","CardContent","defaultPadding","CardFooter","align","ErrorBoundary","Component","__publicField","error","errorInfo","ModalBackdrop","transparent","ModalOverlay","composeRenderProps","SWIPE_DISMISS_THRESHOLD","SWIPE_VELOCITY_THRESHOLD","Tray","isOpen","isDismissable","transparentOverlay","maxHeight","maxWidth","contentPadding","showHandle","animationVariant","isHandleAnimating","setIsHandleAnimating","dragOffset","setDragOffset","isTransitioning","setIsTransitioning","containerRef","useRef","transitionTimeoutRef","dragStateRef","handlePointerDown","useCallback","e","handlePointerMove","isDragging","startY","pointerId","deltaY","handlePointerEnd","startTime","elapsed","velocity","threshold","hasHeader","hasFooter","open","Modal","RACDialog","Dialog","minWidth","mobileMaxHeight","mobileHeight","isControlled","Form","RACForm","DialogForm","formId","onSubmit","primaryLabel","secondaryLabel","onCancel","primaryVariant","secondaryVariant","dialogProps","form","Drawer","slideInFrom","isAnimating","setIsAnimating","DrawerForm","drawerProps","FormActions","rest","gapClass","colsToClass","cols","base","md","lg","FormGrid","gap","Description","FormSection","description","showDivider","FormDivider","FormStepper","steps","currentStepId","onStepClick","currentIndex","s","_","step","isActive","isCompleted","isClickable","SaveBar","show","isSubmitting","UnsavedChangesPrompt","when","message","Ke","handler","useWizard","initialStepId","canNavigate","setCurrentStepId","Ze","stepIndex","hasPrev","hasNext","goTo","id"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useMediaQuery } from \"../../hooks/useMediaQuery\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\nimport { Tray } from \"../Tray\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"./types\";\n\nexport interface DialogProps extends Omit<DialogHeaderConfig, \"onClose\">, DialogFooterConfig {\n /**\n * Whether the dialog is open (controlled mode)\n * When using DialogTrigger, leave this undefined for automatic state management\n * @default undefined\n */\n isOpen?: boolean;\n /**\n * Callback when the dialog is closed (controlled mode)\n * When using DialogTrigger, leave this undefined for automatic state management\n * @default undefined\n */\n onClose?: () => void;\n /**\n * Dialog content\n */\n children: React.ReactNode;\n /**\n * Whether to use a transparent backdrop\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Maximum width of the dialog\n * @default \"600px\"\n */\n maxWidth?: string;\n /**\n * Minimum width of the dialog (desktop only, mobile uses full width)\n * @default \"400px\"\n */\n minWidth?: string;\n /**\n * Maximum height of the dialog on desktop\n * @default \"85vh\"\n */\n maxHeight?: string;\n /**\n * Explicit height of the dialog on desktop (overrides maxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n height?: string;\n /**\n * Maximum height of the dialog on mobile (tray version)\n * @default \"90vh\"\n */\n mobileMaxHeight?: string;\n /**\n * Explicit height of the dialog on mobile (overrides mobileMaxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n mobileHeight?: string;\n /**\n * Whether to include padding inside the content area\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * Dialog\n *\n * Responsive modal dialog component with backdrop.\n *\n * **Desktop (≥768px):** Centered modal with scale and fade animation\n * **Mobile (<768px):** Uses Tray component for native bottom sheet experience with drag handle\n *\n * Includes optional header with title/back button and footer with action buttons.\n *\n * ## Usage Patterns\n *\n * ### Uncontrolled with DialogTrigger (Recommended)\n * ```tsx\n * import { DialogTrigger, Dialog, Button } from \"@texturehq/edges\";\n *\n * <DialogTrigger>\n * <Button>Open Dialog</Button>\n * <Dialog title=\"My Dialog\">\n * <p>Dialog content</p>\n * </Dialog>\n * </DialogTrigger>\n * ```\n *\n * ### Controlled (Advanced)\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * <Dialog isOpen={isOpen} onClose={() => setIsOpen(false)} title=\"My Dialog\">\n * <p>Dialog content</p>\n * </Dialog>\n * ```\n */\nexport function Dialog({\n isOpen,\n onClose,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n children,\n primaryAction,\n secondaryAction,\n tertiaryAction,\n footerContent,\n transparentOverlay = false,\n maxWidth = \"600px\",\n minWidth = \"400px\",\n maxHeight = \"85vh\",\n height,\n mobileMaxHeight = \"90vh\",\n mobileHeight,\n contentPadding = true,\n className,\n}: DialogProps) {\n // In controlled mode, don't render if closed\n if (isOpen === false) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || tertiaryAction || footerContent;\n\n // Determine if we're in controlled mode\n const isControlled = isOpen !== undefined;\n\n // Check if we're on mobile\n const isMobile = useMediaQuery(\"(max-width: 767px)\");\n\n // On mobile, use Tray component\n if (isMobile) {\n // In uncontrolled mode (when used with DialogTrigger), we need to return the Tray\n // but let DialogTrigger handle the state. We can't use Tray directly in uncontrolled mode\n // because Tray requires isOpen prop. So we need to wrap it similarly to desktop.\n if (!isControlled) {\n // For uncontrolled mode, render nothing - DialogTrigger will handle rendering\n // This is a limitation: mobile will fall through to desktop rendering for uncontrolled mode\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isDismissable\n transparent={transparentOverlay}\n className=\"flex items-end justify-center\"\n >\n <Modal className=\"w-full p-0 outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0\">\n <RACDialog\n className={twMerge(\n \"relative flex w-full flex-col\",\n \"bg-background-surface dark:bg-gray-800\",\n \"shadow-2xl shadow-black/20\",\n \"border-t border-x border-border-default/40\",\n \"max-h-[90vh]\",\n \"rounded-t-xl\",\n \"overflow-hidden\",\n \"animate-in slide-in-from-bottom\",\n \"duration-300 ease-out\",\n \"data-[exiting]:animate-out data-[exiting]:slide-out-to-bottom\",\n \"data-[exiting]:duration-200 data-[exiting]:ease-in\",\n className\n )}\n style={{\n ...(mobileHeight ? { height: mobileHeight } : { maxHeight: mobileMaxHeight }),\n }}\n >\n <div className=\"flex justify-center pt-2\">\n <div className=\"h-1.5 w-12 rounded-full bg-border-muted\" />\n </div>\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={onBack!}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto overscroll-contain\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n tertiaryAction={tertiaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n }\n\n // Controlled mode - use Tray\n return (\n <Tray\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n hasBackArrow={hasBackArrow}\n onBack={onBack}\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n transparentOverlay={transparentOverlay}\n maxHeight={mobileMaxHeight}\n height={mobileHeight}\n maxWidth={maxWidth}\n contentPadding={contentPadding}\n showHandle={true}\n animationVariant=\"scale\"\n className={className}\n >\n {children}\n </Tray>\n );\n }\n\n // On desktop, use centered modal\n return (\n <ErrorBoundary>\n <ModalBackdrop\n // Only pass isOpen/onOpenChange in controlled mode\n {...(isControlled\n ? {\n isOpen: isOpen,\n onOpenChange: (open) => {\n if (!open && onClose) onClose();\n },\n }\n : {})}\n isDismissable\n transparent={transparentOverlay}\n className=\"flex items-center justify-center\"\n >\n <Modal\n className=\"w-full p-4 outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0\"\n style={{ maxWidth }}\n >\n <RACDialog\n className={twMerge(\n // Base structure\n \"relative flex w-full flex-col\",\n // Visual styling\n \"bg-background-surface dark:bg-gray-800\",\n \"shadow-2xl shadow-black/20\",\n \"border border-border-default/50\",\n // Layout\n \"rounded-md\",\n \"overflow-hidden\",\n // Remove browser focus outline/ring on the dialog container\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0\",\n // Desktop: scale and fade animation\n \"animate-in fade-in zoom-in-96 slide-in-from-bottom-2\",\n \"duration-300 ease-out\",\n // Exit animations\n \"data-[exiting]:animate-out data-[exiting]:fade-out data-[exiting]:zoom-out-95\",\n \"data-[exiting]:duration-200 data-[exiting]:ease-in\",\n className\n )}\n style={{\n minWidth,\n ...(height ? { height } : { maxHeight }),\n }}\n >\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={onBack!}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* no-op for uncontrolled mode */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n tertiaryAction={tertiaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\n// Export types\nexport type { DialogAction, DialogFooterConfig, DialogHeaderConfig } from \"./types\";\n","import { useEffect, useState } from \"react\";\n\n/**\n * Hook to check if a media query matches the current viewport\n *\n * @param query - A CSS media query string (e.g., \"(min-width: 768px)\")\n * @param defaultValue - The default value to return during SSR or before the first render\n * @returns A boolean indicating whether the media query matches\n *\n * @example\n * ```tsx\n * const isMobile = useMediaQuery('(max-width: 767px)');\n * const prefersReducedMotion = useMediaQuery('(prefers-reduced-motion: reduce)');\n * const isLandscape = useMediaQuery('(orientation: landscape)');\n * ```\n */\nexport function useMediaQuery(query: string, defaultValue = false): boolean {\n const [matches, setMatches] = useState<boolean>(defaultValue);\n\n useEffect(() => {\n // Return early if window is not available (SSR)\n if (typeof window === \"undefined\") return;\n\n const mediaQueryList = window.matchMedia(query);\n\n // Set initial value\n setMatches(mediaQueryList.matches);\n\n // Handler for when the media query match state changes\n const handleChange = (event: MediaQueryListEvent) => {\n setMatches(event.matches);\n };\n\n // Listen for changes\n mediaQueryList.addEventListener(\"change\", handleChange);\n\n // Cleanup\n return () => {\n mediaQueryList.removeEventListener(\"change\", handleChange);\n };\n }, [query]);\n\n return matches;\n}\n","import { composeRenderProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport { ColorModeProvider, useColorMode } from \"./ColorModeProvider\";\n\n// Re-export formatting utilities from the new formatting module\nexport * from \"./formatting\";\n\n// Re-export time formatting utilities\nexport * from \"./timeFormat\";\n\nexport function focusRing(showDefaultOutline: boolean = false) {\n // Use data-[focus-visible] instead of :focus-visible to work with React Aria's focus management\n const baseClasses = showDefaultOutline\n ? \"outline outline-1 outline-border-input data-[focus-visible]:outline-2 data-[focus-visible]:outline-action-default data-[focus-visible]:outline-offset-0 invalid:outline-2 invalid:outline-feedback-error-border group-invalid:outline-2 group-invalid:outline-feedback-error-border forced-colors:focus:outline-[Highlight] forced-colors:focus:outline-2 forced-colors:focus:outline-offset-2\"\n : \"outline-none data-[focus-visible]:outline data-[focus-visible]:outline-2 data-[focus-visible]:outline-action-default data-[focus-visible]:outline-offset-0 invalid:outline-2 invalid:outline-feedback-error-border group-invalid:outline-2 group-invalid:outline-feedback-error-border forced-colors:focus:outline-[Highlight] forced-colors:focus:outline-2 forced-colors:focus:outline-offset-2\";\n return `${baseClasses}`;\n}\n\nexport function composeTailwindRenderProps<T>(\n className: string | ((v: T) => string) | undefined,\n tw: string\n): string | ((v: T) => string) {\n return composeRenderProps(className, (className) => twMerge(tw, className));\n}\n","/**\n * Control-specific style utilities for form elements and interactive components.\n * These styles use CSS variables defined in the theme for consistent sizing\n * and spacing across all control elements.\n *\n * Text sizes follow the relationships defined in theme.css:\n * sm: --control-text-sm (maps to --text-xs)\n * md: --control-text-md (maps to --text-sm)\n * lg: --control-text-lg (maps to --text-base)\n * xl: --control-text-xl (maps to --text-lg)\n */\n\nexport type Size = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport const controlStyles = {\n sm: {\n text: \"text-[length:var(--control-text-sm)]\",\n height: \"h-[var(--control-sm-height)]\",\n padding: \"px-[var(--control-padding-sm)]\",\n paddingY: \"py-[var(--control-gap-sm)]\",\n gap: \"gap-[var(--control-gap-sm)]\",\n },\n md: {\n text: \"text-[length:var(--control-text-md)]\",\n height: \"h-[var(--control-md-height)]\",\n padding: \"px-[var(--control-padding-md)]\",\n paddingY: \"py-[var(--control-gap-md)]\",\n gap: \"gap-[var(--control-gap-md)]\",\n },\n lg: {\n text: \"text-[length:var(--control-text-lg)]\",\n height: \"h-[var(--control-lg-height)]\",\n padding: \"px-[var(--control-padding-lg)]\",\n paddingY: \"py-[var(--control-gap-lg)]\",\n gap: \"gap-[var(--control-gap-lg)]\",\n },\n xl: {\n text: \"text-[length:var(--control-text-xl)]\",\n height: \"h-[var(--control-xl-height)]\",\n padding: \"px-[var(--control-padding-xl)]\",\n paddingY: \"py-[var(--control-gap-xl)]\",\n gap: \"gap-[var(--control-gap-xl)]\",\n },\n} as const;\n","\"use client\";\nimport type { IconProps as PhosphorIconProps } from \"@phosphor-icons/react\";\nimport * as PhosphorIcons from \"@phosphor-icons/react\";\nimport { memo } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Type for any Phosphor icon component\ntype PhosphorIconComponent = typeof PhosphorIcons.House;\n\n// Extract all icon names from the Phosphor package\nexport type PhosphorIconName = keyof typeof PhosphorIcons;\n\n// For backwards compatibility, export IconName as an alias\nexport type IconName = PhosphorIconName;\n\n// Standard size presets for the design system\nconst sizePresets = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 40,\n \"2xl\": 48,\n} as const;\n\ntype SizePreset = keyof typeof sizePresets;\n\ninterface IconProps extends Omit<PhosphorIconProps, \"size\"> {\n /**\n * The name of the Phosphor icon to render\n * Any valid icon from @phosphor-icons/react\n */\n name: PhosphorIconName;\n\n /**\n * Size of the icon - can be a preset or custom number\n */\n size?: SizePreset | number;\n\n /**\n * Accessibility label (maps to aria-label)\n */\n ariaLabel?: string;\n}\n\n/**\n * Icon\n *\n * Phosphor icon wrapper component with standardized sizing and styling.\n * Provides access to the full Phosphor icon library with tree-shaking support and design system presets.\n * - TypeScript autocomplete for all icon names\n *\n * Usage:\n * ```tsx\n * <Icon name=\"House\" size=\"md\" />\n * <Icon name=\"User\" size={32} className=\"text-brand\" />\n * ```\n */\nexport const Icon = memo(\n ({ name, size = \"md\", color, weight = \"regular\", className, ariaLabel, ...props }: IconProps) => {\n // Get the icon component from the Phosphor package\n const IconComponent = PhosphorIcons[name] as PhosphorIconComponent | undefined;\n\n if (!IconComponent) {\n if (process.env.NODE_ENV === \"development\") {\n console.error(`Icon \"${name}\" not found in @phosphor-icons/react`);\n }\n return null;\n }\n\n // Resolve size to pixel value\n const resolvedSize =\n typeof size === \"string\" && size in sizePresets ? sizePresets[size as SizePreset] : size;\n\n // Build className with design system defaults\n const iconClassName = twMerge(\n // Default styles\n \"inline-block flex-shrink-0\",\n // Allow color inheritance from parent\n !color && \"text-current\",\n // Custom classes\n className\n );\n\n return (\n <IconComponent\n {...props}\n size={resolvedSize as number}\n color={color}\n weight={weight}\n className={iconClassName}\n aria-label={ariaLabel || `${name} icon`}\n data-testid={`icon-${name}`}\n />\n );\n }\n);\n\nIcon.displayName = \"Icon\";\n\n/**\n * Helper component for icons with containers\n */\ninterface IconWithContainerProps extends IconProps {\n /**\n * Container variant\n */\n variant?: \"subtle\" | \"solid\" | \"outline\";\n\n /**\n * Container shape\n */\n shape?: \"square\" | \"circle\";\n\n /**\n * Container size (adds padding around icon)\n */\n containerSize?: SizePreset | number;\n\n /**\n * Container background color\n */\n containerClassName?: string;\n}\n\nexport const IconWithContainer = memo(\n ({\n variant = \"subtle\",\n shape = \"square\",\n containerSize,\n containerClassName,\n size = \"md\",\n className,\n name,\n color,\n weight,\n ariaLabel,\n ref,\n ...props\n }: IconWithContainerProps & { ref?: React.Ref<HTMLDivElement> }) => {\n // Calculate container size if not specified\n const iconSize =\n typeof size === \"string\" && size in sizePresets ? sizePresets[size as SizePreset] : size;\n const resolvedContainerSize = containerSize\n ? typeof containerSize === \"string\" && containerSize in sizePresets\n ? sizePresets[containerSize as SizePreset]\n : containerSize\n : (iconSize as number) * 1.75; // Default to 1.75x icon size\n\n const containerClasses = twMerge(\n // Base styles\n \"inline-flex items-center justify-center flex-shrink-0\",\n\n // Shape\n shape === \"circle\" ? \"rounded-full\" : \"rounded-lg\",\n\n // Variant styles using Tailwind 4 CSS variables\n variant === \"subtle\" && \"bg-gray-100 dark:bg-gray-800\",\n variant === \"solid\" && \"bg-brand text-white\",\n variant === \"outline\" && \"border-2 border-current\",\n\n // Container className for overrides\n containerClassName\n );\n\n return (\n <div\n className={containerClasses}\n style={{\n width: resolvedContainerSize,\n height: resolvedContainerSize,\n }}\n >\n <Icon\n {...props}\n name={name}\n size={size}\n color={color}\n weight={weight}\n className={className}\n ariaLabel={ariaLabel}\n />\n </div>\n );\n }\n);\n\nIconWithContainer.displayName = \"IconWithContainer\";\n","import type { ComponentProps, ReactNode } from \"react\";\nimport {\n ButtonRenderProps,\n LinkRenderProps,\n Button as RACButton,\n ButtonProps as RACButtonProps,\n Link as RACLink,\n LinkProps as RACLinkProps,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { controlStyles } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon\";\n\ntype IconName = ComponentProps<typeof Icon>[\"name\"];\n\ntype BaseButtonProps = Omit<RACButtonProps, \"className\">;\n\n/**\n * Button\n *\n * A versatile action component that supports multiple visual variants, sizes,\n * optional icons, a loading state, and badge indicators. Follows the Edges\n * design system tokens and composes `react-aria-components` under the hood.\n *\n * Example usage:\n * ```tsx\n * <Button variant=\"brand\" size=\"md\" icon=\"Check\">Save</Button>\n * ```\n */\nexport interface ButtonProps extends BaseButtonProps {\n variant?:\n | \"default\"\n | \"brand\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\"\n | \"primary\";\n size?: Size;\n badgeNumber?: number;\n badgeVariant?: \"primary\" | \"destructive\";\n badgePosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n fullWidth?: boolean;\n icon?: IconName;\n iconWeight?: \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\";\n iconPosition?: \"left\" | \"right\";\n isLoading?: boolean;\n loadingText?: string;\n loadingIndicator?: React.ReactNode;\n className?: string;\n href?: string;\n target?: string;\n rel?: string;\n style?: React.CSSProperties;\n}\n\nconst baseStyles =\n \"flex font-medium justify-center items-center gap-2 text-center transition rounded-[var(--control-border-radius)] whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default:\n \"bg-action-default text-[color:var(--color-action-default-text)] hover:bg-action-default-hover forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n brand:\n \"bg-action-brand text-[color:var(--color-action-brand-text)] hover:bg-action-brand-hover forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n secondary:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/5 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n ghost:\n \"border-none text-text-body hover:bg-text-body/5 forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace]\",\n destructive:\n \"bg-transparent text-feedback-error-text border-2 border-border-muted hover:bg-feedback-error-background/50 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[Mark]\",\n link: \"!text-action-brand hover:text-action-brand/90 hover:underline hover:decoration-2 hover:underline-offset-4\",\n icon: \"border-none text-text-body hover:bg-background-hover hover:text-text-heading forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace] p-1 flex-shrink-0 rounded-[var(--control-border-radius)]\",\n unstyled: \"bg-transparent\",\n} as const;\n\nconst widthStyles = {\n full: \"w-full\",\n default: \"w-fit\",\n};\n\nconst disabledStyles = \"opacity-50 cursor-not-allowed pointer-events-none\";\nconst enabledStyles = \"opacity-100 cursor-pointer\";\n\nconst badgePositionStyles = {\n \"top-right\": \"-right-2 -top-2\",\n \"top-left\": \"-left-2 -top-2\",\n \"bottom-right\": \"-right-2 -bottom-2\",\n \"bottom-left\": \"-left-2 -bottom-2\",\n} as const;\n\nconst badgeVariantStyles = {\n primary: \"bg-action-brand text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\n\nfunction normalizeVariant(\n variant: ButtonProps[\"variant\"]\n): \"default\" | \"brand\" | \"secondary\" | \"destructive\" | \"icon\" | \"link\" | \"unstyled\" | \"ghost\" {\n if (!variant) {\n return \"default\";\n }\n\n if (variant === \"primary\") {\n return \"brand\";\n }\n\n return variant;\n}\n\nfunction getButtonStyles(props: ButtonProps) {\n const {\n variant = \"default\",\n size = \"md\",\n isDisabled,\n fullWidth = false,\n isLoading = false,\n } = props;\n\n const normalizedVariant = normalizeVariant(variant);\n\n let styles =\n normalizedVariant === \"unstyled\" ? \"\" : `${baseStyles} ${variantStyles[normalizedVariant]}`;\n\n // Add size styles using controlStyles\n if (normalizedVariant !== \"unstyled\") {\n styles += ` ${controlStyles[size].text} ${controlStyles[size].height} ${controlStyles[size].padding} ${controlStyles[size].gap}`;\n }\n\n if (isDisabled || isLoading) {\n styles += ` ${disabledStyles}`;\n } else {\n styles += ` ${enabledStyles}`;\n }\n\n if (fullWidth) {\n styles += ` ${widthStyles.full}`;\n } else {\n styles += ` ${widthStyles.default}`;\n }\n\n const focusRingColor =\n normalizedVariant === \"brand\" ? \"focus-visible:outline-action-brand\" : undefined;\n\n return [styles, focusRing(), focusRingColor].filter(Boolean).join(\" \");\n}\n\n/**\n * Renders an Edges Button. When `href` is provided, renders a link-styled\n * button using the same visual system.\n */\nexport function Button(props: ButtonProps) {\n const {\n icon,\n children,\n isLoading = false,\n loadingText,\n loadingIndicator,\n size = \"md\",\n iconPosition = \"left\",\n iconWeight,\n href,\n className,\n badgeNumber,\n badgeVariant = \"primary\",\n badgePosition = \"top-right\",\n style,\n target,\n rel,\n ...restProps\n } = props;\n\n // Shared icon logic\n const iconElement = icon ? <Icon name={icon} size={size} weight={iconWeight} /> : null;\n\n // Shared content logic\n const content = (\n <>\n {iconPosition === \"left\" && iconElement}\n {typeof children === \"function\" ? null : children}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n\n // Loading state\n const loadingNode = (\n <div className=\"relative inline-flex items-center justify-center\">\n <div className=\"absolute inset-0 flex items-center justify-center\">\n {loadingIndicator || (\n <Icon name=\"CircleNotch\" size={size} className=\"animate-spin\" aria-hidden=\"true\" />\n )}\n </div>\n <div className=\"invisible\" aria-hidden=\"true\">\n {content}\n </div>\n {loadingText && (\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {loadingText}\n </span>\n )}\n </div>\n );\n\n // Compose className using twMerge to properly handle Tailwind class conflicts\n const hasBadge = (badgeNumber ?? 0) > 0;\n const composedClassName = twMerge(getButtonStyles(props), className);\n\n // Create link-specific props by filtering out button-specific props\n const linkProps: Partial<RACLinkProps> = href\n ? {\n href,\n target,\n rel,\n // Only include props that are valid for both Button and Link\n ...(restProps as Record<string, unknown>),\n }\n : {};\n\n // Remove button-specific event handlers that don't apply to links\n if (href) {\n const {\n onPress: _onPress,\n onPressStart: _onPressStart,\n onPressEnd: _onPressEnd,\n onPressChange: _onPressChange,\n onPressUp: _onPressUp,\n onAuxClick: _onAuxClick,\n onContextMenu: _onContextMenu,\n onDoubleClick: _onDoubleClick,\n ...safeRestProps\n } = restProps as Record<string, unknown>;\n Object.assign(linkProps, safeRestProps);\n }\n\n // Compose the button or link element\n const buttonOrLink = href ? (\n <RACLink\n {...linkProps}\n {...(isLoading && { \"aria-busy\": true })}\n style={hasBadge ? undefined : style}\n className={composedClassName}\n >\n {isLoading\n ? loadingNode\n : typeof children === \"function\"\n ? (function (renderProps: LinkRenderProps & { defaultChildren: ReactNode }) {\n return (\n <>\n {iconPosition === \"left\" && iconElement}\n {children(\n renderProps as unknown as ButtonRenderProps & { defaultChildren: ReactNode }\n )}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n } as (props: LinkRenderProps & { defaultChildren: ReactNode }) => ReactNode)\n : content}\n </RACLink>\n ) : (\n <RACButton\n {...restProps}\n {...(isLoading && { \"aria-busy\": true })}\n style={hasBadge ? undefined : style}\n className={composedClassName}\n >\n {isLoading\n ? loadingNode\n : typeof children === \"function\"\n ? (function (renderProps: ButtonRenderProps & { defaultChildren: ReactNode }) {\n return (\n <>\n {iconPosition === \"left\" && iconElement}\n {children(renderProps)}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n } as (props: ButtonRenderProps & { defaultChildren: ReactNode }) => ReactNode)\n : content}\n </RACButton>\n );\n\n // Render badge if badgeNumber is provided and > 0\n if (hasBadge) {\n return (\n <div className={twMerge(\"relative flex\", className)} style={style}>\n {buttonOrLink}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs font-medium`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return buttonOrLink;\n}\n","import React from \"react\";\nimport { Button } from \"../Button\";\nimport type { DialogAction } from \"../Dialog/types\";\n\nexport interface DialogFooterProps {\n /**\n * Primary action button configuration\n */\n primaryAction?: DialogAction;\n /**\n * Secondary action button configuration\n */\n secondaryAction?: DialogAction;\n /**\n * Tertiary action button configuration (typically left-aligned destructive action)\n */\n tertiaryAction?: DialogAction;\n /**\n * Custom footer content above the action buttons\n */\n footerContent?: React.ReactNode;\n}\n\n/**\n * DialogFooter\n *\n * Shared footer component for Dialog and Drawer.\n * Renders action buttons with consistent styling.\n */\nexport function DialogFooter({\n primaryAction,\n secondaryAction,\n tertiaryAction,\n footerContent,\n}: DialogFooterProps) {\n const hasActions = primaryAction || secondaryAction || tertiaryAction;\n\n if (!hasActions && !footerContent) {\n return null;\n }\n\n return (\n <div className=\"flex h-28 w-full flex-col items-center justify-center border-t p-4\">\n {footerContent && <div className=\"flex h-10 justify-center\">{footerContent}</div>}\n {hasActions && (\n <div className=\"flex h-full w-full items-center justify-between gap-3\">\n {/* Left-aligned tertiary action (typically destructive) */}\n <div>\n {tertiaryAction && (\n <Button\n size={tertiaryAction.size || \"lg\"}\n variant={tertiaryAction.variant || \"destructive\"}\n onPress={tertiaryAction.onPress}\n isLoading={tertiaryAction.isLoading}\n isDisabled={tertiaryAction.isDisabled}\n >\n {tertiaryAction.label}\n </Button>\n )}\n </div>\n\n {/* Right-aligned primary and secondary actions */}\n <div className=\"flex items-center gap-3\">\n {secondaryAction && (\n <Button\n size={secondaryAction.size || \"lg\"}\n variant={secondaryAction.variant || \"secondary\"}\n onPress={secondaryAction.onPress}\n isLoading={secondaryAction.isLoading}\n isDisabled={secondaryAction.isDisabled}\n >\n {secondaryAction.label}\n </Button>\n )}\n {primaryAction && (\n <Button\n size={primaryAction.size || \"lg\"}\n variant={primaryAction.variant || \"default\"}\n onPress={primaryAction.onPress}\n isLoading={primaryAction.isLoading}\n isDisabled={primaryAction.isDisabled}\n >\n {primaryAction.label}\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst sizeVariants = {\n xs: \"text-lg font-semibold\",\n sm: \"text-xl font-semibold\",\n md: \"text-2xl font-semibold\",\n lg: \"text-3xl font-semibold\",\n xl: \"text-4xl font-semibold\",\n} as const;\n\nconst heightVariants = {\n page: \"h-16 leading-[62px]\",\n} as const;\n\nexport type HeadingSize = keyof typeof sizeVariants;\nexport type HeadingHeight = keyof typeof heightVariants;\n\n/**\n * Heading\n *\n * Typography component for page/section headings with size and height options.\n */\nexport interface HeadingProps {\n tag?: React.ElementType;\n size?: HeadingSize;\n height?: HeadingHeight;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function Heading({\n tag: Tag = \"h1\",\n size = \"lg\",\n height,\n className = \"\",\n children,\n}: HeadingProps) {\n const sizeClasses = sizeVariants[size];\n const heightClasses = height ? heightVariants[height] : \"\";\n\n return <Tag className={twMerge(sizeClasses, heightClasses, className)}>{children}</Tag>;\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Heading } from \"../Heading\";\nimport { Icon } from \"../Icon\";\n\ntype BaseDialogHeaderProps = {\n title?: string;\n onClose?: () => void;\n hideCloseIcon?: boolean;\n titleAlign?: \"left\" | \"center\";\n headerContent?: React.ReactNode;\n};\n\ntype WithBackArrow = BaseDialogHeaderProps & {\n hasBackArrow: true;\n onBack: () => void;\n};\n\ntype WithoutBackArrow = BaseDialogHeaderProps & {\n hasBackArrow?: false;\n onBack?: never;\n};\n\n/**\n * DialogHeader\n *\n * Header area for dialogs with optional back arrow.\n */\nexport type DialogHeaderProps = WithBackArrow | WithoutBackArrow;\n\nexport const DialogHeader: React.FC<DialogHeaderProps> = ({\n title,\n onClose,\n hideCloseIcon = false,\n titleAlign = \"left\",\n hasBackArrow = false,\n onBack,\n headerContent,\n}) => {\n return (\n <div\n className={twMerge(\n \"relative flex h-16 w-full flex-shrink-0 items-center justify-between border-b px-6\",\n title && \"border-b\",\n titleAlign === \"center\" ? \"justify-center\" : \"\"\n )}\n >\n {hasBackArrow && (\n <Button variant=\"icon\" onPress={onBack} className=\"absolute left-6\" aria-label=\"Go back\">\n <Icon name=\"CaretLeft\" data-testid=\"back-arrow\" />\n </Button>\n )}\n {headerContent || (\n <>\n {title && <Heading size=\"xs\">{title}</Heading>}\n {onClose && !hideCloseIcon && (\n <Button variant=\"icon\" onPress={onClose} aria-label=\"Close dialog\">\n <Icon name=\"X\" data-testid=\"close-button\" />\n </Button>\n )}\n </>\n )}\n </div>\n );\n};\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ninterface SkeletonProps {\n width?: number | string;\n height?: number | string;\n variant?: \"text\" | \"rect\" | \"circle\";\n animation?: \"pulse\" | \"wave\" | \"none\";\n gradient?: boolean;\n flex?: boolean;\n stack?: (number | string)[]; // Array of widths for stacked skeletons\n responsive?: Record<string, string | number>;\n delay?: number;\n adjustAnimationSpeedBasedOnWidth?: boolean;\n ariaLabel?: string;\n className?: string;\n \"data-testid\"?: string;\n}\n\n/**\n * Skeleton\n *\n * Loading placeholder component that mimics content structure.\n * Supports various shapes, animations, and responsive configurations for skeleton screens.\n */\nexport const Skeleton: React.FC<SkeletonProps> = ({\n width,\n height,\n variant = \"rect\",\n animation = \"pulse\",\n gradient = false,\n flex = false,\n stack,\n responsive,\n delay = 0,\n adjustAnimationSpeedBasedOnWidth = false,\n ariaLabel,\n className,\n \"data-testid\": dataTestId,\n}) => {\n const [visible, setVisible] = useState(delay === 0);\n\n useEffect(() => {\n if (delay > 0) {\n const timer = setTimeout(() => setVisible(true), delay);\n return () => clearTimeout(timer);\n }\n }, [delay]);\n\n if (!visible) return null;\n\n // Base styles\n const baseClasses = gradient\n ? \"bg-gradient-to-r from-[var(--color-skeleton-base)] via-[var(--color-skeleton-highlight)] to-[var(--color-skeleton-base)]\"\n : \"bg-[var(--color-skeleton-base)]\";\n\n // Adjust animation speed dynamically based on width\n const animationSpeed =\n adjustAnimationSpeedBasedOnWidth && width\n ? (() => {\n const numWidth = typeof width === \"number\" ? width : parseFloat(String(width));\n return !isNaN(numWidth) ? `animation-duration-[${Math.max(0.8, numWidth / 100)}s]` : \"\";\n })()\n : \"\";\n\n // Animation styles\n const animationClasses =\n animation === \"pulse\"\n ? `animate-pulse ${animationSpeed}`\n : animation === \"wave\"\n ? `relative overflow-hidden before:absolute before:inset-0 before:bg-gradient-to-r before:from-transparent before:via-[var(--color-skeleton-wave)] before:to-transparent before:animate-wave ${animationSpeed}`\n : \"\";\n\n // Shape-specific styles\n let shapeClasses = \"rounded-sm\";\n if (variant === \"circle\") shapeClasses = \"rounded-full\";\n if (variant === \"text\") shapeClasses = \"h-4 w-full rounded-sm\";\n\n // Dynamic layout handling\n const layoutClasses = flex ? \"flex-1 min-w-0\" : \"\";\n\n // Responsive styles\n const responsiveStyles = responsive\n ? Object.entries(responsive)\n .map(([breakpoint, value]) => `${breakpoint}:w-[${value}]`)\n .join(\" \")\n : \"\";\n\n // Stacking Multiple Skeletons\n if (stack) {\n return (\n <div className=\"space-y-2\" data-testid={dataTestId}>\n {stack.map((lineWidth, index) => (\n <div\n key={index}\n className={twMerge(\n baseClasses,\n animationClasses,\n shapeClasses,\n layoutClasses,\n responsiveStyles,\n className\n )}\n style={{\n width: lineWidth,\n height,\n }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={twMerge(\n baseClasses,\n animationClasses,\n shapeClasses,\n layoutClasses,\n responsiveStyles,\n className\n )}\n style={{\n width,\n height,\n }}\n role=\"presentation\"\n aria-hidden={!ariaLabel}\n aria-label={ariaLabel ?? undefined}\n data-testid={dataTestId}\n />\n );\n};\n\ninterface SkeletonGroupProps {\n count?: number;\n children: React.ReactNode;\n className?: string;\n \"data-testid\"?: string;\n}\n\nexport const SkeletonGroup: React.FC<SkeletonGroupProps> = ({\n count = 1,\n children,\n className,\n \"data-testid\": dataTestId,\n}) => {\n return (\n <div className={className} data-testid={dataTestId}>\n {Array.from({ length: count }).map((_, index) => (\n <div key={index}>{children}</div>\n ))}\n </div>\n );\n};\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\nimport { Skeleton } from \"../Skeleton\";\n\n/**\n * Card - Enterprise surface container component\n *\n * A flexible, composable card component following enterprise design system best practices.\n * Supports modular content sections with consistent styling and accessibility.\n *\n * Usage:\n * ```tsx\n * <Card variant=\"outlined\" size=\"md\">\n * <Card.Header\n * title=\"Card Title\"\n * subtitle=\"Optional subtitle\"\n * actions={<Button variant=\"ghost\" icon=\"MoreHorizontal\" />}\n * />\n * <Card.Media src=\"image.jpg\" alt=\"Description\" />\n * <Card.Content>\n * <p>Main content goes here</p>\n * </Card.Content>\n * <Card.Footer>\n * <Button variant=\"brand\">Action</Button>\n * </Card.Footer>\n * </Card>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type CardVariant = \"outlined\" | \"elevated\" | \"filled\" | \"ghost\";\nexport interface CardProps {\n variant?: CardVariant;\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardHeaderProps {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n isLoading?: boolean;\n}\n\nexport interface CardMediaProps {\n src?: string;\n alt?: string;\n aspectRatio?: \"square\" | \"video\" | \"wide\" | \"auto\";\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardContentProps {\n className?: string;\n children?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport interface CardFooterProps {\n className?: string;\n children?: React.ReactNode;\n align?: \"start\" | \"end\" | \"center\" | \"between\";\n isLoading?: boolean;\n}\n\n// ——————————————————————————————————————————\n// Styles\n// ——————————————————————————————————————————\n\nconst cardVariantStyles: Record<CardVariant, string> = {\n outlined: \"bg-background-surface border border-border-default\",\n elevated: \"bg-background-surface border-0 shadow-md\",\n filled: \"bg-background-muted border-0\",\n ghost: \"bg-transparent border-0 shadow-none\",\n};\n\nconst cardBaseStyles = \"rounded-lg\";\n\nconst aspectRatioStyles = {\n square: \"aspect-square\",\n video: \"aspect-video\",\n wide: \"aspect-[2/1]\",\n auto: \"\",\n};\n\nconst footerAlignStyles = {\n start: \"justify-start\",\n end: \"justify-end\",\n center: \"justify-center\",\n between: \"justify-between\",\n};\n\n// ——————————————————————————————————————————\n// Main Card Component\n// ——————————————————————————————————————————\n\nexport function Card({ variant = \"outlined\", className, children, isLoading = false }: CardProps) {\n return (\n <div\n className={twMerge(\"w-full overflow-hidden\", cardVariantStyles[variant], cardBaseStyles, className)}\n data-testid=\"card\"\n >\n {isLoading ? (\n // Skeleton fills the card completely - respects height set on card\n <Skeleton width=\"100%\" height=\"100%\" className=\"rounded-none\" />\n ) : (\n children\n )}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Header\n// ——————————————————————————————————————————\n\nexport function CardHeader({ title, subtitle, actions, className, isLoading = false }: CardHeaderProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"p-6 pb-4\", className)}>\n <div className=\"flex justify-between items-start mb-1\">\n <Skeleton width={120} height={20} />\n <Skeleton width={24} height={24} />\n </div>\n {subtitle && <Skeleton width={200} height={16} />}\n </div>\n );\n }\n\n if (!title && !subtitle && !actions) {\n return null;\n }\n\n return (\n <div className={twMerge(\"p-6 pb-4\", className)}>\n <div className=\"flex justify-between items-start gap-4\">\n <div className=\"min-w-0 flex-1\">\n {title && (\n <div className=\"mb-1\">\n {typeof title === \"string\" ? (\n <Heading tag=\"h3\" size=\"sm\" className=\"text-text-heading\">\n {title}\n </Heading>\n ) : (\n title\n )}\n </div>\n )}\n {subtitle && <div className=\"text-sm text-text-muted\">{subtitle}</div>}\n </div>\n {actions && <div className=\"flex-shrink-0\">{actions}</div>}\n </div>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Media\n// ——————————————————————————————————————————\n\nexport function CardMedia({ src, alt, aspectRatio = \"auto\", className, children, isLoading = false }: CardMediaProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"bg-background-muted\", aspectRatioStyles[aspectRatio], className)}>\n <Skeleton width=\"100%\" height=\"100%\" />\n </div>\n );\n }\n\n if (children) {\n return <div className={twMerge(\"overflow-hidden\", aspectRatioStyles[aspectRatio], className)}>{children}</div>;\n }\n\n if (!src) {\n return null;\n }\n\n return (\n <div className={twMerge(\"overflow-hidden\", aspectRatioStyles[aspectRatio], className)}>\n <img src={src} alt={alt || \"\"} className=\"w-full h-full object-cover\" loading=\"lazy\" />\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Card Content\n// ——————————————————————————————————————————\n\nexport function CardContent({ className, children, isLoading = false }: CardContentProps) {\n // Extract padding classes from className - if any padding class is set, respect it\n const hasPadding = className?.match(/p(?:t|b|l|r|x|y)?-(?:\\d+(?:\\.\\d+)?|px|\\[.+?\\])/);\n const defaultPadding = hasPadding ? \"\" : \"px-6 py-4\";\n\n if (isLoading) {\n return (\n <div className={twMerge(defaultPadding, className)}>\n <div className=\"space-y-2\">\n <Skeleton width=\"100%\" height={16} />\n <Skeleton width=\"80%\" height={16} />\n <Skeleton width=\"60%\" height={16} />\n </div>\n </div>\n );\n }\n\n if (!children) {\n return null;\n }\n\n return <div className={twMerge(\"px-6 py-4 text-text-body\", className)}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Card Footer\n// ——————————————————————————————————————————\n\nexport function CardFooter({ className, children, align = \"end\", isLoading = false }: CardFooterProps) {\n if (isLoading) {\n return (\n <div className={twMerge(\"px-6 py-4 flex gap-2 justify-end\", className)}>\n <Skeleton width={80} height={32} />\n <Skeleton width={60} height={32} />\n </div>\n );\n }\n\n if (!children) {\n return null;\n }\n\n return (\n <div className={twMerge(\"px-6 py-4 flex items-center gap-2\", footerAlignStyles[align], className)}>{children}</div>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound Component API\n// ——————————————————————————————————————————\n\nCard.Header = CardHeader;\nCard.Media = CardMedia;\nCard.Content = CardContent;\nCard.Footer = CardFooter;\n","import { Component, ErrorInfo, ReactNode } from \"react\";\nimport { Card } from \"../Card\";\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n title?: string;\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n}\n\n/**\n * ErrorBoundary\n *\n * React error boundary component for graceful error handling.\n * Catches JavaScript errors in child components and displays a fallback UI with retry option.\n */\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Error Boundary caught an error:\", error, errorInfo);\n }\n\n private handleRetry = () => {\n this.setState({ hasError: false, error: undefined });\n if (typeof window !== \"undefined\") {\n window.location.reload();\n }\n };\n\n public render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <Card>\n {this.props.title && <Card.Header title={this.props.title} />}\n <Card.Content>\n <div\n className=\"flex flex-col items-center justify-center gap-4\"\n data-testid=\"error-boundary\"\n >\n <p className=\"text-red-500\">{this.state.error?.message || \"Something went wrong\"}</p>\n <button\n className=\"rounded bg-blue-500 px-4 py-2 text-white hover:bg-blue-600\"\n onClick={this.handleRetry}\n >\n Retry\n </button>\n </div>\n </Card.Content>\n </Card>\n );\n }\n\n return this.props.children;\n }\n}\n","import { composeRenderProps, ModalOverlay, ModalOverlayProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface ModalBackdropProps extends ModalOverlayProps {\n /**\n * Whether to use a transparent backdrop instead of dark overlay\n * @default false\n */\n transparent?: boolean;\n /**\n * Additional CSS classes for the backdrop\n */\n className?: string;\n}\n\n/**\n * ModalBackdrop\n *\n * Shared backdrop/overlay component used by Dialog and Drawer.\n * Wraps React Aria's ModalOverlay with consistent styling and smooth animations.\n */\nexport function ModalBackdrop({\n transparent = false,\n className,\n children,\n ...props\n}: ModalBackdropProps) {\n return (\n <ModalOverlay\n {...props}\n className={composeRenderProps(className, (className, renderProps) => {\n return twMerge(\n // Base positioning and layering\n \"fixed inset-0 z-50\",\n // Remove focus outlines from modal overlay\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0\",\n // Backdrop styling - subtle gradient for depth\n transparent\n ? \"bg-transparent\"\n : [\n \"bg-gradient-to-br from-black/20 via-black/15 to-black/20\",\n \"backdrop-blur-[2px]\",\n \"supports-[backdrop-filter]:bg-black/15\",\n ].join(\" \"),\n // Smooth animations\n renderProps.isEntering && [\"animate-in fade-in\", \"duration-300 ease-out\"].join(\" \"),\n renderProps.isExiting && [\"animate-out fade-out\", \"duration-200 ease-in\"].join(\" \"),\n className\n );\n })}\n >\n {children}\n </ModalOverlay>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"../Dialog/types\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\n\nconst SWIPE_DISMISS_THRESHOLD = 0.3;\nconst SWIPE_VELOCITY_THRESHOLD = 0.5;\n\nexport interface TrayProps extends DialogHeaderConfig, DialogFooterConfig {\n /**\n * Tray content\n */\n children?: React.ReactNode;\n /**\n * Controls whether the tray is visible\n */\n isOpen: boolean;\n /**\n * Called when the tray should close\n */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop should dismiss the tray\n * @default true\n */\n isDismissable?: boolean;\n /**\n * Whether to use a transparent overlay behind the tray\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Maximum height for the tray content area\n * @default \"80vh\"\n */\n maxHeight?: string;\n /**\n * Explicit height for the tray (overrides maxHeight if set)\n * Content will scroll within this fixed height\n * @default undefined\n */\n height?: string;\n /**\n * Maximum width of the tray\n * @default \"640px\"\n */\n maxWidth?: string;\n /**\n * Whether to include padding around tray content\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Whether to show the drag handle indicator on mobile\n * @default true\n */\n showHandle?: boolean;\n /**\n * Animation variant for the tray entrance/exit\n * @default \"scale\" - Slide with subtle scale effect for depth\n * \"slide\" - Simple slide up/down\n */\n animationVariant?: \"slide\" | \"scale\";\n /**\n * Additional CSS classes for the tray container\n */\n className?: string;\n}\n\n/**\n * Tray\n *\n * Bottom anchored overlay optimized for mobile experiences.\n * Provides optional header/footer slots that align with Dialog & Drawer APIs.\n */\nexport function Tray({\n children,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n isOpen,\n onClose,\n isDismissable = true,\n transparentOverlay = false,\n primaryAction,\n secondaryAction,\n footerContent,\n maxHeight = \"80vh\",\n height,\n maxWidth = \"640px\",\n contentPadding = true,\n showHandle = true,\n animationVariant = \"scale\",\n className,\n}: TrayProps) {\n const [isHandleAnimating, setIsHandleAnimating] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const transitionTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragStateRef = useRef<{\n isDragging: boolean;\n startY: number;\n startTime: number;\n pointerId: number | null;\n }>({\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n });\n\n // Trigger a subtle handle animation when tray opens\n useEffect(() => {\n if (isOpen) {\n const timer = setTimeout(() => {\n setIsHandleAnimating(true);\n setTimeout(() => setIsHandleAnimating(false), 600);\n }, 400);\n return () => clearTimeout(timer);\n }\n }, [isOpen]);\n\n // Reset drag state when tray closes\n useEffect(() => {\n if (!isOpen) {\n setDragOffset(0);\n setIsTransitioning(false);\n dragStateRef.current = {\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n };\n }\n }, [isOpen]);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (!isDismissable) return;\n if (e.pointerType !== \"touch\" && e.pointerType !== \"pen\") return;\n\n // Clear any pending transition timeout from previous gesture\n if (transitionTimeoutRef.current) {\n clearTimeout(transitionTimeoutRef.current);\n transitionTimeoutRef.current = null;\n }\n\n dragStateRef.current = {\n isDragging: true,\n startY: e.clientY,\n startTime: Date.now(),\n pointerId: e.pointerId,\n };\n setIsTransitioning(false);\n e.currentTarget.setPointerCapture(e.pointerId);\n },\n [isDismissable]\n );\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const { isDragging, startY, pointerId } = dragStateRef.current;\n if (!isDragging || e.pointerId !== pointerId) return;\n\n const deltaY = e.clientY - startY;\n setDragOffset(Math.max(0, deltaY));\n }, []);\n\n const handlePointerEnd = useCallback(\n (e: React.PointerEvent) => {\n const { isDragging, startY, startTime, pointerId } = dragStateRef.current;\n if (!isDragging || e.pointerId !== pointerId) return;\n\n const deltaY = e.clientY - startY;\n const elapsed = Date.now() - startTime;\n const velocity = deltaY / elapsed;\n\n dragStateRef.current = {\n isDragging: false,\n startY: 0,\n startTime: 0,\n pointerId: null,\n };\n\n const containerHeight = containerRef.current?.getBoundingClientRect().height ?? 0;\n const threshold = containerHeight * SWIPE_DISMISS_THRESHOLD;\n const shouldDismiss =\n deltaY > threshold || (velocity > SWIPE_VELOCITY_THRESHOLD && deltaY > 50);\n\n if (shouldDismiss && isDismissable) {\n onClose?.();\n setDragOffset(0);\n } else {\n setIsTransitioning(true);\n setDragOffset(0);\n transitionTimeoutRef.current = setTimeout(() => {\n setIsTransitioning(false);\n transitionTimeoutRef.current = null;\n }, 200);\n }\n },\n [isDismissable, onClose]\n );\n\n if (!isOpen) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose?.();\n }}\n isDismissable={isDismissable}\n transparent={transparentOverlay}\n className=\"flex items-end justify-center p-0 sm:p-4\"\n >\n <Modal\n className=\"w-full max-w-full p-0 sm:p-2 outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0\"\n isDismissable={isDismissable}\n >\n <div\n ref={containerRef}\n className={twMerge(\"w-full\", isTransitioning && \"transition-transform duration-200\")}\n style={{\n transform: dragOffset > 0 ? `translateY(${dragOffset}px)` : undefined,\n }}\n >\n <RACDialog\n className={twMerge(\n // Base structure\n \"relative flex w-full flex-col overflow-hidden\",\n // Background and borders with elevation\n \"bg-background-surface\",\n \"shadow-2xl shadow-black/30 dark:shadow-black/60\",\n \"border-t border-x border-border-default/40\",\n // Suppress browser focus outline/rings on the dialog container itself\n // This is safe: React Aria manages focus on interactive elements inside the dialog.\n // The container doesn't need a focus indicator as it's not directly interactive.\n \"outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0 focus:shadow-none\",\n // Transform origin for scale animation\n \"origin-bottom\",\n // Entrance animations using combined keyframes with enterprise-grade timing\n animationVariant === \"scale\"\n ? \"animate-[tray-enter-scale_400ms_cubic-bezier(0.32,0.72,0,1)]\"\n : \"animate-[tray-enter_400ms_cubic-bezier(0.32,0.72,0,1)]\",\n // Exit animations using data-[exiting] state - snappier for responsiveness\n animationVariant === \"scale\"\n ? \"data-[exiting]:animate-[tray-exit-scale_250ms_cubic-bezier(0.32,0,0.67,0)]\"\n : \"data-[exiting]:animate-[tray-exit_250ms_cubic-bezier(0.32,0,0.67,0)]\",\n className\n )}\n style={{\n maxWidth,\n ...(height ? { height } : { maxHeight }),\n }}\n >\n {showHandle && (\n <div\n className=\"absolute top-0 left-0 right-0 h-8 z-10 flex justify-center items-start pt-2 touch-none cursor-grab active:cursor-grabbing\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerEnd}\n onPointerCancel={handlePointerEnd}\n >\n <div\n className={twMerge(\n \"h-1 w-12 rounded-full bg-border-muted transition-all duration-300\",\n \"hover:bg-border-default hover:w-16\",\n isHandleAnimating && \"animate-[handle-wiggle_0.6s_ease-in-out]\"\n )}\n />\n </div>\n )}\n {hasHeader &&\n (hasBackArrow ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n hasBackArrow={true}\n onBack={\n onBack ??\n (() => {\n /* no-op */\n })\n }\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon || !onClose}\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 min-h-0 overflow-y-auto overscroll-contain\",\n contentPadding ? \"p-4\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </div>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\nTray.displayName = \"Tray\";\n\n// Export types\nexport type { DialogAction } from \"../Dialog/types\";\n","import { FormProps, Form as RACForm } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Form\n *\n * Accessibility-first form wrapper with consistent spacing.\n * Defaults to ARIA validation to use custom error styling instead of native browser tooltips.\n */\nexport function Form(props: FormProps) {\n return (\n <RACForm\n validationBehavior=\"aria\"\n {...props}\n className={twMerge(\"flex flex-col gap-6\", props.className)}\n />\n );\n}\n","import * as React from \"react\";\nimport { Dialog, type DialogProps } from \"@/components/Dialog\";\nimport { Form } from \"@/components/Form\";\n\nexport interface DialogFormProps extends Omit<DialogProps, \"children\" | \"footerContent\"> {\n formId?: string;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n primaryLabel?: string;\n secondaryLabel?: string;\n onCancel?: () => void;\n primaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n secondaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n children?: React.ReactNode;\n}\n\nexport function DialogForm({\n formId = \"dialog-form\",\n onSubmit,\n primaryLabel = \"Save\",\n secondaryLabel = \"Cancel\",\n onCancel,\n primaryVariant,\n secondaryVariant = \"secondary\",\n children,\n title,\n ...dialogProps\n}: DialogFormProps) {\n const handleFormSubmit = () => {\n // The form element itself will handle the submit event\n const form = document.getElementById(formId) as HTMLFormElement;\n if (form) {\n form.requestSubmit();\n }\n };\n\n return (\n <Dialog\n title={title}\n primaryAction={{\n label: primaryLabel,\n onPress: handleFormSubmit,\n variant: primaryVariant,\n }}\n secondaryAction={\n onCancel\n ? {\n label: secondaryLabel,\n onPress: onCancel,\n variant: secondaryVariant,\n }\n : undefined\n }\n {...dialogProps}\n >\n <Form id={formId} onSubmit={onSubmit}>\n {children}\n </Form>\n </Dialog>\n );\n}\n","import type React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { Modal, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DialogFooterConfig, DialogHeaderConfig } from \"../Dialog/types\";\nimport { DialogFooter } from \"../DialogFooter\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\nimport { ModalBackdrop } from \"../ModalBackdrop\";\n\nexport interface DrawerProps extends DialogHeaderConfig, DialogFooterConfig {\n /**\n * Drawer content\n */\n children?: React.ReactNode;\n /**\n * Whether the drawer is open\n */\n isOpen: boolean;\n /**\n * Side to slide in from\n * @default \"right\"\n */\n slideInFrom?: \"left\" | \"right\";\n /**\n * Whether to use a transparent backdrop\n * @default false\n */\n transparentOverlay?: boolean;\n /**\n * Callback when the drawer is closed\n */\n onClose?: () => void;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Whether to include padding inside the content area\n * @default true\n */\n contentPadding?: boolean;\n /**\n * Maximum width of the drawer\n * @default \"400px\"\n */\n maxWidth?: string;\n}\n\n/**\n * Drawer\n *\n * Sliding panel that anchors to screen edges.\n */\nexport function Drawer({\n children,\n title,\n headerContent,\n titleAlign = \"left\",\n hideCloseIcon = false,\n hasBackArrow = false,\n onBack,\n isOpen,\n slideInFrom = \"right\",\n transparentOverlay = false,\n onClose,\n className,\n primaryAction,\n secondaryAction,\n footerContent,\n contentPadding = true,\n maxWidth = \"400px\",\n}: DrawerProps) {\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (isOpen) {\n // Small delay to ensure the element is positioned before animation starts\n const timer = setTimeout(() => setIsAnimating(true), 10);\n return () => clearTimeout(timer);\n }\n setIsAnimating(false);\n return undefined;\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const hasHeader = title || headerContent;\n const hasFooter = primaryAction || secondaryAction || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalBackdrop\n isOpen={isOpen}\n onOpenChange={(open) => !open && onClose?.()}\n isDismissable\n transparent={transparentOverlay}\n >\n <Modal\n className=\"flex justify-end outline-none focus:outline-none focus-visible:outline-none ring-0 focus:ring-0 focus-visible:ring-0\"\n isDismissable\n >\n <RACDialog\n className={twMerge(\n \"fixed bottom-0 top-0 z-50 flex w-full flex-col bg-background-surface shadow-xl duration-300 h-full min-h-0 overflow-hidden dark:bg-gray-800\",\n \"outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-action-default focus-visible:outline-offset-0\",\n isAnimating\n ? slideInFrom === \"right\"\n ? \"animate-in slide-in-from-right\"\n : \"animate-in slide-in-from-left\"\n : \"\",\n className\n )}\n style={{\n // Explicit positioning\n [slideInFrom === \"right\" ? \"right\" : \"left\"]: 0,\n // Dynamic max width\n maxWidth: maxWidth,\n // Initial transform to position off-screen\n transform: !isAnimating\n ? slideInFrom === \"right\"\n ? \"translateX(100%)\"\n : \"translateX(-100%)\"\n : undefined,\n }}\n >\n {hasHeader &&\n (hasBackArrow && onBack ? (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n hasBackArrow={true}\n onBack={onBack}\n onClose={onClose}\n />\n ) : (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n titleAlign={titleAlign}\n hideCloseIcon={hideCloseIcon}\n onClose={onClose}\n />\n ))}\n <div\n className={twMerge(\n \"flex-1 overflow-y-auto overscroll-contain\",\n contentPadding ? \"px-6 py-6\" : \"p-0\"\n )}\n >\n {children}\n </div>\n {hasFooter && (\n <DialogFooter\n primaryAction={primaryAction}\n secondaryAction={secondaryAction}\n footerContent={footerContent}\n />\n )}\n </RACDialog>\n </Modal>\n </ModalBackdrop>\n </ErrorBoundary>\n );\n}\n\nDrawer.displayName = \"Drawer\";\n\n// Export types\nexport type { DialogAction } from \"../Dialog/types\";\n","import * as React from \"react\";\nimport { Drawer, type DrawerProps } from \"@/components/Drawer\";\nimport { Form } from \"@/components/Form\";\n\nexport interface DrawerFormProps extends Omit<DrawerProps, \"children\" | \"footerContent\"> {\n formId?: string;\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n primaryLabel?: string;\n secondaryLabel?: string;\n onCancel?: () => void;\n primaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n secondaryVariant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n children?: React.ReactNode;\n}\n\nexport function DrawerForm({\n formId = \"drawer-form\",\n onSubmit,\n primaryLabel = \"Save\",\n secondaryLabel = \"Cancel\",\n onCancel,\n primaryVariant,\n secondaryVariant = \"secondary\",\n children,\n ...drawerProps\n}: DrawerFormProps) {\n const handleFormSubmit = () => {\n const form = document.getElementById(formId) as HTMLFormElement;\n if (form) {\n form.requestSubmit();\n }\n };\n\n return (\n <Drawer\n primaryAction={{\n label: primaryLabel,\n onPress: handleFormSubmit,\n variant: primaryVariant,\n }}\n secondaryAction={\n onCancel\n ? {\n label: secondaryLabel,\n onPress: onCancel,\n variant: secondaryVariant,\n }\n : undefined\n }\n {...drawerProps}\n >\n <Form id={formId} onSubmit={onSubmit} className=\"mt-2\">\n {children}\n </Form>\n </Drawer>\n );\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface FormActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"start\" | \"end\" | \"between\";\n}\n\nexport function FormActions({ align = \"end\", className, ...rest }: FormActionsProps) {\n const justify =\n align === \"start\" ? \"justify-start\" : align === \"between\" ? \"justify-between\" : \"justify-end\";\n return <div {...rest} className={twMerge(\"flex gap-2\", justify, className)} />;\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface FormGridProps extends React.HTMLAttributes<HTMLDivElement> {\n cols?: { base?: 1 | 2 | 3 | 4; md?: 1 | 2 | 3 | 4; lg?: 1 | 2 | 3 | 4 };\n gap?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst gapClass = {\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n} as const;\n\nfunction colsToClass(cols?: FormGridProps[\"cols\"]) {\n if (!cols) return \"\";\n const base = cols.base ? `grid-cols-${cols.base}` : \"\";\n const md = cols.md ? `md:grid-cols-${cols.md}` : \"\";\n const lg = cols.lg ? `lg:grid-cols-${cols.lg}` : \"\";\n return [base, md, lg].filter(Boolean).join(\" \");\n}\n\nexport function FormGrid({ cols = { base: 1 }, gap = \"lg\", className, ...rest }: FormGridProps) {\n return <div {...rest} className={twMerge(\"grid\", colsToClass(cols), gapClass[gap], className)} />;\n}\n","\"use client\";\n/**\n * Field Component System\n *\n * A comprehensive system for building form fields and input components with consistent\n * styling, accessibility, and behavior. This module provides both base components and\n * styling utilities that can be composed to create complex form controls.\n *\n * Key Features:\n * - Consistent styling across all form elements\n * - Built-in state handling (invalid, disabled, focused)\n * - Accessibility support out of the box\n * - Flexible composition through style utilities\n *\n * @example Basic Usage\n * ```tsx\n * <Label htmlFor=\"name\">Name</Label>\n * <Input id=\"name\" size=\"md\" />\n * ```\n *\n * @example Complex Field with All Components\n * ```tsx\n * <div>\n * <Label htmlFor=\"email\" tooltip=\"Enter your work email\">Email</Label>\n * <Input\n * id=\"email\"\n * type=\"email\"\n * isInvalid={hasError}\n * isDisabled={isSubmitting}\n * />\n * <Description>We'll never share your email</Description>\n * {hasError && <FieldError>Please enter a valid email</FieldError>}\n * </div>\n * ```\n */\n\nimport React from \"react\";\nimport type { TextProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon/Icon\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\n\n// Base style props interface for all input-like components\nexport interface InputStyleProps {\n /** Whether the input is in an invalid state */\n isInvalid?: boolean;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input should have a transparent background */\n transparent?: boolean;\n /** The size variant of the input */\n size?: Size;\n /** Whether the input is currently focused */\n isFocused?: boolean;\n /** Additional CSS classes to apply */\n className?: string;\n}\n\n// Common interfaces\nexport interface BaseProps {\n /** The size variant of the component */\n size?: Size;\n /** Additional CSS classes to apply */\n className?: string;\n}\n\nexport type DescriptionPlacement = \"below\" | \"tooltip\" | \"inline\" | \"hidden\";\n\nexport interface BaseInputProps extends BaseProps {\n /** Whether the input should have a transparent background */\n transparent?: boolean;\n /** Whether to show a clear button when the input has a value */\n isClearable?: boolean;\n /** Callback when the clear button is clicked */\n onClear?: () => void;\n /** Whether to show a search icon */\n showSearchIcon?: boolean;\n /**\n * Whether to reserve space for error messages to prevent layout shift\n * @default true\n */\n reserveErrorSpace?: boolean;\n /**\n * Where to display the description text\n * - \"below\": Show below the field (default)\n * - \"tooltip\": Show as a tooltip on the label icon\n * - \"inline\": Show inline with the label\n * - \"hidden\": Don't display the description\n * @default \"below\"\n */\n descriptionPlacement?: DescriptionPlacement;\n}\n\nexport interface LabelProps extends BaseProps {\n /** The label content */\n children: React.ReactNode;\n /** Optional tooltip text to show next to the label */\n tooltip?: string;\n /** Optional description to show as tooltip or inline */\n description?: string;\n /** Where to display the description (only used if description is provided) */\n descriptionPlacement?: DescriptionPlacement;\n /** Whether to show a required field indicator (*) */\n isRequired?: boolean;\n /** The ID of the input this label is associated with */\n htmlFor?: string;\n}\n\nexport interface FieldErrorProps extends BaseProps {\n /** The error message to display */\n children: React.ReactNode;\n}\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n InputStyleProps {\n /** The size variant of the input */\n size?: Size;\n}\n\nexport interface DescriptionProps extends Omit<TextProps, \"className\">, BaseProps {\n /** The description content */\n children: React.ReactNode;\n}\n\nexport interface FieldGroupProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">,\n InputStyleProps {\n /** Whether any child of the group is focused */\n isFocusWithin?: boolean;\n /** Children can be either a ReactNode or a render function */\n children?: React.ReactNode | ((props: InputStyleProps) => React.ReactNode);\n}\n\n/**\n * Hook for managing input focus state\n */\nexport function useInputFocus() {\n const [isFocused, setIsFocused] = React.useState(false);\n\n const handleFocus = React.useCallback(\n (\n e: React.FocusEvent<HTMLInputElement>,\n onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void\n ) => {\n setIsFocused(true);\n onFocus?.(e);\n },\n []\n );\n\n const handleBlur = React.useCallback(\n (\n e: React.FocusEvent<HTMLInputElement>,\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void\n ) => {\n setIsFocused(false);\n onBlur?.(e);\n },\n []\n );\n\n return { isFocused, handleFocus, handleBlur };\n}\n\n/**\n * Wrapper component for input containers\n */\nexport function InputWrapper({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={twMerge(\"relative w-full\", className)}>{children}</div>;\n}\n\n/**\n * Clear button component for inputs\n */\nexport function ClearButton({\n onClick,\n size = \"md\",\n className,\n}: {\n onClick: () => void;\n size?: Size;\n className?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className={twMerge(\n \"absolute right-2 top-1/2 -translate-y-1/2 transform text-text-muted hover:text-text-body\",\n className\n )}\n aria-label=\"Clear input\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Icon name=\"X\" size={size === \"sm\" ? 16 : 20} />\n </button>\n );\n}\n\n/**\n * Generates state-specific styles for inputs based on their current state\n * (invalid, disabled, focused).\n *\n * State Priority:\n * 1. Disabled (overrides all other states)\n * 2. Invalid + Focused\n * 3. Invalid\n * 4. Focused\n * 5. Default\n *\n * @example\n * ```tsx\n * const styles = getInputStateStyles({ isInvalid: true, isFocused: true });\n * ```\n */\nexport function getInputStateStyles(props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n}) {\n const { isInvalid, isDisabled, isFocused } = props;\n const baseStyles = \"border rounded-[var(--control-border-radius)] !outline-none \";\n\n // Disabled state overrides all others\n if (isDisabled) {\n return `${baseStyles} border-border-muted`;\n }\n\n // Handle combinations of invalid and focus states\n if (isInvalid && isFocused) {\n return `${baseStyles} border-feedback-error-border shadow-[inset_0_0_0_1px_var(--color-feedback-error-border)]`;\n }\n\n if (isInvalid) {\n return `${baseStyles} border-feedback-error-border`;\n }\n\n if (isFocused) {\n return `${baseStyles} border-border-focus shadow-[inset_0_0_0_1px_var(--color-border-focus)]`;\n }\n\n // Default state - explicitly set border color\n return `${baseStyles} border-border-input`;\n}\n\n/**\n * Generates background styles based on the transparent and disabled props.\n * Uses Tailwind classes for consistent styling across light/dark modes.\n */\nexport function getInputBackgroundStyles(props: { transparent?: boolean; isDisabled?: boolean }) {\n if (props.isDisabled) {\n return \"bg-background-muted\";\n }\n return props.transparent ? \"bg-transparent\" : \"bg-background-input\";\n}\n\n/**\n * Returns the mobile font-size override class for input components.\n * iOS Safari zooms in on inputs with font-size < 16px when focused.\n * This ensures inputs use at least 16px on mobile to prevent auto-zoom,\n * while preserving the original size on desktop (768px+).\n *\n * Uses Tailwind responsive classes for proper handling by twMerge.\n */\nfunction getInputMobileFontClass(size: Size): string {\n // Only sm and md sizes need the override (they're < 16px)\n // lg and xl are already >= 16px\n // Use text-base (16px) on mobile, restore original size on md: breakpoint\n if (size === \"sm\") {\n return \"!text-base md:!text-[length:var(--control-text-sm)]\";\n }\n if (size === \"md\") {\n return \"!text-base md:!text-[length:var(--control-text-md)]\";\n }\n return \"\";\n}\n\n/**\n * Generates the complete set of base styles for input components.\n * This includes state styles, background, sizing, and custom classes.\n *\n * @example\n * ```tsx\n * const styles = getInputBaseStyles({\n * isInvalid: formState.hasError,\n * isDisabled: isLoading,\n * size: \"md\"\n * });\n * ```\n */\nexport function getInputBaseStyles(props: InputStyleProps) {\n const { isInvalid, isDisabled, isFocused, transparent, size = \"md\", className } = props;\n\n return twMerge(\n \"w-full\",\n getInputStateStyles({ isInvalid, isDisabled, isFocused }),\n getInputBackgroundStyles({ transparent, isDisabled }),\n controlStyles[size].text,\n controlStyles[size].height,\n controlStyles[size].padding,\n getInputMobileFontClass(size),\n className\n );\n}\n\n/**\n * Generates styles for grouped form elements (like input with buttons)\n *\n * @example\n * ```tsx\n * <div className={getFieldGroupStyles({ size: \"md\" })}>\n * <Input />\n * <Button>Submit</Button>\n * </div>\n * ```\n */\nexport function getFieldGroupStyles(props: FieldGroupProps) {\n const { size = \"md\", isFocusWithin, isInvalid, isDisabled, transparent, className } = props;\n\n return twMerge(\n \"group flex items-center rounded-[var(--control-border-radius)] overflow-hidden\",\n getInputBackgroundStyles({ transparent, isDisabled }),\n controlStyles[size].height,\n getInputStateStyles({ isFocused: isFocusWithin, isInvalid, isDisabled }),\n className\n );\n}\n\n// Components\n\n/**\n * Label component for form fields. Supports tooltips and required field indicators.\n *\n * @example\n * ```tsx\n * <Label\n * htmlFor=\"email\"\n * tooltip=\"Enter your work email\"\n * isRequired\n * >\n * Email Address\n * </Label>\n * ```\n */\nexport function Label({\n children,\n size = \"md\",\n tooltip,\n description,\n descriptionPlacement = \"below\",\n isRequired,\n className,\n htmlFor,\n}: LabelProps) {\n const showTooltip = tooltip || (description && descriptionPlacement === \"tooltip\");\n const tooltipContent = tooltip || description;\n const showInlineDescription = description && descriptionPlacement === \"inline\";\n\n const labelContent = (\n <label\n htmlFor={htmlFor}\n className={twMerge(\n controlStyles[size].text,\n \"!text-text-label font-semibold flex items-center gap-1\",\n className\n )}\n >\n {children}\n {isRequired && <span>*</span>}\n {showTooltip && (\n <span className=\"text-text-muted\">\n <Icon name=\"Info\" size={size === \"sm\" ? 16 : 20} />\n </span>\n )}\n {showInlineDescription && (\n <span className=\"text-text-caption font-normal ml-1\">{description}</span>\n )}\n </label>\n );\n\n if (showTooltip && tooltipContent) {\n return <Tooltip content={tooltipContent}>{labelContent}</Tooltip>;\n }\n\n return labelContent;\n}\n\n/**\n * Description component for providing additional context about a form field.\n *\n * @example\n * ```tsx\n * <Description>Must be at least 8 characters</Description>\n * ```\n */\nexport function Description({ size = \"md\", className, children, ...props }: DescriptionProps) {\n return (\n <div\n {...props}\n className={twMerge(\"leading-[2.25] text-text-caption\", controlStyles[size].text, className)}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Error message component for form fields. Automatically handles\n * accessibility attributes for screen readers.\n *\n * @example\n * ```tsx\n * {hasError && <FieldError>This field is required</FieldError>}\n * ```\n */\nexport function FieldError({ children, size = \"md\", className }: FieldErrorProps) {\n return (\n <div\n role=\"alert\"\n className={twMerge(controlStyles[size].text, \"text-feedback-error-text\", className)}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Base input component with consistent styling and state handling.\n * Extends the native input element with our custom styling system.\n *\n * @example\n * ```tsx\n * <Input\n * size=\"md\"\n * isInvalid={hasError}\n * isDisabled={isLoading}\n * transparent={false}\n * />\n * ```\n */\nexport function Input({\n size = \"md\",\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n className,\n ...props\n}: InputProps) {\n return (\n <input\n className={getInputBaseStyles({\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n size,\n className,\n })}\n {...props}\n />\n );\n}\n\n/**\n * Container for grouping form elements with consistent styling.\n * Useful for creating compound components like input with buttons.\n *\n * @example\n * ```tsx\n * <FieldGroup>\n * <Input placeholder=\"Search...\" />\n * <Button>Search</Button>\n * </FieldGroup>\n * ```\n */\nexport function FieldGroup(props: FieldGroupProps) {\n const { children, ...rest } = props;\n return (\n <div {...rest} className={getFieldGroupStyles(props)}>\n {typeof children === \"function\" ? children(props) : children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Description } from \"@/components/Field\";\nimport { Heading } from \"@/components/Heading\";\n\nexport interface FormSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: string | React.ReactNode;\n description?: string | React.ReactNode;\n showDivider?: boolean;\n}\n\nexport function FormSection({\n title,\n description,\n showDivider,\n className,\n children,\n ...rest\n}: FormSectionProps) {\n return (\n <section {...rest} className={twMerge(\"flex flex-col\", className)}>\n {(title || description) && (\n <div className=\"flex flex-col gap-1 mb-6\">\n {typeof title === \"string\" ? (\n <Heading tag=\"h3\" size=\"sm\">\n {title}\n </Heading>\n ) : (\n title\n )}\n {description ? <Description size=\"lg\">{description}</Description> : null}\n </div>\n )}\n <div className=\"flex flex-col gap-6\">{children}</div>\n {showDivider && <hr className=\"mt-2 border-border-muted\" />}\n </section>\n );\n}\n\nexport function FormDivider() {\n return <hr className=\"border-border-muted\" />;\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"@/components/Icon\";\n\nexport interface Step {\n id: string;\n title: string;\n description?: string;\n}\n\nexport interface FormStepperProps {\n steps: Step[];\n currentStepId: string;\n onStepClick?: (id: string) => void;\n className?: string;\n}\n\nexport function FormStepper({ steps, currentStepId, onStepClick, className }: FormStepperProps) {\n const currentIndex = steps.findIndex((s) => s.id === currentStepId);\n\n return (\n <nav aria-label=\"Progress\" className={twMerge(\"w-full\", className)}>\n {/* Connecting lines container - behind everything */}\n <div className=\"relative mb-20\">\n <div className=\"absolute top-5 left-0 right-0 flex items-center justify-between\">\n {/* Left spacer for first circle */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Lines */}\n {steps.slice(0, -1).map((_, index) => (\n <div\n key={index}\n className={twMerge(\n \"h-0.5 flex-1 transition-colors\",\n index < currentIndex ? \"bg-action-default\" : \"bg-border-default\"\n )}\n />\n ))}\n\n {/* Right spacer for last circle */}\n <div className=\"w-10 flex-shrink-0\" />\n </div>\n\n {/* Steps */}\n <ol className=\"relative flex items-start justify-between\">\n {steps.map((step, index) => {\n const isActive = step.id === currentStepId;\n const isCompleted = index < currentIndex;\n const isClickable = onStepClick && (isCompleted || isActive);\n\n return (\n <li key={step.id} className=\"flex flex-col items-center\">\n {/* Step Circle */}\n <button\n type=\"button\"\n disabled={!isClickable}\n onClick={() => isClickable && onStepClick?.(step.id)}\n className={twMerge(\n \"relative z-10 flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full border-2 transition-colors bg-background-body\",\n isCompleted &&\n \"border-action-default bg-action-default text-text-onPrimary hover:bg-action-default/90\",\n isActive && \"border-action-default bg-background-body text-action-default\",\n !isCompleted &&\n !isActive &&\n \"border-border-default bg-background-body text-text-muted\",\n isClickable && \"cursor-pointer\",\n !isClickable && \"cursor-default\"\n )}\n aria-current={isActive ? \"step\" : undefined}\n >\n {isCompleted ? (\n <Icon name=\"Check\" size={20} weight=\"bold\" />\n ) : (\n <span className=\"text-sm font-semibold\">{index + 1}</span>\n )}\n </button>\n\n {/* Step Label */}\n <div className=\"mt-3 flex flex-col items-center text-center w-32\">\n <span\n className={twMerge(\n \"text-sm font-medium\",\n isActive && \"text-text-default\",\n isCompleted && \"text-text-body\",\n !isActive && !isCompleted && \"text-text-muted\"\n )}\n >\n {step.title}\n </span>\n {step.description && (\n <span className=\"mt-1 text-xs text-text-caption\">{step.description}</span>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n </nav>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\nimport { Button } from \"@/components/Button\";\n\nexport interface SaveBarProps {\n formId?: string;\n show: boolean;\n isSubmitting?: boolean;\n onCancel?: () => void;\n primaryLabel?: string;\n secondaryLabel?: string;\n className?: string;\n}\n\nexport function SaveBar({\n formId,\n show,\n isSubmitting,\n onCancel,\n primaryLabel = \"Save changes\",\n secondaryLabel = \"Cancel\",\n className,\n}: SaveBarProps) {\n if (!show) return null;\n\n return (\n <div\n className={twMerge(\n \"fixed inset-x-0 bottom-0 z-40 border-t border-border-muted bg-background-surface/95 backdrop-blur supports-[backdrop-filter]:bg-background-surface/70\",\n className\n )}\n >\n <div className=\"mx-auto flex max-w-screen-lg items-center justify-between gap-3 p-3\">\n <div className=\"text-sm text-text-muted\">You have unsaved changes</div>\n <div className=\"flex gap-2\">\n <Button variant=\"secondary\" onPress={onCancel}>\n {secondaryLabel}\n </Button>\n <Button type=\"submit\" form={formId} isDisabled={!!isSubmitting}>\n {isSubmitting ? \"Saving...\" : primaryLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nexport interface UnsavedChangesPromptProps {\n when: boolean;\n message?: string;\n}\n\nexport function UnsavedChangesPrompt({\n when,\n message = \"You have unsaved changes. Leave anyway?\",\n}: UnsavedChangesPromptProps) {\n React.useEffect(() => {\n if (!when) return;\n const handler = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n e.returnValue = message;\n return message;\n };\n window.addEventListener(\"beforeunload\", handler);\n return () => window.removeEventListener(\"beforeunload\", handler);\n }, [when, message]);\n\n return null;\n}\n","import * as React from \"react\";\n\nexport interface WizardStep {\n id: string;\n title: string;\n description?: string;\n}\n\nexport interface UseWizardOptions {\n steps: WizardStep[];\n initialStepId?: string;\n canNavigate?: (fromId: string, toId: string) => Promise<boolean> | boolean;\n}\n\nexport function useWizard({ steps, initialStepId, canNavigate }: UseWizardOptions) {\n if (steps.length === 0) {\n throw new Error(\"useWizard: steps array cannot be empty\");\n }\n\n const [currentStepId, setCurrentStepId] = React.useState<string>(initialStepId || steps[0].id);\n\n const stepIndex = steps.findIndex((s) => s.id === currentStepId);\n const hasPrev = stepIndex > 0;\n const hasNext = stepIndex < steps.length - 1;\n\n const goTo = async (id: string) => {\n if (id === currentStepId) return true;\n if (canNavigate) {\n const ok = await canNavigate(currentStepId, id);\n if (!ok) return false;\n }\n setCurrentStepId(id);\n return true;\n };\n\n const next = async () => {\n if (!hasNext || stepIndex === -1) return false;\n return goTo(steps[stepIndex + 1].id);\n };\n\n const prev = async () => {\n if (!hasPrev || stepIndex === -1) return false;\n return goTo(steps[stepIndex - 1].id);\n };\n\n return { steps, currentStepId, setCurrentStepId: goTo, next, prev, hasNext, hasPrev, stepIndex };\n}\n"]}