@principal-ade/bruno-panels 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +536 -0
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/mocks/panelContext.d.ts +25 -0
  6. package/dist/mocks/panelContext.d.ts.map +1 -0
  7. package/dist/panels/ExamplePanel.d.ts +16 -0
  8. package/dist/panels/ExamplePanel.d.ts.map +1 -0
  9. package/dist/panels/ExamplePanel.stories.d.ts +63 -0
  10. package/dist/panels/ExamplePanel.stories.d.ts.map +1 -0
  11. package/dist/panels/bruno/BrunoPanel.d.ts +6 -0
  12. package/dist/panels/bruno/BrunoPanel.d.ts.map +1 -0
  13. package/dist/panels/bruno/BrunoPanel.stories.d.ts +13 -0
  14. package/dist/panels/bruno/BrunoPanel.stories.d.ts.map +1 -0
  15. package/dist/panels/bruno/components/CollectionTree.d.ts +9 -0
  16. package/dist/panels/bruno/components/CollectionTree.d.ts.map +1 -0
  17. package/dist/panels/bruno/components/RequestEditor.d.ts +8 -0
  18. package/dist/panels/bruno/components/RequestEditor.d.ts.map +1 -0
  19. package/dist/panels/bruno/components/ResponseViewer.d.ts +8 -0
  20. package/dist/panels/bruno/components/ResponseViewer.d.ts.map +1 -0
  21. package/dist/panels/bruno/components/index.d.ts +4 -0
  22. package/dist/panels/bruno/components/index.d.ts.map +1 -0
  23. package/dist/panels/bruno/hooks/useBrunoCollection.d.ts +43 -0
  24. package/dist/panels/bruno/hooks/useBrunoCollection.d.ts.map +1 -0
  25. package/dist/panels/bruno/index.d.ts +5 -0
  26. package/dist/panels/bruno/index.d.ts.map +1 -0
  27. package/dist/panels/bruno/types.d.ts +5 -0
  28. package/dist/panels/bruno/types.d.ts.map +1 -0
  29. package/dist/panels.bundle.js +1070 -0
  30. package/dist/panels.bundle.js.map +1 -0
  31. package/dist/tools/index.d.ts +27 -0
  32. package/dist/tools/index.d.ts.map +1 -0
  33. package/dist/tools.bundle.js +97 -0
  34. package/dist/types/index.d.ts +51 -0
  35. package/dist/types/index.d.ts.map +1 -0
  36. package/package.json +99 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panels.bundle.js","sources":["../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","../node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../node_modules/lucide-react/dist/esm/icons/chevron-right.js","../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../node_modules/lucide-react/dist/esm/icons/folder-open.js","../node_modules/lucide-react/dist/esm/icons/folder.js","../node_modules/lucide-react/dist/esm/icons/send.js","../node_modules/@principal-ade/industry-theme/dist/esm/index.js","../src/panels/bruno/components/CollectionTree.tsx","../src/panels/bruno/components/RequestEditor.tsx","../src/panels/bruno/components/ResponseViewer.tsx","../src/panels/bruno/BrunoPanel.tsx","../src/tools/index.ts","../src/index.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.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 mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.577.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();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.577.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 toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.577.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 { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","/**\n * @license lucide-react v0.577.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.577.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 hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.577.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 { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.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.577.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 } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.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.577.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: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.577.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.577.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 [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.577.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 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n];\nconst FolderOpen = createLucideIcon(\"folder-open\", __iconNode);\n\nexport { __iconNode, FolderOpen as default };\n//# sourceMappingURL=folder-open.js.map\n","/**\n * @license lucide-react v0.577.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: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.js.map\n","/**\n * @license lucide-react v0.577.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.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n];\nconst Send = createLucideIcon(\"send\", __iconNode);\n\nexport { __iconNode, Send as default };\n//# sourceMappingURL=send.js.map\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: \"#e6f4fb\",\n muted: \"#f0f0f0\",\n success: \"#28a745\",\n warning: \"#ffc107\",\n error: \"#dc3545\",\n info: \"#17a2b8\",\n border: \"#e6e6e6\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"#f7f7f7\",\n backgroundHover: \"#f2f2f2\",\n surface: \"#ffffff\",\n textSecondary: \"#555555\",\n textTertiary: \"#888888\",\n textMuted: \"#aaaaaa\",\n highlightBg: \"#fff9c4\",\n highlightBorder: \"#fff389\",\n textOnPrimary: \"#ffffff\"\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: \"#1a1301\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"#332701\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"#080600\",\n backgroundHover: \"#0d0a00\",\n surface: \"#050505\",\n textSecondary: \"#e0e0e0\",\n textTertiary: \"#b0b0b0\",\n textMuted: \"#808080\",\n highlightBg: \"#332701\",\n highlightBorder: \"#664d03\",\n textOnPrimary: \"#000000\"\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: '\"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.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: \"#242b30\",\n muted: \"#2a2a2a\",\n success: \"#6a9955\",\n warning: \"#d18616\",\n error: \"#f44747\",\n info: \"#569cd6\",\n border: \"#343434\",\n backgroundSecondary: \"#252526\",\n backgroundTertiary: \"#333333\",\n backgroundLight: \"#252525\",\n backgroundHover: \"#292929\",\n surface: \"#252526\",\n textSecondary: \"#cccccc\",\n textTertiary: \"#999999\",\n textMuted: \"#666666\",\n highlightBg: \"#4b4724\",\n highlightBorder: \"#78702a\",\n textOnPrimary: \"#ffffff\"\n },\n buttons: {\n primary: {\n color: \"white\",\n bg: \"primary\",\n \"&:hover\": { bg: \"secondary\" }\n },\n secondary: {\n color: \"primary\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"primary\",\n \"&:hover\": { bg: \"highlight\" }\n },\n ghost: {\n color: \"text\",\n bg: \"transparent\",\n \"&:hover\": { bg: \"backgroundHover\" }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n },\n secondary: {\n bg: \"backgroundSecondary\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 1\n }\n }\n};\n// src/landingPageTheme.ts\nvar landingPageTheme = {\n space: [0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 100, 128],\n fonts: {\n body: 'Inter, \"Geist Sans\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n heading: '-apple-system, BlinkMacSystemFont, \"SF Pro Display\", \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n monospace: '\"SF Mono\", Monaco, Inconsolata, \"Fira Code\", monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.6,\n heading: 1.2,\n tight: 1.05,\n relaxed: 1.7\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\", \"1400px\"],\n sizes: [16, 32, 64, 128, 200, 240, 256, 300, 512, 740, 768, 820, 900, 1024, 1200, 1400, 1536],\n radii: [0, 2, 4, 6, 7, 8, 9, 10, 12, 14, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 4px 12px rgba(0, 194, 255, 0.4)\",\n \"0 6px 24px rgba(0, 194, 255, 0.1)\",\n \"0 8px 32px rgba(0, 0, 0, 0.4)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50, 1000],\n colors: {\n text: \"#ffffff\",\n background: \"#000000\",\n primary: \"#00C2FF\",\n secondary: \"#0098CC\",\n accent: \"#0066FF\",\n highlight: \"#001d26\",\n muted: \"#1a1a1a\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"#002733\",\n backgroundSecondary: \"#0a1628\",\n backgroundTertiary: \"#0f1c2e\",\n backgroundLight: \"#00080a\",\n backgroundHover: \"#00131a\",\n surface: \"#000000\",\n textSecondary: \"#d1d5db\",\n textTertiary: \"#9ca3af\",\n textMuted: \"#6b7280\",\n highlightBg: \"#403b0f\",\n highlightBorder: \"#80761e\",\n textOnPrimary: \"#000000\"\n },\n buttons: {\n primary: {\n color: \"#000000\",\n bg: \"#00C2FF\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#00D9FF\"\n }\n },\n secondary: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"#003a4d\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#00131a\",\n borderColor: \"#00C2FF\"\n }\n },\n ghost: {\n color: \"#00C2FF\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#00D9FF\",\n bg: \"#00131a\"\n }\n }\n },\n text: {\n heading: {\n fontFamily: \"heading\",\n fontWeight: \"heading\",\n lineHeight: \"heading\",\n color: \"#ffffff\"\n },\n body: {\n fontFamily: \"body\",\n fontWeight: \"body\",\n lineHeight: \"body\",\n color: \"text\"\n },\n caption: {\n fontSize: 1,\n color: \"textSecondary\"\n }\n },\n cards: {\n primary: {\n bg: \"surface\",\n border: \"1px solid\",\n borderColor: \"border\",\n borderRadius: 4\n },\n secondary: {\n bg: \"#000a0d\",\n border: \"1px solid\",\n borderColor: \"#002733\",\n borderRadius: 4\n }\n }\n};\nvar landingPageLightTheme = {\n ...landingPageTheme,\n colors: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#0098CC\",\n secondary: \"#00C2FF\",\n accent: \"#0066FF\",\n highlight: \"#e6f5fa\",\n muted: \"#f0f0f0\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n info: \"#2196f3\",\n border: \"#cceaf5\",\n backgroundSecondary: \"#f8f9fa\",\n backgroundTertiary: \"#e9ecef\",\n backgroundLight: \"#f7fcfd\",\n backgroundHover: \"#f2fafc\",\n surface: \"#ffffff\",\n textSecondary: \"#555555\",\n textTertiary: \"#888888\",\n textMuted: \"#aaaaaa\",\n highlightBg: \"#fff9c4\",\n highlightBorder: \"#fff389\",\n textOnPrimary: \"#ffffff\"\n },\n buttons: {\n primary: {\n color: \"#ffffff\",\n bg: \"#0098CC\",\n borderWidth: 0,\n padding: \"8px 20px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#007aa8\"\n }\n },\n secondary: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"#b2e0f0\",\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n \"&:hover\": {\n bg: \"#f2fafc\",\n borderColor: \"#0098CC\"\n }\n },\n ghost: {\n color: \"#0098CC\",\n bg: \"transparent\",\n borderWidth: 0,\n padding: \"8px 16px\",\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n \"&:hover\": {\n color: \"#007aa8\",\n bg: \"#f2fafc\"\n }\n }\n }\n};\n\n// src/themes.ts\nvar regalTheme = {\n space: [0, 4, 8, 16, 32, 64, 128, 256, 512],\n fonts: {\n body: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n heading: '\"Crimson Text\", \"Georgia\", \"Times New Roman\", serif',\n monospace: '\"Fira Code\", \"SF Mono\", Monaco, Inconsolata, monospace'\n },\n fontSizes: [12, 14, 16, 18, 20, 24, 32, 48, 64, 96],\n fontScale: 1,\n fontWeights: {\n body: 400,\n heading: 600,\n bold: 700,\n light: 300,\n medium: 500,\n semibold: 600\n },\n lineHeights: {\n body: 1.5,\n heading: 1.2,\n tight: 1.25,\n relaxed: 1.75\n },\n breakpoints: [\"640px\", \"768px\", \"1024px\", \"1280px\"],\n sizes: [16, 32, 64, 128, 256, 512, 768, 1024, 1536],\n radii: [0, 2, 4, 6, 8, 12, 16, 24],\n shadows: [\n \"none\",\n \"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)\",\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n \"0 25px 50px -12px rgba(0, 0, 0, 0.25)\"\n ],\n zIndices: [0, 1, 10, 20, 30, 40, 50],\n colors: {\n text: \"#f1e8dc\",\n background: \"#1a1f2e\",\n primary: \"#d4a574\",\n secondary: \"#e0b584\",\n accent: \"#c9b8a3\",\n highlight: \"#363338\",\n muted: \"#8b7968\",\n success: \"#5c8a72\",\n warning: \"#d4a574\",\n error: \"#a85751\",\n info: \"#d4a574\",\n border: \"#3f3a3c\",\n backgroundSecondary: \"#212738\",\n backgroundTertiary: \"#2d3446\",\n backgroundLight: \"#292a34\",\n backgroundHover: \"#363338\",\n surface: \"#212738\",\n textSecondary: \"#c9b8a3\",\n textTertiary: \"#8b7968\",\n textMuted: \"#8b7968\",\n highlightBg: \"#534724\",\n highlightBorder: \"#8c701a\",\n textOnPrimary: \"#1a1f2e\"\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: \"#0a0a0a\",\n primary: \"#66b3ff\",\n secondary: \"#80c4ff\",\n accent: \"#66ff99\",\n highlight: \"#18283d\",\n muted: \"#1a1a1a\",\n success: \"#66ff99\",\n warning: \"#ffcc66\",\n error: \"#ff6666\",\n info: \"#66b3ff\",\n border: \"#1a1a1a\",\n backgroundSecondary: \"#0f0f0f\",\n backgroundTertiary: \"#141414\",\n backgroundLight: \"#0d0d0d\",\n backgroundHover: \"#0d1520\",\n surface: \"#0f0f0f\",\n textSecondary: \"#b3b3b3\",\n textTertiary: \"#808080\",\n textMuted: \"#666666\",\n highlightBg: \"#40391e\",\n highlightBorder: \"#7f7530\",\n textOnPrimary: \"#ffffff\"\n },\n modes: {\n light: {\n text: \"#1a1a1a\",\n background: \"#ffffff\",\n primary: \"#0066cc\",\n secondary: \"#0052a3\",\n accent: \"#00cc88\",\n highlight: \"#e6f2ff\",\n muted: \"#f5f5f5\",\n success: \"#00cc88\",\n warning: \"#ffaa00\",\n error: \"#ff3333\",\n info: \"#0066cc\",\n border: \"#e6e6e6\",\n backgroundSecondary: \"#fafafa\",\n backgroundTertiary: \"#f5f5f5\",\n backgroundLight: \"#fafafa\",\n backgroundHover: \"#f5f9fd\",\n surface: \"#ffffff\",\n textSecondary: \"#666666\",\n textTertiary: \"#999999\",\n textMuted: \"#b3b3b3\",\n highlightBg: \"#fff9c4\",\n highlightBorder: \"#fff389\"\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: \"#002008\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"#002b0b\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"#000602\",\n backgroundHover: \"#001104\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"#00360d\",\n highlightBorder: \"#006c1b\",\n textOnPrimary: \"#000000\"\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: \"#001605\",\n muted: \"#0a0a0a\",\n success: \"#00d835\",\n warning: \"#d4a000\",\n error: \"#d63333\",\n info: \"#00a8d6\",\n border: \"#121212\",\n backgroundSecondary: \"#0a0a0a\",\n backgroundTertiary: \"#111111\",\n backgroundLight: \"#040404\",\n backgroundHover: \"#000b03\",\n surface: \"#050505\",\n textSecondary: \"#808080\",\n textTertiary: \"#606060\",\n textMuted: \"#484848\",\n highlightBg: \"#002b0b\",\n highlightBorder: \"#005615\",\n textOnPrimary: \"#000000\"\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: \"#353838\",\n muted: \"#2d3134\",\n success: \"#10b981\",\n warning: \"#f59e0b\",\n error: \"#ef4444\",\n info: \"#3b82f6\",\n border: \"#2d3034\",\n backgroundSecondary: \"#22252a\",\n backgroundTertiary: \"#2d3134\",\n backgroundLight: \"#202325\",\n backgroundHover: \"#27292c\",\n surface: \"#1f2124\",\n textSecondary: \"#e5e7eb\",\n textTertiary: \"#6b7280\",\n textMuted: \"#4b5563\",\n highlightBg: \"#513c19\",\n highlightBorder: \"#875d14\",\n textOnPrimary: \"#1a1c1e\"\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 }, [\n \"backgroundSecondary\",\n \"backgroundTertiary\",\n \"backgroundLight\",\n \"backgroundHover\",\n \"surface\"\n ].map((key) => {\n const color = theme2.colors[key];\n if (!color)\n return null;\n return /* @__PURE__ */ React2.createElement(\"div\", {\n key,\n style: {\n padding: theme2.space[3],\n backgroundColor: color,\n border: `1px solid ${theme2.colors.border}`,\n borderRadius: theme2.radii[1]\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n fontWeight: theme2.fontWeights.medium\n }\n }, key), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary,\n marginTop: theme2.space[1]\n }\n }, color));\n }))), sections.includes(\"typography\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Typography\"), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Families\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.heading,\n fontSize: theme2.fontSizes[4],\n marginBottom: theme2.space[2]\n }\n }, \"Heading Font:\", \" \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.heading)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[2],\n marginBottom: theme2.space[2]\n }\n }, \"Body Font:\", \" \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.body)), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[2]\n }\n }, \"Monospace Font:\", \" \", showValues && /* @__PURE__ */ React2.createElement(\"span\", {\n style: {\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \" \", theme2.fonts.monospace))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Sizes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { marginBottom: theme2.space[4] }\n }, theme2.fontSizes.map((size, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: {\n fontSize: size,\n lineHeight: theme2.lineHeights.body,\n marginBottom: theme2.space[1]\n }\n }, \"Size \", index, \": Sample Text \", showValues && `(${size}px)`))), /* @__PURE__ */ React2.createElement(\"h3\", {\n style: subheadingStyle\n }, \"Font Weights\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(150px, 1fr))\",\n gap: theme2.space[2]\n }\n }, Object.entries(theme2.fontWeights).map(([name, weight]) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: name,\n style: {\n fontWeight: weight,\n fontSize: theme2.fontSizes[2]\n }\n }, name, \" \", showValues && `(${weight})`)))), sections.includes(\"spacing\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Spacing\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: { display: \"flex\", flexDirection: \"column\", gap: theme2.space[2] }\n }, theme2.space.map((space, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { display: \"flex\", alignItems: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 60,\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"]\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n height: 24,\n width: space,\n backgroundColor: theme2.colors.primary,\n borderRadius: theme2.radii[1]\n }\n }), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n marginLeft: theme2.space[2],\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[1],\n color: theme2.colors.textSecondary\n }\n }, space, \"px\"))))), sections.includes(\"radii\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Border Radii\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(100px, 1fr))\",\n gap: theme2.space[3]\n }\n }, theme2.radii.map((radius, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 80,\n height: 80,\n backgroundColor: theme2.colors.primary,\n borderRadius: radius,\n marginBottom: theme2.space[1],\n margin: \"0 auto\"\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"[\", index, \"] \", showValues && `${radius}px`))))), sections.includes(\"shadows\") && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Shadows\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: theme2.space[4]\n }\n }, theme2.shadows.map((shadow, index) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: index,\n style: { textAlign: \"center\" }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n width: 100,\n height: 100,\n backgroundColor: theme2.colors.background,\n boxShadow: shadow,\n borderRadius: theme2.radii[2],\n margin: \"0 auto\",\n marginBottom: theme2.space[2],\n border: `1px solid ${theme2.colors.border}`\n }\n }), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textSecondary\n }\n }, \"Shadow [\", index, \"]\"), showValues && /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n fontFamily: theme2.fonts.monospace,\n fontSize: theme2.fontSizes[0],\n color: theme2.colors.textMuted,\n marginTop: theme2.space[1]\n }\n }, shadow === \"none\" ? \"none\" : \"...\"))))), theme2.modes && Object.keys(theme2.modes).length > 0 && /* @__PURE__ */ React2.createElement(\"div\", {\n style: sectionStyle\n }, /* @__PURE__ */ React2.createElement(\"h2\", {\n style: headingStyle\n }, \"Available Modes\"), /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n display: \"flex\",\n gap: theme2.space[2],\n flexWrap: \"wrap\"\n }\n }, /* @__PURE__ */ React2.createElement(\"div\", {\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.primary,\n color: \"#ffffff\",\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, \"default\"), Object.keys(theme2.modes).map((modeName) => /* @__PURE__ */ React2.createElement(\"div\", {\n key: modeName,\n style: {\n padding: `${theme2.space[2]}px ${theme2.space[3]}px`,\n backgroundColor: theme2.colors.secondary,\n color: theme2.colors.text,\n borderRadius: theme2.radii[2],\n fontFamily: theme2.fonts.body,\n fontSize: theme2.fontSizes[1]\n }\n }, modeName)))));\n};\n\n// src/index.ts\nvar theme = terminalTheme;\nfunction scaleThemeFonts(theme2, scale) {\n const currentScale = theme2.fontScale || 1;\n const effectiveScale = scale / currentScale;\n return {\n ...theme2,\n fontSizes: theme2.fontSizes.map((size) => Math.round(size * effectiveScale)),\n fontScale: scale\n };\n}\nfunction increaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.min(currentScale * 1.1, 2);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction decreaseFontScale(theme2) {\n const currentScale = theme2.fontScale || 1;\n const newScale = Math.max(currentScale * 0.9, 0.5);\n return scaleThemeFonts(theme2, newScale);\n}\nfunction resetFontScale(theme2) {\n return scaleThemeFonts(theme2, 1);\n}\nvar src_default = theme;\nexport {\n withTheme,\n useTheme,\n theme,\n terminalTheme,\n sx,\n slateTheme,\n scaleThemeFonts,\n responsive,\n resetFontScale,\n regalTheme,\n overrideColors,\n mergeThemes,\n matrixTheme,\n matrixMinimalTheme,\n makeTheme,\n landingPageTheme,\n landingPageLightTheme,\n increaseFontScale,\n 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","import React, { useState } from 'react';\nimport { ChevronRight, ChevronDown, Folder } from 'lucide-react';\nimport { useTheme, type Theme } from '@principal-ade/industry-theme';\nimport type { CollectionItem } from '../hooks/useBrunoCollection';\n\nexport interface CollectionTreeProps {\n items: CollectionItem[];\n selectedItem: CollectionItem | null;\n onSelectItem: (item: CollectionItem) => void;\n}\n\nconst METHOD_COLORS: Record<string, string> = {\n GET: '#61affe',\n POST: '#49cc90',\n PUT: '#fca130',\n DELETE: '#f93e3e',\n PATCH: '#50e3c2',\n HEAD: '#9012fe',\n OPTIONS: '#0d5aa7',\n};\n\ninterface TreeItemProps {\n item: CollectionItem;\n depth: number;\n selectedItem: CollectionItem | null;\n onSelectItem: (item: CollectionItem) => void;\n theme: Theme;\n}\n\nconst TreeItem: React.FC<TreeItemProps> = ({ item, depth, selectedItem, onSelectItem, theme }) => {\n const [isExpanded, setIsExpanded] = useState(true);\n const isSelected = selectedItem?.uid === item.uid;\n const isFolder = item.type === 'folder';\n\n const method = (item.request as { http?: { method?: string } })?.http?.method?.toUpperCase() || 'GET';\n const methodColor = METHOD_COLORS[method] || METHOD_COLORS.GET;\n\n const handleClick = () => {\n if (isFolder) {\n setIsExpanded(!isExpanded);\n } else {\n onSelectItem(item);\n }\n };\n\n return (\n <div>\n <div\n onClick={handleClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 8px',\n paddingLeft: `${8 + depth * 16}px`,\n cursor: 'pointer',\n background: isSelected ? theme.colors.backgroundSecondary : 'transparent',\n borderRadius: '4px',\n fontSize: '13px',\n color: theme.colors.text,\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.background = theme.colors.backgroundHover;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.background = 'transparent';\n }\n }}\n >\n {isFolder ? (\n <>\n {isExpanded ? (\n <ChevronDown size={14} color={theme.colors.textMuted} />\n ) : (\n <ChevronRight size={14} color={theme.colors.textMuted} />\n )}\n <Folder size={14} color={theme.colors.textMuted} />\n </>\n ) : (\n <>\n <span style={{ width: '14px' }} />\n <span\n style={{\n fontSize: '10px',\n fontWeight: 600,\n color: methodColor,\n minWidth: '36px',\n }}\n >\n {method}\n </span>\n </>\n )}\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {item.name}\n </span>\n </div>\n\n {isFolder && isExpanded && item.items && (\n <div>\n {item.items.map((child) => (\n <TreeItem\n key={child.uid}\n item={child}\n depth={depth + 1}\n selectedItem={selectedItem}\n onSelectItem={onSelectItem}\n theme={theme}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport const CollectionTree: React.FC<CollectionTreeProps> = ({\n items,\n selectedItem,\n onSelectItem,\n}) => {\n const { theme } = useTheme();\n\n if (items.length === 0) {\n return (\n <div\n style={{\n padding: '24px',\n textAlign: 'center',\n color: theme.colors.textMuted,\n fontSize: '13px',\n }}\n >\n No requests found\n </div>\n );\n }\n\n return (\n <div style={{ padding: '8px' }}>\n {items.map((item) => (\n <TreeItem\n key={item.uid}\n item={item}\n depth={0}\n selectedItem={selectedItem}\n onSelectItem={onSelectItem}\n theme={theme}\n />\n ))}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { Send } from 'lucide-react';\nimport { useTheme } from '@principal-ade/industry-theme';\n\nexport interface RequestEditorProps {\n request: unknown;\n isSending: boolean;\n onSend: () => void;\n}\n\ntype TabId = 'params' | 'headers' | 'body' | 'auth' | 'script';\n\nconst METHOD_COLORS: Record<string, string> = {\n GET: '#61affe',\n POST: '#49cc90',\n PUT: '#fca130',\n DELETE: '#f93e3e',\n PATCH: '#50e3c2',\n HEAD: '#9012fe',\n OPTIONS: '#0d5aa7',\n};\n\nexport const RequestEditor: React.FC<RequestEditorProps> = ({\n request,\n isSending,\n onSend,\n}) => {\n const { theme } = useTheme();\n const [activeTab, setActiveTab] = useState<TabId>('params');\n\n // Extract request data from the parsed .bru file\n const parsed = request as {\n meta?: { name?: string };\n http?: { method?: string; url?: string; body?: string };\n headers?: Array<{ name: string; value: string; enabled: boolean }>;\n params?: Array<{ name: string; value: string; enabled: boolean; type: string }>;\n body?: { json?: string; text?: string; xml?: string };\n auth?: { mode?: string };\n script?: { req?: string; res?: string };\n } | null;\n\n const method = parsed?.http?.method?.toUpperCase() || 'GET';\n const url = parsed?.http?.url || '';\n const methodColor = METHOD_COLORS[method] || METHOD_COLORS.GET;\n\n const headers = parsed?.headers || [];\n const params = parsed?.params || [];\n const body = parsed?.body;\n const bodyContent = body?.json || body?.text || body?.xml || '';\n\n const tabs: { id: TabId; label: string; count?: number }[] = [\n { id: 'params', label: 'Params', count: params.filter(p => p.enabled).length },\n { id: 'headers', label: 'Headers', count: headers.filter(h => h.enabled).length },\n { id: 'body', label: 'Body' },\n { id: 'auth', label: 'Auth' },\n { id: 'script', label: 'Script' },\n ];\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n {/* URL Bar */}\n <div\n style={{\n display: 'flex',\n gap: '8px',\n padding: '12px',\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '8px 12px',\n background: theme.colors.backgroundSecondary,\n borderRadius: '6px',\n minWidth: '80px',\n }}\n >\n <span style={{ color: methodColor, fontWeight: 600, fontSize: '13px' }}>\n {method}\n </span>\n </div>\n\n <input\n type=\"text\"\n value={url}\n readOnly\n placeholder=\"Enter URL\"\n style={{\n flex: 1,\n padding: '8px 12px',\n background: theme.colors.backgroundSecondary,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: '6px',\n color: theme.colors.text,\n fontSize: '13px',\n fontFamily: 'monospace',\n }}\n />\n\n <button\n onClick={onSend}\n disabled={isSending}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 16px',\n background: isSending ? theme.colors.backgroundSecondary : theme.colors.primary,\n border: 'none',\n borderRadius: '6px',\n color: '#fff',\n fontSize: '13px',\n fontWeight: 500,\n cursor: isSending ? 'not-allowed' : 'pointer',\n opacity: isSending ? 0.7 : 1,\n }}\n >\n <Send size={14} />\n {isSending ? 'Sending...' : 'Send'}\n </button>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: 'flex',\n gap: '4px',\n padding: '8px 12px',\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n background: activeTab === tab.id ? theme.colors.backgroundSecondary : 'transparent',\n border: 'none',\n borderRadius: '4px',\n color: activeTab === tab.id ? theme.colors.text : theme.colors.textMuted,\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n {tab.label}\n {tab.count !== undefined && tab.count > 0 && (\n <span\n style={{\n padding: '1px 6px',\n background: theme.colors.primary,\n borderRadius: '10px',\n fontSize: '10px',\n color: '#fff',\n }}\n >\n {tab.count}\n </span>\n )}\n </button>\n ))}\n </div>\n\n {/* Tab Content */}\n <div style={{ flex: 1, overflow: 'auto', padding: '12px' }}>\n {activeTab === 'params' && (\n <KeyValueTable items={params} emptyMessage=\"No parameters\" theme={theme} />\n )}\n\n {activeTab === 'headers' && (\n <KeyValueTable items={headers} emptyMessage=\"No headers\" theme={theme} />\n )}\n\n {activeTab === 'body' && (\n <div\n style={{\n height: '100%',\n background: theme.colors.backgroundSecondary,\n borderRadius: '6px',\n padding: '12px',\n fontFamily: 'monospace',\n fontSize: '12px',\n color: theme.colors.text,\n whiteSpace: 'pre-wrap',\n overflow: 'auto',\n }}\n >\n {bodyContent || <span style={{ color: theme.colors.textMuted }}>No body</span>}\n </div>\n )}\n\n {activeTab === 'auth' && (\n <div style={{ color: theme.colors.textMuted, fontSize: '13px' }}>\n Auth mode: {parsed?.auth?.mode || 'none'}\n </div>\n )}\n\n {activeTab === 'script' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '12px' }}>\n {parsed?.script?.req && (\n <div>\n <div style={{ fontSize: '11px', color: theme.colors.textMuted, marginBottom: '6px' }}>\n Pre-request Script\n </div>\n <pre\n style={{\n padding: '12px',\n background: theme.colors.backgroundSecondary,\n borderRadius: '6px',\n fontSize: '12px',\n color: theme.colors.text,\n margin: 0,\n overflow: 'auto',\n }}\n >\n {parsed.script.req}\n </pre>\n </div>\n )}\n {parsed?.script?.res && (\n <div>\n <div style={{ fontSize: '11px', color: theme.colors.textMuted, marginBottom: '6px' }}>\n Post-response Script\n </div>\n <pre\n style={{\n padding: '12px',\n background: theme.colors.backgroundSecondary,\n borderRadius: '6px',\n fontSize: '12px',\n color: theme.colors.text,\n margin: 0,\n overflow: 'auto',\n }}\n >\n {parsed.script.res}\n </pre>\n </div>\n )}\n {!parsed?.script?.req && !parsed?.script?.res && (\n <div style={{ color: theme.colors.textMuted, fontSize: '13px' }}>\n No scripts\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\ninterface KeyValueTableProps {\n items: Array<{ name: string; value: string; enabled: boolean }>;\n emptyMessage: string;\n theme: ReturnType<typeof useTheme>['theme'];\n}\n\nconst KeyValueTable: React.FC<KeyValueTableProps> = ({ items, emptyMessage, theme }) => {\n if (items.length === 0) {\n return (\n <div style={{ color: theme.colors.textMuted, fontSize: '13px' }}>\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '12px' }}>\n <thead>\n <tr style={{ borderBottom: `1px solid ${theme.colors.border}` }}>\n <th style={{ textAlign: 'left', padding: '8px', color: theme.colors.textMuted, fontWeight: 500, width: '30%' }}>\n Key\n </th>\n <th style={{ textAlign: 'left', padding: '8px', color: theme.colors.textMuted, fontWeight: 500 }}>\n Value\n </th>\n </tr>\n </thead>\n <tbody>\n {items.map((item, index) => (\n <tr\n key={index}\n style={{\n borderBottom: `1px solid ${theme.colors.border}`,\n opacity: item.enabled ? 1 : 0.5,\n }}\n >\n <td style={{ padding: '8px', fontFamily: 'monospace', color: theme.colors.text }}>\n {item.name}\n </td>\n <td style={{ padding: '8px', fontFamily: 'monospace', color: theme.colors.text }}>\n {item.value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n};\n","import React, { useState } from 'react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport type { BrunoResponse } from '../../../types';\n\nexport interface ResponseViewerProps {\n response: BrunoResponse | null;\n isLoading: boolean;\n}\n\ntype TabId = 'body' | 'headers';\n\nconst getStatusColor = (status: number): string => {\n if (status >= 200 && status < 300) return '#49cc90';\n if (status >= 300 && status < 400) return '#fca130';\n if (status >= 400 && status < 500) return '#f93e3e';\n if (status >= 500) return '#f93e3e';\n return '#888';\n};\n\nconst formatSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n};\n\nconst formatJson = (data: unknown): string => {\n try {\n if (typeof data === 'string') {\n const parsed = JSON.parse(data);\n return JSON.stringify(parsed, null, 2);\n }\n return JSON.stringify(data, null, 2);\n } catch {\n return String(data);\n }\n};\n\nexport const ResponseViewer: React.FC<ResponseViewerProps> = ({\n response,\n isLoading,\n}) => {\n const { theme } = useTheme();\n const [activeTab, setActiveTab] = useState<TabId>('body');\n\n if (isLoading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: theme.colors.textMuted,\n fontSize: '13px',\n }}\n >\n Sending request...\n </div>\n );\n }\n\n if (!response) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: theme.colors.textMuted,\n fontSize: '13px',\n }}\n >\n Send a request to see the response\n </div>\n );\n }\n\n const statusColor = getStatusColor(response.status);\n const headerCount = Object.keys(response.headers).length;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n {/* Status Bar */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n padding: '12px',\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span\n style={{\n padding: '4px 8px',\n background: statusColor,\n borderRadius: '4px',\n color: '#fff',\n fontSize: '12px',\n fontWeight: 600,\n }}\n >\n {response.status}\n </span>\n <span style={{ color: theme.colors.text, fontSize: '13px' }}>\n {response.statusText}\n </span>\n </div>\n\n <div style={{ display: 'flex', gap: '16px', fontSize: '12px', color: theme.colors.textMuted }}>\n <span>Time: {response.responseTime}ms</span>\n <span>Size: {formatSize(response.size)}</span>\n </div>\n </div>\n\n {/* Tabs */}\n <div\n style={{\n display: 'flex',\n gap: '4px',\n padding: '8px 12px',\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <button\n onClick={() => setActiveTab('body')}\n style={{\n padding: '6px 12px',\n background: activeTab === 'body' ? theme.colors.backgroundSecondary : 'transparent',\n border: 'none',\n borderRadius: '4px',\n color: activeTab === 'body' ? theme.colors.text : theme.colors.textMuted,\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n Body\n </button>\n <button\n onClick={() => setActiveTab('headers')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '6px 12px',\n background: activeTab === 'headers' ? theme.colors.backgroundSecondary : 'transparent',\n border: 'none',\n borderRadius: '4px',\n color: activeTab === 'headers' ? theme.colors.text : theme.colors.textMuted,\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n Headers\n <span\n style={{\n padding: '1px 6px',\n background: theme.colors.primary,\n borderRadius: '10px',\n fontSize: '10px',\n color: '#fff',\n }}\n >\n {headerCount}\n </span>\n </button>\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, overflow: 'auto', padding: '12px' }}>\n {activeTab === 'body' && (\n <pre\n style={{\n margin: 0,\n padding: '12px',\n background: theme.colors.backgroundSecondary,\n borderRadius: '6px',\n fontSize: '12px',\n fontFamily: 'monospace',\n color: theme.colors.text,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n {formatJson(response.data)}\n </pre>\n )}\n\n {activeTab === 'headers' && (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '12px' }}>\n <thead>\n <tr style={{ borderBottom: `1px solid ${theme.colors.border}` }}>\n <th style={{ textAlign: 'left', padding: '8px', color: theme.colors.textMuted, fontWeight: 500, width: '30%' }}>\n Header\n </th>\n <th style={{ textAlign: 'left', padding: '8px', color: theme.colors.textMuted, fontWeight: 500 }}>\n Value\n </th>\n </tr>\n </thead>\n <tbody>\n {Object.entries(response.headers).map(([key, value]) => (\n <tr key={key} style={{ borderBottom: `1px solid ${theme.colors.border}` }}>\n <td style={{ padding: '8px', fontFamily: 'monospace', color: theme.colors.text }}>\n {key}\n </td>\n <td style={{ padding: '8px', fontFamily: 'monospace', color: theme.colors.text }}>\n {value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n </div>\n );\n};\n","import React, { useState, useCallback } from 'react';\nimport { FolderOpen, AlertCircle } from 'lucide-react';\nimport { useTheme } from '@principal-ade/industry-theme';\nimport { CollectionTree, RequestEditor, ResponseViewer } from './components';\nimport type { CollectionItem } from './hooks/useBrunoCollection';\nimport type { PanelComponentProps, PanelActions, BrunoPanelContext, BrunoResponse } from '../../types';\n\ntype BrunoPanelProps = PanelComponentProps<PanelActions, BrunoPanelContext>;\n\n// Mock sendRequest for development\nconst mockSendRequest = async (request: unknown): Promise<BrunoResponse> => {\n console.log('Mock sendRequest:', request);\n await new Promise((resolve) => setTimeout(resolve, 500));\n return {\n status: 200,\n statusText: 'OK',\n headers: {\n 'content-type': 'application/json',\n 'x-request-id': 'mock-123',\n },\n data: { message: 'Mock response', timestamp: Date.now() },\n responseTime: 123,\n size: 256,\n };\n};\n\n// Demo collection for development\nconst demoCollection: CollectionItem[] = [\n {\n uid: 'folder-users',\n name: 'Users',\n type: 'folder',\n path: '/users',\n items: [\n {\n uid: 'get-users',\n name: 'Get All Users',\n type: 'request',\n path: '/users/get-users.bru',\n request: {\n meta: { name: 'Get All Users', type: 'http', seq: 1 },\n http: { method: 'get', url: 'https://api.example.com/users', body: 'none' },\n headers: [\n { name: 'Accept', value: 'application/json', enabled: true },\n { name: 'Authorization', value: 'Bearer {{token}}', enabled: true },\n ],\n params: [\n { name: 'page', value: '1', enabled: true, type: 'query' },\n { name: 'limit', value: '10', enabled: true, type: 'query' },\n ],\n },\n },\n {\n uid: 'get-user',\n name: 'Get User by ID',\n type: 'request',\n path: '/users/get-user.bru',\n request: {\n meta: { name: 'Get User by ID', type: 'http', seq: 2 },\n http: { method: 'get', url: 'https://api.example.com/users/:id', body: 'none' },\n headers: [{ name: 'Accept', value: 'application/json', enabled: true }],\n params: [{ name: 'id', value: '123', enabled: true, type: 'path' }],\n },\n },\n {\n uid: 'create-user',\n name: 'Create User',\n type: 'request',\n path: '/users/create-user.bru',\n request: {\n meta: { name: 'Create User', type: 'http', seq: 3 },\n http: { method: 'post', url: 'https://api.example.com/users', body: 'json' },\n headers: [\n { name: 'Content-Type', value: 'application/json', enabled: true },\n ],\n params: [],\n body: {\n json: JSON.stringify({ name: 'John Doe', email: 'john@example.com' }, null, 2),\n },\n },\n },\n ],\n },\n {\n uid: 'folder-auth',\n name: 'Auth',\n type: 'folder',\n path: '/auth',\n items: [\n {\n uid: 'login',\n name: 'Login',\n type: 'request',\n path: '/auth/login.bru',\n request: {\n meta: { name: 'Login', type: 'http', seq: 1 },\n http: { method: 'post', url: 'https://api.example.com/auth/login', body: 'json' },\n headers: [{ name: 'Content-Type', value: 'application/json', enabled: true }],\n params: [],\n body: {\n json: JSON.stringify({ email: '{{email}}', password: '{{password}}' }, null, 2),\n },\n },\n },\n ],\n },\n {\n uid: 'health-check',\n name: 'Health Check',\n type: 'request',\n path: '/health-check.bru',\n request: {\n meta: { name: 'Health Check', type: 'http', seq: 1 },\n http: { method: 'get', url: 'https://api.example.com/health', body: 'none' },\n headers: [],\n params: [],\n },\n },\n];\n\nexport const BrunoPanel: React.FC<BrunoPanelProps> = ({\n context,\n actions,\n events,\n}) => {\n const { theme } = useTheme();\n const [selectedItem, setSelectedItem] = useState<CollectionItem | null>(null);\n const [response, setResponse] = useState<BrunoResponse | null>(null);\n const [isSending, setIsSending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Use demo collection for now\n const [items] = useState<CollectionItem[]>(demoCollection);\n\n const handleSelectItem = useCallback((item: CollectionItem) => {\n if (item.type === 'request') {\n setSelectedItem(item);\n setResponse(null);\n setError(null);\n // Emit event for other panels\n events.emit({\n type: 'principal-ade.bruno-panel:request-selected',\n source: 'bruno-panel',\n timestamp: Date.now(),\n payload: { requestId: item.uid, request: item.request },\n });\n }\n }, [events]);\n\n const handleSendRequest = useCallback(async () => {\n if (!selectedItem?.request) return;\n\n setIsSending(true);\n setError(null);\n\n try {\n // Use mock for now - in production, this would use an action\n const result = await mockSendRequest(selectedItem.request);\n setResponse(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Request failed');\n } finally {\n setIsSending(false);\n }\n }, [selectedItem]);\n\n return (\n <div\n style={{\n display: 'flex',\n height: '100%',\n background: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.body,\n }}\n >\n {/* Sidebar - Collection Tree */}\n <div\n style={{\n width: '260px',\n minWidth: '200px',\n borderRight: `1px solid ${theme.colors.border}`,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* Sidebar Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '12px',\n borderBottom: `1px solid ${theme.colors.border}`,\n }}\n >\n <FolderOpen size={16} color={theme.colors.primary} />\n <span style={{ fontSize: '13px', fontWeight: 600 }}>Collection</span>\n </div>\n\n {/* Tree */}\n <div style={{ flex: 1, overflow: 'auto' }}>\n <CollectionTree\n items={items}\n selectedItem={selectedItem}\n onSelectItem={handleSelectItem}\n />\n </div>\n </div>\n\n {/* Main Content */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0 }}>\n {selectedItem ? (\n <>\n {/* Request Editor */}\n <div style={{ flex: 1, minHeight: '200px', borderBottom: `1px solid ${theme.colors.border}` }}>\n <RequestEditor\n request={selectedItem.request}\n isSending={isSending}\n onSend={handleSendRequest}\n />\n </div>\n\n {/* Response Viewer */}\n <div style={{ flex: 1, minHeight: '200px' }}>\n {error ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n height: '100%',\n color: '#f93e3e',\n fontSize: '13px',\n }}\n >\n <AlertCircle size={16} />\n {error}\n </div>\n ) : (\n <ResponseViewer response={response} isLoading={isSending} />\n )}\n </div>\n </>\n ) : (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n gap: '12px',\n color: theme.colors.textMuted,\n }}\n >\n <FolderOpen size={48} strokeWidth={1} />\n <span style={{ fontSize: '14px' }}>Select a request to get started</span>\n </div>\n )}\n </div>\n </div>\n );\n};\n","/**\n * Bruno Panel Tools\n *\n * UTCP-compatible tools for the Bruno API client panel.\n */\n\nimport type { PanelTool, PanelToolsMetadata } from '@principal-ade/utcp-panel-event';\n\n/**\n * Tool: Send Request\n */\nexport const sendRequestTool: PanelTool = {\n name: 'send_request',\n description: 'Sends the currently selected HTTP request',\n inputs: {\n type: 'object',\n properties: {\n requestId: {\n type: 'string',\n description: 'ID of the request to send (uses selected if not provided)',\n },\n },\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n status: { type: 'number' },\n responseTime: { type: 'number' },\n },\n },\n tags: ['http', 'request', 'api'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'principal-ade.bruno-panel:send-request',\n },\n};\n\n/**\n * Tool: Select Request\n */\nexport const selectRequestTool: PanelTool = {\n name: 'select_request',\n description: 'Selects a request from the collection to view/edit',\n inputs: {\n type: 'object',\n properties: {\n requestPath: {\n type: 'string',\n description: 'Path to the .bru request file',\n },\n },\n required: ['requestPath'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n requestName: { type: 'string' },\n },\n },\n tags: ['request', 'selection', 'navigation'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'principal-ade.bruno-panel:select-request',\n },\n};\n\n/**\n * Tool: Load Collection\n */\nexport const loadCollectionTool: PanelTool = {\n name: 'load_collection',\n description: 'Loads a Bruno collection from the specified directory',\n inputs: {\n type: 'object',\n properties: {\n collectionPath: {\n type: 'string',\n description: 'Path to the Bruno collection directory',\n },\n },\n required: ['collectionPath'],\n },\n outputs: {\n type: 'object',\n properties: {\n success: { type: 'boolean' },\n requestCount: { type: 'number' },\n },\n },\n tags: ['collection', 'load', 'bruno'],\n tool_call_template: {\n call_template_type: 'panel_event',\n event_type: 'principal-ade.bruno-panel:load-collection',\n },\n};\n\n/**\n * All tools exported as an array.\n */\nexport const brunoPanelTools: PanelTool[] = [\n sendRequestTool,\n selectRequestTool,\n loadCollectionTool,\n];\n\n/**\n * Panel tools metadata for registration.\n */\nexport const brunoPanelToolsMetadata: PanelToolsMetadata = {\n id: 'principal-ade.bruno-panel',\n name: 'Bruno API Client',\n description: 'Tools for interacting with the Bruno API client panel',\n tools: brunoPanelTools,\n};\n","import { BrunoPanel } from './panels/bruno/BrunoPanel';\nimport type { PanelDefinition, PanelContextValue, BrunoPanelContext } from './types';\nimport { brunoPanelTools, brunoPanelToolsMetadata } from './tools';\n\n/**\n * Export array of panel definitions.\n */\nexport const panels: PanelDefinition[] = [\n {\n metadata: {\n id: 'principal-ade.bruno-panel',\n name: 'Bruno API Client',\n icon: '🔌',\n version: '0.1.0',\n author: 'Principal ADE',\n description: 'Bruno-compatible API client for testing HTTP requests',\n slices: ['fileTree'],\n tools: brunoPanelTools,\n },\n component: BrunoPanel,\n\n onMount: async (context: PanelContextValue<BrunoPanelContext>) => {\n console.log('Bruno Panel mounted', context.currentScope.repository?.path);\n },\n\n onUnmount: async (_context: PanelContextValue<BrunoPanelContext>) => {\n console.log('Bruno Panel unmounting');\n },\n },\n];\n\nexport const onPackageLoad = async () => {\n console.log('Bruno Panel package loaded');\n};\n\nexport const onPackageUnload = async () => {\n console.log('Bruno Panel package unloading');\n};\n\nexport { brunoPanelTools, brunoPanelToolsMetadata } from './tools';\n"],"names":["__iconNode","METHOD_COLORS","AlertCircle"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Bruno Panel Tools
3
+ *
4
+ * UTCP-compatible tools for the Bruno API client panel.
5
+ */
6
+ import type { PanelTool, PanelToolsMetadata } from '@principal-ade/utcp-panel-event';
7
+ /**
8
+ * Tool: Send Request
9
+ */
10
+ export declare const sendRequestTool: PanelTool;
11
+ /**
12
+ * Tool: Select Request
13
+ */
14
+ export declare const selectRequestTool: PanelTool;
15
+ /**
16
+ * Tool: Load Collection
17
+ */
18
+ export declare const loadCollectionTool: PanelTool;
19
+ /**
20
+ * All tools exported as an array.
21
+ */
22
+ export declare const brunoPanelTools: PanelTool[];
23
+ /**
24
+ * Panel tools metadata for registration.
25
+ */
26
+ export declare const brunoPanelToolsMetadata: PanelToolsMetadata;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAyB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAyB/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAyBhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,EAItC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,kBAKrC,CAAC"}
@@ -0,0 +1,97 @@
1
+ // src/tools/index.ts
2
+ var sendRequestTool = {
3
+ name: "send_request",
4
+ description: "Sends the currently selected HTTP request",
5
+ inputs: {
6
+ type: "object",
7
+ properties: {
8
+ requestId: {
9
+ type: "string",
10
+ description: "ID of the request to send (uses selected if not provided)"
11
+ }
12
+ }
13
+ },
14
+ outputs: {
15
+ type: "object",
16
+ properties: {
17
+ success: { type: "boolean" },
18
+ status: { type: "number" },
19
+ responseTime: { type: "number" }
20
+ }
21
+ },
22
+ tags: ["http", "request", "api"],
23
+ tool_call_template: {
24
+ call_template_type: "panel_event",
25
+ event_type: "principal-ade.bruno-panel:send-request"
26
+ }
27
+ };
28
+ var selectRequestTool = {
29
+ name: "select_request",
30
+ description: "Selects a request from the collection to view/edit",
31
+ inputs: {
32
+ type: "object",
33
+ properties: {
34
+ requestPath: {
35
+ type: "string",
36
+ description: "Path to the .bru request file"
37
+ }
38
+ },
39
+ required: ["requestPath"]
40
+ },
41
+ outputs: {
42
+ type: "object",
43
+ properties: {
44
+ success: { type: "boolean" },
45
+ requestName: { type: "string" }
46
+ }
47
+ },
48
+ tags: ["request", "selection", "navigation"],
49
+ tool_call_template: {
50
+ call_template_type: "panel_event",
51
+ event_type: "principal-ade.bruno-panel:select-request"
52
+ }
53
+ };
54
+ var loadCollectionTool = {
55
+ name: "load_collection",
56
+ description: "Loads a Bruno collection from the specified directory",
57
+ inputs: {
58
+ type: "object",
59
+ properties: {
60
+ collectionPath: {
61
+ type: "string",
62
+ description: "Path to the Bruno collection directory"
63
+ }
64
+ },
65
+ required: ["collectionPath"]
66
+ },
67
+ outputs: {
68
+ type: "object",
69
+ properties: {
70
+ success: { type: "boolean" },
71
+ requestCount: { type: "number" }
72
+ }
73
+ },
74
+ tags: ["collection", "load", "bruno"],
75
+ tool_call_template: {
76
+ call_template_type: "panel_event",
77
+ event_type: "principal-ade.bruno-panel:load-collection"
78
+ }
79
+ };
80
+ var brunoPanelTools = [
81
+ sendRequestTool,
82
+ selectRequestTool,
83
+ loadCollectionTool
84
+ ];
85
+ var brunoPanelToolsMetadata = {
86
+ id: "principal-ade.bruno-panel",
87
+ name: "Bruno API Client",
88
+ description: "Tools for interacting with the Bruno API client panel",
89
+ tools: brunoPanelTools
90
+ };
91
+ export {
92
+ sendRequestTool,
93
+ selectRequestTool,
94
+ loadCollectionTool,
95
+ brunoPanelToolsMetadata,
96
+ brunoPanelTools
97
+ };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Panel Extension Type Definitions
3
+ *
4
+ * Re-exports core types from @principal-ade/panel-framework-core
5
+ */
6
+ export type { DataSlice, WorkspaceMetadata, RepositoryMetadata, FileTreeSource, ActiveFileSlice, PanelEventType, PanelEvent, PanelEventEmitter, PanelActions, PanelContextValue, PanelComponentProps, PanelMetadata, PanelLifecycleHooks, PanelDefinition, PanelModule, PanelRegistryEntry, PanelLoader, PanelRegistryConfig, PanelTool, PanelToolsMetadata, JsonSchema, PanelEventCallTemplate, FileTreeContext, ActiveFileContext, CommonPanelContext, } from '@principal-ade/panel-framework-core';
7
+ import type { DataSlice, FileTree } from '@principal-ade/panel-framework-core';
8
+ /**
9
+ * Git status data structure for this panel
10
+ */
11
+ export interface GitStatusData {
12
+ staged: string[];
13
+ unstaged: string[];
14
+ untracked: string[];
15
+ deleted: string[];
16
+ }
17
+ /**
18
+ * Context type for the Example Panel
19
+ * Defines the data slices this panel expects
20
+ */
21
+ export interface ExamplePanelContext {
22
+ git?: DataSlice<GitStatusData>;
23
+ }
24
+ /**
25
+ * Bruno Response from executing a request
26
+ */
27
+ export interface BrunoResponse {
28
+ status: number;
29
+ statusText: string;
30
+ headers: Record<string, string>;
31
+ data: unknown;
32
+ responseTime: number;
33
+ size: number;
34
+ }
35
+ /**
36
+ * Context type for the Bruno Panel
37
+ */
38
+ export interface BrunoPanelContext {
39
+ fileTree?: DataSlice<FileTree>;
40
+ }
41
+ /**
42
+ * Actions available to the Bruno Panel
43
+ */
44
+ export interface BrunoPanelActions {
45
+ readFile: (path: string) => Promise<string>;
46
+ writeFile: (path: string, content: string) => Promise<void>;
47
+ deleteFile: (path: string) => Promise<void>;
48
+ exists: (path: string) => Promise<boolean>;
49
+ sendRequest: (request: unknown, environment?: Record<string, string>) => Promise<BrunoResponse>;
50
+ }
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAEV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EAGf,cAAc,EACd,UAAU,EACV,iBAAiB,EAGjB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAGnB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,WAAW,EAGX,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EAGnB,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,sBAAsB,EAGtB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACjG"}
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@principal-ade/bruno-panels",
3
+ "version": "0.1.1",
4
+ "description": "Bruno API client panel for Principal ADE",
5
+ "type": "module",
6
+ "main": "dist/panels.bundle.js",
7
+ "module": "dist/panels.bundle.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/panels.bundle.js",
13
+ "require": "./dist/panels.bundle.js",
14
+ "default": "./dist/panels.bundle.js"
15
+ },
16
+ "./tools": {
17
+ "types": "./dist/tools/index.d.ts",
18
+ "import": "./dist/tools.bundle.js",
19
+ "require": "./dist/tools.bundle.js",
20
+ "default": "./dist/tools.bundle.js"
21
+ }
22
+ },
23
+ "keywords": [
24
+ "panel-extension"
25
+ ],
26
+ "author": "Your Name",
27
+ "license": "MIT",
28
+ "scripts": {
29
+ "build": "bun run clean && bun run build:panel && bun run build:tools && bun run build:types",
30
+ "build:panel": "vite build",
31
+ "build:tools": "bun build ./src/tools/index.ts --outfile ./dist/tools.bundle.js --format esm --target browser",
32
+ "build:types": "tsc --project tsconfig.build.json --emitDeclarationOnly --declaration --declarationMap",
33
+ "dev": "vite build --watch",
34
+ "clean": "rm -rf dist",
35
+ "typecheck": "tsc --noEmit",
36
+ "lint": "eslint . --ext .ts,.tsx",
37
+ "lint:fix": "eslint . --ext .ts,.tsx --fix",
38
+ "format": "prettier --write .",
39
+ "format:check": "prettier --check .",
40
+ "test": "bun test",
41
+ "test:watch": "bun test --watch",
42
+ "storybook": "storybook dev -p 6006",
43
+ "build-storybook": "storybook build"
44
+ },
45
+ "peerDependencies": {
46
+ "react": ">=19.0.0",
47
+ "react-dom": ">=19.0.0"
48
+ },
49
+ "peerDependenciesMeta": {
50
+ "@principal-ade/panel-framework-core": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "dependencies": {
55
+ "@principal-ade/industry-theme": "^0.1.8",
56
+ "@principal-ade/panel-framework-core": "^0.5.1",
57
+ "@principal-ade/utcp-panel-event": "^0.1.0",
58
+ "@usebruno/lang": "^0.12.0",
59
+ "clsx": "^2.1.1",
60
+ "lucide-react": "^0.577.0"
61
+ },
62
+ "devDependencies": {
63
+ "@chromatic-com/storybook": "^5.0.1",
64
+ "@eslint/js": "^10.0.1",
65
+ "@storybook/addon-docs": "^10.2.17",
66
+ "@storybook/addon-links": "^10.2.17",
67
+ "@storybook/addon-onboarding": "^10.2.17",
68
+ "@storybook/react-vite": "^10.2.17",
69
+ "@types/bun": "latest",
70
+ "@types/node": "^25.4.0",
71
+ "@types/react": "^19.2.14",
72
+ "@types/react-dom": "^19.2.3",
73
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
74
+ "@typescript-eslint/parser": "^8.57.0",
75
+ "@vitejs/plugin-react": "^5.1.4",
76
+ "esbuild": "^0.27.3",
77
+ "eslint": "^10.0.3",
78
+ "eslint-config-prettier": "^10.1.8",
79
+ "eslint-plugin-react": "^7.37.2",
80
+ "eslint-plugin-react-hooks": "^7.0.1",
81
+ "eslint-plugin-storybook": "^10.2.17",
82
+ "prettier": "^3.8.1",
83
+ "react": "^19.2.4",
84
+ "react-dom": "^19.2.4",
85
+ "storybook": "^10.2.17",
86
+ "typescript": "^5.0.4",
87
+ "typescript-eslint": "^8.57.0",
88
+ "vite": "^7.3.1"
89
+ },
90
+ "files": [
91
+ "dist",
92
+ "README.md",
93
+ "LICENSE"
94
+ ],
95
+ "repository": {
96
+ "type": "git",
97
+ "url": "git+https://github.com/principal-ade/bruno-panels.git"
98
+ }
99
+ }