@principal-ade/code-quality-panels 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/LensDataDebugPanel.d.ts.map +1 -0
- package/dist/components/QualityEmptyState.d.ts.map +1 -0
- package/dist/components/QualityHexagon.d.ts.map +1 -0
- package/dist/components/QualityMetricsList.d.ts.map +1 -0
- package/dist/components/RepositoryQualityGrid.d.ts.map +1 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/{src/index.d.ts → index.d.ts} +6 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/mocks/panelContext.d.ts.map +1 -0
- package/dist/{src/panels → panels}/LensDataDebugPanel.d.ts +2 -2
- package/dist/panels/LensDataDebugPanel.d.ts.map +1 -0
- package/dist/panels/QualityHexagonPanel.d.ts +7 -0
- package/dist/panels/QualityHexagonPanel.d.ts.map +1 -0
- package/dist/panels/RepositoryQualityGridPanel.d.ts +8 -0
- package/dist/panels/RepositoryQualityGridPanel.d.ts.map +1 -0
- package/dist/panels.bundle.js +85 -37
- package/dist/panels.bundle.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/types/code-quality-panels.types.d.ts +162 -0
- package/dist/types/code-quality-panels.types.d.ts.map +1 -0
- package/dist/{src/types → types}/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/src/components/LensDataDebugPanel.d.ts.map +0 -1
- package/dist/src/components/LensDataDebugPanel.stories.d.ts +0 -31
- package/dist/src/components/LensDataDebugPanel.stories.d.ts.map +0 -1
- package/dist/src/components/QualityEmptyState.d.ts.map +0 -1
- package/dist/src/components/QualityHexagon.d.ts.map +0 -1
- package/dist/src/components/QualityHexagon.stories.d.ts +0 -54
- package/dist/src/components/QualityHexagon.stories.d.ts.map +0 -1
- package/dist/src/components/QualityMetricsList.d.ts.map +0 -1
- package/dist/src/components/QualityMetricsList.stories.d.ts +0 -33
- package/dist/src/components/QualityMetricsList.stories.d.ts.map +0 -1
- package/dist/src/components/RepositoryQualityGrid.d.ts.map +0 -1
- package/dist/src/components/RepositoryQualityGrid.stories.d.ts +0 -45
- package/dist/src/components/RepositoryQualityGrid.stories.d.ts.map +0 -1
- package/dist/src/components/index.d.ts.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/mocks/panelContext.d.ts.map +0 -1
- package/dist/src/panels/LensDataDebugPanel.d.ts.map +0 -1
- package/dist/src/panels/LensDataDebugPanel.stories.d.ts +0 -55
- package/dist/src/panels/LensDataDebugPanel.stories.d.ts.map +0 -1
- package/dist/src/panels/QualityHexagonPanel.d.ts +0 -7
- package/dist/src/panels/QualityHexagonPanel.d.ts.map +0 -1
- package/dist/src/panels/QualityHexagonPanel.stories.d.ts +0 -64
- package/dist/src/panels/QualityHexagonPanel.stories.d.ts.map +0 -1
- package/dist/src/panels/RepositoryQualityGridPanel.d.ts +0 -8
- package/dist/src/panels/RepositoryQualityGridPanel.d.ts.map +0 -1
- package/dist/src/panels/RepositoryQualityGridPanel.stories.d.ts +0 -26
- package/dist/src/panels/RepositoryQualityGridPanel.stories.d.ts.map +0 -1
- package/dist/src/tools/index.d.ts.map +0 -1
- package/dist/src/types/index.d.ts.map +0 -1
- /package/dist/{src/components → components}/LensDataDebugPanel.d.ts +0 -0
- /package/dist/{src/components → components}/QualityEmptyState.d.ts +0 -0
- /package/dist/{src/components → components}/QualityHexagon.d.ts +0 -0
- /package/dist/{src/components → components}/QualityMetricsList.d.ts +0 -0
- /package/dist/{src/components → components}/RepositoryQualityGrid.d.ts +0 -0
- /package/dist/{src/components → components}/index.d.ts +0 -0
- /package/dist/{src/lib → lib}/utils.d.ts +0 -0
- /package/dist/{src/mocks → mocks}/panelContext.d.ts +0 -0
- /package/dist/{src/tools → tools}/index.d.ts +0 -0
|
@@ -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/book-open.js","../node_modules/lucide-react/dist/esm/icons/braces.js","../node_modules/lucide-react/dist/esm/icons/bug.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/file-search.js","../node_modules/lucide-react/dist/esm/icons/flask-conical.js","../node_modules/lucide-react/dist/esm/icons/git-branch.js","../node_modules/lucide-react/dist/esm/icons/hexagon.js","../node_modules/lucide-react/dist/esm/icons/info.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/terminal.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zap.js","../node_modules/@principal-ade/industry-theme/dist/esm/index.js","../node_modules/@principal-ai/quality-lens-registry/dist/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/components/LensDataDebugPanel.tsx","../src/panels/LensDataDebugPanel.tsx","../src/components/QualityMetricsList.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 = [\n [\"path\", { d: \"M12 7v14\", key: \"1akyts\" }],\n [\n \"path\",\n {\n d: \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n key: \"ruj8y\"\n }\n ]\n];\nconst BookOpen = createLucideIcon(\"book-open\", __iconNode);\n\nexport { __iconNode, BookOpen as default };\n//# sourceMappingURL=book-open.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 { d: \"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\", key: \"ezmyqa\" }\n ],\n [\n \"path\",\n {\n d: \"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\",\n key: \"e1hn23\"\n }\n ]\n];\nconst Braces = createLucideIcon(\"braces\", __iconNode);\n\nexport { __iconNode, Braces as default };\n//# sourceMappingURL=braces.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 20v-9\", key: \"1qisl0\" }],\n [\"path\", { d: \"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\", key: \"uouzyp\" }],\n [\"path\", { d: \"M14.12 3.88 16 2\", key: \"qol33r\" }],\n [\"path\", { d: \"M21 21a4 4 0 0 0-3.81-4\", key: \"1b0z45\" }],\n [\"path\", { d: \"M21 5a4 4 0 0 1-3.55 3.97\", key: \"5cxbf6\" }],\n [\"path\", { d: \"M22 13h-4\", key: \"1jl80f\" }],\n [\"path\", { d: \"M3 21a4 4 0 0 1 3.81-4\", key: \"1fjd4g\" }],\n [\"path\", { d: \"M3 5a4 4 0 0 0 3.55 3.97\", key: \"1d7oge\" }],\n [\"path\", { d: \"M6 13H2\", key: \"82j7cp\" }],\n [\"path\", { d: \"m8 2 1.88 1.88\", key: \"fmnt4t\" }],\n [\"path\", { d: \"M9 7.13V6a3 3 0 1 1 6 0v1.13\", key: \"1vgav8\" }]\n];\nconst Bug = createLucideIcon(\"bug\", __iconNode);\n\nexport { __iconNode, Bug as default };\n//# sourceMappingURL=bug.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: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"11.5\", cy: \"14.5\", r: \"2.5\", key: \"1bq0ko\" }],\n [\"path\", { d: \"M13.3 16.3 15 18\", key: \"2quom7\" }]\n];\nconst FileSearch = createLucideIcon(\"file-search\", __iconNode);\n\nexport { __iconNode, FileSearch as default };\n//# sourceMappingURL=file-search.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: \"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\n key: \"18mbvz\"\n }\n ],\n [\"path\", { d: \"M6.453 15h11.094\", key: \"3shlmq\" }],\n [\"path\", { d: \"M8.5 2h7\", key: \"csnxdl\" }]\n];\nconst FlaskConical = createLucideIcon(\"flask-conical\", __iconNode);\n\nexport { __iconNode, FlaskConical as default };\n//# sourceMappingURL=flask-conical.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 [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n];\nconst GitBranch = createLucideIcon(\"git-branch\", __iconNode);\n\nexport { __iconNode, GitBranch as default };\n//# sourceMappingURL=git-branch.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.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: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.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","/**\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: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.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: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.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: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n];\nconst Zap = createLucideIcon(\"zap\", __iconNode);\n\nexport { __iconNode, Zap as default };\n//# sourceMappingURL=zap.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// src/landingPageTheme.ts\nvar landingPageTheme = {\n space: [0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 100, 128],\n fonts: {\n body: 'Inter, \"Geist Sans\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n heading: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\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: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.2,\n tight: 1.05,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\", \"1400px\"],\n sizes: [16, 32, 64, 128, 200, 240, 256, 300, 512, 740, 768, 820, 900, 1024, 1200, 1400, 1536],\n radii: [0, 2, 4, 6, 7, 8, 9, 10, 12, 14, 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 4px 12px rgba(0, 194, 255, 0.4)\",\n \"0 6px 24px rgba(0, 194, 255, 0.1)\",\n \"0 8px 32px rgba(0, 0, 0, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50, 1000],\n colors: {\n text: \"#ffffff\",\n background: \"#000000\",\n primary: \"#00C2FF\",\n secondary: \"#0098CC\",\n accent: \"#0066FF\",\n highlight: \"rgba(0, 194, 255, 0.15)\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(0, 194, 255, 0.2)\",\n backgroundSecondary: \"#0a1628\",\n backgroundTertiary: \"#0f1c2e\",\n backgroundLight: \"rgba(0, 194, 255, 0.04)\",\n backgroundHover: \"rgba(0, 194, 255, 0.1)\",\n surface: \"rgba(0, 0, 0, 0.4)\",\n textSecondary: \"#d1d5db\",\n textTertiary: \"#9ca3af\",\n textMuted: \"#6b7280\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#000000\",\n bg: \"#00C2FF\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#00D9FF\"\n }\n },\n secondary: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(0, 194, 255, 0.3)\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"rgba(0, 194, 255, 0.1)\",\n borderColor: \"#00C2FF\"\n }\n },\n ghost: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#00D9FF\",\n bg: \"rgba(0, 194, 255, 0.1)\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"#ffffff\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\",\n color: \"text\"\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: 4\n },\n secondary: {\n bg: \"rgba(0, 194, 255, 0.05)\",\n border: \"1px solid\",\n borderColor: \"rgba(0, 194, 255, 0.2)\",\n borderRadius: 4\n }\n }\n};\nvar landingPageLightTheme = {\n ...landingPageTheme,\n colors: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#0098CC\",\n secondary: \"#00C2FF\",\n accent: \"#0066FF\",\n highlight: \"rgba(0, 152, 204, 0.1)\",\n muted: \"#f0f0f0\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(0, 152, 204, 0.2)\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"rgba(0, 152, 204, 0.03)\",\n backgroundHover: \"rgba(0, 152, 204, 0.05)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\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: \"#ffffff\",\n bg: \"#0098CC\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#007aa8\"\n }\n },\n secondary: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(0, 152, 204, 0.3)\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"rgba(0, 152, 204, 0.05)\",\n borderColor: \"#0098CC\"\n }\n },\n ghost: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#007aa8\",\n bg: \"rgba(0, 152, 204, 0.05)\"\n }\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 landingPageTheme,\n landingPageLightTheme,\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","// src/registry.ts\nvar LENS_REGISTRY = [\n // ============================================================\n // LINTING - Code style and bug detection\n // ============================================================\n // TypeScript/JavaScript linting\n {\n id: \"eslint\",\n name: \"ESLint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Pluggable linting utility for JavaScript and TypeScript\",\n command: \"eslint\",\n fileMetricsRequirements: {\n completeCommand: \"npx eslint . --format json\",\n requiredFlags: [\"--format json\"],\n formatFlag: \"--format json\",\n withoutConfig: \"Only files with issues are reported in the output\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"ESLint JSON output only includes files that have issues. Clean files are not listed.\"\n }\n },\n {\n id: \"biome-lint\",\n name: \"Biome Lint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"eslint\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Fast linter for JavaScript and TypeScript\",\n command: \"biome lint\",\n fileMetricsRequirements: {\n completeCommand: \"npx @biomejs/biome lint . --reporter=json\",\n requiredFlags: [\"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Biome JSON output includes all analyzed files.\"\n }\n },\n {\n id: \"oxlint\",\n name: \"OxLint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"eslint\", \"biome-lint\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Blazing fast JavaScript/TypeScript linter\",\n command: \"oxlint\",\n fileMetricsRequirements: {\n completeCommand: \"npx oxlint --format json\",\n requiredFlags: [\"--format json\"],\n formatFlag: \"--format json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false\n }\n },\n // Python linting\n {\n id: \"ruff\",\n name: \"Ruff\",\n category: \"linting\",\n languages: [\"python\"],\n alternativeTo: [\"pylint\", \"flake8\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Extremely fast Python linter\",\n command: \"ruff check\",\n fileMetricsRequirements: {\n completeCommand: \"ruff check . --output-format=json\",\n requiredFlags: [\"--output-format=json\"],\n formatFlag: \"--output-format=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"Ruff JSON output only includes files with issues.\"\n }\n },\n {\n id: \"pylint\",\n name: \"Pylint\",\n category: \"linting\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Python static code analyzer\",\n command: \"pylint\",\n fileMetricsRequirements: {\n completeCommand: \"pylint --output-format=json .\",\n requiredFlags: [\"--output-format=json\"],\n formatFlag: \"--output-format=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false\n }\n },\n // Go linting\n {\n id: \"golangci-lint\",\n name: \"golangci-lint\",\n category: \"linting\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Fast linters runner for Go\",\n command: \"golangci-lint run\"\n },\n // Rust linting\n {\n id: \"clippy\",\n name: \"Clippy\",\n category: \"linting\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Rust linter\",\n command: \"cargo clippy\"\n },\n // ============================================================\n // FORMATTING - Code formatting\n // ============================================================\n // TypeScript/JavaScript formatting\n {\n id: \"prettier\",\n name: \"Prettier\",\n category: \"formatting\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Opinionated code formatter\",\n command: \"prettier --check\",\n fileMetricsRequirements: {\n completeCommand: \"npx prettier --check . --no-error-on-unmatched-pattern --log-level debug\",\n requiredFlags: [\"--check\", \"--log-level debug\"],\n withoutConfig: \"Without --log-level debug, file list is not available\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Prettier with --log-level debug lists all checked files. This is the reference implementation for complete file metrics.\"\n }\n },\n {\n id: \"biome-format\",\n name: \"Biome Format\",\n category: \"formatting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"prettier\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Fast code formatter for JavaScript and TypeScript\",\n command: \"biome format\",\n fileMetricsRequirements: {\n completeCommand: \"npx @biomejs/biome format . --reporter=json\",\n requiredFlags: [\"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true\n }\n },\n // Python formatting\n {\n id: \"black\",\n name: \"Black\",\n category: \"formatting\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"The uncompromising Python code formatter\",\n command: \"black --check\"\n },\n {\n id: \"ruff-format\",\n name: \"Ruff Format\",\n category: \"formatting\",\n languages: [\"python\"],\n alternativeTo: [\"black\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Fast Python formatter (Ruff)\",\n command: \"ruff format --check\"\n },\n // Go formatting\n {\n id: \"gofmt\",\n name: \"gofmt\",\n category: \"formatting\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Go code formatter\",\n command: \"gofmt -l\"\n },\n // Rust formatting\n {\n id: \"rustfmt\",\n name: \"rustfmt\",\n category: \"formatting\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Rust code formatter\",\n command: \"cargo fmt --check\"\n },\n // ============================================================\n // TYPES - Type checking\n // ============================================================\n // TypeScript\n {\n id: \"typescript\",\n name: \"TypeScript\",\n category: \"types\",\n languages: [\"typescript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"TypeScript type checker\",\n command: \"tsc --noEmit\",\n fileMetricsRequirements: {\n completeCommand: \"npx tsc --noEmit --listFiles\",\n requiredFlags: [\"--listFiles\"],\n withoutConfig: \"Only files with type errors are reported. Cannot determine total files analyzed.\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"The --listFiles flag is REQUIRED to get the complete list of files TypeScript analyzed. Without it, only files with errors appear in output.\"\n }\n },\n // Python type checking\n {\n id: \"mypy\",\n name: \"MyPy\",\n category: \"types\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Static type checker for Python\",\n command: \"mypy\"\n },\n {\n id: \"pyright\",\n name: \"Pyright\",\n category: \"types\",\n languages: [\"python\"],\n alternativeTo: [\"mypy\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Static type checker for Python\",\n command: \"pyright\"\n },\n // Go type checking (built into compiler)\n {\n id: \"go-vet\",\n name: \"Go Vet\",\n category: \"types\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Go static analyzer\",\n command: \"go vet\"\n },\n // ============================================================\n // TESTS - Test coverage and results\n // ============================================================\n // JavaScript/TypeScript testing\n {\n id: \"jest\",\n name: \"Jest\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"JavaScript testing framework\",\n command: \"jest --coverage\",\n fileMetricsRequirements: {\n completeCommand: \"npx jest --coverage --json --outputFile=jest-results.json\",\n requiredFlags: [\"--coverage\", \"--json\"],\n formatFlag: \"--json\",\n withoutConfig: \"Without --coverage, no per-file coverage data is available. Without --json, output cannot be parsed.\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Jest coverage data provides per-file metrics for source files. Test file results are separate from source coverage.\"\n }\n },\n {\n id: \"vitest\",\n name: \"Vitest\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"jest\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Vite-native testing framework\",\n command: \"vitest run --coverage\",\n fileMetricsRequirements: {\n completeCommand: \"npx vitest run --coverage --reporter=json\",\n requiredFlags: [\"--coverage\", \"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Without --coverage, no per-file coverage data is available\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Vitest coverage provides per-file metrics. Requires @vitest/coverage-v8 or @vitest/coverage-istanbul.\"\n }\n },\n {\n id: \"bun-test\",\n name: \"Bun Test\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"jest\", \"vitest\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Bun native test runner\",\n command: \"bun test\",\n fileMetricsRequirements: {\n completeCommand: \"bun test --coverage\",\n requiredFlags: [\"--coverage\"],\n withoutConfig: \"Without --coverage, no per-file coverage data is available\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Bun test coverage is built-in but requires --coverage flag.\"\n }\n },\n // Python testing\n {\n id: \"pytest\",\n name: \"Pytest\",\n category: \"tests\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Python testing framework\",\n command: \"pytest --cov\"\n },\n // Go testing\n {\n id: \"go-test\",\n name: \"Go Test\",\n category: \"tests\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Go test runner\",\n command: \"go test -cover\"\n },\n // Rust testing\n {\n id: \"cargo-test\",\n name: \"Cargo Test\",\n category: \"tests\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Rust test runner\",\n command: \"cargo test\"\n },\n // ============================================================\n // DEAD CODE - Unused code detection\n // ============================================================\n // TypeScript/JavaScript\n {\n id: \"knip\",\n name: \"Knip\",\n category: \"dead-code\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Find unused files, dependencies and exports\",\n command: \"knip\",\n fileMetricsRequirements: {\n completeCommand: \"npx knip --reporter json\",\n requiredFlags: [\"--reporter json\"],\n formatFlag: \"--reporter json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"Knip reports unused files and exports. It does not list all analyzed files, only those with issues.\"\n }\n },\n // Python\n {\n id: \"vulture\",\n name: \"Vulture\",\n category: \"dead-code\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Find dead Python code\",\n command: \"vulture\"\n },\n // ============================================================\n // DOCUMENTATION - Documentation coverage\n // ============================================================\n {\n id: \"alexandria\",\n name: \"Alexandria\",\n category: \"documentation\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Documentation coverage checker\",\n command: \"alexandria lint\",\n fileMetricsRequirements: {\n completeCommand: \"npx @principal-ai/alexandria-cli coverage --json\",\n requiredFlags: [\"--json\"],\n formatFlag: \"--json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Alexandria reports documentation coverage for all analyzed files.\"\n }\n },\n {\n id: \"typedoc\",\n name: \"TypeDoc\",\n category: \"documentation\",\n languages: [\"typescript\"],\n outputsFileMetrics: false,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"TypeScript documentation generator\",\n command: \"typedoc\"\n },\n // ============================================================\n // SECURITY - Security scanning\n // ============================================================\n {\n id: \"npm-audit\",\n name: \"npm audit\",\n category: \"security\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: false,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Check for known vulnerabilities in dependencies\",\n command: \"npm audit\"\n },\n {\n id: \"bandit\",\n name: \"Bandit\",\n category: \"security\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Python security linter\",\n command: \"bandit -r\"\n }\n];\nvar CATEGORY_CONFIGS = [\n {\n id: \"linting\",\n name: \"Linting\",\n description: \"Code style and bug detection\",\n icon: \"AlertCircle\"\n },\n {\n id: \"formatting\",\n name: \"Formatting\",\n description: \"Code formatting consistency\",\n icon: \"AlignLeft\"\n },\n {\n id: \"types\",\n name: \"Types\",\n description: \"Type safety and checking\",\n icon: \"FileType\"\n },\n {\n id: \"tests\",\n name: \"Tests\",\n description: \"Test coverage and results\",\n icon: \"TestTube\"\n },\n {\n id: \"dead-code\",\n name: \"Dead Code\",\n description: \"Unused code detection\",\n icon: \"Trash2\",\n invertedScale: true\n },\n {\n id: \"documentation\",\n name: \"Documentation\",\n description: \"Documentation coverage\",\n icon: \"FileText\"\n },\n {\n id: \"security\",\n name: \"Security\",\n description: \"Security vulnerability scanning\",\n icon: \"Shield\"\n },\n {\n id: \"complexity\",\n name: \"Complexity\",\n description: \"Code complexity metrics\",\n icon: \"GitBranch\"\n }\n];\nvar LANGUAGE_CONFIGS = [\n {\n id: \"typescript\",\n name: \"TypeScript\",\n extensions: [\".ts\", \".tsx\", \".mts\", \".cts\"],\n icon: \"TS\"\n },\n {\n id: \"javascript\",\n name: \"JavaScript\",\n extensions: [\".js\", \".jsx\", \".mjs\", \".cjs\"],\n icon: \"JS\"\n },\n {\n id: \"python\",\n name: \"Python\",\n extensions: [\".py\", \".pyi\"],\n icon: \"PY\"\n },\n {\n id: \"go\",\n name: \"Go\",\n extensions: [\".go\"],\n icon: \"GO\"\n },\n {\n id: \"rust\",\n name: \"Rust\",\n extensions: [\".rs\"],\n icon: \"RS\"\n },\n {\n id: \"java\",\n name: \"Java\",\n extensions: [\".java\"],\n icon: \"JV\"\n },\n {\n id: \"csharp\",\n name: \"C#\",\n extensions: [\".cs\"],\n icon: \"C#\"\n },\n {\n id: \"ruby\",\n name: \"Ruby\",\n extensions: [\".rb\"],\n icon: \"RB\"\n },\n {\n id: \"php\",\n name: \"PHP\",\n extensions: [\".php\"],\n icon: \"PHP\"\n }\n];\n\n// src/helpers.ts\nfunction getLensById(id) {\n return LENS_REGISTRY.find((lens) => lens.id === id);\n}\nfunction getLensesByCategory(category) {\n return LENS_REGISTRY.filter((lens) => lens.category === category);\n}\nfunction getLensesByLanguage(language) {\n return LENS_REGISTRY.filter((lens) => lens.languages.includes(language));\n}\nfunction getLensesByCategoryAndLanguage(category, language) {\n return LENS_REGISTRY.filter(\n (lens) => lens.category === category && lens.languages.includes(language)\n );\n}\nfunction getCategoryForLens(lensId) {\n return getLensById(lensId)?.category;\n}\nfunction getAlternatives(lensId) {\n const lens = getLensById(lensId);\n if (!lens) return [];\n const listedAsAlternative = LENS_REGISTRY.filter(\n (other) => other.alternativeTo?.includes(lensId)\n );\n const thisListsAsAlternative = lens.alternativeTo ? LENS_REGISTRY.filter((other) => lens.alternativeTo.includes(other.id)) : [];\n const all = [...listedAsAlternative, ...thisListsAsAlternative];\n return Array.from(new Map(all.map((l) => [l.id, l])).values());\n}\nfunction areLensesAlternatives(lensId1, lensId2) {\n const lens1 = getLensById(lensId1);\n const lens2 = getLensById(lensId2);\n if (!lens1 || !lens2) return false;\n if (lens1.category !== lens2.category) return false;\n return lens1.alternativeTo?.includes(lensId2) || lens2.alternativeTo?.includes(lensId1) || false;\n}\nfunction getLensesWithFileMetrics() {\n return LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics);\n}\nfunction getLensesWithAggregates() {\n return LENS_REGISTRY.filter((lens) => lens.outputsAggregate);\n}\nfunction getColorModeForCategory(category, lensesRan) {\n const lensesInCategory = getLensesByCategory(category);\n for (const lensId of lensesRan) {\n if (lensesInCategory.some((lens) => lens.id === lensId)) {\n return lensId;\n }\n }\n return null;\n}\nfunction getLensDisplayName(lensId) {\n return getLensById(lensId)?.name ?? lensId;\n}\nfunction getLensColorScheme(lensId) {\n return getLensById(lensId)?.colorScheme ?? \"issues\";\n}\nfunction getCategoryConfig(category) {\n return CATEGORY_CONFIGS.find((c) => c.id === category);\n}\nfunction getCategoryDisplayName(category) {\n return getCategoryConfig(category)?.name ?? category;\n}\nfunction isCategoryInverted(category) {\n return getCategoryConfig(category)?.invertedScale ?? false;\n}\nfunction getLanguageConfig(language) {\n return LANGUAGE_CONFIGS.find((l) => l.id === language);\n}\nfunction detectLanguageFromExtension(extension) {\n const normalizedExt = extension.startsWith(\".\") ? extension : `.${extension}`;\n const config = LANGUAGE_CONFIGS.find(\n (l) => l.extensions.includes(normalizedExt.toLowerCase())\n );\n return config?.id;\n}\nfunction getLanguagesForCategory(category) {\n const lenses = getLensesByCategory(category);\n const languages = /* @__PURE__ */ new Set();\n for (const lens of lenses) {\n for (const lang of lens.languages) {\n languages.add(lang);\n }\n }\n return Array.from(languages);\n}\nvar HEXAGON_METRIC_TO_CATEGORY = {\n linting: \"linting\",\n formatting: \"formatting\",\n types: \"types\",\n tests: \"tests\",\n deadCode: \"dead-code\",\n documentation: \"documentation\"\n};\nvar CATEGORY_TO_HEXAGON_METRIC = {\n \"linting\": \"linting\",\n \"formatting\": \"formatting\",\n \"types\": \"types\",\n \"tests\": \"tests\",\n \"dead-code\": \"deadCode\",\n \"documentation\": \"documentation\"\n};\nfunction getCategoryForHexagonMetric(metric) {\n return HEXAGON_METRIC_TO_CATEGORY[metric];\n}\nfunction getHexagonMetricForCategory(category) {\n return CATEGORY_TO_HEXAGON_METRIC[category];\n}\nfunction isLensInHexagonMetric(lensId, metric) {\n const lensCategory = getCategoryForLens(lensId);\n if (!lensCategory) return false;\n return HEXAGON_METRIC_TO_CATEGORY[metric] === lensCategory;\n}\nfunction getColorModeForHexagonMetric(metric, lensesRan) {\n const category = HEXAGON_METRIC_TO_CATEGORY[metric];\n return getColorModeForCategory(category, lensesRan);\n}\nfunction isHexagonMetricConfigured(metric, lensesRan) {\n if (lensesRan === void 0) {\n return true;\n }\n if (lensesRan.length === 0) {\n return false;\n }\n return lensesRan.some((lensId) => isLensInHexagonMetric(lensId, metric));\n}\nfunction getHexagonMetricKeys() {\n return Object.keys(HEXAGON_METRIC_TO_CATEGORY);\n}\nfunction isValidLensId(lensId) {\n return getLensById(lensId) !== void 0;\n}\nfunction findCategoryConflicts(lensesRan) {\n const byCategory = /* @__PURE__ */ new Map();\n for (const lensId of lensesRan) {\n const category = getCategoryForLens(lensId);\n if (category) {\n const existing = byCategory.get(category) || [];\n existing.push(lensId);\n byCategory.set(category, existing);\n }\n }\n const conflicts = [];\n for (const [category, lenses] of byCategory) {\n if (lenses.length > 1) {\n conflicts.push({ category, lenses });\n }\n }\n return conflicts;\n}\nfunction validateLensOutputs(lensesRan, fileMetricsProduced, aggregatesProduced) {\n const issues = [];\n for (const lensId of lensesRan) {\n const lens = getLensById(lensId);\n if (!lens) continue;\n const missing = [];\n if (lens.outputsFileMetrics && !fileMetricsProduced.includes(lensId)) {\n missing.push(\"fileMetrics\");\n }\n if (lens.outputsAggregate && !aggregatesProduced.includes(lensId)) {\n missing.push(\"aggregate\");\n }\n if (missing.length > 0) {\n issues.push({ lensId, missing });\n }\n }\n return issues;\n}\nvar BUILT_IN_COLOR_MODES = [\n {\n id: \"fileTypes\",\n name: \"File Types\",\n description: \"Color by file extension/type\",\n icon: \"FileCode\",\n colorScheme: \"categorical\",\n isBuiltIn: true\n },\n {\n id: \"git\",\n name: \"Git Status\",\n description: \"Color by git status (modified, added, etc.)\",\n icon: \"GitBranch\",\n colorScheme: \"categorical\",\n isBuiltIn: true\n },\n {\n id: \"coverage\",\n name: \"Test Coverage\",\n description: \"Color by test coverage percentage\",\n icon: \"TestTube\",\n colorScheme: \"coverage\",\n isBuiltIn: true,\n category: \"tests\"\n }\n];\nfunction getAvailableColorModes() {\n const builtIn = [\"fileTypes\", \"git\", \"coverage\"];\n const lensColorModes = getLensColorModes();\n return [...builtIn, ...lensColorModes];\n}\nfunction getLensColorModes() {\n return LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics).map((lens) => lens.id);\n}\nfunction isValidColorMode(mode) {\n return getAvailableColorModes().includes(mode);\n}\nfunction isLensColorMode(mode) {\n return getLensColorModes().includes(mode);\n}\nfunction getColorModeConfig(mode) {\n const builtIn = BUILT_IN_COLOR_MODES.find((m) => m.id === mode);\n if (builtIn) return builtIn;\n const lens = getLensById(mode);\n if (lens && lens.outputsFileMetrics) {\n const category = getCategoryConfig(lens.category);\n return {\n id: mode,\n name: lens.name,\n description: lens.description ?? `${lens.name} analysis`,\n icon: category?.icon,\n colorScheme: lens.colorScheme,\n isBuiltIn: false,\n category: lens.category\n };\n }\n return void 0;\n}\nfunction getAllColorModeConfigs() {\n const configs = [...BUILT_IN_COLOR_MODES];\n for (const lens of LENS_REGISTRY) {\n if (lens.outputsFileMetrics) {\n const category = getCategoryConfig(lens.category);\n configs.push({\n id: lens.id,\n name: lens.name,\n description: lens.description ?? `${lens.name} analysis`,\n icon: category?.icon,\n colorScheme: lens.colorScheme,\n isBuiltIn: false,\n category: lens.category\n });\n }\n }\n return configs;\n}\nfunction getColorModesForLanguage(language) {\n const builtIn = [\"fileTypes\", \"git\"];\n const lensColorModes = LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics && lens.languages.includes(language)).map((lens) => lens.id);\n return [...builtIn, ...lensColorModes];\n}\nfunction getAvailableColorModesFromLenses(lensesRan) {\n const builtIn = [\"fileTypes\", \"git\", \"coverage\"];\n const lensColorModes = lensesRan.filter((lensId) => {\n const lens = getLensById(lensId);\n return lens?.outputsFileMetrics;\n });\n return [...builtIn, ...lensColorModes];\n}\nfunction isColorModeAvailable(mode, lensesRan) {\n if (mode === \"fileTypes\" || mode === \"git\" || mode === \"coverage\") {\n return true;\n }\n return lensesRan.includes(mode);\n}\n\n// src/defaults.ts\nvar JAVASCRIPT_DEFAULTS = [\n // Testing\n {\n lensId: \"jest\",\n command: \"npx jest\",\n cliArgs: [\"--json\", \"--coverage\", \"--passWithNoTests\"],\n description: \"Run Jest tests with coverage\"\n },\n {\n lensId: \"vitest\",\n command: \"npx vitest run\",\n cliArgs: [\"--reporter=json\", \"--coverage\"],\n description: \"Run Vitest tests with coverage\"\n },\n {\n lensId: \"bun-test\",\n command: \"bun test\",\n cliArgs: [\"--coverage\"],\n description: \"Run Bun tests with coverage\"\n },\n // Linting\n {\n lensId: \"eslint\",\n command: \"npx eslint .\",\n cliArgs: [\"--format=json\"],\n description: \"Run ESLint\"\n },\n {\n lensId: \"biome-lint\",\n command: \"npx @biomejs/biome lint .\",\n cliArgs: [\"--reporter=json\"],\n description: \"Run Biome linter\"\n },\n {\n lensId: \"oxlint\",\n command: \"npx oxlint\",\n cliArgs: [\"--format=json\"],\n description: \"Run oxlint\"\n },\n // Formatting\n {\n lensId: \"prettier\",\n command: \"npx prettier --check .\",\n cliArgs: [],\n description: \"Check Prettier formatting\"\n },\n {\n lensId: \"biome-format\",\n command: \"npx @biomejs/biome format .\",\n cliArgs: [\"--reporter=json\"],\n description: \"Check Biome formatting\"\n },\n // Types\n {\n lensId: \"typescript\",\n command: \"npx tsc --noEmit\",\n cliArgs: [],\n description: \"Run TypeScript type checking\"\n },\n // Dead code\n {\n lensId: \"knip\",\n command: \"npx knip\",\n cliArgs: [\"--reporter=json\"],\n description: \"Find unused code with Knip\"\n },\n // Documentation\n {\n lensId: \"alexandria\",\n command: \"npx @anthropic-ai/alexandria lint\",\n cliArgs: [],\n description: \"Check documentation coverage\"\n }\n];\nvar PYTHON_DEFAULTS = [\n // Testing\n {\n lensId: \"pytest\",\n command: \"pytest\",\n cliArgs: [\"--json-report\", \"--cov\", \"--cov-report=json\"],\n description: \"Run pytest with coverage\"\n },\n // Linting\n {\n lensId: \"ruff\",\n command: \"ruff check .\",\n cliArgs: [\"--output-format=json\"],\n description: \"Run Ruff linter\"\n },\n {\n lensId: \"pylint\",\n command: \"pylint\",\n cliArgs: [\"--output-format=json\"],\n description: \"Run Pylint\"\n },\n // Formatting\n {\n lensId: \"black\",\n command: \"black --check .\",\n cliArgs: [],\n description: \"Check Black formatting\"\n },\n {\n lensId: \"ruff-format\",\n command: \"ruff format --check .\",\n cliArgs: [],\n description: \"Check Ruff formatting\"\n },\n // Types\n {\n lensId: \"mypy\",\n command: \"mypy .\",\n cliArgs: [\"--output=json\"],\n description: \"Run MyPy type checking\"\n },\n {\n lensId: \"pyright\",\n command: \"pyright\",\n cliArgs: [\"--outputjson\"],\n description: \"Run Pyright type checking\"\n },\n // Dead code\n {\n lensId: \"vulture\",\n command: \"vulture .\",\n cliArgs: [],\n description: \"Find dead code with Vulture\"\n },\n // Security\n {\n lensId: \"bandit\",\n command: \"bandit -r .\",\n cliArgs: [\"--format=json\"],\n description: \"Security scan with Bandit\"\n }\n];\nvar GO_DEFAULTS = [\n // Testing\n {\n lensId: \"go-test\",\n command: \"go test ./...\",\n cliArgs: [\"-json\", \"-cover\"],\n description: \"Run Go tests with coverage\"\n },\n // Linting\n {\n lensId: \"golangci-lint\",\n command: \"golangci-lint run\",\n cliArgs: [\"--out-format=json\"],\n description: \"Run golangci-lint\"\n },\n // Formatting\n {\n lensId: \"gofmt\",\n command: \"gofmt -l .\",\n cliArgs: [],\n description: \"Check Go formatting\"\n },\n // Types / Vet\n {\n lensId: \"go-vet\",\n command: \"go vet ./...\",\n cliArgs: [\"-json\"],\n description: \"Run go vet\"\n }\n];\nvar RUST_DEFAULTS = [\n // Testing\n {\n lensId: \"cargo-test\",\n command: \"cargo test\",\n cliArgs: [\"--\", \"--format=json\"],\n description: \"Run Cargo tests\"\n },\n // Linting\n {\n lensId: \"clippy\",\n command: \"cargo clippy\",\n cliArgs: [\"--message-format=json\"],\n description: \"Run Clippy linter\"\n },\n // Formatting\n {\n lensId: \"rustfmt\",\n command: \"cargo fmt --check\",\n cliArgs: [],\n description: \"Check Rust formatting\"\n }\n];\nvar DEFAULT_COMMANDS = {\n typescript: JAVASCRIPT_DEFAULTS,\n javascript: JAVASCRIPT_DEFAULTS,\n python: PYTHON_DEFAULTS,\n go: GO_DEFAULTS,\n rust: RUST_DEFAULTS,\n // Placeholder for future languages\n java: [],\n csharp: [],\n ruby: [],\n php: []\n};\nfunction getDefaultCommands(language) {\n return DEFAULT_COMMANDS[language] || [];\n}\nfunction getDefaultCommand(lensId, language) {\n if (language) {\n return DEFAULT_COMMANDS[language]?.find((cmd) => cmd.lensId === lensId);\n }\n for (const commands of Object.values(DEFAULT_COMMANDS)) {\n const found = commands.find((cmd) => cmd.lensId === lensId);\n if (found) return found;\n }\n return void 0;\n}\nfunction getAllDefaultLensIds() {\n const ids = /* @__PURE__ */ new Set();\n for (const commands of Object.values(DEFAULT_COMMANDS)) {\n for (const cmd of commands) {\n ids.add(cmd.lensId);\n }\n }\n return Array.from(ids);\n}\nexport {\n CATEGORY_CONFIGS,\n DEFAULT_COMMANDS,\n GO_DEFAULTS,\n JAVASCRIPT_DEFAULTS,\n LANGUAGE_CONFIGS,\n LENS_REGISTRY,\n PYTHON_DEFAULTS,\n RUST_DEFAULTS,\n areLensesAlternatives,\n detectLanguageFromExtension,\n findCategoryConflicts,\n getAllColorModeConfigs,\n getAllDefaultLensIds,\n getAlternatives,\n getAvailableColorModes,\n getAvailableColorModesFromLenses,\n getCategoryConfig,\n getCategoryDisplayName,\n getCategoryForHexagonMetric,\n getCategoryForLens,\n getColorModeConfig,\n getColorModeForCategory,\n getColorModeForHexagonMetric,\n getColorModesForLanguage,\n getDefaultCommand,\n getDefaultCommands,\n getHexagonMetricForCategory,\n getHexagonMetricKeys,\n getLanguageConfig,\n getLanguagesForCategory,\n getLensById,\n getLensColorModes,\n getLensColorScheme,\n getLensDisplayName,\n getLensesByCategory,\n getLensesByCategoryAndLanguage,\n getLensesByLanguage,\n getLensesWithAggregates,\n getLensesWithFileMetrics,\n isCategoryInverted,\n isColorModeAvailable,\n isHexagonMetricConfigured,\n isLensColorMode,\n isLensInHexagonMetric,\n isValidColorMode,\n isValidLensId,\n validateLensOutputs\n};\n//# sourceMappingURL=index.js.map","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\";\nimport {\n isHexagonMetricConfigured,\n type HexagonMetricKey,\n} from \"@principal-ai/quality-lens-registry\";\n\nexport type { QualityMetrics };\nexport type QualityTier = \"none\" | \"bronze\" | \"silver\" | \"gold\" | \"platinum\";\nexport type MetricKey =\n | \"types\"\n | \"documentation\"\n | \"tests\"\n | \"deadCode\"\n | \"formatting\"\n | \"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 /** List of lens IDs that actually ran - used to determine which metrics are configured */\n lensesRan?: 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: {\n fill: \"#808080\",\n stroke: \"#808080\",\n bg: theme.colors.backgroundLight,\n },\n bronze: {\n fill: \"#CD7F32\",\n stroke: \"#CD7F32\",\n bg: theme.colors.backgroundLight,\n },\n silver: {\n fill: \"#C0C0C0\",\n stroke: \"#C0C0C0\",\n bg: theme.colors.backgroundLight,\n },\n gold: {\n fill: \"#FFD700\",\n stroke: \"#FFD700\",\n bg: theme.colors.backgroundLight,\n },\n platinum: {\n fill: \"#E5E4E2\",\n stroke: \"#E5E4E2\",\n bg: theme.colors.backgroundLight,\n },\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// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: string): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\n}\n\n/**\n * Check if a metric has a lens that ran for it.\n * Uses the lens registry for the lens-to-metric mapping.\n */\nfunction isMetricConfigured(\n metricKey: MetricKey,\n lensesRan?: string[],\n): boolean {\n // MetricKey and HexagonMetricKey are the same, just cast\n return isHexagonMetricConfigured(metricKey as HexagonMetricKey, lensesRan);\n}\n\n// Metrics ordered clockwise from top-left\nconst getMetricConfig = (themeColors: ReturnType<typeof getThemeColors>) =>\n [\n {\n key: \"formatting\",\n label: \"Format\",\n color: themeColors.metricColors.formatting,\n angle: -120,\n },\n {\n key: \"linting\",\n label: \"Linting\",\n color: themeColors.metricColors.linting,\n angle: -60,\n },\n {\n key: \"types\",\n label: \"Types\",\n color: themeColors.metricColors.types,\n angle: 0,\n },\n {\n key: \"tests\",\n label: \"Tests\",\n color: themeColors.metricColors.tests,\n angle: 60,\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n color: themeColors.metricColors.deadCode,\n angle: 120,\n },\n {\n key: \"documentation\",\n label: \"Docs\",\n color: themeColors.metricColors.documentation,\n angle: 180,\n },\n ] as const;\n\nfunction calculateHexagonPoints(\n center: number,\n radius: number,\n metricConfig: ReturnType<typeof getMetricConfig>,\n): 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 lensesRan,\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 // Check if this metric is configured\n const configured = isMetricConfigured(key as MetricKey, lensesRan);\n if (!configured) {\n // Unconfigured metrics show as 0 (collapsed on the hexagon)\n return calculateMetricPoint(center, radius, angle, 0);\n }\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, only for configured metrics\n const configuredMetrics = metricConfig.filter(({ key }) =>\n isMetricConfigured(key as MetricKey, lensesRan),\n );\n const metricsForAverage = configuredMetrics.map(({ key }) => {\n const value = metrics[key as keyof QualityMetrics];\n return key === \"deadCode\" ? 100 - value : value;\n });\n const averageScore =\n metricsForAverage.length > 0\n ? Math.round(\n metricsForAverage.reduce((a, b) => a + b, 0) /\n metricsForAverage.length,\n )\n : 0;\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(\n center,\n (radius * percent) / 100,\n metricConfig,\n )}\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 configured = isMetricConfigured(key as MetricKey, lensesRan);\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 // For unconfigured metrics, show at center (0)\n const effectiveValue = configured ? value : 0;\n const point = calculateMetricPoint(center, radius, angle, 100);\n const dataPoint = calculateMetricPoint(\n center,\n radius,\n angle,\n effectiveValue,\n );\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 if (configured) {\n onVertexClick?.(vertexInfo);\n }\n };\n\n return (\n <g\n key={key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onVertexLeave}\n onClick={handleClick}\n style={{\n cursor:\n configured && (onVertexHover || onVertexClick)\n ? \"pointer\"\n : \"default\",\n opacity: configured ? 1 : 0.4,\n }}\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={configured ? \"white\" : themeColors.gridColor}\n stroke={configured ? colors.stroke : themeColors.gridColor}\n strokeWidth={1.5}\n strokeDasharray={configured ? \"none\" : \"2,2\"}\n />\n {/* Value indicator - only show if configured */}\n {configured && (\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 )}\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\n extends Pick<\n QualityHexagonProps,\n \"metrics\" | \"tier\" | \"theme\" | \"className\"\n > {\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\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {packageName ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {packageName.startsWith(\"@\") && packageName.includes(\"/\") ? (\n <>\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n {packageName.split(\"/\")[0]}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName.split(\"/\")[1]}\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n v{packageVersion}\n </span>\n )}\n </div>\n ) : (\n <span />\n )}\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\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 24,\n }}\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\n style={{\n flex: \"1 1 200px\",\n minWidth: 200,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: \"8px 24px\",\n }}\n >\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div\n key={key}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {key === \"deadCode\" ? \" ↓\" : \"\"}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}\n >\n {value}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\ninterface QualityHexagonExpandableProps\n extends Pick<\n QualityHexagonProps,\n \"metrics\" | \"tier\" | \"theme\" | \"className\"\n > {\n packageName?: string;\n packageVersion?: string;\n packagePath?: string;\n /** List of lens IDs that actually ran for this package */\n lensesRan?: string[];\n onRefresh?: () => void;\n isRefreshing?: boolean;\n defaultExpanded?: boolean;\n /** Callback when the hexagon is expanded/collapsed */\n onExpandChange?: (\n expanded: boolean,\n info: { packageName?: string; packagePath?: string },\n ) => void;\n /** Callback when a metric row is clicked */\n onMetricClick?: (metric: MetricKey) => void;\n}\n\nexport function QualityHexagonExpandable({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n packagePath,\n lensesRan,\n onRefresh,\n isRefreshing = false,\n defaultExpanded = false,\n onExpandChange,\n onMetricClick,\n}: QualityHexagonExpandableProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n\n const handleToggleExpand = React.useCallback(() => {\n const newExpanded = !expanded;\n setExpanded(newExpanded);\n onExpandChange?.(newExpanded, { packageName, packagePath });\n }, [expanded, onExpandChange, packageName, packagePath]);\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\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {packageName ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {packageName.startsWith(\"@\") && packageName.includes(\"/\") ? (\n <>\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n {packageName.split(\"/\")[0]}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName.split(\"/\")[1]}\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n v{packageVersion}\n </span>\n )}\n </div>\n ) : (\n <span />\n )}\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={handleToggleExpand}\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 lensesRan={lensesRan}\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\n 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 >\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n const configured = isMetricConfigured(\n key as MetricKey,\n lensesRan,\n );\n\n return (\n <div\n key={key}\n onClick={(e) => {\n e.stopPropagation();\n if (configured) {\n onMetricClick?.(key as MetricKey);\n }\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n cursor: configured && onMetricClick ? \"pointer\" : \"default\",\n padding: \"4px 8px\",\n margin: \"0 -8px\",\n borderRadius: 4,\n transition: \"background-color 0.15s ease\",\n opacity: configured ? 1 : 0.5,\n }}\n onMouseEnter={(e) => {\n if (configured && onMetricClick) {\n e.currentTarget.style.backgroundColor =\n theme.colors.surface;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {key === \"deadCode\" ? \" ↓\" : \"\"}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: configured\n ? getValueColor(value, key)\n : theme.colors.textMuted,\n }}\n title={configured ? undefined : \"Not configured\"}\n >\n {configured ? `${value}%` : \"N/A\"}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Expand/collapse indicator */}\n <div\n onClick={handleToggleExpand}\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 * @param metrics - The quality metrics\n * @param lensesRan - Optional list of lens IDs that ran, to filter unconfigured metrics\n */\nexport function calculateQualityTier(\n metrics: QualityMetrics,\n lensesRan?: string[],\n): QualityTier {\n // Get all metric keys\n const allMetricKeys: MetricKey[] = [\n \"formatting\",\n \"linting\",\n \"types\",\n \"tests\",\n \"deadCode\",\n \"documentation\",\n ];\n\n // Filter to only configured metrics if lensesRan is provided\n const configuredKeys = allMetricKeys.filter((key) =>\n isMetricConfigured(key, lensesRan),\n );\n\n if (configuredKeys.length === 0) {\n return \"none\";\n }\n\n // Calculate average with inverted dead code, only for configured metrics\n const values = configuredKeys.map((key) => {\n const value = metrics[key];\n return key === \"deadCode\" ? 100 - value : value;\n });\n\n const average = values.reduce((a, b) => a + b, 0) / values.length;\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 {\n Terminal,\n Copy,\n Check,\n ChevronRight,\n Zap,\n GitBranch,\n Info,\n FlaskConical,\n FileSearch,\n Braces,\n Sparkles,\n Trash2,\n BookOpen,\n} 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:\n | { allFiles?: Array<{ relativePath?: string; path?: string }> }\n | 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 label?: string;\n}> = ({ command, theme, label }) => {\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 style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {label && (\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n {label}\n </span>\n )}\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 </div>\n );\n};\n\n/**\n * Mini hexagon preview showing what metrics are tracked\n */\nconst MetricsPreview: React.FC<{ theme: Theme }> = ({ theme }) => {\n const metrics = [\n {\n key: \"formatting\",\n label: \"Formatting\",\n description: \"Prettier code style\",\n Icon: Sparkles,\n },\n {\n key: \"linting\",\n label: \"Linting\",\n description: \"ESLint code quality\",\n Icon: FileSearch,\n },\n {\n key: \"types\",\n label: \"Types\",\n description: \"TypeScript type safety\",\n Icon: Braces,\n },\n {\n key: \"tests\",\n label: \"Tests\",\n description: \"Test coverage & pass rate\",\n Icon: FlaskConical,\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n description: \"Unused exports & deps\",\n Icon: Trash2,\n },\n {\n key: \"documentation\",\n label: \"Docs\",\n description: \"Code documentation\",\n Icon: BookOpen,\n },\n ];\n\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 8,\n padding: 12,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n {metrics.map((m) => (\n <div\n key={m.key}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n fontSize: 12,\n }}\n >\n <m.Icon size={14} color={theme.colors.textMuted} />\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={{ fontWeight: 500, color: theme.colors.text }}>\n {m.label}\n </span>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>\n {m.description}\n </span>\n </div>\n </div>\n ))}\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 const [showAdvanced, setShowAdvanced] = React.useState(false);\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 <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\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 workflow runs. Push a\n commit to trigger it, or check the Actions tab for status.\n </p>\n\n <MetricsPreview theme={theme} />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 6,\n backgroundColor: `${theme.colors.warning}10`,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <Info\n size={14}\n style={{ flexShrink: 0, marginTop: 2 }}\n color={theme.colors.warning}\n />\n <div>\n <strong style={{ color: theme.colors.text }}>\n Using private npm packages?\n </strong>\n <br />\n Add{\" \"}\n <code\n style={{\n backgroundColor: theme.colors.background,\n padding: \"1px 4px\",\n borderRadius: 3,\n }}\n >\n NPM_TOKEN\n </code>{\" \"}\n to your repository secrets and ensure the workflow has access to it.\n </div>\n </div>\n </div>\n );\n }\n\n // No workflow - show 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 {/* What you'll get */}\n <div>\n <h4\n style={{\n margin: \"0 0 12px 0\",\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Track 6 quality dimensions\n </h4>\n <MetricsPreview theme={theme} />\n </div>\n\n {/* Quick Start */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\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: 8,\n }}\n >\n <Zap size={18} color={theme.colors.primary} />\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Quick Start\n </h4>\n </div>\n\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Run this in your project directory to set up automated quality\n tracking:\n </p>\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli init\"\n theme={theme}\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <GitBranch size={14} />\n <span>Then commit and push to start tracking</span>\n </div>\n </div>\n\n {/* Advanced Options Toggle */}\n <button\n onClick={() => setShowAdvanced(!showAdvanced)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: 0,\n border: \"none\",\n backgroundColor: \"transparent\",\n color: theme.colors.textMuted,\n fontSize: 13,\n cursor: \"pointer\",\n }}\n >\n <ChevronRight\n size={14}\n style={{\n transform: showAdvanced ? \"rotate(90deg)\" : \"none\",\n transition: \"transform 0.2s\",\n }}\n />\n <span>{showAdvanced ? \"Hide\" : \"Show\"} additional options</span>\n </button>\n\n {/* Advanced Options */}\n {showAdvanced && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\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: 8,\n }}\n >\n <Terminal size={18} color={theme.colors.text} />\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n CLI Commands\n </h4>\n </div>\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli list\"\n theme={theme}\n label=\"See available quality tools in your project\"\n />\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli run . --install\"\n theme={theme}\n label=\"Run quality checks locally (auto-installs missing tools)\"\n />\n\n <CommandLine\n command=\"npm install -g @principal-ai/quality-lens-cli\"\n theme={theme}\n label=\"Install globally for faster repeated use\"\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 6,\n backgroundColor: `${theme.colors.warning}10`,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <Info\n size={14}\n style={{ flexShrink: 0, marginTop: 2 }}\n color={theme.colors.warning}\n />\n <div>\n <strong style={{ color: theme.colors.text }}>\n Private npm packages?\n </strong>\n <br />\n If your project uses private @org packages, add{\" \"}\n <code\n style={{\n backgroundColor: theme.colors.background,\n padding: \"1px 4px\",\n borderRadius: 3,\n }}\n >\n NPM_TOKEN\n </code>{\" \"}\n to your GitHub repository secrets under Settings → Secrets →\n Actions, and set the workflow environment if needed.\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport { WORKFLOW_FILE_PATH };\n","import React from \"react\";\nimport { Hexagon, X, Copy, Check } 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 getColorModeForHexagonMetric,\n type HexagonMetricKey,\n} from \"@principal-ai/quality-lens-registry\";\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 path?: string;\n version?: string;\n metrics: QualityMetrics;\n /** List of lens IDs that actually ran for this package */\n lensesRan?: string[];\n /** True if this is a monorepo orchestrator package (config-only, no source) */\n isOrchestrator?: boolean;\n}\n\n// Slice data shape\ninterface QualitySliceData {\n packages: PackageQuality[];\n lastUpdated: string;\n}\n\n// Legacy fallbacks for when lensesRan is not available\nconst LEGACY_FALLBACKS: Record<HexagonMetricKey, string> = {\n linting: \"eslint\",\n formatting: \"prettier\",\n types: \"typescript\",\n tests: \"coverage\",\n deadCode: \"knip\",\n documentation: \"alexandria\",\n};\n\n/**\n * Get the appropriate colorMode for a metric based on which lenses ran.\n * Uses the lens registry for dynamic resolution.\n */\nfunction getColorModeForMetric(\n metric: string,\n lensesRan?: string[],\n): string | null {\n // Validate metric is a valid hexagon metric key\n if (!isValidHexagonMetric(metric)) return null;\n const hexagonMetric = metric as HexagonMetricKey;\n\n // Use registry to find which lens ran for this category\n const colorMode = getColorModeForHexagonMetric(\n hexagonMetric,\n lensesRan ?? [],\n );\n\n // If no lens ran for this category, fall back to default\n // This ensures we still emit a colorMode for the UI to use\n if (!colorMode && lensesRan === undefined) {\n return LEGACY_FALLBACKS[hexagonMetric] ?? null;\n }\n\n return colorMode;\n}\n\nfunction isValidHexagonMetric(metric: string): metric is HexagonMetricKey {\n return metric in LEGACY_FALLBACKS;\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<\n Set<string>\n >(new Set());\n const [showHelpOverlay, setShowHelpOverlay] = React.useState(false);\n const [copiedCommand, setCopiedCommand] = React.useState<string | null>(null);\n\n const handleCopyCommand = async (command: string) => {\n try {\n await navigator.clipboard.writeText(command);\n setCopiedCommand(command);\n setTimeout(() => setCopiedCommand(null), 2000);\n } catch {\n console.log(\"Copy:\", command);\n }\n };\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<{\n allFiles?: Array<{ relativePath?: string; path?: string }>;\n }>(\"fileTree\");\n const hasWorkflow = React.useMemo(() => {\n return checkFileExistsInTree(\n fileTreeSlice?.data ?? undefined,\n WORKFLOW_FILE_PATH,\n );\n }, [fileTreeSlice?.data]);\n\n // Determine packages to display\n // - If slice exists and has data, use it (filtering out orchestrator packages)\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 // Filter out orchestrator packages - they're config-only with no source code\n return qualitySlice.data.packages.filter((pkg) => !pkg.isOrchestrator);\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: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\n };\n\n // Collect all lenses that ran across all packages\n const allLensesRan = React.useMemo(() => {\n const lensSet = new Set<string>();\n for (const pkg of packages) {\n if (pkg.lensesRan) {\n for (const lens of pkg.lensesRan) {\n lensSet.add(lens);\n }\n }\n }\n return lensSet.size > 0 ? Array.from(lensSet) : undefined;\n }, [packages]);\n\n // Calculate overall tier from all packages\n const overallTier =\n packages.length > 0\n ? calculateQualityTier(\n packages.reduce(\n (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:\n acc.formatting + pkg.metrics.formatting / packages.length,\n types: acc.types + pkg.metrics.types / packages.length,\n documentation:\n acc.documentation + pkg.metrics.documentation / packages.length,\n }),\n {\n tests: 0,\n deadCode: 0,\n linting: 0,\n formatting: 0,\n types: 0,\n documentation: 0,\n },\n ),\n allLensesRan,\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 display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n height: 40,\n flexShrink: 0,\n padding: \"0 16px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n boxSizing: \"border-box\",\n }}\n >\n <Hexagon size={20} color={tierColors[overallTier]} />\n <h2\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Code Quality\n </h2>\n <span\n onClick={() => setShowHelpOverlay(true)}\n title=\"Click for help\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n border: `1px solid ${theme.colors.border}`,\n fontSize: 11,\n color: theme.colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n ?\n </span>\n {packages.length > 1 && (\n <span\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n {packages.length} packages\n </span>\n )}\n </div>\n\n {/* Content */}\n <div\n style={{\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n flex: 1,\n minHeight: 0,\n }}\n >\n {/* Quality Hexagons for each package */}\n <div\n style={{ display: \"flex\", flexWrap: \"wrap\", gap: 16, minHeight: 0 }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n Loading quality metrics...\n </div>\n ) : packages.length === 0 ? (\n <QualityEmptyState theme={theme} hasWorkflow={hasWorkflow} />\n ) : (\n packages.map((pkg) => {\n const tier = calculateQualityTier(pkg.metrics, pkg.lensesRan);\n // Use package path from slice data\n // For single-package repos, path is empty string (root)\n // For monorepos, path would be like \"packages/core\"\n const packagePath = pkg.path ?? \"\";\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 packagePath={packagePath}\n lensesRan={pkg.lensesRan}\n onExpandChange={(expanded, info) => {\n // Emit package:select event for cross-panel filtering\n // When expanded, select this package; when collapsed, deselect\n events.emit({\n type: \"package:select\",\n source: \"principal-ade.quality-hexagon-panel\",\n timestamp: Date.now(),\n payload: expanded\n ? {\n packagePath: info.packagePath ?? \"\",\n packageName: info.packageName,\n }\n : null,\n });\n }}\n onMetricClick={(metric) => {\n // Emit colorMode event for File City\n // Use lensesRan to determine correct tool (e.g., biome-lint vs eslint)\n const colorMode = getColorModeForMetric(\n metric,\n pkg.lensesRan,\n );\n if (colorMode) {\n events.emit({\n type: \"quality:colorMode:select\",\n source: \"principal-ade.quality-hexagon-panel\",\n timestamp: Date.now(),\n payload: { colorMode },\n });\n }\n }}\n />\n );\n })\n )}\n </div>\n </div>\n\n {/* Help Overlay */}\n {showHelpOverlay && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 100,\n }}\n onClick={() => setShowHelpOverlay(false)}\n >\n <div\n style={{\n backgroundColor: theme.colors.surface,\n borderRadius: 8,\n padding: 20,\n maxWidth: 400,\n width: \"90%\",\n border: `1px solid ${theme.colors.border}`,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 16,\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Quality Lens CLI\n </h3>\n <button\n onClick={() => setShowHelpOverlay(false)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n display: \"flex\",\n color: theme.colors.textMuted,\n }}\n >\n <X size={18} />\n </button>\n </div>\n\n <p\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n margin: \"0 0 12px 0\",\n }}\n >\n Run quality checks locally with the CLI:\n </p>\n\n {[\n {\n cmd: \"npx @principal-ai/quality-lens-cli init\",\n label: \"Initialize quality lens in your project\",\n },\n {\n cmd: \"npx @principal-ai/quality-lens-cli list\",\n label: \"List available quality lenses\",\n },\n ].map(({ cmd, label }) => (\n <div key={cmd} style={{ marginBottom: 12 }}>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>\n {label}\n </span>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 6,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n fontFamily: \"monospace\",\n fontSize: 12,\n marginTop: 4,\n }}\n >\n <code style={{ color: theme.colors.text }}>{cmd}</code>\n <button\n onClick={() => handleCopyCommand(cmd)}\n style={{\n display: \"flex\",\n alignItems: \"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 {copiedCommand === cmd ? (\n <Check size={14} color={theme.colors.success} />\n ) : (\n <Copy size={14} />\n )}\n </button>\n </div>\n </div>\n ))}\n\n <div\n style={{\n marginTop: 16,\n padding: 12,\n backgroundColor: theme.colors.background,\n borderRadius: 6,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <strong style={{ color: theme.colors.text }}>Tiers:</strong>\n <div\n style={{\n marginTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <span>🏆 Platinum: 90%+ average</span>\n <span>🥇 Gold: 75%+ average</span>\n <span>🥈 Silver: 60%+ average</span>\n <span>🥉 Bronze: 40%+ average</span>\n </div>\n </div>\n </div>\n </div>\n )}\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 {\n QualityHexagon,\n calculateQualityTier,\n type QualityTier,\n type VertexHoverInfo,\n type MetricKey,\n} from \"./QualityHexagon\";\n\nexport type { VertexHoverInfo, MetricKey };\n\nconst METRIC_OPTIONS: Array<{ key: MetricKey; label: string }> = [\n { key: \"formatting\", label: \"Format\" },\n { key: \"linting\", label: \"Linting\" },\n { key: \"types\", label: \"Types\" },\n { key: \"tests\", label: \"Tests\" },\n { key: \"deadCode\", label: \"Dead Code\" },\n { key: \"documentation\", label: \"Docs\" },\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 /** Repository path (for filtering in other panels) */\n repositoryPath?: 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(\n repositories: RepositoryQualityItem[],\n): 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 repositoryPath: repo.path,\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:\n acc.documentation + item.metrics.documentation / items.length,\n }),\n {\n tests: 0,\n deadCode: 0,\n linting: 0,\n formatting: 0,\n types: 0,\n documentation: 0,\n },\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): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\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] =\n 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: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\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),\n };\n }\n }\n if (hoveredVertex) {\n return {\n label: hoveredVertex.label,\n value: hoveredVertex.value,\n valueColor: getValueColor(hoveredVertex.value, hoveredVertex.key),\n };\n }\n return null;\n }, [selectedMetric, hoveredVertex, item.metrics]);\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={\n onVertexClick ? (vertex) => onVertexClick(item, vertex) : undefined\n }\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>(\n null,\n );\n const items = React.useMemo(\n () => flattenRepositories(repositories),\n [repositories],\n );\n const overallTier = React.useMemo(() => calculateOverallTier(items), [items]);\n\n // Sort items alphabetically by package name\n const sortedItems = React.useMemo(() => {\n return [...items].sort((a, b) =>\n a.packageName.localeCompare(b.packageName),\n );\n }, [items]);\n\n const tierColors: Record<QualityTier, string> = {\n none: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\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}{\" \"}\n {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) =>\n setSelectedMetric(\n e.target.value ? (e.target.value as MetricKey) : null,\n )\n }\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\";\nimport { QualityEmptyState } from \"../components/QualityEmptyState\";\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 // Track currently selected item for toggle behavior\n const [selectedItemKey, setSelectedItemKey] = React.useState<string | null>(\n null,\n );\n\n // Get repositories quality data from context if available\n const qualitySlice = context.getSlice<RepositoriesQualitySliceData>(\n \"repositoriesQuality\",\n );\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 return [];\n }, [qualitySlice?.data?.repositories]);\n\n // Handle item click\n const handleItemClick = (item: FlatGridItem) => {\n const isDeselecting = selectedItemKey === item.key;\n\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: isDeselecting\n ? null\n : {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n tier: item.tier,\n },\n });\n\n // Emit package:select event for cross-panel filtering (e.g., File City)\n // Clicking the same item again deselects (sends null payload)\n events.emit({\n type: \"package:select\",\n source: \"principal-ade.repository-quality-grid-panel\",\n timestamp: Date.now(),\n payload: isDeselecting\n ? null\n : item.repositoryPath\n ? {\n packagePath: item.repositoryPath,\n packageName: item.packageName,\n }\n : null,\n });\n\n setSelectedItemKey(isDeselecting ? null : item.key);\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 style={{ padding: 20 }}>\n <QualityEmptyState theme={theme} hasWorkflow={false} />\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 * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { Theme } from \"@principal-ade/industry-theme\";\n\n// Types matching the FormattedResults structure\nexport interface Issue {\n file: string;\n line: number;\n column?: number;\n severity: \"error\" | \"warning\" | \"info\" | \"hint\";\n message: string;\n rule?: string;\n source: string;\n category?: string;\n}\n\nexport interface LensResult {\n package: { name: string; path?: string };\n lens: { id: string; command: string };\n execution: {\n success: boolean;\n exitCode?: number;\n duration?: number;\n timestamp: number;\n };\n issues: Issue[];\n metrics: {\n filesAnalyzed: number;\n totalIssues: number;\n issuesBySeverity: {\n error: number;\n warning: number;\n info: number;\n hint: number;\n };\n executionTime: number;\n custom?: Record<string, unknown>;\n };\n fileMetrics?: Array<{\n file: string;\n score: number;\n issueCount: number;\n errorCount: number;\n warningCount: number;\n }>;\n coverage?: {\n line: number;\n branch?: number;\n function?: number;\n statement?: number;\n files?: Array<{\n file: string;\n lines: number;\n branches?: number;\n functions?: number;\n statements?: number;\n }>;\n } | null;\n analyzedFiles?: Array<{\n path: string;\n hasIssues: boolean;\n }>;\n}\n\nexport interface FormattedResults {\n metadata: {\n timestamp: string;\n version: string;\n totalPackages: number;\n totalLenses: number;\n git?: {\n commit?: string;\n branch?: string;\n repository?: string;\n };\n };\n results: LensResult[];\n qualityMetrics?: {\n packages: Array<{\n name: string;\n path?: string;\n hexagon: {\n tests: number;\n deadCode: number;\n formatting: number;\n linting: number;\n types: number;\n documentation: number;\n };\n }>;\n };\n}\n\ninterface LensDataDebugPanelProps {\n data: FormattedResults;\n theme: Theme;\n className?: string;\n /** Pre-select a specific package */\n selectedPackage?: string;\n onFileClick?: (file: string, line?: number) => void;\n onPackageSelect?: (packageName: string) => void;\n}\n\n// Group results by package\nfunction groupResultsByPackage(\n results: LensResult[],\n): Map<string, LensResult[]> {\n const map = new Map<string, LensResult[]>();\n for (const result of results) {\n const key = result.package?.name ?? \"unknown\";\n const existing = map.get(key) || [];\n existing.push(result);\n map.set(key, existing);\n }\n return map;\n}\n\n// Get unique files from issues\nfunction getFilesWithIssues(issues: Issue[]): Map<string, Issue[]> {\n const fileMap = new Map<string, Issue[]>();\n for (const issue of issues) {\n if (!issue.file) continue;\n const existing = fileMap.get(issue.file) || [];\n existing.push(issue);\n fileMap.set(issue.file, existing);\n }\n return fileMap;\n}\n\n// Severity badge colors\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case \"error\":\n return \"#ef4444\";\n case \"warning\":\n return \"#f59e0b\";\n case \"info\":\n return \"#3b82f6\";\n case \"hint\":\n return \"#6b7280\";\n default:\n return \"#6b7280\";\n }\n}\n\nfunction getSeverityBg(severity: string): string {\n switch (severity) {\n case \"error\":\n return \"rgba(239, 68, 68, 0.1)\";\n case \"warning\":\n return \"rgba(245, 158, 11, 0.1)\";\n case \"info\":\n return \"rgba(59, 130, 246, 0.1)\";\n case \"hint\":\n return \"rgba(107, 114, 128, 0.1)\";\n default:\n return \"rgba(107, 114, 128, 0.1)\";\n }\n}\n\n// Calculate package summary stats\nfunction getPackageSummary(results: LensResult[]) {\n let totalErrors = 0;\n let totalWarnings = 0;\n let passCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n totalErrors += result.metrics?.issuesBySeverity?.error ?? 0;\n totalWarnings += result.metrics?.issuesBySeverity?.warning ?? 0;\n if (result.execution?.success) {\n passCount++;\n } else {\n failCount++;\n }\n }\n\n return {\n totalErrors,\n totalWarnings,\n passCount,\n failCount,\n lensCount: results.length,\n };\n}\n\nexport function LensDataDebugPanel({\n data,\n theme,\n className,\n selectedPackage: initialSelectedPackage,\n onFileClick,\n onPackageSelect,\n}: LensDataDebugPanelProps) {\n const packageGroups = React.useMemo(\n () => groupResultsByPackage(data?.results ?? []),\n [data?.results],\n );\n const packageNames = React.useMemo(\n () => Array.from(packageGroups.keys()),\n [packageGroups],\n );\n\n const [selectedPackage, setSelectedPackage] = React.useState<string | null>(\n initialSelectedPackage ||\n (packageNames.length === 1 ? packageNames[0] : null),\n );\n const [expandedLens, setExpandedLens] = React.useState<string | null>(null);\n const [expandedFiles, setExpandedFiles] = React.useState<Set<string>>(\n new Set(),\n );\n const [expandedAnalyzedFiles, setExpandedAnalyzedFiles] = React.useState<\n Set<string>\n >(new Set());\n\n // Sync selected package when prop changes (e.g., from external event)\n React.useEffect(() => {\n if (initialSelectedPackage) {\n setSelectedPackage((current) => {\n if (current !== initialSelectedPackage) {\n setExpandedLens(null);\n setExpandedFiles(new Set());\n setExpandedAnalyzedFiles(new Set());\n return initialSelectedPackage;\n }\n return current;\n });\n }\n }, [initialSelectedPackage]);\n\n const handlePackageSelect = (pkg: string) => {\n setSelectedPackage(pkg);\n setExpandedLens(null);\n setExpandedFiles(new Set());\n setExpandedAnalyzedFiles(new Set());\n onPackageSelect?.(pkg);\n };\n\n const toggleLens = (lensId: string) => {\n setExpandedLens(expandedLens === lensId ? null : lensId);\n setExpandedFiles(new Set());\n };\n\n const toggleFile = (file: string) => {\n const newSet = new Set(expandedFiles);\n if (newSet.has(file)) {\n newSet.delete(file);\n } else {\n newSet.add(file);\n }\n setExpandedFiles(newSet);\n };\n\n const toggleAnalyzedFiles = (lensKey: string) => {\n const newSet = new Set(expandedAnalyzedFiles);\n if (newSet.has(lensKey)) {\n newSet.delete(lensKey);\n } else {\n newSet.add(lensKey);\n }\n setExpandedAnalyzedFiles(newSet);\n };\n\n const selectedResults = selectedPackage\n ? packageGroups.get(selectedPackage) || []\n : [];\n\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: 16,\n backgroundColor: theme.colors.background,\n fontFamily: \"monospace\",\n fontSize: 13,\n }}\n >\n {/* Header with Package Dropdown - only show when not controlled externally */}\n {selectedPackage && !onPackageSelect && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"8px 12px\",\n backgroundColor: theme.colors.surface,\n borderRadius: 6,\n marginBottom: 8,\n }}\n >\n {packageNames.length > 1 ? (\n <select\n value={selectedPackage}\n onChange={(e) => handlePackageSelect(e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: 4,\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: \"monospace\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n outline: \"none\",\n }}\n >\n {packageNames.map((pkg) => (\n <option key={pkg} value={pkg}>\n {pkg}\n </option>\n ))}\n </select>\n ) : (\n <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {selectedPackage}\n </span>\n )}\n {(() => {\n const summary = getPackageSummary(selectedResults);\n return (\n <span\n style={{\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor:\n summary.totalErrors > 0\n ? getSeverityBg(\"error\")\n : summary.totalWarnings > 0\n ? getSeverityBg(\"warning\")\n : \"rgba(34, 197, 94, 0.1)\",\n color:\n summary.totalErrors > 0\n ? getSeverityColor(\"error\")\n : summary.totalWarnings > 0\n ? getSeverityColor(\"warning\")\n : \"#22c55e\",\n }}\n >\n {summary.passCount}/{summary.lensCount} pass\n </span>\n );\n })()}\n </div>\n )}\n\n {/* Lens Results for Selected Package */}\n {selectedPackage &&\n selectedResults.map((result, idx) => {\n const lensKey = `${result.lens?.id ?? \"unknown\"}-${idx}`;\n const isExpanded = expandedLens === lensKey;\n const filesWithIssues = getFilesWithIssues(result.issues ?? []);\n const hasIssues = (result.issues?.length ?? 0) > 0;\n\n return (\n <div\n key={lensKey}\n style={{\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 6,\n overflow: \"hidden\",\n }}\n >\n {/* Lens Header */}\n <div\n onClick={() => toggleLens(lensKey)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n backgroundColor: theme.colors.surface,\n cursor: \"pointer\",\n gap: 12,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n style={{\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {result.lens?.id ?? \"unknown\"}\n </span>\n <span style={{ color: theme.colors.textMuted }}>\n ({result.lens?.command ?? \"\"})\n </span>\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {/* Execution status */}\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: result.execution?.success\n ? \"rgba(34, 197, 94, 0.1)\"\n : \"rgba(239, 68, 68, 0.1)\",\n color: result.execution?.success ? \"#22c55e\" : \"#ef4444\",\n }}\n >\n {result.execution?.success ? \"pass\" : \"fail\"}\n </span>\n\n {/* Issue counts */}\n {hasIssues && (\n <div style={{ display: \"flex\", gap: 6 }}>\n {(result.metrics?.issuesBySeverity?.error ?? 0) > 0 && (\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg(\"error\"),\n color: getSeverityColor(\"error\"),\n }}\n >\n {result.metrics?.issuesBySeverity?.error ?? 0} errors\n </span>\n )}\n {(result.metrics?.issuesBySeverity?.warning ?? 0) > 0 && (\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg(\"warning\"),\n color: getSeverityColor(\"warning\"),\n }}\n >\n {result.metrics?.issuesBySeverity?.warning ?? 0}{\" \"}\n warnings\n </span>\n )}\n </div>\n )}\n\n {/* Files count */}\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n {result.metrics?.filesAnalyzed ?? 0} files\n </span>\n </div>\n </div>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div\n style={{\n padding: 12,\n backgroundColor: theme.colors.backgroundLight,\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Metrics Summary */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(120px, 1fr))\",\n gap: 8,\n marginBottom: 16,\n padding: 12,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Files Analyzed\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.metrics?.filesAnalyzed ?? 0}\n </div>\n </div>\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Total Issues\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.metrics?.totalIssues ?? 0}\n </div>\n </div>\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Duration\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.execution?.duration ?? 0}ms\n </div>\n </div>\n {result.coverage && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Coverage\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.coverage.line}%\n </div>\n </div>\n )}\n </div>\n\n {/* Coverage Files Section */}\n {result.coverage && (\n <div style={{ marginTop: 16 }}>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n Coverage Data\n </div>\n <div\n style={{\n padding: 12,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {/* Aggregate metrics */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(100px, 1fr))\",\n gap: 12,\n marginBottom: 12,\n }}\n >\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Line\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.line}%\n </div>\n </div>\n {result.coverage.branch !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Branch\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.branch}%\n </div>\n </div>\n )}\n {result.coverage.function !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Function\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.function}%\n </div>\n </div>\n )}\n {result.coverage.statement !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Statement\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.statement}%\n </div>\n </div>\n )}\n </div>\n\n {/* coverage.files status - CRITICAL FOR DEBUGGING */}\n <div\n style={{\n padding: 8,\n borderRadius: 4,\n backgroundColor: result.coverage.files?.length\n ? \"rgba(34, 197, 94, 0.1)\"\n : \"rgba(239, 68, 68, 0.1)\",\n border: `1px solid ${result.coverage.files?.length ? \"#22c55e\" : \"#ef4444\"}`,\n }}\n >\n <div\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: result.coverage.files?.length\n ? \"#22c55e\"\n : \"#ef4444\",\n }}\n >\n coverage.files: {result.coverage.files?.length ?? 0}{\" \"}\n entries\n </div>\n {!result.coverage.files?.length && (\n <div\n style={{\n fontSize: 11,\n color: \"#ef4444\",\n marginTop: 4,\n }}\n >\n Warning: Coverage won't appear on map\n visualization!\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Files with Issues */}\n {filesWithIssues.size > 0 ? (\n <div>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n Files with Issues ({filesWithIssues.size})\n </div>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {Array.from(filesWithIssues.entries()).map(\n ([file, issues]) => {\n const isFileExpanded = expandedFiles.has(file);\n return (\n <div\n key={file}\n style={{\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n overflow: \"hidden\",\n }}\n >\n <div\n onClick={() => toggleFile(file)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 10px\",\n backgroundColor: theme.colors.surface,\n cursor: \"pointer\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n style={{\n transform: isFileExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n <span\n style={{\n color: theme.colors.text,\n cursor: onFileClick\n ? \"pointer\"\n : \"default\",\n }}\n onClick={(e) => {\n if (onFileClick) {\n e.stopPropagation();\n onFileClick(file);\n }\n }}\n >\n {file}\n </span>\n </div>\n <span\n style={{\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor: getSeverityBg(\"error\"),\n color: getSeverityColor(\"error\"),\n }}\n >\n {issues.length} issues\n </span>\n </div>\n\n {/* Issues list */}\n {isFileExpanded && (\n <div\n style={{\n padding: 8,\n backgroundColor: theme.colors.background,\n borderTop: `1px solid ${theme.colors.border}`,\n maxHeight: 300,\n overflow: \"auto\",\n }}\n >\n {issues.map((issue, issueIdx) => (\n <div\n key={issueIdx}\n onClick={() =>\n onFileClick?.(file, issue.line)\n }\n style={{\n display: \"flex\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n cursor: onFileClick\n ? \"pointer\"\n : \"default\",\n transition:\n \"background-color 0.1s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.surface;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n minWidth: 45,\n }}\n >\n L{issue.line}\n </span>\n <span\n style={{\n fontSize: 10,\n padding: \"1px 4px\",\n borderRadius: 3,\n backgroundColor: getSeverityBg(\n issue.severity,\n ),\n color: getSeverityColor(\n issue.severity,\n ),\n textTransform: \"uppercase\",\n }}\n >\n {issue.severity.charAt(0)}\n </span>\n <span\n style={{\n flex: 1,\n fontSize: 12,\n color: theme.colors.text,\n }}\n >\n {issue.message}\n </span>\n {issue.rule && (\n <span\n style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n opacity: 0.7,\n }}\n >\n {issue.rule}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n )}\n </div>\n </div>\n ) : (\n <div\n style={{\n padding: 16,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n No issues found\n </div>\n )}\n\n {/* File Metrics if available */}\n {result.fileMetrics && result.fileMetrics.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n File Metrics ({result.fileMetrics.length})\n </div>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n padding: 8,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {result.fileMetrics.map((fm, idx) => (\n <div\n key={idx}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 8px\",\n }}\n >\n <span\n style={{ color: theme.colors.text, fontSize: 12 }}\n >\n {fm.file}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color:\n fm.score >= 80\n ? \"#22c55e\"\n : fm.score >= 60\n ? \"#f59e0b\"\n : \"#ef4444\",\n }}\n >\n {fm.score}%\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Analyzed Files Section */}\n {result.analyzedFiles && result.analyzedFiles.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div\n onClick={() => toggleAnalyzedFiles(lensKey)}\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{\n transform: expandedAnalyzedFiles.has(lensKey)\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n Analyzed Files ({result.analyzedFiles.length})\n </div>\n\n {expandedAnalyzedFiles.has(lensKey) && (\n <div\n style={{\n maxHeight: 300,\n overflow: \"auto\",\n padding: 8,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {result.analyzedFiles.map((file, idx) => (\n <div\n key={idx}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 8px\",\n fontSize: 12,\n borderRadius: 2,\n backgroundColor: file.hasIssues\n ? \"rgba(239, 68, 68, 0.05)\"\n : \"transparent\",\n }}\n >\n <span\n style={{\n color: theme.colors.text,\n cursor: onFileClick ? \"pointer\" : \"default\",\n }}\n onClick={() => onFileClick?.(file.path)}\n >\n {file.path}\n </span>\n {file.hasIssues && (\n <span\n style={{\n fontSize: 10,\n color: \"#ef4444\",\n padding: \"1px 4px\",\n borderRadius: 2,\n backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n }}\n >\n issues\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import React from \"react\";\nimport { Bug } from \"lucide-react\";\nimport { useTheme } from \"@principal-ade/industry-theme\";\nimport type { PanelComponentProps } from \"../types\";\nimport {\n LensDataDebugPanel as LensDataDebugPanelComponent,\n type FormattedResults,\n} from \"../components/LensDataDebugPanel\";\n\n// Slice data shape - matches FormattedResults from quality-lens-cli\ntype LensResultsSliceData = FormattedResults;\n\n// Payload type for package:select events\ninterface PackageSelectPayload {\n packagePath: string;\n packageName: string;\n}\n\n/**\n * LensDataDebugPanelContent - Internal component that uses theme\n */\nconst LensDataDebugPanelContent: React.FC<PanelComponentProps> = ({\n context,\n actions,\n events,\n}) => {\n const { theme } = useTheme();\n const [selectedPackage, setSelectedPackage] = React.useState<string | null>(\n null,\n );\n\n // Get lens results data from context\n const lensResultsSlice =\n context.getSlice<LensResultsSliceData>(\"lensResults\");\n const hasSlice = context.hasSlice(\"lensResults\");\n const isLoading = lensResultsSlice?.loading ?? false;\n\n // Get unique package names and build a lookup map\n const { packageNames, packagePathMap } = React.useMemo(() => {\n if (!lensResultsSlice?.data?.results)\n return { packageNames: [], packagePathMap: new Map<string, string>() };\n const names = new Set<string>();\n const pathMap = new Map<string, string>();\n\n lensResultsSlice.data.results.forEach((r) => {\n const name = r.package?.name ?? \"unknown\";\n const path = r.package?.path ?? \"\";\n names.add(name);\n // Map both path and name to package name for lookup\n if (path) pathMap.set(path, name);\n pathMap.set(name, name);\n });\n\n return { packageNames: Array.from(names), packagePathMap: pathMap };\n }, [lensResultsSlice?.data?.results]);\n\n // Auto-select first package\n React.useEffect(() => {\n if (packageNames.length > 0 && !selectedPackage) {\n setSelectedPackage(packageNames[0]);\n }\n }, [packageNames, selectedPackage]);\n\n // Subscribe to package:select events\n React.useEffect(() => {\n if (!events) return;\n\n const cleanup = events.on(\"package:select\", (event) => {\n const payload = event.payload as PackageSelectPayload | null;\n if (!payload) return;\n\n // Try to match by path first, then by name\n const matchedPackage =\n packagePathMap.get(payload.packagePath) ??\n packagePathMap.get(payload.packageName) ??\n // Also try matching the last segment of the path\n packagePathMap.get(payload.packagePath.split(\"/\").pop() ?? \"\");\n\n if (matchedPackage) {\n setSelectedPackage(matchedPackage);\n }\n });\n\n return cleanup;\n }, [events, packagePathMap]);\n\n // Handle file click - open in editor\n const handleFileClick = (file: string, line?: number) => {\n // Construct full path if we have repository context\n const repoPath = context.currentScope.repository?.path;\n const fullPath = repoPath ? `${repoPath}/${file}` : file;\n\n if (line) {\n // If actions support line numbers, use them\n actions.openFile?.(`${fullPath}:${line}`);\n } else {\n actions.openFile?.(fullPath);\n }\n };\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 display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 40,\n flexShrink: 0,\n padding: \"0 16px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n boxSizing: \"border-box\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <Bug size={18} color={theme.colors.primary} />\n <h2\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Lens Data Debug\n </h2>\n </div>\n {lensResultsSlice?.data && packageNames.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 12,\n }}\n >\n {packageNames.length > 1 ? (\n <select\n value={selectedPackage ?? \"\"}\n onChange={(e) => setSelectedPackage(e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: 4,\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n color: theme.colors.text,\n fontFamily: theme.fonts.body,\n fontSize: 12,\n cursor: \"pointer\",\n outline: \"none\",\n }}\n >\n {packageNames.map((pkg) => (\n <option key={pkg} value={pkg}>\n {pkg}\n </option>\n ))}\n </select>\n ) : (\n <span style={{ color: theme.colors.textMuted }}>\n {packageNames[0]}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflow: \"auto\",\n }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n Loading lens results...\n </div>\n ) : !hasSlice || !lensResultsSlice?.data ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n <Bug\n size={48}\n color={theme.colors.border}\n style={{ marginBottom: 16 }}\n />\n <div style={{ fontSize: 14, marginBottom: 8 }}>\n No lens data available\n </div>\n <div style={{ fontSize: 12 }}>\n Run quality-lens-cli or check that the lensResults slice is\n configured.\n </div>\n </div>\n ) : (\n <LensDataDebugPanelComponent\n data={lensResultsSlice.data}\n theme={theme}\n onFileClick={handleFileClick}\n selectedPackage={selectedPackage ?? undefined}\n onPackageSelect={setSelectedPackage}\n />\n )}\n </div>\n </div>\n );\n};\n\n/**\n * LensDataDebugPanel - A panel for inspecting raw lens results data\n *\n * This panel is useful for debugging and verifying that quality lens data\n * is being collected and formatted correctly. It shows:\n * - Package breakdown (for monorepos)\n * - Lens results with pass/fail status\n * - Files with issues and individual issue details\n */\nexport const LensDataDebugPanel = LensDataDebugPanelContent;\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 type { MetricKey } from \"./QualityHexagon\";\n\nexport interface MetricListItem {\n key: MetricKey;\n label: string;\n value: number;\n color: string;\n icon: React.ReactNode;\n}\n\ninterface QualityMetricsListProps {\n metrics: QualityMetrics;\n theme: Theme;\n className?: string;\n onMetricClick?: (metric: MetricKey) => void;\n}\n\n// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: string): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\n}\n\n// Get background color for the value indicator\nfunction getValueBgColor(value: number, key: string): string {\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"rgba(46, 125, 50, 0.1)\";\n if (effectiveValue >= 60) return \"rgba(230, 167, 0, 0.1)\";\n return \"rgba(198, 40, 40, 0.1)\";\n}\n\n// Icons for each metric\nfunction getMetricIcon(key: MetricKey): React.ReactNode {\n const iconProps = {\n width: 18,\n height: 18,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n switch (key) {\n case \"types\":\n // TypeScript/Types icon (diamond/brackets)\n return (\n <svg {...iconProps}>\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n );\n case \"documentation\":\n // Docs icon (file with lines)\n return (\n <svg {...iconProps}>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14,2 14,8 20,8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\n </svg>\n );\n case \"tests\":\n // Tests icon (check circle)\n return (\n <svg {...iconProps}>\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22,4 12,14.01 9,11.01\" />\n </svg>\n );\n case \"deadCode\":\n // Dead code icon (trash/code)\n return (\n <svg {...iconProps}>\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n case \"formatting\":\n // Formatting icon (align/indent)\n return (\n <svg {...iconProps}>\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" />\n <line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" />\n <line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n );\n case \"linting\":\n // Linting icon (alert/shield)\n return (\n <svg {...iconProps}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n default:\n return null;\n }\n}\n\n// Metrics configuration\nconst METRIC_CONFIG: { key: MetricKey; label: string; description: string }[] =\n [\n { key: \"types\", label: \"Types\", description: \"Type safety score\" },\n {\n key: \"documentation\",\n label: \"Documentation\",\n description: \"Documentation coverage\",\n },\n {\n key: \"tests\",\n label: \"Tests\",\n description: \"Test coverage and passing rate\",\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n description: \"Unused code detected\",\n },\n {\n key: \"formatting\",\n label: \"Formatting\",\n description: \"Code formatting consistency\",\n },\n { key: \"linting\", label: \"Linting\", description: \"Linting compliance\" },\n ];\n\nexport function QualityMetricsList({\n metrics,\n theme,\n className,\n onMetricClick,\n}: QualityMetricsListProps) {\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {METRIC_CONFIG.map(({ key, label, description }) => {\n const value = metrics[key];\n const isDeadCode = key === \"deadCode\";\n\n return (\n <div\n key={key}\n onClick={() => onMetricClick?.(key)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n borderRadius: 6,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n cursor: onMetricClick ? \"pointer\" : \"default\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (onMetricClick) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundLight;\n e.currentTarget.style.borderColor = theme.colors.primary;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n e.currentTarget.style.borderColor = theme.colors.border;\n }}\n >\n {/* Icon */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: getValueBgColor(value, key),\n color: getValueColor(value, key),\n flexShrink: 0,\n }}\n >\n {getMetricIcon(key)}\n </div>\n\n {/* Label and description */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {label}\n {isDeadCode && (\n <span\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n marginLeft: 4,\n }}\n >\n (lower is better)\n </span>\n )}\n </div>\n <div\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {description}\n </div>\n </div>\n\n {/* Value */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n width: 60,\n height: 6,\n borderRadius: 3,\n backgroundColor: theme.colors.border,\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n width: `${isDeadCode ? 100 - value : value}%`,\n height: \"100%\",\n backgroundColor: getValueColor(value, key),\n borderRadius: 3,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n\n {/* Percentage */}\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: getValueColor(value, key),\n minWidth: 45,\n textAlign: \"right\",\n }}\n >\n {value.toFixed(1)}%\n </span>\n </div>\n\n {/* Chevron if clickable */}\n {onMetricClick && (\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={{ flexShrink: 0 }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function QualityMetricsListCompact({\n metrics,\n theme,\n className,\n onMetricClick,\n}: QualityMetricsListProps) {\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n }}\n >\n {METRIC_CONFIG.map(({ key, label }) => {\n const value = metrics[key];\n const isDeadCode = key === \"deadCode\";\n\n return (\n <div\n key={key}\n onClick={() => onMetricClick?.(key)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n cursor: onMetricClick ? \"pointer\" : \"default\",\n transition: \"background-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (onMetricClick) {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {isDeadCode && \" ↓\"}\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}\n >\n {value.toFixed(1)}%\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { QualityHexagonPanel } from \"./panels/QualityHexagonPanel\";\nimport { RepositoryQualityGridPanel } from \"./panels/RepositoryQualityGridPanel\";\nimport { LensDataDebugPanel } from \"./panels/LensDataDebugPanel\";\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 (\n context.hasSlice(\"repositoriesQuality\") &&\n !context.isSliceLoading(\"repositoriesQuality\")\n ) {\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 metadata: {\n id: \"principal-ade.lens-data-debug-panel\",\n name: \"Lens Data Debug\",\n icon: \"🐛\",\n version: \"0.1.0\",\n author: \"Principal ADE\",\n description:\n \"Debug panel for inspecting raw lens results from quality-lens-cli. Shows package breakdown, lens results with pass/fail status, and files with issues.\",\n slices: [\"lensResults\"],\n tools: [],\n },\n component: LensDataDebugPanel,\n\n onMount: async (context: PanelContextValue) => {\n console.log(\n \"Lens Data Debug Panel mounted\",\n context.currentScope.repository?.path,\n );\n\n if (\n context.hasSlice(\"lensResults\") &&\n !context.isSliceLoading(\"lensResults\")\n ) {\n await context.refresh(\"repository\", \"lensResults\");\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log(\"Lens Data Debug 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\";\nexport { LensDataDebugPanel } from \"./panels/LensDataDebugPanel\";\n\n// Export debug components\nexport {\n LensDataDebugPanel as LensDataDebugComponent,\n type FormattedResults,\n type LensResult,\n type Issue,\n} from \"./components\";\n\n// Export metrics list components\nexport { QualityMetricsList, QualityMetricsListCompact } from \"./components\";\n"],"names":["__iconNode","getValueColor","React","_a","LensDataDebugPanel","idx","r","LensDataDebugPanelComponent"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
|
|
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/book-open.js","../node_modules/lucide-react/dist/esm/icons/braces.js","../node_modules/lucide-react/dist/esm/icons/bug.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/file-search.js","../node_modules/lucide-react/dist/esm/icons/flask-conical.js","../node_modules/lucide-react/dist/esm/icons/git-branch.js","../node_modules/lucide-react/dist/esm/icons/hexagon.js","../node_modules/lucide-react/dist/esm/icons/info.js","../node_modules/lucide-react/dist/esm/icons/sparkles.js","../node_modules/lucide-react/dist/esm/icons/terminal.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/x.js","../node_modules/lucide-react/dist/esm/icons/zap.js","../node_modules/@principal-ade/industry-theme/dist/esm/index.js","../node_modules/@principal-ai/quality-lens-registry/dist/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/components/LensDataDebugPanel.tsx","../src/panels/LensDataDebugPanel.tsx","../src/components/QualityMetricsList.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 = [\n [\"path\", { d: \"M12 7v14\", key: \"1akyts\" }],\n [\n \"path\",\n {\n d: \"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\",\n key: \"ruj8y\"\n }\n ]\n];\nconst BookOpen = createLucideIcon(\"book-open\", __iconNode);\n\nexport { __iconNode, BookOpen as default };\n//# sourceMappingURL=book-open.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 { d: \"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1\", key: \"ezmyqa\" }\n ],\n [\n \"path\",\n {\n d: \"M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\",\n key: \"e1hn23\"\n }\n ]\n];\nconst Braces = createLucideIcon(\"braces\", __iconNode);\n\nexport { __iconNode, Braces as default };\n//# sourceMappingURL=braces.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 20v-9\", key: \"1qisl0\" }],\n [\"path\", { d: \"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\", key: \"uouzyp\" }],\n [\"path\", { d: \"M14.12 3.88 16 2\", key: \"qol33r\" }],\n [\"path\", { d: \"M21 21a4 4 0 0 0-3.81-4\", key: \"1b0z45\" }],\n [\"path\", { d: \"M21 5a4 4 0 0 1-3.55 3.97\", key: \"5cxbf6\" }],\n [\"path\", { d: \"M22 13h-4\", key: \"1jl80f\" }],\n [\"path\", { d: \"M3 21a4 4 0 0 1 3.81-4\", key: \"1fjd4g\" }],\n [\"path\", { d: \"M3 5a4 4 0 0 0 3.55 3.97\", key: \"1d7oge\" }],\n [\"path\", { d: \"M6 13H2\", key: \"82j7cp\" }],\n [\"path\", { d: \"m8 2 1.88 1.88\", key: \"fmnt4t\" }],\n [\"path\", { d: \"M9 7.13V6a3 3 0 1 1 6 0v1.13\", key: \"1vgav8\" }]\n];\nconst Bug = createLucideIcon(\"bug\", __iconNode);\n\nexport { __iconNode, Bug as default };\n//# sourceMappingURL=bug.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: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"11.5\", cy: \"14.5\", r: \"2.5\", key: \"1bq0ko\" }],\n [\"path\", { d: \"M13.3 16.3 15 18\", key: \"2quom7\" }]\n];\nconst FileSearch = createLucideIcon(\"file-search\", __iconNode);\n\nexport { __iconNode, FileSearch as default };\n//# sourceMappingURL=file-search.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: \"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\n key: \"18mbvz\"\n }\n ],\n [\"path\", { d: \"M6.453 15h11.094\", key: \"3shlmq\" }],\n [\"path\", { d: \"M8.5 2h7\", key: \"csnxdl\" }]\n];\nconst FlaskConical = createLucideIcon(\"flask-conical\", __iconNode);\n\nexport { __iconNode, FlaskConical as default };\n//# sourceMappingURL=flask-conical.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 [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n];\nconst GitBranch = createLucideIcon(\"git-branch\", __iconNode);\n\nexport { __iconNode, GitBranch as default };\n//# sourceMappingURL=git-branch.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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.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: \"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.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","/**\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: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.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: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.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: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n];\nconst Zap = createLucideIcon(\"zap\", __iconNode);\n\nexport { __iconNode, Zap as default };\n//# sourceMappingURL=zap.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// src/landingPageTheme.ts\nvar landingPageTheme = {\n space: [0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 100, 128],\n fonts: {\n body: 'Inter, \"Geist Sans\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n heading: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\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: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.2,\n tight: 1.05,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\", \"1400px\"],\n sizes: [16, 32, 64, 128, 200, 240, 256, 300, 512, 740, 768, 820, 900, 1024, 1200, 1400, 1536],\n radii: [0, 2, 4, 6, 7, 8, 9, 10, 12, 14, 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 4px 12px rgba(0, 194, 255, 0.4)\",\n \"0 6px 24px rgba(0, 194, 255, 0.1)\",\n \"0 8px 32px rgba(0, 0, 0, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50, 1000],\n colors: {\n text: \"#ffffff\",\n background: \"#000000\",\n primary: \"#00C2FF\",\n secondary: \"#0098CC\",\n accent: \"#0066FF\",\n highlight: \"rgba(0, 194, 255, 0.15)\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(0, 194, 255, 0.2)\",\n backgroundSecondary: \"#0a1628\",\n backgroundTertiary: \"#0f1c2e\",\n backgroundLight: \"rgba(0, 194, 255, 0.04)\",\n backgroundHover: \"rgba(0, 194, 255, 0.1)\",\n surface: \"rgba(0, 0, 0, 0.4)\",\n textSecondary: \"#d1d5db\",\n textTertiary: \"#9ca3af\",\n textMuted: \"#6b7280\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#000000\",\n bg: \"#00C2FF\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#00D9FF\"\n }\n },\n secondary: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(0, 194, 255, 0.3)\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"rgba(0, 194, 255, 0.1)\",\n borderColor: \"#00C2FF\"\n }\n },\n ghost: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#00D9FF\",\n bg: \"rgba(0, 194, 255, 0.1)\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"#ffffff\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\",\n color: \"text\"\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: 4\n },\n secondary: {\n bg: \"rgba(0, 194, 255, 0.05)\",\n border: \"1px solid\",\n borderColor: \"rgba(0, 194, 255, 0.2)\",\n borderRadius: 4\n }\n }\n};\nvar landingPageLightTheme = {\n ...landingPageTheme,\n colors: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#0098CC\",\n secondary: \"#00C2FF\",\n accent: \"#0066FF\",\n highlight: \"rgba(0, 152, 204, 0.1)\",\n muted: \"#f0f0f0\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"rgba(0, 152, 204, 0.2)\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"rgba(0, 152, 204, 0.03)\",\n backgroundHover: \"rgba(0, 152, 204, 0.05)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\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: \"#ffffff\",\n bg: \"#0098CC\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#007aa8\"\n }\n },\n secondary: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"rgba(0, 152, 204, 0.3)\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"rgba(0, 152, 204, 0.05)\",\n borderColor: \"#0098CC\"\n }\n },\n ghost: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#007aa8\",\n bg: \"rgba(0, 152, 204, 0.05)\"\n }\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 landingPageTheme,\n landingPageLightTheme,\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","// src/registry.ts\nvar LENS_REGISTRY = [\n // ============================================================\n // LINTING - Code style and bug detection\n // ============================================================\n // TypeScript/JavaScript linting\n {\n id: \"eslint\",\n name: \"ESLint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Pluggable linting utility for JavaScript and TypeScript\",\n command: \"eslint\",\n fileMetricsRequirements: {\n completeCommand: \"npx eslint . --format json\",\n requiredFlags: [\"--format json\"],\n formatFlag: \"--format json\",\n withoutConfig: \"Only files with issues are reported in the output\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"ESLint JSON output only includes files that have issues. Clean files are not listed.\"\n }\n },\n {\n id: \"biome-lint\",\n name: \"Biome Lint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"eslint\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Fast linter for JavaScript and TypeScript\",\n command: \"biome lint\",\n fileMetricsRequirements: {\n completeCommand: \"npx @biomejs/biome lint . --reporter=json\",\n requiredFlags: [\"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Biome JSON output includes all analyzed files.\"\n }\n },\n {\n id: \"oxlint\",\n name: \"OxLint\",\n category: \"linting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"eslint\", \"biome-lint\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Blazing fast JavaScript/TypeScript linter\",\n command: \"oxlint\",\n fileMetricsRequirements: {\n completeCommand: \"npx oxlint --format json\",\n requiredFlags: [\"--format json\"],\n formatFlag: \"--format json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false\n }\n },\n // Python linting\n {\n id: \"ruff\",\n name: \"Ruff\",\n category: \"linting\",\n languages: [\"python\"],\n alternativeTo: [\"pylint\", \"flake8\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Extremely fast Python linter\",\n command: \"ruff check\",\n fileMetricsRequirements: {\n completeCommand: \"ruff check . --output-format=json\",\n requiredFlags: [\"--output-format=json\"],\n formatFlag: \"--output-format=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"Ruff JSON output only includes files with issues.\"\n }\n },\n {\n id: \"pylint\",\n name: \"Pylint\",\n category: \"linting\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Python static code analyzer\",\n command: \"pylint\",\n fileMetricsRequirements: {\n completeCommand: \"pylint --output-format=json .\",\n requiredFlags: [\"--output-format=json\"],\n formatFlag: \"--output-format=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false\n }\n },\n // Go linting\n {\n id: \"golangci-lint\",\n name: \"golangci-lint\",\n category: \"linting\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Fast linters runner for Go\",\n command: \"golangci-lint run\"\n },\n // Rust linting\n {\n id: \"clippy\",\n name: \"Clippy\",\n category: \"linting\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Rust linter\",\n command: \"cargo clippy\",\n fileMetricsRequirements: {\n completeCommand: \"cargo clippy --workspace --all-features --message-format json -- -D warnings\",\n requiredFlags: [\"--message-format json\"],\n formatFlag: \"--message-format json\",\n withoutConfig: \"Only files with issues are reported in the output\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"Clippy JSON output only includes files with issues. Use cargo metadata to get complete file list.\"\n }\n },\n // ============================================================\n // FORMATTING - Code formatting\n // ============================================================\n // TypeScript/JavaScript formatting\n {\n id: \"prettier\",\n name: \"Prettier\",\n category: \"formatting\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Opinionated code formatter\",\n command: \"prettier --check\",\n fileMetricsRequirements: {\n completeCommand: \"npx prettier --check . --no-error-on-unmatched-pattern --log-level debug\",\n requiredFlags: [\"--check\", \"--log-level debug\"],\n withoutConfig: \"Without --log-level debug, file list is not available\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Prettier with --log-level debug lists all checked files. This is the reference implementation for complete file metrics.\"\n }\n },\n {\n id: \"biome-format\",\n name: \"Biome Format\",\n category: \"formatting\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"prettier\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Fast code formatter for JavaScript and TypeScript\",\n command: \"biome format\",\n fileMetricsRequirements: {\n completeCommand: \"npx @biomejs/biome format . --reporter=json\",\n requiredFlags: [\"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true\n }\n },\n // Python formatting\n {\n id: \"black\",\n name: \"Black\",\n category: \"formatting\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"The uncompromising Python code formatter\",\n command: \"black --check\"\n },\n {\n id: \"ruff-format\",\n name: \"Ruff Format\",\n category: \"formatting\",\n languages: [\"python\"],\n alternativeTo: [\"black\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Fast Python formatter (Ruff)\",\n command: \"ruff format --check\"\n },\n // Go formatting\n {\n id: \"gofmt\",\n name: \"gofmt\",\n category: \"formatting\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Go code formatter\",\n command: \"gofmt -l\"\n },\n // Rust formatting\n {\n id: \"rustfmt\",\n name: \"rustfmt\",\n category: \"formatting\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Rust code formatter\",\n command: \"cargo fmt --check\",\n fileMetricsRequirements: {\n completeCommand: \"cargo fmt --all --check\",\n requiredFlags: [\"--check\"],\n withoutConfig: \"Without --check, files are modified in place\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"rustfmt only outputs files that need formatting. Use cargo metadata or glob for complete file list.\"\n }\n },\n // ============================================================\n // TYPES - Type checking\n // ============================================================\n // TypeScript\n {\n id: \"typescript\",\n name: \"TypeScript\",\n category: \"types\",\n languages: [\"typescript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"TypeScript type checker\",\n command: \"tsc --noEmit\",\n fileMetricsRequirements: {\n completeCommand: \"npx tsc --noEmit --listFiles\",\n requiredFlags: [\"--listFiles\"],\n withoutConfig: \"Only files with type errors are reported. Cannot determine total files analyzed.\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"The --listFiles flag is REQUIRED to get the complete list of files TypeScript analyzed. Without it, only files with errors appear in output.\"\n }\n },\n // Python type checking\n {\n id: \"mypy\",\n name: \"MyPy\",\n category: \"types\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Static type checker for Python\",\n command: \"mypy\"\n },\n {\n id: \"pyright\",\n name: \"Pyright\",\n category: \"types\",\n languages: [\"python\"],\n alternativeTo: [\"mypy\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Static type checker for Python\",\n command: \"pyright\"\n },\n // Go type checking (built into compiler)\n {\n id: \"go-vet\",\n name: \"Go Vet\",\n category: \"types\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Go static analyzer\",\n command: \"go vet\"\n },\n // ============================================================\n // TESTS - Test coverage and results\n // ============================================================\n // JavaScript/TypeScript testing\n {\n id: \"jest\",\n name: \"Jest\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"JavaScript testing framework\",\n command: \"jest --coverage\",\n fileMetricsRequirements: {\n completeCommand: \"npx jest --coverage --json --outputFile=jest-results.json\",\n requiredFlags: [\"--coverage\", \"--json\"],\n formatFlag: \"--json\",\n withoutConfig: \"Without --coverage, no per-file coverage data is available. Without --json, output cannot be parsed.\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Jest coverage data provides per-file metrics for source files. Test file results are separate from source coverage.\"\n }\n },\n {\n id: \"vitest\",\n name: \"Vitest\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"jest\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Vite-native testing framework\",\n command: \"vitest run --coverage\",\n fileMetricsRequirements: {\n completeCommand: \"npx vitest run --coverage --reporter=json\",\n requiredFlags: [\"--coverage\", \"--reporter=json\"],\n formatFlag: \"--reporter=json\",\n withoutConfig: \"Without --coverage, no per-file coverage data is available\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Vitest coverage provides per-file metrics. Requires @vitest/coverage-v8 or @vitest/coverage-istanbul.\"\n }\n },\n {\n id: \"bun-test\",\n name: \"Bun Test\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"jest\", \"vitest\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Bun native test runner\",\n command: \"bun test\",\n fileMetricsRequirements: {\n completeCommand: \"bun test --coverage\",\n requiredFlags: [\"--coverage\"],\n withoutConfig: \"Without --coverage, no per-file coverage data is available\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Bun test coverage is built-in but requires --coverage flag.\"\n }\n },\n {\n id: \"node-test\",\n name: \"Node Test\",\n category: \"tests\",\n languages: [\"typescript\", \"javascript\"],\n alternativeTo: [\"jest\", \"vitest\", \"bun-test\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Node.js native test runner\",\n command: \"node --test\",\n fileMetricsRequirements: {\n completeCommand: \"node --test --experimental-test-coverage\",\n requiredFlags: [\"--experimental-test-coverage\"],\n withoutConfig: \"Without --experimental-test-coverage, no per-file coverage data is available\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Node.js native test runner (node:test) uses TAP output format. Coverage requires --experimental-test-coverage flag (Node 20+). Also works with tsx --test for TypeScript.\"\n }\n },\n // Python testing\n {\n id: \"pytest\",\n name: \"Pytest\",\n category: \"tests\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Python testing framework\",\n command: \"pytest --cov\"\n },\n // Go testing\n {\n id: \"go-test\",\n name: \"Go Test\",\n category: \"tests\",\n languages: [\"go\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Go test runner\",\n command: \"go test -cover\"\n },\n // Rust testing\n {\n id: \"cargo-test\",\n name: \"Cargo Test\",\n category: \"tests\",\n languages: [\"rust\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Rust test runner\",\n command: \"cargo test\",\n fileMetricsRequirements: {\n completeCommand: \"cargo test --workspace --no-fail-fast -- -Z unstable-options --format json\",\n requiredFlags: [\"--format json\"],\n formatFlag: \"--format json\",\n withoutConfig: \"Without JSON format, output cannot be parsed for test results\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"JSON format requires nightly or -Z unstable-options. Consider cargo-nextest for stable JSON output.\"\n }\n },\n {\n id: \"cargo-nextest\",\n name: \"Cargo Nextest\",\n category: \"tests\",\n languages: [\"rust\"],\n alternativeTo: [\"cargo-test\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"Next-generation Rust test runner\",\n command: \"cargo nextest run\",\n fileMetricsRequirements: {\n completeCommand: \"cargo nextest run --workspace --message-format libtest-json\",\n requiredFlags: [\"--message-format libtest-json\"],\n formatFlag: \"--message-format libtest-json\",\n withoutConfig: \"Without JSON format, output cannot be parsed\",\n fallbackStrategy: \"coverage-only\",\n nativelyComplete: false,\n notes: \"Nextest provides stable JSON output without nightly features.\"\n }\n },\n // ============================================================\n // DEAD CODE - Unused code detection\n // ============================================================\n // TypeScript/JavaScript\n {\n id: \"knip\",\n name: \"Knip\",\n category: \"dead-code\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Find unused files, dependencies and exports\",\n command: \"knip\",\n fileMetricsRequirements: {\n completeCommand: \"npx knip --reporter json\",\n requiredFlags: [\"--reporter json\"],\n formatFlag: \"--reporter json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: false,\n notes: \"Knip reports unused files and exports. It does not list all analyzed files, only those with issues.\"\n }\n },\n // Python\n {\n id: \"vulture\",\n name: \"Vulture\",\n category: \"dead-code\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Find dead Python code\",\n command: \"vulture\"\n },\n // ============================================================\n // DOCUMENTATION - Documentation coverage\n // ============================================================\n {\n id: \"alexandria\",\n name: \"Alexandria\",\n category: \"documentation\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"binary\",\n description: \"Documentation coverage checker\",\n command: \"alexandria lint\",\n fileMetricsRequirements: {\n completeCommand: \"npx @principal-ai/alexandria-cli coverage --json\",\n requiredFlags: [\"--json\"],\n formatFlag: \"--json\",\n withoutConfig: \"Output cannot be parsed for file metrics\",\n fallbackStrategy: \"source-file-count\",\n nativelyComplete: true,\n notes: \"Alexandria reports documentation coverage for all analyzed files.\"\n }\n },\n {\n id: \"typedoc\",\n name: \"TypeDoc\",\n category: \"documentation\",\n languages: [\"typescript\"],\n outputsFileMetrics: false,\n outputsAggregate: true,\n colorScheme: \"coverage\",\n description: \"TypeScript documentation generator\",\n command: \"typedoc\"\n },\n // ============================================================\n // SECURITY - Security scanning\n // ============================================================\n {\n id: \"npm-audit\",\n name: \"npm audit\",\n category: \"security\",\n languages: [\"typescript\", \"javascript\"],\n outputsFileMetrics: false,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Check for known vulnerabilities in dependencies\",\n command: \"npm audit\"\n },\n {\n id: \"bandit\",\n name: \"Bandit\",\n category: \"security\",\n languages: [\"python\"],\n outputsFileMetrics: true,\n outputsAggregate: true,\n colorScheme: \"issues\",\n description: \"Python security linter\",\n command: \"bandit -r\"\n }\n];\nvar CATEGORY_CONFIGS = [\n {\n id: \"linting\",\n name: \"Linting\",\n description: \"Code style and bug detection\",\n icon: \"AlertCircle\"\n },\n {\n id: \"formatting\",\n name: \"Formatting\",\n description: \"Code formatting consistency\",\n icon: \"AlignLeft\"\n },\n {\n id: \"types\",\n name: \"Types\",\n description: \"Type safety and checking\",\n icon: \"FileType\"\n },\n {\n id: \"tests\",\n name: \"Tests\",\n description: \"Test coverage and results\",\n icon: \"TestTube\"\n },\n {\n id: \"dead-code\",\n name: \"Dead Code\",\n description: \"Unused code detection\",\n icon: \"Trash2\",\n invertedScale: true\n },\n {\n id: \"documentation\",\n name: \"Documentation\",\n description: \"Documentation coverage\",\n icon: \"FileText\"\n },\n {\n id: \"security\",\n name: \"Security\",\n description: \"Security vulnerability scanning\",\n icon: \"Shield\"\n },\n {\n id: \"complexity\",\n name: \"Complexity\",\n description: \"Code complexity metrics\",\n icon: \"GitBranch\"\n }\n];\nvar LANGUAGE_CONFIGS = [\n {\n id: \"typescript\",\n name: \"TypeScript\",\n extensions: [\".ts\", \".tsx\", \".mts\", \".cts\"],\n icon: \"TS\"\n },\n {\n id: \"javascript\",\n name: \"JavaScript\",\n extensions: [\".js\", \".jsx\", \".mjs\", \".cjs\"],\n icon: \"JS\"\n },\n {\n id: \"python\",\n name: \"Python\",\n extensions: [\".py\", \".pyi\"],\n icon: \"PY\"\n },\n {\n id: \"go\",\n name: \"Go\",\n extensions: [\".go\"],\n icon: \"GO\"\n },\n {\n id: \"rust\",\n name: \"Rust\",\n extensions: [\".rs\"],\n icon: \"RS\"\n },\n {\n id: \"java\",\n name: \"Java\",\n extensions: [\".java\"],\n icon: \"JV\"\n },\n {\n id: \"csharp\",\n name: \"C#\",\n extensions: [\".cs\"],\n icon: \"C#\"\n },\n {\n id: \"ruby\",\n name: \"Ruby\",\n extensions: [\".rb\"],\n icon: \"RB\"\n },\n {\n id: \"php\",\n name: \"PHP\",\n extensions: [\".php\"],\n icon: \"PHP\"\n }\n];\n\n// src/helpers.ts\nfunction getLensById(id) {\n return LENS_REGISTRY.find((lens) => lens.id === id);\n}\nfunction getLensesByCategory(category) {\n return LENS_REGISTRY.filter((lens) => lens.category === category);\n}\nfunction getLensesByLanguage(language) {\n return LENS_REGISTRY.filter((lens) => lens.languages.includes(language));\n}\nfunction getLensesByCategoryAndLanguage(category, language) {\n return LENS_REGISTRY.filter(\n (lens) => lens.category === category && lens.languages.includes(language)\n );\n}\nfunction getCategoryForLens(lensId) {\n return getLensById(lensId)?.category;\n}\nfunction getAlternatives(lensId) {\n const lens = getLensById(lensId);\n if (!lens) return [];\n const listedAsAlternative = LENS_REGISTRY.filter(\n (other) => other.alternativeTo?.includes(lensId)\n );\n const thisListsAsAlternative = lens.alternativeTo ? LENS_REGISTRY.filter((other) => lens.alternativeTo.includes(other.id)) : [];\n const all = [...listedAsAlternative, ...thisListsAsAlternative];\n return Array.from(new Map(all.map((l) => [l.id, l])).values());\n}\nfunction areLensesAlternatives(lensId1, lensId2) {\n const lens1 = getLensById(lensId1);\n const lens2 = getLensById(lensId2);\n if (!lens1 || !lens2) return false;\n if (lens1.category !== lens2.category) return false;\n return lens1.alternativeTo?.includes(lensId2) || lens2.alternativeTo?.includes(lensId1) || false;\n}\nfunction getLensesWithFileMetrics() {\n return LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics);\n}\nfunction getLensesWithAggregates() {\n return LENS_REGISTRY.filter((lens) => lens.outputsAggregate);\n}\nfunction getColorModeForCategory(category, lensesRan) {\n const lensesInCategory = getLensesByCategory(category);\n for (const lensId of lensesRan) {\n if (lensesInCategory.some((lens) => lens.id === lensId)) {\n return lensId;\n }\n }\n return null;\n}\nfunction getLensDisplayName(lensId) {\n return getLensById(lensId)?.name ?? lensId;\n}\nfunction getLensColorScheme(lensId) {\n return getLensById(lensId)?.colorScheme ?? \"issues\";\n}\nfunction getCategoryConfig(category) {\n return CATEGORY_CONFIGS.find((c) => c.id === category);\n}\nfunction getCategoryDisplayName(category) {\n return getCategoryConfig(category)?.name ?? category;\n}\nfunction isCategoryInverted(category) {\n return getCategoryConfig(category)?.invertedScale ?? false;\n}\nfunction getLanguageConfig(language) {\n return LANGUAGE_CONFIGS.find((l) => l.id === language);\n}\nfunction detectLanguageFromExtension(extension) {\n const normalizedExt = extension.startsWith(\".\") ? extension : `.${extension}`;\n const config = LANGUAGE_CONFIGS.find(\n (l) => l.extensions.includes(normalizedExt.toLowerCase())\n );\n return config?.id;\n}\nfunction getLanguagesForCategory(category) {\n const lenses = getLensesByCategory(category);\n const languages = /* @__PURE__ */ new Set();\n for (const lens of lenses) {\n for (const lang of lens.languages) {\n languages.add(lang);\n }\n }\n return Array.from(languages);\n}\nvar HEXAGON_METRIC_TO_CATEGORY = {\n linting: \"linting\",\n formatting: \"formatting\",\n types: \"types\",\n tests: \"tests\",\n deadCode: \"dead-code\",\n documentation: \"documentation\"\n};\nvar CATEGORY_TO_HEXAGON_METRIC = {\n \"linting\": \"linting\",\n \"formatting\": \"formatting\",\n \"types\": \"types\",\n \"tests\": \"tests\",\n \"dead-code\": \"deadCode\",\n \"documentation\": \"documentation\"\n};\nfunction getCategoryForHexagonMetric(metric) {\n return HEXAGON_METRIC_TO_CATEGORY[metric];\n}\nfunction getHexagonMetricForCategory(category) {\n return CATEGORY_TO_HEXAGON_METRIC[category];\n}\nfunction isLensInHexagonMetric(lensId, metric) {\n const lensCategory = getCategoryForLens(lensId);\n if (!lensCategory) return false;\n return HEXAGON_METRIC_TO_CATEGORY[metric] === lensCategory;\n}\nfunction getColorModeForHexagonMetric(metric, lensesRan) {\n const category = HEXAGON_METRIC_TO_CATEGORY[metric];\n return getColorModeForCategory(category, lensesRan);\n}\nfunction isHexagonMetricConfigured(metric, lensesRan) {\n if (lensesRan === void 0) {\n return true;\n }\n if (lensesRan.length === 0) {\n return false;\n }\n return lensesRan.some((lensId) => isLensInHexagonMetric(lensId, metric));\n}\nfunction getHexagonMetricKeys() {\n return Object.keys(HEXAGON_METRIC_TO_CATEGORY);\n}\nfunction isValidLensId(lensId) {\n return getLensById(lensId) !== void 0;\n}\nfunction findCategoryConflicts(lensesRan) {\n const byCategory = /* @__PURE__ */ new Map();\n for (const lensId of lensesRan) {\n const category = getCategoryForLens(lensId);\n if (category) {\n const existing = byCategory.get(category) || [];\n existing.push(lensId);\n byCategory.set(category, existing);\n }\n }\n const conflicts = [];\n for (const [category, lenses] of byCategory) {\n if (lenses.length > 1) {\n conflicts.push({ category, lenses });\n }\n }\n return conflicts;\n}\nfunction validateLensOutputs(lensesRan, fileMetricsProduced, aggregatesProduced) {\n const issues = [];\n for (const lensId of lensesRan) {\n const lens = getLensById(lensId);\n if (!lens) continue;\n const missing = [];\n if (lens.outputsFileMetrics && !fileMetricsProduced.includes(lensId)) {\n missing.push(\"fileMetrics\");\n }\n if (lens.outputsAggregate && !aggregatesProduced.includes(lensId)) {\n missing.push(\"aggregate\");\n }\n if (missing.length > 0) {\n issues.push({ lensId, missing });\n }\n }\n return issues;\n}\nvar BUILT_IN_COLOR_MODES = [\n {\n id: \"fileTypes\",\n name: \"File Types\",\n description: \"Color by file extension/type\",\n icon: \"FileCode\",\n colorScheme: \"categorical\",\n isBuiltIn: true\n },\n {\n id: \"git\",\n name: \"Git Status\",\n description: \"Color by git status (modified, added, etc.)\",\n icon: \"GitBranch\",\n colorScheme: \"categorical\",\n isBuiltIn: true\n },\n {\n id: \"coverage\",\n name: \"Test Coverage\",\n description: \"Color by test coverage percentage\",\n icon: \"TestTube\",\n colorScheme: \"coverage\",\n isBuiltIn: true,\n category: \"tests\"\n }\n];\nfunction getAvailableColorModes() {\n const builtIn = [\"fileTypes\", \"git\", \"coverage\"];\n const lensColorModes = getLensColorModes();\n return [...builtIn, ...lensColorModes];\n}\nfunction getLensColorModes() {\n return LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics).map((lens) => lens.id);\n}\nfunction isValidColorMode(mode) {\n return getAvailableColorModes().includes(mode);\n}\nfunction isLensColorMode(mode) {\n return getLensColorModes().includes(mode);\n}\nfunction getColorModeConfig(mode) {\n const builtIn = BUILT_IN_COLOR_MODES.find((m) => m.id === mode);\n if (builtIn) return builtIn;\n const lens = getLensById(mode);\n if (lens && lens.outputsFileMetrics) {\n const category = getCategoryConfig(lens.category);\n return {\n id: mode,\n name: lens.name,\n description: lens.description ?? `${lens.name} analysis`,\n icon: category?.icon,\n colorScheme: lens.colorScheme,\n isBuiltIn: false,\n category: lens.category\n };\n }\n return void 0;\n}\nfunction getAllColorModeConfigs() {\n const configs = [...BUILT_IN_COLOR_MODES];\n for (const lens of LENS_REGISTRY) {\n if (lens.outputsFileMetrics) {\n const category = getCategoryConfig(lens.category);\n configs.push({\n id: lens.id,\n name: lens.name,\n description: lens.description ?? `${lens.name} analysis`,\n icon: category?.icon,\n colorScheme: lens.colorScheme,\n isBuiltIn: false,\n category: lens.category\n });\n }\n }\n return configs;\n}\nfunction getColorModesForLanguage(language) {\n const builtIn = [\"fileTypes\", \"git\"];\n const lensColorModes = LENS_REGISTRY.filter((lens) => lens.outputsFileMetrics && lens.languages.includes(language)).map((lens) => lens.id);\n return [...builtIn, ...lensColorModes];\n}\nfunction getAvailableColorModesFromLenses(lensesRan) {\n const builtIn = [\"fileTypes\", \"git\", \"coverage\"];\n const lensColorModes = lensesRan.filter((lensId) => {\n const lens = getLensById(lensId);\n return lens?.outputsFileMetrics;\n });\n return [...builtIn, ...lensColorModes];\n}\nfunction isColorModeAvailable(mode, lensesRan) {\n if (mode === \"fileTypes\" || mode === \"git\" || mode === \"coverage\") {\n return true;\n }\n return lensesRan.includes(mode);\n}\n\n// src/defaults.ts\nvar JAVASCRIPT_DEFAULTS = [\n // Testing\n {\n lensId: \"jest\",\n command: \"npx jest\",\n cliArgs: [\"--json\", \"--coverage\", \"--passWithNoTests\"],\n description: \"Run Jest tests with coverage\"\n },\n {\n lensId: \"vitest\",\n command: \"npx vitest run\",\n cliArgs: [\"--reporter=json\", \"--coverage\"],\n description: \"Run Vitest tests with coverage\"\n },\n {\n lensId: \"bun-test\",\n command: \"bun test\",\n cliArgs: [\"--coverage\"],\n description: \"Run Bun tests with coverage\"\n },\n // Linting\n {\n lensId: \"eslint\",\n command: \"npx eslint .\",\n cliArgs: [\"--format=json\"],\n description: \"Run ESLint\"\n },\n {\n lensId: \"biome-lint\",\n command: \"npx @biomejs/biome lint .\",\n cliArgs: [\"--reporter=json\"],\n description: \"Run Biome linter\"\n },\n {\n lensId: \"oxlint\",\n command: \"npx oxlint\",\n cliArgs: [\"--format=json\"],\n description: \"Run oxlint\"\n },\n // Formatting\n {\n lensId: \"prettier\",\n command: \"npx prettier --check .\",\n cliArgs: [],\n description: \"Check Prettier formatting\"\n },\n {\n lensId: \"biome-format\",\n command: \"npx @biomejs/biome format .\",\n cliArgs: [\"--reporter=json\"],\n description: \"Check Biome formatting\"\n },\n // Types\n {\n lensId: \"typescript\",\n command: \"npx tsc --noEmit\",\n cliArgs: [],\n description: \"Run TypeScript type checking\"\n },\n // Dead code\n {\n lensId: \"knip\",\n command: \"npx knip\",\n cliArgs: [\"--reporter=json\"],\n description: \"Find unused code with Knip\"\n },\n // Documentation\n {\n lensId: \"alexandria\",\n command: \"npx @anthropic-ai/alexandria lint\",\n cliArgs: [],\n description: \"Check documentation coverage\"\n }\n];\nvar PYTHON_DEFAULTS = [\n // Testing\n {\n lensId: \"pytest\",\n command: \"pytest\",\n cliArgs: [\"--json-report\", \"--cov\", \"--cov-report=json\"],\n description: \"Run pytest with coverage\"\n },\n // Linting\n {\n lensId: \"ruff\",\n command: \"ruff check .\",\n cliArgs: [\"--output-format=json\"],\n description: \"Run Ruff linter\"\n },\n {\n lensId: \"pylint\",\n command: \"pylint\",\n cliArgs: [\"--output-format=json\"],\n description: \"Run Pylint\"\n },\n // Formatting\n {\n lensId: \"black\",\n command: \"black --check .\",\n cliArgs: [],\n description: \"Check Black formatting\"\n },\n {\n lensId: \"ruff-format\",\n command: \"ruff format --check .\",\n cliArgs: [],\n description: \"Check Ruff formatting\"\n },\n // Types\n {\n lensId: \"mypy\",\n command: \"mypy .\",\n cliArgs: [\"--output=json\"],\n description: \"Run MyPy type checking\"\n },\n {\n lensId: \"pyright\",\n command: \"pyright\",\n cliArgs: [\"--outputjson\"],\n description: \"Run Pyright type checking\"\n },\n // Dead code\n {\n lensId: \"vulture\",\n command: \"vulture .\",\n cliArgs: [],\n description: \"Find dead code with Vulture\"\n },\n // Security\n {\n lensId: \"bandit\",\n command: \"bandit -r .\",\n cliArgs: [\"--format=json\"],\n description: \"Security scan with Bandit\"\n }\n];\nvar GO_DEFAULTS = [\n // Testing\n {\n lensId: \"go-test\",\n command: \"go test ./...\",\n cliArgs: [\"-json\", \"-cover\"],\n description: \"Run Go tests with coverage\"\n },\n // Linting\n {\n lensId: \"golangci-lint\",\n command: \"golangci-lint run\",\n cliArgs: [\"--out-format=json\"],\n description: \"Run golangci-lint\"\n },\n // Formatting\n {\n lensId: \"gofmt\",\n command: \"gofmt -l .\",\n cliArgs: [],\n description: \"Check Go formatting\"\n },\n // Types / Vet\n {\n lensId: \"go-vet\",\n command: \"go vet ./...\",\n cliArgs: [\"-json\"],\n description: \"Run go vet\"\n }\n];\nvar RUST_DEFAULTS = [\n // Testing\n {\n lensId: \"cargo-test\",\n command: \"cargo test\",\n cliArgs: [\"--\", \"--format=json\"],\n description: \"Run Cargo tests\"\n },\n // Linting\n {\n lensId: \"clippy\",\n command: \"cargo clippy\",\n cliArgs: [\"--message-format=json\"],\n description: \"Run Clippy linter\"\n },\n // Formatting\n {\n lensId: \"rustfmt\",\n command: \"cargo fmt --check\",\n cliArgs: [],\n description: \"Check Rust formatting\"\n }\n];\nvar DEFAULT_COMMANDS = {\n typescript: JAVASCRIPT_DEFAULTS,\n javascript: JAVASCRIPT_DEFAULTS,\n python: PYTHON_DEFAULTS,\n go: GO_DEFAULTS,\n rust: RUST_DEFAULTS,\n // Placeholder for future languages\n java: [],\n csharp: [],\n ruby: [],\n php: []\n};\nfunction getDefaultCommands(language) {\n return DEFAULT_COMMANDS[language] || [];\n}\nfunction getDefaultCommand(lensId, language) {\n if (language) {\n return DEFAULT_COMMANDS[language]?.find((cmd) => cmd.lensId === lensId);\n }\n for (const commands of Object.values(DEFAULT_COMMANDS)) {\n const found = commands.find((cmd) => cmd.lensId === lensId);\n if (found) return found;\n }\n return void 0;\n}\nfunction getAllDefaultLensIds() {\n const ids = /* @__PURE__ */ new Set();\n for (const commands of Object.values(DEFAULT_COMMANDS)) {\n for (const cmd of commands) {\n ids.add(cmd.lensId);\n }\n }\n return Array.from(ids);\n}\n\n// src/extraction.ts\nfunction normalizeLensId(lensId) {\n const id = lensId.toLowerCase();\n if (id === \"lint\") return \"eslint\";\n if (id === \"typecheck\" || id === \"tsc\") return \"typescript\";\n if (id === \"format\") return \"prettier\";\n if (id === \"test\") return \"jest\";\n return id;\n}\nfunction getFileMetricsKey(lensId) {\n return normalizeLensId(lensId);\n}\nfunction lensProducesCoverage(lensId) {\n return getCategoryForLens(lensId) === \"tests\";\n}\nfunction extractQualityDataFromResults(results) {\n const fileCoverage = {};\n const fileMetrics = {};\n for (const result of results) {\n const lensId = result.lens?.id?.toLowerCase() || \"unknown\";\n if (result.coverage?.files) {\n for (const file of result.coverage.files) {\n fileCoverage[file.file] = file.lines;\n }\n }\n if (result.fileMetrics && result.fileMetrics.length > 0) {\n const key = getFileMetricsKey(lensId);\n fileMetrics[key] = [...fileMetrics[key] || [], ...result.fileMetrics];\n }\n }\n return {\n fileCoverage: Object.keys(fileCoverage).length > 0 ? fileCoverage : void 0,\n fileMetrics: Object.keys(fileMetrics).length > 0 ? fileMetrics : void 0\n };\n}\nfunction extractQualityDataWithPaths(results, prefixPaths = false) {\n if (!prefixPaths) {\n return extractQualityDataFromResults(results);\n }\n const fileCoverage = {};\n const fileMetrics = {};\n for (const result of results) {\n const lensId = result.lens?.id?.toLowerCase() || \"unknown\";\n const packagePath = result.package?.path || \"\";\n const toFullPath = (filePath) => {\n if (!packagePath || filePath.startsWith(packagePath)) {\n return filePath;\n }\n return `${packagePath}/${filePath}`;\n };\n if (result.coverage?.files) {\n for (const file of result.coverage.files) {\n const fullPath = toFullPath(file.file);\n fileCoverage[fullPath] = file.lines;\n }\n }\n if (result.fileMetrics && result.fileMetrics.length > 0) {\n const key = getFileMetricsKey(lensId);\n const prefixedMetrics = result.fileMetrics.map((fm) => ({\n ...fm,\n file: toFullPath(fm.file)\n }));\n fileMetrics[key] = [...fileMetrics[key] || [], ...prefixedMetrics];\n }\n }\n return {\n fileCoverage: Object.keys(fileCoverage).length > 0 ? fileCoverage : void 0,\n fileMetrics: Object.keys(fileMetrics).length > 0 ? fileMetrics : void 0\n };\n}\nexport {\n CATEGORY_CONFIGS,\n DEFAULT_COMMANDS,\n GO_DEFAULTS,\n JAVASCRIPT_DEFAULTS,\n LANGUAGE_CONFIGS,\n LENS_REGISTRY,\n PYTHON_DEFAULTS,\n RUST_DEFAULTS,\n areLensesAlternatives,\n detectLanguageFromExtension,\n extractQualityDataFromResults,\n extractQualityDataWithPaths,\n findCategoryConflicts,\n getAllColorModeConfigs,\n getAllDefaultLensIds,\n getAlternatives,\n getAvailableColorModes,\n getAvailableColorModesFromLenses,\n getCategoryConfig,\n getCategoryDisplayName,\n getCategoryForHexagonMetric,\n getCategoryForLens,\n getColorModeConfig,\n getColorModeForCategory,\n getColorModeForHexagonMetric,\n getColorModesForLanguage,\n getDefaultCommand,\n getDefaultCommands,\n getFileMetricsKey,\n getHexagonMetricForCategory,\n getHexagonMetricKeys,\n getLanguageConfig,\n getLanguagesForCategory,\n getLensById,\n getLensColorModes,\n getLensColorScheme,\n getLensDisplayName,\n getLensesByCategory,\n getLensesByCategoryAndLanguage,\n getLensesByLanguage,\n getLensesWithAggregates,\n getLensesWithFileMetrics,\n isCategoryInverted,\n isColorModeAvailable,\n isHexagonMetricConfigured,\n isLensColorMode,\n isLensInHexagonMetric,\n isValidColorMode,\n isValidLensId,\n lensProducesCoverage,\n normalizeLensId,\n validateLensOutputs\n};\n//# sourceMappingURL=index.js.map","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\";\nimport {\n isHexagonMetricConfigured,\n type HexagonMetricKey,\n} from \"@principal-ai/quality-lens-registry\";\n\nexport type { QualityMetrics };\nexport type QualityTier = \"none\" | \"bronze\" | \"silver\" | \"gold\" | \"platinum\";\nexport type MetricKey =\n | \"types\"\n | \"documentation\"\n | \"tests\"\n | \"deadCode\"\n | \"formatting\"\n | \"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 /** List of lens IDs that actually ran - used to determine which metrics are configured */\n lensesRan?: 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: {\n fill: \"#808080\",\n stroke: \"#808080\",\n bg: theme.colors.backgroundLight,\n },\n bronze: {\n fill: \"#CD7F32\",\n stroke: \"#CD7F32\",\n bg: theme.colors.backgroundLight,\n },\n silver: {\n fill: \"#C0C0C0\",\n stroke: \"#C0C0C0\",\n bg: theme.colors.backgroundLight,\n },\n gold: {\n fill: \"#FFD700\",\n stroke: \"#FFD700\",\n bg: theme.colors.backgroundLight,\n },\n platinum: {\n fill: \"#E5E4E2\",\n stroke: \"#E5E4E2\",\n bg: theme.colors.backgroundLight,\n },\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// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: string): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\n}\n\n/**\n * Check if a metric has a lens that ran for it.\n * Uses the lens registry for the lens-to-metric mapping.\n */\nfunction isMetricConfigured(\n metricKey: MetricKey,\n lensesRan?: string[],\n): boolean {\n // MetricKey and HexagonMetricKey are the same, just cast\n return isHexagonMetricConfigured(metricKey as HexagonMetricKey, lensesRan);\n}\n\n// Metrics ordered clockwise from top-left\nconst getMetricConfig = (themeColors: ReturnType<typeof getThemeColors>) =>\n [\n {\n key: \"formatting\",\n label: \"Format\",\n color: themeColors.metricColors.formatting,\n angle: -120,\n },\n {\n key: \"linting\",\n label: \"Linting\",\n color: themeColors.metricColors.linting,\n angle: -60,\n },\n {\n key: \"types\",\n label: \"Types\",\n color: themeColors.metricColors.types,\n angle: 0,\n },\n {\n key: \"tests\",\n label: \"Tests\",\n color: themeColors.metricColors.tests,\n angle: 60,\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n color: themeColors.metricColors.deadCode,\n angle: 120,\n },\n {\n key: \"documentation\",\n label: \"Docs\",\n color: themeColors.metricColors.documentation,\n angle: 180,\n },\n ] as const;\n\nfunction calculateHexagonPoints(\n center: number,\n radius: number,\n metricConfig: ReturnType<typeof getMetricConfig>,\n): 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 lensesRan,\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 // Check if this metric is configured\n const configured = isMetricConfigured(key as MetricKey, lensesRan);\n if (!configured) {\n // Unconfigured metrics show as 0 (collapsed on the hexagon)\n return calculateMetricPoint(center, radius, angle, 0);\n }\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, only for configured metrics\n const configuredMetrics = metricConfig.filter(({ key }) =>\n isMetricConfigured(key as MetricKey, lensesRan),\n );\n const metricsForAverage = configuredMetrics.map(({ key }) => {\n const value = metrics[key as keyof QualityMetrics];\n return key === \"deadCode\" ? 100 - value : value;\n });\n const averageScore =\n metricsForAverage.length > 0\n ? Math.round(\n metricsForAverage.reduce((a, b) => a + b, 0) /\n metricsForAverage.length,\n )\n : 0;\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(\n center,\n (radius * percent) / 100,\n metricConfig,\n )}\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 configured = isMetricConfigured(key as MetricKey, lensesRan);\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 // For unconfigured metrics, show at center (0)\n const effectiveValue = configured ? value : 0;\n const point = calculateMetricPoint(center, radius, angle, 100);\n const dataPoint = calculateMetricPoint(\n center,\n radius,\n angle,\n effectiveValue,\n );\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 if (configured) {\n onVertexClick?.(vertexInfo);\n }\n };\n\n return (\n <g\n key={key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onVertexLeave}\n onClick={handleClick}\n style={{\n cursor:\n configured && (onVertexHover || onVertexClick)\n ? \"pointer\"\n : \"default\",\n opacity: configured ? 1 : 0.4,\n }}\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={configured ? \"white\" : themeColors.gridColor}\n stroke={configured ? colors.stroke : themeColors.gridColor}\n strokeWidth={1.5}\n strokeDasharray={configured ? \"none\" : \"2,2\"}\n />\n {/* Value indicator - only show if configured */}\n {configured && (\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 )}\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\n extends Pick<\n QualityHexagonProps,\n \"metrics\" | \"tier\" | \"theme\" | \"className\"\n > {\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\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {packageName ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {packageName.startsWith(\"@\") && packageName.includes(\"/\") ? (\n <>\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n {packageName.split(\"/\")[0]}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName.split(\"/\")[1]}\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n v{packageVersion}\n </span>\n )}\n </div>\n ) : (\n <span />\n )}\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\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 24,\n }}\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\n style={{\n flex: \"1 1 200px\",\n minWidth: 200,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: \"8px 24px\",\n }}\n >\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div\n key={key}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {key === \"deadCode\" ? \" ↓\" : \"\"}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}\n >\n {value}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\ninterface QualityHexagonExpandableProps\n extends Pick<\n QualityHexagonProps,\n \"metrics\" | \"tier\" | \"theme\" | \"className\"\n > {\n packageName?: string;\n packageVersion?: string;\n packagePath?: string;\n /** List of lens IDs that actually ran for this package */\n lensesRan?: string[];\n onRefresh?: () => void;\n isRefreshing?: boolean;\n defaultExpanded?: boolean;\n /** Callback when the hexagon is expanded/collapsed */\n onExpandChange?: (\n expanded: boolean,\n info: { packageName?: string; packagePath?: string },\n ) => void;\n /** Callback when a metric row is clicked */\n onMetricClick?: (metric: MetricKey) => void;\n}\n\nexport function QualityHexagonExpandable({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n packagePath,\n lensesRan,\n onRefresh,\n isRefreshing = false,\n defaultExpanded = false,\n onExpandChange,\n onMetricClick,\n}: QualityHexagonExpandableProps) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n\n const handleToggleExpand = React.useCallback(() => {\n const newExpanded = !expanded;\n setExpanded(newExpanded);\n onExpandChange?.(newExpanded, { packageName, packagePath });\n }, [expanded, onExpandChange, packageName, packagePath]);\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\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n {packageName ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n {packageName.startsWith(\"@\") && packageName.includes(\"/\") ? (\n <>\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n {packageName.split(\"/\")[0]}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName.split(\"/\")[1]}\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}\n >\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n v{packageVersion}\n </span>\n )}\n </div>\n ) : (\n <span />\n )}\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={handleToggleExpand}\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 lensesRan={lensesRan}\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\n 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 >\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n const configured = isMetricConfigured(\n key as MetricKey,\n lensesRan,\n );\n\n return (\n <div\n key={key}\n onClick={(e) => {\n e.stopPropagation();\n if (configured) {\n onMetricClick?.(key as MetricKey);\n }\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n cursor: configured && onMetricClick ? \"pointer\" : \"default\",\n padding: \"4px 8px\",\n margin: \"0 -8px\",\n borderRadius: 4,\n transition: \"background-color 0.15s ease\",\n opacity: configured ? 1 : 0.5,\n }}\n onMouseEnter={(e) => {\n if (configured && onMetricClick) {\n e.currentTarget.style.backgroundColor =\n theme.colors.surface;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {key === \"deadCode\" ? \" ↓\" : \"\"}\n </span>\n <span\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: configured\n ? getValueColor(value, key)\n : theme.colors.textMuted,\n }}\n title={configured ? undefined : \"Not configured\"}\n >\n {configured ? `${value}%` : \"N/A\"}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Expand/collapse indicator */}\n <div\n onClick={handleToggleExpand}\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 * @param metrics - The quality metrics\n * @param lensesRan - Optional list of lens IDs that ran, to filter unconfigured metrics\n */\nexport function calculateQualityTier(\n metrics: QualityMetrics,\n lensesRan?: string[],\n): QualityTier {\n // Get all metric keys\n const allMetricKeys: MetricKey[] = [\n \"formatting\",\n \"linting\",\n \"types\",\n \"tests\",\n \"deadCode\",\n \"documentation\",\n ];\n\n // Filter to only configured metrics if lensesRan is provided\n const configuredKeys = allMetricKeys.filter((key) =>\n isMetricConfigured(key, lensesRan),\n );\n\n if (configuredKeys.length === 0) {\n return \"none\";\n }\n\n // Calculate average with inverted dead code, only for configured metrics\n const values = configuredKeys.map((key) => {\n const value = metrics[key];\n return key === \"deadCode\" ? 100 - value : value;\n });\n\n const average = values.reduce((a, b) => a + b, 0) / values.length;\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 {\n Terminal,\n Copy,\n Check,\n ChevronRight,\n Zap,\n GitBranch,\n Info,\n FlaskConical,\n FileSearch,\n Braces,\n Sparkles,\n Trash2,\n BookOpen,\n} 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:\n | { allFiles?: Array<{ relativePath?: string; path?: string }> }\n | 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 label?: string;\n}> = ({ command, theme, label }) => {\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 style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n {label && (\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n {label}\n </span>\n )}\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 </div>\n );\n};\n\n/**\n * Mini hexagon preview showing what metrics are tracked\n */\nconst MetricsPreview: React.FC<{ theme: Theme }> = ({ theme }) => {\n const metrics = [\n {\n key: \"formatting\",\n label: \"Formatting\",\n description: \"Prettier code style\",\n Icon: Sparkles,\n },\n {\n key: \"linting\",\n label: \"Linting\",\n description: \"ESLint code quality\",\n Icon: FileSearch,\n },\n {\n key: \"types\",\n label: \"Types\",\n description: \"TypeScript type safety\",\n Icon: Braces,\n },\n {\n key: \"tests\",\n label: \"Tests\",\n description: \"Test coverage & pass rate\",\n Icon: FlaskConical,\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n description: \"Unused exports & deps\",\n Icon: Trash2,\n },\n {\n key: \"documentation\",\n label: \"Docs\",\n description: \"Code documentation\",\n Icon: BookOpen,\n },\n ];\n\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 8,\n padding: 12,\n borderRadius: 8,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n {metrics.map((m) => (\n <div\n key={m.key}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n fontSize: 12,\n }}\n >\n <m.Icon size={14} color={theme.colors.textMuted} />\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <span style={{ fontWeight: 500, color: theme.colors.text }}>\n {m.label}\n </span>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>\n {m.description}\n </span>\n </div>\n </div>\n ))}\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 const [showAdvanced, setShowAdvanced] = React.useState(false);\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 <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\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 workflow runs. Push a\n commit to trigger it, or check the Actions tab for status.\n </p>\n\n <MetricsPreview theme={theme} />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 6,\n backgroundColor: `${theme.colors.warning}10`,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <Info\n size={14}\n style={{ flexShrink: 0, marginTop: 2 }}\n color={theme.colors.warning}\n />\n <div>\n <strong style={{ color: theme.colors.text }}>\n Using private npm packages?\n </strong>\n <br />\n Add{\" \"}\n <code\n style={{\n backgroundColor: theme.colors.background,\n padding: \"1px 4px\",\n borderRadius: 3,\n }}\n >\n NPM_TOKEN\n </code>{\" \"}\n to your repository secrets and ensure the workflow has access to it.\n </div>\n </div>\n </div>\n );\n }\n\n // No workflow - show 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 {/* What you'll get */}\n <div>\n <h4\n style={{\n margin: \"0 0 12px 0\",\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Track 6 quality dimensions\n </h4>\n <MetricsPreview theme={theme} />\n </div>\n\n {/* Quick Start */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: 16,\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: 8,\n }}\n >\n <Zap size={18} color={theme.colors.primary} />\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Quick Start\n </h4>\n </div>\n\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: theme.colors.textMuted,\n lineHeight: 1.5,\n }}\n >\n Run this in your project directory to set up automated quality\n tracking:\n </p>\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli init\"\n theme={theme}\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <GitBranch size={14} />\n <span>Then commit and push to start tracking</span>\n </div>\n </div>\n\n {/* Advanced Options Toggle */}\n <button\n onClick={() => setShowAdvanced(!showAdvanced)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: 0,\n border: \"none\",\n backgroundColor: \"transparent\",\n color: theme.colors.textMuted,\n fontSize: 13,\n cursor: \"pointer\",\n }}\n >\n <ChevronRight\n size={14}\n style={{\n transform: showAdvanced ? \"rotate(90deg)\" : \"none\",\n transition: \"transform 0.2s\",\n }}\n />\n <span>{showAdvanced ? \"Hide\" : \"Show\"} additional options</span>\n </button>\n\n {/* Advanced Options */}\n {showAdvanced && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: 16,\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: 8,\n }}\n >\n <Terminal size={18} color={theme.colors.text} />\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n CLI Commands\n </h4>\n </div>\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli list\"\n theme={theme}\n label=\"See available quality tools in your project\"\n />\n\n <CommandLine\n command=\"npx @principal-ai/quality-lens-cli run . --install\"\n theme={theme}\n label=\"Run quality checks locally (auto-installs missing tools)\"\n />\n\n <CommandLine\n command=\"npm install -g @principal-ai/quality-lens-cli\"\n theme={theme}\n label=\"Install globally for faster repeated use\"\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: \"10px 14px\",\n borderRadius: 6,\n backgroundColor: `${theme.colors.warning}10`,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <Info\n size={14}\n style={{ flexShrink: 0, marginTop: 2 }}\n color={theme.colors.warning}\n />\n <div>\n <strong style={{ color: theme.colors.text }}>\n Private npm packages?\n </strong>\n <br />\n If your project uses private @org packages, add{\" \"}\n <code\n style={{\n backgroundColor: theme.colors.background,\n padding: \"1px 4px\",\n borderRadius: 3,\n }}\n >\n NPM_TOKEN\n </code>{\" \"}\n to your GitHub repository secrets under Settings → Secrets →\n Actions, and set the workflow environment if needed.\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport { WORKFLOW_FILE_PATH };\n","import React from \"react\";\nimport { Hexagon, X, Copy, Check } from \"lucide-react\";\nimport { useTheme } from \"@principal-ade/industry-theme\";\nimport type {\n PanelComponentProps,\n CodeQualityPanelActions,\n QualityHexagonPanelContext,\n PackageQuality,\n QualitySliceData,\n} from \"../types\";\nimport type { QualityMetrics } from \"@principal-ai/codebase-composition\";\nimport {\n getColorModeForHexagonMetric,\n type HexagonMetricKey,\n} from \"@principal-ai/quality-lens-registry\";\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// Legacy fallbacks for when lensesRan is not available\nconst LEGACY_FALLBACKS: Record<HexagonMetricKey, string> = {\n linting: \"eslint\",\n formatting: \"prettier\",\n types: \"typescript\",\n tests: \"coverage\",\n deadCode: \"knip\",\n documentation: \"alexandria\",\n};\n\n/**\n * Get the appropriate colorMode for a metric based on which lenses ran.\n * Uses the lens registry for dynamic resolution.\n */\nfunction getColorModeForMetric(\n metric: string,\n lensesRan?: string[],\n): string | null {\n // Validate metric is a valid hexagon metric key\n if (!isValidHexagonMetric(metric)) return null;\n const hexagonMetric = metric as HexagonMetricKey;\n\n // Use registry to find which lens ran for this category\n const colorMode = getColorModeForHexagonMetric(\n hexagonMetric,\n lensesRan ?? [],\n );\n\n // If no lens ran for this category, fall back to default\n // This ensures we still emit a colorMode for the UI to use\n if (!colorMode && lensesRan === undefined) {\n return LEGACY_FALLBACKS[hexagonMetric] ?? null;\n }\n\n return colorMode;\n}\n\nfunction isValidHexagonMetric(metric: string): metric is HexagonMetricKey {\n return metric in LEGACY_FALLBACKS;\n}\n\n/**\n * QualityHexagonPanelContent - Internal component that uses theme\n */\nconst QualityHexagonPanelContent: React.FC<PanelComponentProps<CodeQualityPanelActions, QualityHexagonPanelContext>> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n const [refreshingPackages, setRefreshingPackages] = React.useState<\n Set<string>\n >(new Set());\n const [showHelpOverlay, setShowHelpOverlay] = React.useState(false);\n const [copiedCommand, setCopiedCommand] = React.useState<string | null>(null);\n\n const handleCopyCommand = async (command: string) => {\n try {\n await navigator.clipboard.writeText(command);\n setCopiedCommand(command);\n setTimeout(() => setCopiedCommand(null), 2000);\n } catch {\n console.log(\"Copy:\", command);\n }\n };\n\n // Get quality data from context if available\n const qualitySlice = context.quality;\n // Check if quality slice exists by checking the property directly\n // (hasSlice is deprecated and returns false)\n const hasQualitySlice = context.quality !== undefined;\n const isLoading = qualitySlice?.loading ?? false;\n\n // Get file tree to check for workflow presence\n const fileTreeSlice = context.fileTree;\n const hasWorkflow = React.useMemo(() => {\n return checkFileExistsInTree(\n fileTreeSlice?.data ?? undefined,\n WORKFLOW_FILE_PATH,\n );\n }, [fileTreeSlice?.data]);\n\n // Determine packages to display - filter out orchestrator packages (config-only, no source)\n const packages: PackageQuality[] = React.useMemo(() => {\n if (!qualitySlice?.data?.packages) {\n return [];\n }\n return qualitySlice.data.packages.filter((pkg) => !pkg.isOrchestrator);\n }, [qualitySlice?.data?.packages]);\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 (hasQualitySlice) {\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 (hasQualitySlice) {\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: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\n };\n\n // Collect all lenses that ran across all packages\n const allLensesRan = React.useMemo(() => {\n const lensSet = new Set<string>();\n for (const pkg of packages) {\n if (pkg.lensesRan) {\n for (const lens of pkg.lensesRan) {\n lensSet.add(lens);\n }\n }\n }\n return lensSet.size > 0 ? Array.from(lensSet) : undefined;\n }, [packages]);\n\n // Calculate overall tier from all packages\n const overallTier =\n packages.length > 0\n ? calculateQualityTier(\n packages.reduce(\n (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:\n acc.formatting + pkg.metrics.formatting / packages.length,\n types: acc.types + pkg.metrics.types / packages.length,\n documentation:\n acc.documentation + pkg.metrics.documentation / packages.length,\n }),\n {\n tests: 0,\n deadCode: 0,\n linting: 0,\n formatting: 0,\n types: 0,\n documentation: 0,\n },\n ),\n allLensesRan,\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 display: \"flex\",\n flexDirection: \"column\",\n position: \"relative\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n height: 40,\n flexShrink: 0,\n padding: \"0 16px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n boxSizing: \"border-box\",\n }}\n >\n <Hexagon size={20} color={tierColors[overallTier]} />\n <h2\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Code Quality\n </h2>\n <span\n onClick={() => setShowHelpOverlay(true)}\n title=\"Click for help\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n border: `1px solid ${theme.colors.border}`,\n fontSize: 11,\n color: theme.colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n ?\n </span>\n {packages.length > 1 && (\n <span\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n {packages.length} packages\n </span>\n )}\n </div>\n\n {/* Content */}\n <div\n style={{\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n flex: 1,\n minHeight: 0,\n }}\n >\n {/* Quality Hexagons for each package */}\n <div\n style={{ display: \"flex\", flexWrap: \"wrap\", gap: 16, minHeight: 0 }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n Loading quality metrics...\n </div>\n ) : packages.length === 0 ? (\n <QualityEmptyState theme={theme} hasWorkflow={hasWorkflow} />\n ) : (\n packages.map((pkg) => {\n const tier = calculateQualityTier(pkg.metrics, pkg.lensesRan);\n // Use package path from slice data\n // For single-package repos, path is empty string (root)\n // For monorepos, path would be like \"packages/core\"\n const packagePath = pkg.path ?? \"\";\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 packagePath={packagePath}\n lensesRan={pkg.lensesRan}\n onExpandChange={(expanded, info) => {\n // Emit package:select event for cross-panel filtering\n // When expanded, select this package; when collapsed, deselect\n events.emit({\n type: \"package:select\",\n source: \"principal-ade.quality-hexagon-panel\",\n timestamp: Date.now(),\n payload: expanded\n ? {\n packagePath: info.packagePath ?? \"\",\n packageName: info.packageName,\n }\n : null,\n });\n }}\n onMetricClick={(metric) => {\n // Emit colorMode event for File City\n // Use lensesRan to determine correct tool (e.g., biome-lint vs eslint)\n const colorMode = getColorModeForMetric(\n metric,\n pkg.lensesRan,\n );\n if (colorMode) {\n events.emit({\n type: \"quality:colorMode:select\",\n source: \"principal-ade.quality-hexagon-panel\",\n timestamp: Date.now(),\n payload: { colorMode },\n });\n }\n }}\n />\n );\n })\n )}\n </div>\n </div>\n\n {/* Help Overlay */}\n {showHelpOverlay && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 100,\n }}\n onClick={() => setShowHelpOverlay(false)}\n >\n <div\n style={{\n backgroundColor: theme.colors.surface,\n borderRadius: 8,\n padding: 20,\n maxWidth: 400,\n width: \"90%\",\n border: `1px solid ${theme.colors.border}`,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: 16,\n }}\n >\n <h3\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Quality Lens CLI\n </h3>\n <button\n onClick={() => setShowHelpOverlay(false)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n display: \"flex\",\n color: theme.colors.textMuted,\n }}\n >\n <X size={18} />\n </button>\n </div>\n\n <p\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n margin: \"0 0 12px 0\",\n }}\n >\n Run quality checks locally with the CLI:\n </p>\n\n {[\n {\n cmd: \"npx @principal-ai/quality-lens-cli init\",\n label: \"Initialize quality lens in your project\",\n },\n {\n cmd: \"npx @principal-ai/quality-lens-cli list\",\n label: \"List available quality lenses\",\n },\n ].map(({ cmd, label }) => (\n <div key={cmd} style={{ marginBottom: 12 }}>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>\n {label}\n </span>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 6,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n fontFamily: \"monospace\",\n fontSize: 12,\n marginTop: 4,\n }}\n >\n <code style={{ color: theme.colors.text }}>{cmd}</code>\n <button\n onClick={() => handleCopyCommand(cmd)}\n style={{\n display: \"flex\",\n alignItems: \"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 {copiedCommand === cmd ? (\n <Check size={14} color={theme.colors.success} />\n ) : (\n <Copy size={14} />\n )}\n </button>\n </div>\n </div>\n ))}\n\n <div\n style={{\n marginTop: 16,\n padding: 12,\n backgroundColor: theme.colors.background,\n borderRadius: 6,\n fontSize: 12,\n color: theme.colors.textMuted,\n }}\n >\n <strong style={{ color: theme.colors.text }}>Tiers:</strong>\n <div\n style={{\n marginTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <span>🏆 Platinum: 90%+ average</span>\n <span>🥇 Gold: 75%+ average</span>\n <span>🥈 Silver: 60%+ average</span>\n <span>🥉 Bronze: 40%+ average</span>\n </div>\n </div>\n </div>\n </div>\n )}\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 {\n QualityHexagon,\n calculateQualityTier,\n type QualityTier,\n type VertexHoverInfo,\n type MetricKey,\n} from \"./QualityHexagon\";\n\nexport type { VertexHoverInfo, MetricKey };\n\nconst METRIC_OPTIONS: Array<{ key: MetricKey; label: string }> = [\n { key: \"formatting\", label: \"Format\" },\n { key: \"linting\", label: \"Linting\" },\n { key: \"types\", label: \"Types\" },\n { key: \"tests\", label: \"Tests\" },\n { key: \"deadCode\", label: \"Dead Code\" },\n { key: \"documentation\", label: \"Docs\" },\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 /** Repository path (for filtering in other panels) */\n repositoryPath?: 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(\n repositories: RepositoryQualityItem[],\n): 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 repositoryPath: repo.path,\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:\n acc.documentation + item.metrics.documentation / items.length,\n }),\n {\n tests: 0,\n deadCode: 0,\n linting: 0,\n formatting: 0,\n types: 0,\n documentation: 0,\n },\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): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\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] =\n 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: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\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),\n };\n }\n }\n if (hoveredVertex) {\n return {\n label: hoveredVertex.label,\n value: hoveredVertex.value,\n valueColor: getValueColor(hoveredVertex.value, hoveredVertex.key),\n };\n }\n return null;\n }, [selectedMetric, hoveredVertex, item.metrics]);\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={\n onVertexClick ? (vertex) => onVertexClick(item, vertex) : undefined\n }\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>(\n null,\n );\n const items = React.useMemo(\n () => flattenRepositories(repositories),\n [repositories],\n );\n const overallTier = React.useMemo(() => calculateOverallTier(items), [items]);\n\n // Sort items alphabetically by package name\n const sortedItems = React.useMemo(() => {\n return [...items].sort((a, b) =>\n a.packageName.localeCompare(b.packageName),\n );\n }, [items]);\n\n const tierColors: Record<QualityTier, string> = {\n none: \"#808080\",\n bronze: \"#CD7F32\",\n silver: \"#C0C0C0\",\n gold: \"#FFD700\",\n platinum: \"#E5E4E2\",\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}{\" \"}\n {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) =>\n setSelectedMetric(\n e.target.value ? (e.target.value as MetricKey) : null,\n )\n }\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 {\n PanelComponentProps,\n CodeQualityPanelActions,\n RepositoryQualityGridPanelContext,\n} 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\";\nimport { QualityEmptyState } from \"../components/QualityEmptyState\";\n\n/**\n * RepositoryQualityGridPanelContent - Internal component that uses theme\n */\nconst RepositoryQualityGridPanelContent: React.FC<PanelComponentProps<CodeQualityPanelActions, RepositoryQualityGridPanelContext>> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n\n // Track currently selected item for toggle behavior\n const [selectedItemKey, setSelectedItemKey] = React.useState<string | null>(\n null,\n );\n\n // Get repositories quality data from context if available\n const qualitySlice = context.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 return [];\n }, [qualitySlice?.data?.repositories]);\n\n // Handle item click\n const handleItemClick = (item: FlatGridItem) => {\n const isDeselecting = selectedItemKey === item.key;\n\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: isDeselecting\n ? null\n : {\n repositoryId: item.repositoryId,\n repositoryName: item.repositoryName,\n packageName: item.packageName,\n tier: item.tier,\n },\n });\n\n // Emit package:select event for cross-panel filtering (e.g., File City)\n // Clicking the same item again deselects (sends null payload)\n events.emit({\n type: \"package:select\",\n source: \"principal-ade.repository-quality-grid-panel\",\n timestamp: Date.now(),\n payload: isDeselecting\n ? null\n : item.repositoryPath\n ? {\n packagePath: item.repositoryPath,\n packageName: item.packageName,\n }\n : null,\n });\n\n setSelectedItemKey(isDeselecting ? null : item.key);\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 // Check slice existence via direct property access (hasSlice is deprecated)\n if (context.repositoriesQuality !== undefined) {\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 style={{ padding: 20 }}>\n <QualityEmptyState theme={theme} hasWorkflow={false} />\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 * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { Theme } from \"@principal-ade/industry-theme\";\n\n// Types matching the FormattedResults structure\nexport interface Issue {\n file: string;\n line: number;\n column?: number;\n severity: \"error\" | \"warning\" | \"info\" | \"hint\";\n message: string;\n rule?: string;\n source: string;\n category?: string;\n}\n\nexport interface LensResult {\n package: { name: string; path?: string };\n lens: { id: string; command: string };\n execution: {\n success: boolean;\n exitCode?: number;\n duration?: number;\n timestamp: number;\n };\n issues: Issue[];\n metrics: {\n filesAnalyzed: number;\n totalIssues: number;\n issuesBySeverity: {\n error: number;\n warning: number;\n info: number;\n hint: number;\n };\n executionTime: number;\n custom?: Record<string, unknown>;\n };\n fileMetrics?: Array<{\n file: string;\n score: number;\n issueCount: number;\n errorCount: number;\n warningCount: number;\n }>;\n coverage?: {\n line: number;\n branch?: number;\n function?: number;\n statement?: number;\n files?: Array<{\n file: string;\n lines: number;\n branches?: number;\n functions?: number;\n statements?: number;\n }>;\n } | null;\n analyzedFiles?: Array<{\n path: string;\n hasIssues: boolean;\n }>;\n}\n\nexport interface FormattedResults {\n metadata: {\n timestamp: string;\n version: string;\n totalPackages: number;\n totalLenses: number;\n git?: {\n commit?: string;\n branch?: string;\n repository?: string;\n };\n };\n results: LensResult[];\n qualityMetrics?: {\n packages: Array<{\n name: string;\n path?: string;\n hexagon: {\n tests: number;\n deadCode: number;\n formatting: number;\n linting: number;\n types: number;\n documentation: number;\n };\n }>;\n };\n}\n\ninterface LensDataDebugPanelProps {\n data: FormattedResults;\n theme: Theme;\n className?: string;\n /** Pre-select a specific package */\n selectedPackage?: string;\n onFileClick?: (file: string, line?: number) => void;\n onPackageSelect?: (packageName: string) => void;\n}\n\n// Group results by package\nfunction groupResultsByPackage(\n results: LensResult[],\n): Map<string, LensResult[]> {\n const map = new Map<string, LensResult[]>();\n for (const result of results) {\n const key = result.package?.name ?? \"unknown\";\n const existing = map.get(key) || [];\n existing.push(result);\n map.set(key, existing);\n }\n return map;\n}\n\n// Get unique files from issues\nfunction getFilesWithIssues(issues: Issue[]): Map<string, Issue[]> {\n const fileMap = new Map<string, Issue[]>();\n for (const issue of issues) {\n if (!issue.file) continue;\n const existing = fileMap.get(issue.file) || [];\n existing.push(issue);\n fileMap.set(issue.file, existing);\n }\n return fileMap;\n}\n\n// Severity badge colors\nfunction getSeverityColor(severity: string): string {\n switch (severity) {\n case \"error\":\n return \"#ef4444\";\n case \"warning\":\n return \"#f59e0b\";\n case \"info\":\n return \"#3b82f6\";\n case \"hint\":\n return \"#6b7280\";\n default:\n return \"#6b7280\";\n }\n}\n\nfunction getSeverityBg(severity: string): string {\n switch (severity) {\n case \"error\":\n return \"rgba(239, 68, 68, 0.1)\";\n case \"warning\":\n return \"rgba(245, 158, 11, 0.1)\";\n case \"info\":\n return \"rgba(59, 130, 246, 0.1)\";\n case \"hint\":\n return \"rgba(107, 114, 128, 0.1)\";\n default:\n return \"rgba(107, 114, 128, 0.1)\";\n }\n}\n\n// Calculate package summary stats\nfunction getPackageSummary(results: LensResult[]) {\n let totalErrors = 0;\n let totalWarnings = 0;\n let passCount = 0;\n let failCount = 0;\n\n for (const result of results) {\n totalErrors += result.metrics?.issuesBySeverity?.error ?? 0;\n totalWarnings += result.metrics?.issuesBySeverity?.warning ?? 0;\n if (result.execution?.success) {\n passCount++;\n } else {\n failCount++;\n }\n }\n\n return {\n totalErrors,\n totalWarnings,\n passCount,\n failCount,\n lensCount: results.length,\n };\n}\n\nexport function LensDataDebugPanel({\n data,\n theme,\n className,\n selectedPackage: initialSelectedPackage,\n onFileClick,\n onPackageSelect,\n}: LensDataDebugPanelProps) {\n const packageGroups = React.useMemo(\n () => groupResultsByPackage(data?.results ?? []),\n [data?.results],\n );\n const packageNames = React.useMemo(\n () => Array.from(packageGroups.keys()),\n [packageGroups],\n );\n\n const [selectedPackage, setSelectedPackage] = React.useState<string | null>(\n initialSelectedPackage ||\n (packageNames.length === 1 ? packageNames[0] : null),\n );\n const [expandedLens, setExpandedLens] = React.useState<string | null>(null);\n const [expandedFiles, setExpandedFiles] = React.useState<Set<string>>(\n new Set(),\n );\n const [expandedAnalyzedFiles, setExpandedAnalyzedFiles] = React.useState<\n Set<string>\n >(new Set());\n\n // Sync selected package when prop changes (e.g., from external event)\n React.useEffect(() => {\n if (initialSelectedPackage) {\n setSelectedPackage((current) => {\n if (current !== initialSelectedPackage) {\n setExpandedLens(null);\n setExpandedFiles(new Set());\n setExpandedAnalyzedFiles(new Set());\n return initialSelectedPackage;\n }\n return current;\n });\n }\n }, [initialSelectedPackage]);\n\n const handlePackageSelect = (pkg: string) => {\n setSelectedPackage(pkg);\n setExpandedLens(null);\n setExpandedFiles(new Set());\n setExpandedAnalyzedFiles(new Set());\n onPackageSelect?.(pkg);\n };\n\n const toggleLens = (lensId: string) => {\n setExpandedLens(expandedLens === lensId ? null : lensId);\n setExpandedFiles(new Set());\n };\n\n const toggleFile = (file: string) => {\n const newSet = new Set(expandedFiles);\n if (newSet.has(file)) {\n newSet.delete(file);\n } else {\n newSet.add(file);\n }\n setExpandedFiles(newSet);\n };\n\n const toggleAnalyzedFiles = (lensKey: string) => {\n const newSet = new Set(expandedAnalyzedFiles);\n if (newSet.has(lensKey)) {\n newSet.delete(lensKey);\n } else {\n newSet.add(lensKey);\n }\n setExpandedAnalyzedFiles(newSet);\n };\n\n const selectedResults = selectedPackage\n ? packageGroups.get(selectedPackage) || []\n : [];\n\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n padding: 16,\n backgroundColor: theme.colors.background,\n fontFamily: \"monospace\",\n fontSize: 13,\n }}\n >\n {/* Header with Package Dropdown - only show when not controlled externally */}\n {selectedPackage && !onPackageSelect && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"8px 12px\",\n backgroundColor: theme.colors.surface,\n borderRadius: 6,\n marginBottom: 8,\n }}\n >\n {packageNames.length > 1 ? (\n <select\n value={selectedPackage}\n onChange={(e) => handlePackageSelect(e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: 4,\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: \"monospace\",\n fontSize: 13,\n fontWeight: 600,\n cursor: \"pointer\",\n outline: \"none\",\n }}\n >\n {packageNames.map((pkg) => (\n <option key={pkg} value={pkg}>\n {pkg}\n </option>\n ))}\n </select>\n ) : (\n <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {selectedPackage}\n </span>\n )}\n {(() => {\n const summary = getPackageSummary(selectedResults);\n return (\n <span\n style={{\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor:\n summary.totalErrors > 0\n ? getSeverityBg(\"error\")\n : summary.totalWarnings > 0\n ? getSeverityBg(\"warning\")\n : \"rgba(34, 197, 94, 0.1)\",\n color:\n summary.totalErrors > 0\n ? getSeverityColor(\"error\")\n : summary.totalWarnings > 0\n ? getSeverityColor(\"warning\")\n : \"#22c55e\",\n }}\n >\n {summary.passCount}/{summary.lensCount} pass\n </span>\n );\n })()}\n </div>\n )}\n\n {/* Lens Results for Selected Package */}\n {selectedPackage &&\n selectedResults.map((result, idx) => {\n const lensKey = `${result.lens?.id ?? \"unknown\"}-${idx}`;\n const isExpanded = expandedLens === lensKey;\n const filesWithIssues = getFilesWithIssues(result.issues ?? []);\n const hasIssues = (result.issues?.length ?? 0) > 0;\n\n return (\n <div\n key={lensKey}\n style={{\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 6,\n overflow: \"hidden\",\n }}\n >\n {/* Lens Header */}\n <div\n onClick={() => toggleLens(lensKey)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 12px\",\n backgroundColor: theme.colors.surface,\n cursor: \"pointer\",\n gap: 12,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n style={{\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {result.lens?.id ?? \"unknown\"}\n </span>\n <span style={{ color: theme.colors.textMuted }}>\n ({result.lens?.command ?? \"\"})\n </span>\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {/* Execution status */}\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: result.execution?.success\n ? \"rgba(34, 197, 94, 0.1)\"\n : \"rgba(239, 68, 68, 0.1)\",\n color: result.execution?.success ? \"#22c55e\" : \"#ef4444\",\n }}\n >\n {result.execution?.success ? \"pass\" : \"fail\"}\n </span>\n\n {/* Issue counts */}\n {hasIssues && (\n <div style={{ display: \"flex\", gap: 6 }}>\n {(result.metrics?.issuesBySeverity?.error ?? 0) > 0 && (\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg(\"error\"),\n color: getSeverityColor(\"error\"),\n }}\n >\n {result.metrics?.issuesBySeverity?.error ?? 0} errors\n </span>\n )}\n {(result.metrics?.issuesBySeverity?.warning ?? 0) > 0 && (\n <span\n style={{\n padding: \"2px 6px\",\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg(\"warning\"),\n color: getSeverityColor(\"warning\"),\n }}\n >\n {result.metrics?.issuesBySeverity?.warning ?? 0}{\" \"}\n warnings\n </span>\n )}\n </div>\n )}\n\n {/* Files count */}\n <span style={{ fontSize: 12, color: theme.colors.textMuted }}>\n {result.metrics?.filesAnalyzed ?? 0} files\n </span>\n </div>\n </div>\n\n {/* Expanded Content */}\n {isExpanded && (\n <div\n style={{\n padding: 12,\n backgroundColor: theme.colors.backgroundLight,\n borderTop: `1px solid ${theme.colors.border}`,\n }}\n >\n {/* Metrics Summary */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(120px, 1fr))\",\n gap: 8,\n marginBottom: 16,\n padding: 12,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Files Analyzed\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.metrics?.filesAnalyzed ?? 0}\n </div>\n </div>\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Total Issues\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.metrics?.totalIssues ?? 0}\n </div>\n </div>\n <div>\n <div\n style={{ fontSize: 11, color: theme.colors.textMuted }}\n >\n Duration\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.execution?.duration ?? 0}ms\n </div>\n </div>\n {result.coverage && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Coverage\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n {result.coverage.line}%\n </div>\n </div>\n )}\n </div>\n\n {/* Coverage Files Section */}\n {result.coverage && (\n <div style={{ marginTop: 16 }}>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n Coverage Data\n </div>\n <div\n style={{\n padding: 12,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {/* Aggregate metrics */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns:\n \"repeat(auto-fit, minmax(100px, 1fr))\",\n gap: 12,\n marginBottom: 12,\n }}\n >\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Line\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.line}%\n </div>\n </div>\n {result.coverage.branch !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Branch\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.branch}%\n </div>\n </div>\n )}\n {result.coverage.function !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Function\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.function}%\n </div>\n </div>\n )}\n {result.coverage.statement !== undefined && (\n <div>\n <div\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n Statement\n </div>\n <div style={{ fontSize: 14, fontWeight: 600 }}>\n {result.coverage.statement}%\n </div>\n </div>\n )}\n </div>\n\n {/* coverage.files status - CRITICAL FOR DEBUGGING */}\n <div\n style={{\n padding: 8,\n borderRadius: 4,\n backgroundColor: result.coverage.files?.length\n ? \"rgba(34, 197, 94, 0.1)\"\n : \"rgba(239, 68, 68, 0.1)\",\n border: `1px solid ${result.coverage.files?.length ? \"#22c55e\" : \"#ef4444\"}`,\n }}\n >\n <div\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: result.coverage.files?.length\n ? \"#22c55e\"\n : \"#ef4444\",\n }}\n >\n coverage.files: {result.coverage.files?.length ?? 0}{\" \"}\n entries\n </div>\n {!result.coverage.files?.length && (\n <div\n style={{\n fontSize: 11,\n color: \"#ef4444\",\n marginTop: 4,\n }}\n >\n Warning: Coverage won't appear on map\n visualization!\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Files with Issues */}\n {filesWithIssues.size > 0 ? (\n <div>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n Files with Issues ({filesWithIssues.size})\n </div>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {Array.from(filesWithIssues.entries()).map(\n ([file, issues]) => {\n const isFileExpanded = expandedFiles.has(file);\n return (\n <div\n key={file}\n style={{\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n overflow: \"hidden\",\n }}\n >\n <div\n onClick={() => toggleFile(file)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 10px\",\n backgroundColor: theme.colors.surface,\n cursor: \"pointer\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={theme.colors.textMuted}\n strokeWidth=\"2\"\n style={{\n transform: isFileExpanded\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n <span\n style={{\n color: theme.colors.text,\n cursor: onFileClick\n ? \"pointer\"\n : \"default\",\n }}\n onClick={(e) => {\n if (onFileClick) {\n e.stopPropagation();\n onFileClick(file);\n }\n }}\n >\n {file}\n </span>\n </div>\n <span\n style={{\n fontSize: 11,\n padding: \"2px 6px\",\n borderRadius: 4,\n backgroundColor: getSeverityBg(\"error\"),\n color: getSeverityColor(\"error\"),\n }}\n >\n {issues.length} issues\n </span>\n </div>\n\n {/* Issues list */}\n {isFileExpanded && (\n <div\n style={{\n padding: 8,\n backgroundColor: theme.colors.background,\n borderTop: `1px solid ${theme.colors.border}`,\n maxHeight: 300,\n overflow: \"auto\",\n }}\n >\n {issues.map((issue, issueIdx) => (\n <div\n key={issueIdx}\n onClick={() =>\n onFileClick?.(file, issue.line)\n }\n style={{\n display: \"flex\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n cursor: onFileClick\n ? \"pointer\"\n : \"default\",\n transition:\n \"background-color 0.1s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor =\n theme.colors.surface;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor =\n \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n minWidth: 45,\n }}\n >\n L{issue.line}\n </span>\n <span\n style={{\n fontSize: 10,\n padding: \"1px 4px\",\n borderRadius: 3,\n backgroundColor: getSeverityBg(\n issue.severity,\n ),\n color: getSeverityColor(\n issue.severity,\n ),\n textTransform: \"uppercase\",\n }}\n >\n {issue.severity.charAt(0)}\n </span>\n <span\n style={{\n flex: 1,\n fontSize: 12,\n color: theme.colors.text,\n }}\n >\n {issue.message}\n </span>\n {issue.rule && (\n <span\n style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n opacity: 0.7,\n }}\n >\n {issue.rule}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n },\n )}\n </div>\n </div>\n ) : (\n <div\n style={{\n padding: 16,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n No issues found\n </div>\n )}\n\n {/* File Metrics if available */}\n {result.fileMetrics && result.fileMetrics.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}\n >\n File Metrics ({result.fileMetrics.length})\n </div>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n padding: 8,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {result.fileMetrics.map((fm, idx) => (\n <div\n key={idx}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 8px\",\n }}\n >\n <span\n style={{ color: theme.colors.text, fontSize: 12 }}\n >\n {fm.file}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color:\n fm.score >= 80\n ? \"#22c55e\"\n : fm.score >= 60\n ? \"#f59e0b\"\n : \"#ef4444\",\n }}\n >\n {fm.score}%\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Analyzed Files Section */}\n {result.analyzedFiles && result.analyzedFiles.length > 0 && (\n <div style={{ marginTop: 16 }}>\n <div\n onClick={() => toggleAnalyzedFiles(lensKey)}\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{\n transform: expandedAnalyzedFiles.has(lensKey)\n ? \"rotate(90deg)\"\n : \"rotate(0deg)\",\n transition: \"transform 0.15s ease\",\n }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n Analyzed Files ({result.analyzedFiles.length})\n </div>\n\n {expandedAnalyzedFiles.has(lensKey) && (\n <div\n style={{\n maxHeight: 300,\n overflow: \"auto\",\n padding: 8,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\n }}\n >\n {result.analyzedFiles.map((file, idx) => (\n <div\n key={idx}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 8px\",\n fontSize: 12,\n borderRadius: 2,\n backgroundColor: file.hasIssues\n ? \"rgba(239, 68, 68, 0.05)\"\n : \"transparent\",\n }}\n >\n <span\n style={{\n color: theme.colors.text,\n cursor: onFileClick ? \"pointer\" : \"default\",\n }}\n onClick={() => onFileClick?.(file.path)}\n >\n {file.path}\n </span>\n {file.hasIssues && (\n <span\n style={{\n fontSize: 10,\n color: \"#ef4444\",\n padding: \"1px 4px\",\n borderRadius: 2,\n backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n }}\n >\n issues\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import React from \"react\";\nimport { Bug } from \"lucide-react\";\nimport { useTheme } from \"@principal-ade/industry-theme\";\nimport type {\n PanelComponentProps,\n CodeQualityPanelActions,\n LensDataDebugPanelContext,\n} from \"../types\";\nimport {\n LensDataDebugPanel as LensDataDebugPanelComponent,\n type FormattedResults,\n} from \"../components/LensDataDebugPanel\";\n\n// Payload type for package:select events\ninterface PackageSelectPayload {\n packagePath: string;\n packageName: string;\n}\n\n/**\n * LensDataDebugPanelContent - Internal component that uses theme\n */\nconst LensDataDebugPanelContent: React.FC<PanelComponentProps<CodeQualityPanelActions, LensDataDebugPanelContext>> = ({\n context,\n actions,\n events,\n}) => {\n const { theme } = useTheme();\n const [selectedPackage, setSelectedPackage] = React.useState<string | null>(\n null,\n );\n\n // Get lens results data from context\n const lensResultsSlice = context.lensResults;\n // Check slice existence via direct property access (hasSlice is deprecated)\n const hasSlice = context.lensResults !== undefined;\n const isLoading = lensResultsSlice?.loading ?? false;\n\n // Get unique package names and build a lookup map\n const { packageNames, packagePathMap } = React.useMemo(() => {\n if (!lensResultsSlice?.data?.results)\n return { packageNames: [], packagePathMap: new Map<string, string>() };\n const names = new Set<string>();\n const pathMap = new Map<string, string>();\n\n lensResultsSlice.data.results.forEach((r) => {\n const name = r.package?.name ?? \"unknown\";\n const path = r.package?.path ?? \"\";\n names.add(name);\n // Map both path and name to package name for lookup\n if (path) pathMap.set(path, name);\n pathMap.set(name, name);\n });\n\n return { packageNames: Array.from(names), packagePathMap: pathMap };\n }, [lensResultsSlice?.data?.results]);\n\n // Auto-select first package\n React.useEffect(() => {\n if (packageNames.length > 0 && !selectedPackage) {\n setSelectedPackage(packageNames[0]);\n }\n }, [packageNames, selectedPackage]);\n\n // Subscribe to package:select events\n React.useEffect(() => {\n if (!events) return;\n\n const cleanup = events.on(\"package:select\", (event) => {\n const payload = event.payload as PackageSelectPayload | null;\n if (!payload) return;\n\n // Try to match by path first, then by name\n const matchedPackage =\n packagePathMap.get(payload.packagePath) ??\n packagePathMap.get(payload.packageName) ??\n // Also try matching the last segment of the path\n packagePathMap.get(payload.packagePath.split(\"/\").pop() ?? \"\");\n\n if (matchedPackage) {\n setSelectedPackage(matchedPackage);\n }\n });\n\n return cleanup;\n }, [events, packagePathMap]);\n\n // Handle file click - open in editor\n const handleFileClick = (file: string, line?: number) => {\n // Construct full path if we have repository context\n const repoPath = context.currentScope.repository?.path;\n const fullPath = repoPath ? `${repoPath}/${file}` : file;\n\n if (line) {\n // If actions support line numbers, use them\n actions.openFile?.(`${fullPath}:${line}`);\n } else {\n actions.openFile?.(fullPath);\n }\n };\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 display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: 40,\n flexShrink: 0,\n padding: \"0 16px\",\n borderBottom: `1px solid ${theme.colors.border}`,\n boxSizing: \"border-box\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <Bug size={18} color={theme.colors.primary} />\n <h2\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: theme.colors.text,\n }}\n >\n Lens Data Debug\n </h2>\n </div>\n {lensResultsSlice?.data && packageNames.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 12,\n }}\n >\n {packageNames.length > 1 ? (\n <select\n value={selectedPackage ?? \"\"}\n onChange={(e) => setSelectedPackage(e.target.value)}\n style={{\n padding: \"4px 8px\",\n borderRadius: 4,\n border: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n color: theme.colors.text,\n fontFamily: theme.fonts.body,\n fontSize: 12,\n cursor: \"pointer\",\n outline: \"none\",\n }}\n >\n {packageNames.map((pkg) => (\n <option key={pkg} value={pkg}>\n {pkg}\n </option>\n ))}\n </select>\n ) : (\n <span style={{ color: theme.colors.textMuted }}>\n {packageNames[0]}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Content */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflow: \"auto\",\n }}\n >\n {isLoading ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n Loading lens results...\n </div>\n ) : !hasSlice || !lensResultsSlice?.data ? (\n <div\n style={{\n padding: 40,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n }}\n >\n <Bug\n size={48}\n color={theme.colors.border}\n style={{ marginBottom: 16 }}\n />\n <div style={{ fontSize: 14, marginBottom: 8 }}>\n No lens data available\n </div>\n <div style={{ fontSize: 12 }}>\n Run quality-lens-cli or check that the lensResults slice is\n configured.\n </div>\n </div>\n ) : (\n <LensDataDebugPanelComponent\n data={lensResultsSlice.data as FormattedResults}\n theme={theme}\n onFileClick={handleFileClick}\n selectedPackage={selectedPackage ?? undefined}\n onPackageSelect={setSelectedPackage}\n />\n )}\n </div>\n </div>\n );\n};\n\n/**\n * LensDataDebugPanel - A panel for inspecting raw lens results data\n *\n * This panel is useful for debugging and verifying that quality lens data\n * is being collected and formatted correctly. It shows:\n * - Package breakdown (for monorepos)\n * - Lens results with pass/fail status\n * - Files with issues and individual issue details\n */\nexport const LensDataDebugPanel = LensDataDebugPanelContent;\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 type { MetricKey } from \"./QualityHexagon\";\n\nexport interface MetricListItem {\n key: MetricKey;\n label: string;\n value: number;\n color: string;\n icon: React.ReactNode;\n}\n\ninterface QualityMetricsListProps {\n metrics: QualityMetrics;\n theme: Theme;\n className?: string;\n onMetricClick?: (metric: MetricKey) => void;\n}\n\n// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: string): string {\n // For deadCode, lower is better (invert the logic)\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"#2E7D32\"; // forest green\n if (effectiveValue >= 60) return \"#E6A700\"; // amber\n return \"#C62828\"; // crimson\n}\n\n// Get background color for the value indicator\nfunction getValueBgColor(value: number, key: string): string {\n const effectiveValue = key === \"deadCode\" ? 100 - value : value;\n\n if (effectiveValue >= 80) return \"rgba(46, 125, 50, 0.1)\";\n if (effectiveValue >= 60) return \"rgba(230, 167, 0, 0.1)\";\n return \"rgba(198, 40, 40, 0.1)\";\n}\n\n// Icons for each metric\nfunction getMetricIcon(key: MetricKey): React.ReactNode {\n const iconProps = {\n width: 18,\n height: 18,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n switch (key) {\n case \"types\":\n // TypeScript/Types icon (diamond/brackets)\n return (\n <svg {...iconProps}>\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n );\n case \"documentation\":\n // Docs icon (file with lines)\n return (\n <svg {...iconProps}>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14,2 14,8 20,8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\n </svg>\n );\n case \"tests\":\n // Tests icon (check circle)\n return (\n <svg {...iconProps}>\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22,4 12,14.01 9,11.01\" />\n </svg>\n );\n case \"deadCode\":\n // Dead code icon (trash/code)\n return (\n <svg {...iconProps}>\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n case \"formatting\":\n // Formatting icon (align/indent)\n return (\n <svg {...iconProps}>\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" />\n <line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" />\n <line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n );\n case \"linting\":\n // Linting icon (alert/shield)\n return (\n <svg {...iconProps}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n default:\n return null;\n }\n}\n\n// Metrics configuration\nconst METRIC_CONFIG: { key: MetricKey; label: string; description: string }[] =\n [\n { key: \"types\", label: \"Types\", description: \"Type safety score\" },\n {\n key: \"documentation\",\n label: \"Documentation\",\n description: \"Documentation coverage\",\n },\n {\n key: \"tests\",\n label: \"Tests\",\n description: \"Test coverage and passing rate\",\n },\n {\n key: \"deadCode\",\n label: \"Dead Code\",\n description: \"Unused code detected\",\n },\n {\n key: \"formatting\",\n label: \"Formatting\",\n description: \"Code formatting consistency\",\n },\n { key: \"linting\", label: \"Linting\", description: \"Linting compliance\" },\n ];\n\nexport function QualityMetricsList({\n metrics,\n theme,\n className,\n onMetricClick,\n}: QualityMetricsListProps) {\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {METRIC_CONFIG.map(({ key, label, description }) => {\n const value = metrics[key];\n const isDeadCode = key === \"deadCode\";\n\n return (\n <div\n key={key}\n onClick={() => onMetricClick?.(key)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n borderRadius: 6,\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n cursor: onMetricClick ? \"pointer\" : \"default\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (onMetricClick) {\n e.currentTarget.style.backgroundColor =\n theme.colors.backgroundLight;\n e.currentTarget.style.borderColor = theme.colors.primary;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n e.currentTarget.style.borderColor = theme.colors.border;\n }}\n >\n {/* Icon */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 6,\n backgroundColor: getValueBgColor(value, key),\n color: getValueColor(value, key),\n flexShrink: 0,\n }}\n >\n {getMetricIcon(key)}\n </div>\n\n {/* Label and description */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: theme.colors.text,\n }}\n >\n {label}\n {isDeadCode && (\n <span\n style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n marginLeft: 4,\n }}\n >\n (lower is better)\n </span>\n )}\n </div>\n <div\n style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {description}\n </div>\n </div>\n\n {/* Value */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n {/* Progress bar */}\n <div\n style={{\n width: 60,\n height: 6,\n borderRadius: 3,\n backgroundColor: theme.colors.border,\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n width: `${isDeadCode ? 100 - value : value}%`,\n height: \"100%\",\n backgroundColor: getValueColor(value, key),\n borderRadius: 3,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n\n {/* Percentage */}\n <span\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: getValueColor(value, key),\n minWidth: 45,\n textAlign: \"right\",\n }}\n >\n {value.toFixed(1)}%\n </span>\n </div>\n\n {/* Chevron if clickable */}\n {onMetricClick && (\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={{ flexShrink: 0 }}\n >\n <polyline points=\"9,18 15,12 9,6\" />\n </svg>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function QualityMetricsListCompact({\n metrics,\n theme,\n className,\n onMetricClick,\n}: QualityMetricsListProps) {\n return (\n <div\n className={cn(className)}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n }}\n >\n {METRIC_CONFIG.map(({ key, label }) => {\n const value = metrics[key];\n const isDeadCode = key === \"deadCode\";\n\n return (\n <div\n key={key}\n onClick={() => onMetricClick?.(key)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"6px 8px\",\n borderRadius: 4,\n cursor: onMetricClick ? \"pointer\" : \"default\",\n transition: \"background-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (onMetricClick) {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n >\n <span\n style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n }}\n >\n {label}\n {isDeadCode && \" ↓\"}\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}\n >\n {value.toFixed(1)}%\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import { QualityHexagonPanel } from \"./panels/QualityHexagonPanel\";\nimport { RepositoryQualityGridPanel } from \"./panels/RepositoryQualityGridPanel\";\nimport { LensDataDebugPanel } from \"./panels/LensDataDebugPanel\";\nimport type { PanelDefinition, PanelContextValue } from \"@principal-ade/panel-framework-core\";\nimport type {\n QualityHexagonPanelContext,\n RepositoryQualityGridPanelContext,\n LensDataDebugPanelContext,\n} from \"./types\";\n\n/**\n * Export array of panel definitions.\n * This is the required export for panel extensions.\n *\n * Note: Uses `any` for both TActions and TContext because this is a heterogeneous array containing\n * panels with different action and context type requirements. Each panel definition is still\n * individually type-checked.\n */\nexport const panels: ReadonlyArray<PanelDefinition<any, any>> = [\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\", \"fileTree\"],\n tools: [],\n },\n component: QualityHexagonPanel,\n\n onMount: async (context: PanelContextValue<QualityHexagonPanelContext>) => {\n console.log(\n \"Quality Hexagon Panel mounted\",\n context.currentScope.repository?.path,\n );\n\n // Check slice existence via direct property access (hasSlice is deprecated)\n if (context.quality !== undefined && !context.quality.loading) {\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<RepositoryQualityGridPanelContext>) => {\n console.log(\"Repository Quality Grid Panel mounted\");\n\n // Check slice existence via direct property access (hasSlice is deprecated)\n if (context.repositoriesQuality !== undefined && !context.repositoriesQuality.loading) {\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 metadata: {\n id: \"principal-ade.lens-data-debug-panel\",\n name: \"Lens Data Debug\",\n icon: \"🐛\",\n version: \"0.1.0\",\n author: \"Principal ADE\",\n description:\n \"Debug panel for inspecting raw lens results from quality-lens-cli. Shows package breakdown, lens results with pass/fail status, and files with issues.\",\n slices: [\"lensResults\"],\n tools: [],\n },\n component: LensDataDebugPanel,\n\n onMount: async (context: PanelContextValue<LensDataDebugPanelContext>) => {\n console.log(\n \"Lens Data Debug Panel mounted\",\n context.currentScope.repository?.path,\n );\n\n // Check slice existence via direct property access (hasSlice is deprecated)\n if (context.lensResults !== undefined && !context.lensResults.loading) {\n await context.refresh(\"repository\", \"lensResults\");\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log(\"Lens Data Debug 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\";\nexport { LensDataDebugPanel } from \"./panels/LensDataDebugPanel\";\n\n// Export debug components\nexport {\n LensDataDebugPanel as LensDataDebugComponent,\n type FormattedResults,\n type LensResult,\n type Issue,\n} from \"./components\";\n\n// Export metrics list components\nexport { QualityMetricsList, QualityMetricsListCompact } from \"./components\";\n"],"names":["__iconNode","getValueColor","React","_a","LensDataDebugPanel","idx","r","LensDataDebugPanelComponent"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
|