@texturehq/edges 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useDebounce.ts","../src/hooks/useLocalStorage.ts","../src/utils/formatting/registry.ts","../src/utils/formatting/boolean.ts","../src/utils/formatting/component-formatter.tsx","../src/utils/formatting/number.ts","../src/utils/formatting/current.ts","../src/utils/formatting/date.ts","../src/utils/formatting/distance.ts","../src/utils/formatting/energy.ts","../src/utils/formatting/phone.ts","../src/utils/formatting/power.ts","../src/utils/formatting/resistance.ts","../src/utils/formatting/temperature.ts","../src/utils/formatting/text.ts","../src/utils/formatting/voltage.ts","../src/utils/formatting/index.ts","../src/components/Icon/Icon.tsx","../src/components/ActionMenu/ActionMenu.tsx","../src/components/Logo/Logo.tsx","../src/components/SideNav/SideNav.tsx","../src/components/TopNav/TopNav.tsx","../src/components/AppShell/AppShell.tsx","../packages/@react-aria/ssr/src/SSRProvider.tsx","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/utils.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useDefaultLocale.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/context.tsx","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useCollator.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useFilter.ts","../src/utils/ColorModeProvider.tsx","../src/utils/index.ts","../src/utils/controlStyles.ts","../src/components/Field/Field.tsx","../src/components/ListBoxItem/ListBoxItem.tsx","../src/components/Popover/Popover.tsx","../src/components/Autocomplete/Autocomplete.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/TextLink/TextLink.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Button/Button.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Heading/Heading.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.tsx","../src/components/CodeEditor/CodeEditor.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/CopyToClipboard/CopyToClipboard.tsx","../src/context/ChartContext.tsx","../src/components/charts/AreaSeries/AreaSeries.tsx","../src/components/charts/BarSeries/BarSeries.tsx","../src/utils/charts.ts","../src/components/charts/ChartAxis/ChartAxis.tsx","../src/components/charts/ChartBottomBar/ChartBottomBar.tsx","../src/utils/chartExport.ts","../src/utils/colors.ts","../src/components/charts/ChartTooltip/ChartTooltip.tsx","../src/components/charts/LineSeries/LineSeries.tsx","../src/components/charts/ChartContainer/ChartContainer.tsx","../src/components/DataTable/cells/cellUtils.tsx","../src/components/DataTable/cells/ActionCell.tsx","../src/components/DataTable/cells/BooleanCell.tsx","../src/components/DataTable/cells/DateCell.tsx","../src/components/DataTable/cells/NumberCell.tsx","../src/components/DataTable/cells/SelectCell.tsx","../src/components/DataTable/cells/TextCell.tsx","../src/components/DataTable/MobileRenderer.tsx","../src/components/DataTable/DataTable.tsx","../src/components/DateField/DateField.tsx","../src/components/Dialog/Dialog.tsx","../src/components/RangeCalendar/RangeCalendar.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/DialogHeader/DialogHeader.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/Drawer/Drawer.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Form/Form.tsx","../src/components/Grid/Grid.tsx","../src/components/Kpi/Kpi.tsx","../src/components/Kpi/KpiGroup.tsx","../src/components/ListBox/ListBox.tsx","../src/components/Loader/Loader.tsx","../src/components/Maps/StaticMap.tsx","../src/components/Maps/InteractiveMap.tsx","../src/components/Meter/Meter.tsx","../src/components/Notice/Notice.tsx","../src/components/Notice/NoticeContainer.tsx","../src/components/Notice/NoticeProvider.tsx","../src/components/Notice/useNotice.ts","../src/components/NumberField/NumberField.tsx","../src/components/Tabs/Tabs.tsx","../src/components/PageLayout/PageLayout.tsx","../src/components/PlaceSearch/PlaceSearch.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/RadioGroup/RadioGroup.tsx","../src/components/TextField/TextField.tsx","../src/components/RichTextEditor/RichTextEditor.tsx","../src/components/Section/Section.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Select/Select.tsx","../src/components/Slider/Slider.tsx","../src/components/SplitPane/SplitPane.tsx","../src/components/StatList/StatList.tsx","../src/components/Switch/Switch.tsx","../src/components/TextArea/TextArea.tsx","../src/components/TextAreaWithChips/TextAreaWithChips.tsx","../src/components/TimeField/TimeField.tsx","../src/components/ToggleButton/ToggleButton.tsx"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","timer","useLocalStorage","key","initialValue","storedValue","setStoredValue","item","error","setValue","useCallback","prev","removeValue","FormatRegistryClass","__publicField","formatter","args","FormatRegistry","toBoolean","trueText","falseText","toEnabledDisabled","toOnOff","toActiveInactive","toTrueFalse","toCheckmark","parseBoolean","lower","formatBoolean","format","boolValue","formatComponentValue","emptyClassName","emptyText","jsx","formatted","formatFieldValue","useComponentFormatter","React","isNil","toPercentage","decimals","toInteger","toFloat","toFormattedNumber","thousandsSeparator","options","toCompactNumber","display","toScientificNotation","toCurrency","currency","formatOptions","formatNumber","numValue","formatCurrency","toMilliamps","mA","toAmps","toKiloamps","autoScaleCurrent","absValue","formatCurrent","toMA","toA","toKA","toDateTime","DateTime","dt","toDateString","showTime","timezone","dtWithZone","toRelativeTime","toFullDateTime","toISOString","toCustomDateFormat","getDateParts","formatDate","toMeters","toCentimeters","toMillimeters","toKilometers","toFeet","toInches","toMiles","toYards","toNauticalMiles","metersToFeet","meters","feetToMeters","feet","milesToKilometers","miles","kilometersToMiles","km","feetToMiles","milesToFeet","metersToMiles","milesToMeters","yardsToMeters","yards","metersToYards","inchesToCentimeters","inches","centimetersToInches","cm","autoScaleDistance","metric","formatDistance","isMetric","toWh","tokWh","toMWh","toGWh","autoScaleEnergy","formatEnergy","formatUSPhone","phone","cleaned","formatInternationalPhone","formatPhoneNumber","formatPhone","phoneStr","toWatts","toKilowatts","toMegawatts","toGigawatts","autoScalePower","formatPower","toW","toKW","toMW","toGW","toMilliohms","toOhms","toKilohms","toMegohms","autoScaleResistance","formatResistance","temperatureStringToSymbol","unit","toFahrenheit","toCelsius","fromFahrenheit","toKelvin","celsiusToFahrenheit","celsius","fahrenheitToCelsius","fahrenheit","celsiusToKelvin","kelvinToCelsius","kelvin","fahrenheitToKelvin","kelvinToFahrenheit","toTemperature","formatTemperature","shouldHideValue","toUpperCase","text","toLowerCase","toSentenceCase","toTitleCase","articles","word","index","capitalize","ucFirst","camelCaseToWords","str","snakeCaseToWords","enumToSentenceCase","truncateMiddle","length","totalChars","leadingChars","trailingChars","truncateStart","truncateEnd","ellipsis","toSecret","lastFour","maskedLength","formatText","transform","position","toMillivolts","mV","toVolts","toKilovolts","autoScaleVoltage","formatVoltage","toMV","toV","toKV","customFormat","createFormat","type","sizePresets","Icon","memo","name","size","color","weight","className","ariaLabel","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","twMerge","IconWithContainer","variant","shape","containerSize","containerClassName","ref","iconSize","resolvedContainerSize","containerClasses","ActionMenu","children","items","align","textAlign","onAction","jsxs","MenuTrigger","Popover","Menu","ActionMenuItem","iconName","isDisabled","sizeClasses","variantClasses","MenuItem","Logo","showWordmark","width","fill","fillValue","fillClass","logoWidth","logoHeight","SideNav","topItems","bottomItems","logo","showLogo","LinkComponent","mobileMenuId","sidebarCollapseId","isSectionFormat","normalizeToSections","renderSection","section","sectionIndex","totalSections","renderNavItem","isNested","categoryId","child","linkProps","linkContent","Fragment","sections","TopNav","rightContent","showMobileMenu","avatar","showColorModeSwitcher","toggleTheme","isDarkThemeEnabled","actions","AppShell","sideNav","topNav","contentPaddingX","contentPaddingY","showSidebarBorder","mainClassName","enableJsEnhancements","$b5e257d569688ac6$var$defaultContext","$b5e257d569688ac6$var$SSRContext","$670gB$react","$b5e257d569688ac6$var$IsSSRContext","$b5e257d569688ac6$var$canUseDOM","$b5e257d569688ac6$var$componentIds","$b5e257d569688ac6$var$useCounter","ctx","$670gB$useContext","$670gB$useRef","_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner","_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","currentOwner","prevComponentValue","$b5e257d569688ac6$var$useLegacySSRSafeId","defaultId","counter","prefix","$b5e257d569688ac6$var$useModernSSRSafeId","id","didSSR","$670gB$useState","$b5e257d569688ac6$export$535bd6ca7f90a273","$b5e257d569688ac6$var$getSnapshot","$b5e257d569688ac6$var$getServerSnapshot","$b5e257d569688ac6$var$subscribe","onStoreChange","$148a7a147e38ea7f$var$RTL_SCRIPTS","$148a7a147e38ea7f$var$RTL_LANGS","$148a7a147e38ea7f$export$702d680b21cbd764","localeString","locale","textInfo","lang","$1e5a04cdaf7d1af8$var$localeSymbol","$1e5a04cdaf7d1af8$export$f09106e7c6677ec5","$1e5a04cdaf7d1af8$var$currentLocale","$1e5a04cdaf7d1af8$var$listeners","$1e5a04cdaf7d1af8$var$updateLocale","listener","$1e5a04cdaf7d1af8$export$188ec29ebc2bdc3a","isSSR","defaultLocale","setDefaultLocale","$ffhGL$useState","$ffhGL$useEffect","$18f2051aff69b9bf$var$I18nContext","$h9FiU$react","$18f2051aff69b9bf$export$43bb16f9c6d9e3f7","$h9FiU$useContext","$325a3faab7a68acd$var$cache","$325a3faab7a68acd$export$a16aca283550c30d","cacheKey","a","b","$bb77f239b46e8c72$export$3274cf84b703fff","collator","startsWith","$21ck9$useCallback","string","substring","endsWith","contains","scan","sliceLen","slice","$21ck9$useMemo","ColorModeContext","createContext","useColorMode","useContext","ColorModeProvider","colorMode","setColorMode","isDarkTheme","savedTheme","mediaQuery","initialTheme","handleColorModeChange","e","newTheme","prevMode","newMode","focusRing","showDefaultOutline","composeTailwindRenderProps","tw","composeRenderProps","controlStyles","useInputFocus","isFocused","setIsFocused","handleFocus","onFocus","handleBlur","onBlur","InputWrapper","ClearButton","onClick","getInputStateStyles","isInvalid","baseStyles","getInputBackgroundStyles","getInputBaseStyles","transparent","getFieldGroupStyles","isFocusWithin","Label","tooltip","isRequired","htmlFor","Description","FieldError","Input","FieldGroup","rest","itemHeightStylesObject","textSizeStylesObject","ListBoxItem","AriaListBoxItem","getPopoverStyles","isEntering","isExiting","enteringStyles","exitingStyles","showArrow","isSubmenu","useSlottedContext","PopoverContext","offset","AriaPopover","renderProps","OverlayArrow","iconSizeClassMap","inputPaddingLeftMap","state","ComboBoxStateContext","AriaButton","getItemName","staticItems","selectedItem","s","handleRestRequest","config","filterText","signal","baseUrl","params","finalUrl","response","json","errorMessage","handleGraphQLRequest","query","obj","Autocomplete","label","selectedKey","defaultSelectedKey","onSelectionChange","requestConfig","defaultFilter","placeholder","description","validationResult","showErrors","renderItem","renderLeftIcon","autoFocus","triggerRef","triggerWidth","setTriggerWidth","inputValue","setInputValue","debouncedInputValue","setError","textSizeClass","heightSizeClass","dynamicItems","updateTriggerWidth","useAsyncList","result","handleInternalSelectionChange","newName","handleInternalInputChange","currentSelectedItemName","ComboBox","Group","AriaInput","isPressed","ListBox","sectionItems","ListBoxSection","Header","Avatar","src","alt","firstName","lastName","fullName","status","bordered","statusSizeClasses","statusPositionClasses","statusColors","variantColors","shapeClasses","baseClasses","initials","first","last","parts","getIcon","Users","Building2","User","renderAvatar","badgeVariantStyles","badgeSizeStyles","badgeShapeStyles","dotSizeStyles","Badge","dot","dotPosition","dotElement","TextLink","href","external","title","asButton","onPress","externalProps","combinedClasses","content","Breadcrumbs","AriaBreadcrumbs","Breadcrumb","restProps","AriaBreadcrumb","ChevronRight","variantStyles","widthStyles","disabledStyles","enabledStyles","badgePositionStyles","getButtonStyles","fullWidth","isLoading","styles","Button","icon","loadingText","loadingIndicator","iconPosition","iconWeight","badgeNumber","badgeVariant","badgePosition","style","target","rel","iconElement","loadingNode","composedClassName","_onPress","_onPressStart","_onPressEnd","_onPressChange","_onPressUp","_onAuxClick","_onContextMenu","_onDoubleClick","safeRestProps","buttonOrLink","RACLink","RACButton","getCellStyles","isSelected","Calendar","AriaCalendar","CalendarHeader","CalendarGrid","CalendarGridHeader","CalendarGridBody","date","CalendarCell","Text","direction","useLocale","buttonSize","Heading","AriaCalendarGridHeader","day","CalendarHeaderCell","sizeVariants","heightVariants","Tag","height","heightClasses","Skeleton","animation","gradient","flex","stack","responsive","adjustAnimationSpeedBasedOnWidth","dataTestId","visible","setVisible","animationSpeed","numWidth","animationClasses","layoutClasses","responsiveStyles","breakpoint","lineWidth","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","CardHeader","subtitle","CardMedia","aspectRatio","CardContent","CardFooter","CheckboxGroup","AriaCheckboxGroup","getCheckboxStyles","getBoxStyles","isIndeterminate","colorStyles","iconStyles","Checkbox","otherProps","AriaCheckbox","checkboxContent","Minus","Check","chipVariantStyles","chipSizeStyles","getChipStyles","isClickable","Chip","onRemove","isRemovable","showRemoveButton","handleRemoveClick","handleChipClick","chipContent","CodeEditor","readOnly","onChange","language","theme","lineHeight","minLines","maxLines","showLineNumbers","showGutter","fontSize","wrapEnabled","editorRef","useRef","calculatedHeight","useMemo","lineCount","AceEditor","Tooltip","TooltipTrigger","AriaTooltip","CopyToClipboard","showTooltip","setShowTooltip","copyButton","textToCopy","defaultAnimationSettings","ChartContext","useChartContext","context","AreaSeries","data","uniqueGradientId","useId","clipPathId","xScale","yScale","animationSettings","xRange","yRange","motion","AreaClosed","d","curveLinear","LinePath","BarSeries","opacity","categoryColors","sortedData","timeInterval","barWidth","i","x","y","nextPoint","thisBarWidth","barColor","Bar","defaultMargin","getYFormatSettings","formatType","currencySymbol","safeFormat","v","units","unitIndex","val","suffixes","v2","createXScale","dateExtent","extent","scaleTime","createYScale","yFormatSettings","dataYMin","min","dataYMax","max","yMin","yMax","scaleLinear","AxisBottom","top","scale","Axis","AxisLeft","left","yFormatType","formatSettings","ChartAxis","Legend","ChartBottomBar","onExport","isExporting","setIsExporting","exportingType","setExportingType","handleExport","DialogTrigger","generateFilename","baseFilename","extension","includeTimestamp","base","timestamp","exportChart","datasets","metadata","svgRef","normalizedDatasets","exportAsCSV","exportAsSVG","exportAsPNG","dateMap","dataset","point","rows","row","p","csv","Papa","blob","filename","saveAs","svgClone","rect","svgString","objectUrl","svgElement","bbox","textElements","svgBlob","resolve","reject","image","timeout","canvas","isExportSupported","getExportFormatName","colorCache","getResolvedColor","variableName","fallback","varName","root","tempElement","resolvedColor","clearColorCache","getThemeCategoricalColors","colors","getDefaultColors","getDefaultChartColor","createCategoryColorMap","categories","customColors","colorMap","themeColors","category","isLightColor","rgb","g","getContrastingTextColor","backgroundColor","ChartTooltip","tooltipRef","setPosition","viewportHeight","translate","AnimatePresence","series","LineSeries","strokeWidth","strokeDasharray","bisectDate","bisector","ChartEmptyState","ChartLoading","VisXChartContainer","parentWidth","parentHeight","tooltipData","setTooltipData","lastMoveRef","defaultColor","seriesMetadata","seriesIndex","totalSeries","Children","isValidElement","allData","handleMouseMove","event","mouseX","xValue","seriesData","datasetIndex","idx","d0","d1","distanceToD0","distanceToD1","tooltipX","shouldShowLeft","handleMouseLeave","contextValue","coloredChildren","uniqueSeries","meta","tickValue","Line","ChartContainer","withParentSize","getCellAlignmentClasses","getCellTextClasses","emphasis","isLink","getCellContainerClasses","additionalClasses","formatEmptyValue","SKELETON_SIZES","getSkeletonSize","resolveValue","getBadgeClasses","getBooleanBadgeVariant","getNumericColorClasses","colorCode","getLinkClasses","behavior","wrapWithLink","linkBehavior","resolvedHref","linkClasses","ActionCell","visibleActions","action","disabled","BooleanCell","trueIcon","falseIcon","showFalse","DateCell","formattedValue","getRelativeTime","diffInMs","diffInSecs","diffInMins","diffInHours","diffInDays","NumberCell","suffix","showPositiveSign","displayValue","textClasses","SelectCell","onSelect","checked","TextCell","truncate","BREAKPOINT_CLASSES","DESKTOP_BREAKPOINT_CLASSES","getCellValue","column","renderMobileCell","CellComponent","cellProps","AutoMobileRenderer","columns","density","mobileColumns","col","mobileConfig","primaryColumns","secondaryColumns","badgeColumns","showLabel","CardMobileRenderer","visibleColumns","isFirst","getMobileBreakpointClasses","MobileLoadingSkeleton","densityClasses","alignmentClasses","widthClasses","getColumnStyles","TableHeaderCell","sortConfig","onSort","stickyHeader","isSorted","sortDirection","TableCell","rowIndex","columnIndex","isHovered","LoadingCell","TableRow","setIsHovered","handleClick","LoadingRow","DataTable","maxHeight","layout","mobileRenderer","customMobileRowRender","mobileBreakpoint","loadingRowCount","onRowClick","getRowId","hideHeader","localSortConfig","setLocalSortConfig","gridTemplateColumns","handleSort","columnId","newSortConfig","containerStyle","wrapperClasses","breakpointClasses","showMobile","renderMobileRow","_","rowId","DateField","showCalendar","isCalendarOpen","setIsCalendarOpen","handleCalendarSelect","AriaDateField","DateInput","CalendarIcon","Dialog","getSegmentStyles","isPlaceholder","AriaDateInput","segment","DateSegment","RACDialog","getCellClassName","selectionState","selectionStateClasses","disabledClasses","RangeCalendar","AriaRangeCalendar","formattedDate","isSelectionStart","isSelectionEnd","_isFocusVisible","DateRangePicker","AriaDateRangePicker","DialogHeader","onClose","hideCloseIcon","titleAlign","hasBackArrow","onBack","headerContent","ErrorBoundary","Component","errorInfo","Drawer","isOpen","slideInFrom","transparentOverlay","primaryAction","secondaryAction","footerContent","contentPadding","maxWidth","isAnimating","setIsAnimating","hasActions","hasFooter","ModalOverlay","Modal","FileUpload","onUrlChange","accept","maxSize","onUpload","showPreview","isDragging","setIsDragging","isUploading","setIsUploading","preview","setPreview","fileInputRef","handleFile","file","reader","url","err","handleDrop","handleRemove","DropZone","ImageIcon","X","Upload","FileTrigger","files","Form","RACForm","colsMap","responsiveColsMap","gapMap","gapXMap","gapYMap","alignMap","justifyMap","flowMap","spanMap","responsiveSpanMap","getResponsiveClasses","baseMap","responsiveMap","classes","map","breakpointValue","Grid","cols","gap","gapX","gapY","justify","flow","autoFit","autoFill","gridClasses","GridItem","span","itemClasses","formatValue","getDeltaColor","delta","deltaIntent","isPositive","Sparkline","points","yValues","range","normalizeY","xStep","pathData","Kpi","deltaPeriodLabel","trend","helpText","orientation","loading","empty","renderValue","renderDelta","renderTrend","currentSize","valueNode","deltaNode","trendNode","getColClasses","KpiGroup","equalizeHeights","header","enhancedChildren","AriaListBox","Loader","MAPBOX_THEMES","StaticMap","initialViewState","mapboxAccessToken","showMarker","ReactMapGL","Marker","AttributionControl","createGeoJsonData","calculateBounds","minLat","maxLat","minLng","maxLng","InteractiveMap","viewState","onViewStateChange","onPointClick","selectedPointId","scrollEnabled","enableClustering","renderMarker","mapRef","showResetButton","setShowResetButton","defaultViewState","handleViewStateChange","evt","moved","handleResetView","handleMapClick","feature","geoJsonData","selectedPoint","layers","pointLayer","NavigationControl","Source","layer","Layer","sizeStyles","Meter","showWarningIndicator","warningThreshold","AriaMeter","percentage","valueText","isWarning","effectiveVariant","getAutomaticVariant","AlertTriangle","getMeterColor","CheckCircle","XCircle","AlertCircle","Info","Notice","_id","message","duration","dismissible","onDismiss","container","positionStyles","NoticeContainer","notices","mounted","setMounted","notice","createPortal","NoticeContext","NoticeProvider","maxNotices","defaultDuration","defaultDismissible","setNotices","addNotice","newNotice","updated","removeNotice","clearNotices","useNoticeContext","useNotice","show","success","warning","info","getNumberFieldStyles","NumberField","AriaNumberField","TabsContext","dr","getTabsStyles","Tabs","RACTabs","getTabListStyles","TabList","RACTabList","getTabStyles","focusRingStyles","stateStyles","Tab","RACTab","getTabPanelStyles","TabPanel","RACTabPanel","PageLayout","paddingXClass","paddingYClass","breadcrumbs","breadcrumbsNode","headingAs","bc","Actions","primary","secondary","Filters","tabs","defaultValue","handleSelectionChange","t","Content","Aside","sticky","isMapboxResponse","MAPBOX_TOKEN","PlaceSearch","searchTypes","countryRestrictions","proximity","itemDataRef","loadedItemsRef","itemData","nameParts","primaryText","secondaryText","selected","ProgressBar","rightLabel","progressWidth","hideLabels","AriaProgressBar","RadioGroup","RACRadioGroup","getRadioStyles","Radio","RACRadio","getTextFieldStyles","paddingStyles","TextField","showSearchIcon","isClearable","onClear","showPassword","setShowPassword","isPassword","AriaTextFieldComponent","ToolbarButton","isActive","LinkDialog","initialUrl","onSubmit","setUrl","RichTextEditor","initialContent","isLinkDialogOpen","setIsLinkDialogOpen","editor","useEditor","StarterKit","Link","handleLinkClick","handleLinkSubmit","BubbleMenu","EditorContent","spacingStyles","Section","spacing","withDivider","headingId","hasHeader","iconSizes","getButtonClass","_isFirst","isLast","SegmentedControl","option","ToggleButton","getSelectValueClassName","useElementFocus","Select","controlledSelectedKey","internalSelectedKey","setInternalSelectedKey","selectRef","AriaSelect","SelectValue","Slider","step","showValue","isControlled","internalValue","setInternalValue","currentValue","clamped","percent","next","SplitPaneContext","SplitPane","defaultSize","minSize","resizable","onResize","containerRef","isResizing","setIsResizing","splitPosition","setSplitPosition","totalSize","startPos","mainSize","asideSize","newRatio","handleMouseUp","handleMouseDown","mainPanel","Main","asidePanel","splitPercentage","newPos","getTone","threshold","toneColors","StatRow","dense","valueAlign","tone","toneClass","valueDisplay","valueContent","StatList","showDividers","skeleton","getTrackClassName","getHandleClassName","Switch","AriaSwitch","getTextAreaStyles","textAreaStyles","TextArea","required","TextAreaWithChips","chips","onChipsChange","triggerPattern","onTriggerDetected","onTriggerDismissed","renderChip","chipVariant","chipSize","textareaRef","actualChipSize","selectionOffsetRef","getDOMTextWithPlaceholders","processNode","node","textContent","element","chipId","setCaretAtOffset","targetOffset","walker","parentElement","currentNode","remaining","sel","useLayoutEffect","handleTextChange","newValue","cursorPosition","textBeforeCursor","triggerRegex","match","startIndex","handleChipRemove","updatedChips","chip","updatedText","renderChipElement","contentEditableStyles","renderContent","part","chipMatch","c","selection","line","lineIndex","hasChips","found","calculatePosition","tempRange","chipElement","newRange","newSelection","textNode","maybeChip","elementNode","chipPlaceholder","chipIndex","newText","newChips","getTimeFieldStyles","TimeField","focusedSegment","setFocusedSegment","inputRef","handleFocusIn","handleFocusOut","inputElement","AriaTimeField","getToggleButtonStyles","borderRadius","borderRight","borderLeft","renderChildren","toggleButton","RACToggleButton"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\n/**\n * Hook for managing localStorage values with React state synchronization\n * @param key - The localStorage key\n * @param initialValue - The initial value if nothing is stored\n * @returns [value, setValue, removeValue] - Current value, setter function, and remove function\n */\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [T, (value: T | ((val: T) => T)) => void, () => void] {\n // State to hold the current value\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Update localStorage when the value changes\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.setItem(key, JSON.stringify(storedValue));\n } catch (error) {\n console.error(`Error writing to localStorage key \"${key}\":`, error);\n }\n }, [key, storedValue]);\n\n // Memoized setValue function\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n return valueToStore;\n });\n } catch (error) {\n console.error(`Error setting value for localStorage key \"${key}\":`, error);\n }\n },\n [key]\n );\n\n // Memoized remove function\n const removeValue = useCallback(() => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n setStoredValue(initialValue);\n } catch (error) {\n console.error(`Error removing localStorage key \"${key}\":`, error);\n }\n }, [key, initialValue]);\n\n return [storedValue, setValue, removeValue];\n}\n","/**\n * FormatRegistry - A singleton pattern for managing formatters\n * Allows registration and retrieval of formatting functions by key\n */\n\nimport type { FieldValue, FormattedValue, FormatterFunction } from \"./types\";\n\nclass FormatRegistryClass {\n private formatters: Map<string, FormatterFunction> = new Map();\n\n /**\n * Register a new formatter\n * @param key - Unique identifier for the formatter\n * @param formatter - The formatting function\n */\n register(key: string, formatter: FormatterFunction): void {\n this.formatters.set(key, formatter);\n }\n\n /**\n * Format a value using a registered formatter\n * @param key - The formatter key\n * @param value - The value to format\n * @param args - Additional arguments to pass to the formatter\n * @returns The formatted value or null\n */\n format(key: string, value: FieldValue, ...args: unknown[]): FormattedValue {\n const formatter = this.formatters.get(key);\n if (!formatter) {\n console.warn(`No formatter registered for key: ${key}`);\n return null;\n }\n return formatter(value, ...args);\n }\n\n /**\n * Check if a formatter is registered\n * @param key - The formatter key\n * @returns True if the formatter exists\n */\n has(key: string): boolean {\n return this.formatters.has(key);\n }\n\n /**\n * Get all registered formatter keys\n * @returns Array of formatter keys\n */\n keys(): string[] {\n return Array.from(this.formatters.keys());\n }\n\n /**\n * Remove a formatter\n * @param key - The formatter key to remove\n */\n unregister(key: string): void {\n this.formatters.delete(key);\n }\n\n /**\n * Clear all registered formatters\n */\n clear(): void {\n this.formatters.clear();\n }\n}\n\n// Export singleton instance\nexport const FormatRegistry = new FormatRegistryClass();\n","/**\n * Boolean formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { BooleanFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format boolean value with custom text\n */\nexport const toBoolean = (\n value: boolean | null | undefined,\n trueText: string = \"Yes\",\n falseText: string = \"No\"\n): string | null => {\n if (value === null || value === undefined) return null;\n return value ? trueText : falseText;\n};\n\n/**\n * Format boolean as enabled/disabled\n */\nexport const toEnabledDisabled = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"Enabled\", \"Disabled\");\n};\n\n/**\n * Format boolean as on/off\n */\nexport const toOnOff = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"On\", \"Off\");\n};\n\n/**\n * Format boolean as active/inactive\n */\nexport const toActiveInactive = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"Active\", \"Inactive\");\n};\n\n/**\n * Format boolean as true/false\n */\nexport const toTrueFalse = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"True\", \"False\");\n};\n\n/**\n * Format boolean as checkmark/cross\n */\nexport const toCheckmark = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"✓\", \"✗\");\n};\n\n/**\n * Parse various truthy/falsy values to boolean\n */\nexport const parseBoolean = (value: FieldValue): boolean | null => {\n if (value === null || value === undefined) return null;\n\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const lower = value.toLowerCase().trim();\n if (\n lower === \"true\" ||\n lower === \"yes\" ||\n lower === \"1\" ||\n lower === \"on\" ||\n lower === \"enabled\"\n ) {\n return true;\n }\n if (\n lower === \"false\" ||\n lower === \"no\" ||\n lower === \"0\" ||\n lower === \"off\" ||\n lower === \"disabled\"\n ) {\n return false;\n }\n return null;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n return null;\n};\n\n/**\n * Format boolean according to BooleanFormat specification\n */\nexport const formatBoolean = (value: FieldValue, format: BooleanFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const boolValue = parseBoolean(value);\n if (boolValue === null) return format.nullText ?? null;\n\n return toBoolean(boolValue, format.trueText ?? \"Yes\", format.falseText ?? \"No\");\n};\n\n// Register boolean formatters\nFormatRegistry.register(\"boolean\", (value, trueText, falseText) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toBoolean(\n boolValue,\n typeof trueText === \"string\" ? trueText : \"Yes\",\n typeof falseText === \"string\" ? falseText : \"No\"\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"yesNo\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toBoolean(boolValue, \"Yes\", \"No\");\n }\n return null;\n});\n\nFormatRegistry.register(\"enabledDisabled\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toEnabledDisabled(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"onOff\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toOnOff(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"activeInactive\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toActiveInactive(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"trueFalse\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toTrueFalse(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"checkmark\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toCheckmark(boolValue);\n }\n return null;\n});\n","/**\n * Centralized formatting utility for UI components\n * Used by Kpi, StatList, and other data display components\n */\n\nimport React from \"react\";\nimport { formatFieldValue } from \"./index\";\nimport type { FieldFormat, FieldValue } from \"./types\";\n\n/**\n * Common formatter type used by data display components\n * Can be either a custom function or a FieldFormat object\n */\nexport type ComponentFormatter = ((value: FieldValue) => React.ReactNode) | FieldFormat;\n\n/**\n * Options for formatting values in components\n */\nexport interface ComponentFormatOptions {\n /** The value to format */\n value: FieldValue;\n /** The formatter to apply */\n formatter?: ComponentFormatter;\n /** CSS class for null/empty values */\n emptyClassName?: string;\n /** Text to show for null/empty values */\n emptyText?: React.ReactNode;\n}\n\n/**\n * Format a value for display in a component\n * Centralizes the logic used by Kpi, StatList, and similar components\n *\n * @example\n * ```tsx\n * // In a component\n * const formatted = formatComponentValue({\n * value: 1500,\n * formatter: { type: \"power\" }\n * });\n * // Returns: \"1.5 kW\"\n * ```\n */\nexport function formatComponentValue({\n value,\n formatter,\n emptyClassName = \"text-text-muted\",\n emptyText = \"—\",\n}: ComponentFormatOptions): React.ReactNode {\n // Handle null/undefined early\n if (value == null) {\n return <span className={emptyClassName}>{emptyText}</span>;\n }\n\n // Custom formatter function takes precedence\n if (typeof formatter === \"function\") {\n return formatter(value);\n }\n\n // If a FieldFormat is provided, use the unified formatting system\n if (formatter && typeof formatter === \"object\") {\n const formatted = formatFieldValue(value, formatter);\n\n // Wrap dates in semantic time element for accessibility\n if (value instanceof Date && formatted) {\n return (\n <time dateTime={value.toISOString()} title={value.toISOString()}>\n {formatted}\n </time>\n );\n }\n\n return formatted || <span className={emptyClassName}>{emptyText}</span>;\n }\n\n // No formatter provided - use sensible defaults based on type\n if (!formatter) {\n // For strings, just return as-is\n if (typeof value === \"string\") {\n return value;\n }\n\n // For dates, use default date formatting\n if (value instanceof Date) {\n const formatted = formatFieldValue(value, { type: \"date\" });\n return (\n <time dateTime={value.toISOString()} title={value.toISOString()}>\n {formatted}\n </time>\n );\n }\n\n // For numbers, use default number formatting\n if (typeof value === \"number\") {\n return formatFieldValue(value, { type: \"number\" });\n }\n\n // For booleans, use default boolean formatting\n if (typeof value === \"boolean\") {\n return formatFieldValue(value, { type: \"boolean\" });\n }\n }\n\n // Fallback to string conversion\n return String(value);\n}\n\n/**\n * Hook for using the component formatter\n * Provides memoization for better performance\n *\n * @example\n * ```tsx\n * function MyComponent({ value, formatter }) {\n * const format = useComponentFormatter(formatter);\n * const formatted = format(value);\n * return <span>{formatted}</span>;\n * }\n * ```\n */\nexport function useComponentFormatter(\n formatter?: ComponentFormatter,\n emptyClassName?: string,\n emptyText?: React.ReactNode\n) {\n return React.useCallback(\n (value: FieldValue) =>\n formatComponentValue({\n value,\n formatter,\n emptyClassName,\n emptyText,\n }),\n [formatter, emptyClassName, emptyText]\n );\n}\n","/**\n * Number and currency formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { CurrencyFormat, FieldValue, FormattedValue, NumberFormat } from \"./types\";\n\n/**\n * Check if a value is null or undefined\n */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value === null || value === undefined;\n};\n\n/**\n * Format as percentage\n */\nexport const toPercentage = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)}%`;\n};\n\n/**\n * Format as integer\n */\nexport const toInteger = (value: number | null | undefined): string | null => {\n if (isNil(value)) return null;\n return Math.round(value).toString();\n};\n\n/**\n * Format as float with specified decimals\n */\nexport const toFloat = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return value.toFixed(decimals);\n};\n\n/**\n * Format number with thousands separator\n */\nexport const toFormattedNumber = (\n value: number | null | undefined,\n decimals?: number,\n thousandsSeparator: boolean = true\n): string | null => {\n if (isNil(value)) return null;\n\n const options: Intl.NumberFormatOptions = {\n useGrouping: thousandsSeparator,\n };\n\n if (decimals !== undefined) {\n options.minimumFractionDigits = decimals;\n options.maximumFractionDigits = decimals;\n }\n\n return new Intl.NumberFormat(\"en-US\", options).format(value);\n};\n\n/**\n * Format number with compact notation (1K, 1M, etc.)\n */\nexport const toCompactNumber = (\n value: number | null | undefined,\n display: \"short\" | \"long\" = \"short\"\n): string | null => {\n if (isNil(value)) return null;\n\n return new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n compactDisplay: display,\n }).format(value);\n};\n\n/**\n * Format number with scientific notation\n */\nexport const toScientificNotation = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return value.toExponential(decimals);\n};\n\n/**\n * Format as currency\n */\nexport const toCurrency = (\n value: number | null | undefined,\n currency: string = \"USD\",\n options?: Partial<CurrencyFormat>\n): string | null => {\n if (isNil(value)) return null;\n\n const formatOptions: Intl.NumberFormatOptions = {\n style: \"currency\",\n currency,\n currencyDisplay: options?.currencyDisplay ?? \"symbol\",\n useGrouping: options?.thousandsSeparator ?? true,\n };\n\n if (options?.minimumFractionDigits !== undefined) {\n formatOptions.minimumFractionDigits = options.minimumFractionDigits;\n }\n\n if (options?.maximumFractionDigits !== undefined) {\n formatOptions.maximumFractionDigits = options.maximumFractionDigits;\n }\n\n return new Intl.NumberFormat(\"en-US\", formatOptions).format(value);\n};\n\n/**\n * Format number according to NumberFormat specification\n */\nexport const formatNumber = (value: FieldValue, format: NumberFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const options: Intl.NumberFormatOptions = {\n useGrouping: format.thousandsSeparator ?? false,\n };\n\n if (format.decimals !== undefined) {\n options.minimumFractionDigits = format.decimals;\n options.maximumFractionDigits = format.decimals;\n }\n\n if (format.notation) {\n options.notation = format.notation;\n if (format.notation === \"compact\" && format.compactDisplay) {\n options.compactDisplay = format.compactDisplay;\n }\n }\n\n if (format.sign) {\n options.signDisplay = format.sign;\n }\n\n return new Intl.NumberFormat(\"en-US\", options).format(numValue);\n};\n\n/**\n * Format currency according to CurrencyFormat specification\n */\nexport const formatCurrency = (value: FieldValue, format: CurrencyFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n return toCurrency(numValue, format.currency, format);\n};\n\n// Register number formatters\nFormatRegistry.register(\"percentage\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toPercentage(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"integer\", (value) => {\n if (typeof value === \"number\") {\n return toInteger(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"float\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFloat(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"number\", (value, decimals, thousandsSeparator) => {\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (!isNaN(numValue)) {\n return toFormattedNumber(\n numValue,\n typeof decimals === \"number\" ? decimals : undefined,\n typeof thousandsSeparator === \"boolean\" ? thousandsSeparator : true\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"compact\", (value, display) => {\n if (typeof value === \"number\") {\n return toCompactNumber(value, display === \"long\" ? \"long\" : \"short\");\n }\n return null;\n});\n\nFormatRegistry.register(\"scientific\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toScientificNotation(value, typeof decimals === \"number\" ? decimals : 2);\n }\n return null;\n});\n\nFormatRegistry.register(\"currency\", (value, currency, options) => {\n if (typeof value === \"number\") {\n return toCurrency(\n value,\n typeof currency === \"string\" ? currency : \"USD\",\n typeof options === \"object\" && options !== null ? options : {}\n );\n }\n return null;\n});\n","/**\n * Electrical current formatting utilities (flow of electric charge)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { CurrentFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as milliamps\n */\nexport const toMilliamps = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const mA = value * 1000;\n return decimals === 0 ? `${Math.round(mA)} mA` : `${mA.toFixed(decimals)} mA`;\n};\n\n/**\n * Format as amperes\n */\nexport const toAmps = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} A`;\n};\n\n/**\n * Format as kiloamps (rarely used but included for completeness)\n */\nexport const toKiloamps = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kA`;\n};\n\n/**\n * Auto-scale current to the most appropriate unit\n */\nexport const autoScaleCurrent = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1000) {\n return toKiloamps(value, decimals ?? 2);\n } else if (absValue < 1) {\n return toMilliamps(value, decimals ?? 0);\n } else {\n return toAmps(value, decimals ?? 1);\n }\n};\n\n/**\n * Format current according to CurrentFormat specification\n */\nexport const formatCurrent = (value: FieldValue, format: CurrentFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"kA\":\n return toKiloamps(numValue, decimals ?? 2);\n case \"mA\":\n return toMilliamps(numValue, decimals ?? 0);\n case \"A\":\n return toAmps(numValue, decimals ?? 1);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleCurrent(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base amps\n return toAmps(numValue, decimals ?? 1);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"current\", formatCurrent as any);\n\n// Convenience exports with shorter names\nexport const toMA = toMilliamps;\nexport const toA = toAmps;\nexport const toKA = toKiloamps;\n","/**\n * Date formatting utilities using Luxon\n */\n\nimport { DateTime } from \"luxon\";\nimport { FormatRegistry } from \"./registry\";\nimport type { DateFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Convert a value to a Luxon DateTime object\n */\nconst toDateTime = (value: FieldValue): DateTime | null => {\n if (value === null || value === undefined) return null;\n\n if (value instanceof Date) {\n return DateTime.fromJSDate(value);\n }\n\n if (typeof value === \"string\") {\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n }\n\n if (typeof value === \"number\") {\n // Assume it's a timestamp in milliseconds\n const dt = DateTime.fromMillis(value);\n return dt.isValid ? dt : null;\n }\n\n return null;\n};\n\n/**\n * Format date to string with various options\n */\nexport const toDateString = (\n value: string | Date | number | null | undefined,\n showTime: boolean = false,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n\n return showTime\n ? dtWithZone.toLocaleString(DateTime.DATETIME_SHORT)\n : dtWithZone.toLocaleString(DateTime.DATE_SHORT);\n};\n\n/**\n * Format date to relative time (e.g., \"2 hours ago\")\n */\nexport const toRelativeTime = (value: string | Date | number | null | undefined): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n return dt.toRelative();\n};\n\n/**\n * Format date with full date and time including weekday\n */\nexport const toFullDateTime = (\n value: string | Date | number | null | undefined,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n return dtWithZone.toLocaleString(DateTime.DATETIME_MED_WITH_WEEKDAY);\n};\n\n/**\n * Format date to ISO string\n */\nexport const toISOString = (value: string | Date | number | null | undefined): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return null;\n\n return dt.toISO();\n};\n\n/**\n * Format date with custom format string\n */\nexport const toCustomDateFormat = (\n value: string | Date | number | null | undefined,\n format: string,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n return dtWithZone.toFormat(format);\n};\n\n/**\n * Get formatted date parts\n */\nexport const getDateParts = (value: string | Date | number | null | undefined) => {\n const dt = toDateTime(value);\n if (!dt) return null;\n\n return {\n year: dt.year,\n month: dt.month,\n day: dt.day,\n weekday: dt.weekday,\n hour: dt.hour,\n minute: dt.minute,\n second: dt.second,\n millisecond: dt.millisecond,\n weekdayShort: dt.weekdayShort,\n weekdayLong: dt.weekdayLong,\n monthShort: dt.monthShort,\n monthLong: dt.monthLong,\n };\n};\n\n/**\n * Format date according to DateFormat specification\n */\nexport const formatDate = (value: FieldValue, format: DateFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const dt = toDateTime(value);\n if (!dt) return format.nullText ?? \"Invalid Date\";\n\n const dtWithZone = format.timezone ? dt.setZone(format.timezone) : dt;\n\n // Handle relative time\n if (format.relative) {\n return dtWithZone.toRelative();\n }\n\n // Handle custom format string\n if (format.format) {\n return dtWithZone.toFormat(format.format);\n }\n\n // Handle style-based formatting\n if (format.dateStyle || format.timeStyle) {\n const options: Record<string, unknown> = {};\n\n if (format.dateStyle) {\n switch (format.dateStyle) {\n case \"short\":\n options.date = DateTime.DATE_SHORT;\n break;\n case \"medium\":\n options.date = DateTime.DATE_MED;\n break;\n case \"long\":\n options.date = DateTime.DATE_FULL;\n break;\n case \"full\":\n options.date = DateTime.DATE_HUGE;\n break;\n }\n }\n\n if (format.timeStyle) {\n switch (format.timeStyle) {\n case \"short\":\n options.time = DateTime.TIME_SIMPLE;\n break;\n case \"medium\":\n options.time = DateTime.TIME_WITH_SECONDS;\n break;\n case \"long\":\n case \"full\":\n options.time = DateTime.TIME_WITH_SHORT_OFFSET;\n break;\n }\n }\n\n if (options.date && options.time) {\n return dtWithZone.toLocaleString({ ...options.date, ...options.time });\n } else if (options.date) {\n return dtWithZone.toLocaleString(options.date);\n } else if (options.time) {\n return dtWithZone.toLocaleString(options.time);\n }\n }\n\n // Default formatting\n return dtWithZone.toLocaleString(DateTime.DATETIME_SHORT);\n};\n\n// Register date formatters\nFormatRegistry.register(\"date\", (value, showTime, timezone) => {\n return toDateString(\n value as string | Date | number,\n typeof showTime === \"boolean\" ? showTime : false,\n typeof timezone === \"string\" ? timezone : undefined\n );\n});\n\nFormatRegistry.register(\"relativeTime\", (value) => {\n return toRelativeTime(value as string | Date | number);\n});\n\nFormatRegistry.register(\"fullDateTime\", (value, timezone) => {\n return toFullDateTime(\n value as string | Date | number,\n typeof timezone === \"string\" ? timezone : undefined\n );\n});\n\nFormatRegistry.register(\"isoString\", (value) => {\n return toISOString(value as string | Date | number);\n});\n\nFormatRegistry.register(\"customDateFormat\", (value, format, timezone) => {\n if (typeof format === \"string\") {\n return toCustomDateFormat(\n value as string | Date | number,\n format,\n typeof timezone === \"string\" ? timezone : undefined\n );\n }\n return null;\n});\n","/**\n * Distance and length formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { DistanceFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as meters\n */\nexport const toMeters = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} m`;\n};\n\n/**\n * Format as centimeters\n */\nexport const toCentimeters = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value * 100).toFixed(decimals)} cm`;\n};\n\n/**\n * Format as millimeters\n */\nexport const toMillimeters = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${(value * 1000).toFixed(decimals)} mm`;\n};\n\n/**\n * Format as kilometers\n */\nexport const toKilometers = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} km`;\n};\n\n/**\n * Format as feet\n */\nexport const toFeet = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} ft`;\n};\n\n/**\n * Format as inches\n */\nexport const toInches = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} in`;\n};\n\n/**\n * Format as miles\n */\nexport const toMiles = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} mi`;\n};\n\n/**\n * Format as yards\n */\nexport const toYards = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} yd`;\n};\n\n/**\n * Format as nautical miles\n */\nexport const toNauticalMiles = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} nm`;\n};\n\n/**\n * Conversion utilities\n */\nexport const metersToFeet = (meters: number): number => meters * 3.28084;\nexport const feetToMeters = (feet: number): number => feet / 3.28084;\nexport const milesToKilometers = (miles: number): number => miles * 1.60934;\nexport const kilometersToMiles = (km: number): number => km / 1.60934;\nexport const feetToMiles = (feet: number): number => feet / 5280;\nexport const milesToFeet = (miles: number): number => miles * 5280;\nexport const metersToMiles = (meters: number): number => meters / 1609.34;\nexport const milesToMeters = (miles: number): number => miles * 1609.34;\nexport const yardsToMeters = (yards: number): number => yards * 0.9144;\nexport const metersToYards = (meters: number): number => meters / 0.9144;\nexport const inchesToCentimeters = (inches: number): number => inches * 2.54;\nexport const centimetersToInches = (cm: number): number => cm / 2.54;\n\n/**\n * Auto-scale distance to the most appropriate unit\n */\nexport const autoScaleDistance = (\n value: number | null | undefined,\n metric: boolean = false,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (metric) {\n // Assuming value is in meters\n if (absValue >= 1000) {\n return toKilometers(value, decimals);\n } else if (absValue < 0.01) {\n return toMillimeters(value * 1000, 0);\n } else if (absValue < 1) {\n return toCentimeters(value * 100, decimals);\n } else {\n return toMeters(value, decimals);\n }\n } else {\n // Assuming value is in miles for imperial\n if (absValue < 0.01) {\n // Convert to feet\n return toFeet(milesToFeet(value), 0);\n } else if (absValue < 0.1) {\n // Convert to yards\n return toYards(milesToFeet(value) / 3, 0);\n } else {\n return toMiles(value, decimals);\n }\n }\n};\n\n/**\n * Format distance according to DistanceFormat specification\n */\nexport const formatDistance = (value: FieldValue, format: DistanceFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 1;\n\n if (format.autoScale) {\n const isMetric = format.unit === \"m\" || format.unit === \"km\";\n return autoScaleDistance(numValue, isMetric, decimals);\n }\n\n switch (format.unit) {\n case \"km\":\n return toKilometers(numValue, decimals);\n case \"ft\":\n return toFeet(numValue, decimals);\n case \"mi\":\n return toMiles(numValue, decimals);\n case \"yd\":\n return toYards(numValue, decimals);\n case \"m\":\n default:\n return toMeters(numValue, decimals);\n }\n};\n\n// Register distance formatters\nFormatRegistry.register(\"miles\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toMiles(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"kilometers\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toKilometers(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"meters\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toMeters(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"feet\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFeet(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"yards\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toYards(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"inches\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toInches(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"autoScaleDistance\", (value, metric, decimals) => {\n if (typeof value === \"number\") {\n return autoScaleDistance(\n value,\n typeof metric === \"boolean\" ? metric : false,\n typeof decimals === \"number\" ? decimals : 1\n );\n }\n return null;\n});\n","/**\n * Energy formatting utilities (stored or consumed energy)\n * For power (rate of energy), use power.ts\n * For electrical units (voltage, current), use voltage.ts and current.ts\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { EnergyFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as Watt-hours\n */\nexport const toWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} Wh`;\n};\n\n/**\n * Format as kilowatt-hours\n */\nexport const tokWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kWh`;\n};\n\n/**\n * Format as megawatt-hours\n */\nexport const toMWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MWh`;\n};\n\n/**\n * Format as gigawatt-hours\n */\nexport const toGWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000_000).toFixed(decimals)} GWh`;\n};\n\n/**\n * Auto-scale energy to the most appropriate unit\n */\nexport const autoScaleEnergy = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000_000) {\n return toGWh(value, decimals);\n } else if (absValue >= 1_000_000) {\n return toMWh(value, decimals);\n } else if (absValue >= 1000) {\n return tokWh(value, decimals);\n } else {\n return toWh(value, decimals);\n }\n};\n\n// Power formatting has been moved to power.ts\n\n/**\n * Format energy according to EnergyFormat specification\n */\nexport const formatEnergy = (value: FieldValue, format: EnergyFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 1;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"GWh\":\n return toGWh(numValue, decimals);\n case \"MWh\":\n return toMWh(numValue, decimals);\n case \"kWh\":\n return tokWh(numValue, decimals);\n case \"Wh\":\n return toWh(numValue, decimals);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleEnergy(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base Wh\n return toWh(numValue, decimals);\n};\n\n// Electrical units have been moved to voltage.ts and current.ts\n// Resistance units (Ohms) could be moved to a separate resistance.ts if needed\n\n// Register energy and power formatters\nFormatRegistry.register(\"kWh\", (value) => {\n if (typeof value === \"number\") return tokWh(value);\n return null;\n});\n\n// Power formatters are now in power.ts\n\nFormatRegistry.register(\"autoScaleEnergy\", (value, decimals) => {\n if (typeof value === \"number\") {\n return autoScaleEnergy(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\n// Auto-scale power is now in power.ts\n\n// Register the energy formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"energy\", formatEnergy as any);\n","/**\n * Phone number formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, PhoneFormat } from \"./types\";\n\n/**\n * Format US phone number\n */\nexport const formatUSPhone = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Remove all non-digits\n const cleaned = phone.replace(/\\D/g, \"\");\n\n // Check if it's a valid US phone number (10 or 11 digits)\n if (cleaned.length === 10) {\n return cleaned.replace(/(\\d{3})(\\d{3})(\\d{4})/, \"($1) $2-$3\");\n } else if (cleaned.length === 11 && cleaned.startsWith(\"1\")) {\n return cleaned.replace(/1(\\d{3})(\\d{3})(\\d{4})/, \"+1 ($1) $2-$3\");\n }\n\n // Return original if not a valid format\n return phone;\n};\n\n/**\n * Format international phone number\n */\nexport const formatInternationalPhone = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Remove all non-digits except +\n const cleaned = phone.replace(/[^\\d+]/g, \"\");\n\n // If it starts with +, format as international\n if (cleaned.startsWith(\"+\")) {\n // Try to format common patterns\n if (cleaned.length === 12 && cleaned.startsWith(\"+1\")) {\n // US/Canada\n return cleaned.replace(/\\+1(\\d{3})(\\d{3})(\\d{4})/, \"+1 ($1) $2-$3\");\n } else if (cleaned.length === 13 && cleaned.startsWith(\"+44\")) {\n // UK\n return cleaned.replace(/\\+44(\\d{2})(\\d{4})(\\d{4})/, \"+44 $1 $2 $3\");\n }\n // Add spaces every 3-4 digits for other countries\n return cleaned.replace(/(\\+\\d{1,3})(\\d{3,4})(\\d{3,4})(\\d{3,4})?/, \"$1 $2 $3 $4\").trim();\n }\n\n // Default to US format if no country code\n return formatUSPhone(phone);\n};\n\n/**\n * Format phone number with basic formatting\n */\nexport const formatPhoneNumber = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Try to detect if it's international\n if (phone.startsWith(\"+\") || phone.length > 11) {\n return formatInternationalPhone(phone);\n }\n\n return formatUSPhone(phone);\n};\n\n/**\n * Format phone according to PhoneFormat specification\n */\nexport const formatPhone = (value: FieldValue, format: PhoneFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const phoneStr = String(value);\n\n if (format.international) {\n return formatInternationalPhone(phoneStr);\n }\n\n // Handle specific country formats if needed\n switch (format.country) {\n case \"US\":\n case \"CA\":\n return formatUSPhone(phoneStr);\n default:\n return formatPhoneNumber(phoneStr);\n }\n};\n\n// Register formatters\nFormatRegistry.register(\"phoneNumber\", (value) => {\n if (typeof value === \"string\") {\n return formatPhoneNumber(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"usPhone\", (value) => {\n if (typeof value === \"string\") {\n return formatUSPhone(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"internationalPhone\", (value) => {\n if (typeof value === \"string\") {\n return formatInternationalPhone(value);\n }\n return null;\n});\n","/**\n * Power formatting utilities (rate of energy transfer)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, PowerFormat } from \"./types\";\n\n/**\n * Format as Watts\n */\nexport const toWatts = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return decimals === 0 ? `${Math.round(value)} W` : `${value.toFixed(decimals)} W`;\n};\n\n/**\n * Format as kilowatts\n */\nexport const toKilowatts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kW`;\n};\n\n/**\n * Format as megawatts\n */\nexport const toMegawatts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MW`;\n};\n\n/**\n * Format as gigawatts\n */\nexport const toGigawatts = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000_000).toFixed(decimals)} GW`;\n};\n\n/**\n * Auto-scale power to the most appropriate unit\n */\nexport const autoScalePower = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000_000) {\n return toGigawatts(value, decimals ?? 2);\n } else if (absValue >= 1_000_000) {\n return toMegawatts(value, decimals ?? 1);\n } else if (absValue >= 1000) {\n return toKilowatts(value, decimals ?? 1);\n } else {\n return toWatts(value, decimals ?? 0);\n }\n};\n\n/**\n * Format power according to PowerFormat specification\n */\nexport const formatPower = (value: FieldValue, format: PowerFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"GW\":\n return toGigawatts(numValue, decimals ?? 2);\n case \"MW\":\n return toMegawatts(numValue, decimals ?? 1);\n case \"kW\":\n return toKilowatts(numValue, decimals ?? 1);\n case \"W\":\n return toWatts(numValue, decimals ?? 0);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScalePower(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base watts\n return toWatts(numValue, decimals ?? 0);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"power\", formatPower as any);\n\n// Convenience exports with shorter names\nexport const toW = toWatts;\nexport const toKW = toKilowatts;\nexport const toMW = toMegawatts;\nexport const toGW = toGigawatts;\n","/**\n * Electrical resistance formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, ResistanceFormat } from \"./types\";\n\n/**\n * Format as milliohms\n */\nexport const toMilliohms = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n const mOhms = value * 1000;\n return `${mOhms.toFixed(decimals)} mΩ`;\n};\n\n/**\n * Format as ohms\n */\nexport const toOhms = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} Ω`;\n};\n\n/**\n * Format as kilohms\n */\nexport const toKilohms = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kΩ`;\n};\n\n/**\n * Format as megohms\n */\nexport const toMegohms = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MΩ`;\n};\n\n/**\n * Auto-scale resistance to the most appropriate unit\n */\nexport const autoScaleResistance = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000) {\n return toMegohms(value, decimals ?? 2);\n } else if (absValue >= 1000) {\n return toKilohms(value, decimals ?? 1);\n } else if (absValue < 1) {\n return toMilliohms(value, decimals ?? 1);\n } else {\n return toOhms(value, decimals ?? 1);\n }\n};\n\n/**\n * Format resistance according to ResistanceFormat specification\n */\nexport const formatResistance = (value: FieldValue, format: ResistanceFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"MΩ\":\n return toMegohms(numValue, decimals ?? 2);\n case \"kΩ\":\n return toKilohms(numValue, decimals ?? 1);\n case \"mΩ\":\n return toMilliohms(numValue, decimals ?? 1);\n case \"Ω\":\n return toOhms(numValue, decimals ?? 1);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleResistance(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base ohms\n return toOhms(numValue, decimals ?? 1);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"resistance\", formatResistance as any);\n\n// Register legacy shortcuts\nFormatRegistry.register(\"ohms\", (value) => {\n if (typeof value === \"number\") return toOhms(value);\n return null;\n});\n\nFormatRegistry.register(\"milliohms\", (value) => {\n if (typeof value === \"number\") return toMilliohms(value);\n return null;\n});\n","/**\n * Temperature formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type {\n FieldValue,\n FormattedValue,\n TemperatureFormat,\n TemperatureUnit,\n TemperatureUnitString,\n} from \"./types\";\n\n/**\n * Convert temperature unit string to symbol\n */\nexport const temperatureStringToSymbol = (unit: TemperatureUnitString): TemperatureUnit => {\n switch (unit) {\n case \"FAHRENHEIT\":\n return \"F\";\n case \"CELSIUS\":\n return \"C\";\n case \"KELVIN\":\n return \"K\";\n default:\n return \"F\";\n }\n};\n\n/**\n * Format as Fahrenheit\n */\nexport const toFahrenheit = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)}°F`;\n};\n\n/**\n * Format as Celsius\n */\nexport const toCelsius = (\n value: number | null | undefined,\n fromFahrenheit: boolean = true,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const celsius = fromFahrenheit ? (value - 32) * (5 / 9) : value;\n return `${celsius.toFixed(decimals)}°C`;\n};\n\n/**\n * Format as Kelvin\n */\nexport const toKelvin = (\n value: number | null | undefined,\n fromFahrenheit: boolean = true,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const kelvin = fromFahrenheit ? (value - 32) * (5 / 9) + 273.15 : value + 273.15;\n return `${kelvin.toFixed(decimals)}K`;\n};\n\n/**\n * Convert Celsius to Fahrenheit\n */\nexport const celsiusToFahrenheit = (celsius: number): number => {\n return (celsius * 9) / 5 + 32;\n};\n\n/**\n * Convert Fahrenheit to Celsius\n */\nexport const fahrenheitToCelsius = (fahrenheit: number): number => {\n return (fahrenheit - 32) * (5 / 9);\n};\n\n/**\n * Convert Celsius to Kelvin\n */\nexport const celsiusToKelvin = (celsius: number): number => {\n return celsius + 273.15;\n};\n\n/**\n * Convert Kelvin to Celsius\n */\nexport const kelvinToCelsius = (kelvin: number): number => {\n return kelvin - 273.15;\n};\n\n/**\n * Convert Fahrenheit to Kelvin\n */\nexport const fahrenheitToKelvin = (fahrenheit: number): number => {\n return fahrenheitToCelsius(fahrenheit) + 273.15;\n};\n\n/**\n * Convert Kelvin to Fahrenheit\n */\nexport const kelvinToFahrenheit = (kelvin: number): number => {\n return celsiusToFahrenheit(kelvinToCelsius(kelvin));\n};\n\n/**\n * Format temperature with specified unit\n */\nexport const toTemperature = (\n value: number | null | undefined,\n unit: TemperatureUnit | TemperatureUnitString = \"F\",\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n\n const normalizedUnit =\n typeof unit === \"string\" && unit.length > 1\n ? temperatureStringToSymbol(unit as TemperatureUnitString)\n : (unit as TemperatureUnit);\n\n switch (normalizedUnit) {\n case \"C\":\n return toCelsius(value, true, decimals);\n case \"K\":\n return toKelvin(value, true, decimals);\n case \"F\":\n default:\n return toFahrenheit(value, decimals);\n }\n};\n\n/**\n * Format temperature according to TemperatureFormat specification\n */\nexport const formatTemperature = (value: FieldValue, format: TemperatureFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 0;\n const unit = format.unit ?? \"F\";\n\n if (format.showUnit === false) {\n const normalizedUnit =\n typeof unit === \"string\" && unit.length > 1\n ? temperatureStringToSymbol(unit as TemperatureUnitString)\n : (unit as TemperatureUnit);\n\n switch (normalizedUnit) {\n case \"C\": {\n const celsius = (numValue - 32) * (5 / 9);\n return celsius.toFixed(decimals);\n }\n case \"K\": {\n const kelvin = (numValue - 32) * (5 / 9) + 273.15;\n return kelvin.toFixed(decimals);\n }\n case \"F\":\n default:\n return numValue.toFixed(decimals);\n }\n }\n\n return toTemperature(numValue, unit, decimals);\n};\n\n// Register temperature formatters\nFormatRegistry.register(\"temperature\", (value, unit, decimals) => {\n if (typeof value === \"number\") {\n return toTemperature(\n value,\n typeof unit === \"string\" ? (unit as TemperatureUnit | TemperatureUnitString) : \"F\",\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"fahrenheit\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFahrenheit(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"celsius\", (value, fromFahrenheit, decimals) => {\n if (typeof value === \"number\") {\n return toCelsius(\n value,\n typeof fromFahrenheit === \"boolean\" ? fromFahrenheit : true,\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"kelvin\", (value, fromFahrenheit, decimals) => {\n if (typeof value === \"number\") {\n return toKelvin(\n value,\n typeof fromFahrenheit === \"boolean\" ? fromFahrenheit : true,\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n","/**\n * Text formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, TextFormat } from \"./types\";\n\n/**\n * Check if a value should be hidden based on format rules\n */\nconst shouldHideValue = (\n value: FieldValue,\n format: { hideWhenNull?: boolean; hideWhenZero?: boolean }\n): boolean => {\n if (format.hideWhenNull && (value === null || value === undefined)) {\n return true;\n }\n if (format.hideWhenZero && value === 0) {\n return true;\n }\n return false;\n};\n\n/**\n * Convert text to uppercase\n */\nexport const toUpperCase = (text: string | null | undefined): string => {\n return text?.toUpperCase() ?? \"\";\n};\n\n/**\n * Convert text to lowercase\n */\nexport const toLowerCase = (text: string | null | undefined): string => {\n return text?.toLowerCase() ?? \"\";\n};\n\n/**\n * Convert text to sentence case\n */\nexport const toSentenceCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n};\n\n/**\n * Convert text to title case\n */\nexport const toTitleCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n const articles = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"and\",\n \"but\",\n \"or\",\n \"for\",\n \"nor\",\n \"on\",\n \"at\",\n \"of\",\n \"to\",\n \"with\",\n \"in\",\n \"as\",\n \"by\",\n ]);\n\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n articles.has(word) && index !== 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n};\n\n/**\n * Capitalize first letter of each word\n */\nexport const capitalize = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n\n/**\n * Uppercase first letter only\n */\nexport const ucFirst = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text.charAt(0).toUpperCase() + text.slice(1);\n};\n\n/**\n * Convert camelCase to words\n */\nexport const camelCaseToWords = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n};\n\n/**\n * Convert snake_case to words\n */\nexport const snakeCaseToWords = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .split(\"_\")\n .map((word) => ucFirst(word))\n .join(\" \");\n};\n\n/**\n * Convert enum-style text to sentence case\n */\nexport const enumToSentenceCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n\n // Handle snake_case\n if (text.includes(\"_\")) {\n return snakeCaseToWords(text);\n }\n\n // Handle SCREAMING_CASE\n if (text.toUpperCase() === text) {\n return ucFirst(text.toLowerCase());\n }\n\n // Handle camelCase\n return camelCaseToWords(text);\n};\n\n/**\n * Truncate text in the middle\n */\nexport const truncateMiddle = (value: string | null | undefined, length: number = 16): string => {\n if (!value) return \"\";\n\n // Handle invalid length\n if (length < 5) return value;\n\n // Handle case where specified length is longer than string\n if (value.length <= length) return value;\n\n const totalChars = length - 3; // Account for ...\n const leadingChars = Math.ceil(totalChars / 2);\n const trailingChars = Math.floor(totalChars / 2);\n\n return `${value.slice(0, leadingChars)}...${value.slice(-trailingChars)}`;\n};\n\n/**\n * Truncate text at the start\n */\nexport const truncateStart = (value: string | null | undefined, length: number = 8): string => {\n if (!value) return \"\";\n if (value.length <= length) return value;\n return `...${value.slice(-length)}`;\n};\n\n/**\n * Truncate text at the end\n */\nexport const truncateEnd = (\n value: string | null | undefined,\n length: number = 16,\n ellipsis: string = \"...\"\n): string => {\n if (!value) return \"\";\n if (value.length <= length) return value;\n return value.slice(0, length) + ellipsis;\n};\n\n/**\n * Mask sensitive text (e.g., secrets, API keys)\n */\nexport const toSecret = (value: string | null | undefined): string => {\n if (!value) return \"\";\n const str = value.toString();\n const lastFour = str.slice(-4);\n const maskedLength = str.length - 4;\n return maskedLength > 0 ? \"*\".repeat(maskedLength) + lastFour : str;\n};\n\n/**\n * Format text according to TextFormat specification\n */\nexport const formatText = (value: FieldValue, format: TextFormat): FormattedValue => {\n if (shouldHideValue(value, format)) return null;\n if (value == null) return format.nullText ?? null;\n\n let formatted = String(value);\n\n // Apply transforms\n if (format.transform) {\n const transforms = Array.isArray(format.transform) ? format.transform : [format.transform];\n\n transforms.forEach((transform) => {\n switch (transform) {\n case \"uppercase\":\n formatted = toUpperCase(formatted);\n break;\n case \"lowercase\":\n formatted = toLowerCase(formatted);\n break;\n case \"capitalize\":\n formatted = capitalize(formatted);\n break;\n case \"titleCase\":\n formatted = toTitleCase(formatted);\n break;\n case \"sentenceCase\":\n formatted = toSentenceCase(formatted);\n break;\n }\n });\n }\n\n // Apply truncation\n if (format.truncate) {\n const { length, position, ellipsis = \"...\" } = format.truncate;\n switch (position) {\n case \"start\":\n formatted = truncateStart(formatted, length);\n break;\n case \"middle\":\n formatted = truncateMiddle(formatted, length);\n break;\n case \"end\":\n formatted = truncateEnd(formatted, length, ellipsis);\n break;\n }\n }\n\n return formatted;\n};\n\n// Register text formatters\nFormatRegistry.register(\"uppercase\", (value) => toUpperCase(String(value)));\nFormatRegistry.register(\"lowercase\", (value) => toLowerCase(String(value)));\nFormatRegistry.register(\"sentenceCase\", (value) => toSentenceCase(String(value)));\nFormatRegistry.register(\"titleCase\", (value) => toTitleCase(String(value)));\nFormatRegistry.register(\"capitalize\", (value) => capitalize(String(value)));\nFormatRegistry.register(\"camelCaseToWords\", (value) => camelCaseToWords(String(value)));\nFormatRegistry.register(\"snakeCaseToWords\", (value) => snakeCaseToWords(String(value)));\nFormatRegistry.register(\"enumToSentenceCase\", (value) => enumToSentenceCase(String(value)));\nFormatRegistry.register(\"truncateMiddle\", (value, length) =>\n truncateMiddle(String(value), typeof length === \"number\" ? length : 16)\n);\nFormatRegistry.register(\"truncateStart\", (value, length) =>\n truncateStart(String(value), typeof length === \"number\" ? length : 8)\n);\nFormatRegistry.register(\"truncateEnd\", (value, length, ellipsis) =>\n truncateEnd(\n String(value),\n typeof length === \"number\" ? length : 16,\n typeof ellipsis === \"string\" ? ellipsis : \"...\"\n )\n);\nFormatRegistry.register(\"secret\", (value) => toSecret(String(value)));\n","/**\n * Voltage formatting utilities (electrical potential)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, VoltageFormat } from \"./types\";\n\n/**\n * Format as millivolts\n */\nexport const toMillivolts = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const mV = value * 1000;\n return decimals === 0 ? `${Math.round(mV)} mV` : `${mV.toFixed(decimals)} mV`;\n};\n\n/**\n * Format as volts\n */\nexport const toVolts = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return decimals === 0 ? `${Math.round(value)} V` : `${value.toFixed(decimals)} V`;\n};\n\n/**\n * Format as kilovolts\n */\nexport const toKilovolts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kV`;\n};\n\n/**\n * Auto-scale voltage to the most appropriate unit\n */\nexport const autoScaleVoltage = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1000) {\n return toKilovolts(value, decimals ?? 1);\n } else if (absValue < 1) {\n return toMillivolts(value, decimals ?? 0);\n } else {\n return toVolts(value, decimals ?? 0);\n }\n};\n\n/**\n * Format voltage according to VoltageFormat specification\n */\nexport const formatVoltage = (value: FieldValue, format: VoltageFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"kV\":\n return toKilovolts(numValue, decimals ?? 1);\n case \"mV\":\n return toMillivolts(numValue, decimals ?? 0);\n case \"V\":\n return toVolts(numValue, decimals ?? 0);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleVoltage(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base volts\n return toVolts(numValue, decimals ?? 0);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"voltage\", formatVoltage as any);\n\n// Convenience exports with shorter names\nexport const toMV = toMillivolts;\nexport const toV = toVolts;\nexport const toKV = toKilovolts;\n","/**\n * Comprehensive formatting utilities for the Edges design system\n *\n * This module provides a unified formatting system with support for:\n * - Text formatting (case conversion, truncation, etc.)\n * - Number formatting (decimals, thousands separators, compact notation)\n * - Currency formatting (multiple currencies and display options)\n * - Date formatting (relative time, custom formats, timezones)\n * - Boolean formatting (custom true/false text)\n * - Energy units (Wh, kWh, MWh, GWh with auto-scaling)\n * - Temperature units (Celsius, Fahrenheit, Kelvin)\n * - Distance units (meters, kilometers, miles, feet)\n * - Phone number formatting (US and international)\n * - Custom formatters via the FormatRegistry\n */\n\nexport * from \"./boolean\";\nexport * from \"./component-formatter\";\nexport * from \"./current\";\nexport * from \"./date\";\nexport * from \"./distance\";\nexport * from \"./energy\";\nexport * from \"./number\";\nexport * from \"./phone\";\nexport * from \"./power\";\n// Export the registry\nexport { FormatRegistry } from \"./registry\";\nexport * from \"./resistance\";\nexport * from \"./temperature\";\n// Export all formatting utilities\nexport * from \"./text\";\n// Export all types\nexport * from \"./types\";\nexport * from \"./voltage\";\n\nimport { formatBoolean } from \"./boolean\";\nimport { formatCurrent } from \"./current\";\nimport { formatDate } from \"./date\";\nimport { formatDistance } from \"./distance\";\nimport { formatEnergy } from \"./energy\";\nimport { formatCurrency, formatNumber } from \"./number\";\nimport { formatPhone } from \"./phone\";\nimport { formatPower } from \"./power\";\nimport { formatResistance } from \"./resistance\";\nimport { formatTemperature } from \"./temperature\";\nimport { formatText } from \"./text\";\n// Import types for the main formatting function\nimport type { CustomFormat, FieldFormat, FieldValue, FormattedValue } from \"./types\";\nimport { formatVoltage } from \"./voltage\";\n\n/**\n * Main formatting function that routes to the appropriate formatter\n * based on the format type\n *\n * @param value - The value to format\n * @param format - The format specification\n * @returns The formatted value or null\n *\n * @example\n * ```typescript\n * // Format as currency\n * formatFieldValue(1234.56, { type: \"currency\", currency: \"USD\" })\n * // Returns: \"$1,234.56\"\n *\n * // Format as relative time\n * formatFieldValue(new Date(), { type: \"date\", relative: true })\n * // Returns: \"just now\"\n *\n * // Format with custom formatter\n * formatFieldValue(\"hello\", {\n * type: \"custom\",\n * formatter: (val) => String(val).toUpperCase()\n * })\n * // Returns: \"HELLO\"\n * ```\n */\nexport const formatFieldValue = (value: FieldValue, format: FieldFormat): FormattedValue => {\n switch (format.type) {\n case \"text\":\n return formatText(value, format);\n case \"number\":\n return formatNumber(value, format);\n case \"currency\":\n return formatCurrency(value, format);\n case \"date\":\n return formatDate(value, format);\n case \"boolean\":\n return formatBoolean(value, format);\n case \"energy\":\n return formatEnergy(value, format);\n case \"power\":\n return formatPower(value, format);\n case \"voltage\":\n return formatVoltage(value, format);\n case \"current\":\n return formatCurrent(value, format);\n case \"resistance\":\n return formatResistance(value, format);\n case \"temperature\":\n return formatTemperature(value, format);\n case \"distance\":\n return formatDistance(value, format);\n case \"phone\":\n return formatPhone(value, format);\n case \"custom\": {\n const customFormat = format as CustomFormat;\n if (customFormat.hideWhenNull && (value === null || value === undefined)) {\n return null;\n }\n if (value == null) return customFormat.nullText ?? null;\n return customFormat.formatter(value, customFormat.options);\n }\n default:\n // Fallback to string conversion\n return value != null ? String(value) : null;\n }\n};\n\n/**\n * Convenience function to create a format object\n *\n * @example\n * ```typescript\n * const currencyFormat = createFormat(\"currency\", { currency: \"EUR\" });\n * const dateFormat = createFormat(\"date\", { relative: true });\n * ```\n */\nexport const createFormat = <T extends FieldFormat[\"type\"]>(\n type: T,\n options?: Omit<Extract<FieldFormat, { type: T }>, \"type\">\n): Extract<FieldFormat, { type: T }> => {\n return { type, ...options } as Extract<FieldFormat, { type: T }>;\n};\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 - A wrapper around Phosphor icons that provides:\n * - Access to ALL Phosphor icons without maintaining an allow list\n * - Tree-shaking support (icons are only included if used)\n * - Consistent sizing and theming\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","\"use client\";\nimport { ReactNode } from \"react\";\nimport type { MenuItemProps } from \"react-aria-components\";\nimport { Menu, MenuItem, MenuTrigger, Popover } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface ActionItem {\n /**\n * Unique identifier for the action\n */\n id: number | string;\n /**\n * Display name for the action\n */\n name: string;\n /**\n * Visual variant of the action\n */\n variant?: \"default\" | \"destructive\";\n /**\n * Icon to display with the action\n */\n iconName?: IconName;\n /**\n * Whether the action is disabled\n */\n disabled?: boolean;\n /**\n * Handler for when the action is selected\n */\n onAction?: () => void;\n /**\n * Test ID for testing\n */\n testId?: string;\n}\n\nexport interface ActionMenuProps {\n /**\n * List of actions to display\n */\n items: ActionItem[];\n /**\n * Trigger button component\n */\n children: ReactNode;\n /**\n * Alignment of the popover\n * @default \"left\"\n */\n align?: \"left\" | \"right\";\n /**\n * Size of menu items\n * @default \"md\"\n */\n size?: \"sm\" | \"md\";\n /**\n * Text alignment within menu items\n * @default \"left\"\n */\n textAlign?: \"left\" | \"right\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Global action handler (called if item doesn't have its own onAction)\n */\n onAction?: (item: ActionItem) => void;\n}\n\n/**\n * ActionMenu\n *\n * A dropdown menu for actions, typically triggered by a button.\n * Supports icons, destructive actions, and flexible alignment.\n */\nexport function ActionMenu({\n children,\n items,\n className,\n align = \"left\",\n textAlign = \"left\",\n size = \"md\",\n onAction,\n}: ActionMenuProps) {\n return (\n <div className={className}>\n <MenuTrigger>\n {children}\n <Popover\n className={twMerge(\n \"w-fit min-w-[180px] overflow-auto rounded-md border border-border-default\",\n \"bg-background-surface p-1 shadow-lg\",\n \"entering:animate-in entering:fade-in entering:zoom-in-95\",\n \"exiting:animate-out exiting:fade-out exiting:zoom-out-95\"\n )}\n placement={align === \"right\" ? \"bottom end\" : \"bottom start\"}\n >\n <Menu className=\"outline-none\">\n {items.map((item) => (\n <ActionMenuItem\n key={item.id}\n id={item.id}\n onAction={() => item.onAction?.() || onAction?.(item)}\n textAlign={textAlign}\n size={size}\n iconName={item.iconName}\n isDisabled={item.disabled}\n variant={item.variant}\n data-testid={item.testId}\n >\n {item.name}\n </ActionMenuItem>\n ))}\n </Menu>\n </Popover>\n </MenuTrigger>\n </div>\n );\n}\n\ninterface ActionMenuItemProps extends Omit<MenuItemProps, \"children\"> {\n children: ReactNode;\n textAlign?: \"left\" | \"right\";\n size?: \"sm\" | \"md\";\n iconName?: IconName;\n variant?: \"default\" | \"destructive\";\n}\n\nfunction ActionMenuItem({\n textAlign = \"left\",\n iconName,\n size = \"md\",\n isDisabled,\n children,\n variant = \"default\",\n ...props\n}: ActionMenuItemProps) {\n const sizeClasses = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n };\n\n const variantClasses = {\n default: \"text-text-body hover:bg-background-hover focus:bg-background-hover\",\n destructive:\n \"text-feedback-error-text hover:bg-feedback-error-background focus:bg-feedback-error-background\",\n };\n\n return (\n <MenuItem\n {...props}\n isDisabled={isDisabled}\n className={twMerge(\n \"group box-border flex w-full cursor-pointer items-center rounded-sm outline-none transition-colors\",\n sizeClasses[size],\n variantClasses[variant],\n textAlign === \"right\" ? \"justify-end\" : \"justify-start\",\n isDisabled && \"pointer-events-none opacity-50\"\n )}\n >\n {iconName && textAlign === \"left\" && (\n <Icon name={iconName} size={size === \"sm\" ? 16 : 20} className=\"mr-2 flex-shrink-0\" />\n )}\n <span className=\"flex-1\">{children}</span>\n {iconName && textAlign === \"right\" && (\n <Icon name={iconName} size={size === \"sm\" ? 16 : 20} className=\"ml-2 flex-shrink-0\" />\n )}\n </MenuItem>\n );\n}\n","export interface LogoProps {\n className?: string;\n showWordmark?: boolean;\n width?: number;\n fill?: string;\n}\n\nexport const Logo = ({ className, showWordmark = true, width, fill }: LogoProps) => {\n // Support both fill prop and className for backward compatibility\n // Priority: fill prop > className > default (theme-aware text color)\n\n // Determine the fill value\n let fillValue: string | undefined;\n let fillClass: string | undefined;\n\n if (fill) {\n // If fill starts with \"fill-\", it's a Tailwind class\n if (fill.startsWith(\"fill-\")) {\n fillClass = fill;\n } else {\n // Otherwise, use it as a direct fill value\n fillValue = fill;\n }\n } else if (className) {\n // Use className if provided\n fillClass = className;\n } else {\n // Default to theme-aware text color using CSS variable\n fillValue = \"var(--color-text-body)\";\n }\n\n if (showWordmark) {\n const logoWidth = width || 270;\n const logoHeight = (logoWidth / 270) * 80; // Maintain aspect ratio\n\n return (\n <svg\n width={logoWidth}\n height={logoHeight}\n viewBox=\"0 0 270 80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={fillClass}\n style={fillValue ? { fill: fillValue } : undefined}\n >\n <g clipPath=\"url(#clip0_796_283)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.223654 20.2934C0.417233 19.8234 0.873598 19.517 1.37984 19.517H20.5909C21.282 19.517 21.8422 20.0798 21.8422 20.774V40.049C21.8422 40.5572 21.5375 41.0155 21.0702 41.2102C20.6028 41.405 20.0647 41.2977 19.7067 40.9385L0.495628 21.6635C0.137428 21.3041 0.030075 20.7633 0.223654 20.2934ZM4.40349 22.0311L19.3396 37.017V22.0311H4.40349Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 20.2934C38.8394 19.8234 39.2958 19.517 39.802 19.517H59.013C59.7041 19.517 60.2642 20.0798 60.2642 20.774V40.049C60.2642 40.5572 59.9597 41.0155 59.4923 41.2102C59.025 41.405 58.4867 41.2977 58.1289 40.9385L38.9178 21.6635C38.5595 21.3041 38.4522 20.7633 38.6458 20.2934ZM42.8255 22.0311L57.7618 37.017V22.0311H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4347 58.8447C19.6283 58.3747 20.0847 58.0685 20.5909 58.0685H39.802C40.493 58.0685 41.0532 58.6312 41.0532 59.3255V78.6005C41.0532 79.1087 40.7486 79.567 40.2813 79.7617C39.8139 79.9562 39.2757 79.849 38.9178 79.49L19.7067 60.215C19.3485 59.8555 19.2411 59.3147 19.4347 58.8447ZM23.6146 60.5825L38.5508 75.5682V60.5825H23.6146Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 58.1643C39.79 57.9695 40.3283 58.0768 40.6861 58.436L59.8972 77.711C60.2555 78.0703 60.3628 78.6113 60.1692 79.081C59.9756 79.551 59.5192 79.8575 59.013 79.8575H39.802C39.1109 79.8575 38.5508 79.2948 38.5508 78.6005V59.3255C38.5508 58.8173 38.8554 58.359 39.3227 58.1643ZM41.0532 62.3575V77.3433H55.9893L41.0532 62.3575Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 19.6129C39.79 19.4182 40.3283 19.5254 40.6861 19.8846L59.8972 39.1595C60.2555 39.519 60.3628 40.0598 60.1692 40.5298C59.9756 40.9995 59.5192 41.306 59.013 41.306H39.802C39.1109 41.306 38.5508 40.7433 38.5508 40.049V20.7741C38.5508 20.2658 38.8554 19.8075 39.3227 19.6129ZM41.0532 23.8061V38.792H55.9893L41.0532 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 38.8885C39.79 38.694 40.3283 38.8012 40.6861 39.1602L59.8972 58.4352C60.2555 58.7945 60.3628 59.3355 60.1692 59.8055C59.9756 60.2752 59.5192 60.5817 59.013 60.5817H39.802C39.1109 60.5817 38.5508 60.019 38.5508 59.3247V40.0497C38.5508 39.5415 38.8554 39.0832 39.3227 38.8885ZM41.0532 43.0817V58.0675H55.9893L41.0532 43.0817Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 39.569C38.8394 39.0992 39.2958 38.7927 39.802 38.7927H59.013C59.7041 38.7927 60.2642 39.3555 60.2642 40.0497V59.3247C60.2642 59.833 59.9597 60.2912 59.4923 60.486C59.025 60.6805 58.4867 60.5732 58.1289 60.2142L38.9178 40.9392C38.5595 40.5797 38.4522 40.039 38.6458 39.569ZM42.8255 41.3067L57.7618 56.2927V41.3067H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 58.8447C38.8394 58.3747 39.2958 58.0685 39.802 58.0685H59.013C59.7041 58.0685 60.2642 58.6312 60.2642 59.3255V78.6005C60.2642 79.1087 59.9597 79.567 59.4923 79.7617C59.025 79.9562 58.4867 79.849 58.1289 79.49L38.9178 60.215C38.5595 59.8555 38.4522 59.3147 38.6458 58.8447ZM42.8255 60.5825L57.7618 75.5682V60.5825H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 19.6129C59.0011 19.4182 59.5394 19.5254 59.8972 19.8846L79.1083 39.1595C79.4666 39.519 79.5739 40.0598 79.3803 40.5298C79.1867 40.9995 78.7303 41.306 78.2241 41.306H59.013C58.322 41.306 57.7618 40.7433 57.7618 40.049V20.7741C57.7618 20.2658 58.0664 19.8075 58.5338 19.6129ZM60.2643 23.8061V38.792H75.2006L60.2643 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 0.338803C59.0011 0.144135 59.5394 0.251385 59.8972 0.610565L79.1083 19.8855C79.4666 20.2449 79.5739 20.7857 79.3803 21.2556C79.1867 21.7256 78.7303 22.032 78.2241 22.032H59.013C58.322 22.032 57.7618 21.4692 57.7618 20.775V1.50003C57.7618 0.99174 58.0664 0.533468 58.5338 0.338803ZM60.2643 4.53208V19.5179H75.2006L60.2643 4.53208Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M57.8569 20.2934C58.0505 19.8234 58.5069 19.517 59.013 19.517H78.2241C78.9151 19.517 79.4753 20.0798 79.4753 20.774V40.049C79.4753 40.5572 79.1707 41.0155 78.7034 41.2102C78.236 41.405 77.6978 41.2977 77.3399 40.9385L58.1289 21.6635C57.7705 21.3041 57.6633 20.7633 57.8569 20.2934ZM62.0365 22.0311L76.9729 37.017V22.0311H62.0365Z\"\n />\n <path d=\"M269.838 49.4457H249.005C249.266 51.801 250.162 53.6985 251.695 55.1377C253.225 56.577 255.134 57.2967 257.416 57.2967C259.307 57.2967 260.887 56.8715 262.159 56.021C263.463 55.1377 264.408 53.9927 264.996 52.5862H269.251C268.502 54.9415 267.084 56.937 264.996 58.5725C262.943 60.208 260.414 61.026 257.416 61.026C255.069 61.026 252.917 60.4697 250.961 59.3575C249.037 58.2127 247.504 56.6587 246.363 54.696C245.255 52.7332 244.7 50.558 244.7 48.17C244.7 45.782 245.255 43.6067 246.363 41.644C247.504 39.6812 249.037 38.1437 250.961 37.0315C252.917 35.8867 255.069 35.3142 257.416 35.3142C259.73 35.3142 261.833 35.8702 263.724 36.9825C265.615 38.0947 267.098 39.6485 268.176 41.644C269.283 43.6395 269.838 45.913 269.838 48.4645V49.4457ZM257.416 39.0432C255.263 39.0432 253.439 39.6812 251.939 40.957C250.47 42.2327 249.542 43.9337 249.152 46.06H265.583C265.192 43.9992 264.262 42.3145 262.796 41.006C261.36 39.6975 259.568 39.0432 257.416 39.0432Z\" />\n <path d=\"M228.356 60.5352V35.8049H232.219V39.7794H232.464C233.05 38.5689 233.963 37.5712 235.202 36.7862C236.474 35.9684 237.974 35.5594 239.701 35.5594H243.125V39.4359H239.701C237.517 39.4359 235.757 40.1554 234.42 41.5949C233.083 43.0342 232.414 44.9152 232.414 47.2377V60.5352H228.356Z\" />\n <path d=\"M208.607 61.0259C205.64 61.0259 203.326 60.1262 201.663 58.3272C200 56.4952 199.169 53.8947 199.169 50.5252V35.8047H203.228V49.8874C203.228 52.2427 203.766 54.0744 204.842 55.3829C205.95 56.6587 207.532 57.2967 209.586 57.2967C211.02 57.2967 212.308 56.9694 213.449 56.3152C214.623 55.6284 215.536 54.6959 216.188 53.5184C216.84 52.3407 217.166 50.9997 217.166 49.4949V35.8047H221.225V60.5352H217.313V56.5607H217.068C216.286 57.9019 215.161 58.9814 213.694 59.7992C212.226 60.6169 210.531 61.0259 208.607 61.0259Z\" />\n <path d=\"M186.736 39.534V56.806H194.756V60.5352H182.677V39.534H177.199V35.8047H182.677V29.5732H186.736V35.8047H193.24V39.534H186.736Z\" />\n <path d=\"M156.585 60.5352H151.988L158.394 48.0227L152.33 35.8047H156.976L162.062 46.0599H165.388L170.474 35.8047H175.022L168.958 48.0227L175.365 60.5352H170.67L165.29 49.7892H162.013L156.585 60.5352Z\" />\n <path d=\"M150.138 49.1315H129.304C129.565 51.4867 130.461 53.3842 131.994 54.8235C133.526 56.2627 135.433 56.9825 137.715 56.9825C139.606 56.9825 141.188 56.5572 142.459 55.7067C143.763 54.8235 144.709 53.6785 145.296 52.272H149.551C148.801 54.6272 147.382 56.6227 145.296 58.2582C143.242 59.8937 140.715 60.7118 137.715 60.7118C135.368 60.7118 133.216 60.1555 131.26 59.0432C129.336 57.8985 127.804 56.3445 126.663 54.3817C125.554 52.419 125 50.2437 125 47.8557C125 45.4677 125.554 43.2925 126.663 41.3298C127.804 39.367 129.336 37.8295 131.26 36.7173C133.216 35.5725 135.368 35 137.715 35C140.03 35 142.133 35.556 144.024 36.6682C145.915 37.7805 147.399 39.3342 148.475 41.3298C149.583 43.3252 150.138 45.5987 150.138 48.1502V49.1315ZM137.715 38.729C135.564 38.729 133.738 39.367 132.238 40.6427C130.771 41.9185 129.842 43.6195 129.45 45.7458H145.883C145.491 43.685 144.562 42.0002 143.095 40.6917C141.661 39.3832 139.867 38.729 137.715 38.729Z\" />\n <path d=\"M116.961 60.5353H112.559V30.4072H101.164V26.1875H128.307V30.4072H116.961V60.5353Z\" />\n </g>\n <defs>\n <clipPath id=\"clip0_796_283\">\n <rect width=\"270\" height=\"80\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n // Logo only\n const logoWidth = width || 80;\n const logoHeight = logoWidth; // Square logo maintains 1:1 aspect ratio\n\n return (\n <svg\n width={logoWidth}\n height={logoHeight}\n viewBox=\"0 0 80 80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={fillClass}\n style={fillValue ? { fill: fillValue } : undefined}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.223654 20.2934C0.417233 19.8234 0.873598 19.517 1.37984 19.517H20.5909C21.282 19.517 21.8422 20.0798 21.8422 20.774V40.049C21.8422 40.5572 21.5375 41.0155 21.0702 41.2102C20.6028 41.405 20.0647 41.2977 19.7067 40.9385L0.495628 21.6635C0.137428 21.3041 0.030075 20.7633 0.223654 20.2934ZM4.40349 22.0311L19.3396 37.017V22.0311H4.40349Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 20.2934C38.8394 19.8234 39.2958 19.517 39.802 19.517H59.013C59.7041 19.517 60.2642 20.0798 60.2642 20.774V40.049C60.2642 40.5572 59.9597 41.0155 59.4923 41.2102C59.025 41.405 58.4867 41.2977 58.1289 40.9385L38.9178 21.6635C38.5595 21.3041 38.4522 20.7633 38.6458 20.2934ZM42.8255 22.0311L57.7618 37.017V22.0311H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4347 58.8447C19.6283 58.3747 20.0847 58.0685 20.5909 58.0685H39.802C40.493 58.0685 41.0532 58.6312 41.0532 59.3255V78.6005C41.0532 79.1087 40.7486 79.567 40.2813 79.7617C39.8139 79.9562 39.2757 79.849 38.9178 79.49L19.7067 60.215C19.3485 59.8555 19.2411 59.3147 19.4347 58.8447ZM23.6146 60.5825L38.5508 75.5682V60.5825H23.6146Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 58.1643C39.79 57.9695 40.3283 58.0768 40.6861 58.436L59.8972 77.711C60.2555 78.0703 60.3628 78.6113 60.1692 79.081C59.9756 79.551 59.5192 79.8575 59.013 79.8575H39.802C39.1109 79.8575 38.5508 79.2948 38.5508 78.6005V59.3255C38.5508 58.8173 38.8554 58.359 39.3227 58.1643ZM41.0532 62.3575V77.3433H55.9893L41.0532 62.3575Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 19.6129C39.79 19.4182 40.3283 19.5254 40.6861 19.8846L59.8972 39.1595C60.2555 39.519 60.3628 40.0598 60.1692 40.5298C59.9756 40.9995 59.5192 41.306 59.013 41.306H39.802C39.1109 41.306 38.5508 40.7433 38.5508 40.049V20.7741C38.5508 20.2658 38.8554 19.8075 39.3227 19.6129ZM41.0532 23.8061V38.792H55.9893L41.0532 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 38.8885C39.79 38.694 40.3283 38.8012 40.6861 39.1602L59.8972 58.4352C60.2555 58.7945 60.3628 59.3355 60.1692 59.8055C59.9756 60.2752 59.5192 60.5817 59.013 60.5817H39.802C39.1109 60.5817 38.5508 60.019 38.5508 59.3247V40.0497C38.5508 39.5415 38.8554 39.0832 39.3227 38.8885ZM41.0532 43.0817V58.0675H55.9893L41.0532 43.0817Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 39.569C38.8394 39.0992 39.2958 38.7927 39.802 38.7927H59.013C59.7041 38.7927 60.2642 39.3555 60.2642 40.0497V59.3247C60.2642 59.833 59.9597 60.2912 59.4923 60.486C59.025 60.6805 58.4867 60.5732 58.1289 60.2142L38.9178 40.9392C38.5595 40.5797 38.4522 40.039 38.6458 39.569ZM42.8255 41.3067L57.7618 56.2927V41.3067H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 58.8447C38.8394 58.3747 39.2958 58.0685 39.802 58.0685H59.013C59.7041 58.0685 60.2642 58.6312 60.2642 59.3255V78.6005C60.2642 79.1087 59.9597 79.567 59.4923 79.7617C59.025 79.9562 58.4867 79.849 58.1289 79.49L38.9178 60.215C38.5595 59.8555 38.4522 59.3147 38.6458 58.8447ZM42.8255 60.5825L57.7618 75.5682V60.5825H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 19.6129C59.0011 19.4182 59.5394 19.5254 59.8972 19.8846L79.1083 39.1595C79.4666 39.519 79.5739 40.0598 79.3803 40.5298C79.1867 40.9995 78.7303 41.306 78.2241 41.306H59.013C58.322 41.306 57.7618 40.7433 57.7618 40.049V20.7741C57.7618 20.2658 58.0664 19.8075 58.5338 19.6129ZM60.2643 23.8061V38.792H75.2006L60.2643 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 0.338803C59.0011 0.144135 59.5394 0.251385 59.8972 0.610565L79.1083 19.8855C79.4666 20.2449 79.5739 20.7857 79.3803 21.2556C79.1867 21.7256 78.7303 22.032 78.2241 22.032H59.013C58.322 22.032 57.7618 21.4692 57.7618 20.775V1.50003C57.7618 0.99174 58.0664 0.533468 58.5338 0.338803ZM60.2643 4.53208V19.5179H75.2006L60.2643 4.53208Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M57.8569 20.2934C58.0505 19.8234 58.5069 19.517 59.013 19.517H78.2241C78.9151 19.517 79.4753 20.0798 79.4753 20.774V40.049C79.4753 40.5572 79.1707 41.0155 78.7034 41.2102C78.236 41.405 77.6978 41.2977 77.3399 40.9385L58.1289 21.6635C57.7705 21.3041 57.6633 20.7633 57.8569 20.2934ZM62.0365 22.0311L76.9729 37.017V22.0311H62.0365Z\"\n />\n </svg>\n );\n};\n","import * as React from \"react\";\nimport { Logo } from \"../Logo\";\n// Remove Icon import to avoid client-only code - using emoji/text placeholders for now\n// import { Icon, type IconName } from \"../Icon\";\n\nexport type SideNavItem = {\n id: string;\n label: string;\n href?: string; // Optional - if not provided and has children, becomes a category\n icon?: React.ReactNode;\n isActive?: boolean;\n isExpanded?: boolean; // For categories with children\n children?: SideNavItem[]; // If present, this becomes a category\n};\n\nexport type SideNavSection = {\n id: string;\n title?: string; // Optional section title\n items: SideNavItem[];\n};\n\nexport type SideNavProps = {\n topItems?: SideNavItem[] | SideNavSection[]; // Union type for backward compatibility\n bottomItems?: SideNavItem[];\n logo?: React.ReactNode;\n showLogo?: boolean;\n linkComponent?: React.ElementType;\n className?: string;\n mobileMenuId?: string;\n sidebarCollapseId?: string;\n};\n\n/**\n * Isomorphic SideNav component\n * Works in both server and client components with CSS-only interactions\n */\nexport const SideNav: React.FC<SideNavProps> = ({\n topItems = [],\n bottomItems = [],\n logo,\n showLogo = true,\n linkComponent: LinkComponent = \"a\",\n className = \"\",\n mobileMenuId = \"app-mobile-menu\",\n sidebarCollapseId = \"app-sidebar-collapse\",\n}) => {\n // Helper function to determine if topItems is using the new section format\n const isSectionFormat = (items: SideNavItem[] | SideNavSection[]): items is SideNavSection[] => {\n return items.length > 0 && \"items\" in items[0];\n };\n\n // Helper function to normalize topItems to sections for consistent rendering\n const normalizeToSections = (items: SideNavItem[] | SideNavSection[]): SideNavSection[] => {\n if (isSectionFormat(items)) {\n return items;\n }\n // Convert plain items array to a single section\n return [{ id: \"default-section\", items: items }];\n };\n\n const renderSection = (\n section: SideNavSection,\n sectionIndex: number,\n totalSections: number\n ): React.ReactNode => {\n return (\n <div key={section.id} className=\"space-y-1\">\n {/* Optional section title */}\n {section.title && (\n <div\n className=\"px-6 py-2 text-xs font-medium text-text-subtle uppercase tracking-wider\"\n data-collapse-hide=\"\"\n >\n {section.title}\n </div>\n )}\n\n {/* Section items */}\n <div className=\"space-y-1\">{section.items.map((item) => renderNavItem(item))}</div>\n\n {/* Section separator - border between sections (but not after the last section) */}\n {sectionIndex < totalSections - 1 && (\n <div className=\"border-b border-border-subtle mx-6 my-4\" data-collapse-hide=\"\" />\n )}\n </div>\n );\n };\n\n const renderNavItem = (item: SideNavItem, isNested = false): React.ReactNode => {\n // If item has children, render as category\n if (item.children && item.children.length > 0) {\n const categoryId = `category-${item.id}`;\n return (\n <div key={item.id} className=\"group/category\">\n {/* Hidden checkbox for expand/collapse state */}\n <input\n type=\"checkbox\"\n id={categoryId}\n className=\"peer/category hidden\"\n defaultChecked={item.isExpanded}\n aria-hidden=\"true\"\n />\n\n {/* Category header - acts as label for checkbox */}\n <label\n htmlFor={categoryId}\n className=\"flex items-center gap-3 px-6 py-1 text-text-body hover:bg-background-hover hover:text-text-heading cursor-pointer transition-all duration-200\"\n data-collapse-center=\"\"\n >\n {item.icon && (\n <span className=\"flex-shrink-0 w-4 h-4 flex items-center justify-center transition-all duration-200\">\n {item.icon}\n </span>\n )}\n <span className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {item.label}\n </span>\n {/* Spacer to push chevron to the right */}\n <span className=\"flex-1\" data-collapse-hide=\"\" />\n {/* Chevron icon for expand/collapse */}\n <svg\n className=\"w-4 h-4 transform transition-transform duration-200 peer-checked/category:rotate-180 ml-auto\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-collapse-hide=\"\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </label>\n\n {/* Category children - hidden by default, shown when checkbox is checked */}\n <div\n className=\"hidden peer-checked/category:block bg-background-subtle border-l-2 border-border-subtle ml-6\"\n data-collapse-hide-category=\"\"\n >\n {item.children.map((child) => renderNavItem(child, true))}\n </div>\n </div>\n );\n }\n\n // Otherwise render as regular link\n const linkProps = {\n href: item.href || \"#\",\n className: `flex items-center gap-3 transition-all duration-200 hover:bg-background-hover ${\n isNested ? \"pl-8 pr-6 py-1 text-sm\" : \"px-6 py-1\"\n } ${\n item.isActive\n ? \"bg-action-primary-light text-action-primary border-l-2 border-action-primary\"\n : \"text-text-body hover:text-text-heading\"\n }`,\n \"aria-current\": item.isActive ? (\"page\" as const) : undefined,\n \"data-collapse-center\": !isNested ? \"\" : undefined,\n };\n\n const linkContent = (\n <>\n {item.icon && !isNested && (\n <span className=\"flex-shrink-0 w-4 h-4 flex items-center justify-center transition-all duration-200\">\n {item.icon}\n </span>\n )}\n <span className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {item.label}\n </span>\n </>\n );\n\n if (LinkComponent === \"a\") {\n return (\n <a key={item.id} {...linkProps}>\n {linkContent}\n </a>\n );\n }\n\n return (\n <LinkComponent key={item.id} {...linkProps}>\n {linkContent}\n </LinkComponent>\n );\n };\n\n return (\n <div className={`flex flex-col h-full ${className}`}>\n {/* Header with logo and collapse button */}\n <div className=\"flex items-center justify-between h-[60px] px-6 border-b border-border-default\">\n {showLogo && (\n <div className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {logo ? (\n // If custom logo is provided, use it\n logo\n ) : (\n // Otherwise use the default Logo component\n <Logo showWordmark={true} width={120} />\n )}\n </div>\n )}\n\n {/* Desktop collapse toggle */}\n <label\n htmlFor={sidebarCollapseId}\n className=\"hidden md:flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover cursor-pointer transition-all duration-200\"\n aria-label=\"Toggle sidebar\"\n data-collapse-toggle=\"\"\n >\n {/* Menu icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </label>\n\n {/* Mobile close button */}\n <label\n htmlFor={mobileMenuId}\n className=\"md:hidden flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover cursor-pointer transition-colors\"\n aria-label=\"Close menu\"\n >\n {/* Close icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </label>\n </div>\n\n {/* Navigation sections */}\n <nav className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Top section - scrollable */}\n {topItems && topItems.length > 0 && (\n <div className=\"flex-1 overflow-y-auto pb-4 scrollbar-hide\">\n {normalizeToSections(topItems).map((section, index, sections) =>\n renderSection(section, index, sections.length)\n )}\n </div>\n )}\n\n {/* Bottom section - fixed at bottom with enhanced separator */}\n {bottomItems && bottomItems.length > 0 && (\n <div className=\"flex-shrink-0 border-t bg-background-muted/30\">\n {/* Bottom navigation items with background and proper spacing */}\n <div className=\"mt-4 pb-4 space-y-1\">\n {bottomItems.map((item) => renderNavItem(item))}\n </div>\n </div>\n )}\n </nav>\n </div>\n );\n};\n","import * as React from \"react\";\n// Remove Icon import to avoid client-only code\n// import { Icon } from \"../Icon\";\n\nexport type TopNavProps = {\n rightContent?: React.ReactNode;\n showMobileMenu?: boolean;\n avatar?: React.ReactNode;\n showColorModeSwitcher?: boolean;\n toggleTheme?: () => void;\n isDarkThemeEnabled?: boolean;\n actions?: React.ReactNode;\n className?: string;\n mobileMenuId?: string;\n};\n\n/**\n * Isomorphic TopNav component\n * Works in both server and client components\n */\nexport const TopNav: React.FC<TopNavProps> = ({\n rightContent,\n showMobileMenu = true,\n avatar,\n showColorModeSwitcher = false,\n toggleTheme,\n isDarkThemeEnabled = false,\n actions,\n className = \"\",\n mobileMenuId = \"app-mobile-menu\",\n}) => {\n return (\n <header className={`h-[60px] bg-background-surface border-b ${className}`}>\n <div className=\"flex h-full items-center justify-between\">\n {/* Left side - Mobile menu button */}\n <div className=\"flex items-center h-full\">\n {showMobileMenu && (\n <label\n htmlFor={mobileMenuId}\n className=\"md:hidden cursor-pointer\"\n aria-label=\"Open menu\"\n >\n <div className=\"flex h-full w-14 flex-col items-center justify-center border-r hover:bg-background-hover transition-colors\">\n {/* Menu icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </div>\n </label>\n )}\n </div>\n\n {/* Right side - User actions */}\n <div className=\"flex items-center gap-4 px-4\">\n {/* Custom right content */}\n {rightContent}\n\n {/* Theme switcher - Desktop */}\n {showColorModeSwitcher && toggleTheme && (\n <button\n onClick={toggleTheme}\n className=\"hidden md:flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover transition-colors\"\n aria-label={isDarkThemeEnabled ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {/* Theme icon */}\n {isDarkThemeEnabled ? (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n </svg>\n )}\n </button>\n )}\n\n {/* Additional actions */}\n {actions}\n\n {/* Avatar */}\n {avatar && <div className=\"flex items-center\">{avatar}</div>}\n\n {/* Theme switcher - Mobile (if no avatar) */}\n {!avatar && showColorModeSwitcher && toggleTheme && (\n <button\n onClick={toggleTheme}\n className=\"md:hidden flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover transition-colors\"\n aria-label={isDarkThemeEnabled ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {/* Theme icon */}\n {isDarkThemeEnabled ? (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n </header>\n );\n};\n","import React from \"react\";\nimport { SideNav, type SideNavProps } from \"../SideNav/SideNav\";\nimport { TopNav, type TopNavProps } from \"../TopNav/TopNav\";\n\n/** Layout options for the AppShell */\nexport type AppShellProps = {\n /** Structured nav for the left rail */\n sideNav: Omit<SideNavProps, \"mobileMenuId\" | \"sidebarCollapseId\">;\n /** Optional top bar slots & options */\n topNav?: Pick<\n TopNavProps,\n | \"rightContent\"\n | \"showMobileMenu\"\n | \"avatar\"\n | \"showColorModeSwitcher\"\n | \"toggleTheme\"\n | \"isDarkThemeEnabled\"\n | \"actions\"\n | \"className\"\n >;\n /** Main page content */\n children: React.ReactNode;\n\n /** Layout knobs */\n contentPaddingX?: string; // e.g. \"px-4 md:px-6\"\n contentPaddingY?: string; // e.g. \"py-4 md:py-6\"\n showSidebarBorder?: boolean; // default true\n mainClassName?: string; // extra classes on <main>\n\n /** Optional: Enable JavaScript progressive enhancements */\n enableJsEnhancements?: boolean;\n};\n\n/**\n * Isomorphic AppShell component that works as both server and client component\n * Uses CSS-only interactions by default for full SSR compatibility\n * Can be progressively enhanced with JavaScript when enableJsEnhancements is true\n */\nexport function AppShell({\n sideNav,\n topNav,\n children,\n contentPaddingX = \"px-4 md:px-6\",\n contentPaddingY = \"py-4 md:py-6\",\n showSidebarBorder = true,\n mainClassName,\n enableJsEnhancements = false,\n}: AppShellProps) {\n // Use stable IDs for CSS selectors\n const mobileMenuId = \"app-mobile-menu\";\n const sidebarCollapseId = \"app-sidebar-collapse\";\n\n return (\n <div className=\"min-h-screen bg-background text-text-body relative\">\n {/* Hidden checkbox for desktop sidebar collapse */}\n <input\n type=\"checkbox\"\n id={sidebarCollapseId}\n className=\"sr-only peer/sidebar\"\n aria-hidden=\"true\"\n />\n\n {/* Skip link for keyboard users */}\n <a\n href=\"#app-content\"\n className=\"sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 z-50 rounded px-3 py-2 bg-background-surface shadow\"\n >\n Skip to content\n </a>\n\n {/* Top navigation - always visible on mobile */}\n <TopNav\n {...topNav}\n mobileMenuId={mobileMenuId}\n className={[\"sticky top-0 flex-shrink-0 z-30 md:hidden\", topNav?.className]\n .filter(Boolean)\n .join(\" \")}\n />\n\n {/* Main layout container - contains sidebar and content */}\n <div className=\"flex w-full h-[calc(100vh-60px)] md:h-screen relative overflow-hidden\">\n {/* Hidden checkbox for mobile menu - inside container for peer selectors */}\n <input\n type=\"checkbox\"\n id={mobileMenuId}\n className=\"sr-only peer/mobile\"\n aria-hidden=\"true\"\n />\n\n {/* Mobile menu overlay - scoped to container */}\n <label\n htmlFor={mobileMenuId}\n className=\"absolute inset-0 bg-black/50 z-40 opacity-0 pointer-events-none peer-checked/mobile:opacity-100 peer-checked/mobile:pointer-events-auto transition-opacity md:hidden\"\n aria-label=\"Close menu\"\n />\n {/* Left rail - SideNav with CSS-based responsive behavior */}\n <aside\n id=\"app-sidebar\"\n className={[\n // Base styles\n \"h-full md:h-screen\",\n \"bg-background-surface\",\n \"border-r border-border-default\",\n \"transition-all duration-300 ease-in-out\",\n // Mobile: off-canvas menu within container\n \"absolute md:relative\",\n \"left-0 top-0 bottom-0\",\n \"z-[60]\",\n \"w-64\",\n \"-translate-x-full\",\n \"peer-checked/mobile:translate-x-0\",\n // Desktop: always visible\n \"md:translate-x-0\",\n showSidebarBorder ? \"\" : \"!border-r-0\",\n sideNav?.className || \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <SideNav\n {...sideNav}\n mobileMenuId={mobileMenuId}\n sidebarCollapseId={sidebarCollapseId}\n className=\"h-full\"\n />\n </aside>\n\n {/* Right side: TopNav + Main content (desktop only) */}\n <div className=\"flex-1 flex flex-col h-full overflow-hidden\">\n {/* Top navigation - desktop only */}\n <div className=\"sticky top-0 flex-shrink-0 hidden md:block z-20\">\n <TopNav {...topNav} className={topNav?.className} />\n </div>\n\n {/* Main content - scrollable */}\n <main\n id=\"app-content\"\n className={[\n \"flex-1 overflow-y-auto bg-background-body\",\n contentPaddingX,\n contentPaddingY,\n mainClassName || \"\",\n ].join(\" \")}\n role=\"main\"\n >\n {children}\n </main>\n </div>\n </div>\n\n {/* Minimal CSS for checkbox-based interactions */}\n <style\n dangerouslySetInnerHTML={{\n __html: `\n @media (min-width: 768px) {\n /* Collapse sidebar width */\n #${sidebarCollapseId}:checked ~ * #app-sidebar {\n width: 5rem !important;\n }\n \n /* Collapse sidebar text */\n #${sidebarCollapseId}:checked ~ * [data-collapse-hide] {\n display: none !important;\n }\n \n /* Center nav items */\n #${sidebarCollapseId}:checked ~ * [data-collapse-center] {\n justify-content: center;\n padding-left: 0;\n padding-right: 0;\n gap: 0;\n }\n \n /* Rotate toggle icon */\n #${sidebarCollapseId}:checked ~ * [data-collapse-toggle] {\n transform: scaleX(-1);\n }\n \n /* Hide category expansions */\n #${sidebarCollapseId}:checked ~ * [data-collapse-hide-category] {\n display: none;\n }\n }\n `,\n }}\n />\n\n {/* Optional: Progressive enhancement script */}\n {enableJsEnhancements && (\n <script\n dangerouslySetInnerHTML={{\n __html: `\n (function() {\n // Close mobile menu on Escape key\n document.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') {\n var menuToggle = document.getElementById('${mobileMenuId}');\n if (menuToggle) menuToggle.checked = false;\n }\n });\n \n // Save sidebar collapse preference to localStorage\n var sidebarToggle = document.getElementById('${sidebarCollapseId}');\n if (sidebarToggle) {\n // Restore from localStorage\n var saved = localStorage.getItem('sidebar-collapsed');\n if (saved !== null) {\n sidebarToggle.checked = saved === 'true';\n }\n \n // Save on change\n sidebarToggle.addEventListener('change', function() {\n localStorage.setItem('sidebar-collapsed', this.checked);\n });\n }\n \n // Prevent body scroll when mobile menu is open\n var mobileToggle = document.getElementById('${mobileMenuId}');\n if (mobileToggle) {\n mobileToggle.addEventListener('change', function() {\n document.body.style.overflow = this.checked ? 'hidden' : '';\n });\n }\n })();\n `,\n }}\n />\n )}\n </div>\n );\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// We must avoid a circular dependency with @react-aria/utils, and this useLayoutEffect is\n// guarded by a check that it only runs on the client side.\n// eslint-disable-next-line rulesdir/useLayoutEffectRule\nimport React, {JSX, ReactNode, useContext, useLayoutEffect, useMemo, useRef, useState} from 'react';\n\n// To support SSR, the auto incrementing id counter is stored in a context. This allows\n// it to be reset on every request to ensure the client and server are consistent.\n// There is also a prefix string that is used to support async loading components\n// Each async boundary must be wrapped in an SSR provider, which appends to the prefix\n// and resets the current id counter. This ensures that async loaded components have\n// consistent ids regardless of the loading order.\ninterface SSRContextValue {\n prefix: string,\n current: number\n}\n\n// Default context value to use in case there is no SSRProvider. This is fine for\n// client-only apps. In order to support multiple copies of React Aria potentially\n// being on the page at once, the prefix is set to a random number. SSRProvider\n// will reset this to zero for consistency between server and client, so in the\n// SSR case multiple copies of React Aria is not supported.\nconst defaultContext: SSRContextValue = {\n prefix: String(Math.round(Math.random() * 10000000000)),\n current: 0\n};\n\nconst SSRContext = React.createContext<SSRContextValue>(defaultContext);\nconst IsSSRContext = React.createContext(false);\n\nexport interface SSRProviderProps {\n /** Your application here. */\n children: ReactNode\n}\n\n// This is only used in React < 18.\nfunction LegacySSRProvider(props: SSRProviderProps): JSX.Element {\n let cur = useContext(SSRContext);\n let counter = useCounter(cur === defaultContext);\n let [isSSR, setIsSSR] = useState(true);\n let value: SSRContextValue = useMemo(() => ({\n // If this is the first SSRProvider, start with an empty string prefix, otherwise\n // append and increment the counter.\n prefix: cur === defaultContext ? '' : `${cur.prefix}-${counter}`,\n current: 0\n }), [cur, counter]);\n\n // If on the client, and the component was initially server rendered,\n // then schedule a layout effect to update the component after hydration.\n if (typeof document !== 'undefined') {\n // This if statement technically breaks the rules of hooks, but is safe\n // because the condition never changes after mounting.\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useLayoutEffect(() => {\n setIsSSR(false);\n }, []);\n }\n\n return (\n <SSRContext.Provider value={value}>\n <IsSSRContext.Provider value={isSSR}>\n {props.children}\n </IsSSRContext.Provider>\n </SSRContext.Provider>\n );\n}\n\nlet warnedAboutSSRProvider = false;\n\n/**\n * When using SSR with React Aria in React 16 or 17, applications must be wrapped in an SSRProvider.\n * This ensures that auto generated ids are consistent between the client and server.\n */\nexport function SSRProvider(props: SSRProviderProps): JSX.Element {\n if (typeof React['useId'] === 'function') {\n if (process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'production' && !warnedAboutSSRProvider) {\n console.warn('In React 18, SSRProvider is not necessary and is a noop. You can remove it from your app.');\n warnedAboutSSRProvider = true;\n }\n return <>{props.children}</>;\n }\n return <LegacySSRProvider {...props} />;\n}\n\nlet canUseDOM = Boolean(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n);\n\nlet componentIds = new WeakMap();\n\nfunction useCounter(isDisabled = false) {\n let ctx = useContext(SSRContext);\n let ref = useRef<number | null>(null);\n // eslint-disable-next-line rulesdir/pure-render\n if (ref.current === null && !isDisabled) {\n // In strict mode, React renders components twice, and the ref will be reset to null on the second render.\n // This means our id counter will be incremented twice instead of once. This is a problem because on the\n // server, components are only rendered once and so ids generated on the server won't match the client.\n // In React 18, useId was introduced to solve this, but it is not available in older versions. So to solve this\n // we need to use some React internals to access the underlying Fiber instance, which is stable between renders.\n // This is exposed as ReactCurrentOwner in development, which is all we need since StrictMode only runs in development.\n // To ensure that we only increment the global counter once, we store the starting id for this component in\n // a weak map associated with the Fiber. On the second render, we reset the global counter to this value.\n // Since React runs the second render immediately after the first, this is safe.\n // @ts-ignore\n let currentOwner = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED?.ReactCurrentOwner?.current;\n if (currentOwner) {\n let prevComponentValue = componentIds.get(currentOwner);\n if (prevComponentValue == null) {\n // On the first render, and first call to useId, store the id and state in our weak map.\n componentIds.set(currentOwner, {\n id: ctx.current,\n state: currentOwner.memoizedState\n });\n } else if (currentOwner.memoizedState !== prevComponentValue.state) {\n // On the second render, the memoizedState gets reset by React.\n // Reset the counter, and remove from the weak map so we don't\n // do this for subsequent useId calls.\n ctx.current = prevComponentValue.id;\n componentIds.delete(currentOwner);\n }\n }\n\n // eslint-disable-next-line rulesdir/pure-render\n ref.current = ++ctx.current;\n }\n\n // eslint-disable-next-line rulesdir/pure-render\n return ref.current;\n}\n\nfunction useLegacySSRSafeId(defaultId?: string): string {\n let ctx = useContext(SSRContext);\n\n // If we are rendering in a non-DOM environment, and there's no SSRProvider,\n // provide a warning to hint to the developer to add one.\n if (ctx === defaultContext && !canUseDOM && process.env.NODE_ENV !== 'production') {\n console.warn('When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.');\n }\n\n let counter = useCounter(!!defaultId);\n let prefix = ctx === defaultContext && process.env.NODE_ENV === 'test' ? 'react-aria' : `react-aria${ctx.prefix}`;\n return defaultId || `${prefix}-${counter}`;\n}\n\nfunction useModernSSRSafeId(defaultId?: string): string {\n let id = React.useId();\n let [didSSR] = useState(useIsSSR());\n let prefix = didSSR || process.env.NODE_ENV === 'test' ? 'react-aria' : `react-aria${defaultContext.prefix}`;\n return defaultId || `${prefix}-${id}`;\n}\n\n// Use React.useId in React 18 if available, otherwise fall back to our old implementation.\n/** @private */\nexport const useSSRSafeId: typeof useModernSSRSafeId | typeof useLegacySSRSafeId = typeof React['useId'] === 'function' ? useModernSSRSafeId : useLegacySSRSafeId;\n\nfunction getSnapshot() {\n return false;\n}\n\nfunction getServerSnapshot() {\n return true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction subscribe(onStoreChange: () => void): () => void {\n // noop\n return () => {};\n}\n\n/**\n * Returns whether the component is currently being server side rendered or\n * hydrated on the client. Can be used to delay browser-specific rendering\n * until after hydration.\n */\nexport function useIsSSR(): boolean {\n // In React 18, we can use useSyncExternalStore to detect if we're server rendering or hydrating.\n if (typeof React['useSyncExternalStore'] === 'function') {\n return React['useSyncExternalStore'](subscribe, getSnapshot, getServerSnapshot);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useContext(IsSSRContext);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// https://en.wikipedia.org/wiki/Right-to-left\nconst RTL_SCRIPTS = new Set(['Arab', 'Syrc', 'Samr', 'Mand', 'Thaa', 'Mend', 'Nkoo', 'Adlm', 'Rohg', 'Hebr']);\nconst RTL_LANGS = new Set(['ae', 'ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'glk', 'he', 'ku', 'mzn', 'nqo', 'pnb', 'ps', 'sd', 'ug', 'ur', 'yi']);\n\n/**\n * Determines if a locale is read right to left using [Intl.Locale]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale}.\n */\nexport function isRTL(localeString: string): boolean {\n // If the Intl.Locale API is available, use it to get the locale's text direction.\n if (Intl.Locale) {\n let locale = new Intl.Locale(localeString).maximize();\n\n // Use the text info object to get the direction if possible.\n // @ts-ignore - this was implemented as a property by some browsers before it was standardized as a function.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getTextInfo\n let textInfo = typeof locale.getTextInfo === 'function' ? locale.getTextInfo() : locale.textInfo;\n if (textInfo) {\n return textInfo.direction === 'rtl';\n }\n\n // Fallback: guess using the script.\n // This is more accurate than guessing by language, since languages can be written in multiple scripts.\n if (locale.script) {\n return RTL_SCRIPTS.has(locale.script);\n }\n }\n\n // If not, just guess by the language (first part of the locale)\n let lang = localeString.split('-')[0];\n return RTL_LANGS.has(lang);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Direction} from '@react-types/shared';\nimport {isRTL} from './utils';\nimport {useEffect, useState} from 'react';\nimport {useIsSSR} from '@react-aria/ssr';\n\nexport interface Locale {\n /** The [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt) language code for the locale. */\n locale: string,\n /** The writing direction for the locale. */\n direction: Direction\n}\n\n// Locale passed from server by PackageLocalizationProvider.\nconst localeSymbol = Symbol.for('react-aria.i18n.locale');\n\n/**\n * Gets the locale setting of the browser.\n */\nexport function getDefaultLocale(): Locale {\n let locale = typeof window !== 'undefined' && window[localeSymbol]\n // @ts-ignore\n || (typeof navigator !== 'undefined' && (navigator.language || navigator.userLanguage))\n || 'en-US';\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale]);\n } catch {\n locale = 'en-US';\n }\n return {\n locale,\n direction: isRTL(locale) ? 'rtl' : 'ltr'\n };\n}\n\nlet currentLocale = getDefaultLocale();\nlet listeners = new Set<(locale: Locale) => void>();\n\nfunction updateLocale() {\n currentLocale = getDefaultLocale();\n for (let listener of listeners) {\n listener(currentLocale);\n }\n}\n\n/**\n * Returns the current browser/system language, and updates when it changes.\n */\nexport function useDefaultLocale(): Locale {\n let isSSR = useIsSSR();\n let [defaultLocale, setDefaultLocale] = useState(currentLocale);\n\n useEffect(() => {\n if (listeners.size === 0) {\n window.addEventListener('languagechange', updateLocale);\n }\n\n listeners.add(setDefaultLocale);\n\n return () => {\n listeners.delete(setDefaultLocale);\n if (listeners.size === 0) {\n window.removeEventListener('languagechange', updateLocale);\n }\n };\n }, []);\n\n // We cannot determine the browser's language on the server, so default to\n // en-US. This will be updated after hydration on the client to the correct value.\n if (isSSR) {\n return {\n locale: 'en-US',\n direction: 'ltr'\n };\n }\n\n return defaultLocale;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {isRTL} from './utils';\nimport {Locale, useDefaultLocale} from './useDefaultLocale';\nimport React, {JSX, ReactNode, useContext} from 'react';\n\nexport interface I18nProviderProps {\n /** Contents that should have the locale applied. */\n children: ReactNode,\n /** The locale to apply to the children. */\n locale?: string\n}\n\nconst I18nContext = React.createContext<Locale | null>(null);\n\ninterface I18nProviderWithLocaleProps extends I18nProviderProps {\n locale: string\n}\n\n/**\n * Internal component that handles the case when locale is provided.\n */\nfunction I18nProviderWithLocale(props: I18nProviderWithLocaleProps): JSX.Element {\n let {locale, children} = props; \n let value: Locale = React.useMemo(() => ({\n locale,\n direction: isRTL(locale) ? 'rtl' : 'ltr'\n }), [locale]);\n\n return (\n <I18nContext.Provider value={value}>\n {children}\n </I18nContext.Provider>\n );\n}\n\ninterface I18nProviderWithDefaultLocaleProps {\n children: ReactNode\n}\n\n/**\n * Internal component that handles the case when no locale is provided.\n */\nfunction I18nProviderWithDefaultLocale(props: I18nProviderWithDefaultLocaleProps): JSX.Element {\n let {children} = props;\n let defaultLocale = useDefaultLocale();\n\n return (\n <I18nContext.Provider value={defaultLocale}>\n {children}\n </I18nContext.Provider>\n );\n}\n\n/**\n * Provides the locale for the application to all child components.\n */\nexport function I18nProvider(props: I18nProviderProps): JSX.Element {\n let {locale, children} = props;\n\n // Conditionally render different components to avoid calling useDefaultLocale.\n // This is necessary because useDefaultLocale triggers a re-render.\n if (locale) {\n return <I18nProviderWithLocale locale={locale} children={children} />;\n }\n\n return <I18nProviderWithDefaultLocale children={children} />;\n}\n\n/**\n * Returns the current locale and layout direction.\n */\nexport function useLocale(): Locale {\n let defaultLocale = useDefaultLocale();\n let context = useContext(I18nContext);\n return context || defaultLocale;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useLocale} from './context';\n\nlet cache = new Map<string, Intl.Collator>();\n\n/**\n * Provides localized string collation for the current locale. Automatically updates when the locale changes,\n * and handles caching of the collator for performance.\n * @param options - Collator options.\n */\nexport function useCollator(options?: Intl.CollatorOptions): Intl.Collator {\n let {locale} = useLocale();\n\n let cacheKey = locale + (options ? Object.entries(options).sort((a, b) => a[0] < b[0] ? -1 : 1).join() : '');\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey)!;\n }\n\n let formatter = new Intl.Collator(locale, options);\n cache.set(cacheKey, formatter);\n return formatter;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback, useMemo} from 'react';\nimport {useCollator} from './useCollator';\n\nexport interface Filter {\n /** Returns whether a string starts with a given substring. */\n startsWith(string: string, substring: string): boolean,\n /** Returns whether a string ends with a given substring. */\n endsWith(string: string, substring: string): boolean,\n /** Returns whether a string contains a given substring. */\n contains(string: string, substring: string): boolean\n}\n\n/**\n * Provides localized string search functionality that is useful for filtering or matching items\n * in a list. Options can be provided to adjust the sensitivity to case, diacritics, and other parameters.\n */\nexport function useFilter(options?: Intl.CollatorOptions): Filter {\n let collator = useCollator({\n usage: 'search',\n ...options\n });\n\n // TODO(later): these methods don't currently support the ignorePunctuation option.\n let startsWith = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n // Normalize both strings so we can slice safely\n // TODO: take into account the ignorePunctuation option as well...\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return collator.compare(string.slice(0, substring.length), substring) === 0;\n }, [collator]);\n\n let endsWith = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return collator.compare(string.slice(-substring.length), substring) === 0;\n }, [collator]);\n\n let contains = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n\n let scan = 0;\n let sliceLen = substring.length;\n for (; scan + sliceLen <= string.length; scan++) {\n let slice = string.slice(scan, scan + sliceLen);\n if (collator.compare(substring, slice) === 0) {\n return true;\n }\n }\n\n return false;\n }, [collator]);\n\n return useMemo(() => ({\n startsWith,\n endsWith,\n contains\n }), [startsWith, endsWith, contains]);\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useState } from \"react\";\n\n// Moved to direct const variable in order to remove dependence on config tied to dash-next directly in edges\n// Eventually we will want to move this folder out of dash-next and into a shared location\nconst preventDarkMode = false;\n\ninterface ColorModeContextType {\n colorMode: string;\n isDarkTheme: boolean;\n toggleTheme: () => void;\n}\n\nconst ColorModeContext = createContext<ColorModeContextType>({\n colorMode: \"light\",\n isDarkTheme: false,\n toggleTheme: () => {\n /* Default implementation */\n },\n});\n\nexport const useColorMode = () => useContext(ColorModeContext);\n\ninterface ColorModeProviderProps {\n children: React.ReactNode;\n}\n\nexport const ColorModeProvider: React.FC<ColorModeProviderProps> = ({ children }) => {\n const [colorMode, setColorMode] = useState(\"light\");\n const isDarkTheme = colorMode === \"dark\";\n\n useEffect(() => {\n // Get initial theme from localStorage or system preference\n const savedTheme = localStorage.getItem(\"theme\");\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const initialTheme = savedTheme || (mediaQuery.matches ? \"dark\" : \"light\");\n setColorMode(initialTheme);\n\n if (initialTheme === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n }\n\n // Function to handle the theme change\n const handleColorModeChange = (e: MediaQueryListEvent) => {\n if (!localStorage.getItem(\"theme\")) {\n const newTheme = e.matches ? \"dark\" : \"light\";\n setColorMode(newTheme);\n if (newTheme === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n } else {\n document.body.classList.remove(\"theme-dark\");\n }\n }\n };\n\n // Listen for changes in the prefers-color-scheme media query\n mediaQuery.addEventListener(\"change\", handleColorModeChange);\n\n // Clean up the event listener on unmount\n return () => mediaQuery.removeEventListener(\"change\", handleColorModeChange);\n }, []);\n\n const toggleTheme = useCallback(() => {\n setColorMode((prevMode) => {\n const newMode = prevMode === \"light\" ? \"dark\" : \"light\";\n localStorage.setItem(\"theme\", newMode);\n\n if (newMode === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n } else {\n document.body.classList.remove(\"theme-dark\");\n }\n\n return newMode;\n });\n }, []);\n\n if (preventDarkMode) {\n return (\n <ColorModeContext.Provider\n value={{\n colorMode: \"light\",\n isDarkTheme: false,\n toggleTheme: () => {\n /* Default implementation */\n },\n }}\n >\n {children}\n </ColorModeContext.Provider>\n );\n }\n\n return (\n <ColorModeContext.Provider value={{ colorMode, isDarkTheme, toggleTheme }}>\n {children}\n </ColorModeContext.Provider>\n );\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\nexport function focusRing(showDefaultOutline: boolean = false) {\n const baseClasses = showDefaultOutline\n ? \"outline outline-1 outline-border-input focus:outline-2 focus:outline-border-focus focus: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 focus-visible:outline focus-visible:outline-2 focus-visible:outline-border-focus 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\nconst colorCache = new Map<string, string>();\n\nexport const getResolvedColor = (variableName: string): string => {\n // Early return if running in non-browser environment\n if (typeof window === \"undefined\") return \"\";\n\n // Return cached value if available\n if (colorCache.has(variableName)) {\n return colorCache.get(variableName)!;\n }\n\n try {\n const tempElement = document.createElement(\"div\");\n tempElement.style.color = `var(${variableName})`;\n document.body.appendChild(tempElement);\n const resolvedColor = getComputedStyle(tempElement).color;\n document.body.removeChild(tempElement);\n // Cache the result\n colorCache.set(variableName, resolvedColor);\n return resolvedColor;\n } catch (error) {\n console.error(`Failed to resolve color for ${variableName}:`, error);\n return \"\";\n }\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 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 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 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 gap: \"gap-[var(--control-gap-xl)]\",\n },\n} as const;\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\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)] \";\n\n // Disabled state overrides all others\n if (isDisabled) {\n return `${baseStyles} border-border-muted focus:outline-none`;\n }\n\n // Handle combinations of invalid and focus states\n if (isInvalid && isFocused) {\n return `${baseStyles} border-feedback-error-border outline-[1.5px] outline-[var(--control-focus-ring-color-error)]`;\n }\n\n if (isInvalid) {\n return `${baseStyles} border-feedback-error-border`;\n }\n\n if (isFocused) {\n return `${baseStyles} !outline-[1.5px] !outline-[var(--control-focus-ring-color)] ![--tw-outline-style:solid]`;\n }\n\n // Default state\n return `${baseStyles}`;\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 * 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 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-sm 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-caption 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-muted\", 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 type { ListBoxItemProps as AriaListBoxItemProps } from \"react-aria-components\";\nimport { ListBoxItem as AriaListBoxItem } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst itemHeightStylesObject = {\n sm: \"py-1\",\n md: \"py-2\",\n lg: \"py-3\",\n xl: \"py-4\",\n};\n\nconst textSizeStylesObject = {\n sm: \"text-controlElementSm\",\n md: \"text-controlElementMd\",\n lg: \"text-controlElementLg\",\n xl: \"text-controlElementXl\",\n};\n\n/**\n * ListBoxItem\n *\n * A styled wrapper around `react-aria-components` ListBoxItem with size\n * variants that align with Edges typography.\n */\nexport interface ExtendedListBoxItemProps extends Omit<AriaListBoxItemProps, \"className\"> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n className?: string;\n}\n\nexport type ListBoxItemProps = ExtendedListBoxItemProps;\n\nexport function ListBoxItem({ size = \"md\", className, ...props }: ExtendedListBoxItemProps) {\n const baseClassName =\n \"flex cursor-default items-center gap-2 rounded-sm px-3 text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium\";\n\n return (\n <AriaListBoxItem\n {...props}\n className={twMerge(\n baseClassName,\n itemHeightStylesObject[size],\n textSizeStylesObject[size],\n className\n )}\n />\n );\n}\n","import React from \"react\";\nimport {\n Popover as AriaPopover,\n PopoverProps as AriaPopoverProps,\n composeRenderProps,\n OverlayArrow,\n PopoverContext,\n useSlottedContext,\n} from \"react-aria-components\";\n\n/**\n * Popover\n *\n * Positioned overlay container with optional arrow, built on\n * `react-aria-components` Popover.\n */\nexport interface PopoverProps extends Omit<AriaPopoverProps, \"children\"> {\n showArrow?: boolean;\n children: React.ReactNode;\n}\n\nfunction getPopoverStyles({\n isEntering,\n isExiting,\n className = \"\",\n}: {\n isEntering?: boolean;\n isExiting?: boolean;\n className?: string;\n}) {\n const baseStyles = [\n \"bg-white\",\n \"dark:bg-zinc-900/70\",\n \"dark:backdrop-blur-2xl\",\n \"dark:backdrop-saturate-200\",\n \"forced-colors:bg-[Canvas]\",\n \"shadow-md\",\n \"rounded-md\",\n \"overflow-hidden\",\n \"bg-clip-padding\",\n \"border\",\n \"border-gray-100\",\n \"dark:border-white/5\",\n \"dark:text-zinc-300\",\n ].join(\" \");\n\n const enteringStyles = isEntering\n ? [\n \"animate-in\",\n \"fade-in\",\n \"placement-bottom:slide-in-from-top-1\",\n \"placement-top:slide-in-from-bottom-1\",\n \"placement-left:slide-in-from-right-1\",\n \"placement-right:slide-in-from-left-1\",\n \"ease-out\",\n \"duration-200\",\n ].join(\" \")\n : \"\";\n\n const exitingStyles = isExiting\n ? [\n \"animate-out\",\n \"fade-out\",\n \"placement-bottom:slide-out-to-top-1\",\n \"placement-top:slide-out-to-bottom-1\",\n \"placement-left:slide-out-to-right-1\",\n \"placement-right:slide-out-to-left-1\",\n \"ease-in\",\n \"duration-150\",\n ].join(\" \")\n : \"\";\n\n return [baseStyles, enteringStyles, exitingStyles, className].filter(Boolean).join(\" \");\n}\n\nexport function Popover({ children, showArrow, className, ...props }: PopoverProps) {\n const popoverContext = useSlottedContext(PopoverContext)!;\n const isSubmenu = popoverContext?.trigger === \"SubmenuTrigger\";\n let offset = showArrow ? 12 : 8;\n offset = isSubmenu ? offset - 6 : offset;\n return (\n <AriaPopover\n offset={offset}\n {...props}\n className={composeRenderProps(className, (className, renderProps) =>\n getPopoverStyles({ ...renderProps, className })\n )}\n >\n {showArrow && (\n <OverlayArrow className=\"group\">\n <svg\n width={12}\n height={12}\n viewBox=\"0 0 12 12\"\n className=\"block fill-white stroke-black/10 stroke-1 group-placement-left:-rotate-90 group-placement-right:rotate-90 group-placement-bottom:rotate-180 dark:fill-[#1f1f21] dark:stroke-zinc-600 forced-colors:fill-[Canvas] forced-colors:stroke-[ButtonBorder]\"\n >\n <path d=\"M0 0 L6 6 L12 0\" />\n </svg>\n </OverlayArrow>\n )}\n {children}\n </AriaPopover>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { useFilter } from \"react-aria\";\nimport {\n Button as AriaButton,\n Input as AriaInput,\n ComboBox,\n ComboBoxStateContext,\n Group,\n Header,\n type Key,\n ListBox,\n ListBoxSection,\n ValidationResult,\n} from \"react-aria-components\";\nimport { useAsyncList } from \"react-stately\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Description, FieldError, getFieldGroupStyles, Label } from \"../Field/Field\";\nimport { Icon } from \"../Icon/Icon\";\nimport { ListBoxItem } from \"../ListBoxItem/ListBoxItem\";\nimport { Popover } from \"../Popover/Popover\";\n\ninterface Item {\n id: string;\n name: string;\n}\n\ninterface Section {\n name: string;\n items: Item[];\n}\n\nconst iconSizeClassMap = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n xl: \"h-7 w-7\",\n};\n\nconst inputPaddingLeftMap = {\n sm: \"pl-7\",\n md: \"pl-9\",\n lg: \"pl-10\",\n xl: \"pl-12\",\n};\n\nconst itemHeightStylesObject = {\n sm: \"py-1\",\n md: \"py-2\",\n lg: \"py-3\",\n xl: \"py-4\",\n};\n\ntype RequestMethod = \"GET\" | \"POST\";\n\ninterface BaseRequestConfig {\n url: string;\n headers?: Record<string, string>;\n transformResponse: (data: unknown) => Item[];\n}\n\ninterface RestRequestConfig extends BaseRequestConfig {\n requestType: \"REST\";\n method?: RequestMethod;\n queryKey?: string; // For APIs that expect \"query\" in URL or JSON body\n extraParams?: Record<string, string>;\n shouldLoad?: (filterText: string) => boolean;\n}\n\ninterface GraphQLRequestConfig extends BaseRequestConfig {\n requestType: \"GraphQL\";\n graphqlQuery: string;\n variableKey?: string;\n responsePath?: string;\n shouldLoad?: (filterText: string) => boolean;\n}\n\ntype AutocompleteRequestConfig = RestRequestConfig | GraphQLRequestConfig;\n\n/**\n * Autocomplete\n *\n * Text input with typeahead suggestions and keyboard navigation.\n */\nexport interface AutocompleteProps {\n label?: string;\n staticItems?: Item[];\n sections?: Section[];\n selectedKey?: Key | null;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n requestConfig?: AutocompleteRequestConfig;\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n placeholder?: string;\n renderItem?: (item: Item) => React.ReactNode;\n renderLeftIcon?: (isLoading: boolean) => React.ReactNode;\n renderSection?: (section: Section, children: React.ReactNode) => React.ReactNode;\n errorMessage?: string | ((validation: ValidationResult) => string);\n description?: string;\n size?: Size;\n tooltip?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n isInvalid?: boolean;\n validationResult?: ValidationResult;\n showErrors?: boolean;\n autoFocus?: boolean;\n}\n\nfunction ClearButton() {\n const state = React.useContext(ComboBoxStateContext);\n return (\n <AriaButton\n // Don't inherit default Button behavior from ComboBox.\n slot={null}\n className=\"clear-button\"\n aria-label=\"Clear\"\n onPress={() => state?.setSelectedKey(null)}\n >\n ✕\n </AriaButton>\n );\n}\n\n// Helper function to get item name by key\nconst getItemName = (\n key: Key | null | undefined,\n staticItems: Item[],\n sections?: Section[]\n): string => {\n if (key == null || key === \"\") return \"\";\n const allItems = sections ? sections.flatMap((s) => s.items) : staticItems || [];\n const selectedItem = allItems.find((item) => item.id === key);\n return selectedItem ? selectedItem.name : \"\";\n};\n\nasync function handleRestRequest(\n config: RestRequestConfig,\n filterText: string,\n signal: AbortSignal\n): Promise<{ items: Item[]; error?: string }> {\n try {\n // Extract the base URL and access token from config\n const baseUrl = config.url.replace(\"{q}\", filterText);\n\n // Add query parameters\n const params = new URLSearchParams();\n if (config.extraParams) {\n Object.entries(config.extraParams).forEach(([key, value]) => {\n params.append(key, value.toString());\n });\n }\n\n // Construct final URL\n const finalUrl = `${baseUrl}${params.toString() ? \"?\" + params.toString() : \"\"}`;\n\n const response = await fetch(finalUrl, {\n method: \"GET\",\n headers: config.headers,\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const json = await response.json();\n return { items: config.transformResponse(json) };\n } catch (error) {\n console.error(\"Error in REST request:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n return { items: [], error: errorMessage };\n }\n}\n\nasync function handleGraphQLRequest(\n config: GraphQLRequestConfig,\n filterText: string,\n signal: AbortSignal\n): Promise<{ items: Item[]; error?: string }> {\n try {\n const query = config.graphqlQuery.replace(\n `$${config.variableKey || \"filter\"}`,\n `\"${filterText}\"`\n );\n\n const response = await fetch(config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n },\n body: JSON.stringify({ query }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n let json = await response.json();\n\n if (json.errors) {\n throw new Error(json.errors[0]?.message || \"GraphQL error occurred\");\n }\n\n // For GraphQL, traverse the response path if specified\n if (config.responsePath) {\n json = config.responsePath.split(\".\").reduce((obj, key) => obj?.[key], json);\n }\n\n return { items: config.transformResponse(json) };\n } catch (error) {\n console.error(\"Error in GraphQL request:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n return { items: [], error: errorMessage };\n }\n}\n\nexport function Autocomplete({\n label,\n staticItems = [],\n sections,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n requestConfig,\n defaultFilter,\n placeholder,\n errorMessage,\n description,\n size = \"md\",\n tooltip,\n isRequired,\n isDisabled,\n isInvalid,\n validationResult,\n showErrors = true,\n renderItem,\n renderLeftIcon,\n renderSection,\n autoFocus = false,\n}: AutocompleteProps) {\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const [triggerWidth, setTriggerWidth] = React.useState<number | undefined>();\n const [inputValue, setInputValue] = useState(() =>\n getItemName(selectedKey || defaultSelectedKey, staticItems, sections)\n );\n const [isFocused, setIsFocused] = useState(false);\n const debouncedInputValue = useDebounce(inputValue);\n const { contains } = useFilter({ sensitivity: \"base\" });\n const [error, setError] = useState<string | undefined>();\n\n const textSizeClass = controlStyles[size].text;\n const heightSizeClass = controlStyles[size].height;\n\n let dynamicItems: ReturnType<typeof useAsyncList<Item>> | null = null;\n\n useEffect(() => {\n if (autoFocus) {\n setIsFocused(true);\n }\n }, [autoFocus]);\n\n // Update trigger width when component mounts or resizes\n useEffect(() => {\n const updateTriggerWidth = () => {\n if (triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth);\n }\n };\n\n updateTriggerWidth();\n window.addEventListener(\"resize\", updateTriggerWidth);\n return () => window.removeEventListener(\"resize\", updateTriggerWidth);\n }, []);\n\n useEffect(() => {\n if (dynamicItems) {\n dynamicItems.setFilterText(debouncedInputValue);\n }\n }, [debouncedInputValue, dynamicItems]);\n\n if (requestConfig) {\n dynamicItems = useAsyncList<Item>({\n async load({ signal, filterText = \"\" }) {\n if (\n !requestConfig.url ||\n (requestConfig.shouldLoad && !requestConfig.shouldLoad(filterText))\n ) {\n return { items: [] };\n }\n\n try {\n let result;\n if (requestConfig.requestType === \"GraphQL\") {\n result = await handleGraphQLRequest(requestConfig, filterText, signal);\n } else {\n result = await handleRestRequest(requestConfig, filterText, signal);\n }\n\n setError(result.error);\n return { items: result.items };\n } catch (error) {\n console.error(\"Error loading items:\", error);\n setError(error instanceof Error ? error.message : \"Unknown error occurred\");\n return { items: [] };\n }\n },\n initialFilterText: \"\",\n });\n }\n\n if (debouncedInputValue === \"\") {\n dynamicItems = null;\n }\n\n const handleInternalSelectionChange = (key: Key | null) => {\n const newName = getItemName(key, staticItems, sections);\n setInputValue(newName);\n if (onSelectionChange) {\n onSelectionChange(key);\n }\n };\n\n const handleInternalInputChange = (text: string) => {\n setInputValue(text);\n const currentSelectedItemName = getItemName(selectedKey, staticItems, sections);\n if (selectedKey != null && text !== currentSelectedItemName) {\n if (onSelectionChange) {\n // Clear selection if input text no longer matches selected item's name\n onSelectionChange(null);\n }\n }\n };\n\n return (\n <ComboBox\n onSelectionChange={handleInternalSelectionChange}\n selectedKey={selectedKey || undefined}\n defaultSelectedKey={defaultSelectedKey || undefined}\n defaultItems={sections ? sections.flatMap((section) => section.items) : staticItems}\n items={dynamicItems ? dynamicItems.items : undefined}\n className={composeTailwindRenderProps(\"group flex flex-col\", \"w-full\")}\n menuTrigger=\"focus\"\n isDisabled={isDisabled}\n isInvalid={isInvalid || !!errorMessage}\n inputValue={inputValue}\n onInputChange={handleInternalInputChange}\n autoFocus={autoFocus}\n defaultFilter={defaultFilter || contains}\n aria-label={label || placeholder || \"Autocomplete\"}\n >\n {(state) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <Group\n ref={triggerRef}\n className={getFieldGroupStyles({\n size,\n isInvalid: isInvalid || !!errorMessage,\n isDisabled,\n isFocusWithin: isFocused || state.isOpen,\n className: \"w-full cursor-pointer\",\n })}\n aria-label={label || placeholder || \"Autocomplete\"}\n style={{ position: \"relative\" }}\n >\n {renderLeftIcon ? (\n <div className=\"absolute left-3\">{renderLeftIcon(!!dynamicItems?.isLoading)}</div>\n ) : (\n <Icon\n name=\"MagnifyingGlass\"\n className={`${iconSizeClassMap[size]} absolute left-3 text-inherit`}\n />\n )}\n <AriaInput\n className={`flex-1 min-w-0 border-none pr-3 outline-0 placeholder:text-text-placeholder ${inputPaddingLeftMap[size]} ${textSizeClass} ${heightSizeClass} ${isDisabled ? \"bg-background-muted\" : \"bg-background-input\"}`}\n placeholder={placeholder}\n disabled={isDisabled}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n />\n {inputValue && !isDisabled && <ClearButton />}\n <AriaButton\n className={`px-2 text-text-body ${textSizeClass} ${heightSizeClass} ${isDisabled ? \"bg-background-muted\" : \"bg-background-input\"}`}\n aria-label=\"Toggle menu\"\n isDisabled={isDisabled}\n >\n {({ isPressed }) => (\n <Icon name={isPressed ? \"CaretUp\" : \"CaretDown\"} className=\"h-4 w-4\" />\n )}\n </AriaButton>\n </Group>\n {description && <Description size={size}>{description}</Description>}\n {showErrors && error && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {error}\n </FieldError>\n )}\n {showErrors && typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {errorMessage}\n </FieldError>\n )}\n {showErrors && typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n <Popover\n className=\"bg-background-input shadow-xl border border-border-input/20 backdrop-blur-sm ring-1 ring-black/5\"\n style={{ minWidth: triggerWidth ? `${triggerWidth}px` : undefined }}\n >\n <ListBox\n className={`max-h-[300px] overflow-auto bg-background-input outline-none ${textSizeClass}`}\n >\n {sections\n ? sections.map((section) => {\n const sectionItems = section.items.map((item) => (\n <ListBoxItem\n key={item.id}\n id={item.id}\n textValue={item.name}\n size={size}\n className={`flex cursor-default items-center gap-2 rounded-sm px-3 ${itemHeightStylesObject[size]} text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium`}\n >\n {renderItem ? (\n renderItem(item)\n ) : (\n <>\n {item.name}\n <Icon\n name=\"X\"\n className=\"ml-auto h-4 w-4 text-text-muted opacity-0 data-[focused]:opacity-100 data-[selected]:opacity-100\"\n />\n </>\n )}\n </ListBoxItem>\n ));\n\n if (renderSection) {\n return renderSection(section, sectionItems);\n }\n\n return (\n <ListBoxSection key={section.name}>\n <Header className=\"px-3 py-1 text-sm font-bold text-text-muted\">\n {section.name}\n </Header>\n {sectionItems}\n </ListBoxSection>\n );\n })\n : (item: Item) => (\n <ListBoxItem\n key={item.id}\n id={item.id}\n textValue={item.name}\n size={size}\n className={`flex cursor-default items-center gap-2 rounded-sm px-3 ${itemHeightStylesObject[size]} text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium`}\n >\n {renderItem ? (\n renderItem(item)\n ) : (\n <>\n {item.name}\n <Icon\n name=\"X\"\n className=\"ml-auto h-4 w-4 text-text-muted opacity-0 data-[focused]:opacity-100 data-[selected]:opacity-100\"\n />\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </div>\n )}\n </ComboBox>\n );\n}\n","import { Building2, User, Users } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface AvatarProps {\n /**\n * URL of the avatar image\n */\n src?: string;\n /**\n * Alternative text for the image\n */\n alt?: string;\n /**\n * First name for generating initials\n */\n firstName?: string;\n /**\n * Last name for generating initials\n */\n lastName?: string;\n /**\n * Full name (used as fallback for alt text)\n */\n fullName?: string;\n /**\n * Click handler\n */\n onClick?: () => void;\n /**\n * Size of the avatar\n * @default \"md\"\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Shape of the avatar\n * @default \"circle\"\n */\n shape?: \"circle\" | \"square\";\n /**\n * Visual variant\n * @default \"user\"\n */\n variant?: \"user\" | \"team\" | \"organization\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Status indicator\n */\n status?: \"online\" | \"offline\" | \"away\" | \"busy\";\n /**\n * Whether to show a border\n * @default false\n */\n bordered?: boolean;\n}\n\n/**\n * Avatar\n *\n * Display user, team, or organization avatars with support for images,\n * initials, and fallback icons. Includes optional status indicators.\n */\nexport function Avatar({\n src,\n alt,\n firstName,\n lastName,\n fullName,\n onClick,\n size = \"md\",\n shape = \"circle\",\n variant = \"user\",\n className,\n status,\n bordered = false,\n}: AvatarProps) {\n const sizeClasses = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-8 w-8 text-sm\",\n md: \"h-10 w-10 text-base\",\n lg: \"h-12 w-12 text-lg\",\n xl: \"h-16 w-16 text-xl\",\n };\n\n const statusSizeClasses = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n };\n\n const statusPositionClasses = {\n xs: \"bottom-0 right-0\",\n sm: \"bottom-0 right-0\",\n md: \"bottom-0 right-0\",\n lg: \"bottom-0.5 right-0.5\",\n xl: \"bottom-1 right-1\",\n };\n\n const statusColors = {\n online: \"bg-feedback-success-background border-feedback-success-border\",\n offline: \"bg-text-muted border-border-muted\",\n away: \"bg-feedback-warning-background border-feedback-warning-border\",\n busy: \"bg-feedback-error-background border-feedback-error-border\",\n };\n\n const variantColors = {\n user: \"bg-action-primary/10 text-action-primary\",\n team: \"bg-feedback-info-background text-feedback-info-text\",\n organization: \"bg-feedback-success-background text-feedback-success-text\",\n };\n\n const shapeClasses = shape === \"circle\" ? \"rounded-full\" : \"rounded-md\";\n\n const baseClasses = twMerge(\n \"relative inline-flex items-center justify-center overflow-hidden transition-opacity\",\n sizeClasses[size],\n shapeClasses,\n onClick && \"cursor-pointer hover:opacity-80\",\n bordered && \"ring-2 ring-background-surface\",\n className\n );\n\n // Generate initials from name\n const getInitials = () => {\n if (firstName || lastName) {\n const first = firstName?.[0] || \"\";\n const last = lastName?.[0] || \"\";\n return (first + last).toUpperCase();\n }\n if (fullName) {\n const parts = fullName.split(\" \");\n const first = parts[0]?.[0] || \"\";\n const last = parts[parts.length - 1]?.[0] || \"\";\n return first === last ? first.toUpperCase() : (first + last).toUpperCase();\n }\n return \"\";\n };\n\n const initials = getInitials();\n\n // Get the appropriate icon for the variant\n const getIcon = () => {\n const iconSize = {\n xs: 14,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n }[size];\n\n switch (variant) {\n case \"team\":\n return <Users size={iconSize} />;\n case \"organization\":\n return <Building2 size={iconSize} />;\n default:\n return <User size={iconSize} />;\n }\n };\n\n const renderAvatar = () => {\n // If src is provided, render image with CSS fallback\n if (src) {\n return (\n <>\n <img\n src={src}\n alt={alt || fullName || \"Avatar\"}\n className=\"h-full w-full object-cover\"\n // Use CSS to hide broken images\n style={{\n // This will hide the broken image icon\n fontSize: 0,\n }}\n />\n {/* Render fallback behind the image - will show if image fails */}\n <div className=\"absolute inset-0 flex items-center justify-center -z-10\">\n {initials ? <span className=\"font-semibold\">{initials}</span> : getIcon()}\n </div>\n </>\n );\n }\n\n // Show initials if available\n if (initials) {\n return <span className=\"font-semibold\">{initials}</span>;\n }\n\n // Show icon as fallback\n return getIcon();\n };\n\n return (\n <div className=\"relative inline-block\">\n <div\n className={twMerge(baseClasses, !src ? variantColors[variant] : \"\")}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {renderAvatar()}\n </div>\n {status && (\n <span\n className={twMerge(\n \"absolute border-2 border-background-surface\",\n shapeClasses,\n statusSizeClasses[size],\n statusPositionClasses[size],\n statusColors[status]\n )}\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface BadgeProps {\n /** The content to display inside the badge */\n children: React.ReactNode;\n /** Visual variant of the badge */\n variant?:\n | \"default\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"info\"\n | \"primary\"\n | \"secondary\"\n | \"neutral\";\n /** Size of the badge */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Shape of the badge */\n shape?: \"pill\" | \"rounded\" | \"square\";\n /** Whether to show a dot indicator */\n dot?: boolean;\n /** Position of the dot */\n dotPosition?: \"left\" | \"right\";\n /** Additional CSS classes */\n className?: string;\n}\n\nconst badgeVariantStyles = {\n default: \"bg-feedback-info-background text-feedback-info-text\", // Default uses proper info colors\n success: \"bg-feedback-success-background text-feedback-success-text\",\n error: \"bg-feedback-error-background text-feedback-error-text\",\n warning: \"bg-feedback-warning-background text-feedback-warning-text\",\n info: \"bg-feedback-info-background text-feedback-info-text\",\n primary: \"bg-action-primary/10 text-action-primary\",\n secondary: \"bg-action-secondary/10 text-action-secondary\",\n neutral: \"bg-background-muted text-text-muted\", // Neutral gray for inactive/false states\n};\n\nconst badgeSizeStyles = {\n sm: \"px-2 py-1.5 text-xs\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3.5 py-2.5 text-base\",\n};\n\nconst badgeShapeStyles = {\n pill: \"rounded-full\",\n rounded: \"rounded-lg\",\n square: \"rounded-sm\",\n};\n\nconst dotSizeStyles = {\n sm: \"w-1.5 h-1.5\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n};\n\n/**\n * Badge\n *\n * A non-interactive label for displaying status, counts, or categories.\n * Use for read-only indicators. For interactive elements, use Chip instead.\n */\nexport function Badge({\n children,\n variant = \"default\",\n size = \"sm\",\n shape = \"square\",\n dot = false,\n dotPosition = \"left\",\n className,\n}: BadgeProps) {\n const dotElement = dot && (\n <span\n className={twMerge(\"rounded-full bg-current opacity-75\", dotSizeStyles[size])}\n aria-hidden=\"true\"\n />\n );\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1.5 font-medium\",\n badgeSizeStyles[size],\n badgeShapeStyles[shape],\n badgeVariantStyles[variant],\n className\n )}\n >\n {dot && dotPosition === \"left\" && dotElement}\n {children}\n {dot && dotPosition === \"right\" && dotElement}\n </span>\n );\n}\n","import { ReactNode } from \"react\";\n\nexport interface TextLinkProps {\n href?: string;\n children: ReactNode;\n className?: string;\n external?: boolean;\n title?: string;\n variant?: \"default\" | \"primary\" | \"muted\";\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n asButton?: boolean;\n onPress?: () => void;\n showArrow?: boolean;\n}\n\nexport const TextLink = ({\n href,\n children,\n className = \"\",\n external = false,\n title,\n variant = \"default\",\n onClick,\n asButton = false,\n onPress,\n showArrow = false,\n}: TextLinkProps) => {\n const externalProps = external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {};\n\n const baseClasses = \"hover:underline hover:decoration-1 hover:underline-offset-4 cursor-pointer\";\n\n const variantClasses = {\n default: \"text-text-link-default hover:text-text-link-hover visited:text-text-link-default\",\n primary: \"text-action-primary hover:text-action-primary-hover visited:text-action-primary\",\n muted: \"text-text-muted hover:text-text-muted visited:text-text-muted\",\n };\n\n const combinedClasses = `${baseClasses} ${variantClasses[variant]} ${className}`;\n\n const content = (\n <>\n {children}\n {showArrow && <span>{\"\\u00A0\"}→</span>}\n </>\n );\n\n if (asButton) {\n return (\n <button type=\"button\" className={combinedClasses} onClick={onPress} title={title}>\n {content}\n </button>\n );\n }\n\n return (\n <a\n href={href || \"#\"}\n className={combinedClasses}\n {...externalProps}\n title={title}\n onClick={onClick}\n >\n {content}\n </a>\n );\n};\n\nexport default TextLink;\n","\"use client\";\nimport { ChevronRight } from \"lucide-react\";\nimport {\n Breadcrumb as AriaBreadcrumb,\n Breadcrumbs as AriaBreadcrumbs,\n type BreadcrumbProps,\n type BreadcrumbsProps,\n} from \"react-aria-components\";\n\n// Re-export types for consumers\nexport type { BreadcrumbProps, BreadcrumbsProps };\n\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { TextLink } from \"../TextLink\";\n\n/**\n * Breadcrumbs\n *\n * Navigation breadcrumbs that show the user's current location in the hierarchy\n */\nexport function Breadcrumbs<T extends object>(props: BreadcrumbsProps<T>) {\n return <AriaBreadcrumbs {...props} className={twMerge(\"flex gap-1\", props.className)} />;\n}\n\n/**\n * Breadcrumb\n *\n * Individual breadcrumb item with optional link\n */\nexport function Breadcrumb(props: BreadcrumbProps & { href?: string }) {\n const { className, children, href, ...restProps } = props;\n return (\n <AriaBreadcrumb\n className={composeTailwindRenderProps(className, \"flex items-center gap-1\")}\n {...restProps}\n >\n {(renderProps) => (\n <>\n <TextLink variant=\"muted\" href={href}>\n {typeof children === \"function\" ? children(renderProps) : children}\n </TextLink>\n {href && <ChevronRight className=\"h-3 w-3 text-text-muted\" />}\n </>\n )}\n </AriaBreadcrumb>\n );\n}\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 { 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=\"primary\" size=\"md\" icon=\"Check\">Save</Button>\n * ```\n */\nexport interface ButtonProps extends BaseButtonProps {\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\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-sm whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default:\n \"bg-neutral-black text-neutral-white hover:brightness-90 forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n primary:\n \"bg-action-primary text-neutral-white hover:brightness-90 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-action-destructive border-2 border-border-muted hover:bg-action-destructive/5 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[Mark]\",\n link: \"!text-action-primary hover:text-action-primary/90 hover:underline hover:decoration-2 hover:underline-offset-4\",\n icon: \"border-none text-text-body hover:bg-text-body/5 forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace] p-2 flex-shrink-0\",\n unstyled: \"bg-transparent\",\n};\n\nconst widthStyles = {\n full: \"w-full\",\n default: \"w-fit\",\n};\n\nconst disabledStyles = \"opacity-control-hover cursor-not-allowed pointer-events-none grayscale\";\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-primary text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\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 let styles = variant === \"unstyled\" ? \"\" : `${baseStyles} ${variantStyles[variant]}`;\n\n // Add size styles using controlStyles\n if (variant !== \"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 return `${styles} ${focusRing()}`;\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 ? (\n <Icon name={icon} className={`icon-[--control-icon-size-${size}]`} weight={iconWeight} />\n ) : 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\n name=\"CircleNotch\"\n className={`animate-spin icon-[--control-icon-size-${size}]`}\n aria-hidden=\"true\"\n />\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 as a string\n const composedClassName = [getButtonStyles(props), className, isLoading ? \"aria-busy\" : \"\"]\n .filter(Boolean)\n .join(\" \");\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 {...linkProps} style={style} className={composedClassName}>\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 {...restProps} style={style} className={composedClassName}>\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 (badgeNumber && badgeNumber > 0) {\n return (\n <div className=\"relative\">\n {buttonOrLink}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return buttonOrLink;\n}\n","import {\n Calendar as AriaCalendar,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarProps as AriaCalendarProps,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n CalendarHeaderCell,\n DateValue,\n Heading,\n Text,\n useLocale,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\nfunction getCellStyles({ isSelected, isDisabled }: { isSelected: boolean; isDisabled: boolean }) {\n const baseStyles = [\n focusRing,\n \"w-9 h-9 text-base cursor-default rounded-full flex items-center justify-center forced-color-adjust-none\",\n ];\n\n if (isDisabled) {\n baseStyles.push(\"text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]\");\n } else if (isSelected) {\n baseStyles.push(\n \"bg-blue-600 invalid:bg-red-600 text-white forced-colors:bg-[Highlight] forced-colors:invalid:bg-[Mark] forced-colors:text-[HighlightText]\"\n );\n } else {\n baseStyles.push(\n \"text-zinc-900 dark:text-zinc-200 hover:bg-gray-100 dark:hover:bg-zinc-700 pressed:bg-gray-200 dark:pressed:bg-zinc-600\"\n );\n }\n\n return baseStyles.join(\" \");\n}\n\n/**\n * Calendar\n *\n * Single-date calendar primitive with Edges styling.\n */\nexport interface CalendarProps<T extends DateValue>\n extends Omit<AriaCalendarProps<T>, \"visibleDuration\"> {\n errorMessage?: string;\n}\n\nexport function Calendar<T extends DateValue>({ errorMessage, ...props }: CalendarProps<T>) {\n return (\n <AriaCalendar {...props}>\n <CalendarHeader />\n <CalendarGrid>\n <CalendarGridHeader />\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className={({ isSelected, isDisabled }) => getCellStyles({ isSelected, isDisabled })}\n />\n )}\n </CalendarGridBody>\n </CalendarGrid>\n {errorMessage && (\n <Text slot=\"errorMessage\" className=\"text-sm text-red-600\">\n {errorMessage}\n </Text>\n )}\n </AriaCalendar>\n );\n}\n\nexport function CalendarHeader() {\n const { direction } = useLocale();\n\n const buttonSize = 18;\n\n return (\n <header className=\"flex w-full items-center gap-1 px-1 pb-4\">\n <Button variant=\"icon\" slot=\"previous\" className=\"pl-0\">\n {direction === \"rtl\" ? (\n <Icon name=\"CaretRight\" aria-hidden size={buttonSize} />\n ) : (\n <Icon name=\"CaretLeft\" aria-hidden size={buttonSize} />\n )}\n </Button>\n <Heading className=\"text-md mx-2 flex-1 text-center font-semibold text-zinc-900 dark:text-zinc-200\" />\n <Button variant=\"icon\" slot=\"next\" className=\"pr-0\">\n {direction === \"rtl\" ? (\n <Icon name=\"CaretLeft\" aria-hidden size={buttonSize} />\n ) : (\n <Icon name=\"CaretRight\" aria-hidden size={buttonSize} />\n )}\n </Button>\n </header>\n );\n}\n\nexport function CalendarGridHeader() {\n return (\n <AriaCalendarGridHeader>\n {(day) => (\n <CalendarHeaderCell className=\"text-xs font-semibold text-text-caption\">\n {day}\n </CalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\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?: keyof JSX.IntrinsicElements;\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","\"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\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(--skeleton-base)] via-[var(--skeleton-highlight)] to-[var(--skeleton-base)]\"\n : \"bg-[var(--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(--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={{ width: lineWidth, height }}\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={{ width, height }}\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=\"primary\">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 <div className=\"p-6\">\n <Skeleton width=\"100%\" height={200} />\n </div>\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 if (isLoading) {\n return (\n <div className={twMerge(\"px-6 py-4\", 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 { Check, Minus } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n CheckboxGroup as AriaCheckboxGroup,\n CheckboxGroupProps as AriaCheckboxGroupProps,\n CheckboxProps as AriaCheckboxProps,\n CheckboxRenderProps,\n composeRenderProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Description, FieldError, Label } from \"../Field\";\n\n/**\n * CheckboxGroup\n *\n * Groups multiple checkboxes with shared label/description.\n */\nexport interface CheckboxGroupProps extends Omit<AriaCheckboxGroupProps, \"children\"> {\n label?: string;\n children?: ReactNode;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n}\n\n/**\n * Checkbox\n *\n * Single checkbox with Edges visuals.\n */\nexport interface CheckboxProps extends Omit<AriaCheckboxProps, \"children\"> {\n children?: ReactNode | ((props: CheckboxRenderProps) => ReactNode);\n}\n\nexport function CheckboxGroup(props: CheckboxGroupProps) {\n return (\n <AriaCheckboxGroup\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-2\")}\n >\n <Label>{props.label}</Label>\n {props.children}\n {props.description && <Description>{props.description}</Description>}\n <FieldError>\n {typeof props.errorMessage === \"function\" ? undefined : props.errorMessage}\n </FieldError>\n </AriaCheckboxGroup>\n );\n}\n\nfunction getCheckboxStyles({ isDisabled }: { isDisabled?: boolean }) {\n return `flex gap-2 items-center group text-sm transition ${isDisabled ? \"text-text-disabled\" : \"text-text-caption\"}`;\n}\n\nfunction getBoxStyles({\n isSelected,\n isInvalid,\n isDisabled,\n isIndeterminate,\n}: {\n isSelected?: boolean;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isIndeterminate?: boolean;\n}) {\n const baseStyles =\n \"w-5 h-5 flex-shrink-0 rounded flex items-center justify-center border-2 transition ring-offset-2 focus:ring-2 focus:ring-border-focus\";\n\n let colorStyles = \"\";\n if (isDisabled) {\n colorStyles = \"border-border-muted bg-background-muted\";\n } else if (isInvalid) {\n colorStyles = \"border-feedback-error-border bg-feedback-error-background\";\n } else if (isSelected || isIndeterminate) {\n colorStyles =\n \"bg-action-primary border-action-primary hover:bg-action-primary-hover hover:border-action-primary-hover\";\n } else {\n colorStyles = \"bg-background-input border-border-input hover:border-border-focus\";\n }\n\n return `${baseStyles} ${colorStyles}`;\n}\n\nconst iconStyles = \"w-4 h-4 text-text-onPrimary group-disabled:text-text-disabled\";\n\nexport function Checkbox(props: CheckboxProps) {\n const { children, ...otherProps } = props;\n return (\n <AriaCheckbox\n {...otherProps}\n className={composeRenderProps(\n props.className,\n (className, renderProps) => `${getCheckboxStyles(renderProps)} ${className || \"\"}`\n )}\n >\n {(renderProps) => {\n const { isSelected, isIndeterminate, ...rest } = renderProps;\n const checkboxContent = (\n <div\n className={getBoxStyles({\n isSelected,\n isIndeterminate,\n ...rest,\n })}\n >\n {isIndeterminate ? (\n <Minus aria-hidden className={iconStyles} />\n ) : isSelected ? (\n <Check aria-hidden className={iconStyles} />\n ) : null}\n </div>\n );\n\n return (\n <>\n {checkboxContent}\n {typeof children === \"function\" ? children(renderProps) : children}\n </>\n );\n }}\n </AriaCheckbox>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon/Icon\";\n\nexport interface ChipProps {\n /** The content to display inside the chip */\n children: React.ReactNode;\n /** Callback when the remove button is clicked */\n onRemove?: () => void;\n /** Size variant of the chip */\n size?: Size;\n /** Visual variant of the chip */\n variant?: \"default\" | \"primary\" | \"secondary\";\n /** Whether the chip can be removed (shows X button) */\n isRemovable?: boolean;\n /** Whether the chip is disabled */\n isDisabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Click handler for the chip itself (not the remove button) */\n onClick?: () => void;\n}\n\nconst chipVariantStyles = {\n default:\n \"bg-background-muted text-text-body border border-border-muted hover:bg-background-hover\",\n primary:\n \"bg-action-primary/10 text-action-primary border border-action-primary/20 hover:bg-action-primary/15\",\n secondary:\n \"bg-background-input text-text-body border border-border-input hover:bg-background-hover\",\n};\n\nconst chipSizeStyles = {\n sm: \"px-2 py-1 gap-1\",\n md: \"px-3 py-1.5 gap-1.5\",\n lg: \"px-3 py-2 gap-2\",\n xl: \"px-4 py-2.5 gap-2\",\n};\n\nconst disabledStyles = \"opacity-75 cursor-not-allowed pointer-events-none\";\n\nfunction getChipStyles(props: {\n variant: NonNullable<ChipProps[\"variant\"]>;\n size: NonNullable<ChipProps[\"size\"]>;\n isDisabled?: boolean;\n isClickable?: boolean;\n className?: string;\n}) {\n const { variant, size, isDisabled, isClickable, className } = props;\n\n return twMerge(\n // Base styles\n \"inline-flex items-center justify-center rounded-full font-medium transition-colors\",\n \"whitespace-nowrap select-none\",\n\n // Size styles\n chipSizeStyles[size],\n controlStyles[size].text,\n\n // Variant styles\n chipVariantStyles[variant],\n\n // Interactive styles\n isClickable && !isDisabled && \"cursor-pointer\",\n\n // Disabled styles\n isDisabled && disabledStyles,\n\n // Custom className\n className\n );\n}\n\n/**\n * Chip\n *\n * A compact element that represents an input, attribute, or action.\n * Can be removable with an X button and supports different variants and sizes.\n */\nexport function Chip({\n children,\n onRemove,\n size = \"md\",\n variant = \"default\",\n isRemovable = true,\n isDisabled = false,\n className,\n onClick,\n}: ChipProps) {\n const isClickable = !!onClick && !isDisabled;\n const showRemoveButton = isRemovable && onRemove && !isDisabled;\n\n const handleRemoveClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (onRemove && !isDisabled) {\n onRemove();\n }\n };\n\n const handleChipClick = () => {\n if (onClick && !isDisabled) {\n onClick();\n }\n };\n\n const chipContent = (\n <>\n <span className=\"truncate\">{children}</span>\n {showRemoveButton && (\n <button\n type=\"button\"\n onClick={handleRemoveClick}\n className=\"flex-shrink-0 rounded-full p-0.5 hover:bg-black/10 transition-colors cursor-pointer\"\n aria-label=\"Remove\"\n tabIndex={-1}\n >\n <Icon\n name=\"X\"\n size={size === \"sm\" ? 12 : size === \"md\" ? 14 : 16}\n className=\"text-current opacity-70 hover:opacity-100\"\n />\n </button>\n )}\n </>\n );\n\n if (isClickable) {\n return (\n <button\n type=\"button\"\n onClick={handleChipClick}\n className={getChipStyles({ variant, size, isDisabled, isClickable, className })}\n disabled={isDisabled}\n >\n {chipContent}\n </button>\n );\n }\n\n return (\n <span className={getChipStyles({ variant, size, isDisabled, isClickable, className })}>\n {chipContent}\n </span>\n );\n}\n","\"use client\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport AceEditor from \"react-ace\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Import ace modes and themes\nimport \"ace-builds/src-noconflict/mode-json\";\nimport \"ace-builds/src-noconflict/mode-javascript\";\nimport \"ace-builds/src-noconflict/mode-typescript\";\nimport \"ace-builds/src-noconflict/mode-html\";\nimport \"ace-builds/src-noconflict/mode-css\";\nimport \"ace-builds/src-noconflict/mode-markdown\";\nimport \"ace-builds/src-noconflict/mode-yaml\";\nimport \"ace-builds/src-noconflict/mode-xml\";\nimport \"ace-builds/src-noconflict/mode-python\";\nimport \"ace-builds/src-noconflict/mode-sql\";\nimport \"ace-builds/src-noconflict/theme-github_dark\";\nimport \"ace-builds/src-noconflict/theme-github\";\nimport \"ace-builds/src-noconflict/ext-language_tools\";\n\nexport type CodeLanguage =\n | \"json\"\n | \"javascript\"\n | \"typescript\"\n | \"html\"\n | \"css\"\n | \"markdown\"\n | \"yaml\"\n | \"xml\"\n | \"python\"\n | \"sql\";\n\nexport type CodeTheme = \"github\" | \"github_dark\";\n\nexport interface CodeEditorProps {\n /**\n * The code content to display\n */\n value: string;\n /**\n * Whether the editor is read-only\n */\n readOnly?: boolean;\n /**\n * Callback when the content changes\n */\n onChange?: (value: string) => void;\n /**\n * The programming language mode\n * @default \"json\"\n */\n language?: CodeLanguage;\n /**\n * The editor theme\n * @default \"github_dark\"\n */\n theme?: CodeTheme;\n /**\n * The height of the editor. If not provided, height will be calculated based on content.\n */\n height?: string;\n /**\n * The width of the editor\n * @default \"100%\"\n */\n width?: string;\n /**\n * Additional className to apply\n */\n className?: string;\n /**\n * Line height in pixels for auto-height calculation\n * @default 19\n */\n lineHeight?: number;\n /**\n * Minimum number of lines to show when auto-sizing\n * @default 3\n */\n minLines?: number;\n /**\n * Maximum number of lines to show when auto-sizing\n * @default 50\n */\n maxLines?: number;\n /**\n * Whether to show line numbers\n * @default true\n */\n showLineNumbers?: boolean;\n /**\n * Whether to show the gutter\n * @default true\n */\n showGutter?: boolean;\n /**\n * Font size for the editor\n * @default 14\n */\n fontSize?: number;\n /**\n * Whether to wrap long lines\n * @default false\n */\n wrapEnabled?: boolean;\n}\n\n/**\n * CodeEditor\n *\n * A code editor component with syntax highlighting and various language support.\n * Built on top of Ace Editor.\n */\nexport function CodeEditor({\n value,\n readOnly = false,\n onChange,\n language = \"json\",\n theme = \"github_dark\",\n height,\n width = \"100%\",\n className,\n lineHeight = 19,\n minLines = 3,\n maxLines = 50,\n showLineNumbers = true,\n showGutter = true,\n fontSize = 14,\n wrapEnabled = false,\n}: CodeEditorProps) {\n const editorRef = useRef<AceEditor>(null);\n\n // Calculate height based on content if no height provided\n const calculatedHeight = useMemo(() => {\n if (height) return height;\n\n const lineCount = (value.match(/\\n/g) || []).length + 1;\n const lines = Math.max(minLines, Math.min(lineCount, maxLines));\n // Add some padding for the scrollbar\n return `${lines * lineHeight + 10}px`;\n }, [value, height, lineHeight, minLines, maxLines]);\n\n useEffect(() => {\n // Ensure the editor is properly sized after mounting\n if (editorRef.current?.editor) {\n editorRef.current.editor.resize();\n }\n }, [calculatedHeight]);\n\n return (\n <div\n className={twMerge(\"overflow-hidden rounded-md border border-border-input\", className)}\n style={{ width, height: calculatedHeight }}\n >\n <AceEditor\n ref={editorRef}\n mode={language}\n theme={theme}\n value={value}\n onChange={onChange}\n readOnly={readOnly}\n width=\"100%\"\n height=\"100%\"\n fontSize={fontSize}\n showPrintMargin={false}\n showGutter={showGutter}\n highlightActiveLine={!readOnly}\n setOptions={{\n useWorker: true,\n showLineNumbers,\n tabSize: 2,\n enableBasicAutocompletion: !readOnly,\n enableLiveAutocompletion: !readOnly,\n enableSnippets: !readOnly,\n showFoldWidgets: true,\n wrap: wrapEnabled,\n }}\n editorProps={{\n $blockScrolling: true,\n }}\n />\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Tooltip as AriaTooltip,\n TooltipProps as AriaTooltipProps,\n composeRenderProps,\n OverlayArrow,\n TooltipTrigger,\n} from \"react-aria-components\";\n\n/**\n * Tooltip\n *\n * Lightweight content container that appears on hover/focus/press.\n */\nexport interface TooltipProps extends Omit<AriaTooltipProps, \"children\"> {\n children: React.ReactNode;\n content: React.ReactNode;\n}\n\nconst styles = ({\n isEntering,\n isExiting,\n className,\n}: {\n isEntering?: boolean;\n isExiting?: boolean;\n className?: string;\n}) => {\n const baseClasses =\n \"max-w-[200px] group bg-slate-700 dark:bg-slate-600 border border-slate-800 dark:border-white/10 shadow-[inset_0_1px_0_0_theme(colors.gray.600)] dark:shadow-none text-white text-sm rounded-lg drop-shadow-lg will-change-transform px-3 py-1\";\n\n const enteringClasses = isEntering\n ? \"animate-in fade-in placement-bottom:slide-in-from-top-0.5 placement-top:slide-in-from-bottom-0.5 placement-left:slide-in-from-right-0.5 placement-right:slide-in-from-left-0.5 ease-out duration-200\"\n : \"\";\n\n const exitingClasses = isExiting\n ? \"animate-out fade-out placement-bottom:slide-out-to-top-0.5 placement-top:slide-out-to-bottom-0.5 placement-left:slide-out-to-right-0.5 placement-right:slide-out-to-left-0.5 ease-in duration-150\"\n : \"\";\n\n return [baseClasses, enteringClasses, exitingClasses, className].filter(Boolean).join(\" \");\n};\n\nexport function Tooltip({ children, content, ...props }: TooltipProps) {\n return (\n <TooltipTrigger delay={200}>\n {children}\n <AriaTooltip\n {...props}\n offset={10}\n className={composeRenderProps(props.className, (className, renderProps) =>\n styles({ ...renderProps, className })\n )}\n >\n <OverlayArrow>\n <svg\n width={8}\n height={8}\n viewBox=\"0 0 8 8\"\n className=\"fill-slate-700 stroke-gray-800 group-placement-left:-rotate-90 group-placement-right:rotate-90 group-placement-bottom:rotate-180 dark:fill-slate-600 dark:stroke-white/10 forced-colors:fill-[Canvas] forced-colors:stroke-[ButtonBorder]\"\n >\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n {content}\n </AriaTooltip>\n </TooltipTrigger>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface CopyToClipboardProps {\n /**\n * The value to copy to clipboard. If not provided, will use the text content of children\n */\n value?: string;\n /**\n * The content to display\n */\n children: React.ReactNode;\n /**\n * Optional className for the container\n */\n className?: string;\n /**\n * Size of the copy button, defaults to \"sm\"\n */\n size?: \"sm\" | \"md\";\n}\n\nexport function CopyToClipboard({ value, children, className, size = \"sm\" }: CopyToClipboardProps) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const handleCopy = () => {\n const textToCopy = value || (typeof children === \"string\" ? children : \"\");\n navigator.clipboard.writeText(textToCopy);\n setShowTooltip(true);\n setTimeout(() => {\n setShowTooltip(false);\n }, 2000);\n };\n\n const iconSize = size === \"sm\" ? 14 : 16;\n\n const copyButton = (\n <Button variant=\"icon\" size={size} onPress={handleCopy} className=\"!px-2\">\n <Icon name=\"Copy\" size={iconSize} />\n </Button>\n );\n\n return (\n <div className={twMerge(\"flex items-center gap-1\", className)}>\n {children}\n {showTooltip ? <Tooltip content=\"Copied!\">{copyButton}</Tooltip> : copyButton}\n </div>\n );\n}\n","import type { ScaleLinear, ScaleTime } from \"d3-scale\";\nimport { createContext, useContext } from \"react\";\n\nexport type YFormatType =\n | \"number\"\n | \"percent\"\n | \"kWh\"\n | \"kW\"\n | \"amperes\"\n | \"temperature\"\n | \"percentageChange\"\n | \"decimal\"\n | \"currency\"\n | \"scientific\"\n | \"integer\"\n | \"logarithmic\"\n | \"timeDuration\"\n | \"compact\"\n | \"si\"\n | \"bytes\"\n | \"rate\"\n | \"ordinal\"\n | \"date\"\n | \"largeCurrency\"\n | \"coordinates\"\n | \"ranked\";\n\nexport interface TooltipData {\n xValue: Date;\n series: TooltipSeries[];\n x: number;\n y: number;\n position: \"left\" | \"right\";\n}\n\nexport interface TooltipSeries {\n label: string;\n value: number;\n color: string;\n type?: \"area\" | \"line\" | \"bar\";\n}\n\ninterface ChartContextType {\n xScale: ScaleTime<number, number>;\n yScale: ScaleLinear<number, number>;\n width: number;\n height: number;\n yFormatType: YFormatType;\n animationSettings: {\n duration: number;\n ease: string;\n };\n tooltip: {\n data: TooltipData | null;\n show: (data: TooltipData) => void;\n hide: () => void;\n };\n}\n\nexport const defaultAnimationSettings = {\n duration: 0.5,\n ease: \"easeInOut\",\n};\n\nexport const ChartContext = createContext<ChartContextType | null>(null);\n\nexport type { ChartContextType };\n\nexport const useChartContext = () => {\n const context = useContext(ChartContext);\n if (!context) {\n throw new Error(\"useChartContext must be used within a ChartContextProvider\");\n }\n return context;\n};\n","\"use client\";\n\nimport { curveLinear } from \"@visx/curve\";\nimport { AreaClosed, LinePath } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React, { useId } from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface AreaSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n categoryColors?: Record<string, string>;\n}\n\nexport const AreaSeries: React.FC<AreaSeriesProps> = ({ data, color = \"#6b7280\" }) => {\n const uniqueGradientId = useId();\n const clipPathId = useId();\n const { xScale, yScale, animationSettings } = useChartContext();\n\n // Get the exact plotting area bounds from the scales\n const xRange = xScale.range();\n const yRange = yScale.range();\n\n return (\n <>\n <defs>\n <linearGradient id={uniqueGradientId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"50%\" stopColor={color} stopOpacity={0.1} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n <clipPath id={clipPathId}>\n <rect\n x={xRange[0]}\n y={yRange[1]}\n width={xRange[1] - xRange[0]}\n height={yRange[0] - yRange[1]}\n />\n </clipPath>\n </defs>\n\n <g clipPath={`url(#${clipPathId})`}>\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n <AreaClosed\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n yScale={yScale}\n fill={`url(#${uniqueGradientId})`}\n curve={curveLinear}\n />\n <LinePath\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n stroke={color}\n strokeWidth={3}\n curve={curveLinear}\n />\n </motion.g>\n </g>\n </>\n );\n};\n","\"use client\";\n\nimport { Bar } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React, { useId } from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface BarSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n opacity?: number;\n categoryColors?: Record<string, string>;\n}\n\nexport const BarSeries: React.FC<BarSeriesProps> = ({\n data,\n color = \"#6b7280\",\n opacity = 1,\n categoryColors = {},\n}) => {\n const { xScale, yScale, animationSettings } = useChartContext();\n const clipPathId = useId();\n\n // Get the exact plotting area bounds from the scales\n const xRange = xScale.range();\n const yRange = yScale.range();\n\n // Sort data points by time\n const sortedData = [...data].sort((a, b) => a.xValue.getTime() - b.xValue.getTime());\n\n // Calculate the time interval between points\n const timeInterval =\n sortedData.length > 1\n ? sortedData[1].xValue.getTime() - sortedData[0].xValue.getTime()\n : 15 * 60000; // Default to 15 minutes if only one point\n\n // Calculate bar width based on the time interval\n const barWidth = Math.abs(\n xScale(new Date(sortedData[0].xValue.getTime() + timeInterval)) - xScale(sortedData[0].xValue)\n );\n\n return (\n <>\n <defs>\n <clipPath id={clipPathId}>\n <rect\n x={xRange[0]}\n y={yRange[1]}\n width={xRange[1] - xRange[0]}\n height={yRange[0] - yRange[1]}\n />\n </clipPath>\n </defs>\n\n <g clipPath={`url(#${clipPathId})`}>\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n {sortedData.map((d, i) => {\n const x = xScale(d.xValue);\n const y = yScale(d.yValue);\n const height = yRange[0] - y;\n\n // Calculate this bar's width based on the next point\n const nextPoint = sortedData[i + 1];\n const thisBarWidth = nextPoint ? Math.abs(xScale(nextPoint.xValue) - x) : barWidth;\n\n // Get color based on category if available\n const barColor =\n d.category && categoryColors[d.category] ? categoryColors[d.category] : color;\n\n return (\n <Bar\n key={d.xValue.getTime()}\n x={x - thisBarWidth / 2}\n y={y}\n width={thisBarWidth}\n height={height}\n fill={barColor}\n opacity={opacity}\n rx={1}\n />\n );\n })}\n </motion.g>\n </g>\n </>\n );\n};\n","import { scaleLinear, scaleTime } from \"@visx/scale\";\nimport { extent, max, min } from \"d3-array\";\nimport { YFormatType } from \"../context/ChartContext\";\n\nexport type { YFormatType };\n\nexport interface BaseDataPoint {\n xValue: Date;\n yValue: number;\n category?: string;\n}\n\nexport interface ChartMargin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport const defaultMargin: ChartMargin = {\n top: 20,\n right: 20,\n bottom: 50,\n left: 60,\n};\n\nexport interface YFormatSettings {\n format: (value: number) => string;\n min?: number;\n max?: number;\n tickInterval?: number;\n tickFormat?: (value: number) => string;\n}\n\nexport function getYFormatSettings(formatType: YFormatType, currencySymbol = \"$\"): YFormatSettings {\n const safeFormat = (\n value: number | null | undefined,\n formatter: (v: number) => string\n ): string => {\n if (value == null) return \"-\";\n return formatter(value);\n };\n\n switch (formatType) {\n case \"number\":\n return {\n format: (value) => safeFormat(value, (v) => v.toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => v.toLocaleString()),\n };\n case \"percent\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)}%`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}%`),\n min: 0,\n max: 100,\n tickInterval: 20,\n };\n case \"kWh\":\n return {\n format: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)} kWh`),\n tickFormat: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)}`),\n };\n case \"kW\":\n return {\n format: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)} kW`),\n tickFormat: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)}`),\n };\n case \"amperes\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)} A`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(1)} A`),\n };\n case \"temperature\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)}°`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}°`),\n };\n case \"percentageChange\":\n return {\n format: (value) => safeFormat(value, (v) => `${v > 0 ? \"+\" : \"\"}${(v * 100).toFixed(1)}%`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${v > 0 ? \"+\" : \"\"}${(v * 100).toFixed(0)}%`),\n min: -100,\n max: 100,\n };\n case \"decimal\":\n return {\n format: (value) => safeFormat(value, (v) => v.toFixed(2)),\n tickFormat: (value) => safeFormat(value, (v) => v.toFixed(1)),\n };\n case \"currency\":\n return {\n format: (value) => safeFormat(value, (v) => `${currencySymbol}${v.toLocaleString()}`),\n tickFormat: (value) => safeFormat(value, (v) => `${currencySymbol}${v.toLocaleString()}`),\n };\n case \"scientific\":\n return {\n format: (value) => safeFormat(value, (v) => v.toExponential(2)),\n tickFormat: (value) => safeFormat(value, (v) => v.toExponential(1)),\n };\n case \"integer\":\n return {\n format: (value) => safeFormat(value, (v) => Math.round(v).toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => Math.round(v).toLocaleString()),\n };\n case \"logarithmic\":\n return {\n format: (value) => safeFormat(value, (v) => v.toExponential(1)),\n tickFormat: (value) => safeFormat(value, (v) => v.toExponential(0)),\n min: 1,\n tickInterval: 10,\n };\n case \"timeDuration\":\n return {\n format: (value) =>\n safeFormat(\n value,\n (v) => `${Math.floor(v / 60)}:${(v % 60).toString().padStart(2, \"0\")} min`\n ),\n tickFormat: (value) => safeFormat(value, (v) => `${Math.floor(v / 60)}m`),\n min: 0,\n };\n case \"compact\":\n return {\n format: (value) =>\n safeFormat(value, (v) => new Intl.NumberFormat(\"en\", { notation: \"compact\" }).format(v)),\n tickFormat: (value) =>\n safeFormat(value, (v) => new Intl.NumberFormat(\"en\", { notation: \"compact\" }).format(v)),\n };\n case \"si\":\n return {\n format: (value) =>\n safeFormat(value, (v) =>\n new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 2,\n }).format(v)\n ),\n tickFormat: (value) =>\n safeFormat(value, (v) =>\n new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(v)\n ),\n };\n case \"bytes\":\n return {\n format: (value) =>\n safeFormat(value, (v) => {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let val = v;\n while (val >= 1024 && unitIndex < units.length - 1) {\n val /= 1024;\n unitIndex++;\n }\n return `${val.toFixed(1)} ${units[unitIndex]}`;\n }),\n tickFormat: (value) =>\n safeFormat(value, (v) => {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let val = v;\n while (val >= 1024 && unitIndex < units.length - 1) {\n val /= 1024;\n unitIndex++;\n }\n return `${val.toFixed(0)} ${units[unitIndex]}`;\n }),\n min: 0,\n };\n case \"rate\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)} req/sec`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}/s`),\n };\n case \"ordinal\":\n return {\n format: (value) =>\n safeFormat(value, (v) => {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v2 = v % 100;\n return v + (suffixes[(v2 - 20) % 10] || suffixes[v2] || suffixes[0]);\n }),\n tickFormat: (value) => safeFormat(value, (v) => v.toString()),\n min: 1,\n };\n case \"date\":\n return {\n format: (value) =>\n safeFormat(value, (v) =>\n new Intl.DateTimeFormat(\"en\", { dateStyle: \"medium\" }).format(new Date(v))\n ),\n tickFormat: (value) =>\n safeFormat(value, (v) =>\n new Intl.DateTimeFormat(\"en\", { dateStyle: \"short\" }).format(new Date(v))\n ),\n min: 0,\n };\n case \"largeCurrency\":\n return {\n format: (value) => safeFormat(value, (v) => `${currencySymbol}${(v / 1e6).toFixed(2)}M`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${currencySymbol}${(v / 1e6).toFixed(0)}M`),\n };\n case \"coordinates\":\n return {\n format: (value) =>\n safeFormat(value, (v) => `${Math.abs(v).toFixed(3)}° ${v >= 0 ? \"N\" : \"S\"}`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${Math.abs(v).toFixed(1)}° ${v >= 0 ? \"N\" : \"S\"}`),\n min: -90,\n max: 90,\n };\n case \"ranked\":\n return {\n format: (value) => safeFormat(value, (v) => `Rank: ${v}`),\n tickFormat: (value) => safeFormat(value, (v) => v.toString()),\n min: 1,\n };\n default:\n return {\n format: (value) => safeFormat(value, (v) => v.toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => v.toLocaleString()),\n };\n }\n}\n\nexport const createXScale = (data: BaseDataPoint[], width: number) => {\n const dateExtent = extent(data, (d) => d.xValue) as [Date, Date];\n return scaleTime({\n range: [defaultMargin.left, width - defaultMargin.right],\n domain: dateExtent,\n nice: true,\n });\n};\n\nexport const createYScale = (data: BaseDataPoint[], height: number, formatType: YFormatType) => {\n const yFormatSettings = getYFormatSettings(formatType);\n const dataYMin = min(data, (d) => d.yValue) || 0;\n const dataYMax = max(data, (d) => d.yValue) || 0;\n const yMin =\n yFormatSettings.min !== undefined\n ? yFormatSettings.min\n : dataYMin >= 0\n ? 0 // 0 if all positive values, min is 0\n : dataYMin * 1.1; // else scale the negative values by 10% to make room for the y-axis values\n const yMax =\n yFormatSettings.max !== undefined\n ? yFormatSettings.max\n : dataYMax <= 0\n ? 0 // If all values are negative, max is 0\n : dataYMax * 1.1; // else scale the positive values by 10% to make room for the y-axis values\n return scaleLinear({\n range: [height - defaultMargin.bottom, defaultMargin.top],\n domain: [yMin, yMax],\n nice: true,\n });\n};\n\nexport const getResolvedColor = (cssVar: string): string => {\n if (typeof window === \"undefined\") return \"#000000\";\n\n const root = document.documentElement;\n const computedStyle = getComputedStyle(root);\n const value = computedStyle.getPropertyValue(cssVar).trim();\n\n // If it's a hex color, return it\n if (value.startsWith(\"#\")) return value;\n\n // If it's rgb/rgba, return it\n if (value.startsWith(\"rgb\")) return value;\n\n // If it's hsl, convert to hex (simplified conversion)\n if (value.startsWith(\"hsl\")) {\n // This is a simplified conversion - you might want a more robust solution\n return value;\n }\n\n // Default fallback\n return \"#000000\";\n};\n","import { Axis } from \"@visx/axis\";\nimport { ScaleLinear, ScaleTime } from \"d3-scale\";\nimport React from \"react\";\nimport { getYFormatSettings, YFormatType } from \"../../../utils/charts\";\n\ninterface AxisBottomProps {\n top: number;\n scale: ScaleTime<number, number>;\n width: number;\n}\n\nconst AxisBottom: React.FC<AxisBottomProps> = ({ top, scale, width }) => {\n return (\n <Axis\n orientation=\"bottom\"\n top={top}\n scale={scale}\n numTicks={Math.min(6, Math.floor(width / 100))}\n tickFormat={(value) => {\n const date = value as Date;\n return new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\",\n }).format(date);\n }}\n stroke=\"#e5e7eb\"\n tickStroke=\"#e5e7eb\"\n tickLabelProps={() => ({\n fill: \"#6b7280\",\n fontSize: 12,\n textAnchor: \"middle\",\n })}\n />\n );\n};\n\ninterface AxisLeftProps {\n left: number;\n scale: ScaleLinear<number, number>;\n yFormatType: YFormatType;\n}\n\nconst AxisLeft: React.FC<AxisLeftProps> = ({ left, scale, yFormatType }) => {\n const formatSettings = getYFormatSettings(yFormatType);\n\n return (\n <Axis\n orientation=\"left\"\n left={left}\n scale={scale}\n numTicks={5}\n tickFormat={(value) => {\n const tickFormat = formatSettings.tickFormat || formatSettings.format;\n return tickFormat(value as number);\n }}\n stroke=\"#e5e7eb\"\n tickStroke=\"#e5e7eb\"\n tickLabelProps={() => ({\n fill: \"#6b7280\",\n fontSize: 12,\n textAnchor: \"end\",\n dy: \"0.33em\",\n })}\n />\n );\n};\n\nexport const ChartAxis = {\n Bottom: AxisBottom,\n Left: AxisLeft,\n};\n","import React from \"react\";\nimport { DialogTrigger, Menu, MenuItem, Popover } from \"react-aria-components\";\nimport type { ExportType } from \"../../../utils/chartExport\";\nimport { Button } from \"../../Button\";\nimport { Icon } from \"../../Icon\";\n\ninterface LegendItem {\n category: string;\n fill: string;\n}\n\nexport interface ChartBottomBarProps {\n items: LegendItem[];\n onExport: (type: ExportType) => void | Promise<void>;\n}\n\nconst Legend: React.FC<{ items: LegendItem[] }> = ({ items }) => {\n if (items.length === 0) return null;\n\n return (\n <div className=\"flex items-center gap-4\">\n {items.map((item) => (\n <div key={item.category} className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 rounded-sm\" style={{ backgroundColor: item.fill }} />\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">{item.category}</span>\n </div>\n ))}\n </div>\n );\n};\n\nexport const ChartBottomBar: React.FC<ChartBottomBarProps> = ({ items, onExport }) => {\n const [isExporting, setIsExporting] = React.useState(false);\n const [exportingType, setExportingType] = React.useState<ExportType | null>(null);\n\n const handleExport = React.useCallback(\n async (key: React.Key) => {\n const type = key as ExportType;\n setIsExporting(true);\n setExportingType(type);\n\n try {\n await onExport(type);\n } catch (error) {\n console.error(\"Export failed:\", error);\n } finally {\n setIsExporting(false);\n setExportingType(null);\n }\n },\n [onExport]\n );\n\n return (\n <div className=\"mt-4 flex items-center justify-between overflow-y-hidden\">\n <Legend items={items} />\n <DialogTrigger>\n <Button variant=\"secondary\" size=\"sm\" isDisabled={isExporting}>\n <Icon name=\"Export\" size={16} />\n {isExporting ? \"Exporting...\" : \"Export\"}\n </Button>\n <Popover\n placement=\"top end\"\n className=\"min-w-48 p-1 bg-white dark:bg-gray-800 rounded-lg shadow-xl ring-1 ring-gray-200 dark:ring-gray-700\"\n >\n <Menu onAction={handleExport} className=\"outline-none\">\n <MenuItem\n id=\"csv\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"List\" size={14} />\n {exportingType === \"csv\" ? \"Exporting...\" : \"Export as CSV\"}\n </span>\n </MenuItem>\n <MenuItem\n id=\"svg\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"Code\" size={14} />\n {exportingType === \"svg\" ? \"Exporting...\" : \"Export as SVG\"}\n </span>\n </MenuItem>\n <MenuItem\n id=\"png\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"DownloadSimple\" size={14} />\n {exportingType === \"png\" ? \"Exporting...\" : \"Export as PNG\"}\n </span>\n </MenuItem>\n </Menu>\n </Popover>\n </DialogTrigger>\n </div>\n );\n};\n","/**\n * Chart export utilities for CSV, SVG, and PNG formats\n * Provides comprehensive export functionality for chart visualizations\n */\n\nimport { saveAs } from \"file-saver\";\nimport Papa from \"papaparse\";\nimport type React from \"react\";\nimport type { BaseDataPoint } from \"./charts\";\n\nexport type ExportType = \"csv\" | \"svg\" | \"png\";\n\nexport interface ChartExportMetadata {\n xLabel?: string;\n yLabel?: string;\n seriesLabels?: string[];\n filename?: string;\n timestamp?: boolean;\n}\n\n/**\n * Generates a filename with optional timestamp\n */\nfunction generateFilename(\n baseFilename: string,\n extension: string,\n includeTimestamp: boolean = true\n): string {\n const base = baseFilename || \"chart\";\n if (includeTimestamp) {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, -5);\n return `${base}-${timestamp}.${extension}`;\n }\n return `${base}.${extension}`;\n}\n\n/**\n * Main export function that handles all export types\n */\nexport async function exportChart(\n type: ExportType,\n datasets: BaseDataPoint[][] | BaseDataPoint[],\n metadata: ChartExportMetadata = {},\n svgRef: React.RefObject<SVGSVGElement>\n): Promise<void> {\n // Normalize datasets to always be an array of arrays\n const normalizedDatasets = Array.isArray(datasets[0])\n ? (datasets as BaseDataPoint[][])\n : [datasets as BaseDataPoint[]];\n\n try {\n switch (type) {\n case \"csv\":\n await exportAsCSV(normalizedDatasets, metadata);\n break;\n case \"svg\":\n await exportAsSVG(svgRef, metadata);\n break;\n case \"png\":\n await exportAsPNG(svgRef, metadata);\n break;\n default:\n throw new Error(`Unsupported export type: ${type}`);\n }\n } catch (error) {\n console.error(`Export failed:`, error);\n throw new Error(\n `Failed to export chart as ${type}: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart data as CSV\n */\nasync function exportAsCSV(\n datasets: BaseDataPoint[][],\n metadata: ChartExportMetadata\n): Promise<void> {\n try {\n // Create a map of all unique dates across all datasets\n const dateMap = new Map<number, Date>();\n datasets.forEach((dataset) => {\n dataset.forEach((point) => {\n const timestamp = point.xValue.getTime();\n if (!dateMap.has(timestamp)) {\n dateMap.set(timestamp, point.xValue);\n }\n });\n });\n\n // Sort dates chronologically\n const sortedDates = Array.from(dateMap.values()).sort((a, b) => a.getTime() - b.getTime());\n\n // Build rows with all series data\n const rows = sortedDates.map((date) => {\n const row: Record<string, string | number> = {\n [metadata.xLabel || \"Date\"]: date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n\n // Add value from each dataset\n datasets.forEach((dataset, index) => {\n const label = metadata.seriesLabels?.[index] || `Series ${index + 1}`;\n const point = dataset.find((p) => p.xValue.getTime() === date.getTime());\n row[label] = point ? point.yValue : \"\";\n\n // Add category if present\n if (point?.category) {\n row[`${label} Category`] = point.category;\n }\n });\n\n return row;\n });\n\n // Generate CSV using papaparse\n const csv = Papa.unparse(rows, {\n header: true,\n skipEmptyLines: true,\n });\n\n // Create and download the file\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const filename = generateFilename(\n metadata.filename || \"chart-data\",\n \"csv\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n } catch (error) {\n throw new Error(\n `CSV export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart as SVG\n */\nasync function exportAsSVG(\n svgRef: React.RefObject<SVGSVGElement>,\n metadata: ChartExportMetadata\n): Promise<void> {\n if (!svgRef.current) {\n throw new Error(\"SVG element not found\");\n }\n\n try {\n const svgElement = svgRef.current;\n\n // Clone the SVG to avoid modifying the original\n const svgClone = svgElement.cloneNode(true) as SVGElement;\n\n // Add background if not present\n const hasBackground = svgClone.querySelector(\"rect[data-background]\");\n if (!hasBackground) {\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"width\", svgClone.getAttribute(\"width\") || \"100%\");\n rect.setAttribute(\"height\", svgClone.getAttribute(\"height\") || \"100%\");\n rect.setAttribute(\"fill\", \"white\");\n rect.setAttribute(\"data-background\", \"true\");\n svgClone.insertBefore(rect, svgClone.firstChild);\n }\n\n // Serialize the SVG\n const serializer = new XMLSerializer();\n let svgString = serializer.serializeToString(svgClone);\n\n // Add XML declaration and namespace if not present\n if (!svgString.includes(\"<?xml\")) {\n svgString = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + svgString;\n }\n\n // Ensure SVG namespace is present\n if (!svgString.includes(\"xmlns=\")) {\n svgString = svgString.replace(\"<svg\", '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n }\n\n // Create and download the file\n const blob = new Blob([svgString], { type: \"image/svg+xml;charset=utf-8\" });\n const filename = generateFilename(\n metadata.filename || \"chart\",\n \"svg\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n } catch (error) {\n throw new Error(\n `SVG export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart as PNG with high resolution\n */\nasync function exportAsPNG(\n svgRef: React.RefObject<SVGSVGElement>,\n metadata: ChartExportMetadata,\n scale: number = 2 // Default to 2x resolution for retina displays\n): Promise<void> {\n if (!svgRef.current) {\n throw new Error(\"SVG element not found\");\n }\n\n let objectUrl: string = \"\";\n\n try {\n const svgElement = svgRef.current;\n const bbox = svgElement.getBoundingClientRect();\n\n // Clone and prepare SVG\n const svgClone = svgElement.cloneNode(true) as SVGElement;\n\n // Set explicit dimensions\n svgClone.setAttribute(\"width\", String(bbox.width));\n svgClone.setAttribute(\"height\", String(bbox.height));\n\n // Remove any transform that might affect rendering\n svgClone.removeAttribute(\"transform\");\n\n // Ensure all text elements have explicit font settings for consistent rendering\n const textElements = svgClone.getElementsByTagName(\"text\");\n Array.from(textElements).forEach((text) => {\n if (!text.style.fontFamily) {\n text.style.fontFamily = \"system-ui, -apple-system, sans-serif\";\n }\n if (!text.style.fontSize) {\n text.style.fontSize = \"12px\";\n }\n });\n\n // Add white background\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"width\", String(bbox.width));\n rect.setAttribute(\"height\", String(bbox.height));\n rect.setAttribute(\"fill\", \"white\");\n svgClone.insertBefore(rect, svgClone.firstChild);\n\n // Convert SVG to blob\n const serializer = new XMLSerializer();\n let svgString = serializer.serializeToString(svgClone);\n\n // Add namespace\n if (!svgString.includes(\"xmlns=\")) {\n svgString = svgString.replace(\"<svg\", '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n }\n\n const svgBlob = new Blob([svgString], { type: \"image/svg+xml;charset=utf-8\" });\n objectUrl = URL.createObjectURL(svgBlob);\n\n // Convert to PNG using canvas\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n // Set up timeout to prevent hanging\n const timeout = setTimeout(() => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error(\"Image loading timeout\"));\n }, 10000);\n\n image.onload = () => {\n clearTimeout(timeout);\n\n try {\n // Create canvas with scaling for high resolution\n const canvas = document.createElement(\"canvas\");\n canvas.width = bbox.width * scale;\n canvas.height = bbox.height * scale;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Canvas context not available\");\n }\n\n // Enable image smoothing for better quality\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n // Scale the context for high resolution\n ctx.scale(scale, scale);\n\n // Fill with white background\n ctx.fillStyle = \"white\";\n ctx.fillRect(0, 0, bbox.width, bbox.height);\n\n // Draw the image\n ctx.drawImage(image, 0, 0, bbox.width, bbox.height);\n\n // Convert canvas to blob\n canvas.toBlob(\n (blob) => {\n if (blob) {\n const filename = generateFilename(\n metadata.filename || \"chart\",\n \"png\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n resolve();\n } else {\n reject(new Error(\"Failed to create PNG blob\"));\n }\n\n // Clean up\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n },\n \"image/png\",\n 1.0 // Maximum quality\n );\n } catch (error) {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(error);\n }\n };\n\n image.onerror = () => {\n clearTimeout(timeout);\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error(\"Failed to load SVG as image\"));\n };\n\n // Load the image\n image.src = objectUrl;\n });\n } catch (error) {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n throw new Error(\n `PNG export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Utility to check if export is supported in the current environment\n */\nexport function isExportSupported(type: ExportType): boolean {\n if (typeof window === \"undefined\") return false;\n\n switch (type) {\n case \"csv\":\n return true; // Always supported\n case \"svg\":\n return typeof XMLSerializer !== \"undefined\";\n case \"png\":\n return (\n typeof HTMLCanvasElement !== \"undefined\" &&\n typeof HTMLCanvasElement.prototype.toBlob === \"function\"\n );\n default:\n return false;\n }\n}\n\n/**\n * Get human-readable export format name\n */\nexport function getExportFormatName(type: ExportType): string {\n const formats: Record<ExportType, string> = {\n csv: \"CSV Spreadsheet\",\n svg: \"SVG Vector Image\",\n png: \"PNG Image\",\n };\n return formats[type] || \"Unknown Format\";\n}\n","/**\n * Color utilities for the edges design system\n * Provides theme-aware color resolution and management\n */\n\n// Cache for resolved CSS variable colors\nconst colorCache = new Map<string, string>();\n\n/**\n * Resolves a CSS variable to its computed color value\n * Supports both var(--name) format and plain --name format\n *\n * @param variableName - CSS variable name (e.g., \"--brand-primary\" or \"var(--brand-primary)\")\n * @returns Resolved color value or fallback\n */\nexport const getResolvedColor = (variableName: string, fallback = \"#000000\"): string => {\n // Early return if running in non-browser environment\n if (typeof window === \"undefined\") return fallback;\n\n // Normalize the variable name\n const varName = variableName.startsWith(\"var(\")\n ? variableName.slice(4, -1)\n : variableName.startsWith(\"--\")\n ? variableName\n : `--${variableName}`;\n\n // Return cached value if available\n if (colorCache.has(varName)) {\n return colorCache.get(varName)!;\n }\n\n try {\n // Get computed style from root element\n const root = document.documentElement;\n const computedStyle = getComputedStyle(root);\n const value = computedStyle.getPropertyValue(varName).trim();\n\n if (value) {\n // Cache the result\n colorCache.set(varName, value);\n return value;\n }\n\n // Try alternative method with temporary element\n const tempElement = document.createElement(\"div\");\n tempElement.style.color = `var(${varName})`;\n document.body.appendChild(tempElement);\n const resolvedColor = getComputedStyle(tempElement).color;\n document.body.removeChild(tempElement);\n\n if (resolvedColor && resolvedColor !== \"rgb(0, 0, 0)\") {\n colorCache.set(varName, resolvedColor);\n return resolvedColor;\n }\n\n return fallback;\n } catch (error) {\n console.warn(`Failed to resolve color for ${variableName}:`, error);\n return fallback;\n }\n};\n\n/**\n * Clears the color cache - useful when theme changes\n */\nexport const clearColorCache = () => {\n colorCache.clear();\n};\n\n/**\n * Gets theme colors from CSS variables\n * Returns an array of resolved color values\n */\nexport const getThemeCategoricalColors = (): string[] => {\n const colors: string[] = [];\n\n // Try to get categorical colors from CSS variables\n for (let i = 1; i <= 10; i++) {\n const color = getResolvedColor(`--data-categorical-${i}`);\n if (color) {\n colors.push(color);\n }\n }\n\n // Fallback to default palette if no theme colors found\n if (colors.length === 0) {\n return getDefaultColors();\n }\n\n return colors;\n};\n\n/**\n * Default color palette matching the edges design system\n */\nexport const getDefaultColors = (): string[] => [\n \"#444ae1\", // brand-primary\n \"#10b981\", // emerald-500\n \"#f59e0b\", // amber-500\n \"#ef4444\", // red-500\n \"#8b5cf6\", // violet-500\n \"#06b6d4\", // cyan-500\n \"#ec4899\", // pink-500\n \"#f97316\", // orange-500\n \"#14b8a6\", // teal-500\n \"#6366f1\", // indigo-500\n];\n\n/**\n * Gets the default chart color from theme\n */\nexport const getDefaultChartColor = (): string => {\n return getResolvedColor(\"--data-default\", \"#444ae1\");\n};\n\n/**\n * Maps categories to colors based on a color scheme\n */\nexport const createCategoryColorMap = (\n categories: string[],\n customColors?: Record<string, string>\n): Record<string, string> => {\n const colorMap: Record<string, string> = {};\n const themeColors = getThemeCategoricalColors();\n\n categories.forEach((category, index) => {\n if (customColors && customColors[category]) {\n // Use custom color if provided\n colorMap[category] = customColors[category];\n } else {\n // Use theme color based on index\n colorMap[category] = themeColors[index % themeColors.length];\n }\n });\n\n return colorMap;\n};\n\n/**\n * Determines if a color is light or dark\n * Useful for determining text color on colored backgrounds\n */\nexport const isLightColor = (color: string): boolean => {\n // Convert to RGB\n const rgb = color.match(/\\d+/g);\n if (!rgb || rgb.length < 3) return true;\n\n // Calculate luminance\n const [r, g, b] = rgb.map(Number);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n return luminance > 0.5;\n};\n\n/**\n * Gets contrasting text color for a background\n */\nexport const getContrastingTextColor = (backgroundColor: string): string => {\n if (isLightColor(backgroundColor)) {\n return getResolvedColor(\"--text-body\", \"#333333\");\n }\n return getResolvedColor(\"--neutral-white\", \"#ffffff\");\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\nimport { TooltipData } from \"../../../context/ChartContext\";\nimport { getYFormatSettings, YFormatType } from \"../../../utils/charts\";\n\ninterface ChartTooltipProps {\n data: TooltipData | null;\n formatType: YFormatType;\n}\n\nexport const ChartTooltip: React.FC<ChartTooltipProps> = ({ data, formatType }) => {\n if (!data) return null;\n\n const formatSettings = getYFormatSettings(formatType);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const [position, setPosition] = React.useState({\n x: 0,\n y: 0,\n translate: \"translate(-50%, -100%)\",\n });\n\n React.useEffect(() => {\n if (!tooltipRef.current) return;\n\n const tooltip = tooltipRef.current;\n const rect = tooltip.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n const x = data.x;\n let y = data.y;\n const translate =\n data.position === \"left\" ? \"translate(calc(-100% - 16px), -50%)\" : \"translate(16px, -50%)\";\n\n // Handle vertical positioning\n if (y - rect.height / 2 < 0) {\n y = rect.height / 2;\n } else if (y + rect.height / 2 > viewportHeight) {\n y = viewportHeight - rect.height / 2;\n }\n\n setPosition({ x, y, translate });\n }, [data.x, data.y, data.position]);\n\n const formatDate = (date: Date) => {\n return new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n };\n\n return (\n <AnimatePresence>\n <motion.div\n ref={tooltipRef}\n role=\"tooltip\"\n aria-live=\"polite\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n data-testid=\"tooltip\"\n className=\"pointer-events-none absolute z-50 rounded-lg bg-white p-4 text-sm shadow-xl ring-1 ring-gray-200 dark:bg-gray-800 dark:ring-gray-700\"\n style={{\n left: position.x,\n top: position.y,\n transform: position.translate,\n }}\n >\n <time className=\"mb-1 font-medium text-gray-900 dark:text-gray-100\">\n {formatDate(data.xValue)}\n </time>\n <ul className=\"list-none p-0\">\n {data.series.map((series) => (\n <li key={series.label} className=\"flex items-center gap-2 py-0.5\">\n <div className=\"h-2 w-2 rounded-full\" style={{ backgroundColor: series.color }} />\n <span className=\"font-medium text-gray-700 dark:text-gray-300\">{series.label}:</span>\n <span className=\"text-gray-600 dark:text-gray-400\">\n {formatSettings.format(series.value)}\n </span>\n </li>\n ))}\n </ul>\n </motion.div>\n </AnimatePresence>\n );\n};\n","\"use client\";\n\nimport { curveLinear } from \"@visx/curve\";\nimport { LinePath } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface LineSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n strokeWidth?: number;\n /** CSS stroke-dasharray value (e.g. \"4 2\" for dotted, \"8 4\" for dashed) */\n strokeDasharray?: string;\n categoryColors?: Record<string, string>;\n}\n\nexport const LineSeries: React.FC<LineSeriesProps> = ({\n data,\n color = \"#6b7280\",\n strokeWidth = 3,\n strokeDasharray,\n}) => {\n const { xScale, yScale, animationSettings } = useChartContext();\n const yRange = yScale.range();\n\n return (\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n <LinePath\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n strokeLinecap=\"round\"\n curve={curveLinear}\n />\n </motion.g>\n );\n};\n","\"use client\";\n\nimport { withParentSize } from \"@visx/responsive\";\nimport { Line } from \"@visx/shape\";\nimport { bisector } from \"d3-array\";\nimport React, { Children, isValidElement, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n ChartContext,\n defaultAnimationSettings,\n TooltipData,\n YFormatType,\n} from \"../../../context/ChartContext\";\nimport { type ExportType, exportChart } from \"../../../utils/chartExport\";\nimport { BaseDataPoint, createXScale, createYScale, defaultMargin } from \"../../../utils/charts\";\nimport { getDefaultChartColor, getThemeCategoricalColors } from \"../../../utils/colors\";\nimport { Skeleton } from \"../../Skeleton\";\nimport { AreaSeries } from \"../AreaSeries\";\nimport { BarSeries } from \"../BarSeries\";\nimport { ChartAxis } from \"../ChartAxis\";\nimport { ChartBottomBar } from \"../ChartBottomBar\";\nimport { ChartTooltip } from \"../ChartTooltip\";\nimport { LineSeries } from \"../LineSeries\";\n\ninterface ChartContainerProps {\n children: React.ReactNode;\n parentWidth: number;\n parentHeight: number;\n yFormatType?: YFormatType;\n isLoading?: boolean;\n}\n\nconst bisectDate = bisector<BaseDataPoint, Date>((d) => d.xValue).left;\n\nconst ChartEmptyState: React.FC = () => (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-gray-500\">No data available</p>\n </div>\n);\n\nconst ChartLoading: React.FC = () => (\n <div className=\"flex h-full flex-col gap-4 p-4\">\n <Skeleton className=\"h-full w-full\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n);\n\nconst VisXChartContainer: React.FC<ChartContainerProps> = ({\n parentWidth,\n parentHeight,\n yFormatType = \"number\",\n isLoading = false,\n children,\n}) => {\n const [tooltipData, setTooltipData] = useState<TooltipData | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const lastMoveRef = useRef<number>(0);\n\n // Get theme-aware colors\n const themeColors = useMemo(() => getThemeCategoricalColors(), []);\n const defaultColor = useMemo(() => getDefaultChartColor(), []);\n\n // Extract datasets and metadata from children, and assign colors\n const { datasets, seriesMetadata } = useMemo(() => {\n const data: BaseDataPoint[][] = [];\n const metadata: Array<{ label: string; color: string }> = [];\n let seriesIndex = 0;\n\n // Count total series\n const totalSeries = Children.toArray(children).filter(\n (child) =>\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries) &&\n child.props.data\n ).length;\n\n Children.forEach(children, (child) => {\n if (\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries) &&\n child.props.data\n ) {\n data.push(child.props.data);\n\n // Use provided color or default\n const color =\n child.props.color ||\n (totalSeries === 1 ? defaultColor : themeColors[seriesIndex % themeColors.length]);\n\n metadata.push({\n label: child.props.label || `Series ${data.length}`,\n color,\n });\n seriesIndex++;\n }\n });\n return { datasets: data, seriesMetadata: metadata };\n }, [children]);\n\n const width = parentWidth;\n const height = parentHeight - 60; // Subtract ChartBottomBar height\n\n // Combine all datasets for scale creation\n const allData = useMemo(() => datasets.flat(), [datasets]);\n\n // Create scales based on all data\n const xScale = useMemo(() => createXScale(allData, width), [allData, width]);\n const yScale = useMemo(\n () => createYScale(allData, height, yFormatType),\n [allData, height, yFormatType]\n );\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<SVGRectElement>) => {\n const { left } = svgRef.current?.getBoundingClientRect() || { left: 0 };\n const mouseX = event.clientX - left;\n\n // Throttle the mousemove event\n if (event.timeStamp - (lastMoveRef.current || 0) < 16) {\n return;\n }\n lastMoveRef.current = event.timeStamp;\n\n // Find the closest x value\n const xValue = xScale.invert(mouseX);\n\n // Find the nearest points from all series\n const seriesData = datasets\n .map((data, datasetIndex) => {\n if (!data || data.length === 0) return null;\n\n const idx = bisectDate(data, xValue, 1);\n if (idx === 0) return { point: data[0], datasetIndex };\n if (idx >= data.length) return { point: data[data.length - 1], datasetIndex };\n\n const d0 = data[idx - 1];\n const d1 = data[idx];\n if (!d0 || !d1) return null;\n\n const distanceToD0 = Math.abs(d0.xValue.getTime() - xValue.getTime());\n const distanceToD1 = Math.abs(d1.xValue.getTime() - xValue.getTime());\n const closestPoint = distanceToD0 < distanceToD1 ? d0 : d1;\n\n return { point: closestPoint, datasetIndex };\n })\n .filter(\n (item): item is { point: BaseDataPoint; datasetIndex: number } =>\n item !== null && seriesMetadata[item.datasetIndex] !== undefined\n )\n .map(({ point, datasetIndex }) => ({\n label: seriesMetadata[datasetIndex].label,\n value: point.yValue,\n color: seriesMetadata[datasetIndex].color,\n point,\n }));\n\n if (seriesData.length === 0) {\n setTooltipData(null);\n return;\n }\n\n const tooltipX = xScale(seriesData[0].point.xValue);\n const shouldShowLeft =\n tooltipX > (width - defaultMargin.right - defaultMargin.left) / 2 + defaultMargin.left;\n\n setTooltipData({\n xValue: seriesData[0].point.xValue,\n series: seriesData.map(({ label, value, color }) => ({\n label,\n value,\n color,\n })),\n x: tooltipX,\n y: yScale(seriesData[0].value),\n position: shouldShowLeft ? \"left\" : \"right\",\n });\n },\n [datasets, seriesMetadata, xScale, yScale, width]\n );\n\n const handleMouseLeave = () => {\n setTooltipData(null);\n };\n\n const contextValue = {\n width,\n height,\n xScale,\n yScale,\n yFormatType,\n animationSettings: defaultAnimationSettings,\n tooltip: {\n data: tooltipData,\n show: setTooltipData,\n hide: () => setTooltipData(null),\n },\n };\n\n // Clone children with assigned colors\n const coloredChildren = Children.map(children, (child, index) => {\n if (\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries)\n ) {\n return React.cloneElement(child, {\n ...child.props,\n color: seriesMetadata[index]?.color,\n });\n }\n return child;\n });\n\n // Get unique series for the legend\n const uniqueSeries = seriesMetadata.map((meta) => ({\n category: meta.label,\n fill: meta.color,\n }));\n\n // Handle export\n const handleExport = useCallback(\n async (type: ExportType) => {\n try {\n await exportChart(\n type,\n datasets,\n {\n xLabel: \"Date\",\n yLabel: \"Value\",\n seriesLabels: seriesMetadata.map((s) => s.label),\n timestamp: true,\n },\n svgRef\n );\n } catch (error) {\n console.error(\"Export failed:\", error);\n // In a real app, you'd show a user-friendly error message here\n }\n },\n [datasets, seriesMetadata]\n );\n\n // Return loading state if isLoading is true\n if (isLoading) {\n return <ChartLoading />;\n }\n\n // Check if we have any data\n if (datasets.length === 0) {\n return <ChartEmptyState />;\n }\n\n return (\n <div className=\"relative flex h-full flex-col\">\n <ChartContext.Provider value={contextValue}>\n <svg width={width} height={height} className=\"overflow-visible\" ref={svgRef}>\n {/* Grid lines */}\n <g>\n {yScale.ticks(5).map((tickValue) => (\n <Line\n key={`grid-line-${tickValue}`}\n from={{ x: defaultMargin.left, y: yScale(tickValue) }}\n to={{ x: width - defaultMargin.right, y: yScale(tickValue) }}\n stroke=\"#e5e7eb\"\n strokeWidth={1}\n />\n ))}\n </g>\n\n {/* Render series */}\n {coloredChildren}\n\n {/* Axes */}\n <ChartAxis.Bottom\n top={height - defaultMargin.bottom}\n scale={xScale}\n width={width - defaultMargin.left - defaultMargin.right}\n />\n <ChartAxis.Left left={defaultMargin.left} scale={yScale} yFormatType={yFormatType} />\n\n {/* Tooltip highlights */}\n {tooltipData?.series.map((series) => (\n <g key={`highlight-${series.label}`}>\n <circle\n cx={xScale(tooltipData.xValue)}\n cy={yScale(series.value)}\n r={8}\n fill=\"white\"\n stroke={series.color}\n strokeWidth={2}\n style={{ transition: \"all 100ms ease-out\" }}\n />\n <circle\n cx={xScale(tooltipData.xValue)}\n cy={yScale(series.value)}\n r={4}\n fill={series.color}\n style={{ transition: \"all 100ms ease-out\" }}\n />\n </g>\n ))}\n\n {/* Interactive area */}\n <rect\n x={defaultMargin.left}\n y={defaultMargin.top}\n width={width - defaultMargin.left - defaultMargin.right}\n height={height - defaultMargin.top - defaultMargin.bottom}\n fill=\"transparent\"\n style={{ cursor: \"crosshair\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n />\n </svg>\n\n <ChartTooltip data={tooltipData} formatType={yFormatType} />\n <ChartBottomBar onExport={handleExport} items={uniqueSeries} />\n </ChartContext.Provider>\n </div>\n );\n};\n\n// Type assertion to fix React 19 compatibility issue with withParentSize HOC\nexport const ChartContainer = withParentSize(VisXChartContainer) as unknown as React.FC<\n Omit<ChartContainerProps, \"parentWidth\" | \"parentHeight\">\n>;\n","import type { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { CellAlignment, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\n\n/**\n * Get alignment classes for cell content\n */\nexport function getCellAlignmentClasses(align: CellAlignment = \"left\"): string {\n switch (align) {\n case \"center\":\n return \"justify-center text-center\";\n case \"right\":\n return \"justify-end text-right\";\n default:\n return \"justify-start text-left\";\n }\n}\n\n/**\n * Get text styling based on emphasis level\n */\nexport function getCellTextClasses(emphasis: CellEmphasis = \"normal\", isLink?: boolean): string {\n const emphasisClasses = {\n high: \"font-semibold text-text-body\",\n normal: \"text-text-body\",\n low: \"text-text-muted\",\n };\n\n return twMerge(\n emphasisClasses[emphasis],\n isLink && \"hover:text-action-primary cursor-pointer transition-colors\"\n );\n}\n\n/**\n * Get container classes for cells\n */\nexport function getCellContainerClasses(\n align: CellAlignment = \"left\",\n additionalClasses?: string\n): string {\n return twMerge(\"flex items-center gap-1\", getCellAlignmentClasses(align), additionalClasses);\n}\n\n/**\n * Format empty/null values consistently\n */\nexport function formatEmptyValue(value: unknown, emptyText: string = \"—\"): string {\n if (value === null || value === undefined || value === \"\") {\n return emptyText;\n }\n return String(value);\n}\n\n/**\n * Common loading skeleton sizes\n */\nexport const SKELETON_SIZES = {\n xs: \"h-4 w-12\",\n sm: \"h-4 w-20\",\n md: \"h-4 w-24\",\n lg: \"h-4 w-32\",\n xl: \"h-4 w-40\",\n} as const;\n\n/**\n * Get skeleton size based on emphasis level\n */\nexport function getSkeletonSize(emphasis: CellEmphasis = \"normal\"): string {\n const sizeMap = {\n high: SKELETON_SIZES.lg,\n normal: SKELETON_SIZES.md,\n low: SKELETON_SIZES.sm,\n };\n return sizeMap[emphasis];\n}\n\n/**\n * Resolve a value that can be either static or dynamic (function)\n */\nexport function resolveValue<T, R>(value: R | ((row: T) => R), row: T): R {\n return typeof value === \"function\" ? (value as (row: T) => R)(row) : value;\n}\n\n/**\n * Common badge/chip styles for status indicators\n */\nexport function getBadgeClasses(\n variant: \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\" = \"neutral\",\n size: \"sm\" | \"md\" = \"sm\"\n): string {\n const sizeClasses = size === \"sm\" ? \"px-2 py-0.5 text-xs\" : \"px-2.5 py-1 text-sm\";\n\n const variantClasses = {\n success: \"bg-green-100 text-green-800\",\n error: \"bg-red-100 text-red-800\",\n warning: \"bg-yellow-100 text-yellow-800\",\n info: \"bg-blue-100 text-blue-800\",\n neutral: \"bg-gray-100 text-gray-800\",\n };\n\n return twMerge(\n \"inline-flex items-center rounded-full font-medium\",\n sizeClasses,\n variantClasses[variant]\n );\n}\n\n/**\n * Determine badge variant from boolean value\n */\nexport function getBooleanBadgeVariant(value: boolean): \"success\" | \"neutral\" {\n return value ? \"success\" : \"neutral\";\n}\n\n/**\n * Get color classes for numeric values\n */\nexport function getNumericColorClasses(value: number, colorCode: boolean = false): string {\n if (!colorCode) return \"text-text-body\";\n\n if (value > 0) return \"text-green-600\";\n if (value < 0) return \"text-red-600\";\n return \"text-text-body\";\n}\n\n/**\n * Get link styling classes based on behavior\n */\nexport function getLinkClasses(behavior: LinkBehavior = \"hover\"): string {\n switch (behavior) {\n case \"visible\":\n return \"text-action-primary underline hover:text-action-primary-hover cursor-pointer\";\n case \"hover\":\n return \"hover:underline hover:text-action-primary cursor-pointer transition-colors\";\n case \"none\":\n return \"cursor-pointer\";\n default:\n return \"\";\n }\n}\n\n/**\n * Wrap content with link if href is provided\n */\nexport function wrapWithLink<T>(\n content: ReactNode,\n href?: string | ((row: T) => string),\n row?: T,\n linkBehavior: LinkBehavior = \"hover\",\n className?: string\n): ReactNode {\n if (!href) return content;\n\n const resolvedHref = typeof href === \"function\" && row ? href(row) : (href as string);\n const linkClasses = getLinkClasses(linkBehavior);\n\n return (\n <a\n href={resolvedHref}\n className={twMerge(linkClasses, className)}\n onClick={(e) => {\n // Allow cmd/ctrl click for new tab\n if (e.metaKey || e.ctrlKey) return;\n // Otherwise, you could handle client-side routing here if needed\n }}\n >\n {content}\n </a>\n );\n}\n","import { Button } from \"../../Button\";\nimport { Icon, type IconName } from \"../../Icon\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps } from \"../DataTable.types\";\nimport { getCellContainerClasses, resolveValue, SKELETON_SIZES } from \"./cellUtils\";\n\nexport interface Action<T = any> {\n id: string;\n label?: string;\n icon?: IconName;\n onClick: (row: T) => void;\n disabled?: boolean | ((row: T) => boolean);\n hidden?: boolean | ((row: T) => boolean);\n variant?: \"primary\" | \"secondary\" | \"icon\";\n}\n\nexport interface ActionCellProps<T = any> extends CellComponentProps<T> {\n actions: Action<T>[];\n align?: \"left\" | \"center\" | \"right\";\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport function ActionCell<T = any>({\n row,\n context,\n actions,\n align = \"right\",\n size = \"sm\",\n}: ActionCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={SKELETON_SIZES.sm} />;\n }\n\n const visibleActions = actions.filter((action) => {\n const hidden = resolveValue(action.hidden, row);\n return !hidden;\n });\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n const className = getCellContainerClasses(align);\n\n return (\n <div className={className}>\n {visibleActions.map((action) => {\n const disabled = resolveValue(action.disabled, row);\n\n if (action.variant === \"icon\" || !action.label) {\n return (\n <Button\n key={action.id}\n variant=\"icon\"\n size={size}\n onPress={() => {\n action.onClick(row);\n }}\n isDisabled={disabled}\n aria-label={action.label || action.id}\n >\n <Icon name={action.icon || \"DotsThree\"} size={size === \"sm\" ? 16 : 20} />\n </Button>\n );\n }\n\n return (\n <Button\n key={action.id}\n variant={action.variant || \"secondary\"}\n size={size}\n onPress={() => {\n action.onClick(row);\n }}\n isDisabled={disabled}\n >\n {action.icon && <Icon name={action.icon} size={size === \"sm\" ? 14 : 16} />}\n {action.label}\n </Button>\n );\n })}\n </div>\n );\n}\n","import { Badge } from \"../../Badge\";\nimport { Icon, type IconName } from \"../../Icon\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis } from \"../DataTable.types\";\nimport { getCellContainerClasses, getCellTextClasses, getSkeletonSize } from \"./cellUtils\";\n\nexport interface BooleanCellProps<T = any> extends CellComponentProps<T> {\n format?: \"icon\" | \"text\" | \"badge\";\n trueText?: string;\n falseText?: string;\n trueIcon?: IconName;\n falseIcon?: IconName;\n showFalse?: boolean; // Whether to show false values or leave empty\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n}\n\nexport function BooleanCell<T = any>({\n value,\n context,\n format = \"icon\",\n trueText = \"Yes\",\n falseText = \"No\",\n trueIcon = \"Check\",\n falseIcon = \"X\",\n showFalse = true,\n align = \"center\",\n emphasis = \"normal\",\n}: BooleanCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n const boolValue = Boolean(value);\n\n if (!boolValue && !showFalse) {\n return <div className={getCellContainerClasses(align)} />;\n }\n\n const containerClassName = getCellContainerClasses(align);\n\n switch (format) {\n case \"icon\":\n return (\n <div className={containerClassName}>\n <Icon\n name={boolValue ? trueIcon : falseIcon}\n size={16}\n className={boolValue ? \"text-green-600\" : \"text-gray-400\"}\n />\n </div>\n );\n\n case \"text\":\n return (\n <div className={containerClassName}>\n <span className={getCellTextClasses(emphasis)}>{boolValue ? trueText : falseText}</span>\n </div>\n );\n\n case \"badge\":\n return (\n <div className={containerClassName}>\n <Badge variant={boolValue ? \"success\" : \"neutral\"} size=\"sm\">\n {boolValue ? trueText : falseText}\n </Badge>\n </div>\n );\n\n default:\n return null;\n }\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n getCellContainerClasses,\n getCellTextClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface DateCellProps<T = any> extends CellComponentProps<T> {\n format?: \"date\" | \"time\" | \"datetime\" | \"relative\" | \"custom\";\n customFormat?: Intl.DateTimeFormatOptions;\n emptyText?: string;\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n}\n\nexport function DateCell<T = any>({\n value,\n row,\n context,\n format = \"date\",\n customFormat,\n emptyText = \"—\",\n align = \"left\",\n emphasis = \"normal\",\n href,\n linkBehavior = \"hover\",\n}: DateCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n if (!value) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n let formattedValue: string;\n\n switch (format) {\n case \"date\":\n formattedValue = date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n break;\n case \"time\":\n formattedValue = date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n break;\n case \"datetime\":\n formattedValue = date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n break;\n case \"relative\":\n formattedValue = getRelativeTime(date);\n break;\n case \"custom\":\n formattedValue = customFormat\n ? date.toLocaleString(\"en-US\", customFormat)\n : date.toISOString();\n break;\n default:\n formattedValue = date.toLocaleDateString();\n }\n\n const className = getCellContainerClasses(align, getCellTextClasses(emphasis));\n\n // If href is provided, wrap with link behavior\n const resolvedHref = resolveValue(href, row);\n if (resolvedHref) {\n return (\n <div className={className}>\n {wrapWithLink(formattedValue, resolvedHref, row, linkBehavior)}\n </div>\n );\n }\n\n return <div className={className}>{formattedValue}</div>;\n}\n\nfunction getRelativeTime(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInSecs = Math.floor(diffInMs / 1000);\n const diffInMins = Math.floor(diffInSecs / 60);\n const diffInHours = Math.floor(diffInMins / 60);\n const diffInDays = Math.floor(diffInHours / 24);\n\n if (diffInSecs < 60) {\n return \"just now\";\n } else if (diffInMins < 60) {\n return `${diffInMins} minute${diffInMins !== 1 ? \"s\" : \"\"} ago`;\n } else if (diffInHours < 24) {\n return `${diffInHours} hour${diffInHours !== 1 ? \"s\" : \"\"} ago`;\n } else if (diffInDays < 7) {\n return `${diffInDays} day${diffInDays !== 1 ? \"s\" : \"\"} ago`;\n } else {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n getCellContainerClasses,\n getCellTextClasses,\n getNumericColorClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface NumberCellProps<T = any> extends CellComponentProps<T> {\n format?: \"number\" | \"currency\" | \"percent\" | \"compact\";\n decimals?: number;\n prefix?: string;\n suffix?: string;\n emptyText?: string;\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n showPositiveSign?: boolean;\n colorCode?: boolean; // Green for positive, red for negative\n}\n\nexport function NumberCell<T = any>({\n value,\n row,\n context,\n format = \"number\",\n decimals = 0,\n prefix,\n suffix,\n emptyText = \"—\",\n align = \"right\",\n emphasis = \"normal\",\n href,\n linkBehavior = \"hover\",\n showPositiveSign = false,\n colorCode = false,\n}: NumberCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n if (value === null || value === undefined || isNaN(Number(value))) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n const numValue = Number(value);\n let formattedValue: string;\n\n switch (format) {\n case \"currency\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue);\n break;\n case \"percent\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n style: \"percent\",\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue / 100);\n break;\n case \"compact\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n minimumFractionDigits: decimals > 0 ? 1 : 0,\n maximumFractionDigits: decimals,\n }).format(numValue);\n break;\n default:\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue);\n }\n\n const sign = showPositiveSign && numValue > 0 ? \"+\" : \"\";\n const displayValue = `${sign}${formattedValue}`;\n\n // Combine emphasis classes with color coding if enabled\n const textClasses = colorCode\n ? getNumericColorClasses(numValue, true)\n : getCellTextClasses(emphasis);\n\n const className = getCellContainerClasses(align, textClasses);\n\n const content = (\n <>\n {prefix && <span className=\"text-text-muted\">{prefix}</span>}\n <span>{displayValue}</span>\n {suffix && <span className=\"text-text-muted\">{suffix}</span>}\n </>\n );\n\n // If href is provided, wrap with link behavior\n const resolvedHref = resolveValue(href, row);\n if (resolvedHref) {\n return (\n <div className={className}>{wrapWithLink(content, resolvedHref, row, linkBehavior)}</div>\n );\n }\n\n return <div className={className}>{content}</div>;\n}\n","import { Checkbox } from \"../../Checkbox\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps } from \"../DataTable.types\";\nimport { getCellContainerClasses, resolveValue } from \"./cellUtils\";\n\nexport interface SelectCellProps<T = any> extends CellComponentProps<T> {\n isSelected?: boolean;\n onSelect?: (row: T, checked: boolean) => void;\n isDisabled?: boolean | ((row: T) => boolean);\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport function SelectCell<T = any>({\n row,\n context,\n isSelected = false,\n onSelect,\n isDisabled = false,\n align = \"center\",\n}: SelectCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return (\n <div className={getCellContainerClasses(align)}>\n <Skeleton className=\"h-4 w-4 rounded\" />\n </div>\n );\n }\n\n const disabled = resolveValue(isDisabled, row);\n const className = getCellContainerClasses(align);\n\n return (\n <div className={className}>\n <Checkbox\n isSelected={isSelected}\n onChange={(checked) => {\n onSelect?.(row, checked);\n }}\n isDisabled={disabled}\n aria-label={`Select row`}\n />\n </div>\n );\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n formatEmptyValue,\n getCellContainerClasses,\n getCellTextClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface TextCellProps<T = any> extends CellComponentProps<T> {\n prefix?: string;\n suffix?: string;\n emptyText?: string;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n emphasis?: CellEmphasis;\n truncate?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport function TextCell<T = any>({\n value,\n row,\n context,\n prefix,\n suffix,\n emptyText = \"—\",\n href,\n linkBehavior = \"visible\",\n emphasis = \"normal\",\n truncate = true,\n align = \"left\",\n}: TextCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n const displayValue = formatEmptyValue(value, emptyText);\n const resolvedHref = resolveValue(href, row);\n\n const content = (\n <>\n {prefix && <span className=\"text-text-muted\">{prefix}</span>}\n <span className={truncate ? \"truncate\" : \"\"}>{displayValue}</span>\n {suffix && <span className=\"text-text-muted\">{suffix}</span>}\n </>\n );\n\n // Build the base classes without link styling\n const baseClasses = getCellContainerClasses(align, getCellTextClasses(emphasis));\n\n // If href is provided, wrap with link behavior\n if (resolvedHref) {\n return (\n <div className={baseClasses}>{wrapWithLink(content, resolvedHref, row, linkBehavior)}</div>\n );\n }\n\n return <div className={baseClasses}>{content}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport type { CellContext, Column } from \"./DataTable.types\";\n\ninterface MobileRowProps<T> {\n row: T;\n columns: Column<T>[];\n density: \"compact\" | \"default\" | \"relaxed\";\n isLoading?: boolean;\n onClick?: () => void;\n}\n\nconst BREAKPOINT_CLASSES = {\n sm: \"sm:hidden\",\n md: \"md:hidden\",\n lg: \"lg:hidden\",\n xl: \"xl:hidden\",\n} as const;\n\nconst DESKTOP_BREAKPOINT_CLASSES = {\n sm: \"hidden sm:grid\",\n md: \"hidden md:grid\",\n lg: \"hidden lg:grid\",\n xl: \"hidden xl:grid\",\n} as const;\n\n/**\n * Get the value for a column from a row\n */\nfunction getCellValue<T>(row: T, column: Column<T>): any {\n if (column.accessor) {\n if (typeof column.accessor === \"function\") {\n return column.accessor(row);\n }\n return row[column.accessor];\n }\n return null;\n}\n\n/**\n * Render a cell value for mobile view\n */\nfunction renderMobileCell<T>(\n value: any,\n row: T,\n column: Column<T>,\n context: CellContext\n): ReactNode {\n if (column.cell) {\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(value, row) : column.cellProps;\n return <CellComponent value={value} row={row} context={context} {...cellProps} />;\n }\n\n if (column.render) {\n return column.render(value, row, context);\n }\n\n // Default rendering\n return value?.toString() ?? \"—\";\n}\n\n/**\n * Automatic mobile card renderer\n * Groups columns by priority and formats them appropriately\n */\nexport function AutoMobileRenderer<T>({\n row,\n columns,\n density,\n isLoading,\n onClick,\n}: MobileRowProps<T>) {\n // Filter and sort columns by mobile config\n const mobileColumns = columns\n .filter((col) => col.mobile !== false)\n .map((col) => {\n const mobileConfig = col.mobile === false ? null : col.mobile;\n return {\n ...col,\n mobilePriority: mobileConfig?.priority ?? 2,\n mobileFormat: mobileConfig?.format ?? \"secondary\",\n showLabel: mobileConfig?.label ?? mobileConfig?.format === \"secondary\",\n icon: mobileConfig?.icon,\n };\n })\n .sort((a, b) => a.mobilePriority - b.mobilePriority);\n\n // Group columns by priority\n const primaryColumns = mobileColumns.filter(\n (col) => col.mobilePriority === 1 || col.mobileFormat === \"primary\"\n );\n const secondaryColumns = mobileColumns.filter(\n (col) => col.mobilePriority === 2 && col.mobileFormat !== \"primary\"\n );\n const badgeColumns = mobileColumns.filter((col) => col.mobileFormat === \"badge\");\n\n const context: CellContext = {\n isLoading: !!isLoading,\n rowIndex: 0,\n columnIndex: 0,\n density,\n };\n\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface transition-colors\",\n onClick && \"cursor-pointer hover:bg-background-hover active:bg-background-pressed\",\n paddingClasses[density]\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {/* Primary content - usually the main identifier */}\n {primaryColumns.length > 0 && (\n <div className=\"mb-2 flex items-start justify-between\">\n <div className=\"flex-1\">\n {primaryColumns.map((col) => {\n const value = getCellValue(row, col);\n return (\n <div\n key={col.id}\n className=\"font-medium text-text-body [&>*]:!justify-start [&>*]:!text-left\"\n >\n {renderMobileCell(value, row, col, context)}\n </div>\n );\n })}\n </div>\n {/* Badges on the right */}\n {badgeColumns.length > 0 && (\n <div className=\"ml-2 flex flex-wrap gap-1\">\n {badgeColumns.map((col) => {\n const value = getCellValue(row, col);\n return (\n <div key={col.id} className=\"inline-flex\">\n {renderMobileCell(value, row, col, context)}\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Secondary content */}\n {secondaryColumns.length > 0 && (\n <div className=\"space-y-1\">\n {secondaryColumns.map((col) => {\n const value = getCellValue(row, col);\n const showLabel = col.showLabel && col.label;\n\n return (\n <div key={col.id} className=\"flex items-center text-sm text-text-muted\">\n {col.icon && (\n <Icon name={col.icon as any} className=\"mr-1.5 h-4 w-4 flex-shrink-0\" />\n )}\n {showLabel && <span className=\"mr-1 font-medium\">{col.label}:</span>}\n <span className=\"truncate [&>*]:!justify-start [&>*]:!text-left\">\n {renderMobileCell(value, row, col, context)}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Simple card renderer - displays all columns in a simple stacked layout\n */\nexport function CardMobileRenderer<T>({\n row,\n columns,\n density,\n isLoading,\n onClick,\n}: MobileRowProps<T>) {\n const visibleColumns = columns.filter((col) => col.mobile !== false);\n\n const context: CellContext = {\n isLoading: !!isLoading,\n rowIndex: 0,\n columnIndex: 0,\n density,\n };\n\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface transition-colors\",\n onClick && \"cursor-pointer hover:bg-background-hover active:bg-background-pressed\",\n paddingClasses[density]\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className=\"space-y-2\">\n {visibleColumns.map((col, index) => {\n const value = getCellValue(row, col);\n const isFirst = index === 0;\n\n return (\n <div key={col.id}>\n {!isFirst && <div className=\"text-xs text-text-muted\">{col.label}</div>}\n <div\n className={twMerge(\n isFirst ? \"font-medium text-text-body\" : \"text-sm text-text-body\",\n \"[&>*]:!justify-start [&>*]:!text-left\" // Override any alignment from cells\n )}\n >\n {renderMobileCell(value, row, col, context)}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * Get the appropriate mobile breakpoint classes\n */\nexport function getMobileBreakpointClasses(breakpoint: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\") {\n return {\n mobile: BREAKPOINT_CLASSES[breakpoint],\n desktop: DESKTOP_BREAKPOINT_CLASSES[breakpoint],\n };\n}\n\n/**\n * Mobile loading skeleton\n */\nexport function MobileLoadingSkeleton({ density }: { density: \"compact\" | \"default\" | \"relaxed\" }) {\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface\",\n paddingClasses[density]\n )}\n >\n <div className=\"mb-2 h-5 w-3/4 animate-pulse rounded bg-background-muted\"></div>\n <div className=\"space-y-1\">\n <div className=\"h-4 w-1/2 animate-pulse rounded bg-background-muted\"></div>\n <div className=\"h-4 w-2/3 animate-pulse rounded bg-background-muted\"></div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\nimport type {\n CellContext,\n Column,\n DataTableProps,\n SortConfig,\n TableLayout,\n TableWidth,\n} from \"./DataTable.types\";\nimport {\n AutoMobileRenderer,\n CardMobileRenderer,\n getMobileBreakpointClasses,\n MobileLoadingSkeleton,\n} from \"./MobileRenderer\";\n\nconst densityClasses = {\n compact: \"py-1.5 px-3 text-sm\",\n default: \"py-3 px-4 text-sm\",\n relaxed: \"py-4 px-4 text-base\",\n};\n\nconst alignmentClasses = {\n left: \"text-left justify-start\",\n center: \"text-center justify-center\",\n right: \"text-right justify-end\",\n};\n\nconst widthClasses: Record<TableWidth, string> = {\n full: \"w-full\",\n auto: \"w-auto inline-block\",\n contained: \"w-full max-w-6xl mx-auto\",\n};\n\nconst layoutClasses: Record<TableLayout, string> = {\n auto: \"table-auto\",\n fixed: \"table-fixed\",\n responsive: \"table-auto\",\n};\n\nfunction getColumnStyles<T>(column: Column<T>) {\n const styles: React.CSSProperties = {};\n\n if (column.width !== undefined) {\n styles.width = typeof column.width === \"number\" ? `${column.width}px` : column.width;\n }\n if (column.minWidth !== undefined) {\n styles.minWidth =\n typeof column.minWidth === \"number\" ? `${column.minWidth}px` : column.minWidth;\n }\n if (column.maxWidth !== undefined) {\n styles.maxWidth =\n typeof column.maxWidth === \"number\" ? `${column.maxWidth}px` : column.maxWidth;\n }\n if (column.flex !== undefined) {\n styles.flex = `${column.flex} 1 0`;\n }\n\n return styles;\n}\n\nfunction getCellValue<T>(row: T, column: Column<T>): any {\n if (column.accessor) {\n if (typeof column.accessor === \"function\") {\n return column.accessor(row);\n }\n return row[column.accessor];\n }\n return null;\n}\n\nfunction TableHeaderCell<T>({\n column,\n sortConfig,\n onSort,\n stickyHeader,\n density = \"default\",\n}: {\n column: Column<T>;\n sortConfig: SortConfig | null;\n onSort: (columnId: string) => void;\n stickyHeader?: boolean;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n const isSorted = sortConfig?.columnId === column.id;\n const sortDirection = isSorted ? sortConfig.direction : null;\n\n return (\n <div\n className={twMerge(\n \"flex items-center gap-1 border-b border-border-default bg-background-surface font-medium text-text-muted\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"],\n stickyHeader && \"sticky top-0 z-10\",\n column.sortable && \"cursor-pointer hover:bg-background-hover\"\n )}\n onClick={() => column.sortable && onSort(column.id)}\n role=\"columnheader\"\n aria-sort={isSorted ? (sortDirection === \"asc\" ? \"ascending\" : \"descending\") : \"none\"}\n style={getColumnStyles(column)}\n >\n <span className=\"truncate\">{column.label}</span>\n {column.sortable && (\n <div className=\"flex flex-col\">\n <Icon\n name={\n sortDirection === \"asc\"\n ? \"CaretUp\"\n : sortDirection === \"desc\"\n ? \"CaretDown\"\n : \"CaretUp\"\n }\n size={12}\n className={isSorted ? \"text-text-body\" : \"text-text-muted opacity-50\"}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction TableCell<T>({\n column,\n row,\n rowIndex,\n columnIndex,\n isHovered,\n density = \"default\",\n className,\n}: {\n column: Column<T>;\n row: T;\n rowIndex: number;\n columnIndex: number;\n isHovered: boolean;\n density?: \"compact\" | \"default\" | \"relaxed\";\n className?: string;\n}) {\n const value = getCellValue(row, column);\n\n // Create the cell context\n const context: CellContext = {\n isLoading: false,\n isHovered,\n rowIndex,\n columnIndex,\n density,\n };\n\n let content;\n\n if (column.cell) {\n // Use the cell component\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(value, row) : column.cellProps;\n\n content = <CellComponent value={value} row={row} context={context} {...cellProps} />;\n } else if (column.render) {\n // Use custom render function\n content = column.render(value, row, context);\n } else {\n // Default rendering\n content = <span className=\"truncate\">{value?.toString() ?? \"\"}</span>;\n }\n\n return (\n <div\n className={twMerge(\n \"flex items-center border-b border-border-default\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"],\n className\n )}\n role=\"cell\"\n style={getColumnStyles(column)}\n >\n {content}\n </div>\n );\n}\n\nfunction LoadingCell({\n column,\n rowIndex,\n columnIndex,\n density = \"default\",\n}: {\n column: Column<any>;\n rowIndex: number;\n columnIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n const context: CellContext = {\n isLoading: true,\n rowIndex,\n columnIndex,\n density,\n };\n\n let content;\n\n if (column.cell) {\n // Use the cell component's loading state\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(null, {} as any) : column.cellProps;\n\n content = <CellComponent value={null} row={{} as any} context={context} {...cellProps} />;\n } else if (column.render) {\n // Use custom render function with loading context\n content = column.render(null, {} as any, context);\n } else {\n // Default loading skeleton\n content = <Skeleton className=\"h-4 w-full max-w-[200px]\" />;\n }\n\n return (\n <div\n className={twMerge(\n \"flex items-center border-b border-border-default\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"]\n )}\n role=\"cell\"\n style={getColumnStyles(column)}\n >\n {content}\n </div>\n );\n}\n\nfunction TableRow<T>({\n columns,\n row,\n rowIndex,\n density = \"default\",\n onClick,\n}: {\n columns: Column<T>[];\n row: T;\n rowIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n onClick?: (row: T) => void;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(() => {\n if (onClick) {\n onClick(row);\n }\n }, [onClick, row]);\n\n return (\n <div\n className={twMerge(\"contents group\", onClick && \"cursor-pointer\")}\n role=\"row\"\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {columns.map((column, columnIndex) => (\n <TableCell\n key={column.id}\n column={column}\n row={row}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n isHovered={isHovered}\n density={density}\n className={onClick ? \"group-hover:bg-background-hover\" : \"\"}\n />\n ))}\n </div>\n );\n}\n\nfunction LoadingRow({\n columns,\n rowIndex,\n density = \"default\",\n}: {\n columns: Column<any>[];\n rowIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n return (\n <div className=\"contents\" role=\"row\">\n {columns.map((column, columnIndex) => (\n <LoadingCell\n key={column.id}\n column={column}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n density={density}\n />\n ))}\n </div>\n );\n}\n\nexport function DataTable<T extends Record<string, unknown>>({\n columns,\n data,\n className,\n density = \"default\",\n width = \"full\",\n height,\n maxHeight,\n layout = \"auto\",\n mobileRenderer = \"auto\",\n customMobileRowRender,\n mobileBreakpoint = \"md\",\n isLoading = false,\n loadingRowCount = 5,\n stickyHeader = false,\n onRowClick,\n getRowId,\n hideHeader = false,\n onSort,\n \"aria-label\": ariaLabel,\n}: DataTableProps<T>) {\n const [localSortConfig, setLocalSortConfig] = useState<SortConfig | null>(null);\n\n const gridTemplateColumns = useMemo(() => {\n return columns\n .map((col) => {\n // Explicit width takes precedence\n if (col.width) {\n return typeof col.width === \"number\" ? `${col.width}px` : col.width;\n }\n // Flex-based sizing\n if (col.flex) {\n return `${col.flex}fr`;\n }\n // Min/max constraints\n if (col.minWidth && col.maxWidth) {\n const min = typeof col.minWidth === \"number\" ? `${col.minWidth}px` : col.minWidth;\n const max = typeof col.maxWidth === \"number\" ? `${col.maxWidth}px` : col.maxWidth;\n return `minmax(${min}, ${max})`;\n }\n if (col.minWidth) {\n const min = typeof col.minWidth === \"number\" ? `${col.minWidth}px` : col.minWidth;\n return `minmax(${min}, 1fr)`;\n }\n if (col.maxWidth) {\n const max = typeof col.maxWidth === \"number\" ? `${col.maxWidth}px` : col.maxWidth;\n return `minmax(0, ${max})`;\n }\n // Default to equal distribution\n return \"1fr\";\n })\n .join(\" \");\n }, [columns]);\n\n const handleSort = useCallback(\n (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n let newSortConfig: SortConfig | null = null;\n\n if (localSortConfig?.columnId === columnId) {\n if (localSortConfig.direction === \"asc\") {\n newSortConfig = { columnId, direction: \"desc\" };\n } else {\n newSortConfig = null; // Reset sort\n }\n } else {\n newSortConfig = { columnId, direction: \"asc\" };\n }\n\n setLocalSortConfig(newSortConfig);\n onSort?.(newSortConfig);\n },\n [columns, localSortConfig, onSort]\n );\n\n // Container styles for height control\n const containerStyle: React.CSSProperties = {};\n if (height) {\n containerStyle.height = typeof height === \"number\" ? `${height}px` : height;\n containerStyle.overflowY = \"auto\";\n }\n if (maxHeight) {\n containerStyle.maxHeight = typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n containerStyle.overflowY = \"auto\";\n }\n\n // Determine wrapper classes based on layout\n const wrapperClasses = twMerge(\n widthClasses[width],\n layout === \"responsive\" ? \"overflow-x-auto\" : \"overflow-auto\",\n className\n );\n\n // Get breakpoint classes for mobile/desktop visibility\n const breakpointClasses = getMobileBreakpointClasses(mobileBreakpoint);\n const showMobile = mobileRenderer !== \"none\";\n\n // Determine which mobile renderer to use\n const renderMobileRow = (row: T, index: number) => {\n if (!showMobile) return null;\n\n if (mobileRenderer === \"custom\" && customMobileRowRender) {\n return customMobileRowRender(row, index);\n }\n\n const MobileComponent = mobileRenderer === \"cards\" ? CardMobileRenderer : AutoMobileRenderer;\n\n return (\n <MobileComponent\n row={row}\n columns={columns}\n density={density}\n isLoading={isLoading}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n />\n );\n };\n\n return (\n <div className={wrapperClasses} style={containerStyle}>\n {/* Desktop View */}\n <div\n className={twMerge(\n \"grid border-separate border-spacing-0\",\n layoutClasses[layout],\n width === \"auto\" ? \"inline-grid w-auto\" : \"w-full\",\n showMobile && breakpointClasses.desktop\n )}\n role=\"table\"\n aria-label={ariaLabel}\n style={{\n gridTemplateColumns,\n }}\n >\n {/* Header */}\n {!hideHeader && (\n <div className=\"contents\" role=\"rowgroup\">\n {columns.map((column) => (\n <TableHeaderCell\n key={column.id}\n column={column}\n sortConfig={localSortConfig}\n onSort={handleSort}\n stickyHeader={stickyHeader}\n density={density}\n />\n ))}\n </div>\n )}\n\n {/* Body */}\n <div className=\"contents\" role=\"rowgroup\">\n {isLoading ? (\n // Loading state\n Array.from({ length: loadingRowCount }).map((_, index) => (\n <LoadingRow\n key={`loading-${index}`}\n columns={columns}\n rowIndex={index}\n density={density}\n />\n ))\n ) : data.length > 0 ? (\n // Data rows\n data.map((row, index) => {\n const rowId = getRowId ? getRowId(row) : `row-${index}`;\n return (\n <TableRow\n key={rowId}\n columns={columns}\n row={row}\n rowIndex={index}\n density={density}\n onClick={onRowClick}\n />\n );\n })\n ) : (\n // Empty state\n <div className=\"col-span-full py-12 text-center text-text-muted\" role=\"row\">\n <div role=\"cell\">No data available</div>\n </div>\n )}\n </div>\n </div>\n\n {/* Mobile View */}\n {showMobile && (\n <div className={breakpointClasses.mobile}>\n {isLoading ? (\n // Mobile loading state\n Array.from({ length: loadingRowCount }).map((_, index) => (\n <MobileLoadingSkeleton key={`mobile-loading-${index}`} density={density} />\n ))\n ) : data.length > 0 ? (\n // Mobile data rows\n data.map((row, index) => {\n const rowId = getRowId ? getRowId(row) : `mobile-row-${index}`;\n return <div key={rowId}>{renderMobileRow(row, index)}</div>;\n })\n ) : (\n // Mobile empty state\n <div className=\"py-12 text-center text-text-muted\">No data available</div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n DateField as AriaDateField,\n DateFieldProps as AriaDateFieldProps,\n DateInput as AriaDateInput,\n DateInputProps,\n DateSegment,\n DateValue,\n Dialog,\n DialogTrigger,\n Popover,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { Calendar } from \"../Calendar\";\nimport { Description, FieldError, FieldGroup, getFieldGroupStyles, Label } from \"../Field\";\n\n/**\n * DateField\n *\n * Segmented date input with optional calendar popup.\n */\nexport interface DateFieldProps<T extends DateValue> extends AriaDateFieldProps<T> {\n /**\n * Label for the date field\n */\n label?: string;\n /**\n * Description text to show below the field\n */\n description?: string;\n /**\n * Error message to display\n */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /**\n * Whether to show a calendar button for date selection\n * @default false\n */\n showCalendar?: boolean;\n}\n\nexport function DateField<T extends DateValue>({\n label,\n description,\n errorMessage,\n showCalendar = false,\n ...props\n}: DateFieldProps<T>) {\n const [isCalendarOpen, setIsCalendarOpen] = useState(false);\n\n const handleCalendarSelect = (date: DateValue | null) => {\n // Update the field value when a date is selected from calendar\n if (props.onChange && date) {\n // @ts-expect-error - Complex type mapping between DateValue and MappedDateValue<T> in react-aria-components\n // This is safe as the Calendar component returns compatible date values\n props.onChange(date);\n }\n setIsCalendarOpen(false);\n };\n\n return (\n <AriaDateField\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-1\")}\n >\n {label && <Label>{label}</Label>}\n\n {showCalendar ? (\n <FieldGroup className=\"w-auto min-w-[208px]\">\n <DateInput className=\"min-w-[150px] flex-1\" />\n <DialogTrigger isOpen={isCalendarOpen} onOpenChange={setIsCalendarOpen}>\n <Button variant=\"icon\" className=\"mr-1 w-6 rounded outline-offset-0\">\n <CalendarIcon aria-hidden className=\"h-4 w-4\" />\n </Button>\n <Popover>\n <Dialog className=\"p-4\">\n <Calendar\n value={props.value}\n onChange={handleCalendarSelect}\n minValue={props.minValue}\n maxValue={props.maxValue}\n isDisabled={props.isDisabled}\n isReadOnly={props.isReadOnly}\n isDateUnavailable={props.isDateUnavailable}\n />\n </Dialog>\n </Popover>\n </DialogTrigger>\n </FieldGroup>\n ) : (\n <DateInput />\n )}\n\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n </AriaDateField>\n );\n}\n\nfunction getSegmentStyles({\n isPlaceholder,\n isDisabled,\n}: {\n isPlaceholder?: boolean;\n isDisabled?: boolean;\n}) {\n return [\n // Base\n \"inline box-content px-0.5 -my-0.5 rounded outline-none tabular-nums text-center transition-colors\",\n // Text color\n isPlaceholder ? \"text-text-muted italic\" : \"text-text-body\",\n // Disabled state\n isDisabled ? \"text-text-disabled cursor-not-allowed\" : \"cursor-text\",\n // Hover/focus visuals (data-* comes from react-aria-components)\n \"hover:bg-text-body/5\",\n \"data-[focused]:!outline-[1.5px] data-[focused]:!outline-[var(--control-focus-ring-color)] data-[focused]:![--tw-outline-style:solid]\",\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nexport function DateInput(props: Omit<DateInputProps, \"children\">) {\n return (\n <AriaDateInput\n className={(renderProps) =>\n getFieldGroupStyles({\n ...renderProps,\n className:\n typeof props.className === \"string\"\n ? props.className\n : \"min-w-[150px] px-2 py-1.5 text-sm flex items-center gap-0.5\",\n })\n }\n {...props}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={getSegmentStyles({\n isPlaceholder: segment.isPlaceholder,\n isDisabled: !segment.isEditable,\n })}\n />\n )}\n </AriaDateInput>\n );\n}\n","import { DialogProps, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Dialog\n *\n * Generic modal/dialog surface with Edges defaults.\n */\nexport function Dialog(props: DialogProps) {\n // Ensure the dialog is properly labeled for accessibility\n return (\n <RACDialog\n {...props}\n className={twMerge(\n \"relative h-auto max-h-[inherit] overflow-auto outline-none [[data-placement]>&]:p-4\",\n props.className\n )}\n role=\"dialog\"\n />\n );\n}\n","import {\n RangeCalendar as AriaRangeCalendar,\n RangeCalendarProps as AriaRangeCalendarProps,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n DateValue,\n Text,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\nimport { CalendarGridHeader, CalendarHeader } from \"../Calendar\";\n\n/**\n * RangeCalendar\n *\n * Calendar allowing selection of a date range.\n */\nexport interface RangeCalendarProps<T extends DateValue>\n extends Omit<AriaRangeCalendarProps<T>, \"visibleDuration\"> {\n errorMessage?: string;\n}\n\nfunction getCellClassName({\n selectionState,\n isDisabled,\n}: {\n selectionState: \"none\" | \"middle\" | \"cap\";\n isDisabled?: boolean;\n}) {\n const baseClasses = `${focusRing} w-full h-full flex items-center justify-center rounded-sm forced-color-adjust-none font-semibold`;\n\n const selectionStateClasses = {\n none: \"text-text-body group-hover:bg-gray-200 group-pressed:bg-gray-200\",\n middle: [\n \"group-hover:bg-gray-300 forced-colors:group-hover:bg-[Highlight]\",\n \"group-invalid:group-hover:bg-red-200 forced-colors:group-invalid:group-hover:bg-[Mark]\",\n \"group-pressed:bg-blue-300 forced-colors:group-pressed:bg-[Highlight] forced-colors:text-[HighlightText]\",\n \"group-invalid:group-pressed:bg-red-300 forced-colors:group-invalid:group-pressed:bg-[Mark]\",\n ].join(\" \"),\n cap: \" group-invalid:bg-red-600 forced-colors:bg-[Highlight] forced-colors:group-invalid:bg-[Mark] text-white forced-colors:text-white !bg-neutral-black\",\n };\n\n const disabledClasses = isDisabled\n ? \"text-textFaint dark:text-zinc-600 forced-colors:text-textFaint font-light\"\n : \"\";\n\n return [baseClasses, selectionStateClasses[selectionState], disabledClasses]\n .filter(Boolean)\n .join(\" \");\n}\n\nexport function RangeCalendar<T extends DateValue>({\n errorMessage,\n ...props\n}: RangeCalendarProps<T>) {\n return (\n <AriaRangeCalendar {...props}>\n <CalendarHeader />\n <CalendarGrid className=\"w-full [&_td]:px-0\">\n <CalendarGridHeader />\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className=\"selection-start:rounded-s-end selection-end:rounded-e-end [td:last-child_&]:rounded-e-end group h-9 w-9 cursor-default text-sm outline-none outside-month:text-gray-300 selected:bg-background-selected invalid:selected:bg-red-100 forced-colors:selected:bg-[Highlight] forced-colors:selected:text-white forced-colors:invalid:selected:bg-[Mark] [td:first-child_&]:rounded-s-full\"\n >\n {({\n formattedDate,\n isSelected,\n isSelectionStart,\n isSelectionEnd,\n isFocusVisible: _isFocusVisible,\n isDisabled,\n }) => (\n <span\n className={getCellClassName({\n selectionState:\n isSelected && (isSelectionStart || isSelectionEnd)\n ? \"cap\"\n : isSelected\n ? \"middle\"\n : \"none\",\n isDisabled,\n })}\n >\n {formattedDate}\n </span>\n )}\n </CalendarCell>\n )}\n </CalendarGridBody>\n </CalendarGrid>\n {errorMessage && (\n <Text slot=\"errorMessage\" className=\"text-sm text-red-600\">\n {errorMessage}\n </Text>\n )}\n </AriaRangeCalendar>\n );\n}\n","import { CalendarIcon } from \"lucide-react\";\nimport {\n DateRangePicker as AriaDateRangePicker,\n DateRangePickerProps as AriaDateRangePickerProps,\n DateValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { DateInput } from \"../DateField\";\nimport { Dialog } from \"../Dialog\";\nimport { Description, FieldError, FieldGroup, Label } from \"../Field\";\nimport { Popover } from \"../Popover\";\nimport { RangeCalendar } from \"../RangeCalendar\";\n\n/**\n * DateRangePicker\n *\n * Composed date range input with popover calendar.\n */\nexport interface DateRangePickerProps<T extends DateValue> extends AriaDateRangePickerProps<T> {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nexport function DateRangePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n ...props\n}: DateRangePickerProps<T>) {\n return (\n <AriaDateRangePicker\n {...props}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-1\")}\n >\n {label && <Label>{label}</Label>}\n <FieldGroup className=\"w-auto min-w-[208px]\">\n <DateInput slot=\"start\" className=\"px-2 py-1.5 text-sm\" />\n <span\n aria-hidden=\"true\"\n className=\"text-gray-800 group-disabled:text-gray-200 dark:text-zinc-200 group-disabled:dark:text-zinc-600 forced-colors:text-[ButtonText] group-disabled:forced-colors:text-[GrayText]\"\n >\n –\n </span>\n <DateInput slot=\"end\" className=\"flex-1 px-2 py-1.5 text-sm\" />\n <Button variant=\"icon\" className=\"mr-1 w-6 rounded outline-offset-0\">\n <CalendarIcon aria-hidden className=\"h-4 w-4\" />\n </Button>\n </FieldGroup>\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n <Popover>\n <Dialog>\n <RangeCalendar />\n </Dialog>\n </Popover>\n </AriaDateRangePicker>\n );\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 items-center justify-between border-b px-4\",\n title && \"border-b\",\n titleAlign === \"center\" ? \"justify-center\" : \"\"\n )}\n >\n {hasBackArrow && (\n <Button variant=\"unstyled\" onPress={onBack} className=\"absolute left-4\">\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=\"unstyled\" onPress={onClose} aria-label=\"Close dialog\">\n <Icon name=\"X\" data-testid=\"close-button\" />\n </Button>\n )}\n </>\n )}\n </div>\n );\n};\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\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 React, { useEffect, useState } from \"react\";\nimport { Modal, ModalOverlay } from \"react-aria-components\";\nimport { Button } from \"../Button\";\nimport { Dialog } from \"../Dialog\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\n\nexport interface DrawerAction {\n label: string;\n onPress: () => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n isDisabled?: boolean;\n}\n\n/**\n * Drawer\n *\n * Sliding panel that anchors to screen edges.\n */\nexport interface DrawerProps {\n title?: string;\n headerContent?: React.ReactNode;\n children?: React.ReactNode;\n isOpen: boolean;\n slideInFrom?: \"left\" | \"right\";\n transparentOverlay?: boolean;\n onClose?: () => void;\n className?: string;\n // Actions footer props\n primaryAction?: DrawerAction;\n secondaryAction?: DrawerAction;\n footerContent?: React.ReactNode;\n /** Whether to include padding inside the content area. Defaults to true. */\n contentPadding?: boolean;\n /** Maximum width of the drawer. Defaults to \"400px\". Can be any valid CSS width value. */\n maxWidth?: string;\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n children,\n title,\n headerContent,\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}) => {\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 } else {\n setIsAnimating(false);\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const hasActions = primaryAction || secondaryAction;\n const hasFooter = hasActions || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalOverlay\n isOpen={isOpen}\n onOpenChange={onClose}\n isDismissable\n className={`fixed inset-0 z-50 ${transparentOverlay ? \"bg-transparent\" : \"bg-black/50\"}`}\n >\n <Modal className=\"flex justify-end\" isDismissable>\n <Dialog\n className={`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 isAnimating\n ? slideInFrom === \"right\"\n ? \"animate-in slide-in-from-right\"\n : \"animate-in slide-in-from-left\"\n : \"\"\n } ${className || \"\"}`}\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 {(title || headerContent) && (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n )}\n <div\n className={`flex-1 overflow-y-auto overscroll-contain ${contentPadding ? \"p-6\" : \"p-0\"}`}\n >\n {children}\n </div>\n {hasFooter && (\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-4\">\n {secondaryAction && (\n <Button\n size={secondaryAction.size || \"lg\"}\n fullWidth\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 fullWidth\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 </Dialog>\n </Modal>\n </ModalOverlay>\n </ErrorBoundary>\n );\n};\n\nDrawer.displayName = \"Drawer\";\n","\"use client\";\nimport { Image as ImageIcon, Upload, X } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { DropZone, FileTrigger } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\n\nexport interface FileUploadProps {\n /**\n * Current file URL or preview\n */\n value?: string;\n /**\n * Callback when file is selected\n */\n onChange?: (file: File | null, url?: string) => void;\n /**\n * Callback when file URL changes (for external upload handlers)\n */\n onUrlChange?: (url: string) => void;\n /**\n * Accepted file types\n */\n accept?: string;\n /**\n * Maximum file size in bytes\n */\n maxSize?: number;\n /**\n * Whether the component is disabled\n */\n isDisabled?: boolean;\n /**\n * Custom upload handler (e.g., for cloud storage)\n */\n onUpload?: (file: File) => Promise<string>;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Show image preview for image files\n */\n showPreview?: boolean;\n /**\n * Placeholder text\n */\n placeholder?: string;\n}\n\n/**\n * FileUpload\n *\n * A file upload component with drag-and-drop support.\n * Supports image preview, custom upload handlers, and file validation.\n */\nexport function FileUpload({\n value,\n onChange,\n onUrlChange,\n accept = \"image/*\",\n maxSize,\n isDisabled = false,\n onUpload,\n className,\n showPreview = true,\n placeholder = \"Drop files here or click to browse\",\n}: FileUploadProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [preview, setPreview] = useState<string | undefined>(value);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFile = async (file: File) => {\n setError(null);\n\n // Validate file size\n if (maxSize && file.size > maxSize) {\n setError(`File size must be less than ${(maxSize / 1024 / 1024).toFixed(2)}MB`);\n return;\n }\n\n // Handle file preview for images\n if (showPreview && file.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onloadend = () => {\n setPreview(reader.result as string);\n };\n reader.readAsDataURL(file);\n }\n\n // If custom upload handler is provided, use it\n if (onUpload) {\n setIsUploading(true);\n try {\n const url = await onUpload(file);\n setPreview(url);\n onUrlChange?.(url);\n } catch (err) {\n setError(\"Failed to upload file\");\n console.error(\"Upload error:\", err);\n } finally {\n setIsUploading(false);\n }\n }\n\n onChange?.(file, preview);\n };\n\n const handleDrop = (e: any) => {\n const items = e.items;\n if (items.length > 0) {\n const item = items[0];\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n handleFile(file);\n }\n }\n }\n setIsDragging(false);\n };\n\n const handleRemove = () => {\n setPreview(undefined);\n setError(null);\n onChange?.(null);\n onUrlChange?.(\"\");\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n <DropZone\n className={twMerge(\n \"relative flex min-h-[200px] w-full flex-col items-center justify-center rounded-lg border-2 border-dashed transition-colors\",\n isDragging\n ? \"border-action-primary bg-action-primary/5\"\n : \"border-border-muted hover:border-border-default\",\n isDisabled && \"pointer-events-none opacity-50\",\n error && \"border-feedback-error-border bg-feedback-error-background/50\"\n )}\n onDrop={handleDrop}\n onDropEnter={() => setIsDragging(true)}\n onDropExit={() => setIsDragging(false)}\n >\n {preview ? (\n <div className=\"relative flex h-full w-full items-center justify-center p-4\">\n {showPreview && preview.startsWith(\"data:image\") ? (\n <img\n src={preview}\n alt=\"Preview\"\n className=\"max-h-48 max-w-full rounded-md object-contain\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2\">\n <ImageIcon className=\"h-12 w-12 text-text-muted\" />\n <span className=\"text-sm text-text-muted\">File uploaded</span>\n </div>\n )}\n {!isDisabled && (\n <Button\n variant=\"icon\"\n size=\"sm\"\n onPress={handleRemove}\n className=\"absolute right-2 top-2 bg-background-surface shadow-md\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-4 p-6\">\n <Upload className=\"h-12 w-12 text-text-muted\" />\n <div className=\"text-center\">\n <p className=\"text-sm text-text-body\">{placeholder}</p>\n <p className=\"mt-1 text-xs text-text-muted\">\n {accept === \"image/*\" ? \"PNG, JPG, GIF up to 10MB\" : `Accepts ${accept}`}\n </p>\n </div>\n <FileTrigger\n acceptedFileTypes={accept.split(\",\")}\n onSelect={(e) => {\n const files = Array.from(e || []);\n if (files.length > 0) {\n handleFile(files[0]);\n }\n }}\n >\n <Button variant=\"secondary\" size=\"sm\" isDisabled={isDisabled}>\n Choose File\n </Button>\n </FileTrigger>\n </div>\n )}\n {isUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center rounded-lg bg-background-surface/80\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-action-primary border-t-transparent\" />\n <span className=\"text-sm text-text-muted\">Uploading...</span>\n </div>\n </div>\n )}\n </DropZone>\n {error && <p className=\"mt-2 text-sm text-feedback-error-text\">{error}</p>}\n </div>\n );\n}\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 */\nexport function Form(props: FormProps) {\n return <RACForm {...props} className={twMerge(\"flex flex-col gap-4\", props.className)} />;\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Grid Component — Flexible layout system for dashboards\n *\n * A higher-level abstraction over CSS Grid that provides responsive columns,\n * consistent spacing, and span helpers for building complex dashboard layouts.\n *\n * Usage:\n * ```tsx\n * <Grid cols={{ base: 1, md: 2, lg: 4 }} gap=\"md\">\n * <Grid.Item span={{ base: 1, lg: 2 }}>\n * <Card>Wide content</Card>\n * </Grid.Item>\n * <Grid.Item>\n * <Card>Regular content</Card>\n * </Grid.Item>\n * </Grid>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type ResponsiveValue<T> =\n | T\n | {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n };\n\nexport type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | \"none\";\nexport type GridSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | \"full\" | \"auto\";\nexport type GridGap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\nexport type GridAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type GridJustify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\nexport type GridFlow = \"row\" | \"col\" | \"dense\" | \"row-dense\" | \"col-dense\";\n\nexport interface GridProps {\n /** Number of columns at different breakpoints */\n cols?: ResponsiveValue<GridCols>;\n /** Gap between grid items using design tokens */\n gap?: GridGap;\n /** Gap between rows specifically */\n gapY?: GridGap;\n /** Gap between columns specifically */\n gapX?: GridGap;\n /** Vertical alignment of items */\n align?: GridAlign;\n /** Horizontal justification of the grid */\n justify?: GridJustify;\n /** Grid flow direction */\n flow?: GridFlow;\n /** Auto-fit mode with minimum item width */\n autoFit?: string; // e.g., \"280px\"\n /** Auto-fill mode with minimum item width */\n autoFill?: string; // e.g., \"280px\"\n /** Additional CSS classes */\n className?: string;\n /** Child elements */\n children?: React.ReactNode;\n}\n\nexport interface GridItemProps {\n /** Column span at different breakpoints */\n span?: ResponsiveValue<GridSpan>;\n /** Column start position */\n colStart?: ResponsiveValue<number | \"auto\">;\n /** Column end position */\n colEnd?: ResponsiveValue<number | \"auto\">;\n /** Row span at different breakpoints */\n rowSpan?: ResponsiveValue<GridSpan>;\n /** Row start position */\n rowStart?: ResponsiveValue<number | \"auto\">;\n /** Row end position */\n rowEnd?: ResponsiveValue<number | \"auto\">;\n /** Additional CSS classes */\n className?: string;\n /** Child elements */\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Style Mappings\n// ——————————————————————————————————————————\n\nconst colsMap: Record<GridCols, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-7\",\n 8: \"grid-cols-8\",\n 9: \"grid-cols-9\",\n 10: \"grid-cols-10\",\n 11: \"grid-cols-11\",\n 12: \"grid-cols-12\",\n none: \"grid-cols-none\",\n};\n\nconst responsiveColsMap: Record<string, Record<GridCols, string>> = {\n sm: {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n 12: \"sm:grid-cols-12\",\n none: \"sm:grid-cols-none\",\n },\n md: {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n 7: \"md:grid-cols-7\",\n 8: \"md:grid-cols-8\",\n 9: \"md:grid-cols-9\",\n 10: \"md:grid-cols-10\",\n 11: \"md:grid-cols-11\",\n 12: \"md:grid-cols-12\",\n none: \"md:grid-cols-none\",\n },\n lg: {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n 7: \"lg:grid-cols-7\",\n 8: \"lg:grid-cols-8\",\n 9: \"lg:grid-cols-9\",\n 10: \"lg:grid-cols-10\",\n 11: \"lg:grid-cols-11\",\n 12: \"lg:grid-cols-12\",\n none: \"lg:grid-cols-none\",\n },\n xl: {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n 7: \"xl:grid-cols-7\",\n 8: \"xl:grid-cols-8\",\n 9: \"xl:grid-cols-9\",\n 10: \"xl:grid-cols-10\",\n 11: \"xl:grid-cols-11\",\n 12: \"xl:grid-cols-12\",\n none: \"xl:grid-cols-none\",\n },\n \"2xl\": {\n 1: \"2xl:grid-cols-1\",\n 2: \"2xl:grid-cols-2\",\n 3: \"2xl:grid-cols-3\",\n 4: \"2xl:grid-cols-4\",\n 5: \"2xl:grid-cols-5\",\n 6: \"2xl:grid-cols-6\",\n 7: \"2xl:grid-cols-7\",\n 8: \"2xl:grid-cols-8\",\n 9: \"2xl:grid-cols-9\",\n 10: \"2xl:grid-cols-10\",\n 11: \"2xl:grid-cols-11\",\n 12: \"2xl:grid-cols-12\",\n none: \"2xl:grid-cols-none\",\n },\n};\n\nconst gapMap: Record<GridGap, string> = {\n none: \"gap-0\",\n xs: \"gap-x-2 gap-y-1\", // 8px horizontal, 4px vertical\n sm: \"gap-x-3 gap-y-2\", // 12px horizontal, 8px vertical\n md: \"gap-x-4 gap-y-3\", // 16px horizontal, 12px vertical\n lg: \"gap-x-6 gap-y-4\", // 24px horizontal, 16px vertical\n xl: \"gap-x-8 gap-y-6\", // 32px horizontal, 24px vertical\n \"2xl\": \"gap-x-12 gap-y-8\", // 48px horizontal, 32px vertical\n};\n\nconst gapXMap: Record<GridGap, string> = {\n none: \"gap-x-0\",\n xs: \"gap-x-2\",\n sm: \"gap-x-3\",\n md: \"gap-x-4\",\n lg: \"gap-x-6\",\n xl: \"gap-x-8\",\n \"2xl\": \"gap-x-12\",\n};\n\nconst gapYMap: Record<GridGap, string> = {\n none: \"gap-y-0\",\n xs: \"gap-y-1\", // 4px (reduced from 8px)\n sm: \"gap-y-2\", // 8px (reduced from 12px)\n md: \"gap-y-3\", // 12px (reduced from 16px)\n lg: \"gap-y-4\", // 16px (reduced from 24px)\n xl: \"gap-y-6\", // 24px (reduced from 32px)\n \"2xl\": \"gap-y-8\", // 32px (reduced from 48px)\n};\n\nconst alignMap: Record<GridAlign, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<GridJustify, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst flowMap: Record<GridFlow, string> = {\n row: \"grid-flow-row\",\n col: \"grid-flow-col\",\n dense: \"grid-flow-dense\",\n \"row-dense\": \"grid-flow-row-dense\",\n \"col-dense\": \"grid-flow-col-dense\",\n};\n\nconst spanMap: Record<GridSpan, string> = {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n 7: \"col-span-7\",\n 8: \"col-span-8\",\n 9: \"col-span-9\",\n 10: \"col-span-10\",\n 11: \"col-span-11\",\n 12: \"col-span-12\",\n full: \"col-span-full\",\n auto: \"col-auto\",\n};\n\nconst responsiveSpanMap: Record<string, Record<GridSpan, string>> = {\n sm: {\n 1: \"sm:col-span-1\",\n 2: \"sm:col-span-2\",\n 3: \"sm:col-span-3\",\n 4: \"sm:col-span-4\",\n 5: \"sm:col-span-5\",\n 6: \"sm:col-span-6\",\n 7: \"sm:col-span-7\",\n 8: \"sm:col-span-8\",\n 9: \"sm:col-span-9\",\n 10: \"sm:col-span-10\",\n 11: \"sm:col-span-11\",\n 12: \"sm:col-span-12\",\n full: \"sm:col-span-full\",\n auto: \"sm:col-auto\",\n },\n md: {\n 1: \"md:col-span-1\",\n 2: \"md:col-span-2\",\n 3: \"md:col-span-3\",\n 4: \"md:col-span-4\",\n 5: \"md:col-span-5\",\n 6: \"md:col-span-6\",\n 7: \"md:col-span-7\",\n 8: \"md:col-span-8\",\n 9: \"md:col-span-9\",\n 10: \"md:col-span-10\",\n 11: \"md:col-span-11\",\n 12: \"md:col-span-12\",\n full: \"md:col-span-full\",\n auto: \"md:col-auto\",\n },\n lg: {\n 1: \"lg:col-span-1\",\n 2: \"lg:col-span-2\",\n 3: \"lg:col-span-3\",\n 4: \"lg:col-span-4\",\n 5: \"lg:col-span-5\",\n 6: \"lg:col-span-6\",\n 7: \"lg:col-span-7\",\n 8: \"lg:col-span-8\",\n 9: \"lg:col-span-9\",\n 10: \"lg:col-span-10\",\n 11: \"lg:col-span-11\",\n 12: \"lg:col-span-12\",\n full: \"lg:col-span-full\",\n auto: \"lg:col-auto\",\n },\n xl: {\n 1: \"xl:col-span-1\",\n 2: \"xl:col-span-2\",\n 3: \"xl:col-span-3\",\n 4: \"xl:col-span-4\",\n 5: \"xl:col-span-5\",\n 6: \"xl:col-span-6\",\n 7: \"xl:col-span-7\",\n 8: \"xl:col-span-8\",\n 9: \"xl:col-span-9\",\n 10: \"xl:col-span-10\",\n 11: \"xl:col-span-11\",\n 12: \"xl:col-span-12\",\n full: \"xl:col-span-full\",\n auto: \"xl:col-auto\",\n },\n \"2xl\": {\n 1: \"2xl:col-span-1\",\n 2: \"2xl:col-span-2\",\n 3: \"2xl:col-span-3\",\n 4: \"2xl:col-span-4\",\n 5: \"2xl:col-span-5\",\n 6: \"2xl:col-span-6\",\n 7: \"2xl:col-span-7\",\n 8: \"2xl:col-span-8\",\n 9: \"2xl:col-span-9\",\n 10: \"2xl:col-span-10\",\n 11: \"2xl:col-span-11\",\n 12: \"2xl:col-span-12\",\n full: \"2xl:col-span-full\",\n auto: \"2xl:col-auto\",\n },\n};\n\n// ——————————————————————————————————————————\n// Helper Functions\n// ——————————————————————————————————————————\n\nfunction getResponsiveClasses<T extends string | number>(\n value: ResponsiveValue<T> | undefined,\n baseMap: Record<T, string>,\n responsiveMap: Record<string, Record<T, string>>\n): string {\n if (!value) return \"\";\n\n // Simple value\n if (typeof value !== \"object\") {\n return baseMap[value as T] || \"\";\n }\n\n // Responsive object\n const classes: string[] = [];\n\n if (\"base\" in value && value.base !== undefined) {\n classes.push(baseMap[value.base]);\n }\n\n Object.entries(responsiveMap).forEach(([breakpoint, map]) => {\n const breakpointValue = (value as Record<string, T | undefined>)[breakpoint];\n if (breakpointValue !== undefined) {\n classes.push(map[breakpointValue as T]);\n }\n });\n\n return classes.join(\" \");\n}\n\n// ——————————————————————————————————————————\n// Grid Component\n// ——————————————————————————————————————————\n\nexport function Grid({\n cols = 1,\n gap = \"md\",\n gapX,\n gapY,\n align = \"stretch\",\n justify = \"start\",\n flow = \"row\",\n autoFit,\n autoFill,\n className,\n children,\n}: GridProps) {\n // Build grid classes\n const gridClasses = twMerge(\n \"grid\",\n // Handle auto-fit/auto-fill or responsive columns\n autoFit || autoFill ? \"\" : getResponsiveClasses(cols, colsMap, responsiveColsMap),\n // Gap classes\n !gapX && !gapY && gapMap[gap],\n gapX && gapXMap[gapX],\n gapY && gapYMap[gapY],\n // Alignment\n alignMap[align],\n justifyMap[justify],\n // Flow\n flowMap[flow],\n className\n );\n\n // Handle auto-fit/auto-fill with inline styles\n const style: React.CSSProperties = {};\n if (autoFit) {\n style.gridTemplateColumns = `repeat(auto-fit, minmax(${autoFit}, 1fr))`;\n } else if (autoFill) {\n style.gridTemplateColumns = `repeat(auto-fill, minmax(${autoFill}, 1fr))`;\n }\n\n return (\n <div className={gridClasses} style={style}>\n {children}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Grid.Item Component\n// ——————————————————————————————————————————\n\nexport function GridItem({\n span,\n // colStart,\n // colEnd,\n // rowSpan,\n // rowStart,\n // rowEnd,\n className,\n children,\n}: GridItemProps) {\n const itemClasses = twMerge(\n // Column span\n getResponsiveClasses(span, spanMap, responsiveSpanMap),\n // Additional positioning classes would go here\n // For brevity, not implementing all start/end mappings\n className\n );\n\n return <div className={itemClasses}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nGrid.Item = GridItem;\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ComponentFormatter, formatComponentValue } from \"../../utils/formatting\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n// Use the centralized formatter type\nexport type KpiFormatter = ComponentFormatter;\n\n/**\n * Kpi Component — Single metric display\n *\n * Displays a key performance indicator with value, delta, trend, and status.\n * Designed to work standalone or within a KpiGroup for dashboard layouts.\n *\n * Usage:\n * ```tsx\n * <Kpi\n * label=\"Active Sites\"\n * value={2481}\n * delta={3.2}\n * deltaPeriodLabel=\"vs last 7d\"\n * trend={dataPoints}\n * />\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type KpiStatus = \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type KpiSize = \"sm\" | \"md\" | \"lg\";\nexport type KpiOrientation = \"vertical\" | \"horizontal\";\n\nexport interface TrendPoint {\n x: number | string | Date;\n y: number;\n}\n\nexport interface KpiProps {\n /** Short label describing the metric */\n label: React.ReactNode;\n /** Primary value - number for auto-formatting or string for custom display */\n value: number | string;\n /** Formatter using the unified formatting system */\n formatter?: KpiFormatter;\n /** Change since prior period */\n delta?: number;\n /** Description of delta period (e.g., \"vs last 7d\") */\n deltaPeriodLabel?: string;\n /** How to interpret delta direction */\n deltaIntent?: \"upIsGood\" | \"downIsGood\";\n /** Mini trend data points */\n trend?: TrendPoint[];\n /** Status indicator */\n status?: {\n value: string;\n tone?: KpiStatus;\n };\n /** Help text or tooltip content */\n helpText?: React.ReactNode;\n /** Size variant */\n size?: KpiSize;\n /** Layout orientation */\n orientation?: KpiOrientation;\n /** Loading state */\n loading?: boolean;\n /** Empty state */\n empty?: boolean;\n /** Error state */\n error?: string | React.ReactNode;\n /** Click handler for drill-down */\n onClick?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Custom value renderer */\n renderValue?: (value: KpiProps[\"value\"]) => React.ReactNode;\n /** Custom delta renderer */\n renderDelta?: (delta?: number) => React.ReactNode;\n /** Custom trend renderer */\n renderTrend?: (points?: TrendPoint[]) => React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————\n\n// Use the centralized formatting utility\nfunction formatValue(value: number | string, formatter?: KpiFormatter): React.ReactNode {\n return formatComponentValue({\n value,\n formatter,\n emptyClassName: \"text-text-muted\",\n emptyText: \"—\",\n });\n}\n\nfunction getDeltaColor(delta: number, deltaIntent: \"upIsGood\" | \"downIsGood\" = \"upIsGood\"): string {\n if (delta === 0) return \"text-text-muted\";\n\n const isPositive = delta > 0;\n\n if (deltaIntent === \"upIsGood\") {\n return isPositive ? \"text-feedback-success\" : \"text-feedback-error\";\n } else {\n return isPositive ? \"text-feedback-error\" : \"text-feedback-success\";\n }\n}\n\n// ——————————————————————————————————————————\n// Sparkline Component\n// ——————————————————————————————————————————\n\nfunction Sparkline({\n points,\n className,\n ariaLabel,\n}: {\n points: TrendPoint[];\n className?: string;\n ariaLabel?: string;\n}) {\n const width = 64;\n const height = 20;\n const padding = 2;\n\n // Extract y values\n const yValues = points.map((p) => (typeof p.y === \"number\" ? p.y : 0));\n\n if (yValues.length === 0) return null;\n\n // Calculate bounds\n const min = Math.min(...yValues);\n const max = Math.max(...yValues);\n const range = max - min;\n\n // Normalize y coordinate\n const normalizeY = (y: number) => {\n if (range === 0) return height / 2;\n return height - padding - ((y - min) / range) * (height - 2 * padding);\n };\n\n // Calculate x step\n const xStep = (width - 2 * padding) / Math.max(points.length - 1, 1);\n\n // Build path\n const pathData = points\n .map((point, index) => {\n const x = padding + index * xStep;\n const y = normalizeY(typeof point.y === \"number\" ? point.y : 0);\n return `${index === 0 ? \"M\" : \"L\"} ${x} ${y}`;\n })\n .join(\" \");\n\n return (\n <svg\n width={width}\n height={height}\n role=\"img\"\n aria-label={ariaLabel}\n className={twMerge(\"overflow-visible\", className)}\n >\n <path d={pathData} fill=\"none\" strokeWidth=\"1.5\" className=\"stroke-border-muted\" />\n </svg>\n );\n}\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function Kpi({\n label,\n value,\n formatter,\n delta,\n deltaPeriodLabel,\n deltaIntent = \"upIsGood\",\n trend,\n status,\n helpText,\n size = \"md\",\n orientation = \"vertical\",\n loading,\n empty,\n error,\n onClick,\n className,\n renderValue,\n renderDelta,\n renderTrend,\n}: KpiProps) {\n // Size classes\n const sizeClasses = {\n sm: {\n label: \"text-xs\",\n value: \"text-base\",\n delta: \"text-xs\",\n gap: \"gap-1\",\n },\n md: {\n label: \"text-sm\",\n value: \"text-xl\",\n delta: \"text-sm\",\n gap: \"gap-2\",\n },\n lg: {\n label: \"text-base\",\n value: \"text-2xl\",\n delta: \"text-base\",\n gap: \"gap-3\",\n },\n };\n\n const currentSize = sizeClasses[size];\n\n // Format value\n const valueNode = loading ? (\n <Skeleton className=\"h-7 w-20\" />\n ) : empty ? (\n <span className=\"text-text-muted\">—</span>\n ) : error ? (\n <span className=\"text-feedback-error text-sm\">\n {typeof error === \"string\" ? error : \"Error\"}\n </span>\n ) : renderValue ? (\n renderValue(value)\n ) : (\n formatValue(value, formatter)\n );\n\n // Format delta\n const deltaNode = renderDelta ? (\n renderDelta(delta)\n ) : delta !== undefined && !loading && !empty && !error ? (\n <div\n className={twMerge(\n currentSize.delta,\n getDeltaColor(delta, deltaIntent),\n \"flex items-center gap-1\"\n )}\n >\n {delta > 0 && <Icon name=\"ArrowUp\" size={12} />}\n {delta < 0 && <Icon name=\"ArrowDown\" size={12} />}\n {delta === 0 && <Icon name=\"Minus\" size={12} />}\n <span>\n {delta > 0 ? \"+\" : \"\"}\n {Math.abs(delta).toFixed(1)}%\n </span>\n {deltaPeriodLabel && <span className=\"text-text-muted\">· {deltaPeriodLabel}</span>}\n </div>\n ) : loading ? (\n <Skeleton className=\"h-4 w-24\" />\n ) : null;\n\n // Trend node\n const trendNode = renderTrend ? (\n renderTrend(trend)\n ) : trend && trend.length > 0 && !loading && !error ? (\n <Sparkline points={trend} ariaLabel={`${label} trend`} className={empty ? \"opacity-30\" : \"\"} />\n ) : loading ? (\n <Skeleton className=\"h-5 w-16\" />\n ) : null;\n\n return (\n <section\n className={twMerge(\n \"flex min-w-0\",\n orientation === \"horizontal\"\n ? `items-center ${currentSize.gap}`\n : `flex-col ${currentSize.gap}`,\n onClick &&\n \"cursor-pointer hover:bg-background-muted rounded-lg px-3 py-2 -mx-3 -my-2 transition-colors\",\n className\n )}\n aria-labelledby={`kpi-${label}`}\n onClick={onClick}\n >\n {/* Label row */}\n <div className=\"flex items-center gap-2\">\n <h3\n id={`kpi-${label}`}\n className={twMerge(currentSize.label, \"font-medium text-text-caption truncate\")}\n >\n {loading ? <Skeleton className=\"h-4 w-24\" /> : label}\n </h3>\n {helpText && !loading && (\n <Icon\n name=\"Question\"\n size={12}\n className=\"text-text-muted cursor-help\"\n aria-label=\"Help\"\n />\n )}\n </div>\n\n {/* Value and status */}\n <div className=\"flex items-baseline gap-2\">\n <output\n className={twMerge(\n currentSize.value,\n \"font-semibold\",\n error ? \"text-feedback-error\" : \"text-text-heading\"\n )}\n aria-label={`Value: ${valueNode}`}\n >\n {valueNode}\n </output>\n {status && !loading && !error && (\n <Badge variant={status.tone || \"neutral\"} size=\"sm\">\n {status.value}\n </Badge>\n )}\n </div>\n\n {/* Delta and trend row */}\n {(deltaNode || trendNode) && (\n <div className=\"flex items-center gap-3\">\n {deltaNode}\n {trendNode}\n </div>\n )}\n </section>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * KpiGroup Component — Layout container for multiple KPIs\n *\n * Provides consistent grid layout for KPI cards with responsive columns\n * and spacing. Perfect for dashboard metric rows and summary sections.\n *\n * Usage:\n * ```tsx\n * <KpiGroup cols={{ base: 1, md: 2, lg: 4 }}>\n * <Kpi label=\"Revenue\" value={45231} />\n * <Kpi label=\"Users\" value={1234} />\n * <Kpi label=\"Conversion\" value={0.089} unit=\"%\" />\n * <Kpi label=\"Avg Order\" value={89.50} unit=\"$\" />\n * </KpiGroup>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type KpiGroupGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type KpiGroupAlign = \"start\" | \"center\" | \"stretch\";\n\nexport interface KpiGroupCols {\n base?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n \"2xl\"?: number;\n}\n\nexport interface KpiGroupProps {\n /** KPI components to display */\n children: React.ReactNode;\n /** Responsive column configuration */\n cols?: KpiGroupCols | number;\n /** Gap between items using spacing tokens */\n gap?: KpiGroupGap;\n /** Vertical alignment of items */\n align?: KpiGroupAlign;\n /** Force equal heights for all items */\n equalizeHeights?: boolean;\n /** Optional header content */\n header?: React.ReactNode;\n /** Loading state for all children */\n loading?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n// ——————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————\n\nconst gapMap: Record<KpiGroupGap, string> = {\n xs: \"gap-2\",\n sm: \"gap-3\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n};\n\nconst alignMap: Record<KpiGroupAlign, string> = {\n start: \"items-start\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n};\n\nfunction getColClasses(cols: KpiGroupCols | number): string {\n // Simple number - apply to all breakpoints\n if (typeof cols === \"number\") {\n return `grid-cols-${cols}`;\n }\n\n // Responsive object\n const classes: string[] = [];\n\n if (cols.base !== undefined) {\n classes.push(`grid-cols-${cols.base}`);\n }\n\n if (cols.sm !== undefined) {\n classes.push(`sm:grid-cols-${cols.sm}`);\n }\n\n if (cols.md !== undefined) {\n classes.push(`md:grid-cols-${cols.md}`);\n }\n\n if (cols.lg !== undefined) {\n classes.push(`lg:grid-cols-${cols.lg}`);\n }\n\n if (cols.xl !== undefined) {\n classes.push(`xl:grid-cols-${cols.xl}`);\n }\n\n if (cols[\"2xl\"] !== undefined) {\n classes.push(`2xl:grid-cols-${cols[\"2xl\"]}`);\n }\n\n return classes.join(\" \");\n}\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function KpiGroup({\n children,\n cols = { base: 1, sm: 2, md: 3, lg: 4 },\n gap = \"md\",\n align = \"stretch\",\n equalizeHeights = true,\n header,\n loading,\n className,\n}: KpiGroupProps) {\n // Apply loading state to children if specified\n const enhancedChildren = loading\n ? React.Children.map(children, (child) => {\n if (\n React.isValidElement(child) &&\n child.type &&\n typeof child.type !== \"string\" &&\n \"displayName\" in child.type\n ) {\n return React.cloneElement(child as React.ReactElement<{ loading?: boolean }>, {\n loading: true,\n });\n }\n return child;\n })\n : children;\n\n return (\n <section className={twMerge(\"w-full\", className)} aria-label=\"Key metrics\">\n {header && <div className=\"mb-4\">{header}</div>}\n\n <div\n className={twMerge(\n \"grid\",\n getColClasses(cols),\n gapMap[gap],\n alignMap[align],\n equalizeHeights && \"auto-rows-fr\",\n \"w-full\"\n )}\n >\n {enhancedChildren}\n </div>\n </section>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nKpiGroup.displayName = \"KpiGroup\";\n","import { Check } from \"lucide-react\";\nimport {\n ListBox as AriaListBox,\n ListBoxItem as AriaListBoxItem,\n ListBoxProps as AriaListBoxProps,\n Collection,\n composeRenderProps,\n Header,\n ListBoxItemProps,\n Section,\n SectionProps,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\n\n/**\n * ListBox\n *\n * Styled wrapper around `react-aria-components` ListBox and related parts\n * used in dropdowns and menus.\n */\ninterface ListBoxProps<T> extends Omit<AriaListBoxProps<T>, \"layout\" | \"orientation\"> {}\n\nexport function ListBox<T extends object>({ children, ...props }: ListBoxProps<T>) {\n return (\n <AriaListBox {...props} className={composeTailwindRenderProps(props.className, \"outline-0\")}>\n {children}\n </AriaListBox>\n );\n}\n\nexport function getItemStyles({\n isSelected,\n isDisabled,\n size,\n}: {\n isSelected?: boolean;\n isDisabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}) {\n let styles = `${focusRing} group relative flex items-center gap-8 cursor-default select-none py-2 px-3 will-change-transform text-sm forced-color-adjust-none`;\n\n if (isSelected) {\n styles +=\n \" bg-background-input text-text-body forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] -outline-offset-4 outline-white dark:outline-white forced-colors:outline-[HighlightText]\";\n } else {\n styles +=\n \" dark:text-zinc-300 hover:bg-background-hover dark:hover:bg-zinc-700 -outline-offset-2\";\n }\n\n if (isDisabled) {\n styles += \" text-slate-300 dark:text-zinc-600 forced-colors:text-[GrayText]\";\n }\n\n if (size === \"sm\") {\n styles += \" py-1 text-xs\";\n }\n\n return styles;\n}\n\n/**\n * ListBoxItem with Edges styling.\n */\nexport function ListBoxItem(props: ListBoxItemProps) {\n const textValue =\n props.textValue || (typeof props.children === \"string\" ? props.children : undefined);\n\n return (\n <AriaListBoxItem {...props} textValue={textValue} className={(props) => getItemStyles(props)}>\n {composeRenderProps(props.children, (children) => (\n <>\n {children}\n <div className=\"absolute bottom-0 left-4 right-4 hidden h-px bg-white/20 forced-colors:bg-[HighlightText] [.group[data-selected]:has(+[data-selected])_&]:block\" />\n </>\n ))}\n </AriaListBoxItem>\n );\n}\n\nexport function getDropdownItemStyles({\n isDisabled,\n isFocused,\n isOpen,\n isSelected,\n}: {\n isDisabled?: boolean;\n isFocused?: boolean;\n isOpen?: boolean;\n isSelected?: boolean;\n}) {\n let styles =\n \"group flex items-center gap-4 cursor-default select-none py-2 pl-3 pr-1 outline-none text-sm forced-color-adjust-none hover:bg-background-hover dark:hover:bg-background-hover\";\n\n if (isDisabled) {\n styles += \" text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]\";\n } else {\n styles += \" text-text-body dark:text-zinc-100\";\n }\n\n if (isFocused) {\n styles +=\n \" bg-background-hover forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]\";\n }\n\n if (isSelected) {\n styles +=\n \" bg-background-selected font-medium forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]\";\n }\n\n if (!isFocused && !isSelected && isOpen) {\n styles += \" bg-background-input\";\n }\n\n return styles;\n}\n\n/**\n * DropdownItem with selection checkmark and hover states.\n */\nexport function DropdownItem(props: ListBoxItemProps) {\n const textValue =\n props.textValue || (typeof props.children === \"string\" ? props.children : undefined);\n return (\n <AriaListBoxItem\n {...props}\n textValue={textValue}\n className={(props) => getDropdownItemStyles({ ...props })}\n >\n {composeRenderProps(props.children, (children, { isSelected }) => (\n <>\n <span className=\"flex flex-1 items-center gap-2 truncate font-normal group-selected:font-semibold\">\n {children}\n </span>\n <span className=\"flex w-5 items-center\">\n {isSelected && <Check className=\"h-4 w-4\" />}\n </span>\n </>\n ))}\n </AriaListBoxItem>\n );\n}\n\n/**\n * Section for grouping dropdown items.\n */\nexport interface DropdownSectionProps<T> extends SectionProps<T> {\n title?: string;\n}\n\nexport function DropdownSection<T extends object>(props: DropdownSectionProps<T>) {\n return (\n <Section className=\"after:block after:h-[5px] after:content-[''] first:-mt-[5px]\">\n <Header className=\"sticky -top-[5px] z-10 -mx-1 -mt-px truncate border-y bg-gray-100/60 px-4 py-1 text-sm font-semibold text-text-caption backdrop-blur-md supports-[-moz-appearance:none]:bg-gray-100 dark:border-y-zinc-700 dark:bg-zinc-700/60 dark:text-zinc-300 [&+*]:mt-1\">\n {props.title}\n </Header>\n <Collection items={props.items}>{props.children}</Collection>\n </Section>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\n\nexport interface LoaderProps {\n /**\n * Optional className for custom styling\n */\n className?: string;\n /**\n * Size of the loader in pixels\n * @default 24\n */\n size?: number;\n /**\n * Color of the loader\n * @default \"text-action-primary\"\n */\n color?: string;\n}\n\nexport const Loader = ({ className, size = 24, color = \"text-action-primary\" }: LoaderProps) => {\n return (\n <div\n className={twMerge(\n \"inline-block animate-spin rounded-full border-2 border-solid border-current border-r-transparent\",\n color,\n className\n )}\n style={{\n width: size,\n height: size,\n }}\n role=\"status\"\n aria-label=\"loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","\"use client\";\nimport ReactMapGL, { AttributionControl, Marker } from \"react-map-gl\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n// Map themes\nexport const MAPBOX_THEMES = {\n dark: \"mapbox://styles/mapbox/dark-v11\",\n light: \"mapbox://styles/mapbox/light-v11\",\n streets: \"mapbox://styles/mapbox/streets-v12\",\n satellite: \"mapbox://styles/mapbox/satellite-streets-v12\",\n};\n\nexport interface StaticMapProps {\n /**\n * Map width\n * @default \"100%\"\n */\n width?: number | string;\n /**\n * Map height\n * @default \"100%\"\n */\n height?: number | string;\n /**\n * Initial viewport configuration\n */\n initialViewState?: {\n longitude: number;\n latitude: number;\n zoom: number;\n };\n /**\n * Show loading skeleton\n */\n isLoading?: boolean;\n /**\n * Map theme\n * @default \"streets\"\n */\n theme?: keyof typeof MAPBOX_THEMES;\n /**\n * Mapbox access token\n */\n mapboxAccessToken?: string;\n /**\n * Show marker at center\n * @default true\n */\n showMarker?: boolean;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * StaticMap\n *\n * A non-interactive map component for displaying a location.\n * Perfect for showing addresses, store locations, or any single point of interest.\n */\nexport function StaticMap({\n width = \"100%\",\n height = \"100%\",\n initialViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 14,\n },\n isLoading = false,\n theme = \"streets\",\n mapboxAccessToken,\n showMarker = true,\n className,\n}: StaticMapProps) {\n const containerStyle = {\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n };\n\n if (isLoading) {\n return (\n <div style={containerStyle} className={className}>\n <Skeleton width={containerStyle.width} height={containerStyle.height} />\n </div>\n );\n }\n\n if (!mapboxAccessToken) {\n return (\n <div\n style={containerStyle}\n className={`flex items-center justify-center bg-background-muted text-text-muted ${className}`}\n >\n <div className=\"text-center\">\n <Icon name=\"MapPin\" size={48} className=\"mx-auto mb-2 opacity-50\" />\n <p className=\"text-sm\">Map requires Mapbox token</p>\n </div>\n </div>\n );\n }\n\n return (\n <div style={containerStyle} className={className}>\n <ReactMapGL\n mapboxAccessToken={mapboxAccessToken}\n initialViewState={initialViewState}\n style={containerStyle}\n mapStyle={MAPBOX_THEMES[theme]}\n scrollZoom={false}\n dragPan={false}\n dragRotate={false}\n doubleClickZoom={false}\n touchZoomRotate={false}\n attributionControl={false}\n interactive={false}\n >\n {showMarker && (\n <Marker\n longitude={initialViewState.longitude}\n latitude={initialViewState.latitude}\n anchor=\"bottom\"\n >\n <Icon name=\"MapPin\" size={36} className=\"text-action-primary\" weight=\"fill\" />\n </Marker>\n )}\n <AttributionControl compact={true} position=\"bottom-right\" />\n </ReactMapGL>\n </div>\n );\n}\n","\"use client\";\nimport React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport ReactMapGL, {\n Layer,\n MapLayerMouseEvent,\n MapRef,\n Marker,\n NavigationControl,\n Source,\n ViewState,\n} from \"react-map-gl\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { MAPBOX_THEMES } from \"./StaticMap\";\n\nexport interface MapPoint {\n id: string;\n latitude: number;\n longitude: number;\n properties?: Record<string, unknown>;\n}\n\nexport interface InteractiveMapProps {\n /**\n * Array of points to display on the map\n */\n data: MapPoint[];\n /**\n * Initial viewport configuration\n */\n initialViewState?: ViewState;\n /**\n * Controlled viewport state\n */\n viewState?: ViewState;\n /**\n * Callback when viewport changes\n */\n onViewStateChange?: (viewState: ViewState) => void;\n /**\n * Callback when a point is clicked\n */\n onPointClick?: (pointId: string) => void;\n /**\n * Currently selected point ID\n */\n selectedPointId?: string | null;\n /**\n * Enable scroll zoom\n * @default true\n */\n scrollEnabled?: boolean;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Map theme\n * @default \"streets\"\n */\n theme?: keyof typeof MAPBOX_THEMES;\n /**\n * Mapbox access token\n */\n mapboxAccessToken?: string;\n /**\n * Enable clustering for many points\n * @default true\n */\n enableClustering?: boolean;\n /**\n * Custom marker component\n */\n renderMarker?: (point: MapPoint, isSelected: boolean) => React.ReactNode;\n}\n\n// Helper to create GeoJSON from points\nfunction createGeoJsonData(points: MapPoint[]) {\n return {\n type: \"FeatureCollection\" as const,\n features: points.map((point) => ({\n type: \"Feature\" as const,\n properties: {\n id: point.id,\n ...point.properties,\n },\n geometry: {\n type: \"Point\" as const,\n coordinates: [point.longitude, point.latitude],\n },\n })),\n };\n}\n\n// Calculate bounds for points\nfunction calculateBounds(points: MapPoint[]) {\n if (points.length === 0) return null;\n\n let minLat = points[0].latitude;\n let maxLat = points[0].latitude;\n let minLng = points[0].longitude;\n let maxLng = points[0].longitude;\n\n points.forEach((point) => {\n minLat = Math.min(minLat, point.latitude);\n maxLat = Math.max(maxLat, point.latitude);\n minLng = Math.min(minLng, point.longitude);\n maxLng = Math.max(maxLng, point.longitude);\n });\n\n return {\n longitude: (minLng + maxLng) / 2,\n latitude: (minLat + maxLat) / 2,\n zoom: 10, // Default zoom, could be calculated based on bounds\n };\n}\n\n/**\n * InteractiveMap\n *\n * An interactive map component for displaying multiple locations with clustering support.\n * Supports point selection, custom markers, and viewport control.\n */\nexport function InteractiveMap({\n data,\n initialViewState,\n viewState,\n onViewStateChange,\n onPointClick,\n selectedPointId,\n scrollEnabled = true,\n className,\n theme = \"streets\",\n mapboxAccessToken,\n enableClustering = true,\n renderMarker,\n}: InteractiveMapProps) {\n const mapRef = useRef<MapRef | null>(null);\n const [showResetButton, setShowResetButton] = useState(false);\n\n // Calculate default view state from data if not provided\n const defaultViewState = useMemo(() => {\n if (initialViewState) return initialViewState;\n const bounds = calculateBounds(data);\n return bounds || { longitude: -122.4194, latitude: 37.7749, zoom: 10 };\n }, [initialViewState, data]);\n\n // Track if view has changed from initial\n const handleViewStateChange = useCallback(\n (evt: { viewState: ViewState }) => {\n onViewStateChange?.(evt.viewState);\n\n // Show reset button if moved significantly from initial position\n const moved =\n Math.abs(evt.viewState.longitude - defaultViewState.longitude) > 0.01 ||\n Math.abs(evt.viewState.latitude - defaultViewState.latitude) > 0.01 ||\n Math.abs(evt.viewState.zoom - defaultViewState.zoom) > 0.5;\n\n setShowResetButton(moved);\n },\n [onViewStateChange, defaultViewState]\n );\n\n // Reset view to initial state\n const handleResetView = useCallback(() => {\n mapRef.current?.flyTo({\n center: [defaultViewState.longitude, defaultViewState.latitude],\n zoom: defaultViewState.zoom,\n duration: 1000,\n });\n setShowResetButton(false);\n }, [defaultViewState]);\n\n // Handle click on map features\n const handleMapClick = useCallback(\n (event: MapLayerMouseEvent) => {\n const feature = event.features?.[0];\n if (feature && feature.properties?.id) {\n onPointClick?.(feature.properties.id);\n }\n },\n [onPointClick]\n );\n\n // GeoJSON data for clustering\n const geoJsonData = useMemo(() => createGeoJsonData(data), [data]);\n\n // Selected point coordinates\n const selectedPoint = useMemo(() => {\n if (!selectedPointId) return null;\n return data.find((p) => p.id === selectedPointId);\n }, [selectedPointId, data]);\n\n // Map layers for points and clusters\n const layers = useMemo(() => {\n const pointLayer: any = {\n id: \"unclustered-points\",\n type: \"circle\",\n source: \"points\",\n filter: enableClustering ? [\"!\", [\"has\", \"point_count\"]] : undefined,\n paint: {\n \"circle-color\": [\n \"case\",\n [\"==\", [\"get\", \"id\"], selectedPointId || \"\"],\n \"#3B82F6\", // Selected color (blue)\n \"#10B981\", // Default color (green)\n ],\n \"circle-radius\": [\"case\", [\"==\", [\"get\", \"id\"], selectedPointId || \"\"], 10, 8],\n \"circle-stroke-width\": 2,\n \"circle-stroke-color\": \"#ffffff\",\n },\n };\n\n const clusterLayer: any = {\n id: \"clusters\",\n type: \"circle\",\n source: \"points\",\n filter: [\"has\", \"point_count\"],\n paint: {\n \"circle-color\": \"#F59E0B\",\n \"circle-radius\": [\n \"step\",\n [\"get\", \"point_count\"],\n 20, // Default radius\n 10,\n 25, // 10+ points\n 30,\n 30, // 30+ points\n ],\n \"circle-stroke-width\": 2,\n \"circle-stroke-color\": \"#ffffff\",\n },\n };\n\n const clusterCountLayer: any = {\n id: \"cluster-count\",\n type: \"symbol\",\n source: \"points\",\n filter: [\"has\", \"point_count\"],\n layout: {\n \"text-field\": \"{point_count_abbreviated}\",\n \"text-font\": [\"DIN Offc Pro Medium\", \"Arial Unicode MS Bold\"],\n \"text-size\": 12,\n },\n paint: {\n \"text-color\": \"#ffffff\",\n },\n };\n\n return enableClustering ? [clusterLayer, clusterCountLayer, pointLayer] : [pointLayer];\n }, [selectedPointId, enableClustering]);\n\n if (!mapboxAccessToken) {\n return (\n <div\n className={twMerge(\n \"flex items-center justify-center h-96 bg-background-muted text-text-muted\",\n className\n )}\n >\n <div className=\"text-center\">\n <Icon name=\"MapPin\" size={48} className=\"mx-auto mb-2 opacity-50\" />\n <p className=\"text-sm\">Map requires Mapbox token</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={twMerge(\"relative h-full w-full\", className)}>\n <ReactMapGL\n ref={mapRef}\n initialViewState={viewState || defaultViewState}\n style={{ width: \"100%\", height: \"100%\" }}\n mapStyle={MAPBOX_THEMES[theme]}\n mapboxAccessToken={mapboxAccessToken}\n onMove={handleViewStateChange}\n onClick={handleMapClick}\n interactiveLayerIds={[\"unclustered-points\", \"clusters\"]}\n scrollZoom={scrollEnabled}\n cursor=\"pointer\"\n >\n <NavigationControl position=\"top-right\" />\n\n {showResetButton && (\n <Button\n className=\"absolute bottom-4 right-4 shadow-lg\"\n onPress={handleResetView}\n variant=\"secondary\"\n size=\"sm\"\n >\n Reset View\n </Button>\n )}\n\n {geoJsonData && (\n <Source\n id=\"points\"\n type=\"geojson\"\n data={geoJsonData}\n cluster={enableClustering}\n clusterMaxZoom={14}\n clusterRadius={50}\n >\n {layers.map((layer) => (\n <Layer key={layer.id} {...layer} />\n ))}\n </Source>\n )}\n\n {/* Custom marker for selected point */}\n {selectedPoint && !renderMarker && (\n <Marker longitude={selectedPoint.longitude} latitude={selectedPoint.latitude}>\n <Icon\n name=\"MapPin\"\n size={40}\n className=\"text-action-primary relative -top-5\"\n weight=\"fill\"\n />\n </Marker>\n )}\n\n {/* Custom markers if provided */}\n {renderMarker &&\n data.map((point) => (\n <Marker key={point.id} longitude={point.longitude} latitude={point.latitude}>\n {renderMarker(point, point.id === selectedPointId)}\n </Marker>\n ))}\n </ReactMapGL>\n </div>\n );\n}\n","\"use client\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Meter as AriaMeter, MeterProps as AriaMeterProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Label } from \"../Field\";\n\nexport interface MeterProps extends AriaMeterProps {\n /** Label displayed above the meter */\n label?: string;\n /** Size variant of the meter */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Visual variant based on semantic meaning */\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n /** Whether to show warning indicator at high values */\n showWarningIndicator?: boolean;\n /** Threshold percentage for showing warning (default: 80) */\n warningThreshold?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeStyles = {\n sm: {\n bar: \"h-1.5 w-48\",\n text: \"text-xs\",\n icon: \"h-3 w-3\",\n },\n md: {\n bar: \"h-2 w-64\",\n text: \"text-sm\",\n icon: \"h-4 w-4\",\n },\n lg: {\n bar: \"h-3 w-80\",\n text: \"text-base\",\n icon: \"h-5 w-5\",\n },\n};\n\n/**\n * Meter\n *\n * Displays a measurement within a known range, with visual indicators for different value ranges.\n * Perfect for showing capacity, usage levels, scores, or any bounded measurement.\n */\nexport function Meter({\n label,\n size = \"md\",\n variant = \"default\",\n showWarningIndicator = true,\n warningThreshold = 80,\n className,\n ...props\n}: MeterProps) {\n const styles = sizeStyles[size];\n\n return (\n <AriaMeter {...props} className={composeTailwindRenderProps(className, \"flex flex-col gap-1\")}>\n {({ percentage, valueText }) => {\n const isWarning = showWarningIndicator && percentage >= warningThreshold;\n const effectiveVariant = variant === \"default\" ? getAutomaticVariant(percentage) : variant;\n\n return (\n <>\n <div className=\"flex justify-between gap-2\">\n {label && <Label>{label}</Label>}\n <span\n className={twMerge(\n styles.text,\n isWarning ? \"text-feedback-error-text\" : \"text-text-muted\"\n )}\n >\n {isWarning && (\n <AlertTriangle\n aria-label=\"Warning: High value\"\n className={twMerge(\"inline-block align-text-bottom mr-1\", styles.icon)}\n />\n )}\n {valueText}\n </span>\n </div>\n <div\n className={twMerge(\n \"relative rounded-full bg-background-muted\",\n \"ring-1 ring-inset ring-border-muted\",\n styles.bar\n )}\n >\n <div\n className={twMerge(\n \"absolute left-0 top-0 h-full rounded-full transition-all duration-300\",\n \"forced-colors:bg-[Highlight]\",\n getMeterColor(effectiveVariant)\n )}\n style={{ width: `${Math.min(100, Math.max(0, percentage))}%` }}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n </div>\n </>\n );\n }}\n </AriaMeter>\n );\n}\n\n/**\n * Automatically determine variant based on percentage\n */\nfunction getAutomaticVariant(percentage: number): MeterProps[\"variant\"] {\n if (percentage < 50) return \"success\";\n if (percentage < 70) return \"info\";\n if (percentage < 90) return \"warning\";\n return \"error\";\n}\n\n/**\n * Get the appropriate color class based on variant\n */\nfunction getMeterColor(variant: MeterProps[\"variant\"]) {\n switch (variant) {\n case \"success\":\n return \"bg-feedback-success-text\";\n case \"warning\":\n return \"bg-feedback-warning-text\";\n case \"error\":\n return \"bg-feedback-error-text\";\n case \"info\":\n return \"bg-feedback-info-text\";\n default:\n return \"bg-action-primary-background\";\n }\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { AlertCircle, CheckCircle, Info, X, XCircle } from \"lucide-react\";\nimport { useEffect } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type NoticeVariant = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface NoticeProps {\n /** Unique identifier for the notice */\n id: string;\n /** The message to display */\n message: string;\n /** Visual variant of the notice */\n variant?: NoticeVariant;\n /** Duration in milliseconds before auto-dismissal (0 = no auto-dismiss) */\n duration?: number;\n /** Whether the notice can be dismissed */\n dismissible?: boolean;\n /** Callback when the notice is dismissed */\n onDismiss?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles = {\n success: {\n container:\n \"bg-feedback-success-background border-feedback-success-border text-feedback-success-text\",\n icon: CheckCircle,\n },\n error: {\n container: \"bg-feedback-error-background border-feedback-error-border text-feedback-error-text\",\n icon: XCircle,\n },\n warning: {\n container:\n \"bg-feedback-warning-background border-feedback-warning-border text-feedback-warning-text\",\n icon: AlertCircle,\n },\n info: {\n container: \"bg-feedback-info-background border-feedback-info-border text-feedback-info-text\",\n icon: Info,\n },\n};\n\n/**\n * Notice\n *\n * Individual notification component that displays a message with an icon.\n * Typically used within a NoticeProvider for managing multiple notifications.\n */\nexport function Notice({\n id: _id,\n message,\n variant = \"info\",\n duration = 5000,\n dismissible = true,\n onDismiss,\n className,\n}: NoticeProps) {\n const { container, icon: Icon } = variantStyles[variant];\n\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n onDismiss?.();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, onDismiss]);\n\n return (\n <motion.div\n layout\n initial={{ opacity: 0, y: -20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95, transition: { duration: 0.2 } }}\n className={twMerge(\n \"pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg\",\n container,\n className\n )}\n >\n <Icon className=\"h-5 w-5 flex-shrink-0\" />\n <p className=\"flex-1 text-sm font-medium\">{message}</p>\n {dismissible && (\n <button\n onClick={onDismiss}\n className=\"flex-shrink-0 rounded-md p-1 transition-colors hover:bg-black/10\"\n aria-label=\"Dismiss notification\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </motion.div>\n );\n}\n","\"use client\";\nimport { AnimatePresence } from \"framer-motion\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Notice } from \"./Notice\";\n\ninterface NoticeData {\n id: string;\n message: string;\n variant: \"success\" | \"error\" | \"warning\" | \"info\";\n duration: number;\n dismissible: boolean;\n}\n\nexport interface NoticeContainerProps {\n /** Array of notices to display */\n notices: NoticeData[];\n /** Callback when a notice is dismissed */\n onDismiss: (id: string) => void;\n /** Position of the container on the screen */\n position?:\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n /** Additional CSS classes */\n className?: string;\n}\n\nconst positionStyles = {\n \"top-left\": \"top-4 left-4 items-start\",\n \"top-center\": \"top-4 left-1/2 -translate-x-1/2 items-center\",\n \"top-right\": \"top-4 right-4 items-end\",\n \"bottom-left\": \"bottom-4 left-4 items-start\",\n \"bottom-center\": \"bottom-4 left-1/2 -translate-x-1/2 items-center\",\n \"bottom-right\": \"bottom-4 right-4 items-end\",\n};\n\n/**\n * NoticeContainer\n *\n * Container component that positions and animates notices.\n * Renders notices in a portal to ensure they appear above other content.\n */\nexport function NoticeContainer({\n notices,\n onDismiss,\n position = \"top-right\",\n className,\n}: NoticeContainerProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return null;\n }\n\n const container = (\n <div\n className={twMerge(\n \"pointer-events-none fixed z-50 flex flex-col gap-2\",\n positionStyles[position],\n className\n )}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <AnimatePresence mode=\"sync\">\n {notices.map((notice) => (\n <Notice\n key={notice.id}\n id={notice.id}\n message={notice.message}\n variant={notice.variant}\n duration={notice.duration}\n dismissible={notice.dismissible}\n onDismiss={() => onDismiss(notice.id)}\n />\n ))}\n </AnimatePresence>\n </div>\n );\n\n // Portal to body to ensure notices appear above everything\n return createPortal(container, document.body);\n}\n","\"use client\";\nimport { createContext, ReactNode, useCallback, useContext, useState } from \"react\";\nimport type { NoticeVariant } from \"./Notice\";\nimport { NoticeContainer } from \"./NoticeContainer\";\n\ninterface NoticeData {\n id: string;\n message: string;\n variant: NoticeVariant;\n duration: number;\n dismissible: boolean;\n}\n\ninterface NoticeContextValue {\n notices: NoticeData[];\n addNotice: (message: string, options?: Partial<Omit<NoticeData, \"id\" | \"message\">>) => string;\n removeNotice: (id: string) => void;\n clearNotices: () => void;\n}\n\nconst NoticeContext = createContext<NoticeContextValue | undefined>(undefined);\n\nexport interface NoticeProviderProps {\n /** Child components */\n children: ReactNode;\n /** Position of the notice container */\n position?:\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n /** Maximum number of notices to display at once */\n maxNotices?: number;\n /** Default duration for notices in milliseconds */\n defaultDuration?: number;\n /** Whether notices are dismissible by default */\n defaultDismissible?: boolean;\n}\n\n/**\n * NoticeProvider\n *\n * Provides notice functionality to child components.\n * Manages the state of all active notices and renders them in a container.\n */\nexport function NoticeProvider({\n children,\n position = \"top-right\",\n maxNotices = 5,\n defaultDuration = 5000,\n defaultDismissible = true,\n}: NoticeProviderProps) {\n const [notices, setNotices] = useState<NoticeData[]>([]);\n\n const addNotice = useCallback(\n (message: string, options?: Partial<Omit<NoticeData, \"id\" | \"message\">>) => {\n const id = `notice-${Date.now()}-${Math.random()}`;\n const newNotice: NoticeData = {\n id,\n message,\n variant: options?.variant || \"info\",\n duration: options?.duration ?? defaultDuration,\n dismissible: options?.dismissible ?? defaultDismissible,\n };\n\n setNotices((prev) => {\n const updated = [...prev, newNotice];\n // Keep only the most recent notices if we exceed maxNotices\n if (updated.length > maxNotices) {\n return updated.slice(-maxNotices);\n }\n return updated;\n });\n\n return id;\n },\n [maxNotices, defaultDuration, defaultDismissible]\n );\n\n const removeNotice = useCallback((id: string) => {\n setNotices((prev) => prev.filter((notice) => notice.id !== id));\n }, []);\n\n const clearNotices = useCallback(() => {\n setNotices([]);\n }, []);\n\n const value: NoticeContextValue = {\n notices,\n addNotice,\n removeNotice,\n clearNotices,\n };\n\n return (\n <NoticeContext.Provider value={value}>\n {children}\n <NoticeContainer notices={notices} onDismiss={removeNotice} position={position} />\n </NoticeContext.Provider>\n );\n}\n\n/**\n * useNoticeContext\n *\n * Internal hook to access the NoticeContext.\n * Throws an error if used outside of a NoticeProvider.\n */\nexport function useNoticeContext() {\n const context = useContext(NoticeContext);\n if (!context) {\n throw new Error(\"useNoticeContext must be used within a NoticeProvider\");\n }\n return context;\n}\n","import { useCallback } from \"react\";\nimport type { NoticeVariant } from \"./Notice\";\nimport { useNoticeContext } from \"./NoticeProvider\";\n\nexport interface NoticeOptions {\n variant?: NoticeVariant;\n duration?: number;\n dismissible?: boolean;\n}\n\n/**\n * useNotice\n *\n * Hook to display notices from anywhere in the component tree.\n * Must be used within a NoticeProvider.\n *\n * @example\n * ```tsx\n * const notice = useNotice();\n *\n * // Show different types of notices\n * notice.success(\"Settings saved!\");\n * notice.error(\"Failed to save settings\");\n * notice.warning(\"Your session will expire soon\");\n * notice.info(\"New features are available\");\n *\n * // With custom options\n * notice.show(\"Custom notice\", {\n * variant: \"success\",\n * duration: 10000,\n * dismissible: false\n * });\n *\n * // Clear all notices\n * notice.clear();\n * ```\n */\nexport function useNotice() {\n const { addNotice, removeNotice, clearNotices } = useNoticeContext();\n\n const show = useCallback(\n (message: string, options?: NoticeOptions) => {\n return addNotice(message, options);\n },\n [addNotice]\n );\n\n const success = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"success\" });\n },\n [addNotice]\n );\n\n const error = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"error\" });\n },\n [addNotice]\n );\n\n const warning = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"warning\" });\n },\n [addNotice]\n );\n\n const info = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"info\" });\n },\n [addNotice]\n );\n\n return {\n show,\n success,\n error,\n warning,\n info,\n dismiss: removeNotice,\n clear: clearNotices,\n };\n}\n","import { useId } from \"react\";\nimport {\n Button as AriaButton,\n Input as AriaInput,\n NumberField as AriaNumberField,\n NumberFieldProps as AriaNumberFieldProps,\n Group,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { BaseInputProps, Description, FieldError, getInputStateStyles, Label } from \"../Field\";\nimport { Icon } from \"../Icon\";\n\nconst getNumberFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n return twMerge(\n getInputStateStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n }),\n props.transparent ? \"bg-transparent\" : \"bg-background-input\",\n \"pr-9\", // Space for stepper buttons\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\", // Hide native spinners\n props.className\n );\n};\n\n/**\n * NumberField\n *\n * Numeric input with stepper controls and validation.\n */\nexport interface NumberFieldProps\n extends Omit<AriaNumberFieldProps, \"size\" | \"className\">,\n BaseInputProps {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n formatOptions?: Intl.NumberFormatOptions;\n id?: string;\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\nexport function NumberField({\n label,\n description,\n errorMessage,\n size,\n tooltip,\n isRequired,\n transparent,\n validationResult,\n ...props\n}: NumberFieldProps) {\n const id = useId();\n\n return (\n <AriaNumberField\n {...props}\n id={id}\n isRequired={isRequired}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-1\")}\n step={props.step ?? 1}\n onChange={(value) => {\n if (typeof value === \"number\") {\n if (props.maxValue != null && value > props.maxValue) {\n props.onChange?.(props.maxValue);\n } else if (props.minValue != null && value < props.minValue) {\n props.onChange?.(props.minValue);\n } else {\n props.onChange?.(value);\n }\n }\n }}\n isInvalid={\n !!errorMessage ||\n (typeof props.value === \"number\" &&\n ((props.maxValue != null && props.value > props.maxValue) ||\n (props.minValue != null && props.value < props.minValue)))\n }\n >\n {({ isDisabled, isInvalid }) => {\n const isValueInvalid = isInvalid || !!errorMessage;\n return (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired} htmlFor={id}>\n {label}\n </Label>\n )}\n <div className=\"relative\">\n <Group className=\"relative\">\n <AriaInput\n className={getNumberFieldStyles({\n isInvalid: isValueInvalid,\n isDisabled,\n transparent,\n size,\n className: typeof props.className === \"string\" ? props.className : undefined,\n })}\n />\n <div className=\"absolute inset-y-[1px] right-[1px] flex flex-col divide-y border-l overflow-hidden rounded-r-[calc(var(--control-border-radius)-1px)]\">\n <AriaButton\n slot=\"increment\"\n isDisabled={isDisabled}\n className=\"flex h-1/2 w-7 items-center justify-center bg-background-input hover:bg-background-input-hover active:bg-background-input-active disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Icon name=\"CaretUp\" size={14} />\n </AriaButton>\n <AriaButton\n slot=\"decrement\"\n isDisabled={isDisabled}\n className=\"flex h-1/2 w-7 items-center justify-center bg-background-input hover:bg-background-input-hover active:bg-background-input-active disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Icon name=\"CaretDown\" size={14} />\n </AriaButton>\n </div>\n </Group>\n </div>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {errorMessage && (\n <FieldError size={size} className=\"mt-3\">\n {typeof errorMessage === \"function\"\n ? errorMessage(validationResult!)\n : errorMessage}\n </FieldError>\n )}\n </div>\n );\n }}\n </AriaNumberField>\n );\n}\n","import * as React from \"react\";\nimport {\n composeRenderProps,\n Key,\n Tab as RACTab,\n TabList as RACTabList,\n TabListProps as RACTabListProps,\n TabPanel as RACTabPanel,\n TabProps as RACTabProps,\n Tabs as RACTabs,\n TabsProps as RACTabsProps,\n TabPanelProps,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\n\nexport type { Key };\n\nexport type TabVariant = \"default\" | \"accent\";\n\n// Create a context to pass the variant down to child components\nconst TabsContext = React.createContext<{ variant: TabVariant }>({ variant: \"default\" });\n\ntype TabProps = RACTabProps & {\n isSelected?: boolean;\n id?: string;\n};\n\nexport type TabsProps = RACTabsProps & {\n variant?: TabVariant;\n};\n\nexport type TabListProps<T extends object> = RACTabListProps<T> & {\n variant?: TabVariant;\n};\n\nfunction getTabsStyles({\n orientation,\n className = \"\",\n}: {\n orientation: \"horizontal\" | \"vertical\";\n className?: string;\n}) {\n const baseStyles = \"flex flex-col w-full\";\n const orientationStyles = {\n horizontal: \"\",\n vertical: \"flex-row\",\n };\n\n return `${baseStyles} ${orientationStyles[orientation] || \"\"} ${className}`.trim();\n}\n\n/**\n * Tabs\n *\n * Tabbed interface with styled tabs and panels.\n * @param variant - \"default\" for gray styling, \"accent\" for brand color styling\n */\nexport function Tabs({ variant = \"default\", ...props }: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant }}>\n <div className=\"w-full\">\n <RACTabs\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabsStyles({ ...renderProps, className })\n )}\n />\n </div>\n </TabsContext.Provider>\n );\n}\n\nfunction getTabListStyles({\n orientation,\n className = \"\",\n}: {\n orientation: \"horizontal\" | \"vertical\";\n className?: string;\n}) {\n const baseStyles =\n \"flex gap-10 relative after:absolute after:bottom-0 after:left-0 after:right-0 after:h-[2px] after:bg-border-muted\";\n const orientationStyles = {\n horizontal: \"flex-row w-full\",\n vertical: \"flex-col items-start\",\n };\n\n return `${baseStyles} ${orientationStyles[orientation] || \"\"} ${className}`.trim();\n}\n\n/**\n * TabList container.\n */\nexport function TabList<T extends object>({ variant, ...props }: TabListProps<T>) {\n // If variant is passed directly to TabList, use it; otherwise inherit from context\n const context = React.useContext(TabsContext);\n const effectiveVariant = variant ?? context.variant;\n\n return (\n <TabsContext.Provider value={{ variant: effectiveVariant }}>\n <RACTabList\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabListStyles({\n ...renderProps,\n className: className || \"\",\n })\n )}\n />\n </TabsContext.Provider>\n );\n}\n\nfunction getTabStyles({\n isSelected,\n isDisabled,\n variant,\n className = \"\",\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n variant: TabVariant;\n className?: string;\n}) {\n const baseStyles =\n \"flex items-center cursor-default px-1 py-2 font-medium transition-all hover:cursor-pointer relative\";\n const focusRingStyles = focusRing();\n\n let stateStyles = \"\";\n if (isDisabled) {\n stateStyles = \"text-text-disabled forced-colors:text-[GrayText] cursor-not-allowed\";\n } else if (isSelected) {\n if (variant === \"accent\") {\n stateStyles =\n \"text-action-primary border-b-2 border-action-primary z-10 forced-colors:bg-[Highlight]\";\n } else {\n // Default gray variant - similar to Radix UI\n stateStyles =\n \"text-text-heading border-b-2 border-text-heading z-10 forced-colors:bg-[Highlight]\";\n }\n } else {\n // Inactive tabs - more muted like Radix UI\n stateStyles = \"text-text-placeholder hover:text-text-muted\";\n }\n\n return `${baseStyles} ${focusRingStyles} ${stateStyles} ${className}`.trim();\n}\n\n/**\n * Tab trigger element.\n */\nexport function Tab(props: TabProps) {\n const { variant } = React.useContext(TabsContext);\n\n return (\n <RACTab\n {...props}\n data-testid={props.id ? `tab-${props.id}` : undefined}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabStyles({\n ...renderProps,\n className,\n isSelected: renderProps.isSelected,\n variant,\n })\n )}\n />\n );\n}\n\nfunction getTabPanelStyles({ className = \"\" }: { className?: string }) {\n const baseStyles = \"block w-full mt-4 text-text-body\";\n const focusRingStyles = focusRing();\n\n return `${baseStyles} ${focusRingStyles} ${className}`.trim();\n}\n\n/**\n * TabPanel content area.\n */\nexport function TabPanel(props: TabPanelProps) {\n return (\n <RACTabPanel\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabPanelStyles({\n ...renderProps,\n className: className || \"\",\n })\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Breadcrumb, Breadcrumbs } from \"../Breadcrumbs\";\nimport { Heading } from \"../Heading\";\nimport { Tabs as RACTabs, Tab, TabList } from \"../Tabs\";\n\n/**\n * PageLayout — opinionated, SSR-friendly page scaffold for dashboards.\n *\n * Structure:\n * <PageLayout>\n * <PageLayout.Header title=\"...\" subtitle=\"...\" breadcrumbs={[...]} />\n * <PageLayout.Actions primary={<Button/>} secondary={<Button/>} />\n * <PageLayout.Filters>...chips/search/time...</PageLayout.Filters>\n * <PageLayout.Tabs tabs={[...]} value=... onChange=... />\n * <PageLayout.Content>\n * <Grid cols={{ base: 1, lg: 4 }} gap=\"lg\">\n * ...cards/tables/content...\n * </Grid>\n * </PageLayout.Content>\n * <PageLayout.Aside>...sticky insights/help...</PageLayout.Aside>\n * </PageLayout>\n *\n * Notes:\n * - Router-agnostic: Breadcrumbs accept either structured items with a Link component, or a custom ReactNode.\n * - Accessible: Header uses h1; Tabs are roving-`tablist`; Filters region has landmark role.\n * - Composable: Use with Grid component for layouts, Card for content containers.\n * - Styling: token-oriented utility classes (match to your Tailwind preset/tokens).\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type BreadcrumbItem = { label: string; href?: string };\n\nexport type PageLayoutProps = {\n children: React.ReactNode;\n /** Constrain width and apply default page rhythm */\n maxWidth?: number; // px\n paddingXClass?: string; // e.g., \"px-4 md:px-6\"\n paddingYClass?: string; // e.g., \"py-4 md:py-6\"\n className?: string;\n};\n\nexport function PageLayout({\n children,\n maxWidth = 1400,\n paddingXClass = \"px-4 md:px-6\",\n paddingYClass = \"py-4 md:py-6\",\n className,\n}: PageLayoutProps) {\n return (\n <div\n className={twMerge(`w-full ${paddingXClass} ${paddingYClass}`, className)}\n style={{ marginInline: \"auto\", maxWidth }}\n >\n {children}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Header\n// ——————————————————————————————————————————\n\nexport type PageHeaderProps = {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n breadcrumbs?: BreadcrumbItem[];\n /** Custom breadcrumbs node if you don't want the built-in renderer */\n breadcrumbsNode?: React.ReactNode;\n /** Optional right-aligned meta area (badges, status, small stats) */\n meta?: React.ReactNode;\n /** Optional slot to replace the default heading element */\n headingAs?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n className?: string;\n};\n\nexport function Header({\n title,\n subtitle,\n breadcrumbs,\n breadcrumbsNode,\n meta,\n headingAs,\n className,\n}: PageHeaderProps) {\n return (\n <header className={twMerge(\"mb-4 md:mb-6\", className)} aria-labelledby=\"page-title\">\n {/* Breadcrumbs */}\n {breadcrumbsNode ? (\n <div className=\"mb-2\">{breadcrumbsNode}</div>\n ) : breadcrumbs?.length ? (\n <div className=\"mb-2\">\n <Breadcrumbs>\n {breadcrumbs.map((bc, i) => (\n <Breadcrumb key={`${bc.label}-${i}`} {...(bc.href ? { href: bc.href } : {})}>\n {bc.label}\n </Breadcrumb>\n ))}\n </Breadcrumbs>\n </div>\n ) : null}\n\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div id=\"page-title\">\n <Heading tag={headingAs || \"h1\"} size=\"xl\">\n {title}\n </Heading>\n </div>\n {subtitle ? <p className=\"mt-1 text-text-muted\">{subtitle}</p> : null}\n </div>\n {meta ? <div className=\"shrink-0\">{meta}</div> : null}\n </div>\n </header>\n );\n}\n\n// ——————————————————————————————————————————\n// Actions\n// ——————————————————————————————————————————\n\nexport type PageActionsProps = {\n primary?: React.ReactNode; // main CTA button\n secondary?: React.ReactNode; // secondary button(s)\n children?: React.ReactNode; // freeform (e.g., segmented control)\n align?: \"start\" | \"end\";\n className?: string;\n};\n\nexport function Actions({\n primary,\n secondary,\n children,\n align = \"end\",\n className,\n}: PageActionsProps) {\n return (\n <div\n className={twMerge(\n `mb-3 md:mb-4 flex items-center gap-2 ${align === \"end\" ? \"justify-end\" : \"justify-start\"}`,\n className\n )}\n >\n {children}\n <div className=\"ml-auto flex items-center gap-2\">\n {secondary}\n {primary}\n </div>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Filters (landmark region)\n// ——————————————————————————————————————————\n\nexport type PageFiltersProps = {\n children: React.ReactNode;\n className?: string;\n ariaLabel?: string;\n};\n\nexport function Filters({ children, className, ariaLabel = \"Filters\" }: PageFiltersProps) {\n return (\n <section\n aria-label={ariaLabel}\n className={twMerge(\"mb-4 md:mb-6 flex flex-wrap items-center gap-2\", className)}\n >\n {children}\n </section>\n );\n}\n\n// ——————————————————————————————————————————\n// Tabs (wrapper around React Aria Tabs)\n// ——————————————————————————————————————————\n\nexport type PageLayoutTab = { id: string; label: React.ReactNode; disabled?: boolean };\nexport type TabsProps = {\n tabs: PageLayoutTab[];\n value?: string; // controlled\n defaultValue?: string; // uncontrolled\n onChange?: (id: string) => void;\n className?: string;\n children?: React.ReactNode; // Optional: for rendering TabPanels\n};\n\nexport function Tabs({ tabs, value, defaultValue, onChange, className, children }: TabsProps) {\n // Convert onChange to handle Key type from React Aria\n const handleSelectionChange = (key: React.Key) => {\n onChange?.(key as string);\n };\n\n return (\n <div className={twMerge(\"mb-3 md:mb-4\", className)}>\n <RACTabs\n selectedKey={value}\n defaultSelectedKey={defaultValue || tabs[0]?.id}\n onSelectionChange={handleSelectionChange}\n >\n <TabList>\n {tabs.map((t) => (\n <Tab key={t.id} id={t.id} isDisabled={t.disabled}>\n {t.label}\n </Tab>\n ))}\n </TabList>\n {children}\n </RACTabs>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Content & Aside\n// ——————————————————————————————————————————\n\nexport type PageContentProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Content({ children, className }: PageContentProps) {\n return <div className={twMerge(\"w-full\", className)}>{children}</div>;\n}\n\nexport type PageAsideProps = {\n children: React.ReactNode;\n /** Sticky aside on wide screens */\n sticky?: boolean;\n className?: string;\n};\n\nexport function Aside({ children, sticky = true, className }: PageAsideProps) {\n return (\n <aside className={twMerge(sticky ? \"lg:sticky lg:top-20\" : \"\", className)}>{children}</aside>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nPageLayout.Header = Header;\nPageLayout.Actions = Actions;\nPageLayout.Filters = Filters;\nPageLayout.Tabs = Tabs;\nPageLayout.Content = Content;\nPageLayout.Aside = Aside;\n\n// ——————————————————————————————————————————\n// Example usage (Storybook-ready snippet)\n// ——————————————————————————————————————————\n\nexport function ExamplePage() {\n return (\n <PageLayout>\n <PageLayout.Header\n title=\"Devices\"\n subtitle=\"Monitor and manage DERs\"\n breadcrumbs={[{ label: \"Home\", href: \"/\" }, { label: \"Devices\" }]}\n meta={<span className=\"text-sm text-text-muted\">2,481 online</span>}\n />\n\n <PageLayout.Actions\n secondary={\n <button\n type=\"button\"\n className=\"rounded-md border border-border-default px-3 py-1.5 text-sm hover:bg-background-muted transition-colors\"\n >\n Export\n </button>\n }\n primary={\n <button\n type=\"button\"\n className=\"rounded-md bg-action-primary px-3 py-1.5 text-sm text-text-on-primary hover:bg-action-primary-hover transition-colors\"\n >\n Add device\n </button>\n }\n />\n\n <PageLayout.Filters>\n <input\n className=\"rounded-md border border-border-default px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-action-primary focus:border-transparent\"\n placeholder=\"Search devices\"\n />\n <select className=\"rounded-md border border-border-default px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-action-primary focus:border-transparent\">\n <option>Status: all</option>\n <option>Online</option>\n <option>Offline</option>\n </select>\n </PageLayout.Filters>\n\n <PageLayout.Tabs\n tabs={[\n { id: \"overview\", label: \"Overview\" },\n { id: \"activity\", label: \"Activity\" },\n { id: \"settings\", label: \"Settings\" },\n ]}\n />\n\n <PageLayout.Content>\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-4 md:gap-6\">\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-4\">\n <h3 className=\"text-lg font-semibold mb-2\">KPI Group</h3>\n <p className=\"text-text-muted\">Key performance indicators</p>\n </div>\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-8\">\n <h3 className=\"text-lg font-semibold mb-2\">Timeseries Chart</h3>\n <p className=\"text-text-muted\">Device performance over time</p>\n </div>\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-12\">\n <h3 className=\"text-lg font-semibold mb-2\">Devices Table</h3>\n <p className=\"text-text-muted\">Complete list of all devices</p>\n </div>\n </div>\n </PageLayout.Content>\n </PageLayout>\n );\n}\n","import { useRef } from \"react\";\nimport { type Key, type ValidationResult } from \"react-aria-components\";\n\nimport { Autocomplete } from \"../Autocomplete/Autocomplete\";\nimport { Icon } from \"../Icon/Icon\";\n\nexport interface Place {\n id: string;\n place_name: string;\n place_type: string[];\n center: [number, number];\n}\n\ninterface MapboxResponse {\n features: Place[];\n type: string;\n}\n\n// Type guard to validate MapboxResponse shape\nfunction isMapboxResponse(data: unknown): data is MapboxResponse {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"features\" in data &&\n Array.isArray(data.features) &&\n \"type\" in data &&\n typeof data.type === \"string\"\n );\n}\n\ntype SearchType =\n | \"country\"\n | \"region\"\n | \"district\"\n | \"place\"\n | \"locality\"\n | \"neighborhood\"\n | \"address\"\n | \"street\";\n\n/**\n * PlaceSearch\n *\n * Location search component with autocomplete; emits a `Place` value on\n * selection.\n */\nexport interface PlaceSearchProps {\n label?: string;\n selectedKey?: Key | null;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n placeholder?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n description?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n tooltip?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n showErrors?: boolean;\n autoFocus?: boolean;\n onSelect: (place: Place) => void;\n searchTypes?: SearchType[];\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n validationResult?: ValidationResult;\n countryRestrictions?: string[]; // Array of ISO 3166-1 alpha-2 country codes\n proximity?: \"ip\" | [number, number]; // Either \"ip\" for IP-based location or [longitude, latitude] coordinates\n}\n\nconst MAPBOX_TOKEN = process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN || \"\";\n\nexport function PlaceSearch({\n label = \"Search for a place\",\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n placeholder = \"Enter a location...\",\n errorMessage,\n description,\n size = \"md\",\n tooltip,\n isRequired,\n isDisabled,\n showErrors = true,\n autoFocus = false,\n onSelect,\n searchTypes = [\"place\", \"address\"],\n defaultFilter,\n validationResult,\n countryRestrictions,\n proximity = \"ip\", // Set IP-based location as default\n}: PlaceSearchProps) {\n // Use a WeakMap to store additional data for each item\n const itemDataRef = useRef(\n new WeakMap<{ id: string; name: string }, { type: string; center: [number, number] }>()\n );\n\n // Store the last loaded items for use in selection\n const loadedItemsRef = useRef<{ id: string; name: string }[]>([]);\n\n const requestConfig = {\n requestType: \"REST\" as const,\n method: \"GET\" as const,\n url: \"https://api.mapbox.com/geocoding/v5/mapbox.places/{q}.json\",\n extraParams: {\n access_token: MAPBOX_TOKEN,\n types: searchTypes.join(\",\"),\n limit: \"5\",\n ...(countryRestrictions?.length\n ? { country: countryRestrictions.join(\",\").toLowerCase() }\n : {}),\n ...(proximity\n ? {\n proximity: proximity === \"ip\" ? \"ip\" : proximity.join(\",\"),\n }\n : {}),\n },\n shouldLoad: (filterText: string) => {\n return filterText.length > 0;\n },\n transformResponse: (data: unknown) => {\n if (!isMapboxResponse(data)) return [];\n\n const items = data.features.map((feature) => {\n const item = {\n id: feature.id,\n name: feature.place_name,\n };\n // Store additional data in the WeakMap\n itemDataRef.current.set(item, {\n type: feature.place_type[0],\n center: feature.center,\n });\n return item;\n });\n\n // Store the items for later use\n if (items.length > 0) {\n loadedItemsRef.current = items;\n }\n\n return items;\n },\n };\n\n const renderItem = (item: { id: string; name: string }) => {\n const itemData = itemDataRef.current.get(item);\n\n // Split the place name into parts by commas for better formatting\n const nameParts = item.name.split(\", \");\n const primaryText = nameParts[0];\n const secondaryText = nameParts.slice(1).join(\", \");\n\n return (\n <div className=\"flex items-center gap-3 py-0.5\">\n <Icon\n name={\n itemData?.type === \"address\"\n ? \"MapPin\"\n : itemData?.type === \"place\"\n ? \"Buildings\"\n : itemData?.type === \"region\"\n ? \"MapPinArea\"\n : itemData?.type === \"country\"\n ? \"Flag\"\n : \"Circle\"\n }\n className=\"h-5 w-5 flex-shrink-0 text-text-muted\"\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium text-text-body\">{primaryText}</span>\n {secondaryText && (\n <span className=\"truncate text-sm text-text-muted\">{secondaryText}</span>\n )}\n </div>\n </div>\n );\n };\n\n const renderLeftIcon = (isLoading: boolean) => {\n if (isLoading) {\n return <Icon name=\"CircleNotch\" className=\"h-4 w-4 animate-spin text-text-muted\" />;\n }\n return <Icon name=\"MagnifyingGlass\" className=\"h-4 w-4 text-text-muted\" />;\n };\n\n return (\n <Autocomplete\n data-testid=\"autocomplete\"\n data-config={JSON.stringify({\n types: searchTypes.join(\",\"),\n country: countryRestrictions?.join(\",\").toLowerCase(),\n proximity: proximity === \"ip\" ? \"ip\" : proximity?.join(\",\"),\n })}\n label={label}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(key) => {\n onSelectionChange?.(key);\n if (key) {\n // Use the stored items instead of creating an empty array\n const items = loadedItemsRef.current;\n const selected = items.find((item) => item.id === key);\n\n if (selected) {\n const itemData = itemDataRef.current.get(selected);\n\n if (itemData) {\n onSelect({\n id: selected.id,\n place_name: selected.name,\n place_type: [itemData.type],\n center: itemData.center,\n });\n }\n }\n }\n }}\n requestConfig={requestConfig}\n placeholder={placeholder}\n errorMessage={errorMessage}\n description={description}\n size={size}\n tooltip={tooltip}\n isRequired={isRequired}\n isDisabled={isDisabled}\n showErrors={showErrors}\n autoFocus={autoFocus}\n renderItem={renderItem}\n renderLeftIcon={renderLeftIcon}\n defaultFilter={defaultFilter}\n validationResult={validationResult}\n />\n );\n}\n","import {\n ProgressBar as AriaProgressBar,\n ProgressBarProps as AriaProgressBarProps,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\n\n/**\n * ProgressBar\n *\n * Linear progress indicator with optional labels.\n */\nexport interface ProgressBarProps extends AriaProgressBarProps {\n label?: string;\n rightLabel?: string;\n progressWidth?: number;\n hideLabels?: boolean;\n}\n\nexport function ProgressBar({\n label,\n rightLabel,\n progressWidth = 64,\n hideLabels = false,\n ...props\n}: ProgressBarProps) {\n return (\n <AriaProgressBar\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-1\")}\n >\n {({ percentage, valueText, isIndeterminate }) => (\n <>\n {!hideLabels && (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm text-text-heading\">{label}</span>\n <span className=\"text-sm text-text-heading\">{rightLabel || valueText}</span>\n </div>\n )}\n <div\n className={`relative h-2 w-${progressWidth} overflow-hidden rounded-full bg-background-muted outline-none`}\n >\n <div\n className={`absolute top-0 h-full rounded-full bg-blue-600 dark:bg-blue-500 forced-colors:bg-[Highlight] ${isIndeterminate ? \"left-full duration-1000 ease-out animate-in slide-out-to-right-full repeat-infinite [--tw-enter-translate-x:calc(-16rem-100%)]\" : \"left-0\"}`}\n style={{ width: (isIndeterminate ? 40 : percentage) + \"%\" }}\n />\n </div>\n </>\n )}\n </AriaProgressBar>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n Radio as RACRadio,\n RadioGroup as RACRadioGroup,\n RadioGroupProps as RACRadioGroupProps,\n RadioProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\nimport { Description, FieldError, Label } from \"../Field\";\n\nexport interface RadioGroupProps extends Omit<RACRadioGroupProps, \"children\"> {\n /** Label for the radio group */\n label?: string;\n /** Children elements */\n children?: ReactNode;\n /** Optional description for the radio group */\n description?: string;\n /** Error message to display when validation fails */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /** Validation result object for functional errorMessage */\n validationResult?: ValidationResult;\n}\n\nexport function RadioGroup(props: RadioGroupProps) {\n return (\n <RACRadioGroup\n {...props}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-2\")}\n >\n <Label>{props.label}</Label>\n <div className=\"flex gap-2 group-orientation-horizontal:gap-4 group-orientation-vertical:flex-col\">\n {props.children}\n </div>\n {props.description && <Description>{props.description}</Description>}\n <FieldError>\n {typeof props.errorMessage === \"function\" && props.validationResult\n ? props.errorMessage(props.validationResult)\n : typeof props.errorMessage === \"string\"\n ? props.errorMessage\n : null}\n </FieldError>\n </RACRadioGroup>\n );\n}\n\nfunction getRadioStyles({\n isSelected,\n isInvalid,\n isDisabled,\n}: {\n isSelected?: boolean;\n isInvalid?: boolean;\n isDisabled?: boolean;\n}) {\n const baseClasses = [\n focusRing(),\n \"w-5 h-5 rounded-full border-2 bg-background-surface transition-all\",\n ];\n\n if (isDisabled) {\n baseClasses.push(\"border-border-muted forced-colors:!border-[GrayText]\");\n } else if (isInvalid) {\n baseClasses.push(\n \"border-feedback-error-border group-pressed:border-feedback-error-border dark:group-pressed:border-feedback-error-border forced-colors:!border-[Mark]\"\n );\n } else if (isSelected) {\n baseClasses.push(\n \"border-[7px] border-action-primary forced-colors:!border-[Highlight] group-pressed:border-action-primary-hover dark:group-pressed:border-action-primary-hover\"\n );\n } else {\n baseClasses.push(\n \"border-border-default group-pressed:border-border-focus dark:group-pressed:border-border-focus\"\n );\n }\n\n return baseClasses.join(\" \");\n}\n\nexport function Radio(props: RadioProps) {\n return (\n <RACRadio\n {...props}\n className={composeTailwindRenderProps(\n props.className,\n \"group flex items-center gap-2 text-sm text-text-body transition disabled:text-text-muted dark:text-text-body dark:disabled:text-text-muted forced-colors:disabled:text-[GrayText]\"\n )}\n >\n {(renderProps) => (\n <>\n <div className={getRadioStyles(renderProps)} />\n {props.children}\n </>\n )}\n </RACRadio>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport type {\n TextFieldProps as AriaTextFieldProps,\n TextFieldRenderProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { TextField as AriaTextFieldComponent } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n ClearButton,\n Description,\n FieldError,\n getInputBaseStyles,\n Input,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\nimport { Icon } from \"../Icon/Icon\";\n\nconst getTextFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n showSearchIcon?: boolean;\n isClearable?: boolean;\n hasValue?: boolean;\n isPassword?: boolean;\n className?: string;\n}): string => {\n // Get base input styles\n const baseStyles = getInputBaseStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n transparent: props.transparent,\n size: props.size,\n });\n\n // Add TextField-specific padding styles\n const paddingStyles = [\n props.showSearchIcon ? \"pl-8\" : \"pl-3\",\n (props.isClearable && props.hasValue) || props.isPassword ? \"pr-8\" : \"pr-3\",\n ].join(\" \");\n\n return twMerge(baseStyles, paddingStyles, props.className);\n};\n\n/**\n * TextField\n *\n * A controlled or uncontrolled text input with Edges styling, label,\n * description, error messaging, and optional affordances like a search icon,\n * clear button, and password visibility toggle. Wraps\n * `react-aria-components` TextField for accessible behavior.\n */\nexport interface TextFieldProps\n extends Omit<AriaTextFieldProps, \"isRequired\" | \"size\" | \"className\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n placeholder?: string;\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\n/**\n * Renders an Edges TextField with label, description, validation states and\n * optional search/clear/password affordances.\n */\nexport function TextField({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n isRequired,\n transparent,\n showSearchIcon,\n isClearable,\n onClear,\n type,\n validationResult,\n ...props\n}: TextFieldProps) {\n const [showPassword, setShowPassword] = React.useState(false);\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n const isPassword = type === \"password\";\n\n return (\n <AriaTextFieldComponent\n {...props}\n isRequired={isRequired}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col\")}\n >\n {({ isDisabled, isInvalid }: TextFieldRenderProps) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <InputWrapper>\n {showSearchIcon && (\n <div className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 transform\">\n <Icon name=\"MagnifyingGlass\" className=\"h-4 w-4 text-text-muted\" />\n </div>\n )}\n <Input\n size={size}\n disabled={isDisabled}\n type={isPassword ? (showPassword ? \"text\" : \"password\") : type}\n value={props.value as string | undefined}\n defaultValue={props.defaultValue as string | undefined}\n placeholder={props.placeholder}\n onFocus={(e) => handleFocus(e, props.onFocus)}\n onBlur={(e) => handleBlur(e, props.onBlur)}\n onChange={(e) => props.onChange?.(e.target.value)}\n className={getTextFieldStyles({\n isInvalid,\n isDisabled,\n isFocused,\n size,\n transparent,\n showSearchIcon,\n isClearable,\n hasValue: !!props.value,\n isPassword,\n className: typeof props.className === \"string\" ? props.className : undefined,\n })}\n />\n {isClearable && props.value && !isDisabled && (\n <ClearButton\n onClick={() => {\n if (onClear) {\n onClear();\n } else if (props.onChange) {\n props.onChange(\"\");\n }\n }}\n size={size}\n />\n )}\n {isPassword && !isDisabled && (\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transform text-text-muted hover:text-text-body\"\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Icon\n name={showPassword ? \"EyeSlash\" : \"Eye\"}\n size={size === \"sm\" ? 16 : 20}\n className=\"text-text-body\"\n />\n </button>\n )}\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n )}\n </AriaTextFieldComponent>\n );\n}\n","\"use client\";\nimport Link from \"@tiptap/extension-link\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport { BubbleMenu } from \"@tiptap/react/menus\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport React, { useState } from \"react\";\nimport { Dialog, Modal } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { Icon } from \"../Icon\";\nimport { TextField } from \"../TextField\";\n\nexport interface RichTextEditorProps {\n /**\n * The initial content of the editor\n */\n initialContent?: string;\n /**\n * Callback when the content changes\n */\n onChange?: (html: string) => void;\n /**\n * Additional className to apply to the editor\n */\n className?: string;\n /**\n * Whether the editor is disabled\n */\n isDisabled?: boolean;\n /**\n * Placeholder text when editor is empty\n */\n placeholder?: string;\n}\n\nconst ToolbarButton = ({\n isActive = false,\n onPress,\n children,\n}: {\n isActive?: boolean;\n onPress: () => void;\n children: React.ReactNode;\n}) => (\n <Button variant={isActive ? \"secondary\" : \"ghost\"} size=\"sm\" onPress={onPress} className=\"p-1\">\n {children}\n </Button>\n);\n\ninterface LinkDialogProps {\n initialUrl: string;\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (url: string) => void;\n}\n\nfunction LinkDialog({ initialUrl, isOpen, onClose, onSubmit }: LinkDialogProps) {\n const [url, setUrl] = useState(initialUrl);\n\n React.useEffect(() => {\n setUrl(initialUrl);\n }, [initialUrl]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit(url);\n onClose();\n };\n\n return (\n <Modal isDismissable isOpen={isOpen} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <Dialog className=\"relative\">\n <form onSubmit={handleSubmit}>\n <DialogHeader title=\"Insert Link\" onClose={onClose} />\n <div className=\"p-6\">\n <TextField\n label=\"URL\"\n type=\"url\"\n value={url}\n onChange={setUrl}\n autoFocus\n className=\"w-full\"\n />\n </div>\n <div className=\"flex justify-end gap-2 border-t border-border-muted p-4\">\n <Button variant=\"secondary\" onPress={onClose}>\n Cancel\n </Button>\n <Button type=\"submit\">Save</Button>\n </div>\n </form>\n </Dialog>\n </Modal>\n );\n}\n\n/**\n * RichTextEditor\n *\n * A rich text editor with formatting capabilities including headings, bold, italic, lists, and links.\n * Built on top of TipTap/ProseMirror.\n */\nexport function RichTextEditor({\n initialContent = \"\",\n onChange,\n className,\n isDisabled = false,\n placeholder = \"Start typing...\",\n}: RichTextEditorProps) {\n const [isLinkDialogOpen, setIsLinkDialogOpen] = useState(false);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class:\n \"text-text-link-default hover:text-text-link-hover underline decoration-text-link-default/30 hover:decoration-text-link-hover cursor-pointer\",\n },\n }),\n ],\n content: initialContent,\n editable: !isDisabled,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML());\n },\n editorProps: {\n attributes: {\n class: twMerge(\n \"prose prose-sm max-w-none\",\n \"focus:outline-none\",\n \"[&>*:first-child]:mt-0 [&>*:last-child]:mb-0\"\n ),\n },\n },\n });\n\n const handleLinkClick = () => {\n setIsLinkDialogOpen(true);\n };\n\n const handleLinkSubmit = (url: string) => {\n if (url === \"\") {\n editor?.chain().focus().unsetLink().run();\n } else {\n editor?.chain().focus().setLink({ href: url }).run();\n }\n };\n\n if (!editor) {\n return null;\n }\n\n return (\n <div\n className={twMerge(\n \"flex flex-col rounded-md border border-border-input bg-background-input\",\n isDisabled && \"opacity-50\",\n className\n )}\n >\n {editor && (\n <>\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor }) => editor.isActive(\"link\") && !isLinkDialogOpen}\n className=\"flex items-center gap-1 rounded-md border border-border-input bg-background-surface p-1 shadow-md\"\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2\"\n onPress={() => {\n const href = editor.getAttributes(\"link\").href;\n window.open(href, \"_blank\");\n }}\n >\n <Icon name=\"ArrowSquareOut\" className=\"mr-1 h-4 w-4\" />\n Open\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\" onPress={handleLinkClick}>\n <Icon name=\"PencilSimple\" className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2\"\n onPress={() => editor.chain().focus().unsetLink().run()}\n >\n <Icon name=\"X\" className=\"mr-1 h-4 w-4\" />\n Remove\n </Button>\n </BubbleMenu>\n\n <LinkDialog\n isOpen={isLinkDialogOpen}\n onClose={() => setIsLinkDialogOpen(false)}\n onSubmit={handleLinkSubmit}\n initialUrl={editor.getAttributes(\"link\").href || \"\"}\n />\n </>\n )}\n <div className=\"flex items-center gap-1 border-b border-border-input p-2\">\n <ToolbarButton\n isActive={editor.isActive(\"heading\", { level: 1 })}\n onPress={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n >\n <span className=\"text-xs font-bold\">H1</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"heading\", { level: 2 })}\n onPress={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n >\n <span className=\"text-xs font-bold\">H2</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"bold\")}\n onPress={() => editor.chain().focus().toggleBold().run()}\n >\n <span className=\"text-xs font-bold\">B</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"italic\")}\n onPress={() => editor.chain().focus().toggleItalic().run()}\n >\n <span className=\"text-xs italic\">I</span>\n </ToolbarButton>\n <div className=\"mx-1 h-4 w-px bg-border-muted\" />\n <ToolbarButton\n isActive={editor.isActive(\"bulletList\")}\n onPress={() => editor.chain().focus().toggleBulletList().run()}\n >\n <Icon name=\"ListBullets\" className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"orderedList\")}\n onPress={() => editor.chain().focus().toggleOrderedList().run()}\n >\n <Icon name=\"ListNumbers\" className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-4 w-px bg-border-muted\" />\n <ToolbarButton isActive={editor.isActive(\"link\")} onPress={handleLinkClick}>\n <Icon name=\"PaperclipHorizontal\" className=\"h-4 w-4\" />\n </ToolbarButton>\n </div>\n <div className=\"relative min-h-[200px] w-full\">\n <EditorContent\n editor={editor}\n className={twMerge(\n \"w-full p-4\",\n \"[&_.ProseMirror]:min-h-[inherit]\",\n \"[&_.ProseMirror]:outline-none\",\n \"[&_.ProseMirror_h1]:mb-4 [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold\",\n \"[&_.ProseMirror_h2]:mb-3 [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-semibold\",\n \"[&_.ProseMirror_p]:mb-2\",\n \"[&_.ProseMirror_ul]:mb-2 [&_.ProseMirror_ul]:ml-6 [&_.ProseMirror_ul]:list-disc\",\n \"[&_.ProseMirror_ol]:mb-2 [&_.ProseMirror_ol]:ml-6 [&_.ProseMirror_ol]:list-decimal\",\n \"[&_.ProseMirror_li]:mb-1\",\n \"[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-border-muted [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic\",\n \"[&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:bg-background-muted [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5 [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\",\n \"[&_.ProseMirror_pre]:rounded-md [&_.ProseMirror_pre]:bg-background-muted [&_.ProseMirror_pre]:p-3 [&_.ProseMirror_pre]:font-mono [&_.ProseMirror_pre]:text-sm\",\n \"[&_.ProseMirror_hr]:border-border-muted\",\n isDisabled && \"pointer-events-none\"\n )}\n />\n {editor.isEmpty && !isDisabled && (\n <div className=\"pointer-events-none absolute left-4 top-4 text-text-muted\">\n {placeholder}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\n\n/**\n * Section Component — Semantic content grouping for dashboards\n *\n * A lightweight container that provides structure and hierarchy to page content.\n * Less heavy than a Card, more structured than a div. Perfect for organizing\n * related content with consistent spacing and optional headers.\n *\n * Usage:\n * ```tsx\n * <Section\n * title=\"Overview\"\n * description=\"Key metrics and performance indicators\"\n * actions={<Button variant=\"ghost\" size=\"sm\">Refresh</Button>}\n * >\n * <Grid cols={{ base: 1, lg: 3 }}>\n * <Card>...</Card>\n * </Grid>\n * </Section>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type SectionVariant = \"plain\" | \"contained\" | \"bordered\";\nexport type SectionSpacing = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface SectionProps {\n /** Section title */\n title?: React.ReactNode;\n /** Optional description/subtitle */\n description?: React.ReactNode;\n /** Actions slot (buttons, links, etc.) */\n actions?: React.ReactNode;\n /** Visual variant */\n variant?: SectionVariant;\n /** Vertical spacing around section */\n spacing?: SectionSpacing;\n /** Show divider under header */\n withDivider?: boolean;\n /** Heading level for accessibility */\n headingAs?: \"h2\" | \"h3\" | \"h4\";\n /** Additional CSS classes */\n className?: string;\n /** Section content */\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Styles\n// ——————————————————————————————————————————\n\nconst variantStyles: Record<SectionVariant, string> = {\n plain: \"\",\n contained: \"bg-background-surface rounded-lg border border-border-default p-6\",\n bordered: \"border-y border-border-default py-6\",\n};\n\nconst spacingStyles: Record<SectionSpacing, string> = {\n none: \"\",\n sm: \"my-4\",\n md: \"my-6 md:my-8\",\n lg: \"my-8 md:my-12\",\n};\n\n// ——————————————————————————————————————————\n// Component\n// ——————————————————————————————————————————\n\nexport function Section({\n title,\n description,\n actions,\n variant = \"plain\",\n spacing = \"md\",\n withDivider = false,\n headingAs = \"h2\",\n className,\n children,\n}: SectionProps) {\n // Generate unique ID for accessibility\n const headingId = React.useId();\n const hasHeader = title || description || actions;\n\n return (\n <section\n className={twMerge(spacingStyles[spacing], variantStyles[variant], className)}\n aria-labelledby={title ? headingId : undefined}\n >\n {hasHeader && (\n <header\n id={headingId}\n className={twMerge(\n \"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\",\n withDivider && \"border-b border-border-default pb-4 mb-6\",\n !withDivider && children && \"mb-4\"\n )}\n >\n <div className=\"min-w-0 flex-1\">\n {title && (\n <Heading tag={headingAs} size=\"md\" className=\"text-text-heading\">\n {typeof title === \"string\" ? title : title}\n </Heading>\n )}\n {description && <p className=\"mt-1 text-sm text-text-muted\">{description}</p>}\n </div>\n {actions && <div className=\"flex-shrink-0\">{actions}</div>}\n </header>\n )}\n\n {children && <div className={variant === \"contained\" ? \"\" : \"\"}>{children}</div>}\n </section>\n );\n}\n","\"use client\";\nimport { ToggleButton } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport type SegmentOption = {\n id: string;\n label: string;\n icon?: IconName;\n};\n\nexport interface SegmentedControlProps {\n /**\n * Array of segment options\n */\n options: SegmentOption[];\n /**\n * Currently selected value\n */\n value: string;\n /**\n * Callback when selection changes\n */\n onChange: (value: string) => void;\n /**\n * Size of the control\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Whether the control is disabled\n */\n isDisabled?: boolean;\n /**\n * Aria label for accessibility\n */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n xl: \"h-14 text-lg\",\n};\n\nconst iconSizes = {\n sm: 14,\n md: 16,\n lg: 18,\n xl: 20,\n};\n\nconst getButtonClass = ({\n isSelected,\n isFirst: _isFirst,\n isLast,\n isDisabled,\n}: {\n isSelected: boolean;\n isFirst: boolean;\n isLast: boolean;\n isDisabled?: boolean;\n}) => {\n return twMerge(\n // Base styles\n focusRing(),\n \"px-3 text-center transition cursor-pointer forced-color-adjust-none -ml-px first:ml-0 flex items-center justify-center h-full gap-2\",\n\n // Selection state\n isSelected\n ? \"bg-background-selected text-text-body font-semibold forced-colors:!bg-[Highlight] forced-colors:!text-[HighlightText]\"\n : \"text-text-muted hover:bg-background-hover pressed:bg-background-selected forced-colors:!bg-[ButtonFace] forced-colors:!text-[ButtonText] hover:font-semibold\",\n\n // Divider\n !isLast && \"border-r border-border-muted\",\n\n // Disabled state\n isDisabled &&\n \"bg-background-muted text-text-disabled forced-colors:!bg-[ButtonFace] forced-colors:!text-[GrayText] border-border-muted forced-colors:border-[GrayText] cursor-not-allowed\"\n );\n};\n\n/**\n * SegmentedControl\n *\n * A segmented control component for selecting between multiple options.\n * Similar to a radio group but with a more compact, button-like appearance.\n */\nexport function SegmentedControl({\n options,\n value,\n onChange,\n size = \"md\",\n className,\n isDisabled,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps) {\n return (\n <div\n className={twMerge(\n \"inline-flex overflow-hidden rounded-md border-2 border-border-muted\",\n sizeStyles[size],\n className\n )}\n role=\"group\"\n aria-label={ariaLabel}\n >\n {options.map((option, index) => (\n <ToggleButton\n key={option.id}\n isSelected={value === option.id}\n onChange={() => onChange(option.id)}\n className={getButtonClass({\n isSelected: value === option.id,\n isFirst: index === 0,\n isLast: index === options.length - 1,\n isDisabled,\n })}\n isDisabled={isDisabled}\n aria-label={option.label}\n >\n {option.icon && <Icon name={option.icon} size={iconSizes[size]} />}\n {option.label}\n </ToggleButton>\n ))}\n </div>\n );\n}\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport {\n Select as AriaSelect,\n SelectProps as AriaSelectProps,\n Key,\n ListBox,\n SelectValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { controlStyles, Size } from \"../../utils/controlStyles\";\nimport { Button } from \"../Button\";\nimport { Description, FieldError, getInputBaseStyles, InputWrapper, Label } from \"../Field\";\nimport { Icon } from \"../Icon\";\nimport { DropdownSection, DropdownSectionProps } from \"../ListBox\";\nimport { ListBoxItem } from \"../ListBoxItem\";\nimport { Popover } from \"../Popover\";\n\n// Replace tv() with a regular function\ntype SelectVariants = {\n isDisabled?: boolean;\n size?: Size;\n isOpen?: boolean;\n isInvalid?: boolean;\n};\n\nfunction getSelectValueClassName(size: Size = \"md\") {\n // Use controlStyles for consistent text sizing\n return `flex-1 text-start data-[placeholder]:text-text-placeholder ${controlStyles[size].text}`;\n}\n\nexport type SelectVariantType = SelectVariants;\n\n// Define a custom hook for focus handling that works with any element\nfunction useElementFocus() {\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<Element>, onFocus?: (e: React.FocusEvent<Element>) => void) => {\n onFocus?.(e);\n },\n []\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<Element>, onBlur?: (e: React.FocusEvent<Element>) => void) => {\n onBlur?.(e);\n },\n []\n );\n\n return { handleFocus, handleBlur };\n}\n\n/**\n * Interface defining the shape of items in the Select component\n */\nexport interface SelectItem<T = unknown> {\n /** Unique identifier for the item */\n id: string;\n /** Display label for the item */\n label: string;\n /** Value associated with the item */\n value: T;\n}\n\n/**\n * Props for the Select component\n * @template T - The type of the items, must extend SelectItem\n */\nexport interface SelectProps<T extends SelectItem>\n extends Omit<AriaSelectProps<T>, \"children\" | \"onSelectionChange\"> {\n /** Label text displayed above the select */\n label?: string;\n /** Helper text displayed below the select */\n description?: string;\n /** Error message or function to generate error message */\n errorMessage?: string | ((validation: ValidationResult) => React.ReactNode);\n /** Collection of items to display in the select */\n items?: Iterable<T>;\n /** Size variant of the select */\n size?: Size;\n /** Render function for items or static children */\n children?: React.ReactNode | ((item: T) => React.ReactNode);\n /** Custom render function for individual items. When provided, items prop is used to render items automatically */\n renderItem?: (item: T) => React.ReactNode;\n /** Currently selected item's id. Uses the SelectItem's `id` field for stable selection tracking */\n selectedKey?: Key;\n /** Default selected item's id for uncontrolled usage */\n defaultSelectedKey?: Key;\n /** Callback when selection changes, provides the selected item's id */\n onSelectionChange?: (key: Key) => void;\n /** Whether to show error states */\n showErrors?: boolean;\n /** Tooltip text */\n tooltip?: string;\n /** Whether the field is required */\n isRequired?: boolean;\n /** Validation result object */\n validationResult?: ValidationResult;\n /** Whether to use transparent background */\n transparent?: boolean;\n}\n\nexport function Select<T extends SelectItem>({\n label,\n description,\n errorMessage,\n children,\n items,\n renderItem,\n size = \"md\",\n selectedKey: controlledSelectedKey,\n defaultSelectedKey,\n onSelectionChange,\n placeholder,\n showErrors = false,\n tooltip,\n isRequired,\n transparent,\n ...props\n}: SelectProps<T>) {\n const [internalSelectedKey, setInternalSelectedKey] = useState<Key | null>(null);\n const [triggerWidth, setTriggerWidth] = useState<number | null>(null);\n const selectedKey = controlledSelectedKey ?? internalSelectedKey ?? defaultSelectedKey;\n const { handleFocus, handleBlur } = useElementFocus();\n\n const handleSelectionChange = (key: Key | null) => {\n if (onSelectionChange && key !== null) {\n onSelectionChange(key);\n }\n if (!onSelectionChange) {\n setInternalSelectedKey(key); // Update internal state if uncontrolled\n }\n };\n\n const selectRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n return (\n <AriaSelect\n {...props}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={handleSelectionChange}\n placeholder={placeholder}\n className={composeTailwindRenderProps(props.className, \"group flex w-full flex-col\")}\n ref={selectRef}\n onOpenChange={(isOpen) => {\n if (isOpen && triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth);\n } else if (!isOpen) {\n selectRef.current?.blur();\n }\n }}\n >\n {({\n isDisabled,\n isInvalid,\n isOpen,\n }: {\n isDisabled: boolean;\n isInvalid: boolean;\n isOpen: boolean;\n }) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <InputWrapper>\n <div ref={triggerRef}>\n <Button\n variant=\"unstyled\"\n className={twMerge(\n getInputBaseStyles({\n isInvalid: isInvalid || (showErrors && !!errorMessage),\n isDisabled,\n isFocused: isOpen,\n transparent,\n size,\n }),\n // Keep left padding consistent across sizes\n \"flex items-center text-start gap-4 cursor-pointer pl-[var(--control-padding-sm)]\"\n )}\n onFocus={(e) => handleFocus(e, props.onFocus)}\n onBlur={(e) => handleBlur(e, props.onBlur)}\n data-open={isOpen}\n >\n <SelectValue className={getSelectValueClassName(size)} />\n <Icon\n name=\"CaretDown\"\n aria-hidden\n className={twMerge(\n \"h-4 w-4 text-text-body group-disabled:text-gray-200 forced-colors:text-[ButtonText] transition-transform\",\n isOpen && \"rotate-180\"\n )}\n />\n </Button>\n </div>\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {showErrors && (\n <FieldError size={size} className=\"mt-3 text-feedback-error-text\">\n {typeof errorMessage === \"function\" && props.validationResult\n ? errorMessage(props.validationResult)\n : typeof errorMessage === \"string\"\n ? errorMessage\n : null}\n </FieldError>\n )}\n <Popover\n className=\"bg-background-input shadow-xl border border-border-input/20 backdrop-blur-sm\"\n style={{ minWidth: triggerWidth ? `${triggerWidth}px` : undefined }}\n >\n <ListBox\n items={items}\n className=\"w-full max-h-[300px] overflow-auto bg-background-input p-0 outline-0\"\n >\n {renderItem && items\n ? (item: T) => (\n <ListBoxItem key={item.id} id={item.id} textValue={item.label} size={size}>\n {renderItem(item)}\n </ListBoxItem>\n )\n : children}\n </ListBox>\n </Popover>\n </div>\n )}\n </AriaSelect>\n );\n}\n\nexport function SelectSection<T extends object>(props: DropdownSectionProps<T>) {\n return <DropdownSection {...props} />;\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { Description, FieldError, Label } from \"../Field\";\n\nexport interface SliderProps {\n label?: string;\n description?: string;\n tooltip?: string;\n errorMessage?: string;\n size?: Size;\n className?: string;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n /** Show the current numeric value to the right of the track */\n showValue?: boolean;\n}\n\nexport function Slider({\n label,\n description,\n tooltip,\n errorMessage,\n size = \"md\",\n className,\n value,\n defaultValue = 0,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue = true,\n}: SliderProps) {\n const isControlled = typeof value === \"number\";\n const [internalValue, setInternalValue] = React.useState<number>(defaultValue);\n const currentValue = isControlled ? (value as number) : internalValue;\n\n const clamped = Math.min(Math.max(currentValue, min), max);\n const range = Math.max(max - min, 0.00001);\n const percent = ((clamped - min) / range) * 100;\n\n return (\n <div\n className={\n composeTailwindRenderProps(className, \"group flex w-full flex-col gap-1\") as string\n }\n >\n {label && (\n <Label size={size} tooltip={tooltip} className=\"mb-1\">\n {label}\n </Label>\n )}\n\n <div className=\"flex items-center gap-3\">\n <div className=\"relative w-full select-none\">\n {/* Rail */}\n <div className=\"h-1.5 w-full rounded-full bg-background-muted\" />\n {/* Track fill */}\n <div\n className=\"pointer-events-none absolute left-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-action-primary\"\n style={{ width: `${percent}%` }}\n aria-hidden\n />\n {/* Range input overlay for interaction */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n disabled={disabled}\n aria-invalid={!!errorMessage}\n onChange={(e) => {\n const next = Number(e.currentTarget.value);\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalValue(next);\n onChange?.(next);\n }\n }}\n className={twMerge(\n \"absolute inset-0 w-full cursor-pointer appearance-none bg-transparent outline-none\",\n // WebKit thumb styles\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-background-input [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-border-input\",\n \"hover:[&::-webkit-slider-thumb]:shadow-sm focus-visible:[&::-webkit-slider-thumb]:outline-2 focus-visible:[&::-webkit-slider-thumb]:outline-border-focus\",\n // Firefox\n \"[&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-background-input [&::-moz-range-thumb]:border [&::-moz-range-thumb]:border-border-input\",\n \"hover:[&::-moz-range-thumb]:shadow-sm focus-visible:[&::-moz-range-thumb]:outline-2 focus-visible:[&::-moz-range-thumb]:outline-border-focus\",\n disabled ? \"cursor-not-allowed opacity-60\" : undefined\n )}\n />\n </div>\n {showValue && (\n <div className=\"min-w-10 text-right text-sm text-text-heading tabular-nums\">\n {Math.round(clamped)}\n </div>\n )}\n </div>\n\n {description && <Description className=\"mt-2 text-text-muted\">{description}</Description>}\n {errorMessage && <FieldError className=\"mt-1\">{errorMessage}</FieldError>}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * SplitPane Component — Resizable two-panel layout\n *\n * A layout primitive for side-by-side content with a draggable divider.\n * Perfect for list/detail views, dashboards with inspectors, or any\n * main/aside layout that benefits from user-controlled sizing.\n *\n * Usage:\n * ```tsx\n * <SplitPane defaultSize={0.7} minSize={280} maxSize={480}>\n * <SplitPane.Main>\n * <DataTable />\n * </SplitPane.Main>\n * <SplitPane.Aside>\n * <Inspector />\n * </SplitPane.Aside>\n * </SplitPane>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type SplitPaneOrientation = \"horizontal\" | \"vertical\";\n\nexport interface SplitPaneProps {\n /** Initial size of the main panel (0-1 for ratio, or px value) */\n defaultSize?: number;\n /** Minimum size of aside panel in pixels */\n minSize?: number;\n /** Maximum size of aside panel in pixels */\n maxSize?: number;\n /** Orientation of the split */\n orientation?: SplitPaneOrientation;\n /** Whether the divider is draggable */\n resizable?: boolean;\n /** Callback when resize occurs */\n onResize?: (size: number) => void;\n /** Additional CSS classes */\n className?: string;\n /** Child panels */\n children?: React.ReactNode;\n}\n\nexport interface SplitPanePanelProps {\n className?: string;\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Context for sharing state\n// ——————————————————————————————————————————\n\ninterface SplitPaneContextValue {\n orientation: SplitPaneOrientation;\n isResizing: boolean;\n}\n\nconst SplitPaneContext = React.createContext<SplitPaneContextValue>({\n orientation: \"horizontal\",\n isResizing: false,\n});\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function SplitPane({\n defaultSize = 0.7,\n minSize = 240,\n maxSize = 600,\n orientation = \"horizontal\",\n resizable = true,\n onResize,\n className,\n children,\n}: SplitPaneProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n // Ensure defaultSize is treated as a ratio between 0 and 1\n const [splitPosition, setSplitPosition] = useState(defaultSize > 1 ? 0.7 : defaultSize);\n\n // Handle resize\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!containerRef.current) return;\n if (!isResizing) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const totalSize = orientation === \"horizontal\" ? rect.width : rect.height;\n const startPos = orientation === \"horizontal\" ? rect.left : rect.top;\n const currentPos = orientation === \"horizontal\" ? e.clientX : e.clientY;\n\n const mainSize = currentPos - startPos;\n const asideSize = totalSize - mainSize;\n\n // Apply min/max constraints to aside panel\n if (asideSize < minSize || asideSize > maxSize) return;\n\n const newRatio = mainSize / totalSize;\n setSplitPosition(newRatio);\n onResize?.(newRatio);\n },\n [isResizing, orientation, minSize, maxSize, onResize]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n }, []);\n\n // Set up and tear down event listeners\n useEffect(() => {\n if (isResizing) {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = orientation === \"horizontal\" ? \"col-resize\" : \"row-resize\";\n document.body.style.userSelect = \"none\";\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n }\n }, [isResizing, handleMouseMove, handleMouseUp, orientation]);\n\n // Extract Main and Aside from children\n const mainPanel = React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === Main\n );\n const asidePanel = React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === Aside\n );\n\n const splitPercentage = `${splitPosition * 100}%`;\n\n return (\n <SplitPaneContext.Provider value={{ orientation, isResizing }}>\n <div\n ref={containerRef}\n className={twMerge(\n \"flex w-full h-full\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className\n )}\n >\n {/* Main Panel */}\n <div\n className={twMerge(\"overflow-auto\", orientation === \"horizontal\" ? \"h-full\" : \"w-full\")}\n style={{\n [orientation === \"horizontal\" ? \"width\" : \"height\"]: splitPercentage,\n }}\n >\n {mainPanel}\n </div>\n\n {/* Divider */}\n {resizable && (\n <div\n className={twMerge(\n \"relative group\",\n orientation === \"horizontal\"\n ? \"w-2 -mx-1 cursor-col-resize\"\n : \"h-2 -my-1 cursor-row-resize\"\n )}\n onMouseDown={handleMouseDown}\n role=\"separator\"\n aria-orientation={orientation}\n aria-label=\"Resize divider\"\n tabIndex={0}\n onKeyDown={(e) => {\n // Keyboard resize support\n const step = 0.01; // 1% step\n if (orientation === \"horizontal\") {\n if (e.key === \"ArrowLeft\" && splitPosition > 0.3) {\n const newPos = Math.max(0.3, splitPosition - step);\n setSplitPosition(newPos);\n onResize?.(newPos);\n } else if (e.key === \"ArrowRight\" && splitPosition < 0.8) {\n const newPos = Math.min(0.8, splitPosition + step);\n setSplitPosition(newPos);\n onResize?.(newPos);\n }\n }\n }}\n >\n {/* Visual divider line */}\n <div\n className={twMerge(\n \"absolute bg-border-default transition-all\",\n orientation === \"horizontal\"\n ? \"left-1/2 -translate-x-1/2 w-px h-full group-hover:w-1\"\n : \"top-1/2 -translate-y-1/2 h-px w-full group-hover:h-1\",\n \"group-hover:bg-action-primary/50\",\n isResizing && \"bg-action-primary\",\n isResizing && (orientation === \"horizontal\" ? \"w-1\" : \"h-1\")\n )}\n />\n {/* Grab handle indicator */}\n <div\n className={twMerge(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-1 h-8\"\n : \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-8 h-1\",\n \"bg-border-muted rounded-full opacity-0 group-hover:opacity-100 transition-opacity\"\n )}\n />\n </div>\n )}\n\n {/* Aside Panel */}\n <div\n className={twMerge(\n \"overflow-auto flex-1\",\n orientation === \"horizontal\" ? \"h-full\" : \"w-full\"\n )}\n >\n {asidePanel}\n </div>\n </div>\n </SplitPaneContext.Provider>\n );\n}\n\n// ——————————————————————————————————————————\n// Panel Components\n// ——————————————————————————————————————————\n\nexport function Main({ className, children }: SplitPanePanelProps) {\n return <div className={twMerge(\"w-full h-full\", className)}>{children}</div>;\n}\n\nexport function Aside({ className, children }: SplitPanePanelProps) {\n return <div className={twMerge(\"w-full h-full\", className)}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nSplitPane.Main = Main;\nSplitPane.Aside = Aside;\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ComponentFormatter, formatComponentValue } from \"../../utils/formatting\";\nimport type { FieldValue } from \"../../utils/formatting/types\";\nimport { CopyToClipboard } from \"../CopyToClipboard\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n/**\n * StatList — Compact key-value statistics display\n *\n * Displays formatted statistics with status indicators and optional copy functionality.\n * Uses the unified formatting system for consistent data presentation.\n */\n\n// Types\n\nexport type StatTone = \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type StatAlign = \"start\" | \"end\";\nexport type StatLayout = \"one-column\" | \"two-column\";\n\nexport type StatValue = FieldValue;\n\nexport type StatFormatter = ComponentFormatter;\n\nexport interface StatThreshold {\n when: (value: StatValue) => boolean;\n tone: StatTone;\n}\n\nexport interface StatItem {\n /** Unique identifier */\n id: string;\n /** Label for the statistic */\n label: React.ReactNode;\n /** Value to display */\n value: StatValue;\n /** Custom formatter for the value */\n formatter?: StatFormatter;\n /** Additional metadata below value */\n meta?: React.ReactNode;\n /** Explicit tone/status color */\n tone?: StatTone;\n /** Data-driven tone based on value */\n thresholds?: StatThreshold[];\n /** Enable copy to clipboard */\n copyable?: boolean | ((value: StatValue) => string);\n /** Optional link URL */\n href?: string;\n /** Click handler */\n onAction?: () => void;\n /** Icon before label */\n iconLeft?: React.ReactNode;\n /** Icon after value */\n iconRight?: React.ReactNode;\n /** Tooltip for additional info */\n tooltip?: React.ReactNode;\n /** Disabled state */\n disabled?: boolean;\n}\n\nexport interface StatListProps {\n /** Statistics to display */\n items: StatItem[];\n /** Layout mode */\n layout?: StatLayout;\n /** Compact spacing */\n dense?: boolean;\n /** Value alignment */\n valueAlign?: StatAlign;\n /** Show dividers between items */\n showDividers?: boolean;\n /** Loading state */\n skeleton?: boolean;\n /** Empty state */\n empty?: boolean;\n /** Error state */\n error?: string | React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n// Helpers\n\n// Use the centralized formatting utility\nfunction formatValue(value: StatValue, formatter?: StatFormatter): React.ReactNode {\n return formatComponentValue({\n value,\n formatter,\n emptyClassName: \"text-text-muted\",\n emptyText: \"—\",\n });\n}\n\nfunction getTone(item: StatItem): StatTone | undefined {\n // Check thresholds first\n if (item.thresholds && item.value !== null && item.value !== undefined) {\n for (const threshold of item.thresholds) {\n if (threshold.when(item.value)) {\n return threshold.tone;\n }\n }\n }\n\n // Fall back to explicit tone\n return item.tone;\n}\n\nconst toneColors: Record<StatTone, string> = {\n neutral: \"text-text-body\",\n success: \"text-feedback-success\",\n warning: \"text-feedback-warning\",\n error: \"text-feedback-error\",\n info: \"text-feedback-info\",\n};\n\n// StatRow Component\n\nfunction StatRow({\n item,\n dense,\n valueAlign,\n}: {\n item: StatItem;\n dense?: boolean;\n valueAlign?: StatAlign;\n}) {\n const tone = getTone(item);\n const toneClass = tone ? toneColors[tone] : \"\";\n\n const formattedValue = formatValue(item.value, item.formatter);\n const textToCopy =\n typeof item.copyable === \"function\" ? item.copyable(item.value) : String(item.value);\n\n const valueDisplay = (\n <span className={item.href ? \"hover:underline cursor-pointer\" : \"\"}>{formattedValue}</span>\n );\n\n const valueContent = (\n <dd\n className={twMerge(\n dense ? \"text-sm\" : \"text-base\",\n \"font-medium\",\n valueAlign === \"start\" ? \"text-left\" : \"text-right\",\n toneClass,\n item.disabled && \"opacity-50\"\n )}\n >\n {item.copyable ? (\n <CopyToClipboard value={textToCopy} size=\"sm\" className=\"flex items-center gap-1\">\n {valueDisplay}\n {item.iconRight}\n </CopyToClipboard>\n ) : (\n <div className=\"flex items-center gap-1\">\n {valueDisplay}\n {item.iconRight}\n </div>\n )}\n\n {item.meta && (\n <div\n className={twMerge(\n \"text-xs text-text-muted mt-0.5\",\n valueAlign === \"start\" ? \"text-left\" : \"text-right\"\n )}\n >\n {item.meta}\n </div>\n )}\n </dd>\n );\n\n const content = (\n <>\n <dt\n className={twMerge(\n dense ? \"text-xs\" : \"text-sm\",\n \"text-text-caption truncate\",\n \"flex items-center gap-1\",\n item.disabled && \"opacity-50\"\n )}\n >\n {item.iconLeft}\n <span title={typeof item.label === \"string\" ? item.label : undefined}>{item.label}</span>\n {item.tooltip && (\n <Icon\n name=\"Question\"\n size={10}\n className=\"text-text-muted\"\n aria-label=\"More information\"\n />\n )}\n </dt>\n\n {item.href ? (\n <a href={item.href} onClick={item.onAction} className=\"block\">\n {valueContent}\n </a>\n ) : (\n valueContent\n )}\n </>\n );\n\n return (\n <div\n className={twMerge(\"grid grid-cols-[1fr_auto] items-start\", dense ? \"gap-x-2\" : \"gap-x-4\")}\n >\n {content}\n </div>\n );\n}\n\n// Main Component\n\nexport function StatList({\n items,\n layout = \"one-column\",\n dense = false,\n valueAlign = \"end\",\n showDividers = false,\n skeleton = false,\n empty = false,\n error,\n className,\n}: StatListProps) {\n // Loading state\n if (skeleton) {\n return (\n <div\n className={twMerge(\n \"grid\",\n layout === \"two-column\" ? \"md:grid-cols-2 gap-x-6\" : \"grid-cols-1\",\n dense ? \"gap-y-1\" : \"gap-y-2\",\n className\n )}\n >\n {Array.from({ length: items.length || 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-x-4\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-5 w-16\" />\n </div>\n ))}\n </div>\n );\n }\n\n // Error or empty states\n if (error) {\n return <div className={twMerge(\"text-sm text-feedback-error\", className)}>{error}</div>;\n }\n\n if (empty || !items.length) {\n return <div className={twMerge(\"text-sm text-text-muted\", className)}>No data available</div>;\n }\n\n return (\n <dl\n className={twMerge(\n \"grid\",\n layout === \"two-column\" ? \"md:grid-cols-2 gap-x-6\" : \"grid-cols-1\",\n dense ? \"gap-y-1\" : \"gap-y-2\",\n className\n )}\n >\n {items.map((item, index) => (\n <React.Fragment key={item.id}>\n {showDividers && index > 0 && layout === \"one-column\" && (\n <div className=\"col-span-full border-t border-border-default -mt-1 mb-1\" />\n )}\n <StatRow item={item} dense={dense} valueAlign={valueAlign} />\n </React.Fragment>\n ))}\n </dl>\n );\n}\n","import React from \"react\";\nimport { Switch as AriaSwitch, SwitchProps as AriaSwitchProps } from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\n\nexport interface SwitchProps extends Omit<AriaSwitchProps, \"children\"> {\n children: React.ReactNode;\n}\n\nfunction getTrackClassName({\n isSelected,\n isDisabled,\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n}) {\n const baseClasses =\n \"flex h-4 w-7 px-px items-center shrink-0 cursor-default rounded-full transition duration-200 ease-in-out shadow-inner border border-transparent\";\n const focusRingClasses = focusRing;\n\n const selectedClasses = isSelected\n ? \"bg-gray-700 dark:bg-zinc-300 forced-colors:!bg-[Highlight] group-pressed:bg-gray-800 dark:group-pressed:bg-zinc-200\"\n : \"bg-gray-400 dark:bg-zinc-400 group-pressed:bg-gray-500 dark:group-pressed:bg-zinc-300\";\n\n const disabledClasses = isDisabled\n ? \"bg-gray-200 dark:bg-zinc-700 forced-colors:group-selected:!bg-[GrayText] forced-colors:border-[GrayText]\"\n : \"\";\n\n return [baseClasses, focusRingClasses, selectedClasses, disabledClasses]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction getHandleClassName({\n isSelected,\n isDisabled,\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n}) {\n const baseClasses =\n \"h-3 w-3 transform rounded-full bg-white dark:bg-zinc-900 outline-none shadow transition duration-200 ease-in-out\";\n\n const selectedClasses = isSelected ? \"translate-x-[100%]\" : \"translate-x-0\";\n\n const disabledClasses = isDisabled ? \"forced-colors:outline-[GrayText]\" : \"\";\n\n return [baseClasses, selectedClasses, disabledClasses].filter(Boolean).join(\" \");\n}\n\nexport function Switch({ children, ...props }: SwitchProps) {\n return (\n <AriaSwitch\n {...props}\n className={composeTailwindRenderProps(\n props.className,\n \"group flex items-center gap-2 text-sm text-gray-800 transition disabled:text-gray-300 dark:text-zinc-200 dark:disabled:text-zinc-600 forced-colors:disabled:text-[GrayText]\"\n )}\n >\n {(renderProps) => (\n <>\n <div className={getTrackClassName(renderProps)}>\n <span className={getHandleClassName(renderProps)} />\n </div>\n {children}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import React from \"react\";\nimport type { ValidationResult } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBaseStyles,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nconst getTextAreaStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n // Get base input styles\n const baseStyles = getInputBaseStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n transparent: props.transparent,\n size: props.size,\n });\n\n // Add TextArea-specific styles\n const textAreaStyles = `min-h-[100px] py-2 ${props.isDisabled ? \"resize-none\" : \"resize-y\"}`;\n\n return twMerge(baseStyles, textAreaStyles, props.className);\n};\n\n/**\n * TextArea\n *\n * Multi-line text input with Edges styling, label, description, and error.\n */\nexport interface TextAreaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\" | \"disabled\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n size?: Size;\n isInvalid?: boolean;\n isDisabled?: boolean;\n validationResult?: ValidationResult;\n}\n\nexport function TextArea({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n required,\n transparent,\n isInvalid,\n isDisabled,\n className,\n validationResult,\n ...props\n}: TextAreaProps) {\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n\n return (\n <div className=\"group flex flex-col\">\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={required}>\n {label}\n </Label>\n )}\n <InputWrapper>\n <textarea\n {...props}\n required={required}\n onFocus={(e) => {\n // Properly handle the textarea focus event\n if (props.onFocus) {\n props.onFocus(e);\n }\n handleFocus(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n onBlur={(e) => {\n // Properly handle the textarea blur event\n if (props.onBlur) {\n props.onBlur(e);\n }\n handleBlur(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n className={getTextAreaStyles({\n isInvalid,\n isDisabled,\n isFocused,\n size,\n transparent,\n className,\n })}\n disabled={isDisabled}\n />\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport type { ValidationResult } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { Chip } from \"../Chip\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBaseStyles,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nexport interface ChipData {\n id: string;\n label: string;\n value: unknown;\n}\n\nexport interface TriggerInfo {\n query: string;\n position: number;\n startIndex: number;\n}\n\nexport interface TextAreaWithChipsProps\n extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"size\" | \"value\" | \"onChange\" | \"disabled\"\n >,\n BaseInputProps {\n // Standard TextArea props (consistent with TextArea.tsx)\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n size?: Size;\n isInvalid?: boolean;\n isDisabled?: boolean;\n validationResult?: ValidationResult;\n\n // Text content - using standard 'value' and 'onChange' names for consistency\n value?: string;\n onChange?: (value: string) => void;\n\n // Chip functionality\n chips?: ChipData[];\n onChipsChange?: (chips: ChipData[]) => void;\n\n // Trigger detection\n triggerPattern?: string | RegExp;\n onTriggerDetected?: (triggerInfo: TriggerInfo) => void;\n onTriggerDismissed?: () => void;\n\n // Chip rendering customization\n renderChip?: (chip: ChipData, onRemove: () => void) => React.ReactNode;\n chipVariant?: \"default\" | \"primary\" | \"secondary\";\n chipSize?: Size;\n}\n\nexport function TextAreaWithChips({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n required,\n transparent,\n isInvalid,\n isDisabled,\n className,\n validationResult,\n\n // Text props (consistent naming with standard TextArea)\n value = \"\",\n onChange,\n\n // Chip props\n chips = [],\n onChipsChange,\n triggerPattern = \"{{\",\n onTriggerDetected,\n onTriggerDismissed,\n renderChip,\n chipVariant = \"primary\",\n chipSize,\n\n ...props\n}: TextAreaWithChipsProps) {\n const textareaRef = useRef<HTMLDivElement>(null);\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n // Use smaller chip sizes that match text line height better\n const actualChipSize = chipSize || \"sm\";\n\n // Track desired caret offset across re-renders to preserve cursor position\n const selectionOffsetRef = useRef<number | null>(null);\n\n // Helper: convert DOM content back to text with chip placeholders\n const getDOMTextWithPlaceholders = useCallback((container: HTMLDivElement): string => {\n let result = \"\";\n\n const processNode = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n // Only include text nodes that are not inside chip elements\n const parentElement = node.parentElement;\n if (!parentElement?.closest(\"[data-chip-id]\")) {\n const textContent = node.textContent || \"\";\n result += textContent;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (element.hasAttribute(\"data-chip-id\")) {\n // Replace chip with placeholder\n const chipId = element.getAttribute(\"data-chip-id\");\n result += `{{${chipId}}}`;\n // Don't process children of chip elements\n return;\n } else if (element.tagName === \"BR\") {\n result += \"\\n\";\n return;\n } else if (element.tagName === \"DIV\") {\n // Handle div elements that might be created by contentEditable\n // Process children but don't add extra content\n }\n }\n\n // Process child nodes\n for (let i = 0; i < node.childNodes.length; i++) {\n processNode(node.childNodes[i]);\n }\n };\n\n processNode(container);\n\n // Clean up any extra whitespace that might have been introduced\n // but preserve intentional spaces and line breaks\n return result;\n }, []);\n\n // Helper: set caret at given text offset within the contentEditable container\n const setCaretAtOffset = useCallback((container: HTMLDivElement, targetOffset: number) => {\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) => {\n // Skip text within chip elements (contentEditable=false)\n const parentElement = node.parentElement;\n if (parentElement && parentElement.closest(\"[data-chip-id]\")) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let currentNode: Node | null = walker.nextNode();\n let remaining = Math.max(0, targetOffset);\n\n while (currentNode) {\n const text = currentNode.nodeValue || \"\";\n if (text.length >= remaining) {\n const range = document.createRange();\n range.setStart(currentNode, remaining);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n return;\n }\n remaining -= text.length;\n currentNode = walker.nextNode();\n }\n\n // Fallback: place at end\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(container);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }, []);\n\n // Handle empty state properly to avoid DOM conflicts\n useEffect(() => {\n if (textareaRef.current && !value) {\n // Only clear if there's actual content to avoid DOM manipulation conflicts\n if (textareaRef.current.textContent !== \"\") {\n textareaRef.current.textContent = \"\";\n }\n }\n }, [value]);\n\n // After value changes, restore caret to the last known offset\n useLayoutEffect(() => {\n if (!textareaRef.current) return;\n if (value === \"\") {\n // If empty and focused, ensure focus and caret at start so user can type immediately\n if (isFocused) {\n try {\n textareaRef.current.focus({ preventScroll: true } as unknown as FocusOptions);\n setCaretAtOffset(textareaRef.current, 0);\n } catch (_) {\n // ignore\n }\n }\n return;\n }\n if (selectionOffsetRef.current == null) return;\n try {\n setCaretAtOffset(textareaRef.current, selectionOffsetRef.current);\n } finally {\n selectionOffsetRef.current = null;\n }\n }, [value, setCaretAtOffset, isFocused]);\n\n // Handle text changes and trigger detection for contentEditable\n const handleTextChange = useCallback(\n (newValue: string, cursorPosition?: number) => {\n onChange?.(newValue);\n\n // If text is empty, dismiss any active triggers\n if (newValue === \"\") {\n onTriggerDismissed?.();\n return;\n }\n\n // Check for trigger pattern\n if (triggerPattern && onTriggerDetected && cursorPosition !== undefined) {\n const textBeforeCursor = newValue.slice(0, cursorPosition);\n\n const triggerRegex =\n typeof triggerPattern === \"string\"\n ? new RegExp(`\\\\${triggerPattern}([^\\\\s]*)$`)\n : triggerPattern;\n\n const match = textBeforeCursor.match(triggerRegex);\n\n if (match) {\n const query = match[1] || \"\";\n const startIndex = cursorPosition - match[0].length;\n\n onTriggerDetected({\n query,\n position: cursorPosition,\n startIndex,\n });\n } else {\n onTriggerDismissed?.();\n }\n }\n },\n [onChange, triggerPattern, onTriggerDetected, onTriggerDismissed]\n );\n\n // Handle chip removal\n const handleChipRemove = useCallback(\n (chipId: string) => {\n if (!onChipsChange || !onChange) return;\n\n const updatedChips = chips.filter((chip) => chip.id !== chipId);\n onChipsChange(updatedChips);\n\n // Also remove from text content\n const updatedText = value.replace(new RegExp(`\\\\{\\\\{${chipId}\\\\}\\\\}`, \"g\"), \"\");\n onChange(updatedText);\n },\n [chips, onChipsChange, value, onChange]\n );\n\n // Render chip or use default rendering\n const renderChipElement = useCallback(\n (chip: ChipData) => {\n if (renderChip) {\n return renderChip(chip, () => handleChipRemove(chip.id));\n }\n\n return (\n <Chip\n key={chip.id}\n variant={chipVariant}\n size={actualChipSize}\n onRemove={isDisabled ? undefined : () => handleChipRemove(chip.id)}\n isDisabled={isDisabled}\n className=\"py-0.5 px-1.5 gap-1 text-xs leading-none rounded-md\"\n >\n {chip.label}\n </Chip>\n );\n },\n [renderChip, chipVariant, actualChipSize, handleChipRemove, isDisabled]\n );\n\n // Get textarea styles - using same approach as TextField\n const getTextAreaStyles = () => {\n // Get base input styles (same as TextField)\n const baseStyles = getInputBaseStyles({\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n size,\n });\n\n // Add TextArea-specific styles\n const textAreaStyles = `min-h-[100px] py-2 px-3 ${isDisabled ? \"resize-none\" : \"resize-y\"}`;\n\n // ContentEditable and chip-specific styles\n const contentEditableStyles = twMerge(\n \"focus:outline-none overflow-auto\",\n\n // Chip selection styles\n \"[&_[data-chip-id]::selection]:bg-action-primary/20\",\n\n // Placeholder styles for contentEditable - only show when completely empty\n \"[&:empty]:before:content-[attr(data-placeholder)] [&:empty]:before:text-text-placeholder [&:empty]:before:pointer-events-none\"\n );\n\n return twMerge(baseStyles, textAreaStyles, contentEditableStyles, className);\n };\n\n // Render content with inline chips\n const renderContent = () => {\n // If no text value, return nothing (let CSS placeholder handle it)\n if (!value) {\n return null;\n }\n\n const parts = value.split(/(\\{\\{[^}]+\\}\\})/g);\n\n return parts.map((part, index) => {\n // Check if this part is a chip placeholder\n const chipMatch = part.match(/\\{\\{([^}]+)\\}\\}/);\n if (chipMatch) {\n const chipId = chipMatch[1];\n const chip = chips.find((c) => c.id === chipId);\n if (chip) {\n return (\n <span\n key={`chip-${chipId}-${index}`}\n className=\"inline-block align-baseline cursor-pointer\"\n contentEditable={false}\n suppressContentEditableWarning\n data-chip-id={chipId}\n style={{\n userSelect: \"none\",\n verticalAlign: \"baseline\",\n lineHeight: \"1\",\n }}\n onClick={(e) => {\n e.preventDefault();\n // Select the chip element\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNode(e.currentTarget);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }}\n >\n {renderChipElement(chip)}\n </span>\n );\n }\n }\n\n // Regular text - preserve line breaks\n if (part.includes(\"\\n\")) {\n return part.split(\"\\n\").map((line, lineIndex) => (\n <React.Fragment key={`line-${index}-${lineIndex}`}>\n {line}\n {lineIndex < part.split(\"\\n\").length - 1 && <br />}\n </React.Fragment>\n ));\n }\n\n return part;\n });\n };\n\n return (\n <div className=\"group flex flex-col\">\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={required}>\n {label}\n </Label>\n )}\n\n <InputWrapper>\n <div\n // Force a safe remount when the content becomes fully empty to avoid\n // React diffing contentEditable internals during browser normalization\n key={value === \"\" ? \"empty\" : \"content\"}\n ref={textareaRef}\n contentEditable={!isDisabled}\n suppressContentEditableWarning\n onInput={(e) => {\n if (isDisabled) return;\n const target = e.target as HTMLDivElement;\n\n // Check if there are any chip elements in the DOM\n const hasChips = target.querySelector(\"[data-chip-id]\") !== null;\n\n let newValue: string;\n\n if (hasChips) {\n // Only use complex DOM parsing when chips are present\n newValue = getDOMTextWithPlaceholders(target);\n // Normalize runaway spaces that can accumulate adjacent to chips\n newValue = newValue\n // collapse 2+ spaces AFTER a chip to a single space\n .replace(/(\\{\\{[^}]+\\}\\})\\s{2,}/g, \"$1 \")\n // collapse 2+ spaces BEFORE a chip to a single space\n .replace(/\\s{2,}(\\{\\{[^}]+\\}\\})/g, \" $1\");\n } else {\n // Use simple textContent for plain text to avoid issues\n newValue = target.textContent || \"\";\n }\n\n // If cleared, short-circuit to avoid selection/range work during DOM teardown\n if (newValue === \"\") {\n // Place caret at start and keep focus so user can continue typing\n try {\n const range = document.createRange();\n range.selectNodeContents(target);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n selectionOffsetRef.current = 0;\n } catch (_) {\n // ignore\n }\n handleTextChange(\"\", 0);\n return;\n }\n\n // Only update if the value actually changed to avoid unnecessary re-renders\n if (newValue === value) {\n return;\n }\n\n // Get cursor position based on text with placeholders\n const selection = window.getSelection();\n let cursorPosition = 0;\n\n if (selection && selection.rangeCount > 0) {\n try {\n const range = selection.getRangeAt(0);\n\n if (hasChips) {\n // Use complex calculation when chips are present\n let position = 0;\n let found = false;\n\n const calculatePosition = (node: Node): boolean => {\n if (found) return true;\n\n if (node === range.startContainer) {\n position += range.startOffset;\n found = true;\n return true;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // Only count text nodes that are not inside chip elements\n const parentElement = node.parentElement;\n if (!parentElement?.closest(\"[data-chip-id]\")) {\n if (node.contains(range.startContainer)) {\n position += range.startOffset;\n found = true;\n return true;\n }\n position += (node.textContent || \"\").length;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (element.hasAttribute(\"data-chip-id\")) {\n // Check if cursor is within this chip element\n if (\n element.contains(range.startContainer) ||\n element === range.startContainer\n ) {\n const chipId = element.getAttribute(\"data-chip-id\");\n position += `{{${chipId}}}`.length;\n found = true;\n return true;\n }\n const chipId = element.getAttribute(\"data-chip-id\");\n position += `{{${chipId}}}`.length;\n return false; // Don't process children\n } else if (element.tagName === \"BR\") {\n if (element === range.startContainer) {\n found = true;\n return true;\n }\n position += 1; // for \\n\n return false;\n }\n }\n\n // Process child nodes\n for (let i = 0; i < node.childNodes.length; i++) {\n if (calculatePosition(node.childNodes[i])) {\n return true;\n }\n }\n\n return false;\n };\n\n calculatePosition(target);\n cursorPosition = position;\n } else {\n // Use simple calculation for plain text\n const tempRange = document.createRange();\n tempRange.setStart(target, 0);\n tempRange.setEnd(range.startContainer, range.startOffset);\n cursorPosition = tempRange.toString().length;\n }\n } catch (_error) {\n // Fallback to end of content if range creation fails\n cursorPosition = newValue.length;\n }\n }\n\n // Persist caret position so we can restore it after React re-renders\n selectionOffsetRef.current = cursorPosition;\n handleTextChange(newValue, cursorPosition);\n }}\n onKeyDown={(e) => {\n if (isDisabled) return;\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n try {\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n\n // Handle arrow key navigation around chips\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n const chipElement =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"[data-chip-id]\")\n : (container as Element).closest(\"[data-chip-id]\");\n\n if (chipElement) {\n e.preventDefault();\n\n try {\n // Move cursor to before or after the chip\n const newRange = document.createRange();\n const newSelection = window.getSelection();\n\n if (e.key === \"ArrowLeft\") {\n newRange.setStartBefore(chipElement);\n } else {\n newRange.setStartAfter(chipElement);\n }\n\n newRange.collapse(true);\n newSelection?.removeAllRanges();\n newSelection?.addRange(newRange);\n } catch (_rangeError) {\n // Ignore range errors - let default behavior happen\n }\n }\n }\n\n // Handle backspace on chips\n if (e.key === \"Backspace\") {\n // Identify a chip either selected, or immediately before the caret\n let chipElement: Element | null = null;\n\n // Case 1: caret is inside text or element inside a chip (selected chip)\n chipElement =\n (container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"[data-chip-id]\")\n : (container as Element).closest(\"[data-chip-id]\")) || null;\n\n // Case 2: caret is immediately after a chip (most common backspace case)\n if (!chipElement) {\n if (container.nodeType === Node.TEXT_NODE) {\n const textNode = container as Text;\n if (range.startOffset === 0 && textNode.parentElement) {\n const prev = textNode.previousSibling;\n if (prev && prev.nodeType === Node.ELEMENT_NODE) {\n const maybeChip = (prev as Element).closest(\"[data-chip-id]\");\n if (maybeChip) chipElement = maybeChip as Element;\n }\n }\n } else {\n const elementNode = container as Element;\n if (range.startOffset > 0) {\n const prev = elementNode.childNodes[range.startOffset - 1];\n if (prev && prev.nodeType === Node.ELEMENT_NODE) {\n const maybeChip = (prev as Element).closest(\"[data-chip-id]\");\n if (maybeChip) chipElement = maybeChip as Element;\n }\n }\n }\n }\n\n if (chipElement) {\n e.preventDefault();\n e.stopPropagation();\n\n const chipId = chipElement.getAttribute(\"data-chip-id\");\n if (!chipId) return;\n\n // Find the position of this chip in the text\n const chipPlaceholder = `{{${chipId}}}`;\n const chipIndex = value.indexOf(chipPlaceholder);\n\n if (chipIndex !== -1) {\n // Remove the chip placeholder from the text\n const newText =\n value.slice(0, chipIndex) + value.slice(chipIndex + chipPlaceholder.length);\n\n // Update chips array\n const newChips = chips.filter((c) => c.id !== chipId);\n\n // Set caret position to where the chip was\n selectionOffsetRef.current = chipIndex;\n\n // Clear any live selection ranges that may reference the chip DOM node\n try {\n const sel = window.getSelection();\n sel?.removeAllRanges();\n } catch (_) {\n // ignore\n }\n\n // Update state directly without any DOM manipulation\n onChipsChange?.(newChips);\n onChange?.(newText);\n }\n }\n }\n } catch (_error) {\n // Ignore selection/range errors and let default behavior happen\n }\n }}\n onFocus={(e) => {\n if (isDisabled) return;\n if (props.onFocus) {\n props.onFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>);\n }\n handleFocus(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n onBlur={(e) => {\n if (isDisabled) return;\n if (props.onBlur) {\n props.onBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>);\n }\n handleBlur(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n className={getTextAreaStyles()}\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n ...props.style,\n }}\n data-placeholder={props.placeholder}\n >\n {renderContent()}\n </div>\n </InputWrapper>\n\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n TimeField as AriaTimeField,\n TimeFieldProps as AriaTimeFieldProps,\n DateInput,\n DateSegment,\n TimeValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { controlStyles } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBackgroundStyles,\n getInputStateStyles,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nconst getTimeFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n return twMerge(\n \"w-full\",\n getInputStateStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n }),\n getInputBackgroundStyles({ transparent: props.transparent, isDisabled: props.isDisabled }),\n controlStyles[props.size || \"md\"].text,\n controlStyles[props.size || \"md\"].height,\n controlStyles[props.size || \"md\"].padding,\n // Align left padding with other fields (override left side only)\n \"pl-[var(--control-padding-sm)]\",\n \"flex items-center gap-0.5\",\n props.className\n );\n};\n\nconst getSegmentStyles = ({\n isPlaceholder,\n isDisabled,\n isFocused,\n size = \"md\",\n}: {\n isPlaceholder?: boolean;\n isDisabled?: boolean;\n isInvalid?: boolean;\n isFocused?: boolean;\n size?: Size;\n}) => {\n return twMerge(\n // Base styles\n \"outline-none rounded transition-colors box-content tabular-nums text-center\",\n // Text styles based on state\n isPlaceholder ? \"text-text-muted italic\" : \"text-text-body\",\n isDisabled ? \"text-text-disabled cursor-not-allowed\" : \"cursor-text\",\n // Size styles\n controlStyles[size].text,\n // Padding and spacing\n \"px-0.5 -my-0.5\",\n // Focus styles\n isFocused &&\n \"!outline-[1.5px] !outline-[var(--control-focus-ring-color)] ![--tw-outline-style:solid]\",\n // Hover styles (only when not disabled and not focused)\n !isDisabled && !isFocused && \"hover:bg-text-body/[0.05]\"\n );\n};\n\n/**\n * TimeField\n *\n * Input segmented time with Edges styling and accessible behavior via\n * `react-aria-components`. Supports labels, descriptions and validation.\n */\nexport interface TimeFieldProps\n extends Omit<AriaTimeFieldProps<TimeValue>, \"size\" | \"className\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n placeholder?: string;\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\n/**\n * Renders an Edges TimeField composed from segmented date parts.\n */\nexport function TimeField({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n isRequired,\n transparent,\n validationResult,\n ...props\n}: TimeFieldProps) {\n const { isFocused } = useInputFocus();\n const [focusedSegment, setFocusedSegment] = useState<string | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (target.hasAttribute(\"data-type\")) {\n setFocusedSegment(target.getAttribute(\"data-type\"));\n }\n };\n\n const handleFocusOut = () => {\n setFocusedSegment(null);\n };\n\n const inputElement = inputRef.current;\n if (inputElement) {\n inputElement.addEventListener(\"focusin\", handleFocusIn);\n inputElement.addEventListener(\"focusout\", handleFocusOut);\n }\n\n return () => {\n if (inputElement) {\n inputElement.removeEventListener(\"focusin\", handleFocusIn);\n inputElement.removeEventListener(\"focusout\", handleFocusOut);\n }\n };\n }, []);\n\n return (\n <AriaTimeField {...props}>\n {({ isDisabled, isInvalid }) => (\n <>\n {label && (\n <Label isRequired={isRequired} tooltip={tooltip}>\n {label}\n </Label>\n )}\n <DateInput\n ref={inputRef}\n className={getTimeFieldStyles({ size, transparent, isDisabled, isInvalid, isFocused })}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={getSegmentStyles({\n isPlaceholder: segment.isPlaceholder,\n isDisabled: !segment.isEditable,\n isFocused: focusedSegment === segment.type,\n size,\n })}\n />\n )}\n </DateInput>\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n </>\n )}\n </AriaTimeField>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport React from \"react\";\nimport { ToggleButton as RACToggleButton } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon\";\n\ntype IconName = ComponentProps<typeof Icon>[\"name\"];\n\nexport interface ToggleButtonProps {\n variant?: \"default\" | \"primary\";\n\n size?: Size;\n className?: string;\n children: React.ReactNode;\n onChange?: (isSelected: boolean) => void;\n onPress?: () => void;\n isSelected?: boolean;\n isDisabled?: boolean;\n borderRadius?: \"left\" | \"right\";\n borderRight?: boolean;\n borderLeft?: boolean;\n icon?: IconName;\n iconWeight?: \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\";\n iconPosition?: \"left\" | \"right\";\n /** Value used for group selection state */\n value?: string;\n isLoading?: boolean;\n loadingText?: string;\n loadingIndicator?: React.ReactNode;\n badgeNumber?: number;\n badgeVariant?: \"primary\" | \"destructive\";\n badgePosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n}\n\nconst baseStyles =\n \"flex font-medium justify-center items-center gap-2 text-center transition whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default: {\n selected:\n \"bg-text-body text-white hover:brightness-[var(--control-hover-opacity)] forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n unselected:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/[0.05] forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n },\n primary: {\n selected:\n \"bg-action-primary text-white hover:brightness-[var(--control-hover-opacity)] forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n unselected:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/[0.05] forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n },\n};\n\nconst disabledStyles =\n \"opacity-[--control-hover-opacity] cursor-not-allowed pointer-events-none grayscale\";\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-primary text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\n\nfunction getToggleButtonStyles(props: ToggleButtonProps) {\n const {\n variant = \"default\",\n size = \"md\",\n isDisabled,\n isSelected,\n borderRadius,\n borderRight,\n borderLeft,\n } = props;\n\n let styles = `${baseStyles} ${isSelected ? variantStyles[variant].selected : variantStyles[variant].unselected}`;\n\n // Add size styles using control-specific variables\n styles += ` ${controlStyles[size].text} ${controlStyles[size].height} ${controlStyles[size].padding} ${controlStyles[size].gap}`;\n\n // Add state styles\n styles += ` ${isDisabled ? disabledStyles : enabledStyles}`;\n\n // Add border styles\n if (borderRadius === \"left\") styles += \" rounded-l-sm\";\n if (borderRadius === \"right\") styles += \" rounded-r-sm\";\n if (borderRight) styles += \" border-r\";\n if (borderLeft) styles += \" border-l\";\n\n // Add focus ring\n styles += ` ${focusRing()}`;\n\n return twMerge(styles);\n}\n\nexport function ToggleButton(props: ToggleButtonProps) {\n const {\n className,\n children,\n onPress,\n icon,\n iconPosition = \"left\",\n iconWeight,\n isLoading = false,\n loadingText,\n loadingIndicator,\n size = \"md\",\n badgeNumber,\n badgeVariant = \"primary\",\n badgePosition = \"top-right\",\n ...rest\n } = props;\n\n const iconElement = icon ? (\n <Icon name={icon} className={`icon-[--control-icon-size-${size}]`} weight={iconWeight} />\n ) : null;\n\n const renderChildren = () => {\n const content = (\n <>\n {iconPosition === \"left\" && iconElement}\n {children}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n\n if (isLoading) {\n return (\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\n name=\"CircleNotch\"\n className={`animate-spin icon-[--control-icon-size-${size}]`}\n aria-hidden=\"true\"\n />\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\n return content;\n };\n\n const toggleButton = (\n <RACToggleButton\n onPress={onPress}\n {...rest}\n className={twMerge(getToggleButtonStyles(props), className)}\n aria-busy={isLoading}\n >\n {renderChildren()}\n </RACToggleButton>\n );\n\n if (badgeNumber && badgeNumber > 0) {\n return (\n <div className=\"relative\">\n {toggleButton}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return toggleButton;\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useDebounce.ts","../src/hooks/useLocalStorage.ts","../src/utils/formatting/registry.ts","../src/utils/formatting/boolean.ts","../src/utils/formatting/component-formatter.tsx","../src/utils/formatting/number.ts","../src/utils/formatting/current.ts","../src/utils/formatting/date.ts","../src/utils/formatting/distance.ts","../src/utils/formatting/energy.ts","../src/utils/formatting/phone.ts","../src/utils/formatting/power.ts","../src/utils/formatting/resistance.ts","../src/utils/formatting/temperature.ts","../src/utils/formatting/text.ts","../src/utils/formatting/voltage.ts","../src/utils/formatting/index.ts","../src/components/Icon/Icon.tsx","../src/components/ActionMenu/ActionMenu.tsx","../src/components/Logo/Logo.tsx","../src/components/SideNav/SideNav.tsx","../src/components/TopNav/TopNav.tsx","../src/components/AppShell/AppShell.tsx","../packages/@react-aria/ssr/src/SSRProvider.tsx","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/utils.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useDefaultLocale.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/context.tsx","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useCollator.ts","../node_modules/@react-aria/i18n/dist/packages/@react-aria/i18n/src/useFilter.ts","../src/utils/ColorModeProvider.tsx","../src/utils/index.ts","../src/utils/controlStyles.ts","../src/components/Field/Field.tsx","../src/components/ListBoxItem/ListBoxItem.tsx","../src/components/Popover/Popover.tsx","../src/components/Autocomplete/Autocomplete.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/TextLink/TextLink.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Button/Button.tsx","../src/components/Calendar/Calendar.tsx","../src/components/Heading/Heading.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.tsx","../src/components/CodeEditor/CodeEditor.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/CopyToClipboard/CopyToClipboard.tsx","../src/context/ChartContext.tsx","../src/components/charts/AreaSeries/AreaSeries.tsx","../src/components/charts/BarSeries/BarSeries.tsx","../src/utils/charts.ts","../src/components/charts/ChartAxis/ChartAxis.tsx","../src/components/charts/ChartBottomBar/ChartBottomBar.tsx","../src/utils/chartExport.ts","../src/utils/colors.ts","../src/components/charts/ChartTooltip/ChartTooltip.tsx","../src/components/charts/LineSeries/LineSeries.tsx","../src/components/charts/ChartContainer/ChartContainer.tsx","../src/components/DataTable/cells/cellUtils.tsx","../src/components/DataTable/cells/ActionCell.tsx","../src/components/DataTable/cells/BooleanCell.tsx","../src/components/DataTable/cells/DateCell.tsx","../src/components/DataTable/cells/NumberCell.tsx","../src/components/DataTable/cells/SelectCell.tsx","../src/components/DataTable/cells/TextCell.tsx","../src/components/DataTable/MobileRenderer.tsx","../src/components/DataTable/DataTable.tsx","../src/components/DateField/DateField.tsx","../src/components/Dialog/Dialog.tsx","../src/components/RangeCalendar/RangeCalendar.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/DialogHeader/DialogHeader.tsx","../src/components/ErrorBoundary/ErrorBoundary.tsx","../src/components/Drawer/Drawer.tsx","../src/components/FileUpload/FileUpload.tsx","../src/components/Form/Form.tsx","../src/components/Grid/Grid.tsx","../src/components/Kpi/Kpi.tsx","../src/components/Kpi/KpiGroup.tsx","../src/components/ListBox/ListBox.tsx","../src/components/Loader/Loader.tsx","../src/components/Maps/MapLayersControl.tsx","../src/components/Maps/MapListControl.tsx","../src/components/Maps/MapLocationControl.tsx","../src/components/Maps/MapSearchControl.tsx","../src/components/Maps/utils.ts","../src/config/mapbox.ts","../src/components/Maps/MapDrawerContainer.tsx","../src/components/Maps/mapLayers.ts","../src/components/Maps/mapStyles.ts","../src/components/Maps/useMapInteractions.ts","../src/components/Maps/useMapViewState.ts","../src/components/Maps/InteractiveMap.tsx","../src/components/Maps/StaticMap.tsx","../src/components/Meter/Meter.tsx","../src/components/Notice/Notice.tsx","../src/components/Notice/NoticeContainer.tsx","../src/components/Notice/NoticeProvider.tsx","../src/components/Notice/useNotice.ts","../src/components/NumberField/NumberField.tsx","../src/components/Tabs/Tabs.tsx","../src/components/PageLayout/PageLayout.tsx","../src/components/PlaceSearch/PlaceSearch.tsx","../src/components/ProgressBar/ProgressBar.tsx","../src/components/RadioGroup/RadioGroup.tsx","../src/components/TextField/TextField.tsx","../src/components/RichTextEditor/RichTextEditor.tsx","../src/components/Section/Section.tsx","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/Select/Select.tsx","../src/components/Slider/Slider.tsx","../src/components/SplitPane/SplitPane.tsx","../src/components/StatList/StatList.tsx","../src/components/Switch/Switch.tsx","../src/components/TextArea/TextArea.tsx","../src/components/TextAreaWithChips/TextAreaWithChips.tsx","../src/components/TimeField/TimeField.tsx","../src/components/ToggleButton/ToggleButton.tsx"],"names":["useDebounce","value","delay","debouncedValue","setDebouncedValue","useState","useEffect","timer","useLocalStorage","key","initialValue","storedValue","setStoredValue","item","error","setValue","useCallback","prev","removeValue","FormatRegistryClass","__publicField","formatter","args","FormatRegistry","toBoolean","trueText","falseText","toEnabledDisabled","toOnOff","toActiveInactive","toTrueFalse","toCheckmark","parseBoolean","lower","formatBoolean","format","boolValue","formatComponentValue","emptyClassName","emptyText","jsx","formatted","formatFieldValue","useComponentFormatter","React","isNil","toPercentage","decimals","toInteger","toFloat","toFormattedNumber","thousandsSeparator","options","toCompactNumber","display","toScientificNotation","toCurrency","currency","formatOptions","formatNumber","numValue","formatCurrency","toMilliamps","mA","toAmps","toKiloamps","autoScaleCurrent","absValue","formatCurrent","toMA","toA","toKA","toDateTime","DateTime","dt","toDateString","showTime","timezone","dtWithZone","toRelativeTime","toFullDateTime","toISOString","toCustomDateFormat","getDateParts","formatDate","toMeters","toCentimeters","toMillimeters","toKilometers","toFeet","toInches","toMiles","toYards","toNauticalMiles","metersToFeet","meters","feetToMeters","feet","milesToKilometers","miles","kilometersToMiles","km","feetToMiles","milesToFeet","metersToMiles","milesToMeters","yardsToMeters","yards","metersToYards","inchesToCentimeters","inches","centimetersToInches","cm","autoScaleDistance","metric","formatDistance","isMetric","toWh","tokWh","toMWh","toGWh","autoScaleEnergy","formatEnergy","formatUSPhone","phone","cleaned","formatInternationalPhone","formatPhoneNumber","formatPhone","phoneStr","toWatts","toKilowatts","toMegawatts","toGigawatts","autoScalePower","formatPower","toW","toKW","toMW","toGW","toMilliohms","toOhms","toKilohms","toMegohms","autoScaleResistance","formatResistance","temperatureStringToSymbol","unit","toFahrenheit","toCelsius","fromFahrenheit","toKelvin","celsiusToFahrenheit","celsius","fahrenheitToCelsius","fahrenheit","celsiusToKelvin","kelvinToCelsius","kelvin","fahrenheitToKelvin","kelvinToFahrenheit","toTemperature","formatTemperature","shouldHideValue","toUpperCase","text","toLowerCase","toSentenceCase","toTitleCase","articles","word","index","capitalize","ucFirst","camelCaseToWords","str","snakeCaseToWords","enumToSentenceCase","truncateMiddle","length","totalChars","leadingChars","trailingChars","truncateStart","truncateEnd","ellipsis","toSecret","lastFour","maskedLength","formatText","transform","position","toMillivolts","mV","toVolts","toKilovolts","autoScaleVoltage","formatVoltage","toMV","toV","toKV","customFormat","createFormat","type","sizePresets","Icon","memo","name","size","color","weight","className","ariaLabel","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","twMerge","IconWithContainer","variant","shape","containerSize","containerClassName","ref","iconSize","resolvedContainerSize","containerClasses","ActionMenu","children","items","align","textAlign","onAction","jsxs","MenuTrigger","Popover","Menu","ActionMenuItem","iconName","isDisabled","sizeClasses","variantClasses","MenuItem","Logo","showWordmark","width","fill","fillValue","fillClass","logoWidth","logoHeight","SideNav","topItems","bottomItems","logo","showLogo","LinkComponent","mobileMenuId","sidebarCollapseId","isSectionFormat","normalizeToSections","renderSection","section","sectionIndex","totalSections","renderNavItem","isNested","categoryId","child","linkProps","linkContent","Fragment","sections","TopNav","rightContent","showMobileMenu","avatar","showColorModeSwitcher","toggleTheme","isDarkThemeEnabled","actions","AppShell","sideNav","topNav","contentPaddingX","contentPaddingY","showSidebarBorder","mainClassName","enableJsEnhancements","$b5e257d569688ac6$var$defaultContext","$b5e257d569688ac6$var$SSRContext","$670gB$react","$b5e257d569688ac6$var$IsSSRContext","$b5e257d569688ac6$var$canUseDOM","$b5e257d569688ac6$var$componentIds","$b5e257d569688ac6$var$useCounter","ctx","$670gB$useContext","$670gB$useRef","_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner","_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","currentOwner","prevComponentValue","$b5e257d569688ac6$var$useLegacySSRSafeId","defaultId","counter","prefix","$b5e257d569688ac6$var$useModernSSRSafeId","id","didSSR","$670gB$useState","$b5e257d569688ac6$export$535bd6ca7f90a273","$b5e257d569688ac6$var$getSnapshot","$b5e257d569688ac6$var$getServerSnapshot","$b5e257d569688ac6$var$subscribe","onStoreChange","$148a7a147e38ea7f$var$RTL_SCRIPTS","$148a7a147e38ea7f$var$RTL_LANGS","$148a7a147e38ea7f$export$702d680b21cbd764","localeString","locale","textInfo","lang","$1e5a04cdaf7d1af8$var$localeSymbol","$1e5a04cdaf7d1af8$export$f09106e7c6677ec5","$1e5a04cdaf7d1af8$var$currentLocale","$1e5a04cdaf7d1af8$var$listeners","$1e5a04cdaf7d1af8$var$updateLocale","listener","$1e5a04cdaf7d1af8$export$188ec29ebc2bdc3a","isSSR","defaultLocale","setDefaultLocale","$ffhGL$useState","$ffhGL$useEffect","$18f2051aff69b9bf$var$I18nContext","$h9FiU$react","$18f2051aff69b9bf$export$43bb16f9c6d9e3f7","$h9FiU$useContext","$325a3faab7a68acd$var$cache","$325a3faab7a68acd$export$a16aca283550c30d","cacheKey","a","b","$bb77f239b46e8c72$export$3274cf84b703fff","collator","startsWith","$21ck9$useCallback","string","substring","endsWith","contains","scan","sliceLen","slice","$21ck9$useMemo","ColorModeContext","createContext","useColorMode","useContext","ColorModeProvider","colorMode","setColorMode","isDarkTheme","savedTheme","hasThemeDarkClass","mediaQuery","initialTheme","handleColorModeChange","e","newTheme","handleClassChange","currentTheme","observer","mutations","mutation","prevMode","newMode","focusRing","showDefaultOutline","composeTailwindRenderProps","tw","composeRenderProps","controlStyles","useInputFocus","isFocused","setIsFocused","handleFocus","onFocus","handleBlur","onBlur","InputWrapper","ClearButton","onClick","getInputStateStyles","isInvalid","baseStyles","getInputBackgroundStyles","getInputBaseStyles","transparent","getFieldGroupStyles","isFocusWithin","Label","tooltip","isRequired","htmlFor","Description","FieldError","Input","FieldGroup","rest","itemHeightStylesObject","textSizeStylesObject","ListBoxItem","AriaListBoxItem","getPopoverStyles","isEntering","isExiting","enteringStyles","exitingStyles","showArrow","isSubmenu","useSlottedContext","PopoverContext","offset","AriaPopover","renderProps","OverlayArrow","iconSizeClassMap","inputPaddingLeftMap","state","ComboBoxStateContext","AriaButton","getItemName","staticItems","selectedItem","s","handleRestRequest","config","filterText","signal","baseUrl","params","finalUrl","response","json","errorMessage","handleGraphQLRequest","query","obj","Autocomplete","label","selectedKey","defaultSelectedKey","onSelectionChange","requestConfig","defaultFilter","placeholder","description","validationResult","showErrors","renderItem","renderLeftIcon","autoFocus","triggerRef","triggerWidth","setTriggerWidth","inputValue","setInputValue","debouncedInputValue","setError","textSizeClass","heightSizeClass","dynamicItems","updateTriggerWidth","useAsyncList","result","handleInternalSelectionChange","newName","handleInternalInputChange","currentSelectedItemName","ComboBox","Group","AriaInput","isPressed","ListBox","sectionItems","ListBoxSection","Header","Avatar","src","alt","firstName","lastName","fullName","status","bordered","statusSizeClasses","statusPositionClasses","statusColors","variantColors","shapeClasses","baseClasses","initials","first","last","parts","getIcon","Users","Building2","User","renderAvatar","badgeVariantStyles","badgeSizeStyles","badgeShapeStyles","dotSizeStyles","Badge","dot","dotPosition","dotElement","TextLink","href","external","title","asButton","onPress","externalProps","combinedClasses","content","Breadcrumbs","AriaBreadcrumbs","Breadcrumb","restProps","AriaBreadcrumb","ChevronRight","variantStyles","widthStyles","disabledStyles","enabledStyles","badgePositionStyles","getButtonStyles","fullWidth","isLoading","styles","Button","icon","loadingText","loadingIndicator","iconPosition","iconWeight","badgeNumber","badgeVariant","badgePosition","style","target","rel","iconElement","loadingNode","composedClassName","_onPress","_onPressStart","_onPressEnd","_onPressChange","_onPressUp","_onAuxClick","_onContextMenu","_onDoubleClick","safeRestProps","buttonOrLink","RACLink","RACButton","getCellStyles","isSelected","Calendar","AriaCalendar","CalendarHeader","CalendarGrid","CalendarGridHeader","CalendarGridBody","date","CalendarCell","Text","direction","useLocale","buttonSize","Heading","AriaCalendarGridHeader","day","CalendarHeaderCell","sizeVariants","heightVariants","Tag","height","heightClasses","Skeleton","animation","gradient","flex","stack","responsive","adjustAnimationSpeedBasedOnWidth","dataTestId","visible","setVisible","animationSpeed","numWidth","animationClasses","layoutClasses","responsiveStyles","breakpoint","lineWidth","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","CardHeader","subtitle","CardMedia","aspectRatio","CardContent","CardFooter","CheckboxGroup","AriaCheckboxGroup","getCheckboxStyles","getBoxStyles","isIndeterminate","colorStyles","iconStyles","Checkbox","otherProps","AriaCheckbox","checkboxContent","Minus","Check","chipVariantStyles","chipSizeStyles","getChipStyles","isClickable","Chip","onRemove","isRemovable","showRemoveButton","handleRemoveClick","handleChipClick","chipContent","CodeEditor","readOnly","onChange","language","theme","lineHeight","minLines","maxLines","showLineNumbers","showGutter","fontSize","wrapEnabled","editorRef","useRef","calculatedHeight","useMemo","lineCount","AceEditor","Tooltip","TooltipTrigger","AriaTooltip","CopyToClipboard","showTooltip","setShowTooltip","copyButton","textToCopy","defaultAnimationSettings","ChartContext","useChartContext","context","AreaSeries","data","uniqueGradientId","useId","clipPathId","xScale","yScale","animationSettings","xRange","yRange","motion","AreaClosed","d","curveLinear","LinePath","BarSeries","opacity","categoryColors","sortedData","timeInterval","barWidth","i","x","y","nextPoint","thisBarWidth","barColor","Bar","defaultMargin","getYFormatSettings","formatType","currencySymbol","safeFormat","v","units","unitIndex","val","suffixes","v2","createXScale","dateExtent","extent","scaleTime","createYScale","yFormatSettings","dataYMin","min","dataYMax","max","yMin","yMax","scaleLinear","AxisBottom","top","scale","Axis","AxisLeft","left","yFormatType","formatSettings","ChartAxis","Legend","ChartBottomBar","onExport","isExporting","setIsExporting","exportingType","setExportingType","handleExport","DialogTrigger","generateFilename","baseFilename","extension","includeTimestamp","base","timestamp","exportChart","datasets","metadata","svgRef","normalizedDatasets","exportAsCSV","exportAsSVG","exportAsPNG","dateMap","dataset","point","rows","row","p","csv","Papa","blob","filename","saveAs","svgClone","rect","svgString","objectUrl","svgElement","bbox","textElements","svgBlob","resolve","reject","image","timeout","canvas","isExportSupported","getExportFormatName","colorCache","getResolvedColor","variableName","fallback","varName","root","tempElement","resolvedColor","clearColorCache","getThemeCategoricalColors","colors","getDefaultColors","getDefaultChartColor","createCategoryColorMap","categories","customColors","colorMap","themeColors","category","isLightColor","rgb","g","getContrastingTextColor","backgroundColor","ChartTooltip","tooltipRef","setPosition","viewportHeight","translate","AnimatePresence","series","LineSeries","strokeWidth","strokeDasharray","bisectDate","bisector","ChartEmptyState","ChartLoading","VisXChartContainer","parentWidth","parentHeight","tooltipData","setTooltipData","lastMoveRef","defaultColor","seriesMetadata","seriesIndex","totalSeries","Children","isValidElement","allData","handleMouseMove","event","mouseX","xValue","seriesData","datasetIndex","idx","d0","d1","distanceToD0","distanceToD1","tooltipX","shouldShowLeft","handleMouseLeave","contextValue","coloredChildren","uniqueSeries","meta","tickValue","Line","ChartContainer","withParentSize","getCellAlignmentClasses","getCellTextClasses","emphasis","isLink","getCellContainerClasses","additionalClasses","formatEmptyValue","SKELETON_SIZES","getSkeletonSize","resolveValue","getBadgeClasses","getBooleanBadgeVariant","getNumericColorClasses","colorCode","getLinkClasses","behavior","wrapWithLink","linkBehavior","resolvedHref","linkClasses","ActionCell","visibleActions","action","disabled","BooleanCell","trueIcon","falseIcon","showFalse","DateCell","formattedValue","getRelativeTime","diffInMs","diffInSecs","diffInMins","diffInHours","diffInDays","NumberCell","suffix","showPositiveSign","displayValue","textClasses","SelectCell","onSelect","checked","TextCell","truncate","BREAKPOINT_CLASSES","DESKTOP_BREAKPOINT_CLASSES","getCellValue","column","renderMobileCell","CellComponent","cellProps","AutoMobileRenderer","columns","density","mobileColumns","col","mobileConfig","primaryColumns","secondaryColumns","badgeColumns","showLabel","CardMobileRenderer","visibleColumns","isFirst","getMobileBreakpointClasses","MobileLoadingSkeleton","densityClasses","alignmentClasses","widthClasses","getColumnStyles","TableHeaderCell","sortConfig","onSort","stickyHeader","isSorted","sortDirection","TableCell","rowIndex","columnIndex","isHovered","LoadingCell","TableRow","setIsHovered","handleClick","LoadingRow","DataTable","maxHeight","layout","mobileRenderer","customMobileRowRender","mobileBreakpoint","loadingRowCount","onRowClick","getRowId","hideHeader","localSortConfig","setLocalSortConfig","gridTemplateColumns","handleSort","columnId","newSortConfig","containerStyle","wrapperClasses","breakpointClasses","showMobile","renderMobileRow","_","rowId","DateField","showCalendar","isCalendarOpen","setIsCalendarOpen","handleCalendarSelect","AriaDateField","DateInput","CalendarIcon","Dialog","getSegmentStyles","isPlaceholder","AriaDateInput","segment","DateSegment","RACDialog","getCellClassName","selectionState","selectionStateClasses","disabledClasses","RangeCalendar","AriaRangeCalendar","formattedDate","isSelectionStart","isSelectionEnd","_isFocusVisible","DateRangePicker","AriaDateRangePicker","DialogHeader","onClose","hideCloseIcon","titleAlign","hasBackArrow","onBack","headerContent","ErrorBoundary","Component","errorInfo","Drawer","isOpen","slideInFrom","transparentOverlay","primaryAction","secondaryAction","footerContent","contentPadding","maxWidth","isAnimating","setIsAnimating","hasActions","hasFooter","ModalOverlay","Modal","FileUpload","onUrlChange","accept","maxSize","onUpload","showPreview","isDragging","setIsDragging","isUploading","setIsUploading","preview","setPreview","fileInputRef","handleFile","file","reader","url","err","handleDrop","handleRemove","DropZone","ImageIcon","X","Upload","FileTrigger","files","Form","RACForm","colsMap","responsiveColsMap","gapMap","gapXMap","gapYMap","alignMap","justifyMap","flowMap","spanMap","responsiveSpanMap","getResponsiveClasses","baseMap","responsiveMap","classes","map","breakpointValue","Grid","cols","gap","gapX","gapY","justify","flow","autoFit","autoFill","gridClasses","GridItem","span","itemClasses","formatValue","getDeltaColor","delta","deltaIntent","isPositive","Sparkline","points","yValues","range","normalizeY","xStep","pathData","Kpi","deltaPeriodLabel","trend","helpText","orientation","loading","empty","renderValue","renderDelta","renderTrend","currentSize","valueNode","deltaNode","trendNode","getColClasses","KpiGroup","equalizeHeights","header","enhancedChildren","AriaListBox","Loader","getThemeOptions","isDarkMode","streets_dark_default","streets_light_default","satelite_light_default","neutral_dark_default","neutral_light_default","MapLayersControl","onThemeChange","isoRtoVisible","onIsoRtoToggle","vermontSubstationsVisible","onVermontSubstationsToggle","transformersVisible","onTransformersToggle","feedersVisible","onFeedersToggle","spansVisible","onSpansToggle","themeOptions","handleThemeSelect","getPositionClasses","buttonClasses","option","MapListControl","onToggle","showListPanel","internalIsOpen","setInternalIsOpen","handleToggle","newState","currentIsOpen","MapLocationControl","mapRef","showCompass","showGeolocate","onCompassClick","onGeolocateClick","isGeolocating","setIsGeolocating","handleCompassClick","handleGeolocateClick","latitude","longitude","MapSearchControl","onSearch","showSearchInput","setIsOpen","searchQuery","setSearchQuery","handleSearchClick","handleSearchSubmit","handleKeyDown","createGeoJsonData","getBoundsZoomLevel","bounds","WORLD_DIM","ZOOM_MAX","latRad","lat","sin","radX2","zoom","mapPx","worldPx","fraction","ne","sw","latFraction","lngDiff","lngFraction","latZoom","lngZoom","calculateViewStateThatFitsPoints","minLat","maxLat","minLng","maxLng","normalizeMapFilters","filters","MAPBOX_DEMO_TOKEN","getMapboxToken","MapDrawerContainer","UNSELECTED_POINT_SHADOW_OFFSET","MAP_COLORS","getClusterConfig","getClusterRadiusExpression","clusterConfig","threshold","radius","getShadowRadiusExpression","getMapLayers","selectedPointId","clusterShadowLayer","unclusteredPointShadowLayer","clusterCircleLayer","clusterCountLayer","unclusteredPointLayer","getMvtMapLayers","mvtClusterShadowLayer","mvtPointShadowLayer","mvtClusterLayer","mvtClusterCountLayer","mvtPointLayer","MAPBOX_THEMES","getMapboxStyle","semanticTheme","baseStyle","isCustomStyle","styleUrl","TRANSITION_DURATION","DRAWER_WIDTH","useMapInteractions","onPointClick","onCloseDrawer","handlePointClick","feature","coordinates","handleClusterClick","clickedFeature","clusterId","mapboxSource","currentZoom","newZoom","handleMapClick","handleMouseEnter","VIEW_STATE_THRESHOLD","getSinglePointViewState","useMapViewState","initialViewState","onViewStateChange","containerDimensions","isFirstLoad","showResetButton","setShowResetButton","debounceTimeout","defaultViewState","effectiveInitialViewState","calculatedViewState","isViewStateDifferent","current","calculated","handleViewStateChange","newViewState","shouldShow","handleResetView","resetState","SITE_DOMAIN_BASE_URL","SELECTED_POINT_ICON_SIZE","getMvtTileUrl","workspaceId","searchParams","city","InteractiveMap","drawerComponent","scrollEnabled","previewMode","previewModeCta","onPreviewModePress","mapFilters","serverSideClusteringEnabled","mapboxAccessToken","transformRequest","controls","layersData","listItems","onListToggle","propIsoRtoVisible","propVermontSubstationsVisible","propTransformersVisible","propFeedersVisible","propSpansVisible","substationsMinZoom","transformersMinZoom","feedersMinZoom","spansMinZoom","searchPlaceholder","customTileset","isThemeReady","setIsThemeReady","checkThemeReady","hasThemeClass","containerRef","setContainerDimensions","internalIsoRtoVisible","setInternalIsoRtoVisible","internalVermontSubstationsVisible","setInternalVermontSubstationsVisible","internalTransformersVisible","setInternalTransformersVisible","internalFeedersVisible","setInternalFeedersVisible","internalSpansVisible","setInternalSpansVisible","setIsoRtoVisible","setVermontSubstationsVisible","setTransformersVisible","setFeedersVisible","setSpansVisible","updateDimensions","selectedPointCoordinates","mapLayerComponents","newStyle","handleStyleLoad","fallbackStyle","geoJsonData","defaultTransformRequest","resourceType","ReactMapGL","evt","Source","layer","Layer","Marker","StaticMap","showMarker","AttributionControl","sizeStyles","Meter","showWarningIndicator","warningThreshold","AriaMeter","percentage","valueText","isWarning","effectiveVariant","getAutomaticVariant","AlertTriangle","getMeterColor","CheckCircle","XCircle","AlertCircle","Info","Notice","_id","message","duration","dismissible","onDismiss","container","positionStyles","NoticeContainer","notices","mounted","setMounted","notice","createPortal","NoticeContext","NoticeProvider","maxNotices","defaultDuration","defaultDismissible","setNotices","addNotice","newNotice","updated","removeNotice","clearNotices","useNoticeContext","useNotice","show","success","warning","info","getNumberFieldStyles","NumberField","AriaNumberField","TabsContext","Fr","getTabsStyles","Tabs","RACTabs","getTabListStyles","TabList","RACTabList","getTabStyles","focusRingStyles","stateStyles","Tab","RACTab","getTabPanelStyles","TabPanel","RACTabPanel","PageLayout","paddingXClass","paddingYClass","breadcrumbs","breadcrumbsNode","headingAs","bc","Actions","primary","secondary","Filters","tabs","defaultValue","handleSelectionChange","t","Content","Aside","sticky","isMapboxResponse","MAPBOX_TOKEN","PlaceSearch","searchTypes","countryRestrictions","proximity","itemDataRef","loadedItemsRef","itemData","nameParts","primaryText","secondaryText","selected","ProgressBar","rightLabel","progressWidth","hideLabels","AriaProgressBar","RadioGroup","RACRadioGroup","getRadioStyles","Radio","RACRadio","getTextFieldStyles","paddingStyles","TextField","showSearchIcon","isClearable","onClear","showPassword","setShowPassword","isPassword","AriaTextFieldComponent","ToolbarButton","isActive","LinkDialog","initialUrl","onSubmit","setUrl","RichTextEditor","initialContent","isLinkDialogOpen","setIsLinkDialogOpen","editor","useEditor","StarterKit","Link","handleLinkClick","handleLinkSubmit","BubbleMenu","EditorContent","spacingStyles","Section","spacing","withDivider","headingId","hasHeader","iconSizes","getButtonClass","_isFirst","isLast","SegmentedControl","ToggleButton","getSelectValueClassName","useElementFocus","Select","controlledSelectedKey","internalSelectedKey","setInternalSelectedKey","selectRef","AriaSelect","SelectValue","Slider","step","showValue","isControlled","internalValue","setInternalValue","currentValue","clamped","percent","next","SplitPaneContext","SplitPane","defaultSize","minSize","resizable","onResize","isResizing","setIsResizing","splitPosition","setSplitPosition","totalSize","startPos","mainSize","asideSize","newRatio","handleMouseUp","handleMouseDown","mainPanel","Main","asidePanel","splitPercentage","newPos","getTone","toneColors","StatRow","dense","valueAlign","tone","toneClass","valueDisplay","valueContent","StatList","showDividers","skeleton","getTrackClassName","getHandleClassName","Switch","AriaSwitch","getTextAreaStyles","textAreaStyles","TextArea","required","TextAreaWithChips","chips","onChipsChange","triggerPattern","onTriggerDetected","onTriggerDismissed","renderChip","chipVariant","chipSize","textareaRef","actualChipSize","selectionOffsetRef","getDOMTextWithPlaceholders","processNode","node","textContent","element","chipId","setCaretAtOffset","targetOffset","walker","parentElement","currentNode","remaining","sel","useLayoutEffect","handleTextChange","newValue","cursorPosition","textBeforeCursor","triggerRegex","match","startIndex","handleChipRemove","updatedChips","chip","updatedText","renderChipElement","contentEditableStyles","renderContent","part","chipMatch","c","selection","line","lineIndex","hasChips","found","calculatePosition","tempRange","chipElement","newRange","newSelection","textNode","maybeChip","elementNode","chipPlaceholder","chipIndex","newText","newChips","getTimeFieldStyles","TimeField","focusedSegment","setFocusedSegment","inputRef","handleFocusIn","handleFocusOut","inputElement","AriaTimeField","getToggleButtonStyles","borderRadius","borderRight","borderLeft","renderChildren","toggleButton","RACToggleButton"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\n/**\n * Hook for managing localStorage values with React state synchronization\n * @param key - The localStorage key\n * @param initialValue - The initial value if nothing is stored\n * @returns [value, setValue, removeValue] - Current value, setter function, and remove function\n */\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [T, (value: T | ((val: T) => T)) => void, () => void] {\n // State to hold the current value\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Update localStorage when the value changes\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.setItem(key, JSON.stringify(storedValue));\n } catch (error) {\n console.error(`Error writing to localStorage key \"${key}\":`, error);\n }\n }, [key, storedValue]);\n\n // Memoized setValue function\n const setValue = useCallback(\n (value: T | ((val: T) => T)) => {\n try {\n setStoredValue((prev) => {\n const valueToStore = value instanceof Function ? value(prev) : value;\n return valueToStore;\n });\n } catch (error) {\n console.error(`Error setting value for localStorage key \"${key}\":`, error);\n }\n },\n [key]\n );\n\n // Memoized remove function\n const removeValue = useCallback(() => {\n try {\n if (typeof window !== \"undefined\") {\n window.localStorage.removeItem(key);\n }\n setStoredValue(initialValue);\n } catch (error) {\n console.error(`Error removing localStorage key \"${key}\":`, error);\n }\n }, [key, initialValue]);\n\n return [storedValue, setValue, removeValue];\n}\n","/**\n * FormatRegistry - A singleton pattern for managing formatters\n * Allows registration and retrieval of formatting functions by key\n */\n\nimport type { FieldValue, FormattedValue, FormatterFunction } from \"./types\";\n\nclass FormatRegistryClass {\n private formatters: Map<string, FormatterFunction> = new Map();\n\n /**\n * Register a new formatter\n * @param key - Unique identifier for the formatter\n * @param formatter - The formatting function\n */\n register(key: string, formatter: FormatterFunction): void {\n this.formatters.set(key, formatter);\n }\n\n /**\n * Format a value using a registered formatter\n * @param key - The formatter key\n * @param value - The value to format\n * @param args - Additional arguments to pass to the formatter\n * @returns The formatted value or null\n */\n format(key: string, value: FieldValue, ...args: unknown[]): FormattedValue {\n const formatter = this.formatters.get(key);\n if (!formatter) {\n console.warn(`No formatter registered for key: ${key}`);\n return null;\n }\n return formatter(value, ...args);\n }\n\n /**\n * Check if a formatter is registered\n * @param key - The formatter key\n * @returns True if the formatter exists\n */\n has(key: string): boolean {\n return this.formatters.has(key);\n }\n\n /**\n * Get all registered formatter keys\n * @returns Array of formatter keys\n */\n keys(): string[] {\n return Array.from(this.formatters.keys());\n }\n\n /**\n * Remove a formatter\n * @param key - The formatter key to remove\n */\n unregister(key: string): void {\n this.formatters.delete(key);\n }\n\n /**\n * Clear all registered formatters\n */\n clear(): void {\n this.formatters.clear();\n }\n}\n\n// Export singleton instance\nexport const FormatRegistry = new FormatRegistryClass();\n","/**\n * Boolean formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { BooleanFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format boolean value with custom text\n */\nexport const toBoolean = (\n value: boolean | null | undefined,\n trueText: string = \"Yes\",\n falseText: string = \"No\"\n): string | null => {\n if (value === null || value === undefined) return null;\n return value ? trueText : falseText;\n};\n\n/**\n * Format boolean as enabled/disabled\n */\nexport const toEnabledDisabled = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"Enabled\", \"Disabled\");\n};\n\n/**\n * Format boolean as on/off\n */\nexport const toOnOff = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"On\", \"Off\");\n};\n\n/**\n * Format boolean as active/inactive\n */\nexport const toActiveInactive = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"Active\", \"Inactive\");\n};\n\n/**\n * Format boolean as true/false\n */\nexport const toTrueFalse = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"True\", \"False\");\n};\n\n/**\n * Format boolean as checkmark/cross\n */\nexport const toCheckmark = (value: boolean | null | undefined): string | null => {\n return toBoolean(value, \"✓\", \"✗\");\n};\n\n/**\n * Parse various truthy/falsy values to boolean\n */\nexport const parseBoolean = (value: FieldValue): boolean | null => {\n if (value === null || value === undefined) return null;\n\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const lower = value.toLowerCase().trim();\n if (\n lower === \"true\" ||\n lower === \"yes\" ||\n lower === \"1\" ||\n lower === \"on\" ||\n lower === \"enabled\"\n ) {\n return true;\n }\n if (\n lower === \"false\" ||\n lower === \"no\" ||\n lower === \"0\" ||\n lower === \"off\" ||\n lower === \"disabled\"\n ) {\n return false;\n }\n return null;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n return null;\n};\n\n/**\n * Format boolean according to BooleanFormat specification\n */\nexport const formatBoolean = (value: FieldValue, format: BooleanFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const boolValue = parseBoolean(value);\n if (boolValue === null) return format.nullText ?? null;\n\n return toBoolean(boolValue, format.trueText ?? \"Yes\", format.falseText ?? \"No\");\n};\n\n// Register boolean formatters\nFormatRegistry.register(\"boolean\", (value, trueText, falseText) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toBoolean(\n boolValue,\n typeof trueText === \"string\" ? trueText : \"Yes\",\n typeof falseText === \"string\" ? falseText : \"No\"\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"yesNo\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toBoolean(boolValue, \"Yes\", \"No\");\n }\n return null;\n});\n\nFormatRegistry.register(\"enabledDisabled\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toEnabledDisabled(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"onOff\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toOnOff(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"activeInactive\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toActiveInactive(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"trueFalse\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toTrueFalse(boolValue);\n }\n return null;\n});\n\nFormatRegistry.register(\"checkmark\", (value) => {\n const boolValue = parseBoolean(value);\n if (boolValue !== null) {\n return toCheckmark(boolValue);\n }\n return null;\n});\n","/**\n * Centralized formatting utility for UI components\n * Used by Kpi, StatList, and other data display components\n */\n\nimport React from \"react\";\nimport { formatFieldValue } from \"./index\";\nimport type { FieldFormat, FieldValue } from \"./types\";\n\n/**\n * Common formatter type used by data display components\n * Can be either a custom function or a FieldFormat object\n */\nexport type ComponentFormatter = ((value: FieldValue) => React.ReactNode) | FieldFormat;\n\n/**\n * Options for formatting values in components\n */\nexport interface ComponentFormatOptions {\n /** The value to format */\n value: FieldValue;\n /** The formatter to apply */\n formatter?: ComponentFormatter;\n /** CSS class for null/empty values */\n emptyClassName?: string;\n /** Text to show for null/empty values */\n emptyText?: React.ReactNode;\n}\n\n/**\n * Format a value for display in a component\n * Centralizes the logic used by Kpi, StatList, and similar components\n *\n * @example\n * ```tsx\n * // In a component\n * const formatted = formatComponentValue({\n * value: 1500,\n * formatter: { type: \"power\" }\n * });\n * // Returns: \"1.5 kW\"\n * ```\n */\nexport function formatComponentValue({\n value,\n formatter,\n emptyClassName = \"text-text-muted\",\n emptyText = \"—\",\n}: ComponentFormatOptions): React.ReactNode {\n // Handle null/undefined early\n if (value == null) {\n return <span className={emptyClassName}>{emptyText}</span>;\n }\n\n // Custom formatter function takes precedence\n if (typeof formatter === \"function\") {\n return formatter(value);\n }\n\n // If a FieldFormat is provided, use the unified formatting system\n if (formatter && typeof formatter === \"object\") {\n const formatted = formatFieldValue(value, formatter);\n\n // Wrap dates in semantic time element for accessibility\n if (value instanceof Date && formatted) {\n return (\n <time dateTime={value.toISOString()} title={value.toISOString()}>\n {formatted}\n </time>\n );\n }\n\n return formatted || <span className={emptyClassName}>{emptyText}</span>;\n }\n\n // No formatter provided - use sensible defaults based on type\n if (!formatter) {\n // For strings, just return as-is\n if (typeof value === \"string\") {\n return value;\n }\n\n // For dates, use default date formatting\n if (value instanceof Date) {\n const formatted = formatFieldValue(value, { type: \"date\" });\n return (\n <time dateTime={value.toISOString()} title={value.toISOString()}>\n {formatted}\n </time>\n );\n }\n\n // For numbers, use default number formatting\n if (typeof value === \"number\") {\n return formatFieldValue(value, { type: \"number\" });\n }\n\n // For booleans, use default boolean formatting\n if (typeof value === \"boolean\") {\n return formatFieldValue(value, { type: \"boolean\" });\n }\n }\n\n // Fallback to string conversion\n return String(value);\n}\n\n/**\n * Hook for using the component formatter\n * Provides memoization for better performance\n *\n * @example\n * ```tsx\n * function MyComponent({ value, formatter }) {\n * const format = useComponentFormatter(formatter);\n * const formatted = format(value);\n * return <span>{formatted}</span>;\n * }\n * ```\n */\nexport function useComponentFormatter(\n formatter?: ComponentFormatter,\n emptyClassName?: string,\n emptyText?: React.ReactNode\n) {\n return React.useCallback(\n (value: FieldValue) =>\n formatComponentValue({\n value,\n formatter,\n emptyClassName,\n emptyText,\n }),\n [formatter, emptyClassName, emptyText]\n );\n}\n","/**\n * Number and currency formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { CurrencyFormat, FieldValue, FormattedValue, NumberFormat } from \"./types\";\n\n/**\n * Check if a value is null or undefined\n */\nexport const isNil = (value: unknown): value is null | undefined => {\n return value === null || value === undefined;\n};\n\n/**\n * Format as percentage\n */\nexport const toPercentage = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)}%`;\n};\n\n/**\n * Format as integer\n */\nexport const toInteger = (value: number | null | undefined): string | null => {\n if (isNil(value)) return null;\n return Math.round(value).toString();\n};\n\n/**\n * Format as float with specified decimals\n */\nexport const toFloat = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return value.toFixed(decimals);\n};\n\n/**\n * Format number with thousands separator\n */\nexport const toFormattedNumber = (\n value: number | null | undefined,\n decimals?: number,\n thousandsSeparator: boolean = true\n): string | null => {\n if (isNil(value)) return null;\n\n const options: Intl.NumberFormatOptions = {\n useGrouping: thousandsSeparator,\n };\n\n if (decimals !== undefined) {\n options.minimumFractionDigits = decimals;\n options.maximumFractionDigits = decimals;\n }\n\n return new Intl.NumberFormat(\"en-US\", options).format(value);\n};\n\n/**\n * Format number with compact notation (1K, 1M, etc.)\n */\nexport const toCompactNumber = (\n value: number | null | undefined,\n display: \"short\" | \"long\" = \"short\"\n): string | null => {\n if (isNil(value)) return null;\n\n return new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n compactDisplay: display,\n }).format(value);\n};\n\n/**\n * Format number with scientific notation\n */\nexport const toScientificNotation = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return value.toExponential(decimals);\n};\n\n/**\n * Format as currency\n */\nexport const toCurrency = (\n value: number | null | undefined,\n currency: string = \"USD\",\n options?: Partial<CurrencyFormat>\n): string | null => {\n if (isNil(value)) return null;\n\n const formatOptions: Intl.NumberFormatOptions = {\n style: \"currency\",\n currency,\n currencyDisplay: options?.currencyDisplay ?? \"symbol\",\n useGrouping: options?.thousandsSeparator ?? true,\n };\n\n if (options?.minimumFractionDigits !== undefined) {\n formatOptions.minimumFractionDigits = options.minimumFractionDigits;\n }\n\n if (options?.maximumFractionDigits !== undefined) {\n formatOptions.maximumFractionDigits = options.maximumFractionDigits;\n }\n\n return new Intl.NumberFormat(\"en-US\", formatOptions).format(value);\n};\n\n/**\n * Format number according to NumberFormat specification\n */\nexport const formatNumber = (value: FieldValue, format: NumberFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const options: Intl.NumberFormatOptions = {\n useGrouping: format.thousandsSeparator ?? false,\n };\n\n if (format.decimals !== undefined) {\n options.minimumFractionDigits = format.decimals;\n options.maximumFractionDigits = format.decimals;\n }\n\n if (format.notation) {\n options.notation = format.notation;\n if (format.notation === \"compact\" && format.compactDisplay) {\n options.compactDisplay = format.compactDisplay;\n }\n }\n\n if (format.sign) {\n options.signDisplay = format.sign;\n }\n\n return new Intl.NumberFormat(\"en-US\", options).format(numValue);\n};\n\n/**\n * Format currency according to CurrencyFormat specification\n */\nexport const formatCurrency = (value: FieldValue, format: CurrencyFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n return toCurrency(numValue, format.currency, format);\n};\n\n// Register number formatters\nFormatRegistry.register(\"percentage\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toPercentage(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"integer\", (value) => {\n if (typeof value === \"number\") {\n return toInteger(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"float\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFloat(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"number\", (value, decimals, thousandsSeparator) => {\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (!isNaN(numValue)) {\n return toFormattedNumber(\n numValue,\n typeof decimals === \"number\" ? decimals : undefined,\n typeof thousandsSeparator === \"boolean\" ? thousandsSeparator : true\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"compact\", (value, display) => {\n if (typeof value === \"number\") {\n return toCompactNumber(value, display === \"long\" ? \"long\" : \"short\");\n }\n return null;\n});\n\nFormatRegistry.register(\"scientific\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toScientificNotation(value, typeof decimals === \"number\" ? decimals : 2);\n }\n return null;\n});\n\nFormatRegistry.register(\"currency\", (value, currency, options) => {\n if (typeof value === \"number\") {\n return toCurrency(\n value,\n typeof currency === \"string\" ? currency : \"USD\",\n typeof options === \"object\" && options !== null ? options : {}\n );\n }\n return null;\n});\n","/**\n * Electrical current formatting utilities (flow of electric charge)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { CurrentFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as milliamps\n */\nexport const toMilliamps = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const mA = value * 1000;\n return decimals === 0 ? `${Math.round(mA)} mA` : `${mA.toFixed(decimals)} mA`;\n};\n\n/**\n * Format as amperes\n */\nexport const toAmps = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} A`;\n};\n\n/**\n * Format as kiloamps (rarely used but included for completeness)\n */\nexport const toKiloamps = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kA`;\n};\n\n/**\n * Auto-scale current to the most appropriate unit\n */\nexport const autoScaleCurrent = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1000) {\n return toKiloamps(value, decimals ?? 2);\n } else if (absValue < 1) {\n return toMilliamps(value, decimals ?? 0);\n } else {\n return toAmps(value, decimals ?? 1);\n }\n};\n\n/**\n * Format current according to CurrentFormat specification\n */\nexport const formatCurrent = (value: FieldValue, format: CurrentFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"kA\":\n return toKiloamps(numValue, decimals ?? 2);\n case \"mA\":\n return toMilliamps(numValue, decimals ?? 0);\n case \"A\":\n return toAmps(numValue, decimals ?? 1);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleCurrent(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base amps\n return toAmps(numValue, decimals ?? 1);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"current\", formatCurrent as any);\n\n// Convenience exports with shorter names\nexport const toMA = toMilliamps;\nexport const toA = toAmps;\nexport const toKA = toKiloamps;\n","/**\n * Date formatting utilities using Luxon\n */\n\nimport { DateTime } from \"luxon\";\nimport { FormatRegistry } from \"./registry\";\nimport type { DateFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Convert a value to a Luxon DateTime object.\n * Handles Date objects, ISO strings, and timestamps.\n *\n * @param value - Value to convert (Date, string, number, or null/undefined)\n * @returns Luxon DateTime object or null if invalid\n */\nconst toDateTime = (value: FieldValue): DateTime | null => {\n if (value === null || value === undefined) return null;\n\n if (value instanceof Date) {\n return DateTime.fromJSDate(value);\n }\n\n if (typeof value === \"string\") {\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n }\n\n if (typeof value === \"number\") {\n // Assume it's a timestamp in milliseconds\n const dt = DateTime.fromMillis(value);\n return dt.isValid ? dt : null;\n }\n\n return null;\n};\n\n/**\n * Format date to a localized string with optional time and timezone.\n *\n * @param value - Date value (string, Date object, or timestamp)\n * @param showTime - Whether to include time in the output (default: false)\n * @param timezone - Optional timezone for display (e.g., \"America/New_York\")\n * @returns Formatted date string or null\n *\n * @example\n * ```typescript\n * toDateString(new Date()); // \"12/25/2023\"\n * toDateString(new Date(), true); // \"12/25/2023, 3:30 PM\"\n * toDateString(\"2023-12-25T15:30:00Z\", true, \"America/New_York\"); // \"12/25/2023, 10:30 AM\"\n * ```\n */\nexport const toDateString = (\n value: string | Date | number | null | undefined,\n showTime: boolean = false,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n\n return showTime\n ? dtWithZone.toLocaleString(DateTime.DATETIME_SHORT)\n : dtWithZone.toLocaleString(DateTime.DATE_SHORT);\n};\n\n/**\n * Format date to relative time (e.g., \"2 hours ago\", \"in 3 days\").\n * Automatically chooses the most appropriate unit.\n *\n * @param value - Date value (string, Date object, or timestamp)\n * @returns Relative time string or null\n *\n * @example\n * ```typescript\n * toRelativeTime(new Date(Date.now() - 3600000)); // \"1 hour ago\"\n * toRelativeTime(new Date(Date.now() + 86400000)); // \"in 1 day\"\n * toRelativeTime(new Date()); // \"now\"\n * ```\n */\nexport const toRelativeTime = (value: string | Date | number | null | undefined): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n return dt.toRelative();\n};\n\n/**\n * Format date with full date and time including weekday\n */\nexport const toFullDateTime = (\n value: string | Date | number | null | undefined,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n return dtWithZone.toLocaleString(DateTime.DATETIME_MED_WITH_WEEKDAY);\n};\n\n/**\n * Format date to ISO string\n */\nexport const toISOString = (value: string | Date | number | null | undefined): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return null;\n\n return dt.toISO();\n};\n\n/**\n * Format date with custom format string\n */\nexport const toCustomDateFormat = (\n value: string | Date | number | null | undefined,\n format: string,\n timezone?: string\n): string | null => {\n if (!value) return null;\n\n const dt = toDateTime(value);\n if (!dt) return \"Invalid Date\";\n\n const dtWithZone = timezone ? dt.setZone(timezone) : dt;\n return dtWithZone.toFormat(format);\n};\n\n/**\n * Get formatted date parts\n */\nexport const getDateParts = (value: string | Date | number | null | undefined) => {\n const dt = toDateTime(value);\n if (!dt) return null;\n\n return {\n year: dt.year,\n month: dt.month,\n day: dt.day,\n weekday: dt.weekday,\n hour: dt.hour,\n minute: dt.minute,\n second: dt.second,\n millisecond: dt.millisecond,\n weekdayShort: dt.weekdayShort,\n weekdayLong: dt.weekdayLong,\n monthShort: dt.monthShort,\n monthLong: dt.monthLong,\n };\n};\n\n/**\n * Format date according to DateFormat specification\n */\nexport const formatDate = (value: FieldValue, format: DateFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const dt = toDateTime(value);\n if (!dt) return format.nullText ?? \"Invalid Date\";\n\n const dtWithZone = format.timezone ? dt.setZone(format.timezone) : dt;\n\n // Handle relative time\n if (format.relative) {\n return dtWithZone.toRelative();\n }\n\n // Handle custom format string\n if (format.format) {\n return dtWithZone.toFormat(format.format);\n }\n\n // Handle style-based formatting\n if (format.dateStyle || format.timeStyle) {\n const options: Record<string, unknown> = {};\n\n if (format.dateStyle) {\n switch (format.dateStyle) {\n case \"short\":\n options.date = DateTime.DATE_SHORT;\n break;\n case \"medium\":\n options.date = DateTime.DATE_MED;\n break;\n case \"long\":\n options.date = DateTime.DATE_FULL;\n break;\n case \"full\":\n options.date = DateTime.DATE_HUGE;\n break;\n }\n }\n\n if (format.timeStyle) {\n switch (format.timeStyle) {\n case \"short\":\n options.time = DateTime.TIME_SIMPLE;\n break;\n case \"medium\":\n options.time = DateTime.TIME_WITH_SECONDS;\n break;\n case \"long\":\n case \"full\":\n options.time = DateTime.TIME_WITH_SHORT_OFFSET;\n break;\n }\n }\n\n if (options.date && options.time) {\n return dtWithZone.toLocaleString({ ...options.date, ...options.time });\n } else if (options.date) {\n return dtWithZone.toLocaleString(options.date);\n } else if (options.time) {\n return dtWithZone.toLocaleString(options.time);\n }\n }\n\n // Default formatting\n return dtWithZone.toLocaleString(DateTime.DATETIME_SHORT);\n};\n\n// Register date formatters\nFormatRegistry.register(\"date\", (value, showTime, timezone) => {\n return toDateString(\n value as string | Date | number,\n typeof showTime === \"boolean\" ? showTime : false,\n typeof timezone === \"string\" ? timezone : undefined\n );\n});\n\nFormatRegistry.register(\"relativeTime\", (value) => {\n return toRelativeTime(value as string | Date | number);\n});\n\nFormatRegistry.register(\"fullDateTime\", (value, timezone) => {\n return toFullDateTime(\n value as string | Date | number,\n typeof timezone === \"string\" ? timezone : undefined\n );\n});\n\nFormatRegistry.register(\"isoString\", (value) => {\n return toISOString(value as string | Date | number);\n});\n\nFormatRegistry.register(\"customDateFormat\", (value, format, timezone) => {\n if (typeof format === \"string\") {\n return toCustomDateFormat(\n value as string | Date | number,\n format,\n typeof timezone === \"string\" ? timezone : undefined\n );\n }\n return null;\n});\n","/**\n * Distance and length formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { DistanceFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as meters\n */\nexport const toMeters = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} m`;\n};\n\n/**\n * Format as centimeters\n */\nexport const toCentimeters = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value * 100).toFixed(decimals)} cm`;\n};\n\n/**\n * Format as millimeters\n */\nexport const toMillimeters = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${(value * 1000).toFixed(decimals)} mm`;\n};\n\n/**\n * Format as kilometers\n */\nexport const toKilometers = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} km`;\n};\n\n/**\n * Format as feet\n */\nexport const toFeet = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} ft`;\n};\n\n/**\n * Format as inches\n */\nexport const toInches = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} in`;\n};\n\n/**\n * Format as miles\n */\nexport const toMiles = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} mi`;\n};\n\n/**\n * Format as yards\n */\nexport const toYards = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} yd`;\n};\n\n/**\n * Format as nautical miles\n */\nexport const toNauticalMiles = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} nm`;\n};\n\n/**\n * Conversion utilities\n */\nexport const metersToFeet = (meters: number): number => meters * 3.28084;\nexport const feetToMeters = (feet: number): number => feet / 3.28084;\nexport const milesToKilometers = (miles: number): number => miles * 1.60934;\nexport const kilometersToMiles = (km: number): number => km / 1.60934;\nexport const feetToMiles = (feet: number): number => feet / 5280;\nexport const milesToFeet = (miles: number): number => miles * 5280;\nexport const metersToMiles = (meters: number): number => meters / 1609.34;\nexport const milesToMeters = (miles: number): number => miles * 1609.34;\nexport const yardsToMeters = (yards: number): number => yards * 0.9144;\nexport const metersToYards = (meters: number): number => meters / 0.9144;\nexport const inchesToCentimeters = (inches: number): number => inches * 2.54;\nexport const centimetersToInches = (cm: number): number => cm / 2.54;\n\n/**\n * Auto-scale distance to the most appropriate unit\n */\nexport const autoScaleDistance = (\n value: number | null | undefined,\n metric: boolean = false,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (metric) {\n // Assuming value is in meters\n if (absValue >= 1000) {\n return toKilometers(value, decimals);\n } else if (absValue < 0.01) {\n return toMillimeters(value * 1000, 0);\n } else if (absValue < 1) {\n return toCentimeters(value * 100, decimals);\n } else {\n return toMeters(value, decimals);\n }\n } else {\n // Assuming value is in miles for imperial\n if (absValue < 0.01) {\n // Convert to feet\n return toFeet(milesToFeet(value), 0);\n } else if (absValue < 0.1) {\n // Convert to yards\n return toYards(milesToFeet(value) / 3, 0);\n } else {\n return toMiles(value, decimals);\n }\n }\n};\n\n/**\n * Format distance according to DistanceFormat specification\n */\nexport const formatDistance = (value: FieldValue, format: DistanceFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 1;\n\n if (format.autoScale) {\n const isMetric = format.unit === \"m\" || format.unit === \"km\";\n return autoScaleDistance(numValue, isMetric, decimals);\n }\n\n switch (format.unit) {\n case \"km\":\n return toKilometers(numValue, decimals);\n case \"ft\":\n return toFeet(numValue, decimals);\n case \"mi\":\n return toMiles(numValue, decimals);\n case \"yd\":\n return toYards(numValue, decimals);\n case \"m\":\n default:\n return toMeters(numValue, decimals);\n }\n};\n\n// Register distance formatters\nFormatRegistry.register(\"miles\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toMiles(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"kilometers\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toKilometers(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"meters\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toMeters(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"feet\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFeet(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"yards\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toYards(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"inches\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toInches(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\nFormatRegistry.register(\"autoScaleDistance\", (value, metric, decimals) => {\n if (typeof value === \"number\") {\n return autoScaleDistance(\n value,\n typeof metric === \"boolean\" ? metric : false,\n typeof decimals === \"number\" ? decimals : 1\n );\n }\n return null;\n});\n","/**\n * Energy formatting utilities (stored or consumed energy)\n * For power (rate of energy), use power.ts\n * For electrical units (voltage, current), use voltage.ts and current.ts\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { EnergyFormat, FieldValue, FormattedValue } from \"./types\";\n\n/**\n * Format as Watt-hours\n */\nexport const toWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} Wh`;\n};\n\n/**\n * Format as kilowatt-hours\n */\nexport const tokWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kWh`;\n};\n\n/**\n * Format as megawatt-hours\n */\nexport const toMWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MWh`;\n};\n\n/**\n * Format as gigawatt-hours\n */\nexport const toGWh = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000_000).toFixed(decimals)} GWh`;\n};\n\n/**\n * Auto-scale energy to the most appropriate unit\n */\nexport const autoScaleEnergy = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000_000) {\n return toGWh(value, decimals);\n } else if (absValue >= 1_000_000) {\n return toMWh(value, decimals);\n } else if (absValue >= 1000) {\n return tokWh(value, decimals);\n } else {\n return toWh(value, decimals);\n }\n};\n\n// Power formatting has been moved to power.ts\n\n/**\n * Format energy according to EnergyFormat specification\n */\nexport const formatEnergy = (value: FieldValue, format: EnergyFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 1;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"GWh\":\n return toGWh(numValue, decimals);\n case \"MWh\":\n return toMWh(numValue, decimals);\n case \"kWh\":\n return tokWh(numValue, decimals);\n case \"Wh\":\n return toWh(numValue, decimals);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleEnergy(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base Wh\n return toWh(numValue, decimals);\n};\n\n// Electrical units have been moved to voltage.ts and current.ts\n// Resistance units (Ohms) could be moved to a separate resistance.ts if needed\n\n// Register energy and power formatters\nFormatRegistry.register(\"kWh\", (value) => {\n if (typeof value === \"number\") return tokWh(value);\n return null;\n});\n\n// Power formatters are now in power.ts\n\nFormatRegistry.register(\"autoScaleEnergy\", (value, decimals) => {\n if (typeof value === \"number\") {\n return autoScaleEnergy(value, typeof decimals === \"number\" ? decimals : 1);\n }\n return null;\n});\n\n// Auto-scale power is now in power.ts\n\n// Register the energy formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"energy\", formatEnergy as any);\n","/**\n * Phone number formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, PhoneFormat } from \"./types\";\n\n/**\n * Format US phone number\n */\nexport const formatUSPhone = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Remove all non-digits\n const cleaned = phone.replace(/\\D/g, \"\");\n\n // Check if it's a valid US phone number (10 or 11 digits)\n if (cleaned.length === 10) {\n return cleaned.replace(/(\\d{3})(\\d{3})(\\d{4})/, \"($1) $2-$3\");\n } else if (cleaned.length === 11 && cleaned.startsWith(\"1\")) {\n return cleaned.replace(/1(\\d{3})(\\d{3})(\\d{4})/, \"+1 ($1) $2-$3\");\n }\n\n // Return original if not a valid format\n return phone;\n};\n\n/**\n * Format international phone number\n */\nexport const formatInternationalPhone = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Remove all non-digits except +\n const cleaned = phone.replace(/[^\\d+]/g, \"\");\n\n // If it starts with +, format as international\n if (cleaned.startsWith(\"+\")) {\n // Try to format common patterns\n if (cleaned.length === 12 && cleaned.startsWith(\"+1\")) {\n // US/Canada\n return cleaned.replace(/\\+1(\\d{3})(\\d{3})(\\d{4})/, \"+1 ($1) $2-$3\");\n } else if (cleaned.length === 13 && cleaned.startsWith(\"+44\")) {\n // UK\n return cleaned.replace(/\\+44(\\d{2})(\\d{4})(\\d{4})/, \"+44 $1 $2 $3\");\n }\n // Add spaces every 3-4 digits for other countries\n return cleaned.replace(/(\\+\\d{1,3})(\\d{3,4})(\\d{3,4})(\\d{3,4})?/, \"$1 $2 $3 $4\").trim();\n }\n\n // Default to US format if no country code\n return formatUSPhone(phone);\n};\n\n/**\n * Format phone number with basic formatting\n */\nexport const formatPhoneNumber = (phone: string | null | undefined): string | null => {\n if (!phone) return null;\n\n // Try to detect if it's international\n if (phone.startsWith(\"+\") || phone.length > 11) {\n return formatInternationalPhone(phone);\n }\n\n return formatUSPhone(phone);\n};\n\n/**\n * Format phone according to PhoneFormat specification\n */\nexport const formatPhone = (value: FieldValue, format: PhoneFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const phoneStr = String(value);\n\n if (format.international) {\n return formatInternationalPhone(phoneStr);\n }\n\n // Handle specific country formats if needed\n switch (format.country) {\n case \"US\":\n case \"CA\":\n return formatUSPhone(phoneStr);\n default:\n return formatPhoneNumber(phoneStr);\n }\n};\n\n// Register formatters\nFormatRegistry.register(\"phoneNumber\", (value) => {\n if (typeof value === \"string\") {\n return formatPhoneNumber(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"usPhone\", (value) => {\n if (typeof value === \"string\") {\n return formatUSPhone(value);\n }\n return null;\n});\n\nFormatRegistry.register(\"internationalPhone\", (value) => {\n if (typeof value === \"string\") {\n return formatInternationalPhone(value);\n }\n return null;\n});\n","/**\n * Power formatting utilities (rate of energy transfer)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, PowerFormat } from \"./types\";\n\n/**\n * Format as Watts\n */\nexport const toWatts = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return decimals === 0 ? `${Math.round(value)} W` : `${value.toFixed(decimals)} W`;\n};\n\n/**\n * Format as kilowatts\n */\nexport const toKilowatts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kW`;\n};\n\n/**\n * Format as megawatts\n */\nexport const toMegawatts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MW`;\n};\n\n/**\n * Format as gigawatts\n */\nexport const toGigawatts = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000_000).toFixed(decimals)} GW`;\n};\n\n/**\n * Auto-scale power to the most appropriate unit\n */\nexport const autoScalePower = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000_000) {\n return toGigawatts(value, decimals ?? 2);\n } else if (absValue >= 1_000_000) {\n return toMegawatts(value, decimals ?? 1);\n } else if (absValue >= 1000) {\n return toKilowatts(value, decimals ?? 1);\n } else {\n return toWatts(value, decimals ?? 0);\n }\n};\n\n/**\n * Format power according to PowerFormat specification\n */\nexport const formatPower = (value: FieldValue, format: PowerFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"GW\":\n return toGigawatts(numValue, decimals ?? 2);\n case \"MW\":\n return toMegawatts(numValue, decimals ?? 1);\n case \"kW\":\n return toKilowatts(numValue, decimals ?? 1);\n case \"W\":\n return toWatts(numValue, decimals ?? 0);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScalePower(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base watts\n return toWatts(numValue, decimals ?? 0);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"power\", formatPower as any);\n\n// Convenience exports with shorter names\nexport const toW = toWatts;\nexport const toKW = toKilowatts;\nexport const toMW = toMegawatts;\nexport const toGW = toGigawatts;\n","/**\n * Electrical resistance formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, ResistanceFormat } from \"./types\";\n\n/**\n * Format as milliohms\n */\nexport const toMilliohms = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n const mOhms = value * 1000;\n return `${mOhms.toFixed(decimals)} mΩ`;\n};\n\n/**\n * Format as ohms\n */\nexport const toOhms = (value: number | null | undefined, decimals: number = 1): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)} Ω`;\n};\n\n/**\n * Format as kilohms\n */\nexport const toKilohms = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kΩ`;\n};\n\n/**\n * Format as megohms\n */\nexport const toMegohms = (\n value: number | null | undefined,\n decimals: number = 2\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1_000_000).toFixed(decimals)} MΩ`;\n};\n\n/**\n * Auto-scale resistance to the most appropriate unit\n */\nexport const autoScaleResistance = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1_000_000) {\n return toMegohms(value, decimals ?? 2);\n } else if (absValue >= 1000) {\n return toKilohms(value, decimals ?? 1);\n } else if (absValue < 1) {\n return toMilliohms(value, decimals ?? 1);\n } else {\n return toOhms(value, decimals ?? 1);\n }\n};\n\n/**\n * Format resistance according to ResistanceFormat specification\n */\nexport const formatResistance = (value: FieldValue, format: ResistanceFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"MΩ\":\n return toMegohms(numValue, decimals ?? 2);\n case \"kΩ\":\n return toKilohms(numValue, decimals ?? 1);\n case \"mΩ\":\n return toMilliohms(numValue, decimals ?? 1);\n case \"Ω\":\n return toOhms(numValue, decimals ?? 1);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleResistance(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base ohms\n return toOhms(numValue, decimals ?? 1);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"resistance\", formatResistance as any);\n\n// Register legacy shortcuts\nFormatRegistry.register(\"ohms\", (value) => {\n if (typeof value === \"number\") return toOhms(value);\n return null;\n});\n\nFormatRegistry.register(\"milliohms\", (value) => {\n if (typeof value === \"number\") return toMilliohms(value);\n return null;\n});\n","/**\n * Temperature formatting utilities\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type {\n FieldValue,\n FormattedValue,\n TemperatureFormat,\n TemperatureUnit,\n TemperatureUnitString,\n} from \"./types\";\n\n/**\n * Convert temperature unit string to symbol\n */\nexport const temperatureStringToSymbol = (unit: TemperatureUnitString): TemperatureUnit => {\n switch (unit) {\n case \"FAHRENHEIT\":\n return \"F\";\n case \"CELSIUS\":\n return \"C\";\n case \"KELVIN\":\n return \"K\";\n default:\n return \"F\";\n }\n};\n\n/**\n * Format as Fahrenheit\n */\nexport const toFahrenheit = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n return `${value.toFixed(decimals)}°F`;\n};\n\n/**\n * Format as Celsius\n */\nexport const toCelsius = (\n value: number | null | undefined,\n fromFahrenheit: boolean = true,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const celsius = fromFahrenheit ? (value - 32) * (5 / 9) : value;\n return `${celsius.toFixed(decimals)}°C`;\n};\n\n/**\n * Format as Kelvin\n */\nexport const toKelvin = (\n value: number | null | undefined,\n fromFahrenheit: boolean = true,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const kelvin = fromFahrenheit ? (value - 32) * (5 / 9) + 273.15 : value + 273.15;\n return `${kelvin.toFixed(decimals)}K`;\n};\n\n/**\n * Convert Celsius to Fahrenheit\n */\nexport const celsiusToFahrenheit = (celsius: number): number => {\n return (celsius * 9) / 5 + 32;\n};\n\n/**\n * Convert Fahrenheit to Celsius\n */\nexport const fahrenheitToCelsius = (fahrenheit: number): number => {\n return (fahrenheit - 32) * (5 / 9);\n};\n\n/**\n * Convert Celsius to Kelvin\n */\nexport const celsiusToKelvin = (celsius: number): number => {\n return celsius + 273.15;\n};\n\n/**\n * Convert Kelvin to Celsius\n */\nexport const kelvinToCelsius = (kelvin: number): number => {\n return kelvin - 273.15;\n};\n\n/**\n * Convert Fahrenheit to Kelvin\n */\nexport const fahrenheitToKelvin = (fahrenheit: number): number => {\n return fahrenheitToCelsius(fahrenheit) + 273.15;\n};\n\n/**\n * Convert Kelvin to Fahrenheit\n */\nexport const kelvinToFahrenheit = (kelvin: number): number => {\n return celsiusToFahrenheit(kelvinToCelsius(kelvin));\n};\n\n/**\n * Format temperature with specified unit\n */\nexport const toTemperature = (\n value: number | null | undefined,\n unit: TemperatureUnit | TemperatureUnitString = \"F\",\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n\n const normalizedUnit =\n typeof unit === \"string\" && unit.length > 1\n ? temperatureStringToSymbol(unit as TemperatureUnitString)\n : (unit as TemperatureUnit);\n\n switch (normalizedUnit) {\n case \"C\":\n return toCelsius(value, true, decimals);\n case \"K\":\n return toKelvin(value, true, decimals);\n case \"F\":\n default:\n return toFahrenheit(value, decimals);\n }\n};\n\n/**\n * Format temperature according to TemperatureFormat specification\n */\nexport const formatTemperature = (value: FieldValue, format: TemperatureFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals ?? 0;\n const unit = format.unit ?? \"F\";\n\n if (format.showUnit === false) {\n const normalizedUnit =\n typeof unit === \"string\" && unit.length > 1\n ? temperatureStringToSymbol(unit as TemperatureUnitString)\n : (unit as TemperatureUnit);\n\n switch (normalizedUnit) {\n case \"C\": {\n const celsius = (numValue - 32) * (5 / 9);\n return celsius.toFixed(decimals);\n }\n case \"K\": {\n const kelvin = (numValue - 32) * (5 / 9) + 273.15;\n return kelvin.toFixed(decimals);\n }\n case \"F\":\n default:\n return numValue.toFixed(decimals);\n }\n }\n\n return toTemperature(numValue, unit, decimals);\n};\n\n// Register temperature formatters\nFormatRegistry.register(\"temperature\", (value, unit, decimals) => {\n if (typeof value === \"number\") {\n return toTemperature(\n value,\n typeof unit === \"string\" ? (unit as TemperatureUnit | TemperatureUnitString) : \"F\",\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"fahrenheit\", (value, decimals) => {\n if (typeof value === \"number\") {\n return toFahrenheit(value, typeof decimals === \"number\" ? decimals : 0);\n }\n return null;\n});\n\nFormatRegistry.register(\"celsius\", (value, fromFahrenheit, decimals) => {\n if (typeof value === \"number\") {\n return toCelsius(\n value,\n typeof fromFahrenheit === \"boolean\" ? fromFahrenheit : true,\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n\nFormatRegistry.register(\"kelvin\", (value, fromFahrenheit, decimals) => {\n if (typeof value === \"number\") {\n return toKelvin(\n value,\n typeof fromFahrenheit === \"boolean\" ? fromFahrenheit : true,\n typeof decimals === \"number\" ? decimals : 0\n );\n }\n return null;\n});\n","/**\n * Text formatting utilities\n */\n\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, TextFormat } from \"./types\";\n\n/**\n * Check if a value should be hidden based on format rules\n */\nconst shouldHideValue = (\n value: FieldValue,\n format: { hideWhenNull?: boolean; hideWhenZero?: boolean }\n): boolean => {\n if (format.hideWhenNull && (value === null || value === undefined)) {\n return true;\n }\n if (format.hideWhenZero && value === 0) {\n return true;\n }\n return false;\n};\n\n/**\n * Convert text to uppercase\n */\nexport const toUpperCase = (text: string | null | undefined): string => {\n return text?.toUpperCase() ?? \"\";\n};\n\n/**\n * Convert text to lowercase\n */\nexport const toLowerCase = (text: string | null | undefined): string => {\n return text?.toLowerCase() ?? \"\";\n};\n\n/**\n * Convert text to sentence case (first letter capitalized, rest lowercase).\n *\n * @param text - Text to convert\n * @returns Sentence-cased text\n *\n * @example\n * ```typescript\n * toSentenceCase(\"HELLO WORLD\"); // \"Hello world\"\n * toSentenceCase(\"hello world\"); // \"Hello world\"\n * ```\n */\nexport const toSentenceCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n};\n\n/**\n * Convert text to title case with proper handling of articles and prepositions.\n * Capitalizes the first letter of each word except common articles/prepositions\n * (unless they're the first word).\n *\n * @param text - Text to convert\n * @returns Title-cased text\n *\n * @example\n * ```typescript\n * toTitleCase(\"the quick brown fox\"); // \"The Quick Brown Fox\"\n * toTitleCase(\"war and peace\"); // \"War and Peace\"\n * toTitleCase(\"to be or not to be\"); // \"To Be or Not to Be\"\n * ```\n */\nexport const toTitleCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n const articles = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"and\",\n \"but\",\n \"or\",\n \"for\",\n \"nor\",\n \"on\",\n \"at\",\n \"of\",\n \"to\",\n \"with\",\n \"in\",\n \"as\",\n \"by\",\n ]);\n\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n articles.has(word) && index !== 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n};\n\n/**\n * Capitalize first letter of each word\n */\nexport const capitalize = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n};\n\n/**\n * Uppercase first letter only\n */\nexport const ucFirst = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text.charAt(0).toUpperCase() + text.slice(1);\n};\n\n/**\n * Convert camelCase to words\n */\nexport const camelCaseToWords = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n};\n\n/**\n * Convert snake_case to words\n */\nexport const snakeCaseToWords = (text: string | null | undefined): string => {\n if (!text) return \"\";\n return text\n .toLowerCase()\n .split(\"_\")\n .map((word) => ucFirst(word))\n .join(\" \");\n};\n\n/**\n * Convert enum-style text to sentence case\n */\nexport const enumToSentenceCase = (text: string | null | undefined): string => {\n if (!text) return \"\";\n\n // Handle snake_case\n if (text.includes(\"_\")) {\n return snakeCaseToWords(text);\n }\n\n // Handle SCREAMING_CASE\n if (text.toUpperCase() === text) {\n return ucFirst(text.toLowerCase());\n }\n\n // Handle camelCase\n return camelCaseToWords(text);\n};\n\n/**\n * Truncate text in the middle\n */\nexport const truncateMiddle = (value: string | null | undefined, length: number = 16): string => {\n if (!value) return \"\";\n\n // Handle invalid length\n if (length < 5) return value;\n\n // Handle case where specified length is longer than string\n if (value.length <= length) return value;\n\n const totalChars = length - 3; // Account for ...\n const leadingChars = Math.ceil(totalChars / 2);\n const trailingChars = Math.floor(totalChars / 2);\n\n return `${value.slice(0, leadingChars)}...${value.slice(-trailingChars)}`;\n};\n\n/**\n * Truncate text at the start\n */\nexport const truncateStart = (value: string | null | undefined, length: number = 8): string => {\n if (!value) return \"\";\n if (value.length <= length) return value;\n return `...${value.slice(-length)}`;\n};\n\n/**\n * Truncate text at the end\n */\nexport const truncateEnd = (\n value: string | null | undefined,\n length: number = 16,\n ellipsis: string = \"...\"\n): string => {\n if (!value) return \"\";\n if (value.length <= length) return value;\n return value.slice(0, length) + ellipsis;\n};\n\n/**\n * Mask sensitive text (e.g., secrets, API keys)\n */\nexport const toSecret = (value: string | null | undefined): string => {\n if (!value) return \"\";\n const str = value.toString();\n const lastFour = str.slice(-4);\n const maskedLength = str.length - 4;\n return maskedLength > 0 ? \"*\".repeat(maskedLength) + lastFour : str;\n};\n\n/**\n * Format text according to TextFormat specification\n */\nexport const formatText = (value: FieldValue, format: TextFormat): FormattedValue => {\n if (shouldHideValue(value, format)) return null;\n if (value == null) return format.nullText ?? null;\n\n let formatted = String(value);\n\n // Apply transforms\n if (format.transform) {\n const transforms = Array.isArray(format.transform) ? format.transform : [format.transform];\n\n transforms.forEach((transform) => {\n switch (transform) {\n case \"uppercase\":\n formatted = toUpperCase(formatted);\n break;\n case \"lowercase\":\n formatted = toLowerCase(formatted);\n break;\n case \"capitalize\":\n formatted = capitalize(formatted);\n break;\n case \"titleCase\":\n formatted = toTitleCase(formatted);\n break;\n case \"sentenceCase\":\n formatted = toSentenceCase(formatted);\n break;\n }\n });\n }\n\n // Apply truncation\n if (format.truncate) {\n const { length, position, ellipsis = \"...\" } = format.truncate;\n switch (position) {\n case \"start\":\n formatted = truncateStart(formatted, length);\n break;\n case \"middle\":\n formatted = truncateMiddle(formatted, length);\n break;\n case \"end\":\n formatted = truncateEnd(formatted, length, ellipsis);\n break;\n }\n }\n\n return formatted;\n};\n\n// Register text formatters\nFormatRegistry.register(\"uppercase\", (value) => toUpperCase(String(value)));\nFormatRegistry.register(\"lowercase\", (value) => toLowerCase(String(value)));\nFormatRegistry.register(\"sentenceCase\", (value) => toSentenceCase(String(value)));\nFormatRegistry.register(\"titleCase\", (value) => toTitleCase(String(value)));\nFormatRegistry.register(\"capitalize\", (value) => capitalize(String(value)));\nFormatRegistry.register(\"camelCaseToWords\", (value) => camelCaseToWords(String(value)));\nFormatRegistry.register(\"snakeCaseToWords\", (value) => snakeCaseToWords(String(value)));\nFormatRegistry.register(\"enumToSentenceCase\", (value) => enumToSentenceCase(String(value)));\nFormatRegistry.register(\"truncateMiddle\", (value, length) =>\n truncateMiddle(String(value), typeof length === \"number\" ? length : 16)\n);\nFormatRegistry.register(\"truncateStart\", (value, length) =>\n truncateStart(String(value), typeof length === \"number\" ? length : 8)\n);\nFormatRegistry.register(\"truncateEnd\", (value, length, ellipsis) =>\n truncateEnd(\n String(value),\n typeof length === \"number\" ? length : 16,\n typeof ellipsis === \"string\" ? ellipsis : \"...\"\n )\n);\nFormatRegistry.register(\"secret\", (value) => toSecret(String(value)));\n","/**\n * Voltage formatting utilities (electrical potential)\n */\n\nimport { isNil } from \"./number\";\nimport { FormatRegistry } from \"./registry\";\nimport type { FieldValue, FormattedValue, VoltageFormat } from \"./types\";\n\n/**\n * Format as millivolts\n */\nexport const toMillivolts = (\n value: number | null | undefined,\n decimals: number = 0\n): string | null => {\n if (isNil(value)) return null;\n const mV = value * 1000;\n return decimals === 0 ? `${Math.round(mV)} mV` : `${mV.toFixed(decimals)} mV`;\n};\n\n/**\n * Format as volts\n */\nexport const toVolts = (value: number | null | undefined, decimals: number = 0): string | null => {\n if (isNil(value)) return null;\n return decimals === 0 ? `${Math.round(value)} V` : `${value.toFixed(decimals)} V`;\n};\n\n/**\n * Format as kilovolts\n */\nexport const toKilovolts = (\n value: number | null | undefined,\n decimals: number = 1\n): string | null => {\n if (isNil(value)) return null;\n return `${(value / 1000).toFixed(decimals)} kV`;\n};\n\n/**\n * Auto-scale voltage to the most appropriate unit\n */\nexport const autoScaleVoltage = (\n value: number | null | undefined,\n decimals?: number\n): string | null => {\n if (isNil(value)) return null;\n\n const absValue = Math.abs(value);\n\n if (absValue >= 1000) {\n return toKilovolts(value, decimals ?? 1);\n } else if (absValue < 1) {\n return toMillivolts(value, decimals ?? 0);\n } else {\n return toVolts(value, decimals ?? 0);\n }\n};\n\n/**\n * Format voltage according to VoltageFormat specification\n */\nexport const formatVoltage = (value: FieldValue, format: VoltageFormat): FormattedValue => {\n if (format.hideWhenNull && (value === null || value === undefined)) return null;\n if (format.hideWhenZero && value === 0) return null;\n if (value == null) return format.nullText ?? null;\n\n const numValue = typeof value === \"string\" ? parseFloat(value) : Number(value);\n if (isNaN(numValue)) return format.nullText ?? null;\n\n const decimals = format.decimals;\n\n // If a specific unit is provided, use it\n if (format.unit) {\n switch (format.unit) {\n case \"kV\":\n return toKilovolts(numValue, decimals ?? 1);\n case \"mV\":\n return toMillivolts(numValue, decimals ?? 0);\n case \"V\":\n return toVolts(numValue, decimals ?? 0);\n }\n }\n\n // Default to auto-scaling unless explicitly disabled\n if (format.autoScale !== false) {\n return autoScaleVoltage(numValue, decimals);\n }\n\n // If auto-scale is explicitly false and no unit specified, use base volts\n return toVolts(numValue, decimals ?? 0);\n};\n\n// Register the formatter\n// biome-ignore lint/suspicious/noExplicitAny: Required for FormatRegistry type compatibility\nFormatRegistry.register(\"voltage\", formatVoltage as any);\n\n// Convenience exports with shorter names\nexport const toMV = toMillivolts;\nexport const toV = toVolts;\nexport const toKV = toKilovolts;\n","/**\n * Comprehensive formatting utilities for the Edges design system\n *\n * This module provides a unified formatting system with support for:\n * - Text formatting (case conversion, truncation, etc.)\n * - Number formatting (decimals, thousands separators, compact notation)\n * - Currency formatting (multiple currencies and display options)\n * - Date formatting (relative time, custom formats, timezones)\n * - Boolean formatting (custom true/false text)\n * - Energy units (Wh, kWh, MWh, GWh with auto-scaling)\n * - Temperature units (Celsius, Fahrenheit, Kelvin)\n * - Distance units (meters, kilometers, miles, feet)\n * - Phone number formatting (US and international)\n * - Custom formatters via the FormatRegistry\n */\n\nexport * from \"./boolean\";\nexport * from \"./component-formatter\";\nexport * from \"./current\";\nexport * from \"./date\";\nexport * from \"./distance\";\nexport * from \"./energy\";\nexport * from \"./number\";\nexport * from \"./phone\";\nexport * from \"./power\";\n// Export the registry\nexport { FormatRegistry } from \"./registry\";\nexport * from \"./resistance\";\nexport * from \"./temperature\";\n// Export all formatting utilities\nexport * from \"./text\";\n// Export all types\nexport * from \"./types\";\nexport * from \"./voltage\";\n\nimport { formatBoolean } from \"./boolean\";\nimport { formatCurrent } from \"./current\";\nimport { formatDate } from \"./date\";\nimport { formatDistance } from \"./distance\";\nimport { formatEnergy } from \"./energy\";\nimport { formatCurrency, formatNumber } from \"./number\";\nimport { formatPhone } from \"./phone\";\nimport { formatPower } from \"./power\";\nimport { formatResistance } from \"./resistance\";\nimport { formatTemperature } from \"./temperature\";\nimport { formatText } from \"./text\";\n// Import types for the main formatting function\nimport type { CustomFormat, FieldFormat, FieldValue, FormattedValue } from \"./types\";\nimport { formatVoltage } from \"./voltage\";\n\n/**\n * Main formatting function that routes to the appropriate formatter\n * based on the format type\n *\n * @param value - The value to format\n * @param format - The format specification\n * @returns The formatted value or null\n *\n * @example\n * ```typescript\n * // Format as currency\n * formatFieldValue(1234.56, { type: \"currency\", currency: \"USD\" })\n * // Returns: \"$1,234.56\"\n *\n * // Format as relative time\n * formatFieldValue(new Date(), { type: \"date\", relative: true })\n * // Returns: \"just now\"\n *\n * // Format with custom formatter\n * formatFieldValue(\"hello\", {\n * type: \"custom\",\n * formatter: (val) => String(val).toUpperCase()\n * })\n * // Returns: \"HELLO\"\n * ```\n */\nexport const formatFieldValue = (value: FieldValue, format: FieldFormat): FormattedValue => {\n switch (format.type) {\n case \"text\":\n return formatText(value, format);\n case \"number\":\n return formatNumber(value, format);\n case \"currency\":\n return formatCurrency(value, format);\n case \"date\":\n return formatDate(value, format);\n case \"boolean\":\n return formatBoolean(value, format);\n case \"energy\":\n return formatEnergy(value, format);\n case \"power\":\n return formatPower(value, format);\n case \"voltage\":\n return formatVoltage(value, format);\n case \"current\":\n return formatCurrent(value, format);\n case \"resistance\":\n return formatResistance(value, format);\n case \"temperature\":\n return formatTemperature(value, format);\n case \"distance\":\n return formatDistance(value, format);\n case \"phone\":\n return formatPhone(value, format);\n case \"custom\": {\n const customFormat = format as CustomFormat;\n if (customFormat.hideWhenNull && (value === null || value === undefined)) {\n return null;\n }\n if (value == null) return customFormat.nullText ?? null;\n return customFormat.formatter(value, customFormat.options);\n }\n default:\n // Fallback to string conversion\n return value != null ? String(value) : null;\n }\n};\n\n/**\n * Convenience function to create a format object\n *\n * @example\n * ```typescript\n * const currencyFormat = createFormat(\"currency\", { currency: \"EUR\" });\n * const dateFormat = createFormat(\"date\", { relative: true });\n * ```\n */\nexport const createFormat = <T extends FieldFormat[\"type\"]>(\n type: T,\n options?: Omit<Extract<FieldFormat, { type: T }>, \"type\">\n): Extract<FieldFormat, { type: T }> => {\n return { type, ...options } as Extract<FieldFormat, { type: T }>;\n};\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","\"use client\";\nimport { ReactNode } from \"react\";\nimport type { MenuItemProps } from \"react-aria-components\";\nimport { Menu, MenuItem, MenuTrigger, Popover } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport interface ActionItem {\n /**\n * Unique identifier for the action\n */\n id: number | string;\n /**\n * Display name for the action\n */\n name: string;\n /**\n * Visual variant of the action\n */\n variant?: \"default\" | \"destructive\";\n /**\n * Icon to display with the action\n */\n iconName?: IconName;\n /**\n * Whether the action is disabled\n */\n disabled?: boolean;\n /**\n * Handler for when the action is selected\n */\n onAction?: () => void;\n /**\n * Test ID for testing\n */\n testId?: string;\n}\n\nexport interface ActionMenuProps {\n /**\n * List of actions to display\n */\n items: ActionItem[];\n /**\n * Trigger button component\n */\n children: ReactNode;\n /**\n * Alignment of the popover\n * @default \"left\"\n */\n align?: \"left\" | \"right\";\n /**\n * Size of menu items\n * @default \"md\"\n */\n size?: \"sm\" | \"md\";\n /**\n * Text alignment within menu items\n * @default \"left\"\n */\n textAlign?: \"left\" | \"right\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Global action handler (called if item doesn't have its own onAction)\n */\n onAction?: (item: ActionItem) => void;\n}\n\n/**\n * ActionMenu\n *\n * A dropdown menu for actions, typically triggered by a button.\n * Supports icons, destructive actions, and flexible alignment.\n */\nexport function ActionMenu({\n children,\n items,\n className,\n align = \"left\",\n textAlign = \"left\",\n size = \"md\",\n onAction,\n}: ActionMenuProps) {\n return (\n <div className={className}>\n <MenuTrigger>\n {children}\n <Popover\n className={twMerge(\n \"w-fit min-w-[180px] overflow-auto rounded-md border border-border-default\",\n \"bg-background-surface p-1 shadow-lg\",\n \"entering:animate-in entering:fade-in entering:zoom-in-95\",\n \"exiting:animate-out exiting:fade-out exiting:zoom-out-95\"\n )}\n placement={align === \"right\" ? \"bottom end\" : \"bottom start\"}\n >\n <Menu className=\"outline-none\">\n {items.map((item) => (\n <ActionMenuItem\n key={item.id}\n id={item.id}\n onAction={() => item.onAction?.() || onAction?.(item)}\n textAlign={textAlign}\n size={size}\n iconName={item.iconName}\n isDisabled={item.disabled}\n variant={item.variant}\n data-testid={item.testId}\n >\n {item.name}\n </ActionMenuItem>\n ))}\n </Menu>\n </Popover>\n </MenuTrigger>\n </div>\n );\n}\n\ninterface ActionMenuItemProps extends Omit<MenuItemProps, \"children\"> {\n children: ReactNode;\n textAlign?: \"left\" | \"right\";\n size?: \"sm\" | \"md\";\n iconName?: IconName;\n variant?: \"default\" | \"destructive\";\n}\n\nfunction ActionMenuItem({\n textAlign = \"left\",\n iconName,\n size = \"md\",\n isDisabled,\n children,\n variant = \"default\",\n ...props\n}: ActionMenuItemProps) {\n const sizeClasses = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n };\n\n const variantClasses = {\n default: \"text-text-body hover:bg-background-hover focus:bg-background-hover\",\n destructive:\n \"text-feedback-error-text hover:bg-feedback-error-background focus:bg-feedback-error-background\",\n };\n\n return (\n <MenuItem\n {...props}\n isDisabled={isDisabled}\n className={twMerge(\n \"group box-border flex w-full cursor-pointer items-center rounded-sm outline-none transition-colors\",\n sizeClasses[size],\n variantClasses[variant],\n textAlign === \"right\" ? \"justify-end\" : \"justify-start\",\n isDisabled && \"pointer-events-none opacity-50\"\n )}\n >\n {iconName && textAlign === \"left\" && (\n <Icon name={iconName} size={size === \"sm\" ? 16 : 20} className=\"mr-2 flex-shrink-0\" />\n )}\n <span className=\"flex-1\">{children}</span>\n {iconName && textAlign === \"right\" && (\n <Icon name={iconName} size={size === \"sm\" ? 16 : 20} className=\"ml-2 flex-shrink-0\" />\n )}\n </MenuItem>\n );\n}\n","export interface LogoProps {\n className?: string;\n showWordmark?: boolean;\n width?: number;\n fill?: string;\n}\n\n/**\n * Logo\n *\n * Brand logo component with optional wordmark.\n * Supports customizable sizing and fill colors with theme-aware defaults.\n */\nexport const Logo = ({ className, showWordmark = true, width, fill }: LogoProps) => {\n // Support both fill prop and className for backward compatibility\n // Priority: fill prop > className > default (theme-aware text color)\n\n // Determine the fill value\n let fillValue: string | undefined;\n let fillClass: string | undefined;\n\n if (fill) {\n // If fill starts with \"fill-\", it's a Tailwind class\n if (fill.startsWith(\"fill-\")) {\n fillClass = fill;\n } else {\n // Otherwise, use it as a direct fill value\n fillValue = fill;\n }\n } else if (className) {\n // Use className if provided\n fillClass = className;\n } else {\n // Default to theme-aware text color using CSS variable\n fillValue = \"var(--color-text-body)\";\n }\n\n if (showWordmark) {\n const logoWidth = width || 270;\n const logoHeight = (logoWidth / 270) * 80; // Maintain aspect ratio\n\n return (\n <svg\n width={logoWidth}\n height={logoHeight}\n viewBox=\"0 0 270 80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={fillClass}\n style={fillValue ? { fill: fillValue } : undefined}\n >\n <g clipPath=\"url(#clip0_796_283)\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.223654 20.2934C0.417233 19.8234 0.873598 19.517 1.37984 19.517H20.5909C21.282 19.517 21.8422 20.0798 21.8422 20.774V40.049C21.8422 40.5572 21.5375 41.0155 21.0702 41.2102C20.6028 41.405 20.0647 41.2977 19.7067 40.9385L0.495628 21.6635C0.137428 21.3041 0.030075 20.7633 0.223654 20.2934ZM4.40349 22.0311L19.3396 37.017V22.0311H4.40349Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 20.2934C38.8394 19.8234 39.2958 19.517 39.802 19.517H59.013C59.7041 19.517 60.2642 20.0798 60.2642 20.774V40.049C60.2642 40.5572 59.9597 41.0155 59.4923 41.2102C59.025 41.405 58.4867 41.2977 58.1289 40.9385L38.9178 21.6635C38.5595 21.3041 38.4522 20.7633 38.6458 20.2934ZM42.8255 22.0311L57.7618 37.017V22.0311H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4347 58.8447C19.6283 58.3747 20.0847 58.0685 20.5909 58.0685H39.802C40.493 58.0685 41.0532 58.6312 41.0532 59.3255V78.6005C41.0532 79.1087 40.7486 79.567 40.2813 79.7617C39.8139 79.9562 39.2757 79.849 38.9178 79.49L19.7067 60.215C19.3485 59.8555 19.2411 59.3147 19.4347 58.8447ZM23.6146 60.5825L38.5508 75.5682V60.5825H23.6146Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 58.1643C39.79 57.9695 40.3283 58.0768 40.6861 58.436L59.8972 77.711C60.2555 78.0703 60.3628 78.6113 60.1692 79.081C59.9756 79.551 59.5192 79.8575 59.013 79.8575H39.802C39.1109 79.8575 38.5508 79.2948 38.5508 78.6005V59.3255C38.5508 58.8173 38.8554 58.359 39.3227 58.1643ZM41.0532 62.3575V77.3433H55.9893L41.0532 62.3575Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 19.6129C39.79 19.4182 40.3283 19.5254 40.6861 19.8846L59.8972 39.1595C60.2555 39.519 60.3628 40.0598 60.1692 40.5298C59.9756 40.9995 59.5192 41.306 59.013 41.306H39.802C39.1109 41.306 38.5508 40.7433 38.5508 40.049V20.7741C38.5508 20.2658 38.8554 19.8075 39.3227 19.6129ZM41.0532 23.8061V38.792H55.9893L41.0532 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 38.8885C39.79 38.694 40.3283 38.8012 40.6861 39.1602L59.8972 58.4352C60.2555 58.7945 60.3628 59.3355 60.1692 59.8055C59.9756 60.2752 59.5192 60.5817 59.013 60.5817H39.802C39.1109 60.5817 38.5508 60.019 38.5508 59.3247V40.0497C38.5508 39.5415 38.8554 39.0832 39.3227 38.8885ZM41.0532 43.0817V58.0675H55.9893L41.0532 43.0817Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 39.569C38.8394 39.0992 39.2958 38.7927 39.802 38.7927H59.013C59.7041 38.7927 60.2642 39.3555 60.2642 40.0497V59.3247C60.2642 59.833 59.9597 60.2912 59.4923 60.486C59.025 60.6805 58.4867 60.5732 58.1289 60.2142L38.9178 40.9392C38.5595 40.5797 38.4522 40.039 38.6458 39.569ZM42.8255 41.3067L57.7618 56.2927V41.3067H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 58.8447C38.8394 58.3747 39.2958 58.0685 39.802 58.0685H59.013C59.7041 58.0685 60.2642 58.6312 60.2642 59.3255V78.6005C60.2642 79.1087 59.9597 79.567 59.4923 79.7617C59.025 79.9562 58.4867 79.849 58.1289 79.49L38.9178 60.215C38.5595 59.8555 38.4522 59.3147 38.6458 58.8447ZM42.8255 60.5825L57.7618 75.5682V60.5825H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 19.6129C59.0011 19.4182 59.5394 19.5254 59.8972 19.8846L79.1083 39.1595C79.4666 39.519 79.5739 40.0598 79.3803 40.5298C79.1867 40.9995 78.7303 41.306 78.2241 41.306H59.013C58.322 41.306 57.7618 40.7433 57.7618 40.049V20.7741C57.7618 20.2658 58.0664 19.8075 58.5338 19.6129ZM60.2643 23.8061V38.792H75.2006L60.2643 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 0.338803C59.0011 0.144135 59.5394 0.251385 59.8972 0.610565L79.1083 19.8855C79.4666 20.2449 79.5739 20.7857 79.3803 21.2556C79.1867 21.7256 78.7303 22.032 78.2241 22.032H59.013C58.322 22.032 57.7618 21.4692 57.7618 20.775V1.50003C57.7618 0.99174 58.0664 0.533468 58.5338 0.338803ZM60.2643 4.53208V19.5179H75.2006L60.2643 4.53208Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M57.8569 20.2934C58.0505 19.8234 58.5069 19.517 59.013 19.517H78.2241C78.9151 19.517 79.4753 20.0798 79.4753 20.774V40.049C79.4753 40.5572 79.1707 41.0155 78.7034 41.2102C78.236 41.405 77.6978 41.2977 77.3399 40.9385L58.1289 21.6635C57.7705 21.3041 57.6633 20.7633 57.8569 20.2934ZM62.0365 22.0311L76.9729 37.017V22.0311H62.0365Z\"\n />\n <path d=\"M269.838 49.4457H249.005C249.266 51.801 250.162 53.6985 251.695 55.1377C253.225 56.577 255.134 57.2967 257.416 57.2967C259.307 57.2967 260.887 56.8715 262.159 56.021C263.463 55.1377 264.408 53.9927 264.996 52.5862H269.251C268.502 54.9415 267.084 56.937 264.996 58.5725C262.943 60.208 260.414 61.026 257.416 61.026C255.069 61.026 252.917 60.4697 250.961 59.3575C249.037 58.2127 247.504 56.6587 246.363 54.696C245.255 52.7332 244.7 50.558 244.7 48.17C244.7 45.782 245.255 43.6067 246.363 41.644C247.504 39.6812 249.037 38.1437 250.961 37.0315C252.917 35.8867 255.069 35.3142 257.416 35.3142C259.73 35.3142 261.833 35.8702 263.724 36.9825C265.615 38.0947 267.098 39.6485 268.176 41.644C269.283 43.6395 269.838 45.913 269.838 48.4645V49.4457ZM257.416 39.0432C255.263 39.0432 253.439 39.6812 251.939 40.957C250.47 42.2327 249.542 43.9337 249.152 46.06H265.583C265.192 43.9992 264.262 42.3145 262.796 41.006C261.36 39.6975 259.568 39.0432 257.416 39.0432Z\" />\n <path d=\"M228.356 60.5352V35.8049H232.219V39.7794H232.464C233.05 38.5689 233.963 37.5712 235.202 36.7862C236.474 35.9684 237.974 35.5594 239.701 35.5594H243.125V39.4359H239.701C237.517 39.4359 235.757 40.1554 234.42 41.5949C233.083 43.0342 232.414 44.9152 232.414 47.2377V60.5352H228.356Z\" />\n <path d=\"M208.607 61.0259C205.64 61.0259 203.326 60.1262 201.663 58.3272C200 56.4952 199.169 53.8947 199.169 50.5252V35.8047H203.228V49.8874C203.228 52.2427 203.766 54.0744 204.842 55.3829C205.95 56.6587 207.532 57.2967 209.586 57.2967C211.02 57.2967 212.308 56.9694 213.449 56.3152C214.623 55.6284 215.536 54.6959 216.188 53.5184C216.84 52.3407 217.166 50.9997 217.166 49.4949V35.8047H221.225V60.5352H217.313V56.5607H217.068C216.286 57.9019 215.161 58.9814 213.694 59.7992C212.226 60.6169 210.531 61.0259 208.607 61.0259Z\" />\n <path d=\"M186.736 39.534V56.806H194.756V60.5352H182.677V39.534H177.199V35.8047H182.677V29.5732H186.736V35.8047H193.24V39.534H186.736Z\" />\n <path d=\"M156.585 60.5352H151.988L158.394 48.0227L152.33 35.8047H156.976L162.062 46.0599H165.388L170.474 35.8047H175.022L168.958 48.0227L175.365 60.5352H170.67L165.29 49.7892H162.013L156.585 60.5352Z\" />\n <path d=\"M150.138 49.1315H129.304C129.565 51.4867 130.461 53.3842 131.994 54.8235C133.526 56.2627 135.433 56.9825 137.715 56.9825C139.606 56.9825 141.188 56.5572 142.459 55.7067C143.763 54.8235 144.709 53.6785 145.296 52.272H149.551C148.801 54.6272 147.382 56.6227 145.296 58.2582C143.242 59.8937 140.715 60.7118 137.715 60.7118C135.368 60.7118 133.216 60.1555 131.26 59.0432C129.336 57.8985 127.804 56.3445 126.663 54.3817C125.554 52.419 125 50.2437 125 47.8557C125 45.4677 125.554 43.2925 126.663 41.3298C127.804 39.367 129.336 37.8295 131.26 36.7173C133.216 35.5725 135.368 35 137.715 35C140.03 35 142.133 35.556 144.024 36.6682C145.915 37.7805 147.399 39.3342 148.475 41.3298C149.583 43.3252 150.138 45.5987 150.138 48.1502V49.1315ZM137.715 38.729C135.564 38.729 133.738 39.367 132.238 40.6427C130.771 41.9185 129.842 43.6195 129.45 45.7458H145.883C145.491 43.685 144.562 42.0002 143.095 40.6917C141.661 39.3832 139.867 38.729 137.715 38.729Z\" />\n <path d=\"M116.961 60.5353H112.559V30.4072H101.164V26.1875H128.307V30.4072H116.961V60.5353Z\" />\n </g>\n <defs>\n <clipPath id=\"clip0_796_283\">\n <rect width=\"270\" height=\"80\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n }\n // Logo only\n const logoWidth = width || 80;\n const logoHeight = logoWidth; // Square logo maintains 1:1 aspect ratio\n\n return (\n <svg\n width={logoWidth}\n height={logoHeight}\n viewBox=\"0 0 80 80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={fillClass}\n style={fillValue ? { fill: fillValue } : undefined}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0.223654 20.2934C0.417233 19.8234 0.873598 19.517 1.37984 19.517H20.5909C21.282 19.517 21.8422 20.0798 21.8422 20.774V40.049C21.8422 40.5572 21.5375 41.0155 21.0702 41.2102C20.6028 41.405 20.0647 41.2977 19.7067 40.9385L0.495628 21.6635C0.137428 21.3041 0.030075 20.7633 0.223654 20.2934ZM4.40349 22.0311L19.3396 37.017V22.0311H4.40349Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 20.2934C38.8394 19.8234 39.2958 19.517 39.802 19.517H59.013C59.7041 19.517 60.2642 20.0798 60.2642 20.774V40.049C60.2642 40.5572 59.9597 41.0155 59.4923 41.2102C59.025 41.405 58.4867 41.2977 58.1289 40.9385L38.9178 21.6635C38.5595 21.3041 38.4522 20.7633 38.6458 20.2934ZM42.8255 22.0311L57.7618 37.017V22.0311H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M19.4347 58.8447C19.6283 58.3747 20.0847 58.0685 20.5909 58.0685H39.802C40.493 58.0685 41.0532 58.6312 41.0532 59.3255V78.6005C41.0532 79.1087 40.7486 79.567 40.2813 79.7617C39.8139 79.9562 39.2757 79.849 38.9178 79.49L19.7067 60.215C19.3485 59.8555 19.2411 59.3147 19.4347 58.8447ZM23.6146 60.5825L38.5508 75.5682V60.5825H23.6146Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 58.1643C39.79 57.9695 40.3283 58.0768 40.6861 58.436L59.8972 77.711C60.2555 78.0703 60.3628 78.6113 60.1692 79.081C59.9756 79.551 59.5192 79.8575 59.013 79.8575H39.802C39.1109 79.8575 38.5508 79.2948 38.5508 78.6005V59.3255C38.5508 58.8173 38.8554 58.359 39.3227 58.1643ZM41.0532 62.3575V77.3433H55.9893L41.0532 62.3575Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 19.6129C39.79 19.4182 40.3283 19.5254 40.6861 19.8846L59.8972 39.1595C60.2555 39.519 60.3628 40.0598 60.1692 40.5298C59.9756 40.9995 59.5192 41.306 59.013 41.306H39.802C39.1109 41.306 38.5508 40.7433 38.5508 40.049V20.7741C38.5508 20.2658 38.8554 19.8075 39.3227 19.6129ZM41.0532 23.8061V38.792H55.9893L41.0532 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M39.3227 38.8885C39.79 38.694 40.3283 38.8012 40.6861 39.1602L59.8972 58.4352C60.2555 58.7945 60.3628 59.3355 60.1692 59.8055C59.9756 60.2752 59.5192 60.5817 59.013 60.5817H39.802C39.1109 60.5817 38.5508 60.019 38.5508 59.3247V40.0497C38.5508 39.5415 38.8554 39.0832 39.3227 38.8885ZM41.0532 43.0817V58.0675H55.9893L41.0532 43.0817Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 39.569C38.8394 39.0992 39.2958 38.7927 39.802 38.7927H59.013C59.7041 38.7927 60.2642 39.3555 60.2642 40.0497V59.3247C60.2642 59.833 59.9597 60.2912 59.4923 60.486C59.025 60.6805 58.4867 60.5732 58.1289 60.2142L38.9178 40.9392C38.5595 40.5797 38.4522 40.039 38.6458 39.569ZM42.8255 41.3067L57.7618 56.2927V41.3067H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M38.6458 58.8447C38.8394 58.3747 39.2958 58.0685 39.802 58.0685H59.013C59.7041 58.0685 60.2642 58.6312 60.2642 59.3255V78.6005C60.2642 79.1087 59.9597 79.567 59.4923 79.7617C59.025 79.9562 58.4867 79.849 58.1289 79.49L38.9178 60.215C38.5595 59.8555 38.4522 59.3147 38.6458 58.8447ZM42.8255 60.5825L57.7618 75.5682V60.5825H42.8255Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 19.6129C59.0011 19.4182 59.5394 19.5254 59.8972 19.8846L79.1083 39.1595C79.4666 39.519 79.5739 40.0598 79.3803 40.5298C79.1867 40.9995 78.7303 41.306 78.2241 41.306H59.013C58.322 41.306 57.7618 40.7433 57.7618 40.049V20.7741C57.7618 20.2658 58.0664 19.8075 58.5338 19.6129ZM60.2643 23.8061V38.792H75.2006L60.2643 23.8061Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M58.5338 0.338803C59.0011 0.144135 59.5394 0.251385 59.8972 0.610565L79.1083 19.8855C79.4666 20.2449 79.5739 20.7857 79.3803 21.2556C79.1867 21.7256 78.7303 22.032 78.2241 22.032H59.013C58.322 22.032 57.7618 21.4692 57.7618 20.775V1.50003C57.7618 0.99174 58.0664 0.533468 58.5338 0.338803ZM60.2643 4.53208V19.5179H75.2006L60.2643 4.53208Z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M57.8569 20.2934C58.0505 19.8234 58.5069 19.517 59.013 19.517H78.2241C78.9151 19.517 79.4753 20.0798 79.4753 20.774V40.049C79.4753 40.5572 79.1707 41.0155 78.7034 41.2102C78.236 41.405 77.6978 41.2977 77.3399 40.9385L58.1289 21.6635C57.7705 21.3041 57.6633 20.7633 57.8569 20.2934ZM62.0365 22.0311L76.9729 37.017V22.0311H62.0365Z\"\n />\n </svg>\n );\n};\n","import * as React from \"react\";\nimport { Logo } from \"../Logo\";\n// Remove Icon import to avoid client-only code - using emoji/text placeholders for now\n// import { Icon, type IconName } from \"../Icon\";\n\nexport type SideNavItem = {\n id: string;\n label: string;\n href?: string; // Optional - if not provided and has children, becomes a category\n icon?: React.ReactNode;\n isActive?: boolean;\n isExpanded?: boolean; // For categories with children\n children?: SideNavItem[]; // If present, this becomes a category\n};\n\nexport type SideNavSection = {\n id: string;\n title?: string; // Optional section title\n items: SideNavItem[];\n};\n\nexport type SideNavProps = {\n topItems?: SideNavItem[] | SideNavSection[]; // Union type for backward compatibility\n bottomItems?: SideNavItem[];\n logo?: React.ReactNode;\n showLogo?: boolean;\n linkComponent?: React.ElementType;\n className?: string;\n mobileMenuId?: string;\n sidebarCollapseId?: string;\n};\n\n/**\n * SideNav\n *\n * Vertical navigation component for application sidebars.\n * Supports nested navigation items, sections, collapsible categories, and mobile-responsive behavior.\n */\nexport const SideNav: React.FC<SideNavProps> = ({\n topItems = [],\n bottomItems = [],\n logo,\n showLogo = true,\n linkComponent: LinkComponent = \"a\",\n className = \"\",\n mobileMenuId = \"app-mobile-menu\",\n sidebarCollapseId = \"app-sidebar-collapse\",\n}) => {\n // Helper function to determine if topItems is using the new section format\n const isSectionFormat = (items: SideNavItem[] | SideNavSection[]): items is SideNavSection[] => {\n return items.length > 0 && \"items\" in items[0];\n };\n\n // Helper function to normalize topItems to sections for consistent rendering\n const normalizeToSections = (items: SideNavItem[] | SideNavSection[]): SideNavSection[] => {\n if (isSectionFormat(items)) {\n return items;\n }\n // Convert plain items array to a single section\n return [{ id: \"default-section\", items: items }];\n };\n\n const renderSection = (\n section: SideNavSection,\n sectionIndex: number,\n totalSections: number\n ): React.ReactNode => {\n return (\n <div key={section.id} className=\"space-y-1\">\n {/* Optional section title */}\n {section.title && (\n <div\n className=\"px-6 py-2 text-xs font-medium text-text-subtle uppercase tracking-wider\"\n data-collapse-hide=\"\"\n >\n {section.title}\n </div>\n )}\n\n {/* Section items */}\n <div className=\"space-y-1\">{section.items.map((item) => renderNavItem(item))}</div>\n\n {/* Section separator - border between sections (but not after the last section) */}\n {sectionIndex < totalSections - 1 && (\n <div className=\"border-b border-border-subtle mx-6 my-4\" data-collapse-hide=\"\" />\n )}\n </div>\n );\n };\n\n const renderNavItem = (item: SideNavItem, isNested = false): React.ReactNode => {\n // If item has children, render as category\n if (item.children && item.children.length > 0) {\n const categoryId = `category-${item.id}`;\n return (\n <div key={item.id} className=\"group/category\">\n {/* Hidden checkbox for expand/collapse state */}\n <input\n type=\"checkbox\"\n id={categoryId}\n className=\"peer/category hidden\"\n defaultChecked={item.isExpanded}\n aria-hidden=\"true\"\n />\n\n {/* Category header - acts as label for checkbox */}\n <label\n htmlFor={categoryId}\n className=\"flex items-center gap-3 px-6 py-1 text-text-body hover:bg-background-hover hover:text-text-heading cursor-pointer transition-all duration-200\"\n data-collapse-center=\"\"\n >\n {item.icon && (\n <span\n className=\"flex-shrink-0 w-4 h-4 flex items-center justify-center transition-all duration-200\"\n data-collapse-icon=\"\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {item.label}\n </span>\n {/* Spacer to push chevron to the right */}\n <span className=\"flex-1\" data-collapse-hide=\"\" />\n {/* Chevron icon for expand/collapse */}\n <svg\n className=\"w-4 h-4 transform transition-transform duration-200 peer-checked/category:rotate-180 ml-auto\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n data-collapse-hide=\"\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </label>\n\n {/* Category children - hidden by default, shown when checkbox is checked */}\n <div\n className=\"hidden peer-checked/category:block bg-background-subtle border-l-2 border-border-subtle ml-6\"\n data-collapse-hide-category=\"\"\n >\n {item.children.map((child) => renderNavItem(child, true))}\n </div>\n </div>\n );\n }\n\n // Otherwise render as regular link\n const linkProps = {\n href: item.href || \"#\",\n className: `flex items-center gap-3 transition-all duration-200 hover:bg-background-hover ${\n isNested ? \"pl-8 pr-6 py-1 text-sm\" : \"px-6 py-1\"\n } ${\n item.isActive\n ? \"bg-action-primary-light text-action-primary border-l-2 border-action-primary\"\n : \"text-text-body hover:text-text-heading\"\n }`,\n \"aria-current\": item.isActive ? (\"page\" as const) : undefined,\n \"data-collapse-center\": !isNested ? \"\" : undefined,\n };\n\n const linkContent = (\n <>\n {item.icon && !isNested && (\n <span\n className=\"flex-shrink-0 w-4 h-4 flex items-center justify-center transition-all duration-200\"\n data-collapse-icon=\"\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {item.label}\n </span>\n </>\n );\n\n if (LinkComponent === \"a\") {\n return (\n <a key={item.id} {...linkProps}>\n {linkContent}\n </a>\n );\n }\n\n return (\n <LinkComponent key={item.id} {...linkProps}>\n {linkContent}\n </LinkComponent>\n );\n };\n\n return (\n <div className={`flex flex-col h-full ${className}`}>\n {/* Header with logo and collapse button */}\n <div className=\"flex items-center justify-between h-[60px] px-6 border-b border-border-default\">\n {showLogo && (\n <div className=\"transition-all duration-200\" data-collapse-hide=\"\">\n {logo ? (\n // If custom logo is provided, use it\n logo\n ) : (\n // Otherwise use the default Logo component\n <Logo showWordmark={true} width={120} />\n )}\n </div>\n )}\n\n {/* Desktop collapse toggle */}\n <label\n htmlFor={sidebarCollapseId}\n className=\"hidden md:flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover cursor-pointer transition-all duration-200\"\n aria-label=\"Toggle sidebar\"\n data-collapse-toggle=\"\"\n >\n {/* Menu icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </label>\n\n {/* Mobile close button */}\n <label\n htmlFor={mobileMenuId}\n className=\"md:hidden flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover cursor-pointer transition-colors\"\n aria-label=\"Close menu\"\n >\n {/* Close icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </label>\n </div>\n\n {/* Navigation sections */}\n <nav className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Top section - scrollable */}\n {topItems && topItems.length > 0 && (\n <div className=\"flex-1 overflow-y-auto pb-4 scrollbar-hide\">\n {normalizeToSections(topItems).map((section, index, sections) =>\n renderSection(section, index, sections.length)\n )}\n </div>\n )}\n\n {/* Bottom section - fixed at bottom with enhanced separator */}\n {bottomItems && bottomItems.length > 0 && (\n <div className=\"flex-shrink-0 border-t bg-background-muted/30\">\n {/* Bottom navigation items with background and proper spacing */}\n <div className=\"mt-4 pb-4 space-y-1\">\n {bottomItems.map((item) => renderNavItem(item))}\n </div>\n </div>\n )}\n </nav>\n </div>\n );\n};\n","import * as React from \"react\";\n// Remove Icon import to avoid client-only code\n// import { Icon } from \"../Icon\";\n\nexport type TopNavProps = {\n rightContent?: React.ReactNode;\n showMobileMenu?: boolean;\n avatar?: React.ReactNode;\n showColorModeSwitcher?: boolean;\n toggleTheme?: () => void;\n isDarkThemeEnabled?: boolean;\n actions?: React.ReactNode;\n className?: string;\n mobileMenuId?: string;\n};\n\n/**\n * TopNav\n *\n * Horizontal navigation bar component for application headers.\n * Includes mobile menu toggle, user avatar, theme switcher, and customizable action areas.\n */\nexport const TopNav: React.FC<TopNavProps> = ({\n rightContent,\n showMobileMenu = true,\n avatar,\n showColorModeSwitcher = false,\n toggleTheme,\n isDarkThemeEnabled = false,\n actions,\n className = \"\",\n mobileMenuId = \"app-mobile-menu\",\n}) => {\n return (\n <header className={`h-[60px] bg-background-surface border-b ${className}`}>\n <div className=\"flex h-full items-center justify-between\">\n {/* Left side - Mobile menu button */}\n <div className=\"flex items-center h-full\">\n {showMobileMenu && (\n <label\n htmlFor={mobileMenuId}\n className=\"md:hidden cursor-pointer\"\n aria-label=\"Open menu\"\n >\n <div className=\"flex h-full w-14 flex-col items-center justify-center border-r hover:bg-background-hover transition-colors\">\n {/* Menu icon */}\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 12h16M4 18h16\"\n />\n </svg>\n </div>\n </label>\n )}\n </div>\n\n {/* Right side - User actions */}\n <div className=\"flex items-center gap-4 px-4\">\n {/* Custom right content */}\n {rightContent}\n\n {/* Theme switcher - Desktop */}\n {showColorModeSwitcher && toggleTheme && (\n <button\n onClick={toggleTheme}\n className=\"hidden md:flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover transition-colors\"\n aria-label={isDarkThemeEnabled ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {/* Theme icon */}\n {isDarkThemeEnabled ? (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n </svg>\n )}\n </button>\n )}\n\n {/* Additional actions */}\n {actions}\n\n {/* Avatar */}\n {avatar && <div className=\"flex items-center\">{avatar}</div>}\n\n {/* Theme switcher - Mobile (if no avatar) */}\n {!avatar && showColorModeSwitcher && toggleTheme && (\n <button\n onClick={toggleTheme}\n className=\"md:hidden flex items-center justify-center w-8 h-8 rounded hover:bg-background-hover transition-colors\"\n aria-label={isDarkThemeEnabled ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {/* Theme icon */}\n {isDarkThemeEnabled ? (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\"\n />\n </svg>\n ) : (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z\"\n />\n </svg>\n )}\n </button>\n )}\n </div>\n </div>\n </header>\n );\n};\n","import React from \"react\";\nimport { SideNav, type SideNavProps } from \"../SideNav/SideNav\";\nimport { TopNav, type TopNavProps } from \"../TopNav/TopNav\";\n\n/** Layout options for the AppShell */\nexport type AppShellProps = {\n /** Structured nav for the left rail */\n sideNav: Omit<SideNavProps, \"mobileMenuId\" | \"sidebarCollapseId\">;\n /** Optional top bar slots & options */\n topNav?: Pick<\n TopNavProps,\n | \"rightContent\"\n | \"showMobileMenu\"\n | \"avatar\"\n | \"showColorModeSwitcher\"\n | \"toggleTheme\"\n | \"isDarkThemeEnabled\"\n | \"actions\"\n | \"className\"\n >;\n /** Main page content */\n children: React.ReactNode;\n\n /** Layout knobs */\n contentPaddingX?: string; // e.g. \"px-4 md:px-6\"\n contentPaddingY?: string; // e.g. \"py-4 md:py-6\"\n showSidebarBorder?: boolean; // default true\n mainClassName?: string; // extra classes on <main>\n\n /** Optional: Enable JavaScript progressive enhancements */\n enableJsEnhancements?: boolean;\n};\n\n/**\n * Isomorphic AppShell component that works as both server and client component\n * Uses CSS-only interactions by default for full SSR compatibility\n * Can be progressively enhanced with JavaScript when enableJsEnhancements is true\n */\nexport function AppShell({\n sideNav,\n topNav,\n children,\n contentPaddingX = \"px-4 md:px-6\",\n contentPaddingY = \"py-4 md:py-6\",\n showSidebarBorder = true,\n mainClassName,\n enableJsEnhancements = false,\n}: AppShellProps) {\n // Use stable IDs for CSS selectors\n const mobileMenuId = \"app-mobile-menu\";\n const sidebarCollapseId = \"app-sidebar-collapse\";\n\n return (\n <div className=\"min-h-screen bg-background text-text-body relative\">\n {/* Hidden checkbox for desktop sidebar collapse */}\n <input\n type=\"checkbox\"\n id={sidebarCollapseId}\n className=\"sr-only peer/sidebar\"\n aria-hidden=\"true\"\n />\n\n {/* Skip link for keyboard users */}\n <a\n href=\"#app-content\"\n className=\"sr-only focus:not-sr-only focus:absolute focus:left-4 focus:top-4 z-50 rounded px-3 py-2 bg-background-surface shadow\"\n >\n Skip to content\n </a>\n\n {/* Top navigation - always visible on mobile */}\n <TopNav\n {...topNav}\n mobileMenuId={mobileMenuId}\n className={[\"sticky top-0 flex-shrink-0 z-30 md:hidden\", topNav?.className]\n .filter(Boolean)\n .join(\" \")}\n />\n\n {/* Main layout container - contains sidebar and content */}\n <div className=\"flex w-full h-[calc(100vh-60px)] md:h-screen relative overflow-hidden\">\n {/* Hidden checkbox for mobile menu - inside container for peer selectors */}\n <input\n type=\"checkbox\"\n id={mobileMenuId}\n className=\"sr-only peer/mobile\"\n aria-hidden=\"true\"\n />\n\n {/* Mobile menu overlay - fixed to cover entire viewport including TopNav */}\n <label\n htmlFor={mobileMenuId}\n className=\"fixed inset-0 bg-black/50 z-40 opacity-0 pointer-events-none peer-checked/mobile:opacity-100 peer-checked/mobile:pointer-events-auto transition-opacity md:hidden\"\n aria-label=\"Close menu\"\n />\n\n {/* Left rail - SideNav with CSS-based responsive behavior */}\n <aside\n id=\"app-sidebar\"\n className={[\n // Base styles\n \"bg-background-surface\",\n \"border-r border-border-default\",\n \"transition-all duration-300 ease-in-out\",\n // Mobile: fixed full-screen overlay\n \"fixed md:relative\",\n \"left-0 top-0 bottom-0\",\n \"z-50\",\n \"w-80 md:w-64\",\n \"h-screen md:h-full\",\n \"-translate-x-full\",\n \"peer-checked/mobile:translate-x-0\",\n // Desktop: always visible\n \"md:translate-x-0\",\n showSidebarBorder ? \"\" : \"!border-r-0\",\n sideNav?.className || \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <SideNav\n {...sideNav}\n mobileMenuId={mobileMenuId}\n sidebarCollapseId={sidebarCollapseId}\n className=\"h-full\"\n />\n </aside>\n\n {/* Right side: TopNav + Main content */}\n <div className=\"flex-1 flex flex-col h-full overflow-hidden\">\n {/* Top navigation - desktop only */}\n <div className=\"sticky top-0 flex-shrink-0 hidden md:block z-20\">\n <TopNav {...topNav} className={topNav?.className} />\n </div>\n\n {/* Main content - scrollable */}\n <main\n id=\"app-content\"\n className={[\n \"flex-1 overflow-y-auto bg-background-body\",\n contentPaddingX,\n contentPaddingY,\n mainClassName || \"\",\n ].join(\" \")}\n role=\"main\"\n >\n {children}\n </main>\n </div>\n </div>\n\n {/* Minimal CSS for checkbox-based interactions */}\n <style\n dangerouslySetInnerHTML={{\n __html: `\n @media (min-width: 768px) {\n /* Collapse sidebar width */\n #${sidebarCollapseId}:checked ~ * #app-sidebar {\n width: 4rem !important;\n }\n \n /* Collapse sidebar text */\n #${sidebarCollapseId}:checked ~ * [data-collapse-hide] {\n display: none !important;\n }\n \n /* Center nav items */\n #${sidebarCollapseId}:checked ~ * [data-collapse-center] {\n justify-content: center;\n padding-left: 0;\n padding-right: 0;\n gap: 0;\n }\n \n /* Increase icon size when collapsed */\n #${sidebarCollapseId}:checked ~ * [data-collapse-icon] {\n width: 1.5rem !important;\n height: 1.5rem !important;\n }\n \n /* Scale SVG icons inside the icon container */\n #${sidebarCollapseId}:checked ~ * [data-collapse-icon] > svg {\n width: 1.5rem !important;\n height: 1.5rem !important;\n }\n \n /* Rotate toggle icon */\n #${sidebarCollapseId}:checked ~ * [data-collapse-toggle] {\n transform: scaleX(-1);\n }\n \n /* Hide category expansions */\n #${sidebarCollapseId}:checked ~ * [data-collapse-hide-category] {\n display: none;\n }\n }\n `,\n }}\n />\n\n {/* Optional: Progressive enhancement script */}\n {enableJsEnhancements && (\n <script\n dangerouslySetInnerHTML={{\n __html: `\n (function() {\n // Close mobile menu on Escape key\n document.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') {\n var menuToggle = document.getElementById('${mobileMenuId}');\n if (menuToggle) menuToggle.checked = false;\n }\n });\n \n // Save sidebar collapse preference to localStorage\n var sidebarToggle = document.getElementById('${sidebarCollapseId}');\n if (sidebarToggle) {\n // Restore from localStorage\n var saved = localStorage.getItem('sidebar-collapsed');\n if (saved !== null) {\n sidebarToggle.checked = saved === 'true';\n }\n \n // Save on change\n sidebarToggle.addEventListener('change', function() {\n localStorage.setItem('sidebar-collapsed', this.checked);\n });\n }\n \n // Prevent body scroll when mobile menu is open\n var mobileToggle = document.getElementById('${mobileMenuId}');\n if (mobileToggle) {\n mobileToggle.addEventListener('change', function() {\n document.body.style.overflow = this.checked ? 'hidden' : '';\n });\n }\n })();\n `,\n }}\n />\n )}\n </div>\n );\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// We must avoid a circular dependency with @react-aria/utils, and this useLayoutEffect is\n// guarded by a check that it only runs on the client side.\n// eslint-disable-next-line rulesdir/useLayoutEffectRule\nimport React, {JSX, ReactNode, useContext, useLayoutEffect, useMemo, useRef, useState} from 'react';\n\n// To support SSR, the auto incrementing id counter is stored in a context. This allows\n// it to be reset on every request to ensure the client and server are consistent.\n// There is also a prefix string that is used to support async loading components\n// Each async boundary must be wrapped in an SSR provider, which appends to the prefix\n// and resets the current id counter. This ensures that async loaded components have\n// consistent ids regardless of the loading order.\ninterface SSRContextValue {\n prefix: string,\n current: number\n}\n\n// Default context value to use in case there is no SSRProvider. This is fine for\n// client-only apps. In order to support multiple copies of React Aria potentially\n// being on the page at once, the prefix is set to a random number. SSRProvider\n// will reset this to zero for consistency between server and client, so in the\n// SSR case multiple copies of React Aria is not supported.\nconst defaultContext: SSRContextValue = {\n prefix: String(Math.round(Math.random() * 10000000000)),\n current: 0\n};\n\nconst SSRContext = React.createContext<SSRContextValue>(defaultContext);\nconst IsSSRContext = React.createContext(false);\n\nexport interface SSRProviderProps {\n /** Your application here. */\n children: ReactNode\n}\n\n// This is only used in React < 18.\nfunction LegacySSRProvider(props: SSRProviderProps): JSX.Element {\n let cur = useContext(SSRContext);\n let counter = useCounter(cur === defaultContext);\n let [isSSR, setIsSSR] = useState(true);\n let value: SSRContextValue = useMemo(() => ({\n // If this is the first SSRProvider, start with an empty string prefix, otherwise\n // append and increment the counter.\n prefix: cur === defaultContext ? '' : `${cur.prefix}-${counter}`,\n current: 0\n }), [cur, counter]);\n\n // If on the client, and the component was initially server rendered,\n // then schedule a layout effect to update the component after hydration.\n if (typeof document !== 'undefined') {\n // This if statement technically breaks the rules of hooks, but is safe\n // because the condition never changes after mounting.\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useLayoutEffect(() => {\n setIsSSR(false);\n }, []);\n }\n\n return (\n <SSRContext.Provider value={value}>\n <IsSSRContext.Provider value={isSSR}>\n {props.children}\n </IsSSRContext.Provider>\n </SSRContext.Provider>\n );\n}\n\nlet warnedAboutSSRProvider = false;\n\n/**\n * When using SSR with React Aria in React 16 or 17, applications must be wrapped in an SSRProvider.\n * This ensures that auto generated ids are consistent between the client and server.\n */\nexport function SSRProvider(props: SSRProviderProps): JSX.Element {\n if (typeof React['useId'] === 'function') {\n if (process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'production' && !warnedAboutSSRProvider) {\n console.warn('In React 18, SSRProvider is not necessary and is a noop. You can remove it from your app.');\n warnedAboutSSRProvider = true;\n }\n return <>{props.children}</>;\n }\n return <LegacySSRProvider {...props} />;\n}\n\nlet canUseDOM = Boolean(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n);\n\nlet componentIds = new WeakMap();\n\nfunction useCounter(isDisabled = false) {\n let ctx = useContext(SSRContext);\n let ref = useRef<number | null>(null);\n // eslint-disable-next-line rulesdir/pure-render\n if (ref.current === null && !isDisabled) {\n // In strict mode, React renders components twice, and the ref will be reset to null on the second render.\n // This means our id counter will be incremented twice instead of once. This is a problem because on the\n // server, components are only rendered once and so ids generated on the server won't match the client.\n // In React 18, useId was introduced to solve this, but it is not available in older versions. So to solve this\n // we need to use some React internals to access the underlying Fiber instance, which is stable between renders.\n // This is exposed as ReactCurrentOwner in development, which is all we need since StrictMode only runs in development.\n // To ensure that we only increment the global counter once, we store the starting id for this component in\n // a weak map associated with the Fiber. On the second render, we reset the global counter to this value.\n // Since React runs the second render immediately after the first, this is safe.\n // @ts-ignore\n let currentOwner = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED?.ReactCurrentOwner?.current;\n if (currentOwner) {\n let prevComponentValue = componentIds.get(currentOwner);\n if (prevComponentValue == null) {\n // On the first render, and first call to useId, store the id and state in our weak map.\n componentIds.set(currentOwner, {\n id: ctx.current,\n state: currentOwner.memoizedState\n });\n } else if (currentOwner.memoizedState !== prevComponentValue.state) {\n // On the second render, the memoizedState gets reset by React.\n // Reset the counter, and remove from the weak map so we don't\n // do this for subsequent useId calls.\n ctx.current = prevComponentValue.id;\n componentIds.delete(currentOwner);\n }\n }\n\n // eslint-disable-next-line rulesdir/pure-render\n ref.current = ++ctx.current;\n }\n\n // eslint-disable-next-line rulesdir/pure-render\n return ref.current;\n}\n\nfunction useLegacySSRSafeId(defaultId?: string): string {\n let ctx = useContext(SSRContext);\n\n // If we are rendering in a non-DOM environment, and there's no SSRProvider,\n // provide a warning to hint to the developer to add one.\n if (ctx === defaultContext && !canUseDOM && process.env.NODE_ENV !== 'production') {\n console.warn('When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.');\n }\n\n let counter = useCounter(!!defaultId);\n let prefix = ctx === defaultContext && process.env.NODE_ENV === 'test' ? 'react-aria' : `react-aria${ctx.prefix}`;\n return defaultId || `${prefix}-${counter}`;\n}\n\nfunction useModernSSRSafeId(defaultId?: string): string {\n let id = React.useId();\n let [didSSR] = useState(useIsSSR());\n let prefix = didSSR || process.env.NODE_ENV === 'test' ? 'react-aria' : `react-aria${defaultContext.prefix}`;\n return defaultId || `${prefix}-${id}`;\n}\n\n// Use React.useId in React 18 if available, otherwise fall back to our old implementation.\n/** @private */\nexport const useSSRSafeId: typeof useModernSSRSafeId | typeof useLegacySSRSafeId = typeof React['useId'] === 'function' ? useModernSSRSafeId : useLegacySSRSafeId;\n\nfunction getSnapshot() {\n return false;\n}\n\nfunction getServerSnapshot() {\n return true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction subscribe(onStoreChange: () => void): () => void {\n // noop\n return () => {};\n}\n\n/**\n * Returns whether the component is currently being server side rendered or\n * hydrated on the client. Can be used to delay browser-specific rendering\n * until after hydration.\n */\nexport function useIsSSR(): boolean {\n // In React 18, we can use useSyncExternalStore to detect if we're server rendering or hydrating.\n if (typeof React['useSyncExternalStore'] === 'function') {\n return React['useSyncExternalStore'](subscribe, getSnapshot, getServerSnapshot);\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useContext(IsSSRContext);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// https://en.wikipedia.org/wiki/Right-to-left\nconst RTL_SCRIPTS = new Set(['Arab', 'Syrc', 'Samr', 'Mand', 'Thaa', 'Mend', 'Nkoo', 'Adlm', 'Rohg', 'Hebr']);\nconst RTL_LANGS = new Set(['ae', 'ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'glk', 'he', 'ku', 'mzn', 'nqo', 'pnb', 'ps', 'sd', 'ug', 'ur', 'yi']);\n\n/**\n * Determines if a locale is read right to left using [Intl.Locale]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale}.\n */\nexport function isRTL(localeString: string): boolean {\n // If the Intl.Locale API is available, use it to get the locale's text direction.\n if (Intl.Locale) {\n let locale = new Intl.Locale(localeString).maximize();\n\n // Use the text info object to get the direction if possible.\n // @ts-ignore - this was implemented as a property by some browsers before it was standardized as a function.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getTextInfo\n let textInfo = typeof locale.getTextInfo === 'function' ? locale.getTextInfo() : locale.textInfo;\n if (textInfo) {\n return textInfo.direction === 'rtl';\n }\n\n // Fallback: guess using the script.\n // This is more accurate than guessing by language, since languages can be written in multiple scripts.\n if (locale.script) {\n return RTL_SCRIPTS.has(locale.script);\n }\n }\n\n // If not, just guess by the language (first part of the locale)\n let lang = localeString.split('-')[0];\n return RTL_LANGS.has(lang);\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {Direction} from '@react-types/shared';\nimport {isRTL} from './utils';\nimport {useEffect, useState} from 'react';\nimport {useIsSSR} from '@react-aria/ssr';\n\nexport interface Locale {\n /** The [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt) language code for the locale. */\n locale: string,\n /** The writing direction for the locale. */\n direction: Direction\n}\n\n// Locale passed from server by PackageLocalizationProvider.\nconst localeSymbol = Symbol.for('react-aria.i18n.locale');\n\n/**\n * Gets the locale setting of the browser.\n */\nexport function getDefaultLocale(): Locale {\n let locale = typeof window !== 'undefined' && window[localeSymbol]\n // @ts-ignore\n || (typeof navigator !== 'undefined' && (navigator.language || navigator.userLanguage))\n || 'en-US';\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale]);\n } catch {\n locale = 'en-US';\n }\n return {\n locale,\n direction: isRTL(locale) ? 'rtl' : 'ltr'\n };\n}\n\nlet currentLocale = getDefaultLocale();\nlet listeners = new Set<(locale: Locale) => void>();\n\nfunction updateLocale() {\n currentLocale = getDefaultLocale();\n for (let listener of listeners) {\n listener(currentLocale);\n }\n}\n\n/**\n * Returns the current browser/system language, and updates when it changes.\n */\nexport function useDefaultLocale(): Locale {\n let isSSR = useIsSSR();\n let [defaultLocale, setDefaultLocale] = useState(currentLocale);\n\n useEffect(() => {\n if (listeners.size === 0) {\n window.addEventListener('languagechange', updateLocale);\n }\n\n listeners.add(setDefaultLocale);\n\n return () => {\n listeners.delete(setDefaultLocale);\n if (listeners.size === 0) {\n window.removeEventListener('languagechange', updateLocale);\n }\n };\n }, []);\n\n // We cannot determine the browser's language on the server, so default to\n // en-US. This will be updated after hydration on the client to the correct value.\n if (isSSR) {\n return {\n locale: 'en-US',\n direction: 'ltr'\n };\n }\n\n return defaultLocale;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {isRTL} from './utils';\nimport {Locale, useDefaultLocale} from './useDefaultLocale';\nimport React, {JSX, ReactNode, useContext} from 'react';\n\nexport interface I18nProviderProps {\n /** Contents that should have the locale applied. */\n children: ReactNode,\n /** The locale to apply to the children. */\n locale?: string\n}\n\nconst I18nContext = React.createContext<Locale | null>(null);\n\ninterface I18nProviderWithLocaleProps extends I18nProviderProps {\n locale: string\n}\n\n/**\n * Internal component that handles the case when locale is provided.\n */\nfunction I18nProviderWithLocale(props: I18nProviderWithLocaleProps): JSX.Element {\n let {locale, children} = props; \n let value: Locale = React.useMemo(() => ({\n locale,\n direction: isRTL(locale) ? 'rtl' : 'ltr'\n }), [locale]);\n\n return (\n <I18nContext.Provider value={value}>\n {children}\n </I18nContext.Provider>\n );\n}\n\ninterface I18nProviderWithDefaultLocaleProps {\n children: ReactNode\n}\n\n/**\n * Internal component that handles the case when no locale is provided.\n */\nfunction I18nProviderWithDefaultLocale(props: I18nProviderWithDefaultLocaleProps): JSX.Element {\n let {children} = props;\n let defaultLocale = useDefaultLocale();\n\n return (\n <I18nContext.Provider value={defaultLocale}>\n {children}\n </I18nContext.Provider>\n );\n}\n\n/**\n * Provides the locale for the application to all child components.\n */\nexport function I18nProvider(props: I18nProviderProps): JSX.Element {\n let {locale, children} = props;\n\n // Conditionally render different components to avoid calling useDefaultLocale.\n // This is necessary because useDefaultLocale triggers a re-render.\n if (locale) {\n return <I18nProviderWithLocale locale={locale} children={children} />;\n }\n\n return <I18nProviderWithDefaultLocale children={children} />;\n}\n\n/**\n * Returns the current locale and layout direction.\n */\nexport function useLocale(): Locale {\n let defaultLocale = useDefaultLocale();\n let context = useContext(I18nContext);\n return context || defaultLocale;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useLocale} from './context';\n\nlet cache = new Map<string, Intl.Collator>();\n\n/**\n * Provides localized string collation for the current locale. Automatically updates when the locale changes,\n * and handles caching of the collator for performance.\n * @param options - Collator options.\n */\nexport function useCollator(options?: Intl.CollatorOptions): Intl.Collator {\n let {locale} = useLocale();\n\n let cacheKey = locale + (options ? Object.entries(options).sort((a, b) => a[0] < b[0] ? -1 : 1).join() : '');\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey)!;\n }\n\n let formatter = new Intl.Collator(locale, options);\n cache.set(cacheKey, formatter);\n return formatter;\n}\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {useCallback, useMemo} from 'react';\nimport {useCollator} from './useCollator';\n\nexport interface Filter {\n /** Returns whether a string starts with a given substring. */\n startsWith(string: string, substring: string): boolean,\n /** Returns whether a string ends with a given substring. */\n endsWith(string: string, substring: string): boolean,\n /** Returns whether a string contains a given substring. */\n contains(string: string, substring: string): boolean\n}\n\n/**\n * Provides localized string search functionality that is useful for filtering or matching items\n * in a list. Options can be provided to adjust the sensitivity to case, diacritics, and other parameters.\n */\nexport function useFilter(options?: Intl.CollatorOptions): Filter {\n let collator = useCollator({\n usage: 'search',\n ...options\n });\n\n // TODO(later): these methods don't currently support the ignorePunctuation option.\n let startsWith = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n // Normalize both strings so we can slice safely\n // TODO: take into account the ignorePunctuation option as well...\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return collator.compare(string.slice(0, substring.length), substring) === 0;\n }, [collator]);\n\n let endsWith = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n return collator.compare(string.slice(-substring.length), substring) === 0;\n }, [collator]);\n\n let contains = useCallback((string, substring) => {\n if (substring.length === 0) {\n return true;\n }\n\n string = string.normalize('NFC');\n substring = substring.normalize('NFC');\n\n let scan = 0;\n let sliceLen = substring.length;\n for (; scan + sliceLen <= string.length; scan++) {\n let slice = string.slice(scan, scan + sliceLen);\n if (collator.compare(substring, slice) === 0) {\n return true;\n }\n }\n\n return false;\n }, [collator]);\n\n return useMemo(() => ({\n startsWith,\n endsWith,\n contains\n }), [startsWith, endsWith, contains]);\n}\n","\"use client\";\n\nimport { createContext, useCallback, useContext, useEffect, useState } from \"react\";\n\n// Moved to direct const variable in order to remove dependence on config tied to dash-next directly in edges\n// Eventually we will want to move this folder out of dash-next and into a shared location\nconst preventDarkMode = false;\n\ninterface ColorModeContextType {\n colorMode: string;\n isDarkTheme: boolean;\n toggleTheme: () => void;\n}\n\nconst ColorModeContext = createContext<ColorModeContextType>({\n colorMode: \"light\",\n isDarkTheme: false,\n toggleTheme: () => {\n /* Default implementation */\n },\n});\n\nexport const useColorMode = () => useContext(ColorModeContext);\n\ninterface ColorModeProviderProps {\n children: React.ReactNode;\n}\n\nexport const ColorModeProvider: React.FC<ColorModeProviderProps> = ({ children }) => {\n const [colorMode, setColorMode] = useState(\"light\");\n const isDarkTheme = colorMode === \"dark\";\n\n useEffect(() => {\n // Get initial theme from localStorage, existing class, or system preference\n const savedTheme = localStorage.getItem(\"theme\");\n const hasThemeDarkClass = document.body.classList.contains(\"theme-dark\");\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const initialTheme =\n savedTheme || (hasThemeDarkClass ? \"dark\" : null) || (mediaQuery.matches ? \"dark\" : \"light\");\n setColorMode(initialTheme);\n\n if (initialTheme === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n }\n\n // Function to handle the theme change\n const handleColorModeChange = (e: MediaQueryListEvent) => {\n if (!localStorage.getItem(\"theme\")) {\n const newTheme = e.matches ? \"dark\" : \"light\";\n setColorMode(newTheme);\n if (newTheme === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n } else {\n document.body.classList.remove(\"theme-dark\");\n }\n }\n };\n\n // Function to handle external class changes (like Storybook)\n const handleClassChange = () => {\n const hasThemeDarkClass = document.body.classList.contains(\"theme-dark\");\n const currentTheme = hasThemeDarkClass ? \"dark\" : \"light\";\n\n // Only update if we don't have a saved preference\n if (!localStorage.getItem(\"theme\")) {\n setColorMode(currentTheme);\n }\n };\n\n // Listen for changes in the prefers-color-scheme media query\n mediaQuery.addEventListener(\"change\", handleColorModeChange);\n\n // Watch for class changes on the body element\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.type === \"attributes\" && mutation.attributeName === \"class\") {\n handleClassChange();\n }\n });\n });\n\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n // Clean up the event listeners on unmount\n return () => {\n mediaQuery.removeEventListener(\"change\", handleColorModeChange);\n observer.disconnect();\n };\n }, []);\n\n const toggleTheme = useCallback(() => {\n setColorMode((prevMode) => {\n const newMode = prevMode === \"light\" ? \"dark\" : \"light\";\n localStorage.setItem(\"theme\", newMode);\n\n if (newMode === \"dark\") {\n document.body.classList.add(\"theme-dark\");\n } else {\n document.body.classList.remove(\"theme-dark\");\n }\n\n return newMode;\n });\n }, []);\n\n if (preventDarkMode) {\n return (\n <ColorModeContext.Provider\n value={{\n colorMode: \"light\",\n isDarkTheme: false,\n toggleTheme: () => {\n /* Default implementation */\n },\n }}\n >\n {children}\n </ColorModeContext.Provider>\n );\n }\n\n return (\n <ColorModeContext.Provider value={{ colorMode, isDarkTheme, toggleTheme }}>\n {children}\n </ColorModeContext.Provider>\n );\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\nexport function focusRing(showDefaultOutline: boolean = false) {\n const baseClasses = showDefaultOutline\n ? \"outline outline-1 outline-border-input focus:outline-2 focus:outline-border-focus focus: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 focus-visible:outline focus-visible:outline-2 focus-visible:outline-border-focus 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\nconst colorCache = new Map<string, string>();\n\nexport const getResolvedColor = (variableName: string): string => {\n // Early return if running in non-browser environment\n if (typeof window === \"undefined\") return \"\";\n\n // Return cached value if available\n if (colorCache.has(variableName)) {\n return colorCache.get(variableName)!;\n }\n\n try {\n const tempElement = document.createElement(\"div\");\n tempElement.style.color = `var(${variableName})`;\n document.body.appendChild(tempElement);\n const resolvedColor = getComputedStyle(tempElement).color;\n document.body.removeChild(tempElement);\n // Cache the result\n colorCache.set(variableName, resolvedColor);\n return resolvedColor;\n } catch (error) {\n console.error(`Failed to resolve color for ${variableName}:`, error);\n return \"\";\n }\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 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 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 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 gap: \"gap-[var(--control-gap-xl)]\",\n },\n} as const;\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\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)] \";\n\n // Disabled state overrides all others\n if (isDisabled) {\n return `${baseStyles} border-border-muted focus:outline-none`;\n }\n\n // Handle combinations of invalid and focus states\n if (isInvalid && isFocused) {\n return `${baseStyles} border-feedback-error-border outline-[1.5px] outline-[var(--control-focus-ring-color-error)]`;\n }\n\n if (isInvalid) {\n return `${baseStyles} border-feedback-error-border`;\n }\n\n if (isFocused) {\n return `${baseStyles} !outline-[1.5px] !outline-[var(--control-focus-ring-color)] ![--tw-outline-style:solid]`;\n }\n\n // Default state\n return `${baseStyles}`;\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 * 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 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-sm 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-caption 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-muted\", 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 type { ListBoxItemProps as AriaListBoxItemProps } from \"react-aria-components\";\nimport { ListBoxItem as AriaListBoxItem } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst itemHeightStylesObject = {\n sm: \"py-1\",\n md: \"py-2\",\n lg: \"py-3\",\n xl: \"py-4\",\n};\n\nconst textSizeStylesObject = {\n sm: \"text-controlElementSm\",\n md: \"text-controlElementMd\",\n lg: \"text-controlElementLg\",\n xl: \"text-controlElementXl\",\n};\n\n/**\n * ListBoxItem\n *\n * A styled wrapper around `react-aria-components` ListBoxItem with size\n * variants that align with Edges typography.\n */\nexport interface ExtendedListBoxItemProps extends Omit<AriaListBoxItemProps, \"className\"> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n className?: string;\n}\n\nexport type ListBoxItemProps = ExtendedListBoxItemProps;\n\nexport function ListBoxItem({ size = \"md\", className, ...props }: ExtendedListBoxItemProps) {\n const baseClassName =\n \"flex cursor-default items-center gap-2 rounded-sm px-3 text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium\";\n\n return (\n <AriaListBoxItem\n {...props}\n className={twMerge(\n baseClassName,\n itemHeightStylesObject[size],\n textSizeStylesObject[size],\n className\n )}\n />\n );\n}\n","import React from \"react\";\nimport {\n Popover as AriaPopover,\n PopoverProps as AriaPopoverProps,\n composeRenderProps,\n OverlayArrow,\n PopoverContext,\n useSlottedContext,\n} from \"react-aria-components\";\n\n/**\n * Popover\n *\n * Positioned overlay container with optional arrow, built on\n * `react-aria-components` Popover.\n */\nexport interface PopoverProps extends Omit<AriaPopoverProps, \"children\"> {\n showArrow?: boolean;\n children: React.ReactNode;\n}\n\nfunction getPopoverStyles({\n isEntering,\n isExiting,\n className = \"\",\n}: {\n isEntering?: boolean;\n isExiting?: boolean;\n className?: string;\n}) {\n const baseStyles = [\n \"bg-white\",\n \"dark:bg-zinc-900/70\",\n \"dark:backdrop-blur-2xl\",\n \"dark:backdrop-saturate-200\",\n \"forced-colors:bg-[Canvas]\",\n \"shadow-md\",\n \"rounded-md\",\n \"overflow-hidden\",\n \"bg-clip-padding\",\n \"border\",\n \"border-gray-100\",\n \"dark:border-white/5\",\n \"dark:text-zinc-300\",\n ].join(\" \");\n\n const enteringStyles = isEntering\n ? [\n \"animate-in\",\n \"fade-in\",\n \"placement-bottom:slide-in-from-top-1\",\n \"placement-top:slide-in-from-bottom-1\",\n \"placement-left:slide-in-from-right-1\",\n \"placement-right:slide-in-from-left-1\",\n \"ease-out\",\n \"duration-200\",\n ].join(\" \")\n : \"\";\n\n const exitingStyles = isExiting\n ? [\n \"animate-out\",\n \"fade-out\",\n \"placement-bottom:slide-out-to-top-1\",\n \"placement-top:slide-out-to-bottom-1\",\n \"placement-left:slide-out-to-right-1\",\n \"placement-right:slide-out-to-left-1\",\n \"ease-in\",\n \"duration-150\",\n ].join(\" \")\n : \"\";\n\n return [baseStyles, enteringStyles, exitingStyles, className].filter(Boolean).join(\" \");\n}\n\nexport function Popover({ children, showArrow, className, ...props }: PopoverProps) {\n const popoverContext = useSlottedContext(PopoverContext)!;\n const isSubmenu = popoverContext?.trigger === \"SubmenuTrigger\";\n let offset = showArrow ? 12 : 8;\n offset = isSubmenu ? offset - 6 : offset;\n return (\n <AriaPopover\n offset={offset}\n {...props}\n className={composeRenderProps(className, (className, renderProps) =>\n getPopoverStyles({ ...renderProps, className })\n )}\n >\n {showArrow && (\n <OverlayArrow className=\"group\">\n <svg\n width={12}\n height={12}\n viewBox=\"0 0 12 12\"\n className=\"block fill-white stroke-black/10 stroke-1 group-placement-left:-rotate-90 group-placement-right:rotate-90 group-placement-bottom:rotate-180 dark:fill-[#1f1f21] dark:stroke-zinc-600 forced-colors:fill-[Canvas] forced-colors:stroke-[ButtonBorder]\"\n >\n <path d=\"M0 0 L6 6 L12 0\" />\n </svg>\n </OverlayArrow>\n )}\n {children}\n </AriaPopover>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { useFilter } from \"react-aria\";\nimport {\n Button as AriaButton,\n Input as AriaInput,\n ComboBox,\n ComboBoxStateContext,\n Group,\n Header,\n type Key,\n ListBox,\n ListBoxSection,\n ValidationResult,\n} from \"react-aria-components\";\nimport { useAsyncList } from \"react-stately\";\nimport { useDebounce } from \"../../hooks/useDebounce\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Description, FieldError, getFieldGroupStyles, Label } from \"../Field/Field\";\nimport { Icon } from \"../Icon/Icon\";\nimport { ListBoxItem } from \"../ListBoxItem/ListBoxItem\";\nimport { Popover } from \"../Popover/Popover\";\n\ninterface Item {\n id: string;\n name: string;\n}\n\ninterface Section {\n name: string;\n items: Item[];\n}\n\nconst iconSizeClassMap = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n xl: \"h-7 w-7\",\n};\n\nconst inputPaddingLeftMap = {\n sm: \"pl-7\",\n md: \"pl-9\",\n lg: \"pl-10\",\n xl: \"pl-12\",\n};\n\nconst itemHeightStylesObject = {\n sm: \"py-1\",\n md: \"py-2\",\n lg: \"py-3\",\n xl: \"py-4\",\n};\n\ntype RequestMethod = \"GET\" | \"POST\";\n\ninterface BaseRequestConfig {\n url: string;\n headers?: Record<string, string>;\n transformResponse: (data: unknown) => Item[];\n}\n\ninterface RestRequestConfig extends BaseRequestConfig {\n requestType: \"REST\";\n method?: RequestMethod;\n queryKey?: string; // For APIs that expect \"query\" in URL or JSON body\n extraParams?: Record<string, string>;\n shouldLoad?: (filterText: string) => boolean;\n}\n\ninterface GraphQLRequestConfig extends BaseRequestConfig {\n requestType: \"GraphQL\";\n graphqlQuery: string;\n variableKey?: string;\n responsePath?: string;\n shouldLoad?: (filterText: string) => boolean;\n}\n\ntype AutocompleteRequestConfig = RestRequestConfig | GraphQLRequestConfig;\n\n/**\n * Autocomplete\n *\n * Text input with typeahead suggestions and keyboard navigation.\n */\nexport interface AutocompleteProps {\n label?: string;\n staticItems?: Item[];\n sections?: Section[];\n selectedKey?: Key | null;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n requestConfig?: AutocompleteRequestConfig;\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n placeholder?: string;\n renderItem?: (item: Item) => React.ReactNode;\n renderLeftIcon?: (isLoading: boolean) => React.ReactNode;\n renderSection?: (section: Section, children: React.ReactNode) => React.ReactNode;\n errorMessage?: string | ((validation: ValidationResult) => string);\n description?: string;\n size?: Size;\n tooltip?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n isInvalid?: boolean;\n validationResult?: ValidationResult;\n showErrors?: boolean;\n autoFocus?: boolean;\n}\n\nfunction ClearButton() {\n const state = React.useContext(ComboBoxStateContext);\n return (\n <AriaButton\n // Don't inherit default Button behavior from ComboBox.\n slot={null}\n className=\"clear-button\"\n aria-label=\"Clear\"\n onPress={() => state?.setSelectedKey(null)}\n >\n ✕\n </AriaButton>\n );\n}\n\n// Helper function to get item name by key\nconst getItemName = (\n key: Key | null | undefined,\n staticItems: Item[],\n sections?: Section[]\n): string => {\n if (key == null || key === \"\") return \"\";\n const allItems = sections ? sections.flatMap((s) => s.items) : staticItems || [];\n const selectedItem = allItems.find((item) => item.id === key);\n return selectedItem ? selectedItem.name : \"\";\n};\n\nasync function handleRestRequest(\n config: RestRequestConfig,\n filterText: string,\n signal: AbortSignal\n): Promise<{ items: Item[]; error?: string }> {\n try {\n // Extract the base URL and access token from config\n const baseUrl = config.url.replace(\"{q}\", filterText);\n\n // Add query parameters\n const params = new URLSearchParams();\n if (config.extraParams) {\n Object.entries(config.extraParams).forEach(([key, value]) => {\n params.append(key, value.toString());\n });\n }\n\n // Construct final URL\n const finalUrl = `${baseUrl}${params.toString() ? \"?\" + params.toString() : \"\"}`;\n\n const response = await fetch(finalUrl, {\n method: \"GET\",\n headers: config.headers,\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const json = await response.json();\n return { items: config.transformResponse(json) };\n } catch (error) {\n console.error(\"Error in REST request:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n return { items: [], error: errorMessage };\n }\n}\n\nasync function handleGraphQLRequest(\n config: GraphQLRequestConfig,\n filterText: string,\n signal: AbortSignal\n): Promise<{ items: Item[]; error?: string }> {\n try {\n const query = config.graphqlQuery.replace(\n `$${config.variableKey || \"filter\"}`,\n `\"${filterText}\"`\n );\n\n const response = await fetch(config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n },\n body: JSON.stringify({ query }),\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n let json = await response.json();\n\n if (json.errors) {\n throw new Error(json.errors[0]?.message || \"GraphQL error occurred\");\n }\n\n // For GraphQL, traverse the response path if specified\n if (config.responsePath) {\n json = config.responsePath.split(\".\").reduce((obj, key) => obj?.[key], json);\n }\n\n return { items: config.transformResponse(json) };\n } catch (error) {\n console.error(\"Error in GraphQL request:\", error);\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n return { items: [], error: errorMessage };\n }\n}\n\nexport function Autocomplete({\n label,\n staticItems = [],\n sections,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n requestConfig,\n defaultFilter,\n placeholder,\n errorMessage,\n description,\n size = \"md\",\n tooltip,\n isRequired,\n isDisabled,\n isInvalid,\n validationResult,\n showErrors = true,\n renderItem,\n renderLeftIcon,\n renderSection,\n autoFocus = false,\n}: AutocompleteProps) {\n const triggerRef = React.useRef<HTMLDivElement>(null);\n const [triggerWidth, setTriggerWidth] = React.useState<number | undefined>();\n const [inputValue, setInputValue] = useState(() =>\n getItemName(selectedKey || defaultSelectedKey, staticItems, sections)\n );\n const [isFocused, setIsFocused] = useState(false);\n const debouncedInputValue = useDebounce(inputValue);\n const { contains } = useFilter({ sensitivity: \"base\" });\n const [error, setError] = useState<string | undefined>();\n\n const textSizeClass = controlStyles[size].text;\n const heightSizeClass = controlStyles[size].height;\n\n let dynamicItems: ReturnType<typeof useAsyncList<Item>> | null = null;\n\n useEffect(() => {\n if (autoFocus) {\n setIsFocused(true);\n }\n }, [autoFocus]);\n\n // Update trigger width when component mounts or resizes\n useEffect(() => {\n const updateTriggerWidth = () => {\n if (triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth);\n }\n };\n\n updateTriggerWidth();\n window.addEventListener(\"resize\", updateTriggerWidth);\n return () => window.removeEventListener(\"resize\", updateTriggerWidth);\n }, []);\n\n useEffect(() => {\n if (dynamicItems) {\n dynamicItems.setFilterText(debouncedInputValue);\n }\n }, [debouncedInputValue, dynamicItems]);\n\n if (requestConfig) {\n dynamicItems = useAsyncList<Item>({\n async load({ signal, filterText = \"\" }) {\n if (\n !requestConfig.url ||\n (requestConfig.shouldLoad && !requestConfig.shouldLoad(filterText))\n ) {\n return { items: [] };\n }\n\n try {\n let result;\n if (requestConfig.requestType === \"GraphQL\") {\n result = await handleGraphQLRequest(requestConfig, filterText, signal);\n } else {\n result = await handleRestRequest(requestConfig, filterText, signal);\n }\n\n setError(result.error);\n return { items: result.items };\n } catch (error) {\n console.error(\"Error loading items:\", error);\n setError(error instanceof Error ? error.message : \"Unknown error occurred\");\n return { items: [] };\n }\n },\n initialFilterText: \"\",\n });\n }\n\n if (debouncedInputValue === \"\") {\n dynamicItems = null;\n }\n\n const handleInternalSelectionChange = (key: Key | null) => {\n const newName = getItemName(key, staticItems, sections);\n setInputValue(newName);\n if (onSelectionChange) {\n onSelectionChange(key);\n }\n };\n\n const handleInternalInputChange = (text: string) => {\n setInputValue(text);\n const currentSelectedItemName = getItemName(selectedKey, staticItems, sections);\n if (selectedKey != null && text !== currentSelectedItemName) {\n if (onSelectionChange) {\n // Clear selection if input text no longer matches selected item's name\n onSelectionChange(null);\n }\n }\n };\n\n return (\n <ComboBox\n onSelectionChange={handleInternalSelectionChange}\n selectedKey={selectedKey || undefined}\n defaultSelectedKey={defaultSelectedKey || undefined}\n defaultItems={sections ? sections.flatMap((section) => section.items) : staticItems}\n items={dynamicItems ? dynamicItems.items : undefined}\n className={composeTailwindRenderProps(\"group flex flex-col\", \"w-full\")}\n menuTrigger=\"focus\"\n isDisabled={isDisabled}\n isInvalid={isInvalid || !!errorMessage}\n inputValue={inputValue}\n onInputChange={handleInternalInputChange}\n autoFocus={autoFocus}\n defaultFilter={defaultFilter || contains}\n aria-label={label || placeholder || \"Autocomplete\"}\n >\n {(state) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <Group\n ref={triggerRef}\n className={getFieldGroupStyles({\n size,\n isInvalid: isInvalid || !!errorMessage,\n isDisabled,\n isFocusWithin: isFocused || state.isOpen,\n className: \"w-full cursor-pointer\",\n })}\n aria-label={label || placeholder || \"Autocomplete\"}\n style={{ position: \"relative\" }}\n >\n {renderLeftIcon ? (\n <div className=\"absolute left-3\">{renderLeftIcon(!!dynamicItems?.isLoading)}</div>\n ) : (\n <Icon\n name=\"MagnifyingGlass\"\n className={`${iconSizeClassMap[size]} absolute left-3 text-inherit`}\n />\n )}\n <AriaInput\n className={`flex-1 min-w-0 border-none pr-3 outline-0 placeholder:text-text-placeholder ${inputPaddingLeftMap[size]} ${textSizeClass} ${heightSizeClass} ${isDisabled ? \"bg-background-muted\" : \"bg-background-input\"}`}\n placeholder={placeholder}\n disabled={isDisabled}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n />\n {inputValue && !isDisabled && <ClearButton />}\n <AriaButton\n className={`px-2 text-text-body ${textSizeClass} ${heightSizeClass} ${isDisabled ? \"bg-background-muted\" : \"bg-background-input\"}`}\n aria-label=\"Toggle menu\"\n isDisabled={isDisabled}\n >\n {({ isPressed }) => (\n <Icon name={isPressed ? \"CaretUp\" : \"CaretDown\"} className=\"h-4 w-4\" />\n )}\n </AriaButton>\n </Group>\n {description && <Description size={size}>{description}</Description>}\n {showErrors && error && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {error}\n </FieldError>\n )}\n {showErrors && typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {errorMessage}\n </FieldError>\n )}\n {showErrors && typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"text-feedback-error-text\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n <Popover\n className=\"bg-background-input shadow-xl border border-border-input/20 backdrop-blur-sm ring-1 ring-black/5\"\n style={{ minWidth: triggerWidth ? `${triggerWidth}px` : undefined }}\n >\n <ListBox\n className={`max-h-[300px] overflow-auto bg-background-input outline-none ${textSizeClass}`}\n >\n {sections\n ? sections.map((section) => {\n const sectionItems = section.items.map((item) => (\n <ListBoxItem\n key={item.id}\n id={item.id}\n textValue={item.name}\n size={size}\n className={`flex cursor-default items-center gap-2 rounded-sm px-3 ${itemHeightStylesObject[size]} text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium`}\n >\n {renderItem ? (\n renderItem(item)\n ) : (\n <>\n {item.name}\n <Icon\n name=\"X\"\n className=\"ml-auto h-4 w-4 text-text-muted opacity-0 data-[focused]:opacity-100 data-[selected]:opacity-100\"\n />\n </>\n )}\n </ListBoxItem>\n ));\n\n if (renderSection) {\n return renderSection(section, sectionItems);\n }\n\n return (\n <ListBoxSection key={section.name}>\n <Header className=\"px-3 py-1 text-sm font-bold text-text-muted\">\n {section.name}\n </Header>\n {sectionItems}\n </ListBoxSection>\n );\n })\n : (item: Item) => (\n <ListBoxItem\n key={item.id}\n id={item.id}\n textValue={item.name}\n size={size}\n className={`flex cursor-default items-center gap-2 rounded-sm px-3 ${itemHeightStylesObject[size]} text-text-body outline-none data-[focused]:bg-background-hover data-[selected]:bg-background-selected data-[selected]:font-medium`}\n >\n {renderItem ? (\n renderItem(item)\n ) : (\n <>\n {item.name}\n <Icon\n name=\"X\"\n className=\"ml-auto h-4 w-4 text-text-muted opacity-0 data-[focused]:opacity-100 data-[selected]:opacity-100\"\n />\n </>\n )}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </div>\n )}\n </ComboBox>\n );\n}\n","import { Building2, User, Users } from \"lucide-react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface AvatarProps {\n /**\n * URL of the avatar image\n */\n src?: string;\n /**\n * Alternative text for the image\n */\n alt?: string;\n /**\n * First name for generating initials\n */\n firstName?: string;\n /**\n * Last name for generating initials\n */\n lastName?: string;\n /**\n * Full name (used as fallback for alt text)\n */\n fullName?: string;\n /**\n * Click handler\n */\n onClick?: () => void;\n /**\n * Size of the avatar\n * @default \"md\"\n */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Shape of the avatar\n * @default \"circle\"\n */\n shape?: \"circle\" | \"square\";\n /**\n * Visual variant\n * @default \"user\"\n */\n variant?: \"user\" | \"team\" | \"organization\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Status indicator\n */\n status?: \"online\" | \"offline\" | \"away\" | \"busy\";\n /**\n * Whether to show a border\n * @default false\n */\n bordered?: boolean;\n}\n\n/**\n * Avatar\n *\n * Display user, team, or organization avatars with support for images,\n * initials, and fallback icons. Includes optional status indicators.\n */\nexport function Avatar({\n src,\n alt,\n firstName,\n lastName,\n fullName,\n onClick,\n size = \"md\",\n shape = \"circle\",\n variant = \"user\",\n className,\n status,\n bordered = false,\n}: AvatarProps) {\n const sizeClasses = {\n xs: \"h-6 w-6 text-xs\",\n sm: \"h-8 w-8 text-sm\",\n md: \"h-10 w-10 text-base\",\n lg: \"h-12 w-12 text-lg\",\n xl: \"h-16 w-16 text-xl\",\n };\n\n const statusSizeClasses = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n };\n\n const statusPositionClasses = {\n xs: \"bottom-0 right-0\",\n sm: \"bottom-0 right-0\",\n md: \"bottom-0 right-0\",\n lg: \"bottom-0.5 right-0.5\",\n xl: \"bottom-1 right-1\",\n };\n\n const statusColors = {\n online: \"bg-feedback-success-background border-feedback-success-border\",\n offline: \"bg-text-muted border-border-muted\",\n away: \"bg-feedback-warning-background border-feedback-warning-border\",\n busy: \"bg-feedback-error-background border-feedback-error-border\",\n };\n\n const variantColors = {\n user: \"bg-action-primary/10 text-action-primary\",\n team: \"bg-feedback-info-background text-feedback-info-text\",\n organization: \"bg-feedback-success-background text-feedback-success-text\",\n };\n\n const shapeClasses = shape === \"circle\" ? \"rounded-full\" : \"rounded-md\";\n\n const baseClasses = twMerge(\n \"relative inline-flex items-center justify-center overflow-hidden transition-opacity\",\n sizeClasses[size],\n shapeClasses,\n onClick && \"cursor-pointer hover:opacity-80\",\n bordered && \"ring-2 ring-background-surface\",\n className\n );\n\n // Generate initials from name\n const getInitials = () => {\n if (firstName || lastName) {\n const first = firstName?.[0] || \"\";\n const last = lastName?.[0] || \"\";\n return (first + last).toUpperCase();\n }\n if (fullName) {\n const parts = fullName.split(\" \");\n const first = parts[0]?.[0] || \"\";\n const last = parts[parts.length - 1]?.[0] || \"\";\n return first === last ? first.toUpperCase() : (first + last).toUpperCase();\n }\n return \"\";\n };\n\n const initials = getInitials();\n\n // Get the appropriate icon for the variant\n const getIcon = () => {\n const iconSize = {\n xs: 14,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n }[size];\n\n switch (variant) {\n case \"team\":\n return <Users size={iconSize} />;\n case \"organization\":\n return <Building2 size={iconSize} />;\n default:\n return <User size={iconSize} />;\n }\n };\n\n const renderAvatar = () => {\n // If src is provided, render image with CSS fallback\n if (src) {\n return (\n <>\n <img\n src={src}\n alt={alt || fullName || \"Avatar\"}\n className=\"h-full w-full object-cover\"\n // Use CSS to hide broken images\n style={{\n // This will hide the broken image icon\n fontSize: 0,\n }}\n />\n {/* Render fallback behind the image - will show if image fails */}\n <div className=\"absolute inset-0 flex items-center justify-center -z-10\">\n {initials ? <span className=\"font-semibold\">{initials}</span> : getIcon()}\n </div>\n </>\n );\n }\n\n // Show initials if available\n if (initials) {\n return <span className=\"font-semibold\">{initials}</span>;\n }\n\n // Show icon as fallback\n return getIcon();\n };\n\n return (\n <div className=\"relative inline-block\">\n <div\n className={twMerge(baseClasses, !src ? variantColors[variant] : \"\")}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {renderAvatar()}\n </div>\n {status && (\n <span\n className={twMerge(\n \"absolute border-2 border-background-surface\",\n shapeClasses,\n statusSizeClasses[size],\n statusPositionClasses[size],\n statusColors[status]\n )}\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface BadgeProps {\n /** The content to display inside the badge */\n children: React.ReactNode;\n /** Visual variant of the badge */\n variant?:\n | \"default\"\n | \"success\"\n | \"error\"\n | \"warning\"\n | \"info\"\n | \"primary\"\n | \"secondary\"\n | \"neutral\";\n /** Size of the badge */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Shape of the badge */\n shape?: \"pill\" | \"rounded\" | \"square\";\n /** Whether to show a dot indicator */\n dot?: boolean;\n /** Position of the dot */\n dotPosition?: \"left\" | \"right\";\n /** Additional CSS classes */\n className?: string;\n}\n\nconst badgeVariantStyles = {\n default: \"bg-feedback-info-background text-feedback-info-text\", // Default uses proper info colors\n success: \"bg-feedback-success-background text-feedback-success-text\",\n error: \"bg-feedback-error-background text-feedback-error-text\",\n warning: \"bg-feedback-warning-background text-feedback-warning-text\",\n info: \"bg-feedback-info-background text-feedback-info-text\",\n primary: \"bg-action-primary/10 text-action-primary\",\n secondary: \"bg-action-secondary/10 text-action-secondary\",\n neutral: \"bg-background-muted text-text-muted\", // Neutral gray for inactive/false states\n};\n\nconst badgeSizeStyles = {\n sm: \"px-2 py-1.5 text-xs\",\n md: \"px-3 py-2 text-sm\",\n lg: \"px-3.5 py-2.5 text-base\",\n};\n\nconst badgeShapeStyles = {\n pill: \"rounded-full\",\n rounded: \"rounded-lg\",\n square: \"rounded-sm\",\n};\n\nconst dotSizeStyles = {\n sm: \"w-1.5 h-1.5\",\n md: \"w-2 h-2\",\n lg: \"w-2.5 h-2.5\",\n};\n\n/**\n * Badge\n *\n * A non-interactive label for displaying status, counts, or categories.\n * Use for read-only indicators. For interactive elements, use Chip instead.\n */\nexport function Badge({\n children,\n variant = \"default\",\n size = \"sm\",\n shape = \"square\",\n dot = false,\n dotPosition = \"left\",\n className,\n}: BadgeProps) {\n const dotElement = dot && (\n <span\n className={twMerge(\"rounded-full bg-current opacity-75\", dotSizeStyles[size])}\n aria-hidden=\"true\"\n />\n );\n\n return (\n <span\n className={twMerge(\n \"inline-flex items-center gap-1.5 font-medium\",\n badgeSizeStyles[size],\n badgeShapeStyles[shape],\n badgeVariantStyles[variant],\n className\n )}\n >\n {dot && dotPosition === \"left\" && dotElement}\n {children}\n {dot && dotPosition === \"right\" && dotElement}\n </span>\n );\n}\n","import { ReactNode } from \"react\";\n\nexport interface TextLinkProps {\n href?: string;\n children: ReactNode;\n className?: string;\n external?: boolean;\n title?: string;\n variant?: \"default\" | \"primary\" | \"muted\";\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n asButton?: boolean;\n onPress?: () => void;\n showArrow?: boolean;\n}\n\n/**\n * TextLink\n *\n * Styled text link component for navigation and actions.\n * Supports internal/external links, button mode, and multiple visual variants.\n */\nexport const TextLink = ({\n href,\n children,\n className = \"\",\n external = false,\n title,\n variant = \"default\",\n onClick,\n asButton = false,\n onPress,\n showArrow = false,\n}: TextLinkProps) => {\n const externalProps = external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {};\n\n const baseClasses = \"hover:underline hover:decoration-1 hover:underline-offset-4 cursor-pointer\";\n\n const variantClasses = {\n default: \"text-text-link-default hover:text-text-link-hover visited:text-text-link-default\",\n primary: \"text-action-primary hover:text-action-primary-hover visited:text-action-primary\",\n muted: \"text-text-muted hover:text-text-muted visited:text-text-muted\",\n };\n\n const combinedClasses = `${baseClasses} ${variantClasses[variant]} ${className}`;\n\n const content = (\n <>\n {children}\n {showArrow && <span>{\"\\u00A0\"}→</span>}\n </>\n );\n\n if (asButton) {\n return (\n <button type=\"button\" className={combinedClasses} onClick={onPress} title={title}>\n {content}\n </button>\n );\n }\n\n return (\n <a\n href={href || \"#\"}\n className={combinedClasses}\n {...externalProps}\n title={title}\n onClick={onClick}\n >\n {content}\n </a>\n );\n};\n\nexport default TextLink;\n","\"use client\";\nimport { ChevronRight } from \"lucide-react\";\nimport {\n Breadcrumb as AriaBreadcrumb,\n Breadcrumbs as AriaBreadcrumbs,\n type BreadcrumbProps,\n type BreadcrumbsProps,\n} from \"react-aria-components\";\n\n// Re-export types for consumers\nexport type { BreadcrumbProps, BreadcrumbsProps };\n\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { TextLink } from \"../TextLink\";\n\n/**\n * Breadcrumbs\n *\n * Navigation breadcrumbs that show the user's current location in the hierarchy\n */\nexport function Breadcrumbs<T extends object>(props: BreadcrumbsProps<T>) {\n return <AriaBreadcrumbs {...props} className={twMerge(\"flex gap-1\", props.className)} />;\n}\n\n/**\n * Breadcrumb\n *\n * Individual breadcrumb item with optional link\n */\nexport function Breadcrumb(props: BreadcrumbProps & { href?: string }) {\n const { className, children, href, ...restProps } = props;\n return (\n <AriaBreadcrumb\n className={composeTailwindRenderProps(className, \"flex items-center gap-1\")}\n {...restProps}\n >\n {(renderProps) => (\n <>\n <TextLink variant=\"muted\" href={href}>\n {typeof children === \"function\" ? children(renderProps) : children}\n </TextLink>\n {href && <ChevronRight className=\"h-3 w-3 text-text-muted\" />}\n </>\n )}\n </AriaBreadcrumb>\n );\n}\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=\"primary\" size=\"md\" icon=\"Check\">Save</Button>\n * ```\n */\nexport interface ButtonProps extends BaseButtonProps {\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\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-sm whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default:\n \"bg-neutral-black text-neutral-white hover:brightness-90 forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n primary:\n \"bg-action-primary text-neutral-white hover:brightness-90 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-action-destructive border-2 border-border-muted hover:bg-action-destructive/5 forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[Mark]\",\n link: \"!text-action-primary hover:text-action-primary/90 hover:underline hover:decoration-2 hover:underline-offset-4\",\n icon: \"border-none text-text-body hover:bg-text-body/5 forced-colors:text-[ButtonText] forced-colors:hover:bg-[ButtonFace] p-2 flex-shrink-0\",\n unstyled: \"bg-transparent\",\n};\n\nconst widthStyles = {\n full: \"w-full\",\n default: \"w-fit\",\n};\n\nconst disabledStyles = \"opacity-control-hover cursor-not-allowed pointer-events-none grayscale\";\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-primary text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\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 let styles = variant === \"unstyled\" ? \"\" : `${baseStyles} ${variantStyles[variant]}`;\n\n // Add size styles using controlStyles\n if (variant !== \"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 return `${styles} ${focusRing()}`;\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 ? (\n <Icon name={icon} className={`icon-[--control-icon-size-${size}]`} weight={iconWeight} />\n ) : 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\n name=\"CircleNotch\"\n className={`animate-spin icon-[--control-icon-size-${size}]`}\n aria-hidden=\"true\"\n />\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 composedClassName = twMerge(\n getButtonStyles(props),\n className,\n isLoading ? \"aria-busy\" : \"\"\n );\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 {...linkProps} style={style} className={composedClassName}>\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 {...restProps} style={style} className={composedClassName}>\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 (badgeNumber && badgeNumber > 0) {\n return (\n <div className=\"relative\">\n {buttonOrLink}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return buttonOrLink;\n}\n","import {\n Calendar as AriaCalendar,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarProps as AriaCalendarProps,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n CalendarHeaderCell,\n DateValue,\n Heading,\n Text,\n useLocale,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\nfunction getCellStyles({ isSelected, isDisabled }: { isSelected: boolean; isDisabled: boolean }) {\n const baseStyles = [\n focusRing,\n \"w-9 h-9 text-base cursor-default rounded-full flex items-center justify-center forced-color-adjust-none\",\n ];\n\n if (isDisabled) {\n baseStyles.push(\"text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]\");\n } else if (isSelected) {\n baseStyles.push(\n \"bg-blue-600 invalid:bg-red-600 text-white forced-colors:bg-[Highlight] forced-colors:invalid:bg-[Mark] forced-colors:text-[HighlightText]\"\n );\n } else {\n baseStyles.push(\n \"text-zinc-900 dark:text-zinc-200 hover:bg-gray-100 dark:hover:bg-zinc-700 pressed:bg-gray-200 dark:pressed:bg-zinc-600\"\n );\n }\n\n return baseStyles.join(\" \");\n}\n\n/**\n * Calendar\n *\n * Single-date calendar primitive with Edges styling.\n */\nexport interface CalendarProps<T extends DateValue>\n extends Omit<AriaCalendarProps<T>, \"visibleDuration\"> {\n errorMessage?: string;\n}\n\nexport function Calendar<T extends DateValue>({ errorMessage, ...props }: CalendarProps<T>) {\n return (\n <AriaCalendar {...props}>\n <CalendarHeader />\n <CalendarGrid>\n <CalendarGridHeader />\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className={({ isSelected, isDisabled }) => getCellStyles({ isSelected, isDisabled })}\n />\n )}\n </CalendarGridBody>\n </CalendarGrid>\n {errorMessage && (\n <Text slot=\"errorMessage\" className=\"text-sm text-red-600\">\n {errorMessage}\n </Text>\n )}\n </AriaCalendar>\n );\n}\n\nexport function CalendarHeader() {\n const { direction } = useLocale();\n\n const buttonSize = 18;\n\n return (\n <header className=\"flex w-full items-center gap-1 px-1 pb-4\">\n <Button variant=\"icon\" slot=\"previous\" className=\"pl-0\">\n {direction === \"rtl\" ? (\n <Icon name=\"CaretRight\" aria-hidden size={buttonSize} />\n ) : (\n <Icon name=\"CaretLeft\" aria-hidden size={buttonSize} />\n )}\n </Button>\n <Heading className=\"text-md mx-2 flex-1 text-center font-semibold text-zinc-900 dark:text-zinc-200\" />\n <Button variant=\"icon\" slot=\"next\" className=\"pr-0\">\n {direction === \"rtl\" ? (\n <Icon name=\"CaretLeft\" aria-hidden size={buttonSize} />\n ) : (\n <Icon name=\"CaretRight\" aria-hidden size={buttonSize} />\n )}\n </Button>\n </header>\n );\n}\n\nexport function CalendarGridHeader() {\n return (\n <AriaCalendarGridHeader>\n {(day) => (\n <CalendarHeaderCell className=\"text-xs font-semibold text-text-caption\">\n {day}\n </CalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\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?: keyof JSX.IntrinsicElements;\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","\"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(--skeleton-base)] via-[var(--skeleton-highlight)] to-[var(--skeleton-base)]\"\n : \"bg-[var(--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(--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=\"primary\">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 <div className=\"p-6\">\n <Skeleton width=\"100%\" height={200} />\n </div>\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 if (isLoading) {\n return (\n <div className={twMerge(\"px-6 py-4\", 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 { Check, Minus } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport {\n Checkbox as AriaCheckbox,\n CheckboxGroup as AriaCheckboxGroup,\n CheckboxGroupProps as AriaCheckboxGroupProps,\n CheckboxProps as AriaCheckboxProps,\n CheckboxRenderProps,\n composeRenderProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Description, FieldError, Label } from \"../Field\";\n\n/**\n * CheckboxGroup\n *\n * Groups multiple checkboxes with shared label/description.\n */\nexport interface CheckboxGroupProps extends Omit<AriaCheckboxGroupProps, \"children\"> {\n label?: string;\n children?: ReactNode;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n}\n\n/**\n * Checkbox\n *\n * Single checkbox with Edges visuals.\n */\nexport interface CheckboxProps extends Omit<AriaCheckboxProps, \"children\"> {\n children?: ReactNode | ((props: CheckboxRenderProps) => ReactNode);\n}\n\nexport function CheckboxGroup(props: CheckboxGroupProps) {\n return (\n <AriaCheckboxGroup\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-2\")}\n >\n <Label>{props.label}</Label>\n {props.children}\n {props.description && <Description>{props.description}</Description>}\n <FieldError>\n {typeof props.errorMessage === \"function\" ? undefined : props.errorMessage}\n </FieldError>\n </AriaCheckboxGroup>\n );\n}\n\nfunction getCheckboxStyles({ isDisabled }: { isDisabled?: boolean }) {\n return `flex gap-2 items-center group text-sm transition ${isDisabled ? \"text-text-disabled\" : \"text-text-caption\"}`;\n}\n\nfunction getBoxStyles({\n isSelected,\n isInvalid,\n isDisabled,\n isIndeterminate,\n}: {\n isSelected?: boolean;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isIndeterminate?: boolean;\n}) {\n const baseStyles =\n \"w-5 h-5 flex-shrink-0 rounded flex items-center justify-center border-2 transition ring-offset-2 focus:ring-2 focus:ring-border-focus\";\n\n let colorStyles = \"\";\n if (isDisabled) {\n colorStyles = \"border-border-muted bg-background-muted\";\n } else if (isInvalid) {\n colorStyles = \"border-feedback-error-border bg-feedback-error-background\";\n } else if (isSelected || isIndeterminate) {\n colorStyles =\n \"bg-action-primary border-action-primary hover:bg-action-primary-hover hover:border-action-primary-hover\";\n } else {\n colorStyles = \"bg-background-input border-border-input hover:border-border-focus\";\n }\n\n return `${baseStyles} ${colorStyles}`;\n}\n\nconst iconStyles = \"w-4 h-4 text-text-onPrimary group-disabled:text-text-disabled\";\n\nexport function Checkbox(props: CheckboxProps) {\n const { children, ...otherProps } = props;\n return (\n <AriaCheckbox\n {...otherProps}\n className={composeRenderProps(\n props.className,\n (className, renderProps) => `${getCheckboxStyles(renderProps)} ${className || \"\"}`\n )}\n >\n {(renderProps) => {\n const { isSelected, isIndeterminate, ...rest } = renderProps;\n const checkboxContent = (\n <div\n className={getBoxStyles({\n isSelected,\n isIndeterminate,\n ...rest,\n })}\n >\n {isIndeterminate ? (\n <Minus aria-hidden className={iconStyles} />\n ) : isSelected ? (\n <Check aria-hidden className={iconStyles} />\n ) : null}\n </div>\n );\n\n return (\n <>\n {checkboxContent}\n {typeof children === \"function\" ? children(renderProps) : children}\n </>\n );\n }}\n </AriaCheckbox>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon/Icon\";\n\nexport interface ChipProps {\n /** The content to display inside the chip */\n children: React.ReactNode;\n /** Callback when the remove button is clicked */\n onRemove?: () => void;\n /** Size variant of the chip */\n size?: Size;\n /** Visual variant of the chip */\n variant?: \"default\" | \"primary\" | \"secondary\";\n /** Whether the chip can be removed (shows X button) */\n isRemovable?: boolean;\n /** Whether the chip is disabled */\n isDisabled?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Click handler for the chip itself (not the remove button) */\n onClick?: () => void;\n}\n\nconst chipVariantStyles = {\n default:\n \"bg-background-muted text-text-body border border-border-muted hover:bg-background-hover\",\n primary:\n \"bg-action-primary/10 text-action-primary border border-action-primary/20 hover:bg-action-primary/15\",\n secondary:\n \"bg-background-input text-text-body border border-border-input hover:bg-background-hover\",\n};\n\nconst chipSizeStyles = {\n sm: \"px-2 py-1 gap-1\",\n md: \"px-3 py-1.5 gap-1.5\",\n lg: \"px-3 py-2 gap-2\",\n xl: \"px-4 py-2.5 gap-2\",\n};\n\nconst disabledStyles = \"opacity-75 cursor-not-allowed pointer-events-none\";\n\nfunction getChipStyles(props: {\n variant: NonNullable<ChipProps[\"variant\"]>;\n size: NonNullable<ChipProps[\"size\"]>;\n isDisabled?: boolean;\n isClickable?: boolean;\n className?: string;\n}) {\n const { variant, size, isDisabled, isClickable, className } = props;\n\n return twMerge(\n // Base styles\n \"inline-flex items-center justify-center rounded-full font-medium transition-colors\",\n \"whitespace-nowrap select-none\",\n\n // Size styles\n chipSizeStyles[size],\n controlStyles[size].text,\n\n // Variant styles\n chipVariantStyles[variant],\n\n // Interactive styles\n isClickable && !isDisabled && \"cursor-pointer\",\n\n // Disabled styles\n isDisabled && disabledStyles,\n\n // Custom className\n className\n );\n}\n\n/**\n * Chip\n *\n * A compact element that represents an input, attribute, or action.\n * Can be removable with an X button and supports different variants and sizes.\n */\nexport function Chip({\n children,\n onRemove,\n size = \"md\",\n variant = \"default\",\n isRemovable = true,\n isDisabled = false,\n className,\n onClick,\n}: ChipProps) {\n const isClickable = !!onClick && !isDisabled;\n const showRemoveButton = isRemovable && onRemove && !isDisabled;\n\n const handleRemoveClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (onRemove && !isDisabled) {\n onRemove();\n }\n };\n\n const handleChipClick = () => {\n if (onClick && !isDisabled) {\n onClick();\n }\n };\n\n const chipContent = (\n <>\n <span className=\"truncate\">{children}</span>\n {showRemoveButton && (\n <button\n type=\"button\"\n onClick={handleRemoveClick}\n className=\"flex-shrink-0 rounded-full p-0.5 hover:bg-black/10 transition-colors cursor-pointer\"\n aria-label=\"Remove\"\n tabIndex={-1}\n >\n <Icon\n name=\"X\"\n size={size === \"sm\" ? 12 : size === \"md\" ? 14 : 16}\n className=\"text-current opacity-70 hover:opacity-100\"\n />\n </button>\n )}\n </>\n );\n\n if (isClickable) {\n return (\n <button\n type=\"button\"\n onClick={handleChipClick}\n className={getChipStyles({ variant, size, isDisabled, isClickable, className })}\n disabled={isDisabled}\n >\n {chipContent}\n </button>\n );\n }\n\n return (\n <span className={getChipStyles({ variant, size, isDisabled, isClickable, className })}>\n {chipContent}\n </span>\n );\n}\n","\"use client\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport AceEditor from \"react-ace\";\nimport { twMerge } from \"tailwind-merge\";\n\n// Import ace modes and themes\nimport \"ace-builds/src-noconflict/mode-json\";\nimport \"ace-builds/src-noconflict/mode-javascript\";\nimport \"ace-builds/src-noconflict/mode-typescript\";\nimport \"ace-builds/src-noconflict/mode-html\";\nimport \"ace-builds/src-noconflict/mode-css\";\nimport \"ace-builds/src-noconflict/mode-markdown\";\nimport \"ace-builds/src-noconflict/mode-yaml\";\nimport \"ace-builds/src-noconflict/mode-xml\";\nimport \"ace-builds/src-noconflict/mode-python\";\nimport \"ace-builds/src-noconflict/mode-sql\";\nimport \"ace-builds/src-noconflict/theme-github_dark\";\nimport \"ace-builds/src-noconflict/theme-github\";\nimport \"ace-builds/src-noconflict/ext-language_tools\";\n\nexport type CodeLanguage =\n | \"json\"\n | \"javascript\"\n | \"typescript\"\n | \"html\"\n | \"css\"\n | \"markdown\"\n | \"yaml\"\n | \"xml\"\n | \"python\"\n | \"sql\";\n\nexport type CodeTheme = \"github\" | \"github_dark\";\n\nexport interface CodeEditorProps {\n /**\n * The code content to display\n */\n value: string;\n /**\n * Whether the editor is read-only\n */\n readOnly?: boolean;\n /**\n * Callback when the content changes\n */\n onChange?: (value: string) => void;\n /**\n * The programming language mode\n * @default \"json\"\n */\n language?: CodeLanguage;\n /**\n * The editor theme\n * @default \"github_dark\"\n */\n theme?: CodeTheme;\n /**\n * The height of the editor. If not provided, height will be calculated based on content.\n */\n height?: string;\n /**\n * The width of the editor\n * @default \"100%\"\n */\n width?: string;\n /**\n * Additional className to apply\n */\n className?: string;\n /**\n * Line height in pixels for auto-height calculation\n * @default 19\n */\n lineHeight?: number;\n /**\n * Minimum number of lines to show when auto-sizing\n * @default 3\n */\n minLines?: number;\n /**\n * Maximum number of lines to show when auto-sizing\n * @default 50\n */\n maxLines?: number;\n /**\n * Whether to show line numbers\n * @default true\n */\n showLineNumbers?: boolean;\n /**\n * Whether to show the gutter\n * @default true\n */\n showGutter?: boolean;\n /**\n * Font size for the editor\n * @default 14\n */\n fontSize?: number;\n /**\n * Whether to wrap long lines\n * @default false\n */\n wrapEnabled?: boolean;\n}\n\n/**\n * CodeEditor\n *\n * A code editor component with syntax highlighting and various language support.\n * Built on top of Ace Editor.\n */\nexport function CodeEditor({\n value,\n readOnly = false,\n onChange,\n language = \"json\",\n theme = \"github_dark\",\n height,\n width = \"100%\",\n className,\n lineHeight = 19,\n minLines = 3,\n maxLines = 50,\n showLineNumbers = true,\n showGutter = true,\n fontSize = 14,\n wrapEnabled = false,\n}: CodeEditorProps) {\n const editorRef = useRef<AceEditor>(null);\n\n // Calculate height based on content if no height provided\n const calculatedHeight = useMemo(() => {\n if (height) return height;\n\n const lineCount = (value.match(/\\n/g) || []).length + 1;\n const lines = Math.max(minLines, Math.min(lineCount, maxLines));\n // Add some padding for the scrollbar\n return `${lines * lineHeight + 10}px`;\n }, [value, height, lineHeight, minLines, maxLines]);\n\n useEffect(() => {\n // Ensure the editor is properly sized after mounting\n if (editorRef.current?.editor) {\n editorRef.current.editor.resize();\n }\n }, [calculatedHeight]);\n\n return (\n <div\n className={twMerge(\"overflow-hidden rounded-md border border-border-input\", className)}\n style={{ width, height: calculatedHeight }}\n >\n <AceEditor\n ref={editorRef}\n mode={language}\n theme={theme}\n value={value}\n onChange={onChange}\n readOnly={readOnly}\n width=\"100%\"\n height=\"100%\"\n fontSize={fontSize}\n showPrintMargin={false}\n showGutter={showGutter}\n highlightActiveLine={!readOnly}\n setOptions={{\n useWorker: true,\n showLineNumbers,\n tabSize: 2,\n enableBasicAutocompletion: !readOnly,\n enableLiveAutocompletion: !readOnly,\n enableSnippets: !readOnly,\n showFoldWidgets: true,\n wrap: wrapEnabled,\n }}\n editorProps={{\n $blockScrolling: true,\n }}\n />\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Tooltip as AriaTooltip,\n TooltipProps as AriaTooltipProps,\n composeRenderProps,\n OverlayArrow,\n TooltipTrigger,\n} from \"react-aria-components\";\n\n/**\n * Tooltip\n *\n * Lightweight content container that appears on hover/focus/press.\n */\nexport interface TooltipProps extends Omit<AriaTooltipProps, \"children\"> {\n children: React.ReactNode;\n content: React.ReactNode;\n}\n\nconst styles = ({\n isEntering,\n isExiting,\n className,\n}: {\n isEntering?: boolean;\n isExiting?: boolean;\n className?: string;\n}) => {\n const baseClasses =\n \"max-w-[200px] group bg-slate-700 dark:bg-slate-600 border border-slate-800 dark:border-white/10 shadow-[inset_0_1px_0_0_theme(colors.gray.600)] dark:shadow-none text-white text-sm rounded-lg drop-shadow-lg will-change-transform px-3 py-1\";\n\n const enteringClasses = isEntering\n ? \"animate-in fade-in placement-bottom:slide-in-from-top-0.5 placement-top:slide-in-from-bottom-0.5 placement-left:slide-in-from-right-0.5 placement-right:slide-in-from-left-0.5 ease-out duration-200\"\n : \"\";\n\n const exitingClasses = isExiting\n ? \"animate-out fade-out placement-bottom:slide-out-to-top-0.5 placement-top:slide-out-to-bottom-0.5 placement-left:slide-out-to-right-0.5 placement-right:slide-out-to-left-0.5 ease-in duration-150\"\n : \"\";\n\n return [baseClasses, enteringClasses, exitingClasses, className].filter(Boolean).join(\" \");\n};\n\nexport function Tooltip({ children, content, ...props }: TooltipProps) {\n return (\n <TooltipTrigger delay={200}>\n {children}\n <AriaTooltip\n {...props}\n offset={10}\n className={composeRenderProps(props.className, (className, renderProps) =>\n styles({ ...renderProps, className })\n )}\n >\n <OverlayArrow>\n <svg\n width={8}\n height={8}\n viewBox=\"0 0 8 8\"\n className=\"fill-slate-700 stroke-gray-800 group-placement-left:-rotate-90 group-placement-right:rotate-90 group-placement-bottom:rotate-180 dark:fill-slate-600 dark:stroke-white/10 forced-colors:fill-[Canvas] forced-colors:stroke-[ButtonBorder]\"\n >\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n {content}\n </AriaTooltip>\n </TooltipTrigger>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface CopyToClipboardProps {\n /**\n * The value to copy to clipboard. If not provided, will use the text content of children\n */\n value?: string;\n /**\n * The content to display\n */\n children: React.ReactNode;\n /**\n * Optional className for the container\n */\n className?: string;\n /**\n * Size of the copy button, defaults to \"sm\"\n */\n size?: \"sm\" | \"md\";\n}\n\nexport function CopyToClipboard({ value, children, className, size = \"sm\" }: CopyToClipboardProps) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n const handleCopy = () => {\n const textToCopy = value || (typeof children === \"string\" ? children : \"\");\n navigator.clipboard.writeText(textToCopy);\n setShowTooltip(true);\n setTimeout(() => {\n setShowTooltip(false);\n }, 2000);\n };\n\n const iconSize = size === \"sm\" ? 14 : 16;\n\n const copyButton = (\n <Button variant=\"icon\" size={size} onPress={handleCopy} className=\"!px-2\">\n <Icon name=\"Copy\" size={iconSize} />\n </Button>\n );\n\n return (\n <div className={twMerge(\"flex items-center gap-1\", className)}>\n {children}\n {showTooltip ? <Tooltip content=\"Copied!\">{copyButton}</Tooltip> : copyButton}\n </div>\n );\n}\n","import type { ScaleLinear, ScaleTime } from \"d3-scale\";\nimport { createContext, useContext } from \"react\";\n\nexport type YFormatType =\n | \"number\"\n | \"percent\"\n | \"kWh\"\n | \"kW\"\n | \"amperes\"\n | \"temperature\"\n | \"percentageChange\"\n | \"decimal\"\n | \"currency\"\n | \"scientific\"\n | \"integer\"\n | \"logarithmic\"\n | \"timeDuration\"\n | \"compact\"\n | \"si\"\n | \"bytes\"\n | \"rate\"\n | \"ordinal\"\n | \"date\"\n | \"largeCurrency\"\n | \"coordinates\"\n | \"ranked\";\n\nexport interface TooltipData {\n xValue: Date;\n series: TooltipSeries[];\n x: number;\n y: number;\n position: \"left\" | \"right\";\n}\n\nexport interface TooltipSeries {\n label: string;\n value: number;\n color: string;\n type?: \"area\" | \"line\" | \"bar\";\n}\n\ninterface ChartContextType {\n xScale: ScaleTime<number, number>;\n yScale: ScaleLinear<number, number>;\n width: number;\n height: number;\n yFormatType: YFormatType;\n animationSettings: {\n duration: number;\n ease: string;\n };\n tooltip: {\n data: TooltipData | null;\n show: (data: TooltipData) => void;\n hide: () => void;\n };\n}\n\nexport const defaultAnimationSettings = {\n duration: 0.5,\n ease: \"easeInOut\",\n};\n\nexport const ChartContext = createContext<ChartContextType | null>(null);\n\nexport type { ChartContextType };\n\nexport const useChartContext = () => {\n const context = useContext(ChartContext);\n if (!context) {\n throw new Error(\"useChartContext must be used within a ChartContextProvider\");\n }\n return context;\n};\n","\"use client\";\n\nimport { curveLinear } from \"@visx/curve\";\nimport { AreaClosed, LinePath } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React, { useId } from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface AreaSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n categoryColors?: Record<string, string>;\n}\n\n/**\n * AreaSeries\n *\n * Chart component for rendering area charts with gradient fill.\n * Displays data as a filled area with optional line path, supporting animations and custom colors.\n */\nexport const AreaSeries: React.FC<AreaSeriesProps> = ({ data, color = \"#6b7280\" }) => {\n const uniqueGradientId = useId();\n const clipPathId = useId();\n const { xScale, yScale, animationSettings } = useChartContext();\n\n // Get the exact plotting area bounds from the scales\n const xRange = xScale.range();\n const yRange = yScale.range();\n\n return (\n <>\n <defs>\n <linearGradient id={uniqueGradientId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"50%\" stopColor={color} stopOpacity={0.1} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n <clipPath id={clipPathId}>\n <rect\n x={xRange[0]}\n y={yRange[1]}\n width={xRange[1] - xRange[0]}\n height={yRange[0] - yRange[1]}\n />\n </clipPath>\n </defs>\n\n <g clipPath={`url(#${clipPathId})`}>\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n <AreaClosed\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n yScale={yScale}\n fill={`url(#${uniqueGradientId})`}\n curve={curveLinear}\n />\n <LinePath\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n stroke={color}\n strokeWidth={3}\n curve={curveLinear}\n />\n </motion.g>\n </g>\n </>\n );\n};\n","\"use client\";\n\nimport { Bar } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React, { useId } from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface BarSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n opacity?: number;\n categoryColors?: Record<string, string>;\n}\n\n/**\n * BarSeries\n *\n * Chart component for rendering bar/column charts.\n * Displays data as vertical bars with customizable colors, opacity, and category-based coloring.\n */\nexport const BarSeries: React.FC<BarSeriesProps> = ({\n data,\n color = \"#6b7280\",\n opacity = 1,\n categoryColors = {},\n}) => {\n const { xScale, yScale, animationSettings } = useChartContext();\n const clipPathId = useId();\n\n // Get the exact plotting area bounds from the scales\n const xRange = xScale.range();\n const yRange = yScale.range();\n\n // Sort data points by time\n const sortedData = [...data].sort((a, b) => a.xValue.getTime() - b.xValue.getTime());\n\n // Calculate the time interval between points\n const timeInterval =\n sortedData.length > 1\n ? sortedData[1].xValue.getTime() - sortedData[0].xValue.getTime()\n : 15 * 60000; // Default to 15 minutes if only one point\n\n // Calculate bar width based on the time interval\n const barWidth = Math.abs(\n xScale(new Date(sortedData[0].xValue.getTime() + timeInterval)) - xScale(sortedData[0].xValue)\n );\n\n return (\n <>\n <defs>\n <clipPath id={clipPathId}>\n <rect\n x={xRange[0]}\n y={yRange[1]}\n width={xRange[1] - xRange[0]}\n height={yRange[0] - yRange[1]}\n />\n </clipPath>\n </defs>\n\n <g clipPath={`url(#${clipPathId})`}>\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n {sortedData.map((d, i) => {\n const x = xScale(d.xValue);\n const y = yScale(d.yValue);\n const height = yRange[0] - y;\n\n // Calculate this bar's width based on the next point\n const nextPoint = sortedData[i + 1];\n const thisBarWidth = nextPoint ? Math.abs(xScale(nextPoint.xValue) - x) : barWidth;\n\n // Get color based on category if available\n const barColor =\n d.category && categoryColors[d.category] ? categoryColors[d.category] : color;\n\n return (\n <Bar\n key={d.xValue.getTime()}\n x={x - thisBarWidth / 2}\n y={y}\n width={thisBarWidth}\n height={height}\n fill={barColor}\n opacity={opacity}\n rx={1}\n />\n );\n })}\n </motion.g>\n </g>\n </>\n );\n};\n","import { scaleLinear, scaleTime } from \"@visx/scale\";\nimport { extent, max, min } from \"d3-array\";\nimport { YFormatType } from \"../context/ChartContext\";\n\nexport type { YFormatType };\n\nexport interface BaseDataPoint {\n xValue: Date;\n yValue: number;\n category?: string;\n}\n\nexport interface ChartMargin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport const defaultMargin: ChartMargin = {\n top: 20,\n right: 20,\n bottom: 50,\n left: 60,\n};\n\nexport interface YFormatSettings {\n format: (value: number) => string;\n min?: number;\n max?: number;\n tickInterval?: number;\n tickFormat?: (value: number) => string;\n}\n\nexport function getYFormatSettings(formatType: YFormatType, currencySymbol = \"$\"): YFormatSettings {\n const safeFormat = (\n value: number | null | undefined,\n formatter: (v: number) => string\n ): string => {\n if (value == null) return \"-\";\n return formatter(value);\n };\n\n switch (formatType) {\n case \"number\":\n return {\n format: (value) => safeFormat(value, (v) => v.toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => v.toLocaleString()),\n };\n case \"percent\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)}%`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}%`),\n min: 0,\n max: 100,\n tickInterval: 20,\n };\n case \"kWh\":\n return {\n format: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)} kWh`),\n tickFormat: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)}`),\n };\n case \"kW\":\n return {\n format: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)} kW`),\n tickFormat: (value) => safeFormat(value, (v) => `${(v / 1000).toFixed(1)}`),\n };\n case \"amperes\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)} A`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(1)} A`),\n };\n case \"temperature\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)}°`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}°`),\n };\n case \"percentageChange\":\n return {\n format: (value) => safeFormat(value, (v) => `${v > 0 ? \"+\" : \"\"}${(v * 100).toFixed(1)}%`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${v > 0 ? \"+\" : \"\"}${(v * 100).toFixed(0)}%`),\n min: -100,\n max: 100,\n };\n case \"decimal\":\n return {\n format: (value) => safeFormat(value, (v) => v.toFixed(2)),\n tickFormat: (value) => safeFormat(value, (v) => v.toFixed(1)),\n };\n case \"currency\":\n return {\n format: (value) => safeFormat(value, (v) => `${currencySymbol}${v.toLocaleString()}`),\n tickFormat: (value) => safeFormat(value, (v) => `${currencySymbol}${v.toLocaleString()}`),\n };\n case \"scientific\":\n return {\n format: (value) => safeFormat(value, (v) => v.toExponential(2)),\n tickFormat: (value) => safeFormat(value, (v) => v.toExponential(1)),\n };\n case \"integer\":\n return {\n format: (value) => safeFormat(value, (v) => Math.round(v).toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => Math.round(v).toLocaleString()),\n };\n case \"logarithmic\":\n return {\n format: (value) => safeFormat(value, (v) => v.toExponential(1)),\n tickFormat: (value) => safeFormat(value, (v) => v.toExponential(0)),\n min: 1,\n tickInterval: 10,\n };\n case \"timeDuration\":\n return {\n format: (value) =>\n safeFormat(\n value,\n (v) => `${Math.floor(v / 60)}:${(v % 60).toString().padStart(2, \"0\")} min`\n ),\n tickFormat: (value) => safeFormat(value, (v) => `${Math.floor(v / 60)}m`),\n min: 0,\n };\n case \"compact\":\n return {\n format: (value) =>\n safeFormat(value, (v) => new Intl.NumberFormat(\"en\", { notation: \"compact\" }).format(v)),\n tickFormat: (value) =>\n safeFormat(value, (v) => new Intl.NumberFormat(\"en\", { notation: \"compact\" }).format(v)),\n };\n case \"si\":\n return {\n format: (value) =>\n safeFormat(value, (v) =>\n new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 2,\n }).format(v)\n ),\n tickFormat: (value) =>\n safeFormat(value, (v) =>\n new Intl.NumberFormat(\"en\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(v)\n ),\n };\n case \"bytes\":\n return {\n format: (value) =>\n safeFormat(value, (v) => {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let val = v;\n while (val >= 1024 && unitIndex < units.length - 1) {\n val /= 1024;\n unitIndex++;\n }\n return `${val.toFixed(1)} ${units[unitIndex]}`;\n }),\n tickFormat: (value) =>\n safeFormat(value, (v) => {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n let unitIndex = 0;\n let val = v;\n while (val >= 1024 && unitIndex < units.length - 1) {\n val /= 1024;\n unitIndex++;\n }\n return `${val.toFixed(0)} ${units[unitIndex]}`;\n }),\n min: 0,\n };\n case \"rate\":\n return {\n format: (value) => safeFormat(value, (v) => `${v.toFixed(1)} req/sec`),\n tickFormat: (value) => safeFormat(value, (v) => `${v.toFixed(0)}/s`),\n };\n case \"ordinal\":\n return {\n format: (value) =>\n safeFormat(value, (v) => {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v2 = v % 100;\n return v + (suffixes[(v2 - 20) % 10] || suffixes[v2] || suffixes[0]);\n }),\n tickFormat: (value) => safeFormat(value, (v) => v.toString()),\n min: 1,\n };\n case \"date\":\n return {\n format: (value) =>\n safeFormat(value, (v) =>\n new Intl.DateTimeFormat(\"en\", { dateStyle: \"medium\" }).format(new Date(v))\n ),\n tickFormat: (value) =>\n safeFormat(value, (v) =>\n new Intl.DateTimeFormat(\"en\", { dateStyle: \"short\" }).format(new Date(v))\n ),\n min: 0,\n };\n case \"largeCurrency\":\n return {\n format: (value) => safeFormat(value, (v) => `${currencySymbol}${(v / 1e6).toFixed(2)}M`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${currencySymbol}${(v / 1e6).toFixed(0)}M`),\n };\n case \"coordinates\":\n return {\n format: (value) =>\n safeFormat(value, (v) => `${Math.abs(v).toFixed(3)}° ${v >= 0 ? \"N\" : \"S\"}`),\n tickFormat: (value) =>\n safeFormat(value, (v) => `${Math.abs(v).toFixed(1)}° ${v >= 0 ? \"N\" : \"S\"}`),\n min: -90,\n max: 90,\n };\n case \"ranked\":\n return {\n format: (value) => safeFormat(value, (v) => `Rank: ${v}`),\n tickFormat: (value) => safeFormat(value, (v) => v.toString()),\n min: 1,\n };\n default:\n return {\n format: (value) => safeFormat(value, (v) => v.toLocaleString()),\n tickFormat: (value) => safeFormat(value, (v) => v.toLocaleString()),\n };\n }\n}\n\nexport const createXScale = (data: BaseDataPoint[], width: number) => {\n const dateExtent = extent(data, (d) => d.xValue) as [Date, Date];\n return scaleTime({\n range: [defaultMargin.left, width - defaultMargin.right],\n domain: dateExtent,\n nice: true,\n });\n};\n\nexport const createYScale = (data: BaseDataPoint[], height: number, formatType: YFormatType) => {\n const yFormatSettings = getYFormatSettings(formatType);\n const dataYMin = min(data, (d) => d.yValue) || 0;\n const dataYMax = max(data, (d) => d.yValue) || 0;\n const yMin =\n yFormatSettings.min !== undefined\n ? yFormatSettings.min\n : dataYMin >= 0\n ? 0 // 0 if all positive values, min is 0\n : dataYMin * 1.1; // else scale the negative values by 10% to make room for the y-axis values\n const yMax =\n yFormatSettings.max !== undefined\n ? yFormatSettings.max\n : dataYMax <= 0\n ? 0 // If all values are negative, max is 0\n : dataYMax * 1.1; // else scale the positive values by 10% to make room for the y-axis values\n return scaleLinear({\n range: [height - defaultMargin.bottom, defaultMargin.top],\n domain: [yMin, yMax],\n nice: true,\n });\n};\n\nexport const getResolvedColor = (cssVar: string): string => {\n if (typeof window === \"undefined\") return \"#000000\";\n\n const root = document.documentElement;\n const computedStyle = getComputedStyle(root);\n const value = computedStyle.getPropertyValue(cssVar).trim();\n\n // If it's a hex color, return it\n if (value.startsWith(\"#\")) return value;\n\n // If it's rgb/rgba, return it\n if (value.startsWith(\"rgb\")) return value;\n\n // If it's hsl, convert to hex (simplified conversion)\n if (value.startsWith(\"hsl\")) {\n // This is a simplified conversion - you might want a more robust solution\n return value;\n }\n\n // Default fallback\n return \"#000000\";\n};\n","import { Axis } from \"@visx/axis\";\nimport { ScaleLinear, ScaleTime } from \"d3-scale\";\nimport React from \"react\";\nimport { getYFormatSettings, YFormatType } from \"../../../utils/charts\";\n\ninterface AxisBottomProps {\n top: number;\n scale: ScaleTime<number, number>;\n width: number;\n}\n\nconst AxisBottom: React.FC<AxisBottomProps> = ({ top, scale, width }) => {\n return (\n <Axis\n orientation=\"bottom\"\n top={top}\n scale={scale}\n numTicks={Math.min(6, Math.floor(width / 100))}\n tickFormat={(value) => {\n const date = value as Date;\n return new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\",\n }).format(date);\n }}\n stroke=\"#e5e7eb\"\n tickStroke=\"#e5e7eb\"\n tickLabelProps={() => ({\n fill: \"#6b7280\",\n fontSize: 12,\n textAnchor: \"middle\",\n })}\n />\n );\n};\n\ninterface AxisLeftProps {\n left: number;\n scale: ScaleLinear<number, number>;\n yFormatType: YFormatType;\n}\n\nconst AxisLeft: React.FC<AxisLeftProps> = ({ left, scale, yFormatType }) => {\n const formatSettings = getYFormatSettings(yFormatType);\n\n return (\n <Axis\n orientation=\"left\"\n left={left}\n scale={scale}\n numTicks={5}\n tickFormat={(value) => {\n const tickFormat = formatSettings.tickFormat || formatSettings.format;\n return tickFormat(value as number);\n }}\n stroke=\"#e5e7eb\"\n tickStroke=\"#e5e7eb\"\n tickLabelProps={() => ({\n fill: \"#6b7280\",\n fontSize: 12,\n textAnchor: \"end\",\n dy: \"0.33em\",\n })}\n />\n );\n};\n\n/**\n * ChartAxis\n *\n * Chart axis components for rendering X and Y axes.\n * Provides formatted bottom (time) and left (numeric) axes with customizable tick formatting.\n */\nexport const ChartAxis = {\n Bottom: AxisBottom,\n Left: AxisLeft,\n};\n","import React from \"react\";\nimport { DialogTrigger, Menu, MenuItem, Popover } from \"react-aria-components\";\nimport type { ExportType } from \"../../../utils/chartExport\";\nimport { Button } from \"../../Button\";\nimport { Icon } from \"../../Icon\";\n\ninterface LegendItem {\n category: string;\n fill: string;\n}\n\nexport interface ChartBottomBarProps {\n items: LegendItem[];\n onExport: (type: ExportType) => void | Promise<void>;\n}\n\nconst Legend: React.FC<{ items: LegendItem[] }> = ({ items }) => {\n if (items.length === 0) return null;\n\n return (\n <div className=\"flex items-center gap-4\">\n {items.map((item) => (\n <div key={item.category} className=\"flex items-center gap-2\">\n <div className=\"h-3 w-3 rounded-sm\" style={{ backgroundColor: item.fill }} />\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">{item.category}</span>\n </div>\n ))}\n </div>\n );\n};\n\n/**\n * ChartBottomBar\n *\n * Chart footer component with legend and export functionality.\n * Displays color-coded legend items and provides export options for CSV, SVG, and PNG formats.\n */\nexport const ChartBottomBar: React.FC<ChartBottomBarProps> = ({ items, onExport }) => {\n const [isExporting, setIsExporting] = React.useState(false);\n const [exportingType, setExportingType] = React.useState<ExportType | null>(null);\n\n const handleExport = React.useCallback(\n async (key: React.Key) => {\n const type = key as ExportType;\n setIsExporting(true);\n setExportingType(type);\n\n try {\n await onExport(type);\n } catch (error) {\n console.error(\"Export failed:\", error);\n } finally {\n setIsExporting(false);\n setExportingType(null);\n }\n },\n [onExport]\n );\n\n return (\n <div className=\"mt-4 flex items-center justify-between overflow-y-hidden\">\n <Legend items={items} />\n <DialogTrigger>\n <Button variant=\"secondary\" size=\"sm\" isDisabled={isExporting}>\n <Icon name=\"Export\" size={16} />\n {isExporting ? \"Exporting...\" : \"Export\"}\n </Button>\n <Popover\n placement=\"top end\"\n className=\"min-w-48 p-1 bg-white dark:bg-gray-800 rounded-lg shadow-xl ring-1 ring-gray-200 dark:ring-gray-700\"\n >\n <Menu onAction={handleExport} className=\"outline-none\">\n <MenuItem\n id=\"csv\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"List\" size={14} />\n {exportingType === \"csv\" ? \"Exporting...\" : \"Export as CSV\"}\n </span>\n </MenuItem>\n <MenuItem\n id=\"svg\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"Code\" size={14} />\n {exportingType === \"svg\" ? \"Exporting...\" : \"Export as SVG\"}\n </span>\n </MenuItem>\n <MenuItem\n id=\"png\"\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded cursor-pointer outline-none\"\n isDisabled={isExporting}\n >\n <span className=\"flex items-center gap-2\">\n <Icon name=\"DownloadSimple\" size={14} />\n {exportingType === \"png\" ? \"Exporting...\" : \"Export as PNG\"}\n </span>\n </MenuItem>\n </Menu>\n </Popover>\n </DialogTrigger>\n </div>\n );\n};\n","/**\n * Chart export utilities for CSV, SVG, and PNG formats\n * Provides comprehensive export functionality for chart visualizations\n */\n\nimport { saveAs } from \"file-saver\";\nimport Papa from \"papaparse\";\nimport type React from \"react\";\nimport type { BaseDataPoint } from \"./charts\";\n\nexport type ExportType = \"csv\" | \"svg\" | \"png\";\n\nexport interface ChartExportMetadata {\n xLabel?: string;\n yLabel?: string;\n seriesLabels?: string[];\n filename?: string;\n timestamp?: boolean;\n}\n\n/**\n * Generates a filename with optional timestamp.\n *\n * @param baseFilename - Base name for the file\n * @param extension - File extension (without dot)\n * @param includeTimestamp - Whether to append timestamp (default: true)\n * @returns Complete filename with extension\n */\nfunction generateFilename(\n baseFilename: string,\n extension: string,\n includeTimestamp: boolean = true\n): string {\n const base = baseFilename || \"chart\";\n if (includeTimestamp) {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\").slice(0, -5);\n return `${base}-${timestamp}.${extension}`;\n }\n return `${base}.${extension}`;\n}\n\n/**\n * Main export function that handles all chart export types.\n * Supports CSV, SVG, and PNG formats with automatic filename generation.\n *\n * @param type - Export format: \"csv\", \"svg\", or \"png\"\n * @param datasets - Chart data as single array or array of arrays for multi-series\n * @param metadata - Export metadata including labels and filename options\n * @param svgRef - Reference to the chart's SVG element\n * @returns Promise that resolves when export is complete\n *\n * @example\n * ```typescript\n * // Export single series as CSV\n * await exportChart(\"csv\", data, {\n * xLabel: \"Date\",\n * yLabel: \"Value\",\n * filename: \"sales-data\"\n * }, svgRef);\n *\n * // Export multi-series chart as PNG\n * await exportChart(\"png\", [series1, series2], {\n * seriesLabels: [\"Revenue\", \"Profit\"],\n * timestamp: false\n * }, svgRef);\n * ```\n */\nexport async function exportChart(\n type: ExportType,\n datasets: BaseDataPoint[][] | BaseDataPoint[],\n metadata: ChartExportMetadata = {},\n svgRef: React.RefObject<SVGSVGElement>\n): Promise<void> {\n // Normalize datasets to always be an array of arrays\n const normalizedDatasets = Array.isArray(datasets[0])\n ? (datasets as BaseDataPoint[][])\n : [datasets as BaseDataPoint[]];\n\n try {\n switch (type) {\n case \"csv\":\n await exportAsCSV(normalizedDatasets, metadata);\n break;\n case \"svg\":\n await exportAsSVG(svgRef, metadata);\n break;\n case \"png\":\n await exportAsPNG(svgRef, metadata);\n break;\n default:\n throw new Error(`Unsupported export type: ${type}`);\n }\n } catch (error) {\n console.error(`Export failed:`, error);\n throw new Error(\n `Failed to export chart as ${type}: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart data as CSV\n */\nasync function exportAsCSV(\n datasets: BaseDataPoint[][],\n metadata: ChartExportMetadata\n): Promise<void> {\n try {\n // Create a map of all unique dates across all datasets\n const dateMap = new Map<number, Date>();\n datasets.forEach((dataset) => {\n dataset.forEach((point) => {\n const timestamp = point.xValue.getTime();\n if (!dateMap.has(timestamp)) {\n dateMap.set(timestamp, point.xValue);\n }\n });\n });\n\n // Sort dates chronologically\n const sortedDates = Array.from(dateMap.values()).sort((a, b) => a.getTime() - b.getTime());\n\n // Build rows with all series data\n const rows = sortedDates.map((date) => {\n const row: Record<string, string | number> = {\n [metadata.xLabel || \"Date\"]: date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n\n // Add value from each dataset\n datasets.forEach((dataset, index) => {\n const label = metadata.seriesLabels?.[index] || `Series ${index + 1}`;\n const point = dataset.find((p) => p.xValue.getTime() === date.getTime());\n row[label] = point ? point.yValue : \"\";\n\n // Add category if present\n if (point?.category) {\n row[`${label} Category`] = point.category;\n }\n });\n\n return row;\n });\n\n // Generate CSV using papaparse\n const csv = Papa.unparse(rows, {\n header: true,\n skipEmptyLines: true,\n });\n\n // Create and download the file\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const filename = generateFilename(\n metadata.filename || \"chart-data\",\n \"csv\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n } catch (error) {\n throw new Error(\n `CSV export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart as SVG\n */\nasync function exportAsSVG(\n svgRef: React.RefObject<SVGSVGElement>,\n metadata: ChartExportMetadata\n): Promise<void> {\n if (!svgRef.current) {\n throw new Error(\"SVG element not found\");\n }\n\n try {\n const svgElement = svgRef.current;\n\n // Clone the SVG to avoid modifying the original\n const svgClone = svgElement.cloneNode(true) as SVGElement;\n\n // Add background if not present\n const hasBackground = svgClone.querySelector(\"rect[data-background]\");\n if (!hasBackground) {\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"width\", svgClone.getAttribute(\"width\") || \"100%\");\n rect.setAttribute(\"height\", svgClone.getAttribute(\"height\") || \"100%\");\n rect.setAttribute(\"fill\", \"white\");\n rect.setAttribute(\"data-background\", \"true\");\n svgClone.insertBefore(rect, svgClone.firstChild);\n }\n\n // Serialize the SVG\n const serializer = new XMLSerializer();\n let svgString = serializer.serializeToString(svgClone);\n\n // Add XML declaration and namespace if not present\n if (!svgString.includes(\"<?xml\")) {\n svgString = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + svgString;\n }\n\n // Ensure SVG namespace is present\n if (!svgString.includes(\"xmlns=\")) {\n svgString = svgString.replace(\"<svg\", '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n }\n\n // Create and download the file\n const blob = new Blob([svgString], { type: \"image/svg+xml;charset=utf-8\" });\n const filename = generateFilename(\n metadata.filename || \"chart\",\n \"svg\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n } catch (error) {\n throw new Error(\n `SVG export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Export chart as PNG with high resolution\n */\nasync function exportAsPNG(\n svgRef: React.RefObject<SVGSVGElement>,\n metadata: ChartExportMetadata,\n scale: number = 2 // Default to 2x resolution for retina displays\n): Promise<void> {\n if (!svgRef.current) {\n throw new Error(\"SVG element not found\");\n }\n\n let objectUrl: string = \"\";\n\n try {\n const svgElement = svgRef.current;\n const bbox = svgElement.getBoundingClientRect();\n\n // Clone and prepare SVG\n const svgClone = svgElement.cloneNode(true) as SVGElement;\n\n // Set explicit dimensions\n svgClone.setAttribute(\"width\", String(bbox.width));\n svgClone.setAttribute(\"height\", String(bbox.height));\n\n // Remove any transform that might affect rendering\n svgClone.removeAttribute(\"transform\");\n\n // Ensure all text elements have explicit font settings for consistent rendering\n const textElements = svgClone.getElementsByTagName(\"text\");\n Array.from(textElements).forEach((text) => {\n if (!text.style.fontFamily) {\n text.style.fontFamily = \"system-ui, -apple-system, sans-serif\";\n }\n if (!text.style.fontSize) {\n text.style.fontSize = \"12px\";\n }\n });\n\n // Add white background\n const rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"width\", String(bbox.width));\n rect.setAttribute(\"height\", String(bbox.height));\n rect.setAttribute(\"fill\", \"white\");\n svgClone.insertBefore(rect, svgClone.firstChild);\n\n // Convert SVG to blob\n const serializer = new XMLSerializer();\n let svgString = serializer.serializeToString(svgClone);\n\n // Add namespace\n if (!svgString.includes(\"xmlns=\")) {\n svgString = svgString.replace(\"<svg\", '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n }\n\n const svgBlob = new Blob([svgString], { type: \"image/svg+xml;charset=utf-8\" });\n objectUrl = URL.createObjectURL(svgBlob);\n\n // Convert to PNG using canvas\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n // Set up timeout to prevent hanging\n const timeout = setTimeout(() => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error(\"Image loading timeout\"));\n }, 10000);\n\n image.onload = () => {\n clearTimeout(timeout);\n\n try {\n // Create canvas with scaling for high resolution\n const canvas = document.createElement(\"canvas\");\n canvas.width = bbox.width * scale;\n canvas.height = bbox.height * scale;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Canvas context not available\");\n }\n\n // Enable image smoothing for better quality\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n // Scale the context for high resolution\n ctx.scale(scale, scale);\n\n // Fill with white background\n ctx.fillStyle = \"white\";\n ctx.fillRect(0, 0, bbox.width, bbox.height);\n\n // Draw the image\n ctx.drawImage(image, 0, 0, bbox.width, bbox.height);\n\n // Convert canvas to blob\n canvas.toBlob(\n (blob) => {\n if (blob) {\n const filename = generateFilename(\n metadata.filename || \"chart\",\n \"png\",\n metadata.timestamp !== false\n );\n saveAs(blob, filename);\n resolve();\n } else {\n reject(new Error(\"Failed to create PNG blob\"));\n }\n\n // Clean up\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n },\n \"image/png\",\n 1.0 // Maximum quality\n );\n } catch (error) {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(error);\n }\n };\n\n image.onerror = () => {\n clearTimeout(timeout);\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error(\"Failed to load SVG as image\"));\n };\n\n // Load the image\n image.src = objectUrl;\n });\n } catch (error) {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n throw new Error(\n `PNG export failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Utility to check if export is supported in the current environment\n */\nexport function isExportSupported(type: ExportType): boolean {\n if (typeof window === \"undefined\") return false;\n\n switch (type) {\n case \"csv\":\n return true; // Always supported\n case \"svg\":\n return typeof XMLSerializer !== \"undefined\";\n case \"png\":\n return (\n typeof HTMLCanvasElement !== \"undefined\" &&\n typeof HTMLCanvasElement.prototype.toBlob === \"function\"\n );\n default:\n return false;\n }\n}\n\n/**\n * Get human-readable export format name\n */\nexport function getExportFormatName(type: ExportType): string {\n const formats: Record<ExportType, string> = {\n csv: \"CSV Spreadsheet\",\n svg: \"SVG Vector Image\",\n png: \"PNG Image\",\n };\n return formats[type] || \"Unknown Format\";\n}\n","/**\n * Color utilities for the edges design system\n * Provides theme-aware color resolution and management\n */\n\n// Cache for resolved CSS variable colors\nconst colorCache = new Map<string, string>();\n\n/**\n * Resolves a CSS variable to its computed color value\n * Supports both var(--name) format and plain --name format\n *\n * @param variableName - CSS variable name (e.g., \"--brand-primary\" or \"var(--brand-primary)\")\n * @returns Resolved color value or fallback\n */\nexport const getResolvedColor = (variableName: string, fallback = \"#000000\"): string => {\n // Early return if running in non-browser environment\n if (typeof window === \"undefined\") return fallback;\n\n // Normalize the variable name\n const varName = variableName.startsWith(\"var(\")\n ? variableName.slice(4, -1)\n : variableName.startsWith(\"--\")\n ? variableName\n : `--${variableName}`;\n\n // Return cached value if available\n if (colorCache.has(varName)) {\n return colorCache.get(varName)!;\n }\n\n try {\n // Get computed style from root element\n const root = document.documentElement;\n const computedStyle = getComputedStyle(root);\n const value = computedStyle.getPropertyValue(varName).trim();\n\n if (value) {\n // Cache the result\n colorCache.set(varName, value);\n return value;\n }\n\n // Try alternative method with temporary element\n const tempElement = document.createElement(\"div\");\n tempElement.style.color = `var(${varName})`;\n document.body.appendChild(tempElement);\n const resolvedColor = getComputedStyle(tempElement).color;\n document.body.removeChild(tempElement);\n\n if (resolvedColor && resolvedColor !== \"rgb(0, 0, 0)\") {\n colorCache.set(varName, resolvedColor);\n return resolvedColor;\n }\n\n return fallback;\n } catch (error) {\n console.warn(`Failed to resolve color for ${variableName}:`, error);\n return fallback;\n }\n};\n\n/**\n * Clears the color cache - useful when theme changes\n */\nexport const clearColorCache = () => {\n colorCache.clear();\n};\n\n/**\n * Gets theme colors from CSS variables\n * Returns an array of resolved color values\n */\nexport const getThemeCategoricalColors = (): string[] => {\n const colors: string[] = [];\n\n // Try to get categorical colors from CSS variables\n for (let i = 1; i <= 6; i++) {\n const color = getResolvedColor(`--color-data-categorical-${i}`);\n if (color) {\n colors.push(color);\n }\n }\n\n // Fallback to default palette if no theme colors found\n if (colors.length === 0) {\n return getDefaultColors();\n }\n\n return colors;\n};\n\n/**\n * Default color palette matching the edges design system\n */\nexport const getDefaultColors = (): string[] => [\n \"#444ae1\", // brand-primary\n \"#10b981\", // emerald-500\n \"#f59e0b\", // amber-500\n \"#ef4444\", // red-500\n \"#8b5cf6\", // violet-500\n \"#06b6d4\", // cyan-500\n \"#ec4899\", // pink-500\n \"#f97316\", // orange-500\n \"#14b8a6\", // teal-500\n \"#6366f1\", // indigo-500\n];\n\n/**\n * Gets the default chart color from theme\n */\nexport const getDefaultChartColor = (): string => {\n return getResolvedColor(\"--color-data-default\", \"#444ae1\");\n};\n\n/**\n * Gets sequential colors from a specific palette\n */\nexport const getSequentialColors = (\n palette: \"viridis\" | \"magma\" | \"rose\" | \"cerulean\" | \"forest\"\n): string[] => {\n const colors: string[] = [];\n\n for (let i = 1; i <= 10; i++) {\n const color = getResolvedColor(`--color-data-sequential-${palette}-${i}`);\n if (color) {\n colors.push(color);\n }\n }\n\n return colors;\n};\n\n/**\n * Gets diverging colors from a specific palette\n */\nexport const getDivergingColors = (\n palette: \"orangeYellowSeafoam\" | \"redYellowBlue\" | \"redBlue\"\n): string[] => {\n const colors: string[] = [];\n\n for (let i = 1; i <= 10; i++) {\n const color = getResolvedColor(`--color-data-diverging-${palette}-${i}`);\n if (color) {\n colors.push(color);\n }\n }\n\n return colors;\n};\n\n/**\n * Maps categories to colors based on a color scheme\n */\nexport const createCategoryColorMap = (\n categories: string[],\n customColors?: Record<string, string>\n): Record<string, string> => {\n const colorMap: Record<string, string> = {};\n const themeColors = getThemeCategoricalColors();\n\n categories.forEach((category, index) => {\n if (customColors && customColors[category]) {\n // Use custom color if provided\n colorMap[category] = customColors[category];\n } else {\n // Use theme color based on index\n colorMap[category] = themeColors[index % themeColors.length];\n }\n });\n\n return colorMap;\n};\n\n/**\n * Automatically assigns categorical colors to Mapbox layer paint properties\n * This makes it easy for consumers to get great colors without manual assignment\n */\nexport const createAutoColorPaint = (\n dataField: string, // The field to use for color assignment (e.g., \"state\", \"category\", \"type\")\n customColorMap?: Record<string, string>\n): Record<string, unknown> => {\n const defaultColor = getResolvedColor(\"--color-data-default\", \"#444ae1\");\n\n // Create a case expression for Mapbox\n const caseExpression: unknown[] = [\"case\"];\n\n // Add custom color mappings first if provided\n if (customColorMap) {\n Object.entries(customColorMap).forEach(([value, color]) => {\n caseExpression.push([\"==\", [\"get\", dataField], value], color);\n });\n }\n\n // Add default categorical color cycling\n // This will cycle through colors for any values not in customColorMap\n caseExpression.push(defaultColor);\n\n return {\n \"fill-color\": caseExpression,\n };\n};\n\n/**\n * Creates a complete layer configuration with automatic color assignment\n * Perfect for consumers who just want to pass data and get great colors\n */\nexport const createDataLayer = (\n id: string,\n dataField: string,\n options: {\n type?: \"fill\" | \"line\" | \"circle\";\n customColors?: Record<string, string>;\n opacity?: number;\n strokeWidth?: number;\n strokeColor?: string;\n } = {}\n) => {\n const { type = \"fill\", customColors, opacity = 0.7 } = options;\n\n const baseLayer = {\n id,\n type,\n paint: {\n ...createAutoColorPaint(dataField, customColors),\n [`${type === \"fill\" ? \"fill\" : \"circle\"}-opacity`]: opacity,\n },\n layout: {\n visibility: \"visible\",\n },\n };\n\n // Add stroke for fill layers\n if (type === \"fill\") {\n baseLayer.paint[\"fill-opacity\"] = opacity;\n }\n\n return baseLayer;\n};\n\n/**\n * Determines if a color is light or dark\n * Useful for determining text color on colored backgrounds\n */\nexport const isLightColor = (color: string): boolean => {\n // Convert to RGB\n const rgb = color.match(/\\d+/g);\n if (!rgb || rgb.length < 3) return true;\n\n // Calculate luminance\n const [r, g, b] = rgb.map(Number);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\n return luminance > 0.5;\n};\n\n/**\n * Gets contrasting text color for a background\n */\nexport const getContrastingTextColor = (backgroundColor: string): string => {\n if (isLightColor(backgroundColor)) {\n return getResolvedColor(\"--text-body\", \"#333333\");\n }\n return getResolvedColor(\"--neutral-white\", \"#ffffff\");\n};\n","\"use client\";\n\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport React from \"react\";\nimport { TooltipData } from \"../../../context/ChartContext\";\nimport { getYFormatSettings, YFormatType } from \"../../../utils/charts\";\n\ninterface ChartTooltipProps {\n data: TooltipData | null;\n formatType: YFormatType;\n}\n\n/**\n * ChartTooltip\n *\n * Interactive tooltip component for charts.\n * Displays formatted data values at hover position with automatic positioning and animations.\n */\nexport const ChartTooltip: React.FC<ChartTooltipProps> = ({ data, formatType }) => {\n if (!data) return null;\n\n const formatSettings = getYFormatSettings(formatType);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const [position, setPosition] = React.useState({\n x: 0,\n y: 0,\n translate: \"translate(-50%, -100%)\",\n });\n\n React.useEffect(() => {\n if (!tooltipRef.current) return;\n\n const tooltip = tooltipRef.current;\n const rect = tooltip.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n\n const x = data.x;\n let y = data.y;\n const translate =\n data.position === \"left\" ? \"translate(calc(-100% - 16px), -50%)\" : \"translate(16px, -50%)\";\n\n // Handle vertical positioning\n if (y - rect.height / 2 < 0) {\n y = rect.height / 2;\n } else if (y + rect.height / 2 > viewportHeight) {\n y = viewportHeight - rect.height / 2;\n }\n\n setPosition({ x, y, translate });\n }, [data.x, data.y, data.position]);\n\n const formatDate = (date: Date) => {\n return new Intl.DateTimeFormat(\"en\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date);\n };\n\n return (\n <AnimatePresence>\n <motion.div\n ref={tooltipRef}\n role=\"tooltip\"\n aria-live=\"polite\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n data-testid=\"tooltip\"\n className=\"pointer-events-none absolute z-50 rounded-lg bg-white p-4 text-sm shadow-xl ring-1 ring-gray-200 dark:bg-gray-800 dark:ring-gray-700\"\n style={{\n left: position.x,\n top: position.y,\n transform: position.translate,\n }}\n >\n <time className=\"mb-1 font-medium text-gray-900 dark:text-gray-100\">\n {formatDate(data.xValue)}\n </time>\n <ul className=\"list-none p-0\">\n {data.series.map((series) => (\n <li key={series.label} className=\"flex items-center gap-2 py-0.5\">\n <div className=\"h-2 w-2 rounded-full\" style={{ backgroundColor: series.color }} />\n <span className=\"font-medium text-gray-700 dark:text-gray-300\">{series.label}:</span>\n <span className=\"text-gray-600 dark:text-gray-400\">\n {formatSettings.format(series.value)}\n </span>\n </li>\n ))}\n </ul>\n </motion.div>\n </AnimatePresence>\n );\n};\n","\"use client\";\n\nimport { curveLinear } from \"@visx/curve\";\nimport { LinePath } from \"@visx/shape\";\nimport { motion } from \"framer-motion\";\nimport React from \"react\";\nimport { useChartContext } from \"../../../context/ChartContext\";\nimport { BaseDataPoint } from \"../../../utils/charts\";\n\ninterface LineSeriesProps {\n data: BaseDataPoint[];\n color?: string;\n label?: string;\n strokeWidth?: number;\n /** CSS stroke-dasharray value (e.g. \"4 2\" for dotted, \"8 4\" for dashed) */\n strokeDasharray?: string;\n categoryColors?: Record<string, string>;\n}\n\n/**\n * LineSeries\n *\n * Chart component for rendering line charts.\n * Displays data as a continuous line with customizable stroke width, color, and dash patterns.\n */\nexport const LineSeries: React.FC<LineSeriesProps> = ({\n data,\n color = \"#6b7280\",\n strokeWidth = 3,\n strokeDasharray,\n}) => {\n const { xScale, yScale, animationSettings } = useChartContext();\n const yRange = yScale.range();\n\n return (\n <motion.g\n initial={{ scaleY: 0 }}\n animate={{ scaleY: 1 }}\n transition={{\n duration: animationSettings.duration,\n ease: animationSettings.ease as \"easeInOut\",\n }}\n style={{\n transformOrigin: `0 ${yRange[0]}px`,\n transformBox: \"fill-box\",\n isolation: \"isolate\",\n }}\n >\n <LinePath\n data={data}\n x={(d) => xScale(d.xValue)}\n y={(d) => yScale(d.yValue)}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeDasharray={strokeDasharray}\n strokeLinecap=\"round\"\n curve={curveLinear}\n />\n </motion.g>\n );\n};\n","\"use client\";\n\nimport { withParentSize } from \"@visx/responsive\";\nimport { Line } from \"@visx/shape\";\nimport { bisector } from \"d3-array\";\nimport React, { Children, isValidElement, useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n ChartContext,\n defaultAnimationSettings,\n TooltipData,\n YFormatType,\n} from \"../../../context/ChartContext\";\nimport { type ExportType, exportChart } from \"../../../utils/chartExport\";\nimport { BaseDataPoint, createXScale, createYScale, defaultMargin } from \"../../../utils/charts\";\nimport { getDefaultChartColor, getThemeCategoricalColors } from \"../../../utils/colors\";\nimport { Skeleton } from \"../../Skeleton\";\nimport { AreaSeries } from \"../AreaSeries\";\nimport { BarSeries } from \"../BarSeries\";\nimport { ChartAxis } from \"../ChartAxis\";\nimport { ChartBottomBar } from \"../ChartBottomBar\";\nimport { ChartTooltip } from \"../ChartTooltip\";\nimport { LineSeries } from \"../LineSeries\";\n\ninterface ChartContainerProps {\n children: React.ReactNode;\n parentWidth: number;\n parentHeight: number;\n yFormatType?: YFormatType;\n isLoading?: boolean;\n}\n\nconst bisectDate = bisector<BaseDataPoint, Date>((d) => d.xValue).left;\n\nconst ChartEmptyState: React.FC = () => (\n <div className=\"flex h-full items-center justify-center\">\n <p className=\"text-gray-500\">No data available</p>\n </div>\n);\n\nconst ChartLoading: React.FC = () => (\n <div className=\"flex h-full flex-col gap-4 p-4\">\n <Skeleton className=\"h-full w-full\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n);\n\nconst VisXChartContainer: React.FC<ChartContainerProps> = ({\n parentWidth,\n parentHeight,\n yFormatType = \"number\",\n isLoading = false,\n children,\n}) => {\n const [tooltipData, setTooltipData] = useState<TooltipData | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const lastMoveRef = useRef<number>(0);\n\n // Get theme-aware colors\n const themeColors = useMemo(() => getThemeCategoricalColors(), []);\n const defaultColor = useMemo(() => getDefaultChartColor(), []);\n\n // Extract datasets and metadata from children, and assign colors\n const { datasets, seriesMetadata } = useMemo(() => {\n const data: BaseDataPoint[][] = [];\n const metadata: Array<{ label: string; color: string }> = [];\n let seriesIndex = 0;\n\n // Count total series\n const totalSeries = Children.toArray(children).filter(\n (child) =>\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries) &&\n child.props.data\n ).length;\n\n Children.forEach(children, (child) => {\n if (\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries) &&\n child.props.data\n ) {\n data.push(child.props.data);\n\n // Use provided color or default\n const color =\n child.props.color ||\n (totalSeries === 1 ? defaultColor : themeColors[seriesIndex % themeColors.length]);\n\n metadata.push({\n label: child.props.label || `Series ${data.length}`,\n color,\n });\n seriesIndex++;\n }\n });\n return { datasets: data, seriesMetadata: metadata };\n }, [children]);\n\n const width = parentWidth;\n const height = parentHeight - 60; // Subtract ChartBottomBar height\n\n // Combine all datasets for scale creation\n const allData = useMemo(() => datasets.flat(), [datasets]);\n\n // Create scales based on all data\n const xScale = useMemo(() => createXScale(allData, width), [allData, width]);\n const yScale = useMemo(\n () => createYScale(allData, height, yFormatType),\n [allData, height, yFormatType]\n );\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<SVGRectElement>) => {\n const { left } = svgRef.current?.getBoundingClientRect() || { left: 0 };\n const mouseX = event.clientX - left;\n\n // Throttle the mousemove event\n if (event.timeStamp - (lastMoveRef.current || 0) < 16) {\n return;\n }\n lastMoveRef.current = event.timeStamp;\n\n // Find the closest x value\n const xValue = xScale.invert(mouseX);\n\n // Find the nearest points from all series\n const seriesData = datasets\n .map((data, datasetIndex) => {\n if (!data || data.length === 0) return null;\n\n const idx = bisectDate(data, xValue, 1);\n if (idx === 0) return { point: data[0], datasetIndex };\n if (idx >= data.length) return { point: data[data.length - 1], datasetIndex };\n\n const d0 = data[idx - 1];\n const d1 = data[idx];\n if (!d0 || !d1) return null;\n\n const distanceToD0 = Math.abs(d0.xValue.getTime() - xValue.getTime());\n const distanceToD1 = Math.abs(d1.xValue.getTime() - xValue.getTime());\n const closestPoint = distanceToD0 < distanceToD1 ? d0 : d1;\n\n return { point: closestPoint, datasetIndex };\n })\n .filter(\n (item): item is { point: BaseDataPoint; datasetIndex: number } =>\n item !== null && seriesMetadata[item.datasetIndex] !== undefined\n )\n .map(({ point, datasetIndex }) => ({\n label: seriesMetadata[datasetIndex].label,\n value: point.yValue,\n color: seriesMetadata[datasetIndex].color,\n point,\n }));\n\n if (seriesData.length === 0) {\n setTooltipData(null);\n return;\n }\n\n const tooltipX = xScale(seriesData[0].point.xValue);\n const shouldShowLeft =\n tooltipX > (width - defaultMargin.right - defaultMargin.left) / 2 + defaultMargin.left;\n\n setTooltipData({\n xValue: seriesData[0].point.xValue,\n series: seriesData.map(({ label, value, color }) => ({\n label,\n value,\n color,\n })),\n x: tooltipX,\n y: yScale(seriesData[0].value),\n position: shouldShowLeft ? \"left\" : \"right\",\n });\n },\n [datasets, seriesMetadata, xScale, yScale, width]\n );\n\n const handleMouseLeave = () => {\n setTooltipData(null);\n };\n\n const contextValue = {\n width,\n height,\n xScale,\n yScale,\n yFormatType,\n animationSettings: defaultAnimationSettings,\n tooltip: {\n data: tooltipData,\n show: setTooltipData,\n hide: () => setTooltipData(null),\n },\n };\n\n // Clone children with assigned colors\n const coloredChildren = Children.map(children, (child, index) => {\n if (\n isValidElement(child) &&\n (child.type === AreaSeries || child.type === LineSeries || child.type === BarSeries)\n ) {\n return React.cloneElement(child, {\n ...child.props,\n color: seriesMetadata[index]?.color,\n });\n }\n return child;\n });\n\n // Get unique series for the legend\n const uniqueSeries = seriesMetadata.map((meta) => ({\n category: meta.label,\n fill: meta.color,\n }));\n\n // Handle export\n const handleExport = useCallback(\n async (type: ExportType) => {\n try {\n await exportChart(\n type,\n datasets,\n {\n xLabel: \"Date\",\n yLabel: \"Value\",\n seriesLabels: seriesMetadata.map((s) => s.label),\n timestamp: true,\n },\n svgRef\n );\n } catch (error) {\n console.error(\"Export failed:\", error);\n // In a real app, you'd show a user-friendly error message here\n }\n },\n [datasets, seriesMetadata]\n );\n\n // Return loading state if isLoading is true\n if (isLoading) {\n return <ChartLoading />;\n }\n\n // Check if we have any data\n if (datasets.length === 0) {\n return <ChartEmptyState />;\n }\n\n return (\n <div className=\"relative flex h-full flex-col\">\n <ChartContext.Provider value={contextValue}>\n <svg width={width} height={height} className=\"overflow-visible\" ref={svgRef}>\n {/* Grid lines */}\n <g>\n {yScale.ticks(5).map((tickValue) => (\n <Line\n key={`grid-line-${tickValue}`}\n from={{ x: defaultMargin.left, y: yScale(tickValue) }}\n to={{ x: width - defaultMargin.right, y: yScale(tickValue) }}\n stroke=\"#e5e7eb\"\n strokeWidth={1}\n />\n ))}\n </g>\n\n {/* Render series */}\n {coloredChildren}\n\n {/* Axes */}\n <ChartAxis.Bottom\n top={height - defaultMargin.bottom}\n scale={xScale}\n width={width - defaultMargin.left - defaultMargin.right}\n />\n <ChartAxis.Left left={defaultMargin.left} scale={yScale} yFormatType={yFormatType} />\n\n {/* Tooltip highlights */}\n {tooltipData?.series.map((series) => (\n <g key={`highlight-${series.label}`}>\n <circle\n cx={xScale(tooltipData.xValue)}\n cy={yScale(series.value)}\n r={8}\n fill=\"white\"\n stroke={series.color}\n strokeWidth={2}\n style={{ transition: \"all 100ms ease-out\" }}\n />\n <circle\n cx={xScale(tooltipData.xValue)}\n cy={yScale(series.value)}\n r={4}\n fill={series.color}\n style={{ transition: \"all 100ms ease-out\" }}\n />\n </g>\n ))}\n\n {/* Interactive area */}\n <rect\n x={defaultMargin.left}\n y={defaultMargin.top}\n width={width - defaultMargin.left - defaultMargin.right}\n height={height - defaultMargin.top - defaultMargin.bottom}\n fill=\"transparent\"\n style={{ cursor: \"crosshair\" }}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n />\n </svg>\n\n <ChartTooltip data={tooltipData} formatType={yFormatType} />\n <ChartBottomBar onExport={handleExport} items={uniqueSeries} />\n </ChartContext.Provider>\n </div>\n );\n};\n\n/**\n * ChartContainer\n *\n * Main chart wrapper component that provides context and layout for chart visualizations.\n * Handles scaling, tooltips, axes, and data management for area, line, and bar charts.\n */\n// Type assertion to fix React 19 compatibility issue with withParentSize HOC\nexport const ChartContainer = withParentSize(VisXChartContainer) as unknown as React.FC<\n Omit<ChartContainerProps, \"parentWidth\" | \"parentHeight\">\n>;\n","import type { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { CellAlignment, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\n\n/**\n * Get alignment classes for cell content\n */\nexport function getCellAlignmentClasses(align: CellAlignment = \"left\"): string {\n switch (align) {\n case \"center\":\n return \"justify-center text-center\";\n case \"right\":\n return \"justify-end text-right\";\n default:\n return \"justify-start text-left\";\n }\n}\n\n/**\n * Get text styling based on emphasis level\n */\nexport function getCellTextClasses(emphasis: CellEmphasis = \"normal\", isLink?: boolean): string {\n const emphasisClasses = {\n high: \"font-semibold text-text-body\",\n normal: \"text-text-body\",\n low: \"text-text-muted\",\n };\n\n return twMerge(\n emphasisClasses[emphasis],\n isLink && \"hover:text-action-primary cursor-pointer transition-colors\"\n );\n}\n\n/**\n * Get container classes for cells\n */\nexport function getCellContainerClasses(\n align: CellAlignment = \"left\",\n additionalClasses?: string\n): string {\n return twMerge(\"flex items-center gap-1\", getCellAlignmentClasses(align), additionalClasses);\n}\n\n/**\n * Format empty/null values consistently\n */\nexport function formatEmptyValue(value: unknown, emptyText: string = \"—\"): string {\n if (value === null || value === undefined || value === \"\") {\n return emptyText;\n }\n return String(value);\n}\n\n/**\n * Common loading skeleton sizes\n */\nexport const SKELETON_SIZES = {\n xs: \"h-4 w-12\",\n sm: \"h-4 w-20\",\n md: \"h-4 w-24\",\n lg: \"h-4 w-32\",\n xl: \"h-4 w-40\",\n} as const;\n\n/**\n * Get skeleton size based on emphasis level\n */\nexport function getSkeletonSize(emphasis: CellEmphasis = \"normal\"): string {\n const sizeMap = {\n high: SKELETON_SIZES.lg,\n normal: SKELETON_SIZES.md,\n low: SKELETON_SIZES.sm,\n };\n return sizeMap[emphasis];\n}\n\n/**\n * Resolve a value that can be either static or dynamic (function)\n */\nexport function resolveValue<T, R>(value: R | ((row: T) => R), row: T): R {\n return typeof value === \"function\" ? (value as (row: T) => R)(row) : value;\n}\n\n/**\n * Common badge/chip styles for status indicators\n */\nexport function getBadgeClasses(\n variant: \"success\" | \"error\" | \"warning\" | \"info\" | \"neutral\" = \"neutral\",\n size: \"sm\" | \"md\" = \"sm\"\n): string {\n const sizeClasses = size === \"sm\" ? \"px-2 py-0.5 text-xs\" : \"px-2.5 py-1 text-sm\";\n\n const variantClasses = {\n success: \"bg-green-100 text-green-800\",\n error: \"bg-red-100 text-red-800\",\n warning: \"bg-yellow-100 text-yellow-800\",\n info: \"bg-blue-100 text-blue-800\",\n neutral: \"bg-gray-100 text-gray-800\",\n };\n\n return twMerge(\n \"inline-flex items-center rounded-full font-medium\",\n sizeClasses,\n variantClasses[variant]\n );\n}\n\n/**\n * Determine badge variant from boolean value\n */\nexport function getBooleanBadgeVariant(value: boolean): \"success\" | \"neutral\" {\n return value ? \"success\" : \"neutral\";\n}\n\n/**\n * Get color classes for numeric values\n */\nexport function getNumericColorClasses(value: number, colorCode: boolean = false): string {\n if (!colorCode) return \"text-text-body\";\n\n if (value > 0) return \"text-green-600\";\n if (value < 0) return \"text-red-600\";\n return \"text-text-body\";\n}\n\n/**\n * Get link styling classes based on behavior\n */\nexport function getLinkClasses(behavior: LinkBehavior = \"hover\"): string {\n switch (behavior) {\n case \"visible\":\n return \"text-action-primary underline hover:text-action-primary-hover cursor-pointer\";\n case \"hover\":\n return \"hover:underline hover:text-action-primary cursor-pointer transition-colors\";\n case \"none\":\n return \"cursor-pointer\";\n default:\n return \"\";\n }\n}\n\n/**\n * Wrap content with link if href is provided\n */\nexport function wrapWithLink<T>(\n content: ReactNode,\n href?: string | ((row: T) => string),\n row?: T,\n linkBehavior: LinkBehavior = \"hover\",\n className?: string\n): ReactNode {\n if (!href) return content;\n\n const resolvedHref = typeof href === \"function\" && row ? href(row) : (href as string);\n const linkClasses = getLinkClasses(linkBehavior);\n\n return (\n <a\n href={resolvedHref}\n className={twMerge(linkClasses, className)}\n onClick={(e) => {\n // Allow cmd/ctrl click for new tab\n if (e.metaKey || e.ctrlKey) return;\n // Otherwise, you could handle client-side routing here if needed\n }}\n >\n {content}\n </a>\n );\n}\n","import { Button } from \"../../Button\";\nimport { Icon, type IconName } from \"../../Icon\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps } from \"../DataTable.types\";\nimport { getCellContainerClasses, resolveValue, SKELETON_SIZES } from \"./cellUtils\";\n\n/**\n * Action configuration for ActionCell\n */\nexport interface Action<T = any> {\n id: string;\n label?: string;\n icon?: IconName;\n onClick: (row: T) => void;\n disabled?: boolean | ((row: T) => boolean);\n hidden?: boolean | ((row: T) => boolean);\n variant?: \"primary\" | \"secondary\" | \"icon\";\n}\n\nexport interface ActionCellProps<T = any> extends CellComponentProps<T> {\n actions: Action<T>[];\n align?: \"left\" | \"center\" | \"right\";\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\n/**\n * ActionCell\n *\n * DataTable cell component for rendering action buttons within table rows.\n * Supports multiple actions with icons, labels, and conditional visibility/disabled states.\n */\nexport function ActionCell<T = any>({\n row,\n context,\n actions,\n align = \"right\",\n size = \"sm\",\n}: ActionCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={SKELETON_SIZES.sm} />;\n }\n\n const visibleActions = actions.filter((action) => {\n const hidden = resolveValue(action.hidden, row);\n return !hidden;\n });\n\n if (visibleActions.length === 0) {\n return null;\n }\n\n const className = getCellContainerClasses(align);\n\n return (\n <div className={className}>\n {visibleActions.map((action) => {\n const disabled = resolveValue(action.disabled, row);\n\n if (action.variant === \"icon\" || !action.label) {\n return (\n <Button\n key={action.id}\n variant=\"icon\"\n size={size}\n onPress={() => {\n action.onClick(row);\n }}\n isDisabled={disabled}\n aria-label={action.label || action.id}\n >\n <Icon name={action.icon || \"DotsThree\"} size={size === \"sm\" ? 16 : 20} />\n </Button>\n );\n }\n\n return (\n <Button\n key={action.id}\n variant={action.variant || \"secondary\"}\n size={size}\n onPress={() => {\n action.onClick(row);\n }}\n isDisabled={disabled}\n >\n {action.icon && <Icon name={action.icon} size={size === \"sm\" ? 14 : 16} />}\n {action.label}\n </Button>\n );\n })}\n </div>\n );\n}\n","import { Badge } from \"../../Badge\";\nimport { Icon, type IconName } from \"../../Icon\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis } from \"../DataTable.types\";\nimport { getCellContainerClasses, getCellTextClasses, getSkeletonSize } from \"./cellUtils\";\n\nexport interface BooleanCellProps<T = any> extends CellComponentProps<T> {\n format?: \"icon\" | \"text\" | \"badge\";\n trueText?: string;\n falseText?: string;\n trueIcon?: IconName;\n falseIcon?: IconName;\n showFalse?: boolean; // Whether to show false values or leave empty\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n}\n\n/**\n * BooleanCell\n *\n * DataTable cell component for displaying boolean values.\n * Supports multiple display formats including icons, text, or badges with customizable true/false representations.\n */\nexport function BooleanCell<T = any>({\n value,\n context,\n format = \"icon\",\n trueText = \"Yes\",\n falseText = \"No\",\n trueIcon = \"Check\",\n falseIcon = \"X\",\n showFalse = true,\n align = \"center\",\n emphasis = \"normal\",\n}: BooleanCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n const boolValue = Boolean(value);\n\n if (!boolValue && !showFalse) {\n return <div className={getCellContainerClasses(align)} />;\n }\n\n const containerClassName = getCellContainerClasses(align);\n\n switch (format) {\n case \"icon\":\n return (\n <div className={containerClassName}>\n <Icon\n name={boolValue ? trueIcon : falseIcon}\n size={16}\n className={boolValue ? \"text-green-600\" : \"text-gray-400\"}\n />\n </div>\n );\n\n case \"text\":\n return (\n <div className={containerClassName}>\n <span className={getCellTextClasses(emphasis)}>{boolValue ? trueText : falseText}</span>\n </div>\n );\n\n case \"badge\":\n return (\n <div className={containerClassName}>\n <Badge variant={boolValue ? \"success\" : \"neutral\"} size=\"sm\">\n {boolValue ? trueText : falseText}\n </Badge>\n </div>\n );\n\n default:\n return null;\n }\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n getCellContainerClasses,\n getCellTextClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface DateCellProps<T = any> extends CellComponentProps<T> {\n format?: \"date\" | \"time\" | \"datetime\" | \"relative\" | \"custom\";\n customFormat?: Intl.DateTimeFormatOptions;\n emptyText?: string;\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n}\n\n/**\n * DateCell\n *\n * DataTable cell component for displaying date and time values.\n * Supports multiple formats including relative time, with optional linking capabilities.\n */\nexport function DateCell<T = any>({\n value,\n row,\n context,\n format = \"date\",\n customFormat,\n emptyText = \"—\",\n align = \"left\",\n emphasis = \"normal\",\n href,\n linkBehavior = \"hover\",\n}: DateCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n if (!value) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n const date = value instanceof Date ? value : new Date(value);\n\n if (isNaN(date.getTime())) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n let formattedValue: string;\n\n switch (format) {\n case \"date\":\n formattedValue = date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n break;\n case \"time\":\n formattedValue = date.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n break;\n case \"datetime\":\n formattedValue = date.toLocaleString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n break;\n case \"relative\":\n formattedValue = getRelativeTime(date);\n break;\n case \"custom\":\n formattedValue = customFormat\n ? date.toLocaleString(\"en-US\", customFormat)\n : date.toISOString();\n break;\n default:\n formattedValue = date.toLocaleDateString();\n }\n\n const className = getCellContainerClasses(align, getCellTextClasses(emphasis));\n\n // If href is provided, wrap with link behavior\n const resolvedHref = resolveValue(href, row);\n if (resolvedHref) {\n return (\n <div className={className}>\n {wrapWithLink(formattedValue, resolvedHref, row, linkBehavior)}\n </div>\n );\n }\n\n return <div className={className}>{formattedValue}</div>;\n}\n\nfunction getRelativeTime(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInSecs = Math.floor(diffInMs / 1000);\n const diffInMins = Math.floor(diffInSecs / 60);\n const diffInHours = Math.floor(diffInMins / 60);\n const diffInDays = Math.floor(diffInHours / 24);\n\n if (diffInSecs < 60) {\n return \"just now\";\n } else if (diffInMins < 60) {\n return `${diffInMins} minute${diffInMins !== 1 ? \"s\" : \"\"} ago`;\n } else if (diffInHours < 24) {\n return `${diffInHours} hour${diffInHours !== 1 ? \"s\" : \"\"} ago`;\n } else if (diffInDays < 7) {\n return `${diffInDays} day${diffInDays !== 1 ? \"s\" : \"\"} ago`;\n } else {\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n getCellContainerClasses,\n getCellTextClasses,\n getNumericColorClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface NumberCellProps<T = any> extends CellComponentProps<T> {\n format?: \"number\" | \"currency\" | \"percent\" | \"compact\";\n decimals?: number;\n prefix?: string;\n suffix?: string;\n emptyText?: string;\n align?: \"left\" | \"center\" | \"right\";\n emphasis?: CellEmphasis;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n showPositiveSign?: boolean;\n colorCode?: boolean; // Green for positive, red for negative\n}\n\n/**\n * NumberCell\n *\n * DataTable cell component for displaying numeric values.\n * Supports currency, percentage, and compact formatting with optional color coding for positive/negative values.\n */\nexport function NumberCell<T = any>({\n value,\n row,\n context,\n format = \"number\",\n decimals = 0,\n prefix,\n suffix,\n emptyText = \"—\",\n align = \"right\",\n emphasis = \"normal\",\n href,\n linkBehavior = \"hover\",\n showPositiveSign = false,\n colorCode = false,\n}: NumberCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n if (value === null || value === undefined || isNaN(Number(value))) {\n return <div className={getCellContainerClasses(align, \"text-text-muted\")}>{emptyText}</div>;\n }\n\n const numValue = Number(value);\n let formattedValue: string;\n\n switch (format) {\n case \"currency\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue);\n break;\n case \"percent\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n style: \"percent\",\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue / 100);\n break;\n case \"compact\":\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n minimumFractionDigits: decimals > 0 ? 1 : 0,\n maximumFractionDigits: decimals,\n }).format(numValue);\n break;\n default:\n formattedValue = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(numValue);\n }\n\n const sign = showPositiveSign && numValue > 0 ? \"+\" : \"\";\n const displayValue = `${sign}${formattedValue}`;\n\n // Combine emphasis classes with color coding if enabled\n const textClasses = colorCode\n ? getNumericColorClasses(numValue, true)\n : getCellTextClasses(emphasis);\n\n const className = getCellContainerClasses(align, textClasses);\n\n const content = (\n <>\n {prefix && <span className=\"text-text-muted\">{prefix}</span>}\n <span>{displayValue}</span>\n {suffix && <span className=\"text-text-muted\">{suffix}</span>}\n </>\n );\n\n // If href is provided, wrap with link behavior\n const resolvedHref = resolveValue(href, row);\n if (resolvedHref) {\n return (\n <div className={className}>{wrapWithLink(content, resolvedHref, row, linkBehavior)}</div>\n );\n }\n\n return <div className={className}>{content}</div>;\n}\n","import { Checkbox } from \"../../Checkbox\";\nimport { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps } from \"../DataTable.types\";\nimport { getCellContainerClasses, resolveValue } from \"./cellUtils\";\n\nexport interface SelectCellProps<T = any> extends CellComponentProps<T> {\n isSelected?: boolean;\n onSelect?: (row: T, checked: boolean) => void;\n isDisabled?: boolean | ((row: T) => boolean);\n align?: \"left\" | \"center\" | \"right\";\n}\n\n/**\n * SelectCell\n *\n * DataTable cell component for row selection.\n * Renders a checkbox that allows users to select individual rows in the table.\n */\nexport function SelectCell<T = any>({\n row,\n context,\n isSelected = false,\n onSelect,\n isDisabled = false,\n align = \"center\",\n}: SelectCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return (\n <div className={getCellContainerClasses(align)}>\n <Skeleton className=\"h-4 w-4 rounded\" />\n </div>\n );\n }\n\n const disabled = resolveValue(isDisabled, row);\n const className = getCellContainerClasses(align);\n\n return (\n <div className={className}>\n <Checkbox\n isSelected={isSelected}\n onChange={(checked) => {\n onSelect?.(row, checked);\n }}\n isDisabled={disabled}\n aria-label={`Select row`}\n />\n </div>\n );\n}\n","import { Skeleton } from \"../../Skeleton\";\nimport type { CellComponentProps, CellEmphasis, LinkBehavior } from \"../DataTable.types\";\nimport {\n formatEmptyValue,\n getCellContainerClasses,\n getCellTextClasses,\n getSkeletonSize,\n resolveValue,\n wrapWithLink,\n} from \"./cellUtils\";\n\nexport interface TextCellProps<T = any> extends CellComponentProps<T> {\n prefix?: string;\n suffix?: string;\n emptyText?: string;\n href?: string | ((row: T) => string);\n linkBehavior?: LinkBehavior;\n emphasis?: CellEmphasis;\n truncate?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\n/**\n * TextCell\n *\n * DataTable cell component for displaying text content.\n * Supports prefixes, suffixes, truncation, and optional linking with customizable emphasis levels.\n */\nexport function TextCell<T = any>({\n value,\n row,\n context,\n prefix,\n suffix,\n emptyText = \"—\",\n href,\n linkBehavior = \"visible\",\n emphasis = \"normal\",\n truncate = true,\n align = \"left\",\n}: TextCellProps<T>) {\n const { isLoading } = context;\n\n if (isLoading) {\n return <Skeleton className={getSkeletonSize(emphasis)} />;\n }\n\n const displayValue = formatEmptyValue(value, emptyText);\n const resolvedHref = resolveValue(href, row);\n\n const content = (\n <>\n {prefix && <span className=\"text-text-muted\">{prefix}</span>}\n <span className={truncate ? \"truncate\" : \"\"}>{displayValue}</span>\n {suffix && <span className=\"text-text-muted\">{suffix}</span>}\n </>\n );\n\n // Build the base classes without link styling\n const baseClasses = getCellContainerClasses(align, getCellTextClasses(emphasis));\n\n // If href is provided, wrap with link behavior\n if (resolvedHref) {\n return (\n <div className={baseClasses}>{wrapWithLink(content, resolvedHref, row, linkBehavior)}</div>\n );\n }\n\n return <div className={baseClasses}>{content}</div>;\n}\n","import type { ReactNode } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport type { CellContext, Column } from \"./DataTable.types\";\n\ninterface MobileRowProps<T> {\n row: T;\n columns: Column<T>[];\n density: \"compact\" | \"default\" | \"relaxed\";\n isLoading?: boolean;\n onClick?: () => void;\n}\n\nconst BREAKPOINT_CLASSES = {\n sm: \"sm:hidden\",\n md: \"md:hidden\",\n lg: \"lg:hidden\",\n xl: \"xl:hidden\",\n} as const;\n\nconst DESKTOP_BREAKPOINT_CLASSES = {\n sm: \"hidden sm:grid\",\n md: \"hidden md:grid\",\n lg: \"hidden lg:grid\",\n xl: \"hidden xl:grid\",\n} as const;\n\n/**\n * Get the value for a column from a row\n */\nfunction getCellValue<T>(row: T, column: Column<T>): any {\n if (column.accessor) {\n if (typeof column.accessor === \"function\") {\n return column.accessor(row);\n }\n return row[column.accessor];\n }\n return null;\n}\n\n/**\n * Render a cell value for mobile view\n */\nfunction renderMobileCell<T>(\n value: any,\n row: T,\n column: Column<T>,\n context: CellContext\n): ReactNode {\n if (column.cell) {\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(value, row) : column.cellProps;\n return <CellComponent value={value} row={row} context={context} {...cellProps} />;\n }\n\n if (column.render) {\n return column.render(value, row, context);\n }\n\n // Default rendering\n return value?.toString() ?? \"—\";\n}\n\n/**\n * Automatic mobile card renderer\n * Groups columns by priority and formats them appropriately\n */\nexport function AutoMobileRenderer<T>({\n row,\n columns,\n density,\n isLoading,\n onClick,\n}: MobileRowProps<T>) {\n // Filter and sort columns by mobile config\n const mobileColumns = columns\n .filter((col) => col.mobile !== false)\n .map((col) => {\n const mobileConfig = col.mobile === false ? null : col.mobile;\n return {\n ...col,\n mobilePriority: mobileConfig?.priority ?? 2,\n mobileFormat: mobileConfig?.format ?? \"secondary\",\n showLabel: mobileConfig?.label ?? mobileConfig?.format === \"secondary\",\n icon: mobileConfig?.icon,\n };\n })\n .sort((a, b) => a.mobilePriority - b.mobilePriority);\n\n // Group columns by priority\n const primaryColumns = mobileColumns.filter(\n (col) => col.mobilePriority === 1 || col.mobileFormat === \"primary\"\n );\n const secondaryColumns = mobileColumns.filter(\n (col) => col.mobilePriority === 2 && col.mobileFormat !== \"primary\"\n );\n const badgeColumns = mobileColumns.filter((col) => col.mobileFormat === \"badge\");\n\n const context: CellContext = {\n isLoading: !!isLoading,\n rowIndex: 0,\n columnIndex: 0,\n density,\n };\n\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface transition-colors\",\n onClick && \"cursor-pointer hover:bg-background-hover active:bg-background-pressed\",\n paddingClasses[density]\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n {/* Primary content - usually the main identifier */}\n {primaryColumns.length > 0 && (\n <div className=\"mb-2 flex items-start justify-between\">\n <div className=\"flex-1\">\n {primaryColumns.map((col) => {\n const value = getCellValue(row, col);\n return (\n <div\n key={col.id}\n className=\"font-medium text-text-body [&>*]:!justify-start [&>*]:!text-left\"\n >\n {renderMobileCell(value, row, col, context)}\n </div>\n );\n })}\n </div>\n {/* Badges on the right */}\n {badgeColumns.length > 0 && (\n <div className=\"ml-2 flex flex-wrap gap-1\">\n {badgeColumns.map((col) => {\n const value = getCellValue(row, col);\n return (\n <div key={col.id} className=\"inline-flex\">\n {renderMobileCell(value, row, col, context)}\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Secondary content */}\n {secondaryColumns.length > 0 && (\n <div className=\"space-y-1\">\n {secondaryColumns.map((col) => {\n const value = getCellValue(row, col);\n const showLabel = col.showLabel && col.label;\n\n return (\n <div key={col.id} className=\"flex items-center text-sm text-text-muted\">\n {col.icon && (\n <Icon name={col.icon as any} className=\"mr-1.5 h-4 w-4 flex-shrink-0\" />\n )}\n {showLabel && <span className=\"mr-1 font-medium\">{col.label}:</span>}\n <span className=\"truncate [&>*]:!justify-start [&>*]:!text-left\">\n {renderMobileCell(value, row, col, context)}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Simple card renderer - displays all columns in a simple stacked layout\n */\nexport function CardMobileRenderer<T>({\n row,\n columns,\n density,\n isLoading,\n onClick,\n}: MobileRowProps<T>) {\n const visibleColumns = columns.filter((col) => col.mobile !== false);\n\n const context: CellContext = {\n isLoading: !!isLoading,\n rowIndex: 0,\n columnIndex: 0,\n density,\n };\n\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface transition-colors\",\n onClick && \"cursor-pointer hover:bg-background-hover active:bg-background-pressed\",\n paddingClasses[density]\n )}\n onClick={onClick}\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className=\"space-y-2\">\n {visibleColumns.map((col, index) => {\n const value = getCellValue(row, col);\n const isFirst = index === 0;\n\n return (\n <div key={col.id}>\n {!isFirst && <div className=\"text-xs text-text-muted\">{col.label}</div>}\n <div\n className={twMerge(\n isFirst ? \"font-medium text-text-body\" : \"text-sm text-text-body\",\n \"[&>*]:!justify-start [&>*]:!text-left\" // Override any alignment from cells\n )}\n >\n {renderMobileCell(value, row, col, context)}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * Get the appropriate mobile breakpoint classes\n */\nexport function getMobileBreakpointClasses(breakpoint: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\") {\n return {\n mobile: BREAKPOINT_CLASSES[breakpoint],\n desktop: DESKTOP_BREAKPOINT_CLASSES[breakpoint],\n };\n}\n\n/**\n * Mobile loading skeleton\n */\nexport function MobileLoadingSkeleton({ density }: { density: \"compact\" | \"default\" | \"relaxed\" }) {\n const paddingClasses = {\n compact: \"px-3 py-2\",\n default: \"px-4 py-3\",\n relaxed: \"px-4 py-4\",\n };\n\n return (\n <div\n className={twMerge(\n \"border-b border-border-default bg-background-surface\",\n paddingClasses[density]\n )}\n >\n <div className=\"mb-2 h-5 w-3/4 animate-pulse rounded bg-background-muted\"></div>\n <div className=\"space-y-1\">\n <div className=\"h-4 w-1/2 animate-pulse rounded bg-background-muted\"></div>\n <div className=\"h-4 w-2/3 animate-pulse rounded bg-background-muted\"></div>\n </div>\n </div>\n );\n}\n","import React, { useCallback, useMemo, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\nimport type {\n CellContext,\n Column,\n DataTableProps,\n SortConfig,\n TableLayout,\n TableWidth,\n} from \"./DataTable.types\";\nimport {\n AutoMobileRenderer,\n CardMobileRenderer,\n getMobileBreakpointClasses,\n MobileLoadingSkeleton,\n} from \"./MobileRenderer\";\n\nconst densityClasses = {\n compact: \"py-1.5 px-3 text-sm\",\n default: \"py-3 px-4 text-sm\",\n relaxed: \"py-4 px-4 text-base\",\n};\n\nconst alignmentClasses = {\n left: \"text-left justify-start\",\n center: \"text-center justify-center\",\n right: \"text-right justify-end\",\n};\n\nconst widthClasses: Record<TableWidth, string> = {\n full: \"w-full\",\n auto: \"w-auto inline-block\",\n contained: \"w-full max-w-6xl mx-auto\",\n};\n\nconst layoutClasses: Record<TableLayout, string> = {\n auto: \"table-auto\",\n fixed: \"table-fixed\",\n responsive: \"table-auto\",\n};\n\nfunction getColumnStyles<T>(column: Column<T>) {\n const styles: React.CSSProperties = {};\n\n if (column.width !== undefined) {\n styles.width = typeof column.width === \"number\" ? `${column.width}px` : column.width;\n }\n if (column.minWidth !== undefined) {\n styles.minWidth =\n typeof column.minWidth === \"number\" ? `${column.minWidth}px` : column.minWidth;\n }\n if (column.maxWidth !== undefined) {\n styles.maxWidth =\n typeof column.maxWidth === \"number\" ? `${column.maxWidth}px` : column.maxWidth;\n }\n if (column.flex !== undefined) {\n styles.flex = `${column.flex} 1 0`;\n }\n\n return styles;\n}\n\nfunction getCellValue<T>(row: T, column: Column<T>): any {\n if (column.accessor) {\n if (typeof column.accessor === \"function\") {\n return column.accessor(row);\n }\n return row[column.accessor];\n }\n return null;\n}\n\nfunction TableHeaderCell<T>({\n column,\n sortConfig,\n onSort,\n stickyHeader,\n density = \"default\",\n}: {\n column: Column<T>;\n sortConfig: SortConfig | null;\n onSort: (columnId: string) => void;\n stickyHeader?: boolean;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n const isSorted = sortConfig?.columnId === column.id;\n const sortDirection = isSorted ? sortConfig.direction : null;\n\n return (\n <div\n className={twMerge(\n \"flex items-center gap-1 border-b border-border-default bg-background-surface font-medium text-text-muted\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"],\n stickyHeader && \"sticky top-0 z-10\",\n column.sortable && \"cursor-pointer hover:bg-background-hover\"\n )}\n onClick={() => column.sortable && onSort(column.id)}\n role=\"columnheader\"\n aria-sort={isSorted ? (sortDirection === \"asc\" ? \"ascending\" : \"descending\") : \"none\"}\n style={getColumnStyles(column)}\n >\n <span className=\"truncate\">{column.label}</span>\n {column.sortable && (\n <div className=\"flex flex-col\">\n <Icon\n name={\n sortDirection === \"asc\"\n ? \"CaretUp\"\n : sortDirection === \"desc\"\n ? \"CaretDown\"\n : \"CaretUp\"\n }\n size={12}\n className={isSorted ? \"text-text-body\" : \"text-text-muted opacity-50\"}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction TableCell<T>({\n column,\n row,\n rowIndex,\n columnIndex,\n isHovered,\n density = \"default\",\n className,\n}: {\n column: Column<T>;\n row: T;\n rowIndex: number;\n columnIndex: number;\n isHovered: boolean;\n density?: \"compact\" | \"default\" | \"relaxed\";\n className?: string;\n}) {\n const value = getCellValue(row, column);\n\n // Create the cell context\n const context: CellContext = {\n isLoading: false,\n isHovered,\n rowIndex,\n columnIndex,\n density,\n };\n\n let content;\n\n if (column.cell) {\n // Use the cell component\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(value, row) : column.cellProps;\n\n content = <CellComponent value={value} row={row} context={context} {...cellProps} />;\n } else if (column.render) {\n // Use custom render function\n content = column.render(value, row, context);\n } else {\n // Default rendering\n content = <span className=\"truncate\">{value?.toString() ?? \"\"}</span>;\n }\n\n return (\n <div\n className={twMerge(\n \"flex items-center border-b border-border-default\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"],\n className\n )}\n role=\"cell\"\n style={getColumnStyles(column)}\n >\n {content}\n </div>\n );\n}\n\nfunction LoadingCell({\n column,\n rowIndex,\n columnIndex,\n density = \"default\",\n}: {\n column: Column<any>;\n rowIndex: number;\n columnIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n const context: CellContext = {\n isLoading: true,\n rowIndex,\n columnIndex,\n density,\n };\n\n let content;\n\n if (column.cell) {\n // Use the cell component's loading state\n const CellComponent = column.cell;\n const cellProps =\n typeof column.cellProps === \"function\" ? column.cellProps(null, {} as any) : column.cellProps;\n\n content = <CellComponent value={null} row={{} as any} context={context} {...cellProps} />;\n } else if (column.render) {\n // Use custom render function with loading context\n content = column.render(null, {} as any, context);\n } else {\n // Default loading skeleton\n content = <Skeleton className=\"h-4 w-full max-w-[200px]\" />;\n }\n\n return (\n <div\n className={twMerge(\n \"flex items-center border-b border-border-default\",\n densityClasses[density],\n alignmentClasses[column.align || \"left\"]\n )}\n role=\"cell\"\n style={getColumnStyles(column)}\n >\n {content}\n </div>\n );\n}\n\nfunction TableRow<T>({\n columns,\n row,\n rowIndex,\n density = \"default\",\n onClick,\n}: {\n columns: Column<T>[];\n row: T;\n rowIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n onClick?: (row: T) => void;\n}) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = useCallback(() => {\n if (onClick) {\n onClick(row);\n }\n }, [onClick, row]);\n\n return (\n <div\n className={twMerge(\"contents group\", onClick && \"cursor-pointer\")}\n role=\"row\"\n onClick={handleClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {columns.map((column, columnIndex) => (\n <TableCell\n key={column.id}\n column={column}\n row={row}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n isHovered={isHovered}\n density={density}\n className={onClick ? \"group-hover:bg-background-hover\" : \"\"}\n />\n ))}\n </div>\n );\n}\n\nfunction LoadingRow({\n columns,\n rowIndex,\n density = \"default\",\n}: {\n columns: Column<any>[];\n rowIndex: number;\n density?: \"compact\" | \"default\" | \"relaxed\";\n}) {\n return (\n <div className=\"contents\" role=\"row\">\n {columns.map((column, columnIndex) => (\n <LoadingCell\n key={column.id}\n column={column}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n density={density}\n />\n ))}\n </div>\n );\n}\n\n/**\n * DataTable\n *\n * Advanced table component with sorting, filtering, pagination, and mobile-responsive views.\n * Supports custom cell renderers, column configurations, and multiple display densities.\n */\nexport function DataTable<T extends Record<string, unknown>>({\n columns,\n data,\n className,\n density = \"default\",\n width = \"full\",\n height,\n maxHeight,\n layout = \"auto\",\n mobileRenderer = \"auto\",\n customMobileRowRender,\n mobileBreakpoint = \"md\",\n isLoading = false,\n loadingRowCount = 5,\n stickyHeader = false,\n onRowClick,\n getRowId,\n hideHeader = false,\n onSort,\n \"aria-label\": ariaLabel,\n}: DataTableProps<T>) {\n const [localSortConfig, setLocalSortConfig] = useState<SortConfig | null>(null);\n\n const gridTemplateColumns = useMemo(() => {\n return columns\n .map((col) => {\n // Explicit width takes precedence\n if (col.width) {\n return typeof col.width === \"number\" ? `${col.width}px` : col.width;\n }\n // Flex-based sizing\n if (col.flex) {\n return `${col.flex}fr`;\n }\n // Min/max constraints\n if (col.minWidth && col.maxWidth) {\n const min = typeof col.minWidth === \"number\" ? `${col.minWidth}px` : col.minWidth;\n const max = typeof col.maxWidth === \"number\" ? `${col.maxWidth}px` : col.maxWidth;\n return `minmax(${min}, ${max})`;\n }\n if (col.minWidth) {\n const min = typeof col.minWidth === \"number\" ? `${col.minWidth}px` : col.minWidth;\n return `minmax(${min}, 1fr)`;\n }\n if (col.maxWidth) {\n const max = typeof col.maxWidth === \"number\" ? `${col.maxWidth}px` : col.maxWidth;\n return `minmax(0, ${max})`;\n }\n // Default to equal distribution\n return \"1fr\";\n })\n .join(\" \");\n }, [columns]);\n\n const handleSort = useCallback(\n (columnId: string) => {\n const column = columns.find((col) => col.id === columnId);\n if (!column?.sortable) return;\n\n let newSortConfig: SortConfig | null = null;\n\n if (localSortConfig?.columnId === columnId) {\n if (localSortConfig.direction === \"asc\") {\n newSortConfig = { columnId, direction: \"desc\" };\n } else {\n newSortConfig = null; // Reset sort\n }\n } else {\n newSortConfig = { columnId, direction: \"asc\" };\n }\n\n setLocalSortConfig(newSortConfig);\n onSort?.(newSortConfig);\n },\n [columns, localSortConfig, onSort]\n );\n\n // Container styles for height control\n const containerStyle: React.CSSProperties = {};\n if (height) {\n containerStyle.height = typeof height === \"number\" ? `${height}px` : height;\n containerStyle.overflowY = \"auto\";\n }\n if (maxHeight) {\n containerStyle.maxHeight = typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n containerStyle.overflowY = \"auto\";\n }\n\n // Determine wrapper classes based on layout\n const wrapperClasses = twMerge(\n widthClasses[width],\n layout === \"responsive\" ? \"overflow-x-auto\" : \"overflow-auto\",\n className\n );\n\n // Get breakpoint classes for mobile/desktop visibility\n const breakpointClasses = getMobileBreakpointClasses(mobileBreakpoint);\n const showMobile = mobileRenderer !== \"none\";\n\n // Determine which mobile renderer to use\n const renderMobileRow = (row: T, index: number) => {\n if (!showMobile) return null;\n\n if (mobileRenderer === \"custom\" && customMobileRowRender) {\n return customMobileRowRender(row, index);\n }\n\n const MobileComponent = mobileRenderer === \"cards\" ? CardMobileRenderer : AutoMobileRenderer;\n\n return (\n <MobileComponent\n row={row}\n columns={columns}\n density={density}\n isLoading={isLoading}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n />\n );\n };\n\n return (\n <div className={wrapperClasses} style={containerStyle}>\n {/* Desktop View */}\n <div\n className={twMerge(\n \"grid border-separate border-spacing-0\",\n layoutClasses[layout],\n width === \"auto\" ? \"inline-grid w-auto\" : \"w-full\",\n showMobile && breakpointClasses.desktop\n )}\n role=\"table\"\n aria-label={ariaLabel}\n style={{\n gridTemplateColumns,\n }}\n >\n {/* Header */}\n {!hideHeader && (\n <div className=\"contents\" role=\"rowgroup\">\n {columns.map((column) => (\n <TableHeaderCell\n key={column.id}\n column={column}\n sortConfig={localSortConfig}\n onSort={handleSort}\n stickyHeader={stickyHeader}\n density={density}\n />\n ))}\n </div>\n )}\n\n {/* Body */}\n <div className=\"contents\" role=\"rowgroup\">\n {isLoading ? (\n // Loading state\n Array.from({ length: loadingRowCount }).map((_, index) => (\n <LoadingRow\n key={`loading-${index}`}\n columns={columns}\n rowIndex={index}\n density={density}\n />\n ))\n ) : data.length > 0 ? (\n // Data rows\n data.map((row, index) => {\n const rowId = getRowId ? getRowId(row) : `row-${index}`;\n return (\n <TableRow\n key={rowId}\n columns={columns}\n row={row}\n rowIndex={index}\n density={density}\n onClick={onRowClick}\n />\n );\n })\n ) : (\n // Empty state\n <div className=\"col-span-full py-12 text-center text-text-muted\" role=\"row\">\n <div role=\"cell\">No data available</div>\n </div>\n )}\n </div>\n </div>\n\n {/* Mobile View */}\n {showMobile && (\n <div className={breakpointClasses.mobile}>\n {isLoading ? (\n // Mobile loading state\n Array.from({ length: loadingRowCount }).map((_, index) => (\n <MobileLoadingSkeleton key={`mobile-loading-${index}`} density={density} />\n ))\n ) : data.length > 0 ? (\n // Mobile data rows\n data.map((row, index) => {\n const rowId = getRowId ? getRowId(row) : `mobile-row-${index}`;\n return <div key={rowId}>{renderMobileRow(row, index)}</div>;\n })\n ) : (\n // Mobile empty state\n <div className=\"py-12 text-center text-text-muted\">No data available</div>\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n DateField as AriaDateField,\n DateFieldProps as AriaDateFieldProps,\n DateInput as AriaDateInput,\n DateInputProps,\n DateSegment,\n DateValue,\n Dialog,\n DialogTrigger,\n Popover,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { Calendar } from \"../Calendar\";\nimport { Description, FieldError, FieldGroup, getFieldGroupStyles, Label } from \"../Field\";\n\n/**\n * DateField\n *\n * Segmented date input with optional calendar popup.\n */\nexport interface DateFieldProps<T extends DateValue> extends AriaDateFieldProps<T> {\n /**\n * Label for the date field\n */\n label?: string;\n /**\n * Description text to show below the field\n */\n description?: string;\n /**\n * Error message to display\n */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /**\n * Whether to show a calendar button for date selection\n * @default false\n */\n showCalendar?: boolean;\n}\n\nexport function DateField<T extends DateValue>({\n label,\n description,\n errorMessage,\n showCalendar = false,\n ...props\n}: DateFieldProps<T>) {\n const [isCalendarOpen, setIsCalendarOpen] = useState(false);\n\n const handleCalendarSelect = (date: DateValue | null) => {\n // Update the field value when a date is selected from calendar\n if (props.onChange && date) {\n // @ts-expect-error - Complex type mapping between DateValue and MappedDateValue<T> in react-aria-components\n // This is safe as the Calendar component returns compatible date values\n props.onChange(date);\n }\n setIsCalendarOpen(false);\n };\n\n return (\n <AriaDateField\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-1\")}\n >\n {label && <Label>{label}</Label>}\n\n {showCalendar ? (\n <FieldGroup className=\"w-auto min-w-[208px]\">\n <DateInput className=\"min-w-[150px] flex-1\" />\n <DialogTrigger isOpen={isCalendarOpen} onOpenChange={setIsCalendarOpen}>\n <Button variant=\"icon\" className=\"mr-1 w-6 rounded outline-offset-0\">\n <CalendarIcon aria-hidden className=\"h-4 w-4\" />\n </Button>\n <Popover>\n <Dialog className=\"p-4\">\n <Calendar\n value={props.value}\n onChange={handleCalendarSelect}\n minValue={props.minValue}\n maxValue={props.maxValue}\n isDisabled={props.isDisabled}\n isReadOnly={props.isReadOnly}\n isDateUnavailable={props.isDateUnavailable}\n />\n </Dialog>\n </Popover>\n </DialogTrigger>\n </FieldGroup>\n ) : (\n <DateInput />\n )}\n\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n </AriaDateField>\n );\n}\n\nfunction getSegmentStyles({\n isPlaceholder,\n isDisabled,\n}: {\n isPlaceholder?: boolean;\n isDisabled?: boolean;\n}) {\n return [\n // Base\n \"inline box-content px-0.5 -my-0.5 rounded outline-none tabular-nums text-center transition-colors\",\n // Text color\n isPlaceholder ? \"text-text-muted italic\" : \"text-text-body\",\n // Disabled state\n isDisabled ? \"text-text-disabled cursor-not-allowed\" : \"cursor-text\",\n // Hover/focus visuals (data-* comes from react-aria-components)\n \"hover:bg-text-body/5\",\n \"data-[focused]:!outline-[1.5px] data-[focused]:!outline-[var(--control-focus-ring-color)] data-[focused]:![--tw-outline-style:solid]\",\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\nexport function DateInput(props: Omit<DateInputProps, \"children\">) {\n return (\n <AriaDateInput\n className={(renderProps) =>\n getFieldGroupStyles({\n ...renderProps,\n className:\n typeof props.className === \"string\"\n ? props.className\n : \"min-w-[150px] px-2 py-1.5 text-sm flex items-center gap-0.5\",\n })\n }\n {...props}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={getSegmentStyles({\n isPlaceholder: segment.isPlaceholder,\n isDisabled: !segment.isEditable,\n })}\n />\n )}\n </AriaDateInput>\n );\n}\n","import { DialogProps, Dialog as RACDialog } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Dialog\n *\n * Generic modal/dialog surface with Edges defaults.\n */\nexport function Dialog(props: DialogProps) {\n // Ensure the dialog is properly labeled for accessibility\n return (\n <RACDialog\n {...props}\n className={twMerge(\n \"relative h-auto max-h-[inherit] overflow-auto outline-none [[data-placement]>&]:p-4\",\n props.className\n )}\n role=\"dialog\"\n />\n );\n}\n","import {\n RangeCalendar as AriaRangeCalendar,\n RangeCalendarProps as AriaRangeCalendarProps,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n DateValue,\n Text,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\nimport { CalendarGridHeader, CalendarHeader } from \"../Calendar\";\n\n/**\n * RangeCalendar\n *\n * Calendar allowing selection of a date range.\n */\nexport interface RangeCalendarProps<T extends DateValue>\n extends Omit<AriaRangeCalendarProps<T>, \"visibleDuration\"> {\n errorMessage?: string;\n}\n\nfunction getCellClassName({\n selectionState,\n isDisabled,\n}: {\n selectionState: \"none\" | \"middle\" | \"cap\";\n isDisabled?: boolean;\n}) {\n const baseClasses = `${focusRing} w-full h-full flex items-center justify-center rounded-sm forced-color-adjust-none font-semibold`;\n\n const selectionStateClasses = {\n none: \"text-text-body group-hover:bg-gray-200 group-pressed:bg-gray-200\",\n middle: [\n \"group-hover:bg-gray-300 forced-colors:group-hover:bg-[Highlight]\",\n \"group-invalid:group-hover:bg-red-200 forced-colors:group-invalid:group-hover:bg-[Mark]\",\n \"group-pressed:bg-blue-300 forced-colors:group-pressed:bg-[Highlight] forced-colors:text-[HighlightText]\",\n \"group-invalid:group-pressed:bg-red-300 forced-colors:group-invalid:group-pressed:bg-[Mark]\",\n ].join(\" \"),\n cap: \" group-invalid:bg-red-600 forced-colors:bg-[Highlight] forced-colors:group-invalid:bg-[Mark] text-white forced-colors:text-white !bg-neutral-black\",\n };\n\n const disabledClasses = isDisabled\n ? \"text-textFaint dark:text-zinc-600 forced-colors:text-textFaint font-light\"\n : \"\";\n\n return [baseClasses, selectionStateClasses[selectionState], disabledClasses]\n .filter(Boolean)\n .join(\" \");\n}\n\nexport function RangeCalendar<T extends DateValue>({\n errorMessage,\n ...props\n}: RangeCalendarProps<T>) {\n return (\n <AriaRangeCalendar {...props}>\n <CalendarHeader />\n <CalendarGrid className=\"w-full [&_td]:px-0\">\n <CalendarGridHeader />\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className=\"selection-start:rounded-s-end selection-end:rounded-e-end [td:last-child_&]:rounded-e-end group h-9 w-9 cursor-default text-sm outline-none outside-month:text-gray-300 selected:bg-background-selected invalid:selected:bg-red-100 forced-colors:selected:bg-[Highlight] forced-colors:selected:text-white forced-colors:invalid:selected:bg-[Mark] [td:first-child_&]:rounded-s-full\"\n >\n {({\n formattedDate,\n isSelected,\n isSelectionStart,\n isSelectionEnd,\n isFocusVisible: _isFocusVisible,\n isDisabled,\n }) => (\n <span\n className={getCellClassName({\n selectionState:\n isSelected && (isSelectionStart || isSelectionEnd)\n ? \"cap\"\n : isSelected\n ? \"middle\"\n : \"none\",\n isDisabled,\n })}\n >\n {formattedDate}\n </span>\n )}\n </CalendarCell>\n )}\n </CalendarGridBody>\n </CalendarGrid>\n {errorMessage && (\n <Text slot=\"errorMessage\" className=\"text-sm text-red-600\">\n {errorMessage}\n </Text>\n )}\n </AriaRangeCalendar>\n );\n}\n","import { CalendarIcon } from \"lucide-react\";\nimport {\n DateRangePicker as AriaDateRangePicker,\n DateRangePickerProps as AriaDateRangePickerProps,\n DateValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Button } from \"../Button\";\nimport { DateInput } from \"../DateField\";\nimport { Dialog } from \"../Dialog\";\nimport { Description, FieldError, FieldGroup, Label } from \"../Field\";\nimport { Popover } from \"../Popover\";\nimport { RangeCalendar } from \"../RangeCalendar\";\n\n/**\n * DateRangePicker\n *\n * Composed date range input with popover calendar.\n */\nexport interface DateRangePickerProps<T extends DateValue> extends AriaDateRangePickerProps<T> {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n}\n\nexport function DateRangePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n ...props\n}: DateRangePickerProps<T>) {\n return (\n <AriaDateRangePicker\n {...props}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-1\")}\n >\n {label && <Label>{label}</Label>}\n <FieldGroup className=\"w-auto min-w-[208px]\">\n <DateInput slot=\"start\" className=\"px-2 py-1.5 text-sm\" />\n <span\n aria-hidden=\"true\"\n className=\"text-gray-800 group-disabled:text-gray-200 dark:text-zinc-200 group-disabled:dark:text-zinc-600 forced-colors:text-[ButtonText] group-disabled:forced-colors:text-[GrayText]\"\n >\n –\n </span>\n <DateInput slot=\"end\" className=\"flex-1 px-2 py-1.5 text-sm\" />\n <Button variant=\"icon\" className=\"mr-1 w-6 rounded outline-offset-0\">\n <CalendarIcon aria-hidden className=\"h-4 w-4\" />\n </Button>\n </FieldGroup>\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n <Popover>\n <Dialog>\n <RangeCalendar />\n </Dialog>\n </Popover>\n </AriaDateRangePicker>\n );\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 items-center justify-between border-b px-4\",\n title && \"border-b\",\n titleAlign === \"center\" ? \"justify-center\" : \"\"\n )}\n >\n {hasBackArrow && (\n <Button variant=\"unstyled\" onPress={onBack} className=\"absolute left-4\">\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=\"unstyled\" onPress={onClose} aria-label=\"Close dialog\">\n <Icon name=\"X\" data-testid=\"close-button\" />\n </Button>\n )}\n </>\n )}\n </div>\n );\n};\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 React, { useEffect, useState } from \"react\";\nimport { Modal, ModalOverlay } from \"react-aria-components\";\nimport { Button } from \"../Button\";\nimport { Dialog } from \"../Dialog\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { ErrorBoundary } from \"../ErrorBoundary\";\n\nexport interface DrawerAction {\n label: string;\n onPress: () => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"destructive\"\n | \"icon\"\n | \"link\"\n | \"unstyled\"\n | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n isLoading?: boolean;\n isDisabled?: boolean;\n}\n\n/**\n * Drawer\n *\n * Sliding panel that anchors to screen edges.\n */\nexport interface DrawerProps {\n title?: string;\n headerContent?: React.ReactNode;\n children?: React.ReactNode;\n isOpen: boolean;\n slideInFrom?: \"left\" | \"right\";\n transparentOverlay?: boolean;\n onClose?: () => void;\n className?: string;\n // Actions footer props\n primaryAction?: DrawerAction;\n secondaryAction?: DrawerAction;\n footerContent?: React.ReactNode;\n /** Whether to include padding inside the content area. Defaults to true. */\n contentPadding?: boolean;\n /** Maximum width of the drawer. Defaults to \"400px\". Can be any valid CSS width value. */\n maxWidth?: string;\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n children,\n title,\n headerContent,\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}) => {\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 } else {\n setIsAnimating(false);\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n const hasActions = primaryAction || secondaryAction;\n const hasFooter = hasActions || footerContent;\n\n return (\n <ErrorBoundary>\n <ModalOverlay\n isOpen={isOpen}\n onOpenChange={onClose}\n isDismissable\n className={`fixed inset-0 z-50 ${transparentOverlay ? \"bg-transparent\" : \"bg-black/50\"}`}\n >\n <Modal className=\"flex justify-end\" isDismissable>\n <Dialog\n className={`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 isAnimating\n ? slideInFrom === \"right\"\n ? \"animate-in slide-in-from-right\"\n : \"animate-in slide-in-from-left\"\n : \"\"\n } ${className || \"\"}`}\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 {(title || headerContent) && (\n <DialogHeader\n title={title}\n headerContent={headerContent}\n onClose={\n onClose ||\n (() => {\n /* Default handler */\n })\n }\n />\n )}\n <div\n className={`flex-1 overflow-y-auto overscroll-contain ${contentPadding ? \"p-6\" : \"p-0\"}`}\n >\n {children}\n </div>\n {hasFooter && (\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-4\">\n {secondaryAction && (\n <Button\n size={secondaryAction.size || \"lg\"}\n fullWidth\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 fullWidth\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 </Dialog>\n </Modal>\n </ModalOverlay>\n </ErrorBoundary>\n );\n};\n\nDrawer.displayName = \"Drawer\";\n","\"use client\";\nimport { Image as ImageIcon, Upload, X } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { DropZone, FileTrigger } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\n\nexport interface FileUploadProps {\n /**\n * Current file URL or preview\n */\n value?: string;\n /**\n * Callback when file is selected\n */\n onChange?: (file: File | null, url?: string) => void;\n /**\n * Callback when file URL changes (for external upload handlers)\n */\n onUrlChange?: (url: string) => void;\n /**\n * Accepted file types\n */\n accept?: string;\n /**\n * Maximum file size in bytes\n */\n maxSize?: number;\n /**\n * Whether the component is disabled\n */\n isDisabled?: boolean;\n /**\n * Custom upload handler (e.g., for cloud storage)\n */\n onUpload?: (file: File) => Promise<string>;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Show image preview for image files\n */\n showPreview?: boolean;\n /**\n * Placeholder text\n */\n placeholder?: string;\n}\n\n/**\n * FileUpload\n *\n * A file upload component with drag-and-drop support.\n * Supports image preview, custom upload handlers, and file validation.\n */\nexport function FileUpload({\n value,\n onChange,\n onUrlChange,\n accept = \"image/*\",\n maxSize,\n isDisabled = false,\n onUpload,\n className,\n showPreview = true,\n placeholder = \"Drop files here or click to browse\",\n}: FileUploadProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [preview, setPreview] = useState<string | undefined>(value);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleFile = async (file: File) => {\n setError(null);\n\n // Validate file size\n if (maxSize && file.size > maxSize) {\n setError(`File size must be less than ${(maxSize / 1024 / 1024).toFixed(2)}MB`);\n return;\n }\n\n // Handle file preview for images\n if (showPreview && file.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onloadend = () => {\n setPreview(reader.result as string);\n };\n reader.readAsDataURL(file);\n }\n\n // If custom upload handler is provided, use it\n if (onUpload) {\n setIsUploading(true);\n try {\n const url = await onUpload(file);\n setPreview(url);\n onUrlChange?.(url);\n } catch (err) {\n setError(\"Failed to upload file\");\n console.error(\"Upload error:\", err);\n } finally {\n setIsUploading(false);\n }\n }\n\n onChange?.(file, preview);\n };\n\n const handleDrop = (e: any) => {\n const items = e.items;\n if (items.length > 0) {\n const item = items[0];\n if (item.kind === \"file\") {\n const file = item.getAsFile();\n if (file) {\n handleFile(file);\n }\n }\n }\n setIsDragging(false);\n };\n\n const handleRemove = () => {\n setPreview(undefined);\n setError(null);\n onChange?.(null);\n onUrlChange?.(\"\");\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n };\n\n return (\n <div className={twMerge(\"w-full\", className)}>\n <DropZone\n className={twMerge(\n \"relative flex min-h-[200px] w-full flex-col items-center justify-center rounded-lg border-2 border-dashed transition-colors\",\n isDragging\n ? \"border-action-primary bg-action-primary/5\"\n : \"border-border-muted hover:border-border-default\",\n isDisabled && \"pointer-events-none opacity-50\",\n error && \"border-feedback-error-border bg-feedback-error-background/50\"\n )}\n onDrop={handleDrop}\n onDropEnter={() => setIsDragging(true)}\n onDropExit={() => setIsDragging(false)}\n >\n {preview ? (\n <div className=\"relative flex h-full w-full items-center justify-center p-4\">\n {showPreview && preview.startsWith(\"data:image\") ? (\n <img\n src={preview}\n alt=\"Preview\"\n className=\"max-h-48 max-w-full rounded-md object-contain\"\n />\n ) : (\n <div className=\"flex flex-col items-center gap-2\">\n <ImageIcon className=\"h-12 w-12 text-text-muted\" />\n <span className=\"text-sm text-text-muted\">File uploaded</span>\n </div>\n )}\n {!isDisabled && (\n <Button\n variant=\"icon\"\n size=\"sm\"\n onPress={handleRemove}\n className=\"absolute right-2 top-2 bg-background-surface shadow-md\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-4 p-6\">\n <Upload className=\"h-12 w-12 text-text-muted\" />\n <div className=\"text-center\">\n <p className=\"text-sm text-text-body\">{placeholder}</p>\n <p className=\"mt-1 text-xs text-text-muted\">\n {accept === \"image/*\" ? \"PNG, JPG, GIF up to 10MB\" : `Accepts ${accept}`}\n </p>\n </div>\n <FileTrigger\n acceptedFileTypes={accept.split(\",\")}\n onSelect={(e) => {\n const files = Array.from(e || []);\n if (files.length > 0) {\n handleFile(files[0]);\n }\n }}\n >\n <Button variant=\"secondary\" size=\"sm\" isDisabled={isDisabled}>\n Choose File\n </Button>\n </FileTrigger>\n </div>\n )}\n {isUploading && (\n <div className=\"absolute inset-0 flex items-center justify-center rounded-lg bg-background-surface/80\">\n <div className=\"flex flex-col items-center gap-2\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-action-primary border-t-transparent\" />\n <span className=\"text-sm text-text-muted\">Uploading...</span>\n </div>\n </div>\n )}\n </DropZone>\n {error && <p className=\"mt-2 text-sm text-feedback-error-text\">{error}</p>}\n </div>\n );\n}\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 */\nexport function Form(props: FormProps) {\n return <RACForm {...props} className={twMerge(\"flex flex-col gap-4\", props.className)} />;\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Grid Component — Flexible layout system for dashboards\n *\n * A higher-level abstraction over CSS Grid that provides responsive columns,\n * consistent spacing, and span helpers for building complex dashboard layouts.\n *\n * Usage:\n * ```tsx\n * <Grid cols={{ base: 1, md: 2, lg: 4 }} gap=\"md\">\n * <Grid.Item span={{ base: 1, lg: 2 }}>\n * <Card>Wide content</Card>\n * </Grid.Item>\n * <Grid.Item>\n * <Card>Regular content</Card>\n * </Grid.Item>\n * </Grid>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type ResponsiveValue<T> =\n | T\n | {\n base?: T;\n sm?: T;\n md?: T;\n lg?: T;\n xl?: T;\n \"2xl\"?: T;\n };\n\nexport type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | \"none\";\nexport type GridSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | \"full\" | \"auto\";\nexport type GridGap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\nexport type GridAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type GridJustify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\" | \"evenly\";\nexport type GridFlow = \"row\" | \"col\" | \"dense\" | \"row-dense\" | \"col-dense\";\n\nexport interface GridProps {\n /** Number of columns at different breakpoints */\n cols?: ResponsiveValue<GridCols>;\n /** Gap between grid items using design tokens */\n gap?: GridGap;\n /** Gap between rows specifically */\n gapY?: GridGap;\n /** Gap between columns specifically */\n gapX?: GridGap;\n /** Vertical alignment of items */\n align?: GridAlign;\n /** Horizontal justification of the grid */\n justify?: GridJustify;\n /** Grid flow direction */\n flow?: GridFlow;\n /** Auto-fit mode with minimum item width */\n autoFit?: string; // e.g., \"280px\"\n /** Auto-fill mode with minimum item width */\n autoFill?: string; // e.g., \"280px\"\n /** Additional CSS classes */\n className?: string;\n /** Child elements */\n children?: React.ReactNode;\n}\n\nexport interface GridItemProps {\n /** Column span at different breakpoints */\n span?: ResponsiveValue<GridSpan>;\n /** Column start position */\n colStart?: ResponsiveValue<number | \"auto\">;\n /** Column end position */\n colEnd?: ResponsiveValue<number | \"auto\">;\n /** Row span at different breakpoints */\n rowSpan?: ResponsiveValue<GridSpan>;\n /** Row start position */\n rowStart?: ResponsiveValue<number | \"auto\">;\n /** Row end position */\n rowEnd?: ResponsiveValue<number | \"auto\">;\n /** Additional CSS classes */\n className?: string;\n /** Child elements */\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Style Mappings\n// ——————————————————————————————————————————\n\nconst colsMap: Record<GridCols, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n 5: \"grid-cols-5\",\n 6: \"grid-cols-6\",\n 7: \"grid-cols-7\",\n 8: \"grid-cols-8\",\n 9: \"grid-cols-9\",\n 10: \"grid-cols-10\",\n 11: \"grid-cols-11\",\n 12: \"grid-cols-12\",\n none: \"grid-cols-none\",\n};\n\nconst responsiveColsMap: Record<string, Record<GridCols, string>> = {\n sm: {\n 1: \"sm:grid-cols-1\",\n 2: \"sm:grid-cols-2\",\n 3: \"sm:grid-cols-3\",\n 4: \"sm:grid-cols-4\",\n 5: \"sm:grid-cols-5\",\n 6: \"sm:grid-cols-6\",\n 7: \"sm:grid-cols-7\",\n 8: \"sm:grid-cols-8\",\n 9: \"sm:grid-cols-9\",\n 10: \"sm:grid-cols-10\",\n 11: \"sm:grid-cols-11\",\n 12: \"sm:grid-cols-12\",\n none: \"sm:grid-cols-none\",\n },\n md: {\n 1: \"md:grid-cols-1\",\n 2: \"md:grid-cols-2\",\n 3: \"md:grid-cols-3\",\n 4: \"md:grid-cols-4\",\n 5: \"md:grid-cols-5\",\n 6: \"md:grid-cols-6\",\n 7: \"md:grid-cols-7\",\n 8: \"md:grid-cols-8\",\n 9: \"md:grid-cols-9\",\n 10: \"md:grid-cols-10\",\n 11: \"md:grid-cols-11\",\n 12: \"md:grid-cols-12\",\n none: \"md:grid-cols-none\",\n },\n lg: {\n 1: \"lg:grid-cols-1\",\n 2: \"lg:grid-cols-2\",\n 3: \"lg:grid-cols-3\",\n 4: \"lg:grid-cols-4\",\n 5: \"lg:grid-cols-5\",\n 6: \"lg:grid-cols-6\",\n 7: \"lg:grid-cols-7\",\n 8: \"lg:grid-cols-8\",\n 9: \"lg:grid-cols-9\",\n 10: \"lg:grid-cols-10\",\n 11: \"lg:grid-cols-11\",\n 12: \"lg:grid-cols-12\",\n none: \"lg:grid-cols-none\",\n },\n xl: {\n 1: \"xl:grid-cols-1\",\n 2: \"xl:grid-cols-2\",\n 3: \"xl:grid-cols-3\",\n 4: \"xl:grid-cols-4\",\n 5: \"xl:grid-cols-5\",\n 6: \"xl:grid-cols-6\",\n 7: \"xl:grid-cols-7\",\n 8: \"xl:grid-cols-8\",\n 9: \"xl:grid-cols-9\",\n 10: \"xl:grid-cols-10\",\n 11: \"xl:grid-cols-11\",\n 12: \"xl:grid-cols-12\",\n none: \"xl:grid-cols-none\",\n },\n \"2xl\": {\n 1: \"2xl:grid-cols-1\",\n 2: \"2xl:grid-cols-2\",\n 3: \"2xl:grid-cols-3\",\n 4: \"2xl:grid-cols-4\",\n 5: \"2xl:grid-cols-5\",\n 6: \"2xl:grid-cols-6\",\n 7: \"2xl:grid-cols-7\",\n 8: \"2xl:grid-cols-8\",\n 9: \"2xl:grid-cols-9\",\n 10: \"2xl:grid-cols-10\",\n 11: \"2xl:grid-cols-11\",\n 12: \"2xl:grid-cols-12\",\n none: \"2xl:grid-cols-none\",\n },\n};\n\nconst gapMap: Record<GridGap, string> = {\n none: \"gap-0\",\n xs: \"gap-x-2 gap-y-1\", // 8px horizontal, 4px vertical\n sm: \"gap-x-3 gap-y-2\", // 12px horizontal, 8px vertical\n md: \"gap-x-4 gap-y-3\", // 16px horizontal, 12px vertical\n lg: \"gap-x-6 gap-y-4\", // 24px horizontal, 16px vertical\n xl: \"gap-x-8 gap-y-6\", // 32px horizontal, 24px vertical\n \"2xl\": \"gap-x-12 gap-y-8\", // 48px horizontal, 32px vertical\n};\n\nconst gapXMap: Record<GridGap, string> = {\n none: \"gap-x-0\",\n xs: \"gap-x-2\",\n sm: \"gap-x-3\",\n md: \"gap-x-4\",\n lg: \"gap-x-6\",\n xl: \"gap-x-8\",\n \"2xl\": \"gap-x-12\",\n};\n\nconst gapYMap: Record<GridGap, string> = {\n none: \"gap-y-0\",\n xs: \"gap-y-1\", // 4px (reduced from 8px)\n sm: \"gap-y-2\", // 8px (reduced from 12px)\n md: \"gap-y-3\", // 12px (reduced from 16px)\n lg: \"gap-y-4\", // 16px (reduced from 24px)\n xl: \"gap-y-6\", // 24px (reduced from 32px)\n \"2xl\": \"gap-y-8\", // 32px (reduced from 48px)\n};\n\nconst alignMap: Record<GridAlign, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n baseline: \"items-baseline\",\n};\n\nconst justifyMap: Record<GridJustify, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n around: \"justify-around\",\n evenly: \"justify-evenly\",\n};\n\nconst flowMap: Record<GridFlow, string> = {\n row: \"grid-flow-row\",\n col: \"grid-flow-col\",\n dense: \"grid-flow-dense\",\n \"row-dense\": \"grid-flow-row-dense\",\n \"col-dense\": \"grid-flow-col-dense\",\n};\n\nconst spanMap: Record<GridSpan, string> = {\n 1: \"col-span-1\",\n 2: \"col-span-2\",\n 3: \"col-span-3\",\n 4: \"col-span-4\",\n 5: \"col-span-5\",\n 6: \"col-span-6\",\n 7: \"col-span-7\",\n 8: \"col-span-8\",\n 9: \"col-span-9\",\n 10: \"col-span-10\",\n 11: \"col-span-11\",\n 12: \"col-span-12\",\n full: \"col-span-full\",\n auto: \"col-auto\",\n};\n\nconst responsiveSpanMap: Record<string, Record<GridSpan, string>> = {\n sm: {\n 1: \"sm:col-span-1\",\n 2: \"sm:col-span-2\",\n 3: \"sm:col-span-3\",\n 4: \"sm:col-span-4\",\n 5: \"sm:col-span-5\",\n 6: \"sm:col-span-6\",\n 7: \"sm:col-span-7\",\n 8: \"sm:col-span-8\",\n 9: \"sm:col-span-9\",\n 10: \"sm:col-span-10\",\n 11: \"sm:col-span-11\",\n 12: \"sm:col-span-12\",\n full: \"sm:col-span-full\",\n auto: \"sm:col-auto\",\n },\n md: {\n 1: \"md:col-span-1\",\n 2: \"md:col-span-2\",\n 3: \"md:col-span-3\",\n 4: \"md:col-span-4\",\n 5: \"md:col-span-5\",\n 6: \"md:col-span-6\",\n 7: \"md:col-span-7\",\n 8: \"md:col-span-8\",\n 9: \"md:col-span-9\",\n 10: \"md:col-span-10\",\n 11: \"md:col-span-11\",\n 12: \"md:col-span-12\",\n full: \"md:col-span-full\",\n auto: \"md:col-auto\",\n },\n lg: {\n 1: \"lg:col-span-1\",\n 2: \"lg:col-span-2\",\n 3: \"lg:col-span-3\",\n 4: \"lg:col-span-4\",\n 5: \"lg:col-span-5\",\n 6: \"lg:col-span-6\",\n 7: \"lg:col-span-7\",\n 8: \"lg:col-span-8\",\n 9: \"lg:col-span-9\",\n 10: \"lg:col-span-10\",\n 11: \"lg:col-span-11\",\n 12: \"lg:col-span-12\",\n full: \"lg:col-span-full\",\n auto: \"lg:col-auto\",\n },\n xl: {\n 1: \"xl:col-span-1\",\n 2: \"xl:col-span-2\",\n 3: \"xl:col-span-3\",\n 4: \"xl:col-span-4\",\n 5: \"xl:col-span-5\",\n 6: \"xl:col-span-6\",\n 7: \"xl:col-span-7\",\n 8: \"xl:col-span-8\",\n 9: \"xl:col-span-9\",\n 10: \"xl:col-span-10\",\n 11: \"xl:col-span-11\",\n 12: \"xl:col-span-12\",\n full: \"xl:col-span-full\",\n auto: \"xl:col-auto\",\n },\n \"2xl\": {\n 1: \"2xl:col-span-1\",\n 2: \"2xl:col-span-2\",\n 3: \"2xl:col-span-3\",\n 4: \"2xl:col-span-4\",\n 5: \"2xl:col-span-5\",\n 6: \"2xl:col-span-6\",\n 7: \"2xl:col-span-7\",\n 8: \"2xl:col-span-8\",\n 9: \"2xl:col-span-9\",\n 10: \"2xl:col-span-10\",\n 11: \"2xl:col-span-11\",\n 12: \"2xl:col-span-12\",\n full: \"2xl:col-span-full\",\n auto: \"2xl:col-auto\",\n },\n};\n\n// ——————————————————————————————————————————\n// Helper Functions\n// ——————————————————————————————————————————\n\nfunction getResponsiveClasses<T extends string | number>(\n value: ResponsiveValue<T> | undefined,\n baseMap: Record<T, string>,\n responsiveMap: Record<string, Record<T, string>>\n): string {\n if (!value) return \"\";\n\n // Simple value\n if (typeof value !== \"object\") {\n return baseMap[value as T] || \"\";\n }\n\n // Responsive object\n const classes: string[] = [];\n\n if (\"base\" in value && value.base !== undefined) {\n classes.push(baseMap[value.base]);\n }\n\n Object.entries(responsiveMap).forEach(([breakpoint, map]) => {\n const breakpointValue = (value as Record<string, T | undefined>)[breakpoint];\n if (breakpointValue !== undefined) {\n classes.push(map[breakpointValue as T]);\n }\n });\n\n return classes.join(\" \");\n}\n\n// ——————————————————————————————————————————\n// Grid Component\n// ——————————————————————————————————————————\n\nexport function Grid({\n cols = 1,\n gap = \"md\",\n gapX,\n gapY,\n align = \"stretch\",\n justify = \"start\",\n flow = \"row\",\n autoFit,\n autoFill,\n className,\n children,\n}: GridProps) {\n // Build grid classes\n const gridClasses = twMerge(\n \"grid\",\n // Handle auto-fit/auto-fill or responsive columns\n autoFit || autoFill ? \"\" : getResponsiveClasses(cols, colsMap, responsiveColsMap),\n // Gap classes\n !gapX && !gapY && gapMap[gap],\n gapX && gapXMap[gapX],\n gapY && gapYMap[gapY],\n // Alignment\n alignMap[align],\n justifyMap[justify],\n // Flow\n flowMap[flow],\n className\n );\n\n // Handle auto-fit/auto-fill with inline styles\n const style: React.CSSProperties = {};\n if (autoFit) {\n style.gridTemplateColumns = `repeat(auto-fit, minmax(${autoFit}, 1fr))`;\n } else if (autoFill) {\n style.gridTemplateColumns = `repeat(auto-fill, minmax(${autoFill}, 1fr))`;\n }\n\n return (\n <div className={gridClasses} style={style}>\n {children}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Grid.Item Component\n// ——————————————————————————————————————————\n\nexport function GridItem({\n span,\n // colStart,\n // colEnd,\n // rowSpan,\n // rowStart,\n // rowEnd,\n className,\n children,\n}: GridItemProps) {\n const itemClasses = twMerge(\n // Column span\n getResponsiveClasses(span, spanMap, responsiveSpanMap),\n // Additional positioning classes would go here\n // For brevity, not implementing all start/end mappings\n className\n );\n\n return <div className={itemClasses}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nGrid.Item = GridItem;\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ComponentFormatter, formatComponentValue } from \"../../utils/formatting\";\nimport { Badge } from \"../Badge\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n// Use the centralized formatter type\nexport type KpiFormatter = ComponentFormatter;\n\n/**\n * Kpi Component — Single metric display\n *\n * Displays a key performance indicator with value, delta, trend, and status.\n * Designed to work standalone or within a KpiGroup for dashboard layouts.\n *\n * Usage:\n * ```tsx\n * <Kpi\n * label=\"Active Sites\"\n * value={2481}\n * delta={3.2}\n * deltaPeriodLabel=\"vs last 7d\"\n * trend={dataPoints}\n * />\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type KpiStatus = \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type KpiSize = \"sm\" | \"md\" | \"lg\";\nexport type KpiOrientation = \"vertical\" | \"horizontal\";\n\nexport interface TrendPoint {\n x: number | string | Date;\n y: number;\n}\n\nexport interface KpiProps {\n /** Short label describing the metric */\n label: React.ReactNode;\n /** Primary value - number for auto-formatting or string for custom display */\n value: number | string;\n /** Formatter using the unified formatting system */\n formatter?: KpiFormatter;\n /** Change since prior period */\n delta?: number;\n /** Description of delta period (e.g., \"vs last 7d\") */\n deltaPeriodLabel?: string;\n /** How to interpret delta direction */\n deltaIntent?: \"upIsGood\" | \"downIsGood\";\n /** Mini trend data points */\n trend?: TrendPoint[];\n /** Status indicator */\n status?: {\n value: string;\n tone?: KpiStatus;\n };\n /** Help text or tooltip content */\n helpText?: React.ReactNode;\n /** Size variant */\n size?: KpiSize;\n /** Layout orientation */\n orientation?: KpiOrientation;\n /** Loading state */\n loading?: boolean;\n /** Empty state */\n empty?: boolean;\n /** Error state */\n error?: string | React.ReactNode;\n /** Click handler for drill-down */\n onClick?: () => void;\n /** Additional CSS classes */\n className?: string;\n /** Custom value renderer */\n renderValue?: (value: KpiProps[\"value\"]) => React.ReactNode;\n /** Custom delta renderer */\n renderDelta?: (delta?: number) => React.ReactNode;\n /** Custom trend renderer */\n renderTrend?: (points?: TrendPoint[]) => React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————\n\n// Use the centralized formatting utility\nfunction formatValue(value: number | string, formatter?: KpiFormatter): React.ReactNode {\n return formatComponentValue({\n value,\n formatter,\n emptyClassName: \"text-text-muted\",\n emptyText: \"—\",\n });\n}\n\nfunction getDeltaColor(delta: number, deltaIntent: \"upIsGood\" | \"downIsGood\" = \"upIsGood\"): string {\n if (delta === 0) return \"text-text-muted\";\n\n const isPositive = delta > 0;\n\n if (deltaIntent === \"upIsGood\") {\n return isPositive ? \"text-feedback-success\" : \"text-feedback-error\";\n } else {\n return isPositive ? \"text-feedback-error\" : \"text-feedback-success\";\n }\n}\n\n// ——————————————————————————————————————————\n// Sparkline Component\n// ——————————————————————————————————————————\n\nfunction Sparkline({\n points,\n className,\n ariaLabel,\n}: {\n points: TrendPoint[];\n className?: string;\n ariaLabel?: string;\n}) {\n const width = 64;\n const height = 20;\n const padding = 2;\n\n // Extract y values\n const yValues = points.map((p) => (typeof p.y === \"number\" ? p.y : 0));\n\n if (yValues.length === 0) return null;\n\n // Calculate bounds\n const min = Math.min(...yValues);\n const max = Math.max(...yValues);\n const range = max - min;\n\n // Normalize y coordinate\n const normalizeY = (y: number) => {\n if (range === 0) return height / 2;\n return height - padding - ((y - min) / range) * (height - 2 * padding);\n };\n\n // Calculate x step\n const xStep = (width - 2 * padding) / Math.max(points.length - 1, 1);\n\n // Build path\n const pathData = points\n .map((point, index) => {\n const x = padding + index * xStep;\n const y = normalizeY(typeof point.y === \"number\" ? point.y : 0);\n return `${index === 0 ? \"M\" : \"L\"} ${x} ${y}`;\n })\n .join(\" \");\n\n return (\n <svg\n width={width}\n height={height}\n role=\"img\"\n aria-label={ariaLabel}\n className={twMerge(\"overflow-visible\", className)}\n >\n <path d={pathData} fill=\"none\" strokeWidth=\"1.5\" className=\"stroke-border-muted\" />\n </svg>\n );\n}\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function Kpi({\n label,\n value,\n formatter,\n delta,\n deltaPeriodLabel,\n deltaIntent = \"upIsGood\",\n trend,\n status,\n helpText,\n size = \"md\",\n orientation = \"vertical\",\n loading,\n empty,\n error,\n onClick,\n className,\n renderValue,\n renderDelta,\n renderTrend,\n}: KpiProps) {\n // Size classes\n const sizeClasses = {\n sm: {\n label: \"text-xs\",\n value: \"text-base\",\n delta: \"text-xs\",\n gap: \"gap-1\",\n },\n md: {\n label: \"text-sm\",\n value: \"text-xl\",\n delta: \"text-sm\",\n gap: \"gap-2\",\n },\n lg: {\n label: \"text-base\",\n value: \"text-2xl\",\n delta: \"text-base\",\n gap: \"gap-3\",\n },\n };\n\n const currentSize = sizeClasses[size];\n\n // Format value\n const valueNode = loading ? (\n <Skeleton className=\"h-7 w-20\" />\n ) : empty ? (\n <span className=\"text-text-muted\">—</span>\n ) : error ? (\n <span className=\"text-feedback-error text-sm\">\n {typeof error === \"string\" ? error : \"Error\"}\n </span>\n ) : renderValue ? (\n renderValue(value)\n ) : (\n formatValue(value, formatter)\n );\n\n // Format delta\n const deltaNode = renderDelta ? (\n renderDelta(delta)\n ) : delta !== undefined && !loading && !empty && !error ? (\n <div\n className={twMerge(\n currentSize.delta,\n getDeltaColor(delta, deltaIntent),\n \"flex items-center gap-1\"\n )}\n >\n {delta > 0 && <Icon name=\"ArrowUp\" size={12} />}\n {delta < 0 && <Icon name=\"ArrowDown\" size={12} />}\n {delta === 0 && <Icon name=\"Minus\" size={12} />}\n <span>\n {delta > 0 ? \"+\" : \"\"}\n {Math.abs(delta).toFixed(1)}%\n </span>\n {deltaPeriodLabel && <span className=\"text-text-muted\">· {deltaPeriodLabel}</span>}\n </div>\n ) : loading ? (\n <Skeleton className=\"h-4 w-24\" />\n ) : null;\n\n // Trend node\n const trendNode = renderTrend ? (\n renderTrend(trend)\n ) : trend && trend.length > 0 && !loading && !error ? (\n <Sparkline points={trend} ariaLabel={`${label} trend`} className={empty ? \"opacity-30\" : \"\"} />\n ) : loading ? (\n <Skeleton className=\"h-5 w-16\" />\n ) : null;\n\n return (\n <section\n className={twMerge(\n \"flex min-w-0\",\n orientation === \"horizontal\"\n ? `items-center ${currentSize.gap}`\n : `flex-col ${currentSize.gap}`,\n onClick &&\n \"cursor-pointer hover:bg-background-muted rounded-lg px-3 py-2 -mx-3 -my-2 transition-colors\",\n className\n )}\n aria-labelledby={`kpi-${label}`}\n onClick={onClick}\n >\n {/* Label row */}\n <div className=\"flex items-center gap-2\">\n <h3\n id={`kpi-${label}`}\n className={twMerge(currentSize.label, \"font-medium text-text-caption truncate\")}\n >\n {loading ? <Skeleton className=\"h-4 w-24\" /> : label}\n </h3>\n {helpText && !loading && (\n <Icon\n name=\"Question\"\n size={12}\n className=\"text-text-muted cursor-help\"\n aria-label=\"Help\"\n />\n )}\n </div>\n\n {/* Value and status */}\n <div className=\"flex items-baseline gap-2\">\n <output\n className={twMerge(\n currentSize.value,\n \"font-semibold\",\n error ? \"text-feedback-error\" : \"text-text-heading\"\n )}\n aria-label={`Value: ${valueNode}`}\n >\n {valueNode}\n </output>\n {status && !loading && !error && (\n <Badge variant={status.tone || \"neutral\"} size=\"sm\">\n {status.value}\n </Badge>\n )}\n </div>\n\n {/* Delta and trend row */}\n {(deltaNode || trendNode) && (\n <div className=\"flex items-center gap-3\">\n {deltaNode}\n {trendNode}\n </div>\n )}\n </section>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * KpiGroup Component — Layout container for multiple KPIs\n *\n * Provides consistent grid layout for KPI cards with responsive columns\n * and spacing. Perfect for dashboard metric rows and summary sections.\n *\n * Usage:\n * ```tsx\n * <KpiGroup cols={{ base: 1, md: 2, lg: 4 }}>\n * <Kpi label=\"Revenue\" value={45231} />\n * <Kpi label=\"Users\" value={1234} />\n * <Kpi label=\"Conversion\" value={0.089} unit=\"%\" />\n * <Kpi label=\"Avg Order\" value={89.50} unit=\"$\" />\n * </KpiGroup>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type KpiGroupGap = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type KpiGroupAlign = \"start\" | \"center\" | \"stretch\";\n\nexport interface KpiGroupCols {\n base?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n \"2xl\"?: number;\n}\n\nexport interface KpiGroupProps {\n /** KPI components to display */\n children: React.ReactNode;\n /** Responsive column configuration */\n cols?: KpiGroupCols | number;\n /** Gap between items using spacing tokens */\n gap?: KpiGroupGap;\n /** Vertical alignment of items */\n align?: KpiGroupAlign;\n /** Force equal heights for all items */\n equalizeHeights?: boolean;\n /** Optional header content */\n header?: React.ReactNode;\n /** Loading state for all children */\n loading?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n// ——————————————————————————————————————————\n// Helpers\n// ——————————————————————————————————————————\n\nconst gapMap: Record<KpiGroupGap, string> = {\n xs: \"gap-2\",\n sm: \"gap-3\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n};\n\nconst alignMap: Record<KpiGroupAlign, string> = {\n start: \"items-start\",\n center: \"items-center\",\n stretch: \"items-stretch\",\n};\n\nfunction getColClasses(cols: KpiGroupCols | number): string {\n // Simple number - apply to all breakpoints\n if (typeof cols === \"number\") {\n return `grid-cols-${cols}`;\n }\n\n // Responsive object\n const classes: string[] = [];\n\n if (cols.base !== undefined) {\n classes.push(`grid-cols-${cols.base}`);\n }\n\n if (cols.sm !== undefined) {\n classes.push(`sm:grid-cols-${cols.sm}`);\n }\n\n if (cols.md !== undefined) {\n classes.push(`md:grid-cols-${cols.md}`);\n }\n\n if (cols.lg !== undefined) {\n classes.push(`lg:grid-cols-${cols.lg}`);\n }\n\n if (cols.xl !== undefined) {\n classes.push(`xl:grid-cols-${cols.xl}`);\n }\n\n if (cols[\"2xl\"] !== undefined) {\n classes.push(`2xl:grid-cols-${cols[\"2xl\"]}`);\n }\n\n return classes.join(\" \");\n}\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function KpiGroup({\n children,\n cols = { base: 1, sm: 2, md: 3, lg: 4 },\n gap = \"md\",\n align = \"stretch\",\n equalizeHeights = true,\n header,\n loading,\n className,\n}: KpiGroupProps) {\n // Apply loading state to children if specified\n const enhancedChildren = loading\n ? React.Children.map(children, (child) => {\n if (\n React.isValidElement(child) &&\n child.type &&\n typeof child.type !== \"string\" &&\n \"displayName\" in child.type\n ) {\n return React.cloneElement(child as React.ReactElement<{ loading?: boolean }>, {\n loading: true,\n });\n }\n return child;\n })\n : children;\n\n return (\n <section className={twMerge(\"w-full\", className)} aria-label=\"Key metrics\">\n {header && <div className=\"mb-4\">{header}</div>}\n\n <div\n className={twMerge(\n \"grid\",\n getColClasses(cols),\n gapMap[gap],\n alignMap[align],\n equalizeHeights && \"auto-rows-fr\",\n \"w-full\"\n )}\n >\n {enhancedChildren}\n </div>\n </section>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nKpiGroup.displayName = \"KpiGroup\";\n","import { Check } from \"lucide-react\";\nimport {\n ListBox as AriaListBox,\n ListBoxItem as AriaListBoxItem,\n ListBoxProps as AriaListBoxProps,\n Collection,\n composeRenderProps,\n Header,\n ListBoxItemProps,\n Section,\n SectionProps,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\n\n/**\n * ListBox\n *\n * Styled wrapper around `react-aria-components` ListBox and related parts\n * used in dropdowns and menus.\n */\ninterface ListBoxProps<T> extends Omit<AriaListBoxProps<T>, \"layout\" | \"orientation\"> {}\n\nexport function ListBox<T extends object>({ children, ...props }: ListBoxProps<T>) {\n return (\n <AriaListBox {...props} className={composeTailwindRenderProps(props.className, \"outline-0\")}>\n {children}\n </AriaListBox>\n );\n}\n\nexport function getItemStyles({\n isSelected,\n isDisabled,\n size,\n}: {\n isSelected?: boolean;\n isDisabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}) {\n let styles = `${focusRing} group relative flex items-center gap-8 cursor-default select-none py-2 px-3 will-change-transform text-sm forced-color-adjust-none`;\n\n if (isSelected) {\n styles +=\n \" bg-background-input text-text-body forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] -outline-offset-4 outline-white dark:outline-white forced-colors:outline-[HighlightText]\";\n } else {\n styles +=\n \" dark:text-zinc-300 hover:bg-background-hover dark:hover:bg-zinc-700 -outline-offset-2\";\n }\n\n if (isDisabled) {\n styles += \" text-slate-300 dark:text-zinc-600 forced-colors:text-[GrayText]\";\n }\n\n if (size === \"sm\") {\n styles += \" py-1 text-xs\";\n }\n\n return styles;\n}\n\n/**\n * ListBoxItem with Edges styling.\n */\nexport function ListBoxItem(props: ListBoxItemProps) {\n const textValue =\n props.textValue || (typeof props.children === \"string\" ? props.children : undefined);\n\n return (\n <AriaListBoxItem {...props} textValue={textValue} className={(props) => getItemStyles(props)}>\n {composeRenderProps(props.children, (children) => (\n <>\n {children}\n <div className=\"absolute bottom-0 left-4 right-4 hidden h-px bg-white/20 forced-colors:bg-[HighlightText] [.group[data-selected]:has(+[data-selected])_&]:block\" />\n </>\n ))}\n </AriaListBoxItem>\n );\n}\n\nexport function getDropdownItemStyles({\n isDisabled,\n isFocused,\n isOpen,\n isSelected,\n}: {\n isDisabled?: boolean;\n isFocused?: boolean;\n isOpen?: boolean;\n isSelected?: boolean;\n}) {\n let styles =\n \"group flex items-center gap-4 cursor-default select-none py-2 pl-3 pr-1 outline-none text-sm forced-color-adjust-none hover:bg-background-hover dark:hover:bg-background-hover\";\n\n if (isDisabled) {\n styles += \" text-gray-300 dark:text-zinc-600 forced-colors:text-[GrayText]\";\n } else {\n styles += \" text-text-body dark:text-zinc-100\";\n }\n\n if (isFocused) {\n styles +=\n \" bg-background-hover forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]\";\n }\n\n if (isSelected) {\n styles +=\n \" bg-background-selected font-medium forced-colors:bg-[Highlight] forced-colors:text-[HighlightText]\";\n }\n\n if (!isFocused && !isSelected && isOpen) {\n styles += \" bg-background-input\";\n }\n\n return styles;\n}\n\n/**\n * DropdownItem with selection checkmark and hover states.\n */\nexport function DropdownItem(props: ListBoxItemProps) {\n const textValue =\n props.textValue || (typeof props.children === \"string\" ? props.children : undefined);\n return (\n <AriaListBoxItem\n {...props}\n textValue={textValue}\n className={(props) => getDropdownItemStyles({ ...props })}\n >\n {composeRenderProps(props.children, (children, { isSelected }) => (\n <>\n <span className=\"flex flex-1 items-center gap-2 truncate font-normal group-selected:font-semibold\">\n {children}\n </span>\n <span className=\"flex w-5 items-center\">\n {isSelected && <Check className=\"h-4 w-4\" />}\n </span>\n </>\n ))}\n </AriaListBoxItem>\n );\n}\n\n/**\n * Section for grouping dropdown items.\n */\nexport interface DropdownSectionProps<T> extends SectionProps<T> {\n title?: string;\n}\n\nexport function DropdownSection<T extends object>(props: DropdownSectionProps<T>) {\n return (\n <Section className=\"after:block after:h-[5px] after:content-[''] first:-mt-[5px]\">\n <Header className=\"sticky -top-[5px] z-10 -mx-1 -mt-px truncate border-y bg-gray-100/60 px-4 py-1 text-sm font-semibold text-text-caption backdrop-blur-md supports-[-moz-appearance:none]:bg-gray-100 dark:border-y-zinc-700 dark:bg-zinc-700/60 dark:text-zinc-300 [&+*]:mt-1\">\n {props.title}\n </Header>\n <Collection items={props.items}>{props.children}</Collection>\n </Section>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\n\nexport interface LoaderProps {\n /**\n * Optional className for custom styling\n */\n className?: string;\n /**\n * Size of the loader in pixels\n * @default 24\n */\n size?: number;\n /**\n * Color of the loader\n * @default \"text-action-primary\"\n */\n color?: string;\n}\n\n/**\n * Loader\n *\n * Animated loading spinner component.\n * Displays a circular spinner with customizable size and color for loading states.\n */\nexport const Loader = ({ className, size = 24, color = \"text-action-primary\" }: LoaderProps) => {\n return (\n <div\n className={twMerge(\n \"inline-block animate-spin rounded-full border-2 border-solid border-current border-r-transparent\",\n color,\n className\n )}\n style={{\n width: size,\n height: size,\n }}\n role=\"status\"\n aria-label=\"loading\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n};\n","\"use client\";\nimport React from \"react\";\nimport { DialogTrigger, Popover } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useColorMode } from \"../../utils/ColorModeProvider\";\nimport { Button } from \"../Button\";\nimport { Checkbox } from \"../Checkbox\";\nimport { Icon } from \"../Icon\";\nimport neutralDark from \"./assets/neutral-dark.png\";\nimport neutralLight from \"./assets/neutral-light.png\";\nimport satelliteLight from \"./assets/satelite-light.png\";\nimport streetsDark from \"./assets/streets-dark.png\";\n// Map style preview images\nimport streetsLight from \"./assets/streets-light.png\";\nimport { MAPBOX_THEMES } from \"./mapStyles\";\n\ninterface MapLayersControlProps {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n className?: string;\n /**\n * Custom positioning - overrides position prop\n * Example: { top: '20px', right: '20px' }\n */\n style?: React.CSSProperties;\n /**\n * Available map layers\n */\n layers?: Array<{\n id: string;\n name: string;\n visible: boolean;\n onToggle: (id: string, visible: boolean) => void;\n }>;\n /**\n * Show layers panel\n * @default false\n */\n showLayersPanel?: boolean;\n /**\n * Callback when layers button is clicked\n */\n onLayersClick?: () => void;\n /**\n * Current map theme\n */\n currentTheme?: keyof typeof MAPBOX_THEMES;\n /**\n * Callback when theme is changed\n */\n onThemeChange?: (theme: keyof typeof MAPBOX_THEMES) => void;\n /**\n * ISO RTO regions visibility\n */\n isoRtoVisible?: boolean;\n /**\n * Callback when ISO RTO regions visibility changes\n */\n onIsoRtoToggle?: (visible: boolean) => void;\n /**\n * Vermont substations visibility\n */\n vermontSubstationsVisible?: boolean;\n /**\n * Callback when Vermont substations visibility changes\n */\n onVermontSubstationsToggle?: (visible: boolean) => void;\n /**\n * Transformers visibility\n */\n transformersVisible?: boolean;\n /**\n * Callback when transformers visibility changes\n */\n onTransformersToggle?: (visible: boolean) => void;\n /**\n * Feeders visibility\n */\n feedersVisible?: boolean;\n /**\n * Callback when feeders visibility changes\n */\n onFeedersToggle?: (visible: boolean) => void;\n /**\n * Spans visibility\n */\n spansVisible?: boolean;\n /**\n * Callback when spans visibility changes\n */\n onSpansToggle?: (visible: boolean) => void;\n}\n\nconst getThemeOptions = (isDarkMode: boolean) => [\n {\n id: \"streets\" as const,\n name: \"Streets\",\n description: \"Standard street map with traffic data\",\n preview: isDarkMode ? streetsDark : streetsLight,\n },\n {\n id: \"satellite\" as const,\n name: \"Satellite\",\n description: \"Aerial imagery with street labels\",\n preview: satelliteLight, // Only light version available\n },\n {\n id: \"neutral\" as const,\n name: \"Neutral\",\n description: \"Clean design with light/dark variants\",\n preview: isDarkMode ? neutralDark : neutralLight,\n },\n];\n\nexport function MapLayersControl({\n position = \"bottom-left\",\n className,\n style,\n currentTheme = \"streets\",\n onThemeChange,\n isoRtoVisible = false,\n onIsoRtoToggle,\n vermontSubstationsVisible = false,\n onVermontSubstationsToggle,\n transformersVisible = false,\n onTransformersToggle,\n feedersVisible = false,\n onFeedersToggle,\n spansVisible = false,\n onSpansToggle,\n}: MapLayersControlProps) {\n const { isDarkTheme } = useColorMode();\n const themeOptions = getThemeOptions(isDarkTheme);\n\n const handleThemeSelect = (theme: keyof typeof MAPBOX_THEMES) => {\n onThemeChange?.(theme);\n };\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top-left\":\n return \"absolute top-4 left-4\";\n case \"top-right\":\n return \"absolute top-4 right-4\";\n case \"bottom-left\":\n return \"absolute bottom-4 left-4\";\n case \"bottom-right\":\n return \"absolute bottom-4 right-4\";\n default:\n return \"absolute bottom-4 left-4\";\n }\n };\n\n const buttonClasses = twMerge(\n \"h-10 w-10 p-0\",\n \"bg-background-surface hover:bg-background-hover shadow-lg border border-border\"\n );\n\n return (\n <div className={twMerge(getPositionClasses(), \"z-10\", className)} style={style}>\n <div className=\"relative\">\n <DialogTrigger>\n <Button\n className={twMerge(buttonClasses, \"focus:outline-none focus:ring-0\")}\n variant=\"secondary\"\n size=\"sm\"\n >\n <Icon name=\"Stack\" size={20} className=\"text-text-primary\" />\n </Button>\n <Popover\n placement=\"top start\"\n className=\"p-4 min-w-80 bg-background-surface border border-border rounded-lg shadow-xl focus:outline-none focus:ring-0\"\n >\n <div className=\"space-y-6\">\n {/* Map Type Section */}\n <div>\n <div className=\"text-sm font-semibold text-text-body mb-3\">Map type</div>\n <div className=\"grid grid-cols-3 gap-3\">\n {themeOptions.map((option) => (\n <button\n key={option.id}\n onClick={() => handleThemeSelect(option.id)}\n className={twMerge(\n \"flex flex-col items-center space-y-2 p-3 rounded-lg text-center\",\n \"hover:bg-background-muted transition-colors border border-transparent\",\n currentTheme === option.id\n ? \"bg-background-muted border-border\"\n : \"hover:border-border\"\n )}\n >\n <div\n className={twMerge(\n \"w-12 h-12 rounded-lg overflow-hidden\",\n \"bg-background-surface border\",\n currentTheme === option.id ? \"border-action-secondary\" : \"border-border\"\n )}\n >\n <img\n src={option.preview}\n alt={`${option.name} map preview`}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <div\n className={twMerge(\n \"text-sm\",\n currentTheme === option.id\n ? \"font-bold text-text-body\"\n : \"font-normal text-text-faint\"\n )}\n >\n {option.name}\n </div>\n </button>\n ))}\n </div>\n </div>\n\n {/* Map Details Section */}\n <div>\n <div className=\"text-sm font-semibold text-text-body mb-3\">Map details</div>\n <div className=\"space-y-2\">\n <Checkbox\n isSelected={isoRtoVisible}\n onChange={(isSelected) => onIsoRtoToggle?.(isSelected)}\n >\n <span className=\"text-sm text-text-body\">ISO RTO regions</span>\n </Checkbox>\n <Checkbox\n isSelected={vermontSubstationsVisible}\n onChange={(isSelected) => onVermontSubstationsToggle?.(isSelected)}\n >\n <span className=\"text-sm text-text-body\">Substations</span>\n </Checkbox>\n <Checkbox\n isSelected={transformersVisible}\n onChange={(isSelected) => onTransformersToggle?.(isSelected)}\n >\n <span className=\"text-sm text-text-body\">Transformers</span>\n </Checkbox>\n <Checkbox\n isSelected={feedersVisible}\n onChange={(isSelected) => onFeedersToggle?.(isSelected)}\n >\n <span className=\"text-sm text-text-body\">Feeders</span>\n </Checkbox>\n <Checkbox\n isSelected={spansVisible}\n onChange={(isSelected) => onSpansToggle?.(isSelected)}\n >\n <span className=\"text-sm text-text-body\">Spans</span>\n </Checkbox>\n </div>\n </div>\n </div>\n </Popover>\n </DialogTrigger>\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\ninterface MapListControlProps {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n className?: string;\n /**\n * Custom positioning - overrides position prop\n * Example: { top: '20px', right: '20px' }\n */\n style?: React.CSSProperties;\n /**\n * Callback when list toggle is clicked\n */\n onToggle?: (isOpen: boolean) => void;\n /**\n * Whether the list is currently open\n * @default false\n */\n isOpen?: boolean;\n /**\n * Show list panel\n * @default true\n */\n showListPanel?: boolean;\n /**\n * List items to display\n */\n items?: Array<{\n id: string;\n name: string;\n onClick: () => void;\n }>;\n}\n\nexport function MapListControl({\n position = \"top-right\",\n className,\n style,\n onToggle,\n isOpen = false,\n showListPanel = true,\n items = [],\n}: MapListControlProps) {\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n\n const handleToggle = () => {\n const newState = !internalIsOpen;\n setInternalIsOpen(newState);\n onToggle?.(newState);\n };\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top-left\":\n return \"absolute top-4 left-4\";\n case \"top-right\":\n return \"absolute top-4 right-4\";\n case \"bottom-left\":\n return \"absolute bottom-4 left-4\";\n case \"bottom-right\":\n return \"absolute bottom-4 right-4\";\n default:\n return \"absolute top-4 right-4\";\n }\n };\n\n const buttonClasses = twMerge(\n \"h-10 w-10 p-0\",\n \"bg-background-surface hover:bg-background-hover shadow-lg border border-border\"\n );\n\n const currentIsOpen = isOpen !== undefined ? isOpen : internalIsOpen;\n\n return (\n <div className={twMerge(getPositionClasses(), \"z-10\", className)} style={style}>\n <div className=\"relative\">\n <Button className={buttonClasses} onPress={handleToggle} variant=\"secondary\" size=\"sm\">\n <Icon name=\"ListDashes\" size={20} className=\"text-text-primary\" />\n </Button>\n\n {/* List Panel */}\n {currentIsOpen && showListPanel && items.length > 0 && (\n <div\n className={twMerge(\n \"absolute top-12 right-0 min-w-48 max-w-80\",\n \"bg-background-surface border border-border rounded-lg shadow-xl p-3\"\n )}\n >\n <div className=\"text-sm font-medium text-text-primary mb-2\">List Items</div>\n <div className=\"space-y-1 max-h-64 overflow-y-auto\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={item.onClick}\n className={twMerge(\n \"w-full text-left px-3 py-2 text-sm rounded hover:bg-background-muted\",\n \"text-text-primary hover:text-text-primary\"\n )}\n >\n {item.name}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { MapRef } from \"react-map-gl\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\ninterface MapLocationControlProps {\n mapRef: React.RefObject<MapRef>;\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n className?: string;\n /**\n * Custom positioning - overrides position prop\n * Example: { top: '20px', right: '20px' }\n */\n style?: React.CSSProperties;\n /**\n * Show compass button\n * @default true\n */\n showCompass?: boolean;\n /**\n * Show geolocate button\n * @default true\n */\n showGeolocate?: boolean;\n /**\n * Callback when compass is clicked\n */\n onCompassClick?: () => void;\n /**\n * Callback when geolocate is clicked\n */\n onGeolocateClick?: () => void;\n}\n\nexport function MapLocationControl({\n mapRef,\n position = \"top-right\",\n className,\n style,\n showCompass = true,\n showGeolocate = true,\n onCompassClick,\n onGeolocateClick,\n}: MapLocationControlProps) {\n const [isGeolocating, setIsGeolocating] = useState(false);\n\n const handleCompassClick = () => {\n if (onCompassClick) {\n onCompassClick();\n } else if (mapRef.current) {\n // Reset bearing to 0 (north up)\n mapRef.current.easeTo({\n bearing: 0,\n duration: 500,\n });\n }\n };\n\n const handleGeolocateClick = () => {\n if (onGeolocateClick) {\n onGeolocateClick();\n } else {\n // Use browser geolocation API like native Mapbox control\n if (!navigator.geolocation) {\n console.warn(\"Geolocation is not supported by this browser.\");\n return;\n }\n\n setIsGeolocating(true);\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const { latitude, longitude } = position.coords;\n\n if (mapRef.current) {\n mapRef.current.flyTo({\n center: [longitude, latitude],\n zoom: 15,\n duration: 2000,\n });\n }\n\n setIsGeolocating(false);\n },\n (error) => {\n console.warn(\"Error getting location:\", error);\n\n // Provide specific error messages\n switch (error.code) {\n case error.PERMISSION_DENIED:\n console.warn(\n \"Location access denied. Please enable location services in your browser settings.\"\n );\n break;\n case error.POSITION_UNAVAILABLE:\n console.warn(\"Location information unavailable.\");\n break;\n case error.TIMEOUT:\n console.warn(\"Location request timed out.\");\n break;\n default:\n console.warn(\"Unknown location error occurred.\");\n break;\n }\n\n setIsGeolocating(false);\n },\n {\n enableHighAccuracy: true,\n timeout: 10000,\n maximumAge: 300000, // 5 minutes\n }\n );\n }\n };\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top-left\":\n return \"absolute top-4 left-4\";\n case \"top-right\":\n return \"absolute top-4 right-4\";\n case \"bottom-left\":\n return \"absolute bottom-4 left-4\";\n case \"bottom-right\":\n return \"absolute bottom-4 right-4\";\n default:\n return \"absolute top-4 right-4\";\n }\n };\n\n const buttonClasses = twMerge(\n \"h-10 w-10 p-0\",\n \"bg-background-surface hover:bg-background-hover shadow-lg border border-border\"\n );\n\n return (\n <div className={twMerge(getPositionClasses(), \"z-10 flex flex-col\", className)} style={style}>\n {showCompass && (\n <div className=\"block lg:hidden\">\n <Button\n className={twMerge(buttonClasses, \"rounded-b-none\")}\n onPress={handleCompassClick}\n variant=\"secondary\"\n size=\"sm\"\n >\n <Icon name=\"Compass\" size={20} className=\"text-text-primary\" />\n </Button>\n </div>\n )}\n\n {showGeolocate && (\n <Button\n className={twMerge(\n buttonClasses,\n showCompass ? \"rounded-t-none border-t-0 lg:rounded-t-none\" : \"rounded-t-none\"\n )}\n onPress={handleGeolocateClick}\n variant=\"secondary\"\n size=\"sm\"\n isDisabled={isGeolocating}\n >\n <Icon\n name={isGeolocating ? \"Spinner\" : \"NavigationArrow\"}\n size={20}\n className={twMerge(\"text-text-primary\", isGeolocating && \"animate-spin\")}\n />\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\nimport React, { useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\n\ninterface MapSearchControlProps {\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n className?: string;\n /**\n * Custom positioning - overrides position prop\n * Example: { top: '20px', left: '20px' }\n */\n style?: React.CSSProperties;\n /**\n * Callback when search is triggered\n */\n onSearch?: (query: string) => void;\n /**\n * Placeholder text for search input\n * @default \"Search places...\"\n */\n placeholder?: string;\n /**\n * Show search input field\n * @default true\n */\n showSearchInput?: boolean;\n}\n\nexport function MapSearchControl({\n position = \"top-left\",\n className,\n style,\n onSearch,\n placeholder = \"Search places...\",\n showSearchInput = true,\n}: MapSearchControlProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const handleSearchClick = () => {\n if (showSearchInput) {\n setIsOpen(!isOpen);\n } else if (onSearch) {\n onSearch(\"\");\n }\n };\n\n const handleSearchSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (onSearch && searchQuery.trim()) {\n onSearch(searchQuery.trim());\n setIsOpen(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n const getPositionClasses = () => {\n switch (position) {\n case \"top-left\":\n return \"absolute top-4 left-4\";\n case \"top-right\":\n return \"absolute top-4 right-4\";\n case \"bottom-left\":\n return \"absolute bottom-4 left-4\";\n case \"bottom-right\":\n return \"absolute bottom-4 right-4\";\n default:\n return \"absolute top-4 left-4\";\n }\n };\n\n const buttonClasses = twMerge(\n \"h-10 w-10 p-0\",\n \"bg-background-surface hover:bg-background-hover shadow-lg border border-border\"\n );\n\n return (\n <div className={twMerge(getPositionClasses(), \"z-10\", className)} style={style}>\n <div className=\"relative\">\n <Button className={buttonClasses} onPress={handleSearchClick} variant=\"secondary\" size=\"sm\">\n <Icon name=\"MagnifyingGlass\" size={20} className=\"text-text-primary\" />\n </Button>\n\n {/* Search Input Panel */}\n {isOpen && showSearchInput && (\n <div\n className={twMerge(\n \"absolute top-12 left-0 min-w-64\",\n \"bg-background-surface border border-border rounded-lg shadow-xl p-3\"\n )}\n >\n <form onSubmit={handleSearchSubmit}>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className={twMerge(\n \"flex-1 px-3 py-2 text-sm rounded border\",\n \"bg-background border-border text-text-primary placeholder-text-muted\",\n \"focus:outline-none focus:ring-2 focus:ring-action-primary\"\n )}\n autoFocus\n />\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" className=\"px-3 py-2\">\n Search\n </Button>\n </div>\n </form>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { ViewState } from \"react-map-gl\";\n\nexport interface MapPoint {\n id: string;\n latitude: number;\n longitude: number;\n properties?: Record<string, any>;\n}\n\nexport function createGeoJsonData(data: MapPoint[]) {\n return {\n type: \"FeatureCollection\" as const,\n features: data.map(({ longitude, latitude, id }) => ({\n type: \"Feature\" as const,\n properties: { id },\n geometry: {\n type: \"Point\" as const,\n coordinates: [longitude, latitude],\n },\n })),\n };\n}\n\nfunction getBoundsZoomLevel(bounds: number[], width: number, height: number) {\n const WORLD_DIM = { height: 256, width: 256 };\n const ZOOM_MAX = 14;\n\n const latRad = (lat: number) => {\n const sin = Math.sin((lat * Math.PI) / 180);\n const radX2 = Math.log((1 + sin) / (1 - sin)) / 2;\n return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;\n };\n\n const zoom = (mapPx: number, worldPx: number, fraction: number) => {\n return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);\n };\n\n const ne = [bounds[2], bounds[3]];\n const sw = [bounds[0], bounds[1]];\n\n const latFraction = (latRad(ne[1]) - latRad(sw[1])) / Math.PI;\n const lngDiff = ne[0] - sw[0];\n const lngFraction = (lngDiff < 0 ? lngDiff + 360 : lngDiff) / 360;\n\n const latZoom = zoom(height, WORLD_DIM.height, latFraction);\n const lngZoom = zoom(width, WORLD_DIM.width, lngFraction);\n\n // Subtract 1 to ensure we have more padding\n const result = Math.min(latZoom, lngZoom, ZOOM_MAX) - 1;\n return Math.max(result, 3); // Set minimum zoom to 3 for continental US view\n}\n\n/**\n * Calculate a view state that fits all given points in the viewport\n * @param data Array of map points to fit in view\n * @param width Viewport width in pixels\n * @param height Viewport height in pixels\n * @returns ViewState that will show all points\n */\nexport function calculateViewStateThatFitsPoints(\n data: MapPoint[],\n width: number = 800,\n height: number = 600\n): ViewState {\n if (data.length === 0) {\n // Default to continental US view if no points\n return {\n latitude: 39.8283,\n longitude: -98.5795,\n zoom: 3,\n bearing: 0,\n pitch: 0,\n padding: { top: 0, bottom: 0, left: 0, right: 0 },\n };\n }\n\n // Calculate bounds for multiple points\n let minLat = data[0].latitude;\n let maxLat = data[0].latitude;\n let minLng = data[0].longitude;\n let maxLng = data[0].longitude;\n\n for (const point of data) {\n minLat = Math.min(minLat, point.latitude);\n maxLat = Math.max(maxLat, point.latitude);\n minLng = Math.min(minLng, point.longitude);\n maxLng = Math.max(maxLng, point.longitude);\n }\n\n const bounds = [minLng, minLat, maxLng, maxLat];\n\n // Calculate center point\n const latitude = (minLat + maxLat) / 2;\n const longitude = (minLng + maxLng) / 2;\n\n // Calculate zoom level based on bounds and viewport size\n const zoom = getBoundsZoomLevel(bounds, width, height);\n\n return {\n latitude,\n longitude,\n zoom,\n bearing: 0,\n pitch: 0,\n padding: { top: 80, bottom: 80, left: 80, right: 80 }, // Doubled padding\n };\n}\n\n// Keep this as an alias for backward compatibility\nexport const calculateInitialViewState = calculateViewStateThatFitsPoints;\n\n/**\n * Ensures city and state filters are always arrays for consistent MVT API calls\n * @param filters Raw filter object that might contain strings or arrays\n * @returns Normalized filter object with city and state as arrays\n */\nexport function normalizeMapFilters(filters?: {\n city?: string | string[];\n state?: string | string[];\n search?: string;\n}):\n | {\n city?: string[];\n state?: string[];\n search?: string;\n }\n | undefined {\n if (!filters) return undefined;\n\n return {\n city: filters.city ? (Array.isArray(filters.city) ? filters.city : [filters.city]) : undefined,\n state: filters.state\n ? Array.isArray(filters.state)\n ? filters.state\n : [filters.state]\n : undefined,\n search: filters.search?.trim() || undefined,\n };\n}\n","/**\n * Mapbox Configuration\n *\n * Centralized location for Mapbox access tokens and configuration.\n * For production, set the NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN environment variable.\n */\n\n// Demo token for Storybook and development\n// This is a public demo token - replace with your own for production\nexport const MAPBOX_DEMO_TOKEN =\n \"pk.eyJ1IjoidmljdG9yLXRleHR1cmUiLCJhIjoiY20yNTNnY2FhMG1nNTJqcG5xd2F4a2FncCJ9.lIo-qhEyJzlaMFSYHzv2lw\";\n\n/**\n * Get the Mapbox access token\n * Checks environment variable first, falls back to demo token\n */\nexport function getMapboxToken(): string {\n // Check for environment variable (for production)\n if (typeof process !== \"undefined\" && process.env?.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN) {\n return process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN;\n }\n\n // Check for browser environment variable\n if (\n typeof window !== \"undefined\" &&\n (window as Window & { NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN?: string })\n .NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN\n ) {\n return (window as Window & { NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN?: string })\n .NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN;\n }\n\n // Fall back to demo token\n return MAPBOX_DEMO_TOKEN;\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Icon } from \"../Icon\";\n\ninterface MapDrawerContainerProps {\n isOpen: boolean;\n onClose?: () => void;\n children?: React.ReactNode;\n}\n\nexport function MapDrawerContainer({ isOpen, onClose, children }: MapDrawerContainerProps) {\n if (!isOpen) return null;\n\n return (\n <div className=\"absolute right-0 top-0 z-10 flex h-full w-[400px] translate-x-0 flex-col overflow-y-auto bg-background-surface p-5 shadow-3xl transition-transform duration-300 ease-in-out animate-in slide-in-from-right\">\n <div className=\"flex h-10 w-full justify-end\">\n <div\n className={twMerge(\n \"rounded-full p-2 transition-colors duration-200\",\n \"cursor-pointer hover:bg-background-hover\"\n )}\n onClick={onClose}\n >\n <Icon name=\"X\" size={24} weight=\"bold\" className=\"text-text-heading\" />\n </div>\n </div>\n {children}\n </div>\n );\n}\n","import type { Expression } from \"mapbox-gl\";\nimport type { LayerProps } from \"react-map-gl\";\n\n// Map configuration constants\nexport const CLUSTER_THRESHOLD = 14;\nexport const CLUSTER_RADIUS = 50;\nexport const CLUSTER_SHADOW_SCALE_FACTOR = 1.25;\nexport const UNSELECTED_POINT_RADIUS = 9;\nexport const UNSELECTED_POINT_STROKE_WIDTH = 3;\nexport const UNSELECTED_POINT_SHADOW_RADIUS = UNSELECTED_POINT_RADIUS * 1.4;\nexport const UNSELECTED_POINT_SHADOW_BLUR = 0.2;\nexport const UNSELECTED_POINT_SHADOW_OFFSET: [number, number] = [0, 5];\n\n// Theme-based color configuration\nexport const MAP_COLORS = {\n light: {\n clusters: {\n small: \"#000000\",\n medium: \"#000000\",\n large: \"#000000\",\n },\n shadow: {\n color: \"rgba(0, 0, 0, 0.3)\",\n blur: 0.5,\n },\n unclusteredPoint: {\n fill: \"#000000\",\n stroke: \"#FFFFFF\",\n shadow: \"rgba(0, 0, 0, 0.3)\",\n },\n text: {\n primary: \"#1a1a1a\",\n onCluster: \"#FFFFFF\",\n },\n resetZoomButton: {\n background: \"#FFFFFF\",\n text: \"#1a1a1a\",\n shadow: \"xl\",\n },\n },\n dark: {\n clusters: {\n small: \"#000000\",\n medium: \"#000000\",\n large: \"#000000\",\n },\n shadow: {\n color: \"rgba(0, 0, 0, 0.5)\",\n blur: 0.5,\n },\n unclusteredPoint: {\n fill: \"#000000\",\n stroke: \"#FFFFFF\",\n shadow: \"rgba(0, 0, 0, 0.5)\",\n },\n text: {\n primary: \"#e5e5e5\",\n onCluster: \"#FFFFFF\",\n },\n resetZoomButton: {\n background: \"#1a1a1a\",\n text: \"#e5e5e5\",\n shadow: \"xl\",\n },\n },\n};\n\nexport const getClusterConfig = (isDarkTheme: boolean) => {\n const colors = isDarkTheme ? MAP_COLORS.dark : MAP_COLORS.light;\n return [\n { threshold: 30, radius: 20, color: colors.clusters.small },\n { threshold: 50, radius: 30, color: colors.clusters.medium },\n { threshold: 100, radius: 40, color: colors.clusters.large },\n ];\n};\n\nexport const getClusterRadiusExpression = (\n clusterConfig: ReturnType<typeof getClusterConfig>\n): Expression => [\n \"step\",\n [\"get\", \"point_count\"],\n clusterConfig[0].radius,\n ...clusterConfig.flatMap(({ threshold, radius }) => [threshold, radius]),\n];\n\nexport const getShadowRadiusExpression = (\n clusterConfig: ReturnType<typeof getClusterConfig>\n): Expression => [\n \"step\",\n [\"get\", \"point_count\"],\n clusterConfig[0].radius * CLUSTER_SHADOW_SCALE_FACTOR,\n ...clusterConfig.flatMap(({ threshold, radius }) => [\n threshold,\n radius * CLUSTER_SHADOW_SCALE_FACTOR,\n ]),\n];\n\nexport const getMapLayers = (\n selectedPointId: string | null | undefined,\n isDarkTheme: boolean\n): LayerProps[] => {\n const colors = isDarkTheme ? MAP_COLORS.dark : MAP_COLORS.light;\n const clusterConfig = getClusterConfig(isDarkTheme);\n\n const clusterShadowLayer: LayerProps = {\n id: \"cluster-shadows\",\n type: \"circle\",\n source: \"locations\",\n filter: [\"has\", \"point_count\"],\n layout: {},\n paint: {\n \"circle-radius\": getShadowRadiusExpression(clusterConfig),\n \"circle-color\": colors.shadow.color,\n \"circle-blur\": colors.shadow.blur,\n \"circle-translate\": [0, 8],\n },\n };\n\n const unclusteredPointShadowLayer: LayerProps = {\n id: \"unclustered-points-shadow\",\n type: \"circle\",\n source: \"locations\",\n filter: [\n \"all\",\n [\"!\", [\"has\", \"point_count\"]],\n [\"!=\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n ],\n paint: {\n \"circle-radius\": UNSELECTED_POINT_SHADOW_RADIUS,\n \"circle-color\": colors.unclusteredPoint.shadow,\n \"circle-blur\": UNSELECTED_POINT_SHADOW_BLUR,\n \"circle-translate\": UNSELECTED_POINT_SHADOW_OFFSET,\n },\n };\n\n const clusterCircleLayer: LayerProps = {\n id: \"clusters\",\n type: \"circle\",\n source: \"locations\",\n filter: [\"has\", \"point_count\"],\n paint: {\n \"circle-radius\": getClusterRadiusExpression(clusterConfig),\n \"circle-color\": [\n \"step\",\n [\"get\", \"point_count\"],\n clusterConfig[0].color,\n ...clusterConfig.flatMap(({ threshold, color }) => [threshold, color]),\n ] as Expression,\n },\n };\n\n const clusterCountLayer: LayerProps = {\n id: \"cluster-count\",\n type: \"symbol\",\n source: \"locations\",\n filter: [\"has\", \"point_count\"],\n layout: {\n \"text-field\": \"{point_count}\",\n \"text-font\": [\"DIN Pro Medium\", \"Arial Unicode MS Bold\"],\n \"text-size\": 14,\n \"text-offset\": [0, 0.1],\n },\n paint: {\n \"text-color\": colors.text.onCluster,\n },\n };\n\n const unclusteredPointLayer: LayerProps = {\n id: \"unclustered-points\",\n type: \"circle\",\n source: \"locations\",\n filter: [\n \"all\",\n [\"!\", [\"has\", \"point_count\"]],\n [\"!=\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n ],\n paint: {\n \"circle-radius\": UNSELECTED_POINT_RADIUS,\n \"circle-color\": colors.unclusteredPoint.fill,\n \"circle-stroke-width\": UNSELECTED_POINT_STROKE_WIDTH,\n \"circle-stroke-color\": colors.unclusteredPoint.stroke,\n },\n };\n\n const selectedPointLayer: LayerProps = {\n id: \"selected-point\",\n type: \"symbol\",\n source: \"locations\",\n filter: [\"==\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n layout: {\n \"icon-image\": \"pin-icon\",\n \"icon-size\": 36,\n \"icon-offset\": [0, -15],\n },\n };\n\n return [\n clusterShadowLayer,\n unclusteredPointShadowLayer,\n clusterCircleLayer,\n clusterCountLayer,\n unclusteredPointLayer,\n selectedPointLayer,\n ];\n};\n\nexport const getMvtMapLayers = (\n selectedPointId: string | null | undefined,\n isDarkTheme: boolean\n): LayerProps[] => {\n const colors = isDarkTheme ? MAP_COLORS.dark : MAP_COLORS.light;\n const clusterConfig = getClusterConfig(isDarkTheme);\n\n // Cluster shadow layer for server-side clusters\n const mvtClusterShadowLayer: LayerProps = {\n id: \"mvt-cluster-shadows\",\n type: \"circle\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\"==\", [\"get\", \"cluster\"], true],\n layout: {},\n paint: {\n \"circle-radius\": getShadowRadiusExpression(clusterConfig),\n \"circle-color\": colors.shadow.color,\n \"circle-blur\": colors.shadow.blur,\n \"circle-translate\": [0, 8],\n },\n };\n\n // Individual site shadow layer\n const mvtPointShadowLayer: LayerProps = {\n id: \"mvt-points-shadow\",\n type: \"circle\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\n \"all\",\n [\"!=\", [\"get\", \"cluster\"], true],\n [\"!=\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n ],\n paint: {\n \"circle-radius\": UNSELECTED_POINT_SHADOW_RADIUS,\n \"circle-color\": colors.unclusteredPoint.shadow,\n \"circle-blur\": UNSELECTED_POINT_SHADOW_BLUR,\n \"circle-translate\": UNSELECTED_POINT_SHADOW_OFFSET,\n },\n };\n\n // Cluster circle layer\n const mvtClusterLayer: LayerProps = {\n id: \"mvt-clusters\",\n type: \"circle\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\"==\", [\"get\", \"cluster\"], true],\n paint: {\n \"circle-radius\": getClusterRadiusExpression(clusterConfig),\n \"circle-color\": [\n \"step\",\n [\"get\", \"point_count\"],\n clusterConfig[0].color,\n ...clusterConfig.flatMap(({ threshold, color }) => [threshold, color]),\n ] as Expression,\n },\n };\n\n // Cluster count layer\n const mvtClusterCountLayer: LayerProps = {\n id: \"mvt-cluster-count\",\n type: \"symbol\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\"==\", [\"get\", \"cluster\"], true],\n layout: {\n \"text-field\": [\n \"case\",\n [\"has\", \"point_count_abbreviated\"],\n [\"get\", \"point_count_abbreviated\"],\n [\"to-string\", [\"get\", \"point_count\"]],\n ] as Expression,\n \"text-font\": [\"DIN Pro Medium\", \"Arial Unicode MS Bold\"],\n \"text-size\": 14,\n \"text-offset\": [0, 0.1],\n },\n paint: {\n \"text-color\": colors.text.onCluster,\n },\n };\n\n // Individual site layer\n const mvtPointLayer: LayerProps = {\n id: \"mvt-points\",\n type: \"circle\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\n \"all\",\n [\"!=\", [\"get\", \"cluster\"], true],\n [\"!=\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n ],\n paint: {\n \"circle-radius\": UNSELECTED_POINT_RADIUS,\n \"circle-color\": colors.unclusteredPoint.fill,\n \"circle-stroke-width\": UNSELECTED_POINT_STROKE_WIDTH,\n \"circle-stroke-color\": colors.unclusteredPoint.stroke,\n },\n };\n\n // Selected point layer\n const mvtSelectedPointLayer: LayerProps = {\n id: \"mvt-selected-point\",\n type: \"symbol\",\n source: \"mvt-locations\",\n \"source-layer\": \"sites\",\n filter: [\"==\", [\"get\", \"id\"], selectedPointId || \"selected\"],\n layout: {\n \"icon-image\": \"pin-icon\",\n \"icon-size\": 36,\n \"icon-offset\": [0, -15],\n },\n };\n\n return [\n mvtClusterShadowLayer,\n mvtPointShadowLayer,\n mvtClusterLayer,\n mvtClusterCountLayer,\n mvtPointLayer,\n mvtSelectedPointLayer,\n ];\n};\n","/**\n * Map style configuration for all map components\n * Centralized configuration for theme and color mode handling\n */\n\n/**\n * MAPBOX_THEMES\n *\n * Semantic map style themes that automatically adapt to light/dark mode.\n * The visual appearance (light/dark) is determined by the global ColorModeProvider.\n */\nexport const MAPBOX_THEMES = {\n streets: \"mapbox://styles/mapbox/streets-v12\", // Base style (both variants handled in getMapboxStyle)\n satellite: \"mapbox://styles/mapbox/satellite-streets-v12\", // Base style (both variants handled in getMapboxStyle)\n neutral: \"mapbox://styles/mapbox/light-v11\", // Base style (both variants handled in getMapboxStyle)\n} as const;\n\n/**\n * Get the appropriate Mapbox style URL based on semantic theme and color mode\n */\nexport const getMapboxStyle = (\n semanticTheme: keyof typeof MAPBOX_THEMES,\n isDarkMode: boolean\n): string => {\n const baseStyle = MAPBOX_THEMES[semanticTheme];\n\n // For neutral theme, use default Mapbox styles\n if (semanticTheme === \"neutral\") {\n return isDarkMode\n ? \"mapbox://styles/mapbox/dark-v11\" // Default dark\n : \"mapbox://styles/mapbox/light-v11\"; // Default light\n }\n\n // For satellite theme, use default for both light and dark\n if (semanticTheme === \"satellite\") {\n return \"mapbox://styles/mapbox/satellite-streets-v12\"; // Default satellite (works for both)\n }\n\n // For streets theme, use default light and custom dark\n if (semanticTheme === \"streets\") {\n return isDarkMode\n ? \"mapbox://styles/victor-texture/clzwxtrng005s01p93rtr04op\" // Custom dark streets\n : \"mapbox://styles/mapbox/streets-v12\"; // Default light streets\n }\n\n // For other themes, use the base style (they adapt automatically)\n return baseStyle;\n};\n\n/**\n * Check if a style URL is a custom victor-texture style\n */\nexport const isCustomStyle = (styleUrl: string): boolean => {\n return styleUrl.includes(\"victor-texture\");\n};\n\n/**\n * Get satellite style with improved loading strategy\n * Uses different approaches for custom vs default styles\n */\nexport const getSatelliteStyle = (isDarkMode: boolean): string => {\n if (isDarkMode) {\n // For dark mode, we could implement a fallback strategy\n // For now, use default satellite which works well in both modes\n return \"mapbox://styles/mapbox/satellite-streets-v12\";\n }\n return \"mapbox://styles/mapbox/satellite-streets-v12\";\n};\n","import type { GeoJSONFeature, GeoJSONSource } from \"mapbox-gl\";\nimport { useCallback } from \"react\";\nimport type { MapLayerMouseEvent, MapRef } from \"react-map-gl\";\n\nconst TRANSITION_DURATION = 1000;\nconst DRAWER_WIDTH = 400;\n\ninterface UseMapInteractionsProps {\n onPointClick?: (pointId: string) => void;\n onCloseDrawer?: () => void;\n selectedPointId?: string | null;\n mapRef: React.RefObject<MapRef>;\n}\n\nexport function useMapInteractions({\n onPointClick,\n onCloseDrawer,\n selectedPointId,\n mapRef,\n}: UseMapInteractionsProps) {\n const handlePointClick = useCallback(\n (event: MapLayerMouseEvent) => {\n const feature = event.features?.[0] as GeoJSONFeature | undefined;\n if (\n feature?.geometry.type === \"Point\" &&\n feature.properties?.id &&\n onPointClick &&\n mapRef.current\n ) {\n // First trigger the click handler for selection\n onPointClick(feature.properties.id);\n\n // Then fly to the point with padding for drawer\n if (feature.geometry.coordinates) {\n const coordinates = feature.geometry.coordinates as [number, number];\n const zoom = 14;\n\n mapRef.current.flyTo({\n center: coordinates,\n zoom,\n duration: TRANSITION_DURATION,\n padding: { top: 0, bottom: 0, left: 0, right: DRAWER_WIDTH },\n });\n }\n }\n },\n [onPointClick, mapRef]\n );\n\n const handleClusterClick = useCallback(\n (clickedFeature: GeoJSONFeature) => {\n const clusterId = clickedFeature.properties?.cluster_id;\n\n // Handle client-side GeoJSON clusters\n if (clusterId) {\n const mapboxSource = mapRef.current?.getSource(\"locations\") as GeoJSONSource & {\n getClusterExpansionZoom(\n clusterId: number,\n callback: (error: Error | null, zoom: number) => void\n ): void;\n };\n\n if (mapboxSource) {\n mapboxSource.getClusterExpansionZoom(clusterId, (err: Error | null, zoom: number) => {\n if (err) return;\n\n if (clickedFeature.geometry.type === \"Point\") {\n const coordinates = clickedFeature.geometry.coordinates as [number, number];\n if (mapRef.current) {\n mapRef.current.flyTo({\n center: coordinates,\n zoom,\n duration: TRANSITION_DURATION,\n });\n }\n }\n });\n }\n }\n // Handle server-side MVT clusters - zoom in by 3 levels\n else if (clickedFeature.properties?.cluster === true) {\n if (clickedFeature.geometry.type === \"Point\" && mapRef.current) {\n const coordinates = clickedFeature.geometry.coordinates as [number, number];\n const currentZoom = mapRef.current.getZoom();\n const newZoom = Math.min(currentZoom + 3, 18); // Zoom in by 3 levels, max 18\n\n mapRef.current.flyTo({\n center: coordinates,\n zoom: newZoom,\n duration: TRANSITION_DURATION,\n });\n }\n }\n },\n [mapRef]\n );\n\n const handleMapClick = useCallback(\n (event: MapLayerMouseEvent) => {\n const feature = event.features?.[0] as GeoJSONFeature | undefined;\n\n // If no feature clicked and drawer is open, close it\n if (!feature && selectedPointId && onCloseDrawer) {\n event.preventDefault?.();\n onCloseDrawer();\n return;\n }\n\n // Handle cluster clicks (both GeoJSON client-side and MVT server-side)\n if (feature?.properties?.cluster || feature?.properties?.cluster_id) {\n handleClusterClick(feature);\n return;\n }\n\n // Handle point clicks\n handlePointClick(event);\n },\n [handlePointClick, handleClusterClick, selectedPointId, onCloseDrawer]\n );\n\n const handleMouseEnter = useCallback(() => {\n if (mapRef.current) {\n mapRef.current.getCanvas().style.cursor = \"pointer\";\n }\n }, [mapRef]);\n\n const handleMouseLeave = useCallback(() => {\n if (mapRef.current) {\n mapRef.current.getCanvas().style.cursor = \"\";\n }\n }, [mapRef]);\n\n return {\n handleMapClick,\n handleMouseEnter,\n handleMouseLeave,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { MapRef, ViewState } from \"react-map-gl\";\nimport type { MapPoint } from \"./utils\";\nimport { calculateViewStateThatFitsPoints } from \"./utils\";\n\nconst TRANSITION_DURATION = 1000;\nconst VIEW_STATE_THRESHOLD = 0.1;\nconst DRAWER_WIDTH = 400;\n\ninterface UseMapViewStateProps {\n data: MapPoint[]; // Used for initial view calculation - needed even with MVT\n initialViewState?: ViewState;\n onViewStateChange?: (viewState: ViewState) => void;\n mapRef: React.RefObject<MapRef>;\n containerDimensions: { width: number; height: number } | null;\n}\n\nconst getSinglePointViewState = (point: MapPoint): ViewState => {\n return {\n longitude: point.longitude,\n latitude: point.latitude,\n zoom: 14,\n bearing: 0,\n pitch: 0,\n padding: { top: 0, bottom: 0, left: 0, right: DRAWER_WIDTH },\n };\n};\n\nexport function useMapViewState({\n data,\n initialViewState,\n onViewStateChange,\n mapRef,\n containerDimensions,\n}: UseMapViewStateProps) {\n const isFirstLoad = useRef(true);\n const [showResetButton, setShowResetButton] = useState(false);\n const debounceTimeout = useRef<NodeJS.Timeout | null>(null);\n\n // Calculate the default view state\n const defaultViewState = useMemo(() => {\n if (\n !containerDimensions ||\n containerDimensions.width === 0 ||\n containerDimensions.height === 0\n ) {\n return {\n longitude: -98.5795,\n latitude: 39.8283,\n zoom: 3,\n bearing: 0,\n pitch: 0,\n padding: { top: 100, bottom: 100, left: 100, right: 100 },\n };\n }\n\n if (data.length === 1) {\n return getSinglePointViewState(data[0]);\n }\n\n return calculateViewStateThatFitsPoints(\n data,\n containerDimensions.width,\n containerDimensions.height\n );\n }, [data, containerDimensions]);\n\n // Use provided initialViewState or fall back to calculated one\n const effectiveInitialViewState = initialViewState ?? defaultViewState;\n\n // Calculate the ideal view state for current points\n const calculatedViewState = useMemo(() => {\n if (data.length === 0) return effectiveInitialViewState;\n\n if (\n !containerDimensions ||\n containerDimensions.width === 0 ||\n containerDimensions.height === 0\n ) {\n return effectiveInitialViewState;\n }\n\n if (data.length === 1) {\n return getSinglePointViewState(data[0]);\n }\n\n return calculateViewStateThatFitsPoints(\n data,\n containerDimensions.width,\n containerDimensions.height\n );\n }, [data, effectiveInitialViewState, containerDimensions]);\n\n // Check if current view state differs significantly from calculated\n const isViewStateDifferent = (current: ViewState, calculated: ViewState) => {\n return (\n Math.abs(current.longitude - calculated.longitude) > VIEW_STATE_THRESHOLD ||\n Math.abs(current.latitude - calculated.latitude) > VIEW_STATE_THRESHOLD ||\n Math.abs(current.zoom - calculated.zoom) > VIEW_STATE_THRESHOLD\n );\n };\n\n // Handle view state changes with debouncing to prevent flicker\n const handleViewStateChange = useCallback(\n (newViewState: ViewState) => {\n onViewStateChange?.(newViewState);\n\n // Clear existing timeout\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n // Debounce the reset button visibility update\n debounceTimeout.current = setTimeout(() => {\n const shouldShow = isViewStateDifferent(newViewState, calculatedViewState);\n setShowResetButton(shouldShow);\n }, 100); // 100ms debounce\n },\n [onViewStateChange, calculatedViewState]\n );\n\n // Reset view handler\n const handleResetView = () => {\n if (mapRef.current) {\n const resetState = calculatedViewState;\n mapRef.current.flyTo({\n center: [resetState.longitude, resetState.latitude],\n zoom: resetState.zoom,\n duration: TRANSITION_DURATION,\n });\n }\n };\n\n // Single effect to handle both initial load and data/container changes\n useEffect(() => {\n if (\n !mapRef.current ||\n !containerDimensions ||\n containerDimensions.width === 0 ||\n containerDimensions.height === 0\n ) {\n return;\n }\n\n if (data.length === 0) {\n return;\n }\n\n const newViewState =\n data.length === 1\n ? getSinglePointViewState(data[0])\n : calculateViewStateThatFitsPoints(\n data,\n containerDimensions.width,\n containerDimensions.height\n );\n\n if (isFirstLoad.current) {\n mapRef.current.jumpTo({\n center: [newViewState.longitude, newViewState.latitude],\n zoom: newViewState.zoom,\n });\n isFirstLoad.current = false;\n } else {\n mapRef.current.flyTo({\n center: [newViewState.longitude, newViewState.latitude],\n zoom: newViewState.zoom,\n duration: TRANSITION_DURATION,\n });\n }\n }, [data, containerDimensions, mapRef]);\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n };\n }, []);\n\n return {\n effectiveInitialViewState,\n showResetButton,\n handleViewStateChange,\n handleResetView,\n };\n}\n","\"use client\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport ReactMapGL, { Layer, MapRef, Marker, Source, ViewState } from \"react-map-gl\";\nimport { Icon } from \"../Icon\";\nimport { MapLayersControl } from \"./MapLayersControl\";\nimport { MapListControl } from \"./MapListControl\";\nimport { MapLocationControl } from \"./MapLocationControl\";\nimport { MapSearchControl } from \"./MapSearchControl\";\nimport { createGeoJsonData, type MapPoint, normalizeMapFilters } from \"./utils\";\n\n// Re-export MapPoint for external use\nexport type { MapPoint };\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport \"./mapbox-overrides.css\";\nimport { twMerge } from \"tailwind-merge\";\nimport { getMapboxToken } from \"../../config/mapbox\";\nimport { useColorMode } from \"../../utils/ColorModeProvider\";\nimport { getResolvedColor } from \"../../utils/colors\";\nimport { Button } from \"../Button\";\nimport { MapDrawerContainer } from \"./MapDrawerContainer\";\nimport { CLUSTER_RADIUS, CLUSTER_THRESHOLD, getMapLayers, getMvtMapLayers } from \"./mapLayers\";\nimport { getMapboxStyle, isCustomStyle, MAPBOX_THEMES } from \"./mapStyles\";\nimport { useMapInteractions } from \"./useMapInteractions\";\nimport { useMapViewState } from \"./useMapViewState\";\n\n// Configuration constants\nconst SITE_DOMAIN_BASE_URL =\n process.env.NEXT_PUBLIC_SITE_DOMAIN_BASE_URL || \"http://localhost:3005\";\nconst SELECTED_POINT_ICON_SIZE = 40;\n\n// MVT Tile URL configuration - connect directly to site domain service\nconst getMvtTileUrl = (\n workspaceId: string,\n filters?: {\n city?: string[];\n state?: string[];\n search?: string;\n }\n) => {\n const baseUrl = `${SITE_DOMAIN_BASE_URL}/tiles/${workspaceId}/{z}/{x}/{y}.mvt`;\n\n if (!filters || (!filters.city?.length && !filters.state?.length && !filters.search)) {\n return baseUrl;\n }\n\n const searchParams = new URLSearchParams();\n\n if (filters.city?.length) {\n filters.city.forEach((city) => searchParams.append(\"city\", city));\n }\n\n if (filters.state?.length) {\n filters.state.forEach((state) => searchParams.append(\"state\", state));\n }\n\n if (filters.search?.trim()) {\n searchParams.append(\"search\", filters.search.trim());\n }\n\n return `${baseUrl}?${searchParams.toString()}`;\n};\n\nexport interface InteractiveMapProps {\n data?: MapPoint[]; // Used for initial view calculation and fallback to GeoJSON\n initialViewState?: ViewState;\n viewState?: ViewState;\n onViewStateChange?: (viewState: ViewState) => void;\n onPointClick?: (pointId: string) => void;\n selectedPointId?: string | null;\n onCloseDrawer?: () => void;\n drawerComponent?: React.ReactNode;\n scrollEnabled?: boolean;\n className?: string;\n previewMode?: boolean;\n previewModeCta?: React.ReactNode;\n onPreviewModePress?: () => void;\n workspaceId?: string; // Required for MVT tiles\n mapFilters?: {\n city?: string[];\n state?: string[];\n search?: string;\n };\n serverSideClusteringEnabled?: boolean;\n /**\n * Semantic map theme - automatically adapts to light/dark mode\n * @default \"streets\"\n */\n theme?: keyof typeof MAPBOX_THEMES;\n mapboxAccessToken?: string;\n transformRequest?: (\n url: string,\n resourceType?: string\n ) => { url: string; headers?: Record<string, string> };\n /**\n * Show loading state\n * @default false\n */\n isLoading?: boolean;\n /**\n * Map controls configuration\n */\n controls?: {\n /**\n * Show navigation control (compass and geolocate)\n * @default true\n */\n navigation?: boolean;\n /**\n * Show layers control\n * @default false\n */\n layers?: boolean;\n /**\n * Show search control\n * @default false\n */\n search?: boolean;\n /**\n * Show list control\n * @default false\n */\n list?: boolean;\n /**\n * Show reset zoom control\n * @default true\n */\n resetZoom?: boolean;\n };\n /**\n * Available map layers for the layers control\n */\n mapLayers?: Array<{\n id: string;\n name: string;\n visible: boolean;\n onToggle: (id: string, visible: boolean) => void;\n }>;\n /**\n * List items for the list control\n */\n listItems?: Array<{\n id: string;\n name: string;\n onClick: () => void;\n }>;\n /**\n * Callback when search is triggered\n */\n onSearch?: (query: string) => void;\n /**\n * Callback when list toggle is clicked\n */\n onListToggle?: (isOpen: boolean) => void;\n /**\n * Callback when map theme is changed\n */\n onThemeChange?: (theme: keyof typeof MAPBOX_THEMES) => void;\n /**\n * ISO RTO regions visibility\n */\n isoRtoVisible?: boolean;\n /**\n * Callback when ISO RTO regions visibility changes\n */\n onIsoRtoToggle?: (visible: boolean) => void;\n /**\n * Vermont substations visibility\n */\n vermontSubstationsVisible?: boolean;\n /**\n * Callback when Vermont substations visibility changes\n */\n onVermontSubstationsToggle?: (visible: boolean) => void;\n /**\n * Transformers visibility\n */\n transformersVisible?: boolean;\n /**\n * Callback when transformers visibility changes\n */\n onTransformersToggle?: (visible: boolean) => void;\n /**\n * Feeders visibility\n */\n feedersVisible?: boolean;\n /**\n * Callback when feeders visibility changes\n */\n onFeedersToggle?: (visible: boolean) => void;\n /**\n * Spans visibility\n */\n spansVisible?: boolean;\n /**\n * Callback when spans visibility changes\n */\n onSpansToggle?: (visible: boolean) => void;\n /**\n * Minimum zoom level to show substations\n * @default 8\n */\n substationsMinZoom?: number;\n /**\n * Minimum zoom level to show transformers\n * @default 12\n */\n transformersMinZoom?: number;\n /**\n * Minimum zoom level to show feeders\n * @default 12\n */\n feedersMinZoom?: number;\n /**\n * Minimum zoom level to show spans\n * @default 12\n */\n spansMinZoom?: number;\n /**\n * Placeholder text for search input\n * @default \"Search places...\"\n */\n searchPlaceholder?: string;\n /**\n * Custom positioning for controls\n */\n controlStyles?: {\n navigation?: React.CSSProperties;\n layers?: React.CSSProperties;\n search?: React.CSSProperties;\n list?: React.CSSProperties;\n };\n /**\n * Custom Mapbox tileset to render\n */\n customTileset?: {\n id: string;\n url: string;\n sourceLayer?: string;\n layers?: Array<{\n id: string;\n type: \"circle\" | \"fill\" | \"line\" | \"symbol\" | \"raster\";\n paint?: Record<string, any>;\n layout?: Record<string, any>;\n }>;\n };\n}\n\nexport function InteractiveMap({\n data = [],\n initialViewState,\n onViewStateChange,\n onPointClick,\n selectedPointId,\n onCloseDrawer,\n drawerComponent,\n scrollEnabled = true,\n className,\n previewMode = false,\n previewModeCta,\n onPreviewModePress,\n workspaceId,\n mapFilters,\n serverSideClusteringEnabled = false,\n theme,\n mapboxAccessToken = getMapboxToken(),\n transformRequest,\n isLoading = false,\n controls = {\n navigation: true,\n layers: false,\n search: false,\n list: false,\n resetZoom: true,\n },\n mapLayers: layersData = [],\n listItems = [],\n onSearch,\n onListToggle,\n onThemeChange,\n isoRtoVisible: propIsoRtoVisible,\n onIsoRtoToggle,\n vermontSubstationsVisible: propVermontSubstationsVisible,\n onVermontSubstationsToggle,\n transformersVisible: propTransformersVisible,\n onTransformersToggle,\n feedersVisible: propFeedersVisible,\n onFeedersToggle,\n spansVisible: propSpansVisible,\n onSpansToggle,\n substationsMinZoom = 8,\n transformersMinZoom = 12,\n feedersMinZoom = 12,\n spansMinZoom = 12,\n searchPlaceholder = \"Search places...\",\n controlStyles,\n customTileset,\n}: InteractiveMapProps) {\n const { isDarkTheme, colorMode } = useColorMode();\n\n // Check if theme is still initializing\n const [isThemeReady, setIsThemeReady] = useState(false);\n\n useEffect(() => {\n // Check if the theme-dark class is properly applied\n const checkThemeReady = () => {\n const hasThemeClass = document.body.classList.contains(\"theme-dark\");\n const expectedTheme = colorMode === \"dark\";\n\n // Theme is ready when the class matches the expected theme\n setIsThemeReady(hasThemeClass === expectedTheme);\n };\n\n // Initial check\n checkThemeReady();\n\n // Watch for class changes\n const observer = new MutationObserver(checkThemeReady);\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n return () => observer.disconnect();\n }, [colorMode]);\n\n // Use provided theme or default to streets\n const semanticTheme = theme || \"streets\";\n const mapRef = useRef<MapRef | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerDimensions, setContainerDimensions] = useState<{\n width: number;\n height: number;\n } | null>(null);\n // Use prop value if provided, otherwise use internal state\n const [internalIsoRtoVisible, setInternalIsoRtoVisible] = useState(false);\n const isoRtoVisible = propIsoRtoVisible !== undefined ? propIsoRtoVisible : internalIsoRtoVisible;\n\n const [internalVermontSubstationsVisible, setInternalVermontSubstationsVisible] = useState(false);\n const vermontSubstationsVisible =\n propVermontSubstationsVisible !== undefined\n ? propVermontSubstationsVisible\n : internalVermontSubstationsVisible;\n\n const [internalTransformersVisible, setInternalTransformersVisible] = useState(false);\n const transformersVisible =\n propTransformersVisible !== undefined ? propTransformersVisible : internalTransformersVisible;\n\n const [internalFeedersVisible, setInternalFeedersVisible] = useState(false);\n const feedersVisible =\n propFeedersVisible !== undefined ? propFeedersVisible : internalFeedersVisible;\n\n const [internalSpansVisible, setInternalSpansVisible] = useState(false);\n const spansVisible = propSpansVisible !== undefined ? propSpansVisible : internalSpansVisible;\n\n const setIsoRtoVisible = onIsoRtoToggle || setInternalIsoRtoVisible;\n const setVermontSubstationsVisible =\n onVermontSubstationsToggle || setInternalVermontSubstationsVisible;\n const setTransformersVisible = onTransformersToggle || setInternalTransformersVisible;\n const setFeedersVisible = onFeedersToggle || setInternalFeedersVisible;\n const setSpansVisible = onSpansToggle || setInternalSpansVisible;\n\n // Effect to update container dimensions\n useEffect(() => {\n if (containerRef.current) {\n const updateDimensions = () => {\n setContainerDimensions({\n width: containerRef.current?.clientWidth ?? 0,\n height: containerRef.current?.clientHeight ?? 0,\n });\n };\n\n updateDimensions();\n const observer = new ResizeObserver(updateDimensions);\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }\n }, []);\n\n // Get coordinates of selected point\n const selectedPointCoordinates = useMemo(() => {\n if (!selectedPointId) return null;\n const point = data.find((p) => p.id === selectedPointId);\n return point ? ([point.longitude, point.latitude] as [number, number]) : null;\n }, [selectedPointId, data]);\n\n // Use custom hooks\n const { effectiveInitialViewState, showResetButton, handleViewStateChange, handleResetView } =\n useMapViewState({\n data,\n initialViewState,\n onViewStateChange,\n mapRef,\n containerDimensions,\n });\n\n const { handleMapClick, handleMouseEnter, handleMouseLeave } = useMapInteractions({\n onPointClick,\n onCloseDrawer,\n selectedPointId,\n mapRef,\n });\n\n // Get map layers with key to force re-render\n const mapLayerComponents = useMemo(() => {\n if (serverSideClusteringEnabled) {\n return getMvtMapLayers(selectedPointId, isDarkTheme);\n }\n return getMapLayers(selectedPointId, isDarkTheme);\n }, [selectedPointId, isDarkTheme, serverSideClusteringEnabled]);\n\n // Handle map style changes when theme changes\n useEffect(() => {\n if (mapRef.current) {\n const map = mapRef.current.getMap();\n\n // Set the new style\n const newStyle = getMapboxStyle(semanticTheme, isDarkTheme);\n const isCustom = isCustomStyle(newStyle);\n\n // For custom styles, use a more robust loading approach\n if (isCustom) {\n // Preload the style to ensure it's available\n const preloadStyle = async () => {\n try {\n // Try to fetch the style first to ensure it's available\n const response = await fetch(newStyle);\n if (response.ok) {\n // Style is available, now set it\n map.setStyle(newStyle);\n\n const handleStyleLoad = () => {\n map.triggerRepaint();\n };\n\n if (map.isStyleLoaded()) {\n handleStyleLoad();\n } else {\n map.once(\"style.load\", handleStyleLoad);\n }\n } else {\n // Fallback to default style if custom fails\n console.warn(\"Custom style failed to load, falling back to default\");\n const fallbackStyle =\n semanticTheme === \"satellite\"\n ? \"mapbox://styles/mapbox/satellite-streets-v12\"\n : \"mapbox://styles/mapbox/streets-v12\";\n map.setStyle(fallbackStyle);\n }\n } catch (error) {\n // Fallback to default style on error\n console.warn(\"Custom style loading error, falling back to default:\", error);\n const fallbackStyle =\n semanticTheme === \"satellite\"\n ? \"mapbox://styles/mapbox/satellite-streets-v12\"\n : \"mapbox://styles/mapbox/streets-v12\";\n map.setStyle(fallbackStyle);\n }\n };\n\n preloadStyle();\n } else {\n // For default styles, use immediate loading\n map.setStyle(newStyle);\n\n const handleStyleLoad = () => {\n map.triggerRepaint();\n };\n\n if (map.isStyleLoaded()) {\n handleStyleLoad();\n } else {\n map.once(\"style.load\", handleStyleLoad);\n }\n }\n }\n }, [isDarkTheme, semanticTheme]);\n\n // GeoJSON data\n const geoJsonData = useMemo(() => createGeoJsonData(data), [data]);\n\n // Default transform request if not provided\n const defaultTransformRequest = (url: string, resourceType?: string) => {\n // If a custom transform request is provided, use it\n if (transformRequest) {\n return transformRequest(url, resourceType);\n }\n // Otherwise just return the URL unchanged\n return { url };\n };\n\n // Show loading state\n if (isLoading || !isThemeReady) {\n return (\n <div className={twMerge(\"relative flex h-full w-full overflow-hidden\", className)}>\n <div\n className=\"relative h-full w-full overflow-hidden rounded-lg\"\n style={{ backgroundColor: \"var(--color-skeleton-base)\" }}\n >\n {/* Map-like skeleton background */}\n <div\n className=\"absolute inset-0\"\n style={{\n background:\n \"linear-gradient(to bottom right, var(--color-skeleton-base), var(--color-skeleton-highlight))\",\n }}\n />\n\n {/* Animated loading overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"flex flex-col items-center space-y-3\">\n {/* Map pin icon skeleton */}\n <div\n className=\"h-8 w-8 animate-pulse rounded-full\"\n style={{ backgroundColor: \"var(--color-skeleton-base)\" }}\n />\n\n {/* Loading text */}\n <div className=\"space-y-2\">\n <div\n className=\"h-3 w-16 animate-pulse rounded\"\n style={{ backgroundColor: \"var(--color-skeleton-base)\" }}\n />\n <div\n className=\"h-2 w-12 animate-pulse rounded\"\n style={{ backgroundColor: \"var(--color-skeleton-highlight)\" }}\n />\n </div>\n </div>\n </div>\n\n {/* Grid pattern to suggest map */}\n <div className=\"absolute inset-0 opacity-20\">\n <div\n className=\"h-full w-full\"\n style={{\n backgroundImage: `\n linear-gradient(rgba(0,0,0,0.15) 1px, transparent 1px),\n linear-gradient(90deg, rgba(0,0,0,0.15) 1px, transparent 1px)\n `,\n backgroundSize: \"30px 30px\",\n }}\n />\n </div>\n </div>\n </div>\n );\n }\n\n // Modify the div wrapper to handle preview mode clicks\n return (\n <div\n ref={containerRef}\n className={twMerge(\n \"relative flex h-full w-full overflow-hidden\",\n previewMode && \"cursor-pointer\",\n className\n )}\n onClick={previewMode ? onPreviewModePress : undefined}\n >\n <div style={{ flex: 1 }}>\n <ReactMapGL\n ref={mapRef}\n key={`map-${semanticTheme}`} // Only re-mount when semantic theme changes, not color mode\n initialViewState={effectiveInitialViewState}\n style={{ width: \"100%\", height: \"100%\" }}\n mapStyle={getMapboxStyle(semanticTheme, isDarkTheme)}\n mapboxAccessToken={mapboxAccessToken}\n transformRequest={defaultTransformRequest}\n onMove={previewMode ? undefined : (evt) => handleViewStateChange(evt.viewState)}\n onClick={previewMode ? undefined : handleMapClick}\n interactiveLayerIds={\n previewMode\n ? []\n : serverSideClusteringEnabled\n ? [\"mvt-points\", \"mvt-clusters\"]\n : [\"unclustered-points\", \"clusters\"]\n }\n onMouseEnter={previewMode ? undefined : handleMouseEnter}\n onMouseLeave={previewMode ? undefined : handleMouseLeave}\n scrollZoom={previewMode ? false : scrollEnabled}\n dragPan={!previewMode}\n dragRotate={!previewMode}\n doubleClickZoom={!previewMode}\n interactive={!previewMode}\n >\n {!previewMode && controls.search && (\n <MapSearchControl\n position=\"top-left\"\n onSearch={onSearch}\n placeholder={searchPlaceholder}\n style={controlStyles?.search}\n />\n )}\n {!previewMode && controls.list && (\n <MapListControl\n position=\"top-right\"\n items={listItems}\n onToggle={onListToggle}\n style={controlStyles?.list}\n />\n )}\n {/* Navigation controls - always at the bottom */}\n {!previewMode && controls.navigation && (\n <MapLocationControl\n mapRef={mapRef}\n position=\"bottom-right\"\n showCompass={true}\n showGeolocate={true}\n style={{\n bottom: \"16px\",\n right: \"16px\",\n ...controlStyles?.navigation,\n }}\n />\n )}\n\n {/* Reset zoom - above navigation controls when both are shown */}\n {!previewMode && showResetButton && controls.resetZoom && (\n <div\n className={twMerge(\n \"absolute right-4 z-10\",\n // Responsive spacing: more space on mobile, keep larger screens the same\n controls.navigation\n ? \"bottom-[108px] sm:bottom-[72px] lg:bottom-[64px]\"\n : \"bottom-4\"\n )}\n >\n <Button\n className={twMerge(\n \"h-10 w-10 p-0\",\n \"bg-background-surface hover:bg-background-hover shadow-lg border border-border\"\n )}\n onPress={handleResetView}\n variant=\"secondary\"\n size=\"sm\"\n >\n <Icon name=\"ArrowsOut\" size={20} className=\"text-text-primary\" />\n </Button>\n </div>\n )}\n\n {!previewMode && controls.layers && (\n <MapLayersControl\n position=\"bottom-left\"\n layers={layersData}\n showLayersPanel={layersData.length > 0}\n currentTheme={semanticTheme}\n onThemeChange={onThemeChange}\n isoRtoVisible={isoRtoVisible}\n onIsoRtoToggle={setIsoRtoVisible}\n vermontSubstationsVisible={vermontSubstationsVisible}\n onVermontSubstationsToggle={setVermontSubstationsVisible}\n transformersVisible={transformersVisible}\n onTransformersToggle={setTransformersVisible}\n feedersVisible={feedersVisible}\n onFeedersToggle={setFeedersVisible}\n spansVisible={spansVisible}\n onSpansToggle={setSpansVisible}\n style={controlStyles?.layers}\n />\n )}\n\n {serverSideClusteringEnabled && workspaceId ? (\n <Source\n key={getMvtTileUrl(workspaceId, normalizeMapFilters(mapFilters))}\n id=\"mvt-locations\"\n type=\"vector\"\n tiles={[getMvtTileUrl(workspaceId, normalizeMapFilters(mapFilters))]}\n minzoom={0}\n maxzoom={22}\n >\n {mapLayerComponents.map((layer) => (\n <Layer key={layer.id} {...layer} />\n ))}\n </Source>\n ) : (\n geoJsonData && (\n <Source\n id=\"locations\"\n type=\"geojson\"\n data={geoJsonData}\n cluster={true}\n clusterMaxZoom={CLUSTER_THRESHOLD}\n clusterRadius={CLUSTER_RADIUS}\n >\n {mapLayerComponents.map((layer) => (\n <Layer key={layer.id} {...layer} />\n ))}\n </Source>\n )\n )}\n\n {/* ISO RTO Regions - Built-in tileset */}\n {isoRtoVisible && (\n <Source id=\"iso-rto-regions\" type=\"vector\" url=\"mapbox://victor-texture.06v0fhln\">\n <Layer\n id=\"iso-rto-regions-fill\"\n type=\"fill\"\n source-layer=\"validISOGeoJson\"\n paint={{\n \"fill-color\": [\n \"case\",\n [\"==\", [\"get\", \"state\"], \"CA\"],\n getResolvedColor(\"--color-data-categorical-1\", \"#a3eae4\"),\n [\"==\", [\"get\", \"state\"], \"TX\"],\n getResolvedColor(\"--color-data-categorical-2\", \"#91a0ff\"),\n [\"==\", [\"get\", \"state\"], \"FL\"],\n getResolvedColor(\"--color-data-categorical-3\", \"#ffd1a3\"),\n [\"==\", [\"get\", \"state\"], \"NY\"],\n getResolvedColor(\"--color-data-categorical-4\", \"#ffabc8\"),\n [\"==\", [\"get\", \"state\"], \"IL\"],\n getResolvedColor(\"--color-data-categorical-5\", \"#c1b8ff\"),\n [\"==\", [\"get\", \"state\"], \"PA\"],\n getResolvedColor(\"--color-data-categorical-6\", \"#e0ffb8\"),\n [\"==\", [\"get\", \"state\"], \"OH\"],\n getResolvedColor(\"--color-data-categorical-1\", \"#a3eae4\"),\n [\"==\", [\"get\", \"state\"], \"GA\"],\n getResolvedColor(\"--color-data-categorical-2\", \"#91a0ff\"),\n [\"==\", [\"get\", \"state\"], \"NC\"],\n getResolvedColor(\"--color-data-categorical-3\", \"#ffd1a3\"),\n [\"==\", [\"get\", \"state\"], \"MI\"],\n getResolvedColor(\"--color-data-categorical-4\", \"#ffabc8\"),\n [\"==\", [\"get\", \"state\"], \"NJ\"],\n getResolvedColor(\"--color-data-categorical-5\", \"#c1b8ff\"),\n [\"==\", [\"get\", \"state\"], \"VA\"],\n getResolvedColor(\"--color-data-categorical-6\", \"#e0ffb8\"),\n [\"==\", [\"get\", \"state\"], \"WA\"],\n getResolvedColor(\"--color-data-categorical-1\", \"#a3eae4\"),\n [\"==\", [\"get\", \"state\"], \"AZ\"],\n getResolvedColor(\"--color-data-categorical-2\", \"#91a0ff\"),\n [\"==\", [\"get\", \"state\"], \"MA\"],\n getResolvedColor(\"--color-data-categorical-3\", \"#ffd1a3\"),\n [\"==\", [\"get\", \"state\"], \"TN\"],\n getResolvedColor(\"--color-data-categorical-4\", \"#ffabc8\"),\n [\"==\", [\"get\", \"state\"], \"IN\"],\n getResolvedColor(\"--color-data-categorical-5\", \"#c1b8ff\"),\n [\"==\", [\"get\", \"state\"], \"MO\"],\n getResolvedColor(\"--color-data-categorical-6\", \"#e0ffb8\"),\n getResolvedColor(\"--color-data-default\", \"#444ae1\"),\n ],\n \"fill-opacity\": 0.7,\n }}\n layout={{\n visibility: \"visible\",\n }}\n />\n <Layer\n id=\"iso-rto-regions-outline\"\n type=\"line\"\n source-layer=\"validISOGeoJson\"\n paint={{\n \"line-color\": \"#ffffff\",\n \"line-width\": 2,\n }}\n layout={{\n visibility: \"visible\",\n }}\n />\n </Source>\n )}\n\n {/* Transformers - Built-in tileset */}\n {transformersVisible && (\n <Source id=\"vermont-transformers\" type=\"vector\" url=\"mapbox://victor-texture.9w5xhwpr\">\n <Layer\n id=\"vermont-transformers-circles\"\n type=\"circle\"\n source-layer=\"vermont_transformers-1t5l77\"\n minzoom={transformersMinZoom}\n paint={{\n \"circle-color\": [\n \"case\",\n [\"has\", \"voltage_level\"],\n [\n \"match\",\n [\"get\", \"voltage_level\"],\n \"high\",\n \"#16a34a\", // Green for high voltage transformers\n \"medium\",\n \"#22c55e\", // Lighter green for medium voltage\n \"low\",\n \"#4ade80\", // Light green for low voltage\n \"#16a34a\", // Default green\n ],\n \"#16a34a\", // Default green for transformers\n ],\n \"circle-radius\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n transformersMinZoom,\n 3,\n 14,\n 4,\n 18,\n 5,\n ],\n \"circle-opacity\": 0.8,\n \"circle-stroke-color\": \"#ffffff\",\n \"circle-stroke-width\": 1,\n }}\n layout={{\n visibility: \"visible\",\n }}\n />\n </Source>\n )}\n\n {/* Feeders - Built-in tileset */}\n {feedersVisible && (\n <Source id=\"vermont-feeders\" type=\"vector\" url=\"mapbox://victor-texture.0mmwweva\">\n <Layer\n id=\"vermont-feeders-circles\"\n type=\"circle\"\n source-layer=\"vermont_feeders-cx4fbg\"\n minzoom={feedersMinZoom}\n paint={{\n \"circle-color\": [\n \"case\",\n [\"has\", \"voltage_level\"],\n [\n \"match\",\n [\"get\", \"voltage_level\"],\n \"high\",\n \"#dc2626\", // Red for high voltage feeders\n \"medium\",\n \"#ea580c\", // Orange for medium voltage\n \"low\",\n \"#f97316\", // Light orange for low voltage\n \"#dc2626\", // Default red\n ],\n \"#dc2626\", // Default red for feeders\n ],\n \"circle-radius\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n feedersMinZoom,\n 5,\n 14,\n 6,\n 18,\n 7,\n ],\n \"circle-opacity\": 0.8,\n \"circle-stroke-color\": \"#ffffff\",\n \"circle-stroke-width\": 1,\n }}\n layout={{\n visibility: \"visible\",\n }}\n />\n </Source>\n )}\n\n {/* Spans - Built-in tileset (render before substations so lines appear under points) */}\n {spansVisible && (\n <Source id=\"vermont-spans\" type=\"vector\" url=\"mapbox://victor-texture.8ztoxpib\">\n <Layer\n id=\"vermont-spans-lines\"\n type=\"line\"\n source-layer=\"vermont_spans_lines-c2t1aa\"\n minzoom={spansMinZoom}\n paint={{\n \"line-color\": [\n \"case\",\n [\"has\", \"voltage_level\"],\n [\n \"match\",\n [\"get\", \"voltage_level\"],\n \"high\",\n \"#7c3aed\", // Purple for high voltage spans\n \"medium\",\n \"#a855f7\", // Lighter purple for medium voltage\n \"low\",\n \"#c084fc\", // Light purple for low voltage\n \"#7c3aed\", // Default purple\n ],\n \"#7c3aed\", // Default purple for spans\n ],\n \"line-width\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n spansMinZoom,\n 1,\n 14,\n 2,\n 18,\n 3,\n ],\n \"line-opacity\": 0.8,\n }}\n layout={{\n \"line-join\": \"round\",\n \"line-cap\": \"round\",\n visibility: \"visible\",\n }}\n />\n </Source>\n )}\n\n {/* Vermont Substations - Built-in tileset (render last so they appear on top) */}\n {vermontSubstationsVisible && (\n <Source id=\"vermont-substations\" type=\"vector\" url=\"mapbox://victor-texture.5knxioeq\">\n <Layer\n id=\"vermont-substations-circles\"\n type=\"circle\"\n source-layer=\"vermont_substations-0j4qve\"\n minzoom={substationsMinZoom}\n paint={{\n \"circle-color\": [\n \"case\",\n [\"has\", \"voltage_level\"],\n [\n \"match\",\n [\"get\", \"voltage_level\"],\n \"high\",\n \"#2563eb\", // Blue for high voltage substations\n \"medium\",\n \"#3b82f6\", // Lighter blue for medium voltage\n \"low\",\n \"#60a5fa\", // Light blue for low voltage\n \"#2563eb\", // Default blue\n ],\n \"#2563eb\", // Default blue for substations\n ],\n \"circle-radius\": [\n \"interpolate\",\n [\"linear\"],\n [\"zoom\"],\n substationsMinZoom,\n 8,\n 12,\n 10,\n 16,\n 12,\n ],\n \"circle-opacity\": 0.8,\n \"circle-stroke-color\": \"#ffffff\",\n \"circle-stroke-width\": 1,\n }}\n layout={{\n visibility: \"visible\",\n }}\n />\n </Source>\n )}\n\n {/* Custom tileset rendering */}\n {customTileset && (\n <Source id={customTileset.id} type=\"vector\" url={customTileset.url}>\n {customTileset.layers?.map((layer) => (\n <Layer\n key={layer.id}\n id={layer.id}\n type={layer.type}\n source-layer={customTileset.sourceLayer}\n paint={layer.paint}\n layout={layer.layout}\n />\n ))}\n </Source>\n )}\n\n {selectedPointCoordinates && (\n <Marker latitude={selectedPointCoordinates[1]} longitude={selectedPointCoordinates[0]}>\n <Icon\n name=\"MapPin\"\n className=\"relative bottom-6 left-[5px]\"\n size={SELECTED_POINT_ICON_SIZE}\n color=\"currentColor\"\n weight=\"fill\"\n />\n </Marker>\n )}\n </ReactMapGL>\n {previewMode && previewModeCta && (\n <div className=\"absolute bottom-8 right-8 z-10\">{previewModeCta}</div>\n )}\n </div>\n\n {!previewMode && (\n <MapDrawerContainer isOpen={!!selectedPointId} onClose={onCloseDrawer}>\n {drawerComponent}\n </MapDrawerContainer>\n )}\n </div>\n );\n}\n","\"use client\";\nimport ReactMapGL, { AttributionControl, Marker } from \"react-map-gl\";\nimport \"mapbox-gl/dist/mapbox-gl.css\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n// Map themes\nexport const MAPBOX_THEMES = {\n dark: \"mapbox://styles/mapbox/dark-v11\",\n light: \"mapbox://styles/mapbox/light-v11\",\n streets: \"mapbox://styles/mapbox/streets-v12\",\n satellite: \"mapbox://styles/mapbox/satellite-streets-v12\",\n};\n\nexport interface StaticMapProps {\n /**\n * Map width\n * @default \"100%\"\n */\n width?: number | string;\n /**\n * Map height\n * @default \"100%\"\n */\n height?: number | string;\n /**\n * Initial viewport configuration\n */\n initialViewState?: {\n longitude: number;\n latitude: number;\n zoom: number;\n };\n /**\n * Show loading skeleton\n */\n isLoading?: boolean;\n /**\n * Map theme\n * @default \"streets\"\n */\n theme?: keyof typeof MAPBOX_THEMES;\n /**\n * Mapbox access token\n */\n mapboxAccessToken?: string;\n /**\n * Show marker at center\n * @default true\n */\n showMarker?: boolean;\n /**\n * Additional CSS classes\n */\n className?: string;\n}\n\n/**\n * StaticMap\n *\n * A non-interactive map component for displaying a location.\n * Perfect for showing addresses, store locations, or any single point of interest.\n */\nexport function StaticMap({\n width = \"100%\",\n height = \"100%\",\n initialViewState = {\n longitude: -122.4194,\n latitude: 37.7749,\n zoom: 14,\n },\n isLoading = false,\n theme = \"streets\",\n mapboxAccessToken,\n showMarker = true,\n className,\n}: StaticMapProps) {\n const containerStyle = {\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n };\n\n if (isLoading) {\n return (\n <div style={containerStyle} className={className}>\n <Skeleton width={containerStyle.width} height={containerStyle.height} />\n </div>\n );\n }\n\n if (!mapboxAccessToken) {\n return (\n <div\n style={containerStyle}\n className={`flex items-center justify-center bg-background-muted text-text-muted ${className}`}\n >\n <div className=\"text-center\">\n <Icon name=\"MapPin\" size={48} className=\"mx-auto mb-2 opacity-50\" />\n <p className=\"text-sm\">Map requires Mapbox token</p>\n </div>\n </div>\n );\n }\n\n return (\n <div style={containerStyle} className={className}>\n <ReactMapGL\n mapboxAccessToken={mapboxAccessToken}\n initialViewState={initialViewState}\n style={containerStyle}\n mapStyle={MAPBOX_THEMES[theme]}\n scrollZoom={false}\n dragPan={false}\n dragRotate={false}\n doubleClickZoom={false}\n touchZoomRotate={false}\n attributionControl={false}\n interactive={false}\n >\n {showMarker && (\n <Marker\n longitude={initialViewState.longitude}\n latitude={initialViewState.latitude}\n anchor=\"bottom\"\n >\n <Icon name=\"MapPin\" size={36} className=\"text-action-primary\" weight=\"fill\" />\n </Marker>\n )}\n <AttributionControl compact={true} position=\"bottom-right\" />\n </ReactMapGL>\n </div>\n );\n}\n","\"use client\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Meter as AriaMeter, MeterProps as AriaMeterProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { Label } from \"../Field\";\n\nexport interface MeterProps extends AriaMeterProps {\n /** Label displayed above the meter */\n label?: string;\n /** Size variant of the meter */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Visual variant based on semantic meaning */\n variant?: \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n /** Whether to show warning indicator at high values */\n showWarningIndicator?: boolean;\n /** Threshold percentage for showing warning (default: 80) */\n warningThreshold?: number;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst sizeStyles = {\n sm: {\n bar: \"h-1.5 w-48\",\n text: \"text-xs\",\n icon: \"h-3 w-3\",\n },\n md: {\n bar: \"h-2 w-64\",\n text: \"text-sm\",\n icon: \"h-4 w-4\",\n },\n lg: {\n bar: \"h-3 w-80\",\n text: \"text-base\",\n icon: \"h-5 w-5\",\n },\n};\n\n/**\n * Meter\n *\n * Displays a measurement within a known range, with visual indicators for different value ranges.\n * Perfect for showing capacity, usage levels, scores, or any bounded measurement.\n */\nexport function Meter({\n label,\n size = \"md\",\n variant = \"default\",\n showWarningIndicator = true,\n warningThreshold = 80,\n className,\n ...props\n}: MeterProps) {\n const styles = sizeStyles[size];\n\n return (\n <AriaMeter {...props} className={composeTailwindRenderProps(className, \"flex flex-col gap-1\")}>\n {({ percentage, valueText }) => {\n const isWarning = showWarningIndicator && percentage >= warningThreshold;\n const effectiveVariant = variant === \"default\" ? getAutomaticVariant(percentage) : variant;\n\n return (\n <>\n <div className=\"flex justify-between gap-2\">\n {label && <Label>{label}</Label>}\n <span\n className={twMerge(\n styles.text,\n isWarning ? \"text-feedback-error-text\" : \"text-text-muted\"\n )}\n >\n {isWarning && (\n <AlertTriangle\n aria-label=\"Warning: High value\"\n className={twMerge(\"inline-block align-text-bottom mr-1\", styles.icon)}\n />\n )}\n {valueText}\n </span>\n </div>\n <div\n className={twMerge(\n \"relative rounded-full bg-background-muted\",\n \"ring-1 ring-inset ring-border-muted\",\n styles.bar\n )}\n >\n <div\n className={twMerge(\n \"absolute left-0 top-0 h-full rounded-full transition-all duration-300\",\n \"forced-colors:bg-[Highlight]\",\n getMeterColor(effectiveVariant)\n )}\n style={{ width: `${Math.min(100, Math.max(0, percentage))}%` }}\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n </div>\n </>\n );\n }}\n </AriaMeter>\n );\n}\n\n/**\n * Automatically determine variant based on percentage\n */\nfunction getAutomaticVariant(percentage: number): MeterProps[\"variant\"] {\n if (percentage < 50) return \"success\";\n if (percentage < 70) return \"info\";\n if (percentage < 90) return \"warning\";\n return \"error\";\n}\n\n/**\n * Get the appropriate color class based on variant\n */\nfunction getMeterColor(variant: MeterProps[\"variant\"]) {\n switch (variant) {\n case \"success\":\n return \"bg-feedback-success-text\";\n case \"warning\":\n return \"bg-feedback-warning-text\";\n case \"error\":\n return \"bg-feedback-error-text\";\n case \"info\":\n return \"bg-feedback-info-text\";\n default:\n return \"bg-action-primary-background\";\n }\n}\n","\"use client\";\nimport { motion } from \"framer-motion\";\nimport { AlertCircle, CheckCircle, Info, X, XCircle } from \"lucide-react\";\nimport { useEffect } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport type NoticeVariant = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface NoticeProps {\n /** Unique identifier for the notice */\n id: string;\n /** The message to display */\n message: string;\n /** Visual variant of the notice */\n variant?: NoticeVariant;\n /** Duration in milliseconds before auto-dismissal (0 = no auto-dismiss) */\n duration?: number;\n /** Whether the notice can be dismissed */\n dismissible?: boolean;\n /** Callback when the notice is dismissed */\n onDismiss?: () => void;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst variantStyles = {\n success: {\n container:\n \"bg-feedback-success-background border-feedback-success-border text-feedback-success-text\",\n icon: CheckCircle,\n },\n error: {\n container: \"bg-feedback-error-background border-feedback-error-border text-feedback-error-text\",\n icon: XCircle,\n },\n warning: {\n container:\n \"bg-feedback-warning-background border-feedback-warning-border text-feedback-warning-text\",\n icon: AlertCircle,\n },\n info: {\n container: \"bg-feedback-info-background border-feedback-info-border text-feedback-info-text\",\n icon: Info,\n },\n};\n\n/**\n * Notice\n *\n * Individual notification component that displays a message with an icon.\n * Typically used within a NoticeProvider for managing multiple notifications.\n */\nexport function Notice({\n id: _id,\n message,\n variant = \"info\",\n duration = 5000,\n dismissible = true,\n onDismiss,\n className,\n}: NoticeProps) {\n const { container, icon: Icon } = variantStyles[variant];\n\n useEffect(() => {\n if (duration > 0) {\n const timer = setTimeout(() => {\n onDismiss?.();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, onDismiss]);\n\n return (\n <motion.div\n layout\n initial={{ opacity: 0, y: -20, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95, transition: { duration: 0.2 } }}\n className={twMerge(\n \"pointer-events-auto flex items-start gap-3 rounded-lg border p-4 shadow-lg\",\n container,\n className\n )}\n >\n <Icon className=\"h-5 w-5 flex-shrink-0\" />\n <p className=\"flex-1 text-sm font-medium\">{message}</p>\n {dismissible && (\n <button\n onClick={onDismiss}\n className=\"flex-shrink-0 rounded-md p-1 transition-colors hover:bg-black/10\"\n aria-label=\"Dismiss notification\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </motion.div>\n );\n}\n","\"use client\";\nimport { AnimatePresence } from \"framer-motion\";\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Notice } from \"./Notice\";\n\ninterface NoticeData {\n id: string;\n message: string;\n variant: \"success\" | \"error\" | \"warning\" | \"info\";\n duration: number;\n dismissible: boolean;\n}\n\nexport interface NoticeContainerProps {\n /** Array of notices to display */\n notices: NoticeData[];\n /** Callback when a notice is dismissed */\n onDismiss: (id: string) => void;\n /** Position of the container on the screen */\n position?:\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n /** Additional CSS classes */\n className?: string;\n}\n\nconst positionStyles = {\n \"top-left\": \"top-4 left-4 items-start\",\n \"top-center\": \"top-4 left-1/2 -translate-x-1/2 items-center\",\n \"top-right\": \"top-4 right-4 items-end\",\n \"bottom-left\": \"bottom-4 left-4 items-start\",\n \"bottom-center\": \"bottom-4 left-1/2 -translate-x-1/2 items-center\",\n \"bottom-right\": \"bottom-4 right-4 items-end\",\n};\n\n/**\n * NoticeContainer\n *\n * Container component that positions and animates notices.\n * Renders notices in a portal to ensure they appear above other content.\n */\nexport function NoticeContainer({\n notices,\n onDismiss,\n position = \"top-right\",\n className,\n}: NoticeContainerProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return null;\n }\n\n const container = (\n <div\n className={twMerge(\n \"pointer-events-none fixed z-50 flex flex-col gap-2\",\n positionStyles[position],\n className\n )}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <AnimatePresence mode=\"sync\">\n {notices.map((notice) => (\n <Notice\n key={notice.id}\n id={notice.id}\n message={notice.message}\n variant={notice.variant}\n duration={notice.duration}\n dismissible={notice.dismissible}\n onDismiss={() => onDismiss(notice.id)}\n />\n ))}\n </AnimatePresence>\n </div>\n );\n\n // Portal to body to ensure notices appear above everything\n return createPortal(container, document.body);\n}\n","\"use client\";\nimport { createContext, ReactNode, useCallback, useContext, useState } from \"react\";\nimport type { NoticeVariant } from \"./Notice\";\nimport { NoticeContainer } from \"./NoticeContainer\";\n\ninterface NoticeData {\n id: string;\n message: string;\n variant: NoticeVariant;\n duration: number;\n dismissible: boolean;\n}\n\ninterface NoticeContextValue {\n notices: NoticeData[];\n addNotice: (message: string, options?: Partial<Omit<NoticeData, \"id\" | \"message\">>) => string;\n removeNotice: (id: string) => void;\n clearNotices: () => void;\n}\n\nconst NoticeContext = createContext<NoticeContextValue | undefined>(undefined);\n\nexport interface NoticeProviderProps {\n /** Child components */\n children: ReactNode;\n /** Position of the notice container */\n position?:\n | \"top-left\"\n | \"top-center\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-center\"\n | \"bottom-right\";\n /** Maximum number of notices to display at once */\n maxNotices?: number;\n /** Default duration for notices in milliseconds */\n defaultDuration?: number;\n /** Whether notices are dismissible by default */\n defaultDismissible?: boolean;\n}\n\n/**\n * NoticeProvider\n *\n * Provides notice functionality to child components.\n * Manages the state of all active notices and renders them in a container.\n */\nexport function NoticeProvider({\n children,\n position = \"top-right\",\n maxNotices = 5,\n defaultDuration = 5000,\n defaultDismissible = true,\n}: NoticeProviderProps) {\n const [notices, setNotices] = useState<NoticeData[]>([]);\n\n const addNotice = useCallback(\n (message: string, options?: Partial<Omit<NoticeData, \"id\" | \"message\">>) => {\n const id = `notice-${Date.now()}-${Math.random()}`;\n const newNotice: NoticeData = {\n id,\n message,\n variant: options?.variant || \"info\",\n duration: options?.duration ?? defaultDuration,\n dismissible: options?.dismissible ?? defaultDismissible,\n };\n\n setNotices((prev) => {\n const updated = [...prev, newNotice];\n // Keep only the most recent notices if we exceed maxNotices\n if (updated.length > maxNotices) {\n return updated.slice(-maxNotices);\n }\n return updated;\n });\n\n return id;\n },\n [maxNotices, defaultDuration, defaultDismissible]\n );\n\n const removeNotice = useCallback((id: string) => {\n setNotices((prev) => prev.filter((notice) => notice.id !== id));\n }, []);\n\n const clearNotices = useCallback(() => {\n setNotices([]);\n }, []);\n\n const value: NoticeContextValue = {\n notices,\n addNotice,\n removeNotice,\n clearNotices,\n };\n\n return (\n <NoticeContext.Provider value={value}>\n {children}\n <NoticeContainer notices={notices} onDismiss={removeNotice} position={position} />\n </NoticeContext.Provider>\n );\n}\n\n/**\n * useNoticeContext\n *\n * Internal hook to access the NoticeContext.\n * Throws an error if used outside of a NoticeProvider.\n */\nexport function useNoticeContext() {\n const context = useContext(NoticeContext);\n if (!context) {\n throw new Error(\"useNoticeContext must be used within a NoticeProvider\");\n }\n return context;\n}\n","import { useCallback } from \"react\";\nimport type { NoticeVariant } from \"./Notice\";\nimport { useNoticeContext } from \"./NoticeProvider\";\n\nexport interface NoticeOptions {\n variant?: NoticeVariant;\n duration?: number;\n dismissible?: boolean;\n}\n\n/**\n * useNotice\n *\n * Hook to display notices from anywhere in the component tree.\n * Must be used within a NoticeProvider.\n *\n * @example\n * ```tsx\n * const notice = useNotice();\n *\n * // Show different types of notices\n * notice.success(\"Settings saved!\");\n * notice.error(\"Failed to save settings\");\n * notice.warning(\"Your session will expire soon\");\n * notice.info(\"New features are available\");\n *\n * // With custom options\n * notice.show(\"Custom notice\", {\n * variant: \"success\",\n * duration: 10000,\n * dismissible: false\n * });\n *\n * // Clear all notices\n * notice.clear();\n * ```\n */\nexport function useNotice() {\n const { addNotice, removeNotice, clearNotices } = useNoticeContext();\n\n const show = useCallback(\n (message: string, options?: NoticeOptions) => {\n return addNotice(message, options);\n },\n [addNotice]\n );\n\n const success = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"success\" });\n },\n [addNotice]\n );\n\n const error = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"error\" });\n },\n [addNotice]\n );\n\n const warning = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"warning\" });\n },\n [addNotice]\n );\n\n const info = useCallback(\n (message: string, options?: Omit<NoticeOptions, \"variant\">) => {\n return addNotice(message, { ...options, variant: \"info\" });\n },\n [addNotice]\n );\n\n return {\n show,\n success,\n error,\n warning,\n info,\n dismiss: removeNotice,\n clear: clearNotices,\n };\n}\n","import { useId } from \"react\";\nimport {\n Button as AriaButton,\n Input as AriaInput,\n NumberField as AriaNumberField,\n NumberFieldProps as AriaNumberFieldProps,\n Group,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { BaseInputProps, Description, FieldError, getInputStateStyles, Label } from \"../Field\";\nimport { Icon } from \"../Icon\";\n\nconst getNumberFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n return twMerge(\n getInputStateStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n }),\n props.transparent ? \"bg-transparent\" : \"bg-background-input\",\n \"pr-9\", // Space for stepper buttons\n \"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none\", // Hide native spinners\n props.className\n );\n};\n\n/**\n * NumberField\n *\n * Numeric input with stepper controls and validation.\n */\nexport interface NumberFieldProps\n extends Omit<AriaNumberFieldProps, \"size\" | \"className\">,\n BaseInputProps {\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n formatOptions?: Intl.NumberFormatOptions;\n id?: string;\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\nexport function NumberField({\n label,\n description,\n errorMessage,\n size,\n tooltip,\n isRequired,\n transparent,\n validationResult,\n ...props\n}: NumberFieldProps) {\n const id = useId();\n\n return (\n <AriaNumberField\n {...props}\n id={id}\n isRequired={isRequired}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-1\")}\n step={props.step ?? 1}\n onChange={(value) => {\n if (typeof value === \"number\") {\n if (props.maxValue != null && value > props.maxValue) {\n props.onChange?.(props.maxValue);\n } else if (props.minValue != null && value < props.minValue) {\n props.onChange?.(props.minValue);\n } else {\n props.onChange?.(value);\n }\n }\n }}\n isInvalid={\n !!errorMessage ||\n (typeof props.value === \"number\" &&\n ((props.maxValue != null && props.value > props.maxValue) ||\n (props.minValue != null && props.value < props.minValue)))\n }\n >\n {({ isDisabled, isInvalid }) => {\n const isValueInvalid = isInvalid || !!errorMessage;\n return (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired} htmlFor={id}>\n {label}\n </Label>\n )}\n <div className=\"relative\">\n <Group className=\"relative\">\n <AriaInput\n className={getNumberFieldStyles({\n isInvalid: isValueInvalid,\n isDisabled,\n transparent,\n size,\n className: typeof props.className === \"string\" ? props.className : undefined,\n })}\n />\n <div className=\"absolute inset-y-[1px] right-[1px] flex flex-col divide-y border-l overflow-hidden rounded-r-[calc(var(--control-border-radius)-1px)]\">\n <AriaButton\n slot=\"increment\"\n isDisabled={isDisabled}\n className=\"flex h-1/2 w-7 items-center justify-center bg-background-input hover:bg-background-input-hover active:bg-background-input-active disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Icon name=\"CaretUp\" size={14} />\n </AriaButton>\n <AriaButton\n slot=\"decrement\"\n isDisabled={isDisabled}\n className=\"flex h-1/2 w-7 items-center justify-center bg-background-input hover:bg-background-input-hover active:bg-background-input-active disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Icon name=\"CaretDown\" size={14} />\n </AriaButton>\n </div>\n </Group>\n </div>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {errorMessage && (\n <FieldError size={size} className=\"mt-3\">\n {typeof errorMessage === \"function\"\n ? errorMessage(validationResult!)\n : errorMessage}\n </FieldError>\n )}\n </div>\n );\n }}\n </AriaNumberField>\n );\n}\n","import * as React from \"react\";\nimport {\n composeRenderProps,\n Key,\n Tab as RACTab,\n TabList as RACTabList,\n TabListProps as RACTabListProps,\n TabPanel as RACTabPanel,\n TabProps as RACTabProps,\n Tabs as RACTabs,\n TabsProps as RACTabsProps,\n TabPanelProps,\n} from \"react-aria-components\";\nimport { focusRing } from \"../../utils\";\n\nexport type { Key };\n\nexport type TabVariant = \"default\" | \"accent\";\n\n// Create a context to pass the variant down to child components\nconst TabsContext = React.createContext<{ variant: TabVariant }>({ variant: \"default\" });\n\ntype TabProps = RACTabProps & {\n isSelected?: boolean;\n id?: string;\n};\n\nexport type TabsProps = RACTabsProps & {\n variant?: TabVariant;\n};\n\nexport type TabListProps<T extends object> = RACTabListProps<T> & {\n variant?: TabVariant;\n};\n\nfunction getTabsStyles({\n orientation,\n className = \"\",\n}: {\n orientation: \"horizontal\" | \"vertical\";\n className?: string;\n}) {\n const baseStyles = \"flex flex-col w-full\";\n const orientationStyles = {\n horizontal: \"\",\n vertical: \"flex-row\",\n };\n\n return `${baseStyles} ${orientationStyles[orientation] || \"\"} ${className}`.trim();\n}\n\n/**\n * Tabs\n *\n * Tabbed interface with styled tabs and panels.\n * @param variant - \"default\" for gray styling, \"accent\" for brand color styling\n */\nexport function Tabs({ variant = \"default\", ...props }: TabsProps) {\n return (\n <TabsContext.Provider value={{ variant }}>\n <div className=\"w-full\">\n <RACTabs\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabsStyles({ ...renderProps, className })\n )}\n />\n </div>\n </TabsContext.Provider>\n );\n}\n\nfunction getTabListStyles({\n orientation,\n className = \"\",\n}: {\n orientation: \"horizontal\" | \"vertical\";\n className?: string;\n}) {\n const baseStyles =\n \"flex gap-10 relative after:absolute after:bottom-0 after:left-0 after:right-0 after:h-[2px] after:bg-border-muted\";\n const orientationStyles = {\n horizontal: \"flex-row w-full\",\n vertical: \"flex-col items-start\",\n };\n\n return `${baseStyles} ${orientationStyles[orientation] || \"\"} ${className}`.trim();\n}\n\n/**\n * TabList container.\n */\nexport function TabList<T extends object>({ variant, ...props }: TabListProps<T>) {\n // If variant is passed directly to TabList, use it; otherwise inherit from context\n const context = React.useContext(TabsContext);\n const effectiveVariant = variant ?? context.variant;\n\n return (\n <TabsContext.Provider value={{ variant: effectiveVariant }}>\n <RACTabList\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabListStyles({\n ...renderProps,\n className: className || \"\",\n })\n )}\n />\n </TabsContext.Provider>\n );\n}\n\nfunction getTabStyles({\n isSelected,\n isDisabled,\n variant,\n className = \"\",\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n variant: TabVariant;\n className?: string;\n}) {\n const baseStyles =\n \"flex items-center cursor-default px-1 py-2 font-medium transition-all hover:cursor-pointer relative\";\n const focusRingStyles = focusRing();\n\n let stateStyles = \"\";\n if (isDisabled) {\n stateStyles = \"text-text-disabled forced-colors:text-[GrayText] cursor-not-allowed\";\n } else if (isSelected) {\n if (variant === \"accent\") {\n stateStyles =\n \"text-action-primary border-b-2 border-action-primary z-10 forced-colors:bg-[Highlight]\";\n } else {\n // Default gray variant - similar to Radix UI\n stateStyles =\n \"text-text-heading border-b-2 border-text-heading z-10 forced-colors:bg-[Highlight]\";\n }\n } else {\n // Inactive tabs - more muted like Radix UI\n stateStyles = \"text-text-placeholder hover:text-text-muted\";\n }\n\n return `${baseStyles} ${focusRingStyles} ${stateStyles} ${className}`.trim();\n}\n\n/**\n * Tab trigger element.\n */\nexport function Tab(props: TabProps) {\n const { variant } = React.useContext(TabsContext);\n\n return (\n <RACTab\n {...props}\n data-testid={props.id ? `tab-${props.id}` : undefined}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabStyles({\n ...renderProps,\n className,\n isSelected: renderProps.isSelected,\n variant,\n })\n )}\n />\n );\n}\n\nfunction getTabPanelStyles({ className = \"\" }: { className?: string }) {\n const baseStyles = \"block w-full mt-4 text-text-body\";\n const focusRingStyles = focusRing();\n\n return `${baseStyles} ${focusRingStyles} ${className}`.trim();\n}\n\n/**\n * TabPanel content area.\n */\nexport function TabPanel(props: TabPanelProps) {\n return (\n <RACTabPanel\n {...props}\n className={composeRenderProps(props.className, (className, renderProps) =>\n getTabPanelStyles({\n ...renderProps,\n className: className || \"\",\n })\n )}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Breadcrumb, Breadcrumbs } from \"../Breadcrumbs\";\nimport { Heading } from \"../Heading\";\nimport { Tabs as RACTabs, Tab, TabList } from \"../Tabs\";\n\n/**\n * PageLayout — opinionated, SSR-friendly page scaffold for dashboards.\n *\n * Structure:\n * <PageLayout>\n * <PageLayout.Header title=\"...\" subtitle=\"...\" breadcrumbs={[...]} />\n * <PageLayout.Actions primary={<Button/>} secondary={<Button/>} />\n * <PageLayout.Filters>...chips/search/time...</PageLayout.Filters>\n * <PageLayout.Tabs tabs={[...]} value=... onChange=... />\n * <PageLayout.Content>\n * <Grid cols={{ base: 1, lg: 4 }} gap=\"lg\">\n * ...cards/tables/content...\n * </Grid>\n * </PageLayout.Content>\n * <PageLayout.Aside>...sticky insights/help...</PageLayout.Aside>\n * </PageLayout>\n *\n * Notes:\n * - Router-agnostic: Breadcrumbs accept either structured items with a Link component, or a custom ReactNode.\n * - Accessible: Header uses h1; Tabs are roving-`tablist`; Filters region has landmark role.\n * - Composable: Use with Grid component for layouts, Card for content containers.\n * - Styling: token-oriented utility classes (match to your Tailwind preset/tokens).\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type BreadcrumbItem = { label: string; href?: string };\n\nexport type PageLayoutProps = {\n children: React.ReactNode;\n /** Constrain width and apply default page rhythm */\n maxWidth?: number; // px\n paddingXClass?: string; // e.g., \"px-4 md:px-6\"\n paddingYClass?: string; // e.g., \"py-4 md:py-6\"\n className?: string;\n};\n\nexport function PageLayout({\n children,\n maxWidth = 1400,\n paddingXClass = \"px-4 md:px-6\",\n paddingYClass = \"py-4 md:py-6\",\n className,\n}: PageLayoutProps) {\n return (\n <div\n className={twMerge(`w-full ${paddingXClass} ${paddingYClass}`, className)}\n style={{ marginInline: \"auto\", maxWidth }}\n >\n {children}\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Header\n// ——————————————————————————————————————————\n\nexport type PageHeaderProps = {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n breadcrumbs?: BreadcrumbItem[];\n /** Custom breadcrumbs node if you don't want the built-in renderer */\n breadcrumbsNode?: React.ReactNode;\n /** Optional right-aligned meta area (badges, status, small stats) */\n meta?: React.ReactNode;\n /** Optional slot to replace the default heading element */\n headingAs?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n className?: string;\n};\n\nexport function Header({\n title,\n subtitle,\n breadcrumbs,\n breadcrumbsNode,\n meta,\n headingAs,\n className,\n}: PageHeaderProps) {\n return (\n <header className={twMerge(\"mb-4 md:mb-6\", className)} aria-labelledby=\"page-title\">\n {/* Breadcrumbs */}\n {breadcrumbsNode ? (\n <div className=\"mb-2\">{breadcrumbsNode}</div>\n ) : breadcrumbs?.length ? (\n <div className=\"mb-2\">\n <Breadcrumbs>\n {breadcrumbs.map((bc, i) => (\n <Breadcrumb key={`${bc.label}-${i}`} {...(bc.href ? { href: bc.href } : {})}>\n {bc.label}\n </Breadcrumb>\n ))}\n </Breadcrumbs>\n </div>\n ) : null}\n\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div id=\"page-title\">\n <Heading tag={headingAs || \"h1\"} size=\"xl\">\n {title}\n </Heading>\n </div>\n {subtitle ? <p className=\"mt-1 text-text-muted\">{subtitle}</p> : null}\n </div>\n {meta ? <div className=\"shrink-0\">{meta}</div> : null}\n </div>\n </header>\n );\n}\n\n// ——————————————————————————————————————————\n// Actions\n// ——————————————————————————————————————————\n\nexport type PageActionsProps = {\n primary?: React.ReactNode; // main CTA button\n secondary?: React.ReactNode; // secondary button(s)\n children?: React.ReactNode; // freeform (e.g., segmented control)\n align?: \"start\" | \"end\";\n className?: string;\n};\n\nexport function Actions({\n primary,\n secondary,\n children,\n align = \"end\",\n className,\n}: PageActionsProps) {\n return (\n <div\n className={twMerge(\n `mb-3 md:mb-4 flex items-center gap-2 ${align === \"end\" ? \"justify-end\" : \"justify-start\"}`,\n className\n )}\n >\n {children}\n <div className=\"ml-auto flex items-center gap-2\">\n {secondary}\n {primary}\n </div>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Filters (landmark region)\n// ——————————————————————————————————————————\n\nexport type PageFiltersProps = {\n children: React.ReactNode;\n className?: string;\n ariaLabel?: string;\n};\n\nexport function Filters({ children, className, ariaLabel = \"Filters\" }: PageFiltersProps) {\n return (\n <section\n aria-label={ariaLabel}\n className={twMerge(\"mb-4 md:mb-6 flex flex-wrap items-center gap-2\", className)}\n >\n {children}\n </section>\n );\n}\n\n// ——————————————————————————————————————————\n// Tabs (wrapper around React Aria Tabs)\n// ——————————————————————————————————————————\n\nexport type PageLayoutTab = { id: string; label: React.ReactNode; disabled?: boolean };\nexport type TabsProps = {\n tabs: PageLayoutTab[];\n value?: string; // controlled\n defaultValue?: string; // uncontrolled\n onChange?: (id: string) => void;\n className?: string;\n children?: React.ReactNode; // Optional: for rendering TabPanels\n};\n\nexport function Tabs({ tabs, value, defaultValue, onChange, className, children }: TabsProps) {\n // Convert onChange to handle Key type from React Aria\n const handleSelectionChange = (key: React.Key) => {\n onChange?.(key as string);\n };\n\n return (\n <div className={twMerge(\"mb-3 md:mb-4\", className)}>\n <RACTabs\n selectedKey={value}\n defaultSelectedKey={defaultValue || tabs[0]?.id}\n onSelectionChange={handleSelectionChange}\n >\n <TabList>\n {tabs.map((t) => (\n <Tab key={t.id} id={t.id} isDisabled={t.disabled}>\n {t.label}\n </Tab>\n ))}\n </TabList>\n {children}\n </RACTabs>\n </div>\n );\n}\n\n// ——————————————————————————————————————————\n// Content & Aside\n// ——————————————————————————————————————————\n\nexport type PageContentProps = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport function Content({ children, className }: PageContentProps) {\n return <div className={twMerge(\"w-full\", className)}>{children}</div>;\n}\n\nexport type PageAsideProps = {\n children: React.ReactNode;\n /** Sticky aside on wide screens */\n sticky?: boolean;\n className?: string;\n};\n\nexport function Aside({ children, sticky = true, className }: PageAsideProps) {\n return (\n <aside className={twMerge(sticky ? \"lg:sticky lg:top-20\" : \"\", className)}>{children}</aside>\n );\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nPageLayout.Header = Header;\nPageLayout.Actions = Actions;\nPageLayout.Filters = Filters;\nPageLayout.Tabs = Tabs;\nPageLayout.Content = Content;\nPageLayout.Aside = Aside;\n\n// ——————————————————————————————————————————\n// Example usage (Storybook-ready snippet)\n// ——————————————————————————————————————————\n\nexport function ExamplePage() {\n return (\n <PageLayout>\n <PageLayout.Header\n title=\"Devices\"\n subtitle=\"Monitor and manage DERs\"\n breadcrumbs={[{ label: \"Home\", href: \"/\" }, { label: \"Devices\" }]}\n meta={<span className=\"text-sm text-text-muted\">2,481 online</span>}\n />\n\n <PageLayout.Actions\n secondary={\n <button\n type=\"button\"\n className=\"rounded-md border border-border-default px-3 py-1.5 text-sm hover:bg-background-muted transition-colors\"\n >\n Export\n </button>\n }\n primary={\n <button\n type=\"button\"\n className=\"rounded-md bg-action-primary px-3 py-1.5 text-sm text-text-on-primary hover:bg-action-primary-hover transition-colors\"\n >\n Add device\n </button>\n }\n />\n\n <PageLayout.Filters>\n <input\n className=\"rounded-md border border-border-default px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-action-primary focus:border-transparent\"\n placeholder=\"Search devices\"\n />\n <select className=\"rounded-md border border-border-default px-2 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-action-primary focus:border-transparent\">\n <option>Status: all</option>\n <option>Online</option>\n <option>Offline</option>\n </select>\n </PageLayout.Filters>\n\n <PageLayout.Tabs\n tabs={[\n { id: \"overview\", label: \"Overview\" },\n { id: \"activity\", label: \"Activity\" },\n { id: \"settings\", label: \"Settings\" },\n ]}\n />\n\n <PageLayout.Content>\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-4 md:gap-6\">\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-4\">\n <h3 className=\"text-lg font-semibold mb-2\">KPI Group</h3>\n <p className=\"text-text-muted\">Key performance indicators</p>\n </div>\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-8\">\n <h3 className=\"text-lg font-semibold mb-2\">Timeseries Chart</h3>\n <p className=\"text-text-muted\">Device performance over time</p>\n </div>\n <div className=\"rounded-lg bg-background-surface p-4 shadow-md border border-border-default lg:col-span-12\">\n <h3 className=\"text-lg font-semibold mb-2\">Devices Table</h3>\n <p className=\"text-text-muted\">Complete list of all devices</p>\n </div>\n </div>\n </PageLayout.Content>\n </PageLayout>\n );\n}\n","import { useRef } from \"react\";\nimport { type Key, type ValidationResult } from \"react-aria-components\";\n\nimport { Autocomplete } from \"../Autocomplete/Autocomplete\";\nimport { Icon } from \"../Icon/Icon\";\n\nexport interface Place {\n id: string;\n place_name: string;\n place_type: string[];\n center: [number, number];\n}\n\ninterface MapboxResponse {\n features: Place[];\n type: string;\n}\n\n// Type guard to validate MapboxResponse shape\nfunction isMapboxResponse(data: unknown): data is MapboxResponse {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"features\" in data &&\n Array.isArray(data.features) &&\n \"type\" in data &&\n typeof data.type === \"string\"\n );\n}\n\ntype SearchType =\n | \"country\"\n | \"region\"\n | \"district\"\n | \"place\"\n | \"locality\"\n | \"neighborhood\"\n | \"address\"\n | \"street\";\n\n/**\n * PlaceSearch\n *\n * Location search component with autocomplete; emits a `Place` value on\n * selection.\n */\nexport interface PlaceSearchProps {\n label?: string;\n selectedKey?: Key | null;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n placeholder?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n description?: string;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n tooltip?: string;\n isRequired?: boolean;\n isDisabled?: boolean;\n showErrors?: boolean;\n autoFocus?: boolean;\n onSelect: (place: Place) => void;\n searchTypes?: SearchType[];\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n validationResult?: ValidationResult;\n countryRestrictions?: string[]; // Array of ISO 3166-1 alpha-2 country codes\n proximity?: \"ip\" | [number, number]; // Either \"ip\" for IP-based location or [longitude, latitude] coordinates\n}\n\nconst MAPBOX_TOKEN = process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN || \"\";\n\nexport function PlaceSearch({\n label = \"Search for a place\",\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n placeholder = \"Enter a location...\",\n errorMessage,\n description,\n size = \"md\",\n tooltip,\n isRequired,\n isDisabled,\n showErrors = true,\n autoFocus = false,\n onSelect,\n searchTypes = [\"place\", \"address\"],\n defaultFilter,\n validationResult,\n countryRestrictions,\n proximity = \"ip\", // Set IP-based location as default\n}: PlaceSearchProps) {\n // Use a WeakMap to store additional data for each item\n const itemDataRef = useRef(\n new WeakMap<{ id: string; name: string }, { type: string; center: [number, number] }>()\n );\n\n // Store the last loaded items for use in selection\n const loadedItemsRef = useRef<{ id: string; name: string }[]>([]);\n\n const requestConfig = {\n requestType: \"REST\" as const,\n method: \"GET\" as const,\n url: \"https://api.mapbox.com/geocoding/v5/mapbox.places/{q}.json\",\n extraParams: {\n access_token: MAPBOX_TOKEN,\n types: searchTypes.join(\",\"),\n limit: \"5\",\n ...(countryRestrictions?.length\n ? { country: countryRestrictions.join(\",\").toLowerCase() }\n : {}),\n ...(proximity\n ? {\n proximity: proximity === \"ip\" ? \"ip\" : proximity.join(\",\"),\n }\n : {}),\n },\n shouldLoad: (filterText: string) => {\n return filterText.length > 0;\n },\n transformResponse: (data: unknown) => {\n if (!isMapboxResponse(data)) return [];\n\n const items = data.features.map((feature) => {\n const item = {\n id: feature.id,\n name: feature.place_name,\n };\n // Store additional data in the WeakMap\n itemDataRef.current.set(item, {\n type: feature.place_type[0],\n center: feature.center,\n });\n return item;\n });\n\n // Store the items for later use\n if (items.length > 0) {\n loadedItemsRef.current = items;\n }\n\n return items;\n },\n };\n\n const renderItem = (item: { id: string; name: string }) => {\n const itemData = itemDataRef.current.get(item);\n\n // Split the place name into parts by commas for better formatting\n const nameParts = item.name.split(\", \");\n const primaryText = nameParts[0];\n const secondaryText = nameParts.slice(1).join(\", \");\n\n return (\n <div className=\"flex items-center gap-3 py-0.5\">\n <Icon\n name={\n itemData?.type === \"address\"\n ? \"MapPin\"\n : itemData?.type === \"place\"\n ? \"Buildings\"\n : itemData?.type === \"region\"\n ? \"MapPinArea\"\n : itemData?.type === \"country\"\n ? \"Flag\"\n : \"Circle\"\n }\n className=\"h-5 w-5 flex-shrink-0 text-text-muted\"\n />\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium text-text-body\">{primaryText}</span>\n {secondaryText && (\n <span className=\"truncate text-sm text-text-muted\">{secondaryText}</span>\n )}\n </div>\n </div>\n );\n };\n\n const renderLeftIcon = (isLoading: boolean) => {\n if (isLoading) {\n return <Icon name=\"CircleNotch\" className=\"h-4 w-4 animate-spin text-text-muted\" />;\n }\n return <Icon name=\"MagnifyingGlass\" className=\"h-4 w-4 text-text-muted\" />;\n };\n\n return (\n <Autocomplete\n data-testid=\"autocomplete\"\n data-config={JSON.stringify({\n types: searchTypes.join(\",\"),\n country: countryRestrictions?.join(\",\").toLowerCase(),\n proximity: proximity === \"ip\" ? \"ip\" : proximity?.join(\",\"),\n })}\n label={label}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(key) => {\n onSelectionChange?.(key);\n if (key) {\n // Use the stored items instead of creating an empty array\n const items = loadedItemsRef.current;\n const selected = items.find((item) => item.id === key);\n\n if (selected) {\n const itemData = itemDataRef.current.get(selected);\n\n if (itemData) {\n onSelect({\n id: selected.id,\n place_name: selected.name,\n place_type: [itemData.type],\n center: itemData.center,\n });\n }\n }\n }\n }}\n requestConfig={requestConfig}\n placeholder={placeholder}\n errorMessage={errorMessage}\n description={description}\n size={size}\n tooltip={tooltip}\n isRequired={isRequired}\n isDisabled={isDisabled}\n showErrors={showErrors}\n autoFocus={autoFocus}\n renderItem={renderItem}\n renderLeftIcon={renderLeftIcon}\n defaultFilter={defaultFilter}\n validationResult={validationResult}\n />\n );\n}\n","import {\n ProgressBar as AriaProgressBar,\n ProgressBarProps as AriaProgressBarProps,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps } from \"../../utils\";\n\n/**\n * ProgressBar\n *\n * Linear progress indicator with optional labels.\n */\nexport interface ProgressBarProps extends AriaProgressBarProps {\n label?: string;\n rightLabel?: string;\n progressWidth?: number;\n hideLabels?: boolean;\n}\n\nexport function ProgressBar({\n label,\n rightLabel,\n progressWidth = 64,\n hideLabels = false,\n ...props\n}: ProgressBarProps) {\n return (\n <AriaProgressBar\n {...props}\n className={composeTailwindRenderProps(props.className, \"flex flex-col gap-1\")}\n >\n {({ percentage, valueText, isIndeterminate }) => (\n <>\n {!hideLabels && (\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm text-text-heading\">{label}</span>\n <span className=\"text-sm text-text-heading\">{rightLabel || valueText}</span>\n </div>\n )}\n <div\n className={`relative h-2 w-${progressWidth} overflow-hidden rounded-full bg-background-muted outline-none`}\n >\n <div\n className={`absolute top-0 h-full rounded-full bg-blue-600 dark:bg-blue-500 forced-colors:bg-[Highlight] ${isIndeterminate ? \"left-full duration-1000 ease-out animate-in slide-out-to-right-full repeat-infinite [--tw-enter-translate-x:calc(-16rem-100%)]\" : \"left-0\"}`}\n style={{ width: (isIndeterminate ? 40 : percentage) + \"%\" }}\n />\n </div>\n </>\n )}\n </AriaProgressBar>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n Radio as RACRadio,\n RadioGroup as RACRadioGroup,\n RadioGroupProps as RACRadioGroupProps,\n RadioProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\nimport { Description, FieldError, Label } from \"../Field\";\n\nexport interface RadioGroupProps extends Omit<RACRadioGroupProps, \"children\"> {\n /** Label for the radio group */\n label?: string;\n /** Children elements */\n children?: ReactNode;\n /** Optional description for the radio group */\n description?: string;\n /** Error message to display when validation fails */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /** Validation result object for functional errorMessage */\n validationResult?: ValidationResult;\n}\n\nexport function RadioGroup(props: RadioGroupProps) {\n return (\n <RACRadioGroup\n {...props}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col gap-2\")}\n >\n <Label>{props.label}</Label>\n <div className=\"flex gap-2 group-orientation-horizontal:gap-4 group-orientation-vertical:flex-col\">\n {props.children}\n </div>\n {props.description && <Description>{props.description}</Description>}\n <FieldError>\n {typeof props.errorMessage === \"function\" && props.validationResult\n ? props.errorMessage(props.validationResult)\n : typeof props.errorMessage === \"string\"\n ? props.errorMessage\n : null}\n </FieldError>\n </RACRadioGroup>\n );\n}\n\nfunction getRadioStyles({\n isSelected,\n isInvalid,\n isDisabled,\n}: {\n isSelected?: boolean;\n isInvalid?: boolean;\n isDisabled?: boolean;\n}) {\n const baseClasses = [\n focusRing(),\n \"w-5 h-5 rounded-full border-2 bg-background-surface transition-all\",\n ];\n\n if (isDisabled) {\n baseClasses.push(\"border-border-muted forced-colors:!border-[GrayText]\");\n } else if (isInvalid) {\n baseClasses.push(\n \"border-feedback-error-border group-pressed:border-feedback-error-border dark:group-pressed:border-feedback-error-border forced-colors:!border-[Mark]\"\n );\n } else if (isSelected) {\n baseClasses.push(\n \"border-[7px] border-action-primary forced-colors:!border-[Highlight] group-pressed:border-action-primary-hover dark:group-pressed:border-action-primary-hover\"\n );\n } else {\n baseClasses.push(\n \"border-border-default group-pressed:border-border-focus dark:group-pressed:border-border-focus\"\n );\n }\n\n return baseClasses.join(\" \");\n}\n\nexport function Radio(props: RadioProps) {\n return (\n <RACRadio\n {...props}\n className={composeTailwindRenderProps(\n props.className,\n \"group flex items-center gap-2 text-sm text-text-body transition disabled:text-text-muted dark:text-text-body dark:disabled:text-text-muted forced-colors:disabled:text-[GrayText]\"\n )}\n >\n {(renderProps) => (\n <>\n <div className={getRadioStyles(renderProps)} />\n {props.children}\n </>\n )}\n </RACRadio>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport type {\n TextFieldProps as AriaTextFieldProps,\n TextFieldRenderProps,\n ValidationResult,\n} from \"react-aria-components\";\nimport { TextField as AriaTextFieldComponent } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n ClearButton,\n Description,\n FieldError,\n getInputBaseStyles,\n Input,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\nimport { Icon } from \"../Icon/Icon\";\n\nconst getTextFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n showSearchIcon?: boolean;\n isClearable?: boolean;\n hasValue?: boolean;\n isPassword?: boolean;\n className?: string;\n}): string => {\n // Get base input styles\n const baseStyles = getInputBaseStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n transparent: props.transparent,\n size: props.size,\n });\n\n // Add TextField-specific padding styles\n const paddingStyles = [\n props.showSearchIcon ? \"pl-8\" : \"pl-3\",\n (props.isClearable && props.hasValue) || props.isPassword ? \"pr-8\" : \"pr-3\",\n ].join(\" \");\n\n return twMerge(baseStyles, paddingStyles, props.className);\n};\n\n/**\n * TextField\n *\n * A controlled or uncontrolled text input with Edges styling, label,\n * description, error messaging, and optional affordances like a search icon,\n * clear button, and password visibility toggle. Wraps\n * `react-aria-components` TextField for accessible behavior.\n */\nexport interface TextFieldProps\n extends Omit<AriaTextFieldProps, \"isRequired\" | \"size\" | \"className\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n placeholder?: string;\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\n/**\n * Renders an Edges TextField with label, description, validation states and\n * optional search/clear/password affordances.\n */\nexport function TextField({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n isRequired,\n transparent,\n showSearchIcon,\n isClearable,\n onClear,\n type,\n validationResult,\n ...props\n}: TextFieldProps) {\n const [showPassword, setShowPassword] = React.useState(false);\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n const isPassword = type === \"password\";\n\n return (\n <AriaTextFieldComponent\n {...props}\n isRequired={isRequired}\n className={composeTailwindRenderProps(props.className, \"group flex flex-col\")}\n >\n {({ isDisabled, isInvalid }: TextFieldRenderProps) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <InputWrapper>\n {showSearchIcon && (\n <div className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 transform\">\n <Icon name=\"MagnifyingGlass\" className=\"h-4 w-4 text-text-muted\" />\n </div>\n )}\n <Input\n size={size}\n disabled={isDisabled}\n type={isPassword ? (showPassword ? \"text\" : \"password\") : type}\n value={props.value as string | undefined}\n defaultValue={props.defaultValue as string | undefined}\n placeholder={props.placeholder}\n onFocus={(e) => handleFocus(e, props.onFocus)}\n onBlur={(e) => handleBlur(e, props.onBlur)}\n onChange={(e) => props.onChange?.(e.target.value)}\n className={getTextFieldStyles({\n isInvalid,\n isDisabled,\n isFocused,\n size,\n transparent,\n showSearchIcon,\n isClearable,\n hasValue: !!props.value,\n isPassword,\n className: typeof props.className === \"string\" ? props.className : undefined,\n })}\n />\n {isClearable && props.value && !isDisabled && (\n <ClearButton\n onClick={() => {\n if (onClear) {\n onClear();\n } else if (props.onChange) {\n props.onChange(\"\");\n }\n }}\n size={size}\n />\n )}\n {isPassword && !isDisabled && (\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 transform text-text-muted hover:text-text-body\"\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Icon\n name={showPassword ? \"EyeSlash\" : \"Eye\"}\n size={size === \"sm\" ? 16 : 20}\n className=\"text-text-body\"\n />\n </button>\n )}\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n )}\n </AriaTextFieldComponent>\n );\n}\n","\"use client\";\nimport Link from \"@tiptap/extension-link\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport { BubbleMenu } from \"@tiptap/react/menus\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport React, { useState } from \"react\";\nimport { Dialog, Modal } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Button } from \"../Button\";\nimport { DialogHeader } from \"../DialogHeader\";\nimport { Icon } from \"../Icon\";\nimport { TextField } from \"../TextField\";\n\nexport interface RichTextEditorProps {\n /**\n * The initial content of the editor\n */\n initialContent?: string;\n /**\n * Callback when the content changes\n */\n onChange?: (html: string) => void;\n /**\n * Additional className to apply to the editor\n */\n className?: string;\n /**\n * Whether the editor is disabled\n */\n isDisabled?: boolean;\n /**\n * Placeholder text when editor is empty\n */\n placeholder?: string;\n}\n\nconst ToolbarButton = ({\n isActive = false,\n onPress,\n children,\n}: {\n isActive?: boolean;\n onPress: () => void;\n children: React.ReactNode;\n}) => (\n <Button variant={isActive ? \"secondary\" : \"ghost\"} size=\"sm\" onPress={onPress} className=\"p-1\">\n {children}\n </Button>\n);\n\ninterface LinkDialogProps {\n initialUrl: string;\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (url: string) => void;\n}\n\nfunction LinkDialog({ initialUrl, isOpen, onClose, onSubmit }: LinkDialogProps) {\n const [url, setUrl] = useState(initialUrl);\n\n React.useEffect(() => {\n setUrl(initialUrl);\n }, [initialUrl]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit(url);\n onClose();\n };\n\n return (\n <Modal isDismissable isOpen={isOpen} onOpenChange={(isOpen) => !isOpen && onClose()}>\n <Dialog className=\"relative\">\n <form onSubmit={handleSubmit}>\n <DialogHeader title=\"Insert Link\" onClose={onClose} />\n <div className=\"p-6\">\n <TextField\n label=\"URL\"\n type=\"url\"\n value={url}\n onChange={setUrl}\n autoFocus\n className=\"w-full\"\n />\n </div>\n <div className=\"flex justify-end gap-2 border-t border-border-muted p-4\">\n <Button variant=\"secondary\" onPress={onClose}>\n Cancel\n </Button>\n <Button type=\"submit\">Save</Button>\n </div>\n </form>\n </Dialog>\n </Modal>\n );\n}\n\n/**\n * RichTextEditor\n *\n * A rich text editor with formatting capabilities including headings, bold, italic, lists, and links.\n * Built on top of TipTap/ProseMirror.\n */\nexport function RichTextEditor({\n initialContent = \"\",\n onChange,\n className,\n isDisabled = false,\n placeholder = \"Start typing...\",\n}: RichTextEditorProps) {\n const [isLinkDialogOpen, setIsLinkDialogOpen] = useState(false);\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class:\n \"text-text-link-default hover:text-text-link-hover underline decoration-text-link-default/30 hover:decoration-text-link-hover cursor-pointer\",\n },\n }),\n ],\n content: initialContent,\n editable: !isDisabled,\n onUpdate: ({ editor }) => {\n onChange?.(editor.getHTML());\n },\n editorProps: {\n attributes: {\n class: twMerge(\n \"prose prose-sm max-w-none\",\n \"focus:outline-none\",\n \"[&>*:first-child]:mt-0 [&>*:last-child]:mb-0\"\n ),\n },\n },\n });\n\n const handleLinkClick = () => {\n setIsLinkDialogOpen(true);\n };\n\n const handleLinkSubmit = (url: string) => {\n if (url === \"\") {\n editor?.chain().focus().unsetLink().run();\n } else {\n editor?.chain().focus().setLink({ href: url }).run();\n }\n };\n\n if (!editor) {\n return null;\n }\n\n return (\n <div\n className={twMerge(\n \"flex flex-col rounded-md border border-border-input bg-background-input\",\n isDisabled && \"opacity-50\",\n className\n )}\n >\n {editor && (\n <>\n <BubbleMenu\n editor={editor}\n shouldShow={({ editor }) => editor.isActive(\"link\") && !isLinkDialogOpen}\n className=\"flex items-center gap-1 rounded-md border border-border-input bg-background-surface p-1 shadow-md\"\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2\"\n onPress={() => {\n const href = editor.getAttributes(\"link\").href;\n window.open(href, \"_blank\");\n }}\n >\n <Icon name=\"ArrowSquareOut\" className=\"mr-1 h-4 w-4\" />\n Open\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-8 px-2\" onPress={handleLinkClick}>\n <Icon name=\"PencilSimple\" className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 px-2\"\n onPress={() => editor.chain().focus().unsetLink().run()}\n >\n <Icon name=\"X\" className=\"mr-1 h-4 w-4\" />\n Remove\n </Button>\n </BubbleMenu>\n\n <LinkDialog\n isOpen={isLinkDialogOpen}\n onClose={() => setIsLinkDialogOpen(false)}\n onSubmit={handleLinkSubmit}\n initialUrl={editor.getAttributes(\"link\").href || \"\"}\n />\n </>\n )}\n <div className=\"flex items-center gap-1 border-b border-border-input p-2\">\n <ToolbarButton\n isActive={editor.isActive(\"heading\", { level: 1 })}\n onPress={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n >\n <span className=\"text-xs font-bold\">H1</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"heading\", { level: 2 })}\n onPress={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n >\n <span className=\"text-xs font-bold\">H2</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"bold\")}\n onPress={() => editor.chain().focus().toggleBold().run()}\n >\n <span className=\"text-xs font-bold\">B</span>\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"italic\")}\n onPress={() => editor.chain().focus().toggleItalic().run()}\n >\n <span className=\"text-xs italic\">I</span>\n </ToolbarButton>\n <div className=\"mx-1 h-4 w-px bg-border-muted\" />\n <ToolbarButton\n isActive={editor.isActive(\"bulletList\")}\n onPress={() => editor.chain().focus().toggleBulletList().run()}\n >\n <Icon name=\"ListBullets\" className=\"h-4 w-4\" />\n </ToolbarButton>\n <ToolbarButton\n isActive={editor.isActive(\"orderedList\")}\n onPress={() => editor.chain().focus().toggleOrderedList().run()}\n >\n <Icon name=\"ListNumbers\" className=\"h-4 w-4\" />\n </ToolbarButton>\n <div className=\"mx-1 h-4 w-px bg-border-muted\" />\n <ToolbarButton isActive={editor.isActive(\"link\")} onPress={handleLinkClick}>\n <Icon name=\"PaperclipHorizontal\" className=\"h-4 w-4\" />\n </ToolbarButton>\n </div>\n <div className=\"relative min-h-[200px] w-full\">\n <EditorContent\n editor={editor}\n className={twMerge(\n \"w-full p-4\",\n \"[&_.ProseMirror]:min-h-[inherit]\",\n \"[&_.ProseMirror]:outline-none\",\n \"[&_.ProseMirror_h1]:mb-4 [&_.ProseMirror_h1]:text-2xl [&_.ProseMirror_h1]:font-bold\",\n \"[&_.ProseMirror_h2]:mb-3 [&_.ProseMirror_h2]:text-xl [&_.ProseMirror_h2]:font-semibold\",\n \"[&_.ProseMirror_p]:mb-2\",\n \"[&_.ProseMirror_ul]:mb-2 [&_.ProseMirror_ul]:ml-6 [&_.ProseMirror_ul]:list-disc\",\n \"[&_.ProseMirror_ol]:mb-2 [&_.ProseMirror_ol]:ml-6 [&_.ProseMirror_ol]:list-decimal\",\n \"[&_.ProseMirror_li]:mb-1\",\n \"[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-border-muted [&_.ProseMirror_blockquote]:pl-4 [&_.ProseMirror_blockquote]:italic\",\n \"[&_.ProseMirror_code]:rounded [&_.ProseMirror_code]:bg-background-muted [&_.ProseMirror_code]:px-1 [&_.ProseMirror_code]:py-0.5 [&_.ProseMirror_code]:font-mono [&_.ProseMirror_code]:text-sm\",\n \"[&_.ProseMirror_pre]:rounded-md [&_.ProseMirror_pre]:bg-background-muted [&_.ProseMirror_pre]:p-3 [&_.ProseMirror_pre]:font-mono [&_.ProseMirror_pre]:text-sm\",\n \"[&_.ProseMirror_hr]:border-border-muted\",\n isDisabled && \"pointer-events-none\"\n )}\n />\n {editor.isEmpty && !isDisabled && (\n <div className=\"pointer-events-none absolute left-4 top-4 text-text-muted\">\n {placeholder}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Heading } from \"../Heading\";\n\n/**\n * Section Component — Semantic content grouping for dashboards\n *\n * A lightweight container that provides structure and hierarchy to page content.\n * Less heavy than a Card, more structured than a div. Perfect for organizing\n * related content with consistent spacing and optional headers.\n *\n * Usage:\n * ```tsx\n * <Section\n * title=\"Overview\"\n * description=\"Key metrics and performance indicators\"\n * actions={<Button variant=\"ghost\" size=\"sm\">Refresh</Button>}\n * >\n * <Grid cols={{ base: 1, lg: 3 }}>\n * <Card>...</Card>\n * </Grid>\n * </Section>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type SectionVariant = \"plain\" | \"contained\" | \"bordered\";\nexport type SectionSpacing = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport interface SectionProps {\n /** Section title */\n title?: React.ReactNode;\n /** Optional description/subtitle */\n description?: React.ReactNode;\n /** Actions slot (buttons, links, etc.) */\n actions?: React.ReactNode;\n /** Visual variant */\n variant?: SectionVariant;\n /** Vertical spacing around section */\n spacing?: SectionSpacing;\n /** Show divider under header */\n withDivider?: boolean;\n /** Heading level for accessibility */\n headingAs?: \"h2\" | \"h3\" | \"h4\";\n /** Additional CSS classes */\n className?: string;\n /** Section content */\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Styles\n// ——————————————————————————————————————————\n\nconst variantStyles: Record<SectionVariant, string> = {\n plain: \"\",\n contained: \"bg-background-surface rounded-lg border border-border-default p-6\",\n bordered: \"border-y border-border-default py-6\",\n};\n\nconst spacingStyles: Record<SectionSpacing, string> = {\n none: \"\",\n sm: \"my-4\",\n md: \"my-6 md:my-8\",\n lg: \"my-8 md:my-12\",\n};\n\n// ——————————————————————————————————————————\n// Component\n// ——————————————————————————————————————————\n\nexport function Section({\n title,\n description,\n actions,\n variant = \"plain\",\n spacing = \"md\",\n withDivider = false,\n headingAs = \"h2\",\n className,\n children,\n}: SectionProps) {\n // Generate unique ID for accessibility\n const headingId = React.useId();\n const hasHeader = title || description || actions;\n\n return (\n <section\n className={twMerge(spacingStyles[spacing], variantStyles[variant], className)}\n aria-labelledby={title ? headingId : undefined}\n >\n {hasHeader && (\n <header\n id={headingId}\n className={twMerge(\n \"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4\",\n withDivider && \"border-b border-border-default pb-4 mb-6\",\n !withDivider && children && \"mb-4\"\n )}\n >\n <div className=\"min-w-0 flex-1\">\n {title && (\n <Heading tag={headingAs} size=\"md\" className=\"text-text-heading\">\n {typeof title === \"string\" ? title : title}\n </Heading>\n )}\n {description && <p className=\"mt-1 text-sm text-text-muted\">{description}</p>}\n </div>\n {actions && <div className=\"flex-shrink-0\">{actions}</div>}\n </header>\n )}\n\n {children && <div className={variant === \"contained\" ? \"\" : \"\"}>{children}</div>}\n </section>\n );\n}\n","\"use client\";\nimport { ToggleButton } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport type SegmentOption = {\n id: string;\n label: string;\n icon?: IconName;\n};\n\nexport interface SegmentedControlProps {\n /**\n * Array of segment options\n */\n options: SegmentOption[];\n /**\n * Currently selected value\n */\n value: string;\n /**\n * Callback when selection changes\n */\n onChange: (value: string) => void;\n /**\n * Size of the control\n * @default \"md\"\n */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Whether the control is disabled\n */\n isDisabled?: boolean;\n /**\n * Aria label for accessibility\n */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles = {\n sm: \"h-8 text-xs\",\n md: \"h-10 text-sm\",\n lg: \"h-12 text-base\",\n xl: \"h-14 text-lg\",\n};\n\nconst iconSizes = {\n sm: 14,\n md: 16,\n lg: 18,\n xl: 20,\n};\n\nconst getButtonClass = ({\n isSelected,\n isFirst: _isFirst,\n isLast,\n isDisabled,\n}: {\n isSelected: boolean;\n isFirst: boolean;\n isLast: boolean;\n isDisabled?: boolean;\n}) => {\n return twMerge(\n // Base styles\n focusRing(),\n \"px-3 text-center transition cursor-pointer forced-color-adjust-none -ml-px first:ml-0 flex items-center justify-center h-full gap-2\",\n\n // Selection state\n isSelected\n ? \"bg-background-selected text-text-body font-semibold forced-colors:!bg-[Highlight] forced-colors:!text-[HighlightText]\"\n : \"text-text-muted hover:bg-background-hover pressed:bg-background-selected forced-colors:!bg-[ButtonFace] forced-colors:!text-[ButtonText] hover:font-semibold\",\n\n // Divider\n !isLast && \"border-r border-border-muted\",\n\n // Disabled state\n isDisabled &&\n \"bg-background-muted text-text-disabled forced-colors:!bg-[ButtonFace] forced-colors:!text-[GrayText] border-border-muted forced-colors:border-[GrayText] cursor-not-allowed\"\n );\n};\n\n/**\n * SegmentedControl\n *\n * A segmented control component for selecting between multiple options.\n * Similar to a radio group but with a more compact, button-like appearance.\n */\nexport function SegmentedControl({\n options,\n value,\n onChange,\n size = \"md\",\n className,\n isDisabled,\n \"aria-label\": ariaLabel,\n}: SegmentedControlProps) {\n return (\n <div\n className={twMerge(\n \"inline-flex overflow-hidden rounded-md border-2 border-border-muted\",\n sizeStyles[size],\n className\n )}\n role=\"group\"\n aria-label={ariaLabel}\n >\n {options.map((option, index) => (\n <ToggleButton\n key={option.id}\n isSelected={value === option.id}\n onChange={() => onChange(option.id)}\n className={getButtonClass({\n isSelected: value === option.id,\n isFirst: index === 0,\n isLast: index === options.length - 1,\n isDisabled,\n })}\n isDisabled={isDisabled}\n aria-label={option.label}\n >\n {option.icon && <Icon name={option.icon} size={iconSizes[size]} />}\n {option.label}\n </ToggleButton>\n ))}\n </div>\n );\n}\n","\"use client\";\nimport React, { useRef, useState } from \"react\";\nimport {\n Select as AriaSelect,\n SelectProps as AriaSelectProps,\n Key,\n ListBox,\n SelectValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport { controlStyles, Size } from \"../../utils/controlStyles\";\nimport { Button } from \"../Button\";\nimport { Description, FieldError, getInputBaseStyles, InputWrapper, Label } from \"../Field\";\nimport { Icon } from \"../Icon\";\nimport { DropdownSection, DropdownSectionProps } from \"../ListBox\";\nimport { ListBoxItem } from \"../ListBoxItem\";\nimport { Popover } from \"../Popover\";\n\n// Replace tv() with a regular function\ntype SelectVariants = {\n isDisabled?: boolean;\n size?: Size;\n isOpen?: boolean;\n isInvalid?: boolean;\n};\n\nfunction getSelectValueClassName(size: Size = \"md\") {\n // Use controlStyles for consistent text sizing\n return `flex-1 text-start data-[placeholder]:text-text-placeholder ${controlStyles[size].text}`;\n}\n\nexport type SelectVariantType = SelectVariants;\n\n// Define a custom hook for focus handling that works with any element\nfunction useElementFocus() {\n const handleFocus = React.useCallback(\n (e: React.FocusEvent<Element>, onFocus?: (e: React.FocusEvent<Element>) => void) => {\n onFocus?.(e);\n },\n []\n );\n\n const handleBlur = React.useCallback(\n (e: React.FocusEvent<Element>, onBlur?: (e: React.FocusEvent<Element>) => void) => {\n onBlur?.(e);\n },\n []\n );\n\n return { handleFocus, handleBlur };\n}\n\n/**\n * Interface defining the shape of items in the Select component\n */\nexport interface SelectItem<T = unknown> {\n /** Unique identifier for the item */\n id: string;\n /** Display label for the item */\n label: string;\n /** Value associated with the item */\n value: T;\n}\n\n/**\n * Props for the Select component\n * @template T - The type of the items, must extend SelectItem\n */\nexport interface SelectProps<T extends SelectItem>\n extends Omit<AriaSelectProps<T>, \"children\" | \"onSelectionChange\"> {\n /** Label text displayed above the select */\n label?: string;\n /** Helper text displayed below the select */\n description?: string;\n /** Error message or function to generate error message */\n errorMessage?: string | ((validation: ValidationResult) => React.ReactNode);\n /** Collection of items to display in the select */\n items?: Iterable<T>;\n /** Size variant of the select */\n size?: Size;\n /** Render function for items or static children */\n children?: React.ReactNode | ((item: T) => React.ReactNode);\n /** Custom render function for individual items. When provided, items prop is used to render items automatically */\n renderItem?: (item: T) => React.ReactNode;\n /** Currently selected item's id. Uses the SelectItem's `id` field for stable selection tracking */\n selectedKey?: Key;\n /** Default selected item's id for uncontrolled usage */\n defaultSelectedKey?: Key;\n /** Callback when selection changes, provides the selected item's id */\n onSelectionChange?: (key: Key) => void;\n /** Whether to show error states */\n showErrors?: boolean;\n /** Tooltip text */\n tooltip?: string;\n /** Whether the field is required */\n isRequired?: boolean;\n /** Validation result object */\n validationResult?: ValidationResult;\n /** Whether to use transparent background */\n transparent?: boolean;\n}\n\nexport function Select<T extends SelectItem>({\n label,\n description,\n errorMessage,\n children,\n items,\n renderItem,\n size = \"md\",\n selectedKey: controlledSelectedKey,\n defaultSelectedKey,\n onSelectionChange,\n placeholder,\n showErrors = false,\n tooltip,\n isRequired,\n transparent,\n ...props\n}: SelectProps<T>) {\n const [internalSelectedKey, setInternalSelectedKey] = useState<Key | null>(null);\n const [triggerWidth, setTriggerWidth] = useState<number | null>(null);\n const selectedKey = controlledSelectedKey ?? internalSelectedKey ?? defaultSelectedKey;\n const { handleFocus, handleBlur } = useElementFocus();\n\n const handleSelectionChange = (key: Key | null) => {\n if (onSelectionChange && key !== null) {\n onSelectionChange(key);\n }\n if (!onSelectionChange) {\n setInternalSelectedKey(key); // Update internal state if uncontrolled\n }\n };\n\n const selectRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n return (\n <AriaSelect\n {...props}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={handleSelectionChange}\n placeholder={placeholder}\n className={composeTailwindRenderProps(props.className, \"group flex w-full flex-col\")}\n ref={selectRef}\n onOpenChange={(isOpen) => {\n if (isOpen && triggerRef.current) {\n setTriggerWidth(triggerRef.current.offsetWidth);\n } else if (!isOpen) {\n selectRef.current?.blur();\n }\n }}\n >\n {({\n isDisabled,\n isInvalid,\n isOpen,\n }: {\n isDisabled: boolean;\n isInvalid: boolean;\n isOpen: boolean;\n }) => (\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={isRequired}>\n {label}\n </Label>\n )}\n <InputWrapper>\n <div ref={triggerRef}>\n <Button\n variant=\"unstyled\"\n className={twMerge(\n getInputBaseStyles({\n isInvalid: isInvalid || (showErrors && !!errorMessage),\n isDisabled,\n isFocused: isOpen,\n transparent,\n size,\n }),\n // Keep left padding consistent across sizes\n \"flex items-center text-start gap-4 cursor-pointer pl-[var(--control-padding-sm)]\"\n )}\n onFocus={(e) => handleFocus(e, props.onFocus)}\n onBlur={(e) => handleBlur(e, props.onBlur)}\n data-open={isOpen}\n >\n <SelectValue className={getSelectValueClassName(size)} />\n <Icon\n name=\"CaretDown\"\n aria-hidden\n className={twMerge(\n \"h-4 w-4 text-text-body group-disabled:text-gray-200 forced-colors:text-[ButtonText] transition-transform\",\n isOpen && \"rotate-180\"\n )}\n />\n </Button>\n </div>\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {showErrors && (\n <FieldError size={size} className=\"mt-3 text-feedback-error-text\">\n {typeof errorMessage === \"function\" && props.validationResult\n ? errorMessage(props.validationResult)\n : typeof errorMessage === \"string\"\n ? errorMessage\n : null}\n </FieldError>\n )}\n <Popover\n className=\"bg-background-input shadow-xl border border-border-input/20 backdrop-blur-sm\"\n style={{ minWidth: triggerWidth ? `${triggerWidth}px` : undefined }}\n >\n <ListBox\n items={items}\n className=\"w-full max-h-[300px] overflow-auto bg-background-input p-0 outline-0\"\n >\n {renderItem && items\n ? (item: T) => (\n <ListBoxItem key={item.id} id={item.id} textValue={item.label} size={size}>\n {renderItem(item)}\n </ListBoxItem>\n )\n : children}\n </ListBox>\n </Popover>\n </div>\n )}\n </AriaSelect>\n );\n}\n\nexport function SelectSection<T extends object>(props: DropdownSectionProps<T>) {\n return <DropdownSection {...props} />;\n}\n","\"use client\";\nimport React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { composeTailwindRenderProps } from \"../../utils\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { Description, FieldError, Label } from \"../Field\";\n\nexport interface SliderProps {\n label?: string;\n description?: string;\n tooltip?: string;\n errorMessage?: string;\n size?: Size;\n className?: string;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n /** Show the current numeric value to the right of the track */\n showValue?: boolean;\n}\n\nexport function Slider({\n label,\n description,\n tooltip,\n errorMessage,\n size = \"md\",\n className,\n value,\n defaultValue = 0,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue = true,\n}: SliderProps) {\n const isControlled = typeof value === \"number\";\n const [internalValue, setInternalValue] = React.useState<number>(defaultValue);\n const currentValue = isControlled ? (value as number) : internalValue;\n\n const clamped = Math.min(Math.max(currentValue, min), max);\n const range = Math.max(max - min, 0.00001);\n const percent = ((clamped - min) / range) * 100;\n\n return (\n <div\n className={\n composeTailwindRenderProps(className, \"group flex w-full flex-col gap-1\") as string\n }\n >\n {label && (\n <Label size={size} tooltip={tooltip} className=\"mb-1\">\n {label}\n </Label>\n )}\n\n <div className=\"flex items-center gap-3\">\n <div className=\"relative w-full select-none\">\n {/* Rail */}\n <div className=\"h-1.5 w-full rounded-full bg-background-muted\" />\n {/* Track fill */}\n <div\n className=\"pointer-events-none absolute left-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-action-primary\"\n style={{ width: `${percent}%` }}\n aria-hidden\n />\n {/* Range input overlay for interaction */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n disabled={disabled}\n aria-invalid={!!errorMessage}\n onChange={(e) => {\n const next = Number(e.currentTarget.value);\n if (isControlled) {\n onChange?.(next);\n } else {\n setInternalValue(next);\n onChange?.(next);\n }\n }}\n className={twMerge(\n \"absolute inset-0 w-full cursor-pointer appearance-none bg-transparent outline-none\",\n // WebKit thumb styles\n \"[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-background-input [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-border-input\",\n \"hover:[&::-webkit-slider-thumb]:shadow-sm focus-visible:[&::-webkit-slider-thumb]:outline-2 focus-visible:[&::-webkit-slider-thumb]:outline-border-focus\",\n // Firefox\n \"[&::-moz-range-thumb]:h-4 [&::-moz-range-thumb]:w-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-background-input [&::-moz-range-thumb]:border [&::-moz-range-thumb]:border-border-input\",\n \"hover:[&::-moz-range-thumb]:shadow-sm focus-visible:[&::-moz-range-thumb]:outline-2 focus-visible:[&::-moz-range-thumb]:outline-border-focus\",\n disabled ? \"cursor-not-allowed opacity-60\" : undefined\n )}\n />\n </div>\n {showValue && (\n <div className=\"min-w-10 text-right text-sm text-text-heading tabular-nums\">\n {Math.round(clamped)}\n </div>\n )}\n </div>\n\n {description && <Description className=\"mt-2 text-text-muted\">{description}</Description>}\n {errorMessage && <FieldError className=\"mt-1\">{errorMessage}</FieldError>}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * SplitPane Component — Resizable two-panel layout\n *\n * A layout primitive for side-by-side content with a draggable divider.\n * Perfect for list/detail views, dashboards with inspectors, or any\n * main/aside layout that benefits from user-controlled sizing.\n *\n * Usage:\n * ```tsx\n * <SplitPane defaultSize={0.7} minSize={280} maxSize={480}>\n * <SplitPane.Main>\n * <DataTable />\n * </SplitPane.Main>\n * <SplitPane.Aside>\n * <Inspector />\n * </SplitPane.Aside>\n * </SplitPane>\n * ```\n */\n\n// ——————————————————————————————————————————\n// Types\n// ——————————————————————————————————————————\n\nexport type SplitPaneOrientation = \"horizontal\" | \"vertical\";\n\nexport interface SplitPaneProps {\n /** Initial size of the main panel (0-1 for ratio, or px value) */\n defaultSize?: number;\n /** Minimum size of aside panel in pixels */\n minSize?: number;\n /** Maximum size of aside panel in pixels */\n maxSize?: number;\n /** Orientation of the split */\n orientation?: SplitPaneOrientation;\n /** Whether the divider is draggable */\n resizable?: boolean;\n /** Callback when resize occurs */\n onResize?: (size: number) => void;\n /** Additional CSS classes */\n className?: string;\n /** Child panels */\n children?: React.ReactNode;\n}\n\nexport interface SplitPanePanelProps {\n className?: string;\n children?: React.ReactNode;\n}\n\n// ——————————————————————————————————————————\n// Context for sharing state\n// ——————————————————————————————————————————\n\ninterface SplitPaneContextValue {\n orientation: SplitPaneOrientation;\n isResizing: boolean;\n}\n\nconst SplitPaneContext = React.createContext<SplitPaneContextValue>({\n orientation: \"horizontal\",\n isResizing: false,\n});\n\n// ——————————————————————————————————————————\n// Main Component\n// ——————————————————————————————————————————\n\nexport function SplitPane({\n defaultSize = 0.7,\n minSize = 240,\n maxSize = 600,\n orientation = \"horizontal\",\n resizable = true,\n onResize,\n className,\n children,\n}: SplitPaneProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n // Ensure defaultSize is treated as a ratio between 0 and 1\n const [splitPosition, setSplitPosition] = useState(defaultSize > 1 ? 0.7 : defaultSize);\n\n // Handle resize\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!containerRef.current) return;\n if (!isResizing) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n const totalSize = orientation === \"horizontal\" ? rect.width : rect.height;\n const startPos = orientation === \"horizontal\" ? rect.left : rect.top;\n const currentPos = orientation === \"horizontal\" ? e.clientX : e.clientY;\n\n const mainSize = currentPos - startPos;\n const asideSize = totalSize - mainSize;\n\n // Apply min/max constraints to aside panel\n if (asideSize < minSize || asideSize > maxSize) return;\n\n const newRatio = mainSize / totalSize;\n setSplitPosition(newRatio);\n onResize?.(newRatio);\n },\n [isResizing, orientation, minSize, maxSize, onResize]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(true);\n }, []);\n\n // Set up and tear down event listeners\n useEffect(() => {\n if (isResizing) {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = orientation === \"horizontal\" ? \"col-resize\" : \"row-resize\";\n document.body.style.userSelect = \"none\";\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n }\n }, [isResizing, handleMouseMove, handleMouseUp, orientation]);\n\n // Extract Main and Aside from children\n const mainPanel = React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === Main\n );\n const asidePanel = React.Children.toArray(children).find(\n (child) => React.isValidElement(child) && child.type === Aside\n );\n\n const splitPercentage = `${splitPosition * 100}%`;\n\n return (\n <SplitPaneContext.Provider value={{ orientation, isResizing }}>\n <div\n ref={containerRef}\n className={twMerge(\n \"flex w-full h-full\",\n orientation === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n className\n )}\n >\n {/* Main Panel */}\n <div\n className={twMerge(\"overflow-auto\", orientation === \"horizontal\" ? \"h-full\" : \"w-full\")}\n style={{\n [orientation === \"horizontal\" ? \"width\" : \"height\"]: splitPercentage,\n }}\n >\n {mainPanel}\n </div>\n\n {/* Divider */}\n {resizable && (\n <div\n className={twMerge(\n \"relative group\",\n orientation === \"horizontal\"\n ? \"w-2 -mx-1 cursor-col-resize\"\n : \"h-2 -my-1 cursor-row-resize\"\n )}\n onMouseDown={handleMouseDown}\n role=\"separator\"\n aria-orientation={orientation}\n aria-label=\"Resize divider\"\n tabIndex={0}\n onKeyDown={(e) => {\n // Keyboard resize support\n const step = 0.01; // 1% step\n if (orientation === \"horizontal\") {\n if (e.key === \"ArrowLeft\" && splitPosition > 0.3) {\n const newPos = Math.max(0.3, splitPosition - step);\n setSplitPosition(newPos);\n onResize?.(newPos);\n } else if (e.key === \"ArrowRight\" && splitPosition < 0.8) {\n const newPos = Math.min(0.8, splitPosition + step);\n setSplitPosition(newPos);\n onResize?.(newPos);\n }\n }\n }}\n >\n {/* Visual divider line */}\n <div\n className={twMerge(\n \"absolute bg-border-default transition-all\",\n orientation === \"horizontal\"\n ? \"left-1/2 -translate-x-1/2 w-px h-full group-hover:w-1\"\n : \"top-1/2 -translate-y-1/2 h-px w-full group-hover:h-1\",\n \"group-hover:bg-action-primary/50\",\n isResizing && \"bg-action-primary\",\n isResizing && (orientation === \"horizontal\" ? \"w-1\" : \"h-1\")\n )}\n />\n {/* Grab handle indicator */}\n <div\n className={twMerge(\n \"absolute\",\n orientation === \"horizontal\"\n ? \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-1 h-8\"\n : \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-8 h-1\",\n \"bg-border-muted rounded-full opacity-0 group-hover:opacity-100 transition-opacity\"\n )}\n />\n </div>\n )}\n\n {/* Aside Panel */}\n <div\n className={twMerge(\n \"overflow-auto flex-1\",\n orientation === \"horizontal\" ? \"h-full\" : \"w-full\"\n )}\n >\n {asidePanel}\n </div>\n </div>\n </SplitPaneContext.Provider>\n );\n}\n\n// ——————————————————————————————————————————\n// Panel Components\n// ——————————————————————————————————————————\n\nexport function Main({ className, children }: SplitPanePanelProps) {\n return <div className={twMerge(\"w-full h-full\", className)}>{children}</div>;\n}\n\nexport function Aside({ className, children }: SplitPanePanelProps) {\n return <div className={twMerge(\"w-full h-full\", className)}>{children}</div>;\n}\n\n// ——————————————————————————————————————————\n// Compound API\n// ——————————————————————————————————————————\n\nSplitPane.Main = Main;\nSplitPane.Aside = Aside;\n","import React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { type ComponentFormatter, formatComponentValue } from \"../../utils/formatting\";\nimport type { FieldValue } from \"../../utils/formatting/types\";\nimport { CopyToClipboard } from \"../CopyToClipboard\";\nimport { Icon } from \"../Icon\";\nimport { Skeleton } from \"../Skeleton\";\n\n/**\n * StatList — Compact key-value statistics display\n *\n * Displays formatted statistics with status indicators and optional copy functionality.\n * Uses the unified formatting system for consistent data presentation.\n */\n\n// Types\n\nexport type StatTone = \"neutral\" | \"success\" | \"warning\" | \"error\" | \"info\";\nexport type StatAlign = \"start\" | \"end\";\nexport type StatLayout = \"one-column\" | \"two-column\";\n\nexport type StatValue = FieldValue;\n\nexport type StatFormatter = ComponentFormatter;\n\nexport interface StatThreshold {\n when: (value: StatValue) => boolean;\n tone: StatTone;\n}\n\nexport interface StatItem {\n /** Unique identifier */\n id: string;\n /** Label for the statistic */\n label: React.ReactNode;\n /** Value to display */\n value: StatValue;\n /** Custom formatter for the value */\n formatter?: StatFormatter;\n /** Additional metadata below value */\n meta?: React.ReactNode;\n /** Explicit tone/status color */\n tone?: StatTone;\n /** Data-driven tone based on value */\n thresholds?: StatThreshold[];\n /** Enable copy to clipboard */\n copyable?: boolean | ((value: StatValue) => string);\n /** Optional link URL */\n href?: string;\n /** Click handler */\n onAction?: () => void;\n /** Icon before label */\n iconLeft?: React.ReactNode;\n /** Icon after value */\n iconRight?: React.ReactNode;\n /** Tooltip for additional info */\n tooltip?: React.ReactNode;\n /** Disabled state */\n disabled?: boolean;\n}\n\nexport interface StatListProps {\n /** Statistics to display */\n items: StatItem[];\n /** Layout mode */\n layout?: StatLayout;\n /** Compact spacing */\n dense?: boolean;\n /** Value alignment */\n valueAlign?: StatAlign;\n /** Show dividers between items */\n showDividers?: boolean;\n /** Loading state */\n skeleton?: boolean;\n /** Empty state */\n empty?: boolean;\n /** Error state */\n error?: string | React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n// Helpers\n\n// Use the centralized formatting utility\nfunction formatValue(value: StatValue, formatter?: StatFormatter): React.ReactNode {\n return formatComponentValue({\n value,\n formatter,\n emptyClassName: \"text-text-muted\",\n emptyText: \"—\",\n });\n}\n\nfunction getTone(item: StatItem): StatTone | undefined {\n // Check thresholds first\n if (item.thresholds && item.value !== null && item.value !== undefined) {\n for (const threshold of item.thresholds) {\n if (threshold.when(item.value)) {\n return threshold.tone;\n }\n }\n }\n\n // Fall back to explicit tone\n return item.tone;\n}\n\nconst toneColors: Record<StatTone, string> = {\n neutral: \"text-text-body\",\n success: \"text-feedback-success\",\n warning: \"text-feedback-warning\",\n error: \"text-feedback-error\",\n info: \"text-feedback-info\",\n};\n\n// StatRow Component\n\nfunction StatRow({\n item,\n dense,\n valueAlign,\n}: {\n item: StatItem;\n dense?: boolean;\n valueAlign?: StatAlign;\n}) {\n const tone = getTone(item);\n const toneClass = tone ? toneColors[tone] : \"\";\n\n const formattedValue = formatValue(item.value, item.formatter);\n const textToCopy =\n typeof item.copyable === \"function\" ? item.copyable(item.value) : String(item.value);\n\n const valueDisplay = (\n <span className={item.href ? \"hover:underline cursor-pointer\" : \"\"}>{formattedValue}</span>\n );\n\n const valueContent = (\n <dd\n className={twMerge(\n dense ? \"text-sm\" : \"text-base\",\n \"font-medium\",\n valueAlign === \"start\" ? \"text-left\" : \"text-right\",\n toneClass,\n item.disabled && \"opacity-50\"\n )}\n >\n {item.copyable ? (\n <CopyToClipboard value={textToCopy} size=\"sm\" className=\"flex items-center gap-1\">\n {valueDisplay}\n {item.iconRight}\n </CopyToClipboard>\n ) : (\n <div className=\"flex items-center gap-1\">\n {valueDisplay}\n {item.iconRight}\n </div>\n )}\n\n {item.meta && (\n <div\n className={twMerge(\n \"text-xs text-text-muted mt-0.5\",\n valueAlign === \"start\" ? \"text-left\" : \"text-right\"\n )}\n >\n {item.meta}\n </div>\n )}\n </dd>\n );\n\n const content = (\n <>\n <dt\n className={twMerge(\n dense ? \"text-xs\" : \"text-sm\",\n \"text-text-caption truncate\",\n \"flex items-center gap-1\",\n item.disabled && \"opacity-50\"\n )}\n >\n {item.iconLeft}\n <span title={typeof item.label === \"string\" ? item.label : undefined}>{item.label}</span>\n {item.tooltip && (\n <Icon\n name=\"Question\"\n size={10}\n className=\"text-text-muted\"\n aria-label=\"More information\"\n />\n )}\n </dt>\n\n {item.href ? (\n <a href={item.href} onClick={item.onAction} className=\"block\">\n {valueContent}\n </a>\n ) : (\n valueContent\n )}\n </>\n );\n\n return (\n <div\n className={twMerge(\"grid grid-cols-[1fr_auto] items-start\", dense ? \"gap-x-2\" : \"gap-x-4\")}\n >\n {content}\n </div>\n );\n}\n\n// Main Component\n\nexport function StatList({\n items,\n layout = \"one-column\",\n dense = false,\n valueAlign = \"end\",\n showDividers = false,\n skeleton = false,\n empty = false,\n error,\n className,\n}: StatListProps) {\n // Loading state\n if (skeleton) {\n return (\n <div\n className={twMerge(\n \"grid\",\n layout === \"two-column\" ? \"md:grid-cols-2 gap-x-6\" : \"grid-cols-1\",\n dense ? \"gap-y-1\" : \"gap-y-2\",\n className\n )}\n >\n {Array.from({ length: items.length || 4 }).map((_, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-x-4\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-5 w-16\" />\n </div>\n ))}\n </div>\n );\n }\n\n // Error or empty states\n if (error) {\n return <div className={twMerge(\"text-sm text-feedback-error\", className)}>{error}</div>;\n }\n\n if (empty || !items.length) {\n return <div className={twMerge(\"text-sm text-text-muted\", className)}>No data available</div>;\n }\n\n return (\n <dl\n className={twMerge(\n \"grid\",\n layout === \"two-column\" ? \"md:grid-cols-2 gap-x-6\" : \"grid-cols-1\",\n dense ? \"gap-y-1\" : \"gap-y-2\",\n className\n )}\n >\n {items.map((item, index) => (\n <React.Fragment key={item.id}>\n {showDividers && index > 0 && layout === \"one-column\" && (\n <div className=\"col-span-full border-t border-border-default -mt-1 mb-1\" />\n )}\n <StatRow item={item} dense={dense} valueAlign={valueAlign} />\n </React.Fragment>\n ))}\n </dl>\n );\n}\n","import React from \"react\";\nimport { Switch as AriaSwitch, SwitchProps as AriaSwitchProps } from \"react-aria-components\";\nimport { composeTailwindRenderProps, focusRing } from \"../../utils\";\n\nexport interface SwitchProps extends Omit<AriaSwitchProps, \"children\"> {\n children: React.ReactNode;\n}\n\nfunction getTrackClassName({\n isSelected,\n isDisabled,\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n}) {\n const baseClasses =\n \"flex h-4 w-7 px-px items-center shrink-0 cursor-default rounded-full transition duration-200 ease-in-out shadow-inner border border-transparent\";\n const focusRingClasses = focusRing;\n\n const selectedClasses = isSelected\n ? \"bg-gray-700 dark:bg-zinc-300 forced-colors:!bg-[Highlight] group-pressed:bg-gray-800 dark:group-pressed:bg-zinc-200\"\n : \"bg-gray-400 dark:bg-zinc-400 group-pressed:bg-gray-500 dark:group-pressed:bg-zinc-300\";\n\n const disabledClasses = isDisabled\n ? \"bg-gray-200 dark:bg-zinc-700 forced-colors:group-selected:!bg-[GrayText] forced-colors:border-[GrayText]\"\n : \"\";\n\n return [baseClasses, focusRingClasses, selectedClasses, disabledClasses]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction getHandleClassName({\n isSelected,\n isDisabled,\n}: {\n isSelected: boolean;\n isDisabled: boolean;\n}) {\n const baseClasses =\n \"h-3 w-3 transform rounded-full bg-white dark:bg-zinc-900 outline-none shadow transition duration-200 ease-in-out\";\n\n const selectedClasses = isSelected ? \"translate-x-[100%]\" : \"translate-x-0\";\n\n const disabledClasses = isDisabled ? \"forced-colors:outline-[GrayText]\" : \"\";\n\n return [baseClasses, selectedClasses, disabledClasses].filter(Boolean).join(\" \");\n}\n\n/**\n * Switch\n *\n * Toggle switch component for binary on/off states.\n * Provides an accessible alternative to checkboxes for settings and preferences.\n */\nexport function Switch({ children, ...props }: SwitchProps) {\n return (\n <AriaSwitch\n {...props}\n className={composeTailwindRenderProps(\n props.className,\n \"group flex items-center gap-2 text-sm text-gray-800 transition disabled:text-gray-300 dark:text-zinc-200 dark:disabled:text-zinc-600 forced-colors:disabled:text-[GrayText]\"\n )}\n >\n {(renderProps) => (\n <>\n <div className={getTrackClassName(renderProps)}>\n <span className={getHandleClassName(renderProps)} />\n </div>\n {children}\n </>\n )}\n </AriaSwitch>\n );\n}\n","import React from \"react\";\nimport type { ValidationResult } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBaseStyles,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nconst getTextAreaStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n // Get base input styles\n const baseStyles = getInputBaseStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n transparent: props.transparent,\n size: props.size,\n });\n\n // Add TextArea-specific styles\n const textAreaStyles = `min-h-[100px] py-2 ${props.isDisabled ? \"resize-none\" : \"resize-y\"}`;\n\n return twMerge(baseStyles, textAreaStyles, props.className);\n};\n\n/**\n * TextArea\n *\n * Multi-line text input with Edges styling, label, description, and error.\n */\nexport interface TextAreaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\" | \"disabled\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n size?: Size;\n isInvalid?: boolean;\n isDisabled?: boolean;\n validationResult?: ValidationResult;\n}\n\nexport function TextArea({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n required,\n transparent,\n isInvalid,\n isDisabled,\n className,\n validationResult,\n ...props\n}: TextAreaProps) {\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n\n return (\n <div className=\"group flex flex-col\">\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={required}>\n {label}\n </Label>\n )}\n <InputWrapper>\n <textarea\n {...props}\n required={required}\n onFocus={(e) => {\n // Properly handle the textarea focus event\n if (props.onFocus) {\n props.onFocus(e);\n }\n handleFocus(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n onBlur={(e) => {\n // Properly handle the textarea blur event\n if (props.onBlur) {\n props.onBlur(e);\n }\n handleBlur(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n className={getTextAreaStyles({\n isInvalid,\n isDisabled,\n isFocused,\n size,\n transparent,\n className,\n })}\n disabled={isDisabled}\n />\n </InputWrapper>\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport React, { useCallback, useEffect, useLayoutEffect, useRef } from \"react\";\nimport type { ValidationResult } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { Chip } from \"../Chip\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBaseStyles,\n InputWrapper,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nexport interface ChipData {\n id: string;\n label: string;\n value: unknown;\n}\n\nexport interface TriggerInfo {\n query: string;\n position: number;\n startIndex: number;\n}\n\nexport interface TextAreaWithChipsProps\n extends Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n \"size\" | \"value\" | \"onChange\" | \"disabled\"\n >,\n BaseInputProps {\n // Standard TextArea props (consistent with TextArea.tsx)\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n tooltip?: string;\n size?: Size;\n isInvalid?: boolean;\n isDisabled?: boolean;\n validationResult?: ValidationResult;\n\n // Text content - using standard 'value' and 'onChange' names for consistency\n value?: string;\n onChange?: (value: string) => void;\n\n // Chip functionality\n chips?: ChipData[];\n onChipsChange?: (chips: ChipData[]) => void;\n\n // Trigger detection\n triggerPattern?: string | RegExp;\n onTriggerDetected?: (triggerInfo: TriggerInfo) => void;\n onTriggerDismissed?: () => void;\n\n // Chip rendering customization\n renderChip?: (chip: ChipData, onRemove: () => void) => React.ReactNode;\n chipVariant?: \"default\" | \"primary\" | \"secondary\";\n chipSize?: Size;\n}\n\n/**\n * TextAreaWithChips\n *\n * Enhanced textarea component with chip/tag support.\n * Enables rich text input with embedded chips for mentions, tags, or structured data entry.\n */\nexport function TextAreaWithChips({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n required,\n transparent,\n isInvalid,\n isDisabled,\n className,\n validationResult,\n\n // Text props (consistent naming with standard TextArea)\n value = \"\",\n onChange,\n\n // Chip props\n chips = [],\n onChipsChange,\n triggerPattern = \"{{\",\n onTriggerDetected,\n onTriggerDismissed,\n renderChip,\n chipVariant = \"primary\",\n chipSize,\n\n ...props\n}: TextAreaWithChipsProps) {\n const textareaRef = useRef<HTMLDivElement>(null);\n const { isFocused, handleFocus, handleBlur } = useInputFocus();\n // Use smaller chip sizes that match text line height better\n const actualChipSize = chipSize || \"sm\";\n\n // Track desired caret offset across re-renders to preserve cursor position\n const selectionOffsetRef = useRef<number | null>(null);\n\n // Helper: convert DOM content back to text with chip placeholders\n const getDOMTextWithPlaceholders = useCallback((container: HTMLDivElement): string => {\n let result = \"\";\n\n const processNode = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n // Only include text nodes that are not inside chip elements\n const parentElement = node.parentElement;\n if (!parentElement?.closest(\"[data-chip-id]\")) {\n const textContent = node.textContent || \"\";\n result += textContent;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (element.hasAttribute(\"data-chip-id\")) {\n // Replace chip with placeholder\n const chipId = element.getAttribute(\"data-chip-id\");\n result += `{{${chipId}}}`;\n // Don't process children of chip elements\n return;\n } else if (element.tagName === \"BR\") {\n result += \"\\n\";\n return;\n } else if (element.tagName === \"DIV\") {\n // Handle div elements that might be created by contentEditable\n // Process children but don't add extra content\n }\n }\n\n // Process child nodes\n for (let i = 0; i < node.childNodes.length; i++) {\n processNode(node.childNodes[i]);\n }\n };\n\n processNode(container);\n\n // Clean up any extra whitespace that might have been introduced\n // but preserve intentional spaces and line breaks\n return result;\n }, []);\n\n // Helper: set caret at given text offset within the contentEditable container\n const setCaretAtOffset = useCallback((container: HTMLDivElement, targetOffset: number) => {\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {\n acceptNode: (node) => {\n // Skip text within chip elements (contentEditable=false)\n const parentElement = node.parentElement;\n if (parentElement && parentElement.closest(\"[data-chip-id]\")) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let currentNode: Node | null = walker.nextNode();\n let remaining = Math.max(0, targetOffset);\n\n while (currentNode) {\n const text = currentNode.nodeValue || \"\";\n if (text.length >= remaining) {\n const range = document.createRange();\n range.setStart(currentNode, remaining);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n return;\n }\n remaining -= text.length;\n currentNode = walker.nextNode();\n }\n\n // Fallback: place at end\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(container);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }, []);\n\n // Handle empty state properly to avoid DOM conflicts\n useEffect(() => {\n if (textareaRef.current && !value) {\n // Only clear if there's actual content to avoid DOM manipulation conflicts\n if (textareaRef.current.textContent !== \"\") {\n textareaRef.current.textContent = \"\";\n }\n }\n }, [value]);\n\n // After value changes, restore caret to the last known offset\n useLayoutEffect(() => {\n if (!textareaRef.current) return;\n if (value === \"\") {\n // If empty and focused, ensure focus and caret at start so user can type immediately\n if (isFocused) {\n try {\n textareaRef.current.focus({ preventScroll: true } as unknown as FocusOptions);\n setCaretAtOffset(textareaRef.current, 0);\n } catch (_) {\n // ignore\n }\n }\n return;\n }\n if (selectionOffsetRef.current == null) return;\n try {\n setCaretAtOffset(textareaRef.current, selectionOffsetRef.current);\n } finally {\n selectionOffsetRef.current = null;\n }\n }, [value, setCaretAtOffset, isFocused]);\n\n // Handle text changes and trigger detection for contentEditable\n const handleTextChange = useCallback(\n (newValue: string, cursorPosition?: number) => {\n onChange?.(newValue);\n\n // If text is empty, dismiss any active triggers\n if (newValue === \"\") {\n onTriggerDismissed?.();\n return;\n }\n\n // Check for trigger pattern\n if (triggerPattern && onTriggerDetected && cursorPosition !== undefined) {\n const textBeforeCursor = newValue.slice(0, cursorPosition);\n\n const triggerRegex =\n typeof triggerPattern === \"string\"\n ? new RegExp(`\\\\${triggerPattern}([^\\\\s]*)$`)\n : triggerPattern;\n\n const match = textBeforeCursor.match(triggerRegex);\n\n if (match) {\n const query = match[1] || \"\";\n const startIndex = cursorPosition - match[0].length;\n\n onTriggerDetected({\n query,\n position: cursorPosition,\n startIndex,\n });\n } else {\n onTriggerDismissed?.();\n }\n }\n },\n [onChange, triggerPattern, onTriggerDetected, onTriggerDismissed]\n );\n\n // Handle chip removal\n const handleChipRemove = useCallback(\n (chipId: string) => {\n if (!onChipsChange || !onChange) return;\n\n const updatedChips = chips.filter((chip) => chip.id !== chipId);\n onChipsChange(updatedChips);\n\n // Also remove from text content\n const updatedText = value.replace(new RegExp(`\\\\{\\\\{${chipId}\\\\}\\\\}`, \"g\"), \"\");\n onChange(updatedText);\n },\n [chips, onChipsChange, value, onChange]\n );\n\n // Render chip or use default rendering\n const renderChipElement = useCallback(\n (chip: ChipData) => {\n if (renderChip) {\n return renderChip(chip, () => handleChipRemove(chip.id));\n }\n\n return (\n <Chip\n key={chip.id}\n variant={chipVariant}\n size={actualChipSize}\n onRemove={isDisabled ? undefined : () => handleChipRemove(chip.id)}\n isDisabled={isDisabled}\n className=\"py-0.5 px-1.5 gap-1 text-xs leading-none rounded-md\"\n >\n {chip.label}\n </Chip>\n );\n },\n [renderChip, chipVariant, actualChipSize, handleChipRemove, isDisabled]\n );\n\n // Get textarea styles - using same approach as TextField\n const getTextAreaStyles = () => {\n // Get base input styles (same as TextField)\n const baseStyles = getInputBaseStyles({\n isInvalid,\n isDisabled,\n isFocused,\n transparent,\n size,\n });\n\n // Add TextArea-specific styles\n const textAreaStyles = `min-h-[100px] py-2 px-3 ${isDisabled ? \"resize-none\" : \"resize-y\"}`;\n\n // ContentEditable and chip-specific styles\n const contentEditableStyles = twMerge(\n \"focus:outline-none overflow-auto\",\n\n // Chip selection styles\n \"[&_[data-chip-id]::selection]:bg-action-primary/20\",\n\n // Placeholder styles for contentEditable - only show when completely empty\n \"[&:empty]:before:content-[attr(data-placeholder)] [&:empty]:before:text-text-placeholder [&:empty]:before:pointer-events-none\"\n );\n\n return twMerge(baseStyles, textAreaStyles, contentEditableStyles, className);\n };\n\n // Render content with inline chips\n const renderContent = () => {\n // If no text value, return nothing (let CSS placeholder handle it)\n if (!value) {\n return null;\n }\n\n const parts = value.split(/(\\{\\{[^}]+\\}\\})/g);\n\n return parts.map((part, index) => {\n // Check if this part is a chip placeholder\n const chipMatch = part.match(/\\{\\{([^}]+)\\}\\}/);\n if (chipMatch) {\n const chipId = chipMatch[1];\n const chip = chips.find((c) => c.id === chipId);\n if (chip) {\n return (\n <span\n key={`chip-${chipId}-${index}`}\n className=\"inline-block align-baseline cursor-pointer\"\n contentEditable={false}\n suppressContentEditableWarning\n data-chip-id={chipId}\n style={{\n userSelect: \"none\",\n verticalAlign: \"baseline\",\n lineHeight: \"1\",\n }}\n onClick={(e) => {\n e.preventDefault();\n // Select the chip element\n const selection = window.getSelection();\n const range = document.createRange();\n range.selectNode(e.currentTarget);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }}\n >\n {renderChipElement(chip)}\n </span>\n );\n }\n }\n\n // Regular text - preserve line breaks\n if (part.includes(\"\\n\")) {\n return part.split(\"\\n\").map((line, lineIndex) => (\n <React.Fragment key={`line-${index}-${lineIndex}`}>\n {line}\n {lineIndex < part.split(\"\\n\").length - 1 && <br />}\n </React.Fragment>\n ));\n }\n\n return part;\n });\n };\n\n return (\n <div className=\"group flex flex-col\">\n <div className=\"flex flex-col\">\n {label && (\n <Label size={size} tooltip={tooltip} isRequired={required}>\n {label}\n </Label>\n )}\n\n <InputWrapper>\n <div\n // Force a safe remount when the content becomes fully empty to avoid\n // React diffing contentEditable internals during browser normalization\n key={value === \"\" ? \"empty\" : \"content\"}\n ref={textareaRef}\n contentEditable={!isDisabled}\n suppressContentEditableWarning\n onInput={(e) => {\n if (isDisabled) return;\n const target = e.target as HTMLDivElement;\n\n // Check if there are any chip elements in the DOM\n const hasChips = target.querySelector(\"[data-chip-id]\") !== null;\n\n let newValue: string;\n\n if (hasChips) {\n // Only use complex DOM parsing when chips are present\n newValue = getDOMTextWithPlaceholders(target);\n // Normalize runaway spaces that can accumulate adjacent to chips\n newValue = newValue\n // collapse 2+ spaces AFTER a chip to a single space\n .replace(/(\\{\\{[^}]+\\}\\})\\s{2,}/g, \"$1 \")\n // collapse 2+ spaces BEFORE a chip to a single space\n .replace(/\\s{2,}(\\{\\{[^}]+\\}\\})/g, \" $1\");\n } else {\n // Use simple textContent for plain text to avoid issues\n newValue = target.textContent || \"\";\n }\n\n // If cleared, short-circuit to avoid selection/range work during DOM teardown\n if (newValue === \"\") {\n // Place caret at start and keep focus so user can continue typing\n try {\n const range = document.createRange();\n range.selectNodeContents(target);\n range.collapse(true);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n selectionOffsetRef.current = 0;\n } catch (_) {\n // ignore\n }\n handleTextChange(\"\", 0);\n return;\n }\n\n // Only update if the value actually changed to avoid unnecessary re-renders\n if (newValue === value) {\n return;\n }\n\n // Get cursor position based on text with placeholders\n const selection = window.getSelection();\n let cursorPosition = 0;\n\n if (selection && selection.rangeCount > 0) {\n try {\n const range = selection.getRangeAt(0);\n\n if (hasChips) {\n // Use complex calculation when chips are present\n let position = 0;\n let found = false;\n\n const calculatePosition = (node: Node): boolean => {\n if (found) return true;\n\n if (node === range.startContainer) {\n position += range.startOffset;\n found = true;\n return true;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // Only count text nodes that are not inside chip elements\n const parentElement = node.parentElement;\n if (!parentElement?.closest(\"[data-chip-id]\")) {\n if (node.contains(range.startContainer)) {\n position += range.startOffset;\n found = true;\n return true;\n }\n position += (node.textContent || \"\").length;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n\n if (element.hasAttribute(\"data-chip-id\")) {\n // Check if cursor is within this chip element\n if (\n element.contains(range.startContainer) ||\n element === range.startContainer\n ) {\n const chipId = element.getAttribute(\"data-chip-id\");\n position += `{{${chipId}}}`.length;\n found = true;\n return true;\n }\n const chipId = element.getAttribute(\"data-chip-id\");\n position += `{{${chipId}}}`.length;\n return false; // Don't process children\n } else if (element.tagName === \"BR\") {\n if (element === range.startContainer) {\n found = true;\n return true;\n }\n position += 1; // for \\n\n return false;\n }\n }\n\n // Process child nodes\n for (let i = 0; i < node.childNodes.length; i++) {\n if (calculatePosition(node.childNodes[i])) {\n return true;\n }\n }\n\n return false;\n };\n\n calculatePosition(target);\n cursorPosition = position;\n } else {\n // Use simple calculation for plain text\n const tempRange = document.createRange();\n tempRange.setStart(target, 0);\n tempRange.setEnd(range.startContainer, range.startOffset);\n cursorPosition = tempRange.toString().length;\n }\n } catch (_error) {\n // Fallback to end of content if range creation fails\n cursorPosition = newValue.length;\n }\n }\n\n // Persist caret position so we can restore it after React re-renders\n selectionOffsetRef.current = cursorPosition;\n handleTextChange(newValue, cursorPosition);\n }}\n onKeyDown={(e) => {\n if (isDisabled) return;\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n try {\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n\n // Handle arrow key navigation around chips\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") {\n const chipElement =\n container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"[data-chip-id]\")\n : (container as Element).closest(\"[data-chip-id]\");\n\n if (chipElement) {\n e.preventDefault();\n\n try {\n // Move cursor to before or after the chip\n const newRange = document.createRange();\n const newSelection = window.getSelection();\n\n if (e.key === \"ArrowLeft\") {\n newRange.setStartBefore(chipElement);\n } else {\n newRange.setStartAfter(chipElement);\n }\n\n newRange.collapse(true);\n newSelection?.removeAllRanges();\n newSelection?.addRange(newRange);\n } catch (_rangeError) {\n // Ignore range errors - let default behavior happen\n }\n }\n }\n\n // Handle backspace on chips\n if (e.key === \"Backspace\") {\n // Identify a chip either selected, or immediately before the caret\n let chipElement: Element | null = null;\n\n // Case 1: caret is inside text or element inside a chip (selected chip)\n chipElement =\n (container.nodeType === Node.TEXT_NODE\n ? container.parentElement?.closest(\"[data-chip-id]\")\n : (container as Element).closest(\"[data-chip-id]\")) || null;\n\n // Case 2: caret is immediately after a chip (most common backspace case)\n if (!chipElement) {\n if (container.nodeType === Node.TEXT_NODE) {\n const textNode = container as Text;\n if (range.startOffset === 0 && textNode.parentElement) {\n const prev = textNode.previousSibling;\n if (prev && prev.nodeType === Node.ELEMENT_NODE) {\n const maybeChip = (prev as Element).closest(\"[data-chip-id]\");\n if (maybeChip) chipElement = maybeChip as Element;\n }\n }\n } else {\n const elementNode = container as Element;\n if (range.startOffset > 0) {\n const prev = elementNode.childNodes[range.startOffset - 1];\n if (prev && prev.nodeType === Node.ELEMENT_NODE) {\n const maybeChip = (prev as Element).closest(\"[data-chip-id]\");\n if (maybeChip) chipElement = maybeChip as Element;\n }\n }\n }\n }\n\n if (chipElement) {\n e.preventDefault();\n e.stopPropagation();\n\n const chipId = chipElement.getAttribute(\"data-chip-id\");\n if (!chipId) return;\n\n // Find the position of this chip in the text\n const chipPlaceholder = `{{${chipId}}}`;\n const chipIndex = value.indexOf(chipPlaceholder);\n\n if (chipIndex !== -1) {\n // Remove the chip placeholder from the text\n const newText =\n value.slice(0, chipIndex) + value.slice(chipIndex + chipPlaceholder.length);\n\n // Update chips array\n const newChips = chips.filter((c) => c.id !== chipId);\n\n // Set caret position to where the chip was\n selectionOffsetRef.current = chipIndex;\n\n // Clear any live selection ranges that may reference the chip DOM node\n try {\n const sel = window.getSelection();\n sel?.removeAllRanges();\n } catch (_) {\n // ignore\n }\n\n // Update state directly without any DOM manipulation\n onChipsChange?.(newChips);\n onChange?.(newText);\n }\n }\n }\n } catch (_error) {\n // Ignore selection/range errors and let default behavior happen\n }\n }}\n onFocus={(e) => {\n if (isDisabled) return;\n if (props.onFocus) {\n props.onFocus(e as unknown as React.FocusEvent<HTMLTextAreaElement>);\n }\n handleFocus(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n onBlur={(e) => {\n if (isDisabled) return;\n if (props.onBlur) {\n props.onBlur(e as unknown as React.FocusEvent<HTMLTextAreaElement>);\n }\n handleBlur(e as unknown as React.FocusEvent<HTMLInputElement>);\n }}\n className={getTextAreaStyles()}\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n ...props.style,\n }}\n data-placeholder={props.placeholder}\n >\n {renderContent()}\n </div>\n </InputWrapper>\n\n {description && (\n <Description size={size} className=\"mt-3\">\n {description}\n </Description>\n )}\n\n {typeof errorMessage === \"string\" && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage}\n </FieldError>\n )}\n\n {typeof errorMessage === \"function\" && validationResult && (\n <FieldError size={size} className=\"mt-1\">\n {errorMessage(validationResult)}\n </FieldError>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n TimeField as AriaTimeField,\n TimeFieldProps as AriaTimeFieldProps,\n DateInput,\n DateSegment,\n TimeValue,\n ValidationResult,\n} from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { Size } from \"../../utils/controlStyles\";\nimport { controlStyles } from \"../../utils/controlStyles\";\nimport {\n BaseInputProps,\n Description,\n FieldError,\n getInputBackgroundStyles,\n getInputStateStyles,\n Label,\n useInputFocus,\n} from \"../Field\";\n\nconst getTimeFieldStyles = (props: {\n isInvalid?: boolean;\n isDisabled?: boolean;\n isFocused?: boolean;\n transparent?: boolean;\n size?: Size;\n className?: string;\n}): string => {\n return twMerge(\n \"w-full\",\n getInputStateStyles({\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isFocused: props.isFocused,\n }),\n getInputBackgroundStyles({ transparent: props.transparent, isDisabled: props.isDisabled }),\n controlStyles[props.size || \"md\"].text,\n controlStyles[props.size || \"md\"].height,\n controlStyles[props.size || \"md\"].padding,\n // Align left padding with other fields (override left side only)\n \"pl-[var(--control-padding-sm)]\",\n \"flex items-center gap-0.5\",\n props.className\n );\n};\n\nconst getSegmentStyles = ({\n isPlaceholder,\n isDisabled,\n isFocused,\n size = \"md\",\n}: {\n isPlaceholder?: boolean;\n isDisabled?: boolean;\n isInvalid?: boolean;\n isFocused?: boolean;\n size?: Size;\n}) => {\n return twMerge(\n // Base styles\n \"outline-none rounded transition-colors box-content tabular-nums text-center\",\n // Text styles based on state\n isPlaceholder ? \"text-text-muted italic\" : \"text-text-body\",\n isDisabled ? \"text-text-disabled cursor-not-allowed\" : \"cursor-text\",\n // Size styles\n controlStyles[size].text,\n // Padding and spacing\n \"px-0.5 -my-0.5\",\n // Focus styles\n isFocused &&\n \"!outline-[1.5px] !outline-[var(--control-focus-ring-color)] ![--tw-outline-style:solid]\",\n // Hover styles (only when not disabled and not focused)\n !isDisabled && !isFocused && \"hover:bg-text-body/[0.05]\"\n );\n};\n\n/**\n * TimeField\n *\n * Input segmented time with Edges styling and accessible behavior via\n * `react-aria-components`. Supports labels, descriptions and validation.\n */\nexport interface TimeFieldProps\n extends Omit<AriaTimeFieldProps<TimeValue>, \"size\" | \"className\">,\n BaseInputProps {\n label?: string;\n description?: string;\n errorMessage?: string | ((validation: ValidationResult) => string);\n placeholder?: string;\n tooltip?: string;\n isRequired?: boolean;\n className?: string;\n validationResult?: ValidationResult;\n}\n\n/**\n * Renders an Edges TimeField composed from segmented date parts.\n */\nexport function TimeField({\n label,\n description,\n errorMessage,\n size = \"md\",\n tooltip,\n isRequired,\n transparent,\n validationResult,\n ...props\n}: TimeFieldProps) {\n const { isFocused } = useInputFocus();\n const [focusedSegment, setFocusedSegment] = useState<string | null>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleFocusIn = (e: FocusEvent) => {\n const target = e.target as HTMLElement;\n if (target.hasAttribute(\"data-type\")) {\n setFocusedSegment(target.getAttribute(\"data-type\"));\n }\n };\n\n const handleFocusOut = () => {\n setFocusedSegment(null);\n };\n\n const inputElement = inputRef.current;\n if (inputElement) {\n inputElement.addEventListener(\"focusin\", handleFocusIn);\n inputElement.addEventListener(\"focusout\", handleFocusOut);\n }\n\n return () => {\n if (inputElement) {\n inputElement.removeEventListener(\"focusin\", handleFocusIn);\n inputElement.removeEventListener(\"focusout\", handleFocusOut);\n }\n };\n }, []);\n\n return (\n <AriaTimeField {...props}>\n {({ isDisabled, isInvalid }) => (\n <>\n {label && (\n <Label isRequired={isRequired} tooltip={tooltip}>\n {label}\n </Label>\n )}\n <DateInput\n ref={inputRef}\n className={getTimeFieldStyles({ size, transparent, isDisabled, isInvalid, isFocused })}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={getSegmentStyles({\n isPlaceholder: segment.isPlaceholder,\n isDisabled: !segment.isEditable,\n isFocused: focusedSegment === segment.type,\n size,\n })}\n />\n )}\n </DateInput>\n {description && <Description>{description}</Description>}\n {typeof errorMessage === \"string\" ? <FieldError>{errorMessage}</FieldError> : null}\n </>\n )}\n </AriaTimeField>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport React from \"react\";\nimport { ToggleButton as RACToggleButton } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\nimport { focusRing } from \"../../utils\";\nimport { controlStyles, type Size } from \"../../utils/controlStyles\";\nimport { Icon } from \"../Icon\";\n\ntype IconName = ComponentProps<typeof Icon>[\"name\"];\n\nexport interface ToggleButtonProps {\n variant?: \"default\" | \"primary\";\n\n size?: Size;\n className?: string;\n children: React.ReactNode;\n onChange?: (isSelected: boolean) => void;\n onPress?: () => void;\n isSelected?: boolean;\n isDisabled?: boolean;\n borderRadius?: \"left\" | \"right\";\n borderRight?: boolean;\n borderLeft?: boolean;\n icon?: IconName;\n iconWeight?: \"thin\" | \"light\" | \"regular\" | \"bold\" | \"fill\" | \"duotone\";\n iconPosition?: \"left\" | \"right\";\n /** Value used for group selection state */\n value?: string;\n isLoading?: boolean;\n loadingText?: string;\n loadingIndicator?: React.ReactNode;\n badgeNumber?: number;\n badgeVariant?: \"primary\" | \"destructive\";\n badgePosition?: \"top-right\" | \"top-left\" | \"bottom-right\" | \"bottom-left\";\n}\n\nconst baseStyles =\n \"flex font-medium justify-center items-center gap-2 text-center transition whitespace-nowrap box-border\";\n\nconst variantStyles = {\n default: {\n selected:\n \"bg-text-body text-white hover:brightness-[var(--control-hover-opacity)] forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n unselected:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/[0.05] forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n },\n primary: {\n selected:\n \"bg-action-primary text-white hover:brightness-[var(--control-hover-opacity)] forced-colors:bg-[ButtonText] forced-colors:text-[ButtonFace] border-2 border-transparent\",\n unselected:\n \"bg-transparent text-text-body border-2 border-border-muted hover:bg-text-body/[0.05] forced-colors:border-[ButtonBorder] forced-colors:bg-[ButtonFace] forced-colors:text-[ButtonText]\",\n },\n};\n\nconst disabledStyles =\n \"opacity-[--control-hover-opacity] cursor-not-allowed pointer-events-none grayscale\";\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-primary text-white\",\n destructive: \"bg-action-destructive text-white\",\n} as const;\n\nfunction getToggleButtonStyles(props: ToggleButtonProps) {\n const {\n variant = \"default\",\n size = \"md\",\n isDisabled,\n isSelected,\n borderRadius,\n borderRight,\n borderLeft,\n } = props;\n\n let styles = `${baseStyles} ${isSelected ? variantStyles[variant].selected : variantStyles[variant].unselected}`;\n\n // Add size styles using control-specific variables\n styles += ` ${controlStyles[size].text} ${controlStyles[size].height} ${controlStyles[size].padding} ${controlStyles[size].gap}`;\n\n // Add state styles\n styles += ` ${isDisabled ? disabledStyles : enabledStyles}`;\n\n // Add border styles\n if (borderRadius === \"left\") styles += \" rounded-l-sm\";\n if (borderRadius === \"right\") styles += \" rounded-r-sm\";\n if (borderRight) styles += \" border-r\";\n if (borderLeft) styles += \" border-l\";\n\n // Add focus ring\n styles += ` ${focusRing()}`;\n\n return twMerge(styles);\n}\n\nexport function ToggleButton(props: ToggleButtonProps) {\n const {\n className,\n children,\n onPress,\n icon,\n iconPosition = \"left\",\n iconWeight,\n isLoading = false,\n loadingText,\n loadingIndicator,\n size = \"md\",\n badgeNumber,\n badgeVariant = \"primary\",\n badgePosition = \"top-right\",\n ...rest\n } = props;\n\n const iconElement = icon ? (\n <Icon name={icon} className={`icon-[--control-icon-size-${size}]`} weight={iconWeight} />\n ) : null;\n\n const renderChildren = () => {\n const content = (\n <>\n {iconPosition === \"left\" && iconElement}\n {children}\n {iconPosition === \"right\" && iconElement}\n </>\n );\n\n if (isLoading) {\n return (\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\n name=\"CircleNotch\"\n className={`animate-spin icon-[--control-icon-size-${size}]`}\n aria-hidden=\"true\"\n />\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\n return content;\n };\n\n const toggleButton = (\n <RACToggleButton\n onPress={onPress}\n {...rest}\n className={twMerge(getToggleButtonStyles(props), className)}\n aria-busy={isLoading}\n >\n {renderChildren()}\n </RACToggleButton>\n );\n\n if (badgeNumber && badgeNumber > 0) {\n return (\n <div className=\"relative\">\n {toggleButton}\n <span\n className={`absolute ${badgePositionStyles[badgePosition]} flex h-5 w-5 items-center justify-center rounded-full ${badgeVariantStyles[badgeVariant]} text-xs`}\n aria-label={`${badgeNumber} items`}\n >\n {badgeNumber}\n </span>\n </div>\n );\n }\n\n return toggleButton;\n}\n"]}