@texturehq/edges 1.2.1 → 1.3.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/components.manifest.json +32 -4
- package/dist/generated/tailwind-tokens-dark.css +120 -87
- package/dist/generated/tailwind-tokens-light.css +117 -87
- package/dist/generated/viz-runtime.css +193 -0
- package/dist/index.cjs +18 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +285 -4
- package/dist/index.d.ts +285 -4
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/{server-C1hypeJ9.d.cts → server-Utz6Sv9w.d.cts} +469 -165
- package/dist/{server-C1hypeJ9.d.ts → server-Utz6Sv9w.d.ts} +469 -165
- package/dist/server.cjs +2 -2
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/styles.css +352 -158
- package/dist/theme.css +6 -0
- package/dist/utilities.manifest.json +111 -13
- package/package.json +1 -1
- package/scripts/copy-assets.js +1 -0
- package/scripts/generate-viz-runtime.js +95 -0
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Logo/Logo.tsx","../src/components/SideNav/SideNav.tsx","../src/components/TopNav/TopNav.tsx","../src/components/AppShell/AppShell.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Heading/Heading.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Card/Card.tsx","../src/components/Loader/Loader.tsx","../src/utils/index.ts","../src/utils/controlStyles.ts","../src/components/Icon/Icon.tsx","../src/components/Field/Field.tsx","../src/components/Meter/Meter.tsx","../src/components/TextLink/TextLink.tsx","../src/utils/colors.ts","../src/utils/charts.ts"],"names":["Logo","className","showWordmark","width","fill","fillValue","fillClass","logoWidth","logoHeight","jsxs","jsx","SideNav","topItems","bottomItems","logo","showLogo","LinkComponent","mobileMenuId","sidebarCollapseId","isSectionFormat","items","normalizeToSections","renderSection","section","sectionIndex","totalSections","item","renderNavItem","isNested","categoryId","child","linkProps","linkContent","Fragment","index","sections","TopNav","rightContent","showMobileMenu","avatar","showColorModeSwitcher","toggleTheme","isDarkThemeEnabled","actions","AppShell","sideNav","topNav","children","contentPaddingX","contentPaddingY","showSidebarBorder","mainClassName","enableJsEnhancements","Avatar","src","alt","firstName","lastName","fullName","onClick","size","shape","variant","status","bordered","sizeClasses","statusSizeClasses","statusPositionClasses","statusColors","variantColors","shapeClasses","baseClasses","twMerge","initials","first","last","parts","getIcon","iconSize","Users","Building2","User","renderAvatar","badgeVariantStyles","badgeSizeStyles","badgeShapeStyles","dotSizeStyles","Badge","dot","dotPosition","dotElement","sizeVariants","heightVariants","Heading","Tag","height","heightClasses","Skeleton","animation","gradient","flex","stack","responsive","delay","adjustAnimationSpeedBasedOnWidth","ariaLabel","dataTestId","visible","setVisible","useState","useEffect","timer","animationSpeed","numWidth","animationClasses","layoutClasses","responsiveStyles","breakpoint","value","lineWidth","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","isLoading","CardHeader","title","subtitle","CardMedia","aspectRatio","CardContent","CardFooter","align","Loader","color","composeTailwindRenderProps","tw","composeRenderProps","controlStyles","sizePresets","Icon","memo","name","weight","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","IconWithContainer","containerSize","containerClassName","ref","resolvedContainerSize","containerClasses","Label","tooltip","isRequired","htmlFor","sizeStyles","Meter","label","showWarningIndicator","warningThreshold","styles","AriaMeter","percentage","valueText","isWarning","effectiveVariant","getAutomaticVariant","AlertTriangle","getMeterColor","TextLink","href","external","asButton","onPress","showArrow","externalProps","combinedClasses","content","colorCache","getResolvedColor","variableName","fallback","varName","root","tempElement","resolvedColor","error","clearColorCache","getThemeCategoricalColors","colors","i","getDefaultColors","getDefaultChartColor","createCategoryColorMap","categories","customColors","colorMap","themeColors","category","isLightColor","rgb","r","g","b","getContrastingTextColor","backgroundColor","defaultMargin","getYFormatSettings","formatType","currencySymbol","safeFormat","formatter","v","units","unitIndex","val","suffixes","v2","createXScale","data","dateExtent","extent","d","scaleTime","createYScale","yFormatSettings","dataYMin","min","dataYMax","max","yMin","yMax","scaleLinear"],"mappings":"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","file":"server.cjs","sourcesContent":["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","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 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 { 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","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\";\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\";\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","\"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","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","/**\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","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Logo/Logo.tsx","../src/components/SideNav/SideNav.tsx","../src/components/TopNav/TopNav.tsx","../src/components/AppShell/AppShell.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Badge/Badge.tsx","../src/components/Heading/Heading.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Card/Card.tsx","../src/components/Loader/Loader.tsx","../src/utils/colors.ts","../src/utils/index.ts","../src/utils/controlStyles.ts","../src/components/Icon/Icon.tsx","../src/components/Field/Field.tsx","../src/components/Meter/Meter.tsx","../src/components/TextLink/TextLink.tsx","../src/utils/charts.ts"],"names":["Logo","className","showWordmark","width","fill","fillValue","fillClass","logoWidth","logoHeight","jsxs","jsx","SideNav","topItems","bottomItems","logo","showLogo","LinkComponent","mobileMenuId","sidebarCollapseId","isSectionFormat","items","normalizeToSections","renderSection","section","sectionIndex","totalSections","item","renderNavItem","isNested","categoryId","child","linkProps","linkContent","Fragment","index","sections","TopNav","rightContent","showMobileMenu","avatar","showColorModeSwitcher","toggleTheme","isDarkThemeEnabled","actions","AppShell","sideNav","topNav","children","contentPaddingX","contentPaddingY","showSidebarBorder","mainClassName","enableJsEnhancements","Avatar","src","alt","firstName","lastName","fullName","onClick","size","shape","variant","status","bordered","sizeClasses","statusSizeClasses","statusPositionClasses","statusColors","variantColors","shapeClasses","baseClasses","twMerge","initials","first","last","parts","getIcon","iconSize","Users","Building2","User","renderAvatar","badgeVariantStyles","badgeSizeStyles","badgeShapeStyles","dotSizeStyles","Badge","dot","dotPosition","dotElement","sizeVariants","heightVariants","Heading","Tag","height","heightClasses","Skeleton","animation","gradient","flex","stack","responsive","delay","adjustAnimationSpeedBasedOnWidth","ariaLabel","dataTestId","visible","setVisible","useState","useEffect","timer","animationSpeed","numWidth","animationClasses","layoutClasses","responsiveStyles","breakpoint","value","lineWidth","cardVariantStyles","cardBaseStyles","aspectRatioStyles","footerAlignStyles","Card","isLoading","CardHeader","title","subtitle","CardMedia","aspectRatio","CardContent","CardFooter","align","Loader","color","colorCache","getResolvedColor","variableName","fallback","varName","root","tempElement","resolvedColor","error","clearColorCache","getThemeCategoricalColors","colors","i","getDefaultColors","getDefaultChartColor","createCategoryColorMap","categories","customColors","colorMap","themeColors","category","isLightColor","rgb","r","g","b","getContrastingTextColor","backgroundColor","composeTailwindRenderProps","tw","composeRenderProps","controlStyles","sizePresets","Icon","memo","name","weight","props","IconComponent","PhosphorIcons","resolvedSize","iconClassName","IconWithContainer","containerSize","containerClassName","ref","resolvedContainerSize","containerClasses","Label","tooltip","isRequired","htmlFor","sizeStyles","Meter","label","showWarningIndicator","warningThreshold","styles","AriaMeter","percentage","valueText","isWarning","effectiveVariant","getAutomaticVariant","AlertTriangle","getMeterColor","TextLink","href","external","asButton","onPress","showArrow","externalProps","combinedClasses","content","defaultMargin","getYFormatSettings","formatType","currencySymbol","safeFormat","formatter","v","units","unitIndex","val","suffixes","v2","createXScale","data","dateExtent","extent","d","scaleTime","createYScale","yFormatSettings","dataYMin","min","dataYMax","max","yMin","yMax","scaleLinear"],"mappings":"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","file":"server.cjs","sourcesContent":["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-6 lg:px-10\",\n contentPaddingY = \"py-6 lg:py-10\",\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 type=\"checkbox\" id={sidebarCollapseId} className=\"sr-only peer/sidebar\" aria-hidden=\"true\" />\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].filter(Boolean).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 type=\"checkbox\" id={mobileMenuId} className=\"sr-only peer/mobile\" aria-hidden=\"true\" />\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 {...sideNav} mobileMenuId={mobileMenuId} sidebarCollapseId={sidebarCollapseId} className=\"h-full\" />\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","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 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 { 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","/**\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 * Type for Mapbox GL JS expressions\n * Represents nested array structures used by Mapbox for data-driven styling\n */\ntype MapboxExpression = string | number | boolean | Array<string | number | boolean | MapboxExpression>;\n\n/**\n * Resolves a CSS variable to its computed color value\n * Supports multiple formats and automatically adds the color- prefix if needed\n *\n * @param variableName - CSS variable name in any of these formats:\n * - \"brand-primary\" → resolves to --color-brand-primary\n * - \"color-brand-primary\" → resolves to --color-brand-primary\n * - \"--color-brand-primary\" → used as-is\n * - \"var(--color-brand-primary)\" → unwrapped and used\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 let varName = variableName.startsWith(\"var(\")\n ? variableName.slice(4, -1)\n : variableName.startsWith(\"--\")\n ? variableName\n : `--${variableName}`;\n\n // Add color- prefix ONLY for shorthand forms without the -- prefix\n // This allows \"brand-primary\" to resolve to \"--color-brand-primary\"\n // but preserves exact variable names like \"--text-body\" or \"--neutral-white\"\n if (!variableName.startsWith(\"--\") && !variableName.startsWith(\"var(\") && !varName.startsWith(\"--color-\")) {\n varName = `--color-${varName.slice(2)}`;\n }\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 body element (where theme classes are applied)\n // This ensures we pick up theme-specific variables like .theme-dark\n const root = document.body || 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-viz-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-viz-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 * 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-viz-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\n/**\n * Extracts unique values for a given property from GeoJSON FeatureCollection\n *\n * @param data - GeoJSON FeatureCollection or Feature\n * @param property - Property name to extract values from\n * @returns Array of unique values, sorted\n * @throws Warning if data structure is invalid\n */\nexport const extractUniqueValues = (\n data: GeoJSON.FeatureCollection | GeoJSON.Feature,\n property: string,\n): (string | number)[] => {\n // Validate data structure\n if (!data || typeof data !== \"object\") {\n console.warn(\"[Colors] Invalid GeoJSON data provided to extractUniqueValues\");\n return [];\n }\n\n // Validate it's GeoJSON\n if (!(\"type\" in data) || (data.type !== \"FeatureCollection\" && data.type !== \"Feature\")) {\n console.warn(\"[Colors] Data is not valid GeoJSON (missing type or invalid type)\");\n return [];\n }\n\n const values = new Set<string | number>();\n\n // Get features array\n const features = \"features\" in data ? data.features : [data];\n\n // Validate features exist\n if (!Array.isArray(features) || features.length === 0) {\n console.warn(`[Colors] No features found in GeoJSON data`);\n return [];\n }\n\n // Extract values\n let propertyFoundCount = 0;\n features.forEach((feature) => {\n if (!feature || typeof feature !== \"object\") {\n return; // Skip invalid features\n }\n\n if (feature.properties && property in feature.properties) {\n propertyFoundCount++;\n const value = feature.properties[property];\n if (value !== null && value !== undefined) {\n values.add(value);\n }\n }\n });\n\n // Warn if property wasn't found on any features\n if (propertyFoundCount === 0) {\n console.warn(\n `[Colors] Property \"${property}\" not found on any features. Available properties: ${\n features[0]?.properties ? Object.keys(features[0].properties).join(\", \") : \"none\"\n }`,\n );\n }\n\n return Array.from(values).sort();\n};\n\n/**\n * Maps unique values to categorical colors with looping\n *\n * @param values - Array of unique values to map\n * @returns Map of value to color (hex string)\n */\nexport const mapValuesToCategoricalColors = (values: (string | number)[]): Record<string | number, string> => {\n const colors = getThemeCategoricalColors();\n const mapping: Record<string | number, string> = {};\n\n values.forEach((value, index) => {\n // Loop through colors if we have more values than colors\n mapping[value] = colors[index % colors.length];\n });\n\n return mapping;\n};\n\n/**\n * Creates a categorical color mapping for use with vector layers or explicit mappings\n *\n * This is a helper for cases where categorical auto-assignment doesn't work:\n * - Vector tile layers (data not accessible at render time)\n * - URL-based GeoJSON layers\n * - Custom pin layers\n *\n * @param property - The property name to color by (e.g., \"type\", \"category\")\n * @param values - Array of known values for this property\n * @returns ColorSpec with explicit mapping\n *\n * @example\n * // Vector layer with categorical coloring\n * layer.vector({\n * tileset: \"mapbox://my-tileset\",\n * sourceLayer: \"buildings\",\n * style: {\n * color: createCategoricalMapping(\"type\", [\"residential\", \"commercial\", \"industrial\"])\n * }\n * })\n *\n * @example\n * // With custom colors for specific values\n * const mapping = createCategoricalMapping(\"status\", [\"active\", \"pending\", \"inactive\"]);\n * // Then override specific colors if needed:\n * mapping.mapping.inactive = { hex: \"#cccccc\" };\n */\nexport const createCategoricalMapping = (\n property: string,\n values: (string | number)[],\n): { by: string; mapping: Record<string, { hex: string }> } => {\n const colorMap = mapValuesToCategoricalColors(values);\n\n const mapping: Record<string, { hex: string }> = {};\n Object.entries(colorMap).forEach(([value, color]) => {\n mapping[value] = { hex: color };\n });\n\n return {\n by: property,\n mapping,\n };\n};\n\n// ============================================================================\n// Sequential & Diverging Palette Utilities (Phase 2)\n// ============================================================================\n\n/**\n * Extract numeric values from GeoJSON data for sequential/diverging palettes\n *\n * @param data - GeoJSON FeatureCollection or Feature\n * @param property - Property name to extract values from\n * @returns Sorted array of numeric values\n */\nexport const extractNumericValues = (data: GeoJSON.FeatureCollection | GeoJSON.Feature, property: string): number[] => {\n if (!data || typeof data !== \"object\") {\n console.warn(\"[Colors] Invalid GeoJSON data provided to extractNumericValues\");\n return [];\n }\n\n if (!(\"type\" in data) || (data.type !== \"FeatureCollection\" && data.type !== \"Feature\")) {\n console.warn(\"[Colors] Data is not valid GeoJSON (missing type or invalid type)\");\n return [];\n }\n\n const features = \"features\" in data ? data.features : [data];\n\n if (!Array.isArray(features) || features.length === 0) {\n console.warn(`[Colors] No features found in GeoJSON data`);\n return [];\n }\n\n const values = new Set<number>();\n let propertyFoundCount = 0;\n\n features.forEach((feature) => {\n if (!feature || typeof feature !== \"object\") {\n return;\n }\n\n if (feature.properties && property in feature.properties) {\n propertyFoundCount++;\n const value = feature.properties[property];\n\n // Only accept actual numbers\n if (typeof value === \"number\" && !isNaN(value)) {\n values.add(value);\n }\n }\n });\n\n if (propertyFoundCount === 0) {\n console.warn(\n `[Colors] Property \"${property}\" not found on any features. Available properties: ${\n features[0]?.properties ? Object.keys(features[0].properties).join(\", \") : \"none\"\n }`,\n );\n }\n\n return Array.from(values).sort((a, b) => a - b);\n};\n\n/**\n * Calculate min and max bounds from numeric values\n *\n * @param values - Sorted array of numeric values\n * @returns Object with min and max, or {min: 0, max: 1} if empty\n */\nexport const calculateBounds = (values: number[]): { min: number; max: number } => {\n if (values.length === 0) {\n console.warn(\"[Colors] Cannot calculate bounds from empty array\");\n return { min: 0, max: 1 };\n }\n\n return {\n min: values[0],\n max: values[values.length - 1],\n };\n};\n\n/**\n * Calculate center point for diverging palettes\n *\n * @param values - Sorted array of numeric values\n * @param method - \"median\", \"mean\", or explicit number\n * @returns Center value\n */\nexport const calculateCenter = (values: number[], method: \"median\" | \"mean\" | number): number => {\n // Explicit number provided\n if (typeof method === \"number\") {\n return method;\n }\n\n if (values.length === 0) {\n console.warn(\"[Colors] Cannot calculate center from empty array, defaulting to 0\");\n return 0;\n }\n\n if (method === \"median\") {\n const mid = Math.floor(values.length / 2);\n return values.length % 2 === 0 ? (values[mid - 1] + values[mid]) / 2 : values[mid];\n }\n\n // method === \"mean\"\n return values.reduce((sum, v) => sum + v, 0) / values.length;\n};\n\n/**\n * Get colors for a specific sequential palette\n *\n * @param scheme - Sequential palette name (defaults to \"viridis\")\n * @returns Array of 10 hex color strings\n */\nexport const getSequentialColors = (scheme: string = \"viridis\"): string[] => {\n const prefix = `viz-sequential-${scheme}`;\n const colors: string[] = [];\n\n // Each sequential palette has 10 colors (1-10)\n for (let i = 1; i <= 10; i++) {\n const cssVar = `${prefix}-${i}`;\n const resolved = getResolvedColor(cssVar);\n colors.push(resolved);\n }\n\n return colors;\n};\n\n/**\n * Get colors for a specific diverging palette\n *\n * @param scheme - Diverging palette name (defaults to \"redYellowBlue\")\n * @returns Array of 10 hex color strings (color 5 is the center)\n */\nexport const getDivergingColors = (scheme: string = \"redYellowBlue\"): string[] => {\n // Convert camelCase to kebab-case\n const paletteMap: Record<string, string> = {\n orangeYellowSeafoam: \"orange-yellow-seafoam\",\n redYellowBlue: \"red-yellow-blue\",\n redBlue: \"red-blue\",\n };\n\n const kebabName = paletteMap[scheme] || scheme;\n const prefix = `viz-diverging-${kebabName}`;\n const colors: string[] = [];\n\n // Each diverging palette has 10 colors (1-10), with 5 being the center\n for (let i = 1; i <= 10; i++) {\n const cssVar = `${prefix}-${i}`;\n const resolved = getResolvedColor(cssVar);\n colors.push(resolved);\n }\n\n return colors;\n};\n\n/**\n * Creates a sequential color mapping for vector layers or manual bounds\n *\n * Use this helper when categorical auto-assignment doesn't work:\n * - Vector tile layers (data not accessible at render time)\n * - URL-based GeoJSON layers\n * - When you want consistent colors across multiple maps\n *\n * @param property - The property name to color by\n * @param bounds - Min and max values for the scale\n * @param scheme - Sequential palette name (defaults to \"viridis\")\n * @returns Mapbox interpolate expression\n *\n * @example\n * // Vector layer with sequential coloring\n * layer.vector({\n * tileset: \"mapbox://my-tileset\",\n * sourceLayer: \"population\",\n * style: {\n * color: createSequentialMapping(\"density\", { min: 0, max: 100000 }, \"magma\")\n * }\n * })\n */\nexport const createSequentialMapping = (\n property: string,\n bounds: { min: number; max: number },\n scheme: string = \"viridis\",\n): MapboxExpression => {\n const colors = getSequentialColors(scheme);\n const expr: MapboxExpression = [\"interpolate\", [\"linear\"], [\"get\", property]];\n\n colors.forEach((color, i) => {\n const t = i / (colors.length - 1); // 0 to 1\n const value = bounds.min + t * (bounds.max - bounds.min);\n expr.push(value, color);\n });\n\n return expr;\n};\n\n/**\n * Creates a diverging color mapping for vector layers or manual bounds\n *\n * Use this helper when categorical auto-assignment doesn't work:\n * - Vector tile layers (data not accessible at render time)\n * - URL-based GeoJSON layers\n * - When you want consistent colors across multiple maps\n *\n * @param property - The property name to color by\n * @param bounds - Min and max values for the scale\n * @param center - The center point (e.g., 0 for average, sea level, break-even)\n * @param scheme - Diverging palette name (defaults to \"redYellowBlue\")\n * @returns Mapbox interpolate expression\n *\n * @example\n * // Vector layer with diverging coloring\n * layer.vector({\n * tileset: \"mapbox://my-tileset\",\n * sourceLayer: \"temperature\",\n * style: {\n * color: createDivergingMapping(\"temp_anomaly\", { min: -10, max: 10 }, 0, \"orangeYellowSeafoam\")\n * }\n * })\n */\nexport const createDivergingMapping = (\n property: string,\n bounds: { min: number; max: number },\n center: number,\n scheme: string = \"redYellowBlue\",\n): MapboxExpression => {\n const colors = getDivergingColors(scheme);\n const expr: MapboxExpression = [\"interpolate\", [\"linear\"], [\"get\", property]];\n const centerIndex = 4; // 5th color (index 4) is the center\n\n // Colors 1-5: min → center\n for (let i = 0; i <= centerIndex; i++) {\n const t = i / centerIndex; // 0 to 1\n const value = bounds.min + t * (center - bounds.min);\n expr.push(value, colors[i]);\n }\n\n // Colors 6-10: center → max\n for (let i = centerIndex + 1; i < colors.length; i++) {\n const t = (i - centerIndex) / (colors.length - 1 - centerIndex); // 0 to 1\n const value = center + t * (bounds.max - center);\n expr.push(value, colors[i]);\n }\n\n return expr;\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\";\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\";\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","\"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","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","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"]}
|