@reforma/components 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/SortableList/SortableList.d.ts +9 -3
  2. package/dist/SortableList/SortableList.d.ts.map +1 -1
  3. package/dist/SortableList/SortableList.js +178 -163
  4. package/dist/SortableList/SortableList.js.map +1 -1
  5. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +1 -1
  6. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  7. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  8. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +5 -5
  10. package/dist/chat/Message/segments/MessagePhaseSection.module.css +1 -1
  11. package/dist/chat/Message/turn/MessageAssistantBody.d.ts +2 -1
  12. package/dist/chat/Message/turn/MessageAssistantBody.d.ts.map +1 -1
  13. package/dist/chat/Message/turn/MessageAssistantBody.js +62 -58
  14. package/dist/chat/Message/turn/MessageAssistantBody.js.map +1 -1
  15. package/dist/chat/Message/turn/workedCollapse.d.ts +6 -2
  16. package/dist/chat/Message/turn/workedCollapse.d.ts.map +1 -1
  17. package/dist/chat/Message/turn/workedCollapse.js +24 -18
  18. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  19. package/dist/chat/Tool/agent/AgentTool.js +5 -5
  20. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  21. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  22. package/dist/chat/Tool/bash/BashTool.js +50 -57
  23. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  24. package/dist/chat/Tool/bash/BashTool.module.css +1 -1
  25. package/dist/chat/Tool/bash/BashTool.module.css.js +4 -8
  26. package/dist/chat/Tool/bash/BashTool.module.css.js.map +1 -1
  27. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  28. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  29. package/dist/chat/Tool/shell/ToolShell.js +1 -1
  30. package/dist/chat/Tool/shell/ToolShell.js.map +1 -1
  31. package/dist/chat/Tool/shell/ToolShellCard.js +7 -7
  32. package/dist/chat/Tool/shell/ToolShellCard.js.map +1 -1
  33. package/dist/openui/functions/index.d.ts +59 -59
  34. package/dist/openui/functions/index.d.ts.map +1 -1
  35. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ImageAssetTool.js","sources":["../../../../src/chat/Tool/image-asset/ImageAssetTool.tsx"],"sourcesContent":["import { AttentionTriangle } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { getToolName } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Image } from '../../../Image';\nimport { Lightbox, type LightboxOpen } from '../../../Lightbox';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { getToolFailureRowState, isToolInvocationInProgress, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport {\n ToolShellCard,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport { FailedToolTitleTooltip } from '../shell/ToolShellStatusIcon';\nimport styles from './ImageAssetTool.module.css';\n\nimport type { CSSProperties } from 'react';\nimport type { ToolRendererProps } from '../types';\n\ntype ImageCredit = {\n name: string;\n profileUrl: string;\n unsplashUrl: string;\n};\n\ntype ImageAsset = {\n url?: string;\n path?: string;\n publicPath?: string;\n previewUrl?: string;\n mediaType?: string;\n alt?: string;\n credit?: ImageCredit;\n};\n\ntype ImageAssetSuccess = {\n ok: true;\n alt?: string;\n query?: string;\n images: ImageAsset[];\n};\n\ntype ImageAssetFailure = {\n ok: false;\n error: string;\n alt?: string;\n query?: string;\n};\n\nconst IMAGE_TOOL_NAMES = new Set(['ImageGen', 'SearchImage', 'ImportAsset']);\n\nfunction parseOutput(output: unknown): ImageAssetSuccess | ImageAssetFailure | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output)) {\n return undefined;\n }\n\n return output as ImageAssetSuccess | ImageAssetFailure;\n}\n\n/** Absolute asset URL, or chat `previewUrl` + site `publicPath` (filesystem saves). */\nfunction previewSrc(image: ImageAsset, host?: string): string | undefined {\n const absolute = image.url?.trim() || image.previewUrl?.trim();\n\n if (absolute) {\n return absolute;\n }\n\n const publicPath = image.publicPath?.trim();\n\n if (!publicPath || !host) {\n return undefined;\n }\n\n try {\n return new URL(publicPath, host).href;\n }\n catch {\n return undefined;\n }\n}\n\nfunction titlesFor(toolName: string, count: number): { idle: string; progress: string } {\n if (toolName === 'SearchImage') {\n if (count > 1) {\n return { progress: `Finding ${ count } photos`, idle: `Found ${ count } photos` };\n }\n\n return { progress: 'Finding photos', idle: 'Found photos' };\n }\n\n if (toolName === 'ImportAsset') {\n return { progress: 'Importing file', idle: 'Imported file' };\n }\n\n if (count > 1) {\n return { progress: `Generating ${ count } images`, idle: `Generated ${ count } images` };\n }\n\n return { progress: 'Generating image', idle: 'Generated image' };\n}\n\nfunction failureTitle(toolName: string): string {\n if (toolName === 'SearchImage') {\n return 'Couldn\\'t find photos';\n }\n\n if (toolName === 'ImportAsset') {\n return 'Couldn\\'t import file';\n }\n\n return 'Couldn\\'t generate the image';\n}\n\nfunction CreditCaption({ credit }: { credit: ImageCredit }) {\n const profileHref = credit.profileUrl.trim();\n const unsplashHref = credit.unsplashUrl.trim() || 'https://unsplash.com';\n\n return (\n <Text variant=\"xs\" className={ styles.credit }>\n Photo by\n { ' ' }\n <Show\n when={ profileHref }\n fallback={ <span>{ credit.name }</span> }\n >\n {href => (\n <a\n className={ styles.creditLink }\n href={ href }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n { credit.name }\n </a>\n )}\n </Show>\n { ' / ' }\n <a\n className={ styles.creditLink }\n href={ unsplashHref }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n Unsplash\n </a>\n </Text>\n );\n}\n\ntype ToolInput = {\n alt?: string;\n query?: string;\n count?: unknown;\n prompts?: Array<{ alt?: string }>;\n};\n\nexport type ImageAssetFanSlot = {\n key: string;\n src?: string;\n alt: string;\n};\n\nfunction uniqueLines(values: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const value of values) {\n const line = value?.trim();\n\n if (!line || seen.has(line)) {\n continue;\n }\n\n seen.add(line);\n lines.push(line);\n }\n\n return lines;\n}\n\n/** Per-image alts, one each. Falls back to a joined ` · ` string by splitting it. */\nfunction captionLines(args: {\n images: ImageAsset[];\n prompts?: Array<{ alt?: string }>;\n fallback: string;\n}): string[] {\n const fromImages = uniqueLines(args.images.map(image => image.alt));\n\n if (fromImages.length > 0) {\n return fromImages;\n }\n\n const fromPrompts = uniqueLines((args.prompts ?? []).map(item => item.alt));\n\n if (fromPrompts.length > 0) {\n return fromPrompts;\n }\n\n if (args.fallback.includes(' · ')) {\n return uniqueLines(args.fallback.split(' · '));\n }\n\n return args.fallback ? [args.fallback] : [];\n}\n\nfunction requestedCount(input: ToolInput | undefined): number {\n const prompts = input?.prompts?.length ?? 0;\n const count = typeof input?.count === 'number' && input.count > 0 ? input.count : 0;\n\n return Math.max(prompts, count, 1);\n}\n\nfunction uniqueCredits(images: readonly ImageAsset[]): ImageCredit[] {\n const seen = new Set<string>();\n const credits: ImageCredit[] = [];\n\n for (const image of images) {\n if (!image.credit) {\n continue;\n }\n\n const key = image.credit.profileUrl || image.credit.name;\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n credits.push(image.credit);\n }\n\n return credits;\n}\n\nfunction FanFace({ slot }: { slot: ImageAssetFanSlot }) {\n if (!slot.src) {\n return null;\n }\n\n const src = slot.src;\n\n return (\n <Lightbox alt={ slot.alt } src={ src }>\n {(open: LightboxOpen) => (\n <Pressable\n aria-label={ `View ${ slot.alt }` }\n className={ styles.fanHit }\n onPress={ open }\n >\n <Image alt=\"\" className={ styles.fanImage } src={ src } />\n </Pressable>\n )}\n </Lightbox>\n );\n}\n\nexport function ImageAssetThumbFan({\n badge,\n slots,\n}: {\n badge?: 'loader' | 'error';\n slots: readonly ImageAssetFanSlot[];\n}) {\n return (\n <div\n className={ styles.fan }\n data-count={ slots.length }\n style={ { '--n': slots.length } as CSSProperties }\n >\n <For each={ slots }>\n {(slot, index, { isLast }) => (\n <div\n key={ slot.key }\n className={ styles.fanCard }\n style={ { '--i': index } as CSSProperties }\n >\n <FanFace slot={ slot } />\n <Show when={ isLast && badge === 'loader' }>\n <ProgressLoader aria-hidden className={ styles.loader } size={ 14 } />\n </Show>\n <Show when={ isLast && badge === 'error' }>\n <AttentionTriangle aria-hidden className={ styles.errorMark } size={ 16 } />\n </Show>\n </div>\n )}\n </For>\n </div>\n );\n}\n\nexport function ImageAssetCardTitle({\n failed,\n idle,\n live,\n progress,\n stalled,\n statusDetail,\n}: {\n failed: boolean;\n idle: string;\n live: boolean;\n progress: string;\n stalled: boolean;\n statusDetail?: string;\n}) {\n if (stalled) {\n return (\n <Text className={ styles.title } color=\"danger\">\n { TOOL_INTERRUPTED_MESSAGE }\n </Text>\n );\n }\n\n if (live) {\n return (\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { progress }\n </Shimmer>\n );\n }\n\n if (failed) {\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text className={ styles.title } color=\"secondary\" decoration=\"line-through\">\n { idle }\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return <Text className={ styles.title }>{ idle }</Text>;\n}\n\n/** Card for ImageGen / SearchImage — thumb row, or a plain shell row when nothing came back. */\nexport function ImageAssetTool({ part }: ToolRendererProps) {\n const toolName = getToolName(part);\n const { previewUrl } = useChat();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!IMAGE_TOOL_NAMES.has(toolName)) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = done ? parseOutput(part.output) : undefined;\n const success = (output?.ok === true) ? output : undefined;\n const error = (output?.ok === false) ? output.error : failure.tooltip;\n const images = success?.images ?? [];\n const input = (typeof part.input === 'object' && part.input !== null)\n ? part.input as ToolInput\n : undefined;\n\n const outputAlt = (output && 'alt' in output && typeof output.alt === 'string')\n ? output.alt\n : undefined;\n const outputQuery = (output && 'query' in output && typeof output.query === 'string')\n ? output.query\n : undefined;\n // Prefer short alt (ImageGen); stock search falls back to search query — never the gen prompt.\n const fallback = (\n success?.alt\n || outputAlt\n || input?.alt\n || success?.query\n || outputQuery\n || input?.query\n || ''\n ).trim();\n\n const inProgress = isToolInvocationInProgress(state);\n const failedEmpty = !inProgress && images.length === 0;\n const total = images.length > 0 ? images.length : requestedCount(input);\n const titles = titlesFor(toolName, total);\n const lines = uniqueLines([\n ...captionLines({\n images,\n prompts: input?.prompts,\n fallback,\n }),\n ...images.flatMap(image => (previewSrc(image, previewUrl) ? [] : [image.path])),\n ]);\n const credits = uniqueCredits(images);\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: failureTitle(toolName) }]\n : images.length > 0\n ? images.map((image, index) => {\n const src = previewSrc(image, previewUrl);\n\n return {\n key: src || image.path || `image-${ index }`,\n src,\n alt: image.alt?.trim() || lines[index] || `Image ${ index + 1 }`,\n };\n })\n : Array.from({ length: total }, (_, index) => ({\n key: `placeholder-${ index }`,\n alt: lines[index] || titles.progress,\n }));\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"image-asset-tool\"\n >\n <Box direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <ImageAssetThumbFan\n badge={ live ? 'loader' : failedEmpty ? 'error' : undefined }\n slots={ slots }\n />\n <Box gap=\"xxs\" grow>\n <ImageAssetCardTitle\n failed={ !failedEmpty && Boolean(error) }\n idle={ failedEmpty ? failureTitle(toolName) : titles.idle }\n live={ live }\n progress={ titles.progress }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ lines.length === 1 }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { lines[0] }\n </Text>\n </Show>\n <Show when={ lines.length > 1 }>\n <ul className={ styles.captions }>\n <For each={ lines }>\n {line => (\n <li key={ line }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { line }\n </Text>\n </li>\n )}\n </For>\n </ul>\n </Show>\n <Show when={ credits.length > 0 }>\n <div className={ styles.credits }>\n <For each={ credits }>\n {credit => (\n <CreditCaption\n key={ credit.profileUrl || credit.name }\n credit={ credit }\n />\n )}\n </For>\n </div>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["IMAGE_TOOL_NAMES","parseOutput","output","previewSrc","image","host","absolute","publicPath","titlesFor","toolName","count","failureTitle","CreditCaption","credit","profileHref","unsplashHref","Text","styles","Show","href","_jsx","uniqueLines","values","seen","lines","value","line","captionLines","args","fromImages","fromPrompts","item","requestedCount","input","prompts","uniqueCredits","images","credits","key","FanFace","slot","src","Lightbox","open","Pressable","Image","ImageAssetThumbFan","badge","slots","For","index","isLast","ProgressLoader","AttentionTriangle","ImageAssetCardTitle","failed","idle","live","progress","stalled","statusDetail","TOOL_INTERRUPTED_MESSAGE","Shimmer","FailedToolTitleTooltip","ImageAssetTool","part","getToolName","previewUrl","useChat","useToolProgress","state","failure","getToolFailureRowState","success","error","outputAlt","outputQuery","fallback","failedEmpty","isToolInvocationInProgress","total","titles","_","ToolShellCard","shellStyles","Box","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ImageAssetTool.js","sources":["../../../../src/chat/Tool/image-asset/ImageAssetTool.tsx"],"sourcesContent":["import { AttentionTriangle } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { getToolName } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Image } from '../../../Image';\nimport { Lightbox, type LightboxOpen } from '../../../Lightbox';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { getToolFailureRowState, isToolInvocationInProgress, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport {\n ToolShellCard,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport { FailedToolTitleTooltip } from '../shell/ToolShellStatusIcon';\nimport styles from './ImageAssetTool.module.css';\n\nimport type { CSSProperties } from 'react';\nimport type { ToolRendererProps } from '../types';\n\ntype ImageCredit = {\n name: string;\n profileUrl: string;\n unsplashUrl: string;\n};\n\ntype ImageAsset = {\n url?: string;\n path?: string;\n publicPath?: string;\n previewUrl?: string;\n mediaType?: string;\n alt?: string;\n credit?: ImageCredit;\n};\n\ntype ImageAssetSuccess = {\n ok: true;\n alt?: string;\n query?: string;\n images: ImageAsset[];\n};\n\ntype ImageAssetFailure = {\n ok: false;\n error: string;\n alt?: string;\n query?: string;\n};\n\nconst IMAGE_TOOL_NAMES = new Set(['ImageGen', 'SearchImage', 'ImportAsset']);\n\nfunction parseOutput(output: unknown): ImageAssetSuccess | ImageAssetFailure | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output)) {\n return undefined;\n }\n\n return output as ImageAssetSuccess | ImageAssetFailure;\n}\n\n/** Absolute asset URL, or chat `previewUrl` + site `publicPath` (filesystem saves). */\nfunction previewSrc(image: ImageAsset, host?: string): string | undefined {\n const absolute = image.url?.trim() || image.previewUrl?.trim();\n\n if (absolute) {\n return absolute;\n }\n\n const publicPath = image.publicPath?.trim();\n\n if (!publicPath || !host) {\n return undefined;\n }\n\n try {\n return new URL(publicPath, host).href;\n }\n catch {\n return undefined;\n }\n}\n\nfunction titlesFor(toolName: string, count: number): { idle: string; progress: string } {\n if (toolName === 'SearchImage') {\n if (count > 1) {\n return { progress: `Finding ${ count } photos`, idle: `Found ${ count } photos` };\n }\n\n return { progress: 'Finding photos', idle: 'Found photos' };\n }\n\n if (toolName === 'ImportAsset') {\n return { progress: 'Importing file', idle: 'Imported file' };\n }\n\n if (count > 1) {\n return { progress: `Generating ${ count } images`, idle: `Generated ${ count } images` };\n }\n\n return { progress: 'Generating image', idle: 'Generated image' };\n}\n\nfunction failureTitle(toolName: string): string {\n if (toolName === 'SearchImage') {\n return 'Couldn\\'t find photos';\n }\n\n if (toolName === 'ImportAsset') {\n return 'Couldn\\'t import file';\n }\n\n return 'Couldn\\'t generate the image';\n}\n\nfunction CreditCaption({ credit }: { credit: ImageCredit }) {\n const profileHref = credit.profileUrl.trim();\n const unsplashHref = credit.unsplashUrl.trim() || 'https://unsplash.com';\n\n return (\n <Text variant=\"xs\" className={ styles.credit }>\n Photo by\n { ' ' }\n <Show\n when={ profileHref }\n fallback={ <span>{ credit.name }</span> }\n >\n {href => (\n <a\n className={ styles.creditLink }\n href={ href }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n { credit.name }\n </a>\n )}\n </Show>\n { ' / ' }\n <a\n className={ styles.creditLink }\n href={ unsplashHref }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n Unsplash\n </a>\n </Text>\n );\n}\n\ntype ToolInput = {\n alt?: string;\n query?: string;\n count?: unknown;\n prompts?: Array<{ alt?: string }>;\n};\n\nexport type ImageAssetFanSlot = {\n key: string;\n src?: string;\n alt: string;\n};\n\nfunction uniqueLines(values: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const value of values) {\n const line = value?.trim();\n\n if (!line || seen.has(line)) {\n continue;\n }\n\n seen.add(line);\n lines.push(line);\n }\n\n return lines;\n}\n\n/** Per-image alts, one each. Falls back to a joined ` · ` string by splitting it. */\nfunction captionLines(args: {\n images: ImageAsset[];\n prompts?: Array<{ alt?: string }>;\n fallback: string;\n}): string[] {\n const fromImages = uniqueLines(args.images.map(image => image.alt));\n\n if (fromImages.length > 0) {\n return fromImages;\n }\n\n const fromPrompts = uniqueLines((args.prompts ?? []).map(item => item.alt));\n\n if (fromPrompts.length > 0) {\n return fromPrompts;\n }\n\n if (args.fallback.includes(' · ')) {\n return uniqueLines(args.fallback.split(' · '));\n }\n\n return args.fallback ? [args.fallback] : [];\n}\n\nfunction requestedCount(input: ToolInput | undefined): number {\n const prompts = input?.prompts?.length ?? 0;\n const count = typeof input?.count === 'number' && input.count > 0 ? input.count : 0;\n\n return Math.max(prompts, count, 1);\n}\n\nfunction uniqueCredits(images: readonly ImageAsset[]): ImageCredit[] {\n const seen = new Set<string>();\n const credits: ImageCredit[] = [];\n\n for (const image of images) {\n if (!image.credit) {\n continue;\n }\n\n const key = image.credit.profileUrl || image.credit.name;\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n credits.push(image.credit);\n }\n\n return credits;\n}\n\nfunction FanFace({ slot }: { slot: ImageAssetFanSlot }) {\n if (!slot.src) {\n return null;\n }\n\n const src = slot.src;\n\n return (\n <Lightbox alt={ slot.alt } src={ src }>\n {(open: LightboxOpen) => (\n <Pressable\n aria-label={ `View ${ slot.alt }` }\n className={ styles.fanHit }\n onPress={ open }\n >\n <Image alt=\"\" className={ styles.fanImage } src={ src } />\n </Pressable>\n )}\n </Lightbox>\n );\n}\n\nexport function ImageAssetThumbFan({\n badge,\n slots,\n}: {\n badge?: 'loader' | 'error';\n slots: readonly ImageAssetFanSlot[];\n}) {\n return (\n <div\n className={ styles.fan }\n data-count={ slots.length }\n style={ { '--n': slots.length } as CSSProperties }\n >\n <For each={ slots }>\n {(slot, index, { isLast }) => (\n <div\n key={ slot.key }\n className={ styles.fanCard }\n style={ { '--i': index } as CSSProperties }\n >\n <FanFace slot={ slot } />\n <Show when={ isLast && badge === 'loader' }>\n <ProgressLoader aria-hidden className={ styles.loader } size={ 14 } />\n </Show>\n <Show when={ isLast && badge === 'error' }>\n <AttentionTriangle aria-hidden className={ styles.errorMark } size={ 16 } />\n </Show>\n </div>\n )}\n </For>\n </div>\n );\n}\n\nexport function ImageAssetCardTitle({\n failed,\n idle,\n live,\n progress,\n stalled,\n statusDetail,\n}: {\n failed: boolean;\n idle: string;\n live: boolean;\n progress: string;\n stalled: boolean;\n statusDetail?: string;\n}) {\n if (stalled) {\n return (\n <Text className={ styles.title } color=\"secondary\">\n { TOOL_INTERRUPTED_MESSAGE }\n </Text>\n );\n }\n\n if (live) {\n return (\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { progress }\n </Shimmer>\n );\n }\n\n if (failed) {\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text className={ styles.title } color=\"secondary\" decoration=\"line-through\">\n { idle }\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return <Text className={ styles.title }>{ idle }</Text>;\n}\n\n/** Card for ImageGen / SearchImage — thumb row, or a plain shell row when nothing came back. */\nexport function ImageAssetTool({ part }: ToolRendererProps) {\n const toolName = getToolName(part);\n const { previewUrl } = useChat();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!IMAGE_TOOL_NAMES.has(toolName)) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = done ? parseOutput(part.output) : undefined;\n const success = (output?.ok === true) ? output : undefined;\n const error = (output?.ok === false) ? output.error : failure.tooltip;\n const images = success?.images ?? [];\n const input = (typeof part.input === 'object' && part.input !== null)\n ? part.input as ToolInput\n : undefined;\n\n const outputAlt = (output && 'alt' in output && typeof output.alt === 'string')\n ? output.alt\n : undefined;\n const outputQuery = (output && 'query' in output && typeof output.query === 'string')\n ? output.query\n : undefined;\n // Prefer short alt (ImageGen); stock search falls back to search query — never the gen prompt.\n const fallback = (\n success?.alt\n || outputAlt\n || input?.alt\n || success?.query\n || outputQuery\n || input?.query\n || ''\n ).trim();\n\n const inProgress = isToolInvocationInProgress(state);\n const failedEmpty = !inProgress && images.length === 0;\n const total = images.length > 0 ? images.length : requestedCount(input);\n const titles = titlesFor(toolName, total);\n const lines = uniqueLines([\n ...captionLines({\n images,\n prompts: input?.prompts,\n fallback,\n }),\n ...images.flatMap(image => (previewSrc(image, previewUrl) ? [] : [image.path])),\n ]);\n const credits = uniqueCredits(images);\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: failureTitle(toolName) }]\n : images.length > 0\n ? images.map((image, index) => {\n const src = previewSrc(image, previewUrl);\n\n return {\n key: src || image.path || `image-${ index }`,\n src,\n alt: image.alt?.trim() || lines[index] || `Image ${ index + 1 }`,\n };\n })\n : Array.from({ length: total }, (_, index) => ({\n key: `placeholder-${ index }`,\n alt: lines[index] || titles.progress,\n }));\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"image-asset-tool\"\n >\n <Box direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <ImageAssetThumbFan\n badge={ live ? 'loader' : failedEmpty ? 'error' : undefined }\n slots={ slots }\n />\n <Box gap=\"xxs\" grow>\n <ImageAssetCardTitle\n failed={ !failedEmpty && Boolean(error) }\n idle={ failedEmpty ? failureTitle(toolName) : titles.idle }\n live={ live }\n progress={ titles.progress }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ lines.length === 1 }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { lines[0] }\n </Text>\n </Show>\n <Show when={ lines.length > 1 }>\n <ul className={ styles.captions }>\n <For each={ lines }>\n {line => (\n <li key={ line }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { line }\n </Text>\n </li>\n )}\n </For>\n </ul>\n </Show>\n <Show when={ credits.length > 0 }>\n <div className={ styles.credits }>\n <For each={ credits }>\n {credit => (\n <CreditCaption\n key={ credit.profileUrl || credit.name }\n credit={ credit }\n />\n )}\n </For>\n </div>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["IMAGE_TOOL_NAMES","parseOutput","output","previewSrc","image","host","absolute","publicPath","titlesFor","toolName","count","failureTitle","CreditCaption","credit","profileHref","unsplashHref","Text","styles","Show","href","_jsx","uniqueLines","values","seen","lines","value","line","captionLines","args","fromImages","fromPrompts","item","requestedCount","input","prompts","uniqueCredits","images","credits","key","FanFace","slot","src","Lightbox","open","Pressable","Image","ImageAssetThumbFan","badge","slots","For","index","isLast","ProgressLoader","AttentionTriangle","ImageAssetCardTitle","failed","idle","live","progress","stalled","statusDetail","TOOL_INTERRUPTED_MESSAGE","Shimmer","FailedToolTitleTooltip","ImageAssetTool","part","getToolName","previewUrl","useChat","useToolProgress","state","failure","getToolFailureRowState","success","error","outputAlt","outputQuery","fallback","failedEmpty","isToolInvocationInProgress","total","titles","_","ToolShellCard","shellStyles","Box","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAMA,IAAmB,oBAAI,IAAI,CAAC,YAAY,eAAe,aAAa,CAAC;AAC3E,SAASC,EAAYC,GAAQ;AAC3B,MAAI,SAAOA,KAAW,YAAYA,MAAW,QAAQ,EAAE,QAAQA;AAG/D,WAAOA;AACT;AAGA,SAASC,EAAWC,GAAOC,GAAM;AAC/B,QAAMC,IAAWF,EAAM,KAAK,UAAUA,EAAM,YAAY,KAAA;AACxD,MAAIE;AACF,WAAOA;AAET,QAAMC,IAAaH,EAAM,YAAY,KAAA;AACrC,MAAI,GAACG,KAAc,CAACF;AAGpB,QAAI;AACF,aAAO,IAAI,IAAIE,GAAYF,CAAI,EAAE;AAAA,IACnC,QAAQ;AACN;AAAA,IACF;AACF;AACA,SAASG,EAAUC,GAAUC,GAAO;AAClC,SAAID,MAAa,gBACXC,IAAQ,IACH;AAAA,IACL,UAAU,WAAWA,CAAK;AAAA,IAC1B,MAAM,SAASA,CAAK;AAAA,EAAA,IAGjB;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,IAGND,MAAa,gBACR;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,IAGNC,IAAQ,IACH;AAAA,IACL,UAAU,cAAcA,CAAK;AAAA,IAC7B,MAAM,aAAaA,CAAK;AAAA,EAAA,IAGrB;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAEV;AACA,SAASC,EAAaF,GAAU;AAC9B,SAAIA,MAAa,gBACR,yBAELA,MAAa,gBACR,yBAEF;AACT;AACA,SAASG,EAAc;AAAA,EACrB,QAAAC;AACF,GAAG;AACD,QAAMC,IAAcD,EAAO,WAAW,KAAA,GAChCE,IAAeF,EAAO,YAAY,KAAA,KAAU;AAClD,2BAA0BG,GAAM;AAAA,IAC9B,SAAS;AAAA,IACT,WAAWC,EAAO;AAAA,IAClB,UAAU,CAAC,YAAY,uBAAuBC,GAAM;AAAA,MAClD,MAAMJ;AAAA,MACN,4BAA4B,QAAQ;AAAA,QAClC,UAAUD,EAAO;AAAA,MAAA,CAClB;AAAA,MACD,UAAU,CAAAM,MAAqBC,gBAAAA,EAAK,KAAK;AAAA,QACvC,WAAWH,EAAO;AAAA,QAClB,MAAAE;AAAA,QACA,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAUN,EAAO;AAAA,MAAA,CAClB;AAAA,IAAA,CACF,GAAG,OAAoBO,gBAAAA,EAAK,KAAK;AAAA,MAChC,WAAWH,EAAO;AAAA,MAClB,MAAMF;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,CACX,CAAC;AAAA,EAAA,CACH;AACH;AACA,SAASM,EAAYC,GAAQ;AAC3B,QAAMC,wBAAW,IAAA,GACXC,IAAQ,CAAA;AACd,aAAWC,KAASH,GAAQ;AAC1B,UAAMI,IAAOD,GAAO,KAAA;AACpB,IAAI,CAACC,KAAQH,EAAK,IAAIG,CAAI,MAG1BH,EAAK,IAAIG,CAAI,GACbF,EAAM,KAAKE,CAAI;AAAA,EACjB;AACA,SAAOF;AACT;AAGA,SAASG,EAAaC,GAAM;AAC1B,QAAMC,IAAaR,EAAYO,EAAK,OAAO,IAAI,CAAAxB,MAASA,EAAM,GAAG,CAAC;AAClE,MAAIyB,EAAW,SAAS;AACtB,WAAOA;AAET,QAAMC,IAAcT,GAAaO,EAAK,WAAW,IAAI,IAAI,CAAAG,MAAQA,EAAK,GAAG,CAAC;AAC1E,SAAID,EAAY,SAAS,IAChBA,IAELF,EAAK,SAAS,SAAS,KAAK,IACvBP,EAAYO,EAAK,SAAS,MAAM,KAAK,CAAC,IAExCA,EAAK,WAAW,CAACA,EAAK,QAAQ,IAAI,CAAA;AAC3C;AACA,SAASI,GAAeC,GAAO;AAC7B,QAAMC,IAAUD,GAAO,SAAS,UAAU,GACpCvB,IAAQ,OAAOuB,GAAO,SAAU,YAAYA,EAAM,QAAQ,IAAIA,EAAM,QAAQ;AAClF,SAAO,KAAK,IAAIC,GAASxB,GAAO,CAAC;AACnC;AACA,SAASyB,GAAcC,GAAQ;AAC7B,QAAMb,wBAAW,IAAA,GACXc,IAAU,CAAA;AAChB,aAAWjC,KAASgC,GAAQ;AAC1B,QAAI,CAAChC,EAAM;AACT;AAEF,UAAMkC,IAAMlC,EAAM,OAAO,cAAcA,EAAM,OAAO;AACpD,IAAImB,EAAK,IAAIe,CAAG,MAGhBf,EAAK,IAAIe,CAAG,GACZD,EAAQ,KAAKjC,EAAM,MAAM;AAAA,EAC3B;AACA,SAAOiC;AACT;AACA,SAASE,GAAQ;AAAA,EACf,MAAAC;AACF,GAAG;AACD,MAAI,CAACA,EAAK;AACR,WAAO;AAET,QAAMC,IAAMD,EAAK;AACjB,2BAAyBE,GAAU;AAAA,IACjC,KAAKF,EAAK;AAAA,IACV,KAAAC;AAAA,IACA,UAAU,CAAAE,MAAqBvB,gBAAAA,EAAKwB,GAAW;AAAA,MAC7C,cAAc,QAAQJ,EAAK,GAAG;AAAA,MAC9B,WAAWvB,EAAO;AAAA,MAClB,SAAS0B;AAAA,MACT,4BAA4BE,GAAO;AAAA,QACjC,KAAK;AAAA,QACL,WAAW5B,EAAO;AAAA,QAClB,KAAAwB;AAAA,MAAA,CACD;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;AACO,SAASK,GAAmB;AAAA,EACjC,OAAAC;AAAA,EACA,OAAAC;AACF,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,WAAW/B,EAAO;AAAA,IAClB,cAAc+B,EAAM;AAAA,IACpB,OAAO;AAAA,MACL,OAAOA,EAAM;AAAA,IAAA;AAAA,IAEf,4BAA4BC,GAAK;AAAA,MAC/B,MAAMD;AAAA,MACN,UAAU,CAACR,GAAMU,GAAO;AAAA,QACtB,QAAAC;AAAA,MAAA,wBACuB,OAAO;AAAA,QAC9B,WAAWlC,EAAO;AAAA,QAClB,OAAO;AAAA,UACL,OAAOiC;AAAA,QAAA;AAAA,QAET,UAAU,CAAc9B,gBAAAA,EAAKmB,IAAS;AAAA,UACpC,MAAAC;AAAA,QAAA,CACD,GAAgBpB,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMiC,KAAUJ,MAAU;AAAA,UAC1B,4BAA4BK,GAAgB;AAAA,YAC1C,eAAe;AAAA,YACf,WAAWnC,EAAO;AAAA,YAClB,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,CACF,GAAgBG,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMiC,KAAUJ,MAAU;AAAA,UAC1B,4BAA4BM,GAAmB;AAAA,YAC7C,eAAe;AAAA,YACf,WAAWpC,EAAO;AAAA,YAClB,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,GACDuB,EAAK,GAAG;AAAA,IAAA,CACZ;AAAA,EAAA,CACF;AACH;AACO,SAASc,GAAoB;AAAA,EAClC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AACF,GAAG;AACD,SAAID,sBACuB3C,GAAM;AAAA,IAC7B,WAAWC,EAAO;AAAA,IAClB,OAAO;AAAA,IACP,UAAU4C;AAAA,EAAA,CACX,IAECJ,sBACuBK,GAAS;AAAA,IAChC,IAAI;AAAA,IACJ,WAAW7C,EAAO;AAAA,IAClB,UAAU;AAAA,IACV,UAAUyC;AAAA,EAAA,CACX,IAECH,sBACuBQ,GAAwB;AAAA,IAC/C,cAAAH;AAAA,IACA,4BAA4B5C,GAAM;AAAA,MAChC,WAAWC,EAAO;AAAA,MAClB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAUuC;AAAA,IAAA,CACX;AAAA,EAAA,CACF,sBAEsBxC,GAAM;AAAA,IAC7B,WAAWC,EAAO;AAAA,IAClB,UAAUuC;AAAA,EAAA,CACX;AACH;AAGO,SAASQ,GAAe;AAAA,EAC7B,MAAAC;AACF,GAAG;AACD,QAAMxD,IAAWyD,EAAYD,CAAI,GAC3B;AAAA,IACJ,YAAAE;AAAA,EAAA,IACEC,EAAA,GACE;AAAA,IACJ,MAAAX;AAAA,IACA,SAAAE;AAAA,EAAA,IACEU,EAAgBJ,EAAK,KAAK;AAC9B,MAAI,CAACjE,EAAiB,IAAIS,CAAQ;AAChC,WAAO;AAET,QAAM6D,IAAQL,EAAK,OACbM,IAAUC,EAAuBP,CAAI,GAErC/D,IADOoE,MAAU,qBACDrE,EAAYgE,EAAK,MAAM,IAAI,QAC3CQ,IAAUvE,GAAQ,OAAO,KAAOA,IAAS,QACzCwE,IAAQxE,GAAQ,OAAO,KAAQA,EAAO,QAAQqE,EAAQ,SACtDnC,IAASqC,GAAS,UAAU,CAAA,GAC5BxC,IAAQ,OAAOgC,EAAK,SAAU,YAAYA,EAAK,UAAU,OAAOA,EAAK,QAAQ,QAC7EU,IAAYzE,KAAU,SAASA,KAAU,OAAOA,EAAO,OAAQ,WAAWA,EAAO,MAAM,QACvF0E,IAAc1E,KAAU,WAAWA,KAAU,OAAOA,EAAO,SAAU,WAAWA,EAAO,QAAQ,QAE/F2E,KAAYJ,GAAS,OAAOE,KAAa1C,GAAO,OAAOwC,GAAS,SAASG,KAAe3C,GAAO,SAAS,IAAI,KAAA,GAE5G6C,IAAc,CADDC,EAA2BT,CAAK,KAChBlC,EAAO,WAAW,GAC/C4C,IAAQ5C,EAAO,SAAS,IAAIA,EAAO,SAASJ,GAAeC,CAAK,GAChEgD,IAASzE,EAAUC,GAAUuE,CAAK,GAClCxD,IAAQH,EAAY,CAAC,GAAGM,EAAa;AAAA,IACzC,QAAAS;AAAA,IACA,SAASH,GAAO;AAAA,IAChB,UAAA4C;AAAA,EAAA,CACD,GAAG,GAAGzC,EAAO,QAAQ,OAASjC,EAAWC,GAAO+D,CAAU,IAAI,CAAA,IAAK,CAAC/D,EAAM,IAAI,CAAC,CAAC,CAAC,GAC5EiC,IAAUF,GAAcC,CAAM,GAC9BY,IAAQ8B,IAAc,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL,KAAKnE,EAAaF,CAAQ;AAAA,EAAA,CAC3B,IAAI2B,EAAO,SAAS,IAAIA,EAAO,IAAI,CAAChC,GAAO8C,MAAU;AACpD,UAAMT,IAAMtC,EAAWC,GAAO+D,CAAU;AACxC,WAAO;AAAA,MACL,KAAK1B,KAAOrC,EAAM,QAAQ,SAAS8C,CAAK;AAAA,MACxC,KAAAT;AAAA,MACA,KAAKrC,EAAM,KAAK,UAAUoB,EAAM0B,CAAK,KAAK,SAASA,IAAQ,CAAC;AAAA,IAAA;AAAA,EAEhE,CAAC,IAAI,MAAM,KAAK;AAAA,IACd,QAAQ8B;AAAA,EAAA,GACP,CAACE,GAAGhC,OAAW;AAAA,IAChB,KAAK,eAAeA,CAAK;AAAA,IACzB,KAAK1B,EAAM0B,CAAK,KAAK+B,EAAO;AAAA,EAAA,EAC5B;AACF,2BAAyBE,GAAe;AAAA,IACtC,aAAa1B;AAAA,IACb,WAAW2B,EAAY;AAAA,IACvB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,4BAA6BC,GAAK;AAAA,MAChC,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,CAAcjE,gBAAAA,EAAK0B,IAAoB;AAAA,QAC/C,OAAOW,IAAO,WAAWqB,IAAc,UAAU;AAAA,QACjD,OAAA9B;AAAA,MAAA,CACD,GAAgBsC,gBAAAA,EAAMD,GAAK;AAAA,QAC1B,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAcjE,gBAAAA,EAAKkC,IAAqB;AAAA,UAChD,QAAQ,CAACwB,KAAe,EAAQJ;AAAA,UAChC,MAAMI,IAAcnE,EAAaF,CAAQ,IAAIwE,EAAO;AAAA,UACpD,MAAAxB;AAAA,UACA,UAAUwB,EAAO;AAAA,UACjB,SAAAtB;AAAA,UACA,cAAce;AAAA,QAAA,CACf,GAAgBtD,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMM,EAAM,WAAW;AAAA,UACvB,4BAA4BR,GAAM;AAAA,YAChC,WAAWC,EAAO;AAAA,YAClB,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAUO,EAAM,CAAC;AAAA,UAAA,CAClB;AAAA,QAAA,CACF,GAAgBJ,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMM,EAAM,SAAS;AAAA,UACrB,4BAA4B,MAAM;AAAA,YAChC,WAAWP,EAAO;AAAA,YAClB,4BAA4BgC,GAAK;AAAA,cAC/B,MAAMzB;AAAA,cACN,UAAU,CAAAE,MAAqBN,gBAAAA,EAAK,MAAM;AAAA,gBACxC,4BAA4BJ,GAAM;AAAA,kBAChC,WAAWC,EAAO;AAAA,kBAClB,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,UAAUS;AAAA,gBAAA,CACX;AAAA,cAAA,GACAA,CAAI;AAAA,YAAA,CACR;AAAA,UAAA,CACF;AAAA,QAAA,CACF,GAAgBN,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMmB,EAAQ,SAAS;AAAA,UACvB,4BAA4B,OAAO;AAAA,YACjC,WAAWpB,EAAO;AAAA,YAClB,4BAA4BgC,GAAK;AAAA,cAC/B,MAAMZ;AAAA,cACN,UAAU,CAAAxB,MAAuBO,gBAAAA,EAAKR,GAAe;AAAA,gBACnD,QAAAC;AAAA,cAAA,GACCA,EAAO,cAAcA,EAAO,IAAI;AAAA,YAAA,CACpC;AAAA,UAAA,CACF;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,CACH,CAAC;AAAA,IAAA,CACH;AAAA,EAAA,CACF;AACH;"}
@@ -68,7 +68,7 @@ function M({
68
68
  const h = a(l.headerLabel, s && l.headerLabelTruncate, "whitespace-nowrap");
69
69
  if (m)
70
70
  return /* @__PURE__ */ e(H, {
71
- color: "danger",
71
+ color: "secondary",
72
72
  className: h,
73
73
  children: o ?? P
74
74
  });
@@ -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 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
+ {"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=\"secondary\" 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":";;;;;;;;;;;;;;AAeA,MAAMA,sBAA8C,IAAI,GAClDC,IAAsB;AAG5B,SAASC,GAA0BC,GAAQC,GAAQ;AACjD,MAAI,EAAED,aAAkB;AACtB,WAAO;AAET,QAAME,IAAcF,EAAO,QAAQ,iDAAiD,KAAKA,EAAO,QAAQ,yBAAyB;AACjI,SAAI,CAACE,KAAe,CAACD,EAAO,SAASC,CAAW,IACvC,KAEF,CAACA,EAAY,aAAaJ,CAAmB;AACtD;AAIO,SAASK,GAAU;AAAA,EACxB,aAAAC,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,MAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,QAAMC,IAAUC,EAAQ,OAAO;AAAA,IAC7B,aAAAT;AAAA,EAAA,IACE,CAACA,CAAW,CAAC;AACjB,SAAIA,sBACuBP,GAAkB;AAAA,IACzC,OAAOe;AAAA,IACP,4BAA4BE,GAAa;AAAA,MACvC,WAAWC,EAAGC,EAAO,MAAMP,CAAS;AAAA,MACpC,aAAa;AAAA,MACb,aAAAJ;AAAA,MACA,MAAAC;AAAA,MACA,cAAAC;AAAA,MACA,YAAAC;AAAA,MACA,GAAGG;AAAA,MACH,UAAAD;AAAA,IAAA,CACD;AAAA,EAAA,CACF,sBAEsBb,GAAkB;AAAA,IACzC,OAAOe;AAAA,IACP,4BAA4B,OAAO;AAAA,MACjC,WAAWG,EAAGC,EAAO,MAAMP,CAAS;AAAA,MACpC,aAAa;AAAA,MACb,GAAGE;AAAA,MACH,UAAAD;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AACA,SAASO,EAAqB;AAAA,EAC5B,OAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AACF,GAAG;AACD,QAAMC,IAAiBZ,EAAGC,EAAO,aAAaS,KAAYT,EAAO,qBAAqB,mBAAmB;AACzG,MAAIM;AACF,6BAAyBM,GAAM;AAAA,MAC7B,OAAO;AAAA,MACP,WAAWD;AAAA,MACX,UAAUP,KAAoBS;AAAA,IAAA,CAC/B;AAEH,QAAMC,IAAQZ,KAASC;AACvB,MAAI,CAACW;AACH,WAAO;AAET,QAAMC,IAAgBZ,KAAmBW;AACzC,MAAIT,KAAQE;AACV,6BAAyBS,GAAS;AAAA,MAChC,IAAI;AAAA,MACJ,WAAWL;AAAA,MACX,UAAU;AAAA,MACV,UAAUI;AAAA,IAAA,CACX;AAEH,MAAIP,KAAU,CAACH,GAAM;AACnB,UAAMY,sBAA2BL,GAAM;AAAA,MACrC,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,WAAWD;AAAA,MACX,cAAc,GAAGG,CAAK;AAAA,MACtB,UAAUA;AAAA,IAAA,CACX;AACD,WAAKJ,GAAc,2BAGMQ,GAAwB;AAAA,MAC/C,cAAAR;AAAA,MACA,UAAUO;AAAA,IAAA,CACX,IALQA;AAAA,EAMX;AACA,2BAAyBL,GAAM;AAAA,IAC7B,WAAWD;AAAA,IACX,UAAUN,IAAOU,IAAgBD;AAAA,EAAA,CAClC;AACH;AACA,SAASK,GAAsB;AAAA,EAC7B,OAAAC;AAAA,EACA,OAAAlB;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,MAAAiB;AAAA,EACA,aAAAC;AAAA,EACA,UAAA5B;AAAA,EACA,cAAAgB;AAAA,EACA,QAAAF;AAAA,EACA,eAAAe;AAAA,EACA,WAAA9B;AAAA,EACA,UAAA+B;AAAA,EACA,SAAAjB;AAAA,EACA,SAAAkB;AAAA,EACA,YAAAC;AAAA,EACA,KAAAC;AACF,GAAG;AACD,QAAMC,IAAUC,EAAIC,CAA0B,GACxCC,IAAWH,GAAS,WAAW,IAC/BI,IAAYP,KAAW,QAAQC,MAAe,IAC9C;AAAA,IACJ,MAAArB;AAAA,IACA,SAAAC;AAAA,EAAA,IACEkB,GACES,IAAS3B,IAAUI,GAAc,KAAA,KAAUG,IAA2BH,GACtEwB,IAAc5B,IAAU,iBAAiBc,GACzCe,IAAc3B,KAAU4B,EAAmBF,GAAaD,CAAM,GAC9DI,sBAAyBC,IAAW;AAAA,IACxC,UAAU,CAAcC,gBAAAA,EAAKC,GAAqB;AAAA,MAChD,MAAAnB;AAAA,MACA,OAAOa;AAAA,MACP,cAAcD;AAAA,MACd,WAAWjC,EAAO;AAAA,IAAA,CACnB,GAAGsB,GAA0BiB,gBAAAA,EAAKtC,GAAsB;AAAA,MACvD,OAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,MAAAC;AAAA,MACA,SAAAC;AAAA,MACA,SAASC,MAAY;AAAA,MACrB,QAAQ4B;AAAA,MACR,UAAUZ;AAAA,MACV,cAAcU;AAAA,IAAA,CACf,GAAGvC,GAAuB6C,gBAAAA,EAAKE,GAAM;AAAA,MACpC,MAAMT;AAAA,MACN,4BAA4BU,GAAa;AAAA,QACvC,WAAW3C,EAAG,WAAW,QAAQC,EAAO,WAAW;AAAA,QACnD,iBAAiB4B,IAAUG,IAAW;AAAA,QACtC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACD,SAAIC,sBACuBW,GAAW;AAAA,IAClC,KAAAhB;AAAA,IACA,GAAIF,IAAU;AAAA,MACZ,SAAAA;AAAA,IAAA,IACE,CAAA;AAAA,IACJ,4BAA4B,OAAO;AAAA,MACjC,MAAM;AAAA,MACN,WAAW1B,EAAGC,EAAO,WAAWA,EAAO,eAAeP,CAAS;AAAA,MAC/D,aAAaY;AAAA,MACb,iBAAiBuB,IAAUG,IAAW;AAAA,MACtC,UAAUM;AAAA,IAAA,CACX;AAAA,EAAA,CACF,sBAEsB,OAAO;AAAA,IAC9B,WAAWtC,EAAGC,EAAO,WAAWA,EAAO,sBAAsBP,CAAS;AAAA,IACtE,aAAaY;AAAA,IACb,UAAUgC;AAAA,EAAA,CACX;AACH;AACA,SAASO,GAA2B;AAAA,EAClC,OAAAxB;AAAA,EACA,OAAAlB;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,MAAAiB;AAAA,EACA,aAAAC;AAAA,EACA,UAAA5B;AAAA,EACA,cAAAgB;AAAA,EACA,QAAAF;AAAA,EACA,eAAAe;AAAA,EACA,WAAA9B;AAAA,EACA,UAAA+B;AAAA,EACA,SAAAjB;AACF,GAAG;AACD,QAAM;AAAA,IACJ,OAAOsC;AAAA,IACP,cAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,IACEC,EAAA,GACEC,IAAYC,EAAO,IAAI,GACvB;AAAA,IACJ,MAAA7C;AAAA,IACA,SAAAC;AAAA,EAAA,IACEkB,GACES,IAAS3B,IAAUI,GAAc,KAAA,KAAUG,IAA2BH,GACtEwB,IAAc5B,IAAU,iBAAiBc,GACzCe,IAAc3B,KAAU4B,EAAmBF,GAAaD,CAAM,GAC9DkB,IAAiBL,EAAa,SAG9BM,IAAYC,EAAWP,GAAc;AAAA,IACzC,CAAChE,CAAmB,GAAG;AAAA,IACvB,WAAWiB,EAAGC,EAAO,WAAWA,EAAO,eAAeP,CAAS;AAAA;AAAA,IAE/D,KAAK6D,EAAUP,GAAYE,CAAS;AAAA,IACpC,aAAa5C;AAAA,IACb,iBAAiBwC,EAAiB;AAAA,IAClC,SAAS,CAAAU,MAAS;AAChB,YAAMtE,IAASgE,EAAU;AACzB,MAAIhE,KAAUF,GAA0BwE,EAAM,QAAQtE,CAAM,KAG5DkE,IAAiBI,CAAK;AAAA,IACxB;AAAA,EAAA,CACD;AACD,2BAAyBC,GAAoB;AAAA,IAC3C,SAAS;AAAA,IACT,4BAA6B,OAAO;AAAA,MAClC,GAAGJ;AAAA,MACH,UAAU,CAAcb,gBAAAA,EAAKC,GAAqB;AAAA,QAChD,MAAAnB;AAAA,QACA,OAAOa;AAAA,QACP,cAAcD;AAAA,QACd,WAAWjC,EAAO;AAAA,MAAA,CACnB,GAAGsB,GAA0BiB,gBAAAA,EAAKtC,GAAsB;AAAA,QACvD,OAAAC;AAAA,QACA,iBAAAC;AAAA,QACA,kBAAAC;AAAA,QACA,MAAAC;AAAA,QACA,SAAAC;AAAA,QACA,SAASC,MAAY;AAAA,QACrB,QAAQ4B;AAAA,QACR,UAAUZ;AAAA,QACV,cAAcU;AAAA,MAAA,CACf,GAAGvC,GAAuB6C,gBAAAA,EAAKG,GAAa;AAAA,QAC3C,WAAW3C,EAAG,WAAW,QAAQC,EAAO,WAAW;AAAA,QACnD,iBAAiB6C,EAAiB;AAAA,QAClC,eAAe;AAAA,MAAA,CAChB,CAAC;AAAA,IAAA,CACH;AAAA,EAAA,CACF;AACH;AACO,SAASY,GAAgB9D,GAAO;AACrC,QAAM+D,IAAQ7B,EAAIhD,CAAgB,GAC5B2C,IAAWmC,EAAgBhE,EAAM,OAAOA,EAAM,YAAY;AAChE,SAAI+D,GAAO,gCACgBd,IAA4B;AAAA,IACnD,GAAGjD;AAAA,IACH,UAAA6B;AAAA,EAAA,CACD,sBAEsBL,IAAuB;AAAA,IAC9C,GAAGxB;AAAA,IACH,UAAA6B;AAAA,EAAA,CACD;AACH;AACA,SAASoC,GAAuB;AAAA,EAC9B,WAAAnE;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,WAAWI,EAAGC,EAAO,SAASP,CAAS;AAAA,IACvC,aAAa;AAAA,IACb,GAAGE;AAAA,IACH,UAAAD;AAAA,EAAA,CACD;AACH;AACA,SAASmE,GAA4B;AAAA,EACnC,WAAApE;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,2BAAyBmE,GAA0B;AAAA,IACjD,WAAW9D,EAAO;AAAA,IAClB,4BAA4B,OAAO;AAAA,MACjC,WAAWD,EAAGC,EAAO,SAASP,CAAS;AAAA,MACvC,aAAa;AAAA,MACb,GAAGE;AAAA,MACH,UAAAD;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AACO,SAASqE,GAAiB;AAAA,EAC/B,WAAAtE;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AAED,SADckC,EAAIhD,CAAgB,GACvB,gCACgBgF,IAA6B;AAAA,IACpD,WAAApE;AAAA,IACA,GAAGE;AAAA,IACH,UAAAD;AAAA,EAAA,CACD,sBAEsBkE,IAAwB;AAAA,IAC/C,WAAAnE;AAAA,IACA,GAAGE;AAAA,IACH,UAAAD;AAAA,EAAA,CACD;AACH;AACO,SAASsE,GAAgB;AAAA,EAC9B,WAAAvE;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,WAAWI,EAAGC,EAAO,QAAQP,CAAS;AAAA,IACtC,aAAa;AAAA,IACb,GAAGE;AAAA,IACH,UAAAD;AAAA,EAAA,CACD;AACH;"}
@@ -7,7 +7,7 @@ import { Shimmer as j } from "../../../Shimmer/Shimmer.js";
7
7
  import { TOOL_INTERRUPTED_MESSAGE as b } from "../helpers.js";
8
8
  import { useToolProgress as w } from "./toolProgress.js";
9
9
  import a from "./ToolShellCard.module.css.js";
10
- import { isFailedToolStatus as v, ToolShellStatusIcon as g, FailedToolTitleTooltip as D } from "./ToolShellStatusIcon.js";
10
+ import { isFailedToolStatus as v, ToolShellStatusIcon as y, FailedToolTitleTooltip as D } from "./ToolShellStatusIcon.js";
11
11
  import { jsx as o, jsxs as S } from "react/jsx-runtime";
12
12
  const p = /* @__PURE__ */ I(null);
13
13
  function W({
@@ -45,10 +45,10 @@ function W({
45
45
  })
46
46
  });
47
47
  }
48
- function y(e, t, r, n, i) {
48
+ function g(e, t, r, n, i) {
49
49
  if (r)
50
50
  return e != null && typeof e != "string" && typeof e != "number" ? e : /* @__PURE__ */ o(C, {
51
- color: "danger",
51
+ color: "secondary",
52
52
  className: "truncate",
53
53
  children: typeof e == "string" || typeof e == "number" ? String(e) : b
54
54
  });
@@ -96,12 +96,12 @@ function O({
96
96
  "aria-busy": u,
97
97
  children: [/* @__PURE__ */ S("div", {
98
98
  className: a.headerMain,
99
- children: [/* @__PURE__ */ o(g, {
99
+ children: [/* @__PURE__ */ o(y, {
100
100
  icon: r,
101
101
  state: h,
102
102
  statusDetail: m,
103
103
  className: a.headerIcon
104
- }), y(t, u, l, f, m)]
104
+ }), g(t, u, l, f, m)]
105
105
  }), d]
106
106
  });
107
107
  }
@@ -131,12 +131,12 @@ function P({
131
131
  ...u,
132
132
  children: [/* @__PURE__ */ S("div", {
133
133
  className: a.headerMain,
134
- children: [/* @__PURE__ */ o(g, {
134
+ children: [/* @__PURE__ */ o(y, {
135
135
  icon: r,
136
136
  state: T,
137
137
  statusDetail: f,
138
138
  className: a.headerIcon
139
- }), y(t, m, h, x, f)]
139
+ }), g(t, m, h, x, f)]
140
140
  }), /* @__PURE__ */ o(E, {
141
141
  className: s("chevron", "next", a.toolChevron),
142
142
  "aria-expanded": l.isExpanded,
@@ -1 +1 @@
1
- {"version":3,"file":"ToolShellCard.js","sources":["../../../../src/chat/Tool/shell/ToolShellCard.tsx"],"sourcesContent":["import { Text } from '@reforma/components/Text';\nimport { ChevronDown } from '@reforma/icons/8';\nimport { cn } from '@reforma/lib';\nimport { createContext, HTMLAttributes, use, useMemo, type ReactNode } from 'react';\n\nimport {\n Collapsible,\n CollapsibleMotionContent,\n CollapsibleTrigger,\n useCollapsible,\n} from '../../../Collapsible';\nimport { Shimmer } from '../../../Shimmer';\nimport { TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { useToolProgress, type ToolProgressState } from './toolProgress';\nimport styles from './ToolShellCard.module.css';\nimport { FailedToolTitleTooltip, isFailedToolStatus, ToolShellStatusIcon } from './ToolShellStatusIcon';\n\ntype ToolShellCardContextValue = {\n collapsible: boolean;\n};\n\nconst ToolShellCardContext = createContext<ToolShellCardContextValue | null>(null);\n\n/** Boxed tool card chrome. Set `collapsible` on the root to enable disclosure. */\nexport type ToolShellCardProps = HTMLAttributes<HTMLDivElement> & {\n /** When true, root is a collapsible and the header is the trigger. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n isDisabled?: boolean;\n};\n\nexport function ToolShellCard({\n collapsible = true,\n defaultOpen = false,\n open,\n onOpenChange,\n isDisabled,\n className,\n children,\n ...props\n}: ToolShellCardProps) {\n const context = useMemo(() => ({ collapsible }), [collapsible]);\n\n if (collapsible) {\n return (\n <ToolShellCardContext value={ context }>\n <Collapsible\n className={ cn(styles.root, className) }\n data-slot=\"tool-card\"\n defaultOpen={ defaultOpen }\n open={ open }\n onOpenChange={ onOpenChange }\n isDisabled={ isDisabled }\n { ...props }\n >\n {children}\n </Collapsible>\n </ToolShellCardContext>\n );\n }\n\n return (\n <ToolShellCardContext value={ context }>\n <div\n className={ cn(styles.root, className) }\n data-slot=\"tool-card\"\n { ...props }\n >\n {children}\n </div>\n </ToolShellCardContext>\n );\n}\n\nexport interface ToolShellCardHeaderProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'title' | 'type'> {\n state: string;\n title?: ReactNode;\n /** Optional leading icon before the title (e.g. proxied MCP tools). */\n icon?: ReactNode;\n /** Error or denial detail; shown in a tooltip on the struck title. */\n statusDetail?: string | undefined;\n /** Tool is waiting on the user — do not treat idle non-terminal as stalled. */\n awaitingUser?: boolean;\n}\n\nfunction toolShellCardHeaderLabel(\n title: ReactNode | undefined,\n live: boolean,\n stalled: boolean,\n failed: boolean,\n statusDetail?: string\n): ReactNode {\n if (stalled) {\n if (title != null && typeof title !== 'string' && typeof title !== 'number') {\n return title;\n }\n\n return (\n <Text color=\"danger\" className=\"truncate\">\n { (typeof title === 'string' || typeof title === 'number')\n ? String(title)\n : TOOL_INTERRUPTED_MESSAGE}\n </Text>\n );\n }\n\n if (title != null && typeof title !== 'string' && typeof title !== 'number') {\n return title;\n }\n\n const canShimmerLabel = typeof title === 'string' || typeof title === 'number';\n\n if (live && canShimmerLabel) {\n return (\n <Shimmer duration={ 1 } className=\"truncate\">\n {String(title)}\n </Shimmer>\n );\n }\n\n if (failed) {\n const label = title == null ? '' : String(title);\n\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text\n decoration=\"line-through\"\n color=\"secondary\"\n className=\"truncate\"\n aria-label={ `${ label } failed` }\n >\n {title}\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return (\n <Text className=\"truncate\">{title}</Text>\n );\n}\n\ntype ToolShellCardHeaderViewProps = ToolShellCardHeaderProps & {\n progress: ToolProgressState;\n};\n\nfunction ToolShellCardHeaderStatic({\n state,\n title,\n icon,\n statusDetail,\n className,\n progress,\n children,\n}: ToolShellCardHeaderViewProps) {\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 = isFailedToolStatus(statusState, detail);\n\n return (\n <div\n className={ cn(styles.headerNonInteractive, className) }\n aria-busy={ live }\n >\n <div className={ styles.headerMain }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {toolShellCardHeaderLabel(title, live, stalled, titleFailed, detail)}\n </div>\n {children}\n </div>\n );\n}\n\nfunction ToolShellCardHeaderCollapsible({\n state,\n title,\n icon,\n statusDetail,\n className,\n progress,\n children: _children,\n ...props\n}: ToolShellCardHeaderViewProps) {\n const { state: collapsibleState } = useCollapsible();\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 = isFailedToolStatus(statusState, detail);\n\n return (\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className={ cn(styles.header, className) }\n aria-busy={ live }\n aria-expanded={ collapsibleState.isExpanded }\n { ...props }\n >\n <div className={ styles.headerMain }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {toolShellCardHeaderLabel(title, live, stalled, titleFailed, detail)}\n </div>\n\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ collapsibleState.isExpanded }\n aria-hidden\n />\n </button>\n </CollapsibleTrigger>\n );\n}\n\nexport function ToolShellCardHeader(props: ToolShellCardHeaderProps) {\n const shell = use(ToolShellCardContext);\n const progress = useToolProgress(props.state, props.awaitingUser);\n\n if (shell?.collapsible) {\n return <ToolShellCardHeaderCollapsible { ...props } progress={ progress } />;\n }\n\n return <ToolShellCardHeaderStatic { ...props } progress={ progress } />;\n}\n\nexport type ToolShellCardContentProps = HTMLAttributes<HTMLDivElement>;\n\nfunction ToolShellCardContentStatic({ className, children, ...props }: ToolShellCardContentProps) {\n return (\n <div className={ cn(styles.content, className) } data-slot=\"tool-card-content\" { ...props }>\n {children}\n </div>\n );\n}\n\nfunction ToolShellCardContentCollapsible({ className, children, ...props }: ToolShellCardContentProps) {\n return (\n <CollapsibleMotionContent>\n <div className={ cn(styles.content, className) } data-slot=\"tool-card-content\" { ...props }>\n {children}\n </div>\n </CollapsibleMotionContent>\n );\n}\n\nexport function ToolShellCardContent({ className, children, ...props }: ToolShellCardContentProps) {\n const shell = use(ToolShellCardContext);\n\n if (shell?.collapsible) {\n return (\n <ToolShellCardContentCollapsible className={ className } { ...props }>\n {children}\n </ToolShellCardContentCollapsible>\n );\n }\n\n return (\n <ToolShellCardContentStatic className={ className } { ...props }>\n {children}\n </ToolShellCardContentStatic>\n );\n}\n\nexport type ToolShellCardFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/** Footer strip for tool errors and approval flows. */\nexport function ToolShellCardFooter({ className, children, ...props }: ToolShellCardFooterProps) {\n return (\n <div className={ cn(styles.footer, className) } data-slot=\"tool-card-footer\" { ...props }>\n {children}\n </div>\n );\n}\n"],"names":["ToolShellCardContext","ToolShellCard","collapsible","defaultOpen","open","onOpenChange","isDisabled","className","children","props","context","useMemo","Collapsible","cn","styles","toolShellCardHeaderLabel","title","live","stalled","failed","statusDetail","Text","TOOL_INTERRUPTED_MESSAGE","Shimmer","label","FailedToolTitleTooltip","ToolShellCardHeaderStatic","state","icon","progress","detail","statusState","titleFailed","isFailedToolStatus","_jsxs","_jsx","ToolShellStatusIcon","ToolShellCardHeaderCollapsible","_children","collapsibleState","useCollapsible","CollapsibleTrigger","ChevronDown","ToolShellCardHeader","shell","use","useToolProgress","ToolShellCardContentStatic","ToolShellCardContentCollapsible","CollapsibleMotionContent","ToolShellCardContent","ToolShellCardFooter"],"mappings":"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"}
1
+ {"version":3,"file":"ToolShellCard.js","sources":["../../../../src/chat/Tool/shell/ToolShellCard.tsx"],"sourcesContent":["import { Text } from '@reforma/components/Text';\nimport { ChevronDown } from '@reforma/icons/8';\nimport { cn } from '@reforma/lib';\nimport { createContext, HTMLAttributes, use, useMemo, type ReactNode } from 'react';\n\nimport {\n Collapsible,\n CollapsibleMotionContent,\n CollapsibleTrigger,\n useCollapsible,\n} from '../../../Collapsible';\nimport { Shimmer } from '../../../Shimmer';\nimport { TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { useToolProgress, type ToolProgressState } from './toolProgress';\nimport styles from './ToolShellCard.module.css';\nimport { FailedToolTitleTooltip, isFailedToolStatus, ToolShellStatusIcon } from './ToolShellStatusIcon';\n\ntype ToolShellCardContextValue = {\n collapsible: boolean;\n};\n\nconst ToolShellCardContext = createContext<ToolShellCardContextValue | null>(null);\n\n/** Boxed tool card chrome. Set `collapsible` on the root to enable disclosure. */\nexport type ToolShellCardProps = HTMLAttributes<HTMLDivElement> & {\n /** When true, root is a collapsible and the header is the trigger. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n isDisabled?: boolean;\n};\n\nexport function ToolShellCard({\n collapsible = true,\n defaultOpen = false,\n open,\n onOpenChange,\n isDisabled,\n className,\n children,\n ...props\n}: ToolShellCardProps) {\n const context = useMemo(() => ({ collapsible }), [collapsible]);\n\n if (collapsible) {\n return (\n <ToolShellCardContext value={ context }>\n <Collapsible\n className={ cn(styles.root, className) }\n data-slot=\"tool-card\"\n defaultOpen={ defaultOpen }\n open={ open }\n onOpenChange={ onOpenChange }\n isDisabled={ isDisabled }\n { ...props }\n >\n {children}\n </Collapsible>\n </ToolShellCardContext>\n );\n }\n\n return (\n <ToolShellCardContext value={ context }>\n <div\n className={ cn(styles.root, className) }\n data-slot=\"tool-card\"\n { ...props }\n >\n {children}\n </div>\n </ToolShellCardContext>\n );\n}\n\nexport interface ToolShellCardHeaderProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'title' | 'type'> {\n state: string;\n title?: ReactNode;\n /** Optional leading icon before the title (e.g. proxied MCP tools). */\n icon?: ReactNode;\n /** Error or denial detail; shown in a tooltip on the struck title. */\n statusDetail?: string | undefined;\n /** Tool is waiting on the user — do not treat idle non-terminal as stalled. */\n awaitingUser?: boolean;\n}\n\nfunction toolShellCardHeaderLabel(\n title: ReactNode | undefined,\n live: boolean,\n stalled: boolean,\n failed: boolean,\n statusDetail?: string\n): ReactNode {\n if (stalled) {\n if (title != null && typeof title !== 'string' && typeof title !== 'number') {\n return title;\n }\n\n return (\n <Text color=\"secondary\" className=\"truncate\">\n { (typeof title === 'string' || typeof title === 'number')\n ? String(title)\n : TOOL_INTERRUPTED_MESSAGE}\n </Text>\n );\n }\n\n if (title != null && typeof title !== 'string' && typeof title !== 'number') {\n return title;\n }\n\n const canShimmerLabel = typeof title === 'string' || typeof title === 'number';\n\n if (live && canShimmerLabel) {\n return (\n <Shimmer duration={ 1 } className=\"truncate\">\n {String(title)}\n </Shimmer>\n );\n }\n\n if (failed) {\n const label = title == null ? '' : String(title);\n\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text\n decoration=\"line-through\"\n color=\"secondary\"\n className=\"truncate\"\n aria-label={ `${ label } failed` }\n >\n {title}\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return (\n <Text className=\"truncate\">{title}</Text>\n );\n}\n\ntype ToolShellCardHeaderViewProps = ToolShellCardHeaderProps & {\n progress: ToolProgressState;\n};\n\nfunction ToolShellCardHeaderStatic({\n state,\n title,\n icon,\n statusDetail,\n className,\n progress,\n children,\n}: ToolShellCardHeaderViewProps) {\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 = isFailedToolStatus(statusState, detail);\n\n return (\n <div\n className={ cn(styles.headerNonInteractive, className) }\n aria-busy={ live }\n >\n <div className={ styles.headerMain }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {toolShellCardHeaderLabel(title, live, stalled, titleFailed, detail)}\n </div>\n {children}\n </div>\n );\n}\n\nfunction ToolShellCardHeaderCollapsible({\n state,\n title,\n icon,\n statusDetail,\n className,\n progress,\n children: _children,\n ...props\n}: ToolShellCardHeaderViewProps) {\n const { state: collapsibleState } = useCollapsible();\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 = isFailedToolStatus(statusState, detail);\n\n return (\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className={ cn(styles.header, className) }\n aria-busy={ live }\n aria-expanded={ collapsibleState.isExpanded }\n { ...props }\n >\n <div className={ styles.headerMain }>\n <ToolShellStatusIcon\n icon={ icon }\n state={ statusState }\n statusDetail={ detail }\n className={ styles.headerIcon }\n />\n {toolShellCardHeaderLabel(title, live, stalled, titleFailed, detail)}\n </div>\n\n <ChevronDown\n className={ cn('chevron', 'next', styles.toolChevron) }\n aria-expanded={ collapsibleState.isExpanded }\n aria-hidden\n />\n </button>\n </CollapsibleTrigger>\n );\n}\n\nexport function ToolShellCardHeader(props: ToolShellCardHeaderProps) {\n const shell = use(ToolShellCardContext);\n const progress = useToolProgress(props.state, props.awaitingUser);\n\n if (shell?.collapsible) {\n return <ToolShellCardHeaderCollapsible { ...props } progress={ progress } />;\n }\n\n return <ToolShellCardHeaderStatic { ...props } progress={ progress } />;\n}\n\nexport type ToolShellCardContentProps = HTMLAttributes<HTMLDivElement>;\n\nfunction ToolShellCardContentStatic({ className, children, ...props }: ToolShellCardContentProps) {\n return (\n <div className={ cn(styles.content, className) } data-slot=\"tool-card-content\" { ...props }>\n {children}\n </div>\n );\n}\n\nfunction ToolShellCardContentCollapsible({ className, children, ...props }: ToolShellCardContentProps) {\n return (\n <CollapsibleMotionContent>\n <div className={ cn(styles.content, className) } data-slot=\"tool-card-content\" { ...props }>\n {children}\n </div>\n </CollapsibleMotionContent>\n );\n}\n\nexport function ToolShellCardContent({ className, children, ...props }: ToolShellCardContentProps) {\n const shell = use(ToolShellCardContext);\n\n if (shell?.collapsible) {\n return (\n <ToolShellCardContentCollapsible className={ className } { ...props }>\n {children}\n </ToolShellCardContentCollapsible>\n );\n }\n\n return (\n <ToolShellCardContentStatic className={ className } { ...props }>\n {children}\n </ToolShellCardContentStatic>\n );\n}\n\nexport type ToolShellCardFooterProps = HTMLAttributes<HTMLDivElement>;\n\n/** Footer strip for tool errors and approval flows. */\nexport function ToolShellCardFooter({ className, children, ...props }: ToolShellCardFooterProps) {\n return (\n <div className={ cn(styles.footer, className) } data-slot=\"tool-card-footer\" { ...props }>\n {children}\n </div>\n );\n}\n"],"names":["ToolShellCardContext","ToolShellCard","collapsible","defaultOpen","open","onOpenChange","isDisabled","className","children","props","context","useMemo","Collapsible","cn","styles","toolShellCardHeaderLabel","title","live","stalled","failed","statusDetail","Text","TOOL_INTERRUPTED_MESSAGE","Shimmer","label","FailedToolTitleTooltip","ToolShellCardHeaderStatic","state","icon","progress","detail","statusState","titleFailed","isFailedToolStatus","_jsxs","_jsx","ToolShellStatusIcon","ToolShellCardHeaderCollapsible","_children","collapsibleState","useCollapsible","CollapsibleTrigger","ChevronDown","ToolShellCardHeader","shell","use","useToolProgress","ToolShellCardContentStatic","ToolShellCardContentCollapsible","CollapsibleMotionContent","ToolShellCardContent","ToolShellCardFooter"],"mappings":"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"}
@@ -5,6 +5,64 @@
5
5
  * and @Now. Bad arguments, or a throw, make a call evaluate to null.
6
6
  */
7
7
  export declare const functions: (import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
8
+ list: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>;
9
+ item: import("zod/v4").ZodAny;
10
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodBoolean> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
11
+ list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
12
+ item: import("zod/v4").ZodAny;
13
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
14
+ list: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>;
15
+ start: import("zod/v4").ZodNumber;
16
+ end: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
17
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
18
+ list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
19
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodAny>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
20
+ start: import("zod/v4").ZodNumber;
21
+ end: import("zod/v4").ZodNumber;
22
+ step: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
23
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodNumber>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
24
+ list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
25
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodAny> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
26
+ list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
27
+ size: import("zod/v4").ZodNumber;
28
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodArray<import("zod/v4").ZodAny>>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
29
+ base: import("zod/v4").ZodNumber;
30
+ exponent: import("zod/v4").ZodNumber;
31
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
32
+ number: import("zod/v4").ZodNumber;
33
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
34
+ min: import("zod/v4").ZodNumber;
35
+ max: import("zod/v4").ZodNumber;
36
+ integer: import("zod/v4").ZodOptional<import("zod/v4").ZodBoolean>;
37
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
38
+ part: import("zod/v4").ZodNumber;
39
+ total: import("zod/v4").ZodNumber;
40
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
41
+ a: import("zod/v4").ZodNumber;
42
+ b: import("zod/v4").ZodNumber;
43
+ t: import("zod/v4").ZodNumber;
44
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
45
+ total: import("zod/v4").ZodNumber;
46
+ weights: import("zod/v4").ZodArray<import("zod/v4").ZodNumber>;
47
+ decimals: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
48
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodNumber>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
49
+ principal: import("zod/v4").ZodNumber;
50
+ rate: import("zod/v4").ZodNumber;
51
+ periods: import("zod/v4").ZodNumber;
52
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
53
+ value: import("zod/v4").ZodNumber;
54
+ from: import("zod/v4").ZodString;
55
+ to: import("zod/v4").ZodString;
56
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
57
+ text: import("zod/v4").ZodString;
58
+ sep: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
59
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodString>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
60
+ value: import("zod/v4").ZodOptional<import("zod/v4").ZodAny>;
61
+ fallback: import("zod/v4").ZodAny;
62
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodAny> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>, import("zod/v4").ZodString> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
63
+ from: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber]>;
64
+ to: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber]>;
65
+ }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
8
66
  rows: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
9
67
  key: import("zod/v4").ZodString;
10
68
  field: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
@@ -74,63 +132,5 @@ export declare const functions: (import("@openuidev/lang-core").DefinedFunction<
74
132
  mean: import("zod/v4").ZodNumber;
75
133
  median: import("zod/v4").ZodNumber;
76
134
  stdev: import("zod/v4").ZodNumber;
77
- }, import("zod/v4/core").$strip>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
78
- list: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>;
79
- item: import("zod/v4").ZodAny;
80
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodBoolean> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
81
- list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
82
- item: import("zod/v4").ZodAny;
83
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
84
- list: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>;
85
- start: import("zod/v4").ZodNumber;
86
- end: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
87
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodArray<import("zod/v4").ZodAny>, import("zod/v4").ZodString]>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
88
- list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
89
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodAny>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
90
- start: import("zod/v4").ZodNumber;
91
- end: import("zod/v4").ZodNumber;
92
- step: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
93
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodNumber>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
94
- list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
95
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodAny> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
96
- list: import("zod/v4").ZodArray<import("zod/v4").ZodAny>;
97
- size: import("zod/v4").ZodNumber;
98
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodArray<import("zod/v4").ZodAny>>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
99
- base: import("zod/v4").ZodNumber;
100
- exponent: import("zod/v4").ZodNumber;
101
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
102
- number: import("zod/v4").ZodNumber;
103
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
104
- min: import("zod/v4").ZodNumber;
105
- max: import("zod/v4").ZodNumber;
106
- integer: import("zod/v4").ZodOptional<import("zod/v4").ZodBoolean>;
107
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
108
- part: import("zod/v4").ZodNumber;
109
- total: import("zod/v4").ZodNumber;
110
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
111
- a: import("zod/v4").ZodNumber;
112
- b: import("zod/v4").ZodNumber;
113
- t: import("zod/v4").ZodNumber;
114
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
115
- total: import("zod/v4").ZodNumber;
116
- weights: import("zod/v4").ZodArray<import("zod/v4").ZodNumber>;
117
- decimals: import("zod/v4").ZodOptional<import("zod/v4").ZodNumber>;
118
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodNumber>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
119
- principal: import("zod/v4").ZodNumber;
120
- rate: import("zod/v4").ZodNumber;
121
- periods: import("zod/v4").ZodNumber;
122
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
123
- value: import("zod/v4").ZodNumber;
124
- from: import("zod/v4").ZodString;
125
- to: import("zod/v4").ZodString;
126
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
127
- text: import("zod/v4").ZodString;
128
- sep: import("zod/v4").ZodOptional<import("zod/v4").ZodString>;
129
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodArray<import("zod/v4").ZodString>> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
130
- value: import("zod/v4").ZodOptional<import("zod/v4").ZodAny>;
131
- fallback: import("zod/v4").ZodAny;
132
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodAny> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{}, import("zod/v4/core").$strip>, import("zod/v4").ZodString> | import("@openuidev/lang-core").DefinedFunction<import("zod/v4").ZodObject<{
133
- from: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber]>;
134
- to: import("zod/v4").ZodUnion<readonly [import("zod/v4").ZodString, import("zod/v4").ZodNumber]>;
135
- }, import("zod/v4/core").$strip>, import("zod/v4").ZodNumber>)[];
135
+ }, import("zod/v4/core").$strip>>)[];
136
136
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openui/functions/index.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gEAAkH,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openui/functions/index.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAAkH,CAAC"}
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.5.0",
5
+ "version": "0.6.1",
6
6
  "license": "UNLICENSED",
7
7
  "author": "Reforma, Inc. <dev@reforma.ai>",
8
8
  "repository": {
@@ -72,7 +72,7 @@
72
72
  "@reforma/constants": "1.1.0",
73
73
  "@reforma/icons": "0.1.0",
74
74
  "@reforma/lib": "0.1.7",
75
- "@reforma/types": "1.5.0",
75
+ "@reforma/types": "1.6.0",
76
76
  "@shikijs/transformers": "^4.0.2",
77
77
  "@streamdown/cjk": "1.0.3",
78
78
  "@streamdown/code": "1.1.1",