@principal-ade/code-quality-panels 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mocks/panelContext.d.ts.map +1 -1
- package/dist/panels/QualityHexagonPanel.d.ts.map +1 -1
- package/dist/panels/RepositoryQualityGridPanel.d.ts.map +1 -1
- package/dist/panels/RepositoryQualityGridPanel.stories.d.ts.map +1 -1
- package/dist/panels.bundle.js +138 -334
- package/dist/panels.bundle.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panels.bundle.js","sources":["../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/copy.js","../node_modules/lucide-react/dist/esm/icons/hexagon.js","../node_modules/lucide-react/dist/esm/icons/terminal.js","../node_modules/@principal-ade/industry-theme/dist/esm/index.js","../node_modules/clsx/dist/clsx.mjs","../src/lib/utils.ts","../src/components/QualityHexagon.tsx","../src/components/QualityEmptyState.tsx","../src/panels/QualityHexagonPanel.tsx","../src/components/RepositoryQualityGrid.tsx","../src/panels/RepositoryQualityGridPanel.tsx","../src/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\",\n key: \"yt0hxn\"\n }\n ]\n];\nconst Hexagon = createLucideIcon(\"hexagon\", __iconNode);\n\nexport { __iconNode, Hexagon as default };\n//# sourceMappingURL=hexagon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 19h8\", key: \"baeox8\" }],\n [\"path\", { d: \"m4 17 6-6-6-6\", key: \"1yngyt\" }]\n];\nconst Terminal = createLucideIcon(\"terminal\", __iconNode);\n\nexport { __iconNode, Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","// src/glassmorphismTheme.ts\nvar glassmorphismTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 8, 12, 16, 20, 24, 32, 40],\n shadows: [\n \"none\",\n \"0 8px 32px 0 rgba(31, 38, 135, 0.15)\",\n \"0 12px 40px 0 rgba(31, 38, 135, 0.2)\",\n \"0 16px 48px 0 rgba(31, 38, 135, 0.25)\",\n \"0 20px 56px 0 rgba(31, 38, 135, 0.3)\",\n \"0 24px 64px 0 rgba(31, 38, 135, 0.35)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"rgba(255, 255, 255, 0.95)\",\n background: \"rgba(255, 255, 255, 0.1)\",\n primary: \"rgba(99, 102, 241, 0.9)\",\n secondary: \"rgba(139, 92, 246, 0.9)\",\n accent: \"rgba(236, 72, 153, 0.9)\",\n highlight: \"rgba(99, 102, 241, 0.2)\",\n muted: \"rgba(255, 255, 255, 0.05)\",\n success: \"rgba(34, 197, 94, 0.9)\",\n warning: \"rgba(251, 146, 60, 0.9)\",\n error: \"rgba(239, 68, 68, 0.9)\",\n info: \"rgba(59, 130, 246, 0.9)\",\n border: \"rgba(255, 255, 255, 0.18)\",\n backgroundSecondary: \"rgba(255, 255, 255, 0.15)\",\n backgroundTertiary: \"rgba(255, 255, 255, 0.2)\",\n backgroundLight: \"rgba(255, 255, 255, 0.08)\",\n backgroundHover: \"rgba(255, 255, 255, 0.25)\",\n surface: \"rgba(255, 255, 255, 0.12)\",\n textSecondary: \"rgba(255, 255, 255, 0.8)\",\n textTertiary: \"rgba(255, 255, 255, 0.6)\",\n textMuted: \"rgba(255, 255, 255, 0.5)\",\n highlightBg: \"rgba(251, 191, 36, 0.3)\",\n highlightBorder: \"rgba(251, 191, 36, 0.5)\"\n },\n modes: {\n dark: {\n text: \"rgba(255, 255, 255, 0.95)\",\n background: \"rgba(0, 0, 0, 0.3)\",\n primary: \"rgba(129, 140, 248, 0.9)\",\n secondary: \"rgba(167, 139, 250, 0.9)\",\n accent: \"rgba(244, 114, 182, 0.9)\",\n highlight: \"rgba(129, 140, 248, 0.25)\",\n muted: \"rgba(0, 0, 0, 0.15)\",\n success: \"rgba(74, 222, 128, 0.9)\",\n warning: \"rgba(251, 191, 36, 0.9)\",\n error: \"rgba(248, 113, 113, 0.9)\",\n info: \"rgba(96, 165, 250, 0.9)\",\n border: \"rgba(255, 255, 255, 0.15)\",\n backgroundSecondary: \"rgba(0, 0, 0, 0.4)\",\n backgroundTertiary: \"rgba(0, 0, 0, 0.5)\",\n backgroundLight: \"rgba(0, 0, 0, 0.2)\",\n backgroundHover: \"rgba(255, 255, 255, 0.1)\",\n surface: \"rgba(0, 0, 0, 0.35)\",\n textSecondary: \"rgba(255, 255, 255, 0.8)\",\n textTertiary: \"rgba(255, 255, 255, 0.6)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(251, 191, 36, 0.35)\",\n highlightBorder: \"rgba(251, 191, 36, 0.6)\"\n },\n frosted: {\n text: \"rgba(31, 41, 55, 0.95)\",\n background: \"rgba(255, 255, 255, 0.3)\",\n primary: \"rgba(79, 70, 229, 0.95)\",\n secondary: \"rgba(124, 58, 237, 0.95)\",\n accent: \"rgba(219, 39, 119, 0.95)\",\n highlight: \"rgba(79, 70, 229, 0.15)\",\n muted: \"rgba(255, 255, 255, 0.4)\",\n success: \"rgba(16, 185, 129, 0.95)\",\n warning: \"rgba(245, 158, 11, 0.95)\",\n error: \"rgba(220, 38, 38, 0.95)\",\n info: \"rgba(37, 99, 235, 0.95)\",\n border: \"rgba(255, 255, 255, 0.5)\",\n backgroundSecondary: \"rgba(255, 255, 255, 0.4)\",\n backgroundTertiary: \"rgba(255, 255, 255, 0.5)\",\n backgroundLight: \"rgba(255, 255, 255, 0.25)\",\n backgroundHover: \"rgba(255, 255, 255, 0.6)\",\n surface: \"rgba(255, 255, 255, 0.35)\",\n textSecondary: \"rgba(31, 41, 55, 0.8)\",\n textTertiary: \"rgba(31, 41, 55, 0.6)\",\n textMuted: \"rgba(31, 41, 55, 0.5)\",\n highlightBg: \"rgba(251, 191, 36, 0.4)\",\n highlightBorder: \"rgba(251, 191, 36, 0.7)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"rgba(255, 255, 255, 0.1)\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n \"&:hover\": {\n bg: \"rgba(255, 255, 255, 0.2)\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"transparent\",\n \"&:hover\": {\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n bg: \"rgba(255, 255, 255, 0.05)\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/defaultThemes.ts\nvar defaultMarkdownTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#007acc\",\n secondary: \"#005a9e\",\n accent: \"#1a1a1a\",\n highlight: \"rgba(0, 122, 204, 0.1)\",\n muted: \"#f0f0f0\",\n success: \"#28a745\",\n warning: \"#ffc107\",\n error: \"#dc3545\",\n info: \"#17a2b8\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"rgba(0, 0, 0, 0.03)\",\n backgroundHover: \"rgba(0, 0, 0, 0.05)\",\n surface: \"#ffffff\",\n textSecondary: \"#555555\",\n textTertiary: \"#888888\",\n textMuted: \"#aaaaaa\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar defaultTerminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", Courier, monospace',\n heading: '\"Courier New\", Courier, monospace',\n monospace: '\"Courier New\", Courier, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.4,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.6\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(255, 193, 7, 0.1)\",\n \"0 0 10px rgba(255, 193, 7, 0.15)\",\n \"0 0 15px rgba(255, 193, 7, 0.2)\",\n \"0 0 20px rgba(255, 193, 7, 0.25)\",\n \"0 0 30px rgba(255, 193, 7, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#ffc107\",\n background: \"#000000\",\n primary: \"#ffc107\",\n secondary: \"#ffb300\",\n accent: \"#ffffff\",\n highlight: \"rgba(255, 193, 7, 0.1)\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(255, 193, 7, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(255, 193, 7, 0.03)\",\n backgroundHover: \"rgba(255, 193, 7, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#e0e0e0\",\n textTertiary: \"#b0b0b0\",\n textMuted: \"#808080\",\n highlightBg: \"rgba(255, 193, 7, 0.2)\",\n highlightBorder: \"rgba(255, 193, 7, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar defaultEditorTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 12px 24px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#d4d4d4\",\n background: \"#1e1e1e\",\n primary: \"#569cd6\",\n secondary: \"#408ac9\",\n accent: \"#c586c0\",\n highlight: \"rgba(86, 156, 214, 0.1)\",\n muted: \"#2a2a2a\",\n success: \"#6a9955\",\n warning: \"#d18616\",\n error: \"#f44747\",\n info: \"#569cd6\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"#252526\",\n backgroundTertiary: \"#333333\",\n backgroundLight: \"rgba(255, 255, 255, 0.03)\",\n backgroundHover: \"rgba(255, 255, 255, 0.05)\",\n surface: \"#252526\",\n textSecondary: \"#cccccc\",\n textTertiary: \"#999999\",\n textMuted: \"#666666\",\n highlightBg: \"rgba(255, 235, 59, 0.2)\",\n highlightBorder: \"rgba(255, 235, 59, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\n\n// src/themes.ts\nvar regalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#f1e8dc\",\n background: \"#1a1f2e\",\n primary: \"#d4a574\",\n secondary: \"#e0b584\",\n accent: \"#c9b8a3\",\n highlight: \"rgba(212, 165, 116, 0.15)\",\n muted: \"#8b7968\",\n success: \"#5c8a72\",\n warning: \"#d4a574\",\n error: \"#a85751\",\n info: \"#d4a574\",\n border: \"rgba(212, 165, 116, 0.2)\",\n backgroundSecondary: \"#212738\",\n backgroundTertiary: \"#2d3446\",\n backgroundLight: \"rgba(212, 165, 116, 0.08)\",\n backgroundHover: \"rgba(212, 165, 116, 0.15)\",\n surface: \"#212738\",\n textSecondary: \"#c9b8a3\",\n textTertiary: \"#8b7968\",\n textMuted: \"#8b7968\",\n highlightBg: \"rgba(255, 193, 7, 0.25)\",\n highlightBorder: \"rgba(255, 193, 7, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"background\",\n bg: \"primary\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"muted\",\n \"&:hover\": {\n bg: \"backgroundSecondary\"\n }\n },\n ghost: {\n color: \"primary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"muted\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"background\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar terminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n heading: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n monospace: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px 0 rgba(0, 0, 0, 0.07)\",\n \"0 8px 12px 0 rgba(0, 0, 0, 0.08)\",\n \"0 16px 24px 0 rgba(0, 0, 0, 0.10)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#e4e4e4\",\n background: \"rgba(10, 10, 10, 0.85)\",\n primary: \"#66b3ff\",\n secondary: \"#80c4ff\",\n accent: \"#66ff99\",\n highlight: \"rgba(102, 179, 255, 0.15)\",\n muted: \"rgba(26, 26, 26, 0.8)\",\n success: \"#66ff99\",\n warning: \"#ffcc66\",\n error: \"#ff6666\",\n info: \"#66b3ff\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"rgba(15, 15, 15, 0.9)\",\n backgroundTertiary: \"rgba(20, 20, 20, 0.9)\",\n backgroundLight: \"rgba(255, 255, 255, 0.05)\",\n backgroundHover: \"rgba(102, 179, 255, 0.08)\",\n surface: \"rgba(15, 15, 15, 0.95)\",\n textSecondary: \"rgba(255, 255, 255, 0.7)\",\n textTertiary: \"rgba(255, 255, 255, 0.5)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n modes: {\n light: {\n text: \"#1a1a1a\",\n background: \"rgba(255, 255, 255, 0.9)\",\n primary: \"#0066cc\",\n secondary: \"#0052a3\",\n accent: \"#00cc88\",\n highlight: \"rgba(0, 102, 204, 0.08)\",\n muted: \"rgba(245, 245, 245, 0.8)\",\n success: \"#00cc88\",\n warning: \"#ffaa00\",\n error: \"#ff3333\",\n info: \"#0066cc\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"rgba(250, 250, 250, 0.9)\",\n backgroundTertiary: \"rgba(245, 245, 245, 0.9)\",\n backgroundLight: \"rgba(0, 0, 0, 0.02)\",\n backgroundHover: \"rgba(0, 102, 204, 0.04)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\n textSecondary: \"rgba(0, 0, 0, 0.6)\",\n textTertiary: \"rgba(0, 0, 0, 0.4)\",\n textMuted: \"rgba(0, 0, 0, 0.3)\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\nvar matrixTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(0, 216, 53, 0.15)\",\n \"0 0 10px rgba(0, 216, 53, 0.2)\",\n \"0 0 15px rgba(0, 216, 53, 0.25)\",\n \"0 0 20px rgba(0, 216, 53, 0.3)\",\n \"0 0 30px rgba(0, 216, 53, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#00d835\",\n secondary: \"#00a828\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.15)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(0, 216, 53, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(0, 216, 53, 0.03)\",\n backgroundHover: \"rgba(0, 216, 53, 0.08)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.25)\",\n highlightBorder: \"rgba(0, 216, 53, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar matrixMinimalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 0 20px rgba(0, 216, 53, 0.1)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#b8b8b8\",\n secondary: \"#909090\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.1)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(184, 184, 184, 0.1)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(184, 184, 184, 0.02)\",\n backgroundHover: \"rgba(0, 216, 53, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.2)\",\n highlightBorder: \"rgba(0, 216, 53, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar slateTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.2)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.2)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.2)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.25)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#9ca3af\",\n background: \"#1a1c1e\",\n primary: \"#d1d5db\",\n secondary: \"#6b7280\",\n accent: \"#f59e0b\",\n highlight: \"rgba(209, 213, 219, 0.15)\",\n muted: \"#2d3134\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n border: \"rgba(156, 163, 175, 0.15)\",\n backgroundSecondary: \"#22252a\",\n backgroundTertiary: \"#2d3134\",\n backgroundLight: \"rgba(156, 163, 175, 0.05)\",\n backgroundHover: \"rgba(156, 163, 175, 0.1)\",\n surface: \"#1f2124\",\n textSecondary: \"#e5e7eb\",\n textTertiary: \"#6b7280\",\n textMuted: \"#4b5563\",\n highlightBg: \"rgba(245, 158, 11, 0.25)\",\n highlightBorder: \"rgba(245, 158, 11, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#1a1c1e\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#9ca3af\"\n }\n },\n secondary: {\n color: \"#e5e7eb\",\n bg: \"secondary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#4b5563\"\n }\n },\n ghost: {\n color: \"textSecondary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"textSecondary\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textTertiary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/ThemeProvider.tsx\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\n\n// src/themeHelpers.ts\nfunction overrideColors(theme, colors) {\n return {\n ...theme,\n colors: {\n ...theme.colors,\n ...colors\n }\n };\n}\nfunction makeTheme(baseTheme, overrides) {\n return {\n ...baseTheme,\n ...overrides,\n colors: {\n ...baseTheme.colors,\n ...overrides.colors\n },\n fonts: {\n ...baseTheme.fonts,\n ...overrides.fonts\n }\n };\n}\nfunction addMode(theme, modeName, colors, baseMode) {\n let baseColors;\n if (baseMode && theme.modes && theme.modes[baseMode]) {\n baseColors = {\n ...theme.colors,\n ...theme.modes[baseMode]\n };\n } else {\n baseColors = theme.colors;\n }\n const newMode = {\n ...baseColors,\n ...colors\n };\n return {\n ...theme,\n modes: {\n ...theme.modes,\n [modeName]: newMode\n }\n };\n}\nfunction getMode(theme, mode) {\n if (!mode || !theme.modes || !theme.modes[mode]) {\n return theme.colors;\n }\n return {\n ...theme.colors,\n ...theme.modes[mode]\n };\n}\n\n// src/ThemeProvider.tsx\nvar ThemeContext;\nvar getThemeContext = () => {\n if (typeof window !== \"undefined\") {\n const globalWindow = window;\n if (!globalWindow.__principlemd_theme_context__) {\n globalWindow.__principlemd_theme_context__ = createContext(undefined);\n }\n return globalWindow.__principlemd_theme_context__;\n } else {\n if (!ThemeContext) {\n ThemeContext = createContext(undefined);\n }\n return ThemeContext;\n }\n};\nvar ThemeContextSingleton = getThemeContext();\nvar useTheme = () => {\n const context = useContext(ThemeContextSingleton);\n if (!context) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\nvar ThemeProvider = ({\n children,\n theme: customTheme = theme,\n initialMode\n}) => {\n const [mode, setMode] = useState(initialMode);\n const activeTheme = React.useMemo(() => {\n if (!mode || !customTheme.modes || !customTheme.modes[mode]) {\n return customTheme;\n }\n return {\n ...customTheme,\n colors: getMode(customTheme, mode)\n };\n }, [customTheme, mode]);\n useEffect(() => {\n if (!initialMode) {\n const savedMode = localStorage.getItem(\"principlemd-theme-mode\");\n if (savedMode) {\n setMode(savedMode);\n }\n }\n }, [initialMode]);\n useEffect(() => {\n if (mode) {\n localStorage.setItem(\"principlemd-theme-mode\", mode);\n } else {\n localStorage.removeItem(\"principlemd-theme-mode\");\n }\n }, [mode]);\n const value = {\n theme: activeTheme,\n mode,\n setMode\n };\n return /* @__PURE__ */ React.createElement(ThemeContextSingleton.Provider, {\n value\n }, children);\n};\nvar withTheme = (Component) => {\n return (props) => {\n const { theme: theme2 } = useTheme();\n return /* @__PURE__ */ React.createElement(Component, {\n ...props,\n theme: theme2\n });\n };\n};\n// src/utils.ts\nvar getColor = (theme2, colorKey) => {\n const colors = theme2.colors;\n const value = colors[colorKey];\n return typeof value === \"string\" ? value : colorKey;\n};\nvar getSpace = (theme2, index) => {\n return theme2.space[index] || 0;\n};\nvar getFontSize = (theme2, index) => {\n return theme2.fontSizes[index] || theme2.fontSizes[2];\n};\nvar getRadius = (theme2, index) => {\n return theme2.radii[index] || 0;\n};\nvar getShadow = (theme2, index) => {\n return theme2.shadows[index] || \"none\";\n};\nvar getZIndex = (theme2, index) => {\n return theme2.zIndices[index] || 0;\n};\nvar responsive = (values) => {\n return values.reduce((acc, value, index) => {\n if (index === 0) {\n return value;\n }\n return {\n ...acc,\n [`@media screen and (min-width: ${values[index - 1]})`]: value\n };\n }, {});\n};\nvar sx = (styles) => styles;\nvar createStyle = (theme2, styleObj) => {\n const processValue = (value) => {\n if (typeof value === \"string\") {\n if (value in theme2.colors) {\n return getColor(theme2, value);\n }\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (typeof value === \"object\" && value !== null) {\n const processed2 = {};\n for (const [key, val] of Object.entries(value)) {\n processed2[key] = processValue(val);\n }\n return processed2;\n }\n return value;\n };\n const processed = {};\n for (const [key, val] of Object.entries(styleObj)) {\n processed[key] = processValue(val);\n }\n return processed;\n};\nvar mergeThemes = (baseTheme, ...overrides) => {\n return overrides.reduce((theme2, override) => ({\n space: override.space || theme2.space,\n fonts: { ...theme2.fonts, ...override.fonts || {} },\n fontSizes: override.fontSizes || theme2.fontSizes,\n fontWeights: { ...theme2.fontWeights, ...override.fontWeights || {} },\n lineHeights: { ...theme2.lineHeights, ...override.lineHeights || {} },\n breakpoints: override.breakpoints || theme2.breakpoints,\n sizes: override.sizes || theme2.sizes,\n radii: override.radii || theme2.radii,\n shadows: override.shadows || theme2.shadows,\n zIndices: override.zIndices || theme2.zIndices,\n colors: {\n ...theme2.colors,\n ...override.colors || {}\n },\n buttons: { ...theme2.buttons, ...override.buttons || {} },\n text: { ...theme2.text, ...override.text || {} },\n cards: { ...theme2.cards, ...override.cards || {} }\n }), baseTheme);\n};\n// src/ThemeShowcase.tsx\nimport React2 from \"react\";\nvar ThemeShowcase = ({\n theme: theme2,\n title,\n showValues = true,\n sections = [\"colors\", \"typography\", \"spacing\", \"shadows\", \"radii\"]\n}) => {\n const containerStyle = {\n fontFamily: theme2.fonts.body,\n color: theme2.colors.text,\n backgroundColor: theme2.colors.background,\n padding: theme2.space[4],\n minHeight: \"100vh\"\n };\n const sectionStyle = {\n marginBottom: theme2.space[5],\n padding: theme2.space[4],\n backgroundColor: theme2.colors.surface || theme2.colors.backgroundSecondary,\n borderRadius: theme2.radii[2],\n border: `1px solid ${theme2.colors.border}`\n };\n const headingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[5],\n fontWeight: theme2.fontWeights.heading,\n marginBottom: theme2.space[3],\n color: theme2.colors.primary\n };\n const subheadingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[3],\n fontWeight: theme2.fontWeights.medium,\n marginBottom: theme2.space[2],\n marginTop: theme2.space[3],\n color: theme2.colors.text\n };\n return /* @__PURE__ */ React2.createElement(\"div\", {\n style: containerStyle\n }, title && /* @__PURE__ */ React2.createElement(\"h1\", {\n style: {\n ...headingStyle,\n fontSize: theme2.fontSizes[6],\n marginBottom: theme2.space[4]\n }\n }, title), sections.includes(\"colors\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Colors\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Primary Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"text\", \"background\", \"primary\", \"secondary\", \"accent\", \"muted\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Status Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"success\", \"warning\", \"error\", \"info\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Background Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3]\n }\n }, [\"backgroundSecondary\", \"backgroundTertiary\", \"backgroundLight\", \"backgroundHover\", \"surface\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n padding: theme2.space[3],\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary,\n marginTop: theme2.space[1]\n }\n }, color));\n }))), sections.includes(\"typography\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Typography\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Families\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[4],\n marginBottom: theme2.space[2]\n }\n }, \"Heading Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.heading)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[2],\n marginBottom: theme2.space[2]\n }\n }, \"Body Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.body)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[2]\n }\n }, \"Monospace Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.monospace))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Sizes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, theme2.fontSizes.map((size, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: {\n fontSize: size,\n lineHeight: theme2.lineHeights.body,\n marginBottom: theme2.space[1]\n }\n }, \"Size \", index, \": Sample Text \", showValues && `(${size}px)`))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Weights\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: theme2.space[2]\n }\n }, Object.entries(theme2.fontWeights).map(([name, weight]) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: name,\n style: {\n fontWeight: weight,\n fontSize: theme2.fontSizes[2]\n }\n }, name, \" \", showValues && `(${weight})`)))), sections.includes(\"spacing\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Spacing\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: theme2.space[2] }\n }, theme2.space.map((space, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { display: \"flex\", alignItems: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 60,\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"]\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n height: 24,\n width: space,\n backgroundColor: theme2.colors.primary,\n borderRadius: theme2.radii[1]\n }\n }), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n marginLeft: theme2.space[2],\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, space, \"px\"))))), sections.includes(\"radii\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Border Radii\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n gap: theme2.space[3]\n }\n }, theme2.radii.map((radius, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 80,\n height: 80,\n backgroundColor: theme2.colors.primary,\n borderRadius: radius,\n marginBottom: theme2.space[1],\n margin: \"0 auto\"\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"] \", showValues && `${radius}px`))))), sections.includes(\"shadows\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Shadows\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: theme2.space[4]\n }\n }, theme2.shadows.map((shadow, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 100,\n height: 100,\n backgroundColor: theme2.colors.background,\n boxShadow: shadow,\n borderRadius: theme2.radii[2],\n margin: \"0 auto\",\n marginBottom: theme2.space[2],\n border: `1px solid ${theme2.colors.border}`\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"Shadow [\", index, \"]\"), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textMuted,\n marginTop: theme2.space[1]\n }\n }, shadow === \"none\" ? \"none\" : \"...\"))))), theme2.modes && Object.keys(theme2.modes).length > 0 && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Available Modes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"flex\",\n gap: theme2.space[2],\n flexWrap: \"wrap\"\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.primary,\n color: \"#ffffff\",\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, \"default\"), Object.keys(theme2.modes).map((modeName) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: modeName,\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.secondary,\n color: theme2.colors.text,\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, modeName)))));\n};\n\n// src/index.ts\nvar theme = terminalTheme;\nfunction scaleThemeFonts(theme2, scale) {\n const currentScale = theme2.fontScale || 1;\n const effectiveScale = scale / currentScale;\n return {\n ...theme2,\n fontSizes: theme2.fontSizes.map((size) => Math.round(size * effectiveScale)),\n fontScale: scale\n };\n}\nfunction increaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.min(currentScale * 1.1, 2);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction decreaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.max(currentScale * 0.9, 0.5);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction resetFontScale(theme2) {\n return scaleThemeFonts(theme2, 1);\n}\nvar src_default = theme;\nexport {\n withTheme,\n useTheme,\n theme,\n terminalTheme,\n sx,\n slateTheme,\n scaleThemeFonts,\n responsive,\n resetFontScale,\n regalTheme,\n overrideColors,\n mergeThemes,\n matrixTheme,\n matrixMinimalTheme,\n makeTheme,\n increaseFontScale,\n glassmorphismTheme,\n getZIndex,\n getSpace,\n getShadow,\n getRadius,\n getMode,\n getFontSize,\n getColor,\n defaultTerminalTheme,\n defaultMarkdownTheme,\n defaultEditorTheme,\n src_default as default,\n decreaseFontScale,\n createStyle,\n addMode,\n ThemeShowcase,\n ThemeProvider\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport type { Theme } from '@principal-ade/industry-theme';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\n\nexport type { QualityMetrics };\nexport type QualityTier = 'none' | 'bronze' | 'silver' | 'gold' | 'platinum';\nexport type MetricKey = 'types' | 'documentation' | 'tests' | 'deadCode' | 'formatting' | 'linting';\n\nexport interface VertexHoverInfo {\n key: MetricKey;\n label: string;\n value: number;\n color: string;\n}\n\ninterface QualityHexagonProps {\n metrics: QualityMetrics;\n tier: QualityTier;\n theme: Theme;\n showLabels?: boolean;\n showValues?: boolean;\n className?: string;\n onVertexHover?: (info: VertexHoverInfo) => void;\n onVertexLeave?: () => void;\n onVertexClick?: (info: VertexHoverInfo) => void;\n}\n\n// Helper to extract theme colors\nfunction getThemeColors(theme: Theme) {\n return {\n gridColor: theme.colors.border,\n axisColor: theme.colors.muted,\n textColor: theme.colors.text,\n scoreColor: theme.colors.text,\n tierColors: {\n none: { fill: theme.colors.muted, stroke: theme.colors.border, bg: theme.colors.backgroundLight },\n bronze: { fill: theme.colors.warning, stroke: theme.colors.warning, bg: theme.colors.backgroundLight },\n silver: { fill: theme.colors.secondary, stroke: theme.colors.secondary, bg: theme.colors.backgroundLight },\n gold: { fill: theme.colors.accent, stroke: theme.colors.accent, bg: theme.colors.backgroundLight },\n platinum: { fill: theme.colors.primary, stroke: theme.colors.primary, bg: theme.colors.backgroundLight }\n },\n metricColors: {\n types: theme.colors.warning,\n documentation: theme.colors.info,\n tests: theme.colors.success,\n deadCode: theme.colors.error,\n formatting: theme.colors.accent,\n linting: theme.colors.primary\n },\n qualityIndicators: {\n good: theme.colors.success,\n medium: theme.colors.warning,\n poor: theme.colors.error\n }\n };\n}\n\n// Metrics ordered clockwise from top-left\nconst getMetricConfig = (themeColors: ReturnType<typeof getThemeColors>) => [\n { key: 'types', label: 'Types', color: themeColors.metricColors.types, angle: -120 },\n { key: 'documentation', label: 'Docs', color: themeColors.metricColors.documentation, angle: -60 },\n { key: 'tests', label: 'Tests', color: themeColors.metricColors.tests, angle: 0 },\n { key: 'deadCode', label: 'Dead Code', color: themeColors.metricColors.deadCode, angle: 60 },\n { key: 'formatting', label: 'Format', color: themeColors.metricColors.formatting, angle: 120 },\n { key: 'linting', label: 'Linting', color: themeColors.metricColors.linting, angle: 180 }\n] as const;\n\nfunction calculateHexagonPoints(center: number, radius: number, metricConfig: ReturnType<typeof getMetricConfig>): string {\n return metricConfig\n .map(({ angle }) => {\n const radian = (angle * Math.PI) / 180;\n const x = center + radius * Math.cos(radian);\n const y = center + radius * Math.sin(radian);\n return `${x},${y}`;\n })\n .join(' ');\n}\n\nfunction calculateMetricPoint(\n center: number,\n radius: number,\n angle: number,\n value: number\n): { x: number; y: number } {\n const actualRadius = (radius * value) / 100;\n const radian = (angle * Math.PI) / 180;\n return {\n x: center + actualRadius * Math.cos(radian),\n y: center + actualRadius * Math.sin(radian)\n };\n}\n\nexport function QualityHexagon({\n metrics,\n tier,\n theme,\n showLabels = false,\n showValues = false,\n className,\n onVertexHover,\n onVertexLeave,\n onVertexClick,\n}: QualityHexagonProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n // Use fixed internal coordinates for viewBox\n const viewBoxSize = 300;\n const center = viewBoxSize / 2;\n const radius = viewBoxSize * 0.28;\n const padding = viewBoxSize * 0.1;\n const fontSize = viewBoxSize * 0.04;\n const strokeWidth = viewBoxSize * 0.008;\n const dotSize = viewBoxSize * 0.015;\n\n const hexagonPoints = calculateHexagonPoints(center, radius, metricConfig);\n\n const dataPoints = metricConfig\n .map(({ key, angle }) => {\n let value = metrics[key as keyof QualityMetrics];\n // Invert dead code metric (less is better)\n if (key === 'deadCode') {\n value = 100 - value;\n }\n return calculateMetricPoint(center, radius, angle, value);\n })\n .map(p => `${p.x},${p.y}`)\n .join(' ');\n\n // Calculate average with inverted dead code\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n const averageScore = Math.round(\n Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6\n );\n\n const hexagon = (\n <svg\n viewBox={`0 0 ${viewBoxSize} ${viewBoxSize}`}\n className={cn('w-full h-full transition-all duration-300', className)}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {/* Grid lines */}\n <g className=\"opacity-20\">\n {[20, 40, 60, 80, 100].map((percent) => (\n <polygon\n key={percent}\n points={calculateHexagonPoints(center, (radius * percent) / 100, metricConfig)}\n fill=\"none\"\n stroke={themeColors.gridColor}\n strokeWidth={0.5}\n style={{ opacity: 0.4 }}\n />\n ))}\n </g>\n\n {/* Axes */}\n {metricConfig.map(({ angle }) => {\n const endPoint = calculateMetricPoint(center, radius, angle, 100);\n return (\n <line\n key={angle}\n x1={center}\n y1={center}\n x2={endPoint.x}\n y2={endPoint.y}\n stroke={themeColors.axisColor}\n strokeWidth={0.5}\n style={{ opacity: 0.5 }}\n />\n );\n })}\n\n {/* Outer hexagon */}\n <polygon\n points={hexagonPoints}\n fill=\"none\"\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ opacity: 0.3 }}\n />\n\n {/* Data polygon */}\n <polygon\n points={dataPoints}\n fill={colors.fill}\n fillOpacity={0.3}\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ transition: 'all 0.5s ease' }}\n />\n\n {/* Vertex dots */}\n {metricConfig.map(({ key, label, color, angle }) => {\n const rawValue = metrics[key as keyof QualityMetrics];\n let value = rawValue;\n // Invert dead code metric for display\n if (key === 'deadCode') {\n value = 100 - value;\n }\n const point = calculateMetricPoint(center, radius, angle, 100);\n const dataPoint = calculateMetricPoint(center, radius, angle, value);\n\n const vertexInfo: VertexHoverInfo = {\n key: key as MetricKey,\n label,\n value: rawValue,\n color,\n };\n\n const handleMouseEnter = () => {\n onVertexHover?.(vertexInfo);\n };\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onVertexClick?.(vertexInfo);\n };\n\n return (\n <g\n key={key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onVertexLeave}\n onClick={handleClick}\n style={{ cursor: (onVertexHover || onVertexClick) ? 'pointer' : 'default' }}\n >\n {/* Larger invisible hit area for easier hovering */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize * 2.5}\n fill=\"transparent\"\n />\n {/* Outer vertex marker */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize}\n fill=\"white\"\n stroke={colors.stroke}\n strokeWidth={1.5}\n />\n {/* Value indicator */}\n <circle\n cx={dataPoint.x}\n cy={dataPoint.y}\n r={dotSize * 0.7}\n fill={colors.fill}\n stroke={colors.stroke}\n strokeWidth={1}\n style={{ opacity: 0.9 }}\n />\n </g>\n );\n })}\n\n {/* Center score */}\n <text\n x={center}\n y={center}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.scoreColor}\n fontSize={fontSize * 1.5}\n fontWeight=\"600\"\n >\n {averageScore}\n </text>\n <text\n x={center}\n y={center + fontSize}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize * 0.8}\n style={{ opacity: 0.6 }}\n >\n avg\n </text>\n\n {/* Labels */}\n {showLabels && (\n <>\n {metricConfig.map(({ key, label, angle }) => {\n const labelRadius = radius + padding * 1.2;\n const point = calculateMetricPoint(center, labelRadius, angle, 100);\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <text\n key={key}\n x={point.x}\n y={point.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize}\n >\n {showValues ? `${value}%` : label}\n </text>\n );\n })}\n </>\n )}\n </svg>\n );\n\n // For non-interactive mode or when tooltips are not available, just return the hexagon\n return hexagon;\n}\n\nexport function QualityHexagonCompact({\n metrics,\n tier,\n theme,\n className\n}: Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'>) {\n return (\n <div className={cn('w-20 h-20', className)}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={false}\n showValues={false}\n />\n </div>\n );\n}\n\ninterface QualityHexagonDetailedProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n}\n\nexport function QualityHexagonDetailed({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n onRefresh,\n isRefreshing = false,\n}: QualityHexagonDetailedProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n\n const hasHeader = packageName || onRefresh;\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: colors.bg,\n }}\n >\n {hasHeader && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 24,\n }}>\n <div style={{ flex: '1 1 200px', maxWidth: 300, aspectRatio: '1 / 1' }}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={true}\n showValues={false}\n />\n </div>\n\n <div style={{ flex: '1 1 200px', minWidth: 200, display: 'flex', flexDirection: 'column', gap: 8, padding: '8px 24px' }}>\n {metricConfig.map(({ key, label, color }) => {\n const value = metrics[key as keyof QualityMetrics];\n const displayValue = value;\n\n return (\n <div key={key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: color,\n }}>\n {displayValue}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\ninterface QualityHexagonExpandableProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n defaultExpanded?: boolean;\n}\n\nexport function QualityHexagonExpandable({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n onRefresh,\n isRefreshing = false,\n defaultExpanded = false,\n}: QualityHexagonExpandableProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n\n const hasHeader = packageName || onRefresh;\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: colors.bg,\n flex: '1 1 200px',\n }}\n >\n {hasHeader && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Clickable hexagon */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <div style={{ width: 200, height: 200 }}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={true}\n showValues={false}\n />\n </div>\n </div>\n\n {/* Expandable metrics breakdown */}\n <div\n style={{\n display: 'grid',\n gridTemplateRows: expanded ? '1fr' : '0fr',\n transition: 'grid-template-rows 0.3s ease',\n }}\n >\n <div style={{ overflow: 'hidden' }}>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: '8px 24px',\n borderTop: `1px solid ${theme.colors.border}`,\n marginTop: 8,\n }}>\n {metricConfig.map(({ key, label, color }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div key={key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: color,\n }}>\n {value}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Expand/collapse indicator */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n display: 'flex',\n justifyContent: 'center',\n cursor: 'pointer',\n padding: 4,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.3s ease',\n }}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n );\n}\n\n/**\n * Calculate the quality tier based on metrics\n */\nexport function calculateQualityTier(metrics: QualityMetrics): QualityTier {\n // Invert dead code for calculation (less is better)\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n\n const average = Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6;\n\n if (average >= 90) return 'platinum';\n if (average >= 75) return 'gold';\n if (average >= 60) return 'silver';\n if (average >= 40) return 'bronze';\n return 'none';\n}\n","import React from 'react';\nimport { Terminal, Copy, Check, ChevronRight } from 'lucide-react';\nimport type { Theme } from '@principal-ade/industry-theme';\n\ninterface QualityEmptyStateProps {\n theme: Theme;\n hasWorkflow: boolean;\n}\n\nconst WORKFLOW_FILE_PATH = '.github/workflows/quality-lens.yml';\n\n/**\n * Check if a file path exists in a FileTree's allFiles array\n */\nexport function checkFileExistsInTree(\n treeData: { allFiles?: Array<{ relativePath?: string; path?: string }> } | undefined,\n targetPath: string\n): boolean {\n if (!treeData?.allFiles) return false;\n\n const normalizedTarget = targetPath.replace(/^\\//, '').toLowerCase();\n\n return treeData.allFiles.some((file) => {\n const filePath = (file.relativePath || file.path || '').toLowerCase();\n return filePath.endsWith(normalizedTarget) || filePath === normalizedTarget;\n });\n}\n\n/**\n * Copyable command line component\n */\nconst CommandLine: React.FC<{\n command: string;\n theme: Theme;\n}> = ({ command, theme }) => {\n const [copied, setCopied] = React.useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n console.log('Copy:', command);\n }\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '10px 14px',\n borderRadius: 6,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n fontFamily: 'monospace',\n fontSize: 13,\n }}\n >\n <code style={{ color: theme.colors.text }}>{command}</code>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 4,\n border: 'none',\n backgroundColor: 'transparent',\n color: theme.colors.textMuted,\n cursor: 'pointer',\n }}\n title=\"Copy command\"\n >\n {copied ? (\n <Check size={16} color={theme.colors.success} />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n );\n};\n\n/**\n * Empty state component for when no quality data is available\n */\nexport const QualityEmptyState: React.FC<QualityEmptyStateProps> = ({\n theme,\n hasWorkflow,\n}) => {\n if (hasWorkflow) {\n // Workflow exists but no data yet\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: '16px 0',\n gap: 16,\n width: '100%',\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 14,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Quality metrics will appear here after your next CI run completes.\n </p>\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 14px',\n borderRadius: 6,\n backgroundColor: `${theme.colors.success}15`,\n color: theme.colors.success,\n fontSize: 13,\n }}\n >\n <Check size={16} />\n <span>Workflow detected at {WORKFLOW_FILE_PATH}</span>\n </div>\n </div>\n );\n }\n\n // No workflow - show CLI setup instructions\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: '16px 0',\n gap: 16,\n width: '100%',\n }}\n >\n {/* Description */}\n <p\n style={{\n margin: 0,\n fontSize: 14,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Track your code quality with automated analysis of tests, linting,\n types, formatting, dead code, and documentation.\n </p>\n\n {/* CLI Setup Steps */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n padding: 20,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n marginBottom: 4,\n }}\n >\n <Terminal size={20} color={theme.colors.text} />\n <h4\n style={{\n margin: 0,\n fontSize: 15,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Get Started\n </h4>\n </div>\n\n {/* Step 1 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 1\n </span>\n <span>Install the CLI</span>\n </div>\n <CommandLine\n command=\"npm install -g @principal-ai/quality-lens-cli\"\n theme={theme}\n />\n </div>\n\n {/* Step 2 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 2\n </span>\n <span>Check what quality tools are available</span>\n </div>\n <CommandLine command=\"quality-lens list\" theme={theme} />\n </div>\n\n {/* Step 3 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 3\n </span>\n <span>Set up the GitHub Action</span>\n </div>\n <CommandLine command=\"quality-lens init\" theme={theme} />\n </div>\n\n {/* Next steps hint */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n paddingTop: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <ChevronRight size={14} />\n <span>Then commit and push to start tracking quality</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport { WORKFLOW_FILE_PATH };\n","import React from 'react';\nimport { Hexagon } from 'lucide-react';\nimport { ThemeProvider, useTheme } from '@principal-ade/industry-theme';\nimport type { PanelComponentProps } from '../types';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport {\n QualityHexagonExpandable,\n QualityTier,\n calculateQualityTier,\n} from '../components/QualityHexagon';\nimport {\n QualityEmptyState,\n checkFileExistsInTree,\n WORKFLOW_FILE_PATH,\n} from '../components/QualityEmptyState';\n\n// Mock package data - in real usage, this would come from a quality slice\nconst mockPackages: Array<{\n name: string;\n version?: string;\n metrics: QualityMetrics;\n}> = [\n {\n name: '@principal-ade/code-quality-panels',\n version: '0.1.0',\n metrics: {\n tests: 75,\n deadCode: 15,\n linting: 85,\n formatting: 90,\n types: 88,\n documentation: 65,\n },\n },\n];\n\n// Package quality data shape from slice\ninterface PackageQuality {\n name: string;\n version?: string;\n metrics: QualityMetrics;\n}\n\n// Slice data shape\ninterface QualitySliceData {\n packages: PackageQuality[];\n lastUpdated: string;\n}\n\n/**\n * QualityHexagonPanelContent - Internal component that uses theme\n */\nconst QualityHexagonPanelContent: React.FC<PanelComponentProps> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n const [refreshingPackages, setRefreshingPackages] = React.useState<Set<string>>(new Set());\n\n // Get quality data from context if available\n const qualitySlice = context.getSlice<QualitySliceData>('quality');\n const hasQualitySlice = context.hasSlice('quality');\n const isLoading = qualitySlice?.loading ?? false;\n\n // Get file tree to check for workflow presence\n const fileTreeSlice = context.getSlice<{ allFiles?: Array<{ relativePath?: string; path?: string }> }>('fileTree');\n const hasWorkflow = React.useMemo(() => {\n return checkFileExistsInTree(fileTreeSlice?.data ?? undefined, WORKFLOW_FILE_PATH);\n }, [fileTreeSlice?.data]);\n\n // Determine packages to display\n // - If slice exists and has data, use it\n // - If slice exists but is loading/empty, show empty\n // - If no slice at all, use mock data for demo\n const packages: PackageQuality[] = React.useMemo(() => {\n if (qualitySlice?.data?.packages) {\n return qualitySlice.data.packages;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet (loading or empty)\n return [];\n }\n // No slice - use mock for demo\n return mockPackages;\n }, [qualitySlice?.data?.packages, hasQualitySlice]);\n\n // Handle refresh for a specific package\n const handleRefreshPackage = async (packageName: string) => {\n setRefreshingPackages(prev => new Set(prev).add(packageName));\n try {\n if (context.hasSlice('quality')) {\n // In future, this could refresh just one package\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(prev => {\n const next = new Set(prev);\n next.delete(packageName);\n return next;\n });\n }\n };\n\n // Handle refresh all\n const handleRefreshAll = async () => {\n const allNames = packages.map(p => p.name);\n setRefreshingPackages(new Set(allNames));\n try {\n if (context.hasSlice('quality')) {\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(new Set());\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on('principal-ade.quality-panel:refresh', async () => {\n await handleRefreshAll();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context, packages]);\n\n // Tier colors for display\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n // Calculate overall tier from all packages\n const overallTier = packages.length > 0\n ? calculateQualityTier(\n packages.reduce((acc, pkg) => ({\n tests: acc.tests + pkg.metrics.tests / packages.length,\n deadCode: acc.deadCode + pkg.metrics.deadCode / packages.length,\n linting: acc.linting + pkg.metrics.linting / packages.length,\n formatting: acc.formatting + pkg.metrics.formatting / packages.length,\n types: acc.types + pkg.metrics.types / packages.length,\n documentation: acc.documentation + pkg.metrics.documentation / packages.length,\n }), { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 })\n )\n : 'none';\n\n return (\n <div\n style={{\n fontFamily: theme.fonts.body,\n height: '100%',\n minHeight: 0,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n overflowY: 'auto',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n padding: 20,\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <Hexagon size={24} color={tierColors[overallTier]} />\n <h2\n style={{\n margin: 0,\n fontSize: 20,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Code Quality\n </h2>\n <span\n title=\"Platinum: 90%+ avg | Gold: 75%+ | Silver: 60%+ | Bronze: 40%+\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 18,\n height: 18,\n borderRadius: '50%',\n border: `1px solid ${theme.colors.border}`,\n fontSize: 12,\n color: theme.colors.textMuted,\n cursor: 'help',\n }}\n >\n ?\n </span>\n {packages.length > 1 && (\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {packages.length} packages\n </span>\n )}\n </div>\n\n {/* Quality Hexagons for each package */}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 16, minHeight: 0 }}>\n {isLoading ? (\n <div style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}>\n Loading quality metrics...\n </div>\n ) : packages.length === 0 ? (\n <QualityEmptyState\n theme={theme}\n hasWorkflow={hasWorkflow}\n />\n ) : (\n packages.map((pkg) => {\n const tier = calculateQualityTier(pkg.metrics);\n return (\n <QualityHexagonExpandable\n key={pkg.name}\n metrics={pkg.metrics}\n tier={tier}\n theme={theme}\n packageName={pkg.name}\n packageVersion={pkg.version}\n />\n );\n })\n )}\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * QualityHexagonPanel - A panel for visualizing code quality metrics\n */\nexport const QualityHexagonPanel: React.FC<PanelComponentProps> = (props) => {\n return (\n <ThemeProvider>\n <QualityHexagonPanelContent {...props} />\n </ThemeProvider>\n );\n};\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport type { Theme } from '@principal-ade/industry-theme';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport { QualityHexagon, calculateQualityTier, type QualityTier, type VertexHoverInfo, type MetricKey } from './QualityHexagon';\n\nexport type { VertexHoverInfo, MetricKey };\n\nconst METRIC_OPTIONS: Array<{ key: MetricKey; label: string }> = [\n { key: 'types', label: 'Types' },\n { key: 'documentation', label: 'Docs' },\n { key: 'tests', label: 'Tests' },\n { key: 'deadCode', label: 'Dead Code' },\n { key: 'formatting', label: 'Format' },\n { key: 'linting', label: 'Linting' },\n];\n\n/**\n * Represents a single package within a repository\n */\nexport interface PackageQualityItem {\n /** Package name (e.g., \"@acme/core\" or \"my-app\") */\n name: string;\n /** Optional version string */\n version?: string;\n /** Quality metrics for this package */\n metrics: QualityMetrics;\n}\n\n/**\n * Represents a repository with one or more packages\n */\nexport interface RepositoryQualityItem {\n /** Unique identifier for the repository */\n id: string;\n /** Repository name */\n name: string;\n /** Optional path to the repository */\n path?: string;\n /** Packages within this repository (monorepos have multiple) */\n packages: PackageQualityItem[];\n}\n\n/**\n * A flattened item for display in the grid\n */\nexport interface FlatGridItem {\n /** Unique key for React */\n key: string;\n /** Repository ID */\n repositoryId: string;\n /** Repository name */\n repositoryName: string;\n /** Package name */\n packageName: string;\n /** Optional version */\n version?: string;\n /** Quality metrics */\n metrics: QualityMetrics;\n /** Calculated tier */\n tier: QualityTier;\n}\n\ninterface RepositoryQualityGridProps {\n /** Array of repositories with their packages */\n repositories: RepositoryQualityItem[];\n /** Theme from @principal-ade/industry-theme */\n theme: Theme;\n /** Callback when a grid item is clicked */\n onItemClick?: (item: FlatGridItem) => void;\n /** Callback when a hexagon vertex is clicked */\n onVertexClick?: (item: FlatGridItem, vertex: VertexHoverInfo) => void;\n /** Optional CSS class */\n className?: string;\n /** Show repository name in label (default: true) */\n showRepositoryName?: boolean;\n /** Show overall summary header (default: true) */\n showSummary?: boolean;\n}\n\ninterface RepositoryQualityGridItemProps {\n /** The flattened item to display */\n item: FlatGridItem;\n /** Theme */\n theme: Theme;\n /** Click handler for the card */\n onClick?: () => void;\n /** Click handler for hexagon vertices */\n onVertexClick?: (item: FlatGridItem, vertex: VertexHoverInfo) => void;\n /** Show repository name in label */\n showRepositoryName?: boolean;\n /** Selected metric to display (from dropdown) */\n selectedMetric?: MetricKey | null;\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * Flatten repositories into a single array of grid items\n */\nfunction flattenRepositories(repositories: RepositoryQualityItem[]): FlatGridItem[] {\n const items: FlatGridItem[] = [];\n\n for (const repo of repositories) {\n for (const pkg of repo.packages) {\n items.push({\n key: `${repo.id}:${pkg.name}`,\n repositoryId: repo.id,\n repositoryName: repo.name,\n packageName: pkg.name,\n version: pkg.version,\n metrics: pkg.metrics,\n tier: calculateQualityTier(pkg.metrics),\n });\n }\n }\n\n return items;\n}\n\n/**\n * Calculate overall tier from all items\n */\nfunction calculateOverallTier(items: FlatGridItem[]): QualityTier {\n if (items.length === 0) return 'none';\n\n const avgMetrics = items.reduce(\n (acc, item) => ({\n tests: acc.tests + item.metrics.tests / items.length,\n deadCode: acc.deadCode + item.metrics.deadCode / items.length,\n linting: acc.linting + item.metrics.linting / items.length,\n formatting: acc.formatting + item.metrics.formatting / items.length,\n types: acc.types + item.metrics.types / items.length,\n documentation: acc.documentation + item.metrics.documentation / items.length,\n }),\n { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 }\n );\n\n return calculateQualityTier(avgMetrics);\n}\n\n/**\n * Format the display label for an item\n */\nfunction formatLabel(\n item: FlatGridItem,\n showRepositoryName: boolean,\n isSameAsRepo: boolean\n): string {\n if (!showRepositoryName || isSameAsRepo) {\n return item.packageName;\n }\n return `${item.repositoryName} / ${item.packageName}`;\n}\n\n/**\n * Individual grid item component\n */\n// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: MetricKey, theme: Theme): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === 'deadCode' ? 100 - value : value;\n\n if (effectiveValue >= 80) return theme.colors.success;\n if (effectiveValue >= 60) return theme.colors.warning;\n return theme.colors.error;\n}\n\nexport function RepositoryQualityGridItem({\n item,\n theme,\n onClick,\n onVertexClick,\n showRepositoryName = true,\n selectedMetric,\n className,\n}: RepositoryQualityGridItemProps) {\n const [hoveredVertex, setHoveredVertex] = React.useState<VertexHoverInfo | null>(null);\n const isSameAsRepo = item.packageName === item.repositoryName;\n const label = formatLabel(item, showRepositoryName, isSameAsRepo);\n\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n // Get the display info - either from selected metric or hovered vertex\n const displayInfo = React.useMemo(() => {\n if (selectedMetric) {\n const option = METRIC_OPTIONS.find(o => o.key === selectedMetric);\n if (option) {\n const value = item.metrics[selectedMetric];\n return {\n label: option.label,\n value,\n valueColor: getValueColor(value, selectedMetric, theme),\n };\n }\n }\n if (hoveredVertex) {\n return {\n label: hoveredVertex.label,\n value: hoveredVertex.value,\n valueColor: getValueColor(hoveredVertex.value, hoveredVertex.key, theme),\n };\n }\n return null;\n }, [selectedMetric, hoveredVertex, item.metrics, theme]);\n\n return (\n <div\n className={cn(className)}\n onClick={onClick}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n padding: 12,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n cursor: onClick ? 'pointer' : 'default',\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n if (onClick) {\n e.currentTarget.style.borderColor = tierColors[item.tier];\n e.currentTarget.style.transform = 'translateY(-2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = theme.colors.border;\n e.currentTarget.style.transform = 'translateY(0)';\n setHoveredVertex(null);\n }}\n >\n {/* Metric info header */}\n <div\n style={{\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n width: '100%',\n minHeight: 24,\n }}\n >\n {displayInfo ? (\n <>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {displayInfo.label}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: displayInfo.valueColor,\n }}\n >\n {displayInfo.value}%\n </span>\n </>\n ) : (\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n Hover a corner\n </span>\n )}\n </div>\n <div style={{ width: 200, height: 200 }}>\n <QualityHexagon\n metrics={item.metrics}\n tier={item.tier}\n theme={theme}\n showLabels={false}\n showValues={false}\n onVertexHover={setHoveredVertex}\n onVertexLeave={() => setHoveredVertex(null)}\n onVertexClick={onVertexClick ? (vertex) => onVertexClick(item, vertex) : undefined}\n />\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: theme.colors.text,\n textAlign: 'center',\n }}\n >\n {label}\n </span>\n {item.version && (\n <span\n style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n }}\n >\n v{item.version}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * RepositoryQualityGrid - Displays a flat grid of quality hexagons\n * for multiple repositories and their packages.\n *\n * Each hexagon shows the quality metrics for a single package,\n * labeled with \"repo / package\" format for clarity.\n */\n// Calculate average score for an item (with deadCode inverted)\nfunction calculateAverageScore(metrics: QualityMetrics): number {\n const adjusted = { ...metrics };\n adjusted.deadCode = 100 - adjusted.deadCode;\n return Object.values(adjusted).reduce((a, b) => a + b, 0) / 6;\n}\n\nexport function RepositoryQualityGrid({\n repositories,\n theme,\n onItemClick,\n onVertexClick,\n className,\n showRepositoryName = true,\n showSummary = true,\n}: RepositoryQualityGridProps) {\n const [selectedMetric, setSelectedMetric] = React.useState<MetricKey | null>(null);\n const items = React.useMemo(() => flattenRepositories(repositories), [repositories]);\n const overallTier = React.useMemo(() => calculateOverallTier(items), [items]);\n\n // Sort items based on selected metric or average\n const sortedItems = React.useMemo(() => {\n return [...items].sort((a, b) => {\n if (selectedMetric) {\n // Sort by selected metric (for deadCode, lower is better so invert)\n const aVal = selectedMetric === 'deadCode'\n ? 100 - a.metrics[selectedMetric]\n : a.metrics[selectedMetric];\n const bVal = selectedMetric === 'deadCode'\n ? 100 - b.metrics[selectedMetric]\n : b.metrics[selectedMetric];\n return bVal - aVal; // Descending (best first)\n } else {\n // Sort by average score\n return calculateAverageScore(b.metrics) - calculateAverageScore(a.metrics);\n }\n });\n }, [items, selectedMetric]);\n\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n const tierLabels: Record<QualityTier, string> = {\n none: 'No Data',\n bronze: 'Bronze',\n silver: 'Silver',\n gold: 'Gold',\n platinum: 'Platinum',\n };\n\n if (items.length === 0) {\n return (\n <div\n className={cn(className)}\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.background,\n borderRadius: 8,\n }}\n >\n No repositories to display\n </div>\n );\n }\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n backgroundColor: theme.colors.background,\n fontFamily: theme.fonts.body,\n }}\n >\n {/* Summary Header */}\n {showSummary && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 12,\n padding: '12px 16px',\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {items.length} {items.length === 1 ? 'package' : 'packages'}\n </span>\n <span style={{ color: theme.colors.textMuted }}>•</span>\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {repositories.length} {repositories.length === 1 ? 'repository' : 'repositories'}\n </span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n {/* Metric dropdown */}\n <select\n value={selectedMetric ?? ''}\n onChange={(e) => setSelectedMetric(e.target.value ? e.target.value as MetricKey : null)}\n style={{\n padding: '4px 8px',\n fontSize: 13,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n cursor: 'pointer',\n outline: 'none',\n }}\n >\n <option value=\"\">Select metric...</option>\n {METRIC_OPTIONS.map((option) => (\n <option key={option.key} value={option.key}>\n {option.label}\n </option>\n ))}\n </select>\n {/* Tier badge */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 12px',\n backgroundColor: theme.colors.backgroundLight,\n borderRadius: 16,\n border: `1px solid ${tierColors[overallTier]}`,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: tierColors[overallTier],\n }}\n />\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: tierColors[overallTier],\n }}\n >\n {tierLabels[overallTier]}\n </span>\n </div>\n </div>\n </div>\n )}\n\n {/* Grid of Items */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))',\n gap: 12,\n padding: 16,\n }}\n >\n {sortedItems.map((item) => (\n <RepositoryQualityGridItem\n key={item.key}\n item={item}\n theme={theme}\n onClick={onItemClick ? () => onItemClick(item) : undefined}\n onVertexClick={onVertexClick}\n showRepositoryName={showRepositoryName}\n selectedMetric={selectedMetric}\n />\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { ThemeProvider, useTheme } from '@principal-ade/industry-theme';\nimport type { PanelComponentProps } from '../types';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport {\n RepositoryQualityGrid,\n type RepositoryQualityItem,\n type FlatGridItem,\n type VertexHoverInfo,\n} from '../components/RepositoryQualityGrid';\n\n// Mock data for demonstration\nconst mockRepositories: RepositoryQualityItem[] = [\n {\n id: 'platform',\n name: 'platform',\n packages: [\n {\n name: '@org/core',\n version: '2.0.0',\n metrics: { tests: 94, deadCode: 4, linting: 98, formatting: 100, types: 97, documentation: 90 },\n },\n {\n name: '@org/ui-components',\n version: '2.0.0',\n metrics: { tests: 85, deadCode: 8, linting: 95, formatting: 98, types: 92, documentation: 80 },\n },\n {\n name: '@org/hooks',\n version: '2.0.0',\n metrics: { tests: 88, deadCode: 6, linting: 96, formatting: 100, types: 94, documentation: 85 },\n },\n ],\n },\n {\n id: 'backend',\n name: 'backend-services',\n packages: [\n {\n name: 'backend-services',\n version: '1.5.0',\n metrics: { tests: 80, deadCode: 15, linting: 90, formatting: 95, types: 85, documentation: 72 },\n },\n ],\n },\n {\n id: 'docs',\n name: 'documentation-site',\n packages: [\n {\n name: 'documentation-site',\n version: '1.0.0',\n metrics: { tests: 45, deadCode: 25, linting: 75, formatting: 85, types: 60, documentation: 95 },\n },\n ],\n },\n];\n\n// Repository quality data from slice\ninterface RepositoryQualityData {\n id: string;\n name: string;\n path?: string;\n packages: Array<{\n name: string;\n version?: string;\n metrics: QualityMetrics;\n }>;\n}\n\n// Slice data shape\ninterface RepositoriesQualitySliceData {\n repositories: RepositoryQualityData[];\n lastUpdated: string;\n}\n\n/**\n * RepositoryQualityGridPanelContent - Internal component that uses theme\n */\nconst RepositoryQualityGridPanelContent: React.FC<PanelComponentProps> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n\n // Get repositories quality data from context if available\n const qualitySlice = context.getSlice<RepositoriesQualitySliceData>('repositoriesQuality');\n const hasQualitySlice = context.hasSlice('repositoriesQuality');\n const isLoading = qualitySlice?.loading ?? false;\n\n // Determine repositories to display\n const repositories: RepositoryQualityItem[] = React.useMemo(() => {\n if (qualitySlice?.data?.repositories) {\n return qualitySlice.data.repositories;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet\n return [];\n }\n // No slice - use mock for demo\n return mockRepositories;\n }, [qualitySlice?.data?.repositories, hasQualitySlice]);\n\n // Handle item click\n const handleItemClick = (item: FlatGridItem) => {\n events.emit({\n type: 'principal-ade.repository-quality-grid:item:click',\n source: 'principal-ade.repository-quality-grid-panel',\n timestamp: Date.now(),\n payload: {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n tier: item.tier,\n },\n });\n };\n\n // Handle vertex click\n const handleVertexClick = (item: FlatGridItem, vertex: VertexHoverInfo) => {\n events.emit({\n type: 'principal-ade.repository-quality-grid:vertex:click',\n source: 'principal-ade.repository-quality-grid-panel',\n timestamp: Date.now(),\n payload: {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n metric: vertex.key,\n label: vertex.label,\n value: vertex.value,\n },\n });\n };\n\n // Handle refresh\n const handleRefresh = async () => {\n if (context.hasSlice('repositoriesQuality')) {\n await context.refresh('workspace', 'repositoriesQuality');\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on('principal-ade.repository-quality-grid:refresh', async () => {\n await handleRefresh();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context]);\n\n return (\n <div\n style={{\n fontFamily: theme.fonts.body,\n height: '100%',\n minHeight: 0,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n overflowY: 'auto',\n boxSizing: 'border-box',\n }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}\n >\n Loading repository quality metrics...\n </div>\n ) : repositories.length === 0 ? (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}\n >\n No repositories with quality metrics found.\n </div>\n ) : (\n <RepositoryQualityGrid\n repositories={repositories}\n theme={theme}\n onItemClick={handleItemClick}\n onVertexClick={handleVertexClick}\n showRepositoryName={true}\n showSummary={true}\n />\n )}\n </div>\n );\n};\n\n/**\n * RepositoryQualityGridPanel - A panel for visualizing quality metrics\n * across multiple repositories in a flat grid layout.\n */\nexport const RepositoryQualityGridPanel: React.FC<PanelComponentProps> = (props) => {\n return (\n <ThemeProvider>\n <RepositoryQualityGridPanelContent {...props} />\n </ThemeProvider>\n );\n};\n","import { QualityHexagonPanel } from './panels/QualityHexagonPanel';\nimport { RepositoryQualityGridPanel } from './panels/RepositoryQualityGridPanel';\nimport type { PanelDefinition, PanelContextValue } from './types';\n\n/**\n * Export array of panel definitions.\n * This is the required export for panel extensions.\n */\nexport const panels: PanelDefinition[] = [\n {\n metadata: {\n id: 'principal-ade.quality-hexagon-panel',\n name: 'Code Quality',\n icon: '⬡',\n version: '0.1.0',\n author: 'Principal ADE',\n description:\n 'Visualize code quality metrics using a hexagonal radar chart showing tests, types, linting, formatting, documentation, and dead code.',\n slices: ['quality'],\n tools: [],\n },\n component: QualityHexagonPanel,\n\n onMount: async (context: PanelContextValue) => {\n console.log(\n 'Quality Hexagon Panel mounted',\n context.currentScope.repository?.path\n );\n\n if (context.hasSlice('quality') && !context.isSliceLoading('quality')) {\n await context.refresh('repository', 'quality');\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log('Quality Hexagon Panel unmounting');\n },\n },\n {\n metadata: {\n id: 'principal-ade.repository-quality-grid-panel',\n name: 'Repository Quality Grid',\n icon: '⬡',\n version: '0.1.0',\n author: 'Principal ADE',\n description:\n 'Display quality metrics for multiple repositories in a flat grid layout. Supports filtering by metric type, sorting, and comparing quality across projects.',\n slices: ['repositoriesQuality'],\n tools: [],\n },\n component: RepositoryQualityGridPanel,\n\n onMount: async (context: PanelContextValue) => {\n console.log('Repository Quality Grid Panel mounted');\n\n if (context.hasSlice('repositoriesQuality') && !context.isSliceLoading('repositoriesQuality')) {\n await context.refresh('workspace', 'repositoriesQuality');\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log('Repository Quality Grid Panel unmounting');\n },\n },\n];\n\n/**\n * Optional: Called once when the entire package is loaded.\n */\nexport const onPackageLoad = async () => {\n console.log('Panel package loaded - Code Quality Panels');\n};\n\n/**\n * Optional: Called once when the package is unloaded.\n */\nexport const onPackageUnload = async () => {\n console.log('Panel package unloading - Code Quality Panels');\n};\n\n// Export components for direct usage\nexport {\n QualityHexagon,\n QualityHexagonCompact,\n QualityHexagonDetailed,\n QualityHexagonExpandable,\n calculateQualityTier,\n type QualityMetrics,\n type QualityTier,\n // Multi-repository grid components\n RepositoryQualityGrid,\n RepositoryQualityGridItem,\n type RepositoryQualityItem,\n type PackageQualityItem,\n type FlatGridItem,\n} from './components';\n\n// Export panels\nexport { QualityHexagonPanel } from './panels/QualityHexagonPanel';\nexport { RepositoryQualityGridPanel } from './panels/RepositoryQualityGridPanel';\n"],"names":["__iconNode","theme","React","_a"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}
|
|
1
|
+
{"version":3,"file":"panels.bundle.js","sources":["../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/check.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/copy.js","../node_modules/lucide-react/dist/esm/icons/hexagon.js","../node_modules/lucide-react/dist/esm/icons/terminal.js","../node_modules/@principal-ade/industry-theme/dist/esm/index.js","../node_modules/clsx/dist/clsx.mjs","../src/lib/utils.ts","../src/components/QualityHexagon.tsx","../src/components/QualityEmptyState.tsx","../src/panels/QualityHexagonPanel.tsx","../src/components/RepositoryQualityGrid.tsx","../src/panels/RepositoryQualityGridPanel.tsx","../src/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\",\n key: \"yt0hxn\"\n }\n ]\n];\nconst Hexagon = createLucideIcon(\"hexagon\", __iconNode);\n\nexport { __iconNode, Hexagon as default };\n//# sourceMappingURL=hexagon.js.map\n","/**\n * @license lucide-react v0.552.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 19h8\", key: \"baeox8\" }],\n [\"path\", { d: \"m4 17 6-6-6-6\", key: \"1yngyt\" }]\n];\nconst Terminal = createLucideIcon(\"terminal\", __iconNode);\n\nexport { __iconNode, Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","// src/glassmorphismTheme.ts\nvar glassmorphismTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 8, 12, 16, 20, 24, 32, 40],\n shadows: [\n \"none\",\n \"0 8px 32px 0 rgba(31, 38, 135, 0.15)\",\n \"0 12px 40px 0 rgba(31, 38, 135, 0.2)\",\n \"0 16px 48px 0 rgba(31, 38, 135, 0.25)\",\n \"0 20px 56px 0 rgba(31, 38, 135, 0.3)\",\n \"0 24px 64px 0 rgba(31, 38, 135, 0.35)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"rgba(255, 255, 255, 0.95)\",\n background: \"rgba(255, 255, 255, 0.1)\",\n primary: \"rgba(99, 102, 241, 0.9)\",\n secondary: \"rgba(139, 92, 246, 0.9)\",\n accent: \"rgba(236, 72, 153, 0.9)\",\n highlight: \"rgba(99, 102, 241, 0.2)\",\n muted: \"rgba(255, 255, 255, 0.05)\",\n success: \"rgba(34, 197, 94, 0.9)\",\n warning: \"rgba(251, 146, 60, 0.9)\",\n error: \"rgba(239, 68, 68, 0.9)\",\n info: \"rgba(59, 130, 246, 0.9)\",\n border: \"rgba(255, 255, 255, 0.18)\",\n backgroundSecondary: \"rgba(255, 255, 255, 0.15)\",\n backgroundTertiary: \"rgba(255, 255, 255, 0.2)\",\n backgroundLight: \"rgba(255, 255, 255, 0.08)\",\n backgroundHover: \"rgba(255, 255, 255, 0.25)\",\n surface: \"rgba(255, 255, 255, 0.12)\",\n textSecondary: \"rgba(255, 255, 255, 0.8)\",\n textTertiary: \"rgba(255, 255, 255, 0.6)\",\n textMuted: \"rgba(255, 255, 255, 0.5)\",\n highlightBg: \"rgba(251, 191, 36, 0.3)\",\n highlightBorder: \"rgba(251, 191, 36, 0.5)\"\n },\n modes: {\n dark: {\n text: \"rgba(255, 255, 255, 0.95)\",\n background: \"rgba(0, 0, 0, 0.3)\",\n primary: \"rgba(129, 140, 248, 0.9)\",\n secondary: \"rgba(167, 139, 250, 0.9)\",\n accent: \"rgba(244, 114, 182, 0.9)\",\n highlight: \"rgba(129, 140, 248, 0.25)\",\n muted: \"rgba(0, 0, 0, 0.15)\",\n success: \"rgba(74, 222, 128, 0.9)\",\n warning: \"rgba(251, 191, 36, 0.9)\",\n error: \"rgba(248, 113, 113, 0.9)\",\n info: \"rgba(96, 165, 250, 0.9)\",\n border: \"rgba(255, 255, 255, 0.15)\",\n backgroundSecondary: \"rgba(0, 0, 0, 0.4)\",\n backgroundTertiary: \"rgba(0, 0, 0, 0.5)\",\n backgroundLight: \"rgba(0, 0, 0, 0.2)\",\n backgroundHover: \"rgba(255, 255, 255, 0.1)\",\n surface: \"rgba(0, 0, 0, 0.35)\",\n textSecondary: \"rgba(255, 255, 255, 0.8)\",\n textTertiary: \"rgba(255, 255, 255, 0.6)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(251, 191, 36, 0.35)\",\n highlightBorder: \"rgba(251, 191, 36, 0.6)\"\n },\n frosted: {\n text: \"rgba(31, 41, 55, 0.95)\",\n background: \"rgba(255, 255, 255, 0.3)\",\n primary: \"rgba(79, 70, 229, 0.95)\",\n secondary: \"rgba(124, 58, 237, 0.95)\",\n accent: \"rgba(219, 39, 119, 0.95)\",\n highlight: \"rgba(79, 70, 229, 0.15)\",\n muted: \"rgba(255, 255, 255, 0.4)\",\n success: \"rgba(16, 185, 129, 0.95)\",\n warning: \"rgba(245, 158, 11, 0.95)\",\n error: \"rgba(220, 38, 38, 0.95)\",\n info: \"rgba(37, 99, 235, 0.95)\",\n border: \"rgba(255, 255, 255, 0.5)\",\n backgroundSecondary: \"rgba(255, 255, 255, 0.4)\",\n backgroundTertiary: \"rgba(255, 255, 255, 0.5)\",\n backgroundLight: \"rgba(255, 255, 255, 0.25)\",\n backgroundHover: \"rgba(255, 255, 255, 0.6)\",\n surface: \"rgba(255, 255, 255, 0.35)\",\n textSecondary: \"rgba(31, 41, 55, 0.8)\",\n textTertiary: \"rgba(31, 41, 55, 0.6)\",\n textMuted: \"rgba(31, 41, 55, 0.5)\",\n highlightBg: \"rgba(251, 191, 36, 0.4)\",\n highlightBorder: \"rgba(251, 191, 36, 0.7)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"rgba(255, 255, 255, 0.1)\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n \"&:hover\": {\n bg: \"rgba(255, 255, 255, 0.2)\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"transparent\",\n \"&:hover\": {\n borderColor: \"rgba(255, 255, 255, 0.2)\",\n bg: \"rgba(255, 255, 255, 0.05)\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/defaultThemes.ts\nvar defaultMarkdownTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#007acc\",\n secondary: \"#005a9e\",\n accent: \"#1a1a1a\",\n highlight: \"rgba(0, 122, 204, 0.1)\",\n muted: \"#f0f0f0\",\n success: \"#28a745\",\n warning: \"#ffc107\",\n error: \"#dc3545\",\n info: \"#17a2b8\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"rgba(0, 0, 0, 0.03)\",\n backgroundHover: \"rgba(0, 0, 0, 0.05)\",\n surface: \"#ffffff\",\n textSecondary: \"#555555\",\n textTertiary: \"#888888\",\n textMuted: \"#aaaaaa\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar defaultTerminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", Courier, monospace',\n heading: '\"Courier New\", Courier, monospace',\n monospace: '\"Courier New\", Courier, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.4,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.6\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(255, 193, 7, 0.1)\",\n \"0 0 10px rgba(255, 193, 7, 0.15)\",\n \"0 0 15px rgba(255, 193, 7, 0.2)\",\n \"0 0 20px rgba(255, 193, 7, 0.25)\",\n \"0 0 30px rgba(255, 193, 7, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#ffc107\",\n background: \"#000000\",\n primary: \"#ffc107\",\n secondary: \"#ffb300\",\n accent: \"#ffffff\",\n highlight: \"rgba(255, 193, 7, 0.1)\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(255, 193, 7, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(255, 193, 7, 0.03)\",\n backgroundHover: \"rgba(255, 193, 7, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#e0e0e0\",\n textTertiary: \"#b0b0b0\",\n textMuted: \"#808080\",\n highlightBg: \"rgba(255, 193, 7, 0.2)\",\n highlightBorder: \"rgba(255, 193, 7, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar defaultEditorTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 12px 24px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#d4d4d4\",\n background: \"#1e1e1e\",\n primary: \"#569cd6\",\n secondary: \"#408ac9\",\n accent: \"#c586c0\",\n highlight: \"rgba(86, 156, 214, 0.1)\",\n muted: \"#2a2a2a\",\n success: \"#6a9955\",\n warning: \"#d18616\",\n error: \"#f44747\",\n info: \"#569cd6\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"#252526\",\n backgroundTertiary: \"#333333\",\n backgroundLight: \"rgba(255, 255, 255, 0.03)\",\n backgroundHover: \"rgba(255, 255, 255, 0.05)\",\n surface: \"#252526\",\n textSecondary: \"#cccccc\",\n textTertiary: \"#999999\",\n textMuted: \"#666666\",\n highlightBg: \"rgba(255, 235, 59, 0.2)\",\n highlightBorder: \"rgba(255, 235, 59, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\n\n// src/themes.ts\nvar regalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#f1e8dc\",\n background: \"#1a1f2e\",\n primary: \"#d4a574\",\n secondary: \"#e0b584\",\n accent: \"#c9b8a3\",\n highlight: \"rgba(212, 165, 116, 0.15)\",\n muted: \"#8b7968\",\n success: \"#5c8a72\",\n warning: \"#d4a574\",\n error: \"#a85751\",\n info: \"#d4a574\",\n border: \"rgba(212, 165, 116, 0.2)\",\n backgroundSecondary: \"#212738\",\n backgroundTertiary: \"#2d3446\",\n backgroundLight: \"rgba(212, 165, 116, 0.08)\",\n backgroundHover: \"rgba(212, 165, 116, 0.15)\",\n surface: \"#212738\",\n textSecondary: \"#c9b8a3\",\n textTertiary: \"#8b7968\",\n textMuted: \"#8b7968\",\n highlightBg: \"rgba(255, 193, 7, 0.25)\",\n highlightBorder: \"rgba(255, 193, 7, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"background\",\n bg: \"primary\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"muted\",\n \"&:hover\": {\n bg: \"backgroundSecondary\"\n }\n },\n ghost: {\n color: \"primary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"muted\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"background\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar terminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n heading: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n monospace: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px 0 rgba(0, 0, 0, 0.07)\",\n \"0 8px 12px 0 rgba(0, 0, 0, 0.08)\",\n \"0 16px 24px 0 rgba(0, 0, 0, 0.10)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#e4e4e4\",\n background: \"rgba(10, 10, 10, 0.85)\",\n primary: \"#66b3ff\",\n secondary: \"#80c4ff\",\n accent: \"#66ff99\",\n highlight: \"rgba(102, 179, 255, 0.15)\",\n muted: \"rgba(26, 26, 26, 0.8)\",\n success: \"#66ff99\",\n warning: \"#ffcc66\",\n error: \"#ff6666\",\n info: \"#66b3ff\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"rgba(15, 15, 15, 0.9)\",\n backgroundTertiary: \"rgba(20, 20, 20, 0.9)\",\n backgroundLight: \"rgba(255, 255, 255, 0.05)\",\n backgroundHover: \"rgba(102, 179, 255, 0.08)\",\n surface: \"rgba(15, 15, 15, 0.95)\",\n textSecondary: \"rgba(255, 255, 255, 0.7)\",\n textTertiary: \"rgba(255, 255, 255, 0.5)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n modes: {\n light: {\n text: \"#1a1a1a\",\n background: \"rgba(255, 255, 255, 0.9)\",\n primary: \"#0066cc\",\n secondary: \"#0052a3\",\n accent: \"#00cc88\",\n highlight: \"rgba(0, 102, 204, 0.08)\",\n muted: \"rgba(245, 245, 245, 0.8)\",\n success: \"#00cc88\",\n warning: \"#ffaa00\",\n error: \"#ff3333\",\n info: \"#0066cc\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"rgba(250, 250, 250, 0.9)\",\n backgroundTertiary: \"rgba(245, 245, 245, 0.9)\",\n backgroundLight: \"rgba(0, 0, 0, 0.02)\",\n backgroundHover: \"rgba(0, 102, 204, 0.04)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\n textSecondary: \"rgba(0, 0, 0, 0.6)\",\n textTertiary: \"rgba(0, 0, 0, 0.4)\",\n textMuted: \"rgba(0, 0, 0, 0.3)\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\nvar matrixTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(0, 216, 53, 0.15)\",\n \"0 0 10px rgba(0, 216, 53, 0.2)\",\n \"0 0 15px rgba(0, 216, 53, 0.25)\",\n \"0 0 20px rgba(0, 216, 53, 0.3)\",\n \"0 0 30px rgba(0, 216, 53, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#00d835\",\n secondary: \"#00a828\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.15)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(0, 216, 53, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(0, 216, 53, 0.03)\",\n backgroundHover: \"rgba(0, 216, 53, 0.08)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.25)\",\n highlightBorder: \"rgba(0, 216, 53, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar matrixMinimalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 0 20px rgba(0, 216, 53, 0.1)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#b8b8b8\",\n secondary: \"#909090\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.1)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(184, 184, 184, 0.1)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(184, 184, 184, 0.02)\",\n backgroundHover: \"rgba(0, 216, 53, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.2)\",\n highlightBorder: \"rgba(0, 216, 53, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar slateTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.2)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.2)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.2)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.25)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#9ca3af\",\n background: \"#1a1c1e\",\n primary: \"#d1d5db\",\n secondary: \"#6b7280\",\n accent: \"#f59e0b\",\n highlight: \"rgba(209, 213, 219, 0.15)\",\n muted: \"#2d3134\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n border: \"rgba(156, 163, 175, 0.15)\",\n backgroundSecondary: \"#22252a\",\n backgroundTertiary: \"#2d3134\",\n backgroundLight: \"rgba(156, 163, 175, 0.05)\",\n backgroundHover: \"rgba(156, 163, 175, 0.1)\",\n surface: \"#1f2124\",\n textSecondary: \"#e5e7eb\",\n textTertiary: \"#6b7280\",\n textMuted: \"#4b5563\",\n highlightBg: \"rgba(245, 158, 11, 0.25)\",\n highlightBorder: \"rgba(245, 158, 11, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#1a1c1e\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#9ca3af\"\n }\n },\n secondary: {\n color: \"#e5e7eb\",\n bg: \"secondary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#4b5563\"\n }\n },\n ghost: {\n color: \"textSecondary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"textSecondary\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textTertiary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/ThemeProvider.tsx\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\n\n// src/themeHelpers.ts\nfunction overrideColors(theme, colors) {\n return {\n ...theme,\n colors: {\n ...theme.colors,\n ...colors\n }\n };\n}\nfunction makeTheme(baseTheme, overrides) {\n return {\n ...baseTheme,\n ...overrides,\n colors: {\n ...baseTheme.colors,\n ...overrides.colors\n },\n fonts: {\n ...baseTheme.fonts,\n ...overrides.fonts\n }\n };\n}\nfunction addMode(theme, modeName, colors, baseMode) {\n let baseColors;\n if (baseMode && theme.modes && theme.modes[baseMode]) {\n baseColors = {\n ...theme.colors,\n ...theme.modes[baseMode]\n };\n } else {\n baseColors = theme.colors;\n }\n const newMode = {\n ...baseColors,\n ...colors\n };\n return {\n ...theme,\n modes: {\n ...theme.modes,\n [modeName]: newMode\n }\n };\n}\nfunction getMode(theme, mode) {\n if (!mode || !theme.modes || !theme.modes[mode]) {\n return theme.colors;\n }\n return {\n ...theme.colors,\n ...theme.modes[mode]\n };\n}\n\n// src/ThemeProvider.tsx\nvar ThemeContext;\nvar getThemeContext = () => {\n if (typeof window !== \"undefined\") {\n const globalWindow = window;\n if (!globalWindow.__principlemd_theme_context__) {\n globalWindow.__principlemd_theme_context__ = createContext(undefined);\n }\n return globalWindow.__principlemd_theme_context__;\n } else {\n if (!ThemeContext) {\n ThemeContext = createContext(undefined);\n }\n return ThemeContext;\n }\n};\nvar ThemeContextSingleton = getThemeContext();\nvar useTheme = () => {\n const context = useContext(ThemeContextSingleton);\n if (!context) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\nvar ThemeProvider = ({\n children,\n theme: customTheme = theme,\n initialMode\n}) => {\n const [mode, setMode] = useState(initialMode);\n const activeTheme = React.useMemo(() => {\n if (!mode || !customTheme.modes || !customTheme.modes[mode]) {\n return customTheme;\n }\n return {\n ...customTheme,\n colors: getMode(customTheme, mode)\n };\n }, [customTheme, mode]);\n useEffect(() => {\n if (!initialMode) {\n const savedMode = localStorage.getItem(\"principlemd-theme-mode\");\n if (savedMode) {\n setMode(savedMode);\n }\n }\n }, [initialMode]);\n useEffect(() => {\n if (mode) {\n localStorage.setItem(\"principlemd-theme-mode\", mode);\n } else {\n localStorage.removeItem(\"principlemd-theme-mode\");\n }\n }, [mode]);\n const value = {\n theme: activeTheme,\n mode,\n setMode\n };\n return /* @__PURE__ */ React.createElement(ThemeContextSingleton.Provider, {\n value\n }, children);\n};\nvar withTheme = (Component) => {\n return (props) => {\n const { theme: theme2 } = useTheme();\n return /* @__PURE__ */ React.createElement(Component, {\n ...props,\n theme: theme2\n });\n };\n};\n// src/utils.ts\nvar getColor = (theme2, colorKey) => {\n const colors = theme2.colors;\n const value = colors[colorKey];\n return typeof value === \"string\" ? value : colorKey;\n};\nvar getSpace = (theme2, index) => {\n return theme2.space[index] || 0;\n};\nvar getFontSize = (theme2, index) => {\n return theme2.fontSizes[index] || theme2.fontSizes[2];\n};\nvar getRadius = (theme2, index) => {\n return theme2.radii[index] || 0;\n};\nvar getShadow = (theme2, index) => {\n return theme2.shadows[index] || \"none\";\n};\nvar getZIndex = (theme2, index) => {\n return theme2.zIndices[index] || 0;\n};\nvar responsive = (values) => {\n return values.reduce((acc, value, index) => {\n if (index === 0) {\n return value;\n }\n return {\n ...acc,\n [`@media screen and (min-width: ${values[index - 1]})`]: value\n };\n }, {});\n};\nvar sx = (styles) => styles;\nvar createStyle = (theme2, styleObj) => {\n const processValue = (value) => {\n if (typeof value === \"string\") {\n if (value in theme2.colors) {\n return getColor(theme2, value);\n }\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (typeof value === \"object\" && value !== null) {\n const processed2 = {};\n for (const [key, val] of Object.entries(value)) {\n processed2[key] = processValue(val);\n }\n return processed2;\n }\n return value;\n };\n const processed = {};\n for (const [key, val] of Object.entries(styleObj)) {\n processed[key] = processValue(val);\n }\n return processed;\n};\nvar mergeThemes = (baseTheme, ...overrides) => {\n return overrides.reduce((theme2, override) => ({\n space: override.space || theme2.space,\n fonts: { ...theme2.fonts, ...override.fonts || {} },\n fontSizes: override.fontSizes || theme2.fontSizes,\n fontWeights: { ...theme2.fontWeights, ...override.fontWeights || {} },\n lineHeights: { ...theme2.lineHeights, ...override.lineHeights || {} },\n breakpoints: override.breakpoints || theme2.breakpoints,\n sizes: override.sizes || theme2.sizes,\n radii: override.radii || theme2.radii,\n shadows: override.shadows || theme2.shadows,\n zIndices: override.zIndices || theme2.zIndices,\n colors: {\n ...theme2.colors,\n ...override.colors || {}\n },\n buttons: { ...theme2.buttons, ...override.buttons || {} },\n text: { ...theme2.text, ...override.text || {} },\n cards: { ...theme2.cards, ...override.cards || {} }\n }), baseTheme);\n};\n// src/ThemeShowcase.tsx\nimport React2 from \"react\";\nvar ThemeShowcase = ({\n theme: theme2,\n title,\n showValues = true,\n sections = [\"colors\", \"typography\", \"spacing\", \"shadows\", \"radii\"]\n}) => {\n const containerStyle = {\n fontFamily: theme2.fonts.body,\n color: theme2.colors.text,\n backgroundColor: theme2.colors.background,\n padding: theme2.space[4],\n minHeight: \"100vh\"\n };\n const sectionStyle = {\n marginBottom: theme2.space[5],\n padding: theme2.space[4],\n backgroundColor: theme2.colors.surface || theme2.colors.backgroundSecondary,\n borderRadius: theme2.radii[2],\n border: `1px solid ${theme2.colors.border}`\n };\n const headingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[5],\n fontWeight: theme2.fontWeights.heading,\n marginBottom: theme2.space[3],\n color: theme2.colors.primary\n };\n const subheadingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[3],\n fontWeight: theme2.fontWeights.medium,\n marginBottom: theme2.space[2],\n marginTop: theme2.space[3],\n color: theme2.colors.text\n };\n return /* @__PURE__ */ React2.createElement(\"div\", {\n style: containerStyle\n }, title && /* @__PURE__ */ React2.createElement(\"h1\", {\n style: {\n ...headingStyle,\n fontSize: theme2.fontSizes[6],\n marginBottom: theme2.space[4]\n }\n }, title), sections.includes(\"colors\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Colors\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Primary Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"text\", \"background\", \"primary\", \"secondary\", \"accent\", \"muted\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Status Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"success\", \"warning\", \"error\", \"info\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Background Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3]\n }\n }, [\"backgroundSecondary\", \"backgroundTertiary\", \"backgroundLight\", \"backgroundHover\", \"surface\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n padding: theme2.space[3],\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary,\n marginTop: theme2.space[1]\n }\n }, color));\n }))), sections.includes(\"typography\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Typography\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Families\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[4],\n marginBottom: theme2.space[2]\n }\n }, \"Heading Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.heading)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[2],\n marginBottom: theme2.space[2]\n }\n }, \"Body Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.body)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[2]\n }\n }, \"Monospace Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.monospace))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Sizes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, theme2.fontSizes.map((size, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: {\n fontSize: size,\n lineHeight: theme2.lineHeights.body,\n marginBottom: theme2.space[1]\n }\n }, \"Size \", index, \": Sample Text \", showValues && `(${size}px)`))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Weights\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: theme2.space[2]\n }\n }, Object.entries(theme2.fontWeights).map(([name, weight]) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: name,\n style: {\n fontWeight: weight,\n fontSize: theme2.fontSizes[2]\n }\n }, name, \" \", showValues && `(${weight})`)))), sections.includes(\"spacing\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Spacing\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: theme2.space[2] }\n }, theme2.space.map((space, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { display: \"flex\", alignItems: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 60,\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"]\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n height: 24,\n width: space,\n backgroundColor: theme2.colors.primary,\n borderRadius: theme2.radii[1]\n }\n }), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n marginLeft: theme2.space[2],\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, space, \"px\"))))), sections.includes(\"radii\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Border Radii\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n gap: theme2.space[3]\n }\n }, theme2.radii.map((radius, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 80,\n height: 80,\n backgroundColor: theme2.colors.primary,\n borderRadius: radius,\n marginBottom: theme2.space[1],\n margin: \"0 auto\"\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"] \", showValues && `${radius}px`))))), sections.includes(\"shadows\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Shadows\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: theme2.space[4]\n }\n }, theme2.shadows.map((shadow, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 100,\n height: 100,\n backgroundColor: theme2.colors.background,\n boxShadow: shadow,\n borderRadius: theme2.radii[2],\n margin: \"0 auto\",\n marginBottom: theme2.space[2],\n border: `1px solid ${theme2.colors.border}`\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"Shadow [\", index, \"]\"), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textMuted,\n marginTop: theme2.space[1]\n }\n }, shadow === \"none\" ? \"none\" : \"...\"))))), theme2.modes && Object.keys(theme2.modes).length > 0 && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Available Modes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"flex\",\n gap: theme2.space[2],\n flexWrap: \"wrap\"\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.primary,\n color: \"#ffffff\",\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, \"default\"), Object.keys(theme2.modes).map((modeName) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: modeName,\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.secondary,\n color: theme2.colors.text,\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, modeName)))));\n};\n\n// src/index.ts\nvar theme = terminalTheme;\nfunction scaleThemeFonts(theme2, scale) {\n const currentScale = theme2.fontScale || 1;\n const effectiveScale = scale / currentScale;\n return {\n ...theme2,\n fontSizes: theme2.fontSizes.map((size) => Math.round(size * effectiveScale)),\n fontScale: scale\n };\n}\nfunction increaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.min(currentScale * 1.1, 2);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction decreaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.max(currentScale * 0.9, 0.5);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction resetFontScale(theme2) {\n return scaleThemeFonts(theme2, 1);\n}\nvar src_default = theme;\nexport {\n withTheme,\n useTheme,\n theme,\n terminalTheme,\n sx,\n slateTheme,\n scaleThemeFonts,\n responsive,\n resetFontScale,\n regalTheme,\n overrideColors,\n mergeThemes,\n matrixTheme,\n matrixMinimalTheme,\n makeTheme,\n increaseFontScale,\n glassmorphismTheme,\n getZIndex,\n getSpace,\n getShadow,\n getRadius,\n getMode,\n getFontSize,\n getColor,\n defaultTerminalTheme,\n defaultMarkdownTheme,\n defaultEditorTheme,\n src_default as default,\n decreaseFontScale,\n createStyle,\n addMode,\n ThemeShowcase,\n ThemeProvider\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport type { Theme } from '@principal-ade/industry-theme';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\n\nexport type { QualityMetrics };\nexport type QualityTier = 'none' | 'bronze' | 'silver' | 'gold' | 'platinum';\nexport type MetricKey = 'types' | 'documentation' | 'tests' | 'deadCode' | 'formatting' | 'linting';\n\nexport interface VertexHoverInfo {\n key: MetricKey;\n label: string;\n value: number;\n color: string;\n}\n\ninterface QualityHexagonProps {\n metrics: QualityMetrics;\n tier: QualityTier;\n theme: Theme;\n showLabels?: boolean;\n showValues?: boolean;\n className?: string;\n onVertexHover?: (info: VertexHoverInfo) => void;\n onVertexLeave?: () => void;\n onVertexClick?: (info: VertexHoverInfo) => void;\n}\n\n// Helper to extract theme colors\nfunction getThemeColors(theme: Theme) {\n return {\n gridColor: theme.colors.border,\n axisColor: theme.colors.muted,\n textColor: theme.colors.text,\n scoreColor: theme.colors.text,\n tierColors: {\n none: { fill: theme.colors.muted, stroke: theme.colors.border, bg: theme.colors.backgroundLight },\n bronze: { fill: theme.colors.warning, stroke: theme.colors.warning, bg: theme.colors.backgroundLight },\n silver: { fill: theme.colors.secondary, stroke: theme.colors.secondary, bg: theme.colors.backgroundLight },\n gold: { fill: theme.colors.accent, stroke: theme.colors.accent, bg: theme.colors.backgroundLight },\n platinum: { fill: theme.colors.primary, stroke: theme.colors.primary, bg: theme.colors.backgroundLight }\n },\n metricColors: {\n types: theme.colors.warning,\n documentation: theme.colors.info,\n tests: theme.colors.success,\n deadCode: theme.colors.error,\n formatting: theme.colors.accent,\n linting: theme.colors.primary\n },\n qualityIndicators: {\n good: theme.colors.success,\n medium: theme.colors.warning,\n poor: theme.colors.error\n }\n };\n}\n\n// Metrics ordered clockwise from top-left\nconst getMetricConfig = (themeColors: ReturnType<typeof getThemeColors>) => [\n { key: 'types', label: 'Types', color: themeColors.metricColors.types, angle: -120 },\n { key: 'documentation', label: 'Docs', color: themeColors.metricColors.documentation, angle: -60 },\n { key: 'tests', label: 'Tests', color: themeColors.metricColors.tests, angle: 0 },\n { key: 'deadCode', label: 'Dead Code', color: themeColors.metricColors.deadCode, angle: 60 },\n { key: 'formatting', label: 'Format', color: themeColors.metricColors.formatting, angle: 120 },\n { key: 'linting', label: 'Linting', color: themeColors.metricColors.linting, angle: 180 }\n] as const;\n\nfunction calculateHexagonPoints(center: number, radius: number, metricConfig: ReturnType<typeof getMetricConfig>): string {\n return metricConfig\n .map(({ angle }) => {\n const radian = (angle * Math.PI) / 180;\n const x = center + radius * Math.cos(radian);\n const y = center + radius * Math.sin(radian);\n return `${x},${y}`;\n })\n .join(' ');\n}\n\nfunction calculateMetricPoint(\n center: number,\n radius: number,\n angle: number,\n value: number\n): { x: number; y: number } {\n const actualRadius = (radius * value) / 100;\n const radian = (angle * Math.PI) / 180;\n return {\n x: center + actualRadius * Math.cos(radian),\n y: center + actualRadius * Math.sin(radian)\n };\n}\n\nexport function QualityHexagon({\n metrics,\n tier,\n theme,\n showLabels = false,\n showValues = false,\n className,\n onVertexHover,\n onVertexLeave,\n onVertexClick,\n}: QualityHexagonProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n // Use fixed internal coordinates for viewBox\n const viewBoxSize = 300;\n const center = viewBoxSize / 2;\n const radius = viewBoxSize * 0.28;\n const padding = viewBoxSize * 0.1;\n const fontSize = viewBoxSize * 0.04;\n const strokeWidth = viewBoxSize * 0.008;\n const dotSize = viewBoxSize * 0.015;\n\n const hexagonPoints = calculateHexagonPoints(center, radius, metricConfig);\n\n const dataPoints = metricConfig\n .map(({ key, angle }) => {\n let value = metrics[key as keyof QualityMetrics];\n // Invert dead code metric (less is better)\n if (key === 'deadCode') {\n value = 100 - value;\n }\n return calculateMetricPoint(center, radius, angle, value);\n })\n .map(p => `${p.x},${p.y}`)\n .join(' ');\n\n // Calculate average with inverted dead code\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n const averageScore = Math.round(\n Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6\n );\n\n const hexagon = (\n <svg\n viewBox={`0 0 ${viewBoxSize} ${viewBoxSize}`}\n className={cn('w-full h-full transition-all duration-300', className)}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {/* Grid lines */}\n <g className=\"opacity-20\">\n {[20, 40, 60, 80, 100].map((percent) => (\n <polygon\n key={percent}\n points={calculateHexagonPoints(center, (radius * percent) / 100, metricConfig)}\n fill=\"none\"\n stroke={themeColors.gridColor}\n strokeWidth={0.5}\n style={{ opacity: 0.4 }}\n />\n ))}\n </g>\n\n {/* Axes */}\n {metricConfig.map(({ angle }) => {\n const endPoint = calculateMetricPoint(center, radius, angle, 100);\n return (\n <line\n key={angle}\n x1={center}\n y1={center}\n x2={endPoint.x}\n y2={endPoint.y}\n stroke={themeColors.axisColor}\n strokeWidth={0.5}\n style={{ opacity: 0.5 }}\n />\n );\n })}\n\n {/* Outer hexagon */}\n <polygon\n points={hexagonPoints}\n fill=\"none\"\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ opacity: 0.3 }}\n />\n\n {/* Data polygon */}\n <polygon\n points={dataPoints}\n fill={colors.fill}\n fillOpacity={0.3}\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ transition: 'all 0.5s ease' }}\n />\n\n {/* Vertex dots */}\n {metricConfig.map(({ key, label, color, angle }) => {\n const rawValue = metrics[key as keyof QualityMetrics];\n let value = rawValue;\n // Invert dead code metric for display\n if (key === 'deadCode') {\n value = 100 - value;\n }\n const point = calculateMetricPoint(center, radius, angle, 100);\n const dataPoint = calculateMetricPoint(center, radius, angle, value);\n\n const vertexInfo: VertexHoverInfo = {\n key: key as MetricKey,\n label,\n value: rawValue,\n color,\n };\n\n const handleMouseEnter = () => {\n onVertexHover?.(vertexInfo);\n };\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onVertexClick?.(vertexInfo);\n };\n\n return (\n <g\n key={key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onVertexLeave}\n onClick={handleClick}\n style={{ cursor: (onVertexHover || onVertexClick) ? 'pointer' : 'default' }}\n >\n {/* Larger invisible hit area for easier hovering */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize * 2.5}\n fill=\"transparent\"\n />\n {/* Outer vertex marker */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize}\n fill=\"white\"\n stroke={colors.stroke}\n strokeWidth={1.5}\n />\n {/* Value indicator */}\n <circle\n cx={dataPoint.x}\n cy={dataPoint.y}\n r={dotSize * 0.7}\n fill={colors.fill}\n stroke={colors.stroke}\n strokeWidth={1}\n style={{ opacity: 0.9 }}\n />\n </g>\n );\n })}\n\n {/* Center score */}\n <text\n x={center}\n y={center}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.scoreColor}\n fontSize={fontSize * 1.5}\n fontWeight=\"600\"\n >\n {averageScore}\n </text>\n <text\n x={center}\n y={center + fontSize}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize * 0.8}\n style={{ opacity: 0.6 }}\n >\n avg\n </text>\n\n {/* Labels */}\n {showLabels && (\n <>\n {metricConfig.map(({ key, label, angle }) => {\n const labelRadius = radius + padding * 1.2;\n const point = calculateMetricPoint(center, labelRadius, angle, 100);\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <text\n key={key}\n x={point.x}\n y={point.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize}\n >\n {showValues ? `${value}%` : label}\n </text>\n );\n })}\n </>\n )}\n </svg>\n );\n\n // For non-interactive mode or when tooltips are not available, just return the hexagon\n return hexagon;\n}\n\nexport function QualityHexagonCompact({\n metrics,\n tier,\n theme,\n className\n}: Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'>) {\n return (\n <div className={cn('w-20 h-20', className)}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={false}\n showValues={false}\n />\n </div>\n );\n}\n\ninterface QualityHexagonDetailedProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n}\n\nexport function QualityHexagonDetailed({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n onRefresh,\n isRefreshing = false,\n}: QualityHexagonDetailedProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n\n const hasHeader = packageName || onRefresh;\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: colors.bg,\n }}\n >\n {hasHeader && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 24,\n }}>\n <div style={{ flex: '1 1 200px', maxWidth: 300, aspectRatio: '1 / 1' }}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={true}\n showValues={false}\n />\n </div>\n\n <div style={{ flex: '1 1 200px', minWidth: 200, display: 'flex', flexDirection: 'column', gap: 8, padding: '8px 24px' }}>\n {metricConfig.map(({ key, label, color }) => {\n const value = metrics[key as keyof QualityMetrics];\n const displayValue = value;\n\n return (\n <div key={key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: color,\n }}>\n {displayValue}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\ninterface QualityHexagonExpandableProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n defaultExpanded?: boolean;\n}\n\nexport function QualityHexagonExpandable({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n onRefresh,\n isRefreshing = false,\n defaultExpanded = false,\n}: QualityHexagonExpandableProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n\n const hasHeader = packageName || onRefresh;\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: colors.bg,\n flex: '1 1 200px',\n }}\n >\n {hasHeader && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Clickable hexagon */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n cursor: 'pointer',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <div style={{ width: 200, height: 200 }}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={true}\n showValues={false}\n />\n </div>\n </div>\n\n {/* Expandable metrics breakdown */}\n <div\n style={{\n display: 'grid',\n gridTemplateRows: expanded ? '1fr' : '0fr',\n transition: 'grid-template-rows 0.3s ease',\n }}\n >\n <div style={{ overflow: 'hidden' }}>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: '8px 24px',\n borderTop: `1px solid ${theme.colors.border}`,\n marginTop: 8,\n }}>\n {metricConfig.map(({ key, label, color }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div key={key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: color,\n }}>\n {value}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Expand/collapse indicator */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n display: 'flex',\n justifyContent: 'center',\n cursor: 'pointer',\n padding: 4,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.3s ease',\n }}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n </div>\n );\n}\n\n/**\n * Calculate the quality tier based on metrics\n */\nexport function calculateQualityTier(metrics: QualityMetrics): QualityTier {\n // Invert dead code for calculation (less is better)\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n\n const average = Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6;\n\n if (average >= 90) return 'platinum';\n if (average >= 75) return 'gold';\n if (average >= 60) return 'silver';\n if (average >= 40) return 'bronze';\n return 'none';\n}\n","import React from 'react';\nimport { Terminal, Copy, Check, ChevronRight } from 'lucide-react';\nimport type { Theme } from '@principal-ade/industry-theme';\n\ninterface QualityEmptyStateProps {\n theme: Theme;\n hasWorkflow: boolean;\n}\n\nconst WORKFLOW_FILE_PATH = '.github/workflows/quality-lens.yml';\n\n/**\n * Check if a file path exists in a FileTree's allFiles array\n */\nexport function checkFileExistsInTree(\n treeData: { allFiles?: Array<{ relativePath?: string; path?: string }> } | undefined,\n targetPath: string\n): boolean {\n if (!treeData?.allFiles) return false;\n\n const normalizedTarget = targetPath.replace(/^\\//, '').toLowerCase();\n\n return treeData.allFiles.some((file) => {\n const filePath = (file.relativePath || file.path || '').toLowerCase();\n return filePath.endsWith(normalizedTarget) || filePath === normalizedTarget;\n });\n}\n\n/**\n * Copyable command line component\n */\nconst CommandLine: React.FC<{\n command: string;\n theme: Theme;\n}> = ({ command, theme }) => {\n const [copied, setCopied] = React.useState(false);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n console.log('Copy:', command);\n }\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '10px 14px',\n borderRadius: 6,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n fontFamily: 'monospace',\n fontSize: 13,\n }}\n >\n <code style={{ color: theme.colors.text }}>{command}</code>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 4,\n border: 'none',\n backgroundColor: 'transparent',\n color: theme.colors.textMuted,\n cursor: 'pointer',\n }}\n title=\"Copy command\"\n >\n {copied ? (\n <Check size={16} color={theme.colors.success} />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n );\n};\n\n/**\n * Empty state component for when no quality data is available\n */\nexport const QualityEmptyState: React.FC<QualityEmptyStateProps> = ({\n theme,\n hasWorkflow,\n}) => {\n if (hasWorkflow) {\n // Workflow exists but no data yet\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: '16px 0',\n gap: 16,\n width: '100%',\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 14,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Quality metrics will appear here after your next CI run completes.\n </p>\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '10px 14px',\n borderRadius: 6,\n backgroundColor: `${theme.colors.success}15`,\n color: theme.colors.success,\n fontSize: 13,\n }}\n >\n <Check size={16} />\n <span>Workflow detected at {WORKFLOW_FILE_PATH}</span>\n </div>\n </div>\n );\n }\n\n // No workflow - show CLI setup instructions\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: '16px 0',\n gap: 16,\n width: '100%',\n }}\n >\n {/* Description */}\n <p\n style={{\n margin: 0,\n fontSize: 14,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Track your code quality with automated analysis of tests, linting,\n types, formatting, dead code, and documentation.\n </p>\n\n {/* CLI Setup Steps */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n padding: 20,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n marginBottom: 4,\n }}\n >\n <Terminal size={20} color={theme.colors.text} />\n <h4\n style={{\n margin: 0,\n fontSize: 15,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Get Started\n </h4>\n </div>\n\n {/* Step 1 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 1\n </span>\n <span>Install the CLI</span>\n </div>\n <CommandLine\n command=\"npm install -g @principal-ai/quality-lens-cli\"\n theme={theme}\n />\n </div>\n\n {/* Step 2 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 2\n </span>\n <span>Check what quality tools are available</span>\n </div>\n <CommandLine command=\"quality-lens list\" theme={theme} />\n </div>\n\n {/* Step 3 */}\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n marginBottom: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 20,\n height: 20,\n borderRadius: '50%',\n backgroundColor: theme.colors.primary,\n color: theme.colors.background,\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n 3\n </span>\n <span>Set up the GitHub Action</span>\n </div>\n <CommandLine command=\"quality-lens init\" theme={theme} />\n </div>\n\n {/* Next steps hint */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n paddingTop: 8,\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n <ChevronRight size={14} />\n <span>Then commit and push to start tracking quality</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport { WORKFLOW_FILE_PATH };\n","import React from 'react';\nimport { Hexagon } from 'lucide-react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { PanelComponentProps } from '../types';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport {\n QualityHexagonExpandable,\n QualityTier,\n calculateQualityTier,\n} from '../components/QualityHexagon';\nimport {\n QualityEmptyState,\n checkFileExistsInTree,\n WORKFLOW_FILE_PATH,\n} from '../components/QualityEmptyState';\n\n// Mock package data - in real usage, this would come from a quality slice\nconst mockPackages: Array<{\n name: string;\n version?: string;\n metrics: QualityMetrics;\n}> = [\n {\n name: '@principal-ade/code-quality-panels',\n version: '0.1.0',\n metrics: {\n tests: 75,\n deadCode: 15,\n linting: 85,\n formatting: 90,\n types: 88,\n documentation: 65,\n },\n },\n];\n\n// Package quality data shape from slice\ninterface PackageQuality {\n name: string;\n version?: string;\n metrics: QualityMetrics;\n}\n\n// Slice data shape\ninterface QualitySliceData {\n packages: PackageQuality[];\n lastUpdated: string;\n}\n\n/**\n * QualityHexagonPanelContent - Internal component that uses theme\n */\nconst QualityHexagonPanelContent: React.FC<PanelComponentProps> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n const [refreshingPackages, setRefreshingPackages] = React.useState<Set<string>>(new Set());\n\n // Get quality data from context if available\n const qualitySlice = context.getSlice<QualitySliceData>('quality');\n const hasQualitySlice = context.hasSlice('quality');\n const isLoading = qualitySlice?.loading ?? false;\n\n // Get file tree to check for workflow presence\n const fileTreeSlice = context.getSlice<{ allFiles?: Array<{ relativePath?: string; path?: string }> }>('fileTree');\n const hasWorkflow = React.useMemo(() => {\n return checkFileExistsInTree(fileTreeSlice?.data ?? undefined, WORKFLOW_FILE_PATH);\n }, [fileTreeSlice?.data]);\n\n // Determine packages to display\n // - If slice exists and has data, use it\n // - If slice exists but is loading/empty, show empty\n // - If no slice at all, use mock data for demo\n const packages: PackageQuality[] = React.useMemo(() => {\n if (qualitySlice?.data?.packages) {\n return qualitySlice.data.packages;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet (loading or empty)\n return [];\n }\n // No slice - use mock for demo\n return mockPackages;\n }, [qualitySlice?.data?.packages, hasQualitySlice]);\n\n // Handle refresh for a specific package\n const handleRefreshPackage = async (packageName: string) => {\n setRefreshingPackages(prev => new Set(prev).add(packageName));\n try {\n if (context.hasSlice('quality')) {\n // In future, this could refresh just one package\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(prev => {\n const next = new Set(prev);\n next.delete(packageName);\n return next;\n });\n }\n };\n\n // Handle refresh all\n const handleRefreshAll = async () => {\n const allNames = packages.map(p => p.name);\n setRefreshingPackages(new Set(allNames));\n try {\n if (context.hasSlice('quality')) {\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(new Set());\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on('principal-ade.quality-panel:refresh', async () => {\n await handleRefreshAll();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context, packages]);\n\n // Tier colors for display\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n // Calculate overall tier from all packages\n const overallTier = packages.length > 0\n ? calculateQualityTier(\n packages.reduce((acc, pkg) => ({\n tests: acc.tests + pkg.metrics.tests / packages.length,\n deadCode: acc.deadCode + pkg.metrics.deadCode / packages.length,\n linting: acc.linting + pkg.metrics.linting / packages.length,\n formatting: acc.formatting + pkg.metrics.formatting / packages.length,\n types: acc.types + pkg.metrics.types / packages.length,\n documentation: acc.documentation + pkg.metrics.documentation / packages.length,\n }), { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 })\n )\n : 'none';\n\n return (\n <div\n style={{\n fontFamily: theme.fonts.body,\n height: '100%',\n minHeight: 0,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n overflowY: 'auto',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n padding: 20,\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n }}\n >\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <Hexagon size={24} color={tierColors[overallTier]} />\n <h2\n style={{\n margin: 0,\n fontSize: 20,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Code Quality\n </h2>\n <span\n title=\"Platinum: 90%+ avg | Gold: 75%+ | Silver: 60%+ | Bronze: 40%+\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 18,\n height: 18,\n borderRadius: '50%',\n border: `1px solid ${theme.colors.border}`,\n fontSize: 12,\n color: theme.colors.textMuted,\n cursor: 'help',\n }}\n >\n ?\n </span>\n {packages.length > 1 && (\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {packages.length} packages\n </span>\n )}\n </div>\n\n {/* Quality Hexagons for each package */}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 16, minHeight: 0 }}>\n {isLoading ? (\n <div style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}>\n Loading quality metrics...\n </div>\n ) : packages.length === 0 ? (\n <QualityEmptyState\n theme={theme}\n hasWorkflow={hasWorkflow}\n />\n ) : (\n packages.map((pkg) => {\n const tier = calculateQualityTier(pkg.metrics);\n return (\n <QualityHexagonExpandable\n key={pkg.name}\n metrics={pkg.metrics}\n tier={tier}\n theme={theme}\n packageName={pkg.name}\n packageVersion={pkg.version}\n />\n );\n })\n )}\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * QualityHexagonPanel - A panel for visualizing code quality metrics\n */\nexport const QualityHexagonPanel = QualityHexagonPanelContent;\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport type { Theme } from '@principal-ade/industry-theme';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport { QualityHexagon, calculateQualityTier, type QualityTier, type VertexHoverInfo, type MetricKey } from './QualityHexagon';\n\nexport type { VertexHoverInfo, MetricKey };\n\nconst METRIC_OPTIONS: Array<{ key: MetricKey; label: string }> = [\n { key: 'types', label: 'Types' },\n { key: 'documentation', label: 'Docs' },\n { key: 'tests', label: 'Tests' },\n { key: 'deadCode', label: 'Dead Code' },\n { key: 'formatting', label: 'Format' },\n { key: 'linting', label: 'Linting' },\n];\n\n/**\n * Represents a single package within a repository\n */\nexport interface PackageQualityItem {\n /** Package name (e.g., \"@acme/core\" or \"my-app\") */\n name: string;\n /** Optional version string */\n version?: string;\n /** Quality metrics for this package */\n metrics: QualityMetrics;\n}\n\n/**\n * Represents a repository with one or more packages\n */\nexport interface RepositoryQualityItem {\n /** Unique identifier for the repository */\n id: string;\n /** Repository name */\n name: string;\n /** Optional path to the repository */\n path?: string;\n /** Packages within this repository (monorepos have multiple) */\n packages: PackageQualityItem[];\n}\n\n/**\n * A flattened item for display in the grid\n */\nexport interface FlatGridItem {\n /** Unique key for React */\n key: string;\n /** Repository ID */\n repositoryId: string;\n /** Repository name */\n repositoryName: string;\n /** Package name */\n packageName: string;\n /** Optional version */\n version?: string;\n /** Quality metrics */\n metrics: QualityMetrics;\n /** Calculated tier */\n tier: QualityTier;\n}\n\ninterface RepositoryQualityGridProps {\n /** Array of repositories with their packages */\n repositories: RepositoryQualityItem[];\n /** Theme from @principal-ade/industry-theme */\n theme: Theme;\n /** Callback when a grid item is clicked */\n onItemClick?: (item: FlatGridItem) => void;\n /** Callback when a hexagon vertex is clicked */\n onVertexClick?: (item: FlatGridItem, vertex: VertexHoverInfo) => void;\n /** Optional CSS class */\n className?: string;\n /** Show repository name in label (default: true) */\n showRepositoryName?: boolean;\n /** Show overall summary header (default: true) */\n showSummary?: boolean;\n}\n\ninterface RepositoryQualityGridItemProps {\n /** The flattened item to display */\n item: FlatGridItem;\n /** Theme */\n theme: Theme;\n /** Click handler for the card */\n onClick?: () => void;\n /** Click handler for hexagon vertices */\n onVertexClick?: (item: FlatGridItem, vertex: VertexHoverInfo) => void;\n /** Show repository name in label */\n showRepositoryName?: boolean;\n /** Selected metric to display (from dropdown) */\n selectedMetric?: MetricKey | null;\n /** Optional CSS class */\n className?: string;\n}\n\n/**\n * Flatten repositories into a single array of grid items\n */\nfunction flattenRepositories(repositories: RepositoryQualityItem[]): FlatGridItem[] {\n const items: FlatGridItem[] = [];\n\n for (const repo of repositories) {\n for (const pkg of repo.packages) {\n items.push({\n key: `${repo.id}:${pkg.name}`,\n repositoryId: repo.id,\n repositoryName: repo.name,\n packageName: pkg.name,\n version: pkg.version,\n metrics: pkg.metrics,\n tier: calculateQualityTier(pkg.metrics),\n });\n }\n }\n\n return items;\n}\n\n/**\n * Calculate overall tier from all items\n */\nfunction calculateOverallTier(items: FlatGridItem[]): QualityTier {\n if (items.length === 0) return 'none';\n\n const avgMetrics = items.reduce(\n (acc, item) => ({\n tests: acc.tests + item.metrics.tests / items.length,\n deadCode: acc.deadCode + item.metrics.deadCode / items.length,\n linting: acc.linting + item.metrics.linting / items.length,\n formatting: acc.formatting + item.metrics.formatting / items.length,\n types: acc.types + item.metrics.types / items.length,\n documentation: acc.documentation + item.metrics.documentation / items.length,\n }),\n { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 }\n );\n\n return calculateQualityTier(avgMetrics);\n}\n\n/**\n * Format the display label for an item\n */\nfunction formatLabel(\n item: FlatGridItem,\n showRepositoryName: boolean,\n isSameAsRepo: boolean\n): string {\n if (!showRepositoryName || isSameAsRepo) {\n return item.packageName;\n }\n return `${item.repositoryName} / ${item.packageName}`;\n}\n\n/**\n * Individual grid item component\n */\n// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: MetricKey, theme: Theme): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === 'deadCode' ? 100 - value : value;\n\n if (effectiveValue >= 80) return theme.colors.success;\n if (effectiveValue >= 60) return theme.colors.warning;\n return theme.colors.error;\n}\n\nexport function RepositoryQualityGridItem({\n item,\n theme,\n onClick,\n onVertexClick,\n showRepositoryName = true,\n selectedMetric,\n className,\n}: RepositoryQualityGridItemProps) {\n const [hoveredVertex, setHoveredVertex] = React.useState<VertexHoverInfo | null>(null);\n const isSameAsRepo = item.packageName === item.repositoryName;\n const label = formatLabel(item, showRepositoryName, isSameAsRepo);\n\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n // Get the display info - either from selected metric or hovered vertex\n const displayInfo = React.useMemo(() => {\n if (selectedMetric) {\n const option = METRIC_OPTIONS.find(o => o.key === selectedMetric);\n if (option) {\n const value = item.metrics[selectedMetric];\n return {\n label: option.label,\n value,\n valueColor: getValueColor(value, selectedMetric, theme),\n };\n }\n }\n if (hoveredVertex) {\n return {\n label: hoveredVertex.label,\n value: hoveredVertex.value,\n valueColor: getValueColor(hoveredVertex.value, hoveredVertex.key, theme),\n };\n }\n return null;\n }, [selectedMetric, hoveredVertex, item.metrics, theme]);\n\n return (\n <div\n className={cn(className)}\n onClick={onClick}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 8,\n padding: 12,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n cursor: onClick ? 'pointer' : 'default',\n transition: 'all 0.2s ease',\n }}\n onMouseEnter={(e) => {\n if (onClick) {\n e.currentTarget.style.borderColor = tierColors[item.tier];\n e.currentTarget.style.transform = 'translateY(-2px)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = theme.colors.border;\n e.currentTarget.style.transform = 'translateY(0)';\n setHoveredVertex(null);\n }}\n >\n {/* Metric info header */}\n <div\n style={{\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n width: '100%',\n minHeight: 24,\n }}\n >\n {displayInfo ? (\n <>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {displayInfo.label}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: displayInfo.valueColor,\n }}\n >\n {displayInfo.value}%\n </span>\n </>\n ) : (\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n Hover a corner\n </span>\n )}\n </div>\n <div style={{ width: 200, height: 200 }}>\n <QualityHexagon\n metrics={item.metrics}\n tier={item.tier}\n theme={theme}\n showLabels={false}\n showValues={false}\n onVertexHover={setHoveredVertex}\n onVertexLeave={() => setHoveredVertex(null)}\n onVertexClick={onVertexClick ? (vertex) => onVertexClick(item, vertex) : undefined}\n />\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: theme.colors.text,\n textAlign: 'center',\n }}\n >\n {label}\n </span>\n {item.version && (\n <span\n style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n }}\n >\n v{item.version}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * RepositoryQualityGrid - Displays a flat grid of quality hexagons\n * for multiple repositories and their packages.\n *\n * Each hexagon shows the quality metrics for a single package,\n * labeled with \"repo / package\" format for clarity.\n */\n// Calculate average score for an item (with deadCode inverted)\nfunction calculateAverageScore(metrics: QualityMetrics): number {\n const adjusted = { ...metrics };\n adjusted.deadCode = 100 - adjusted.deadCode;\n return Object.values(adjusted).reduce((a, b) => a + b, 0) / 6;\n}\n\nexport function RepositoryQualityGrid({\n repositories,\n theme,\n onItemClick,\n onVertexClick,\n className,\n showRepositoryName = true,\n showSummary = true,\n}: RepositoryQualityGridProps) {\n const [selectedMetric, setSelectedMetric] = React.useState<MetricKey | null>(null);\n const items = React.useMemo(() => flattenRepositories(repositories), [repositories]);\n const overallTier = React.useMemo(() => calculateOverallTier(items), [items]);\n\n // Sort items based on selected metric or average\n const sortedItems = React.useMemo(() => {\n return [...items].sort((a, b) => {\n if (selectedMetric) {\n // Sort by selected metric (for deadCode, lower is better so invert)\n const aVal = selectedMetric === 'deadCode'\n ? 100 - a.metrics[selectedMetric]\n : a.metrics[selectedMetric];\n const bVal = selectedMetric === 'deadCode'\n ? 100 - b.metrics[selectedMetric]\n : b.metrics[selectedMetric];\n return bVal - aVal; // Descending (best first)\n } else {\n // Sort by average score\n return calculateAverageScore(b.metrics) - calculateAverageScore(a.metrics);\n }\n });\n }, [items, selectedMetric]);\n\n const tierColors: Record<QualityTier, string> = {\n none: theme.colors.muted,\n bronze: theme.colors.warning,\n silver: theme.colors.secondary,\n gold: theme.colors.accent,\n platinum: theme.colors.primary,\n };\n\n const tierLabels: Record<QualityTier, string> = {\n none: 'No Data',\n bronze: 'Bronze',\n silver: 'Silver',\n gold: 'Gold',\n platinum: 'Platinum',\n };\n\n if (items.length === 0) {\n return (\n <div\n className={cn(className)}\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.background,\n borderRadius: 8,\n }}\n >\n No repositories to display\n </div>\n );\n }\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n backgroundColor: theme.colors.background,\n fontFamily: theme.fonts.body,\n }}\n >\n {/* Summary Header */}\n {showSummary && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 12,\n padding: '12px 16px',\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {items.length} {items.length === 1 ? 'package' : 'packages'}\n </span>\n <span style={{ color: theme.colors.textMuted }}>•</span>\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {repositories.length} {repositories.length === 1 ? 'repository' : 'repositories'}\n </span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n {/* Metric dropdown */}\n <select\n value={selectedMetric ?? ''}\n onChange={(e) => setSelectedMetric(e.target.value ? e.target.value as MetricKey : null)}\n style={{\n padding: '4px 8px',\n fontSize: 13,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n cursor: 'pointer',\n outline: 'none',\n }}\n >\n <option value=\"\">Select metric...</option>\n {METRIC_OPTIONS.map((option) => (\n <option key={option.key} value={option.key}>\n {option.label}\n </option>\n ))}\n </select>\n {/* Tier badge */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 12px',\n backgroundColor: theme.colors.backgroundLight,\n borderRadius: 16,\n border: `1px solid ${tierColors[overallTier]}`,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: tierColors[overallTier],\n }}\n />\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: tierColors[overallTier],\n }}\n >\n {tierLabels[overallTier]}\n </span>\n </div>\n </div>\n </div>\n )}\n\n {/* Grid of Items */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))',\n gap: 12,\n padding: 16,\n }}\n >\n {sortedItems.map((item) => (\n <RepositoryQualityGridItem\n key={item.key}\n item={item}\n theme={theme}\n onClick={onItemClick ? () => onItemClick(item) : undefined}\n onVertexClick={onVertexClick}\n showRepositoryName={showRepositoryName}\n selectedMetric={selectedMetric}\n />\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { PanelComponentProps } from '../types';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport {\n RepositoryQualityGrid,\n type RepositoryQualityItem,\n type FlatGridItem,\n type VertexHoverInfo,\n} from '../components/RepositoryQualityGrid';\n\n// Mock data for demonstration\nconst mockRepositories: RepositoryQualityItem[] = [\n {\n id: 'platform',\n name: 'platform',\n packages: [\n {\n name: '@org/core',\n version: '2.0.0',\n metrics: { tests: 94, deadCode: 4, linting: 98, formatting: 100, types: 97, documentation: 90 },\n },\n {\n name: '@org/ui-components',\n version: '2.0.0',\n metrics: { tests: 85, deadCode: 8, linting: 95, formatting: 98, types: 92, documentation: 80 },\n },\n {\n name: '@org/hooks',\n version: '2.0.0',\n metrics: { tests: 88, deadCode: 6, linting: 96, formatting: 100, types: 94, documentation: 85 },\n },\n ],\n },\n {\n id: 'backend',\n name: 'backend-services',\n packages: [\n {\n name: 'backend-services',\n version: '1.5.0',\n metrics: { tests: 80, deadCode: 15, linting: 90, formatting: 95, types: 85, documentation: 72 },\n },\n ],\n },\n {\n id: 'docs',\n name: 'documentation-site',\n packages: [\n {\n name: 'documentation-site',\n version: '1.0.0',\n metrics: { tests: 45, deadCode: 25, linting: 75, formatting: 85, types: 60, documentation: 95 },\n },\n ],\n },\n];\n\n// Repository quality data from slice\ninterface RepositoryQualityData {\n id: string;\n name: string;\n path?: string;\n packages: Array<{\n name: string;\n version?: string;\n metrics: QualityMetrics;\n }>;\n}\n\n// Slice data shape\ninterface RepositoriesQualitySliceData {\n repositories: RepositoryQualityData[];\n lastUpdated: string;\n}\n\n/**\n * RepositoryQualityGridPanelContent - Internal component that uses theme\n */\nconst RepositoryQualityGridPanelContent: React.FC<PanelComponentProps> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n\n // Get repositories quality data from context if available\n const qualitySlice = context.getSlice<RepositoriesQualitySliceData>('repositoriesQuality');\n const hasQualitySlice = context.hasSlice('repositoriesQuality');\n const isLoading = qualitySlice?.loading ?? false;\n\n // Determine repositories to display\n const repositories: RepositoryQualityItem[] = React.useMemo(() => {\n if (qualitySlice?.data?.repositories) {\n return qualitySlice.data.repositories;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet\n return [];\n }\n // No slice - use mock for demo\n return mockRepositories;\n }, [qualitySlice?.data?.repositories, hasQualitySlice]);\n\n // Handle item click\n const handleItemClick = (item: FlatGridItem) => {\n events.emit({\n type: 'principal-ade.repository-quality-grid:item:click',\n source: 'principal-ade.repository-quality-grid-panel',\n timestamp: Date.now(),\n payload: {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n tier: item.tier,\n },\n });\n };\n\n // Handle vertex click\n const handleVertexClick = (item: FlatGridItem, vertex: VertexHoverInfo) => {\n events.emit({\n type: 'principal-ade.repository-quality-grid:vertex:click',\n source: 'principal-ade.repository-quality-grid-panel',\n timestamp: Date.now(),\n payload: {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n metric: vertex.key,\n label: vertex.label,\n value: vertex.value,\n },\n });\n };\n\n // Handle refresh\n const handleRefresh = async () => {\n if (context.hasSlice('repositoriesQuality')) {\n await context.refresh('workspace', 'repositoriesQuality');\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on('principal-ade.repository-quality-grid:refresh', async () => {\n await handleRefresh();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context]);\n\n return (\n <div\n style={{\n fontFamily: theme.fonts.body,\n height: '100%',\n minHeight: 0,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n overflowY: 'auto',\n boxSizing: 'border-box',\n }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}\n >\n Loading repository quality metrics...\n </div>\n ) : repositories.length === 0 ? (\n <div\n style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}\n >\n No repositories with quality metrics found.\n </div>\n ) : (\n <RepositoryQualityGrid\n repositories={repositories}\n theme={theme}\n onItemClick={handleItemClick}\n onVertexClick={handleVertexClick}\n showRepositoryName={true}\n showSummary={true}\n />\n )}\n </div>\n );\n};\n\n/**\n * RepositoryQualityGridPanel - A panel for visualizing quality metrics\n * across multiple repositories in a flat grid layout.\n */\nexport const RepositoryQualityGridPanel = RepositoryQualityGridPanelContent;\n","import { QualityHexagonPanel } from './panels/QualityHexagonPanel';\nimport { RepositoryQualityGridPanel } from './panels/RepositoryQualityGridPanel';\nimport type { PanelDefinition, PanelContextValue } from './types';\n\n/**\n * Export array of panel definitions.\n * This is the required export for panel extensions.\n */\nexport const panels: PanelDefinition[] = [\n {\n metadata: {\n id: 'principal-ade.quality-hexagon-panel',\n name: 'Code Quality',\n icon: '⬡',\n version: '0.1.0',\n author: 'Principal ADE',\n description:\n 'Visualize code quality metrics using a hexagonal radar chart showing tests, types, linting, formatting, documentation, and dead code.',\n slices: ['quality'],\n tools: [],\n },\n component: QualityHexagonPanel,\n\n onMount: async (context: PanelContextValue) => {\n console.log(\n 'Quality Hexagon Panel mounted',\n context.currentScope.repository?.path\n );\n\n if (context.hasSlice('quality') && !context.isSliceLoading('quality')) {\n await context.refresh('repository', 'quality');\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log('Quality Hexagon Panel unmounting');\n },\n },\n {\n metadata: {\n id: 'principal-ade.repository-quality-grid-panel',\n name: 'Repository Quality Grid',\n icon: '⬡',\n version: '0.1.0',\n author: 'Principal ADE',\n description:\n 'Display quality metrics for multiple repositories in a flat grid layout. Supports filtering by metric type, sorting, and comparing quality across projects.',\n slices: ['repositoriesQuality'],\n tools: [],\n },\n component: RepositoryQualityGridPanel,\n\n onMount: async (context: PanelContextValue) => {\n console.log('Repository Quality Grid Panel mounted');\n\n if (context.hasSlice('repositoriesQuality') && !context.isSliceLoading('repositoriesQuality')) {\n await context.refresh('workspace', 'repositoriesQuality');\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log('Repository Quality Grid Panel unmounting');\n },\n },\n];\n\n/**\n * Optional: Called once when the entire package is loaded.\n */\nexport const onPackageLoad = async () => {\n console.log('Panel package loaded - Code Quality Panels');\n};\n\n/**\n * Optional: Called once when the package is unloaded.\n */\nexport const onPackageUnload = async () => {\n console.log('Panel package unloading - Code Quality Panels');\n};\n\n// Export components for direct usage\nexport {\n QualityHexagon,\n QualityHexagonCompact,\n QualityHexagonDetailed,\n QualityHexagonExpandable,\n calculateQualityTier,\n type QualityMetrics,\n type QualityTier,\n // Multi-repository grid components\n RepositoryQualityGrid,\n RepositoryQualityGridItem,\n type RepositoryQualityItem,\n type PackageQualityItem,\n type FlatGridItem,\n} from './components';\n\n// Export panels\nexport { QualityHexagonPanel } from './panels/QualityHexagonPanel';\nexport { RepositoryQualityGridPanel } from './panels/RepositoryQualityGridPanel';\n"],"names":["__iconNode","React","_a"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}
|