@toolr/ui-design 0.1.4 → 0.1.6

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 (70) hide show
  1. package/agent-rules.json +91 -0
  2. package/ai-manifest.json +190 -0
  3. package/components/content/info-panel-primitives.tsx +14 -14
  4. package/components/lib/ai-tools.tsx +1 -1
  5. package/components/sections/ai-tools-paths/tools-paths-panel.tsx +7 -7
  6. package/components/sections/captured-issues/captured-issues-panel.tsx +11 -11
  7. package/components/sections/golden-snapshots/file-diff-viewer.tsx +13 -13
  8. package/components/sections/golden-snapshots/golden-sync-panel.tsx +5 -5
  9. package/components/sections/golden-snapshots/snapshot-manager.tsx +11 -11
  10. package/components/sections/golden-snapshots/status-overview.tsx +20 -20
  11. package/components/sections/golden-snapshots/version-manager.tsx +8 -8
  12. package/components/sections/prompt-editor/file-type-tabbed-prompt-editor.tsx +4 -4
  13. package/components/sections/prompt-editor/simulator-prompt-editor.tsx +5 -5
  14. package/components/sections/prompt-editor/tabbed-prompt-editor.tsx +10 -10
  15. package/components/sections/report-bug/report-bug-form.tsx +14 -14
  16. package/components/sections/report-bug/screenshot-uploader.tsx +6 -6
  17. package/components/sections/snapshot-browser/snapshot-browser-panel.tsx +3 -3
  18. package/components/sections/snapshot-browser/snapshot-tree.tsx +8 -8
  19. package/components/sections/snippets-editor/snippets-editor.tsx +81 -22
  20. package/components/settings/SettingsHeader.tsx +1 -1
  21. package/components/settings/SettingsTreeNav.tsx +22 -4
  22. package/components/ui/action-dialog.tsx +5 -5
  23. package/components/ui/badge.tsx +4 -4
  24. package/components/ui/bottom-panel-header.tsx +4 -4
  25. package/components/ui/breadcrumb.tsx +2 -2
  26. package/components/ui/collapsible-section.tsx +1 -1
  27. package/components/ui/cookie-consent.tsx +5 -5
  28. package/components/ui/detail-section.tsx +3 -3
  29. package/components/ui/editor-placeholder-card.tsx +7 -7
  30. package/components/ui/editor-toolbar.tsx +12 -0
  31. package/components/ui/execution-details-panel.tsx +6 -6
  32. package/components/ui/extension-list-card.tsx +3 -3
  33. package/components/ui/file-structure-section.tsx +17 -17
  34. package/components/ui/file-tree.tsx +3 -1
  35. package/components/ui/files-panel.tsx +27 -9
  36. package/components/ui/filter-dropdown.tsx +5 -5
  37. package/components/ui/form-actions.tsx +1 -1
  38. package/components/ui/frontmatter-form-header.tsx +4 -4
  39. package/components/ui/icon-button.tsx +1 -1
  40. package/components/ui/input.tsx +7 -7
  41. package/components/ui/label.tsx +4 -4
  42. package/components/ui/layout-tab-bar.tsx +4 -4
  43. package/components/ui/modal.tsx +2 -2
  44. package/components/ui/nav-card.tsx +18 -11
  45. package/components/ui/navigation-bar.tsx +5 -5
  46. package/components/ui/number-input.tsx +4 -4
  47. package/components/ui/registry-browser.tsx +6 -6
  48. package/components/ui/registry-card.tsx +13 -13
  49. package/components/ui/registry-detail.tsx +6 -6
  50. package/components/ui/segmented-toggle.tsx +4 -4
  51. package/components/ui/select.tsx +5 -5
  52. package/components/ui/selection-grid.tsx +4 -4
  53. package/components/ui/setting-row.tsx +1 -1
  54. package/components/ui/settings-card.tsx +3 -3
  55. package/components/ui/settings-info-box.tsx +1 -1
  56. package/components/ui/settings-section-title.tsx +1 -1
  57. package/components/ui/snapshot-card.tsx +7 -7
  58. package/components/ui/snippets-panel.tsx +10 -10
  59. package/components/ui/sort-dropdown.tsx +2 -2
  60. package/components/ui/status-card.tsx +4 -4
  61. package/components/ui/tab-bar.tsx +2 -2
  62. package/components/ui/tooltip.tsx +3 -3
  63. package/dist/content.js +14 -14
  64. package/dist/index.d.ts +24 -7
  65. package/dist/index.js +440 -346
  66. package/dist/tokens/primitives.css +9 -2
  67. package/dist/tokens/semantic.css +1 -1
  68. package/package.json +13 -3
  69. package/tokens/primitives.css +9 -2
  70. package/tokens/semantic.css +1 -1
