@usetheo/ui 0.13.1 → 0.13.2

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 (162) hide show
  1. package/dist/{chunk-REFY5MLN.js → chunk-2NTEJRPA.js} +5 -5
  2. package/dist/{chunk-REFY5MLN.js.map → chunk-2NTEJRPA.js.map} +1 -1
  3. package/dist/{chunk-2EUKYGH5.js → chunk-357XIC2N.js} +3 -3
  4. package/dist/chunk-357XIC2N.js.map +1 -0
  5. package/dist/{chunk-RPZMFGYI.js → chunk-3YOPTHZH.js} +3 -3
  6. package/dist/{chunk-RPZMFGYI.js.map → chunk-3YOPTHZH.js.map} +1 -1
  7. package/dist/{chunk-KFUFTZLS.js → chunk-44ZNZZUS.js} +3 -3
  8. package/dist/{chunk-KFUFTZLS.js.map → chunk-44ZNZZUS.js.map} +1 -1
  9. package/dist/{chunk-PJUP4BJD.js → chunk-47IPOYLQ.js} +3 -3
  10. package/dist/{chunk-PJUP4BJD.js.map → chunk-47IPOYLQ.js.map} +1 -1
  11. package/dist/{chunk-OJPPSJMF.js → chunk-4XYFJIRC.js} +3 -3
  12. package/dist/{chunk-OJPPSJMF.js.map → chunk-4XYFJIRC.js.map} +1 -1
  13. package/dist/{chunk-SOJW47EZ.js → chunk-5YX76GH6.js} +3 -3
  14. package/dist/{chunk-SOJW47EZ.js.map → chunk-5YX76GH6.js.map} +1 -1
  15. package/dist/{chunk-7T4NK6W6.js → chunk-65YSFZAN.js} +3 -3
  16. package/dist/{chunk-7T4NK6W6.js.map → chunk-65YSFZAN.js.map} +1 -1
  17. package/dist/{chunk-3ZXZGZOX.js → chunk-6ORS6XOE.js} +3 -3
  18. package/dist/{chunk-3ZXZGZOX.js.map → chunk-6ORS6XOE.js.map} +1 -1
  19. package/dist/{chunk-2A3E5Y72.js → chunk-6V2LQEPT.js} +3 -3
  20. package/dist/{chunk-2A3E5Y72.js.map → chunk-6V2LQEPT.js.map} +1 -1
  21. package/dist/{chunk-5XCTTXC3.js → chunk-ACZNFEOZ.js} +3 -3
  22. package/dist/{chunk-5XCTTXC3.js.map → chunk-ACZNFEOZ.js.map} +1 -1
  23. package/dist/{chunk-GLEOUWPN.js → chunk-AJ2LNQUQ.js} +3 -3
  24. package/dist/{chunk-GLEOUWPN.js.map → chunk-AJ2LNQUQ.js.map} +1 -1
  25. package/dist/{chunk-SBKVVVYY.js → chunk-AX6P3SDS.js} +3 -3
  26. package/dist/{chunk-SBKVVVYY.js.map → chunk-AX6P3SDS.js.map} +1 -1
  27. package/dist/{chunk-VB53UMAL.js → chunk-B42EOFRD.js} +3 -3
  28. package/dist/{chunk-VB53UMAL.js.map → chunk-B42EOFRD.js.map} +1 -1
  29. package/dist/{chunk-GIXHBTHH.js → chunk-CFVSXYVT.js} +3 -3
  30. package/dist/{chunk-GIXHBTHH.js.map → chunk-CFVSXYVT.js.map} +1 -1
  31. package/dist/{chunk-KDE3NYTI.js → chunk-CX54TUTT.js} +3 -3
  32. package/dist/{chunk-KDE3NYTI.js.map → chunk-CX54TUTT.js.map} +1 -1
  33. package/dist/{chunk-BP4RQSX7.js → chunk-DJK6H3FD.js} +3 -3
  34. package/dist/{chunk-BP4RQSX7.js.map → chunk-DJK6H3FD.js.map} +1 -1
  35. package/dist/{chunk-4SMYNLTA.js → chunk-EOTSD2GL.js} +3 -3
  36. package/dist/{chunk-4SMYNLTA.js.map → chunk-EOTSD2GL.js.map} +1 -1
  37. package/dist/{chunk-YUFFAWNB.js → chunk-FELH4AAQ.js} +3 -3
  38. package/dist/{chunk-YUFFAWNB.js.map → chunk-FELH4AAQ.js.map} +1 -1
  39. package/dist/{chunk-NEMXW2LB.js → chunk-FM72LBCJ.js} +3 -3
  40. package/dist/{chunk-NEMXW2LB.js.map → chunk-FM72LBCJ.js.map} +1 -1
  41. package/dist/{chunk-VHTAVROO.js → chunk-FNQASFTK.js} +3 -3
  42. package/dist/{chunk-VHTAVROO.js.map → chunk-FNQASFTK.js.map} +1 -1
  43. package/dist/{chunk-Q2BAL2PF.js → chunk-FOE3XXBJ.js} +3 -3
  44. package/dist/{chunk-Q2BAL2PF.js.map → chunk-FOE3XXBJ.js.map} +1 -1
  45. package/dist/{chunk-7BGCWJQR.js → chunk-HKVOCYTN.js} +3 -3
  46. package/dist/{chunk-7BGCWJQR.js.map → chunk-HKVOCYTN.js.map} +1 -1
  47. package/dist/{chunk-JFKBFQA5.js → chunk-HNRFBJ25.js} +3 -3
  48. package/dist/{chunk-JFKBFQA5.js.map → chunk-HNRFBJ25.js.map} +1 -1
  49. package/dist/{chunk-QCQTTOMD.js → chunk-II5Q5RIO.js} +3 -3
  50. package/dist/{chunk-QCQTTOMD.js.map → chunk-II5Q5RIO.js.map} +1 -1
  51. package/dist/{chunk-QRXIYPWP.js → chunk-ITEIRMSH.js} +3 -3
  52. package/dist/{chunk-QRXIYPWP.js.map → chunk-ITEIRMSH.js.map} +1 -1
  53. package/dist/{chunk-JQTCCKZA.js → chunk-JP3SHERK.js} +3 -3
  54. package/dist/{chunk-JQTCCKZA.js.map → chunk-JP3SHERK.js.map} +1 -1
  55. package/dist/{chunk-VBEMLZGX.js → chunk-JS5T2CRO.js} +3 -3
  56. package/dist/{chunk-VBEMLZGX.js.map → chunk-JS5T2CRO.js.map} +1 -1
  57. package/dist/{chunk-VBQFE5RV.js → chunk-KXZH7BTX.js} +3 -3
  58. package/dist/{chunk-VBQFE5RV.js.map → chunk-KXZH7BTX.js.map} +1 -1
  59. package/dist/{chunk-MXB2GVEQ.js → chunk-LB4PMLCX.js} +3 -3
  60. package/dist/{chunk-MXB2GVEQ.js.map → chunk-LB4PMLCX.js.map} +1 -1
  61. package/dist/{chunk-CED2LKHI.js → chunk-LMGE2QEO.js} +3 -3
  62. package/dist/{chunk-CED2LKHI.js.map → chunk-LMGE2QEO.js.map} +1 -1
  63. package/dist/{chunk-PVCW4O37.js → chunk-MLEPCMTF.js} +3 -3
  64. package/dist/{chunk-PVCW4O37.js.map → chunk-MLEPCMTF.js.map} +1 -1
  65. package/dist/{chunk-H5QPJNVD.js → chunk-NSZEZTDO.js} +3 -3
  66. package/dist/{chunk-H5QPJNVD.js.map → chunk-NSZEZTDO.js.map} +1 -1
  67. package/dist/{chunk-AENNHS3S.js → chunk-QBSJM4XI.js} +3 -3
  68. package/dist/{chunk-AENNHS3S.js.map → chunk-QBSJM4XI.js.map} +1 -1
  69. package/dist/{chunk-XJA4B3F5.js → chunk-QCSMJTA6.js} +3 -3
  70. package/dist/{chunk-XJA4B3F5.js.map → chunk-QCSMJTA6.js.map} +1 -1
  71. package/dist/{chunk-G2WCT6PJ.js → chunk-QTG266XU.js} +3 -3
  72. package/dist/{chunk-G2WCT6PJ.js.map → chunk-QTG266XU.js.map} +1 -1
  73. package/dist/{chunk-RLWULF5B.js → chunk-RMJYXHBX.js} +3 -3
  74. package/dist/{chunk-RLWULF5B.js.map → chunk-RMJYXHBX.js.map} +1 -1
  75. package/dist/{chunk-P44UAK45.js → chunk-SPGNNN4R.js} +3 -3
  76. package/dist/{chunk-P44UAK45.js.map → chunk-SPGNNN4R.js.map} +1 -1
  77. package/dist/{chunk-CSEGVTKO.js → chunk-T4Z7HBZR.js} +3 -3
  78. package/dist/{chunk-CSEGVTKO.js.map → chunk-T4Z7HBZR.js.map} +1 -1
  79. package/dist/{chunk-PZGUZHI7.js → chunk-TW5I37AE.js} +3 -3
  80. package/dist/{chunk-PZGUZHI7.js.map → chunk-TW5I37AE.js.map} +1 -1
  81. package/dist/{chunk-AXNJFBYX.js → chunk-UJAWV6LM.js} +3 -3
  82. package/dist/{chunk-AXNJFBYX.js.map → chunk-UJAWV6LM.js.map} +1 -1
  83. package/dist/{chunk-4DTLUBRW.js → chunk-V2WCZBVE.js} +4 -4
  84. package/dist/{chunk-4DTLUBRW.js.map → chunk-V2WCZBVE.js.map} +1 -1
  85. package/dist/{chunk-YES6SPDT.js → chunk-V4LRBYOD.js} +3 -3
  86. package/dist/{chunk-YES6SPDT.js.map → chunk-V4LRBYOD.js.map} +1 -1
  87. package/dist/{chunk-4UBFLXS3.js → chunk-VFRFUU7A.js} +3 -3
  88. package/dist/{chunk-4UBFLXS3.js.map → chunk-VFRFUU7A.js.map} +1 -1
  89. package/dist/{chunk-BWIDDAR7.js → chunk-VLNFUEOR.js} +3 -3
  90. package/dist/{chunk-BWIDDAR7.js.map → chunk-VLNFUEOR.js.map} +1 -1
  91. package/dist/{chunk-ZJXOHLQE.js → chunk-VU7XKD4G.js} +3 -3
  92. package/dist/{chunk-ZJXOHLQE.js.map → chunk-VU7XKD4G.js.map} +1 -1
  93. package/dist/{chunk-V3HFDVZ3.js → chunk-W24RR5OD.js} +3 -3
  94. package/dist/{chunk-V3HFDVZ3.js.map → chunk-W24RR5OD.js.map} +1 -1
  95. package/dist/{chunk-A3OU6ICP.js → chunk-W743ORLA.js} +3 -3
  96. package/dist/{chunk-A3OU6ICP.js.map → chunk-W743ORLA.js.map} +1 -1
  97. package/dist/{chunk-TJLULCZW.js → chunk-WQVEJJV7.js} +3 -3
  98. package/dist/{chunk-TJLULCZW.js.map → chunk-WQVEJJV7.js.map} +1 -1
  99. package/dist/{chunk-ZAMPCRFJ.js → chunk-WX4Q4DTX.js} +3 -3
  100. package/dist/{chunk-ZAMPCRFJ.js.map → chunk-WX4Q4DTX.js.map} +1 -1
  101. package/dist/{chunk-U3AEEFVB.js → chunk-Y7JTBQUQ.js} +3 -3
  102. package/dist/{chunk-U3AEEFVB.js.map → chunk-Y7JTBQUQ.js.map} +1 -1
  103. package/dist/{chunk-K72DJOXR.js → chunk-ZAP4RIUL.js} +3 -3
  104. package/dist/{chunk-K72DJOXR.js.map → chunk-ZAP4RIUL.js.map} +1 -1
  105. package/dist/{chunk-BPJ3RN3U.js → chunk-ZEDDWVBB.js} +4 -4
  106. package/dist/{chunk-BPJ3RN3U.js.map → chunk-ZEDDWVBB.js.map} +1 -1
  107. package/dist/composites/agent-composer/index.js +2 -2
  108. package/dist/composites/agent-stream/index.js +8 -8
  109. package/dist/composites/agent-tool-renderer/index.js +5 -5
  110. package/dist/composites/approval-card/index.js +1 -1
  111. package/dist/composites/chat-composer/index.js +1 -1
  112. package/dist/composites/chat-message/index.js +6 -6
  113. package/dist/composites/choice-prompt/index.js +1 -1
  114. package/dist/composites/command-palette/index.js +2 -2
  115. package/dist/composites/confirm-dialog/index.js +2 -2
  116. package/dist/composites/confirm-prompt/index.js +1 -1
  117. package/dist/composites/cron-jobs-list/index.js +2 -2
  118. package/dist/composites/data-table/index.js +2 -2
  119. package/dist/composites/domain-config/index.js +1 -1
  120. package/dist/composites/env-var-editor/index.js +1 -1
  121. package/dist/composites/mcp-server-list/index.js +2 -2
  122. package/dist/composites/metric-card/index.js +2 -2
  123. package/dist/composites/multi-select-prompt/index.js +1 -1
  124. package/dist/composites/page-shell/index.js +3 -3
  125. package/dist/composites/permission-modal/index.js +2 -2
  126. package/dist/composites/preview-env-card/index.js +1 -1
  127. package/dist/composites/preview-panel/index.js +1 -1
  128. package/dist/composites/project-card/index.js +1 -1
  129. package/dist/composites/rollback-ui/index.js +1 -1
  130. package/dist/composites/skills-list/index.js +2 -2
  131. package/dist/composites/text-prompt/index.js +1 -1
  132. package/dist/index.js +53 -53
  133. package/dist/primitives/artifact-preview/index.js +1 -1
  134. package/dist/primitives/build-log-stream/index.js +1 -1
  135. package/dist/primitives/card/index.js +1 -1
  136. package/dist/primitives/channel-card/index.js +1 -1
  137. package/dist/primitives/cost-meter/index.js +1 -1
  138. package/dist/primitives/cron-job-card/index.js +1 -1
  139. package/dist/primitives/dialog/index.js +1 -1
  140. package/dist/primitives/diff-viewer/index.js +1 -1
  141. package/dist/primitives/empty-state/index.js +1 -1
  142. package/dist/primitives/folder-context-card/index.js +1 -1
  143. package/dist/primitives/hook-config/index.js +1 -1
  144. package/dist/primitives/hook-event-log/index.js +1 -1
  145. package/dist/primitives/mcp-server-card/index.js +1 -1
  146. package/dist/primitives/memory-editor/index.js +1 -1
  147. package/dist/primitives/metrics-panel/index.js +1 -1
  148. package/dist/primitives/model-card/index.js +1 -1
  149. package/dist/primitives/permission-matrix/index.js +1 -1
  150. package/dist/primitives/pin-input/index.js +1 -1
  151. package/dist/primitives/progress-checklist/index.js +1 -1
  152. package/dist/primitives/recent-folders-list/index.js +1 -1
  153. package/dist/primitives/running-tasks-panel/index.js +1 -1
  154. package/dist/primitives/session-timeline/index.js +1 -1
  155. package/dist/primitives/skill-card/index.js +1 -1
  156. package/dist/primitives/system-prompt-editor/index.js +1 -1
  157. package/dist/primitives/task-plan/index.js +1 -1
  158. package/dist/primitives/terminal-panel/index.js +1 -1
  159. package/dist/primitives/token-usage-chart/index.js +1 -1
  160. package/dist/primitives/tools-list/index.js +1 -1
  161. package/package.json +1 -1
  162. package/dist/chunk-2EUKYGH5.js.map +0 -1
