@handled-ai/design-system 0.18.34 → 0.18.35
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.
- package/dist/components/draft-feedback-inline.js +1 -1
- package/dist/components/draft-feedback-inline.js.map +1 -1
- package/dist/components/score-feedback.js +1 -1
- package/dist/components/score-feedback.js.map +1 -1
- package/dist/components/suggested-actions.js +1 -1
- package/dist/components/suggested-actions.js.map +1 -1
- package/package.json +1 -1
- package/src/components/__tests__/draft-feedback-inline.test.tsx +3 -3
- package/src/components/__tests__/suggested-actions-feedback-header.test.tsx +3 -3
- package/src/components/draft-feedback-inline.tsx +1 -1
- package/src/components/score-feedback.tsx +1 -1
- package/src/components/suggested-actions.tsx +1 -1
|
@@ -87,7 +87,7 @@ function DraftFeedbackInline({
|
|
|
87
87
|
setSelectedPills([]);
|
|
88
88
|
setDetailText("");
|
|
89
89
|
},
|
|
90
|
-
className: `p-1.5 rounded transition-colors ${thumbState === "down" ? "bg-
|
|
90
|
+
className: `p-1.5 rounded transition-colors ${thumbState === "down" ? "bg-muted text-foreground" : "hover:bg-muted text-muted-foreground hover:text-foreground"}`,
|
|
91
91
|
children: /* @__PURE__ */ jsx(ThumbsDown, { className: "w-4 h-4" })
|
|
92
92
|
}
|
|
93
93
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/draft-feedback-inline.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ThumbsUp,\n ThumbsDown,\n Check,\n RefreshCw,\n} from \"lucide-react\"\n\n// ---------------------------------------------------------------------------\n// DraftFeedbackInline\n// ---------------------------------------------------------------------------\n\nconst positivePills = [\"Tone\", \"Personalization\", \"Length\", \"CTA\", \"Other\"]\nconst negativePills = [\"Too formal\", \"Too casual\", \"Too long\", \"Missing context\", \"Wrong angle\", \"Factual error\", \"Other\"]\n\nexport interface DraftFeedbackInlineProps {\n initialDirection?: \"up\" | \"down\" | null\n onRegenerateRequest?: (pills: string[], detail: string) => void\n onSubmitFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n onDiscardRequest?: (pills: string[], detail: string) => void\n}\n\nexport function DraftFeedbackInline({\n initialDirection,\n onRegenerateRequest,\n onSubmitFeedback,\n onDiscardRequest,\n}: DraftFeedbackInlineProps) {\n const [thumbState, setThumbState] = React.useState<\"up\" | \"down\" | null>(initialDirection ?? null)\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [detailText, setDetailText] = React.useState(\"\")\n const [noted, setNoted] = React.useState(false)\n const [regenerated, setRegenerated] = React.useState(false)\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) => (prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]))\n }, [])\n\n const handleSubmit = React.useCallback(() => {\n if (!thumbState) return\n onSubmitFeedback?.(thumbState, selectedPills, detailText)\n setNoted(true)\n setTimeout(() => {\n setThumbState(null)\n setSelectedPills([])\n setDetailText(\"\")\n setNoted(false)\n }, 3000)\n }, [thumbState, selectedPills, detailText, onSubmitFeedback])\n\n const handleRegenerate = React.useCallback(() => {\n if (!thumbState) return\n onRegenerateRequest?.(selectedPills, detailText)\n setRegenerated(true)\n setTimeout(() => {\n setThumbState(null)\n setSelectedPills([])\n setDetailText(\"\")\n setRegenerated(false)\n }, 3000)\n }, [thumbState, selectedPills, detailText, onRegenerateRequest])\n\n const handleDiscard = React.useCallback(() => {\n if (!thumbState) return\n onDiscardRequest?.(selectedPills, detailText)\n }, [thumbState, selectedPills, detailText, onDiscardRequest])\n\n if (noted) {\n return (\n <div className=\"flex items-center gap-1.5 py-1 animate-in fade-in slide-in-from-top-1 duration-200\">\n <Check className=\"w-3.5 h-3.5 text-foreground\" />\n <span className=\"text-xs text-muted-foreground\">Feedback recorded</span>\n </div>\n )\n }\n\n if (regenerated) {\n return (\n <div className=\"py-2 animate-in fade-in slide-in-from-top-1 duration-200\">\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-indigo-50 dark:bg-indigo-950/30 border border-indigo-200 dark:border-indigo-800\">\n <RefreshCw className=\"w-3 h-3 text-indigo-500 animate-spin\" />\n <span className=\"text-xs font-medium text-indigo-600 dark:text-indigo-400\">Regenerating draft...</span>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground font-medium\">How's this draft?</span>\n <div className=\"flex gap-1\">\n <button\n onClick={() => {\n setThumbState(thumbState === \"up\" ? null : \"up\")\n setSelectedPills([])\n setDetailText(\"\")\n }}\n className={`p-1.5 rounded transition-colors ${\n thumbState === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsUp className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => {\n setThumbState(thumbState === \"down\" ? null : \"down\")\n setSelectedPills([])\n setDetailText(\"\")\n }}\n className={`p-1.5 rounded transition-colors ${\n thumbState === \"down\"\n ? \"bg-red-50 text-red-600 dark:bg-red-950/30 dark:text-red-400\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsDown className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {thumbState && (\n <div className=\"pt-2 space-y-2.5 animate-in fade-in slide-in-from-top-2 duration-200\">\n <div>\n <span className=\"text-xs text-muted-foreground mb-2 block font-medium\">\n {thumbState === \"up\" ? \"What worked well?\" : \"What needs improvement?\"}\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {(thumbState === \"up\" ? positivePills : negativePills).map((pill) => (\n <button\n key={pill}\n onClick={() => togglePill(pill)}\n className={`px-3 py-1.5 rounded-full text-[11px] font-medium border transition-colors ${\n selectedPills.includes(pill)\n ? thumbState === \"up\"\n ? \"bg-muted text-foreground border-border\"\n : \"bg-red-50 text-red-700 border-red-200 dark:bg-red-950/30 dark:text-red-300 dark:border-red-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n }`}\n >\n {pill}\n </button>\n ))}\n </div>\n </div>\n\n <textarea\n value={detailText}\n onChange={(e) => setDetailText(e.target.value)}\n placeholder={thumbState === \"up\" ? \"Add specific praise (optional)...\" : \"Provide specific instructions (optional)...\"}\n className=\"w-full text-xs bg-background border border-border rounded-md px-2.5 py-2 text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-indigo-500/50 focus:border-indigo-500/50 resize-none min-h-[60px]\"\n />\n\n <div className=\"flex items-center gap-2.5 pt-2\">\n {thumbState === \"down\" ? (\n <>\n <button\n onClick={handleRegenerate}\n disabled={selectedPills.length === 0 && detailText.length === 0}\n className={`flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors flex items-center justify-center gap-1.5 ${\n selectedPills.length > 0 || detailText.length > 0\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n >\n <RefreshCw className=\"w-3 h-3\" />\n Regenerate draft\n </button>\n <button\n onClick={handleDiscard}\n className=\"flex-1 py-1.5 rounded-md text-xs font-medium transition-colors border bg-background text-foreground border-border hover:bg-muted/50 flex items-center justify-center gap-1.5\"\n >\n Discard draft\n </button>\n </>\n ) : (\n <button\n onClick={handleSubmit}\n className=\"flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors bg-foreground text-background hover:bg-foreground/90 border-transparent\"\n >\n Submit feedback\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/draft-feedback-inline.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ThumbsUp,\n ThumbsDown,\n Check,\n RefreshCw,\n} from \"lucide-react\"\n\n// ---------------------------------------------------------------------------\n// DraftFeedbackInline\n// ---------------------------------------------------------------------------\n\nconst positivePills = [\"Tone\", \"Personalization\", \"Length\", \"CTA\", \"Other\"]\nconst negativePills = [\"Too formal\", \"Too casual\", \"Too long\", \"Missing context\", \"Wrong angle\", \"Factual error\", \"Other\"]\n\nexport interface DraftFeedbackInlineProps {\n initialDirection?: \"up\" | \"down\" | null\n onRegenerateRequest?: (pills: string[], detail: string) => void\n onSubmitFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n onDiscardRequest?: (pills: string[], detail: string) => void\n}\n\nexport function DraftFeedbackInline({\n initialDirection,\n onRegenerateRequest,\n onSubmitFeedback,\n onDiscardRequest,\n}: DraftFeedbackInlineProps) {\n const [thumbState, setThumbState] = React.useState<\"up\" | \"down\" | null>(initialDirection ?? null)\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [detailText, setDetailText] = React.useState(\"\")\n const [noted, setNoted] = React.useState(false)\n const [regenerated, setRegenerated] = React.useState(false)\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) => (prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]))\n }, [])\n\n const handleSubmit = React.useCallback(() => {\n if (!thumbState) return\n onSubmitFeedback?.(thumbState, selectedPills, detailText)\n setNoted(true)\n setTimeout(() => {\n setThumbState(null)\n setSelectedPills([])\n setDetailText(\"\")\n setNoted(false)\n }, 3000)\n }, [thumbState, selectedPills, detailText, onSubmitFeedback])\n\n const handleRegenerate = React.useCallback(() => {\n if (!thumbState) return\n onRegenerateRequest?.(selectedPills, detailText)\n setRegenerated(true)\n setTimeout(() => {\n setThumbState(null)\n setSelectedPills([])\n setDetailText(\"\")\n setRegenerated(false)\n }, 3000)\n }, [thumbState, selectedPills, detailText, onRegenerateRequest])\n\n const handleDiscard = React.useCallback(() => {\n if (!thumbState) return\n onDiscardRequest?.(selectedPills, detailText)\n }, [thumbState, selectedPills, detailText, onDiscardRequest])\n\n if (noted) {\n return (\n <div className=\"flex items-center gap-1.5 py-1 animate-in fade-in slide-in-from-top-1 duration-200\">\n <Check className=\"w-3.5 h-3.5 text-foreground\" />\n <span className=\"text-xs text-muted-foreground\">Feedback recorded</span>\n </div>\n )\n }\n\n if (regenerated) {\n return (\n <div className=\"py-2 animate-in fade-in slide-in-from-top-1 duration-200\">\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-indigo-50 dark:bg-indigo-950/30 border border-indigo-200 dark:border-indigo-800\">\n <RefreshCw className=\"w-3 h-3 text-indigo-500 animate-spin\" />\n <span className=\"text-xs font-medium text-indigo-600 dark:text-indigo-400\">Regenerating draft...</span>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground font-medium\">How's this draft?</span>\n <div className=\"flex gap-1\">\n <button\n onClick={() => {\n setThumbState(thumbState === \"up\" ? null : \"up\")\n setSelectedPills([])\n setDetailText(\"\")\n }}\n className={`p-1.5 rounded transition-colors ${\n thumbState === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsUp className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => {\n setThumbState(thumbState === \"down\" ? null : \"down\")\n setSelectedPills([])\n setDetailText(\"\")\n }}\n className={`p-1.5 rounded transition-colors ${\n thumbState === \"down\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsDown className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {thumbState && (\n <div className=\"pt-2 space-y-2.5 animate-in fade-in slide-in-from-top-2 duration-200\">\n <div>\n <span className=\"text-xs text-muted-foreground mb-2 block font-medium\">\n {thumbState === \"up\" ? \"What worked well?\" : \"What needs improvement?\"}\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {(thumbState === \"up\" ? positivePills : negativePills).map((pill) => (\n <button\n key={pill}\n onClick={() => togglePill(pill)}\n className={`px-3 py-1.5 rounded-full text-[11px] font-medium border transition-colors ${\n selectedPills.includes(pill)\n ? thumbState === \"up\"\n ? \"bg-muted text-foreground border-border\"\n : \"bg-red-50 text-red-700 border-red-200 dark:bg-red-950/30 dark:text-red-300 dark:border-red-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n }`}\n >\n {pill}\n </button>\n ))}\n </div>\n </div>\n\n <textarea\n value={detailText}\n onChange={(e) => setDetailText(e.target.value)}\n placeholder={thumbState === \"up\" ? \"Add specific praise (optional)...\" : \"Provide specific instructions (optional)...\"}\n className=\"w-full text-xs bg-background border border-border rounded-md px-2.5 py-2 text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-indigo-500/50 focus:border-indigo-500/50 resize-none min-h-[60px]\"\n />\n\n <div className=\"flex items-center gap-2.5 pt-2\">\n {thumbState === \"down\" ? (\n <>\n <button\n onClick={handleRegenerate}\n disabled={selectedPills.length === 0 && detailText.length === 0}\n className={`flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors flex items-center justify-center gap-1.5 ${\n selectedPills.length > 0 || detailText.length > 0\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n >\n <RefreshCw className=\"w-3 h-3\" />\n Regenerate draft\n </button>\n <button\n onClick={handleDiscard}\n className=\"flex-1 py-1.5 rounded-md text-xs font-medium transition-colors border bg-background text-foreground border-border hover:bg-muted/50 flex items-center justify-center gap-1.5\"\n >\n Discard draft\n </button>\n </>\n ) : (\n <button\n onClick={handleSubmit}\n className=\"flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors bg-foreground text-background hover:bg-foreground/90 border-transparent\"\n >\n Submit feedback\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -128,7 +128,7 @@ function Trigger({ className }) {
|
|
|
128
128
|
onClick: () => handleThumbClick("down"),
|
|
129
129
|
className: cn(
|
|
130
130
|
"p-1.5 rounded transition-colors",
|
|
131
|
-
thumbState === "down" ? "bg-
|
|
131
|
+
thumbState === "down" ? "bg-muted text-foreground" : "hover:bg-muted text-muted-foreground hover:text-foreground"
|
|
132
132
|
),
|
|
133
133
|
children: /* @__PURE__ */ jsx(ThumbsDown, { className: "w-3.5 h-3.5" })
|
|
134
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/score-feedback.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ThumbsUp, ThumbsDown, Check } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst positivePills = [\n \"Right timing\",\n \"Accurate data\",\n \"Good prospect fit\",\n \"Actionable\",\n]\n\nconst negativePills = [\n \"Bad timing\",\n \"Inaccurate data\",\n \"Wrong prospect\",\n \"Already handled\",\n \"Not actionable\",\n \"Other\",\n]\n\ninterface SubmittedScoreFeedback {\n type: \"up\" | \"down\"\n pills: string[]\n detail: string\n}\n\ninterface ScoreFeedbackState {\n thumbState: \"up\" | \"down\" | null\n selectedPills: string[]\n detailText: string\n notedType: \"up\" | \"down\" | null\n submittedFeedback: SubmittedScoreFeedback | null\n otherSelected: boolean\n hasRequiredInput: boolean\n handleThumbClick: (type: \"up\" | \"down\") => void\n togglePill: (pill: string) => void\n setDetailText: (text: string) => void\n handleSubmit: () => void\n editSubmitted: () => void\n}\n\nconst ScoreFeedbackCtx = React.createContext<ScoreFeedbackState | null>(null)\n\nfunction useScoreFeedback() {\n const ctx = React.useContext(ScoreFeedbackCtx)\n if (!ctx) throw new Error(\"Must be used within ScoreFeedback.Root\")\n return ctx\n}\n\ninterface RootProps {\n children: React.ReactNode\n onSubmitFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n initialFeedback?: { type: \"up\" | \"down\"; pills: string[]; detail: string } | null\n}\n\nfunction Root({ children, onSubmitFeedback, initialFeedback }: RootProps) {\n const [thumbState, setThumbState] = React.useState<\"up\" | \"down\" | null>(null)\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [detailText, setDetailTextState] = React.useState(\"\")\n const [notedType, setNotedType] = React.useState<\"up\" | \"down\" | null>(null)\n const [submittedFeedback, setSubmittedFeedback] = React.useState<SubmittedScoreFeedback | null>(\n initialFeedback ?? null\n )\n\n // Sync submitted feedback when initialFeedback prop changes (e.g. async\n // detail load). Skip when the user has an in-progress edit (thumbState set).\n React.useEffect(() => {\n if (thumbState !== null) return\n setSubmittedFeedback(initialFeedback ?? null)\n }, [initialFeedback]) // eslint-disable-line react-hooks/exhaustive-deps -- intentionally omits thumbState to read it as a guard, not a trigger\n\n const otherSelected = selectedPills.includes(\"Other\")\n\n const hasRequiredInput =\n thumbState === \"down\"\n ? selectedPills.length > 0 && (!otherSelected || detailText.trim().length > 0)\n : selectedPills.length > 0 || detailText.trim().length > 0\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) =>\n prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]\n )\n }, [])\n\n const handleThumbClick = React.useCallback((type: \"up\" | \"down\") => {\n setThumbState((prev) => (prev === type ? null : type))\n setSelectedPills([])\n setDetailTextState(\"\")\n }, [])\n\n const handleSubmit = React.useCallback(() => {\n if (!thumbState) return\n onSubmitFeedback?.(thumbState, selectedPills, detailText)\n setSubmittedFeedback({ type: thumbState, pills: [...selectedPills], detail: detailText.trim() })\n setNotedType(thumbState)\n setThumbState(null)\n setSelectedPills([])\n setDetailTextState(\"\")\n setTimeout(() => setNotedType(null), 3000)\n }, [thumbState, selectedPills, detailText, onSubmitFeedback])\n\n const editSubmitted = React.useCallback(() => {\n if (!submittedFeedback) return\n setThumbState(submittedFeedback.type)\n setSelectedPills([...submittedFeedback.pills])\n setDetailTextState(submittedFeedback.detail)\n setNotedType(null)\n }, [submittedFeedback])\n\n return (\n <ScoreFeedbackCtx.Provider\n value={{\n thumbState,\n selectedPills,\n detailText,\n notedType,\n submittedFeedback,\n otherSelected,\n hasRequiredInput,\n handleThumbClick,\n togglePill,\n setDetailText: setDetailTextState,\n handleSubmit,\n editSubmitted,\n }}\n >\n {children}\n </ScoreFeedbackCtx.Provider>\n )\n}\n\nfunction Trigger({ className }: { className?: string }) {\n const { thumbState, notedType, submittedFeedback, handleThumbClick, editSubmitted } = useScoreFeedback()\n\n if (notedType || (submittedFeedback && !thumbState)) {\n const label = notedType\n ? notedType === \"up\" ? \"Noted\" : \"Recorded\"\n : submittedFeedback?.type === \"up\" ? \"Noted\" : \"Recorded\"\n\n return (\n <button\n type=\"button\"\n onClick={submittedFeedback ? editSubmitted : undefined}\n className={cn(\n \"flex items-center gap-1 shrink-0 rounded px-1.5 py-1 transition-colors\",\n submittedFeedback ? \"cursor-pointer hover:bg-muted/50\" : \"cursor-default\",\n className,\n )}\n >\n <Check className=\"w-3 h-3 text-foreground\" />\n <span className=\"text-[11px] text-muted-foreground\">{label}</span>\n </button>\n )\n }\n\n return (\n <div className={cn(\"flex gap-0.5 shrink-0\", className)}>\n <button\n type=\"button\"\n onClick={() => handleThumbClick(\"up\")}\n className={cn(\n \"p-1.5 rounded transition-colors\",\n thumbState === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n )}\n >\n <ThumbsUp className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleThumbClick(\"down\")}\n className={cn(\n \"p-1.5 rounded transition-colors\",\n thumbState === \"down\"\n ? \"bg-red-50 text-red-600 dark:bg-red-950/30 dark:text-red-400\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n )}\n >\n <ThumbsDown className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n )\n}\n\nfunction Panel({ className }: { className?: string }) {\n const {\n thumbState,\n selectedPills,\n detailText,\n otherSelected,\n hasRequiredInput,\n togglePill,\n setDetailText,\n handleSubmit,\n } = useScoreFeedback()\n\n if (!thumbState) return null\n\n return (\n <div className={cn(\"overflow-hidden\", className)}>\n <div className=\"mt-4 pt-4 pb-1 space-y-3 border-t border-border/60\">\n <span className=\"text-[11px] font-bold text-muted-foreground/70 uppercase tracking-wider\">\n How's this score?\n </span>\n <div>\n <span className=\"text-xs text-muted-foreground mb-2 block font-medium\">\n {thumbState === \"up\" ? \"What was useful?\" : \"What\\u2019s the issue?\"}\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {(thumbState === \"up\" ? positivePills : negativePills).map((pill) => (\n <button\n key={pill}\n type=\"button\"\n onClick={() => togglePill(pill)}\n className={cn(\n \"px-2.5 py-1 rounded-full text-[11px] font-medium border transition-colors\",\n selectedPills.includes(pill)\n ? thumbState === \"up\"\n ? \"bg-muted text-foreground border-border\"\n : \"bg-red-50 text-red-700 border-red-200 dark:bg-red-950/30 dark:text-red-300 dark:border-red-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n )}\n >\n {pill}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <input\n type=\"text\"\n value={detailText}\n onChange={(e) => setDetailText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && hasRequiredInput) handleSubmit()\n }}\n placeholder={\n thumbState === \"up\"\n ? \"Tell us more (optional)\"\n : \"e.g., The risk factors are outdated\"\n }\n className=\"w-full text-xs bg-background border border-border rounded-md px-2.5 py-2 text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-ring\"\n />\n {otherSelected && detailText.trim().length === 0 && (\n <span className=\"text-[10px] text-red-500\">\n Please describe when “Other” is selected\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!hasRequiredInput}\n className={cn(\n \"flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors\",\n hasRequiredInput\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n )}\n >\n Submit\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport const ScoreFeedback = { Root, Trigger, Panel }\nexport { useScoreFeedback }\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/score-feedback.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ThumbsUp, ThumbsDown, Check } from \"lucide-react\"\nimport { cn } from \"../lib/utils\"\n\nconst positivePills = [\n \"Right timing\",\n \"Accurate data\",\n \"Good prospect fit\",\n \"Actionable\",\n]\n\nconst negativePills = [\n \"Bad timing\",\n \"Inaccurate data\",\n \"Wrong prospect\",\n \"Already handled\",\n \"Not actionable\",\n \"Other\",\n]\n\ninterface SubmittedScoreFeedback {\n type: \"up\" | \"down\"\n pills: string[]\n detail: string\n}\n\ninterface ScoreFeedbackState {\n thumbState: \"up\" | \"down\" | null\n selectedPills: string[]\n detailText: string\n notedType: \"up\" | \"down\" | null\n submittedFeedback: SubmittedScoreFeedback | null\n otherSelected: boolean\n hasRequiredInput: boolean\n handleThumbClick: (type: \"up\" | \"down\") => void\n togglePill: (pill: string) => void\n setDetailText: (text: string) => void\n handleSubmit: () => void\n editSubmitted: () => void\n}\n\nconst ScoreFeedbackCtx = React.createContext<ScoreFeedbackState | null>(null)\n\nfunction useScoreFeedback() {\n const ctx = React.useContext(ScoreFeedbackCtx)\n if (!ctx) throw new Error(\"Must be used within ScoreFeedback.Root\")\n return ctx\n}\n\ninterface RootProps {\n children: React.ReactNode\n onSubmitFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n initialFeedback?: { type: \"up\" | \"down\"; pills: string[]; detail: string } | null\n}\n\nfunction Root({ children, onSubmitFeedback, initialFeedback }: RootProps) {\n const [thumbState, setThumbState] = React.useState<\"up\" | \"down\" | null>(null)\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [detailText, setDetailTextState] = React.useState(\"\")\n const [notedType, setNotedType] = React.useState<\"up\" | \"down\" | null>(null)\n const [submittedFeedback, setSubmittedFeedback] = React.useState<SubmittedScoreFeedback | null>(\n initialFeedback ?? null\n )\n\n // Sync submitted feedback when initialFeedback prop changes (e.g. async\n // detail load). Skip when the user has an in-progress edit (thumbState set).\n React.useEffect(() => {\n if (thumbState !== null) return\n setSubmittedFeedback(initialFeedback ?? null)\n }, [initialFeedback]) // eslint-disable-line react-hooks/exhaustive-deps -- intentionally omits thumbState to read it as a guard, not a trigger\n\n const otherSelected = selectedPills.includes(\"Other\")\n\n const hasRequiredInput =\n thumbState === \"down\"\n ? selectedPills.length > 0 && (!otherSelected || detailText.trim().length > 0)\n : selectedPills.length > 0 || detailText.trim().length > 0\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) =>\n prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]\n )\n }, [])\n\n const handleThumbClick = React.useCallback((type: \"up\" | \"down\") => {\n setThumbState((prev) => (prev === type ? null : type))\n setSelectedPills([])\n setDetailTextState(\"\")\n }, [])\n\n const handleSubmit = React.useCallback(() => {\n if (!thumbState) return\n onSubmitFeedback?.(thumbState, selectedPills, detailText)\n setSubmittedFeedback({ type: thumbState, pills: [...selectedPills], detail: detailText.trim() })\n setNotedType(thumbState)\n setThumbState(null)\n setSelectedPills([])\n setDetailTextState(\"\")\n setTimeout(() => setNotedType(null), 3000)\n }, [thumbState, selectedPills, detailText, onSubmitFeedback])\n\n const editSubmitted = React.useCallback(() => {\n if (!submittedFeedback) return\n setThumbState(submittedFeedback.type)\n setSelectedPills([...submittedFeedback.pills])\n setDetailTextState(submittedFeedback.detail)\n setNotedType(null)\n }, [submittedFeedback])\n\n return (\n <ScoreFeedbackCtx.Provider\n value={{\n thumbState,\n selectedPills,\n detailText,\n notedType,\n submittedFeedback,\n otherSelected,\n hasRequiredInput,\n handleThumbClick,\n togglePill,\n setDetailText: setDetailTextState,\n handleSubmit,\n editSubmitted,\n }}\n >\n {children}\n </ScoreFeedbackCtx.Provider>\n )\n}\n\nfunction Trigger({ className }: { className?: string }) {\n const { thumbState, notedType, submittedFeedback, handleThumbClick, editSubmitted } = useScoreFeedback()\n\n if (notedType || (submittedFeedback && !thumbState)) {\n const label = notedType\n ? notedType === \"up\" ? \"Noted\" : \"Recorded\"\n : submittedFeedback?.type === \"up\" ? \"Noted\" : \"Recorded\"\n\n return (\n <button\n type=\"button\"\n onClick={submittedFeedback ? editSubmitted : undefined}\n className={cn(\n \"flex items-center gap-1 shrink-0 rounded px-1.5 py-1 transition-colors\",\n submittedFeedback ? \"cursor-pointer hover:bg-muted/50\" : \"cursor-default\",\n className,\n )}\n >\n <Check className=\"w-3 h-3 text-foreground\" />\n <span className=\"text-[11px] text-muted-foreground\">{label}</span>\n </button>\n )\n }\n\n return (\n <div className={cn(\"flex gap-0.5 shrink-0\", className)}>\n <button\n type=\"button\"\n onClick={() => handleThumbClick(\"up\")}\n className={cn(\n \"p-1.5 rounded transition-colors\",\n thumbState === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n )}\n >\n <ThumbsUp className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleThumbClick(\"down\")}\n className={cn(\n \"p-1.5 rounded transition-colors\",\n thumbState === \"down\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n )}\n >\n <ThumbsDown className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n )\n}\n\nfunction Panel({ className }: { className?: string }) {\n const {\n thumbState,\n selectedPills,\n detailText,\n otherSelected,\n hasRequiredInput,\n togglePill,\n setDetailText,\n handleSubmit,\n } = useScoreFeedback()\n\n if (!thumbState) return null\n\n return (\n <div className={cn(\"overflow-hidden\", className)}>\n <div className=\"mt-4 pt-4 pb-1 space-y-3 border-t border-border/60\">\n <span className=\"text-[11px] font-bold text-muted-foreground/70 uppercase tracking-wider\">\n How's this score?\n </span>\n <div>\n <span className=\"text-xs text-muted-foreground mb-2 block font-medium\">\n {thumbState === \"up\" ? \"What was useful?\" : \"What\\u2019s the issue?\"}\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {(thumbState === \"up\" ? positivePills : negativePills).map((pill) => (\n <button\n key={pill}\n type=\"button\"\n onClick={() => togglePill(pill)}\n className={cn(\n \"px-2.5 py-1 rounded-full text-[11px] font-medium border transition-colors\",\n selectedPills.includes(pill)\n ? thumbState === \"up\"\n ? \"bg-muted text-foreground border-border\"\n : \"bg-red-50 text-red-700 border-red-200 dark:bg-red-950/30 dark:text-red-300 dark:border-red-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n )}\n >\n {pill}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <input\n type=\"text\"\n value={detailText}\n onChange={(e) => setDetailText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && hasRequiredInput) handleSubmit()\n }}\n placeholder={\n thumbState === \"up\"\n ? \"Tell us more (optional)\"\n : \"e.g., The risk factors are outdated\"\n }\n className=\"w-full text-xs bg-background border border-border rounded-md px-2.5 py-2 text-foreground placeholder:text-muted-foreground/50 focus:outline-none focus:ring-1 focus:ring-ring\"\n />\n {otherSelected && detailText.trim().length === 0 && (\n <span className=\"text-[10px] text-red-500\">\n Please describe when “Other” is selected\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 pt-1\">\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!hasRequiredInput}\n className={cn(\n \"flex-1 py-1.5 rounded-md text-xs font-semibold transition-colors\",\n hasRequiredInput\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n )}\n >\n Submit\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport const ScoreFeedback = { Root, Trigger, Panel }\nexport { useScoreFeedback }\n"],"mappings":"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","names":[]}
|
|
@@ -745,7 +745,7 @@ function SuggestedActionCard({
|
|
|
745
745
|
"button",
|
|
746
746
|
{
|
|
747
747
|
onClick: () => handleThumbClick("down"),
|
|
748
|
-
className: `p-1.5 rounded transition-colors ${feedbackOpen && feedbackDirection === "down" ? "bg-
|
|
748
|
+
className: `p-1.5 rounded transition-colors ${feedbackOpen && feedbackDirection === "down" ? "bg-muted text-foreground" : "hover:bg-muted text-muted-foreground hover:text-foreground"}`,
|
|
749
749
|
children: /* @__PURE__ */ jsx(ThumbsDown, { className: "w-3.5 h-3.5" })
|
|
750
750
|
}
|
|
751
751
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/suggested-actions.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDown,\n ChevronUp,\n Clock,\n MessageSquare,\n Undo2,\n Redo2,\n Bold,\n Italic,\n Underline,\n AlignLeft,\n List,\n Trash,\n Sparkles,\n ThumbsUp,\n ThumbsDown,\n Check,\n ArrowLeft,\n Mail,\n Phone,\n X,\n Users,\n ExternalLink,\n Copy,\n PenLine,\n ClipboardList,\n Globe,\n} from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { DraftFeedbackInline } from \"./draft-feedback-inline\"\nimport { AccountContactsPopover, BrandIcon } from \"./account-contacts-popover\"\n\nexport interface SuggestedActionsIconMap {\n gmail?: string\n slack?: string\n zendesk?: string\n salesforce?: string\n}\n\nfunction getActionTypeIcon(type: string, className?: string, iconMap?: SuggestedActionsIconMap) {\n switch (type) {\n case \"email\":\n return iconMap?.gmail\n ? <BrandIcon src={iconMap.gmail} alt=\"Gmail\" className={className} />\n : <Mail className={className} />\n case \"slack\":\n return iconMap?.slack\n ? <BrandIcon src={iconMap.slack} alt=\"Slack\" className={className} />\n : <MessageSquare className={className} />\n case \"ticket\":\n return iconMap?.zendesk\n ? <BrandIcon src={iconMap.zendesk} alt=\"Zendesk\" className={className} />\n : <MessageSquare className={className} />\n case \"call\":\n return <Phone className={className} />\n case \"manual\":\n return <ClipboardList className={className} />\n case \"browser\":\n return <Globe className={className} />\n default:\n return <Mail className={className} />\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SuggestedContact {\n name: string\n role: string\n email?: string\n emails?: string[]\n phone?: string\n phones?: string[]\n confirmed: boolean\n salesforceUrl?: string\n lastActivity?: {\n date: string\n type: string\n }\n}\n\nexport interface SuggestedActionThreadMessage {\n id: string\n from: string\n initials: string\n time: string\n preview: string\n content: string\n}\n\nexport interface SuggestedActionReplyTo {\n from: string\n time: string\n content: string\n channel?: string\n}\n\nexport interface SuggestedActionTicket {\n system: string\n priority: string\n type: string\n subject: string\n description: string\n assignee?: string\n tags?: string[]\n}\n\nexport interface SuggestedActionFollowUp {\n enabled: boolean\n days: number\n}\n\nexport interface SuggestedActionEmailMeta {\n from: string\n fromEmail: string\n to?: SuggestedContact\n cc?: SuggestedContact[]\n bcc?: string\n subject?: string\n}\n\nexport interface SuggestedActionCallMeta {\n contact?: SuggestedContact\n talkTrack: string\n allowDispatchAgent?: boolean\n}\n\nexport interface SuggestedActionManualMeta {\n taskDescription: string\n}\n\nexport interface SuggestedActionBrowserMeta {\n url: string\n actionDescription: string\n}\n\nexport interface SuggestedAction {\n id: number | string\n type: \"email\" | \"ticket\" | \"slack\" | \"call\" | \"manual\" | \"browser\"\n label: string\n status: \"pending\" | \"sent\" | \"dismissed\"\n content?: string\n replyTo?: SuggestedActionReplyTo\n threadMessages?: SuggestedActionThreadMessage[]\n ticket?: SuggestedActionTicket\n followUp?: SuggestedActionFollowUp\n emailMeta?: SuggestedActionEmailMeta\n callMeta?: SuggestedActionCallMeta\n manualMeta?: SuggestedActionManualMeta\n browserMeta?: SuggestedActionBrowserMeta\n onFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n}\n\n// ---------------------------------------------------------------------------\n// AiEditPanel\n// ---------------------------------------------------------------------------\n\nconst aiEditPills = [\"Shorten it\", \"Make sound more like me\", \"Make longer\", \"Other\"]\n\nfunction AiEditPanel({ onApply }: { onApply?: (pills: string[], description: string) => void }) {\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [description, setDescription] = React.useState(\"\")\n const [applying, setApplying] = React.useState(false)\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) => (prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]))\n }, [])\n\n const handleApply = React.useCallback(() => {\n if (selectedPills.length === 0 && description.trim().length === 0) return\n setApplying(true)\n onApply?.(selectedPills, description)\n setTimeout(() => {\n setApplying(false)\n setSelectedPills([])\n setDescription(\"\")\n }, 2000)\n }, [selectedPills, description, onApply])\n\n const hasInput = selectedPills.length > 0 || description.trim().length > 0\n\n return (\n <div className=\"mb-4 space-y-2.5 animate-in fade-in slide-in-from-top-2 duration-200\">\n <div className=\"flex flex-wrap gap-1.5\">\n {aiEditPills.map((pill) => (\n <button\n key={pill}\n onClick={() => togglePill(pill)}\n className={`px-2.5 py-1 rounded-full text-[11px] font-medium border transition-colors ${\n selectedPills.includes(pill)\n ? \"bg-indigo-100 text-indigo-700 border-indigo-200 dark:bg-indigo-900/30 dark:text-indigo-300 dark:border-indigo-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n }`}\n >\n {pill}\n </button>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n className=\"flex-1 px-3 py-2 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-1 focus:ring-indigo-500 transition-colors placeholder:text-muted-foreground/50\"\n placeholder=\"Describe changes...\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && hasInput) handleApply()\n }}\n />\n <button\n onClick={handleApply}\n disabled={!hasInput || applying}\n className={`px-4 h-9 rounded-md text-xs font-semibold transition-colors flex items-center gap-1.5 shrink-0 ${\n hasInput && !applying\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n >\n {applying ? (\n <>\n <Sparkles className=\"w-3 h-3 animate-pulse\" />\n Applying...\n </>\n ) : (\n \"Apply\"\n )}\n </button>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EditorToolbar\n// ---------------------------------------------------------------------------\n\nfunction EditorToolbar() {\n return (\n <div className=\"flex items-center gap-1 px-4 py-2 border-t border-border bg-muted/5 flex-wrap\">\n <div className=\"flex items-center mr-2 gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Undo2 className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Redo2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs font-medium text-muted-foreground gap-1 px-2 hover:text-foreground shrink-0\">\n Sans Serif <ChevronDown className=\"h-3 w-3\" />\n </Button>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Bold className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Italic className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Underline className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <AlignLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"flex-1\" />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-red-600 hover:bg-red-50 shrink-0 ml-auto\">\n <Trash className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// FollowUpToggle (simple checkbox-based switch)\n// ---------------------------------------------------------------------------\n\nfunction FollowUpToggle({\n checked,\n onCheckedChange,\n days,\n}: {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n days: number\n}) {\n return (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-foreground\">\n <Clock className=\"w-4 h-4 text-muted-foreground\" />\n <span>Auto-draft follow-up in {days}d if no response</span>\n </div>\n <button\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onCheckedChange(!checked)}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors ${\n checked ? \"bg-foreground\" : \"bg-muted\"\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-sm transition-transform ${\n checked ? \"translate-x-4\" : \"translate-x-0\"\n }`}\n />\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// ContactCard\n// ---------------------------------------------------------------------------\n\nfunction ContactCard({\n contact,\n onConfirm,\n onRemove,\n onSwap,\n variant = \"primary\",\n showPhone = false,\n}: {\n contact: SuggestedContact\n onConfirm?: () => void\n onRemove?: () => void\n onSwap?: () => void\n variant?: \"primary\" | \"secondary\" | \"alternative\"\n showPhone?: boolean\n}) {\n const [selectedEmail, setSelectedEmail] = React.useState(\n contact.email ?? contact.emails?.[0] ?? \"\"\n )\n const [selectedPhone, setSelectedPhone] = React.useState(\n contact.phone ?? contact.phones?.[0] ?? \"\"\n )\n const [showEmailPicker, setShowEmailPicker] = React.useState(false)\n const [showPhonePicker, setShowPhonePicker] = React.useState(false)\n const hasMultipleEmails = (contact.emails?.length ?? 0) > 1\n const hasMultiplePhones = (contact.phones?.length ?? 0) > 1\n const initials = contact.name.split(\" \").map((n) => n[0]).join(\"\")\n\n if (variant === \"alternative\") {\n const detail = showPhone\n ? contact.phone ?? contact.phones?.[0] ?? \"\"\n : contact.email ?? contact.emails?.[0] ?? \"\"\n return (\n <button\n onClick={onSwap}\n className=\"flex items-center gap-3 w-full px-3 py-2 text-left hover:bg-muted/50 rounded-md transition-colors group\"\n >\n <div className=\"w-7 h-7 rounded-full bg-muted flex items-center justify-center text-[10px] font-medium text-muted-foreground shrink-0\">\n {initials}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm text-foreground\">{contact.name}</div>\n <div className=\"text-xs text-muted-foreground truncate\">\n {contact.role}{detail ? ` · ${detail}` : \"\"}\n </div>\n </div>\n <span className=\"text-xs text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\">\n Select\n </span>\n </button>\n )\n }\n\n if (variant === \"secondary\") {\n return (\n <div className=\"flex items-center gap-2 px-2.5 py-1.5 bg-muted/40 rounded-md text-sm group\">\n <span className=\"text-foreground text-xs\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs truncate\">\n {contact.email ?? selectedEmail}\n </span>\n {onRemove && (\n <button\n onClick={onRemove}\n className=\"ml-auto text-muted-foreground hover:text-foreground transition-colors opacity-0 group-hover:opacity-100\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n )\n }\n\n const needsConfirmation = !contact.confirmed && !!onConfirm\n\n return (\n <div\n className={`flex flex-wrap items-start gap-3 rounded-md ${\n needsConfirmation ? \"border border-emerald-200/70 bg-emerald-50/40 p-2.5\" : \"\"\n }`}\n >\n <div className=\"w-8 h-8 rounded-full bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground shrink-0 mt-0.5\">\n {initials}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-sm font-medium text-foreground\">{contact.name}</span>\n <span className=\"text-xs text-muted-foreground\">{contact.role}</span>\n {contact.confirmed && (\n <span className=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-emerald-100 text-emerald-700\">\n <Check className=\"h-3 w-3\" />\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {showPhone ? (\n <>\n <span className=\"text-xs text-muted-foreground\">{selectedPhone}</span>\n {hasMultiplePhones && (\n <div className=\"relative\">\n <button\n onClick={() => setShowPhonePicker(!showPhonePicker)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n {showPhonePicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-background border border-border rounded-md shadow-lg z-10 py-1 min-w-[180px]\">\n {contact.phones!.map((p) => (\n <button\n key={p}\n onClick={() => { setSelectedPhone(p); setShowPhonePicker(false) }}\n className={`w-full text-left px-3 py-1.5 text-xs hover:bg-muted/50 transition-colors ${\n p === selectedPhone ? \"text-foreground font-medium\" : \"text-muted-foreground\"\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n ) : (\n <>\n <span className=\"text-xs text-muted-foreground\">{selectedEmail}</span>\n {hasMultipleEmails && (\n <div className=\"relative\">\n <button\n onClick={() => setShowEmailPicker(!showEmailPicker)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n {showEmailPicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-background border border-border rounded-md shadow-lg z-10 py-1 min-w-[220px]\">\n {contact.emails!.map((e) => (\n <button\n key={e}\n onClick={() => { setSelectedEmail(e); setShowEmailPicker(false) }}\n className={`w-full text-left px-3 py-1.5 text-xs hover:bg-muted/50 transition-colors ${\n e === selectedEmail ? \"text-foreground font-medium\" : \"text-muted-foreground\"\n }`}\n >\n {e}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n {(onRemove || (!contact.confirmed && onConfirm)) && (\n <div className=\"ml-auto flex items-center gap-1.5 shrink-0 self-center\">\n {!contact.confirmed && onConfirm && (\n <button\n onClick={onConfirm}\n className=\"h-7 rounded-md border border-emerald-700 bg-emerald-700 px-2.5 text-xs font-semibold text-white hover:bg-emerald-600 hover:border-emerald-600 transition-colors\"\n >\n Confirm recipient\n </button>\n )}\n {onRemove && (\n <button\n onClick={onRemove}\n className=\"h-7 w-7 inline-flex items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n aria-label=\"Remove contact\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailHeader (Notion Mail style)\n// ---------------------------------------------------------------------------\n\nfunction EmailHeader({\n fromName,\n fromEmail,\n toContacts,\n ccContacts,\n initialSubject = \"\",\n accountContacts,\n bccContacts,\n onAddToContact,\n onRemoveToContact,\n onConfirmToContact,\n onUpdateToContact,\n onCcAdd,\n onCcRemove,\n onBccAdd,\n onBccRemove,\n onOpenAccountDetails,\n onOpenRecentActivity,\n iconMap,\n showSubject = false,\n accountDetailsLabel = \"Account details\",\n}: {\n fromName: string\n fromEmail: string\n toContacts: SuggestedContact[]\n ccContacts?: SuggestedContact[]\n initialSubject?: string\n accountContacts?: SuggestedContact[]\n bccContacts?: SuggestedContact[]\n onAddToContact?: (contact: SuggestedContact) => void\n onRemoveToContact?: (index: number) => void\n onConfirmToContact?: (index: number) => void\n onUpdateToContact?: (index: number, contact: SuggestedContact) => void\n onCcAdd?: (contact: SuggestedContact) => void\n onCcRemove?: (index: number) => void\n onBccAdd?: (contact: SuggestedContact) => void\n onBccRemove?: (index: number) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n iconMap?: SuggestedActionsIconMap\n showSubject?: boolean\n accountDetailsLabel?: string\n}) {\n const hasUnconfirmedTo = toContacts.some((c) => !c.confirmed)\n const [expandedToIndex, setExpandedToIndex] = React.useState<number | null>(null)\n const [showCcBcc, setShowCcBcc] = React.useState(\n !!((ccContacts?.length ?? 0) > 0 || (bccContacts?.length ?? 0) > 0)\n )\n const [manualTo, setManualTo] = React.useState(\"\")\n const [manualCc, setManualCc] = React.useState(\"\")\n const [manualBcc, setManualBcc] = React.useState(\"\")\n const [subject, setSubject] = React.useState(initialSubject)\n\n React.useEffect(() => {\n if ((ccContacts?.length ?? 0) > 0 || (bccContacts?.length ?? 0) > 0) {\n setShowCcBcc(true)\n }\n }, [ccContacts, bccContacts])\n\n return (\n <div className=\"mx-4 mt-3 rounded-md border border-border/60 bg-muted/[0.16] text-sm\">\n <div className=\"flex items-center gap-3 px-4 py-2 border-b border-border/30\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0\">From</span>\n <div className=\"flex items-baseline gap-1.5 min-w-0\">\n <span className=\"text-sm text-foreground\">{fromName}</span>\n <span className=\"text-xs text-muted-foreground truncate\">{fromEmail}</span>\n </div>\n </div>\n\n <div className={`flex items-start gap-3 px-4 py-2 border-b border-border/30 ${hasUnconfirmedTo ? \"bg-amber-50/35\" : \"\"}`}>\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">To</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {toContacts.map((contact, index) => (\n <div\n key={`${contact.name}-${index}`}\n onClick={() => setExpandedToIndex((prev) => (prev === index ? null : index))}\n className={`inline-flex max-w-[300px] cursor-pointer items-start gap-2 rounded-md border px-2 py-1 text-xs ${\n contact.confirmed\n ? \"border-border/80 bg-background text-foreground\"\n : \"border-amber-300 bg-amber-50 text-amber-800\"\n }`}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium leading-none\">{contact.name}</span>\n {contact.confirmed && <Check className=\"h-3 w-3 text-emerald-600\" />}\n </div>\n <div className=\"mt-0.5 truncate text-muted-foreground\">\n {contact.email ?? contact.emails?.[0] ?? \"no email\"}\n </div>\n </div>\n <div className=\"ml-auto flex items-center gap-1\">\n {!contact.confirmed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onConfirmToContact?.(index)\n }}\n className=\"h-6 rounded px-1.5 text-[10px] font-semibold hover:bg-amber-100\"\n >\n Confirm\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemoveToContact?.(index)\n setExpandedToIndex((prev) => (prev === index ? null : prev))\n }}\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/40\"\n aria-label=\"Remove recipient\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n ))}\n <input\n type=\"text\"\n value={manualTo}\n onChange={(e) => setManualTo(e.target.value)}\n placeholder={toContacts.length ? \"Add recipient...\" : \"Type a name or email...\"}\n className=\"min-w-[140px] flex-1 text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualTo.trim()) {\n onAddToContact?.({ name: manualTo.trim(), role: \"\", email: manualTo.trim(), confirmed: true })\n setManualTo(\"\")\n }\n }}\n />\n </div>\n {expandedToIndex !== null && toContacts[expandedToIndex] && (\n <div className=\"mt-2 rounded-md border border-border bg-background px-3 py-2 text-xs text-muted-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"font-medium text-foreground text-sm\">\n {toContacts[expandedToIndex].name}\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const contact = toContacts[expandedToIndex]\n if (contact.salesforceUrl) {\n window.open(contact.salesforceUrl, \"_blank\", \"noopener,noreferrer\")\n } else {\n onOpenAccountDetails?.()\n }\n }}\n className=\"h-7 w-7 inline-flex items-center justify-center rounded-md border border-border bg-background hover:bg-muted/40 transition-colors shrink-0\"\n aria-label=\"Open in Salesforce\"\n >\n {iconMap?.salesforce ? (\n <BrandIcon src={iconMap.salesforce} alt=\"Salesforce\" className=\"w-3.5 h-3.5\" />\n ) : (\n <ExternalLink className=\"w-3.5 h-3.5 text-muted-foreground\" />\n )}\n </button>\n </div>\n {toContacts[expandedToIndex].role && (\n <div className=\"mt-1\">{toContacts[expandedToIndex].role}</div>\n )}\n {(toContacts[expandedToIndex].emails?.length ?? 0) > 0 ? (\n <div className=\"mt-2\">\n <div className=\"text-[11px] text-muted-foreground/70 mb-1\">Send using</div>\n <select\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs text-foreground\"\n value={toContacts[expandedToIndex].email ?? toContacts[expandedToIndex].emails?.[0] ?? \"\"}\n onChange={(e) =>\n onUpdateToContact?.(expandedToIndex, {\n ...toContacts[expandedToIndex],\n email: e.target.value,\n })\n }\n >\n {toContacts[expandedToIndex].emails?.map((emailOption) => (\n <option key={emailOption} value={emailOption}>\n {emailOption}\n </option>\n ))}\n </select>\n </div>\n ) : toContacts[expandedToIndex].email ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].email}</div>\n ) : null}\n {(toContacts[expandedToIndex].phones?.length ?? 0) > 0 ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].phones?.join(\" · \")}</div>\n ) : toContacts[expandedToIndex].phone ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].phone}</div>\n ) : null}\n </div>\n )}\n <div className=\"flex items-center flex-wrap gap-1.5 mt-1.5\">\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onAddToContact?.({ ...c, confirmed: true })}\n onSelectTo={(c) => onAddToContact?.({ ...c, confirmed: true })}\n onSelectCc={(c) => onCcAdd?.({ ...c, confirmed: true })}\n onSelectBcc={(c) => onBccAdd?.({ ...c, confirmed: true })}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\">\n Contacts\n </button>\n }\n />\n )}\n <button\n type=\"button\"\n onClick={onOpenAccountDetails}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n {accountDetailsLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCcBcc(true)}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n Add Cc/Bcc\n </button>\n </div>\n </div>\n </div>\n\n {showCcBcc && (\n <div className=\"flex items-start gap-3 px-4 py-2 border-b border-border/30 animate-in fade-in slide-in-from-top-1 duration-150\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">Cc</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap gap-1.5\">\n {ccContacts?.map((c, i) => (\n <ContactCard key={i} contact={c} variant=\"secondary\" onRemove={() => onCcRemove?.(i)} />\n ))}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={manualCc}\n onChange={(e) => setManualCc(e.target.value)}\n placeholder=\"Add Cc...\"\n className=\"text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 w-28\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualCc.trim()) {\n onCcAdd?.({ name: manualCc.trim(), role: \"\", email: manualCc.trim(), confirmed: true })\n setManualCc(\"\")\n }\n }}\n />\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onCcAdd?.(c)}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Users className=\"w-3 h-3\" />\n </button>\n }\n />\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showCcBcc && (\n <div className=\"flex items-start gap-3 px-4 py-2 border-b border-border/30 animate-in fade-in slide-in-from-top-1 duration-150\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">Bcc</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap gap-1.5\">\n {bccContacts?.map((c, i) => (\n <ContactCard key={`${c.name}-${i}`} contact={c} variant=\"secondary\" onRemove={() => onBccRemove?.(i)} />\n ))}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={manualBcc}\n onChange={(e) => setManualBcc(e.target.value)}\n placeholder=\"Add Bcc...\"\n className=\"text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 w-28\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualBcc.trim()) {\n onBccAdd?.({ name: manualBcc.trim(), role: \"\", email: manualBcc.trim(), confirmed: true })\n setManualBcc(\"\")\n }\n }}\n />\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onBccAdd?.(c)}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Users className=\"w-3 h-3\" />\n </button>\n }\n />\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showSubject && (\n <div className=\"flex items-center gap-3 px-4 py-2 border-b border-border/30\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0\">Subj</span>\n <input\n type=\"text\"\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n placeholder=\"Subject...\"\n className=\"flex-1 text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 font-medium\"\n />\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SignatureBlock\n// ---------------------------------------------------------------------------\n\nfunction SignatureBlock({\n signature,\n enabled,\n onToggle,\n}: {\n signature: string | React.ReactNode\n enabled: boolean\n onToggle: () => void\n}) {\n if (!enabled) {\n return (\n <div className=\"px-3 py-2 border-t border-border/30\">\n <button\n onClick={onToggle}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5\"\n >\n <PenLine className=\"w-3 h-3\" />\n Add signature\n </button>\n </div>\n )\n }\n\n return (\n <div className=\"px-3 py-2 border-t border-border/30 bg-background/40\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs text-muted-foreground/60\">--</span>\n <button onClick={onToggle} className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n Remove\n </button>\n </div>\n <div className=\"text-xs text-muted-foreground/70 whitespace-pre-line leading-relaxed\">\n {signature}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SuggestedActionCard\n// ---------------------------------------------------------------------------\n\nfunction SuggestedActionCard({\n action,\n onDismiss,\n onSend,\n onSaveDraft,\n accountContacts,\n signature,\n onDuplicate,\n onOpenAccountDetails,\n onOpenRecentActivity,\n onMarkComplete,\n onDispatchAgent,\n onFeedback,\n iconMap,\n sendLabel,\n accountDetailsLabel,\n dismissLabel = \"Dismiss\",\n}: {\n action: SuggestedAction\n onDismiss?: (id: number | string) => void\n onSend?: (id: number | string) => void\n onSaveDraft?: (id: number | string) => void\n accountContacts?: SuggestedContact[]\n signature?: string | React.ReactNode\n onDuplicate?: (id: number | string) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n onMarkComplete?: (id: number | string) => void\n onDispatchAgent?: (id: number | string, editedContent?: string, settings?: { aiDisclosureEnabled?: boolean; maxDurationMinutes?: string; callRecordingEnabled?: boolean; recordingNoticeEnabled?: boolean }) => void\n onFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n iconMap?: SuggestedActionsIconMap\n sendLabel?: string\n accountDetailsLabel?: string\n dismissLabel?: string\n}) {\n const isCall = action.type === \"call\"\n const [expanded, setExpanded] = React.useState(action.type === \"email\" || isCall)\n const [content, setContent] = React.useState(\n isCall\n ? action.callMeta?.talkTrack ?? \"\"\n : action.content?.replace(/<\\/p>/gi, \"\\n\\n\").replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<[^>]+>/g, \"\").replace(/\\n\\s*\\n/g, \"\\n\\n\") ?? \"\"\n )\n const [showAiEdit, setShowAiEdit] = React.useState(false)\n const [feedbackOpen, setFeedbackOpen] = React.useState(false)\n const [feedbackDirection, setFeedbackDirection] = React.useState<\"up\" | \"down\" | null>(null)\n const handleThumbClick = (dir: \"up\" | \"down\") => {\n if (feedbackOpen && feedbackDirection === dir) {\n setFeedbackOpen(false); setFeedbackDirection(null)\n } else {\n setFeedbackDirection(dir); setFeedbackOpen(true)\n }\n }\n const [followUpEnabled, setFollowUpEnabled] = React.useState(action.followUp?.enabled ?? false)\n const [threadExpanded, setThreadExpanded] = React.useState(false)\n const [expandedMessageId, setExpandedMessageId] = React.useState<string | null>(null)\n const [replyingToMessageId, setReplyingToMessageId] = React.useState<string | null>(null)\n\n const [ticketPriority, setTicketPriority] = React.useState(action.ticket?.priority ?? \"Medium\")\n const [ticketType, setTicketType] = React.useState(action.ticket?.type ?? \"Support Request\")\n const [ticketSubject, setTicketSubject] = React.useState(action.ticket?.subject ?? \"\")\n const [ticketDescription, setTicketDescription] = React.useState(\n action.ticket?.description?.replace(/<\\/p>/gi, \"\\n\\n\").replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<[^>]+>/g, \"\").trim() ?? \"\"\n )\n\n const [toContacts, setToContacts] = React.useState<SuggestedContact[]>(action.emailMeta?.to ? [action.emailMeta.to] : [])\n const [ccContacts, setCcContacts] = React.useState<SuggestedContact[]>(action.emailMeta?.cc ?? [])\n const [bccContacts, setBccContacts] = React.useState<SuggestedContact[]>(\n action.emailMeta?.bcc\n ? [{ name: action.emailMeta.bcc, role: \"\", email: action.emailMeta.bcc, confirmed: true }]\n : []\n )\n const [callContact, setCallContact] = React.useState<SuggestedContact | undefined>(action.callMeta?.contact)\n const [signatureEnabled, setSignatureEnabled] = React.useState(true)\n \n\n const isNewEmail = action.type === \"email\" && !action.replyTo\n const isThreadReply = action.type === \"email\" && !!action.replyTo\n\n const canSend = isCall\n ? callContact?.confirmed ?? false\n : action.type === \"email\"\n ? toContacts.length > 0 && toContacts.every((contact) => contact.confirmed)\n : true\n\n const openInLabel =\n action.type === \"email\" ? \"Open draft\"\n : action.type === \"ticket\" ? \"Open in Zendesk\"\n : action.type === \"slack\" ? \"Open in Slack\"\n : \"Open in App\"\n\n const addUniqueContact = React.useCallback((prev: SuggestedContact[], contact: SuggestedContact) => {\n const nextKey = `${contact.name}-${contact.email ?? contact.emails?.[0] ?? \"\"}`\n if (prev.some((item) => `${item.name}-${item.email ?? item.emails?.[0] ?? \"\"}` === nextKey)) {\n return prev\n }\n return [...prev, contact]\n }, [])\n\n if (!expanded) {\n return (\n <div\n onClick={() => setExpanded(true)}\n className=\"p-4 flex items-center justify-between cursor-pointer hover:bg-muted/30 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-7 h-7 shrink-0\">\n {getActionTypeIcon(action.type, \"w-5 h-5\", iconMap)}\n </div>\n <div>\n <div className=\"text-sm font-medium text-foreground\">{action.label}</div>\n {action.followUp?.enabled && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground mt-1\">\n <Clock className=\"w-3.5 h-3.5\" />\n <span>Follow-up in {action.followUp.days}d</span>\n </div>\n )}\n </div>\n </div>\n <ChevronDown className=\"w-5 h-5 text-muted-foreground shrink-0\" />\n </div>\n )\n }\n\n return (\n <div className=\"animate-in fade-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"px-4 py-3 flex items-center justify-between bg-background border-b border-border/40\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-7 h-7 shrink-0\">\n {getActionTypeIcon(action.type, \"w-5 h-5\", iconMap)}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">{action.label}</span>\n {isThreadReply && (\n <span className=\"inline-flex items-center gap-1 rounded-md border border-border/80 bg-muted/50 px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n <Undo2 className=\"h-3 w-3\" />\n Reply\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => handleThumbClick(\"up\")}\n className={`p-1.5 rounded transition-colors ${\n feedbackOpen && feedbackDirection === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsUp className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => handleThumbClick(\"down\")}\n className={`p-1.5 rounded transition-colors ${\n feedbackOpen && feedbackDirection === \"down\"\n ? \"bg-red-50 text-red-600 dark:bg-red-950/30 dark:text-red-400\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsDown className=\"w-3.5 h-3.5\" />\n </button>\n <div className=\"w-px h-4 bg-border/40 mx-0.5\" />\n <span className=\"text-xs text-muted-foreground\">4:15 PM</span>\n <button\n onClick={() => setExpanded(false)}\n className=\"text-muted-foreground hover:text-foreground hover:bg-muted/50 p-2 rounded transition-colors\"\n aria-label=\"Collapse\"\n >\n <ChevronUp className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Feedback below header */}\n {feedbackOpen && (\n <div className=\"px-5 py-3 border-b border-border/40 animate-in fade-in slide-in-from-top-2 duration-200\">\n <DraftFeedbackInline\n key={`feedback-${feedbackDirection}`}\n initialDirection={feedbackDirection}\n onRegenerateRequest={(pills, detail) => {\n onFeedback?.(\"down\", pills, detail)\n }}\n onSubmitFeedback={(type, pills, detail) => {\n onFeedback?.(type, pills, detail)\n }}\n onDiscardRequest={(pills, detail) => {\n onFeedback?.(\"down\", pills, detail)\n onDismiss?.(action.id)\n }}\n />\n </div>\n )}\n\n {/* Thread Context (email thread reply only) */}\n {isThreadReply && action.replyTo && (\n <div className=\"border-b border-border/40\">\n {action.threadMessages && action.threadMessages.length > 1 && (\n <div className=\"px-5 py-2 border-b border-border/40\">\n <button\n onClick={() => setThreadExpanded(!threadExpanded)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n {action.threadMessages.length} messages in this thread\n <span className=\"mx-1.5\">·</span>\n <span className=\"underline\">{threadExpanded ? \"Hide thread\" : \"View thread\"}</span>\n </button>\n </div>\n )}\n\n {threadExpanded && action.threadMessages && action.threadMessages.length > 1 ? (\n <div className=\"bg-muted/20\">\n {action.threadMessages.map((msg, idx) => {\n const isExpMsg = expandedMessageId === msg.id\n const isReplyingTo = !replyingToMessageId\n ? idx === action.threadMessages!.length - 1\n : replyingToMessageId === msg.id\n const isLast = idx === action.threadMessages!.length - 1\n\n return (\n <div key={msg.id}>\n <div\n className=\"px-5 py-3 hover:bg-muted/30 cursor-pointer transition-colors group relative\"\n onClick={() => setExpandedMessageId(isExpMsg ? null : msg.id)}\n >\n <div className=\"flex justify-between items-start mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-foreground\">{msg.from}</span>\n {isReplyingTo && (\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <ArrowLeft className=\"w-3 h-3\" />\n Replying to this\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">{msg.time}</span>\n {!isReplyingTo && !isExpMsg && (\n <button\n onClick={(e) => { e.stopPropagation(); setReplyingToMessageId(msg.id) }}\n className=\"text-xs text-muted-foreground hover:text-foreground underline opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n Reply to this\n </button>\n )}\n </div>\n </div>\n <div className={`text-sm text-muted-foreground leading-relaxed ${isExpMsg ? \"\" : \"line-clamp-2\"}`}>\n {isExpMsg ? msg.content : msg.preview}\n </div>\n {isExpMsg && (\n <button\n onClick={(e) => { e.stopPropagation(); setExpandedMessageId(null) }}\n className=\"text-xs text-muted-foreground hover:text-foreground underline mt-2\"\n >\n Collapse\n </button>\n )}\n </div>\n {!isLast && <div className=\"h-px bg-border/40 mx-5\" />}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"px-5 py-3 bg-muted/30\">\n <div className=\"flex justify-between items-start mb-2\">\n <span className=\"text-xs font-semibold text-foreground\">{action.replyTo.from} to Me</span>\n <span className=\"text-xs text-muted-foreground\">{action.replyTo.time}</span>\n </div>\n <div className=\"text-sm text-muted-foreground leading-relaxed line-clamp-3\">{action.replyTo.content}</div>\n </div>\n )}\n </div>\n )}\n\n {/* Reply Context (Slack) */}\n {action.type === \"slack\" && action.replyTo && (\n <div className=\"border-b border-border/40\">\n <div className=\"px-5 py-3 bg-muted/30\">\n <div className=\"flex justify-between items-start mb-2\">\n <span className=\"text-xs font-semibold text-foreground\">{action.replyTo.from} to Me</span>\n <span className=\"text-xs text-muted-foreground\">{action.replyTo.time}</span>\n </div>\n <div className=\"text-sm text-muted-foreground leading-relaxed line-clamp-3\">{action.replyTo.content}</div>\n </div>\n </div>\n )}\n\n {/* EmailHeader */}\n {action.type === \"email\" && action.emailMeta && (\n <div>\n {isThreadReply && (\n <div className=\"mx-4 mt-3 flex items-center gap-1.5 rounded-md border border-border/60 bg-muted/[0.16] px-3 py-1.5 text-xs text-muted-foreground\">\n <Undo2 className=\"h-3 w-3\" />\n Replying in existing thread\n </div>\n )}\n <EmailHeader\n fromName={action.emailMeta.from}\n fromEmail={action.emailMeta.fromEmail}\n toContacts={toContacts}\n ccContacts={ccContacts}\n initialSubject={action.emailMeta.subject}\n accountContacts={accountContacts}\n bccContacts={bccContacts}\n onAddToContact={(c) => setToContacts((prev) => addUniqueContact(prev, c))}\n onRemoveToContact={(index) => setToContacts((prev) => prev.filter((_, idx) => idx !== index))}\n onConfirmToContact={(index) =>\n setToContacts((prev) =>\n prev.map((contact, idx) => (idx === index ? { ...contact, confirmed: true } : contact))\n )\n }\n onUpdateToContact={(index, updatedContact) =>\n setToContacts((prev) =>\n prev.map((contact, idx) => (idx === index ? updatedContact : contact))\n )\n }\n onCcAdd={(c) =>\n setCcContacts((prev) => addUniqueContact(prev, c))\n }\n onCcRemove={(i) => setCcContacts((prev) => prev.filter((_, idx) => idx !== i))}\n onBccAdd={(c) =>\n setBccContacts((prev) => addUniqueContact(prev, c))\n }\n onBccRemove={(i) => setBccContacts((prev) => prev.filter((_, idx) => idx !== i))}\n onOpenAccountDetails={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n showSubject={isNewEmail}\n accountDetailsLabel={accountDetailsLabel}\n />\n </div>\n )}\n\n {/* Call contact card */}\n {isCall && (\n <div className=\"mx-4 mt-3 rounded-md border border-border/60 bg-muted/[0.16] px-3 py-2.5\">\n <div className=\"flex items-start gap-3\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">To</span>\n <div className=\"flex-1 min-w-0\">\n {callContact ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <div\n className={`inline-flex max-w-[300px] items-start gap-2 rounded-md border px-2 py-1 text-xs ${\n callContact.confirmed\n ? \"border-border/80 bg-background text-foreground\"\n : \"border-amber-300 bg-amber-50 text-amber-800\"\n }`}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium leading-none\">{callContact.name}</span>\n {callContact.confirmed && <Check className=\"h-3 w-3 text-emerald-600\" />}\n </div>\n {callContact.role && (\n <div className=\"mt-0.5 truncate text-muted-foreground\">{callContact.role}</div>\n )}\n {(callContact.phone || callContact.phones?.[0]) && (\n <div className=\"mt-0.5 truncate text-muted-foreground\">{callContact.phone ?? callContact.phones?.[0]}</div>\n )}\n </div>\n <div className=\"ml-auto flex items-center gap-1\">\n {!callContact.confirmed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setCallContact({ ...callContact, confirmed: true })\n }}\n className=\"h-6 rounded px-1.5 text-[10px] font-semibold hover:bg-amber-100\"\n >\n Confirm\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setCallContact(undefined)\n }}\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/40\"\n aria-label=\"Remove recipient\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">No contact selected.</div>\n )}\n <div className=\"flex items-center flex-wrap gap-1.5 mt-1.5\">\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => setCallContact({ ...c, confirmed: true })}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\">\n Contacts\n </button>\n }\n />\n )}\n <button\n type=\"button\"\n onClick={onOpenAccountDetails}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n {accountDetailsLabel ?? \"Account details\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n \n\n {/* Content Area */}\n <div>\n {action.type === \"ticket\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Priority</label>\n <select\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketPriority}\n onChange={(e) => setTicketPriority(e.target.value)}\n >\n <option>High</option>\n <option>Medium</option>\n <option>Low</option>\n </select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Type</label>\n <select\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketType}\n onChange={(e) => setTicketType(e.target.value)}\n >\n <option>Churn Risk</option>\n <option>Support Request</option>\n <option>Feature Request</option>\n </select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Subject</label>\n <input\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketSubject}\n onChange={(e) => setTicketSubject(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Description</label>\n <textarea\n className=\"w-full min-h-[100px] px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm resize-none focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketDescription}\n onChange={(e) => setTicketDescription(e.target.value)}\n />\n </div>\n </div>\n ) : isCall ? (\n <div className=\"flex flex-col\">\n <div className=\"px-4 pt-3 pb-3\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Talk track\n </div>\n <div className=\"px-3 pb-3\">\n <textarea\n className=\"w-full min-h-[280px] text-sm leading-relaxed bg-transparent border-none resize-none focus:ring-0 focus:outline-none placeholder:text-muted-foreground/50 p-0 overflow-y-auto\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"Edit talk track...\"\n />\n </div>\n </div>\n </div>\n <EditorToolbar />\n </div>\n ) : action.type === \"manual\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Task description\n </div>\n <div className=\"px-3 pb-3\">\n <p className=\"text-sm leading-relaxed text-foreground whitespace-pre-wrap\">\n {action.manualMeta?.taskDescription ?? action.content ?? \"\"}\n </p>\n </div>\n </div>\n </div>\n ) : action.type === \"browser\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Browser automation\n </div>\n <div className=\"px-3 pb-3 space-y-2\">\n {action.browserMeta?.url && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Globe className=\"w-3.5 h-3.5 shrink-0\" />\n <a href={action.browserMeta.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary underline underline-offset-2 truncate\">\n {action.browserMeta.url}\n </a>\n </div>\n )}\n <p className=\"text-sm leading-relaxed text-foreground whitespace-pre-wrap\">\n {action.browserMeta?.actionDescription ?? action.content ?? \"\"}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n <div className=\"px-4 pt-3 pb-3\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Draft\n </div>\n <div className=\"px-3 pb-3\">\n <textarea\n className=\"w-full min-h-[280px] text-sm leading-relaxed bg-transparent border-none resize-none focus:ring-0 focus:outline-none placeholder:text-muted-foreground/50 p-0 overflow-y-auto\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"Write your message...\"\n />\n </div>\n {action.type === \"email\" && signature && (\n <SignatureBlock signature={signature} enabled={signatureEnabled} onToggle={() => setSignatureEnabled(!signatureEnabled)} />\n )}\n </div>\n </div>\n <EditorToolbar />\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"bg-muted/10 border-t border-border/60\">\n <div className=\"px-5 py-4\">\n {showAiEdit && <AiEditPanel onApply={(pills, desc) => console.log(\"AI Edit:\", pills, desc)} />}\n\n {action.followUp && (\n <div className=\"mb-3\">\n <FollowUpToggle checked={followUpEnabled} onCheckedChange={setFollowUpEnabled} days={action.followUp.days} />\n </div>\n )}\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 overflow-x-auto no-scrollbar\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 ${showAiEdit ? \"bg-muted/50 text-foreground\" : \"\"}`}\n onClick={() => setShowAiEdit(!showAiEdit)}\n >\n AI Edit\n </Button>\n {!isCall && action.type !== \"email\" && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n onClick={() => onSaveDraft?.(action.id)}\n >\n Draft\n </Button>\n )}\n {!isCall && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 whitespace-nowrap\">\n {openInLabel}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n onClick={() => onDismiss?.(action.id)}\n >\n {dismissLabel}\n </Button>\n {action.type === \"email\" && onDuplicate && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 whitespace-nowrap\"\n onClick={() => onDuplicate(action.id)}\n >\n <Copy className=\"w-3 h-3 mr-1.5\" />\n Copy\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 pl-2 shrink-0\">\n <div className=\"w-px h-4 bg-border/60\" />\n {isCall ? (\n <>\n {action.callMeta?.allowDispatchAgent && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium shadow-none\"\n onClick={() => onDispatchAgent?.(action.id, content)}\n disabled={!canSend}\n >\n Dispatch agent\n </Button>\n )}\n <Button\n size=\"sm\"\n className={`px-5 h-9 text-xs font-semibold shadow-sm ${\n canSend\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n onClick={() => canSend && onMarkComplete?.(action.id)}\n disabled={!canSend}\n >\n <Check className=\"w-3.5 h-3.5 mr-1.5\" />\n Mark complete\n </Button>\n </>\n ) : action.type === \"manual\" ? (\n <Button\n size=\"sm\"\n className=\"px-5 h-9 text-xs font-semibold shadow-sm bg-foreground text-background hover:bg-foreground/90\"\n onClick={() => onMarkComplete?.(action.id)}\n >\n <Check className=\"w-3.5 h-3.5 mr-1.5\" />\n Mark complete\n </Button>\n ) : action.type === \"browser\" ? (\n <Button\n size=\"sm\"\n className=\"px-5 h-9 text-xs font-semibold shadow-sm bg-foreground text-background hover:bg-foreground/90\"\n onClick={() => onSend?.(action.id)}\n >\n <Globe className=\"w-3.5 h-3.5 mr-1.5\" />\n {sendLabel ?? \"Run\"}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n className={`px-6 h-9 text-xs font-semibold shadow-sm ${\n canSend\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n onClick={() => canSend && onSend?.(action.id)}\n disabled={!canSend}\n >\n {sendLabel ?? \"Send\"}\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SuggestedActions (public API)\n// ---------------------------------------------------------------------------\n\nexport interface SuggestedActionsProps {\n actions: SuggestedAction[]\n title?: string\n onDismiss?: (id: number | string) => void\n onSend?: (id: number | string) => void\n onSaveDraft?: (id: number | string) => void\n accountContacts?: SuggestedContact[]\n signature?: string | React.ReactNode\n onDuplicate?: (id: number | string) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n onMarkComplete?: (id: number | string) => void\n onDispatchAgent?: (id: number | string, editedContent?: string, settings?: { aiDisclosureEnabled?: boolean; maxDurationMinutes?: string; callRecordingEnabled?: boolean; recordingNoticeEnabled?: boolean }) => void\n iconMap?: SuggestedActionsIconMap\n sendLabel?: string\n accountDetailsLabel?: string\n dismissLabel?: string\n}\n\nexport function SuggestedActions({\n actions,\n title = \"Suggested Actions\",\n onDismiss,\n onSend,\n onSaveDraft,\n accountContacts,\n signature,\n onDuplicate,\n onOpenAccountDetails,\n onOpenRecentActivity,\n onMarkComplete,\n onDispatchAgent,\n iconMap,\n sendLabel,\n accountDetailsLabel,\n dismissLabel,\n}: SuggestedActionsProps) {\n const [dismissedIds, setDismissedIds] = React.useState<Set<number | string>>(new Set())\n\n const handleDismiss = React.useCallback(\n (id: number | string) => {\n setDismissedIds((prev) => new Set([...prev, id]))\n onDismiss?.(id)\n },\n [onDismiss]\n )\n\n const visibleActions = actions.filter((a) => a.status !== \"dismissed\" && !dismissedIds.has(a.id))\n\n return (\n <div className=\"py-6 border-t border-border\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"text-[11px] font-bold text-muted-foreground/70 uppercase tracking-wider\">{title}</div>\n <span className=\"text-[11px] text-muted-foreground\">{visibleActions.length} actions</span>\n </div>\n\n <div className=\"space-y-4\">\n {visibleActions.map((action) => (\n <div\n key={action.id}\n className=\"group bg-background border border-border rounded-md overflow-hidden shadow-sm hover:shadow-md transition-all duration-200\"\n >\n <SuggestedActionCard\n action={action}\n onDismiss={handleDismiss}\n onSend={onSend}\n onSaveDraft={onSaveDraft}\n accountContacts={accountContacts}\n signature={signature}\n onDuplicate={onDuplicate}\n onOpenAccountDetails={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n onMarkComplete={onMarkComplete}\n onDispatchAgent={onDispatchAgent}\n onFeedback={action.onFeedback}\n iconMap={iconMap}\n sendLabel={sendLabel}\n accountDetailsLabel={accountDetailsLabel}\n dismissLabel={dismissLabel}\n />\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["_a","_b","_c"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/suggested-actions.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDown,\n ChevronUp,\n Clock,\n MessageSquare,\n Undo2,\n Redo2,\n Bold,\n Italic,\n Underline,\n AlignLeft,\n List,\n Trash,\n Sparkles,\n ThumbsUp,\n ThumbsDown,\n Check,\n ArrowLeft,\n Mail,\n Phone,\n X,\n Users,\n ExternalLink,\n Copy,\n PenLine,\n ClipboardList,\n Globe,\n} from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { DraftFeedbackInline } from \"./draft-feedback-inline\"\nimport { AccountContactsPopover, BrandIcon } from \"./account-contacts-popover\"\n\nexport interface SuggestedActionsIconMap {\n gmail?: string\n slack?: string\n zendesk?: string\n salesforce?: string\n}\n\nfunction getActionTypeIcon(type: string, className?: string, iconMap?: SuggestedActionsIconMap) {\n switch (type) {\n case \"email\":\n return iconMap?.gmail\n ? <BrandIcon src={iconMap.gmail} alt=\"Gmail\" className={className} />\n : <Mail className={className} />\n case \"slack\":\n return iconMap?.slack\n ? <BrandIcon src={iconMap.slack} alt=\"Slack\" className={className} />\n : <MessageSquare className={className} />\n case \"ticket\":\n return iconMap?.zendesk\n ? <BrandIcon src={iconMap.zendesk} alt=\"Zendesk\" className={className} />\n : <MessageSquare className={className} />\n case \"call\":\n return <Phone className={className} />\n case \"manual\":\n return <ClipboardList className={className} />\n case \"browser\":\n return <Globe className={className} />\n default:\n return <Mail className={className} />\n }\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SuggestedContact {\n name: string\n role: string\n email?: string\n emails?: string[]\n phone?: string\n phones?: string[]\n confirmed: boolean\n salesforceUrl?: string\n lastActivity?: {\n date: string\n type: string\n }\n}\n\nexport interface SuggestedActionThreadMessage {\n id: string\n from: string\n initials: string\n time: string\n preview: string\n content: string\n}\n\nexport interface SuggestedActionReplyTo {\n from: string\n time: string\n content: string\n channel?: string\n}\n\nexport interface SuggestedActionTicket {\n system: string\n priority: string\n type: string\n subject: string\n description: string\n assignee?: string\n tags?: string[]\n}\n\nexport interface SuggestedActionFollowUp {\n enabled: boolean\n days: number\n}\n\nexport interface SuggestedActionEmailMeta {\n from: string\n fromEmail: string\n to?: SuggestedContact\n cc?: SuggestedContact[]\n bcc?: string\n subject?: string\n}\n\nexport interface SuggestedActionCallMeta {\n contact?: SuggestedContact\n talkTrack: string\n allowDispatchAgent?: boolean\n}\n\nexport interface SuggestedActionManualMeta {\n taskDescription: string\n}\n\nexport interface SuggestedActionBrowserMeta {\n url: string\n actionDescription: string\n}\n\nexport interface SuggestedAction {\n id: number | string\n type: \"email\" | \"ticket\" | \"slack\" | \"call\" | \"manual\" | \"browser\"\n label: string\n status: \"pending\" | \"sent\" | \"dismissed\"\n content?: string\n replyTo?: SuggestedActionReplyTo\n threadMessages?: SuggestedActionThreadMessage[]\n ticket?: SuggestedActionTicket\n followUp?: SuggestedActionFollowUp\n emailMeta?: SuggestedActionEmailMeta\n callMeta?: SuggestedActionCallMeta\n manualMeta?: SuggestedActionManualMeta\n browserMeta?: SuggestedActionBrowserMeta\n onFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n}\n\n// ---------------------------------------------------------------------------\n// AiEditPanel\n// ---------------------------------------------------------------------------\n\nconst aiEditPills = [\"Shorten it\", \"Make sound more like me\", \"Make longer\", \"Other\"]\n\nfunction AiEditPanel({ onApply }: { onApply?: (pills: string[], description: string) => void }) {\n const [selectedPills, setSelectedPills] = React.useState<string[]>([])\n const [description, setDescription] = React.useState(\"\")\n const [applying, setApplying] = React.useState(false)\n\n const togglePill = React.useCallback((pill: string) => {\n setSelectedPills((prev) => (prev.includes(pill) ? prev.filter((p) => p !== pill) : [...prev, pill]))\n }, [])\n\n const handleApply = React.useCallback(() => {\n if (selectedPills.length === 0 && description.trim().length === 0) return\n setApplying(true)\n onApply?.(selectedPills, description)\n setTimeout(() => {\n setApplying(false)\n setSelectedPills([])\n setDescription(\"\")\n }, 2000)\n }, [selectedPills, description, onApply])\n\n const hasInput = selectedPills.length > 0 || description.trim().length > 0\n\n return (\n <div className=\"mb-4 space-y-2.5 animate-in fade-in slide-in-from-top-2 duration-200\">\n <div className=\"flex flex-wrap gap-1.5\">\n {aiEditPills.map((pill) => (\n <button\n key={pill}\n onClick={() => togglePill(pill)}\n className={`px-2.5 py-1 rounded-full text-[11px] font-medium border transition-colors ${\n selectedPills.includes(pill)\n ? \"bg-indigo-100 text-indigo-700 border-indigo-200 dark:bg-indigo-900/30 dark:text-indigo-300 dark:border-indigo-800\"\n : \"bg-background text-muted-foreground border-border hover:bg-muted/50 hover:text-foreground\"\n }`}\n >\n {pill}\n </button>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n className=\"flex-1 px-3 py-2 text-sm bg-background border border-border rounded-md focus:outline-none focus:ring-1 focus:ring-indigo-500 transition-colors placeholder:text-muted-foreground/50\"\n placeholder=\"Describe changes...\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && hasInput) handleApply()\n }}\n />\n <button\n onClick={handleApply}\n disabled={!hasInput || applying}\n className={`px-4 h-9 rounded-md text-xs font-semibold transition-colors flex items-center gap-1.5 shrink-0 ${\n hasInput && !applying\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n >\n {applying ? (\n <>\n <Sparkles className=\"w-3 h-3 animate-pulse\" />\n Applying...\n </>\n ) : (\n \"Apply\"\n )}\n </button>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EditorToolbar\n// ---------------------------------------------------------------------------\n\nfunction EditorToolbar() {\n return (\n <div className=\"flex items-center gap-1 px-4 py-2 border-t border-border bg-muted/5 flex-wrap\">\n <div className=\"flex items-center mr-2 gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Undo2 className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Redo2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs font-medium text-muted-foreground gap-1 px-2 hover:text-foreground shrink-0\">\n Sans Serif <ChevronDown className=\"h-3 w-3\" />\n </Button>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Bold className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Italic className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <Underline className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"w-px h-4 bg-border mx-1 shrink-0\" />\n <div className=\"flex items-center gap-1 shrink-0\">\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <AlignLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-foreground\">\n <List className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"flex-1\" />\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7 text-muted-foreground hover:text-red-600 hover:bg-red-50 shrink-0 ml-auto\">\n <Trash className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// FollowUpToggle (simple checkbox-based switch)\n// ---------------------------------------------------------------------------\n\nfunction FollowUpToggle({\n checked,\n onCheckedChange,\n days,\n}: {\n checked: boolean\n onCheckedChange: (checked: boolean) => void\n days: number\n}) {\n return (\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm text-foreground\">\n <Clock className=\"w-4 h-4 text-muted-foreground\" />\n <span>Auto-draft follow-up in {days}d if no response</span>\n </div>\n <button\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onCheckedChange(!checked)}\n className={`relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors ${\n checked ? \"bg-foreground\" : \"bg-muted\"\n }`}\n >\n <span\n className={`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-sm transition-transform ${\n checked ? \"translate-x-4\" : \"translate-x-0\"\n }`}\n />\n </button>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// ContactCard\n// ---------------------------------------------------------------------------\n\nfunction ContactCard({\n contact,\n onConfirm,\n onRemove,\n onSwap,\n variant = \"primary\",\n showPhone = false,\n}: {\n contact: SuggestedContact\n onConfirm?: () => void\n onRemove?: () => void\n onSwap?: () => void\n variant?: \"primary\" | \"secondary\" | \"alternative\"\n showPhone?: boolean\n}) {\n const [selectedEmail, setSelectedEmail] = React.useState(\n contact.email ?? contact.emails?.[0] ?? \"\"\n )\n const [selectedPhone, setSelectedPhone] = React.useState(\n contact.phone ?? contact.phones?.[0] ?? \"\"\n )\n const [showEmailPicker, setShowEmailPicker] = React.useState(false)\n const [showPhonePicker, setShowPhonePicker] = React.useState(false)\n const hasMultipleEmails = (contact.emails?.length ?? 0) > 1\n const hasMultiplePhones = (contact.phones?.length ?? 0) > 1\n const initials = contact.name.split(\" \").map((n) => n[0]).join(\"\")\n\n if (variant === \"alternative\") {\n const detail = showPhone\n ? contact.phone ?? contact.phones?.[0] ?? \"\"\n : contact.email ?? contact.emails?.[0] ?? \"\"\n return (\n <button\n onClick={onSwap}\n className=\"flex items-center gap-3 w-full px-3 py-2 text-left hover:bg-muted/50 rounded-md transition-colors group\"\n >\n <div className=\"w-7 h-7 rounded-full bg-muted flex items-center justify-center text-[10px] font-medium text-muted-foreground shrink-0\">\n {initials}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-sm text-foreground\">{contact.name}</div>\n <div className=\"text-xs text-muted-foreground truncate\">\n {contact.role}{detail ? ` · ${detail}` : \"\"}\n </div>\n </div>\n <span className=\"text-xs text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity\">\n Select\n </span>\n </button>\n )\n }\n\n if (variant === \"secondary\") {\n return (\n <div className=\"flex items-center gap-2 px-2.5 py-1.5 bg-muted/40 rounded-md text-sm group\">\n <span className=\"text-foreground text-xs\">{contact.name}</span>\n <span className=\"text-muted-foreground text-xs truncate\">\n {contact.email ?? selectedEmail}\n </span>\n {onRemove && (\n <button\n onClick={onRemove}\n className=\"ml-auto text-muted-foreground hover:text-foreground transition-colors opacity-0 group-hover:opacity-100\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n )\n }\n\n const needsConfirmation = !contact.confirmed && !!onConfirm\n\n return (\n <div\n className={`flex flex-wrap items-start gap-3 rounded-md ${\n needsConfirmation ? \"border border-emerald-200/70 bg-emerald-50/40 p-2.5\" : \"\"\n }`}\n >\n <div className=\"w-8 h-8 rounded-full bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground shrink-0 mt-0.5\">\n {initials}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-sm font-medium text-foreground\">{contact.name}</span>\n <span className=\"text-xs text-muted-foreground\">{contact.role}</span>\n {contact.confirmed && (\n <span className=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-emerald-100 text-emerald-700\">\n <Check className=\"h-3 w-3\" />\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n {showPhone ? (\n <>\n <span className=\"text-xs text-muted-foreground\">{selectedPhone}</span>\n {hasMultiplePhones && (\n <div className=\"relative\">\n <button\n onClick={() => setShowPhonePicker(!showPhonePicker)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n {showPhonePicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-background border border-border rounded-md shadow-lg z-10 py-1 min-w-[180px]\">\n {contact.phones!.map((p) => (\n <button\n key={p}\n onClick={() => { setSelectedPhone(p); setShowPhonePicker(false) }}\n className={`w-full text-left px-3 py-1.5 text-xs hover:bg-muted/50 transition-colors ${\n p === selectedPhone ? \"text-foreground font-medium\" : \"text-muted-foreground\"\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n ) : (\n <>\n <span className=\"text-xs text-muted-foreground\">{selectedEmail}</span>\n {hasMultipleEmails && (\n <div className=\"relative\">\n <button\n onClick={() => setShowEmailPicker(!showEmailPicker)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ChevronDown className=\"w-3 h-3\" />\n </button>\n {showEmailPicker && (\n <div className=\"absolute top-full left-0 mt-1 bg-background border border-border rounded-md shadow-lg z-10 py-1 min-w-[220px]\">\n {contact.emails!.map((e) => (\n <button\n key={e}\n onClick={() => { setSelectedEmail(e); setShowEmailPicker(false) }}\n className={`w-full text-left px-3 py-1.5 text-xs hover:bg-muted/50 transition-colors ${\n e === selectedEmail ? \"text-foreground font-medium\" : \"text-muted-foreground\"\n }`}\n >\n {e}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n {(onRemove || (!contact.confirmed && onConfirm)) && (\n <div className=\"ml-auto flex items-center gap-1.5 shrink-0 self-center\">\n {!contact.confirmed && onConfirm && (\n <button\n onClick={onConfirm}\n className=\"h-7 rounded-md border border-emerald-700 bg-emerald-700 px-2.5 text-xs font-semibold text-white hover:bg-emerald-600 hover:border-emerald-600 transition-colors\"\n >\n Confirm recipient\n </button>\n )}\n {onRemove && (\n <button\n onClick={onRemove}\n className=\"h-7 w-7 inline-flex items-center justify-center rounded-md border border-border bg-background text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n aria-label=\"Remove contact\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// EmailHeader (Notion Mail style)\n// ---------------------------------------------------------------------------\n\nfunction EmailHeader({\n fromName,\n fromEmail,\n toContacts,\n ccContacts,\n initialSubject = \"\",\n accountContacts,\n bccContacts,\n onAddToContact,\n onRemoveToContact,\n onConfirmToContact,\n onUpdateToContact,\n onCcAdd,\n onCcRemove,\n onBccAdd,\n onBccRemove,\n onOpenAccountDetails,\n onOpenRecentActivity,\n iconMap,\n showSubject = false,\n accountDetailsLabel = \"Account details\",\n}: {\n fromName: string\n fromEmail: string\n toContacts: SuggestedContact[]\n ccContacts?: SuggestedContact[]\n initialSubject?: string\n accountContacts?: SuggestedContact[]\n bccContacts?: SuggestedContact[]\n onAddToContact?: (contact: SuggestedContact) => void\n onRemoveToContact?: (index: number) => void\n onConfirmToContact?: (index: number) => void\n onUpdateToContact?: (index: number, contact: SuggestedContact) => void\n onCcAdd?: (contact: SuggestedContact) => void\n onCcRemove?: (index: number) => void\n onBccAdd?: (contact: SuggestedContact) => void\n onBccRemove?: (index: number) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n iconMap?: SuggestedActionsIconMap\n showSubject?: boolean\n accountDetailsLabel?: string\n}) {\n const hasUnconfirmedTo = toContacts.some((c) => !c.confirmed)\n const [expandedToIndex, setExpandedToIndex] = React.useState<number | null>(null)\n const [showCcBcc, setShowCcBcc] = React.useState(\n !!((ccContacts?.length ?? 0) > 0 || (bccContacts?.length ?? 0) > 0)\n )\n const [manualTo, setManualTo] = React.useState(\"\")\n const [manualCc, setManualCc] = React.useState(\"\")\n const [manualBcc, setManualBcc] = React.useState(\"\")\n const [subject, setSubject] = React.useState(initialSubject)\n\n React.useEffect(() => {\n if ((ccContacts?.length ?? 0) > 0 || (bccContacts?.length ?? 0) > 0) {\n setShowCcBcc(true)\n }\n }, [ccContacts, bccContacts])\n\n return (\n <div className=\"mx-4 mt-3 rounded-md border border-border/60 bg-muted/[0.16] text-sm\">\n <div className=\"flex items-center gap-3 px-4 py-2 border-b border-border/30\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0\">From</span>\n <div className=\"flex items-baseline gap-1.5 min-w-0\">\n <span className=\"text-sm text-foreground\">{fromName}</span>\n <span className=\"text-xs text-muted-foreground truncate\">{fromEmail}</span>\n </div>\n </div>\n\n <div className={`flex items-start gap-3 px-4 py-2 border-b border-border/30 ${hasUnconfirmedTo ? \"bg-amber-50/35\" : \"\"}`}>\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">To</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {toContacts.map((contact, index) => (\n <div\n key={`${contact.name}-${index}`}\n onClick={() => setExpandedToIndex((prev) => (prev === index ? null : index))}\n className={`inline-flex max-w-[300px] cursor-pointer items-start gap-2 rounded-md border px-2 py-1 text-xs ${\n contact.confirmed\n ? \"border-border/80 bg-background text-foreground\"\n : \"border-amber-300 bg-amber-50 text-amber-800\"\n }`}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium leading-none\">{contact.name}</span>\n {contact.confirmed && <Check className=\"h-3 w-3 text-emerald-600\" />}\n </div>\n <div className=\"mt-0.5 truncate text-muted-foreground\">\n {contact.email ?? contact.emails?.[0] ?? \"no email\"}\n </div>\n </div>\n <div className=\"ml-auto flex items-center gap-1\">\n {!contact.confirmed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onConfirmToContact?.(index)\n }}\n className=\"h-6 rounded px-1.5 text-[10px] font-semibold hover:bg-amber-100\"\n >\n Confirm\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemoveToContact?.(index)\n setExpandedToIndex((prev) => (prev === index ? null : prev))\n }}\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/40\"\n aria-label=\"Remove recipient\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n ))}\n <input\n type=\"text\"\n value={manualTo}\n onChange={(e) => setManualTo(e.target.value)}\n placeholder={toContacts.length ? \"Add recipient...\" : \"Type a name or email...\"}\n className=\"min-w-[140px] flex-1 text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualTo.trim()) {\n onAddToContact?.({ name: manualTo.trim(), role: \"\", email: manualTo.trim(), confirmed: true })\n setManualTo(\"\")\n }\n }}\n />\n </div>\n {expandedToIndex !== null && toContacts[expandedToIndex] && (\n <div className=\"mt-2 rounded-md border border-border bg-background px-3 py-2 text-xs text-muted-foreground\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"font-medium text-foreground text-sm\">\n {toContacts[expandedToIndex].name}\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const contact = toContacts[expandedToIndex]\n if (contact.salesforceUrl) {\n window.open(contact.salesforceUrl, \"_blank\", \"noopener,noreferrer\")\n } else {\n onOpenAccountDetails?.()\n }\n }}\n className=\"h-7 w-7 inline-flex items-center justify-center rounded-md border border-border bg-background hover:bg-muted/40 transition-colors shrink-0\"\n aria-label=\"Open in Salesforce\"\n >\n {iconMap?.salesforce ? (\n <BrandIcon src={iconMap.salesforce} alt=\"Salesforce\" className=\"w-3.5 h-3.5\" />\n ) : (\n <ExternalLink className=\"w-3.5 h-3.5 text-muted-foreground\" />\n )}\n </button>\n </div>\n {toContacts[expandedToIndex].role && (\n <div className=\"mt-1\">{toContacts[expandedToIndex].role}</div>\n )}\n {(toContacts[expandedToIndex].emails?.length ?? 0) > 0 ? (\n <div className=\"mt-2\">\n <div className=\"text-[11px] text-muted-foreground/70 mb-1\">Send using</div>\n <select\n className=\"h-8 rounded-md border border-border bg-background px-2 text-xs text-foreground\"\n value={toContacts[expandedToIndex].email ?? toContacts[expandedToIndex].emails?.[0] ?? \"\"}\n onChange={(e) =>\n onUpdateToContact?.(expandedToIndex, {\n ...toContacts[expandedToIndex],\n email: e.target.value,\n })\n }\n >\n {toContacts[expandedToIndex].emails?.map((emailOption) => (\n <option key={emailOption} value={emailOption}>\n {emailOption}\n </option>\n ))}\n </select>\n </div>\n ) : toContacts[expandedToIndex].email ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].email}</div>\n ) : null}\n {(toContacts[expandedToIndex].phones?.length ?? 0) > 0 ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].phones?.join(\" · \")}</div>\n ) : toContacts[expandedToIndex].phone ? (\n <div className=\"mt-1\">{toContacts[expandedToIndex].phone}</div>\n ) : null}\n </div>\n )}\n <div className=\"flex items-center flex-wrap gap-1.5 mt-1.5\">\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onAddToContact?.({ ...c, confirmed: true })}\n onSelectTo={(c) => onAddToContact?.({ ...c, confirmed: true })}\n onSelectCc={(c) => onCcAdd?.({ ...c, confirmed: true })}\n onSelectBcc={(c) => onBccAdd?.({ ...c, confirmed: true })}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\">\n Contacts\n </button>\n }\n />\n )}\n <button\n type=\"button\"\n onClick={onOpenAccountDetails}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n {accountDetailsLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCcBcc(true)}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n Add Cc/Bcc\n </button>\n </div>\n </div>\n </div>\n\n {showCcBcc && (\n <div className=\"flex items-start gap-3 px-4 py-2 border-b border-border/30 animate-in fade-in slide-in-from-top-1 duration-150\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">Cc</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap gap-1.5\">\n {ccContacts?.map((c, i) => (\n <ContactCard key={i} contact={c} variant=\"secondary\" onRemove={() => onCcRemove?.(i)} />\n ))}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={manualCc}\n onChange={(e) => setManualCc(e.target.value)}\n placeholder=\"Add Cc...\"\n className=\"text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 w-28\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualCc.trim()) {\n onCcAdd?.({ name: manualCc.trim(), role: \"\", email: manualCc.trim(), confirmed: true })\n setManualCc(\"\")\n }\n }}\n />\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onCcAdd?.(c)}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Users className=\"w-3 h-3\" />\n </button>\n }\n />\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showCcBcc && (\n <div className=\"flex items-start gap-3 px-4 py-2 border-b border-border/30 animate-in fade-in slide-in-from-top-1 duration-150\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">Bcc</span>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap gap-1.5\">\n {bccContacts?.map((c, i) => (\n <ContactCard key={`${c.name}-${i}`} contact={c} variant=\"secondary\" onRemove={() => onBccRemove?.(i)} />\n ))}\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={manualBcc}\n onChange={(e) => setManualBcc(e.target.value)}\n placeholder=\"Add Bcc...\"\n className=\"text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 w-28\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && manualBcc.trim()) {\n onBccAdd?.({ name: manualBcc.trim(), role: \"\", email: manualBcc.trim(), confirmed: true })\n setManualBcc(\"\")\n }\n }}\n />\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => onBccAdd?.(c)}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n <Users className=\"w-3 h-3\" />\n </button>\n }\n />\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {showSubject && (\n <div className=\"flex items-center gap-3 px-4 py-2 border-b border-border/30\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0\">Subj</span>\n <input\n type=\"text\"\n value={subject}\n onChange={(e) => setSubject(e.target.value)}\n placeholder=\"Subject...\"\n className=\"flex-1 text-sm bg-transparent border-none focus:outline-none focus:ring-0 placeholder:text-muted-foreground/40 py-1 font-medium\"\n />\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SignatureBlock\n// ---------------------------------------------------------------------------\n\nfunction SignatureBlock({\n signature,\n enabled,\n onToggle,\n}: {\n signature: string | React.ReactNode\n enabled: boolean\n onToggle: () => void\n}) {\n if (!enabled) {\n return (\n <div className=\"px-3 py-2 border-t border-border/30\">\n <button\n onClick={onToggle}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors flex items-center gap-1.5\"\n >\n <PenLine className=\"w-3 h-3\" />\n Add signature\n </button>\n </div>\n )\n }\n\n return (\n <div className=\"px-3 py-2 border-t border-border/30 bg-background/40\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs text-muted-foreground/60\">--</span>\n <button onClick={onToggle} className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\">\n Remove\n </button>\n </div>\n <div className=\"text-xs text-muted-foreground/70 whitespace-pre-line leading-relaxed\">\n {signature}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SuggestedActionCard\n// ---------------------------------------------------------------------------\n\nfunction SuggestedActionCard({\n action,\n onDismiss,\n onSend,\n onSaveDraft,\n accountContacts,\n signature,\n onDuplicate,\n onOpenAccountDetails,\n onOpenRecentActivity,\n onMarkComplete,\n onDispatchAgent,\n onFeedback,\n iconMap,\n sendLabel,\n accountDetailsLabel,\n dismissLabel = \"Dismiss\",\n}: {\n action: SuggestedAction\n onDismiss?: (id: number | string) => void\n onSend?: (id: number | string) => void\n onSaveDraft?: (id: number | string) => void\n accountContacts?: SuggestedContact[]\n signature?: string | React.ReactNode\n onDuplicate?: (id: number | string) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n onMarkComplete?: (id: number | string) => void\n onDispatchAgent?: (id: number | string, editedContent?: string, settings?: { aiDisclosureEnabled?: boolean; maxDurationMinutes?: string; callRecordingEnabled?: boolean; recordingNoticeEnabled?: boolean }) => void\n onFeedback?: (type: \"up\" | \"down\", pills: string[], detail: string) => void\n iconMap?: SuggestedActionsIconMap\n sendLabel?: string\n accountDetailsLabel?: string\n dismissLabel?: string\n}) {\n const isCall = action.type === \"call\"\n const [expanded, setExpanded] = React.useState(action.type === \"email\" || isCall)\n const [content, setContent] = React.useState(\n isCall\n ? action.callMeta?.talkTrack ?? \"\"\n : action.content?.replace(/<\\/p>/gi, \"\\n\\n\").replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<[^>]+>/g, \"\").replace(/\\n\\s*\\n/g, \"\\n\\n\") ?? \"\"\n )\n const [showAiEdit, setShowAiEdit] = React.useState(false)\n const [feedbackOpen, setFeedbackOpen] = React.useState(false)\n const [feedbackDirection, setFeedbackDirection] = React.useState<\"up\" | \"down\" | null>(null)\n const handleThumbClick = (dir: \"up\" | \"down\") => {\n if (feedbackOpen && feedbackDirection === dir) {\n setFeedbackOpen(false); setFeedbackDirection(null)\n } else {\n setFeedbackDirection(dir); setFeedbackOpen(true)\n }\n }\n const [followUpEnabled, setFollowUpEnabled] = React.useState(action.followUp?.enabled ?? false)\n const [threadExpanded, setThreadExpanded] = React.useState(false)\n const [expandedMessageId, setExpandedMessageId] = React.useState<string | null>(null)\n const [replyingToMessageId, setReplyingToMessageId] = React.useState<string | null>(null)\n\n const [ticketPriority, setTicketPriority] = React.useState(action.ticket?.priority ?? \"Medium\")\n const [ticketType, setTicketType] = React.useState(action.ticket?.type ?? \"Support Request\")\n const [ticketSubject, setTicketSubject] = React.useState(action.ticket?.subject ?? \"\")\n const [ticketDescription, setTicketDescription] = React.useState(\n action.ticket?.description?.replace(/<\\/p>/gi, \"\\n\\n\").replace(/<br\\s*\\/?>/gi, \"\\n\").replace(/<[^>]+>/g, \"\").trim() ?? \"\"\n )\n\n const [toContacts, setToContacts] = React.useState<SuggestedContact[]>(action.emailMeta?.to ? [action.emailMeta.to] : [])\n const [ccContacts, setCcContacts] = React.useState<SuggestedContact[]>(action.emailMeta?.cc ?? [])\n const [bccContacts, setBccContacts] = React.useState<SuggestedContact[]>(\n action.emailMeta?.bcc\n ? [{ name: action.emailMeta.bcc, role: \"\", email: action.emailMeta.bcc, confirmed: true }]\n : []\n )\n const [callContact, setCallContact] = React.useState<SuggestedContact | undefined>(action.callMeta?.contact)\n const [signatureEnabled, setSignatureEnabled] = React.useState(true)\n \n\n const isNewEmail = action.type === \"email\" && !action.replyTo\n const isThreadReply = action.type === \"email\" && !!action.replyTo\n\n const canSend = isCall\n ? callContact?.confirmed ?? false\n : action.type === \"email\"\n ? toContacts.length > 0 && toContacts.every((contact) => contact.confirmed)\n : true\n\n const openInLabel =\n action.type === \"email\" ? \"Open draft\"\n : action.type === \"ticket\" ? \"Open in Zendesk\"\n : action.type === \"slack\" ? \"Open in Slack\"\n : \"Open in App\"\n\n const addUniqueContact = React.useCallback((prev: SuggestedContact[], contact: SuggestedContact) => {\n const nextKey = `${contact.name}-${contact.email ?? contact.emails?.[0] ?? \"\"}`\n if (prev.some((item) => `${item.name}-${item.email ?? item.emails?.[0] ?? \"\"}` === nextKey)) {\n return prev\n }\n return [...prev, contact]\n }, [])\n\n if (!expanded) {\n return (\n <div\n onClick={() => setExpanded(true)}\n className=\"p-4 flex items-center justify-between cursor-pointer hover:bg-muted/30 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-7 h-7 shrink-0\">\n {getActionTypeIcon(action.type, \"w-5 h-5\", iconMap)}\n </div>\n <div>\n <div className=\"text-sm font-medium text-foreground\">{action.label}</div>\n {action.followUp?.enabled && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground mt-1\">\n <Clock className=\"w-3.5 h-3.5\" />\n <span>Follow-up in {action.followUp.days}d</span>\n </div>\n )}\n </div>\n </div>\n <ChevronDown className=\"w-5 h-5 text-muted-foreground shrink-0\" />\n </div>\n )\n }\n\n return (\n <div className=\"animate-in fade-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"px-4 py-3 flex items-center justify-between bg-background border-b border-border/40\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center justify-center w-7 h-7 shrink-0\">\n {getActionTypeIcon(action.type, \"w-5 h-5\", iconMap)}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">{action.label}</span>\n {isThreadReply && (\n <span className=\"inline-flex items-center gap-1 rounded-md border border-border/80 bg-muted/50 px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n <Undo2 className=\"h-3 w-3\" />\n Reply\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => handleThumbClick(\"up\")}\n className={`p-1.5 rounded transition-colors ${\n feedbackOpen && feedbackDirection === \"up\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsUp className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => handleThumbClick(\"down\")}\n className={`p-1.5 rounded transition-colors ${\n feedbackOpen && feedbackDirection === \"down\"\n ? \"bg-muted text-foreground\"\n : \"hover:bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n <ThumbsDown className=\"w-3.5 h-3.5\" />\n </button>\n <div className=\"w-px h-4 bg-border/40 mx-0.5\" />\n <span className=\"text-xs text-muted-foreground\">4:15 PM</span>\n <button\n onClick={() => setExpanded(false)}\n className=\"text-muted-foreground hover:text-foreground hover:bg-muted/50 p-2 rounded transition-colors\"\n aria-label=\"Collapse\"\n >\n <ChevronUp className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Feedback below header */}\n {feedbackOpen && (\n <div className=\"px-5 py-3 border-b border-border/40 animate-in fade-in slide-in-from-top-2 duration-200\">\n <DraftFeedbackInline\n key={`feedback-${feedbackDirection}`}\n initialDirection={feedbackDirection}\n onRegenerateRequest={(pills, detail) => {\n onFeedback?.(\"down\", pills, detail)\n }}\n onSubmitFeedback={(type, pills, detail) => {\n onFeedback?.(type, pills, detail)\n }}\n onDiscardRequest={(pills, detail) => {\n onFeedback?.(\"down\", pills, detail)\n onDismiss?.(action.id)\n }}\n />\n </div>\n )}\n\n {/* Thread Context (email thread reply only) */}\n {isThreadReply && action.replyTo && (\n <div className=\"border-b border-border/40\">\n {action.threadMessages && action.threadMessages.length > 1 && (\n <div className=\"px-5 py-2 border-b border-border/40\">\n <button\n onClick={() => setThreadExpanded(!threadExpanded)}\n className=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n >\n {action.threadMessages.length} messages in this thread\n <span className=\"mx-1.5\">·</span>\n <span className=\"underline\">{threadExpanded ? \"Hide thread\" : \"View thread\"}</span>\n </button>\n </div>\n )}\n\n {threadExpanded && action.threadMessages && action.threadMessages.length > 1 ? (\n <div className=\"bg-muted/20\">\n {action.threadMessages.map((msg, idx) => {\n const isExpMsg = expandedMessageId === msg.id\n const isReplyingTo = !replyingToMessageId\n ? idx === action.threadMessages!.length - 1\n : replyingToMessageId === msg.id\n const isLast = idx === action.threadMessages!.length - 1\n\n return (\n <div key={msg.id}>\n <div\n className=\"px-5 py-3 hover:bg-muted/30 cursor-pointer transition-colors group relative\"\n onClick={() => setExpandedMessageId(isExpMsg ? null : msg.id)}\n >\n <div className=\"flex justify-between items-start mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-foreground\">{msg.from}</span>\n {isReplyingTo && (\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <ArrowLeft className=\"w-3 h-3\" />\n Replying to this\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">{msg.time}</span>\n {!isReplyingTo && !isExpMsg && (\n <button\n onClick={(e) => { e.stopPropagation(); setReplyingToMessageId(msg.id) }}\n className=\"text-xs text-muted-foreground hover:text-foreground underline opacity-0 group-hover:opacity-100 transition-opacity\"\n >\n Reply to this\n </button>\n )}\n </div>\n </div>\n <div className={`text-sm text-muted-foreground leading-relaxed ${isExpMsg ? \"\" : \"line-clamp-2\"}`}>\n {isExpMsg ? msg.content : msg.preview}\n </div>\n {isExpMsg && (\n <button\n onClick={(e) => { e.stopPropagation(); setExpandedMessageId(null) }}\n className=\"text-xs text-muted-foreground hover:text-foreground underline mt-2\"\n >\n Collapse\n </button>\n )}\n </div>\n {!isLast && <div className=\"h-px bg-border/40 mx-5\" />}\n </div>\n )\n })}\n </div>\n ) : (\n <div className=\"px-5 py-3 bg-muted/30\">\n <div className=\"flex justify-between items-start mb-2\">\n <span className=\"text-xs font-semibold text-foreground\">{action.replyTo.from} to Me</span>\n <span className=\"text-xs text-muted-foreground\">{action.replyTo.time}</span>\n </div>\n <div className=\"text-sm text-muted-foreground leading-relaxed line-clamp-3\">{action.replyTo.content}</div>\n </div>\n )}\n </div>\n )}\n\n {/* Reply Context (Slack) */}\n {action.type === \"slack\" && action.replyTo && (\n <div className=\"border-b border-border/40\">\n <div className=\"px-5 py-3 bg-muted/30\">\n <div className=\"flex justify-between items-start mb-2\">\n <span className=\"text-xs font-semibold text-foreground\">{action.replyTo.from} to Me</span>\n <span className=\"text-xs text-muted-foreground\">{action.replyTo.time}</span>\n </div>\n <div className=\"text-sm text-muted-foreground leading-relaxed line-clamp-3\">{action.replyTo.content}</div>\n </div>\n </div>\n )}\n\n {/* EmailHeader */}\n {action.type === \"email\" && action.emailMeta && (\n <div>\n {isThreadReply && (\n <div className=\"mx-4 mt-3 flex items-center gap-1.5 rounded-md border border-border/60 bg-muted/[0.16] px-3 py-1.5 text-xs text-muted-foreground\">\n <Undo2 className=\"h-3 w-3\" />\n Replying in existing thread\n </div>\n )}\n <EmailHeader\n fromName={action.emailMeta.from}\n fromEmail={action.emailMeta.fromEmail}\n toContacts={toContacts}\n ccContacts={ccContacts}\n initialSubject={action.emailMeta.subject}\n accountContacts={accountContacts}\n bccContacts={bccContacts}\n onAddToContact={(c) => setToContacts((prev) => addUniqueContact(prev, c))}\n onRemoveToContact={(index) => setToContacts((prev) => prev.filter((_, idx) => idx !== index))}\n onConfirmToContact={(index) =>\n setToContacts((prev) =>\n prev.map((contact, idx) => (idx === index ? { ...contact, confirmed: true } : contact))\n )\n }\n onUpdateToContact={(index, updatedContact) =>\n setToContacts((prev) =>\n prev.map((contact, idx) => (idx === index ? updatedContact : contact))\n )\n }\n onCcAdd={(c) =>\n setCcContacts((prev) => addUniqueContact(prev, c))\n }\n onCcRemove={(i) => setCcContacts((prev) => prev.filter((_, idx) => idx !== i))}\n onBccAdd={(c) =>\n setBccContacts((prev) => addUniqueContact(prev, c))\n }\n onBccRemove={(i) => setBccContacts((prev) => prev.filter((_, idx) => idx !== i))}\n onOpenAccountDetails={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n showSubject={isNewEmail}\n accountDetailsLabel={accountDetailsLabel}\n />\n </div>\n )}\n\n {/* Call contact card */}\n {isCall && (\n <div className=\"mx-4 mt-3 rounded-md border border-border/60 bg-muted/[0.16] px-3 py-2.5\">\n <div className=\"flex items-start gap-3\">\n <span className=\"text-xs text-muted-foreground w-10 shrink-0 mt-1.5\">To</span>\n <div className=\"flex-1 min-w-0\">\n {callContact ? (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <div\n className={`inline-flex max-w-[300px] items-start gap-2 rounded-md border px-2 py-1 text-xs ${\n callContact.confirmed\n ? \"border-border/80 bg-background text-foreground\"\n : \"border-amber-300 bg-amber-50 text-amber-800\"\n }`}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1\">\n <span className=\"font-medium leading-none\">{callContact.name}</span>\n {callContact.confirmed && <Check className=\"h-3 w-3 text-emerald-600\" />}\n </div>\n {callContact.role && (\n <div className=\"mt-0.5 truncate text-muted-foreground\">{callContact.role}</div>\n )}\n {(callContact.phone || callContact.phones?.[0]) && (\n <div className=\"mt-0.5 truncate text-muted-foreground\">{callContact.phone ?? callContact.phones?.[0]}</div>\n )}\n </div>\n <div className=\"ml-auto flex items-center gap-1\">\n {!callContact.confirmed && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setCallContact({ ...callContact, confirmed: true })\n }}\n className=\"h-6 rounded px-1.5 text-[10px] font-semibold hover:bg-amber-100\"\n >\n Confirm\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setCallContact(undefined)\n }}\n className=\"rounded p-0.5 text-muted-foreground hover:text-foreground hover:bg-muted/40\"\n aria-label=\"Remove recipient\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">No contact selected.</div>\n )}\n <div className=\"flex items-center flex-wrap gap-1.5 mt-1.5\">\n {accountContacts && accountContacts.length > 0 && (\n <AccountContactsPopover\n contacts={accountContacts}\n onSelect={(c) => setCallContact({ ...c, confirmed: true })}\n onViewAll={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n iconMap={iconMap}\n trigger={\n <button className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\">\n Contacts\n </button>\n }\n />\n )}\n <button\n type=\"button\"\n onClick={onOpenAccountDetails}\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/40 transition-colors\"\n >\n {accountDetailsLabel ?? \"Account details\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n \n\n {/* Content Area */}\n <div>\n {action.type === \"ticket\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Priority</label>\n <select\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketPriority}\n onChange={(e) => setTicketPriority(e.target.value)}\n >\n <option>High</option>\n <option>Medium</option>\n <option>Low</option>\n </select>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Type</label>\n <select\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketType}\n onChange={(e) => setTicketType(e.target.value)}\n >\n <option>Churn Risk</option>\n <option>Support Request</option>\n <option>Feature Request</option>\n </select>\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Subject</label>\n <input\n className=\"w-full px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketSubject}\n onChange={(e) => setTicketSubject(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <label className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Description</label>\n <textarea\n className=\"w-full min-h-[100px] px-3 py-2 text-sm bg-background border border-border rounded-md shadow-sm resize-none focus:outline-none focus:ring-1 focus:ring-primary/20\"\n value={ticketDescription}\n onChange={(e) => setTicketDescription(e.target.value)}\n />\n </div>\n </div>\n ) : isCall ? (\n <div className=\"flex flex-col\">\n <div className=\"px-4 pt-3 pb-3\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Talk track\n </div>\n <div className=\"px-3 pb-3\">\n <textarea\n className=\"w-full min-h-[280px] text-sm leading-relaxed bg-transparent border-none resize-none focus:ring-0 focus:outline-none placeholder:text-muted-foreground/50 p-0 overflow-y-auto\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"Edit talk track...\"\n />\n </div>\n </div>\n </div>\n <EditorToolbar />\n </div>\n ) : action.type === \"manual\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Task description\n </div>\n <div className=\"px-3 pb-3\">\n <p className=\"text-sm leading-relaxed text-foreground whitespace-pre-wrap\">\n {action.manualMeta?.taskDescription ?? action.content ?? \"\"}\n </p>\n </div>\n </div>\n </div>\n ) : action.type === \"browser\" ? (\n <div className=\"p-5 space-y-4\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Browser automation\n </div>\n <div className=\"px-3 pb-3 space-y-2\">\n {action.browserMeta?.url && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Globe className=\"w-3.5 h-3.5 shrink-0\" />\n <a href={action.browserMeta.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary underline underline-offset-2 truncate\">\n {action.browserMeta.url}\n </a>\n </div>\n )}\n <p className=\"text-sm leading-relaxed text-foreground whitespace-pre-wrap\">\n {action.browserMeta?.actionDescription ?? action.content ?? \"\"}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"flex flex-col\">\n <div className=\"px-4 pt-3 pb-3\">\n <div className=\"rounded-md border border-border/60 bg-muted/[0.16] overflow-hidden\">\n <div className=\"px-3 pt-2 pb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/70\">\n Draft\n </div>\n <div className=\"px-3 pb-3\">\n <textarea\n className=\"w-full min-h-[280px] text-sm leading-relaxed bg-transparent border-none resize-none focus:ring-0 focus:outline-none placeholder:text-muted-foreground/50 p-0 overflow-y-auto\"\n value={content}\n onChange={(e) => setContent(e.target.value)}\n placeholder=\"Write your message...\"\n />\n </div>\n {action.type === \"email\" && signature && (\n <SignatureBlock signature={signature} enabled={signatureEnabled} onToggle={() => setSignatureEnabled(!signatureEnabled)} />\n )}\n </div>\n </div>\n <EditorToolbar />\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"bg-muted/10 border-t border-border/60\">\n <div className=\"px-5 py-4\">\n {showAiEdit && <AiEditPanel onApply={(pills, desc) => console.log(\"AI Edit:\", pills, desc)} />}\n\n {action.followUp && (\n <div className=\"mb-3\">\n <FollowUpToggle checked={followUpEnabled} onCheckedChange={setFollowUpEnabled} days={action.followUp.days} />\n </div>\n )}\n\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 overflow-x-auto no-scrollbar\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={`h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 ${showAiEdit ? \"bg-muted/50 text-foreground\" : \"\"}`}\n onClick={() => setShowAiEdit(!showAiEdit)}\n >\n AI Edit\n </Button>\n {!isCall && action.type !== \"email\" && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n onClick={() => onSaveDraft?.(action.id)}\n >\n Draft\n </Button>\n )}\n {!isCall && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 whitespace-nowrap\">\n {openInLabel}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50\"\n onClick={() => onDismiss?.(action.id)}\n >\n {dismissLabel}\n </Button>\n {action.type === \"email\" && onDuplicate && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium text-muted-foreground hover:text-foreground hover:bg-muted/50 whitespace-nowrap\"\n onClick={() => onDuplicate(action.id)}\n >\n <Copy className=\"w-3 h-3 mr-1.5\" />\n Copy\n </Button>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 pl-2 shrink-0\">\n <div className=\"w-px h-4 bg-border/60\" />\n {isCall ? (\n <>\n {action.callMeta?.allowDispatchAgent && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-9 text-xs font-medium shadow-none\"\n onClick={() => onDispatchAgent?.(action.id, content)}\n disabled={!canSend}\n >\n Dispatch agent\n </Button>\n )}\n <Button\n size=\"sm\"\n className={`px-5 h-9 text-xs font-semibold shadow-sm ${\n canSend\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n onClick={() => canSend && onMarkComplete?.(action.id)}\n disabled={!canSend}\n >\n <Check className=\"w-3.5 h-3.5 mr-1.5\" />\n Mark complete\n </Button>\n </>\n ) : action.type === \"manual\" ? (\n <Button\n size=\"sm\"\n className=\"px-5 h-9 text-xs font-semibold shadow-sm bg-foreground text-background hover:bg-foreground/90\"\n onClick={() => onMarkComplete?.(action.id)}\n >\n <Check className=\"w-3.5 h-3.5 mr-1.5\" />\n Mark complete\n </Button>\n ) : action.type === \"browser\" ? (\n <Button\n size=\"sm\"\n className=\"px-5 h-9 text-xs font-semibold shadow-sm bg-foreground text-background hover:bg-foreground/90\"\n onClick={() => onSend?.(action.id)}\n >\n <Globe className=\"w-3.5 h-3.5 mr-1.5\" />\n {sendLabel ?? \"Run\"}\n </Button>\n ) : (\n <Button\n size=\"sm\"\n className={`px-6 h-9 text-xs font-semibold shadow-sm ${\n canSend\n ? \"bg-foreground text-background hover:bg-foreground/90\"\n : \"bg-muted text-muted-foreground cursor-not-allowed\"\n }`}\n onClick={() => canSend && onSend?.(action.id)}\n disabled={!canSend}\n >\n {sendLabel ?? \"Send\"}\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SuggestedActions (public API)\n// ---------------------------------------------------------------------------\n\nexport interface SuggestedActionsProps {\n actions: SuggestedAction[]\n title?: string\n onDismiss?: (id: number | string) => void\n onSend?: (id: number | string) => void\n onSaveDraft?: (id: number | string) => void\n accountContacts?: SuggestedContact[]\n signature?: string | React.ReactNode\n onDuplicate?: (id: number | string) => void\n onOpenAccountDetails?: () => void\n onOpenRecentActivity?: () => void\n onMarkComplete?: (id: number | string) => void\n onDispatchAgent?: (id: number | string, editedContent?: string, settings?: { aiDisclosureEnabled?: boolean; maxDurationMinutes?: string; callRecordingEnabled?: boolean; recordingNoticeEnabled?: boolean }) => void\n iconMap?: SuggestedActionsIconMap\n sendLabel?: string\n accountDetailsLabel?: string\n dismissLabel?: string\n}\n\nexport function SuggestedActions({\n actions,\n title = \"Suggested Actions\",\n onDismiss,\n onSend,\n onSaveDraft,\n accountContacts,\n signature,\n onDuplicate,\n onOpenAccountDetails,\n onOpenRecentActivity,\n onMarkComplete,\n onDispatchAgent,\n iconMap,\n sendLabel,\n accountDetailsLabel,\n dismissLabel,\n}: SuggestedActionsProps) {\n const [dismissedIds, setDismissedIds] = React.useState<Set<number | string>>(new Set())\n\n const handleDismiss = React.useCallback(\n (id: number | string) => {\n setDismissedIds((prev) => new Set([...prev, id]))\n onDismiss?.(id)\n },\n [onDismiss]\n )\n\n const visibleActions = actions.filter((a) => a.status !== \"dismissed\" && !dismissedIds.has(a.id))\n\n return (\n <div className=\"py-6 border-t border-border\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"text-[11px] font-bold text-muted-foreground/70 uppercase tracking-wider\">{title}</div>\n <span className=\"text-[11px] text-muted-foreground\">{visibleActions.length} actions</span>\n </div>\n\n <div className=\"space-y-4\">\n {visibleActions.map((action) => (\n <div\n key={action.id}\n className=\"group bg-background border border-border rounded-md overflow-hidden shadow-sm hover:shadow-md transition-all duration-200\"\n >\n <SuggestedActionCard\n action={action}\n onDismiss={handleDismiss}\n onSend={onSend}\n onSaveDraft={onSaveDraft}\n accountContacts={accountContacts}\n signature={signature}\n onDuplicate={onDuplicate}\n onOpenAccountDetails={onOpenAccountDetails}\n onOpenRecentActivity={onOpenRecentActivity}\n onMarkComplete={onMarkComplete}\n onDispatchAgent={onDispatchAgent}\n onFeedback={action.onFeedback}\n iconMap={iconMap}\n sendLabel={sendLabel}\n accountDetailsLabel={accountDetailsLabel}\n dismissLabel={dismissLabel}\n />\n </div>\n ))}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["_a","_b","_c"]}
|
package/package.json
CHANGED
|
@@ -41,9 +41,9 @@ describe("DraftFeedbackInline", () => {
|
|
|
41
41
|
fireEvent.click(downButton)
|
|
42
42
|
|
|
43
43
|
expect(screen.getByText("What needs improvement?")).toBeTruthy()
|
|
44
|
-
expect(downButton.className).toContain("bg-
|
|
45
|
-
expect(downButton.className).toContain("text-
|
|
46
|
-
expect(downButton.className).not.toContain("bg-red
|
|
44
|
+
expect(downButton.className).toContain("bg-muted")
|
|
45
|
+
expect(downButton.className).toContain("text-foreground")
|
|
46
|
+
expect(downButton.className).not.toContain("bg-red")
|
|
47
47
|
})
|
|
48
48
|
|
|
49
49
|
it("renders thumb icons outline-only (never fill=currentColor)", () => {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import { describe, it, expect } from "vitest"
|
|
12
12
|
import React from "react"
|
|
13
|
-
import { render, screen, fireEvent
|
|
13
|
+
import { render, screen, fireEvent } from "@testing-library/react"
|
|
14
14
|
import { SuggestedActions } from "../suggested-actions"
|
|
15
15
|
import type { SuggestedAction } from "../suggested-actions"
|
|
16
16
|
|
|
@@ -56,8 +56,8 @@ describe("SuggestedActions header thumbs", () => {
|
|
|
56
56
|
expect(screen.getByText("How's this draft?")).toBeTruthy()
|
|
57
57
|
expect(screen.getByText("What needs improvement?")).toBeTruthy()
|
|
58
58
|
expect(screen.queryByText("What worked well?")).toBeNull()
|
|
59
|
-
expect(down.className).toContain("bg-
|
|
60
|
-
expect(down.className).toContain("text-
|
|
59
|
+
expect(down.className).toContain("bg-muted")
|
|
60
|
+
expect(down.className).toContain("text-foreground")
|
|
61
61
|
})
|
|
62
62
|
|
|
63
63
|
it("closes the panel when the same direction is clicked again", () => {
|
|
@@ -114,7 +114,7 @@ export function DraftFeedbackInline({
|
|
|
114
114
|
}}
|
|
115
115
|
className={`p-1.5 rounded transition-colors ${
|
|
116
116
|
thumbState === "down"
|
|
117
|
-
? "bg-
|
|
117
|
+
? "bg-muted text-foreground"
|
|
118
118
|
: "hover:bg-muted text-muted-foreground hover:text-foreground"
|
|
119
119
|
}`}
|
|
120
120
|
>
|
|
@@ -175,7 +175,7 @@ function Trigger({ className }: { className?: string }) {
|
|
|
175
175
|
className={cn(
|
|
176
176
|
"p-1.5 rounded transition-colors",
|
|
177
177
|
thumbState === "down"
|
|
178
|
-
? "bg-
|
|
178
|
+
? "bg-muted text-foreground"
|
|
179
179
|
: "hover:bg-muted text-muted-foreground hover:text-foreground"
|
|
180
180
|
)}
|
|
181
181
|
>
|
|
@@ -1037,7 +1037,7 @@ function SuggestedActionCard({
|
|
|
1037
1037
|
onClick={() => handleThumbClick("down")}
|
|
1038
1038
|
className={`p-1.5 rounded transition-colors ${
|
|
1039
1039
|
feedbackOpen && feedbackDirection === "down"
|
|
1040
|
-
? "bg-
|
|
1040
|
+
? "bg-muted text-foreground"
|
|
1041
1041
|
: "hover:bg-muted text-muted-foreground hover:text-foreground"
|
|
1042
1042
|
}`}
|
|
1043
1043
|
>
|