@@ -63,19 +63,19 @@ export function SnippetsPanel({
63
63
  return (
64
64
  <div className={cn('flex flex-col bg-neutral-800 rounded-lg overflow-hidden', className)}>
65
65
  <div className="flex items-center justify-between px-3 py-2 border-b border-neutral-700">
66
- <span className="text-xss font-semibold uppercase tracking-wider text-neutral-500">Snippets</span>
67
- <span className="text-xss text-neutral-500">{snippets.length} snippets</span>
66
+ <span className="text-xs font-semibold uppercase tracking-wider text-neutral-500">Snippets</span>
67
+ <span className="text-xs text-neutral-500">{snippets.length} snippets</span>
68
68
  </div>
69
69
  {showSearch && (
70
70
  <div className="px-2 py-2 border-b border-neutral-700">
71
- <div className="flex items-center gap-1.5 px-2 py-1 bg-[var(--background)] border border-neutral-700 rounded text-xs">
71
+ <div className="flex items-center gap-1.5 px-2 py-1 bg-[var(--background)] border border-neutral-700 rounded text-sm">
72
72
  <Search className="w-3 h-3 text-neutral-500 shrink-0" />
73
73
  <input
74
74
  type="text"
75
75
  placeholder="Search snippets..."
76
76
  value={searchQuery}
77
77
  onChange={(e) => setSearchQuery(e.target.value)}
78
- className="flex-1 bg-transparent text-neutral-200 placeholder-neutral-500 outline-none text-xs"
78
+ className="flex-1 bg-transparent text-neutral-200 placeholder-neutral-500 outline-none text-sm"
79
79
  />
80
80
  </div>
81
81
  </div>
@@ -90,7 +90,7 @@ export function SnippetsPanel({
90
90
  />
91
91
  ))}
92
92
  {filteredSnippets.length === 0 && (
93
- <p className="text-xss text-neutral-500 text-center py-4">No snippets found</p>
93
+ <p className="text-xs text-neutral-500 text-center py-4">No snippets found</p>
94
94
  )}
95
95
  </div>
96
96
  </div>
@@ -110,10 +110,10 @@ function SnippetCard({ snippet, onInsert, onCopy }: SnippetCardProps) {
110
110
  <div className="rounded-md border border-neutral-700 bg-neutral-900 hover:border-neutral-600 transition-colors">
111
111
  <div className="flex items-center justify-between gap-2 px-2.5 py-1.5">
112
112
  <div className="flex items-center gap-2 min-w-0">
113
- <span className="text-xs font-medium text-neutral-200 truncate">{snippet.label}</span>
113
+ <span className="text-sm font-medium text-neutral-200 truncate">{snippet.label}</span>
114
114
  {snippet.language && (
115
115
  <span
116
- className="px-1.5 py-0.5 text-xss font-medium rounded shrink-0"
116
+ className="px-1.5 py-0.5 text-xs font-medium rounded shrink-0"
117
117
  style={{ color: langColor, backgroundColor: `${langColor}20` }}
118
118
  >
119
119
  {snippet.language}
@@ -140,17 +140,17 @@ function SnippetCard({ snippet, onInsert, onCopy }: SnippetCardProps) {
140
140
  </div>
141
141
  </div>
142
142
  {snippet.description && (
143
- <p className="px-2.5 pb-1.5 text-xss text-neutral-400 leading-relaxed">{snippet.description}</p>
143
+ <p className="px-2.5 pb-1.5 text-xs text-neutral-400 leading-relaxed">{snippet.description}</p>
144
144
  )}
145
145
  <div className="mx-2.5 mb-2 rounded bg-[var(--background)] border border-neutral-700 overflow-hidden">
146
- <pre className="p-2 text-xss text-neutral-400 leading-relaxed overflow-x-auto max-h-24">
146
+ <pre className="p-2 text-xs text-neutral-400 leading-relaxed overflow-x-auto max-h-24">
147
147
  <code>{snippet.code}</code>
148
148
  </pre>
149
149
  </div>
150
150
  {snippet.tags && snippet.tags.length > 0 && (
151
151
  <div className="flex flex-wrap gap-1 px-2.5 pb-2">
152
152
  {snippet.tags.map((tag) => (
153
- <span key={tag} className="px-1.5 py-0.5 text-xss rounded bg-neutral-700 text-neutral-500">
153
+ <span key={tag} className="px-1.5 py-0.5 text-xs rounded bg-neutral-700 text-neutral-500">
154
154
  {tag}
155
155
  </span>
156
156
  ))}
@@ -74,7 +74,7 @@ export function SortDropdown({
74
74
  <div className="relative flex items-center" ref={ref} onKeyDown={handleKeyDown}>
75
75
  <button
76
76
  onClick={() => setIsOpen(!isOpen)}
77
- className={`flex items-center gap-1.5 h-7 px-2 rounded-md border ${v.bg} text-xs transition-colors cursor-pointer ${FORM_COLORS[color].border} text-neutral-200 ${FORM_COLORS[color].hover}`}
77
+ className={`flex items-center gap-1.5 h-7 px-2 rounded-md border ${v.bg} text-sm transition-colors cursor-pointer ${FORM_COLORS[color].border} text-neutral-200 ${FORM_COLORS[color].hover}`}
78
78
  >
79
79
  <span
80
80
  className={`${FORM_COLORS[color].accent} hover:brightness-125 transition-colors`}
@@ -94,7 +94,7 @@ export function SortDropdown({
94
94
  key={f.value}
95
95
  onClick={() => { onFieldChange(f.value); setIsOpen(false) }}
96
96
  onPointerEnter={() => setHighlightIdx(idx)}
97
- className={`w-full flex items-center gap-2 px-3 py-1.5 text-xs text-left transition-colors cursor-pointer ${
97
+ className={`w-full flex items-center gap-2 px-3 py-1.5 text-sm text-left transition-colors cursor-pointer ${
98
98
  idx === highlightIdx ? `${FORM_COLORS[color].selectedBg} text-neutral-200` : field === f.value ? `${FORM_COLORS[color].selectedBg} text-neutral-200` : `text-neutral-400 ${v.hoverBg}`
99
99
  }`}
100
100
  >
@@ -63,15 +63,15 @@ export function StatusCard({
63
63
  {Icon && (
64
64
  <Icon className="w-4 h-4 shrink-0" style={{ color: iconColor }} />
65
65
  )}
66
- <h3 className="text-sm font-medium text-neutral-200">{title}</h3>
66
+ <h3 className="text-md font-medium text-neutral-200">{title}</h3>
67
67
  </div>
68
68
 
69
69
  <div className="divide-y divide-neutral-700/60">
70
70
  {items.map((item) => (
71
71
  <div key={item.label} className="flex items-center justify-between px-4 py-2.5">
72
- <span className="text-xs text-neutral-400">{item.label}</span>
72
+ <span className="text-sm text-neutral-400">{item.label}</span>
73
73
  <div className="flex items-center gap-2">
74
- <span className={cn('text-xs font-medium', statusValueColor[item.status])}>
74
+ <span className={cn('text-sm font-medium', statusValueColor[item.status])}>
75
75
  {item.value}
76
76
  </span>
77
77
  <span className={cn('w-2 h-2 rounded-full shrink-0', statusDotColor[item.status])} />
@@ -85,7 +85,7 @@ export function StatusCard({
85
85
  <button
86
86
  type="button"
87
87
  onClick={action.onClick}
88
- className="text-xs text-blue-400 hover:text-blue-300 transition-colors cursor-pointer"
88
+ className="text-sm text-blue-400 hover:text-blue-300 transition-colors cursor-pointer"
89
89
  >
90
90
  {action.label}
91
91
  </button>
@@ -55,8 +55,8 @@ export interface TabBarProps {
55
55
 
56
56
  const sizeConfig = {
57
57
  xss: { text: 'text-xss', icon: 'w-2.5 h-2.5', px: 'px-1.5', py: 'py-1', close: 'w-2.5 h-2.5', badgeSize: 'xss' as const, gap: 'gap-1' },
58
- xs: { text: 'text-xs', icon: 'w-3 h-3', px: 'px-2', py: 'py-1', close: 'w-3 h-3', badgeSize: 'xs' as const, gap: 'gap-1' },
59
- sm: { text: 'text-sm', icon: 'w-3.5 h-3.5', px: 'px-3', py: 'py-1.5', close: 'w-3 h-3', badgeSize: 'sm' as const, gap: 'gap-1.5' },
58
+ xs: { text: 'text-sm', icon: 'w-3 h-3', px: 'px-2', py: 'py-1', close: 'w-3 h-3', badgeSize: 'xs' as const, gap: 'gap-1' },
59
+ sm: { text: 'text-md', icon: 'w-3.5 h-3.5', px: 'px-3', py: 'py-1.5', close: 'w-3 h-3', badgeSize: 'sm' as const, gap: 'gap-1.5' },
60
60
  md: { text: 'text-base', icon: 'w-4 h-4', px: 'px-4', py: 'py-2', close: 'w-3.5 h-3.5', badgeSize: 'md' as const, gap: 'gap-2' },
61
61
  lg: { text: 'text-lg', icon: 'w-5 h-5', px: 'px-5', py: 'py-2.5', close: 'w-4 h-4', badgeSize: 'lg' as const, gap: 'gap-2' },
62
62
  }
@@ -271,9 +271,9 @@ export function Tooltip({
271
271
  onMouseEnter={interactive && trigger !== 'click' ? show : undefined}
272
272
  onMouseLeave={interactive && trigger !== 'click' ? hide : undefined}
273
273
  >
274
- {content.title && <p className="text-sm text-neutral-200 font-medium">{content.title}</p>}
275
- <div className={`text-xs text-neutral-400 ${content.title ? 'mt-0.5' : ''}`}>{content.description}</div>
276
- {content.extra && <p className="text-xs text-orange-400/70 mt-0.5">{content.extra}</p>}
274
+ {content.title && <p className="text-md text-neutral-200 font-medium">{content.title}</p>}
275
+ <div className={`text-sm text-neutral-400 ${content.title ? 'mt-0.5' : ''}`}>{content.description}</div>
276
+ {content.extra && <p className="text-sm text-orange-400/70 mt-0.5">{content.extra}</p>}
277
277
  <div className={arrowClasses} />
278
278
  </div>
279
279
  )
package/dist/content.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // components/content/info-panel-primitives.tsx
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  function P({ children }) {
4
- return /* @__PURE__ */ jsx("p", { className: "text-sm text-neutral-400 leading-relaxed mb-5", children });
4
+ return /* @__PURE__ */ jsx("p", { className: "text-md text-neutral-400 leading-relaxed mb-5", children });
5
5
  }
6
6
  function SectionHeader({ color, children }) {
7
7
  const textColor = color ? `text-${color}-500/70` : "text-neutral-500";
8
- return /* @__PURE__ */ jsx("p", { className: `${textColor} text-xs uppercase font-semibold pb-0.5 border-b border-neutral-700/50 mb-2.5`, style: { letterSpacing: "0.8px" }, children });
8
+ return /* @__PURE__ */ jsx("p", { className: `${textColor} text-sm uppercase font-semibold pb-0.5 border-b border-neutral-700/50 mb-2.5`, style: { letterSpacing: "0.8px" }, children });
9
9
  }
10
10
  function DL({ children }) {
11
11
  return /* @__PURE__ */ jsx("div", { className: "mb-5", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-[auto_1fr] gap-x-4", children }) });
@@ -13,12 +13,12 @@ function DL({ children }) {
13
13
  function DLRow({ term, children, even }) {
14
14
  const bg = even ? "bg-white/[0.015]" : "";
15
15
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16
- /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} font-semibold text-sm whitespace-nowrap`, children: term }),
17
- /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} text-sm text-neutral-400`, children })
16
+ /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} font-semibold text-md whitespace-nowrap`, children: term }),
17
+ /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} text-md text-neutral-400`, children })
18
18
  ] });
19
19
  }
20
20
  function UL({ children }) {
21
- return /* @__PURE__ */ jsx("ul", { className: "text-sm text-neutral-400 space-y-2 mb-5", children });
21
+ return /* @__PURE__ */ jsx("ul", { className: "text-md text-neutral-400 space-y-2 mb-5", children });
22
22
  }
23
23
  function LI({ color, children }) {
24
24
  return /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2", children: [
@@ -30,7 +30,7 @@ function OL({ children }) {
30
30
  return /* @__PURE__ */ jsx("div", { className: "space-y-2 mb-5", children });
31
31
  }
32
32
  function OLI({ n, color, children }) {
33
- return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2.5 text-sm", children: [
33
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2.5 text-md", children: [
34
34
  /* @__PURE__ */ jsxs("span", { className: `text-${color}-400 shrink-0 w-4 text-right font-bold`, children: [
35
35
  n,
36
36
  "."
@@ -61,17 +61,17 @@ function getCalloutColors(color) {
61
61
  }
62
62
  function Callout({ color, children }) {
63
63
  const c = CALLOUT_COLORS[color] ?? CALLOUT_COLORS.blue;
64
- return /* @__PURE__ */ jsx("div", { className: `border-l-4 ${c.borderL} border-y ${c.borderY} ${c.bg} px-3 py-2.5 rounded-r mb-5 text-sm text-neutral-400`, children });
64
+ return /* @__PURE__ */ jsx("div", { className: `border-l-4 ${c.borderL} border-y ${c.borderY} ${c.bg} px-3 py-2.5 rounded-r mb-5 text-md text-neutral-400`, children });
65
65
  }
66
66
  function CalloutCode({ color, children }) {
67
67
  const c = CALLOUT_COLORS[color] ?? CALLOUT_COLORS.blue;
68
- return /* @__PURE__ */ jsx("code", { className: `block bg-neutral-800/80 px-2 py-1 rounded mt-1.5 text-sm ${c.codeText}`, children });
68
+ return /* @__PURE__ */ jsx("code", { className: `block bg-neutral-800/80 px-2 py-1 rounded mt-1.5 text-md ${c.codeText}`, children });
69
69
  }
70
70
  function CalloutDim({ children }) {
71
71
  return /* @__PURE__ */ jsx("p", { className: "text-neutral-500 mt-1.5", children });
72
72
  }
73
73
  function CodeBlock({ children }) {
74
- return /* @__PURE__ */ jsx("div", { className: "bg-neutral-900/60 rounded-md p-3 font-mono text-xs text-neutral-400 mb-5 whitespace-pre overflow-x-auto leading-normal", children });
74
+ return /* @__PURE__ */ jsx("div", { className: "bg-neutral-900/60 rounded-md p-3 font-mono text-sm text-neutral-400 mb-5 whitespace-pre overflow-x-auto leading-normal", children });
75
75
  }
76
76
  function CK({ color, children }) {
77
77
  const textColor = color ? `text-${color}-400` : "";
@@ -98,13 +98,13 @@ function LocationItem({
98
98
  className: `w-2 h-2 rounded-full bg-${color}-500/50 border border-${color}-500 shrink-0`
99
99
  }
100
100
  ),
101
- /* @__PURE__ */ jsx("span", { className: `text-${color}-400 text-sm font-semibold`, children: label })
101
+ /* @__PURE__ */ jsx("span", { className: `text-${color}-400 text-md font-semibold`, children: label })
102
102
  ] }),
103
- /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} text-sm text-neutral-400`, children })
103
+ /* @__PURE__ */ jsx("div", { className: `py-2 border-b border-neutral-800/60 ${bg} text-md text-neutral-400`, children })
104
104
  ] });
105
105
  }
106
106
  function TitledLI({ color, title, children }) {
107
- return /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm text-neutral-400", children: [
107
+ return /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-md text-neutral-400", children: [
108
108
  /* @__PURE__ */ jsx("span", { className: `text-${color}-400 shrink-0`, style: { marginTop: "3px", fontSize: "18px", lineHeight: "14px" }, children: "\u2022" }),
109
109
  /* @__PURE__ */ jsxs("span", { children: [
110
110
  /* @__PURE__ */ jsx("span", { className: `text-${color}-300 font-semibold`, children: title }),
@@ -115,7 +115,7 @@ function TitledLI({ color, title, children }) {
115
115
  ] });
116
116
  }
117
117
  function CalloutDialog({ color, lines }) {
118
- return /* @__PURE__ */ jsx("div", { className: "bg-neutral-800/80 rounded px-2 py-1 mt-1.5 flex flex-col gap-0.5 text-sm", children: lines.map((line, idx) => /* @__PURE__ */ jsxs("div", { children: [
118
+ return /* @__PURE__ */ jsx("div", { className: "bg-neutral-800/80 rounded px-2 py-1 mt-1.5 flex flex-col gap-0.5 text-md", children: lines.map((line, idx) => /* @__PURE__ */ jsxs("div", { children: [
119
119
  /* @__PURE__ */ jsxs("span", { className: `text-${color}-300 font-semibold mr-1`, children: [
120
120
  line.speaker,
121
121
  ":"
@@ -131,7 +131,7 @@ function StatusBadge({ value, badgeColor, label, children, even }) {
131
131
  DLRow,
132
132
  {
133
133
  term: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5", children: [
134
- /* @__PURE__ */ jsx("span", { className: `inline-flex items-center justify-center w-5 h-5 rounded-full bg-${badgeColor}-500/20 text-${badgeColor}-400 text-xss font-bold shrink-0`, children: value }),
134
+ /* @__PURE__ */ jsx("span", { className: `inline-flex items-center justify-center w-5 h-5 rounded-full bg-${badgeColor}-500/20 text-${badgeColor}-400 text-xs font-bold shrink-0`, children: value }),
135
135
  /* @__PURE__ */ jsx("span", { className: `text-${badgeColor}-400 font-semibold`, children: label })
136
136
  ] }),
137
137
  even,
package/dist/index.d.ts CHANGED
@@ -731,6 +731,10 @@ declare function collectDirPaths(nodes: FileTreeNode[], rootName?: string, prefi
731
731
  declare function FileTree({ nodes, rootName, selectedPath, onSelectFile, prefix, expandedPaths, onTogglePath, accentColor }: FileTreeProps): react_jsx_runtime.JSX.Element;
732
732
 
733
733
  interface EditorToolbarProps {
734
+ /** Optional title displayed in the toolbar */
735
+ title?: string;
736
+ /** Optional description displayed below the title */
737
+ description?: string;
734
738
  /** Whether content has unsaved changes */
735
739
  isDirty: boolean;
736
740
  /** Whether save operation is in progress */
@@ -755,7 +759,7 @@ interface EditorToolbarProps {
755
759
  /** Optional: Additional action buttons on the right side (before save) */
756
760
  rightActions?: ActionItem[];
757
761
  }
758
- declare function EditorToolbar({ isDirty, isSaving, onSave, canReset, onReset, resetTooltip, isReadOnly, hasError, leftActions, rightActions, }: EditorToolbarProps): react_jsx_runtime.JSX.Element | null;
762
+ declare function EditorToolbar({ title, description, isDirty, isSaving, onSave, canReset, onReset, resetTooltip, isReadOnly, hasError, leftActions, rightActions, }: EditorToolbarProps): react_jsx_runtime.JSX.Element | null;
759
763
 
760
764
  /** Status banner configuration for outdated/info messages */
761
765
  interface StatusBanner {
@@ -2216,8 +2220,9 @@ interface SnippetsEditorProps {
2216
2220
  /** Section description, e.g. "Define snippets to reuse in skills prompts..." */
2217
2221
  description?: string;
2218
2222
  className?: string;
2223
+ accentColor?: string;
2219
2224
  }
2220
- declare function SnippetsEditor({ api, snippets, title, description, className, }: SnippetsEditorProps): react_jsx_runtime.JSX.Element;
2225
+ declare function SnippetsEditor({ api, snippets, title, description, className, accentColor, }: SnippetsEditorProps): react_jsx_runtime.JSX.Element;
2221
2226
 
2222
2227
  /**
2223
2228
  * useSnippetsEditor — Form state and CRUD hook for the snippets editor
@@ -2482,8 +2487,9 @@ interface FilesPanelProps {
2482
2487
  onAction?: (action: string, path: string) => void;
2483
2488
  showSearch?: boolean;
2484
2489
  className?: string;
2490
+ accentColor?: string;
2485
2491
  }
2486
- declare function FilesPanel({ files, selectedPath, onSelect, onAction, showSearch, className, }: FilesPanelProps): react_jsx_runtime.JSX.Element;
2492
+ declare function FilesPanel({ files, selectedPath, onSelect, onAction, showSearch, className, accentColor, }: FilesPanelProps): react_jsx_runtime.JSX.Element;
2487
2493
 
2488
2494
  /** Searchable panel for browsing, copying, and inserting code snippets. */
2489
2495
  interface Snippet {
@@ -2587,14 +2593,24 @@ interface NavCardProps {
2587
2593
  title: string;
2588
2594
  description?: string;
2589
2595
  icon?: IconName;
2596
+ /** Custom icon component. Takes precedence over icon name. */
2597
+ IconComponent?: React.ComponentType<{
2598
+ className?: string;
2599
+ }>;
2590
2600
  iconColor?: string;
2591
- badge?: number | string;
2592
- badgeColor?: BadgeColor;
2601
+ label?: {
2602
+ text: string;
2603
+ color: LabelColor;
2604
+ tooltip: {
2605
+ description: string;
2606
+ };
2607
+ };
2608
+ stats?: string;
2593
2609
  onClick?: () => void;
2594
2610
  disabled?: boolean;
2595
2611
  className?: string;
2596
2612
  }
2597
- declare function NavCard({ title, description, icon, iconColor, badge, badgeColor, onClick, disabled, className, }: NavCardProps): react_jsx_runtime.JSX.Element;
2613
+ declare function NavCard({ title, description, icon, IconComponent, iconColor, label, stats, onClick, disabled, className, }: NavCardProps): react_jsx_runtime.JSX.Element;
2598
2614
 
2599
2615
  interface ExtensionListCardProps {
2600
2616
  /** Lucide icon component */
@@ -2810,8 +2826,9 @@ interface SettingsTreeNavProps {
2810
2826
  tree: SettingsTreeNode[];
2811
2827
  selectedPath: string;
2812
2828
  onSelectPath: (path: string) => void;
2829
+ accentColor?: string;
2813
2830
  }
2814
- declare function SettingsTreeNav({ tree, selectedPath, onSelectPath }: SettingsTreeNavProps): react_jsx_runtime.JSX.Element;
2831
+ declare function SettingsTreeNav({ tree, selectedPath, onSelectPath, accentColor }: SettingsTreeNavProps): react_jsx_runtime.JSX.Element;
2815
2832
 
2816
2833
  interface SettingsHeaderProps {
2817
2834
  description: string;