@@ -26,7 +26,7 @@ var EnvVarEditor = forwardRef(
26
26
  {
27
27
  "data-slot": "env-var-editor",
28
28
  ref,
29
- className: cn("rounded-xl border bg-card p-5 shadow-sm", className),
29
+ className: cn("rounded-xl border border-border bg-card p-5 shadow-sm", className),
30
30
  ...props,
31
31
  children: [
32
32
  /* @__PURE__ */ jsx("header", { className: "mb-4 flex items-baseline justify-between gap-3", children: /* @__PURE__ */ jsxs("div", { children: [
@@ -143,5 +143,5 @@ function Row({ entry, onRemove }) {
143
143
  }
144
144
 
145
145
  export { EnvVarEditor };
146
- //# sourceMappingURL=chunk-PVCW4O37.js.map
147
- //# sourceMappingURL=chunk-PVCW4O37.js.map
146
+ //# sourceMappingURL=chunk-MLEPCMTF.js.map
147
+ //# sourceMappingURL=chunk-MLEPCMTF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/env-var-editor/env-var-editor.tsx"],"names":[],"mappings":"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","file":"chunk-PVCW4O37.js","sourcesContent":["\"use client\";\n\nimport { Copy, Eye, EyeOff, Lock, Plus, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { isDev } from \"../../../lib/env.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\n\nexport type EnvScope = \"production\" | \"staging\" | \"preview\" | \"all\" | string;\n\nexport interface EnvVar {\n id: string;\n key: string;\n /**\n * Secret value. If `masked` is true, value is hidden by default.\n */\n value: string;\n masked?: boolean;\n scope?: EnvScope;\n /**\n * Read-only marker (e.g. system-managed vars like THEO_DEPLOY_ID).\n */\n readonly?: boolean;\n}\n\ninterface EnvVarEditorProps extends HTMLAttributes<HTMLDivElement> {\n vars: EnvVar[];\n onAdd?: (entry: Omit<EnvVar, \"id\">) => void;\n onRemove?: (id: string) => void;\n /**\n * Available scope options for the add form. Defaults to a sensible PaaS set.\n */\n scopeOptions?: EnvScope[];\n}\n\nconst DEFAULT_SCOPES: EnvScope[] = [\"production\", \"staging\", \"preview\", \"all\"];\n\n/**\n * EnvVarEditor — table-like editor for environment variables.\n *\n * Mono font on keys/values, mask toggle on secret values, scope badge,\n * remove + copy actions. Add form sits above the list.\n *\n * Stateless: caller controls the list and reacts to onAdd / onRemove.\n */\nconst EnvVarEditor = forwardRef<HTMLDivElement, EnvVarEditorProps>(\n ({ className, vars, onAdd, onRemove, scopeOptions = DEFAULT_SCOPES, ...props }, ref) => {\n const [newKey, setNewKey] = useState(\"\");\n const [newValue, setNewValue] = useState(\"\");\n const [newScope, setNewScope] = useState<EnvScope>(scopeOptions[0] ?? \"production\");\n\n const submit = () => {\n const trimmedKey = newKey.trim();\n if (!trimmedKey) return;\n onAdd?.({ key: trimmedKey, value: newValue, scope: newScope, masked: true });\n setNewKey(\"\");\n setNewValue(\"\");\n };\n\n return (\n <div\n data-slot=\"env-var-editor\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Environment variables</h3>\n <p className=\"text-body-sm text-muted-foreground\">\n {vars.length} {vars.length === 1 ? \"variable\" : \"variables\"}\n </p>\n </div>\n </header>\n\n {onAdd ? (\n <form\n className=\"mb-4 grid grid-cols-[2fr_3fr_auto_auto] gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n >\n <Input\n placeholder=\"DATABASE_URL\"\n value={newKey}\n onChange={(e) => setNewKey(e.target.value)}\n className=\"font-mono\"\n aria-label=\"Variable name\"\n />\n <Input\n placeholder=\"postgresql://…\"\n value={newValue}\n onChange={(e) => setNewValue(e.target.value)}\n className=\"font-mono\"\n aria-label=\"Variable value\"\n />\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n aria-label=\"Variable scope\"\n className={cn(\n \"h-10 rounded-md border border-input bg-card px-3\",\n \"font-sans text-body-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n )}\n >\n {scopeOptions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n <Button type=\"submit\">\n <Plus /> Add\n </Button>\n </form>\n ) : null}\n\n <ul className=\"divide-y divide-border/30\">\n {vars.map((v) => (\n <Row key={v.id} entry={v} {...(onRemove ? { onRemove } : {})} />\n ))}\n {vars.length === 0 ? (\n <li className=\"py-8 text-center text-body-sm text-muted-foreground\">\n No environment variables yet.\n </li>\n ) : null}\n </ul>\n </div>\n );\n },\n);\nEnvVarEditor.displayName = \"EnvVarEditor\";\n\ninterface RowProps {\n entry: EnvVar;\n onRemove?: (id: string) => void;\n}\n\nfunction Row({ entry, onRemove }: RowProps) {\n const [revealed, setRevealed] = useState(!entry.masked);\n\n const value = revealed ? entry.value : \"•\".repeat(Math.min(entry.value.length, 12) || 8);\n\n const copy = () => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(entry.value).catch((err: unknown) => {\n // T7.6: dev-only warning so engineers see something when clipboard\n // fails (Safari/Firefox iframe sandbox, document not focused,\n // Permissions-Policy block). Production stays silent — behavior is\n // fail-safe (user can still copy manually).\n if (isDev()) {\n // biome-ignore lint/suspicious/noConsole: dev-only clipboard diagnostic (T7.6)\n console.warn(\"[@theokit/ui] EnvVarEditor clipboard write failed:\", err);\n }\n });\n }\n };\n\n return (\n <li className=\"grid grid-cols-[2fr_3fr_auto_auto] items-center gap-3 py-3\">\n <span className=\"truncate font-mono text-code-sm text-foreground\">{entry.key}</span>\n <span className=\"flex items-center gap-2 truncate font-mono text-code-sm text-muted-foreground\">\n {entry.readonly ? <Lock className=\"size-3\" aria-hidden=\"true\" /> : null}\n {value}\n </span>\n <Badge variant={entry.scope === \"production\" ? \"primary\" : \"default\"}>\n {entry.scope ?? \"all\"}\n </Badge>\n <div className=\"flex items-center gap-0.5\">\n {entry.masked ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => setRevealed((r) => !r)}\n aria-label={revealed ? \"Hide value\" : \"Reveal value\"}\n >\n {revealed ? <EyeOff /> : <Eye />}\n </Button>\n ) : null}\n <Button size=\"icon\" variant=\"ghost\" onClick={copy} aria-label=\"Copy value\">\n <Copy />\n </Button>\n {onRemove && !entry.readonly ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onRemove(entry.id)}\n aria-label={`Remove ${entry.key}`}\n >\n <Trash2 />\n </Button>\n ) : null}\n </div>\n </li>\n );\n}\n\nexport { EnvVarEditor };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/env-var-editor/env-var-editor.tsx"],"names":[],"mappings":"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","file":"chunk-MLEPCMTF.js","sourcesContent":["\"use client\";\n\nimport { Copy, Eye, EyeOff, Lock, Plus, Trash2 } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { isDev } from \"../../../lib/env.js\";\nimport { Badge } from \"../../primitives/badge/index.js\";\nimport { Button } from \"../../primitives/button/index.js\";\nimport { Input } from \"../../primitives/input/index.js\";\n\nexport type EnvScope = \"production\" | \"staging\" | \"preview\" | \"all\" | string;\n\nexport interface EnvVar {\n id: string;\n key: string;\n /**\n * Secret value. If `masked` is true, value is hidden by default.\n */\n value: string;\n masked?: boolean;\n scope?: EnvScope;\n /**\n * Read-only marker (e.g. system-managed vars like THEO_DEPLOY_ID).\n */\n readonly?: boolean;\n}\n\ninterface EnvVarEditorProps extends HTMLAttributes<HTMLDivElement> {\n vars: EnvVar[];\n onAdd?: (entry: Omit<EnvVar, \"id\">) => void;\n onRemove?: (id: string) => void;\n /**\n * Available scope options for the add form. Defaults to a sensible PaaS set.\n */\n scopeOptions?: EnvScope[];\n}\n\nconst DEFAULT_SCOPES: EnvScope[] = [\"production\", \"staging\", \"preview\", \"all\"];\n\n/**\n * EnvVarEditor — table-like editor for environment variables.\n *\n * Mono font on keys/values, mask toggle on secret values, scope badge,\n * remove + copy actions. Add form sits above the list.\n *\n * Stateless: caller controls the list and reacts to onAdd / onRemove.\n */\nconst EnvVarEditor = forwardRef<HTMLDivElement, EnvVarEditorProps>(\n ({ className, vars, onAdd, onRemove, scopeOptions = DEFAULT_SCOPES, ...props }, ref) => {\n const [newKey, setNewKey] = useState(\"\");\n const [newValue, setNewValue] = useState(\"\");\n const [newScope, setNewScope] = useState<EnvScope>(scopeOptions[0] ?? \"production\");\n\n const submit = () => {\n const trimmedKey = newKey.trim();\n if (!trimmedKey) return;\n onAdd?.({ key: trimmedKey, value: newValue, scope: newScope, masked: true });\n setNewKey(\"\");\n setNewValue(\"\");\n };\n\n return (\n <div\n data-slot=\"env-var-editor\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card p-5 shadow-sm\", className)}\n {...props}\n >\n <header className=\"mb-4 flex items-baseline justify-between gap-3\">\n <div>\n <h3 className=\"font-display text-title-md tracking-tight\">Environment variables</h3>\n <p className=\"text-body-sm text-muted-foreground\">\n {vars.length} {vars.length === 1 ? \"variable\" : \"variables\"}\n </p>\n </div>\n </header>\n\n {onAdd ? (\n <form\n className=\"mb-4 grid grid-cols-[2fr_3fr_auto_auto] gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n submit();\n }}\n >\n <Input\n placeholder=\"DATABASE_URL\"\n value={newKey}\n onChange={(e) => setNewKey(e.target.value)}\n className=\"font-mono\"\n aria-label=\"Variable name\"\n />\n <Input\n placeholder=\"postgresql://…\"\n value={newValue}\n onChange={(e) => setNewValue(e.target.value)}\n className=\"font-mono\"\n aria-label=\"Variable value\"\n />\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n aria-label=\"Variable scope\"\n className={cn(\n \"h-10 rounded-md border border-input bg-card px-3\",\n \"font-sans text-body-sm\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n )}\n >\n {scopeOptions.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n <Button type=\"submit\">\n <Plus /> Add\n </Button>\n </form>\n ) : null}\n\n <ul className=\"divide-y divide-border/30\">\n {vars.map((v) => (\n <Row key={v.id} entry={v} {...(onRemove ? { onRemove } : {})} />\n ))}\n {vars.length === 0 ? (\n <li className=\"py-8 text-center text-body-sm text-muted-foreground\">\n No environment variables yet.\n </li>\n ) : null}\n </ul>\n </div>\n );\n },\n);\nEnvVarEditor.displayName = \"EnvVarEditor\";\n\ninterface RowProps {\n entry: EnvVar;\n onRemove?: (id: string) => void;\n}\n\nfunction Row({ entry, onRemove }: RowProps) {\n const [revealed, setRevealed] = useState(!entry.masked);\n\n const value = revealed ? entry.value : \"•\".repeat(Math.min(entry.value.length, 12) || 8);\n\n const copy = () => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(entry.value).catch((err: unknown) => {\n // T7.6: dev-only warning so engineers see something when clipboard\n // fails (Safari/Firefox iframe sandbox, document not focused,\n // Permissions-Policy block). Production stays silent — behavior is\n // fail-safe (user can still copy manually).\n if (isDev()) {\n // biome-ignore lint/suspicious/noConsole: dev-only clipboard diagnostic (T7.6)\n console.warn(\"[@theokit/ui] EnvVarEditor clipboard write failed:\", err);\n }\n });\n }\n };\n\n return (\n <li className=\"grid grid-cols-[2fr_3fr_auto_auto] items-center gap-3 py-3\">\n <span className=\"truncate font-mono text-code-sm text-foreground\">{entry.key}</span>\n <span className=\"flex items-center gap-2 truncate font-mono text-code-sm text-muted-foreground\">\n {entry.readonly ? <Lock className=\"size-3\" aria-hidden=\"true\" /> : null}\n {value}\n </span>\n <Badge variant={entry.scope === \"production\" ? \"primary\" : \"default\"}>\n {entry.scope ?? \"all\"}\n </Badge>\n <div className=\"flex items-center gap-0.5\">\n {entry.masked ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => setRevealed((r) => !r)}\n aria-label={revealed ? \"Hide value\" : \"Reveal value\"}\n >\n {revealed ? <EyeOff /> : <Eye />}\n </Button>\n ) : null}\n <Button size=\"icon\" variant=\"ghost\" onClick={copy} aria-label=\"Copy value\">\n <Copy />\n </Button>\n {onRemove && !entry.readonly ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n onClick={() => onRemove(entry.id)}\n aria-label={`Remove ${entry.key}`}\n >\n <Trash2 />\n </Button>\n ) : null}\n </div>\n </li>\n );\n}\n\nexport { EnvVarEditor };\n"]}
@@ -21,7 +21,7 @@ var SystemPromptEditor = forwardRef(
21
21
  {
22
22
  "data-slot": "system-prompt-editor",
23
23
  ref,
24
- className: cn("rounded-xl border bg-card", className),
24
+ className: cn("rounded-xl border border-border bg-card", className),
25
25
  ...props,
26
26
  children: [
27
27
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3", children: [
@@ -94,5 +94,5 @@ var SystemPromptEditor = forwardRef(
94
94
  SystemPromptEditor.displayName = "SystemPromptEditor";
95
95
 
96
96
  export { SystemPromptEditor };
97
- //# sourceMappingURL=chunk-H5QPJNVD.js.map
98
- //# sourceMappingURL=chunk-H5QPJNVD.js.map
97
+ //# sourceMappingURL=chunk-NSZEZTDO.js.map
98
+ //# sourceMappingURL=chunk-NSZEZTDO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/system-prompt-editor/system-prompt-editor.tsx"],"names":[],"mappings":"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","file":"chunk-H5QPJNVD.js","sourcesContent":["\"use client\";\n\nimport { RotateCcw, Sparkles } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface SystemPromptEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Vendor / default system prompt (read-only). */\n defaultPrompt: string;\n /** Current override; pass empty string for \"use default\". */\n override: string;\n onOverrideChange: (next: string) => void;\n /** Approximate token count for the active prompt. */\n tokenEstimate?: number;\n title?: ReactNode;\n}\n\n/**\n * SystemPromptEditor — surface the agent's system prompt with a clear\n * \"vendor default\" vs \"user override\" toggle.\n *\n * Behavior:\n * - When override is empty, the textarea shows the default (greyed out,\n * editable starts blank).\n * - When user types, override takes effect.\n * - \"Reset to default\" wipes the override.\n *\n * Critical for transparency: a user must be able to see and edit the prompt.\n */\nconst SystemPromptEditor = forwardRef<HTMLDivElement, SystemPromptEditorProps>(\n (\n {\n className,\n defaultPrompt,\n override,\n onOverrideChange,\n tokenEstimate,\n title = \"System prompt\",\n ...props\n },\n ref,\n ) => {\n const usingOverride = override.length > 0;\n const [showDefault, setShowDefault] = useState(false);\n\n return (\n <section\n data-slot=\"system-prompt-editor\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2 py-0.5 font-mono text-label uppercase tracking-wider\",\n usingOverride\n ? \"border-primary/40 bg-primary/10 text-primary\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {usingOverride ? \"Override active\" : \"Vendor default\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {tokenEstimate !== undefined ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n ~{tokenEstimate.toLocaleString()} tokens\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => setShowDefault((v) => !v)}\n className=\"rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showDefault ? \"Hide\" : \"Show\"} default\n </button>\n {usingOverride ? (\n <button\n type=\"button\"\n onClick={() => onOverrideChange(\"\")}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n ) : null}\n </div>\n </header>\n\n {showDefault ? (\n <pre className=\"max-h-48 overflow-auto border-border/40 border-b bg-muted/40 px-4 py-3 font-mono text-code-sm text-muted-foreground\">\n {defaultPrompt}\n </pre>\n ) : null}\n\n <textarea\n value={override}\n onChange={(e) => onOverrideChange(e.target.value)}\n placeholder={\n usingOverride ? \"\" : \"Leave empty to use the vendor default. Type here to override.\"\n }\n rows={8}\n className={cn(\n \"w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n </section>\n );\n },\n);\nSystemPromptEditor.displayName = \"SystemPromptEditor\";\n\nexport { SystemPromptEditor };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/system-prompt-editor/system-prompt-editor.tsx"],"names":[],"mappings":"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","file":"chunk-NSZEZTDO.js","sourcesContent":["\"use client\";\n\nimport { RotateCcw, Sparkles } from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface SystemPromptEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Vendor / default system prompt (read-only). */\n defaultPrompt: string;\n /** Current override; pass empty string for \"use default\". */\n override: string;\n onOverrideChange: (next: string) => void;\n /** Approximate token count for the active prompt. */\n tokenEstimate?: number;\n title?: ReactNode;\n}\n\n/**\n * SystemPromptEditor — surface the agent's system prompt with a clear\n * \"vendor default\" vs \"user override\" toggle.\n *\n * Behavior:\n * - When override is empty, the textarea shows the default (greyed out,\n * editable starts blank).\n * - When user types, override takes effect.\n * - \"Reset to default\" wipes the override.\n *\n * Critical for transparency: a user must be able to see and edit the prompt.\n */\nconst SystemPromptEditor = forwardRef<HTMLDivElement, SystemPromptEditorProps>(\n (\n {\n className,\n defaultPrompt,\n override,\n onOverrideChange,\n tokenEstimate,\n title = \"System prompt\",\n ...props\n },\n ref,\n ) => {\n const usingOverride = override.length > 0;\n const [showDefault, setShowDefault] = useState(false);\n\n return (\n <section\n data-slot=\"system-prompt-editor\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Sparkles className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2 py-0.5 font-mono text-label uppercase tracking-wider\",\n usingOverride\n ? \"border-primary/40 bg-primary/10 text-primary\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {usingOverride ? \"Override active\" : \"Vendor default\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n {tokenEstimate !== undefined ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n ~{tokenEstimate.toLocaleString()} tokens\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => setShowDefault((v) => !v)}\n className=\"rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {showDefault ? \"Hide\" : \"Show\"} default\n </button>\n {usingOverride ? (\n <button\n type=\"button\"\n onClick={() => onOverrideChange(\"\")}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 font-mono text-label text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw className=\"size-3\" /> Reset\n </button>\n ) : null}\n </div>\n </header>\n\n {showDefault ? (\n <pre className=\"max-h-48 overflow-auto border-border/40 border-b bg-muted/40 px-4 py-3 font-mono text-code-sm text-muted-foreground\">\n {defaultPrompt}\n </pre>\n ) : null}\n\n <textarea\n value={override}\n onChange={(e) => onOverrideChange(e.target.value)}\n placeholder={\n usingOverride ? \"\" : \"Leave empty to use the vendor default. Type here to override.\"\n }\n rows={8}\n className={cn(\n \"w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n </section>\n );\n },\n);\nSystemPromptEditor.displayName = \"SystemPromptEditor\";\n\nexport { SystemPromptEditor };\n"]}
@@ -9,7 +9,7 @@ var FolderContextCard = forwardRef(
9
9
  {
10
10
  "data-slot": "folder-context-card",
11
11
  ref,
12
- className: cn("rounded-xl border bg-card p-4", className),
12
+ className: cn("rounded-xl border border-border bg-card p-4", className),
13
13
  ...props,
14
14
  children: [
15
15
  title ? /* @__PURE__ */ jsx("header", { className: "mb-3 flex items-center justify-between", children: /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) }) : null,
@@ -79,5 +79,5 @@ function Tree({
79
79
  }
80
80
 
81
81
  export { FolderContextCard };
82
- //# sourceMappingURL=chunk-AENNHS3S.js.map
83
- //# sourceMappingURL=chunk-AENNHS3S.js.map
82
+ //# sourceMappingURL=chunk-QBSJM4XI.js.map
83
+ //# sourceMappingURL=chunk-QBSJM4XI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/folder-context-card/folder-context-card.tsx"],"names":[],"mappings":";;;;;AA4CA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,YAAA,EAAc,GAAG,KAAA,EAAM,EAAG,GAAA,qBACtD,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,KAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA,EACnE,CAAA,GACE,IAAA;AAAA,wBACJ,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAmB,GAAI,YAAA,GAAe,EAAE,YAAA,EAAa,GAAI,EAAC,EAAI,KAAA,EAAO,CAAA,EAAG;AAAA;AAAA;AAAA;AAGpF;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;AAEhC,SAAS,IAAA,CAAK;AAAA,EACZ,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,KAAA,KAAU,CAAA,GAAI,SAAA,GAAY,OAAO,CAAA,EACxD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACtB,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,KAAS,KAAA,CAAM,IAAA,KAAS,WAAW,MAAA,GAAS,IAAA,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,KAAS,QAAA,IAAY,MAAM,QAAA,IAAY,KAAA,CAAM,SAAS,MAAA,GAAS,CAAA;AACzF,IAAA,4BACG,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,YAAA,GAAe,KAAA,CAAM,EAAE,CAAA;AAAA,UACtC,SAAA,EAAW,EAAA;AAAA,YACT,uDAAA;AAAA,YACA,wCAAA;AAAA,YACA,kCAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,OAAO,EAAE,WAAA,EAAa,GAAG,GAAA,GAAM,KAAA,GAAQ,GAAG,CAAA,GAAA,CAAA,EAAM;AAAA,UAE/C,QAAA,EAAA;AAAA,YAAA,WAAA,mBACC,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,4DAAA;AAAA,kBACA,MAAM,IAAA,IAAQ;AAAA,iBAChB;AAAA,gBACA,aAAA,EAAY;AAAA;AAAA,gCAGd,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,eAAY,MAAA,EAAO,CAAA;AAAA,4BAE3C,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,iBAAA;AAAA,kBACA,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,cAAA,GAAiB;AAAA,iBAC7C;AAAA,gBACA,aAAA,EAAY;AAAA;AAAA,aACd;AAAA,4BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,gBAAM,IAAA,EAAK,CAAA;AAAA,YACvD,KAAA,CAAM;AAAA;AAAA;AAAA,OACT;AAAA,MACC,WAAA,IAAe,MAAM,IAAA,mBACpB,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,QAAA;AAAA,UACd,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,UACxC,OAAO,KAAA,GAAQ;AAAA;AAAA,OACjB,GACE;AAAA,KAAA,EAAA,EAvCG,MAAM,EAwCf,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ","file":"chunk-AENNHS3S.js","sourcesContent":["import { ChevronRight, File, Folder } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport interface FolderEntry {\n id: string;\n name: string;\n kind: \"folder\" | \"file\";\n /**\n * If true, the entry is expanded (icons + nested children).\n * Pure visual flag; toggling is the caller's job.\n */\n open?: boolean;\n /**\n * Optional nested entries when this is a folder.\n */\n children?: FolderEntry[];\n /** Optional adornment after the name (badge, modified indicator). */\n trailing?: ReactNode;\n /** Override the icon. */\n icon?: IconComponent;\n}\n\ninterface FolderContextCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n /**\n * Root entries shown directly in the card.\n */\n entries: FolderEntry[];\n /**\n * Fires when an entry row is clicked.\n */\n onEntryClick?: (id: string) => void;\n}\n\n/**\n * FolderContextCard — file/folder tree fragment for the right inspector.\n *\n * Visual: 1-level tree with chevron indicating expanded state. Renders nested\n * children recursively, but does not manage open state — caller controls\n * `entry.open` and reacts to `onEntryClick`.\n */\nconst FolderContextCard = forwardRef<HTMLElement, FolderContextCardProps>(\n ({ className, title, entries, onEntryClick, ...props }, ref) => (\n <section\n data-slot=\"folder-context-card\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-4\", className)}\n {...props}\n >\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <Tree entries={entries} {...(onEntryClick ? { onEntryClick } : {})} depth={0} />\n </section>\n ),\n);\nFolderContextCard.displayName = \"FolderContextCard\";\n\nfunction Tree({\n entries,\n onEntryClick,\n depth,\n}: {\n entries: FolderEntry[];\n onEntryClick?: (id: string) => void;\n depth: number;\n}) {\n return (\n <ul className={cn(\"grid\", depth === 0 ? \"gap-0.5\" : \"gap-0\")}>\n {entries.map((entry) => {\n const IconComp = entry.icon ?? (entry.kind === \"folder\" ? Folder : File);\n const hasChildren = entry.kind === \"folder\" && entry.children && entry.children.length > 0;\n return (\n <li key={entry.id}>\n <button\n type=\"button\"\n onClick={() => onEntryClick?.(entry.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5\",\n \"font-sans text-body-sm text-foreground\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n style={{ paddingLeft: `${0.5 + depth * 0.9}rem` }}\n >\n {hasChildren ? (\n <ChevronRight\n className={cn(\n \"size-3 shrink-0 text-muted-foreground transition-transform\",\n entry.open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : (\n <span className=\"w-3\" aria-hidden=\"true\" />\n )}\n <IconComp\n className={cn(\n \"size-4 shrink-0\",\n entry.kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n />\n <span className=\"flex-1 truncate text-left\">{entry.name}</span>\n {entry.trailing}\n </button>\n {hasChildren && entry.open ? (\n <Tree\n entries={entry.children as FolderEntry[]}\n {...(onEntryClick ? { onEntryClick } : {})}\n depth={depth + 1}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport { FolderContextCard };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/folder-context-card/folder-context-card.tsx"],"names":[],"mappings":"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","file":"chunk-QBSJM4XI.js","sourcesContent":["import { ChevronRight, File, Folder } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport interface FolderEntry {\n id: string;\n name: string;\n kind: \"folder\" | \"file\";\n /**\n * If true, the entry is expanded (icons + nested children).\n * Pure visual flag; toggling is the caller's job.\n */\n open?: boolean;\n /**\n * Optional nested entries when this is a folder.\n */\n children?: FolderEntry[];\n /** Optional adornment after the name (badge, modified indicator). */\n trailing?: ReactNode;\n /** Override the icon. */\n icon?: IconComponent;\n}\n\ninterface FolderContextCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title?: ReactNode;\n /**\n * Root entries shown directly in the card.\n */\n entries: FolderEntry[];\n /**\n * Fires when an entry row is clicked.\n */\n onEntryClick?: (id: string) => void;\n}\n\n/**\n * FolderContextCard — file/folder tree fragment for the right inspector.\n *\n * Visual: 1-level tree with chevron indicating expanded state. Renders nested\n * children recursively, but does not manage open state — caller controls\n * `entry.open` and reacts to `onEntryClick`.\n */\nconst FolderContextCard = forwardRef<HTMLElement, FolderContextCardProps>(\n ({ className, title, entries, onEntryClick, ...props }, ref) => (\n <section\n data-slot=\"folder-context-card\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card p-4\", className)}\n {...props}\n >\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <Tree entries={entries} {...(onEntryClick ? { onEntryClick } : {})} depth={0} />\n </section>\n ),\n);\nFolderContextCard.displayName = \"FolderContextCard\";\n\nfunction Tree({\n entries,\n onEntryClick,\n depth,\n}: {\n entries: FolderEntry[];\n onEntryClick?: (id: string) => void;\n depth: number;\n}) {\n return (\n <ul className={cn(\"grid\", depth === 0 ? \"gap-0.5\" : \"gap-0\")}>\n {entries.map((entry) => {\n const IconComp = entry.icon ?? (entry.kind === \"folder\" ? Folder : File);\n const hasChildren = entry.kind === \"folder\" && entry.children && entry.children.length > 0;\n return (\n <li key={entry.id}>\n <button\n type=\"button\"\n onClick={() => onEntryClick?.(entry.id)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5\",\n \"font-sans text-body-sm text-foreground\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n style={{ paddingLeft: `${0.5 + depth * 0.9}rem` }}\n >\n {hasChildren ? (\n <ChevronRight\n className={cn(\n \"size-3 shrink-0 text-muted-foreground transition-transform\",\n entry.open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : (\n <span className=\"w-3\" aria-hidden=\"true\" />\n )}\n <IconComp\n className={cn(\n \"size-4 shrink-0\",\n entry.kind === \"folder\" ? \"text-primary\" : \"text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n />\n <span className=\"flex-1 truncate text-left\">{entry.name}</span>\n {entry.trailing}\n </button>\n {hasChildren && entry.open ? (\n <Tree\n entries={entry.children as FolderEntry[]}\n {...(onEntryClick ? { onEntryClick } : {})}\n depth={depth + 1}\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport { FolderContextCard };\n"]}
@@ -27,7 +27,7 @@ var ProgressChecklist = forwardRef(
27
27
  {
28
28
  "data-slot": "progress-checklist",
29
29
  ref,
30
- className: cn("rounded-xl border bg-card p-4", className),
30
+ className: cn("rounded-xl border border-border bg-card p-4", className),
31
31
  ...props,
32
32
  children: [
33
33
  title ? /* @__PURE__ */ jsx("header", { className: "mb-3 flex items-center justify-between", children: /* @__PURE__ */ jsx("h3", { className: "font-display text-title-md tracking-tight", children: title }) }) : null,
@@ -64,5 +64,5 @@ var ProgressChecklist = forwardRef(
64
64
  ProgressChecklist.displayName = "ProgressChecklist";
65
65
 
66
66
  export { ProgressChecklist };
67
- //# sourceMappingURL=chunk-XJA4B3F5.js.map
68
- //# sourceMappingURL=chunk-XJA4B3F5.js.map
67
+ //# sourceMappingURL=chunk-QCSMJTA6.js.map
68
+ //# sourceMappingURL=chunk-QCSMJTA6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/progress-checklist/progress-checklist.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,cAAA,GAAiD;AAAA,EACrD,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,2BAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,QAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,gCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,IAAA,EAAM,oCAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAiBA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,mBAAmB,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC/D,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,KAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA,EACnE,CAAA,GACE,IAAA;AAAA,4BACH,IAAA,EAAA,EAAG,SAAA,EAAU,cACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACnC,UAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAiB,SAAA,EAAU,6CAAA,EAC1B,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,oDAAA;AAAA,kBACA,QAAA,CAAS,KAAK,MAAM;AAAA,iBACtB;AAAA,gBACA,aAAA,EAAY,MAAA;AAAA,gBAEZ,QAAA,kBAAA,GAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,UAAU,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,cAAc,CAAA,EAAG;AAAA;AAAA,aAC9E;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,cAAA,CAAe,KAAK,MAAM,CAAC,CAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,cAC1E,gBAAA,IAAoB,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,aAAa,MAAA,mBAClE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,kEAAA;AAAA,kBACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,GAAW,GAAG,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,iBAE1D,CAAA,GACE;AAAA,aAAA,EACN;AAAA,WAAA,EAAA,EApBO,KAAK,EAqBd,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA;AAGN;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-XJA4B3F5.js","sourcesContent":["import { Check, CircleDashed, Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { TaskStep, TaskStepStatus } from \"../../../types/task.js\";\n\nconst statusIcon = {\n pending: CircleDashed,\n running: Loader2,\n done: Check,\n skipped: CircleDashed,\n} as const;\n\nconst statusToneText: Record<TaskStepStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n done: \"text-success line-through\",\n skipped: \"text-muted-foreground line-through\",\n};\n\nconst statusBg: Record<TaskStepStatus, string> = {\n pending: \"bg-muted text-muted-foreground\",\n running: \"bg-primary text-primary-foreground\",\n done: \"bg-success text-success-foreground\",\n skipped: \"bg-muted text-muted-foreground\",\n};\n\ninterface ProgressChecklistProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n steps: TaskStep[];\n /**\n * If true, shows percentage bar for running steps with `progress`.\n */\n showProgressBars?: boolean;\n}\n\n/**\n * ProgressChecklist — right-inspector checklist.\n *\n * Visual: vertical list of steps with status dot, label, optional progress bar.\n * Matches WIREMOCKS §3 / §4 (\"Progresso\") with checkmarks and pulse on running.\n */\nconst ProgressChecklist = forwardRef<HTMLDivElement, ProgressChecklistProps>(\n ({ className, title, steps, showProgressBars = true, ...props }, ref) => (\n <section\n data-slot=\"progress-checklist\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card p-4\", className)}\n {...props}\n >\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <ol className=\"grid gap-3\">\n {steps.map((step) => {\n const Icon = statusIcon[step.status];\n return (\n <li key={step.id} className=\"grid grid-cols-[auto_1fr] items-start gap-3\">\n <span\n className={cn(\n \"mt-0.5 grid size-5 place-items-center rounded-full\",\n statusBg[step.status],\n )}\n aria-hidden=\"true\"\n >\n <Icon className={cn(\"size-3\", step.status === \"running\" && \"animate-spin\")} />\n </span>\n <div className=\"min-w-0\">\n <p className={cn(\"text-body-sm\", statusToneText[step.status])}>{step.label}</p>\n {showProgressBars && step.status === \"running\" && step.progress !== undefined ? (\n <div className=\"mt-1.5 h-1 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full bg-primary transition-[width] duration-base ease-out-soft\"\n style={{ width: `${Math.round(step.progress * 100)}%` }}\n />\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ol>\n </section>\n ),\n);\nProgressChecklist.displayName = \"ProgressChecklist\";\n\nexport { ProgressChecklist };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/progress-checklist/progress-checklist.tsx"],"names":[],"mappings":";;;;;AAMA,IAAM,UAAA,GAAa;AAAA,EACjB,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,cAAA,GAAiD;AAAA,EACrD,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,2BAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,QAAA,GAA2C;AAAA,EAC/C,OAAA,EAAS,gCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,IAAA,EAAM,oCAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAiBA,IAAM,iBAAA,GAAoB,UAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,mBAAmB,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC/D,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,6CAAA,EAA+C,SAAS,CAAA;AAAA,MACrE,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,KAAA,mBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAChB,QAAA,kBAAA,GAAA,CAAC,QAAG,SAAA,EAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,EAAM,CAAA,EACnE,CAAA,GACE,IAAA;AAAA,4BACH,IAAA,EAAA,EAAG,SAAA,EAAU,cACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACnC,UAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAiB,SAAA,EAAU,6CAAA,EAC1B,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,oDAAA;AAAA,kBACA,QAAA,CAAS,KAAK,MAAM;AAAA,iBACtB;AAAA,gBACA,aAAA,EAAY,MAAA;AAAA,gBAEZ,QAAA,kBAAA,GAAA,CAAC,QAAK,SAAA,EAAW,EAAA,CAAG,UAAU,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,cAAc,CAAA,EAAG;AAAA;AAAA,aAC9E;AAAA,4BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,cAAA,EAAgB,cAAA,CAAe,KAAK,MAAM,CAAC,CAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,cAC1E,gBAAA,IAAoB,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,aAAa,MAAA,mBAClE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,QAAA,kBAAA,GAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,kEAAA;AAAA,kBACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,GAAW,GAAG,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,iBAE1D,CAAA,GACE;AAAA,aAAA,EACN;AAAA,WAAA,EAAA,EApBO,KAAK,EAqBd,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA;AAGN;AACA,iBAAA,CAAkB,WAAA,GAAc,mBAAA","file":"chunk-QCSMJTA6.js","sourcesContent":["import { Check, CircleDashed, Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { TaskStep, TaskStepStatus } from \"../../../types/task.js\";\n\nconst statusIcon = {\n pending: CircleDashed,\n running: Loader2,\n done: Check,\n skipped: CircleDashed,\n} as const;\n\nconst statusToneText: Record<TaskStepStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n done: \"text-success line-through\",\n skipped: \"text-muted-foreground line-through\",\n};\n\nconst statusBg: Record<TaskStepStatus, string> = {\n pending: \"bg-muted text-muted-foreground\",\n running: \"bg-primary text-primary-foreground\",\n done: \"bg-success text-success-foreground\",\n skipped: \"bg-muted text-muted-foreground\",\n};\n\ninterface ProgressChecklistProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: ReactNode;\n steps: TaskStep[];\n /**\n * If true, shows percentage bar for running steps with `progress`.\n */\n showProgressBars?: boolean;\n}\n\n/**\n * ProgressChecklist — right-inspector checklist.\n *\n * Visual: vertical list of steps with status dot, label, optional progress bar.\n * Matches WIREMOCKS §3 / §4 (\"Progresso\") with checkmarks and pulse on running.\n */\nconst ProgressChecklist = forwardRef<HTMLDivElement, ProgressChecklistProps>(\n ({ className, title, steps, showProgressBars = true, ...props }, ref) => (\n <section\n data-slot=\"progress-checklist\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card p-4\", className)}\n {...props}\n >\n {title ? (\n <header className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </header>\n ) : null}\n <ol className=\"grid gap-3\">\n {steps.map((step) => {\n const Icon = statusIcon[step.status];\n return (\n <li key={step.id} className=\"grid grid-cols-[auto_1fr] items-start gap-3\">\n <span\n className={cn(\n \"mt-0.5 grid size-5 place-items-center rounded-full\",\n statusBg[step.status],\n )}\n aria-hidden=\"true\"\n >\n <Icon className={cn(\"size-3\", step.status === \"running\" && \"animate-spin\")} />\n </span>\n <div className=\"min-w-0\">\n <p className={cn(\"text-body-sm\", statusToneText[step.status])}>{step.label}</p>\n {showProgressBars && step.status === \"running\" && step.progress !== undefined ? (\n <div className=\"mt-1.5 h-1 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-full bg-primary transition-[width] duration-base ease-out-soft\"\n style={{ width: `${Math.round(step.progress * 100)}%` }}\n />\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ol>\n </section>\n ),\n);\nProgressChecklist.displayName = \"ProgressChecklist\";\n\nexport { ProgressChecklist };\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { SkillCard } from './chunk-BWIDDAR7.js';
2
+ import { SkillCard } from './chunk-VLNFUEOR.js';
3
3
  import { cn } from './chunk-EWDN56AS.js';
4
4
  import { Search } from 'lucide-react';
5
5
  import { forwardRef, useState, useMemo } from 'react';
@@ -65,5 +65,5 @@ var SkillsList = forwardRef(
65
65
  SkillsList.displayName = "SkillsList";
66
66
 
67
67
  export { SkillsList };
68
- //# sourceMappingURL=chunk-G2WCT6PJ.js.map
69
- //# sourceMappingURL=chunk-G2WCT6PJ.js.map
68
+ //# sourceMappingURL=chunk-QTG266XU.js.map
69
+ //# sourceMappingURL=chunk-QTG266XU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/skills-list/skills-list.tsx"],"names":[],"mappings":"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","file":"chunk-G2WCT6PJ.js","sourcesContent":["\"use client\";\n\nimport { Search } from \"lucide-react\";\nimport { forwardRef, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { type Skill, SkillCard, type SkillState } from \"../../primitives/skill-card/index.js\";\n\ninterface SkillsListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\" | \"onToggle\"> {\n skills: Skill[];\n title?: ReactNode;\n /** If true, shows a search input above the grid. */\n searchable?: boolean;\n onToggle?: (id: string, next: SkillState) => void;\n}\n\n/**\n * SkillsList — grid of SkillCards with optional search + source filter chips.\n * Pairs with claw-code's `claw skills` inventory but visual.\n */\nconst SkillsList = forwardRef<HTMLDivElement, SkillsListProps>(\n ({ className, skills, title = \"Skills\", searchable = true, onToggle, ...props }, ref) => {\n const [q, setQ] = useState(\"\");\n const filtered = useMemo(() => {\n if (!q.trim()) return skills;\n const needle = q.toLowerCase();\n return skills.filter((s) => {\n const hay = [\n s.name,\n typeof s.description === \"string\" ? s.description : \"\",\n ...(s.triggers ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return hay.includes(needle);\n });\n }, [skills, q]);\n\n return (\n <section\n data-slot=\"skills-list\"\n ref={ref}\n className={cn(\"grid gap-3\", className)}\n aria-label=\"Available skills\"\n {...props}\n >\n {title || searchable ? (\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n {searchable ? (\n <div className=\"relative\">\n <Search\n className=\"-translate-y-1/2 absolute top-1/2 left-2 size-3.5 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <input\n type=\"search\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n placeholder=\"Filter skills…\"\n aria-label=\"Filter skills\"\n className=\"h-8 w-56 rounded-md border border-input bg-card pr-2 pl-7 font-mono text-code-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n ) : null}\n </header>\n ) : null}\n {filtered.length === 0 ? (\n <p className=\"rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No skills match {q ? `\"${q}\"` : \"the current filter\"}.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n {filtered.map((skill) => (\n <SkillCard key={skill.id} skill={skill} {...(onToggle ? { onToggle } : {})} />\n ))}\n </div>\n )}\n </section>\n );\n },\n);\nSkillsList.displayName = \"SkillsList\";\n\nexport { SkillsList };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/skills-list/skills-list.tsx"],"names":[],"mappings":"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","file":"chunk-QTG266XU.js","sourcesContent":["\"use client\";\n\nimport { Search } from \"lucide-react\";\nimport { forwardRef, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { type Skill, SkillCard, type SkillState } from \"../../primitives/skill-card/index.js\";\n\ninterface SkillsListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\" | \"onToggle\"> {\n skills: Skill[];\n title?: ReactNode;\n /** If true, shows a search input above the grid. */\n searchable?: boolean;\n onToggle?: (id: string, next: SkillState) => void;\n}\n\n/**\n * SkillsList — grid of SkillCards with optional search + source filter chips.\n * Pairs with claw-code's `claw skills` inventory but visual.\n */\nconst SkillsList = forwardRef<HTMLDivElement, SkillsListProps>(\n ({ className, skills, title = \"Skills\", searchable = true, onToggle, ...props }, ref) => {\n const [q, setQ] = useState(\"\");\n const filtered = useMemo(() => {\n if (!q.trim()) return skills;\n const needle = q.toLowerCase();\n return skills.filter((s) => {\n const hay = [\n s.name,\n typeof s.description === \"string\" ? s.description : \"\",\n ...(s.triggers ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return hay.includes(needle);\n });\n }, [skills, q]);\n\n return (\n <section\n data-slot=\"skills-list\"\n ref={ref}\n className={cn(\"grid gap-3\", className)}\n aria-label=\"Available skills\"\n {...props}\n >\n {title || searchable ? (\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n {searchable ? (\n <div className=\"relative\">\n <Search\n className=\"-translate-y-1/2 absolute top-1/2 left-2 size-3.5 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <input\n type=\"search\"\n value={q}\n onChange={(e) => setQ(e.target.value)}\n placeholder=\"Filter skills…\"\n aria-label=\"Filter skills\"\n className=\"h-8 w-56 rounded-md border border-input bg-card pr-2 pl-7 font-mono text-code-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n </div>\n ) : null}\n </header>\n ) : null}\n {filtered.length === 0 ? (\n <p className=\"rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No skills match {q ? `\"${q}\"` : \"the current filter\"}.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n {filtered.map((skill) => (\n <SkillCard key={skill.id} skill={skill} {...(onToggle ? { onToggle } : {})} />\n ))}\n </div>\n )}\n </section>\n );\n },\n);\nSkillsList.displayName = \"SkillsList\";\n\nexport { SkillsList };\n"]}
@@ -23,7 +23,7 @@ var MCPServerCard = forwardRef(
23
23
  {
24
24
  "data-slot": "mcp-server-card",
25
25
  ref,
26
- className: cn("grid gap-3 rounded-xl border bg-card p-4", className),
26
+ className: cn("grid gap-3 rounded-xl border border-border bg-card p-4", className),
27
27
  ...props,
28
28
  children: [
29
29
  /* @__PURE__ */ jsxs("header", { className: "flex items-start justify-between gap-3", children: [
@@ -109,5 +109,5 @@ var MCPServerCard = forwardRef(
109
109
  MCPServerCard.displayName = "MCPServerCard";
110
110
 
111
111
  export { MCPServerCard };
112
- //# sourceMappingURL=chunk-RLWULF5B.js.map
113
- //# sourceMappingURL=chunk-RLWULF5B.js.map
112
+ //# sourceMappingURL=chunk-RMJYXHBX.js.map
113
+ //# sourceMappingURL=chunk-RMJYXHBX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/mcp-server-card/mcp-server-card.tsx"],"names":[],"mappings":";;;;;AAwBA,IAAM,aAAA,GAA2E;AAAA,EAC/E,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,OAAO,8CAAA,EAA+C;AAAA,EACvF,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,QAAA,EAAU,EAAE,KAAA,EAAO,UAAA,EAAY,OAAO,8CAAA,EAA+C;AAAA,EACrF,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO;AAAA;AAEX,CAAA;AAeA,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,MAAA,EAAQ,WAAW,YAAA,EAAc,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,iBAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,0CAAA,EAA4C,SAAS,CAAA;AAAA,QAClE,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,wCAAA,EAChB,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,8BAAA,EAA+B,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,8BACpE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,MAAA,CAAO,IAAA,EAAK,CAAA;AAAA,gCAChF,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EACV,iBAAO,QAAA,EACV;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,qEAAA;AAAA,kBACA,+CAAA;AAAA,kBACA,GAAA,CAAI;AAAA,iBACN;AAAA,gBAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACP,WAAA,EACF,CAAA;AAAA,UAEC,MAAA,CAAO,0BACN,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iGAAA,EACV,QAAA,EAAA,MAAA,CAAO,SACV,CAAA,GACE,IAAA;AAAA,UAEH,OAAO,KAAA,CAAM,MAAA,GAAS,oBACrB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0EAAA,EACb,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,KAAA,CAAM,MAAA;AAAA,cAAO;AAAA,aAAA,EACvB,CAAA;AAAA,4BACA,GAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EACZ,iBAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACjB,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,+FAAA;AAAA,gBAET,QAAA,EAAA;AAAA,eAAA;AAAA,cAHI;AAAA,aAKR,CAAA,EACH;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,UAEH,MAAA,CAAO,aAAa,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,mBAC7C,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0EAAA,EACb,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,SAAA,CAAU,MAAA;AAAA,cAAO;AAAA,aAAA,EAC3B,CAAA;AAAA,4BACA,GAAA,CAAC,SAAI,SAAA,EAAU,wBAAA,EACZ,iBAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,qBACrB,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,+FAAA;AAAA,gBAET,QAAA,EAAA;AAAA,eAAA;AAAA,cAHI;AAAA,aAKR,CAAA,EACH;AAAA,WAAA,EACF,CAAA,GACE,IAAA;AAAA,0BAEJ,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uCAAA,EACf,QAAA,EAAA;AAAA,YAAA,SAAA,mBACC,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAAA,gBAClC,SAAA,EAAU,qMAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAU,QAAA,EAAS,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAClC,GACE,IAAA;AAAA,YACH,YAAA,mBACC,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA;AAAA,gBACrC,SAAA,EAAU,4NAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,QAAA,EAAS,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAC7B,GACE;AAAA,WAAA,EACN;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-RLWULF5B.js","sourcesContent":["import { Plug, RotateCcw, Server } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type MCPServerStatus = \"connected\" | \"degraded\" | \"disconnected\" | \"starting\";\n\nexport interface MCPServer {\n id: string;\n /** Friendly name, e.g. \"postgres\". */\n name: string;\n /** Transport endpoint (stdio command or URL). */\n endpoint: string;\n status: MCPServerStatus;\n /** Tools exposed by the server. */\n tools: string[];\n /** Optional resources exposed. */\n resources?: string[];\n /** Diagnostic message when degraded/disconnected. */\n message?: ReactNode;\n /** Auto-restart toggle hint. */\n autoRestart?: boolean;\n}\n\nconst STATUS_CONFIG: Record<MCPServerStatus, { label: string; class: string }> = {\n connected: { label: \"Connected\", class: \"border-success/40 bg-success/15 text-success\" },\n starting: {\n label: \"Starting\",\n class: \"border-primary/40 bg-primary/15 text-primary animate-pulse\",\n },\n degraded: { label: \"Degraded\", class: \"border-warning/40 bg-warning/15 text-warning\" },\n disconnected: {\n label: \"Disconnected\",\n class: \"border-destructive/40 bg-destructive/15 text-destructive\",\n },\n};\n\ninterface MCPServerCardProps extends HTMLAttributes<HTMLElement> {\n server: MCPServer;\n onRestart?: (id: string) => void;\n onDisconnect?: (id: string) => void;\n}\n\n/**\n * MCPServerCard — one MCP server entry showing connection status, the tools\n * it exposes, and inline controls (restart, disconnect).\n *\n * Pairs with claw-code's \"degraded startup reporting\" — failed servers can\n * still appear here with a recovery message.\n */\nconst MCPServerCard = forwardRef<HTMLElement, MCPServerCardProps>(\n ({ className, server, onRestart, onDisconnect, ...props }, ref) => {\n const cfg = STATUS_CONFIG[server.status];\n return (\n <article\n data-slot=\"mcp-server-card\"\n ref={ref}\n className={cn(\"grid gap-3 rounded-xl border bg-card p-4\", className)}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Server className=\"size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n <div className=\"min-w-0\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{server.name}</h4>\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {server.endpoint}\n </p>\n </div>\n </div>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n {server.message ? (\n <p className=\"rounded-md border border-warning/30 bg-warning/10 px-3 py-2 font-mono text-code-sm text-warning\">\n {server.message}\n </p>\n ) : null}\n\n {server.tools.length > 0 ? (\n <div className=\"grid gap-1.5\">\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {server.tools.length} tools\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {server.tools.map((tool) => (\n <span\n key={tool}\n className=\"inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label\"\n >\n {tool}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n {server.resources && server.resources.length > 0 ? (\n <div className=\"grid gap-1.5\">\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {server.resources.length} resources\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {server.resources.map((r) => (\n <span\n key={r}\n className=\"inline-flex items-center rounded-md bg-accent/10 px-2 py-0.5 font-mono text-accent text-label\"\n >\n {r}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onRestart ? (\n <button\n type=\"button\"\n onClick={() => onRestart(server.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw className=\"size-3\" /> Restart\n </button>\n ) : null}\n {onDisconnect ? (\n <button\n type=\"button\"\n onClick={() => onDisconnect(server.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plug className=\"size-3\" /> Disconnect\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nMCPServerCard.displayName = \"MCPServerCard\";\n\nexport { MCPServerCard };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/mcp-server-card/mcp-server-card.tsx"],"names":[],"mappings":"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","file":"chunk-RMJYXHBX.js","sourcesContent":["import { Plug, RotateCcw, Server } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type MCPServerStatus = \"connected\" | \"degraded\" | \"disconnected\" | \"starting\";\n\nexport interface MCPServer {\n id: string;\n /** Friendly name, e.g. \"postgres\". */\n name: string;\n /** Transport endpoint (stdio command or URL). */\n endpoint: string;\n status: MCPServerStatus;\n /** Tools exposed by the server. */\n tools: string[];\n /** Optional resources exposed. */\n resources?: string[];\n /** Diagnostic message when degraded/disconnected. */\n message?: ReactNode;\n /** Auto-restart toggle hint. */\n autoRestart?: boolean;\n}\n\nconst STATUS_CONFIG: Record<MCPServerStatus, { label: string; class: string }> = {\n connected: { label: \"Connected\", class: \"border-success/40 bg-success/15 text-success\" },\n starting: {\n label: \"Starting\",\n class: \"border-primary/40 bg-primary/15 text-primary animate-pulse\",\n },\n degraded: { label: \"Degraded\", class: \"border-warning/40 bg-warning/15 text-warning\" },\n disconnected: {\n label: \"Disconnected\",\n class: \"border-destructive/40 bg-destructive/15 text-destructive\",\n },\n};\n\ninterface MCPServerCardProps extends HTMLAttributes<HTMLElement> {\n server: MCPServer;\n onRestart?: (id: string) => void;\n onDisconnect?: (id: string) => void;\n}\n\n/**\n * MCPServerCard — one MCP server entry showing connection status, the tools\n * it exposes, and inline controls (restart, disconnect).\n *\n * Pairs with claw-code's \"degraded startup reporting\" — failed servers can\n * still appear here with a recovery message.\n */\nconst MCPServerCard = forwardRef<HTMLElement, MCPServerCardProps>(\n ({ className, server, onRestart, onDisconnect, ...props }, ref) => {\n const cfg = STATUS_CONFIG[server.status];\n return (\n <article\n data-slot=\"mcp-server-card\"\n ref={ref}\n className={cn(\"grid gap-3 rounded-xl border border-border bg-card p-4\", className)}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Server className=\"size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n <div className=\"min-w-0\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{server.name}</h4>\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {server.endpoint}\n </p>\n </div>\n </div>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n {server.message ? (\n <p className=\"rounded-md border border-warning/30 bg-warning/10 px-3 py-2 font-mono text-code-sm text-warning\">\n {server.message}\n </p>\n ) : null}\n\n {server.tools.length > 0 ? (\n <div className=\"grid gap-1.5\">\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {server.tools.length} tools\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {server.tools.map((tool) => (\n <span\n key={tool}\n className=\"inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label\"\n >\n {tool}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n {server.resources && server.resources.length > 0 ? (\n <div className=\"grid gap-1.5\">\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {server.resources.length} resources\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {server.resources.map((r) => (\n <span\n key={r}\n className=\"inline-flex items-center rounded-md bg-accent/10 px-2 py-0.5 font-mono text-accent text-label\"\n >\n {r}\n </span>\n ))}\n </div>\n </div>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onRestart ? (\n <button\n type=\"button\"\n onClick={() => onRestart(server.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <RotateCcw className=\"size-3\" /> Restart\n </button>\n ) : null}\n {onDisconnect ? (\n <button\n type=\"button\"\n onClick={() => onDisconnect(server.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plug className=\"size-3\" /> Disconnect\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nMCPServerCard.displayName = \"MCPServerCard\";\n\nexport { MCPServerCard };\n"]}
@@ -25,7 +25,7 @@ var CronJobCard = forwardRef(
25
25
  "data-slot": "cron-job-card",
26
26
  ref,
27
27
  className: cn(
28
- "grid gap-3 rounded-xl border bg-card p-4",
28
+ "grid gap-3 rounded-xl border border-border bg-card p-4",
29
29
  job.status === "disabled" && "opacity-70",
30
30
  className
31
31
  ),
@@ -111,5 +111,5 @@ var CronJobCard = forwardRef(
111
111
  CronJobCard.displayName = "CronJobCard";
112
112
 
113
113
  export { CronJobCard };
114
- //# sourceMappingURL=chunk-P44UAK45.js.map
115
- //# sourceMappingURL=chunk-P44UAK45.js.map
114
+ //# sourceMappingURL=chunk-SPGNNN4R.js.map
115
+ //# sourceMappingURL=chunk-SPGNNN4R.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/cron-job-card/cron-job-card.tsx"],"names":[],"mappings":"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","file":"chunk-P44UAK45.js","sourcesContent":["import { Clock, Play, Square, Trash2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type CronJobStatus = \"idle\" | \"running\" | \"failed\" | \"disabled\";\n\nexport interface CronJob {\n id: string;\n /** Human-readable job name. */\n name: string;\n /** Cron expression — e.g. every 4 hours. */\n schedule: string;\n /** What gets run (prompt or command). */\n prompt: string;\n status: CronJobStatus;\n /** ISO/string timestamp of last run. */\n lastRun?: string;\n /** ISO/string timestamp of next run. */\n nextRun?: string;\n /** Optional last-run result line. */\n lastResult?: ReactNode;\n}\n\ninterface CronJobCardProps extends Omit<HTMLAttributes<HTMLElement>, \"onToggle\"> {\n job: CronJob;\n onRunNow?: (id: string) => void;\n onToggle?: (id: string, enabled: boolean) => void;\n onRemove?: (id: string) => void;\n}\n\nconst STATUS_CONFIG: Record<CronJobStatus, { label: string; class: string }> = {\n idle: { label: \"Scheduled\", class: \"border-success/40 bg-success/10 text-success\" },\n running: {\n label: \"Running\",\n class: \"border-primary/40 bg-primary/10 text-primary animate-pulse\",\n },\n failed: {\n label: \"Last run failed\",\n class: \"border-destructive/40 bg-destructive/10 text-destructive\",\n },\n disabled: { label: \"Disabled\", class: \"border-border/40 bg-muted text-muted-foreground\" },\n};\n\n/**\n * CronJobCard — one scheduled agent job. Shows cron expression, prompt,\n * status, last/next run. Inline actions: run now, pause, delete.\n */\nconst CronJobCard = forwardRef<HTMLElement, CronJobCardProps>(\n ({ className, job, onRunNow, onToggle, onRemove, ...props }, ref) => {\n const cfg = STATUS_CONFIG[job.status];\n const enabled = job.status !== \"disabled\";\n return (\n <article\n data-slot=\"cron-job-card\"\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border bg-card p-4\",\n job.status === \"disabled\" && \"opacity-70\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"font-display text-title-md tracking-tight\">{job.name}</h4>\n <p className=\"mt-0.5 inline-flex items-center gap-2 font-mono text-code-sm text-muted-foreground\">\n <Clock className=\"size-3\" aria-hidden=\"true\" /> {job.schedule}\n </p>\n </div>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n <p className=\"line-clamp-2 rounded-md bg-muted/60 px-3 py-2 font-mono text-code-sm text-foreground\">\n {job.prompt}\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 font-mono text-label text-muted-foreground\">\n <span>\n <span className=\"text-muted-foreground/60\">last:</span> {job.lastRun ?? \"never\"}\n </span>\n <span>\n <span className=\"text-muted-foreground/60\">next:</span> {job.nextRun ?? \"—\"}\n </span>\n </div>\n\n {job.lastResult ? (\n <p className=\"text-body-sm text-muted-foreground\">{job.lastResult}</p>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onRunNow ? (\n <button\n type=\"button\"\n onClick={() => onRunNow(job.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Play className=\"size-3\" /> Run now\n </button>\n ) : null}\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(job.id, !enabled)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Square className=\"size-3\" /> {enabled ? \"Pause\" : \"Enable\"}\n </button>\n ) : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(job.id)}\n aria-label={`Remove ${job.name}`}\n className=\"rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nCronJobCard.displayName = \"CronJobCard\";\n\nexport { CronJobCard };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/cron-job-card/cron-job-card.tsx"],"names":[],"mappings":"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","file":"chunk-SPGNNN4R.js","sourcesContent":["import { Clock, Play, Square, Trash2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type CronJobStatus = \"idle\" | \"running\" | \"failed\" | \"disabled\";\n\nexport interface CronJob {\n id: string;\n /** Human-readable job name. */\n name: string;\n /** Cron expression — e.g. every 4 hours. */\n schedule: string;\n /** What gets run (prompt or command). */\n prompt: string;\n status: CronJobStatus;\n /** ISO/string timestamp of last run. */\n lastRun?: string;\n /** ISO/string timestamp of next run. */\n nextRun?: string;\n /** Optional last-run result line. */\n lastResult?: ReactNode;\n}\n\ninterface CronJobCardProps extends Omit<HTMLAttributes<HTMLElement>, \"onToggle\"> {\n job: CronJob;\n onRunNow?: (id: string) => void;\n onToggle?: (id: string, enabled: boolean) => void;\n onRemove?: (id: string) => void;\n}\n\nconst STATUS_CONFIG: Record<CronJobStatus, { label: string; class: string }> = {\n idle: { label: \"Scheduled\", class: \"border-success/40 bg-success/10 text-success\" },\n running: {\n label: \"Running\",\n class: \"border-primary/40 bg-primary/10 text-primary animate-pulse\",\n },\n failed: {\n label: \"Last run failed\",\n class: \"border-destructive/40 bg-destructive/10 text-destructive\",\n },\n disabled: { label: \"Disabled\", class: \"border-border/40 bg-muted text-muted-foreground\" },\n};\n\n/**\n * CronJobCard — one scheduled agent job. Shows cron expression, prompt,\n * status, last/next run. Inline actions: run now, pause, delete.\n */\nconst CronJobCard = forwardRef<HTMLElement, CronJobCardProps>(\n ({ className, job, onRunNow, onToggle, onRemove, ...props }, ref) => {\n const cfg = STATUS_CONFIG[job.status];\n const enabled = job.status !== \"disabled\";\n return (\n <article\n data-slot=\"cron-job-card\"\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border border-border bg-card p-4\",\n job.status === \"disabled\" && \"opacity-70\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h4 className=\"font-display text-title-md tracking-tight\">{job.name}</h4>\n <p className=\"mt-0.5 inline-flex items-center gap-2 font-mono text-code-sm text-muted-foreground\">\n <Clock className=\"size-3\" aria-hidden=\"true\" /> {job.schedule}\n </p>\n </div>\n <span\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n <p className=\"line-clamp-2 rounded-md bg-muted/60 px-3 py-2 font-mono text-code-sm text-foreground\">\n {job.prompt}\n </p>\n\n <div className=\"grid grid-cols-2 gap-3 font-mono text-label text-muted-foreground\">\n <span>\n <span className=\"text-muted-foreground/60\">last:</span> {job.lastRun ?? \"never\"}\n </span>\n <span>\n <span className=\"text-muted-foreground/60\">next:</span> {job.nextRun ?? \"—\"}\n </span>\n </div>\n\n {job.lastResult ? (\n <p className=\"text-body-sm text-muted-foreground\">{job.lastResult}</p>\n ) : null}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onRunNow ? (\n <button\n type=\"button\"\n onClick={() => onRunNow(job.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Play className=\"size-3\" /> Run now\n </button>\n ) : null}\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(job.id, !enabled)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Square className=\"size-3\" /> {enabled ? \"Pause\" : \"Enable\"}\n </button>\n ) : null}\n {onRemove ? (\n <button\n type=\"button\"\n onClick={() => onRemove(job.id)}\n aria-label={`Remove ${job.name}`}\n className=\"rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-destructive focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nCronJobCard.displayName = \"CronJobCard\";\n\nexport { CronJobCard };\n"]}
@@ -29,7 +29,7 @@ var Content2 = forwardRef(
29
29
  ref,
30
30
  className: cn(
31
31
  "-translate-x-1/2 -translate-y-1/2 fixed top-1/2 left-1/2 z-50 w-full max-w-lg",
32
- "rounded-2xl border bg-card text-card-foreground shadow-lg",
32
+ "rounded-2xl border border-border bg-card text-card-foreground shadow-lg",
33
33
  "data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in",
34
34
  "data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out",
35
35
  "duration-base",
@@ -106,5 +106,5 @@ var Dialog = /* @__PURE__ */ Object.assign(DialogPrimitive.Root, {
106
106
  });
107
107
 
108
108
  export { Dialog };
109
- //# sourceMappingURL=chunk-CSEGVTKO.js.map
110
- //# sourceMappingURL=chunk-CSEGVTKO.js.map
109
+ //# sourceMappingURL=chunk-T4Z7HBZR.js.map
110
+ //# sourceMappingURL=chunk-T4Z7HBZR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/dialog/dialog.tsx"],"names":["Overlay","Content","Title","Description"],"mappings":"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","file":"chunk-CSEGVTKO.js","sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef, HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Dialog — modal overlay built on Radix Dialog.\n *\n * Composition:\n * <Dialog>\n * <Dialog.Trigger>Open</Dialog.Trigger>\n * <Dialog.Content>\n * <Dialog.Header>\n * <Dialog.Title>…</Dialog.Title>\n * <Dialog.Description>…</Dialog.Description>\n * </Dialog.Header>\n * <Dialog.Body>…</Dialog.Body>\n * <Dialog.Footer>…</Dialog.Footer>\n * </Dialog.Content>\n * </Dialog>\n *\n * Overlay is a theme-neutral backdrop (`bg-background/80`) with no glass blur\n * (anti-glass guideline). Content uses card surface, rounded-2xl, shadow-lg\n * + slight glow on enter.\n */\n\nconst Overlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-background/80\",\n \"data-[state=open]:fade-in-0 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:animate-out\",\n className,\n )}\n {...props}\n />\n));\nOverlay.displayName = \"Dialog.Overlay\";\n\ninterface ContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n hideCloseButton?: boolean;\n}\n\nconst Content = forwardRef<ElementRef<typeof DialogPrimitive.Content>, ContentProps>(\n ({ className, children, hideCloseButton, ...props }, ref) => (\n <DialogPrimitive.Portal>\n <Overlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n ref={ref}\n className={cn(\n \"-translate-x-1/2 -translate-y-1/2 fixed top-1/2 left-1/2 z-50 w-full max-w-lg\",\n \"rounded-2xl border bg-card text-card-foreground shadow-lg\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n \"duration-base\",\n className,\n )}\n {...props}\n >\n {children}\n {!hideCloseButton ? (\n <DialogPrimitive.Close\n className={cn(\n \"absolute top-4 right-4 rounded-md p-1 opacity-70\",\n \"transition-opacity hover:opacity-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n \"disabled:pointer-events-none\",\n )}\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n ),\n);\nContent.displayName = \"Dialog.Content\";\n\nconst Header = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col gap-1.5 p-6 pb-3 text-left\", className)} {...props} />\n);\nHeader.displayName = \"Dialog.Header\";\n\nconst Body = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"px-6 pb-6 text-body-md text-muted-foreground\", className)} {...props} />\n);\nBody.displayName = \"Dialog.Body\";\n\nconst Footer = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse gap-2 p-6 pt-3 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n);\nFooter.displayName = \"Dialog.Footer\";\n\ntype TitleProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\n\nconst Title = forwardRef<ElementRef<typeof DialogPrimitive.Title>, TitleProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n ref={ref}\n className={cn(\"font-display text-foreground text-title-lg tracking-tight\", className)}\n {...props}\n />\n ),\n);\nTitle.displayName = \"Dialog.Title\";\n\nconst Description = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n ref={ref}\n className={cn(\"text-body-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDescription.displayName = \"Dialog.Description\";\n\nconst Dialog = /*#__PURE__*/ Object.assign(DialogPrimitive.Root, {\n Trigger: DialogPrimitive.Trigger,\n Close: DialogPrimitive.Close,\n Content,\n Overlay,\n Header,\n Body,\n Footer,\n Title,\n Description,\n});\n\nexport { Dialog };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/dialog/dialog.tsx"],"names":["Overlay","Content","Title","Description"],"mappings":"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","file":"chunk-T4Z7HBZR.js","sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ComponentPropsWithoutRef, ElementRef, HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Dialog — modal overlay built on Radix Dialog.\n *\n * Composition:\n * <Dialog>\n * <Dialog.Trigger>Open</Dialog.Trigger>\n * <Dialog.Content>\n * <Dialog.Header>\n * <Dialog.Title>…</Dialog.Title>\n * <Dialog.Description>…</Dialog.Description>\n * </Dialog.Header>\n * <Dialog.Body>…</Dialog.Body>\n * <Dialog.Footer>…</Dialog.Footer>\n * </Dialog.Content>\n * </Dialog>\n *\n * Overlay is a theme-neutral backdrop (`bg-background/80`) with no glass blur\n * (anti-glass guideline). Content uses card surface, rounded-2xl, shadow-lg\n * + slight glow on enter.\n */\n\nconst Overlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-background/80\",\n \"data-[state=open]:fade-in-0 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:animate-out\",\n className,\n )}\n {...props}\n />\n));\nOverlay.displayName = \"Dialog.Overlay\";\n\ninterface ContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n hideCloseButton?: boolean;\n}\n\nconst Content = forwardRef<ElementRef<typeof DialogPrimitive.Content>, ContentProps>(\n ({ className, children, hideCloseButton, ...props }, ref) => (\n <DialogPrimitive.Portal>\n <Overlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n ref={ref}\n className={cn(\n \"-translate-x-1/2 -translate-y-1/2 fixed top-1/2 left-1/2 z-50 w-full max-w-lg\",\n \"rounded-2xl border border-border bg-card text-card-foreground shadow-lg\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n \"duration-base\",\n className,\n )}\n {...props}\n >\n {children}\n {!hideCloseButton ? (\n <DialogPrimitive.Close\n className={cn(\n \"absolute top-4 right-4 rounded-md p-1 opacity-70\",\n \"transition-opacity hover:opacity-100\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n \"disabled:pointer-events-none\",\n )}\n >\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n ),\n);\nContent.displayName = \"Dialog.Content\";\n\nconst Header = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"flex flex-col gap-1.5 p-6 pb-3 text-left\", className)} {...props} />\n);\nHeader.displayName = \"Dialog.Header\";\n\nconst Body = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div className={cn(\"px-6 pb-6 text-body-md text-muted-foreground\", className)} {...props} />\n);\nBody.displayName = \"Dialog.Body\";\n\nconst Footer = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"flex flex-col-reverse gap-2 p-6 pt-3 sm:flex-row sm:justify-end\", className)}\n {...props}\n />\n);\nFooter.displayName = \"Dialog.Footer\";\n\ntype TitleProps = ComponentPropsWithoutRef<typeof DialogPrimitive.Title>;\n\nconst Title = forwardRef<ElementRef<typeof DialogPrimitive.Title>, TitleProps>(\n ({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n ref={ref}\n className={cn(\"font-display text-foreground text-title-lg tracking-tight\", className)}\n {...props}\n />\n ),\n);\nTitle.displayName = \"Dialog.Title\";\n\nconst Description = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n ref={ref}\n className={cn(\"text-body-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDescription.displayName = \"Dialog.Description\";\n\nconst Dialog = /*#__PURE__*/ Object.assign(DialogPrimitive.Root, {\n Trigger: DialogPrimitive.Trigger,\n Close: DialogPrimitive.Close,\n Content,\n Overlay,\n Header,\n Body,\n Footer,\n Title,\n Description,\n});\n\nexport { Dialog };\n"]}
@@ -56,7 +56,7 @@ var ChatComposer = forwardRef(
56
56
  ref,
57
57
  onSubmit: handleSubmit,
58
58
  className: cn(
59
- "rounded-2xl border bg-card text-card-foreground transition-shadow",
59
+ "rounded-2xl border border-border bg-card text-card-foreground transition-shadow",
60
60
  "focus-within:border-primary/60 focus-within:shadow-glow",
61
61
  isCode && "rounded-xl shadow-sm",
62
62
  className
@@ -138,5 +138,5 @@ var ChatComposer = forwardRef(
138
138
  ChatComposer.displayName = "ChatComposer";
139
139
 
140
140
  export { ChatComposer };
141
- //# sourceMappingURL=chunk-PZGUZHI7.js.map
142
- //# sourceMappingURL=chunk-PZGUZHI7.js.map
141
+ //# sourceMappingURL=chunk-TW5I37AE.js.map
142
+ //# sourceMappingURL=chunk-TW5I37AE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/chat-composer/chat-composer.tsx"],"names":[],"mappings":"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","file":"chunk-PZGUZHI7.js","sourcesContent":["import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n data-slot=\"chat-composer\"\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/chat-composer/chat-composer.tsx"],"names":[],"mappings":";;;;;;AAkEA,IAAM,kBAAA,GAAmD;AAAA,EACvD,IAAA,EAAM,2BAAA;AAAA,EACN,IAAA,EAAM,qBAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,oBAAA,GAAqD;AAAA,EACzD,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM,aAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAeA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,MAAA;AAAA,IACP,KAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,MAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAiB;AACrC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACnB,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA0C;AAC3D,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AACnB,QAAA,QAAA,GAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AAExB,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,eAAA;AAAA,QACV,GAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,iFAAA;AAAA,UACA,yDAAA;AAAA,UACA,MAAA,IAAU,sBAAA;AAAA,UACV;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,WAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAuC,uBAAY,CAAA,GAChE,IAAA;AAAA,UAEH,kCACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAkC,2BAAgB,CAAA,GAC/D,IAAA;AAAA,0BAEJ,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC7C,SAAA;AAAA,cACA,WAAA,EAAa,WAAA,IAAe,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACnD,YAAA,EAAY,aAAA,IAAiB,oBAAA,CAAqB,IAAI,CAAA;AAAA,cACtD,IAAA,EAAM,SAAS,CAAA,GAAI,CAAA;AAAA,cAClB,GAAG,aAAA;AAAA,cACJ,SAAA,EAAW,EAAA;AAAA,gBACT,6CAAA;AAAA,gBACA,mCAAA;AAAA,gBACA,oBAAA;AAAA,gBACA,SAAS,wBAAA,GAA2B,uCAAA;AAAA,gBACpC,aAAA,EAAe;AAAA;AACjB;AAAA,WACF;AAAA,0BAEA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT;AAAA,eACF;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,cAAA,KAAmB,MAAA,GAClB,iBACE,QAAA,mBACF,GAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,MAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,QAAA;AAAA,oBACT,YAAA,EAAW,aAAA;AAAA,oBAEX,8BAAC,SAAA,EAAA,EAAU;AAAA;AAAA,oBAEX,IAAA,EACN,CAAA;AAAA,gCACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,eAAA;AAAA,kBACA,YAAA,mBACC,GAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,MAAA;AAAA,sBACL,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,YAAA;AAAA,sBACT,YAAA,EAAW,aAAA;AAAA,sBAEX,8BAAC,GAAA,EAAA,EAAI;AAAA;AAAA,mBACP,GACE,IAAA;AAAA,kBACH,OAAA,mBACC,GAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAA;AAAA,sBACT,IAAA,EAAK,MAAA;AAAA,sBACL,OAAA,EAAQ,aAAA;AAAA,sBACR,YAAA,EAAW,iBAAA;AAAA,sBAEX,8BAAC,MAAA,EAAA,EAAO;AAAA;AAAA,sCAGV,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,MAAK,MAAA,EAAO,QAAA,EAAU,CAAC,KAAA,CAAM,MAAK,EAAG,YAAA,EAAW,cAAA,EACpE,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EACR;AAAA,iBAAA,EAEJ;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-TW5I37AE.js","sourcesContent":["import { Mic, Paperclip, Send, Square } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type {\n FormEvent,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { Button } from \"../../primitives/button/index.js\";\n\nexport type ComposerMode = \"chat\" | \"code\" | \"infra\";\n\ninterface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\"> {\n mode?: ComposerMode;\n value: string;\n onValueChange: (next: string) => void;\n onSubmit?: (value: string) => void;\n /**\n * If true, the composer is in \"agent running\" state — Send becomes a Stop button.\n */\n running?: boolean;\n onStop?: () => void;\n /**\n * Slot above the textarea — used for the folder selector in Infra mode.\n */\n contextSlot?: ReactNode;\n /**\n * Slot above the textarea for attachments / chips.\n */\n attachmentsSlot?: ReactNode;\n /**\n * Slot on the bottom-left of the action row (e.g. custom toggles).\n * Overrides the default attach button entirely when provided.\n */\n leadingActions?: ReactNode;\n /**\n * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.\n */\n trailingActions?: ReactNode;\n /**\n * Optional attach-file callback. If omitted (and `leadingActions` is also\n * omitted), no attach button is rendered. This avoids fake affordances per\n * Quality Gate §7.\n */\n onAttach?: () => void;\n /**\n * Optional voice-input callback. If omitted, no mic button is rendered.\n * Same rationale as `onAttach`.\n */\n onVoiceInput?: () => void;\n /**\n * Accessible label for the textarea. Falls back to a mode-aware default.\n */\n textareaLabel?: string;\n /**\n * Textarea placeholder. Defaults change by mode.\n */\n placeholder?: string;\n /**\n * Extra textarea props (rows, maxLength…).\n */\n textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"value\" | \"onChange\">;\n}\n\nconst defaultPlaceholder: Record<ComposerMode, string> = {\n chat: \"How can I help you today?\",\n code: \"Type / for commands\",\n infra: \"Ask about deploys, metrics, env, or rollback…\",\n};\n\nconst defaultTextareaLabel: Record<ComposerMode, string> = {\n chat: \"Chat message\",\n code: \"Code prompt\",\n infra: \"Infra command\",\n};\n\n/**\n * ChatComposer — message input area, shared by Chat / Code / Infra modes.\n *\n * Visual:\n * - chat / infra → soft card with violet ring on focus, generous padding\n * - code → compact dense form with mono font, slash prefix hint\n *\n * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter\n * (without Shift). Shift+Enter inserts a newline.\n *\n * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`\n * — Quality Gate §7 forbids rendering fake controls without behavior.\n */\nconst ChatComposer = forwardRef<HTMLFormElement, ChatComposerProps>(\n (\n {\n className,\n mode = \"chat\",\n value,\n onValueChange,\n onSubmit,\n running = false,\n onStop,\n contextSlot,\n attachmentsSlot,\n leadingActions,\n trailingActions,\n onAttach,\n onVoiceInput,\n textareaLabel,\n placeholder,\n textareaProps,\n ...props\n },\n ref,\n ) => {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (running) return;\n if (!value.trim()) return;\n onSubmit?.(value);\n }\n };\n\n const isCode = mode === \"code\";\n\n return (\n <form\n data-slot=\"chat-composer\"\n ref={ref}\n onSubmit={handleSubmit}\n className={cn(\n \"rounded-2xl border border-border bg-card text-card-foreground transition-shadow\",\n \"focus-within:border-primary/60 focus-within:shadow-glow\",\n isCode && \"rounded-xl shadow-sm\",\n className,\n )}\n {...props}\n >\n {contextSlot ? (\n <div className=\"border-border/40 border-b px-3 pt-3\">{contextSlot}</div>\n ) : null}\n\n {attachmentsSlot ? (\n <div className=\"flex flex-wrap gap-2 px-4 pt-3\">{attachmentsSlot}</div>\n ) : null}\n\n <textarea\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder ?? defaultPlaceholder[mode]}\n aria-label={textareaLabel ?? defaultTextareaLabel[mode]}\n rows={isCode ? 1 : 2}\n {...textareaProps}\n className={cn(\n \"w-full resize-none bg-transparent px-4 py-3\",\n \"placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n isCode ? \"font-mono text-code-md\" : \"min-h-[3.5rem] font-sans text-body-md\",\n textareaProps?.className,\n )}\n />\n\n <div\n className={cn(\n \"flex items-center justify-between gap-2 border-border/40 border-t px-3 py-2\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n {leadingActions !== undefined ? (\n leadingActions\n ) : onAttach ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onAttach}\n aria-label=\"Attach file\"\n >\n <Paperclip />\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {trailingActions}\n {onVoiceInput ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n type=\"button\"\n onClick={onVoiceInput}\n aria-label=\"Voice input\"\n >\n <Mic />\n </Button>\n ) : null}\n {running ? (\n <Button\n type=\"button\"\n onClick={onStop}\n size=\"icon\"\n variant=\"destructive\"\n aria-label=\"Stop generation\"\n >\n <Square />\n </Button>\n ) : (\n <Button type=\"submit\" size=\"icon\" disabled={!value.trim()} aria-label=\"Send message\">\n <Send />\n </Button>\n )}\n </div>\n </div>\n </form>\n );\n },\n);\nChatComposer.displayName = \"ChatComposer\";\n\nexport { ChatComposer };\n"]}
@@ -13,7 +13,7 @@ var Root = forwardRef(
13
13
  "data-slot": "card",
14
14
  ref,
15
15
  className: cn(
16
- "rounded-xl border bg-card text-card-foreground shadow-md",
16
+ "rounded-xl border border-border bg-card text-card-foreground shadow-md",
17
17
  "transition-shadow duration-base ease-out-soft",
18
18
  className
19
19
  ),
@@ -132,5 +132,5 @@ var Card = /* @__PURE__ */ Object.assign(Root, {
132
132
  });
133
133
 
134
134
  export { Card };
135
- //# sourceMappingURL=chunk-AXNJFBYX.js.map
136
- //# sourceMappingURL=chunk-AXNJFBYX.js.map
135
+ //# sourceMappingURL=chunk-UJAWV6LM.js.map
136
+ //# sourceMappingURL=chunk-UJAWV6LM.js.map