@principal-ade/code-quality-panels 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +27 -27
  2. package/dist/panels.bundle.js +1546 -820
  3. package/dist/panels.bundle.js.map +1 -1
  4. package/dist/src/components/LensDataDebugPanel.d.ts +2 -2
  5. package/dist/src/components/LensDataDebugPanel.d.ts.map +1 -1
  6. package/dist/src/components/LensDataDebugPanel.stories.d.ts +2 -2
  7. package/dist/src/components/LensDataDebugPanel.stories.d.ts.map +1 -1
  8. package/dist/src/components/QualityEmptyState.d.ts +2 -2
  9. package/dist/src/components/QualityEmptyState.d.ts.map +1 -1
  10. package/dist/src/components/QualityHexagon.d.ts +16 -10
  11. package/dist/src/components/QualityHexagon.d.ts.map +1 -1
  12. package/dist/src/components/QualityHexagon.stories.d.ts +2 -2
  13. package/dist/src/components/QualityHexagon.stories.d.ts.map +1 -1
  14. package/dist/src/components/QualityMetricsList.d.ts +4 -4
  15. package/dist/src/components/QualityMetricsList.d.ts.map +1 -1
  16. package/dist/src/components/QualityMetricsList.stories.d.ts +2 -2
  17. package/dist/src/components/QualityMetricsList.stories.d.ts.map +1 -1
  18. package/dist/src/components/RepositoryQualityGrid.d.ts +3 -3
  19. package/dist/src/components/RepositoryQualityGrid.d.ts.map +1 -1
  20. package/dist/src/components/RepositoryQualityGrid.stories.d.ts +2 -2
  21. package/dist/src/components/RepositoryQualityGrid.stories.d.ts.map +1 -1
  22. package/dist/src/components/index.d.ts +5 -5
  23. package/dist/src/index.d.ts +7 -7
  24. package/dist/src/index.d.ts.map +1 -1
  25. package/dist/src/mocks/panelContext.d.ts +2 -2
  26. package/dist/src/mocks/panelContext.d.ts.map +1 -1
  27. package/dist/src/panels/LensDataDebugPanel.d.ts +2 -2
  28. package/dist/src/panels/LensDataDebugPanel.d.ts.map +1 -1
  29. package/dist/src/panels/LensDataDebugPanel.stories.d.ts +1 -1
  30. package/dist/src/panels/LensDataDebugPanel.stories.d.ts.map +1 -1
  31. package/dist/src/panels/QualityHexagonPanel.d.ts +2 -2
  32. package/dist/src/panels/QualityHexagonPanel.d.ts.map +1 -1
  33. package/dist/src/panels/QualityHexagonPanel.stories.d.ts +1 -1
  34. package/dist/src/panels/QualityHexagonPanel.stories.d.ts.map +1 -1
  35. package/dist/src/panels/RepositoryQualityGridPanel.d.ts +2 -2
  36. package/dist/src/panels/RepositoryQualityGridPanel.d.ts.map +1 -1
  37. package/dist/src/panels/RepositoryQualityGridPanel.stories.d.ts +1 -1
  38. package/dist/src/panels/RepositoryQualityGridPanel.stories.d.ts.map +1 -1
  39. package/dist/src/types/index.d.ts +1 -1
  40. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"panels.bundle.js","sources":["../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/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/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\n// src/themes.ts\nvar regalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#f1e8dc\",\n background: \"#1a1f2e\",\n primary: \"#d4a574\",\n secondary: \"#e0b584\",\n accent: \"#c9b8a3\",\n highlight: \"rgba(212, 165, 116, 0.15)\",\n muted: \"#8b7968\",\n success: \"#5c8a72\",\n warning: \"#d4a574\",\n error: \"#a85751\",\n info: \"#d4a574\",\n border: \"rgba(212, 165, 116, 0.2)\",\n backgroundSecondary: \"#212738\",\n backgroundTertiary: \"#2d3446\",\n backgroundLight: \"rgba(212, 165, 116, 0.08)\",\n backgroundHover: \"rgba(212, 165, 116, 0.15)\",\n surface: \"#212738\",\n textSecondary: \"#c9b8a3\",\n textTertiary: \"#8b7968\",\n textMuted: \"#8b7968\",\n highlightBg: \"rgba(255, 193, 7, 0.25)\",\n highlightBorder: \"rgba(255, 193, 7, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"background\",\n bg: \"primary\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"muted\",\n \"&:hover\": {\n bg: \"backgroundSecondary\"\n }\n },\n ghost: {\n color: \"primary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"muted\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"background\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar terminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n heading: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n monospace: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px 0 rgba(0, 0, 0, 0.07)\",\n \"0 8px 12px 0 rgba(0, 0, 0, 0.08)\",\n \"0 16px 24px 0 rgba(0, 0, 0, 0.10)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#e4e4e4\",\n background: \"rgba(10, 10, 10, 0.85)\",\n primary: \"#66b3ff\",\n secondary: \"#80c4ff\",\n accent: \"#66ff99\",\n highlight: \"rgba(102, 179, 255, 0.15)\",\n muted: \"rgba(26, 26, 26, 0.8)\",\n success: \"#66ff99\",\n warning: \"#ffcc66\",\n error: \"#ff6666\",\n info: \"#66b3ff\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"rgba(15, 15, 15, 0.9)\",\n backgroundTertiary: \"rgba(20, 20, 20, 0.9)\",\n backgroundLight: \"rgba(255, 255, 255, 0.05)\",\n backgroundHover: \"rgba(102, 179, 255, 0.08)\",\n surface: \"rgba(15, 15, 15, 0.95)\",\n textSecondary: \"rgba(255, 255, 255, 0.7)\",\n textTertiary: \"rgba(255, 255, 255, 0.5)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n modes: {\n light: {\n text: \"#1a1a1a\",\n background: \"rgba(255, 255, 255, 0.9)\",\n primary: \"#0066cc\",\n secondary: \"#0052a3\",\n accent: \"#00cc88\",\n highlight: \"rgba(0, 102, 204, 0.08)\",\n muted: \"rgba(245, 245, 245, 0.8)\",\n success: \"#00cc88\",\n warning: \"#ffaa00\",\n error: \"#ff3333\",\n info: \"#0066cc\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"rgba(250, 250, 250, 0.9)\",\n backgroundTertiary: \"rgba(245, 245, 245, 0.9)\",\n backgroundLight: \"rgba(0, 0, 0, 0.02)\",\n backgroundHover: \"rgba(0, 102, 204, 0.04)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\n textSecondary: \"rgba(0, 0, 0, 0.6)\",\n textTertiary: \"rgba(0, 0, 0, 0.4)\",\n textMuted: \"rgba(0, 0, 0, 0.3)\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\nvar matrixTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(0, 216, 53, 0.15)\",\n \"0 0 10px rgba(0, 216, 53, 0.2)\",\n \"0 0 15px rgba(0, 216, 53, 0.25)\",\n \"0 0 20px rgba(0, 216, 53, 0.3)\",\n \"0 0 30px rgba(0, 216, 53, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#00d835\",\n secondary: \"#00a828\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.15)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(0, 216, 53, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(0, 216, 53, 0.03)\",\n backgroundHover: \"rgba(0, 216, 53, 0.08)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.25)\",\n highlightBorder: \"rgba(0, 216, 53, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar matrixMinimalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 0 20px rgba(0, 216, 53, 0.1)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#b8b8b8\",\n secondary: \"#909090\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.1)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(184, 184, 184, 0.1)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(184, 184, 184, 0.02)\",\n backgroundHover: \"rgba(0, 216, 53, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.2)\",\n highlightBorder: \"rgba(0, 216, 53, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar slateTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.2)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.2)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.2)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.25)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#9ca3af\",\n background: \"#1a1c1e\",\n primary: \"#d1d5db\",\n secondary: \"#6b7280\",\n accent: \"#f59e0b\",\n highlight: \"rgba(209, 213, 219, 0.15)\",\n muted: \"#2d3134\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n border: \"rgba(156, 163, 175, 0.15)\",\n backgroundSecondary: \"#22252a\",\n backgroundTertiary: \"#2d3134\",\n backgroundLight: \"rgba(156, 163, 175, 0.05)\",\n backgroundHover: \"rgba(156, 163, 175, 0.1)\",\n surface: \"#1f2124\",\n textSecondary: \"#e5e7eb\",\n textTertiary: \"#6b7280\",\n textMuted: \"#4b5563\",\n highlightBg: \"rgba(245, 158, 11, 0.25)\",\n highlightBorder: \"rgba(245, 158, 11, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#1a1c1e\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#9ca3af\"\n }\n },\n secondary: {\n color: \"#e5e7eb\",\n bg: \"secondary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#4b5563\"\n }\n },\n ghost: {\n color: \"textSecondary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"textSecondary\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textTertiary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/ThemeProvider.tsx\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\n\n// src/themeHelpers.ts\nfunction overrideColors(theme, colors) {\n return {\n ...theme,\n colors: {\n ...theme.colors,\n ...colors\n }\n };\n}\nfunction makeTheme(baseTheme, overrides) {\n return {\n ...baseTheme,\n ...overrides,\n colors: {\n ...baseTheme.colors,\n ...overrides.colors\n },\n fonts: {\n ...baseTheme.fonts,\n ...overrides.fonts\n }\n };\n}\nfunction addMode(theme, modeName, colors, baseMode) {\n let baseColors;\n if (baseMode && theme.modes && theme.modes[baseMode]) {\n baseColors = {\n ...theme.colors,\n ...theme.modes[baseMode]\n };\n } else {\n baseColors = theme.colors;\n }\n const newMode = {\n ...baseColors,\n ...colors\n };\n return {\n ...theme,\n modes: {\n ...theme.modes,\n [modeName]: newMode\n }\n };\n}\nfunction getMode(theme, mode) {\n if (!mode || !theme.modes || !theme.modes[mode]) {\n return theme.colors;\n }\n return {\n ...theme.colors,\n ...theme.modes[mode]\n };\n}\n\n// src/ThemeProvider.tsx\nvar ThemeContext;\nvar getThemeContext = () => {\n if (typeof window !== \"undefined\") {\n const globalWindow = window;\n if (!globalWindow.__principlemd_theme_context__) {\n globalWindow.__principlemd_theme_context__ = createContext(undefined);\n }\n return globalWindow.__principlemd_theme_context__;\n } else {\n if (!ThemeContext) {\n ThemeContext = createContext(undefined);\n }\n return ThemeContext;\n }\n};\nvar ThemeContextSingleton = getThemeContext();\nvar useTheme = () => {\n const context = useContext(ThemeContextSingleton);\n if (!context) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\nvar ThemeProvider = ({\n children,\n theme: customTheme = theme,\n initialMode\n}) => {\n const [mode, setMode] = useState(initialMode);\n const activeTheme = React.useMemo(() => {\n if (!mode || !customTheme.modes || !customTheme.modes[mode]) {\n return customTheme;\n }\n return {\n ...customTheme,\n colors: getMode(customTheme, mode)\n };\n }, [customTheme, mode]);\n useEffect(() => {\n if (!initialMode) {\n const savedMode = localStorage.getItem(\"principlemd-theme-mode\");\n if (savedMode) {\n setMode(savedMode);\n }\n }\n }, [initialMode]);\n useEffect(() => {\n if (mode) {\n localStorage.setItem(\"principlemd-theme-mode\", mode);\n } else {\n localStorage.removeItem(\"principlemd-theme-mode\");\n }\n }, [mode]);\n const value = {\n theme: activeTheme,\n mode,\n setMode\n };\n return /* @__PURE__ */ React.createElement(ThemeContextSingleton.Provider, {\n value\n }, children);\n};\nvar withTheme = (Component) => {\n return (props) => {\n const { theme: theme2 } = useTheme();\n return /* @__PURE__ */ React.createElement(Component, {\n ...props,\n theme: theme2\n });\n };\n};\n// src/utils.ts\nvar getColor = (theme2, colorKey) => {\n const colors = theme2.colors;\n const value = colors[colorKey];\n return typeof value === \"string\" ? value : colorKey;\n};\nvar getSpace = (theme2, index) => {\n return theme2.space[index] || 0;\n};\nvar getFontSize = (theme2, index) => {\n return theme2.fontSizes[index] || theme2.fontSizes[2];\n};\nvar getRadius = (theme2, index) => {\n return theme2.radii[index] || 0;\n};\nvar getShadow = (theme2, index) => {\n return theme2.shadows[index] || \"none\";\n};\nvar getZIndex = (theme2, index) => {\n return theme2.zIndices[index] || 0;\n};\nvar responsive = (values) => {\n return values.reduce((acc, value, index) => {\n if (index === 0) {\n return value;\n }\n return {\n ...acc,\n [`@media screen and (min-width: ${values[index - 1]})`]: value\n };\n }, {});\n};\nvar sx = (styles) => styles;\nvar createStyle = (theme2, styleObj) => {\n const processValue = (value) => {\n if (typeof value === \"string\") {\n if (value in theme2.colors) {\n return getColor(theme2, value);\n }\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (typeof value === \"object\" && value !== null) {\n const processed2 = {};\n for (const [key, val] of Object.entries(value)) {\n processed2[key] = processValue(val);\n }\n return processed2;\n }\n return value;\n };\n const processed = {};\n for (const [key, val] of Object.entries(styleObj)) {\n processed[key] = processValue(val);\n }\n return processed;\n};\nvar mergeThemes = (baseTheme, ...overrides) => {\n return overrides.reduce((theme2, override) => ({\n space: override.space || theme2.space,\n fonts: { ...theme2.fonts, ...override.fonts || {} },\n fontSizes: override.fontSizes || theme2.fontSizes,\n fontWeights: { ...theme2.fontWeights, ...override.fontWeights || {} },\n lineHeights: { ...theme2.lineHeights, ...override.lineHeights || {} },\n breakpoints: override.breakpoints || theme2.breakpoints,\n sizes: override.sizes || theme2.sizes,\n radii: override.radii || theme2.radii,\n shadows: override.shadows || theme2.shadows,\n zIndices: override.zIndices || theme2.zIndices,\n colors: {\n ...theme2.colors,\n ...override.colors || {}\n },\n buttons: { ...theme2.buttons, ...override.buttons || {} },\n text: { ...theme2.text, ...override.text || {} },\n cards: { ...theme2.cards, ...override.cards || {} }\n }), baseTheme);\n};\n// src/ThemeShowcase.tsx\nimport React2 from \"react\";\nvar ThemeShowcase = ({\n theme: theme2,\n title,\n showValues = true,\n sections = [\"colors\", \"typography\", \"spacing\", \"shadows\", \"radii\"]\n}) => {\n const containerStyle = {\n fontFamily: theme2.fonts.body,\n color: theme2.colors.text,\n backgroundColor: theme2.colors.background,\n padding: theme2.space[4],\n minHeight: \"100vh\"\n };\n const sectionStyle = {\n marginBottom: theme2.space[5],\n padding: theme2.space[4],\n backgroundColor: theme2.colors.surface || theme2.colors.backgroundSecondary,\n borderRadius: theme2.radii[2],\n border: `1px solid ${theme2.colors.border}`\n };\n const headingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[5],\n fontWeight: theme2.fontWeights.heading,\n marginBottom: theme2.space[3],\n color: theme2.colors.primary\n };\n const subheadingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[3],\n fontWeight: theme2.fontWeights.medium,\n marginBottom: theme2.space[2],\n marginTop: theme2.space[3],\n color: theme2.colors.text\n };\n return /* @__PURE__ */ React2.createElement(\"div\", {\n style: containerStyle\n }, title && /* @__PURE__ */ React2.createElement(\"h1\", {\n style: {\n ...headingStyle,\n fontSize: theme2.fontSizes[6],\n marginBottom: theme2.space[4]\n }\n }, title), sections.includes(\"colors\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Colors\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Primary Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"text\", \"background\", \"primary\", \"secondary\", \"accent\", \"muted\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Status Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"success\", \"warning\", \"error\", \"info\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Background Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3]\n }\n }, [\"backgroundSecondary\", \"backgroundTertiary\", \"backgroundLight\", \"backgroundHover\", \"surface\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n padding: theme2.space[3],\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary,\n marginTop: theme2.space[1]\n }\n }, color));\n }))), sections.includes(\"typography\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Typography\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Families\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[4],\n marginBottom: theme2.space[2]\n }\n }, \"Heading Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.heading)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[2],\n marginBottom: theme2.space[2]\n }\n }, \"Body Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.body)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[2]\n }\n }, \"Monospace Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.monospace))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Sizes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, theme2.fontSizes.map((size, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: {\n fontSize: size,\n lineHeight: theme2.lineHeights.body,\n marginBottom: theme2.space[1]\n }\n }, \"Size \", index, \": Sample Text \", showValues && `(${size}px)`))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Weights\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: theme2.space[2]\n }\n }, Object.entries(theme2.fontWeights).map(([name, weight]) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: name,\n style: {\n fontWeight: weight,\n fontSize: theme2.fontSizes[2]\n }\n }, name, \" \", showValues && `(${weight})`)))), sections.includes(\"spacing\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Spacing\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: theme2.space[2] }\n }, theme2.space.map((space, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { display: \"flex\", alignItems: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 60,\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"]\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n height: 24,\n width: space,\n backgroundColor: theme2.colors.primary,\n borderRadius: theme2.radii[1]\n }\n }), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n marginLeft: theme2.space[2],\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, space, \"px\"))))), sections.includes(\"radii\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Border Radii\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n gap: theme2.space[3]\n }\n }, theme2.radii.map((radius, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 80,\n height: 80,\n backgroundColor: theme2.colors.primary,\n borderRadius: radius,\n marginBottom: theme2.space[1],\n margin: \"0 auto\"\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"] \", showValues && `${radius}px`))))), sections.includes(\"shadows\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Shadows\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: theme2.space[4]\n }\n }, theme2.shadows.map((shadow, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 100,\n height: 100,\n backgroundColor: theme2.colors.background,\n boxShadow: shadow,\n borderRadius: theme2.radii[2],\n margin: \"0 auto\",\n marginBottom: theme2.space[2],\n border: `1px solid ${theme2.colors.border}`\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"Shadow [\", index, \"]\"), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textMuted,\n marginTop: theme2.space[1]\n }\n }, shadow === \"none\" ? \"none\" : \"...\"))))), theme2.modes && Object.keys(theme2.modes).length > 0 && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Available Modes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"flex\",\n gap: theme2.space[2],\n flexWrap: \"wrap\"\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.primary,\n color: \"#ffffff\",\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, \"default\"), Object.keys(theme2.modes).map((modeName) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: modeName,\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.secondary,\n color: theme2.colors.text,\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, modeName)))));\n};\n\n// src/index.ts\nvar theme = terminalTheme;\nfunction scaleThemeFonts(theme2, scale) {\n const currentScale = theme2.fontScale || 1;\n const effectiveScale = scale / currentScale;\n return {\n ...theme2,\n fontSizes: theme2.fontSizes.map((size) => Math.round(size * effectiveScale)),\n fontScale: scale\n };\n}\nfunction increaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.min(currentScale * 1.1, 2);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction decreaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.max(currentScale * 0.9, 0.5);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction resetFontScale(theme2) {\n return scaleThemeFonts(theme2, 1);\n}\nvar src_default = theme;\nexport {\n withTheme,\n useTheme,\n theme,\n terminalTheme,\n sx,\n slateTheme,\n scaleThemeFonts,\n responsive,\n resetFontScale,\n regalTheme,\n overrideColors,\n mergeThemes,\n matrixTheme,\n matrixMinimalTheme,\n makeTheme,\n increaseFontScale,\n glassmorphismTheme,\n getZIndex,\n getSpace,\n getShadow,\n getRadius,\n getMode,\n getFontSize,\n getColor,\n defaultTerminalTheme,\n defaultMarkdownTheme,\n defaultEditorTheme,\n src_default as default,\n decreaseFontScale,\n createStyle,\n addMode,\n ThemeShowcase,\n ThemeProvider\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","import * as React from 'react';\nimport { cn } from '../lib/utils';\nimport type { Theme } from '@principal-ade/industry-theme';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\n\nexport type { QualityMetrics };\nexport type QualityTier = 'none' | 'bronze' | 'silver' | 'gold' | 'platinum';\nexport type MetricKey = 'types' | 'documentation' | 'tests' | 'deadCode' | 'formatting' | 'linting';\n\nexport interface VertexHoverInfo {\n key: MetricKey;\n label: string;\n value: number;\n color: string;\n}\n\ninterface QualityHexagonProps {\n metrics: QualityMetrics;\n tier: QualityTier;\n theme: Theme;\n showLabels?: boolean;\n showValues?: boolean;\n className?: string;\n onVertexHover?: (info: VertexHoverInfo) => void;\n onVertexLeave?: () => void;\n onVertexClick?: (info: VertexHoverInfo) => void;\n}\n\n// Helper to extract theme colors\nfunction getThemeColors(theme: Theme) {\n return {\n gridColor: theme.colors.border,\n axisColor: theme.colors.muted,\n textColor: theme.colors.text,\n scoreColor: theme.colors.text,\n tierColors: {\n none: { fill: '#808080', stroke: '#808080', bg: theme.colors.backgroundLight },\n bronze: { fill: '#CD7F32', stroke: '#CD7F32', bg: theme.colors.backgroundLight },\n silver: { fill: '#C0C0C0', stroke: '#C0C0C0', bg: theme.colors.backgroundLight },\n gold: { fill: '#FFD700', stroke: '#FFD700', bg: theme.colors.backgroundLight },\n platinum: { fill: '#E5E4E2', stroke: '#E5E4E2', bg: theme.colors.backgroundLight }\n },\n metricColors: {\n types: theme.colors.warning,\n documentation: theme.colors.info,\n tests: theme.colors.success,\n deadCode: theme.colors.error,\n formatting: theme.colors.accent,\n linting: theme.colors.primary\n },\n qualityIndicators: {\n good: theme.colors.success,\n medium: theme.colors.warning,\n poor: theme.colors.error\n }\n };\n}\n\n// 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// Metrics ordered clockwise from top-left\nconst getMetricConfig = (themeColors: ReturnType<typeof getThemeColors>) => [\n { key: 'formatting', label: 'Format', color: themeColors.metricColors.formatting, angle: -120 },\n { key: 'linting', label: 'Linting', color: themeColors.metricColors.linting, angle: -60 },\n { key: 'types', label: 'Types', color: themeColors.metricColors.types, angle: 0 },\n { key: 'tests', label: 'Tests', color: themeColors.metricColors.tests, angle: 60 },\n { key: 'deadCode', label: 'Dead Code', color: themeColors.metricColors.deadCode, angle: 120 },\n { key: 'documentation', label: 'Docs', color: themeColors.metricColors.documentation, angle: 180 }\n] as const;\n\nfunction calculateHexagonPoints(center: number, radius: number, metricConfig: ReturnType<typeof getMetricConfig>): string {\n return metricConfig\n .map(({ angle }) => {\n const radian = (angle * Math.PI) / 180;\n const x = center + radius * Math.cos(radian);\n const y = center + radius * Math.sin(radian);\n return `${x},${y}`;\n })\n .join(' ');\n}\n\nfunction calculateMetricPoint(\n center: number,\n radius: number,\n angle: number,\n value: number\n): { x: number; y: number } {\n const actualRadius = (radius * value) / 100;\n const radian = (angle * Math.PI) / 180;\n return {\n x: center + actualRadius * Math.cos(radian),\n y: center + actualRadius * Math.sin(radian)\n };\n}\n\nexport function QualityHexagon({\n metrics,\n tier,\n theme,\n showLabels = false,\n showValues = false,\n className,\n onVertexHover,\n onVertexLeave,\n onVertexClick,\n}: QualityHexagonProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n // Use fixed internal coordinates for viewBox\n const viewBoxSize = 300;\n const center = viewBoxSize / 2;\n const radius = viewBoxSize * 0.28;\n const padding = viewBoxSize * 0.1;\n const fontSize = viewBoxSize * 0.04;\n const strokeWidth = viewBoxSize * 0.008;\n const dotSize = viewBoxSize * 0.015;\n\n const hexagonPoints = calculateHexagonPoints(center, radius, metricConfig);\n\n const dataPoints = metricConfig\n .map(({ key, angle }) => {\n let value = metrics[key as keyof QualityMetrics];\n // Invert dead code metric (less is better)\n if (key === 'deadCode') {\n value = 100 - value;\n }\n return calculateMetricPoint(center, radius, angle, value);\n })\n .map(p => `${p.x},${p.y}`)\n .join(' ');\n\n // Calculate average with inverted dead code\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n const averageScore = Math.round(\n Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6\n );\n\n const hexagon = (\n <svg\n viewBox={`0 0 ${viewBoxSize} ${viewBoxSize}`}\n className={cn('w-full h-full transition-all duration-300', className)}\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {/* Grid lines */}\n <g className=\"opacity-20\">\n {[20, 40, 60, 80, 100].map((percent) => (\n <polygon\n key={percent}\n points={calculateHexagonPoints(center, (radius * percent) / 100, metricConfig)}\n fill=\"none\"\n stroke={themeColors.gridColor}\n strokeWidth={0.5}\n style={{ opacity: 0.4 }}\n />\n ))}\n </g>\n\n {/* Axes */}\n {metricConfig.map(({ angle }) => {\n const endPoint = calculateMetricPoint(center, radius, angle, 100);\n return (\n <line\n key={angle}\n x1={center}\n y1={center}\n x2={endPoint.x}\n y2={endPoint.y}\n stroke={themeColors.axisColor}\n strokeWidth={0.5}\n style={{ opacity: 0.5 }}\n />\n );\n })}\n\n {/* Outer hexagon */}\n <polygon\n points={hexagonPoints}\n fill=\"none\"\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ opacity: 0.3 }}\n />\n\n {/* Data polygon */}\n <polygon\n points={dataPoints}\n fill={colors.fill}\n fillOpacity={0.3}\n stroke={colors.stroke}\n strokeWidth={strokeWidth}\n style={{ transition: 'all 0.5s ease' }}\n />\n\n {/* Vertex dots */}\n {metricConfig.map(({ key, label, color, angle }) => {\n const rawValue = metrics[key as keyof QualityMetrics];\n let value = rawValue;\n // Invert dead code metric for display\n if (key === 'deadCode') {\n value = 100 - value;\n }\n const point = calculateMetricPoint(center, radius, angle, 100);\n const dataPoint = calculateMetricPoint(center, radius, angle, value);\n\n const vertexInfo: VertexHoverInfo = {\n key: key as MetricKey,\n label,\n value: rawValue,\n color,\n };\n\n const handleMouseEnter = () => {\n onVertexHover?.(vertexInfo);\n };\n\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n onVertexClick?.(vertexInfo);\n };\n\n return (\n <g\n key={key}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onVertexLeave}\n onClick={handleClick}\n style={{ cursor: (onVertexHover || onVertexClick) ? 'pointer' : 'default' }}\n >\n {/* Larger invisible hit area for easier hovering */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize * 2.5}\n fill=\"transparent\"\n />\n {/* Outer vertex marker */}\n <circle\n cx={point.x}\n cy={point.y}\n r={dotSize}\n fill=\"white\"\n stroke={colors.stroke}\n strokeWidth={1.5}\n />\n {/* Value indicator */}\n <circle\n cx={dataPoint.x}\n cy={dataPoint.y}\n r={dotSize * 0.7}\n fill={colors.fill}\n stroke={colors.stroke}\n strokeWidth={1}\n style={{ opacity: 0.9 }}\n />\n </g>\n );\n })}\n\n {/* Center score */}\n <text\n x={center}\n y={center}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.scoreColor}\n fontSize={fontSize * 1.5}\n fontWeight=\"600\"\n >\n {averageScore}\n </text>\n <text\n x={center}\n y={center + fontSize}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize * 0.8}\n style={{ opacity: 0.6 }}\n >\n avg\n </text>\n\n {/* Labels */}\n {showLabels && (\n <>\n {metricConfig.map(({ key, label, angle }) => {\n const labelRadius = radius + padding * 1.2;\n const point = calculateMetricPoint(center, labelRadius, angle, 100);\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <text\n key={key}\n x={point.x}\n y={point.y}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill={themeColors.textColor}\n fontSize={fontSize}\n >\n {showValues ? `${value}%` : label}\n </text>\n );\n })}\n </>\n )}\n </svg>\n );\n\n // For non-interactive mode or when tooltips are not available, just return the hexagon\n return hexagon;\n}\n\nexport function QualityHexagonCompact({\n metrics,\n tier,\n theme,\n className\n}: Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'>) {\n return (\n <div className={cn('w-20 h-20', className)}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={false}\n showValues={false}\n />\n </div>\n );\n}\n\ninterface QualityHexagonDetailedProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n}\n\nexport function QualityHexagonDetailed({\n metrics,\n tier,\n theme,\n className,\n packageName,\n packageVersion,\n onRefresh,\n isRefreshing = false,\n}: QualityHexagonDetailedProps) {\n const themeColors = getThemeColors(theme);\n const colors = themeColors.tierColors[tier] ?? themeColors.tierColors.none;\n const metricConfig = getMetricConfig(themeColors);\n\n const hasHeader = packageName || onRefresh;\n\n return (\n <div\n className={cn(className)}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n padding: 16,\n borderRadius: 8,\n backgroundColor: colors.bg,\n }}\n >\n {hasHeader && (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 24,\n }}>\n <div style={{ flex: '1 1 200px', maxWidth: 300, aspectRatio: '1 / 1' }}>\n <QualityHexagon\n metrics={metrics}\n tier={tier}\n theme={theme}\n showLabels={true}\n showValues={false}\n />\n </div>\n\n <div style={{ flex: '1 1 200px', minWidth: 200, display: 'flex', flexDirection: 'column', gap: 8, padding: '8px 24px' }}>\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div key={key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>\n <span style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}>\n {value}%\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\ninterface QualityHexagonExpandableProps extends Pick<QualityHexagonProps, 'metrics' | 'tier' | 'theme' | 'className'> {\n packageName?: string;\n packageVersion?: string;\n packagePath?: string;\n onRefresh?: () => void;\n isRefreshing?: boolean;\n defaultExpanded?: boolean;\n /** Callback when the hexagon is expanded/collapsed */\n onExpandChange?: (expanded: boolean, info: { packageName?: string; packagePath?: string }) => 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 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 style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }}>\n {packageName ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {packageName.startsWith('@') && packageName.includes('/') ? (\n <>\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n {packageName.split('/')[0]}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName.split('/')[1]}\n </span>\n </>\n ) : (\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: colors.stroke,\n }}>\n {packageName}\n </span>\n )}\n {packageVersion && (\n <span style={{\n fontSize: 12,\n color: theme.colors.textMuted,\n }}>\n v{packageVersion}\n </span>\n )}\n </div>\n ) : <span />}\n {onRefresh && (\n <button\n onClick={onRefresh}\n disabled={isRefreshing}\n style={{\n padding: 6,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n background: theme.colors.surface,\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'not-allowed' : 'pointer',\n opacity: isRefreshing ? 0.6 : 1,\n }}\n title=\"Refresh\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: isRefreshing ? 'spin 1s linear infinite' : 'none',\n }}\n >\n <path d=\"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Clickable hexagon */}\n <div\n onClick={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 />\n </div>\n </div>\n\n {/* Expandable metrics breakdown */}\n <div\n style={{\n display: 'grid',\n gridTemplateRows: expanded ? '1fr' : '0fr',\n transition: 'grid-template-rows 0.3s ease',\n }}\n >\n <div style={{ overflow: 'hidden' }}>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: '8px 24px',\n borderTop: `1px solid ${theme.colors.border}`,\n marginTop: 8,\n }}>\n {metricConfig.map(({ key, label }) => {\n const value = metrics[key as keyof QualityMetrics];\n\n return (\n <div\n key={key}\n onClick={(e) => {\n e.stopPropagation();\n onMetricClick?.(key as MetricKey);\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n cursor: onMetricClick ? 'pointer' : 'default',\n padding: '4px 8px',\n margin: '0 -8px',\n borderRadius: 4,\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 style={{\n fontSize: 14,\n color: theme.colors.textMuted,\n }}>\n {label}{key === 'deadCode' ? ' ↓' : ''}\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: getValueColor(value, key),\n }}>\n {value}%\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 */\nexport function calculateQualityTier(metrics: QualityMetrics): QualityTier {\n // Invert dead code for calculation (less is better)\n const metricsForAverage = { ...metrics };\n metricsForAverage.deadCode = 100 - metricsForAverage.deadCode;\n\n const average = Object.values(metricsForAverage).reduce((a, b) => a + b, 0) / 6;\n\n if (average >= 90) return 'platinum';\n if (average >= 75) return 'gold';\n if (average >= 60) return 'silver';\n if (average >= 40) return 'bronze';\n return 'none';\n}\n","import React from 'react';\nimport {\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: { allFiles?: Array<{ relativePath?: string; path?: string }> } | undefined,\n targetPath: string\n): boolean {\n if (!treeData?.allFiles) return false;\n\n const normalizedTarget = targetPath.replace(/^\\//, '').toLowerCase();\n\n return treeData.allFiles.some((file) => {\n const filePath = (file.relativePath || file.path || '').toLowerCase();\n return filePath.endsWith(normalizedTarget) || filePath === normalizedTarget;\n });\n}\n\n/**\n * Copyable command line component\n */\nconst CommandLine: React.FC<{\n command: string;\n theme: Theme;\n 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 }}>{label}</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 { key: 'formatting', label: 'Formatting', description: 'Prettier code style', Icon: Sparkles },\n { key: 'linting', label: 'Linting', description: 'ESLint code quality', Icon: FileSearch },\n { key: 'types', label: 'Types', description: 'TypeScript type safety', Icon: Braces },\n { key: 'tests', label: 'Tests', description: 'Test coverage & pass rate', Icon: FlaskConical },\n { key: 'deadCode', label: 'Dead Code', description: 'Unused exports & deps', Icon: Trash2 },\n { key: 'documentation', label: 'Docs', description: 'Code documentation', Icon: BookOpen },\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 }}>{m.label}</span>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>{m.description}</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 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 size={14} style={{ flexShrink: 0, marginTop: 2 }} color={theme.colors.warning} />\n <div>\n <strong style={{ color: theme.colors.text }}>Using private npm packages?</strong>\n <br />\n Add <code style={{ backgroundColor: theme.colors.background, padding: '1px 4px', borderRadius: 3 }}>NPM_TOKEN</code> 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 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 size={14} style={{ flexShrink: 0, marginTop: 2 }} color={theme.colors.warning} />\n <div>\n <strong style={{ color: theme.colors.text }}>Private npm packages?</strong>\n <br />\n If your project uses private @org packages, add <code style={{ backgroundColor: theme.colors.background, padding: '1px 4px', borderRadius: 3 }}>NPM_TOKEN</code> to your GitHub repository secrets under Settings → Secrets → 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 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}\n\n// Slice data shape\ninterface QualitySliceData {\n packages: PackageQuality[];\n lastUpdated: string;\n}\n\n// Metric to colorMode mapping for File City\nconst METRIC_TO_COLOR_MODE: Record<string, string> = {\n types: 'typescript',\n documentation: 'alexandria',\n tests: 'coverage',\n deadCode: 'knip',\n formatting: 'prettier',\n linting: 'eslint',\n};\n\n/**\n * QualityHexagonPanelContent - Internal component that uses theme\n */\nconst QualityHexagonPanelContent: React.FC<PanelComponentProps> = ({\n context,\n events,\n}) => {\n const { theme } = useTheme();\n const [refreshingPackages, setRefreshingPackages] = React.useState<Set<string>>(new Set());\n 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<{ allFiles?: Array<{ relativePath?: string; path?: string }> }>('fileTree');\n const hasWorkflow = React.useMemo(() => {\n return checkFileExistsInTree(fileTreeSlice?.data ?? undefined, WORKFLOW_FILE_PATH);\n }, [fileTreeSlice?.data]);\n\n // Determine packages to display\n // - If slice exists and has data, use it\n // - If slice exists but is loading/empty, show empty\n // - If no slice at all, use mock data for demo\n const packages: PackageQuality[] = React.useMemo(() => {\n if (qualitySlice?.data?.packages) {\n return qualitySlice.data.packages;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet (loading or empty)\n return [];\n }\n // No slice - use mock for demo\n return mockPackages;\n }, [qualitySlice?.data?.packages, hasQualitySlice]);\n\n // Handle refresh for a specific package\n const handleRefreshPackage = async (packageName: string) => {\n setRefreshingPackages(prev => new Set(prev).add(packageName));\n try {\n if (context.hasSlice('quality')) {\n // In future, this could refresh just one package\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(prev => {\n const next = new Set(prev);\n next.delete(packageName);\n return next;\n });\n }\n };\n\n // Handle refresh all\n const handleRefreshAll = async () => {\n const allNames = packages.map(p => p.name);\n setRefreshingPackages(new Set(allNames));\n try {\n if (context.hasSlice('quality')) {\n await context.refresh('repository', 'quality');\n }\n } finally {\n setRefreshingPackages(new Set());\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on('principal-ade.quality-panel:refresh', async () => {\n await handleRefreshAll();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context, packages]);\n\n // Tier colors for display\n const tierColors: Record<QualityTier, string> = {\n none: '#808080',\n bronze: '#CD7F32',\n silver: '#C0C0C0',\n gold: '#FFD700',\n platinum: '#E5E4E2',\n };\n\n // Calculate overall tier from all packages\n const overallTier = packages.length > 0\n ? calculateQualityTier(\n packages.reduce((acc, pkg) => ({\n tests: acc.tests + pkg.metrics.tests / packages.length,\n deadCode: acc.deadCode + pkg.metrics.deadCode / packages.length,\n linting: acc.linting + pkg.metrics.linting / packages.length,\n formatting: acc.formatting + pkg.metrics.formatting / packages.length,\n types: acc.types + pkg.metrics.types / packages.length,\n documentation: acc.documentation + pkg.metrics.documentation / packages.length,\n }), { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 })\n )\n : 'none';\n\n return (\n <div\n style={{\n fontFamily: theme.fonts.body,\n height: '100%',\n minHeight: 0,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n overflowY: 'auto',\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n }}\n >\n {/* Header */}\n <div 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 <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 style={{\n fontSize: 13,\n color: theme.colors.textMuted,\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 style={{ display: 'flex', flexWrap: 'wrap', gap: 16, minHeight: 0 }}>\n {isLoading ? (\n <div style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}>\n Loading quality metrics...\n </div>\n ) : packages.length === 0 ? (\n <QualityEmptyState\n theme={theme}\n hasWorkflow={hasWorkflow}\n />\n ) : (\n packages.map((pkg) => {\n const tier = calculateQualityTier(pkg.metrics);\n // 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 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 packagePath: info.packagePath ?? '',\n packageName: info.packageName,\n } : null,\n });\n }}\n onMetricClick={(metric) => {\n // Emit colorMode event for File City\n const colorMode = METRIC_TO_COLOR_MODE[metric];\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 style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n }}>\n <h3 style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 600,\n color: theme.colors.text,\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 style={{\n fontSize: 13,\n color: theme.colors.textMuted,\n margin: '0 0 12px 0',\n }}>\n Run quality checks locally with the CLI:\n </p>\n\n {[\n { cmd: 'npx @principal-ai/quality-lens-cli init', label: 'Initialize quality lens in your project' },\n { cmd: 'npx @principal-ai/quality-lens-cli list', label: 'List available quality lenses' },\n ].map(({ cmd, label }) => (\n <div key={cmd} style={{ marginBottom: 12 }}>\n <span style={{ fontSize: 11, color: theme.colors.textMuted }}>{label}</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 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 <strong style={{ color: theme.colors.text }}>Tiers:</strong>\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 4 }}>\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 { QualityHexagon, calculateQualityTier, type QualityTier, type VertexHoverInfo, type MetricKey } from './QualityHexagon';\n\nexport type { VertexHoverInfo, MetricKey };\n\nconst METRIC_OPTIONS: Array<{ key: MetricKey; label: string }> = [\n { key: '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(repositories: RepositoryQualityItem[]): FlatGridItem[] {\n const items: FlatGridItem[] = [];\n\n for (const repo of repositories) {\n for (const pkg of repo.packages) {\n items.push({\n key: `${repo.id}:${pkg.name}`,\n repositoryId: repo.id,\n repositoryName: repo.name,\n 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: acc.documentation + item.metrics.documentation / items.length,\n }),\n { tests: 0, deadCode: 0, linting: 0, formatting: 0, types: 0, documentation: 0 }\n );\n\n return calculateQualityTier(avgMetrics);\n}\n\n/**\n * Format the display label for an item\n */\nfunction formatLabel(\n item: FlatGridItem,\n showRepositoryName: boolean,\n isSameAsRepo: boolean\n): string {\n if (!showRepositoryName || isSameAsRepo) {\n return item.packageName;\n }\n return `${item.repositoryName} / ${item.packageName}`;\n}\n\n/**\n * Individual grid item component\n */\n// Get color based on value (good/medium/poor)\nfunction getValueColor(value: number, key: MetricKey): 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] = 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={onVertexClick ? (vertex) => onVertexClick(item, vertex) : undefined}\n />\n </div>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 2,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: theme.colors.text,\n textAlign: 'center',\n }}\n >\n {label}\n </span>\n {item.version && (\n <span\n style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n }}\n >\n v{item.version}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * RepositoryQualityGrid - Displays a flat grid of quality hexagons\n * for multiple repositories and their packages.\n *\n * Each hexagon shows the quality metrics for a single package,\n * labeled with \"repo / package\" format for clarity.\n */\n// Calculate average score for an item (with deadCode inverted)\nfunction calculateAverageScore(metrics: QualityMetrics): number {\n const adjusted = { ...metrics };\n adjusted.deadCode = 100 - adjusted.deadCode;\n return Object.values(adjusted).reduce((a, b) => a + b, 0) / 6;\n}\n\nexport function RepositoryQualityGrid({\n repositories,\n theme,\n onItemClick,\n onVertexClick,\n className,\n showRepositoryName = true,\n showSummary = true,\n}: RepositoryQualityGridProps) {\n const [selectedMetric, setSelectedMetric] = React.useState<MetricKey | null>(null);\n const items = React.useMemo(() => flattenRepositories(repositories), [repositories]);\n const overallTier = React.useMemo(() => calculateOverallTier(items), [items]);\n\n // Sort items alphabetically by package name\n const sortedItems = React.useMemo(() => {\n return [...items].sort((a, b) => a.packageName.localeCompare(b.packageName));\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} {repositories.length === 1 ? 'repository' : 'repositories'}\n </span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>\n {/* Metric dropdown */}\n <select\n value={selectedMetric ?? ''}\n onChange={(e) => setSelectedMetric(e.target.value ? e.target.value as MetricKey : null)}\n style={{\n padding: '4px 8px',\n fontSize: 13,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: 4,\n cursor: 'pointer',\n outline: 'none',\n }}\n >\n <option value=\"\">Select metric...</option>\n {METRIC_OPTIONS.map((option) => (\n <option key={option.key} value={option.key}>\n {option.label}\n </option>\n ))}\n </select>\n {/* Tier badge */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 12px',\n backgroundColor: theme.colors.backgroundLight,\n borderRadius: 16,\n border: `1px solid ${tierColors[overallTier]}`,\n }}\n >\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: tierColors[overallTier],\n }}\n />\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: tierColors[overallTier],\n }}\n >\n {tierLabels[overallTier]}\n </span>\n </div>\n </div>\n </div>\n )}\n\n {/* Grid of Items */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))',\n gap: 12,\n padding: 16,\n }}\n >\n {sortedItems.map((item) => (\n <RepositoryQualityGridItem\n key={item.key}\n item={item}\n theme={theme}\n onClick={onItemClick ? () => onItemClick(item) : undefined}\n onVertexClick={onVertexClick}\n showRepositoryName={showRepositoryName}\n selectedMetric={selectedMetric}\n />\n ))}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { PanelComponentProps } from '../types';\nimport type { QualityMetrics } from '@principal-ai/codebase-composition';\nimport {\n RepositoryQualityGrid,\n type RepositoryQualityItem,\n type FlatGridItem,\n type VertexHoverInfo,\n} from '../components/RepositoryQualityGrid';\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>(null);\n\n // Get repositories quality data from context if available\n const qualitySlice = context.getSlice<RepositoriesQualitySliceData>('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 ? null : {\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 ? null : (item.repositoryPath ? {\n packagePath: item.repositoryPath,\n packageName: item.packageName,\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 } | null;\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(results: LensResult[]): 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': return '#ef4444';\n case 'warning': return '#f59e0b';\n case 'info': return '#3b82f6';\n case 'hint': return '#6b7280';\n default: return '#6b7280';\n }\n}\n\nfunction getSeverityBg(severity: string): string {\n switch (severity) {\n case 'error': return 'rgba(239, 68, 68, 0.1)';\n case 'warning': return 'rgba(245, 158, 11, 0.1)';\n case 'info': return 'rgba(59, 130, 246, 0.1)';\n case 'hint': return 'rgba(107, 114, 128, 0.1)';\n default: 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 { totalErrors, totalWarnings, passCount, failCount, lensCount: results.length };\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(() => groupResultsByPackage(data?.results ?? []), [data?.results]);\n const packageNames = React.useMemo(() => Array.from(packageGroups.keys()), [packageGroups]);\n\n const [selectedPackage, setSelectedPackage] = React.useState<string | null>(\n initialSelectedPackage || (packageNames.length === 1 ? packageNames[0] : null)\n );\n const [expandedLens, setExpandedLens] = React.useState<string | null>(null);\n const [expandedFiles, setExpandedFiles] = React.useState<Set<string>>(new Set());\n\n const handlePackageSelect = (pkg: string) => {\n setSelectedPackage(pkg);\n setExpandedLens(null);\n setExpandedFiles(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 selectedResults = selectedPackage ? packageGroups.get(selectedPackage) || [] : [];\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 {/* Package Selector */}\n {packageNames.length > 1 && (\n <div style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 8,\n marginBottom: 8,\n }}>\n {packageNames.map((pkg) => {\n const summary = getPackageSummary(packageGroups.get(pkg) || []);\n const isSelected = selectedPackage === pkg;\n\n return (\n <button\n key={pkg}\n onClick={() => handlePackageSelect(pkg)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n border: `1px solid ${isSelected ? theme.colors.primary : theme.colors.border}`,\n backgroundColor: isSelected ? theme.colors.surface : 'transparent',\n color: theme.colors.text,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n }}\n >\n <span style={{ fontWeight: 500 }}>{pkg}</span>\n <span style={{\n fontSize: 11,\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: summary.totalErrors > 0\n ? getSeverityBg('error')\n : summary.totalWarnings > 0\n ? getSeverityBg('warning')\n : 'rgba(34, 197, 94, 0.1)',\n color: summary.totalErrors > 0\n ? getSeverityColor('error')\n : summary.totalWarnings > 0\n ? getSeverityColor('warning')\n : '#22c55e',\n }}>\n {summary.passCount}/{summary.lensCount} pass\n </span>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Single Package Header (when only one package) */}\n {packageNames.length === 1 && (\n <div 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 <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {packageNames[0]}\n </span>\n {(() => {\n const summary = getPackageSummary(selectedResults);\n return (\n <span style={{\n fontSize: 11,\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: summary.totalErrors > 0\n ? getSeverityBg('error')\n : summary.totalWarnings > 0\n ? getSeverityBg('warning')\n : 'rgba(34, 197, 94, 0.1)',\n color: summary.totalErrors > 0\n ? getSeverityColor('error')\n : summary.totalWarnings > 0\n ? getSeverityColor('warning')\n : '#22c55e',\n }}>\n {summary.passCount}/{summary.lensCount} pass\n </span>\n );\n })()}\n </div>\n )}\n\n {/* No Package Selected */}\n {!selectedPackage && packageNames.length > 1 && (\n <div style={{\n padding: 24,\n textAlign: 'center',\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: 6,\n }}>\n Select a package above to view lens results\n </div>\n )}\n\n {/* Lens Results for Selected Package */}\n {selectedPackage && 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 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 {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 style={{\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg('error'),\n color: getSeverityColor('error'),\n }}>\n {result.metrics?.issuesBySeverity?.error ?? 0} errors\n </span>\n )}\n {(result.metrics?.issuesBySeverity?.warning ?? 0) > 0 && (\n <span style={{\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 11,\n backgroundColor: getSeverityBg('warning'),\n color: getSeverityColor('warning'),\n }}>\n {result.metrics?.issuesBySeverity?.warning ?? 0} 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 style={{\n padding: 12,\n backgroundColor: theme.colors.backgroundLight,\n borderTop: `1px solid ${theme.colors.border}`,\n }}>\n {/* Metrics Summary */}\n <div style={{\n display: 'grid',\n gridTemplateColumns: '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 <div>\n <div style={{ fontSize: 11, color: theme.colors.textMuted }}>Files Analyzed</div>\n <div style={{ fontSize: 16, fontWeight: 600, color: theme.colors.text }}>\n {result.metrics?.filesAnalyzed ?? 0}\n </div>\n </div>\n <div>\n <div style={{ fontSize: 11, color: theme.colors.textMuted }}>Total Issues</div>\n <div style={{ fontSize: 16, fontWeight: 600, color: theme.colors.text }}>\n {result.metrics?.totalIssues ?? 0}\n </div>\n </div>\n <div>\n <div style={{ fontSize: 11, color: theme.colors.textMuted }}>Duration</div>\n <div style={{ fontSize: 16, fontWeight: 600, color: theme.colors.text }}>\n {result.execution?.duration ?? 0}ms\n </div>\n </div>\n {result.coverage && (\n <div>\n <div style={{ fontSize: 11, color: theme.colors.textMuted }}>Coverage</div>\n <div style={{ fontSize: 16, fontWeight: 600, color: theme.colors.text }}>\n {result.coverage.line}%\n </div>\n </div>\n )}\n </div>\n\n {/* Files with Issues */}\n {filesWithIssues.size > 0 ? (\n <div>\n <div style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}>\n Files with Issues ({filesWithIssues.size})\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {Array.from(filesWithIssues.entries()).map(([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 style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\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 ? '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\n style={{\n color: theme.colors.text,\n cursor: onFileClick ? 'pointer' : '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 style={{\n fontSize: 11,\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: getSeverityBg('error'),\n color: getSeverityColor('error'),\n }}>\n {issues.length} issues\n </span>\n </div>\n\n {/* Issues list */}\n {isFileExpanded && (\n <div style={{\n padding: 8,\n backgroundColor: theme.colors.background,\n borderTop: `1px solid ${theme.colors.border}`,\n maxHeight: 300,\n overflow: 'auto',\n }}>\n {issues.map((issue, issueIdx) => (\n <div\n key={issueIdx}\n onClick={() => onFileClick?.(file, issue.line)}\n style={{\n display: 'flex',\n gap: 8,\n padding: '6px 8px',\n borderRadius: 4,\n cursor: onFileClick ? 'pointer' : 'default',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = theme.colors.surface;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <span style={{\n fontSize: 11,\n color: theme.colors.textMuted,\n minWidth: 45,\n }}>\n L{issue.line}\n </span>\n <span style={{\n fontSize: 10,\n padding: '1px 4px',\n borderRadius: 3,\n backgroundColor: getSeverityBg(issue.severity),\n color: getSeverityColor(issue.severity),\n textTransform: 'uppercase',\n }}>\n {issue.severity.charAt(0)}\n </span>\n <span style={{\n flex: 1,\n fontSize: 12,\n color: theme.colors.text,\n }}>\n {issue.message}\n </span>\n {issue.rule && (\n <span style={{\n fontSize: 10,\n color: theme.colors.textMuted,\n opacity: 0.7,\n }}>\n {issue.rule}\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n ) : (\n <div style={{\n padding: 16,\n textAlign: 'center',\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\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 style={{\n fontSize: 12,\n fontWeight: 600,\n color: theme.colors.textMuted,\n marginBottom: 8,\n }}>\n File Metrics ({result.fileMetrics.length})\n </div>\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 8,\n backgroundColor: theme.colors.surface,\n borderRadius: 4,\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 style={{ color: theme.colors.text, fontSize: 12 }}>\n {fm.file}\n </span>\n <span style={{\n fontSize: 12,\n fontWeight: 500,\n color: fm.score >= 80 ? '#22c55e' : fm.score >= 60 ? '#f59e0b' : '#ef4444',\n }}>\n {fm.score}%\n </span>\n </div>\n ))}\n </div>\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/**\n * LensDataDebugPanelContent - Internal component that uses theme\n */\nconst LensDataDebugPanelContent: React.FC<PanelComponentProps> = ({\n context,\n actions,\n}) => {\n const { theme } = useTheme();\n\n // Get lens results data from context\n const lensResultsSlice = context.getSlice<LensResultsSliceData>('lensResults');\n const hasSlice = context.hasSlice('lensResults');\n const isLoading = lensResultsSlice?.loading ?? false;\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 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 <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 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, fontSize: 11, color: theme.colors.textMuted }}>\n <span>{new Set(lensResultsSlice.data.results.map(r => r.package?.name ?? 'unknown')).size} packages</span>\n <span>{lensResultsSlice.data.results.length} results</span>\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 style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}>\n Loading lens results...\n </div>\n ) : !hasSlice || !lensResultsSlice?.data ? (\n <div style={{\n padding: 40,\n textAlign: 'center',\n color: theme.colors.textMuted,\n }}>\n <Bug size={48} color={theme.colors.border} style={{ marginBottom: 16 }} />\n <div style={{ fontSize: 14, marginBottom: 8 }}>No lens data available</div>\n <div style={{ fontSize: 12 }}>\n Run quality-lens-cli or check that the lensResults slice is configured.\n </div>\n </div>\n ) : (\n <LensDataDebugPanelComponent\n data={lensResultsSlice.data}\n theme={theme}\n onFileClick={handleFileClick}\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 { key: 'types', label: 'Types', description: 'Type safety score' },\n { key: 'documentation', label: 'Documentation', description: 'Documentation coverage' },\n { key: 'tests', label: 'Tests', description: 'Test coverage and passing rate' },\n { key: 'deadCode', label: 'Dead Code', description: 'Unused code detected' },\n { key: 'formatting', label: 'Formatting', description: 'Code formatting consistency' },\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 = 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 (context.hasSlice('repositoriesQuality') && !context.isSliceLoading('repositoriesQuality')) {\n await context.refresh('workspace', 'repositoriesQuality');\n }\n },\n\n onUnmount: async (_context: PanelContextValue) => {\n console.log('Repository Quality Grid Panel unmounting');\n },\n },\n {\n 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 (context.hasSlice('lensResults') && !context.isSliceLoading('lensResults')) {\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 {\n QualityMetricsList,\n QualityMetricsListCompact,\n} 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]}
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/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\n// src/themes.ts\nvar regalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#f1e8dc\",\n background: \"#1a1f2e\",\n primary: \"#d4a574\",\n secondary: \"#e0b584\",\n accent: \"#c9b8a3\",\n highlight: \"rgba(212, 165, 116, 0.15)\",\n muted: \"#8b7968\",\n success: \"#5c8a72\",\n warning: \"#d4a574\",\n error: \"#a85751\",\n info: \"#d4a574\",\n border: \"rgba(212, 165, 116, 0.2)\",\n backgroundSecondary: \"#212738\",\n backgroundTertiary: \"#2d3446\",\n backgroundLight: \"rgba(212, 165, 116, 0.08)\",\n backgroundHover: \"rgba(212, 165, 116, 0.15)\",\n surface: \"#212738\",\n textSecondary: \"#c9b8a3\",\n textTertiary: \"#8b7968\",\n textMuted: \"#8b7968\",\n highlightBg: \"rgba(255, 193, 7, 0.25)\",\n highlightBorder: \"rgba(255, 193, 7, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"background\",\n bg: \"primary\",\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"text\",\n bg: \"muted\",\n \"&:hover\": {\n bg: \"backgroundSecondary\"\n }\n },\n ghost: {\n color: \"primary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"muted\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"background\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 2\n }\n }\n};\nvar terminalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n heading: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace',\n monospace: '\"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.4,\n relaxed: 1.8\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px 0 rgba(0, 0, 0, 0.07)\",\n \"0 8px 12px 0 rgba(0, 0, 0, 0.08)\",\n \"0 16px 24px 0 rgba(0, 0, 0, 0.10)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#e4e4e4\",\n background: \"rgba(10, 10, 10, 0.85)\",\n primary: \"#66b3ff\",\n secondary: \"#80c4ff\",\n accent: \"#66ff99\",\n highlight: \"rgba(102, 179, 255, 0.15)\",\n muted: \"rgba(26, 26, 26, 0.8)\",\n success: \"#66ff99\",\n warning: \"#ffcc66\",\n error: \"#ff6666\",\n info: \"#66b3ff\",\n border: \"rgba(255, 255, 255, 0.1)\",\n backgroundSecondary: \"rgba(15, 15, 15, 0.9)\",\n backgroundTertiary: \"rgba(20, 20, 20, 0.9)\",\n backgroundLight: \"rgba(255, 255, 255, 0.05)\",\n backgroundHover: \"rgba(102, 179, 255, 0.08)\",\n surface: \"rgba(15, 15, 15, 0.95)\",\n textSecondary: \"rgba(255, 255, 255, 0.7)\",\n textTertiary: \"rgba(255, 255, 255, 0.5)\",\n textMuted: \"rgba(255, 255, 255, 0.4)\",\n highlightBg: \"rgba(255, 235, 59, 0.25)\",\n highlightBorder: \"rgba(255, 235, 59, 0.5)\"\n },\n modes: {\n light: {\n text: \"#1a1a1a\",\n background: \"rgba(255, 255, 255, 0.9)\",\n primary: \"#0066cc\",\n secondary: \"#0052a3\",\n accent: \"#00cc88\",\n highlight: \"rgba(0, 102, 204, 0.08)\",\n muted: \"rgba(245, 245, 245, 0.8)\",\n success: \"#00cc88\",\n warning: \"#ffaa00\",\n error: \"#ff3333\",\n info: \"#0066cc\",\n border: \"rgba(0, 0, 0, 0.1)\",\n backgroundSecondary: \"rgba(250, 250, 250, 0.9)\",\n backgroundTertiary: \"rgba(245, 245, 245, 0.9)\",\n backgroundLight: \"rgba(0, 0, 0, 0.02)\",\n backgroundHover: \"rgba(0, 102, 204, 0.04)\",\n surface: \"rgba(255, 255, 255, 0.95)\",\n textSecondary: \"rgba(0, 0, 0, 0.6)\",\n textTertiary: \"rgba(0, 0, 0, 0.4)\",\n textMuted: \"rgba(0, 0, 0, 0.3)\",\n highlightBg: \"rgba(255, 235, 59, 0.3)\",\n highlightBorder: \"rgba(255, 235, 59, 0.6)\"\n }\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\nvar matrixTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 0 5px rgba(0, 216, 53, 0.15)\",\n \"0 0 10px rgba(0, 216, 53, 0.2)\",\n \"0 0 15px rgba(0, 216, 53, 0.25)\",\n \"0 0 20px rgba(0, 216, 53, 0.3)\",\n \"0 0 30px rgba(0, 216, 53, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#00d835\",\n secondary: \"#00a828\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.15)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(0, 216, 53, 0.2)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(0, 216, 53, 0.03)\",\n backgroundHover: \"rgba(0, 216, 53, 0.08)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.25)\",\n highlightBorder: \"rgba(0, 216, 53, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"highlight\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar matrixMinimalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n heading: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace',\n monospace: '\"Courier New\", \"Courier\", \"Lucida Console\", \"Monaco\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 500,\n bold: 600,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.3,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n \"0 2px 4px rgba(0, 0, 0, 0.1)\",\n \"0 4px 8px rgba(0, 0, 0, 0.15)\",\n \"0 8px 16px rgba(0, 0, 0, 0.2)\",\n \"0 0 20px rgba(0, 216, 53, 0.1)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#a8a8a8\",\n background: \"#000000\",\n primary: \"#b8b8b8\",\n secondary: \"#909090\",\n accent: \"#00d835\",\n highlight: \"rgba(0, 216, 53, 0.1)\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"rgba(184, 184, 184, 0.1)\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"rgba(184, 184, 184, 0.02)\",\n backgroundHover: \"rgba(0, 216, 53, 0.05)\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"rgba(0, 216, 53, 0.2)\",\n highlightBorder: \"rgba(0, 216, 53, 0.4)\"\n },\n buttons: {\n primary: {\n color: \"black\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"secondary\"\n }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 0\n }\n }\n};\nvar slateTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.3,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.2)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.2)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.2)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.25)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.3)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#9ca3af\",\n background: \"#1a1c1e\",\n primary: \"#d1d5db\",\n secondary: \"#6b7280\",\n accent: \"#f59e0b\",\n highlight: \"rgba(209, 213, 219, 0.15)\",\n muted: \"#2d3134\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n border: \"rgba(156, 163, 175, 0.15)\",\n backgroundSecondary: \"#22252a\",\n backgroundTertiary: \"#2d3134\",\n backgroundLight: \"rgba(156, 163, 175, 0.05)\",\n backgroundHover: \"rgba(156, 163, 175, 0.1)\",\n surface: \"#1f2124\",\n textSecondary: \"#e5e7eb\",\n textTertiary: \"#6b7280\",\n textMuted: \"#4b5563\",\n highlightBg: \"rgba(245, 158, 11, 0.25)\",\n highlightBorder: \"rgba(245, 158, 11, 0.5)\"\n },\n buttons: {\n primary: {\n color: \"#1a1c1e\",\n bg: \"primary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#9ca3af\"\n }\n },\n secondary: {\n color: \"#e5e7eb\",\n bg: \"secondary\",\n borderWidth: 0,\n \"&:hover\": {\n bg: \"#4b5563\"\n }\n },\n ghost: {\n color: \"textSecondary\",\n bg: \"transparent\",\n \"&:hover\": {\n bg: \"backgroundHover\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"textSecondary\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textTertiary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 3\n }\n }\n};\n// src/ThemeProvider.tsx\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\n\n// src/themeHelpers.ts\nfunction overrideColors(theme, colors) {\n return {\n ...theme,\n colors: {\n ...theme.colors,\n ...colors\n }\n };\n}\nfunction makeTheme(baseTheme, overrides) {\n return {\n ...baseTheme,\n ...overrides,\n colors: {\n ...baseTheme.colors,\n ...overrides.colors\n },\n fonts: {\n ...baseTheme.fonts,\n ...overrides.fonts\n }\n };\n}\nfunction addMode(theme, modeName, colors, baseMode) {\n let baseColors;\n if (baseMode && theme.modes && theme.modes[baseMode]) {\n baseColors = {\n ...theme.colors,\n ...theme.modes[baseMode]\n };\n } else {\n baseColors = theme.colors;\n }\n const newMode = {\n ...baseColors,\n ...colors\n };\n return {\n ...theme,\n modes: {\n ...theme.modes,\n [modeName]: newMode\n }\n };\n}\nfunction getMode(theme, mode) {\n if (!mode || !theme.modes || !theme.modes[mode]) {\n return theme.colors;\n }\n return {\n ...theme.colors,\n ...theme.modes[mode]\n };\n}\n\n// src/ThemeProvider.tsx\nvar ThemeContext;\nvar getThemeContext = () => {\n if (typeof window !== \"undefined\") {\n const globalWindow = window;\n if (!globalWindow.__principlemd_theme_context__) {\n globalWindow.__principlemd_theme_context__ = createContext(undefined);\n }\n return globalWindow.__principlemd_theme_context__;\n } else {\n if (!ThemeContext) {\n ThemeContext = createContext(undefined);\n }\n return ThemeContext;\n }\n};\nvar ThemeContextSingleton = getThemeContext();\nvar useTheme = () => {\n const context = useContext(ThemeContextSingleton);\n if (!context) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return context;\n};\nvar ThemeProvider = ({\n children,\n theme: customTheme = theme,\n initialMode\n}) => {\n const [mode, setMode] = useState(initialMode);\n const activeTheme = React.useMemo(() => {\n if (!mode || !customTheme.modes || !customTheme.modes[mode]) {\n return customTheme;\n }\n return {\n ...customTheme,\n colors: getMode(customTheme, mode)\n };\n }, [customTheme, mode]);\n useEffect(() => {\n if (!initialMode) {\n const savedMode = localStorage.getItem(\"principlemd-theme-mode\");\n if (savedMode) {\n setMode(savedMode);\n }\n }\n }, [initialMode]);\n useEffect(() => {\n if (mode) {\n localStorage.setItem(\"principlemd-theme-mode\", mode);\n } else {\n localStorage.removeItem(\"principlemd-theme-mode\");\n }\n }, [mode]);\n const value = {\n theme: activeTheme,\n mode,\n setMode\n };\n return /* @__PURE__ */ React.createElement(ThemeContextSingleton.Provider, {\n value\n }, children);\n};\nvar withTheme = (Component) => {\n return (props) => {\n const { theme: theme2 } = useTheme();\n return /* @__PURE__ */ React.createElement(Component, {\n ...props,\n theme: theme2\n });\n };\n};\n// src/utils.ts\nvar getColor = (theme2, colorKey) => {\n const colors = theme2.colors;\n const value = colors[colorKey];\n return typeof value === \"string\" ? value : colorKey;\n};\nvar getSpace = (theme2, index) => {\n return theme2.space[index] || 0;\n};\nvar getFontSize = (theme2, index) => {\n return theme2.fontSizes[index] || theme2.fontSizes[2];\n};\nvar getRadius = (theme2, index) => {\n return theme2.radii[index] || 0;\n};\nvar getShadow = (theme2, index) => {\n return theme2.shadows[index] || \"none\";\n};\nvar getZIndex = (theme2, index) => {\n return theme2.zIndices[index] || 0;\n};\nvar responsive = (values) => {\n return values.reduce((acc, value, index) => {\n if (index === 0) {\n return value;\n }\n return {\n ...acc,\n [`@media screen and (min-width: ${values[index - 1]})`]: value\n };\n }, {});\n};\nvar sx = (styles) => styles;\nvar createStyle = (theme2, styleObj) => {\n const processValue = (value) => {\n if (typeof value === \"string\") {\n if (value in theme2.colors) {\n return getColor(theme2, value);\n }\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (typeof value === \"object\" && value !== null) {\n const processed2 = {};\n for (const [key, val] of Object.entries(value)) {\n processed2[key] = processValue(val);\n }\n return processed2;\n }\n return value;\n };\n const processed = {};\n for (const [key, val] of Object.entries(styleObj)) {\n processed[key] = processValue(val);\n }\n return processed;\n};\nvar mergeThemes = (baseTheme, ...overrides) => {\n return overrides.reduce((theme2, override) => ({\n space: override.space || theme2.space,\n fonts: { ...theme2.fonts, ...override.fonts || {} },\n fontSizes: override.fontSizes || theme2.fontSizes,\n fontWeights: { ...theme2.fontWeights, ...override.fontWeights || {} },\n lineHeights: { ...theme2.lineHeights, ...override.lineHeights || {} },\n breakpoints: override.breakpoints || theme2.breakpoints,\n sizes: override.sizes || theme2.sizes,\n radii: override.radii || theme2.radii,\n shadows: override.shadows || theme2.shadows,\n zIndices: override.zIndices || theme2.zIndices,\n colors: {\n ...theme2.colors,\n ...override.colors || {}\n },\n buttons: { ...theme2.buttons, ...override.buttons || {} },\n text: { ...theme2.text, ...override.text || {} },\n cards: { ...theme2.cards, ...override.cards || {} }\n }), baseTheme);\n};\n// src/ThemeShowcase.tsx\nimport React2 from \"react\";\nvar ThemeShowcase = ({\n theme: theme2,\n title,\n showValues = true,\n sections = [\"colors\", \"typography\", \"spacing\", \"shadows\", \"radii\"]\n}) => {\n const containerStyle = {\n fontFamily: theme2.fonts.body,\n color: theme2.colors.text,\n backgroundColor: theme2.colors.background,\n padding: theme2.space[4],\n minHeight: \"100vh\"\n };\n const sectionStyle = {\n marginBottom: theme2.space[5],\n padding: theme2.space[4],\n backgroundColor: theme2.colors.surface || theme2.colors.backgroundSecondary,\n borderRadius: theme2.radii[2],\n border: `1px solid ${theme2.colors.border}`\n };\n const headingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[5],\n fontWeight: theme2.fontWeights.heading,\n marginBottom: theme2.space[3],\n color: theme2.colors.primary\n };\n const subheadingStyle = {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[3],\n fontWeight: theme2.fontWeights.medium,\n marginBottom: theme2.space[2],\n marginTop: theme2.space[3],\n color: theme2.colors.text\n };\n return /* @__PURE__ */ React2.createElement(\"div\", {\n style: containerStyle\n }, title && /* @__PURE__ */ React2.createElement(\"h1\", {\n style: {\n ...headingStyle,\n fontSize: theme2.fontSizes[6],\n marginBottom: theme2.space[4]\n }\n }, title), sections.includes(\"colors\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Colors\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Primary Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"text\", \"background\", \"primary\", \"secondary\", \"accent\", \"muted\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Status Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3],\n marginBottom: theme2.space[3]\n }\n }, [\"success\", \"warning\", \"error\", \"info\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n padding: theme2.space[2],\n backgroundColor: theme2.colors.backgroundLight || theme2.colors.backgroundTertiary,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 40,\n height: 40,\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1],\n marginRight: theme2.space[2]\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", null, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, color)));\n })), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Background Colors\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(200px, 1fr))\",\n gap: theme2.space[3]\n }\n }, [\"backgroundSecondary\", \"backgroundTertiary\", \"backgroundLight\", \"backgroundHover\", \"surface\"].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n padding: theme2.space[3],\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary,\n marginTop: theme2.space[1]\n }\n }, color));\n }))), sections.includes(\"typography\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Typography\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Families\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[4],\n marginBottom: theme2.space[2]\n }\n }, \"Heading Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.heading)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[2],\n marginBottom: theme2.space[2]\n }\n }, \"Body Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.body)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[2]\n }\n }, \"Monospace Font: \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.monospace))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Sizes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, theme2.fontSizes.map((size, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: {\n fontSize: size,\n lineHeight: theme2.lineHeights.body,\n marginBottom: theme2.space[1]\n }\n }, \"Size \", index, \": Sample Text \", showValues && `(${size}px)`))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Weights\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: theme2.space[2]\n }\n }, Object.entries(theme2.fontWeights).map(([name, weight]) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: name,\n style: {\n fontWeight: weight,\n fontSize: theme2.fontSizes[2]\n }\n }, name, \" \", showValues && `(${weight})`)))), sections.includes(\"spacing\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Spacing\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: theme2.space[2] }\n }, theme2.space.map((space, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { display: \"flex\", alignItems: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 60,\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"]\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n height: 24,\n width: space,\n backgroundColor: theme2.colors.primary,\n borderRadius: theme2.radii[1]\n }\n }), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n marginLeft: theme2.space[2],\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, space, \"px\"))))), sections.includes(\"radii\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Border Radii\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n gap: theme2.space[3]\n }\n }, theme2.radii.map((radius, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 80,\n height: 80,\n backgroundColor: theme2.colors.primary,\n borderRadius: radius,\n marginBottom: theme2.space[1],\n margin: \"0 auto\"\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"] \", showValues && `${radius}px`))))), sections.includes(\"shadows\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Shadows\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: theme2.space[4]\n }\n }, theme2.shadows.map((shadow, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 100,\n height: 100,\n backgroundColor: theme2.colors.background,\n boxShadow: shadow,\n borderRadius: theme2.radii[2],\n margin: \"0 auto\",\n marginBottom: theme2.space[2],\n border: `1px solid ${theme2.colors.border}`\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"Shadow [\", index, \"]\"), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textMuted,\n marginTop: theme2.space[1]\n }\n }, shadow === \"none\" ? \"none\" : \"...\"))))), theme2.modes && Object.keys(theme2.modes).length > 0 && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Available Modes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"flex\",\n gap: theme2.space[2],\n flexWrap: \"wrap\"\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.primary,\n color: \"#ffffff\",\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, \"default\"), Object.keys(theme2.modes).map((modeName) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: modeName,\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.secondary,\n color: theme2.colors.text,\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, modeName)))));\n};\n\n// src/index.ts\nvar theme = terminalTheme;\nfunction scaleThemeFonts(theme2, scale) {\n const currentScale = theme2.fontScale || 1;\n const effectiveScale = scale / currentScale;\n return {\n ...theme2,\n fontSizes: theme2.fontSizes.map((size) => Math.round(size * effectiveScale)),\n fontScale: scale\n };\n}\nfunction increaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.min(currentScale * 1.1, 2);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction decreaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.max(currentScale * 0.9, 0.5);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction resetFontScale(theme2) {\n return scaleThemeFonts(theme2, 1);\n}\nvar src_default = theme;\nexport {\n withTheme,\n useTheme,\n theme,\n terminalTheme,\n sx,\n slateTheme,\n scaleThemeFonts,\n responsive,\n resetFontScale,\n regalTheme,\n overrideColors,\n mergeThemes,\n matrixTheme,\n matrixMinimalTheme,\n makeTheme,\n increaseFontScale,\n glassmorphismTheme,\n getZIndex,\n getSpace,\n getShadow,\n getRadius,\n getMode,\n getFontSize,\n getColor,\n defaultTerminalTheme,\n defaultMarkdownTheme,\n defaultEditorTheme,\n src_default as default,\n decreaseFontScale,\n createStyle,\n addMode,\n ThemeShowcase,\n ThemeProvider\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { type ClassValue, clsx } from \"clsx\";\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","import * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { Theme } from \"@principal-ade/industry-theme\";\nimport type { QualityMetrics } from \"@principal-ai/codebase-composition\";\n\nexport type { QualityMetrics };\nexport type QualityTier = \"none\" | \"bronze\" | \"silver\" | \"gold\" | \"platinum\";\nexport type MetricKey =\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// Map lens IDs to hexagon metric keys\nconst LENS_TO_METRIC_MAP: Record<string, MetricKey> = {\n // Linting tools\n eslint: \"linting\",\n biome: \"linting\",\n \"biome-lint\": \"linting\",\n oxlint: \"linting\",\n // Type checking tools\n typescript: \"types\",\n flow: \"types\",\n // Testing tools\n test: \"tests\",\n jest: \"tests\",\n vitest: \"tests\",\n \"bun-test\": \"tests\",\n mocha: \"tests\",\n playwright: \"tests\",\n cypress: \"tests\",\n // Formatting tools\n prettier: \"formatting\",\n \"biome-format\": \"formatting\",\n // Dead code detection\n knip: \"deadCode\",\n depcheck: \"deadCode\",\n // Documentation\n typedoc: \"documentation\",\n jsdoc: \"documentation\",\n alexandria: \"documentation\",\n};\n\n/**\n * Check if a metric has a lens that ran for it\n */\nfunction isMetricConfigured(\n metricKey: MetricKey,\n lensesRan?: string[],\n): boolean {\n // undefined = old data without lensesRan tracking, assume all configured (backwards compatibility)\n if (lensesRan === undefined) {\n return true;\n }\n // Empty array = new data, explicitly no lenses ran for this package\n if (lensesRan.length === 0) {\n return false;\n }\n return lensesRan.some((lensId) => LENS_TO_METRIC_MAP[lensId] === metricKey);\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(key as MetricKey, lensesRan);\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 ? getValueColor(value, key) : 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 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}\n\n// Slice data shape\ninterface QualitySliceData {\n packages: PackageQuality[];\n lastUpdated: string;\n}\n\n// Metric to colorMode mapping for File City\nconst METRIC_TO_COLOR_MODE: Record<string, string> = {\n types: \"typescript\",\n documentation: \"alexandria\",\n tests: \"coverage\",\n deadCode: \"knip\",\n formatting: \"prettier\",\n linting: \"eslint\",\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\n // - If slice exists but is loading/empty, show empty\n // - If no slice at all, use mock data for demo\n const packages: PackageQuality[] = React.useMemo(() => {\n if (qualitySlice?.data?.packages) {\n return qualitySlice.data.packages;\n }\n if (hasQualitySlice) {\n // Slice exists but no data yet (loading or empty)\n return [];\n }\n // No slice - use mock for demo\n return mockPackages;\n }, [qualitySlice?.data?.packages, hasQualitySlice]);\n\n // Handle refresh for a specific package\n const handleRefreshPackage = async (packageName: string) => {\n setRefreshingPackages((prev) => new Set(prev).add(packageName));\n try {\n if (context.hasSlice(\"quality\")) {\n // In future, this could refresh just one package\n await context.refresh(\"repository\", \"quality\");\n }\n } finally {\n setRefreshingPackages((prev) => {\n const next = new Set(prev);\n next.delete(packageName);\n return next;\n });\n }\n };\n\n // Handle refresh all\n const handleRefreshAll = async () => {\n const allNames = packages.map((p) => p.name);\n setRefreshingPackages(new Set(allNames));\n try {\n if (context.hasSlice(\"quality\")) {\n await context.refresh(\"repository\", \"quality\");\n }\n } finally {\n setRefreshingPackages(new Set());\n }\n };\n\n // Subscribe to events\n React.useEffect(() => {\n const unsubscribers = [\n events.on(\"principal-ade.quality-panel:refresh\", async () => {\n await handleRefreshAll();\n }),\n ];\n\n return () => unsubscribers.forEach((unsub) => unsub());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [events, context, packages]);\n\n // Tier colors for display\n const tierColors: Record<QualityTier, string> = {\n none: \"#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 const colorMode = METRIC_TO_COLOR_MODE[metric];\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 } | null;\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\n const handlePackageSelect = (pkg: string) => {\n setSelectedPackage(pkg);\n setExpandedLens(null);\n setExpandedFiles(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 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 {/* Package Selector */}\n {packageNames.length > 1 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 8,\n marginBottom: 8,\n }}\n >\n {packageNames.map((pkg) => {\n const summary = getPackageSummary(packageGroups.get(pkg) || []);\n const isSelected = selectedPackage === pkg;\n\n return (\n <button\n key={pkg}\n onClick={() => handlePackageSelect(pkg)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 6,\n border: `1px solid ${isSelected ? theme.colors.primary : theme.colors.border}`,\n backgroundColor: isSelected\n ? theme.colors.surface\n : \"transparent\",\n color: theme.colors.text,\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n >\n <span style={{ fontWeight: 500 }}>{pkg}</span>\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 </button>\n );\n })}\n </div>\n )}\n\n {/* Single Package Header (when only one package) */}\n {packageNames.length === 1 && (\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 <span style={{ fontWeight: 600, color: theme.colors.text }}>\n {packageNames[0]}\n </span>\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 {/* No Package Selected */}\n {!selectedPackage && packageNames.length > 1 && (\n <div\n style={{\n padding: 24,\n textAlign: \"center\",\n color: theme.colors.textMuted,\n backgroundColor: theme.colors.surface,\n borderRadius: 6,\n }}\n >\n Select a package above to view lens results\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 {/* 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 </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/**\n * LensDataDebugPanelContent - Internal component that uses theme\n */\nconst LensDataDebugPanelContent: React.FC<PanelComponentProps> = ({\n context,\n actions,\n}) => {\n const { theme } = useTheme();\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 // 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 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 11,\n color: theme.colors.textMuted,\n }}\n >\n <span>\n {\n new Set(\n lensResultsSlice.data.results.map(\n (r) => r.package?.name ?? \"unknown\",\n ),\n ).size\n }{\" \"}\n packages\n </span>\n <span>{lensResultsSlice.data.results.length} results</span>\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 />\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]}