@reforma/components 0.1.1 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"codeCitation.d.ts","sourceRoot":"","sources":["../../../../src/chat/Message/streamdown/codeCitation.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM7E,6EAA6E;AAC7E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAyBpE;AAOD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAuBpD;AAKD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK9E"}
1
+ {"version":3,"file":"codeCitation.d.ts","sourceRoot":"","sources":["../../../../src/chat/Message/streamdown/codeCitation.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM7E,6EAA6E;AAC7E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAyBpE;AAOD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4BpD;AAKD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK9E"}
@@ -1,13 +1,13 @@
1
1
  import { isKnownFileExtension as a } from "@reforma/lib";
2
2
  import { isDirectoryPath as o, isWorkspaceRoot as u } from "../../Chip/helpers/chipPath.js";
3
- function c(e) {
3
+ function f(e) {
4
4
  return e?.match(/language-(.+)/)?.[1];
5
5
  }
6
6
  function i(e) {
7
7
  return e.trim().replace(/^@+/, "");
8
8
  }
9
9
  function h(e) {
10
- const n = c(e);
10
+ const n = f(e);
11
11
  if (!n)
12
12
  return {
13
13
  kind: "language",
@@ -22,7 +22,7 @@ function h(e) {
22
22
  endLine: Number(t[2])
23
23
  };
24
24
  const r = i(n);
25
- return s(r) ? {
25
+ return c(r) ? {
26
26
  kind: "file",
27
27
  path: r
28
28
  } : {
@@ -30,12 +30,12 @@ function h(e) {
30
30
  language: n
31
31
  };
32
32
  }
33
- function f(e) {
33
+ function s(e) {
34
34
  return /[*?[\]{}]/.test(e);
35
35
  }
36
- function s(e) {
36
+ function c(e) {
37
37
  const n = i(e);
38
- if (!n || f(n))
38
+ if (!n || /\s/.test(n) || s(n))
39
39
  return !1;
40
40
  if (o(n)) {
41
41
  const t = n.replace(/[/\\]+$/, "");
@@ -50,7 +50,7 @@ function d(e, n) {
50
50
  }
51
51
  export {
52
52
  d as cursorFromLineRange,
53
- s as isFilePathLike,
53
+ c as isFilePathLike,
54
54
  i as normalizeFileReferencePath,
55
55
  h as parseCodeFenceInfo
56
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"codeCitation.js","sources":["../../../../src/chat/Message/streamdown/codeCitation.ts"],"sourcesContent":["import { isKnownFileExtension } from '@reforma/lib';\n\nimport { isDirectoryPath, isWorkspaceRoot } from '../../Chip/helpers/chipPath';\n\nexport type CodeFenceInfo\n = | { kind: 'language'; language: string }\n | { kind: 'file'; path: string; startLine?: number; endLine?: number };\n\nfunction fenceInfoString(className?: string): string | undefined {\n return className?.match(/language-(.+)/)?.[1];\n}\n\n/** Strip optional `@` prefix from chat file references (`@app/page.tsx`). */\nexport function normalizeFileReferencePath(text: string): string {\n return text.trim().replace(/^@+/, '');\n}\n\nexport function parseCodeFenceInfo(className?: string): CodeFenceInfo {\n const info = fenceInfoString(className);\n\n if (!info) {\n return { kind: 'language', language: 'html' };\n }\n\n const rangeMatch = info.match(/^(\\d+):(\\d+):(.+)$/);\n\n if (rangeMatch) {\n return {\n kind: 'file',\n path: normalizeFileReferencePath(rangeMatch[3]),\n startLine: Number(rangeMatch[1]),\n endLine: Number(rangeMatch[2]),\n };\n }\n\n const path = normalizeFileReferencePath(info);\n\n if (isFilePathLike(path)) {\n return { kind: 'file', path };\n }\n\n return { kind: 'language', language: info };\n}\n\n/** Glob path masks — inline code only, not file Chips. */\nfunction isGlobPattern(text: string): boolean {\n return /[*?[\\]{}]/.test(text);\n}\n\n/** Whether streamdown should render inline/fenced path citations as file Chips. */\nexport function isFilePathLike(text: string): boolean {\n const trimmed = normalizeFileReferencePath(text);\n\n if (!trimmed) {\n return false;\n }\n\n if (isGlobPattern(trimmed)) {\n return false;\n }\n\n if (isDirectoryPath(trimmed)) {\n const stem = trimmed.replace(/[/\\\\]+$/, '');\n\n // `./`, `/`, etc. are workspace roots — keep as inline code, not Chips.\n if (!stem || isWorkspaceRoot(stem)) {\n return false;\n }\n\n return true;\n }\n\n return isKnownFileExtension(trimmed);\n}\n\n/** Monaco/Theia clamp columns past line length to end-of-line when applying selection. */\nconst END_OF_LINE_COLUMN = 2_147_483_647;\n\nexport function cursorFromLineRange(startLine: number, endLine: number): string {\n const start = Math.min(startLine, endLine);\n const end = Math.max(startLine, endLine);\n\n return `${ start }:1-${ end }:${ END_OF_LINE_COLUMN }`;\n}\n"],"names":["fenceInfoString","className","normalizeFileReferencePath","text","parseCodeFenceInfo","info","rangeMatch","path","isFilePathLike","isGlobPattern","trimmed","isDirectoryPath","stem","isWorkspaceRoot","isKnownFileExtension","END_OF_LINE_COLUMN","cursorFromLineRange","startLine","endLine","start","end"],"mappings":";;AAEA,SAASA,EAAgBC,GAAW;AAClC,SAAOA,GAAW,MAAM,eAAe,IAAI,CAAC;AAC9C;AAGO,SAASC,EAA2BC,GAAM;AAC/C,SAAOA,EAAK,KAAA,EAAO,QAAQ,OAAO,EAAE;AACtC;AACO,SAASC,EAAmBH,GAAW;AAC5C,QAAMI,IAAOL,EAAgBC,CAAS;AACtC,MAAI,CAACI;AACH,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAGd,QAAMC,IAAaD,EAAK,MAAM,oBAAoB;AAClD,MAAIC;AACF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAMJ,EAA2BI,EAAW,CAAC,CAAC;AAAA,MAC9C,WAAW,OAAOA,EAAW,CAAC,CAAC;AAAA,MAC/B,SAAS,OAAOA,EAAW,CAAC,CAAC;AAAA,IAAA;AAGjC,QAAMC,IAAOL,EAA2BG,CAAI;AAC5C,SAAIG,EAAeD,CAAI,IACd;AAAA,IACL,MAAM;AAAA,IACN,MAAAA;AAAA,EAAA,IAGG;AAAA,IACL,MAAM;AAAA,IACN,UAAUF;AAAA,EAAA;AAEd;AAGA,SAASI,EAAcN,GAAM;AAC3B,SAAO,YAAY,KAAKA,CAAI;AAC9B;AAGO,SAASK,EAAeL,GAAM;AACnC,QAAMO,IAAUR,EAA2BC,CAAI;AAI/C,MAHI,CAACO,KAGDD,EAAcC,CAAO;AACvB,WAAO;AAET,MAAIC,EAAgBD,CAAO,GAAG;AAC5B,UAAME,IAAOF,EAAQ,QAAQ,WAAW,EAAE;AAG1C,WAAI,GAACE,KAAQC,EAAgBD,CAAI;AAAA,EAInC;AACA,SAAOE,EAAqBJ,CAAO;AACrC;AAGA,MAAMK,IAAqB;AACpB,SAASC,EAAoBC,GAAWC,GAAS;AACtD,QAAMC,IAAQ,KAAK,IAAIF,GAAWC,CAAO,GACnCE,IAAM,KAAK,IAAIH,GAAWC,CAAO;AACvC,SAAO,GAAGC,CAAK,MAAMC,CAAG,IAAIL,CAAkB;AAChD;"}
1
+ {"version":3,"file":"codeCitation.js","sources":["../../../../src/chat/Message/streamdown/codeCitation.ts"],"sourcesContent":["import { isKnownFileExtension } from '@reforma/lib';\n\nimport { isDirectoryPath, isWorkspaceRoot } from '../../Chip/helpers/chipPath';\n\nexport type CodeFenceInfo\n = | { kind: 'language'; language: string }\n | { kind: 'file'; path: string; startLine?: number; endLine?: number };\n\nfunction fenceInfoString(className?: string): string | undefined {\n return className?.match(/language-(.+)/)?.[1];\n}\n\n/** Strip optional `@` prefix from chat file references (`@app/page.tsx`). */\nexport function normalizeFileReferencePath(text: string): string {\n return text.trim().replace(/^@+/, '');\n}\n\nexport function parseCodeFenceInfo(className?: string): CodeFenceInfo {\n const info = fenceInfoString(className);\n\n if (!info) {\n return { kind: 'language', language: 'html' };\n }\n\n const rangeMatch = info.match(/^(\\d+):(\\d+):(.+)$/);\n\n if (rangeMatch) {\n return {\n kind: 'file',\n path: normalizeFileReferencePath(rangeMatch[3]),\n startLine: Number(rangeMatch[1]),\n endLine: Number(rangeMatch[2]),\n };\n }\n\n const path = normalizeFileReferencePath(info);\n\n if (isFilePathLike(path)) {\n return { kind: 'file', path };\n }\n\n return { kind: 'language', language: info };\n}\n\n/** Glob path masks — inline code only, not file Chips. */\nfunction isGlobPattern(text: string): boolean {\n return /[*?[\\]{}]/.test(text);\n}\n\n/** Whether streamdown should render inline/fenced path citations as file Chips. */\nexport function isFilePathLike(text: string): boolean {\n const trimmed = normalizeFileReferencePath(text);\n\n if (!trimmed) {\n return false;\n }\n\n // Commands that mention a path (`ls dir/`, `grep x package.json`) are not citations.\n if (/\\s/.test(trimmed)) {\n return false;\n }\n\n if (isGlobPattern(trimmed)) {\n return false;\n }\n\n if (isDirectoryPath(trimmed)) {\n const stem = trimmed.replace(/[/\\\\]+$/, '');\n\n // `./`, `/`, etc. are workspace roots — keep as inline code, not Chips.\n if (!stem || isWorkspaceRoot(stem)) {\n return false;\n }\n\n return true;\n }\n\n return isKnownFileExtension(trimmed);\n}\n\n/** Monaco/Theia clamp columns past line length to end-of-line when applying selection. */\nconst END_OF_LINE_COLUMN = 2_147_483_647;\n\nexport function cursorFromLineRange(startLine: number, endLine: number): string {\n const start = Math.min(startLine, endLine);\n const end = Math.max(startLine, endLine);\n\n return `${ start }:1-${ end }:${ END_OF_LINE_COLUMN }`;\n}\n"],"names":["fenceInfoString","className","normalizeFileReferencePath","text","parseCodeFenceInfo","info","rangeMatch","path","isFilePathLike","isGlobPattern","trimmed","isDirectoryPath","stem","isWorkspaceRoot","isKnownFileExtension","END_OF_LINE_COLUMN","cursorFromLineRange","startLine","endLine","start","end"],"mappings":";;AAEA,SAASA,EAAgBC,GAAW;AAClC,SAAOA,GAAW,MAAM,eAAe,IAAI,CAAC;AAC9C;AAGO,SAASC,EAA2BC,GAAM;AAC/C,SAAOA,EAAK,KAAA,EAAO,QAAQ,OAAO,EAAE;AACtC;AACO,SAASC,EAAmBH,GAAW;AAC5C,QAAMI,IAAOL,EAAgBC,CAAS;AACtC,MAAI,CAACI;AACH,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAGd,QAAMC,IAAaD,EAAK,MAAM,oBAAoB;AAClD,MAAIC;AACF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAMJ,EAA2BI,EAAW,CAAC,CAAC;AAAA,MAC9C,WAAW,OAAOA,EAAW,CAAC,CAAC;AAAA,MAC/B,SAAS,OAAOA,EAAW,CAAC,CAAC;AAAA,IAAA;AAGjC,QAAMC,IAAOL,EAA2BG,CAAI;AAC5C,SAAIG,EAAeD,CAAI,IACd;AAAA,IACL,MAAM;AAAA,IACN,MAAAA;AAAA,EAAA,IAGG;AAAA,IACL,MAAM;AAAA,IACN,UAAUF;AAAA,EAAA;AAEd;AAGA,SAASI,EAAcN,GAAM;AAC3B,SAAO,YAAY,KAAKA,CAAI;AAC9B;AAGO,SAASK,EAAeL,GAAM;AACnC,QAAMO,IAAUR,EAA2BC,CAAI;AAS/C,MARI,CAACO,KAKD,KAAK,KAAKA,CAAO,KAGjBD,EAAcC,CAAO;AACvB,WAAO;AAET,MAAIC,EAAgBD,CAAO,GAAG;AAC5B,UAAME,IAAOF,EAAQ,QAAQ,WAAW,EAAE;AAG1C,WAAI,GAACE,KAAQC,EAAgBD,CAAI;AAAA,EAInC;AACA,SAAOE,EAAqBJ,CAAO;AACrC;AAGA,MAAMK,IAAqB;AACpB,SAASC,EAAoBC,GAAWC,GAAS;AACtD,QAAMC,IAAQ,KAAK,IAAIF,GAAWC,CAAO,GACnCE,IAAM,KAAK,IAAIH,GAAWC,CAAO;AACvC,SAAO,GAAGC,CAAK,MAAMC,CAAG,IAAIL,CAAkB;AAChD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"InstallDependenciesTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAyElD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,sCAuC1D"}
1
+ {"version":3,"file":"InstallDependenciesTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAyElD,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,sCAwC1D"}
@@ -39,7 +39,8 @@ function S({
39
39
  "data-slot": "install-dependencies-tool",
40
40
  children: [/* @__PURE__ */ t(b, {
41
41
  state: e.state,
42
- statusDetail: r.tooltip ?? n,
42
+ statusDetail: r.tooltip,
43
+ failed: n ? !0 : void 0,
43
44
  title: l,
44
45
  titleInProgress: o.inProgress,
45
46
  icon: /* @__PURE__ */ t(u, {
@@ -1 +1 @@
1
- {"version":3,"file":"InstallDependenciesTool.js","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"sourcesContent":["import { Box } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { InstallDepsToolInput, InstallDepsToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Installing dependencies',\n pending: 'Install dependencies',\n background: 'Installing in background',\n success: 'Installed dependencies',\n installFailed: 'Install failed',\n devRestartFailed: 'Dev server restart failed',\n} as const;\n\nfunction packagesFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const packages = (input as InstallDepsToolInput).packages;\n\n return Array.isArray(packages)\n ? packages.filter((pkg): pkg is string => typeof pkg === 'string' && pkg.length > 0)\n : [];\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as InstallDepsToolOutput).error;\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return undefined;\n}\n\nfunction installDependenciesTitle(\n state: string,\n input: unknown,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel) {\n return labels.installFailed;\n }\n\n const parsedError = outputError(output);\n\n if (parsedError) {\n const stage = (output as InstallDepsToolOutput).stage;\n\n return stage === 'dev-restart' ? labels.devRestartFailed : labels.installFailed;\n }\n\n if (\n (input != null && typeof input === 'object' && (input as InstallDepsToolInput).background === true)\n || (output != null && typeof output === 'object' && (output as InstallDepsToolOutput).status === 'running')\n ) {\n return labels.background;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.inProgress;\n }\n\n return labels.pending;\n}\n\n/** InstallDeps: status row, with named packages on a gray line under it. */\nexport function InstallDepsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'InstallDeps') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const title = installDependenciesTitle(part.state, part.input, part.output, failure.useFailureLabel);\n const packages = packagesFromInput(part.input);\n\n return (\n <ToolShell data-slot=\"install-dependencies-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Box aria-hidden /> }\n />\n\n <Show when={ packages.length > 0 }>\n <ToolShellFooter>\n <Text color=\"secondary\" truncate>{ packages.join(', ') }</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","packagesFromInput","input","packages","pkg","outputError","output","error","installDependenciesTitle","state","useFailureLabel","isToolInvocationInProgress","InstallDepsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","ToolShell","_jsx","ToolShellHeader","Box","Show","ToolShellFooter","Text"],"mappings":";;;;;;;AAOA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB;AACpB;AACA,SAASC,EAAkBC,GAAO;AAChC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAWD,EAAM;AACvB,SAAO,MAAM,QAAQC,CAAQ,IAAIA,EAAS,OAAO,CAAAC,MAAO,OAAOA,KAAQ,YAAYA,EAAI,SAAS,CAAC,IAAI,CAAA;AACvG;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAQD,EAAO;AACrB,MAAI,OAAOC,KAAU,YAAYA,EAAM,SAAS;AAC9C,WAAOA;AAGX;AACA,SAASC,EAAyBC,GAAOP,GAAOI,GAAQI,GAAiB;AACvE,SAAIA,IACKV,EAAO,gBAEIK,EAAYC,CAAM,IAEtBA,EAAO,UACJ,gBAAgBN,EAAO,mBAAmBA,EAAO,gBAEhEE,KAAS,QAAQ,OAAOA,KAAU,YAAYA,EAAM,eAAe,MAAQI,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,WAAW,YACxIN,EAAO,aAEZS,MAAU,qBACLT,EAAO,UAEZW,EAA2BF,CAAK,IAC3BT,EAAO,aAETA,EAAO;AAChB;AAGO,SAASY,EAAgB;AAAA,EAC9B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBR,EAAYQ,EAAK,MAAM,IAAI,QAC9EM,IAAQX,EAAyBK,EAAK,OAAOA,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GAC7Fb,IAAWF,EAAkBY,EAAK,KAAK;AAC7C,2BAA0BO,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOT,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWE;AAAA,MACjC,OAAAC;AAAA,MACA,iBAAiBnB,EAAO;AAAA,MACxB,wBAAwBuB,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMrB,EAAS,SAAS;AAAA,MACxB,4BAA4BsB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAUvB,EAAS,KAAK,IAAI;AAAA,QAAA,CAC7B;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBkB,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMN,KAAgB,CAACF,EAAQ;AAAA,MAC/B,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUR;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMR,EAAQ;AAAA,MACd,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUV,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"InstallDependenciesTool.js","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"sourcesContent":["import { Box } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { InstallDepsToolInput, InstallDepsToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Installing dependencies',\n pending: 'Install dependencies',\n background: 'Installing in background',\n success: 'Installed dependencies',\n installFailed: 'Install failed',\n devRestartFailed: 'Dev server restart failed',\n} as const;\n\nfunction packagesFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const packages = (input as InstallDepsToolInput).packages;\n\n return Array.isArray(packages)\n ? packages.filter((pkg): pkg is string => typeof pkg === 'string' && pkg.length > 0)\n : [];\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as InstallDepsToolOutput).error;\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return undefined;\n}\n\nfunction installDependenciesTitle(\n state: string,\n input: unknown,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel) {\n return labels.installFailed;\n }\n\n const parsedError = outputError(output);\n\n if (parsedError) {\n const stage = (output as InstallDepsToolOutput).stage;\n\n return stage === 'dev-restart' ? labels.devRestartFailed : labels.installFailed;\n }\n\n if (\n (input != null && typeof input === 'object' && (input as InstallDepsToolInput).background === true)\n || (output != null && typeof output === 'object' && (output as InstallDepsToolOutput).status === 'running')\n ) {\n return labels.background;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.inProgress;\n }\n\n return labels.pending;\n}\n\n/** InstallDeps: status row, with named packages on a gray line under it. */\nexport function InstallDepsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'InstallDeps') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const title = installDependenciesTitle(part.state, part.input, part.output, failure.useFailureLabel);\n const packages = packagesFromInput(part.input);\n\n return (\n <ToolShell data-slot=\"install-dependencies-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n failed={ logicalError ? true : undefined }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Box aria-hidden /> }\n />\n\n <Show when={ packages.length > 0 }>\n <ToolShellFooter>\n <Text color=\"secondary\" truncate>{ packages.join(', ') }</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","packagesFromInput","input","packages","pkg","outputError","output","error","installDependenciesTitle","state","useFailureLabel","isToolInvocationInProgress","InstallDepsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","ToolShell","_jsx","ToolShellHeader","Box","Show","ToolShellFooter","Text"],"mappings":";;;;;;;AAOA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB;AACpB;AACA,SAASC,EAAkBC,GAAO;AAChC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAWD,EAAM;AACvB,SAAO,MAAM,QAAQC,CAAQ,IAAIA,EAAS,OAAO,CAAAC,MAAO,OAAOA,KAAQ,YAAYA,EAAI,SAAS,CAAC,IAAI,CAAA;AACvG;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAQD,EAAO;AACrB,MAAI,OAAOC,KAAU,YAAYA,EAAM,SAAS;AAC9C,WAAOA;AAGX;AACA,SAASC,EAAyBC,GAAOP,GAAOI,GAAQI,GAAiB;AACvE,SAAIA,IACKV,EAAO,gBAEIK,EAAYC,CAAM,IAEtBA,EAAO,UACJ,gBAAgBN,EAAO,mBAAmBA,EAAO,gBAEhEE,KAAS,QAAQ,OAAOA,KAAU,YAAYA,EAAM,eAAe,MAAQI,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,WAAW,YACxIN,EAAO,aAEZS,MAAU,qBACLT,EAAO,UAEZW,EAA2BF,CAAK,IAC3BT,EAAO,aAETA,EAAO;AAChB;AAGO,SAASY,EAAgB;AAAA,EAC9B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBR,EAAYQ,EAAK,MAAM,IAAI,QAC9EM,IAAQX,EAAyBK,EAAK,OAAOA,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GAC7Fb,IAAWF,EAAkBY,EAAK,KAAK;AAC7C,2BAA0BO,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOT,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,QAAQE,IAAe,KAAO;AAAA,MAC9B,OAAAC;AAAA,MACA,iBAAiBnB,EAAO;AAAA,MACxB,wBAAwBuB,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMrB,EAAS,SAAS;AAAA,MACxB,4BAA4BsB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAUvB,EAAS,KAAK,IAAI;AAAA,QAAA,CAC7B;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBkB,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMN,KAAgB,CAACF,EAAQ;AAAA,MAC/B,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUR;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMR,EAAQ;AAAA,MACd,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUV,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function mountTool(node: ReactNode): {
3
+ document: import("happy-dom").Document;
4
+ unmount(): void;
5
+ };
6
+ //# sourceMappingURL=mountTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountTool.d.ts","sourceRoot":"","sources":["../../../src/chat/Tool/mountTool.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG5C,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS;IA2BjC,QAAQ;IACR,OAAO;EASd"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectEnvTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAgJlD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,sCAuCzD"}
1
+ {"version":3,"file":"ProjectEnvTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAgJlD,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,sCAwCzD"}
@@ -94,7 +94,8 @@ function w({
94
94
  "data-slot": "project-env-tool",
95
95
  children: [/* @__PURE__ */ i(I, {
96
96
  state: t.state,
97
- statusDetail: n.tooltip ?? l,
97
+ statusDetail: n.tooltip,
98
+ failed: l ? !0 : void 0,
98
99
  title: e,
99
100
  titleInProgress: a,
100
101
  icon: /* @__PURE__ */ i(c, {
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectEnvTool.js","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"sourcesContent":["import { Terminal } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { ProjectEnvToolInput, ProjectEnvToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction asInput(input: unknown): ProjectEnvToolInput | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const action = (input as ProjectEnvToolInput).action;\n\n if (action !== 'list' && action !== 'set' && action !== 'remove') {\n return undefined;\n }\n\n return input as ProjectEnvToolInput;\n}\n\nfunction asOutput(output: unknown): ProjectEnvToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output as ProjectEnvToolOutput;\n}\n\nfunction outputError(output: ProjectEnvToolOutput | undefined): string | undefined {\n const error = output?.error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction variableKey(\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined\n): string | undefined {\n const key = output?.key ?? input?.key;\n\n if (typeof key !== 'string') {\n return undefined;\n }\n\n const trimmed = key.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction projectEnvTitles(\n state: string,\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined,\n useFailureLabel: boolean\n): { title: string; titleInProgress: string } {\n const action = input?.action;\n const key = variableKey(input, output);\n const failed = useFailureLabel || Boolean(outputError(output));\n\n if (action === 'list') {\n if (failed) {\n return {\n title: 'Couldn\\'t list environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (state === 'output-available') {\n const count = output?.variables?.length;\n\n if (count === 0) {\n return {\n title: 'No environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count === 1) {\n return {\n title: 'Listed 1 environment variable',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count != null) {\n return {\n title: `Listed ${ count } environment variables`,\n titleInProgress: 'Listing environment variables',\n };\n }\n }\n\n return {\n title: 'List environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (action === 'remove') {\n if (failed) {\n return {\n title: key ? `Couldn't remove ${ key }` : 'Couldn\\'t remove environment variable',\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n return {\n title: state === 'output-available'\n ? (key ? `Removed ${ key }` : 'Removed environment variable')\n : (key ? `Remove ${ key }` : 'Remove environment variable'),\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n if (failed) {\n return {\n title: key ? `Couldn't save ${ key }` : 'Couldn\\'t save environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.created) {\n return {\n title: key ? `Added ${ key }` : 'Added environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.updated) {\n return {\n title: key ? `Updated ${ key }` : 'Updated environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (isToolInvocationInProgress(state)) {\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n}\n\n/** ProjectEnv: label-only row for list / set / remove. Never shows values. */\nexport function ProjectEnvTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ProjectEnv') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const input = asInput(part.input);\n const output = part.state === 'output-available' ? asOutput(part.output) : undefined;\n const logicalError = outputError(output);\n const { title, titleInProgress } = projectEnvTitles(\n part.state,\n input,\n output,\n failure.useFailureLabel\n );\n\n return (\n <ToolShell data-slot=\"project-env-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ <Terminal aria-hidden /> }\n />\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["asInput","input","action","asOutput","output","outputError","error","variableKey","key","trimmed","projectEnvTitles","state","useFailureLabel","failed","count","isToolInvocationInProgress","ProjectEnvTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","titleInProgress","ToolShell","_jsx","ToolShellHeader","Terminal","Show","ToolShellFooter","Text"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectEnvTool.js","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"sourcesContent":["import { Terminal } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { ProjectEnvToolInput, ProjectEnvToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction asInput(input: unknown): ProjectEnvToolInput | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const action = (input as ProjectEnvToolInput).action;\n\n if (action !== 'list' && action !== 'set' && action !== 'remove') {\n return undefined;\n }\n\n return input as ProjectEnvToolInput;\n}\n\nfunction asOutput(output: unknown): ProjectEnvToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output as ProjectEnvToolOutput;\n}\n\nfunction outputError(output: ProjectEnvToolOutput | undefined): string | undefined {\n const error = output?.error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction variableKey(\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined\n): string | undefined {\n const key = output?.key ?? input?.key;\n\n if (typeof key !== 'string') {\n return undefined;\n }\n\n const trimmed = key.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction projectEnvTitles(\n state: string,\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined,\n useFailureLabel: boolean\n): { title: string; titleInProgress: string } {\n const action = input?.action;\n const key = variableKey(input, output);\n const failed = useFailureLabel || Boolean(outputError(output));\n\n if (action === 'list') {\n if (failed) {\n return {\n title: 'Couldn\\'t list environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (state === 'output-available') {\n const count = output?.variables?.length;\n\n if (count === 0) {\n return {\n title: 'No environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count === 1) {\n return {\n title: 'Listed 1 environment variable',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count != null) {\n return {\n title: `Listed ${ count } environment variables`,\n titleInProgress: 'Listing environment variables',\n };\n }\n }\n\n return {\n title: 'List environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (action === 'remove') {\n if (failed) {\n return {\n title: key ? `Couldn't remove ${ key }` : 'Couldn\\'t remove environment variable',\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n return {\n title: state === 'output-available'\n ? (key ? `Removed ${ key }` : 'Removed environment variable')\n : (key ? `Remove ${ key }` : 'Remove environment variable'),\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n if (failed) {\n return {\n title: key ? `Couldn't save ${ key }` : 'Couldn\\'t save environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.created) {\n return {\n title: key ? `Added ${ key }` : 'Added environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.updated) {\n return {\n title: key ? `Updated ${ key }` : 'Updated environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (isToolInvocationInProgress(state)) {\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n}\n\n/** ProjectEnv: label-only row for list / set / remove. Never shows values. */\nexport function ProjectEnvTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ProjectEnv') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const input = asInput(part.input);\n const output = part.state === 'output-available' ? asOutput(part.output) : undefined;\n const logicalError = outputError(output);\n const { title, titleInProgress } = projectEnvTitles(\n part.state,\n input,\n output,\n failure.useFailureLabel\n );\n\n return (\n <ToolShell data-slot=\"project-env-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n failed={ logicalError ? true : undefined }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ <Terminal aria-hidden /> }\n />\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["asInput","input","action","asOutput","output","outputError","error","variableKey","key","trimmed","projectEnvTitles","state","useFailureLabel","failed","count","isToolInvocationInProgress","ProjectEnvTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","titleInProgress","ToolShell","_jsx","ToolShellHeader","Terminal","Show","ToolShellFooter","Text"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToolShell.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/shell/ToolShell.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEH,cAAc,EAId,KAAK,SAAS,EACd,KAAK,GAAG,EACX,MAAM,OAAO,CAAC;AA2Cf,gHAAgH;AAChH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAC1D,sHAAsH;IACtH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACtB,WAAmB,EACnB,WAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAgChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnG,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sGAAsG;IACtG,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAkPD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAS1D;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAoBnE,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,+BAgBxF;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAElE,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,+BAMtF"}
1
+ {"version":3,"file":"ToolShell.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/shell/ToolShell.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEH,cAAc,EAId,KAAK,SAAS,EACd,KAAK,GAAG,EACX,MAAM,OAAO,CAAC;AA2Cf,gHAAgH;AAChH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAC1D,sHAAsH;IACtH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACtB,WAAmB,EACnB,WAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAgChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACnG,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sGAAsG;IACtG,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,gFAAgF;IAChF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AA4PD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAS1D;AAED,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAoBnE,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,+BAgBxF;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAElE,wBAAgB,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,+BAMtF"}
@@ -1,7 +1,7 @@
1
1
  import { Text as H } from "@reforma/components/Text";
2
- import { ChevronDown as O } from "@reforma/icons/8";
2
+ import { ChevronDown as A } from "@reforma/icons/8";
3
3
  import { cn as a, mergeRefs as j } from "@reforma/lib";
4
- import { useMemo as U, use as I, createContext as k, useRef as $ } from "react";
4
+ import { useMemo as k, use as I, createContext as U, useRef as $ } from "react";
5
5
  import { mergeProps as q } from "react-aria";
6
6
  import { OverlayTriggerStateContext as z, Pressable as B } from "react-aria-components";
7
7
  import { Collapsible as J, CollapsibleMotionContent as K, useCollapsible as Q, CollapsibleTrigger as V } from "../../../Collapsible/Collapsible.js";
@@ -10,9 +10,9 @@ import { Show as X } from "../../../Show/Show.js";
10
10
  import { TOOL_INTERRUPTED_MESSAGE as P } from "../helpers.js";
11
11
  import { useToolProgress as Y } from "./toolProgress.js";
12
12
  import l from "./ToolShell.module.css.js";
13
- import { isFailedToolStatus as A, ToolShellStatusIcon as L, FailedToolTitleTooltip as Z } from "./ToolShellStatusIcon.js";
13
+ import { isFailedToolStatus as D, ToolShellStatusIcon as L, FailedToolTitleTooltip as Z } from "./ToolShellStatusIcon.js";
14
14
  import { jsx as e, jsxs as _, Fragment as ee } from "react/jsx-runtime";
15
- const w = /* @__PURE__ */ k(null), G = "data-tool-shell-header";
15
+ const E = /* @__PURE__ */ U(null), G = "data-tool-shell-header";
16
16
  function te(t, r) {
17
17
  if (!(t instanceof Element))
18
18
  return !1;
@@ -25,32 +25,32 @@ function ve({
25
25
  open: o,
26
26
  onOpenChange: n,
27
27
  isDisabled: m,
28
- className: c,
29
- children: d,
28
+ className: d,
29
+ children: u,
30
30
  ...s
31
31
  }) {
32
- const u = U(() => ({
32
+ const c = k(() => ({
33
33
  collapsible: t
34
34
  }), [t]);
35
- return t ? /* @__PURE__ */ e(w, {
36
- value: u,
35
+ return t ? /* @__PURE__ */ e(E, {
36
+ value: c,
37
37
  children: /* @__PURE__ */ e(J, {
38
- className: a(l.root, c),
38
+ className: a(l.root, d),
39
39
  "data-slot": "tool",
40
40
  defaultOpen: r,
41
41
  open: o,
42
42
  onOpenChange: n,
43
43
  isDisabled: m,
44
44
  ...s,
45
- children: d
45
+ children: u
46
46
  })
47
- }) : /* @__PURE__ */ e(w, {
48
- value: u,
47
+ }) : /* @__PURE__ */ e(E, {
48
+ value: c,
49
49
  children: /* @__PURE__ */ e("div", {
50
- className: a(l.root, c),
50
+ className: a(l.root, d),
51
51
  "data-slot": "tool",
52
52
  ...s,
53
- children: d
53
+ children: u
54
54
  })
55
55
  });
56
56
  }
@@ -60,10 +60,10 @@ function M({
60
60
  titleInterrupted: o,
61
61
  live: n,
62
62
  stalled: m,
63
- shimmer: c,
64
- failed: d,
63
+ shimmer: d,
64
+ failed: u,
65
65
  truncate: s,
66
- statusDetail: u
66
+ statusDetail: c
67
67
  }) {
68
68
  const h = a(l.headerLabel, s && l.headerLabelTruncate, "whitespace-nowrap");
69
69
  if (m)
@@ -76,21 +76,27 @@ function M({
76
76
  if (!i)
77
77
  return null;
78
78
  const p = r ?? i;
79
- return n && c ? /* @__PURE__ */ e(W, {
80
- as: "span",
81
- className: h,
82
- duration: 1,
83
- children: p
84
- }) : d && !n ? /* @__PURE__ */ e(Z, {
85
- statusDetail: u,
86
- children: /* @__PURE__ */ e(H, {
79
+ if (n && d)
80
+ return /* @__PURE__ */ e(W, {
81
+ as: "span",
82
+ className: h,
83
+ duration: 1,
84
+ children: p
85
+ });
86
+ if (u && !n) {
87
+ const T = /* @__PURE__ */ e(H, {
87
88
  decoration: "line-through",
88
89
  color: "secondary",
89
90
  className: h,
90
91
  "aria-label": `${i} failed`,
91
92
  children: i
92
- })
93
- }) : /* @__PURE__ */ e(H, {
93
+ });
94
+ return c?.trim() ? /* @__PURE__ */ e(Z, {
95
+ statusDetail: c,
96
+ children: T
97
+ }) : T;
98
+ }
99
+ return /* @__PURE__ */ e(H, {
94
100
  className: h,
95
101
  children: n ? p : i
96
102
  });
@@ -101,62 +107,62 @@ function oe({
101
107
  titleInProgress: o,
102
108
  titleInterrupted: n,
103
109
  icon: m,
104
- beforeTitle: c,
105
- children: d,
110
+ beforeTitle: d,
111
+ children: u,
106
112
  statusDetail: s,
107
- failed: u,
113
+ failed: c,
108
114
  truncateTitle: h,
109
115
  className: i,
110
116
  progress: p,
111
- shimmer: E,
112
- onPress: T,
113
- disclosure: N,
117
+ shimmer: T,
118
+ onPress: S,
119
+ disclosure: R,
114
120
  ref: y
115
121
  }) {
116
- const S = I(z), v = S?.isOpen === !0, b = T != null || N === !0, {
122
+ const b = I(z), x = b?.isOpen === !0, g = S != null || R === !0, {
117
123
  live: f,
118
- stalled: g
119
- } = p, x = g ? s?.trim() || P : s, R = g ? "output-error" : t, F = u ?? A(R, x), C = /* @__PURE__ */ _(ee, {
124
+ stalled: v
125
+ } = p, C = v ? s?.trim() || P : s, w = v ? "output-error" : t, F = c ?? D(w, C), N = /* @__PURE__ */ _(ee, {
120
126
  children: [/* @__PURE__ */ e(L, {
121
127
  icon: m,
122
- state: R,
123
- statusDetail: x,
128
+ state: w,
129
+ statusDetail: C,
124
130
  className: l.headerIcon
125
- }), c, /* @__PURE__ */ e(M, {
131
+ }), d, /* @__PURE__ */ e(M, {
126
132
  title: r,
127
133
  titleInProgress: o,
128
134
  titleInterrupted: n,
129
135
  live: f,
130
- stalled: g,
131
- shimmer: E !== !1,
136
+ stalled: v,
137
+ shimmer: T !== !1,
132
138
  failed: F,
133
139
  truncate: h,
134
- statusDetail: x
135
- }), d, /* @__PURE__ */ e(X, {
136
- when: b,
137
- children: /* @__PURE__ */ e(O, {
140
+ statusDetail: C
141
+ }), u, /* @__PURE__ */ e(X, {
142
+ when: g,
143
+ children: /* @__PURE__ */ e(A, {
138
144
  className: a("chevron", "next", l.toolChevron),
139
- "aria-expanded": S ? v : void 0,
145
+ "aria-expanded": b ? x : void 0,
140
146
  "aria-hidden": !0
141
147
  })
142
148
  })]
143
149
  });
144
- return b ? /* @__PURE__ */ e(B, {
150
+ return g ? /* @__PURE__ */ e(B, {
145
151
  ref: y,
146
- ...T ? {
147
- onPress: T
152
+ ...S ? {
153
+ onPress: S
148
154
  } : {},
149
155
  children: /* @__PURE__ */ e("div", {
150
156
  role: "button",
151
157
  className: a(l.headerRow, l.headerTrigger, i),
152
158
  "aria-busy": f,
153
- "aria-expanded": S ? v : void 0,
154
- children: C
159
+ "aria-expanded": b ? x : void 0,
160
+ children: N
155
161
  })
156
162
  }) : /* @__PURE__ */ e("div", {
157
163
  className: a(l.headerRow, l.headerNonInteractive, i),
158
164
  "aria-busy": f,
159
- children: C
165
+ children: N
160
166
  });
161
167
  }
162
168
  function re({
@@ -165,31 +171,32 @@ function re({
165
171
  titleInProgress: o,
166
172
  titleInterrupted: n,
167
173
  icon: m,
168
- beforeTitle: c,
169
- children: d,
174
+ beforeTitle: d,
175
+ children: u,
170
176
  statusDetail: s,
171
- failed: u,
177
+ failed: c,
172
178
  truncateTitle: h,
173
179
  className: i,
174
180
  progress: p,
175
- shimmer: E
181
+ shimmer: T
176
182
  }) {
177
183
  const {
178
- state: T,
179
- triggerProps: N,
184
+ state: S,
185
+ triggerProps: R,
180
186
  triggerRef: y
181
- } = Q(), S = $(null), {
182
- live: v,
183
- stalled: b
184
- } = p, f = b ? s?.trim() || P : s, g = b ? "output-error" : t, x = u ?? A(g, f), R = N.onPress, F = q(N, {
187
+ } = Q(), b = $(null), {
188
+ live: x,
189
+ stalled: g
190
+ } = p, f = g ? s?.trim() || P : s, v = g ? "output-error" : t, C = c ?? D(v, f), w = R.onPress, F = q(R, {
185
191
  [G]: "",
186
192
  className: a(l.headerRow, l.headerTrigger, i),
187
- ref: j(y, S),
188
- "aria-busy": v,
189
- "aria-expanded": T.isExpanded,
190
- onPress: (C) => {
191
- const D = S.current;
192
- D && te(C.target, D) || R?.(C);
193
+ // eslint-disable-next-line react-hooks/refs -- mergeRefs composes; it does not read `.current`
194
+ ref: j(y, b),
195
+ "aria-busy": x,
196
+ "aria-expanded": S.isExpanded,
197
+ onPress: (N) => {
198
+ const O = b.current;
199
+ O && te(N.target, O) || w?.(N);
193
200
  }
194
201
  });
195
202
  return /* @__PURE__ */ e(V, {
@@ -198,29 +205,29 @@ function re({
198
205
  ...F,
199
206
  children: [/* @__PURE__ */ e(L, {
200
207
  icon: m,
201
- state: g,
208
+ state: v,
202
209
  statusDetail: f,
203
210
  className: l.headerIcon
204
- }), c, /* @__PURE__ */ e(M, {
211
+ }), d, /* @__PURE__ */ e(M, {
205
212
  title: r,
206
213
  titleInProgress: o,
207
214
  titleInterrupted: n,
208
- live: v,
209
- stalled: b,
210
- shimmer: E !== !1,
211
- failed: x,
215
+ live: x,
216
+ stalled: g,
217
+ shimmer: T !== !1,
218
+ failed: C,
212
219
  truncate: h,
213
220
  statusDetail: f
214
- }), d, /* @__PURE__ */ e(O, {
221
+ }), u, /* @__PURE__ */ e(A, {
215
222
  className: a("chevron", "next", l.toolChevron),
216
- "aria-expanded": T.isExpanded,
223
+ "aria-expanded": S.isExpanded,
217
224
  "aria-hidden": !0
218
225
  })]
219
226
  })
220
227
  });
221
228
  }
222
229
  function xe(t) {
223
- const r = I(w), o = Y(t.state, t.awaitingUser);
230
+ const r = I(E), o = Y(t.state, t.awaitingUser);
224
231
  return r?.collapsible ? /* @__PURE__ */ e(re, {
225
232
  ...t,
226
233
  progress: o
@@ -261,7 +268,7 @@ function Ce({
261
268
  children: r,
262
269
  ...o
263
270
  }) {
264
- return I(w)?.collapsible ? /* @__PURE__ */ e(ae, {
271
+ return I(E)?.collapsible ? /* @__PURE__ */ e(ae, {
265
272
  className: t,
266
273
  ...o,
267
274
  children: r
@@ -1 +1 @@
1
- {"version":3,"file":"ToolShell.js","sources":["../../../../src/chat/Tool/shell/ToolShell.tsx"],"sourcesContent":["import { Text } from '@reforma/components/Text';\nimport { ChevronDown } from '@reforma/icons/8';\nimport { cn, mergeRefs } from '@reforma/lib';\nimport {\n createContext,\n HTMLAttributes,\n use,\n useMemo,\n useRef,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { mergeProps } from 'react-aria';\nimport { OverlayTriggerStateContext } from 'react-aria-components';\n\nimport {\n Collapsible,\n CollapsibleMotionContent,\n CollapsibleTrigger,\n useCollapsible,\n} from '../../../Collapsible';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { useToolProgress, type ToolProgressState } from './toolProgress';\nimport styles from './ToolShell.module.css';\nimport { FailedToolTitleTooltip, isFailedToolStatus, ToolShellStatusIcon } from './ToolShellStatusIcon';\n\ntype ToolShellContextValue = {\n collapsible: boolean;\n};\n\nconst ToolShellContext = createContext<ToolShellContextValue | null>(null);\n\nconst HEADER_TRIGGER_ATTR = 'data-tool-shell-header';\n\n/** Clicks on nested controls (e.g. file chips) must not toggle the collapsible header. */\nfunction isNestedHeaderInteractive(target: EventTarget | null, header: HTMLElement): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n\n const interactive = target.closest(\n 'a[href], input, textarea, select, [role=\"link\"]'\n ) ?? target.closest('button, [role=\"button\"]');\n\n if (!interactive || !header.contains(interactive)) {\n return false;\n }\n\n return !interactive.hasAttribute(HEADER_TRIGGER_ATTR);\n}\n\n/** Compact tool row chrome: summary row + optional body. Set `collapsible` on the root to enable disclosure. */\nexport type ToolShellProps = HTMLAttributes<HTMLDivElement> & {\n /** When true, root is a collapsible and the header is the trigger. Body still mounts via {@link ToolShellContent}. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n isDisabled?: boolean;\n};\n\nexport function ToolShell({\n collapsible = false,\n defaultOpen = false,\n open,\n onOpenChange,\n isDisabled,\n className,\n children,\n ...props\n}: ToolShellProps) {\n const context = useMemo(() => ({ collapsible }), [collapsible]);\n\n if (collapsible) {\n return (\n <ToolShellContext value={ context }>\n <Collapsible\n className={ cn(styles.root, className) }\n data-slot=\"tool\"\n defaultOpen={ defaultOpen }\n open={ open }\n onOpenChange={ onOpenChange }\n isDisabled={ isDisabled }\n { ...props }\n >\n {children}\n </Collapsible>\n </ToolShellContext>\n );\n }\n\n return (\n <ToolShellContext value={ context }>\n <div\n className={ cn(styles.root, className) }\n data-slot=\"tool\"\n { ...props }\n >\n {children}\n </div>\n </ToolShellContext>\n );\n}\n\nexport interface ToolShellHeaderProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'title' | 'type'> {\n state: string;\n /** Idle label (secondary text). Shimmers with {@link titleInProgress} while the tool runs. */\n title?: string;\n /** In-progress label; defaults to `title` when omitted. */\n titleInProgress?: string;\n /** Override interrupted copy when the run ended mid-tool (defaults to {@link TOOL_INTERRUPTED_MESSAGE}). */\n titleInterrupted?: string;\n /** When false, the title stays static while the tool runs (default true). */\n shimmer?: boolean;\n /** Optional leading icon before the title (e.g. Agent). */\n icon?: ReactNode;\n /** Sits between the icon and the title. */\n beforeTitle?: ReactNode;\n /** Ellipsize a long title in the row. */\n truncateTitle?: boolean;\n /** Error or denial detail; shown in a tooltip on the struck title. */\n statusDetail?: string | undefined;\n /**\n * Strike the idle title. Defaults to the same signal as the muted status icon\n * (SDK error/denial, or a `statusDetail` logical failure).\n */\n failed?: boolean;\n /** Tool is waiting on the user (e.g. AskUserQuestion) — do not treat idle non-terminal as stalled. */\n awaitingUser?: boolean;\n /**\n * Whole row is pressable and shows the hover chevron. `onPress` runs a custom\n * action (subagent). Without it, a parent `PopoverTrigger` supplies the press\n * (file list). Ignored when the shell is collapsible.\n */\n onPress?: () => void;\n /** Show the chevron and accept press from context when `onPress` is omitted. */\n disclosure?: boolean;\n ref?: Ref<HTMLDivElement>;\n children?: ReactNode;\n}\n\ntype ToolShellHeaderTitleProps = {\n title?: string;\n titleInProgress?: string;\n titleInterrupted?: string;\n live: boolean;\n stalled: boolean;\n shimmer: boolean;\n failed: boolean;\n truncate?: boolean;\n statusDetail?: string;\n};\n\nfunction ToolShellHeaderTitle({\n title,\n titleInProgress,\n titleInterrupted,\n live,\n stalled,\n shimmer,\n failed,\n truncate,\n statusDetail,\n}: ToolShellHeaderTitleProps) {\n const labelClassName = cn(\n styles.headerLabel,\n truncate && styles.headerLabelTruncate,\n 'whitespace-nowrap'\n );\n\n if (stalled) {\n return (\n <Text color=\"danger\" className={ labelClassName }>\n {titleInterrupted ?? TOOL_INTERRUPTED_MESSAGE}\n </Text>\n );\n }\n\n const label = title ?? titleInProgress;\n\n if (!label) {\n return null;\n }\n\n const progressLabel = titleInProgress ?? label;\n\n if (live && shimmer) {\n return (\n <Shimmer as=\"span\" className={ labelClassName } duration={ 1 }>\n {progressLabel}\n </Shimmer>\n );\n }\n\n if (failed && !live) {\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text\n decoration=\"line-through\"\n color=\"secondary\"\n className={ labelClassName }\n aria-label={ `${ label } failed` }\n >\n {label}\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return (\n <Text className={ labelClassName }>\n {live ? progressLabel : label}\n </Text>\n );\n}\n\ntype ToolShellHeaderViewProps = ToolShellHeaderProps & {\n progress: ToolProgressState;\n};\n\nfunction ToolShellHeaderStatic({\n state,\n title,\n titleInProgress,\n titleInterrupted,\n icon,\n beforeTitle,\n children,\n statusDetail,\n failed,\n truncateTitle,\n className,\n progress,\n shimmer,\n onPress,\n disclosure,\n ref,\n}: ToolShellHeaderViewProps) {\n const overlay = use(OverlayTriggerStateContext);\n const expanded = overlay?.isOpen === true;\n const pressable = onPress != null || disclosure === true;\n const { live, stalled } = progress;\n const detail = stalled\n ? (statusDetail?.trim() || TOOL_INTERRUPTED_MESSAGE)\n : statusDetail;\n const statusState = stalled ? 'output-error' : state;\n const titleFailed = failed ?? isFailedToolStatus(statusState, detail);\n const row = (\n <>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {beforeTitle}\n\n <ToolShellHeaderTitle\n title={ title }\n titleInProgress={ titleInProgress }\n titleInterrupted={ titleInterrupted }\n live={ live }\n stalled={ stalled }\n shimmer={ shimmer !== false }\n failed={ titleFailed }\n truncate={ truncateTitle }\n statusDetail={ detail }\n />\n {children}\n <Show when={ pressable }>\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ overlay ? expanded : undefined }\n aria-hidden\n />\n </Show>\n </>\n );\n\n if (pressable) {\n return (\n <Pressable ref={ ref } { ...(onPress ? { onPress } : {}) }>\n <div\n role=\"button\"\n className={ cn(styles.headerRow, styles.headerTrigger, className) }\n aria-busy={ live }\n aria-expanded={ overlay ? expanded : undefined }\n >\n {row}\n </div>\n </Pressable>\n );\n }\n\n return (\n <div\n className={ cn(styles.headerRow, styles.headerNonInteractive, className) }\n aria-busy={ live }\n >\n {row}\n </div>\n );\n}\n\nfunction ToolShellHeaderCollapsible({\n state,\n title,\n titleInProgress,\n titleInterrupted,\n icon,\n beforeTitle,\n children,\n statusDetail,\n failed,\n truncateTitle,\n className,\n progress,\n shimmer,\n}: ToolShellHeaderViewProps) {\n const { state: collapsibleState, triggerProps, triggerRef } = useCollapsible();\n const headerRef = useRef<HTMLDivElement>(null);\n const { live, stalled } = progress;\n const detail = stalled\n ? (statusDetail?.trim() || TOOL_INTERRUPTED_MESSAGE)\n : statusDetail;\n const statusState = stalled ? 'output-error' : state;\n const titleFailed = failed ?? isFailedToolStatus(statusState, detail);\n\n const triggerOnPress = (triggerProps as { onPress?: (event: { target: EventTarget }) => void }).onPress;\n\n const hostProps = mergeProps(triggerProps, {\n [HEADER_TRIGGER_ATTR]: '',\n className: cn(styles.headerRow, styles.headerTrigger, className),\n ref: mergeRefs(triggerRef, headerRef),\n 'aria-busy': live,\n 'aria-expanded': collapsibleState.isExpanded,\n onPress: (event: { target: EventTarget }) => {\n const header = headerRef.current;\n\n if (header && isNestedHeaderInteractive(event.target, header)) {\n return;\n }\n\n triggerOnPress?.(event);\n },\n });\n\n return (\n <CollapsibleTrigger asChild>\n <div { ...(hostProps as HTMLAttributes<HTMLDivElement>) }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {beforeTitle}\n\n <ToolShellHeaderTitle\n title={ title }\n titleInProgress={ titleInProgress }\n titleInterrupted={ titleInterrupted }\n live={ live }\n stalled={ stalled }\n shimmer={ shimmer !== false }\n failed={ titleFailed }\n truncate={ truncateTitle }\n statusDetail={ detail }\n />\n {children}\n\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ collapsibleState.isExpanded }\n aria-hidden\n />\n </div>\n </CollapsibleTrigger>\n );\n}\n\nexport function ToolShellHeader(props: ToolShellHeaderProps) {\n const shell = use(ToolShellContext);\n const progress = useToolProgress(props.state, props.awaitingUser);\n\n if (shell?.collapsible) {\n return <ToolShellHeaderCollapsible { ...props } progress={ progress } />;\n }\n\n return <ToolShellHeaderStatic { ...props } progress={ progress } />;\n}\n\nexport type ToolShellContentProps = HTMLAttributes<HTMLDivElement>;\n\nfunction ToolShellContentStatic({ className, children, ...props }: ToolShellContentProps) {\n return (\n <div className={ cn(styles.content, className) } data-slot=\"tool-content\" { ...props }>\n {children}\n </div>\n );\n}\n\nfunction ToolShellContentCollapsible({ className, children, ...props }: ToolShellContentProps) {\n return (\n <CollapsibleMotionContent className={ styles.collapse }>\n <div className={ cn(styles.content, className) } data-slot=\"tool-content\" { ...props }>\n {children}\n </div>\n </CollapsibleMotionContent>\n );\n}\n\nexport function ToolShellContent({ className, children, ...props }: ToolShellContentProps) {\n const shell = use(ToolShellContext);\n\n if (shell?.collapsible) {\n return (\n <ToolShellContentCollapsible className={ className } { ...props }>\n {children}\n </ToolShellContentCollapsible>\n );\n }\n\n return (\n <ToolShellContentStatic className={ className } { ...props }>\n {children}\n </ToolShellContentStatic>\n );\n}\n\nexport type ToolShellFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ToolShellFooter({ className, children, ...props }: ToolShellFooterProps) {\n return (\n <div className={ cn(styles.footer, className) } data-slot=\"tool-footer\" { ...props }>\n {children}\n </div>\n );\n}\n"],"names":["ToolShellContext","HEADER_TRIGGER_ATTR","isNestedHeaderInteractive","target","header","interactive","ToolShell","collapsible","defaultOpen","open","onOpenChange","isDisabled","className","children","props","context","useMemo","Collapsible","cn","styles","ToolShellHeaderTitle","title","titleInProgress","titleInterrupted","live","stalled","shimmer","failed","truncate","statusDetail","labelClassName","Text","TOOL_INTERRUPTED_MESSAGE","label","progressLabel","Shimmer","FailedToolTitleTooltip","ToolShellHeaderStatic","state","icon","beforeTitle","truncateTitle","progress","onPress","disclosure","ref","overlay","use","OverlayTriggerStateContext","expanded","pressable","detail","statusState","titleFailed","isFailedToolStatus","row","_Fragment","_jsx","ToolShellStatusIcon","Show","ChevronDown","Pressable","ToolShellHeaderCollapsible","collapsibleState","triggerProps","triggerRef","useCollapsible","headerRef","useRef","triggerOnPress","hostProps","mergeProps","mergeRefs","event","CollapsibleTrigger","ToolShellHeader","shell","useToolProgress","ToolShellContentStatic","ToolShellContentCollapsible","CollapsibleMotionContent","ToolShellContent","ToolShellFooter"],"mappings":"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"}
1
+ {"version":3,"file":"ToolShell.js","sources":["../../../../src/chat/Tool/shell/ToolShell.tsx"],"sourcesContent":["import { Text } from '@reforma/components/Text';\nimport { ChevronDown } from '@reforma/icons/8';\nimport { cn, mergeRefs } from '@reforma/lib';\nimport {\n createContext,\n HTMLAttributes,\n use,\n useMemo,\n useRef,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { mergeProps } from 'react-aria';\nimport { OverlayTriggerStateContext } from 'react-aria-components';\n\nimport {\n Collapsible,\n CollapsibleMotionContent,\n CollapsibleTrigger,\n useCollapsible,\n} from '../../../Collapsible';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { useToolProgress, type ToolProgressState } from './toolProgress';\nimport styles from './ToolShell.module.css';\nimport { FailedToolTitleTooltip, isFailedToolStatus, ToolShellStatusIcon } from './ToolShellStatusIcon';\n\ntype ToolShellContextValue = {\n collapsible: boolean;\n};\n\nconst ToolShellContext = createContext<ToolShellContextValue | null>(null);\n\nconst HEADER_TRIGGER_ATTR = 'data-tool-shell-header';\n\n/** Clicks on nested controls (e.g. file chips) must not toggle the collapsible header. */\nfunction isNestedHeaderInteractive(target: EventTarget | null, header: HTMLElement): boolean {\n if (!(target instanceof Element)) {\n return false;\n }\n\n const interactive = target.closest(\n 'a[href], input, textarea, select, [role=\"link\"]'\n ) ?? target.closest('button, [role=\"button\"]');\n\n if (!interactive || !header.contains(interactive)) {\n return false;\n }\n\n return !interactive.hasAttribute(HEADER_TRIGGER_ATTR);\n}\n\n/** Compact tool row chrome: summary row + optional body. Set `collapsible` on the root to enable disclosure. */\nexport type ToolShellProps = HTMLAttributes<HTMLDivElement> & {\n /** When true, root is a collapsible and the header is the trigger. Body still mounts via {@link ToolShellContent}. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n isDisabled?: boolean;\n};\n\nexport function ToolShell({\n collapsible = false,\n defaultOpen = false,\n open,\n onOpenChange,\n isDisabled,\n className,\n children,\n ...props\n}: ToolShellProps) {\n const context = useMemo(() => ({ collapsible }), [collapsible]);\n\n if (collapsible) {\n return (\n <ToolShellContext value={ context }>\n <Collapsible\n className={ cn(styles.root, className) }\n data-slot=\"tool\"\n defaultOpen={ defaultOpen }\n open={ open }\n onOpenChange={ onOpenChange }\n isDisabled={ isDisabled }\n { ...props }\n >\n {children}\n </Collapsible>\n </ToolShellContext>\n );\n }\n\n return (\n <ToolShellContext value={ context }>\n <div\n className={ cn(styles.root, className) }\n data-slot=\"tool\"\n { ...props }\n >\n {children}\n </div>\n </ToolShellContext>\n );\n}\n\nexport interface ToolShellHeaderProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'title' | 'type'> {\n state: string;\n /** Idle label (secondary text). Shimmers with {@link titleInProgress} while the tool runs. */\n title?: string;\n /** In-progress label; defaults to `title` when omitted. */\n titleInProgress?: string;\n /** Override interrupted copy when the run ended mid-tool (defaults to {@link TOOL_INTERRUPTED_MESSAGE}). */\n titleInterrupted?: string;\n /** When false, the title stays static while the tool runs (default true). */\n shimmer?: boolean;\n /** Optional leading icon before the title (e.g. Agent). */\n icon?: ReactNode;\n /** Sits between the icon and the title. */\n beforeTitle?: ReactNode;\n /** Ellipsize a long title in the row. */\n truncateTitle?: boolean;\n /** Error or denial detail; shown in a tooltip on the struck title. */\n statusDetail?: string | undefined;\n /**\n * Strike the idle title. Defaults to the same signal as the muted status icon\n * (SDK error/denial, or a `statusDetail` logical failure).\n */\n failed?: boolean;\n /** Tool is waiting on the user (e.g. AskUserQuestion) — do not treat idle non-terminal as stalled. */\n awaitingUser?: boolean;\n /**\n * Whole row is pressable and shows the hover chevron. `onPress` runs a custom\n * action (subagent). Without it, a parent `PopoverTrigger` supplies the press\n * (file list). Ignored when the shell is collapsible.\n */\n onPress?: () => void;\n /** Show the chevron and accept press from context when `onPress` is omitted. */\n disclosure?: boolean;\n ref?: Ref<HTMLDivElement>;\n children?: ReactNode;\n}\n\ntype ToolShellHeaderTitleProps = {\n title?: string;\n titleInProgress?: string;\n titleInterrupted?: string;\n live: boolean;\n stalled: boolean;\n shimmer: boolean;\n failed: boolean;\n truncate?: boolean;\n statusDetail?: string;\n};\n\nfunction ToolShellHeaderTitle({\n title,\n titleInProgress,\n titleInterrupted,\n live,\n stalled,\n shimmer,\n failed,\n truncate,\n statusDetail,\n}: ToolShellHeaderTitleProps) {\n const labelClassName = cn(\n styles.headerLabel,\n truncate && styles.headerLabelTruncate,\n 'whitespace-nowrap'\n );\n\n if (stalled) {\n return (\n <Text color=\"danger\" className={ labelClassName }>\n {titleInterrupted ?? TOOL_INTERRUPTED_MESSAGE}\n </Text>\n );\n }\n\n const label = title ?? titleInProgress;\n\n if (!label) {\n return null;\n }\n\n const progressLabel = titleInProgress ?? label;\n\n if (live && shimmer) {\n return (\n <Shimmer as=\"span\" className={ labelClassName } duration={ 1 }>\n {progressLabel}\n </Shimmer>\n );\n }\n\n if (failed && !live) {\n const struck = (\n <Text\n decoration=\"line-through\"\n color=\"secondary\"\n className={ labelClassName }\n aria-label={ `${ label } failed` }\n >\n {label}\n </Text>\n );\n\n if (!statusDetail?.trim()) {\n return struck;\n }\n\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n {struck}\n </FailedToolTitleTooltip>\n );\n }\n\n return (\n <Text className={ labelClassName }>\n {live ? progressLabel : label}\n </Text>\n );\n}\n\ntype ToolShellHeaderViewProps = ToolShellHeaderProps & {\n progress: ToolProgressState;\n};\n\nfunction ToolShellHeaderStatic({\n state,\n title,\n titleInProgress,\n titleInterrupted,\n icon,\n beforeTitle,\n children,\n statusDetail,\n failed,\n truncateTitle,\n className,\n progress,\n shimmer,\n onPress,\n disclosure,\n ref,\n}: ToolShellHeaderViewProps) {\n const overlay = use(OverlayTriggerStateContext);\n const expanded = overlay?.isOpen === true;\n const pressable = onPress != null || disclosure === true;\n const { live, stalled } = progress;\n const detail = stalled\n ? (statusDetail?.trim() || TOOL_INTERRUPTED_MESSAGE)\n : statusDetail;\n const statusState = stalled ? 'output-error' : state;\n const titleFailed = failed ?? isFailedToolStatus(statusState, detail);\n const row = (\n <>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {beforeTitle}\n\n <ToolShellHeaderTitle\n title={ title }\n titleInProgress={ titleInProgress }\n titleInterrupted={ titleInterrupted }\n live={ live }\n stalled={ stalled }\n shimmer={ shimmer !== false }\n failed={ titleFailed }\n truncate={ truncateTitle }\n statusDetail={ detail }\n />\n {children}\n <Show when={ pressable }>\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ overlay ? expanded : undefined }\n aria-hidden\n />\n </Show>\n </>\n );\n\n if (pressable) {\n return (\n <Pressable ref={ ref } { ...(onPress ? { onPress } : {}) }>\n <div\n role=\"button\"\n className={ cn(styles.headerRow, styles.headerTrigger, className) }\n aria-busy={ live }\n aria-expanded={ overlay ? expanded : undefined }\n >\n {row}\n </div>\n </Pressable>\n );\n }\n\n return (\n <div\n className={ cn(styles.headerRow, styles.headerNonInteractive, className) }\n aria-busy={ live }\n >\n {row}\n </div>\n );\n}\n\nfunction ToolShellHeaderCollapsible({\n state,\n title,\n titleInProgress,\n titleInterrupted,\n icon,\n beforeTitle,\n children,\n statusDetail,\n failed,\n truncateTitle,\n className,\n progress,\n shimmer,\n}: ToolShellHeaderViewProps) {\n const { state: collapsibleState, triggerProps, triggerRef } = useCollapsible();\n const headerRef = useRef<HTMLDivElement>(null);\n const { live, stalled } = progress;\n const detail = stalled\n ? (statusDetail?.trim() || TOOL_INTERRUPTED_MESSAGE)\n : statusDetail;\n const statusState = stalled ? 'output-error' : state;\n const titleFailed = failed ?? isFailedToolStatus(statusState, detail);\n\n const triggerOnPress = (triggerProps as { onPress?: (event: { target: EventTarget }) => void }).onPress;\n\n // eslint-disable-next-line react-hooks/refs -- mergeRefs composes; it does not read `.current`\n const hostProps = mergeProps(triggerProps, {\n [HEADER_TRIGGER_ATTR]: '',\n className: cn(styles.headerRow, styles.headerTrigger, className),\n // eslint-disable-next-line react-hooks/refs -- mergeRefs composes; it does not read `.current`\n ref: mergeRefs(triggerRef, headerRef),\n 'aria-busy': live,\n 'aria-expanded': collapsibleState.isExpanded,\n onPress: (event: { target: EventTarget }) => {\n const header = headerRef.current;\n\n if (header && isNestedHeaderInteractive(event.target, header)) {\n return;\n }\n\n triggerOnPress?.(event);\n },\n });\n\n return (\n <CollapsibleTrigger asChild>\n <div { ...(hostProps as HTMLAttributes<HTMLDivElement>) }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {beforeTitle}\n\n <ToolShellHeaderTitle\n title={ title }\n titleInProgress={ titleInProgress }\n titleInterrupted={ titleInterrupted }\n live={ live }\n stalled={ stalled }\n shimmer={ shimmer !== false }\n failed={ titleFailed }\n truncate={ truncateTitle }\n statusDetail={ detail }\n />\n {children}\n\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ collapsibleState.isExpanded }\n aria-hidden\n />\n </div>\n </CollapsibleTrigger>\n );\n}\n\nexport function ToolShellHeader(props: ToolShellHeaderProps) {\n const shell = use(ToolShellContext);\n const progress = useToolProgress(props.state, props.awaitingUser);\n\n if (shell?.collapsible) {\n return <ToolShellHeaderCollapsible { ...props } progress={ progress } />;\n }\n\n return <ToolShellHeaderStatic { ...props } progress={ progress } />;\n}\n\nexport type ToolShellContentProps = HTMLAttributes<HTMLDivElement>;\n\nfunction ToolShellContentStatic({ className, children, ...props }: ToolShellContentProps) {\n return (\n <div className={ cn(styles.content, className) } data-slot=\"tool-content\" { ...props }>\n {children}\n </div>\n );\n}\n\nfunction ToolShellContentCollapsible({ className, children, ...props }: ToolShellContentProps) {\n return (\n <CollapsibleMotionContent className={ styles.collapse }>\n <div className={ cn(styles.content, className) } data-slot=\"tool-content\" { ...props }>\n {children}\n </div>\n </CollapsibleMotionContent>\n );\n}\n\nexport function ToolShellContent({ className, children, ...props }: ToolShellContentProps) {\n const shell = use(ToolShellContext);\n\n if (shell?.collapsible) {\n return (\n <ToolShellContentCollapsible className={ className } { ...props }>\n {children}\n </ToolShellContentCollapsible>\n );\n }\n\n return (\n <ToolShellContentStatic className={ className } { ...props }>\n {children}\n </ToolShellContentStatic>\n );\n}\n\nexport type ToolShellFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ToolShellFooter({ className, children, ...props }: ToolShellFooterProps) {\n return (\n <div className={ cn(styles.footer, className) } data-slot=\"tool-footer\" { ...props }>\n {children}\n </div>\n );\n}\n"],"names":["ToolShellContext","HEADER_TRIGGER_ATTR","isNestedHeaderInteractive","target","header","interactive","ToolShell","collapsible","defaultOpen","open","onOpenChange","isDisabled","className","children","props","context","useMemo","Collapsible","cn","styles","ToolShellHeaderTitle","title","titleInProgress","titleInterrupted","live","stalled","shimmer","failed","truncate","statusDetail","labelClassName","Text","TOOL_INTERRUPTED_MESSAGE","label","progressLabel","Shimmer","struck","FailedToolTitleTooltip","ToolShellHeaderStatic","state","icon","beforeTitle","truncateTitle","progress","onPress","disclosure","ref","overlay","use","OverlayTriggerStateContext","expanded","pressable","detail","statusState","titleFailed","isFailedToolStatus","row","_Fragment","_jsx","ToolShellStatusIcon","Show","ChevronDown","Pressable","ToolShellHeaderCollapsible","collapsibleState","triggerProps","triggerRef","useCollapsible","headerRef","useRef","triggerOnPress","hostProps","mergeProps","mergeRefs","event","CollapsibleTrigger","ToolShellHeader","shell","useToolProgress","ToolShellContentStatic","ToolShellContentCollapsible","CollapsibleMotionContent","ToolShellContent","ToolShellFooter"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmModal.js","sources":["../../src/modals/ConfirmModal.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box } from '../Box';\nimport { Button } from '../Button';\nimport { Modal, useModalContext } from '../Modal';\nimport { Text } from '../Text';\nimport { toast } from '../Toast';\n\nimport type { ReactNode } from 'react';\nimport type { ModalOptionsRaw } from '../Modal/typings';\n\nexport type OpenConfirmModalOptions = {\n title: string;\n message: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void | Promise<void>;\n};\n\n/** Keep in sync with `--z-confirm` in `@reforma/tokens`. */\nconst CONFIRM_MODAL_Z_INDEX = 101100;\n\nconst DEFAULT_MODAL_OPTIONS: ModalOptionsRaw = {\n shadow: true,\n width: 380,\n clickOut: true,\n closeOnEscape: true,\n closeButton: false,\n zIndex: CONFIRM_MODAL_Z_INDEX,\n};\n\nexport function openConfirmModal(\n options: OpenConfirmModalOptions,\n modalOptions?: ModalOptionsRaw\n) {\n return Modal.create({\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n component: <ConfirmModalContent { ...options } />,\n });\n}\n\nexport function ConfirmModalContent({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n destructive,\n onConfirm,\n}: OpenConfirmModalOptions) {\n const { modal } = useModalContext();\n const [isPending, setIsPending] = useState(false);\n\n const handleConfirm = async() => {\n if (isPending) {\n return;\n }\n\n setIsPending(true);\n const { clickOut, closeOnEscape } = modal.currentOptions;\n modal.updateOptions({ clickOut: false, closeOnEscape: false });\n\n try {\n await onConfirm();\n modal.cancel();\n }\n catch(error) {\n setIsPending(false);\n modal.updateOptions({ clickOut, closeOnEscape });\n toast.error({\n message: error instanceof Error ? error.message : 'Something went wrong. Please try again.',\n });\n }\n };\n\n return (\n <Box\n gap=\"xl\"\n padding=\"xxl\"\n onKeyDown={ (event) => {\n if (event.key !== 'Enter' || event.defaultPrevented || isPending) {\n return;\n }\n\n // Overlay / non-button focus: Enter confirms. Focused Cancel still cancels via its own activation.\n if (event.target instanceof HTMLButtonElement || event.target instanceof HTMLAnchorElement) {\n return;\n }\n\n event.preventDefault();\n void handleConfirm();\n } }\n >\n <Box gap=\"md\">\n <Text variant=\"heading-3\">{title}</Text>\n {typeof message === 'string'\n ? (\n <Text variant=\"md\" color=\"secondary\">\n {message}\n </Text>\n )\n : message}\n </Box>\n\n <Box direction=\"row\" gap=\"md\" fullWidth equalWidth>\n <Button\n variant=\"bordered\"\n isDisabled={ isPending }\n onPress={ () => modal.cancel() }\n >\n {cancelLabel}\n </Button>\n\n <Button\n autoFocus\n color={ destructive ? 'danger' : 'primary' }\n isPending={ isPending }\n isDisabled={ isPending }\n onPress={ () => void handleConfirm() }\n >\n {confirmLabel}\n </Button>\n </Box>\n </Box>\n );\n}\n"],"names":["CONFIRM_MODAL_Z_INDEX","DEFAULT_MODAL_OPTIONS","openConfirmModal","options","modalOptions","Modal","ConfirmModalContent","title","message","confirmLabel","cancelLabel","destructive","onConfirm","modal","useModalContext","isPending","setIsPending","useState","handleConfirm","clickOut","closeOnEscape","error","toast","Box","event","_jsxs","_jsx","Text","Button"],"mappings":";;;;;;;;AAQA,MAAMA,IAAwB,QACxBC,IAAwB;AAAA,EAC5B,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa;AAAA,EACb,QAAQD;AACV;AACO,SAASE,EAAiBC,GAASC,GAAc;AACtD,SAAOC,EAAM,OAAO;AAAA,IAClB,GAAGJ;AAAA,IACH,GAAGG;AAAA,IACH,6BAA6BE,GAAqB;AAAA,MAChD,GAAGH;AAAA,IAAA,CACJ;AAAA,EAAA,CACF;AACH;AACO,SAASG,EAAoB;AAAA,EAClC,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,aAAAC;AAAA,EACA,WAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,OAAAC;AAAA,EAAA,IACEC,EAAA,GACE,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1CC,IAAgB,YAAY;AAChC,QAAIH;AACF;AAEF,IAAAC,EAAa,EAAI;AACjB,UAAM;AAAA,MACJ,UAAAG;AAAA,MACA,eAAAC;AAAA,IAAA,IACEP,EAAM;AACV,IAAAA,EAAM,cAAc;AAAA,MAClB,UAAU;AAAA,MACV,eAAe;AAAA,IAAA,CAChB;AACD,QAAI;AACF,YAAMD,EAAA,GACNC,EAAM,OAAA;AAAA,IACR,SAASQ,GAAO;AACd,MAAAL,EAAa,EAAK,GAClBH,EAAM,cAAc;AAAA,QAClB,UAAAM;AAAA,QACA,eAAAC;AAAA,MAAA,CACD,GACDE,EAAM,MAAM;AAAA,QACV,SAASD,aAAiB,QAAQA,EAAM,UAAU;AAAA,MAAA,CACnD;AAAA,IACH;AAAA,EACF;AACA,2BAA0BE,GAAK;AAAA,IAC7B,KAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,CAAAC,MAAS;AAClB,MAAIA,EAAM,QAAQ,WAAWA,EAAM,oBAAoBT,KAKnDS,EAAM,kBAAkB,qBAAqBA,EAAM,kBAAkB,sBAGzEA,EAAM,eAAA,GACDN,EAAA;AAAA,IACP;AAAA,IACA,UAAU,CAAcO,gBAAAA,EAAMF,GAAK;AAAA,MACjC,KAAK;AAAA,MACL,UAAU,CAAcG,gBAAAA,EAAKC,GAAM;AAAA,QACjC,SAAS;AAAA,QACT,UAAUpB;AAAA,MAAA,CACX,GAAG,OAAOC,KAAY,6BAA6BmB,GAAM;AAAA,QACxD,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAUnB;AAAA,MAAA,CACX,IAAIA,CAAO;AAAA,IAAA,CACb,GAAgBiB,gBAAAA,EAAMF,GAAK;AAAA,MAC1B,WAAW;AAAA,MACX,KAAK;AAAA,MACL,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,CAAcG,gBAAAA,EAAKE,GAAQ;AAAA,QACnC,SAAS;AAAA,QACT,YAAYb;AAAA,QACZ,SAAS,MAAMF,EAAM,OAAA;AAAA,QACrB,UAAUH;AAAA,MAAA,CACX,GAAgBgB,gBAAAA,EAAKE,GAAQ;AAAA,QAC5B,WAAW;AAAA,QACX,OAAOjB,IAAc,WAAW;AAAA,QAChC,WAAAI;AAAA,QACA,YAAYA;AAAA,QACZ,SAAS,MAAA;AAAM,UAAKG,EAAA;AAAA;AAAA,QACpB,UAAUT;AAAA,MAAA,CACX,CAAC;AAAA,IAAA,CACH,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"ConfirmModal.js","sources":["../../src/modals/ConfirmModal.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Box } from '../Box';\nimport { Button } from '../Button';\nimport { Modal, useModalContext } from '../Modal';\nimport { Text } from '../Text';\nimport { toast } from '../Toast';\n\nimport type { ReactNode } from 'react';\nimport type { ModalOptionsRaw } from '../Modal/typings';\n\nexport type OpenConfirmModalOptions = {\n title: string;\n message: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void | Promise<void>;\n};\n\n/** Keep in sync with `--z-confirm` in `@reforma/styles`. */\nconst CONFIRM_MODAL_Z_INDEX = 101100;\n\nconst DEFAULT_MODAL_OPTIONS: ModalOptionsRaw = {\n shadow: true,\n width: 380,\n clickOut: true,\n closeOnEscape: true,\n closeButton: false,\n zIndex: CONFIRM_MODAL_Z_INDEX,\n};\n\nexport function openConfirmModal(\n options: OpenConfirmModalOptions,\n modalOptions?: ModalOptionsRaw\n) {\n return Modal.create({\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n component: <ConfirmModalContent { ...options } />,\n });\n}\n\nexport function ConfirmModalContent({\n title,\n message,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n destructive,\n onConfirm,\n}: OpenConfirmModalOptions) {\n const { modal } = useModalContext();\n const [isPending, setIsPending] = useState(false);\n\n const handleConfirm = async() => {\n if (isPending) {\n return;\n }\n\n setIsPending(true);\n const { clickOut, closeOnEscape } = modal.currentOptions;\n modal.updateOptions({ clickOut: false, closeOnEscape: false });\n\n try {\n await onConfirm();\n modal.cancel();\n }\n catch(error) {\n setIsPending(false);\n modal.updateOptions({ clickOut, closeOnEscape });\n toast.error({\n message: error instanceof Error ? error.message : 'Something went wrong. Please try again.',\n });\n }\n };\n\n return (\n <Box\n gap=\"xl\"\n padding=\"xxl\"\n onKeyDown={ (event) => {\n if (event.key !== 'Enter' || event.defaultPrevented || isPending) {\n return;\n }\n\n // Overlay / non-button focus: Enter confirms. Focused Cancel still cancels via its own activation.\n if (event.target instanceof HTMLButtonElement || event.target instanceof HTMLAnchorElement) {\n return;\n }\n\n event.preventDefault();\n void handleConfirm();\n } }\n >\n <Box gap=\"md\">\n <Text variant=\"heading-3\">{title}</Text>\n {typeof message === 'string'\n ? (\n <Text variant=\"md\" color=\"secondary\">\n {message}\n </Text>\n )\n : message}\n </Box>\n\n <Box direction=\"row\" gap=\"md\" fullWidth equalWidth>\n <Button\n variant=\"bordered\"\n isDisabled={ isPending }\n onPress={ () => modal.cancel() }\n >\n {cancelLabel}\n </Button>\n\n <Button\n autoFocus\n color={ destructive ? 'danger' : 'primary' }\n isPending={ isPending }\n isDisabled={ isPending }\n onPress={ () => void handleConfirm() }\n >\n {confirmLabel}\n </Button>\n </Box>\n </Box>\n );\n}\n"],"names":["CONFIRM_MODAL_Z_INDEX","DEFAULT_MODAL_OPTIONS","openConfirmModal","options","modalOptions","Modal","ConfirmModalContent","title","message","confirmLabel","cancelLabel","destructive","onConfirm","modal","useModalContext","isPending","setIsPending","useState","handleConfirm","clickOut","closeOnEscape","error","toast","Box","event","_jsxs","_jsx","Text","Button"],"mappings":";;;;;;;;AAQA,MAAMA,IAAwB,QACxBC,IAAwB;AAAA,EAC5B,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,eAAe;AAAA,EACf,aAAa;AAAA,EACb,QAAQD;AACV;AACO,SAASE,EAAiBC,GAASC,GAAc;AACtD,SAAOC,EAAM,OAAO;AAAA,IAClB,GAAGJ;AAAA,IACH,GAAGG;AAAA,IACH,6BAA6BE,GAAqB;AAAA,MAChD,GAAGH;AAAA,IAAA,CACJ;AAAA,EAAA,CACF;AACH;AACO,SAASG,EAAoB;AAAA,EAClC,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,aAAAC;AAAA,EACA,WAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,OAAAC;AAAA,EAAA,IACEC,EAAA,GACE,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1CC,IAAgB,YAAY;AAChC,QAAIH;AACF;AAEF,IAAAC,EAAa,EAAI;AACjB,UAAM;AAAA,MACJ,UAAAG;AAAA,MACA,eAAAC;AAAA,IAAA,IACEP,EAAM;AACV,IAAAA,EAAM,cAAc;AAAA,MAClB,UAAU;AAAA,MACV,eAAe;AAAA,IAAA,CAChB;AACD,QAAI;AACF,YAAMD,EAAA,GACNC,EAAM,OAAA;AAAA,IACR,SAASQ,GAAO;AACd,MAAAL,EAAa,EAAK,GAClBH,EAAM,cAAc;AAAA,QAClB,UAAAM;AAAA,QACA,eAAAC;AAAA,MAAA,CACD,GACDE,EAAM,MAAM;AAAA,QACV,SAASD,aAAiB,QAAQA,EAAM,UAAU;AAAA,MAAA,CACnD;AAAA,IACH;AAAA,EACF;AACA,2BAA0BE,GAAK;AAAA,IAC7B,KAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,CAAAC,MAAS;AAClB,MAAIA,EAAM,QAAQ,WAAWA,EAAM,oBAAoBT,KAKnDS,EAAM,kBAAkB,qBAAqBA,EAAM,kBAAkB,sBAGzEA,EAAM,eAAA,GACDN,EAAA;AAAA,IACP;AAAA,IACA,UAAU,CAAcO,gBAAAA,EAAMF,GAAK;AAAA,MACjC,KAAK;AAAA,MACL,UAAU,CAAcG,gBAAAA,EAAKC,GAAM;AAAA,QACjC,SAAS;AAAA,QACT,UAAUpB;AAAA,MAAA,CACX,GAAG,OAAOC,KAAY,6BAA6BmB,GAAM;AAAA,QACxD,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAUnB;AAAA,MAAA,CACX,IAAIA,CAAO;AAAA,IAAA,CACb,GAAgBiB,gBAAAA,EAAMF,GAAK;AAAA,MAC1B,WAAW;AAAA,MACX,KAAK;AAAA,MACL,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,CAAcG,gBAAAA,EAAKE,GAAQ;AAAA,QACnC,SAAS;AAAA,QACT,YAAYb;AAAA,QACZ,SAAS,MAAMF,EAAM,OAAA;AAAA,QACrB,UAAUH;AAAA,MAAA,CACX,GAAgBgB,gBAAAA,EAAKE,GAAQ;AAAA,QAC5B,WAAW;AAAA,QACX,OAAOjB,IAAc,WAAW;AAAA,QAChC,WAAAI;AAAA,QACA,YAAYA;AAAA,QACZ,SAAS,MAAA;AAAM,UAAKG,EAAA;AAAA;AAAA,QACpB,UAAUT;AAAA,MAAA,CACX,CAAC;AAAA,IAAA,CACH,CAAC;AAAA,EAAA,CACH;AACH;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@reforma/components",
3
3
  "description": "A components library for Reforma",
4
4
  "type": "module",
5
- "version": "0.1.1",
5
+ "version": "0.1.2",
6
6
  "license": "UNLICENSED",
7
7
  "author": "Reforma, Inc. <dev@reforma.ai>",
8
8
  "repository": {
@@ -69,7 +69,6 @@
69
69
  "@reforma/constants": "workspace:*",
70
70
  "@reforma/icons": "workspace:*",
71
71
  "@reforma/lib": "workspace:*",
72
- "@reforma/tokens": "workspace:*",
73
72
  "@reforma/types": "workspace:*",
74
73
  "@shikijs/transformers": "^4.0.2",
75
74
  "@streamdown/cjk": "1.0.3",
@@ -113,6 +112,7 @@
113
112
  },
114
113
  "devDependencies": {
115
114
  "@babel/preset-react": "^7.26.3",
115
+ "@reforma/styles": "workspace:*",
116
116
  "@vitejs/plugin-react-swc": "^3.7.0",
117
117
  "vite": "^7.0.0",
118
118
  "vite-plugin-babel": "^1.3.0",