@bikdotai/bik-component-library 0.0.839-beta.2 → 0.0.839-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/cjs/components/BikGiftedChat/GiftedChat/GiftedChat.js +1 -1
  2. package/dist/cjs/components/BikGiftedChat/GiftedChat/GiftedChat.js.map +1 -1
  3. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js +23 -23
  4. package/dist/cjs/components/WhatsAppTextEditor/WhatsAppTextEditor.js.map +1 -1
  5. package/dist/cjs/components/agent-builder/components/AiTextArea.js +1 -1
  6. package/dist/cjs/components/agent-builder/components/AiTextArea.js.map +1 -1
  7. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js +2 -2
  8. package/dist/cjs/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  9. package/dist/cjs/components/bik-chatbot/components/ChatWindow.js +20 -20
  10. package/dist/cjs/components/bik-chatbot/components/ChatWindow.js.map +1 -1
  11. package/dist/cjs/components/button/themes.js +11 -11
  12. package/dist/cjs/components/button/themes.js.map +1 -1
  13. package/dist/cjs/components/input/ChipInput.js +1 -1
  14. package/dist/cjs/components/input/ChipInput.js.map +1 -1
  15. package/dist/cjs/components/input/Input-helper.js +1 -1
  16. package/dist/cjs/components/input/Input-helper.js.map +1 -1
  17. package/dist/cjs/components/input/Input.js +1 -1
  18. package/dist/cjs/components/input/Input.js.map +1 -1
  19. package/dist/cjs/components/plans/SubscriptionPlanSelector.js +5 -5
  20. package/dist/cjs/components/plans/SubscriptionPlanSelector.js.map +1 -1
  21. package/dist/cjs/editor/BikEditor.js +1 -1
  22. package/dist/cjs/editor/BikEditor.js.map +1 -1
  23. package/dist/cjs/editor/BikEditor.utils.js +3 -3
  24. package/dist/cjs/editor/BikEditor.utils.js.map +1 -1
  25. package/dist/cjs/editor/extensions/buildExtensions.js +2 -2
  26. package/dist/cjs/editor/extensions/buildExtensions.js.map +1 -1
  27. package/dist/cjs/icons/index.js +1 -1
  28. package/dist/cjs/index.js +1 -1
  29. package/dist/esm/components/BikGiftedChat/GiftedChat/GiftedChat.js +66 -61
  30. package/dist/esm/components/BikGiftedChat/GiftedChat/GiftedChat.js.map +1 -1
  31. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js +143 -144
  32. package/dist/esm/components/WhatsAppTextEditor/WhatsAppTextEditor.js.map +1 -1
  33. package/dist/esm/components/agent-builder/components/AiTextArea.js +23 -24
  34. package/dist/esm/components/agent-builder/components/AiTextArea.js.map +1 -1
  35. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js +30 -31
  36. package/dist/esm/components/agent-builder/components/ToolInstructionsField.js.map +1 -1
  37. package/dist/esm/components/bik-chatbot/components/ChatWindow.js +53 -54
  38. package/dist/esm/components/bik-chatbot/components/ChatWindow.js.map +1 -1
  39. package/dist/esm/components/button/themes.d.ts +1 -0
  40. package/dist/esm/components/button/themes.js +61 -51
  41. package/dist/esm/components/button/themes.js.map +1 -1
  42. package/dist/esm/components/input/ChipInput.js +40 -41
  43. package/dist/esm/components/input/ChipInput.js.map +1 -1
  44. package/dist/esm/components/input/Input-helper.d.ts +0 -7
  45. package/dist/esm/components/input/Input-helper.js +25 -16
  46. package/dist/esm/components/input/Input-helper.js.map +1 -1
  47. package/dist/esm/components/input/Input.js +58 -60
  48. package/dist/esm/components/input/Input.js.map +1 -1
  49. package/dist/esm/components/input/Input.model.d.ts +0 -1
  50. package/dist/esm/components/plans/SubscriptionPlanSelector.js +40 -42
  51. package/dist/esm/components/plans/SubscriptionPlanSelector.js.map +1 -1
  52. package/dist/esm/editor/BikEditor.js +118 -122
  53. package/dist/esm/editor/BikEditor.js.map +1 -1
  54. package/dist/esm/editor/BikEditor.utils.d.ts +1 -1
  55. package/dist/esm/editor/BikEditor.utils.js +140 -141
  56. package/dist/esm/editor/BikEditor.utils.js.map +1 -1
  57. package/dist/esm/editor/extensions/buildExtensions.js +39 -49
  58. package/dist/esm/editor/extensions/buildExtensions.js.map +1 -1
  59. package/dist/esm/helpers/index.d.ts +0 -1
  60. package/dist/esm/icons/Media/Visual/index.d.ts +0 -1
  61. package/dist/esm/icons/index.d.ts +25 -25
  62. package/dist/esm/icons/index.js +416 -418
  63. package/dist/esm/icons/index.js.map +1 -1
  64. package/dist/esm/index.js +114 -124
  65. package/dist/esm/index.js.map +1 -1
  66. package/package.json +1 -2
  67. package/dist/cjs/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js +0 -2
  68. package/dist/cjs/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js.map +0 -1
  69. package/dist/cjs/helpers/sanitize.js +0 -2
  70. package/dist/cjs/helpers/sanitize.js.map +0 -1
  71. package/dist/cjs/icons/Media/Visual/FormkitSad.js +0 -2
  72. package/dist/cjs/icons/Media/Visual/FormkitSad.js.map +0 -1
  73. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.d.ts +0 -13
  74. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js +0 -64
  75. package/dist/esm/editor/extensions/htmlTagStrip/HtmlTagStripExtension.js.map +0 -1
  76. package/dist/esm/helpers/sanitize.d.ts +0 -32
  77. package/dist/esm/helpers/sanitize.js +0 -204
  78. package/dist/esm/helpers/sanitize.js.map +0 -1
  79. package/dist/esm/icons/Media/Visual/FormkitSad.js +0 -61
  80. package/dist/esm/icons/Media/Visual/FormkitSad.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WhatsAppTextEditor.js","sources":["../../../../src/components/WhatsAppTextEditor/WhatsAppTextEditor.tsx"],"sourcesContent":["import CheckIcon from '@src/assets/icons/check.svg';\nimport ChevronLeftIcon from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRightIcon from '@src/assets/icons/chevronRight.svg';\nimport CrossIcon from '@src/assets/icons/cross.svg';\nimport EditIcon from '@src/assets/icons/edit.svg';\nimport InfoIcon from '@src/assets/icons/info.svg';\nimport RewindIcon from '@src/assets/icons/rewind.svg';\nimport ThumbsDownIcon from '@src/assets/icons/thumb-down-line.svg';\nimport ThumbsUpIcon from '@src/assets/icons/thumb-up-line.svg';\nimport { BaseWhatsappContentLangHelper } from '@src/helpers/BaseWhatsappContentLang.helper';\nimport { stripHtmlTags } from '@src/helpers/sanitize';\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { COLORS } from '@src/constants/Theme';\nimport type { ApiRequestExecutor } from '../bik-chatbot/types';\nimport type { APIAdapter } from '../bik-chatbot/types/ai';\nimport { Tooltip } from '../tooltips/Tooltip';\nimport { BodyCaption, TitleSmall } from '../TypographyStyle';\nimport {\n\tAIActionPromptConfig,\n\tAIActionPromptRegistry,\n\tDEFAULT_AI_ACTION_MIN_CHARS,\n\tDEFAULT_INSTRUCTION_SUGGESTIONS,\n\tresolveActionPrompts,\n\tTemplateType,\n} from './ai/actionRegistry';\nimport {\n\tAITagPayload,\n\tcomputeAiTagOnAccept,\n\tcomputeAiTagOnPostEdit,\n} from './ai/aiTag';\nimport { buildActionPrompt, requestAISuggestion } from './ai/api';\nimport { AIActionToneOption } from './AIRephraseButton';\nimport {\n\tContainer,\n\tEditorFooterRight,\n\tEditorFooterRow,\n\tEditorFooterTitle,\n\tOuterContainer,\n\tTextSpace,\n} from './CustomEditor.styled';\nimport {\n\tAIActionVariant,\n\tAIEditorActionType,\n\tAIEditorActionTypes,\n\tAIHeaderAction,\n\tEditorActionTypes,\n\tWhatsAppEditorRightSlotProps,\n\tWhatsAppTextEditorHeader,\n} from './WhatsAppTextEditorHeader';\n\nconst LIMIT_REACHED = 'Character limit reached';\nconst REPHRASE_IDLE_MS = 3000;\nconst MAX_REPHRASE_HIGHLIGHTS = 5;\nconst MAX_SUGGESTIONS = 3;\nconst LARGE_INPUT_THRESHOLD = 1200;\nconst AI_TAG_RECOMPUTE_IDLE_MS = 1000;\nconst UTILITY_REPHRASE_PROMPT =\n\t'Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance.';\n\nconst skeletonPulse = keyframes`\n\t0% { opacity: 0.55; }\n\t50% { opacity: 1; }\n\t100% { opacity: 0.55; }\n`;\n\nconst EditorSkeletonContainer = styled.div`\n\tpadding: 14px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tmin-height: 150px;\n`;\n\nconst EditorSkeletonLine = styled.div<{ width: string }>`\n\theight: 16px;\n\tborder-radius: 6px;\n\twidth: ${(props) => props.width};\n\tbackground: #ececef;\n\tanimation: ${skeletonPulse} 1.1s ease-in-out infinite;\n`;\n\nconst SuggestionSessionContainer = styled.div`\n\tpadding: 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmax-height: 260px;\n\toverflow-y: scroll;\n\tscrollbar-width: thin;\n\tscrollbar-color: #c8c8cf transparent;\n\t::-webkit-scrollbar {\n\t\twidth: 8px;\n\t}\n\t::-webkit-scrollbar-thumb {\n\t\tbackground: #c8c8cf;\n\t\tborder-radius: 8px;\n\t}\n\t::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n`;\n\nconst SuggestionBaselineText = styled.div`\n\ttext-decoration: line-through;\n\tcolor: ${COLORS.content.secondary};\n`;\n\nconst SuggestionCandidateText = styled.div`\n\tcolor: ${COLORS.content.primary};\n`;\n\nconst SuggestionCandidateSkeleton = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\twidth: 100%;\n\tmin-height: 40px;\n`;\n\nconst SuggestionControlsRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n`;\n\nconst SuggestionCounter = styled.span`\n\tcolor: ${COLORS.content.primary};\n\tfont-size: 14px;\n`;\n\nconst SuggestionIconButton = styled.button`\n\tborder: 0;\n\tbackground: transparent;\n\tpadding: 6px;\n\tborder-radius: 6px;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\tcolor: ${COLORS.content.primary};\n\ttransition: background-color 0.12s ease;\n\t:not(:disabled):hover {\n\t\tbackground-color: ${COLORS.surface.hovered};\n\t}\n\t:disabled {\n\t\topacity: 0.35;\n\t\tcursor: not-allowed;\n\t}\n`;\n\n/** Regenerate stays full opacity while disabled so the loading shimmer stays visible (same pulse as editor skeleton). */\nconst SuggestionRegenerateButton = styled(SuggestionIconButton)`\n\t:disabled {\n\t\topacity: 1;\n\t\tcursor: wait;\n\t}\n`;\n\nconst RegenerateIconShimmer = styled.div`\n\twidth: 14px;\n\theight: 14px;\n\tborder-radius: 4px;\n\tbackground: #ececef;\n\tflex-shrink: 0;\n\tanimation: ${skeletonPulse} 1.1s ease-in-out infinite;\n`;\n\n/** Same bottom toolbar slot as `WhatsAppTextEditorHeader` — replaces the full icon/AI panel while open. */\nconst InstructionContainer = styled.div`\n\tbackground: ${COLORS.surface.standard};\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 8px 12px;\n\tgap: 10px;\n\tborder-radius: 0 0 4px 4px;\n\tposition: relative;\n`;\n\nconst InstructionInputRow = styled.div`\n\tborder: 1px solid #f5a4c0;\n\tborder-radius: 10px;\n\tpadding: 8px 10px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tbackground: ${COLORS.surface.standard};\n`;\n\nconst InstructionInput = styled.input`\n\tflex: 1;\n\tmin-width: 0;\n\tborder: 0;\n\toutline: none;\n\tfont-size: 14px;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.primary};\n`;\n\nconst InstructionActions = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n`;\n\nconst InstructionCancel = styled.button`\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.secondary};\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tpadding: 0;\n\tcursor: pointer;\n`;\n\nconst InstructionImprove = styled.button`\n\tborder: 1px solid #5d3a72;\n\tcolor: #5d3a72;\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tfont-size: 14px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n`;\n\nconst InstructionSuggestionList = styled.div`\n\tmargin-top: 4px;\n\tborder-radius: 12px;\n\twidth: 331px;\n\tbackground: ${COLORS.surface.standard};\n\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.1);\n\toverflow: hidden;\n\tpadding: 4px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n`;\n\nconst InstructionSuggestionButton = styled.button<{ selected?: boolean }>`\n\twidth: 100%;\n\tborder: 0;\n\tborder-radius: 8px;\n\tbackground: ${(props) => (props.selected ? '#e5f3e8' : 'transparent')};\n\tcolor: ${(props) => (props.selected ? '#1e6b34' : COLORS.content.primary)};\n\ttext-align: left;\n\tpadding: 10px 12px;\n\tfont-size: 14px;\n\tline-height: 1.2;\n\tcursor: pointer;\n\t:hover {\n\t\tbackground: ${(props) =>\n\t\t\tprops.selected ? '#d9e8db' : COLORS.surface.subdued};\n\t}\n`;\n\ntype AIEventName =\n\t| 'ai_action_triggered'\n\t| 'ai_feedback_submitted'\n\t| 'ai_suggestion_accepted'\n\t| 'ai_suggestion_discarded'\n\t| 'ai_suggestion_edited'\n\t| 'ai_instruction_used';\n\nenum AIFeedbackRating {\n\tLIKE = 'like',\n\tDISLIKE = 'dislike',\n}\n\ntype AIEventPayload = {\n\taction_type: AIEditorActionType;\n\ttemplate_id?: string | number;\n\ttemplate_category?: TemplateType;\n\trating?: AIFeedbackRating;\n\tcandidate_index?: number;\n\tinstruction_text?: string;\n};\n\ntype AIActionRequestPayload = {\n\tactionType: AIEditorActionType;\n\tactionVariant?: AIActionVariant;\n\tcurrentText: string;\n\ttemplateType: TemplateType;\n\ttoneId?: string;\n\ttoneLabel?: string;\n\tinstructionText?: string;\n\tprompt: string;\n};\n\ntype AIActionPromptBuildPayload = {\n\tactionType: AIEditorActionType;\n\tactionVariant?: AIActionVariant;\n\tcurrentText: string;\n\ttemplateType: TemplateType;\n\tconfig: AIActionPromptConfig;\n\ttoneId?: string;\n\ttoneLabel?: string;\n\tinstructionText?: string;\n};\n\nexport type CustomEditorProps =\n\tReact.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n\t\tonChange?: (text: string, html: string) => void;\n\t\ttext?: string;\n\t\tRightComponent?: React.ComponentType<WhatsAppEditorRightSlotProps>;\n\t\terror?: string;\n\t\tlimit?: number;\n\t\trows?: number;\n\t\tactions?: EditorActionTypes[];\n\n\t\t/**\n\t\t * Calls only for editor only error, not for errors coming from outside\n\t\t */\n\t\tonError?: (err: string) => void;\n\n\t\tonClickVariable?: (variable: string) => void;\n\t\teditorInstanceKey?: string;\n\t\teditorSessionId?: string;\n\t\ttemplateType?: TemplateType;\n\t\ttemplateId?: string | number;\n\t\trequestExecutor?: ApiRequestExecutor;\n\t\tbaseUrl?: string;\n\t\tendpointPath?: string;\n\t\tuseCase?: string;\n\t\tstoreId?: string;\n\t\tapiAdapter?: APIAdapter;\n\t\tconversationId?: string;\n\t\tsystemId?: string;\n\t\tintent?: string;\n\t\tenabledAIActions?: AIEditorActionType[];\n\t\tdisableBuiltInAIActions?: boolean;\n\t\tpromptOverrides?: AIActionPromptRegistry;\n\t\trephraseTones?: AIActionToneOption[];\n\t\taiActionMinChars?: Partial<Record<AIEditorActionType, number>>;\n\t\tinstructionSuggestions?: string[];\n\t\tonAnalyticsEvent?: (name: AIEventName, payload: AIEventPayload) => void;\n\t\t/**\n\t\t * Fires on AI-tag computations:\n\t\t * - `source: \"accept\"` after accepting a suggestion (addition check: >=50% => true)\n\t\t * - `source: \"post_edit_debounce\"` after edit idle/blur (retention check: <50% => true)\n\t\t * Persist `payload.isAiTagged` (or full payload) in host state and send on save.\n\t\t */\n\t\tonAITagComputed?: (payload: AITagPayload) => void;\n\t\t/**\n\t\t * When true, the editor body was loaded as fully AI-generated (prefill).\n\t\t * The first accepted suggestion will set `initialAiPrefillPhase` on the tag payload;\n\t\t * after that, only baseline vs accepted comparison applies.\n\t\t */\n\t\tprefillWasAiGenerated?: boolean;\n\t\t/**\n\t\t * Optional label above the editor (e.g. section title from the host).\n\t\t * When omitted, the left side of that top row is empty; limit/error stay on the right.\n\t\t */\n\t\teditorHeader?: React.ReactNode;\n\t\tonAIToneSelect?: (actionType: AIEditorActionType, toneId: string) => void;\n\t\tonAIActionRequest?: (\n\t\t\tpayload: AIActionRequestPayload,\n\t\t) => Promise<string | { body?: string }>;\n\t\tonBuildAIPrompt?: (payload: AIActionPromptBuildPayload) => string;\n\t\tonBlur?: React.FocusEventHandler<HTMLTextAreaElement>;\n\t};\nexport type CustomEditorRef = {\n\taddTextOrWrap: (textToAdd: string) => {\n\t\ttext: string;\n\t\thtml: string;\n\t};\n\taddText: (textToAdd: string) => {\n\t\ttext: string;\n\t\thtml: string;\n\t};\n\tget: () => string;\n\tsetCaretPosition(caretPos: number): void;\n};\n\nconst baseWhatsappContentLang = new BaseWhatsappContentLangHelper();\n\nconst WildCardMap: { [key in EditorActionTypes]?: string } = {\n\t[EditorActionTypes.BOLD]: '*',\n\t[EditorActionTypes.ITALIC]: '_',\n\t[EditorActionTypes.STRIKETHROUGH]: '~',\n};\n\nfunction getHighlightStorageKey(editorInstanceKey?: string) {\n\treturn `whatsapp-editor-rephrase-highlight-${editorInstanceKey || 'default'}`;\n}\n\nexport const WhatsAppTextEditor = React.forwardRef<\n\tCustomEditorRef,\n\tCustomEditorProps\n>(\n\t(\n\t\t{\n\t\t\tonChange,\n\t\t\tonClickVariable,\n\t\t\ttext: inputValue,\n\t\t\tRightComponent,\n\t\t\terror,\n\t\t\tlimit,\n\t\t\tonError,\n\t\t\trows,\n\t\t\tactions,\n\t\t\teditorInstanceKey,\n\t\t\teditorSessionId,\n\t\t\ttemplateType = 'marketing',\n\t\t\ttemplateId,\n\t\t\trequestExecutor,\n\t\t\tbaseUrl,\n\t\t\tendpointPath,\n\t\t\tuseCase,\n\t\t\tstoreId,\n\t\t\tapiAdapter,\n\t\t\tconversationId = 'whatsapp-template-editor',\n\t\t\tsystemId = 'whatsapp-writer',\n\t\t\tintent = 'default',\n\t\t\tenabledAIActions = [\n\t\t\t\tAIEditorActionTypes.REPHRASE,\n\t\t\t\tAIEditorActionTypes.SHORTEN,\n\t\t\t\tAIEditorActionTypes.EXPAND,\n\t\t\t\tAIEditorActionTypes.EMOJIFY,\n\t\t\t],\n\t\t\tdisableBuiltInAIActions = false,\n\t\t\tpromptOverrides,\n\t\t\trephraseTones,\n\t\t\taiActionMinChars,\n\t\t\tinstructionSuggestions = DEFAULT_INSTRUCTION_SUGGESTIONS,\n\t\t\tonAnalyticsEvent,\n\t\t\tonAITagComputed,\n\t\t\tprefillWasAiGenerated = false,\n\t\t\teditorHeader,\n\t\t\tonAIToneSelect,\n\t\t\tonAIActionRequest,\n\t\t\tonBuildAIPrompt,\n\t\t\tonBlur: textAreaOnBlur,\n\t\t\t...textAreaProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst textSpaceRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst [currentText, setCurrentText] = useState(inputValue || '');\n\t\tconst [isRephraseHighlighted, setIsRephraseHighlighted] = useState(false);\n\t\tconst [rephraseHighlightCount, setRephraseHighlightCount] = useState(0);\n\t\tconst [isGenerating, setIsGenerating] = useState(false);\n\t\tconst [isInstructionInputVisible, setIsInstructionInputVisible] =\n\t\t\tuseState(false);\n\t\tconst [instructionText, setInstructionText] = useState('');\n\t\tconst [toneByAction, setToneByAction] = useState<\n\t\t\tPartial<Record<AIEditorActionType, string>>\n\t\t>({});\n\t\tconst [suggestionBaseText, setSuggestionBaseText] = useState<string | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst [suggestionCandidates, setSuggestionCandidates] = useState<string[]>(\n\t\t\t[],\n\t\t);\n\t\tconst [suggestionIndex, setSuggestionIndex] = useState(0);\n\t\tconst [suggestionActionType, setSuggestionActionType] =\n\t\t\tuseState<AIEditorActionType | null>(null);\n\t\tconst suggestionScrollRef = useRef<HTMLDivElement | null>(null);\n\t\tconst rephraseIdleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tconst highlightResetRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst aiTagRecomputeRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\t\tnull,\n\t\t);\n\t\t/**\n\t\t * Prior eligibility for rephrase nudge (null = not initialized).\n\t\t * Matches the chip: non-empty trim and length ≥ min — same as `aiHeaderActions` disabled rules.\n\t\t */\n\t\tconst prevRephraseEligibleRef = useRef<boolean | null>(null);\n\t\tconst deferredHtmlRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tconst lastEmittedEditorErrorRef = useRef<string | null>(null);\n\t\t/** First accept after full-AI prefill (`prefillWasAiGenerated`); cleared after one accept. */\n\t\tconst initialAiPrefillPhaseRef = useRef(!!prefillWasAiGenerated);\n\t\tconst acceptedSuggestionStateRef = useRef<{\n\t\t\tacceptedText: string;\n\t\t\tbaselineText: string;\n\t\t\tactionType: AIEditorActionType;\n\t\t\teditedEventEmitted: boolean;\n\t\t} | null>(null);\n\t\t/** Original prefill body for AI tag recompute; seeded once, never the live `currentText` fallback. */\n\t\tconst prefillBaselineTextRef = useRef('');\n\t\tconst prefillBaselineCapturedRef = useRef(false);\n\t\tconst [feedbackVotesByCandidate, setFeedbackVotesByCandidate] = useState<\n\t\t\tPartial<Record<string, AIFeedbackRating>>\n\t\t>({});\n\t\tconst mountSessionIdRef = useRef(\n\t\t\t`mount-${Date.now().toString(36)}-${Math.random()\n\t\t\t\t.toString(36)\n\t\t\t\t.slice(2, 8)}`,\n\t\t);\n\t\tconst highlightStorageKey = useMemo(() => {\n\t\t\treturn getHighlightStorageKey(\n\t\t\t\t`${editorInstanceKey || 'default'}-${\n\t\t\t\t\teditorSessionId || mountSessionIdRef.current\n\t\t\t\t}`,\n\t\t\t);\n\t\t}, [editorInstanceKey, editorSessionId]);\n\n\t\tuseEffect(() => {\n\t\t\tinitialAiPrefillPhaseRef.current = !!prefillWasAiGenerated;\n\t\t}, [prefillWasAiGenerated, editorInstanceKey]);\n\n\t\tuseEffect(() => {\n\t\t\tprefillBaselineCapturedRef.current = false;\n\t\t\tprefillBaselineTextRef.current = '';\n\t\t}, [editorInstanceKey, editorSessionId]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!prefillWasAiGenerated) {\n\t\t\t\tprefillBaselineCapturedRef.current = false;\n\t\t\t\tprefillBaselineTextRef.current = '';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (prefillBaselineCapturedRef.current) return;\n\t\t\tconst seed = inputValue ?? '';\n\t\t\tif (seed.length > 0) {\n\t\t\t\tprefillBaselineTextRef.current = seed;\n\t\t\t\tprefillBaselineCapturedRef.current = true;\n\t\t\t}\n\t\t}, [prefillWasAiGenerated, inputValue, editorInstanceKey, editorSessionId]);\n\n\t\tconst activeActionPrompts = useMemo(() => {\n\t\t\treturn resolveActionPrompts(templateType, promptOverrides, rephraseTones);\n\t\t}, [promptOverrides, rephraseTones, templateType]);\n\n\t\tconst filteredInstructionSuggestions = useMemo(() => {\n\t\t\tconst query = instructionText.trim().toLowerCase();\n\t\t\tif (!query) return [];\n\t\t\treturn instructionSuggestions.filter((suggestion) =>\n\t\t\t\tsuggestion.toLowerCase().includes(query),\n\t\t\t);\n\t\t}, [instructionSuggestions, instructionText]);\n\n\t\tconst minCharsByAction = useMemo(() => {\n\t\t\treturn {\n\t\t\t\t...DEFAULT_AI_ACTION_MIN_CHARS,\n\t\t\t\t...(aiActionMinChars || {}),\n\t\t\t};\n\t\t}, [aiActionMinChars]);\n\n\t\tconst rephraseMinChars =\n\t\t\tminCharsByAction[AIEditorActionTypes.REPHRASE] ||\n\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[AIEditorActionTypes.REPHRASE];\n\n\t\tconst anonymizeInstructionText = useCallback((value: string) => {\n\t\t\tconst normalized = value.trim().replace(/\\s+/g, ' ');\n\t\t\tif (!normalized) return '';\n\t\t\tconst words = normalized.split(' ').length;\n\t\t\treturn `[anonymized:length_${normalized.length}:words_${words}]`;\n\t\t}, []);\n\n\t\tconst emitAIEvent = useCallback(\n\t\t\t(name: AIEventName, payload: AIEventPayload) => {\n\t\t\t\tonAnalyticsEvent?.(name, payload);\n\t\t\t},\n\t\t\t[onAnalyticsEvent],\n\t\t);\n\n\t\tconst setEditorText = useCallback((nextText: string) => {\n\t\t\tsetCurrentText((prev) => (prev === nextText ? prev : nextText));\n\t\t}, []);\n\n\t\tconst emitChangeWithGuard = useCallback(\n\t\t\t(nextText: string) => {\n\t\t\t\tif (deferredHtmlRef.current) {\n\t\t\t\t\tclearTimeout(deferredHtmlRef.current);\n\t\t\t\t}\n\t\t\t\tif (nextText.length > LARGE_INPUT_THRESHOLD) {\n\t\t\t\t\tonChange?.(nextText, nextText);\n\t\t\t\t\tdeferredHtmlRef.current = setTimeout(() => {\n\t\t\t\t\t\tonChange?.(nextText, baseWhatsappContentLang.getHTML(nextText));\n\t\t\t\t\t}, 16);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonChange?.(nextText, baseWhatsappContentLang.getHTML(nextText));\n\t\t\t},\n\t\t\t[onChange],\n\t\t);\n\n\t\tconst emitPostEditAiTagRecompute = useCallback(\n\t\t\t(nextText: string) => {\n\t\t\t\tconst latest = acceptedSuggestionStateRef.current;\n\t\t\t\tconst latestBaseline =\n\t\t\t\t\tlatest?.acceptedText ||\n\t\t\t\t\t(prefillWasAiGenerated ? prefillBaselineTextRef.current : '');\n\t\t\t\tif (!latestBaseline) return;\n\t\t\t\tif (nextText === latestBaseline) return;\n\t\t\t\tconst recomputePayload = computeAiTagOnPostEdit({\n\t\t\t\t\tacceptedAiText: latestBaseline,\n\t\t\t\t\tcurrentEditedText: nextText,\n\t\t\t\t});\n\t\t\t\tonAITagComputed?.({\n\t\t\t\t\t...recomputePayload,\n\t\t\t\t\tsource: 'post_edit_debounce',\n\t\t\t\t});\n\t\t\t},\n\t\t\t[onAITagComputed, prefillWasAiGenerated],\n\t\t);\n\n\t\tconst clearSuggestionSession = useCallback(() => {\n\t\t\tsetSuggestionBaseText(null);\n\t\t\tsetSuggestionCandidates([]);\n\t\t\tsetSuggestionIndex(0);\n\t\t\tsetSuggestionActionType(null);\n\t\t\tsetFeedbackVotesByCandidate({});\n\t\t}, []);\n\n\t\tconst triggerRephraseHighlight = useCallback(() => {\n\t\t\tif (isGenerating) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!!suggestionBaseText && suggestionCandidates.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rephraseHighlightCount >= MAX_REPHRASE_HIGHLIGHTS) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextCount = rephraseHighlightCount + 1;\n\t\t\tsetRephraseHighlightCount(nextCount);\n\t\t\tif (typeof window !== 'undefined' && editorInstanceKey) {\n\t\t\t\tsessionStorage.setItem(highlightStorageKey, String(nextCount));\n\t\t\t}\n\t\t\tsetIsRephraseHighlighted(true);\n\t\t\tif (highlightResetRef.current) {\n\t\t\t\tclearTimeout(highlightResetRef.current);\n\t\t\t}\n\t\t\thighlightResetRef.current = setTimeout(() => {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t}, 1200);\n\t\t}, [\n\t\t\teditorInstanceKey,\n\t\t\thighlightStorageKey,\n\t\t\tisGenerating,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionCandidates,\n\t\t\trephraseHighlightCount,\n\t\t]);\n\n\t\tconst triggerRephraseHighlightRef = useRef(triggerRephraseHighlight);\n\t\ttriggerRephraseHighlightRef.current = triggerRephraseHighlight;\n\n\t\tfunction handleOnChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n\t\t\tconst text = stripHtmlTags(e.target.value);\n\t\t\tconst acceptedSuggestion = acceptedSuggestionStateRef.current;\n\t\t\tif (\n\t\t\t\tacceptedSuggestion &&\n\t\t\t\t!acceptedSuggestion.editedEventEmitted &&\n\t\t\t\ttext !== acceptedSuggestion.acceptedText\n\t\t\t) {\n\t\t\t\tacceptedSuggestionStateRef.current = {\n\t\t\t\t\t...acceptedSuggestion,\n\t\t\t\t\teditedEventEmitted: true,\n\t\t\t\t};\n\t\t\t\temitAIEvent('ai_suggestion_edited', {\n\t\t\t\t\taction_type: acceptedSuggestion.actionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (aiTagRecomputeRef.current) {\n\t\t\t\tclearTimeout(aiTagRecomputeRef.current);\n\t\t\t\taiTagRecomputeRef.current = null;\n\t\t\t}\n\t\t\tconst baselineAiTextForRecompute =\n\t\t\t\tacceptedSuggestion?.acceptedText ||\n\t\t\t\t(prefillWasAiGenerated ? prefillBaselineTextRef.current : '');\n\t\t\tif (baselineAiTextForRecompute && text !== baselineAiTextForRecompute) {\n\t\t\t\taiTagRecomputeRef.current = setTimeout(() => {\n\t\t\t\t\temitPostEditAiTagRecompute(text);\n\t\t\t\t}, AI_TAG_RECOMPUTE_IDLE_MS);\n\t\t\t}\n\t\t\tsetEditorText(text);\n\t\t\temitChangeWithGuard(text);\n\t\t}\n\n\t\tfunction setCaretPosition(caretPos: number) {\n\t\t\tconst elem = textSpaceRef?.current;\n\n\t\t\tif (elem != null) {\n\t\t\t\tif (elem.selectionStart) {\n\t\t\t\t\telem.focus();\n\t\t\t\t\telem.selectionEnd = caretPos;\n\t\t\t\t} else elem.focus();\n\t\t\t}\n\t\t}\n\n\t\tfunction onActionSelect(actionType: EditorActionTypes) {\n\t\t\tconst wildCard = WildCardMap[actionType];\n\t\t\tif (wildCard && textSpaceRef.current) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\n\t\t\t\tif (start === end) {\n\t\t\t\t\tconst { text } = insertTextAtIndex(wildCard, start);\n\t\t\t\t\tsetCaretPosition(start + 1);\n\t\t\t\t\temitChangeWithGuard(text);\n\t\t\t\t} else {\n\t\t\t\t\tconst { text } = addTextOrWrap(wildCard);\n\t\t\t\t\temitChangeWithGuard(text);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onEmojiAddition(emoji: string) {\n\t\t\tconst { text } = addText(emoji);\n\t\t\temitChangeWithGuard(text);\n\t\t}\n\n\t\tfunction addTextOrWrap(textToAdd?: string) {\n\t\t\tlet text = textSpaceRef.current?.value ?? '';\n\n\t\t\tif (textSpaceRef.current && textToAdd) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\n\t\t\t\tconst wildCard = textToAdd;\n\t\t\t\tif (start === end) {\n\t\t\t\t\t/** nothing is selected */\n\t\t\t\t\t/** so append the wildcard at the end */\n\n\t\t\t\t\treturn addText(wildCard);\n\t\t\t\t} else {\n\t\t\t\t\ttext = baseWhatsappContentLang.wrappWildcard(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\twildCard,\n\t\t\t\t\t\ttext!,\n\t\t\t\t\t);\n\t\t\t\t\tconst html = baseWhatsappContentLang.getHTML(text);\n\t\t\t\t\tsetEditorText(text);\n\t\t\t\t\treturn { text, html };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { text: text!, html: text! };\n\t\t}\n\n\t\tfunction addText(textToAdd: string) {\n\t\t\tconst text = textSpaceRef.current?.value ?? '';\n\n\t\t\tif (textSpaceRef.current && textToAdd) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\t\t\t\tif (start === end) {\n\t\t\t\t\treturn insertTextAtIndex(textToAdd, start);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { text: text!, html: text! };\n\t\t}\n\n\t\tfunction insertTextAtIndex(textToAdd: string, index: number) {\n\t\t\tlet text = textSpaceRef.current?.value ?? '';\n\n\t\t\ttext = text.slice(0, index) + textToAdd + text.slice(index);\n\t\t\tconst html = baseWhatsappContentLang.getHTML(text);\n\t\t\tsetEditorText(text);\n\t\t\treturn { text, html };\n\t\t}\n\n\t\tuseEffect(() => {\n\t\t\tif (typeof window === 'undefined' || !editorInstanceKey) return;\n\t\t\tconst cached = Number(sessionStorage.getItem(highlightStorageKey) || '0');\n\t\t\tif (!Number.isNaN(cached)) {\n\t\t\t\tsetRephraseHighlightCount(cached);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tsessionStorage.removeItem(highlightStorageKey);\n\t\t\t};\n\t\t}, [editorInstanceKey, highlightStorageKey]);\n\n\t\tuseEffect(() => {\n\t\t\tif (isGenerating) {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!!suggestionBaseText && suggestionCandidates.length > 0) {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst eligible =\n\t\t\t\t!!currentText.trim() && currentText.length >= rephraseMinChars;\n\n\t\t\tif (prevRephraseEligibleRef.current === null) {\n\t\t\t\tprevRephraseEligibleRef.current = eligible;\n\t\t\t\tif (eligible) {\n\t\t\t\t\trephraseIdleRef.current = setTimeout(() => {\n\t\t\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t\t\t}, REPHRASE_IDLE_MS);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!eligible) {\n\t\t\t\tprevRephraseEligibleRef.current = false;\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst crossedThreshold = !prevRephraseEligibleRef.current && eligible;\n\t\t\tprevRephraseEligibleRef.current = true;\n\n\t\t\tif (crossedThreshold) {\n\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t}\n\n\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t}\n\t\t\trephraseIdleRef.current = setTimeout(() => {\n\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t}, REPHRASE_IDLE_MS);\n\t\t}, [\n\t\t\tcurrentText,\n\t\t\tisGenerating,\n\t\t\trephraseMinChars,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionCandidates,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (rephraseIdleRef.current) clearTimeout(rephraseIdleRef.current);\n\t\t\t\tif (highlightResetRef.current) clearTimeout(highlightResetRef.current);\n\t\t\t\tif (deferredHtmlRef.current) clearTimeout(deferredHtmlRef.current);\n\t\t\t\tif (aiTagRecomputeRef.current) clearTimeout(aiTagRecomputeRef.current);\n\t\t\t};\n\t\t}, []);\n\n\t\tconst activeCandidate = suggestionCandidates[suggestionIndex] || '';\n\t\tconst activeFeedbackCandidateKey = useMemo(() => {\n\t\t\tif (!suggestionActionType || !activeCandidate) return null;\n\t\t\treturn `${suggestionActionType}-${suggestionIndex}-${activeCandidate}`;\n\t\t}, [activeCandidate, suggestionActionType, suggestionIndex]);\n\t\tconst hasFeedbackForActiveCandidate = !!(\n\t\t\tactiveFeedbackCandidateKey &&\n\t\t\tfeedbackVotesByCandidate[activeFeedbackCandidateKey]\n\t\t);\n\t\tconst suggestionBaseHtml = useMemo(\n\t\t\t() => baseWhatsappContentLang.getHTML(suggestionBaseText || ''),\n\t\t\t[suggestionBaseText],\n\t\t);\n\t\tconst activeCandidateHtml = useMemo(\n\t\t\t() => baseWhatsappContentLang.getHTML(activeCandidate),\n\t\t\t[activeCandidate],\n\t\t);\n\t\tconst canRegenerate = suggestionCandidates.length < MAX_SUGGESTIONS;\n\t\tconst shouldShowSuggestionSession =\n\t\t\t!!suggestionBaseText && suggestionCandidates.length > 0;\n\t\tconst isPrevSuggestionDisabled =\n\t\t\tsuggestionCandidates.length <= 1 || suggestionIndex <= 0;\n\t\tconst isNextSuggestionDisabled =\n\t\t\tsuggestionCandidates.length <= 1 ||\n\t\t\tsuggestionIndex >= suggestionCandidates.length - 1;\n\n\t\tuseEffect(() => {\n\t\t\tif (!shouldShowSuggestionSession) return;\n\t\t\tconst node = suggestionScrollRef.current;\n\t\t\tif (!node) return;\n\t\t\tnode.scrollTop = node.scrollHeight;\n\t\t}, [activeCandidate, shouldShowSuggestionSession, isGenerating]);\n\n\t\tconst executeAIAction = useCallback(\n\t\t\tasync (\n\t\t\t\tactionType: AIEditorActionType,\n\t\t\t\tregenerateExisting = false,\n\t\t\t\tinstructionOverride?: string,\n\t\t\t\ttoneOverrideId?: string,\n\t\t\t\tactionVariant: AIActionVariant = AIActionVariant.DEFAULT,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\t!onAIActionRequest &&\n\t\t\t\t\t!apiAdapter &&\n\t\t\t\t\t(!requestExecutor || !baseUrl)\n\t\t\t\t) {\n\t\t\t\t\tonError?.('AI configuration missing');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!currentText.trim()) return;\n\t\t\t\tconst minCharsForAction =\n\t\t\t\t\tminCharsByAction[actionType] ||\n\t\t\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[actionType] ||\n\t\t\t\t\t50;\n\t\t\t\tif (currentText.length < minCharsForAction) return;\n\t\t\t\tif (isGenerating) return;\n\t\t\t\tif (regenerateExisting && !canRegenerate) return;\n\n\t\t\t\tconst baseConfig = activeActionPrompts[actionType];\n\t\t\t\tconst config =\n\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\ttemplateType === 'utility' &&\n\t\t\t\t\tactionVariant === AIActionVariant.REPHRASE\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...baseConfig,\n\t\t\t\t\t\t\t\tlabel: 'Rephrase',\n\t\t\t\t\t\t\t\tbasePrompt: UTILITY_REPHRASE_PROMPT,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: baseConfig;\n\t\t\t\t// Tone is sent only after explicit user selection (or explicit override),\n\t\t\t\t// not from default tone metadata.\n\t\t\t\tconst selectedToneId = toneOverrideId || toneByAction[actionType];\n\t\t\t\tconst selectedTone = config.tones?.find(\n\t\t\t\t\t(tone) => tone.id === selectedToneId,\n\t\t\t\t);\n\t\t\t\tconst instructionForPrompt =\n\t\t\t\t\tinstructionOverride !== undefined\n\t\t\t\t\t\t? instructionOverride\n\t\t\t\t\t\t: instructionText;\n\t\t\t\tconst prompt =\n\t\t\t\t\tonBuildAIPrompt?.({\n\t\t\t\t\t\tactionType,\n\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\ttemplateType,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\ttoneId: selectedToneId,\n\t\t\t\t\t\ttoneLabel: selectedTone?.label,\n\t\t\t\t\t\tinstructionText: instructionForPrompt || undefined,\n\t\t\t\t\t}) ||\n\t\t\t\t\tbuildActionPrompt({\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\tselectedToneId,\n\t\t\t\t\t\tinstructionText: instructionForPrompt,\n\t\t\t\t\t});\n\n\t\t\t\tsetIsGenerating(true);\n\t\t\t\temitAIEvent('ai_action_triggered', {\n\t\t\t\t\taction_type: actionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\ttemplate_category: templateType,\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tconst result = onAIActionRequest\n\t\t\t\t\t\t? await onAIActionRequest({\n\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\t\t\ttemplateType,\n\t\t\t\t\t\t\t\ttoneId: selectedToneId,\n\t\t\t\t\t\t\t\ttoneLabel: selectedTone?.label,\n\t\t\t\t\t\t\t\tinstructionText: instructionForPrompt || undefined,\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t })\n\t\t\t\t\t\t: await requestAISuggestion({\n\t\t\t\t\t\t\t\tapiAdapter,\n\t\t\t\t\t\t\t\trequestExecutor,\n\t\t\t\t\t\t\t\tbaseUrl,\n\t\t\t\t\t\t\t\tendpointPath,\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\t\tintent,\n\t\t\t\t\t\t\t\tconversationId,\n\t\t\t\t\t\t\t\tsystemId,\n\t\t\t\t\t\t\t\tuseCase,\n\t\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t });\n\t\t\t\t\tconst candidate =\n\t\t\t\t\t\ttypeof result === 'string'\n\t\t\t\t\t\t\t? result.trim()\n\t\t\t\t\t\t\t: (result?.body || '').trim();\n\t\t\t\t\tif (!candidate) return;\n\t\t\t\t\tif (!regenerateExisting) {\n\t\t\t\t\t\tsetSuggestionBaseText(currentText);\n\t\t\t\t\t\tsetSuggestionActionType(actionType);\n\t\t\t\t\t\tsetSuggestionCandidates([candidate]);\n\t\t\t\t\t\tsetSuggestionIndex(0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetSuggestionCandidates((prev) => {\n\t\t\t\t\t\tconst next = [...prev, candidate].slice(0, MAX_SUGGESTIONS);\n\t\t\t\t\t\tsetSuggestionIndex(next.length - 1);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tonError?.('Failed to generate AI suggestion');\n\t\t\t\t} finally {\n\t\t\t\t\tsetIsGenerating(false);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\trequestExecutor,\n\t\t\t\tbaseUrl,\n\t\t\t\tcurrentText,\n\t\t\t\tisGenerating,\n\t\t\t\tcanRegenerate,\n\t\t\t\tactiveActionPrompts,\n\t\t\t\ttoneByAction,\n\t\t\t\tinstructionText,\n\t\t\t\temitAIEvent,\n\t\t\t\ttemplateId,\n\t\t\t\tendpointPath,\n\t\t\t\tapiAdapter,\n\t\t\t\tintent,\n\t\t\t\tconversationId,\n\t\t\t\tsystemId,\n\t\t\t\tuseCase,\n\t\t\t\tstoreId,\n\t\t\t\ttemplateType,\n\t\t\t\tonError,\n\t\t\t\tminCharsByAction,\n\t\t\t\tonAIActionRequest,\n\t\t\t\tonBuildAIPrompt,\n\t\t\t],\n\t\t);\n\n\t\tconst handleAcceptSuggestion = useCallback(() => {\n\t\t\tif (!activeCandidate || !suggestionBaseText || !suggestionActionType)\n\t\t\t\treturn;\n\t\t\tsetEditorText(activeCandidate);\n\t\t\temitChangeWithGuard(activeCandidate);\n\t\t\temitAIEvent('ai_suggestion_accepted', {\n\t\t\t\taction_type: suggestionActionType,\n\t\t\t\ttemplate_id: templateId,\n\t\t\t});\n\t\t\tacceptedSuggestionStateRef.current = {\n\t\t\t\tacceptedText: activeCandidate,\n\t\t\t\tbaselineText: suggestionBaseText,\n\t\t\t\tactionType: suggestionActionType,\n\t\t\t\teditedEventEmitted: false,\n\t\t\t};\n\n\t\t\tconst inInitialAiPhase = initialAiPrefillPhaseRef.current;\n\t\t\tconst tagPayload = computeAiTagOnAccept({\n\t\t\t\tbaselineText: suggestionBaseText,\n\t\t\t\tacceptedText: activeCandidate,\n\t\t\t\tinitialAiPrefillPhase: inInitialAiPhase,\n\t\t\t});\n\t\t\tif (inInitialAiPhase) {\n\t\t\t\tinitialAiPrefillPhaseRef.current = false;\n\t\t\t}\n\t\t\tonAITagComputed?.({\n\t\t\t\t...tagPayload,\n\t\t\t\tsource: 'accept',\n\t\t\t});\n\t\t\tclearSuggestionSession();\n\t\t}, [\n\t\t\tactiveCandidate,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionActionType,\n\t\t\tsetEditorText,\n\t\t\temitChangeWithGuard,\n\t\t\temitAIEvent,\n\t\t\ttemplateId,\n\t\t\tonAITagComputed,\n\t\t\tclearSuggestionSession,\n\t\t]);\n\n\t\tconst handleRejectSuggestion = useCallback(() => {\n\t\t\tif (!suggestionActionType) return;\n\t\t\temitAIEvent('ai_suggestion_discarded', {\n\t\t\t\taction_type: suggestionActionType,\n\t\t\t\ttemplate_id: templateId,\n\t\t\t});\n\t\t\tclearSuggestionSession();\n\t\t}, [clearSuggestionSession, emitAIEvent, suggestionActionType, templateId]);\n\n\t\tconst handleFeedback = useCallback(\n\t\t\t(rating: AIFeedbackRating) => {\n\t\t\t\tif (!suggestionActionType || !activeFeedbackCandidateKey) return;\n\t\t\t\tif (feedbackVotesByCandidate[activeFeedbackCandidateKey]) return;\n\t\t\t\tsetFeedbackVotesByCandidate((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t[activeFeedbackCandidateKey]: rating,\n\t\t\t\t}));\n\t\t\t\temitAIEvent('ai_feedback_submitted', {\n\t\t\t\t\taction_type: suggestionActionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\trating,\n\t\t\t\t\tcandidate_index: suggestionIndex + 1,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[\n\t\t\t\tactiveFeedbackCandidateKey,\n\t\t\t\temitAIEvent,\n\t\t\t\tfeedbackVotesByCandidate,\n\t\t\t\tsuggestionActionType,\n\t\t\t\tsuggestionIndex,\n\t\t\t\ttemplateId,\n\t\t\t],\n\t\t);\n\n\t\tconst aiHeaderActions: AIHeaderAction[] = useMemo(() => {\n\t\t\tif (disableBuiltInAIActions) return [];\n\t\t\treturn enabledAIActions.map((actionType) => {\n\t\t\t\tconst actionConfig = activeActionPrompts[actionType];\n\t\t\t\tconst toneId = toneByAction[actionType];\n\t\t\t\treturn {\n\t\t\t\t\ttype: actionType,\n\t\t\t\t\tlabel: actionConfig.label,\n\t\t\t\t\tisPrimary: actionType === AIEditorActionTypes.REPHRASE,\n\t\t\t\t\tloading: isGenerating && suggestionActionType === actionType,\n\t\t\t\t\thighlighted:\n\t\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\t\tisRephraseHighlighted,\n\t\t\t\t\tdisabled:\n\t\t\t\t\t\t!currentText.trim() ||\n\t\t\t\t\t\tcurrentText.length <\n\t\t\t\t\t\t\t(minCharsByAction[actionType] ||\n\t\t\t\t\t\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[actionType] ||\n\t\t\t\t\t\t\t\t50) ||\n\t\t\t\t\t\tisGenerating ||\n\t\t\t\t\t\t(shouldShowSuggestionSession &&\n\t\t\t\t\t\t\tsuggestionActionType === actionType),\n\t\t\t\t\tshowToneDropdown:\n\t\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\t\t!!actionConfig.tones?.length,\n\t\t\t\t\ttones: actionConfig.tones,\n\t\t\t\t\tselectedToneId: toneId,\n\t\t\t\t};\n\t\t\t});\n\t\t}, [\n\t\t\tenabledAIActions,\n\t\t\tdisableBuiltInAIActions,\n\t\t\tactiveActionPrompts,\n\t\t\ttoneByAction,\n\t\t\tisGenerating,\n\t\t\tsuggestionActionType,\n\t\t\tshouldShowSuggestionSession,\n\t\t\tisRephraseHighlighted,\n\t\t\tcurrentText,\n\t\t\tminCharsByAction,\n\t\t]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => {\n\t\t\t\treturn {\n\t\t\t\t\taddTextOrWrap,\n\t\t\t\t\taddText,\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn currentText;\n\t\t\t\t\t},\n\t\t\t\t\tsetCaretPosition,\n\t\t\t\t};\n\t\t\t},\n\t\t\t[addTextOrWrap, addText, currentText],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (inputValue === undefined) return;\n\t\t\tsetEditorText(inputValue || '');\n\t\t}, [inputValue, setEditorText]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!limit || !onError) return;\n\t\t\tconst nextError =\n\t\t\t\tcurrentText.length > limit ? LIMIT_REACHED : error ?? '';\n\t\t\tif (lastEmittedEditorErrorRef.current === nextError) return;\n\t\t\tlastEmittedEditorErrorRef.current = nextError;\n\t\t\tonError(nextError);\n\t\t}, [currentText, error, limit, onError]);\n\n\t\treturn (\n\t\t\t<OuterContainer>\n\t\t\t\t<EditorFooterRow>\n\t\t\t\t\t<EditorFooterTitle>\n\t\t\t\t\t\t{editorHeader ? (\n\t\t\t\t\t\t\t<TitleSmall data-test=\"body-text-for-edit-template\">\n\t\t\t\t\t\t\t\t{editorHeader}\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</EditorFooterTitle>\n\t\t\t\t\t<EditorFooterRight>\n\t\t\t\t\t\t{error && error !== LIMIT_REACHED ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.negative}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.negative}>\n\t\t\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{limit ? (\n\t\t\t\t\t\t\t<BodyCaption\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\terror === LIMIT_REACHED || currentText.length > limit\n\t\t\t\t\t\t\t\t\t\t\t? COLORS.content.negative\n\t\t\t\t\t\t\t\t\t\t\t: COLORS.content.secondary,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{currentText.length}/{limit}\n\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</EditorFooterRight>\n\t\t\t\t</EditorFooterRow>\n\t\t\t\t<Container isError={!!error}>\n\t\t\t\t\t{shouldShowSuggestionSession ? (\n\t\t\t\t\t\t<SuggestionSessionContainer ref={suggestionScrollRef}>\n\t\t\t\t\t\t\t<SuggestionBaselineText\n\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: suggestionBaseHtml }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{isGenerating ? (\n\t\t\t\t\t\t\t\t<SuggestionCandidateText aria-busy=\"true\">\n\t\t\t\t\t\t\t\t\t<SuggestionCandidateSkeleton>\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"96%\" />\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"84%\" />\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"68%\" />\n\t\t\t\t\t\t\t\t\t</SuggestionCandidateSkeleton>\n\t\t\t\t\t\t\t\t</SuggestionCandidateText>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<SuggestionCandidateText\n\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t__html: activeCandidateHtml,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<SuggestionControlsRow>\n\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\taria-label=\"Previous suggestion\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={isPrevSuggestionDisabled}\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetSuggestionIndex((idx) => Math.max(0, idx - 1))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronLeftIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t<SuggestionCounter>\n\t\t\t\t\t\t\t\t\t{suggestionIndex + 1}/{suggestionCandidates.length}\n\t\t\t\t\t\t\t\t</SuggestionCounter>\n\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\taria-label=\"Next suggestion\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={isNextSuggestionDisabled}\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetSuggestionIndex((idx) =>\n\t\t\t\t\t\t\t\t\t\t\tMath.min(suggestionCandidates.length - 1, idx + 1),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Like\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Like suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdisabled={hasFeedbackForActiveCandidate}\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(AIFeedbackRating.LIKE)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ThumbsUpIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Dislike\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Dislike suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdisabled={hasFeedbackForActiveCandidate}\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(AIFeedbackRating.DISLIKE)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ThumbsDownIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t{canRegenerate ? (\n\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\tbody={isGenerating ? 'Regenerating…' : 'Regenerate'}\n\t\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SuggestionRegenerateButton\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Regenerate suggestion\"\n\t\t\t\t\t\t\t\t\t\t\taria-busy={isGenerating}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={isGenerating}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (suggestionActionType) {\n\t\t\t\t\t\t\t\t\t\t\t\t\texecuteAIAction(suggestionActionType, true);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{isGenerating ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<RegenerateIconShimmer aria-hidden />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<RewindIcon width={14} height={14} />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</SuggestionRegenerateButton>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<Tooltip body=\"Discard\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Discard suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleRejectSuggestion}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Accept\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Accept suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleAcceptSuggestion}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CheckIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t</SuggestionControlsRow>\n\t\t\t\t\t\t</SuggestionSessionContainer>\n\t\t\t\t\t) : isGenerating ? (\n\t\t\t\t\t\t<EditorSkeletonContainer>\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"96%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"92%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"88%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"54%\" />\n\t\t\t\t\t\t</EditorSkeletonContainer>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<TextSpace\n\t\t\t\t\t\t\tref={textSpaceRef}\n\t\t\t\t\t\t\t{...textAreaProps}\n\t\t\t\t\t\t\tvalue={currentText}\n\t\t\t\t\t\t\tonChange={handleOnChange}\n\t\t\t\t\t\t\tonBlur={(e) => {\n\t\t\t\t\t\t\t\tif (aiTagRecomputeRef.current) {\n\t\t\t\t\t\t\t\t\tclearTimeout(aiTagRecomputeRef.current);\n\t\t\t\t\t\t\t\t\taiTagRecomputeRef.current = null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temitPostEditAiTagRecompute(e.target.value);\n\t\t\t\t\t\t\t\ttextAreaOnBlur?.(e);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPaste={(e) => {\n\t\t\t\t\t\t\t\tconst pastedText = e.clipboardData.getData('text');\n\t\t\t\t\t\t\t\tif (pastedText.length > LARGE_INPUT_THRESHOLD) {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst el = textSpaceRef.current;\n\t\t\t\t\t\t\t\t\tconst start = el?.selectionStart ?? 0;\n\t\t\t\t\t\t\t\t\tconst end = el?.selectionEnd ?? start;\n\t\t\t\t\t\t\t\t\t// Prefer live DOM value — `currentText` can lag the textarea for big pastes.\n\t\t\t\t\t\t\t\t\tconst base = el?.value ?? currentText;\n\t\t\t\t\t\t\t\t\tconst nextText =\n\t\t\t\t\t\t\t\t\t\tbase.slice(0, start) + pastedText + base.slice(end);\n\t\t\t\t\t\t\t\t\tsetEditorText(nextText);\n\t\t\t\t\t\t\t\t\temitChangeWithGuard(nextText);\n\t\t\t\t\t\t\t\t\tconst caret = start + pastedText.length;\n\t\t\t\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\t\t\t\tconst ta = textSpaceRef.current;\n\t\t\t\t\t\t\t\t\t\tif (!ta) return;\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tta.setSelectionRange(caret, caret);\n\t\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\t\t// ignore invalid range in edge browsers\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\trows={rows}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{isInstructionInputVisible ? (\n\t\t\t\t\t\t<InstructionContainer>\n\t\t\t\t\t\t\t<InstructionInputRow>\n\t\t\t\t\t\t\t\t<EditIcon\n\t\t\t\t\t\t\t\t\twidth={18}\n\t\t\t\t\t\t\t\t\theight={18}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<InstructionInput\n\t\t\t\t\t\t\t\t\tvalue={instructionText}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Add specific instructions to refine your message\"\n\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\tsetInstructionText(stripHtmlTags(e.target.value))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<InstructionActions>\n\t\t\t\t\t\t\t\t\t<InstructionCancel\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tsetInstructionText('');\n\t\t\t\t\t\t\t\t\t\t\tsetIsInstructionInputVisible(false);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t</InstructionCancel>\n\t\t\t\t\t\t\t\t\t<InstructionImprove\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tconst instructionToApply = instructionText.trim();\n\t\t\t\t\t\t\t\t\t\t\tif (instructionToApply) {\n\t\t\t\t\t\t\t\t\t\t\t\temitAIEvent('ai_instruction_used', {\n\t\t\t\t\t\t\t\t\t\t\t\t\taction_type: AIEditorActionTypes.REPHRASE,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tinstruction_text:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanonymizeInstructionText(instructionToApply),\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tsetIsInstructionInputVisible(false);\n\t\t\t\t\t\t\t\t\t\t\tsetInstructionText('');\n\t\t\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\t\t\tAIEditorActionTypes.REPHRASE,\n\t\t\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\t\t\tinstructionToApply,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tImprove\n\t\t\t\t\t\t\t\t\t</InstructionImprove>\n\t\t\t\t\t\t\t\t</InstructionActions>\n\t\t\t\t\t\t\t</InstructionInputRow>\n\t\t\t\t\t\t\t{instructionText.trim().length > 0 &&\n\t\t\t\t\t\t\tfilteredInstructionSuggestions.length > 0 ? (\n\t\t\t\t\t\t\t\t<InstructionSuggestionList>\n\t\t\t\t\t\t\t\t\t{filteredInstructionSuggestions.map((suggestion) => (\n\t\t\t\t\t\t\t\t\t\t<InstructionSuggestionButton\n\t\t\t\t\t\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tselected={instructionText === suggestion}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setInstructionText(suggestion)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\t\t\t\t\t</InstructionSuggestionButton>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</InstructionSuggestionList>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</InstructionContainer>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<WhatsAppTextEditorHeader\n\t\t\t\t\t\t\tactions={actions}\n\t\t\t\t\t\t\tref={textSpaceRef}\n\t\t\t\t\t\t\tonActionSelect={onActionSelect}\n\t\t\t\t\t\t\tRightComponent={RightComponent}\n\t\t\t\t\t\t\trightActionsDisabled={shouldShowSuggestionSession || isGenerating}\n\t\t\t\t\t\t\tonEmojiClick={onEmojiAddition}\n\t\t\t\t\t\t\taiActions={aiHeaderActions}\n\t\t\t\t\t\t\tdisableAllActions={shouldShowSuggestionSession || isGenerating}\n\t\t\t\t\t\t\tinstructionActive={isInstructionInputVisible}\n\t\t\t\t\t\t\tonAIInstructionsClick={() => setIsInstructionInputVisible(true)}\n\t\t\t\t\t\t\tonAIToneChange={(actionType, toneId) => {\n\t\t\t\t\t\t\t\tsetToneByAction((prev) => ({ ...prev, [actionType]: toneId }));\n\t\t\t\t\t\t\t\tonAIToneSelect?.(actionType, toneId);\n\t\t\t\t\t\t\t\tif (actionType === AIEditorActionTypes.REPHRASE) {\n\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\ttoneId,\n\t\t\t\t\t\t\t\t\t\tAIActionVariant.DEFAULT,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonAIActionClick={(\n\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\tactionVariant = AIActionVariant.DEFAULT,\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (isGenerating) return;\n\n\t\t\t\t\t\t\t\tif (shouldShowSuggestionSession) {\n\t\t\t\t\t\t\t\t\tif (suggestionActionType === actionType) {\n\t\t\t\t\t\t\t\t\t\t// Same action should not retrigger from chip;\n\t\t\t\t\t\t\t\t\t\t// regenerate is only via explicit regenerate control.\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// New action starts a fresh suggestion session.\n\t\t\t\t\t\t\t\t\tclearSuggestionSession();\n\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</Container>\n\t\t\t</OuterContainer>\n\t\t);\n\t},\n);\n\nWhatsAppTextEditor.displayName = 'WhatsAppTextEditor';\n\nexport type { AITagPayload } from './ai/aiTag';\nexport {\n\tAI_TAG_CHANGE_RATIO_THRESHOLD,\n\tcomputeAiTagOnAccept,\n\tlevenshteinDistance,\n} from './ai/aiTag';\n"],"names":["LIMIT_REACHED","REPHRASE_IDLE_MS","MAX_REPHRASE_HIGHLIGHTS","MAX_SUGGESTIONS","LARGE_INPUT_THRESHOLD","AI_TAG_RECOMPUTE_IDLE_MS","UTILITY_REPHRASE_PROMPT","skeletonPulse","keyframes","EditorSkeletonContainer","styled","EditorSkeletonLine","props","SuggestionSessionContainer","SuggestionBaselineText","COLORS","SuggestionCandidateText","SuggestionCandidateSkeleton","SuggestionControlsRow","SuggestionCounter","SuggestionIconButton","SuggestionRegenerateButton","RegenerateIconShimmer","InstructionContainer","InstructionInputRow","InstructionInput","InstructionActions","InstructionCancel","InstructionImprove","InstructionSuggestionList","InstructionSuggestionButton","baseWhatsappContentLang","BaseWhatsappContentLangHelper","WildCardMap","EditorActionTypes","getHighlightStorageKey","editorInstanceKey","WhatsAppTextEditor","React","onChange","onClickVariable","inputValue","RightComponent","error","limit","onError","rows","actions","editorSessionId","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","AIEditorActionTypes","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","DEFAULT_INSTRUCTION_SUGGESTIONS","onAnalyticsEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt","textAreaOnBlur","textAreaProps","ref","textSpaceRef","useRef","currentText","setCurrentText","useState","isRephraseHighlighted","setIsRephraseHighlighted","rephraseHighlightCount","setRephraseHighlightCount","isGenerating","setIsGenerating","isInstructionInputVisible","setIsInstructionInputVisible","instructionText","setInstructionText","toneByAction","setToneByAction","suggestionBaseText","setSuggestionBaseText","suggestionCandidates","setSuggestionCandidates","suggestionIndex","setSuggestionIndex","suggestionActionType","setSuggestionActionType","suggestionScrollRef","rephraseIdleRef","highlightResetRef","aiTagRecomputeRef","prevRephraseEligibleRef","deferredHtmlRef","lastEmittedEditorErrorRef","initialAiPrefillPhaseRef","acceptedSuggestionStateRef","prefillBaselineTextRef","prefillBaselineCapturedRef","feedbackVotesByCandidate","setFeedbackVotesByCandidate","mountSessionIdRef","highlightStorageKey","useMemo","useEffect","seed","activeActionPrompts","resolveActionPrompts","filteredInstructionSuggestions","query","suggestion","minCharsByAction","DEFAULT_AI_ACTION_MIN_CHARS","rephraseMinChars","anonymizeInstructionText","useCallback","value","normalized","words","emitAIEvent","name","payload","setEditorText","nextText","prev","emitChangeWithGuard","emitPostEditAiTagRecompute","latestBaseline","recomputePayload","computeAiTagOnPostEdit","clearSuggestionSession","triggerRephraseHighlight","nextCount","triggerRephraseHighlightRef","handleOnChange","text","stripHtmlTags","acceptedSuggestion","baselineAiTextForRecompute","setCaretPosition","caretPos","elem","onActionSelect","actionType","wildCard","start","end","insertTextAtIndex","addTextOrWrap","onEmojiAddition","emoji","addText","textToAdd","html","index","cached","eligible","crossedThreshold","activeCandidate","activeFeedbackCandidateKey","hasFeedbackForActiveCandidate","suggestionBaseHtml","activeCandidateHtml","canRegenerate","shouldShowSuggestionSession","isPrevSuggestionDisabled","isNextSuggestionDisabled","node","executeAIAction","regenerateExisting","instructionOverride","toneOverrideId","actionVariant","AIActionVariant","minCharsForAction","baseConfig","config","selectedToneId","selectedTone","tone","instructionForPrompt","prompt","buildActionPrompt","result","requestAISuggestion","candidate","next","handleAcceptSuggestion","inInitialAiPhase","tagPayload","computeAiTagOnAccept","handleRejectSuggestion","handleFeedback","rating","aiHeaderActions","actionConfig","toneId","useImperativeHandle","nextError","OuterContainer","jsxs","EditorFooterRow","jsx","EditorFooterTitle","TitleSmall","EditorFooterRight","Fragment","InfoIcon","BodyCaption","Container","idx","ChevronLeftIcon","ChevronRightIcon","Tooltip","ThumbsUpIcon","ThumbsDownIcon","RewindIcon","CrossIcon","CheckIcon","TextSpace","pastedText","el","base","caret","ta","EditIcon","instructionToApply","WhatsAppTextEditorHeader"],"mappings":"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"}
1
+ {"version":3,"file":"WhatsAppTextEditor.js","sources":["../../../../src/components/WhatsAppTextEditor/WhatsAppTextEditor.tsx"],"sourcesContent":["import CheckIcon from '@src/assets/icons/check.svg';\nimport ChevronLeftIcon from '@src/assets/icons/chevronLeft.svg';\nimport ChevronRightIcon from '@src/assets/icons/chevronRight.svg';\nimport CrossIcon from '@src/assets/icons/cross.svg';\nimport EditIcon from '@src/assets/icons/edit.svg';\nimport InfoIcon from '@src/assets/icons/info.svg';\nimport RewindIcon from '@src/assets/icons/rewind.svg';\nimport ThumbsDownIcon from '@src/assets/icons/thumb-down-line.svg';\nimport ThumbsUpIcon from '@src/assets/icons/thumb-up-line.svg';\nimport { BaseWhatsappContentLangHelper } from '@src/helpers/BaseWhatsappContentLang.helper';\nimport React, {\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { COLORS } from '@src/constants/Theme';\nimport type { ApiRequestExecutor } from '../bik-chatbot/types';\nimport type { APIAdapter } from '../bik-chatbot/types/ai';\nimport { Tooltip } from '../tooltips/Tooltip';\nimport { BodyCaption, TitleSmall } from '../TypographyStyle';\nimport {\n\tAIActionPromptConfig,\n\tAIActionPromptRegistry,\n\tDEFAULT_AI_ACTION_MIN_CHARS,\n\tDEFAULT_INSTRUCTION_SUGGESTIONS,\n\tresolveActionPrompts,\n\tTemplateType,\n} from './ai/actionRegistry';\nimport {\n\tAITagPayload,\n\tcomputeAiTagOnAccept,\n\tcomputeAiTagOnPostEdit,\n} from './ai/aiTag';\nimport { buildActionPrompt, requestAISuggestion } from './ai/api';\nimport { AIActionToneOption } from './AIRephraseButton';\nimport {\n\tContainer,\n\tEditorFooterRight,\n\tEditorFooterRow,\n\tEditorFooterTitle,\n\tOuterContainer,\n\tTextSpace,\n} from './CustomEditor.styled';\nimport {\n\tAIActionVariant,\n\tAIEditorActionType,\n\tAIEditorActionTypes,\n\tAIHeaderAction,\n\tEditorActionTypes,\n\tWhatsAppEditorRightSlotProps,\n\tWhatsAppTextEditorHeader,\n} from './WhatsAppTextEditorHeader';\n\nconst LIMIT_REACHED = 'Character limit reached';\nconst REPHRASE_IDLE_MS = 3000;\nconst MAX_REPHRASE_HIGHLIGHTS = 5;\nconst MAX_SUGGESTIONS = 3;\nconst LARGE_INPUT_THRESHOLD = 1200;\nconst AI_TAG_RECOMPUTE_IDLE_MS = 1000;\nconst UTILITY_REPHRASE_PROMPT =\n\t'Rephrase this WhatsApp utility template to improve clarity and readability while preserving variables, intent, and compliance.';\n\nconst skeletonPulse = keyframes`\n\t0% { opacity: 0.55; }\n\t50% { opacity: 1; }\n\t100% { opacity: 0.55; }\n`;\n\nconst EditorSkeletonContainer = styled.div`\n\tpadding: 14px 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n\tmin-height: 150px;\n`;\n\nconst EditorSkeletonLine = styled.div<{ width: string }>`\n\theight: 16px;\n\tborder-radius: 6px;\n\twidth: ${(props) => props.width};\n\tbackground: #ececef;\n\tanimation: ${skeletonPulse} 1.1s ease-in-out infinite;\n`;\n\nconst SuggestionSessionContainer = styled.div`\n\tpadding: 12px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmax-height: 260px;\n\toverflow-y: scroll;\n\tscrollbar-width: thin;\n\tscrollbar-color: #c8c8cf transparent;\n\t::-webkit-scrollbar {\n\t\twidth: 8px;\n\t}\n\t::-webkit-scrollbar-thumb {\n\t\tbackground: #c8c8cf;\n\t\tborder-radius: 8px;\n\t}\n\t::-webkit-scrollbar-track {\n\t\tbackground: transparent;\n\t}\n`;\n\nconst SuggestionBaselineText = styled.div`\n\ttext-decoration: line-through;\n\tcolor: ${COLORS.content.secondary};\n`;\n\nconst SuggestionCandidateText = styled.div`\n\tcolor: ${COLORS.content.primary};\n`;\n\nconst SuggestionCandidateSkeleton = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\twidth: 100%;\n\tmin-height: 40px;\n`;\n\nconst SuggestionControlsRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n`;\n\nconst SuggestionCounter = styled.span`\n\tcolor: ${COLORS.content.primary};\n\tfont-size: 14px;\n`;\n\nconst SuggestionIconButton = styled.button`\n\tborder: 0;\n\tbackground: transparent;\n\tpadding: 6px;\n\tborder-radius: 6px;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcursor: pointer;\n\tcolor: ${COLORS.content.primary};\n\ttransition: background-color 0.12s ease;\n\t:not(:disabled):hover {\n\t\tbackground-color: ${COLORS.surface.hovered};\n\t}\n\t:disabled {\n\t\topacity: 0.35;\n\t\tcursor: not-allowed;\n\t}\n`;\n\n/** Regenerate stays full opacity while disabled so the loading shimmer stays visible (same pulse as editor skeleton). */\nconst SuggestionRegenerateButton = styled(SuggestionIconButton)`\n\t:disabled {\n\t\topacity: 1;\n\t\tcursor: wait;\n\t}\n`;\n\nconst RegenerateIconShimmer = styled.div`\n\twidth: 14px;\n\theight: 14px;\n\tborder-radius: 4px;\n\tbackground: #ececef;\n\tflex-shrink: 0;\n\tanimation: ${skeletonPulse} 1.1s ease-in-out infinite;\n`;\n\n/** Same bottom toolbar slot as `WhatsAppTextEditorHeader` — replaces the full icon/AI panel while open. */\nconst InstructionContainer = styled.div`\n\tbackground: ${COLORS.surface.standard};\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 8px 12px;\n\tgap: 10px;\n\tborder-radius: 0 0 4px 4px;\n\tposition: relative;\n`;\n\nconst InstructionInputRow = styled.div`\n\tborder: 1px solid #f5a4c0;\n\tborder-radius: 10px;\n\tpadding: 8px 10px;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tbackground: ${COLORS.surface.standard};\n`;\n\nconst InstructionInput = styled.input`\n\tflex: 1;\n\tmin-width: 0;\n\tborder: 0;\n\toutline: none;\n\tfont-size: 14px;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.primary};\n`;\n\nconst InstructionActions = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n`;\n\nconst InstructionCancel = styled.button`\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: ${COLORS.content.secondary};\n\tfont-size: 14px;\n\tfont-weight: 500;\n\tpadding: 0;\n\tcursor: pointer;\n`;\n\nconst InstructionImprove = styled.button`\n\tborder: 1px solid #5d3a72;\n\tcolor: #5d3a72;\n\tbackground: ${COLORS.surface.standard};\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tfont-size: 14px;\n\tline-height: 1.1;\n\tfont-weight: 600;\n\tcursor: pointer;\n`;\n\nconst InstructionSuggestionList = styled.div`\n\tmargin-top: 4px;\n\tborder-radius: 12px;\n\twidth: 331px;\n\tbackground: ${COLORS.surface.standard};\n\tbox-shadow: 0 6px 18px rgba(0, 0, 0, 0.1);\n\toverflow: hidden;\n\tpadding: 4px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n`;\n\nconst InstructionSuggestionButton = styled.button<{ selected?: boolean }>`\n\twidth: 100%;\n\tborder: 0;\n\tborder-radius: 8px;\n\tbackground: ${(props) => (props.selected ? '#e5f3e8' : 'transparent')};\n\tcolor: ${(props) => (props.selected ? '#1e6b34' : COLORS.content.primary)};\n\ttext-align: left;\n\tpadding: 10px 12px;\n\tfont-size: 14px;\n\tline-height: 1.2;\n\tcursor: pointer;\n\t:hover {\n\t\tbackground: ${(props) =>\n\t\t\tprops.selected ? '#d9e8db' : COLORS.surface.subdued};\n\t}\n`;\n\ntype AIEventName =\n\t| 'ai_action_triggered'\n\t| 'ai_feedback_submitted'\n\t| 'ai_suggestion_accepted'\n\t| 'ai_suggestion_discarded'\n\t| 'ai_suggestion_edited'\n\t| 'ai_instruction_used';\n\nenum AIFeedbackRating {\n\tLIKE = 'like',\n\tDISLIKE = 'dislike',\n}\n\ntype AIEventPayload = {\n\taction_type: AIEditorActionType;\n\ttemplate_id?: string | number;\n\ttemplate_category?: TemplateType;\n\trating?: AIFeedbackRating;\n\tcandidate_index?: number;\n\tinstruction_text?: string;\n};\n\ntype AIActionRequestPayload = {\n\tactionType: AIEditorActionType;\n\tactionVariant?: AIActionVariant;\n\tcurrentText: string;\n\ttemplateType: TemplateType;\n\ttoneId?: string;\n\ttoneLabel?: string;\n\tinstructionText?: string;\n\tprompt: string;\n};\n\ntype AIActionPromptBuildPayload = {\n\tactionType: AIEditorActionType;\n\tactionVariant?: AIActionVariant;\n\tcurrentText: string;\n\ttemplateType: TemplateType;\n\tconfig: AIActionPromptConfig;\n\ttoneId?: string;\n\ttoneLabel?: string;\n\tinstructionText?: string;\n};\n\nexport type CustomEditorProps =\n\tReact.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n\t\tonChange?: (text: string, html: string) => void;\n\t\ttext?: string;\n\t\tRightComponent?: React.ComponentType<WhatsAppEditorRightSlotProps>;\n\t\terror?: string;\n\t\tlimit?: number;\n\t\trows?: number;\n\t\tactions?: EditorActionTypes[];\n\n\t\t/**\n\t\t * Calls only for editor only error, not for errors coming from outside\n\t\t */\n\t\tonError?: (err: string) => void;\n\n\t\tonClickVariable?: (variable: string) => void;\n\t\teditorInstanceKey?: string;\n\t\teditorSessionId?: string;\n\t\ttemplateType?: TemplateType;\n\t\ttemplateId?: string | number;\n\t\trequestExecutor?: ApiRequestExecutor;\n\t\tbaseUrl?: string;\n\t\tendpointPath?: string;\n\t\tuseCase?: string;\n\t\tstoreId?: string;\n\t\tapiAdapter?: APIAdapter;\n\t\tconversationId?: string;\n\t\tsystemId?: string;\n\t\tintent?: string;\n\t\tenabledAIActions?: AIEditorActionType[];\n\t\tdisableBuiltInAIActions?: boolean;\n\t\tpromptOverrides?: AIActionPromptRegistry;\n\t\trephraseTones?: AIActionToneOption[];\n\t\taiActionMinChars?: Partial<Record<AIEditorActionType, number>>;\n\t\tinstructionSuggestions?: string[];\n\t\tonAnalyticsEvent?: (name: AIEventName, payload: AIEventPayload) => void;\n\t\t/**\n\t\t * Fires on AI-tag computations:\n\t\t * - `source: \"accept\"` after accepting a suggestion (addition check: >=50% => true)\n\t\t * - `source: \"post_edit_debounce\"` after edit idle/blur (retention check: <50% => true)\n\t\t * Persist `payload.isAiTagged` (or full payload) in host state and send on save.\n\t\t */\n\t\tonAITagComputed?: (payload: AITagPayload) => void;\n\t\t/**\n\t\t * When true, the editor body was loaded as fully AI-generated (prefill).\n\t\t * The first accepted suggestion will set `initialAiPrefillPhase` on the tag payload;\n\t\t * after that, only baseline vs accepted comparison applies.\n\t\t */\n\t\tprefillWasAiGenerated?: boolean;\n\t\t/**\n\t\t * Optional label above the editor (e.g. section title from the host).\n\t\t * When omitted, the left side of that top row is empty; limit/error stay on the right.\n\t\t */\n\t\teditorHeader?: React.ReactNode;\n\t\tonAIToneSelect?: (actionType: AIEditorActionType, toneId: string) => void;\n\t\tonAIActionRequest?: (\n\t\t\tpayload: AIActionRequestPayload,\n\t\t) => Promise<string | { body?: string }>;\n\t\tonBuildAIPrompt?: (payload: AIActionPromptBuildPayload) => string;\n\t\tonBlur?: React.FocusEventHandler<HTMLTextAreaElement>;\n\t};\nexport type CustomEditorRef = {\n\taddTextOrWrap: (textToAdd: string) => {\n\t\ttext: string;\n\t\thtml: string;\n\t};\n\taddText: (textToAdd: string) => {\n\t\ttext: string;\n\t\thtml: string;\n\t};\n\tget: () => string;\n\tsetCaretPosition(caretPos: number): void;\n};\n\nconst baseWhatsappContentLang = new BaseWhatsappContentLangHelper();\n\nconst WildCardMap: { [key in EditorActionTypes]?: string } = {\n\t[EditorActionTypes.BOLD]: '*',\n\t[EditorActionTypes.ITALIC]: '_',\n\t[EditorActionTypes.STRIKETHROUGH]: '~',\n};\n\nfunction getHighlightStorageKey(editorInstanceKey?: string) {\n\treturn `whatsapp-editor-rephrase-highlight-${editorInstanceKey || 'default'}`;\n}\n\nexport const WhatsAppTextEditor = React.forwardRef<\n\tCustomEditorRef,\n\tCustomEditorProps\n>(\n\t(\n\t\t{\n\t\t\tonChange,\n\t\t\tonClickVariable,\n\t\t\ttext: inputValue,\n\t\t\tRightComponent,\n\t\t\terror,\n\t\t\tlimit,\n\t\t\tonError,\n\t\t\trows,\n\t\t\tactions,\n\t\t\teditorInstanceKey,\n\t\t\teditorSessionId,\n\t\t\ttemplateType = 'marketing',\n\t\t\ttemplateId,\n\t\t\trequestExecutor,\n\t\t\tbaseUrl,\n\t\t\tendpointPath,\n\t\t\tuseCase,\n\t\t\tstoreId,\n\t\t\tapiAdapter,\n\t\t\tconversationId = 'whatsapp-template-editor',\n\t\t\tsystemId = 'whatsapp-writer',\n\t\t\tintent = 'default',\n\t\t\tenabledAIActions = [\n\t\t\t\tAIEditorActionTypes.REPHRASE,\n\t\t\t\tAIEditorActionTypes.SHORTEN,\n\t\t\t\tAIEditorActionTypes.EXPAND,\n\t\t\t\tAIEditorActionTypes.EMOJIFY,\n\t\t\t],\n\t\t\tdisableBuiltInAIActions = false,\n\t\t\tpromptOverrides,\n\t\t\trephraseTones,\n\t\t\taiActionMinChars,\n\t\t\tinstructionSuggestions = DEFAULT_INSTRUCTION_SUGGESTIONS,\n\t\t\tonAnalyticsEvent,\n\t\t\tonAITagComputed,\n\t\t\tprefillWasAiGenerated = false,\n\t\t\teditorHeader,\n\t\t\tonAIToneSelect,\n\t\t\tonAIActionRequest,\n\t\t\tonBuildAIPrompt,\n\t\t\tonBlur: textAreaOnBlur,\n\t\t\t...textAreaProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst textSpaceRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst [currentText, setCurrentText] = useState(inputValue || '');\n\t\tconst [isRephraseHighlighted, setIsRephraseHighlighted] = useState(false);\n\t\tconst [rephraseHighlightCount, setRephraseHighlightCount] = useState(0);\n\t\tconst [isGenerating, setIsGenerating] = useState(false);\n\t\tconst [isInstructionInputVisible, setIsInstructionInputVisible] =\n\t\t\tuseState(false);\n\t\tconst [instructionText, setInstructionText] = useState('');\n\t\tconst [toneByAction, setToneByAction] = useState<\n\t\t\tPartial<Record<AIEditorActionType, string>>\n\t\t>({});\n\t\tconst [suggestionBaseText, setSuggestionBaseText] = useState<string | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst [suggestionCandidates, setSuggestionCandidates] = useState<string[]>(\n\t\t\t[],\n\t\t);\n\t\tconst [suggestionIndex, setSuggestionIndex] = useState(0);\n\t\tconst [suggestionActionType, setSuggestionActionType] =\n\t\t\tuseState<AIEditorActionType | null>(null);\n\t\tconst suggestionScrollRef = useRef<HTMLDivElement | null>(null);\n\t\tconst rephraseIdleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tconst highlightResetRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst aiTagRecomputeRef = useRef<ReturnType<typeof setTimeout> | null>(\n\t\t\tnull,\n\t\t);\n\t\t/**\n\t\t * Prior eligibility for rephrase nudge (null = not initialized).\n\t\t * Matches the chip: non-empty trim and length ≥ min — same as `aiHeaderActions` disabled rules.\n\t\t */\n\t\tconst prevRephraseEligibleRef = useRef<boolean | null>(null);\n\t\tconst deferredHtmlRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\t\tconst lastEmittedEditorErrorRef = useRef<string | null>(null);\n\t\t/** First accept after full-AI prefill (`prefillWasAiGenerated`); cleared after one accept. */\n\t\tconst initialAiPrefillPhaseRef = useRef(!!prefillWasAiGenerated);\n\t\tconst acceptedSuggestionStateRef = useRef<{\n\t\t\tacceptedText: string;\n\t\t\tbaselineText: string;\n\t\t\tactionType: AIEditorActionType;\n\t\t\teditedEventEmitted: boolean;\n\t\t} | null>(null);\n\t\t/** Original prefill body for AI tag recompute; seeded once, never the live `currentText` fallback. */\n\t\tconst prefillBaselineTextRef = useRef('');\n\t\tconst prefillBaselineCapturedRef = useRef(false);\n\t\tconst [feedbackVotesByCandidate, setFeedbackVotesByCandidate] = useState<\n\t\t\tPartial<Record<string, AIFeedbackRating>>\n\t\t>({});\n\t\tconst mountSessionIdRef = useRef(\n\t\t\t`mount-${Date.now().toString(36)}-${Math.random()\n\t\t\t\t.toString(36)\n\t\t\t\t.slice(2, 8)}`,\n\t\t);\n\t\tconst highlightStorageKey = useMemo(() => {\n\t\t\treturn getHighlightStorageKey(\n\t\t\t\t`${editorInstanceKey || 'default'}-${\n\t\t\t\t\teditorSessionId || mountSessionIdRef.current\n\t\t\t\t}`,\n\t\t\t);\n\t\t}, [editorInstanceKey, editorSessionId]);\n\n\t\tuseEffect(() => {\n\t\t\tinitialAiPrefillPhaseRef.current = !!prefillWasAiGenerated;\n\t\t}, [prefillWasAiGenerated, editorInstanceKey]);\n\n\t\tuseEffect(() => {\n\t\t\tprefillBaselineCapturedRef.current = false;\n\t\t\tprefillBaselineTextRef.current = '';\n\t\t}, [editorInstanceKey, editorSessionId]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!prefillWasAiGenerated) {\n\t\t\t\tprefillBaselineCapturedRef.current = false;\n\t\t\t\tprefillBaselineTextRef.current = '';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (prefillBaselineCapturedRef.current) return;\n\t\t\tconst seed = inputValue ?? '';\n\t\t\tif (seed.length > 0) {\n\t\t\t\tprefillBaselineTextRef.current = seed;\n\t\t\t\tprefillBaselineCapturedRef.current = true;\n\t\t\t}\n\t\t}, [prefillWasAiGenerated, inputValue, editorInstanceKey, editorSessionId]);\n\n\t\tconst activeActionPrompts = useMemo(() => {\n\t\t\treturn resolveActionPrompts(templateType, promptOverrides, rephraseTones);\n\t\t}, [promptOverrides, rephraseTones, templateType]);\n\n\t\tconst filteredInstructionSuggestions = useMemo(() => {\n\t\t\tconst query = instructionText.trim().toLowerCase();\n\t\t\tif (!query) return [];\n\t\t\treturn instructionSuggestions.filter((suggestion) =>\n\t\t\t\tsuggestion.toLowerCase().includes(query),\n\t\t\t);\n\t\t}, [instructionSuggestions, instructionText]);\n\n\t\tconst minCharsByAction = useMemo(() => {\n\t\t\treturn {\n\t\t\t\t...DEFAULT_AI_ACTION_MIN_CHARS,\n\t\t\t\t...(aiActionMinChars || {}),\n\t\t\t};\n\t\t}, [aiActionMinChars]);\n\n\t\tconst rephraseMinChars =\n\t\t\tminCharsByAction[AIEditorActionTypes.REPHRASE] ||\n\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[AIEditorActionTypes.REPHRASE];\n\n\t\tconst anonymizeInstructionText = useCallback((value: string) => {\n\t\t\tconst normalized = value.trim().replace(/\\s+/g, ' ');\n\t\t\tif (!normalized) return '';\n\t\t\tconst words = normalized.split(' ').length;\n\t\t\treturn `[anonymized:length_${normalized.length}:words_${words}]`;\n\t\t}, []);\n\n\t\tconst emitAIEvent = useCallback(\n\t\t\t(name: AIEventName, payload: AIEventPayload) => {\n\t\t\t\tonAnalyticsEvent?.(name, payload);\n\t\t\t},\n\t\t\t[onAnalyticsEvent],\n\t\t);\n\n\t\tconst setEditorText = useCallback((nextText: string) => {\n\t\t\tsetCurrentText((prev) => (prev === nextText ? prev : nextText));\n\t\t}, []);\n\n\t\tconst emitChangeWithGuard = useCallback(\n\t\t\t(nextText: string) => {\n\t\t\t\tif (deferredHtmlRef.current) {\n\t\t\t\t\tclearTimeout(deferredHtmlRef.current);\n\t\t\t\t}\n\t\t\t\tif (nextText.length > LARGE_INPUT_THRESHOLD) {\n\t\t\t\t\tonChange?.(nextText, nextText);\n\t\t\t\t\tdeferredHtmlRef.current = setTimeout(() => {\n\t\t\t\t\t\tonChange?.(nextText, baseWhatsappContentLang.getHTML(nextText));\n\t\t\t\t\t}, 16);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonChange?.(nextText, baseWhatsappContentLang.getHTML(nextText));\n\t\t\t},\n\t\t\t[onChange],\n\t\t);\n\n\t\tconst emitPostEditAiTagRecompute = useCallback(\n\t\t\t(nextText: string) => {\n\t\t\t\tconst latest = acceptedSuggestionStateRef.current;\n\t\t\t\tconst latestBaseline =\n\t\t\t\t\tlatest?.acceptedText ||\n\t\t\t\t\t(prefillWasAiGenerated ? prefillBaselineTextRef.current : '');\n\t\t\t\tif (!latestBaseline) return;\n\t\t\t\tif (nextText === latestBaseline) return;\n\t\t\t\tconst recomputePayload = computeAiTagOnPostEdit({\n\t\t\t\t\tacceptedAiText: latestBaseline,\n\t\t\t\t\tcurrentEditedText: nextText,\n\t\t\t\t});\n\t\t\t\tonAITagComputed?.({\n\t\t\t\t\t...recomputePayload,\n\t\t\t\t\tsource: 'post_edit_debounce',\n\t\t\t\t});\n\t\t\t},\n\t\t\t[onAITagComputed, prefillWasAiGenerated],\n\t\t);\n\n\t\tconst clearSuggestionSession = useCallback(() => {\n\t\t\tsetSuggestionBaseText(null);\n\t\t\tsetSuggestionCandidates([]);\n\t\t\tsetSuggestionIndex(0);\n\t\t\tsetSuggestionActionType(null);\n\t\t\tsetFeedbackVotesByCandidate({});\n\t\t}, []);\n\n\t\tconst triggerRephraseHighlight = useCallback(() => {\n\t\t\tif (isGenerating) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!!suggestionBaseText && suggestionCandidates.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (rephraseHighlightCount >= MAX_REPHRASE_HIGHLIGHTS) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst nextCount = rephraseHighlightCount + 1;\n\t\t\tsetRephraseHighlightCount(nextCount);\n\t\t\tif (typeof window !== 'undefined' && editorInstanceKey) {\n\t\t\t\tsessionStorage.setItem(highlightStorageKey, String(nextCount));\n\t\t\t}\n\t\t\tsetIsRephraseHighlighted(true);\n\t\t\tif (highlightResetRef.current) {\n\t\t\t\tclearTimeout(highlightResetRef.current);\n\t\t\t}\n\t\t\thighlightResetRef.current = setTimeout(() => {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t}, 1200);\n\t\t}, [\n\t\t\teditorInstanceKey,\n\t\t\thighlightStorageKey,\n\t\t\tisGenerating,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionCandidates,\n\t\t\trephraseHighlightCount,\n\t\t]);\n\n\t\tconst triggerRephraseHighlightRef = useRef(triggerRephraseHighlight);\n\t\ttriggerRephraseHighlightRef.current = triggerRephraseHighlight;\n\n\t\tfunction handleOnChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\n\t\t\tconst text = e.target.value;\n\t\t\tconst acceptedSuggestion = acceptedSuggestionStateRef.current;\n\t\t\tif (\n\t\t\t\tacceptedSuggestion &&\n\t\t\t\t!acceptedSuggestion.editedEventEmitted &&\n\t\t\t\ttext !== acceptedSuggestion.acceptedText\n\t\t\t) {\n\t\t\t\tacceptedSuggestionStateRef.current = {\n\t\t\t\t\t...acceptedSuggestion,\n\t\t\t\t\teditedEventEmitted: true,\n\t\t\t\t};\n\t\t\t\temitAIEvent('ai_suggestion_edited', {\n\t\t\t\t\taction_type: acceptedSuggestion.actionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (aiTagRecomputeRef.current) {\n\t\t\t\tclearTimeout(aiTagRecomputeRef.current);\n\t\t\t\taiTagRecomputeRef.current = null;\n\t\t\t}\n\t\t\tconst baselineAiTextForRecompute =\n\t\t\t\tacceptedSuggestion?.acceptedText ||\n\t\t\t\t(prefillWasAiGenerated ? prefillBaselineTextRef.current : '');\n\t\t\tif (baselineAiTextForRecompute && text !== baselineAiTextForRecompute) {\n\t\t\t\taiTagRecomputeRef.current = setTimeout(() => {\n\t\t\t\t\temitPostEditAiTagRecompute(text);\n\t\t\t\t}, AI_TAG_RECOMPUTE_IDLE_MS);\n\t\t\t}\n\t\t\tsetEditorText(text);\n\t\t\temitChangeWithGuard(text);\n\t\t}\n\n\t\tfunction setCaretPosition(caretPos: number) {\n\t\t\tconst elem = textSpaceRef?.current;\n\n\t\t\tif (elem != null) {\n\t\t\t\tif (elem.selectionStart) {\n\t\t\t\t\telem.focus();\n\t\t\t\t\telem.selectionEnd = caretPos;\n\t\t\t\t} else elem.focus();\n\t\t\t}\n\t\t}\n\n\t\tfunction onActionSelect(actionType: EditorActionTypes) {\n\t\t\tconst wildCard = WildCardMap[actionType];\n\t\t\tif (wildCard && textSpaceRef.current) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\n\t\t\t\tif (start === end) {\n\t\t\t\t\tconst { text } = insertTextAtIndex(wildCard, start);\n\t\t\t\t\tsetCaretPosition(start + 1);\n\t\t\t\t\temitChangeWithGuard(text);\n\t\t\t\t} else {\n\t\t\t\t\tconst { text } = addTextOrWrap(wildCard);\n\t\t\t\t\temitChangeWithGuard(text);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onEmojiAddition(emoji: string) {\n\t\t\tconst { text } = addText(emoji);\n\t\t\temitChangeWithGuard(text);\n\t\t}\n\n\t\tfunction addTextOrWrap(textToAdd?: string) {\n\t\t\tlet text = textSpaceRef.current?.value ?? '';\n\n\t\t\tif (textSpaceRef.current && textToAdd) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\n\t\t\t\tconst wildCard = textToAdd;\n\t\t\t\tif (start === end) {\n\t\t\t\t\t/** nothing is selected */\n\t\t\t\t\t/** so append the wildcard at the end */\n\n\t\t\t\t\treturn addText(wildCard);\n\t\t\t\t} else {\n\t\t\t\t\ttext = baseWhatsappContentLang.wrappWildcard(\n\t\t\t\t\t\tstart,\n\t\t\t\t\t\tend,\n\t\t\t\t\t\twildCard,\n\t\t\t\t\t\ttext!,\n\t\t\t\t\t);\n\t\t\t\t\tconst html = baseWhatsappContentLang.getHTML(text);\n\t\t\t\t\tsetEditorText(text);\n\t\t\t\t\treturn { text, html };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { text: text!, html: text! };\n\t\t}\n\n\t\tfunction addText(textToAdd: string) {\n\t\t\tconst text = textSpaceRef.current?.value ?? '';\n\n\t\t\tif (textSpaceRef.current && textToAdd) {\n\t\t\t\tconst start = textSpaceRef.current.selectionStart;\n\t\t\t\tconst end = textSpaceRef.current.selectionEnd;\n\t\t\t\tif (start === end) {\n\t\t\t\t\treturn insertTextAtIndex(textToAdd, start);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { text: text!, html: text! };\n\t\t}\n\n\t\tfunction insertTextAtIndex(textToAdd: string, index: number) {\n\t\t\tlet text = textSpaceRef.current?.value ?? '';\n\n\t\t\ttext = text.slice(0, index) + textToAdd + text.slice(index);\n\t\t\tconst html = baseWhatsappContentLang.getHTML(text);\n\t\t\tsetEditorText(text);\n\t\t\treturn { text, html };\n\t\t}\n\n\t\tuseEffect(() => {\n\t\t\tif (typeof window === 'undefined' || !editorInstanceKey) return;\n\t\t\tconst cached = Number(sessionStorage.getItem(highlightStorageKey) || '0');\n\t\t\tif (!Number.isNaN(cached)) {\n\t\t\t\tsetRephraseHighlightCount(cached);\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tsessionStorage.removeItem(highlightStorageKey);\n\t\t\t};\n\t\t}, [editorInstanceKey, highlightStorageKey]);\n\n\t\tuseEffect(() => {\n\t\t\tif (isGenerating) {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!!suggestionBaseText && suggestionCandidates.length > 0) {\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst eligible =\n\t\t\t\t!!currentText.trim() && currentText.length >= rephraseMinChars;\n\n\t\t\tif (prevRephraseEligibleRef.current === null) {\n\t\t\t\tprevRephraseEligibleRef.current = eligible;\n\t\t\t\tif (eligible) {\n\t\t\t\t\trephraseIdleRef.current = setTimeout(() => {\n\t\t\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t\t\t}, REPHRASE_IDLE_MS);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!eligible) {\n\t\t\t\tprevRephraseEligibleRef.current = false;\n\t\t\t\tsetIsRephraseHighlighted(false);\n\t\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t\t\trephraseIdleRef.current = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst crossedThreshold = !prevRephraseEligibleRef.current && eligible;\n\t\t\tprevRephraseEligibleRef.current = true;\n\n\t\t\tif (crossedThreshold) {\n\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t}\n\n\t\t\tif (rephraseIdleRef.current) {\n\t\t\t\tclearTimeout(rephraseIdleRef.current);\n\t\t\t}\n\t\t\trephraseIdleRef.current = setTimeout(() => {\n\t\t\t\ttriggerRephraseHighlightRef.current();\n\t\t\t}, REPHRASE_IDLE_MS);\n\t\t}, [\n\t\t\tcurrentText,\n\t\t\tisGenerating,\n\t\t\trephraseMinChars,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionCandidates,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\treturn () => {\n\t\t\t\tif (rephraseIdleRef.current) clearTimeout(rephraseIdleRef.current);\n\t\t\t\tif (highlightResetRef.current) clearTimeout(highlightResetRef.current);\n\t\t\t\tif (deferredHtmlRef.current) clearTimeout(deferredHtmlRef.current);\n\t\t\t\tif (aiTagRecomputeRef.current) clearTimeout(aiTagRecomputeRef.current);\n\t\t\t};\n\t\t}, []);\n\n\t\tconst activeCandidate = suggestionCandidates[suggestionIndex] || '';\n\t\tconst activeFeedbackCandidateKey = useMemo(() => {\n\t\t\tif (!suggestionActionType || !activeCandidate) return null;\n\t\t\treturn `${suggestionActionType}-${suggestionIndex}-${activeCandidate}`;\n\t\t}, [activeCandidate, suggestionActionType, suggestionIndex]);\n\t\tconst hasFeedbackForActiveCandidate = !!(\n\t\t\tactiveFeedbackCandidateKey &&\n\t\t\tfeedbackVotesByCandidate[activeFeedbackCandidateKey]\n\t\t);\n\t\tconst suggestionBaseHtml = useMemo(\n\t\t\t() => baseWhatsappContentLang.getHTML(suggestionBaseText || ''),\n\t\t\t[suggestionBaseText],\n\t\t);\n\t\tconst activeCandidateHtml = useMemo(\n\t\t\t() => baseWhatsappContentLang.getHTML(activeCandidate),\n\t\t\t[activeCandidate],\n\t\t);\n\t\tconst canRegenerate = suggestionCandidates.length < MAX_SUGGESTIONS;\n\t\tconst shouldShowSuggestionSession =\n\t\t\t!!suggestionBaseText && suggestionCandidates.length > 0;\n\t\tconst isPrevSuggestionDisabled =\n\t\t\tsuggestionCandidates.length <= 1 || suggestionIndex <= 0;\n\t\tconst isNextSuggestionDisabled =\n\t\t\tsuggestionCandidates.length <= 1 ||\n\t\t\tsuggestionIndex >= suggestionCandidates.length - 1;\n\n\t\tuseEffect(() => {\n\t\t\tif (!shouldShowSuggestionSession) return;\n\t\t\tconst node = suggestionScrollRef.current;\n\t\t\tif (!node) return;\n\t\t\tnode.scrollTop = node.scrollHeight;\n\t\t}, [activeCandidate, shouldShowSuggestionSession, isGenerating]);\n\n\t\tconst executeAIAction = useCallback(\n\t\t\tasync (\n\t\t\t\tactionType: AIEditorActionType,\n\t\t\t\tregenerateExisting = false,\n\t\t\t\tinstructionOverride?: string,\n\t\t\t\ttoneOverrideId?: string,\n\t\t\t\tactionVariant: AIActionVariant = AIActionVariant.DEFAULT,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\t!onAIActionRequest &&\n\t\t\t\t\t!apiAdapter &&\n\t\t\t\t\t(!requestExecutor || !baseUrl)\n\t\t\t\t) {\n\t\t\t\t\tonError?.('AI configuration missing');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!currentText.trim()) return;\n\t\t\t\tconst minCharsForAction =\n\t\t\t\t\tminCharsByAction[actionType] ||\n\t\t\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[actionType] ||\n\t\t\t\t\t50;\n\t\t\t\tif (currentText.length < minCharsForAction) return;\n\t\t\t\tif (isGenerating) return;\n\t\t\t\tif (regenerateExisting && !canRegenerate) return;\n\n\t\t\t\tconst baseConfig = activeActionPrompts[actionType];\n\t\t\t\tconst config =\n\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\ttemplateType === 'utility' &&\n\t\t\t\t\tactionVariant === AIActionVariant.REPHRASE\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...baseConfig,\n\t\t\t\t\t\t\t\tlabel: 'Rephrase',\n\t\t\t\t\t\t\t\tbasePrompt: UTILITY_REPHRASE_PROMPT,\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: baseConfig;\n\t\t\t\t// Tone is sent only after explicit user selection (or explicit override),\n\t\t\t\t// not from default tone metadata.\n\t\t\t\tconst selectedToneId = toneOverrideId || toneByAction[actionType];\n\t\t\t\tconst selectedTone = config.tones?.find(\n\t\t\t\t\t(tone) => tone.id === selectedToneId,\n\t\t\t\t);\n\t\t\t\tconst instructionForPrompt =\n\t\t\t\t\tinstructionOverride !== undefined\n\t\t\t\t\t\t? instructionOverride\n\t\t\t\t\t\t: instructionText;\n\t\t\t\tconst prompt =\n\t\t\t\t\tonBuildAIPrompt?.({\n\t\t\t\t\t\tactionType,\n\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\ttemplateType,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\ttoneId: selectedToneId,\n\t\t\t\t\t\ttoneLabel: selectedTone?.label,\n\t\t\t\t\t\tinstructionText: instructionForPrompt || undefined,\n\t\t\t\t\t}) ||\n\t\t\t\t\tbuildActionPrompt({\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\tselectedToneId,\n\t\t\t\t\t\tinstructionText: instructionForPrompt,\n\t\t\t\t\t});\n\n\t\t\t\tsetIsGenerating(true);\n\t\t\t\temitAIEvent('ai_action_triggered', {\n\t\t\t\t\taction_type: actionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\ttemplate_category: templateType,\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tconst result = onAIActionRequest\n\t\t\t\t\t\t? await onAIActionRequest({\n\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\tcurrentText,\n\t\t\t\t\t\t\t\ttemplateType,\n\t\t\t\t\t\t\t\ttoneId: selectedToneId,\n\t\t\t\t\t\t\t\ttoneLabel: selectedTone?.label,\n\t\t\t\t\t\t\t\tinstructionText: instructionForPrompt || undefined,\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t })\n\t\t\t\t\t\t: await requestAISuggestion({\n\t\t\t\t\t\t\t\tapiAdapter,\n\t\t\t\t\t\t\t\trequestExecutor,\n\t\t\t\t\t\t\t\tbaseUrl,\n\t\t\t\t\t\t\t\tendpointPath,\n\t\t\t\t\t\t\t\tprompt,\n\t\t\t\t\t\t\t\tintent,\n\t\t\t\t\t\t\t\tconversationId,\n\t\t\t\t\t\t\t\tsystemId,\n\t\t\t\t\t\t\t\tuseCase,\n\t\t\t\t\t\t\t\tstoreId,\n\t\t\t\t\t\t });\n\t\t\t\t\tconst candidate =\n\t\t\t\t\t\ttypeof result === 'string'\n\t\t\t\t\t\t\t? result.trim()\n\t\t\t\t\t\t\t: (result?.body || '').trim();\n\t\t\t\t\tif (!candidate) return;\n\t\t\t\t\tif (!regenerateExisting) {\n\t\t\t\t\t\tsetSuggestionBaseText(currentText);\n\t\t\t\t\t\tsetSuggestionActionType(actionType);\n\t\t\t\t\t\tsetSuggestionCandidates([candidate]);\n\t\t\t\t\t\tsetSuggestionIndex(0);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tsetSuggestionCandidates((prev) => {\n\t\t\t\t\t\tconst next = [...prev, candidate].slice(0, MAX_SUGGESTIONS);\n\t\t\t\t\t\tsetSuggestionIndex(next.length - 1);\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tonError?.('Failed to generate AI suggestion');\n\t\t\t\t} finally {\n\t\t\t\t\tsetIsGenerating(false);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\trequestExecutor,\n\t\t\t\tbaseUrl,\n\t\t\t\tcurrentText,\n\t\t\t\tisGenerating,\n\t\t\t\tcanRegenerate,\n\t\t\t\tactiveActionPrompts,\n\t\t\t\ttoneByAction,\n\t\t\t\tinstructionText,\n\t\t\t\temitAIEvent,\n\t\t\t\ttemplateId,\n\t\t\t\tendpointPath,\n\t\t\t\tapiAdapter,\n\t\t\t\tintent,\n\t\t\t\tconversationId,\n\t\t\t\tsystemId,\n\t\t\t\tuseCase,\n\t\t\t\tstoreId,\n\t\t\t\ttemplateType,\n\t\t\t\tonError,\n\t\t\t\tminCharsByAction,\n\t\t\t\tonAIActionRequest,\n\t\t\t\tonBuildAIPrompt,\n\t\t\t],\n\t\t);\n\n\t\tconst handleAcceptSuggestion = useCallback(() => {\n\t\t\tif (!activeCandidate || !suggestionBaseText || !suggestionActionType)\n\t\t\t\treturn;\n\t\t\tsetEditorText(activeCandidate);\n\t\t\temitChangeWithGuard(activeCandidate);\n\t\t\temitAIEvent('ai_suggestion_accepted', {\n\t\t\t\taction_type: suggestionActionType,\n\t\t\t\ttemplate_id: templateId,\n\t\t\t});\n\t\t\tacceptedSuggestionStateRef.current = {\n\t\t\t\tacceptedText: activeCandidate,\n\t\t\t\tbaselineText: suggestionBaseText,\n\t\t\t\tactionType: suggestionActionType,\n\t\t\t\teditedEventEmitted: false,\n\t\t\t};\n\n\t\t\tconst inInitialAiPhase = initialAiPrefillPhaseRef.current;\n\t\t\tconst tagPayload = computeAiTagOnAccept({\n\t\t\t\tbaselineText: suggestionBaseText,\n\t\t\t\tacceptedText: activeCandidate,\n\t\t\t\tinitialAiPrefillPhase: inInitialAiPhase,\n\t\t\t});\n\t\t\tif (inInitialAiPhase) {\n\t\t\t\tinitialAiPrefillPhaseRef.current = false;\n\t\t\t}\n\t\t\tonAITagComputed?.({\n\t\t\t\t...tagPayload,\n\t\t\t\tsource: 'accept',\n\t\t\t});\n\t\t\tclearSuggestionSession();\n\t\t}, [\n\t\t\tactiveCandidate,\n\t\t\tsuggestionBaseText,\n\t\t\tsuggestionActionType,\n\t\t\tsetEditorText,\n\t\t\temitChangeWithGuard,\n\t\t\temitAIEvent,\n\t\t\ttemplateId,\n\t\t\tonAITagComputed,\n\t\t\tclearSuggestionSession,\n\t\t]);\n\n\t\tconst handleRejectSuggestion = useCallback(() => {\n\t\t\tif (!suggestionActionType) return;\n\t\t\temitAIEvent('ai_suggestion_discarded', {\n\t\t\t\taction_type: suggestionActionType,\n\t\t\t\ttemplate_id: templateId,\n\t\t\t});\n\t\t\tclearSuggestionSession();\n\t\t}, [clearSuggestionSession, emitAIEvent, suggestionActionType, templateId]);\n\n\t\tconst handleFeedback = useCallback(\n\t\t\t(rating: AIFeedbackRating) => {\n\t\t\t\tif (!suggestionActionType || !activeFeedbackCandidateKey) return;\n\t\t\t\tif (feedbackVotesByCandidate[activeFeedbackCandidateKey]) return;\n\t\t\t\tsetFeedbackVotesByCandidate((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\t[activeFeedbackCandidateKey]: rating,\n\t\t\t\t}));\n\t\t\t\temitAIEvent('ai_feedback_submitted', {\n\t\t\t\t\taction_type: suggestionActionType,\n\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\trating,\n\t\t\t\t\tcandidate_index: suggestionIndex + 1,\n\t\t\t\t});\n\t\t\t},\n\t\t\t[\n\t\t\t\tactiveFeedbackCandidateKey,\n\t\t\t\temitAIEvent,\n\t\t\t\tfeedbackVotesByCandidate,\n\t\t\t\tsuggestionActionType,\n\t\t\t\tsuggestionIndex,\n\t\t\t\ttemplateId,\n\t\t\t],\n\t\t);\n\n\t\tconst aiHeaderActions: AIHeaderAction[] = useMemo(() => {\n\t\t\tif (disableBuiltInAIActions) return [];\n\t\t\treturn enabledAIActions.map((actionType) => {\n\t\t\t\tconst actionConfig = activeActionPrompts[actionType];\n\t\t\t\tconst toneId = toneByAction[actionType];\n\t\t\t\treturn {\n\t\t\t\t\ttype: actionType,\n\t\t\t\t\tlabel: actionConfig.label,\n\t\t\t\t\tisPrimary: actionType === AIEditorActionTypes.REPHRASE,\n\t\t\t\t\tloading: isGenerating && suggestionActionType === actionType,\n\t\t\t\t\thighlighted:\n\t\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\t\tisRephraseHighlighted,\n\t\t\t\t\tdisabled:\n\t\t\t\t\t\t!currentText.trim() ||\n\t\t\t\t\t\tcurrentText.length <\n\t\t\t\t\t\t\t(minCharsByAction[actionType] ||\n\t\t\t\t\t\t\t\tDEFAULT_AI_ACTION_MIN_CHARS[actionType] ||\n\t\t\t\t\t\t\t\t50) ||\n\t\t\t\t\t\tisGenerating ||\n\t\t\t\t\t\t(shouldShowSuggestionSession &&\n\t\t\t\t\t\t\tsuggestionActionType === actionType),\n\t\t\t\t\tshowToneDropdown:\n\t\t\t\t\t\tactionType === AIEditorActionTypes.REPHRASE &&\n\t\t\t\t\t\t!!actionConfig.tones?.length,\n\t\t\t\t\ttones: actionConfig.tones,\n\t\t\t\t\tselectedToneId: toneId,\n\t\t\t\t};\n\t\t\t});\n\t\t}, [\n\t\t\tenabledAIActions,\n\t\t\tdisableBuiltInAIActions,\n\t\t\tactiveActionPrompts,\n\t\t\ttoneByAction,\n\t\t\tisGenerating,\n\t\t\tsuggestionActionType,\n\t\t\tshouldShowSuggestionSession,\n\t\t\tisRephraseHighlighted,\n\t\t\tcurrentText,\n\t\t\tminCharsByAction,\n\t\t]);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => {\n\t\t\t\treturn {\n\t\t\t\t\taddTextOrWrap,\n\t\t\t\t\taddText,\n\t\t\t\t\tget() {\n\t\t\t\t\t\treturn currentText;\n\t\t\t\t\t},\n\t\t\t\t\tsetCaretPosition,\n\t\t\t\t};\n\t\t\t},\n\t\t\t[addTextOrWrap, addText, currentText],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (inputValue === undefined) return;\n\t\t\tsetEditorText(inputValue || '');\n\t\t}, [inputValue, setEditorText]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!limit || !onError) return;\n\t\t\tconst nextError =\n\t\t\t\tcurrentText.length > limit ? LIMIT_REACHED : error ?? '';\n\t\t\tif (lastEmittedEditorErrorRef.current === nextError) return;\n\t\t\tlastEmittedEditorErrorRef.current = nextError;\n\t\t\tonError(nextError);\n\t\t}, [currentText, error, limit, onError]);\n\n\t\treturn (\n\t\t\t<OuterContainer>\n\t\t\t\t<EditorFooterRow>\n\t\t\t\t\t<EditorFooterTitle>\n\t\t\t\t\t\t{editorHeader ? (\n\t\t\t\t\t\t\t<TitleSmall data-test=\"body-text-for-edit-template\">\n\t\t\t\t\t\t\t\t{editorHeader}\n\t\t\t\t\t\t\t</TitleSmall>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</EditorFooterTitle>\n\t\t\t\t\t<EditorFooterRight>\n\t\t\t\t\t\t{error && error !== LIMIT_REACHED ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\t\t\t\theight={16}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.negative}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<BodyCaption color={COLORS.content.negative}>\n\t\t\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{limit ? (\n\t\t\t\t\t\t\t<BodyCaption\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\terror === LIMIT_REACHED || currentText.length > limit\n\t\t\t\t\t\t\t\t\t\t\t? COLORS.content.negative\n\t\t\t\t\t\t\t\t\t\t\t: COLORS.content.secondary,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{currentText.length}/{limit}\n\t\t\t\t\t\t\t</BodyCaption>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</EditorFooterRight>\n\t\t\t\t</EditorFooterRow>\n\t\t\t\t<Container isError={!!error}>\n\t\t\t\t\t{shouldShowSuggestionSession ? (\n\t\t\t\t\t\t<SuggestionSessionContainer ref={suggestionScrollRef}>\n\t\t\t\t\t\t\t<SuggestionBaselineText\n\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{ __html: suggestionBaseHtml }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{isGenerating ? (\n\t\t\t\t\t\t\t\t<SuggestionCandidateText aria-busy=\"true\">\n\t\t\t\t\t\t\t\t\t<SuggestionCandidateSkeleton>\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"96%\" />\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"84%\" />\n\t\t\t\t\t\t\t\t\t\t<EditorSkeletonLine width=\"68%\" />\n\t\t\t\t\t\t\t\t\t</SuggestionCandidateSkeleton>\n\t\t\t\t\t\t\t\t</SuggestionCandidateText>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<SuggestionCandidateText\n\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t__html: activeCandidateHtml,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<SuggestionControlsRow>\n\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\taria-label=\"Previous suggestion\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={isPrevSuggestionDisabled}\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetSuggestionIndex((idx) => Math.max(0, idx - 1))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronLeftIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t<SuggestionCounter>\n\t\t\t\t\t\t\t\t\t{suggestionIndex + 1}/{suggestionCandidates.length}\n\t\t\t\t\t\t\t\t</SuggestionCounter>\n\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\taria-label=\"Next suggestion\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdisabled={isNextSuggestionDisabled}\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetSuggestionIndex((idx) =>\n\t\t\t\t\t\t\t\t\t\t\tMath.min(suggestionCandidates.length - 1, idx + 1),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Like\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Like suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdisabled={hasFeedbackForActiveCandidate}\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(AIFeedbackRating.LIKE)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ThumbsUpIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Dislike\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Dislike suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdisabled={hasFeedbackForActiveCandidate}\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleFeedback(AIFeedbackRating.DISLIKE)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ThumbsDownIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t{canRegenerate ? (\n\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\tbody={isGenerating ? 'Regenerating…' : 'Regenerate'}\n\t\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SuggestionRegenerateButton\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Regenerate suggestion\"\n\t\t\t\t\t\t\t\t\t\t\taria-busy={isGenerating}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={isGenerating}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (suggestionActionType) {\n\t\t\t\t\t\t\t\t\t\t\t\t\texecuteAIAction(suggestionActionType, true);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{isGenerating ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<RegenerateIconShimmer aria-hidden />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<RewindIcon width={14} height={14} />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</SuggestionRegenerateButton>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t<Tooltip body=\"Discard\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Discard suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleRejectSuggestion}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CrossIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t<Tooltip body=\"Accept\" placement=\"top\">\n\t\t\t\t\t\t\t\t\t<SuggestionIconButton\n\t\t\t\t\t\t\t\t\t\taria-label=\"Accept suggestion\"\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleAcceptSuggestion}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CheckIcon\n\t\t\t\t\t\t\t\t\t\t\twidth={14}\n\t\t\t\t\t\t\t\t\t\t\theight={14}\n\t\t\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</SuggestionIconButton>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t</SuggestionControlsRow>\n\t\t\t\t\t\t</SuggestionSessionContainer>\n\t\t\t\t\t) : isGenerating ? (\n\t\t\t\t\t\t<EditorSkeletonContainer>\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"96%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"92%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"88%\" />\n\t\t\t\t\t\t\t<EditorSkeletonLine width=\"54%\" />\n\t\t\t\t\t\t</EditorSkeletonContainer>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<TextSpace\n\t\t\t\t\t\t\tref={textSpaceRef}\n\t\t\t\t\t\t\t{...textAreaProps}\n\t\t\t\t\t\t\tvalue={currentText}\n\t\t\t\t\t\t\tonChange={handleOnChange}\n\t\t\t\t\t\t\tonBlur={(e) => {\n\t\t\t\t\t\t\t\tif (aiTagRecomputeRef.current) {\n\t\t\t\t\t\t\t\t\tclearTimeout(aiTagRecomputeRef.current);\n\t\t\t\t\t\t\t\t\taiTagRecomputeRef.current = null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temitPostEditAiTagRecompute(e.target.value);\n\t\t\t\t\t\t\t\ttextAreaOnBlur?.(e);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPaste={(e) => {\n\t\t\t\t\t\t\t\tconst pastedText = e.clipboardData.getData('text');\n\t\t\t\t\t\t\t\tif (pastedText.length > LARGE_INPUT_THRESHOLD) {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst el = textSpaceRef.current;\n\t\t\t\t\t\t\t\t\tconst start = el?.selectionStart ?? 0;\n\t\t\t\t\t\t\t\t\tconst end = el?.selectionEnd ?? start;\n\t\t\t\t\t\t\t\t\t// Prefer live DOM value — `currentText` can lag the textarea for big pastes.\n\t\t\t\t\t\t\t\t\tconst base = el?.value ?? currentText;\n\t\t\t\t\t\t\t\t\tconst nextText =\n\t\t\t\t\t\t\t\t\t\tbase.slice(0, start) + pastedText + base.slice(end);\n\t\t\t\t\t\t\t\t\tsetEditorText(nextText);\n\t\t\t\t\t\t\t\t\temitChangeWithGuard(nextText);\n\t\t\t\t\t\t\t\t\tconst caret = start + pastedText.length;\n\t\t\t\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\t\t\t\tconst ta = textSpaceRef.current;\n\t\t\t\t\t\t\t\t\t\tif (!ta) return;\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tta.setSelectionRange(caret, caret);\n\t\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\t\t// ignore invalid range in edge browsers\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\trows={rows}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{isInstructionInputVisible ? (\n\t\t\t\t\t\t<InstructionContainer>\n\t\t\t\t\t\t\t<InstructionInputRow>\n\t\t\t\t\t\t\t\t<EditIcon\n\t\t\t\t\t\t\t\t\twidth={18}\n\t\t\t\t\t\t\t\t\theight={18}\n\t\t\t\t\t\t\t\t\tcolor={COLORS.content.secondary}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<InstructionInput\n\t\t\t\t\t\t\t\t\tvalue={instructionText}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Add specific instructions to refine your message\"\n\t\t\t\t\t\t\t\t\tonChange={(e) => setInstructionText(e.target.value)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<InstructionActions>\n\t\t\t\t\t\t\t\t\t<InstructionCancel\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tsetInstructionText('');\n\t\t\t\t\t\t\t\t\t\t\tsetIsInstructionInputVisible(false);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t</InstructionCancel>\n\t\t\t\t\t\t\t\t\t<InstructionImprove\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\tconst instructionToApply = instructionText.trim();\n\t\t\t\t\t\t\t\t\t\t\tif (instructionToApply) {\n\t\t\t\t\t\t\t\t\t\t\t\temitAIEvent('ai_instruction_used', {\n\t\t\t\t\t\t\t\t\t\t\t\t\taction_type: AIEditorActionTypes.REPHRASE,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttemplate_id: templateId,\n\t\t\t\t\t\t\t\t\t\t\t\t\tinstruction_text:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanonymizeInstructionText(instructionToApply),\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tsetIsInstructionInputVisible(false);\n\t\t\t\t\t\t\t\t\t\t\tsetInstructionText('');\n\t\t\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\t\t\tAIEditorActionTypes.REPHRASE,\n\t\t\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\t\t\tinstructionToApply,\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tImprove\n\t\t\t\t\t\t\t\t\t</InstructionImprove>\n\t\t\t\t\t\t\t\t</InstructionActions>\n\t\t\t\t\t\t\t</InstructionInputRow>\n\t\t\t\t\t\t\t{instructionText.trim().length > 0 &&\n\t\t\t\t\t\t\tfilteredInstructionSuggestions.length > 0 ? (\n\t\t\t\t\t\t\t\t<InstructionSuggestionList>\n\t\t\t\t\t\t\t\t\t{filteredInstructionSuggestions.map((suggestion) => (\n\t\t\t\t\t\t\t\t\t\t<InstructionSuggestionButton\n\t\t\t\t\t\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tselected={instructionText === suggestion}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setInstructionText(suggestion)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\t\t\t\t\t</InstructionSuggestionButton>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</InstructionSuggestionList>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</InstructionContainer>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<WhatsAppTextEditorHeader\n\t\t\t\t\t\t\tactions={actions}\n\t\t\t\t\t\t\tref={textSpaceRef}\n\t\t\t\t\t\t\tonActionSelect={onActionSelect}\n\t\t\t\t\t\t\tRightComponent={RightComponent}\n\t\t\t\t\t\t\trightActionsDisabled={shouldShowSuggestionSession || isGenerating}\n\t\t\t\t\t\t\tonEmojiClick={onEmojiAddition}\n\t\t\t\t\t\t\taiActions={aiHeaderActions}\n\t\t\t\t\t\t\tdisableAllActions={shouldShowSuggestionSession || isGenerating}\n\t\t\t\t\t\t\tinstructionActive={isInstructionInputVisible}\n\t\t\t\t\t\t\tonAIInstructionsClick={() => setIsInstructionInputVisible(true)}\n\t\t\t\t\t\t\tonAIToneChange={(actionType, toneId) => {\n\t\t\t\t\t\t\t\tsetToneByAction((prev) => ({ ...prev, [actionType]: toneId }));\n\t\t\t\t\t\t\t\tonAIToneSelect?.(actionType, toneId);\n\t\t\t\t\t\t\t\tif (actionType === AIEditorActionTypes.REPHRASE) {\n\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\ttoneId,\n\t\t\t\t\t\t\t\t\t\tAIActionVariant.DEFAULT,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonAIActionClick={(\n\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\tactionVariant = AIActionVariant.DEFAULT,\n\t\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\t\tif (isGenerating) return;\n\n\t\t\t\t\t\t\t\tif (shouldShowSuggestionSession) {\n\t\t\t\t\t\t\t\t\tif (suggestionActionType === actionType) {\n\t\t\t\t\t\t\t\t\t\t// Same action should not retrigger from chip;\n\t\t\t\t\t\t\t\t\t\t// regenerate is only via explicit regenerate control.\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t// New action starts a fresh suggestion session.\n\t\t\t\t\t\t\t\t\tclearSuggestionSession();\n\t\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\texecuteAIAction(\n\t\t\t\t\t\t\t\t\tactionType,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\tactionVariant,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</Container>\n\t\t\t</OuterContainer>\n\t\t);\n\t},\n);\n\nWhatsAppTextEditor.displayName = 'WhatsAppTextEditor';\n\nexport type { AITagPayload } from './ai/aiTag';\nexport {\n\tAI_TAG_CHANGE_RATIO_THRESHOLD,\n\tcomputeAiTagOnAccept,\n\tlevenshteinDistance,\n} from './ai/aiTag';\n"],"names":["LIMIT_REACHED","REPHRASE_IDLE_MS","MAX_REPHRASE_HIGHLIGHTS","MAX_SUGGESTIONS","LARGE_INPUT_THRESHOLD","AI_TAG_RECOMPUTE_IDLE_MS","UTILITY_REPHRASE_PROMPT","skeletonPulse","keyframes","EditorSkeletonContainer","styled","EditorSkeletonLine","props","SuggestionSessionContainer","SuggestionBaselineText","COLORS","SuggestionCandidateText","SuggestionCandidateSkeleton","SuggestionControlsRow","SuggestionCounter","SuggestionIconButton","SuggestionRegenerateButton","RegenerateIconShimmer","InstructionContainer","InstructionInputRow","InstructionInput","InstructionActions","InstructionCancel","InstructionImprove","InstructionSuggestionList","InstructionSuggestionButton","baseWhatsappContentLang","BaseWhatsappContentLangHelper","WildCardMap","EditorActionTypes","getHighlightStorageKey","editorInstanceKey","WhatsAppTextEditor","React","onChange","onClickVariable","inputValue","RightComponent","error","limit","onError","rows","actions","editorSessionId","templateType","templateId","requestExecutor","baseUrl","endpointPath","useCase","storeId","apiAdapter","conversationId","systemId","intent","enabledAIActions","AIEditorActionTypes","disableBuiltInAIActions","promptOverrides","rephraseTones","aiActionMinChars","instructionSuggestions","DEFAULT_INSTRUCTION_SUGGESTIONS","onAnalyticsEvent","onAITagComputed","prefillWasAiGenerated","editorHeader","onAIToneSelect","onAIActionRequest","onBuildAIPrompt","textAreaOnBlur","textAreaProps","ref","textSpaceRef","useRef","currentText","setCurrentText","useState","isRephraseHighlighted","setIsRephraseHighlighted","rephraseHighlightCount","setRephraseHighlightCount","isGenerating","setIsGenerating","isInstructionInputVisible","setIsInstructionInputVisible","instructionText","setInstructionText","toneByAction","setToneByAction","suggestionBaseText","setSuggestionBaseText","suggestionCandidates","setSuggestionCandidates","suggestionIndex","setSuggestionIndex","suggestionActionType","setSuggestionActionType","suggestionScrollRef","rephraseIdleRef","highlightResetRef","aiTagRecomputeRef","prevRephraseEligibleRef","deferredHtmlRef","lastEmittedEditorErrorRef","initialAiPrefillPhaseRef","acceptedSuggestionStateRef","prefillBaselineTextRef","prefillBaselineCapturedRef","feedbackVotesByCandidate","setFeedbackVotesByCandidate","mountSessionIdRef","highlightStorageKey","useMemo","useEffect","seed","activeActionPrompts","resolveActionPrompts","filteredInstructionSuggestions","query","suggestion","minCharsByAction","DEFAULT_AI_ACTION_MIN_CHARS","rephraseMinChars","anonymizeInstructionText","useCallback","value","normalized","words","emitAIEvent","name","payload","setEditorText","nextText","prev","emitChangeWithGuard","emitPostEditAiTagRecompute","latestBaseline","recomputePayload","computeAiTagOnPostEdit","clearSuggestionSession","triggerRephraseHighlight","nextCount","triggerRephraseHighlightRef","handleOnChange","text","acceptedSuggestion","baselineAiTextForRecompute","setCaretPosition","caretPos","elem","onActionSelect","actionType","wildCard","start","end","insertTextAtIndex","addTextOrWrap","onEmojiAddition","emoji","addText","textToAdd","html","index","cached","eligible","crossedThreshold","activeCandidate","activeFeedbackCandidateKey","hasFeedbackForActiveCandidate","suggestionBaseHtml","activeCandidateHtml","canRegenerate","shouldShowSuggestionSession","isPrevSuggestionDisabled","isNextSuggestionDisabled","node","executeAIAction","regenerateExisting","instructionOverride","toneOverrideId","actionVariant","AIActionVariant","minCharsForAction","baseConfig","config","selectedToneId","selectedTone","tone","instructionForPrompt","prompt","buildActionPrompt","result","requestAISuggestion","candidate","next","handleAcceptSuggestion","inInitialAiPhase","tagPayload","computeAiTagOnAccept","handleRejectSuggestion","handleFeedback","rating","aiHeaderActions","actionConfig","toneId","useImperativeHandle","nextError","OuterContainer","jsxs","EditorFooterRow","jsx","EditorFooterTitle","TitleSmall","EditorFooterRight","Fragment","InfoIcon","BodyCaption","Container","idx","ChevronLeftIcon","ChevronRightIcon","Tooltip","ThumbsUpIcon","ThumbsDownIcon","RewindIcon","CrossIcon","CheckIcon","TextSpace","pastedText","el","base","caret","ta","EditIcon","instructionToApply","WhatsAppTextEditorHeader"],"mappings":"ugCAyDMA,GAAgB,0BAChBC,GAAmB,IACnBC,GAA0B,EAC1BC,GAAkB,EAClBC,GAAwB,KACxBC,GAA2B,IAC3BC,GACL,iIAEKC,GAAgBC,GAAAA;AAAAA;AAAAA;AAAAA;AAAAA,EAMhBC,GAA0BC,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjCC,EAAqBD,EAAAA,QAAO;AAAA;AAAA;AAAA,UAGvBE,GAAUA,EAAM,KAAK;AAAA;AAAA,cAElBL,EAAa;AAAA,EAGrBM,GAA6BH,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBpCI,GAAyBJ,EAAAA,QAAO;AAAA;AAAA,UAE5BK,EAAAA,OAAO,QAAQ,SAAS;AAAA,EAG5BC,GAA0BN,EAAAA,QAAO;AAAA,UAC7BK,EAAAA,OAAO,QAAQ,OAAO;AAAA,EAG1BE,GAA8BP,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQrCQ,GAAwBR,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA,EAM/BS,GAAoBT,EAAAA,QAAO;AAAA,UACvBK,EAAAA,OAAO,QAAQ,OAAO;AAAA;AAAA,EAI1BK,EAAuBV,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAS1BK,EAAAA,OAAO,QAAQ,OAAO;AAAA;AAAA;AAAA,sBAGVA,EAAAA,OAAO,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStCM,GAA6BX,EAAAA,QAAOU,CAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxDE,GAAwBZ,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMvBH,EAAa;AAAA,EAIrBgB,GAAuBb,EAAAA,QAAO;AAAA,eACrBK,EAAAA,OAAO,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShCS,GAAsBd,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOpBK,EAAAA,OAAO,QAAQ,QAAQ;AAAA,EAGhCU,GAAmBf,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOtBK,EAAAA,OAAO,QAAQ,OAAO;AAAA,EAG1BW,GAAqBhB,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA,EAM5BiB,GAAoBjB,EAAAA,QAAO;AAAA;AAAA;AAAA,UAGvBK,EAAAA,OAAO,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5Ba,GAAqBlB,EAAAA,QAAO;AAAA;AAAA;AAAA,eAGnBK,EAAAA,OAAO,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShCc,GAA4BnB,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA,eAI1BK,EAAAA,OAAO,QAAQ,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShCe,GAA8BpB,EAAAA,QAAO;AAAA;AAAA;AAAA;AAAA,eAI3BE,GAAWA,EAAM,SAAW,UAAY,aAAc;AAAA,UAC3DA,GAAWA,EAAM,SAAW,UAAYG,EAAAA,OAAO,QAAQ,OAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOzDH,GACdA,EAAM,SAAW,UAAYG,EAAAA,OAAO,QAAQ,OAAO;AAAA;AAAA,EA0HhDgB,EAA0B,IAAIC,GAAAA,8BAE9BC,GAAuD,CAC5D,CAACC,EAAAA,kBAAkB,IAAI,EAAG,IAC1B,CAACA,EAAAA,kBAAkB,MAAM,EAAG,IAC5B,CAACA,EAAAA,kBAAkB,aAAa,EAAG,GACpC,EAEA,SAASC,GAAuBC,EAA4B,CAC3D,MAAO,sCAAsCA,GAAqB,SAAS,EAC5E,CAEO,MAAMC,GAAqBC,GAAAA,QAAM,WAIvC,CACC,CACC,SAAAC,EACA,gBAAAC,GACA,KAAMC,EACN,eAAAC,GACA,MAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,GACA,QAAAC,GACA,kBAAAX,EACA,gBAAAY,GACA,aAAAC,EAAe,YACf,WAAAC,EACA,gBAAAC,GACA,QAAAC,GACA,aAAAC,GACA,QAAAC,GACA,QAAAC,GACA,WAAAC,GACA,eAAAC,GAAiB,2BACjB,SAAAC,GAAW,kBACX,OAAAC,GAAS,UACT,iBAAAC,GAAmB,CAClBC,EAAAA,oBAAoB,SACpBA,EAAAA,oBAAoB,QACpBA,EAAAA,oBAAoB,OACpBA,sBAAoB,OAAA,EAErB,wBAAAC,GAA0B,GAC1B,gBAAAC,GACA,cAAAC,GACA,iBAAAC,GACA,uBAAAC,GAAyBC,EAAAA,gCACzB,iBAAAC,GACA,gBAAAC,GACA,sBAAAC,EAAwB,GACxB,aAAAC,GACA,eAAAC,GACA,kBAAAC,GACA,gBAAAC,GACA,OAAQC,GACR,GAAGC,EAAA,EAEJC,KACI,CACJ,MAAMC,EAAeC,EAAAA,OAA4B,IAAI,EAC/C,CAACC,EAAaC,EAAc,EAAIC,EAAAA,SAASzC,GAAc,EAAE,EACzD,CAAC0C,GAAuBC,CAAwB,EAAIF,EAAAA,SAAS,EAAK,EAClE,CAACG,GAAwBC,EAAyB,EAAIJ,EAAAA,SAAS,CAAC,EAChE,CAACK,EAAcC,EAAe,EAAIN,EAAAA,SAAS,EAAK,EAChD,CAACO,GAA2BC,EAA4B,EAC7DR,EAAAA,SAAS,EAAK,EACT,CAACS,EAAiBC,EAAkB,EAAIV,EAAAA,SAAS,EAAE,EACnD,CAACW,GAAcC,EAAe,EAAIZ,EAAAA,SAEtC,CAAA,CAAE,EACE,CAACa,EAAoBC,EAAqB,EAAId,EAAAA,SACnD,IAAA,EAEK,CAACe,EAAsBC,EAAuB,EAAIhB,EAAAA,SACvD,CAAA,CAAC,EAEI,CAACiB,EAAiBC,CAAkB,EAAIlB,EAAAA,SAAS,CAAC,EAClD,CAACmB,EAAsBC,EAAuB,EACnDpB,EAAAA,SAAoC,IAAI,EACnCqB,GAAsBxB,EAAAA,OAA8B,IAAI,EACxDyB,EAAkBzB,EAAAA,OAA6C,IAAI,EACnE0B,EAAoB1B,EAAAA,OACzB,IAAA,EAEK2B,EAAoB3B,EAAAA,OACzB,IAAA,EAMK4B,EAA0B5B,EAAAA,OAAuB,IAAI,EACrD6B,EAAkB7B,EAAAA,OAA6C,IAAI,EACnE8B,GAA4B9B,EAAAA,OAAsB,IAAI,EAEtD+B,GAA2B/B,EAAAA,OAAO,CAAC,CAACT,CAAqB,EACzDyC,GAA6BhC,EAAAA,OAKzB,IAAI,EAERiC,EAAyBjC,EAAAA,OAAO,EAAE,EAClCkC,GAA6BlC,EAAAA,OAAO,EAAK,EACzC,CAACmC,GAA0BC,EAA2B,EAAIjC,EAAAA,SAE9D,CAAA,CAAE,EACEkC,GAAoBrC,EAAAA,OACzB,SAAS,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EACvC,SAAS,EAAE,EACX,MAAM,EAAG,CAAC,CAAC,EAAA,EAERsC,EAAsBC,EAAAA,QAAQ,IAC5BnF,GACN,GAAGC,GAAqB,SAAS,IAChCY,IAAmBoE,GAAkB,OACtC,EAAA,EAEC,CAAChF,EAAmBY,EAAe,CAAC,EAEvCuE,EAAAA,UAAU,IAAM,CACfT,GAAyB,QAAU,CAAC,CAACxC,CACtC,EAAG,CAACA,EAAuBlC,CAAiB,CAAC,EAE7CmF,EAAAA,UAAU,IAAM,CACfN,GAA2B,QAAU,GACrCD,EAAuB,QAAU,EAClC,EAAG,CAAC5E,EAAmBY,EAAe,CAAC,EAEvCuE,EAAAA,UAAU,IAAM,CACf,GAAI,CAACjD,EAAuB,CAC3B2C,GAA2B,QAAU,GACrCD,EAAuB,QAAU,GACjC,MACD,CACA,GAAIC,GAA2B,QAAS,OACxC,MAAMO,EAAO/E,GAAc,GACvB+E,EAAK,OAAS,IACjBR,EAAuB,QAAUQ,EACjCP,GAA2B,QAAU,GAEvC,EAAG,CAAC3C,EAAuB7B,EAAYL,EAAmBY,EAAe,CAAC,EAE1E,MAAMyE,GAAsBH,EAAAA,QAAQ,IAC5BI,uBAAqBzE,EAAcc,GAAiBC,EAAa,EACtE,CAACD,GAAiBC,GAAef,CAAY,CAAC,EAE3C0E,GAAiCL,EAAAA,QAAQ,IAAM,CACpD,MAAMM,EAAQjC,EAAgB,KAAA,EAAO,YAAA,EACrC,OAAKiC,EACE1D,GAAuB,OAAQ2D,GACrCA,EAAW,YAAA,EAAc,SAASD,CAAK,CAAA,EAFrB,CAAA,CAIpB,EAAG,CAAC1D,GAAwByB,CAAe,CAAC,EAEtCmC,EAAmBR,EAAAA,QAAQ,KACzB,CACN,GAAGS,EAAAA,4BACH,GAAI9D,IAAoB,CAAA,CAAC,GAExB,CAACA,EAAgB,CAAC,EAEf+D,GACLF,EAAiBjE,EAAAA,oBAAoB,QAAQ,GAC7CkE,EAAAA,4BAA4BlE,EAAAA,oBAAoB,QAAQ,EAEnDoE,GAA2BC,cAAaC,GAAkB,CAC/D,MAAMC,EAAaD,EAAM,KAAA,EAAO,QAAQ,OAAQ,GAAG,EACnD,GAAI,CAACC,EAAY,MAAO,GACxB,MAAMC,EAAQD,EAAW,MAAM,GAAG,EAAE,OACpC,MAAO,sBAAsBA,EAAW,MAAM,UAAUC,CAAK,GAC9D,EAAG,CAAA,CAAE,EAECC,EAAcJ,EAAAA,YACnB,CAACK,EAAmBC,IAA4B,CAC/CpE,KAAmBmE,EAAMC,CAAO,CACjC,EACA,CAACpE,EAAgB,CAAA,EAGZqE,EAAgBP,cAAaQ,GAAqB,CACvDzD,GAAgB0D,GAAUA,IAASD,EAAWC,EAAOD,CAAS,CAC/D,EAAG,CAAA,CAAE,EAECE,EAAsBV,EAAAA,YAC1BQ,GAAqB,CAIrB,GAHI9B,EAAgB,SACnB,aAAaA,EAAgB,OAAO,EAEjC8B,EAAS,OAAStI,GAAuB,CAC5CmC,IAAWmG,EAAUA,CAAQ,EAC7B9B,EAAgB,QAAU,WAAW,IAAM,CAC1CrE,IAAWmG,EAAU3G,EAAwB,QAAQ2G,CAAQ,CAAC,CAC/D,EAAG,EAAE,EACL,MACD,CACAnG,IAAWmG,EAAU3G,EAAwB,QAAQ2G,CAAQ,CAAC,CAC/D,EACA,CAACnG,CAAQ,CAAA,EAGJsG,GAA6BX,EAAAA,YACjCQ,GAAqB,CAErB,MAAMI,EADS/B,GAA2B,SAEjC,eACPzC,EAAwB0C,EAAuB,QAAU,IAE3D,GADI,CAAC8B,GACDJ,IAAaI,EAAgB,OACjC,MAAMC,EAAmBC,GAAAA,uBAAuB,CAC/C,eAAgBF,EAChB,kBAAmBJ,CAAA,CACnB,EACDrE,KAAkB,CACjB,GAAG0E,EACH,OAAQ,oBAAA,CACR,CACF,EACA,CAAC1E,GAAiBC,CAAqB,CAAA,EAGlC2E,EAAyBf,EAAAA,YAAY,IAAM,CAChDlC,GAAsB,IAAI,EAC1BE,GAAwB,CAAA,CAAE,EAC1BE,EAAmB,CAAC,EACpBE,GAAwB,IAAI,EAC5Ba,GAA4B,CAAA,CAAE,CAC/B,EAAG,CAAA,CAAE,EAEC+B,GAA2BhB,EAAAA,YAAY,IAAM,CAOlD,GANI3C,GAGEQ,GAAsBE,EAAqB,OAAS,GAGtDZ,IAA0BnF,GAC7B,OAED,MAAMiJ,EAAY9D,GAAyB,EAC3CC,GAA0B6D,CAAS,EAC/B,OAAO,OAAW,KAAe/G,GACpC,eAAe,QAAQiF,EAAqB,OAAO8B,CAAS,CAAC,EAE9D/D,EAAyB,EAAI,EACzBqB,EAAkB,SACrB,aAAaA,EAAkB,OAAO,EAEvCA,EAAkB,QAAU,WAAW,IAAM,CAC5CrB,EAAyB,EAAK,CAC/B,EAAG,IAAI,CACR,EAAG,CACFhD,EACAiF,EACA9B,EACAQ,EACAE,EACAZ,EAAA,CACA,EAEK+D,GAA8BrE,EAAAA,OAAOmE,EAAwB,EACnEE,GAA4B,QAAUF,GAEtC,SAASG,GAAe,EAA2C,CAClE,MAAMC,EAAO,EAAE,OAAO,MAChBC,EAAqBxC,GAA2B,QAErDwC,GACA,CAACA,EAAmB,oBACpBD,IAASC,EAAmB,eAE5BxC,GAA2B,QAAU,CACpC,GAAGwC,EACH,mBAAoB,EAAA,EAErBjB,EAAY,uBAAwB,CACnC,YAAaiB,EAAmB,WAChC,YAAarG,CAAA,CACb,GAEEwD,EAAkB,UACrB,aAAaA,EAAkB,OAAO,EACtCA,EAAkB,QAAU,MAE7B,MAAM8C,EACLD,GAAoB,eACnBjF,EAAwB0C,EAAuB,QAAU,IACvDwC,GAA8BF,IAASE,IAC1C9C,EAAkB,QAAU,WAAW,IAAM,CAC5CmC,GAA2BS,CAAI,CAChC,EAAGjJ,EAAwB,GAE5BoI,EAAca,CAAI,EAClBV,EAAoBU,CAAI,CACzB,CAEA,SAASG,GAAiBC,EAAkB,CAC3C,MAAMC,EAAO7E,GAAc,QAEvB6E,GAAQ,OACPA,EAAK,gBACRA,EAAK,MAAA,EACLA,EAAK,aAAeD,KACT,MAAA,EAEd,CAEA,SAASE,GAAeC,EAA+B,CACtD,MAAMC,EAAW7H,GAAY4H,CAAU,EACvC,GAAIC,GAAYhF,EAAa,QAAS,CACrC,MAAMiF,EAAQjF,EAAa,QAAQ,eAC7BkF,EAAMlF,EAAa,QAAQ,aAEjC,GAAIiF,IAAUC,EAAK,CAClB,KAAM,CAAE,KAAAV,CAAA,EAASW,GAAkBH,EAAUC,CAAK,EAClDN,GAAiBM,EAAQ,CAAC,EAC1BnB,EAAoBU,CAAI,CACzB,KAAO,CACN,KAAM,CAAE,KAAAA,CAAA,EAASY,GAAcJ,CAAQ,EACvClB,EAAoBU,CAAI,CACzB,CACD,CACD,CAEA,SAASa,GAAgBC,EAAe,CACvC,KAAM,CAAE,KAAAd,CAAA,EAASe,GAAQD,CAAK,EAC9BxB,EAAoBU,CAAI,CACzB,CAEA,SAASY,GAAcI,EAAoB,CAC1C,IAAIhB,EAAOxE,EAAa,SAAS,OAAS,GAE1C,GAAIA,EAAa,SAAWwF,EAAW,CACtC,MAAMP,EAAQjF,EAAa,QAAQ,eAC7BkF,EAAMlF,EAAa,QAAQ,aAE3BgF,EAAWQ,EACjB,GAAIP,IAAUC,EAIb,OAAOK,GAAQP,CAAQ,EACjB,CACNR,EAAOvH,EAAwB,cAC9BgI,EACAC,EACAF,EACAR,CAAA,EAED,MAAMiB,EAAOxI,EAAwB,QAAQuH,CAAI,EACjD,OAAAb,EAAca,CAAI,EACX,CAAE,KAAAA,EAAM,KAAAiB,CAAA,CAChB,CACD,CAEA,MAAO,CAAE,KAAAjB,EAAa,KAAMA,CAAA,CAC7B,CAEA,SAASe,GAAQC,EAAmB,CACnC,MAAMhB,EAAOxE,EAAa,SAAS,OAAS,GAE5C,GAAIA,EAAa,SAAWwF,EAAW,CACtC,MAAMP,EAAQjF,EAAa,QAAQ,eAC7BkF,EAAMlF,EAAa,QAAQ,aACjC,GAAIiF,IAAUC,EACb,OAAOC,GAAkBK,EAAWP,CAAK,CAE3C,CACA,MAAO,CAAE,KAAAT,EAAa,KAAMA,CAAA,CAC7B,CAEA,SAASW,GAAkBK,EAAmBE,EAAe,CAC5D,IAAIlB,EAAOxE,EAAa,SAAS,OAAS,GAE1CwE,EAAOA,EAAK,MAAM,EAAGkB,CAAK,EAAIF,EAAYhB,EAAK,MAAMkB,CAAK,EAC1D,MAAMD,EAAOxI,EAAwB,QAAQuH,CAAI,EACjD,OAAAb,EAAca,CAAI,EACX,CAAE,KAAAA,EAAM,KAAAiB,CAAA,CAChB,CAEAhD,EAAAA,UAAU,IAAM,CACf,GAAI,OAAO,OAAW,KAAe,CAACnF,EAAmB,OACzD,MAAMqI,EAAS,OAAO,eAAe,QAAQpD,CAAmB,GAAK,GAAG,EACxE,OAAK,OAAO,MAAMoD,CAAM,GACvBnF,GAA0BmF,CAAM,EAE1B,IAAM,CACZ,eAAe,WAAWpD,CAAmB,CAC9C,CACD,EAAG,CAACjF,EAAmBiF,CAAmB,CAAC,EAE3CE,EAAAA,UAAU,IAAM,CACf,GAAIhC,EAAc,CACjBH,EAAyB,EAAK,EAC1BoB,EAAgB,UACnB,aAAaA,EAAgB,OAAO,EACpCA,EAAgB,QAAU,MAE3B,MACD,CACA,GAAMT,GAAsBE,EAAqB,OAAS,EAAG,CAC5Db,EAAyB,EAAK,EAC1BoB,EAAgB,UACnB,aAAaA,EAAgB,OAAO,EACpCA,EAAgB,QAAU,MAE3B,MACD,CACA,MAAMkE,EACL,CAAC,CAAC1F,EAAY,KAAA,GAAUA,EAAY,QAAUgD,GAE/C,GAAIrB,EAAwB,UAAY,KAAM,CAC7CA,EAAwB,QAAU+D,EAC9BA,IACHlE,EAAgB,QAAU,WAAW,IAAM,CAC1C4C,GAA4B,QAAA,CAC7B,EAAGnJ,EAAgB,GAEpB,MACD,CAEA,GAAI,CAACyK,EAAU,CACd/D,EAAwB,QAAU,GAClCvB,EAAyB,EAAK,EAC1BoB,EAAgB,UACnB,aAAaA,EAAgB,OAAO,EACpCA,EAAgB,QAAU,MAE3B,MACD,CAEA,MAAMmE,EAAmB,CAAChE,EAAwB,SAAW+D,EAC7D/D,EAAwB,QAAU,GAE9BgE,GACHvB,GAA4B,QAAA,EAGzB5C,EAAgB,SACnB,aAAaA,EAAgB,OAAO,EAErCA,EAAgB,QAAU,WAAW,IAAM,CAC1C4C,GAA4B,QAAA,CAC7B,EAAGnJ,EAAgB,CACpB,EAAG,CACF+E,EACAO,EACAyC,GACAjC,EACAE,CAAA,CACA,EAEDsB,EAAAA,UAAU,IACF,IAAM,CACRf,EAAgB,SAAS,aAAaA,EAAgB,OAAO,EAC7DC,EAAkB,SAAS,aAAaA,EAAkB,OAAO,EACjEG,EAAgB,SAAS,aAAaA,EAAgB,OAAO,EAC7DF,EAAkB,SAAS,aAAaA,EAAkB,OAAO,CACtE,EACE,CAAA,CAAE,EAEL,MAAMkE,EAAkB3E,EAAqBE,CAAe,GAAK,GAC3D0E,EAA6BvD,EAAAA,QAAQ,IACtC,CAACjB,GAAwB,CAACuE,EAAwB,KAC/C,GAAGvE,CAAoB,IAAIF,CAAe,IAAIyE,CAAe,GAClE,CAACA,EAAiBvE,EAAsBF,CAAe,CAAC,EACrD2E,GAAgC,CAAC,EACtCD,GACA3D,GAAyB2D,CAA0B,GAE9CE,GAAqBzD,EAAAA,QAC1B,IAAMvF,EAAwB,QAAQgE,GAAsB,EAAE,EAC9D,CAACA,CAAkB,CAAA,EAEdiF,GAAsB1D,EAAAA,QAC3B,IAAMvF,EAAwB,QAAQ6I,CAAe,EACrD,CAACA,CAAe,CAAA,EAEXK,GAAgBhF,EAAqB,OAAS9F,GAC9C+K,EACL,CAAC,CAACnF,GAAsBE,EAAqB,OAAS,EACjDkF,GACLlF,EAAqB,QAAU,GAAKE,GAAmB,EAClDiF,GACLnF,EAAqB,QAAU,GAC/BE,GAAmBF,EAAqB,OAAS,EAElDsB,EAAAA,UAAU,IAAM,CACf,GAAI,CAAC2D,EAA6B,OAClC,MAAMG,EAAO9E,GAAoB,QAC5B8E,IACLA,EAAK,UAAYA,EAAK,aACvB,EAAG,CAACT,EAAiBM,EAA6B3F,CAAY,CAAC,EAE/D,MAAM+F,EAAkBpD,EAAAA,YACvB,MACC2B,EACA0B,EAAqB,GACrBC,EACAC,EACAC,EAAiCC,EAAAA,gBAAgB,UAC7C,CACJ,GACC,CAAClH,IACD,CAACjB,KACA,CAACL,IAAmB,CAACC,IACrB,CACDP,IAAU,0BAA0B,EACpC,MACD,CACA,GAAI,CAACmC,EAAY,OAAQ,OACzB,MAAM4G,EACL9D,EAAiB+B,CAAU,GAC3B9B,EAAAA,4BAA4B8B,CAAU,GACtC,GAGD,GAFI7E,EAAY,OAAS4G,GACrBrG,GACAgG,GAAsB,CAACN,GAAe,OAE1C,MAAMY,GAAapE,GAAoBoC,CAAU,EAC3CiC,EACLjC,IAAehG,EAAAA,oBAAoB,UACnCZ,IAAiB,WACjByI,IAAkBC,EAAAA,gBAAgB,SAC/B,CACA,GAAGE,GACH,MAAO,WACP,WAAYvL,EAAA,EAEZuL,GAGEE,EAAiBN,GAAkB5F,GAAagE,CAAU,EAC1DmC,GAAeF,EAAO,OAAO,KACjCG,GAASA,EAAK,KAAOF,CAAA,EAEjBG,GACLV,IAAwB,OACrBA,EACA7F,EACEwG,GACLzH,KAAkB,CACjB,WAAAmF,EACA,cAAA6B,EACA,YAAA1G,EACA,aAAA/B,EACA,OAAA6I,EACA,OAAQC,EACR,UAAWC,IAAc,MACzB,gBAAiBE,IAAwB,MAAA,CACzC,GACDE,GAAAA,kBAAkB,CACjB,OAAAN,EACA,YAAA9G,EACA,eAAA+G,EACA,gBAAiBG,EAAA,CACjB,EAEF1G,GAAgB,EAAI,EACpB8C,EAAY,sBAAuB,CAClC,YAAauB,EACb,YAAa3G,EACb,kBAAmBD,CAAA,CACnB,EACD,GAAI,CACH,MAAMoJ,EAAS5H,GACZ,MAAMA,GAAkB,CACxB,WAAAoF,EACA,cAAA6B,EACA,YAAA1G,EACA,aAAA/B,EACA,OAAQ8I,EACR,UAAWC,IAAc,MACzB,gBAAiBE,IAAwB,OACzC,OAAAC,EAAA,CACC,EACD,MAAMG,GAAAA,oBAAoB,CAC1B,WAAA9I,GACA,gBAAAL,GACA,QAAAC,GACA,aAAAC,GACA,OAAA8I,GACA,OAAAxI,GACA,eAAAF,GACA,SAAAC,GACA,QAAAJ,GACA,QAAAC,EAAA,CACC,EACEgJ,GACL,OAAOF,GAAW,SACfA,EAAO,QACNA,GAAQ,MAAQ,IAAI,KAAA,EACzB,GAAI,CAACE,GAAW,OAChB,GAAI,CAAChB,EAAoB,CACxBvF,GAAsBhB,CAAW,EACjCsB,GAAwBuD,CAAU,EAClC3D,GAAwB,CAACqG,EAAS,CAAC,EACnCnG,EAAmB,CAAC,EACpB,MACD,CACAF,GAAyByC,IAAS,CACjC,MAAM6D,GAAO,CAAC,GAAG7D,GAAM4D,EAAS,EAAE,MAAM,EAAGpM,EAAe,EAC1D,OAAAiG,EAAmBoG,GAAK,OAAS,CAAC,EAC3BA,EACR,CAAC,CACF,MAAY,CACX3J,IAAU,kCAAkC,CAC7C,QAAA,CACC2C,GAAgB,EAAK,CACtB,CACD,EACA,CACCrC,GACAC,GACA4B,EACAO,EACA0F,GACAxD,GACA5B,GACAF,EACA2C,EACApF,EACAG,GACAG,GACAG,GACAF,GACAC,GACAJ,GACAC,GACAN,EACAJ,EACAiF,EACArD,GACAC,EAAA,CACD,EAGK+H,GAAyBvE,EAAAA,YAAY,IAAM,CAChD,GAAI,CAAC0C,GAAmB,CAAC7E,GAAsB,CAACM,EAC/C,OACDoC,EAAcmC,CAAe,EAC7BhC,EAAoBgC,CAAe,EACnCtC,EAAY,yBAA0B,CACrC,YAAajC,EACb,YAAanD,CAAA,CACb,EACD6D,GAA2B,QAAU,CACpC,aAAc6D,EACd,aAAc7E,EACd,WAAYM,EACZ,mBAAoB,EAAA,EAGrB,MAAMqG,EAAmB5F,GAAyB,QAC5C6F,EAAaC,GAAAA,qBAAqB,CACvC,aAAc7G,EACd,aAAc6E,EACd,sBAAuB8B,CAAA,CACvB,EACGA,IACH5F,GAAyB,QAAU,IAEpCzC,KAAkB,CACjB,GAAGsI,EACH,OAAQ,QAAA,CACR,EACD1D,EAAA,CACD,EAAG,CACF2B,EACA7E,EACAM,EACAoC,EACAG,EACAN,EACApF,EACAmB,GACA4E,CAAA,CACA,EAEK4D,GAAyB3E,EAAAA,YAAY,IAAM,CAC3C7B,IACLiC,EAAY,0BAA2B,CACtC,YAAajC,EACb,YAAanD,CAAA,CACb,EACD+F,EAAA,EACD,EAAG,CAACA,EAAwBX,EAAajC,EAAsBnD,CAAU,CAAC,EAEpE4J,GAAiB5E,EAAAA,YACrB6E,GAA6B,CACzB,CAAC1G,GAAwB,CAACwE,GAC1B3D,GAAyB2D,CAA0B,IACvD1D,GAA6BwB,IAAU,CACtC,GAAGA,EACH,CAACkC,CAA0B,EAAGkC,CAAA,EAC7B,EACFzE,EAAY,wBAAyB,CACpC,YAAajC,EACb,YAAanD,EACb,OAAA6J,EACA,gBAAiB5G,EAAkB,CAAA,CACnC,EACF,EACA,CACC0E,EACAvC,EACApB,GACAb,EACAF,EACAjD,CAAA,CACD,EAGK8J,GAAoC1F,EAAAA,QAAQ,IAC7CxD,GAAgC,CAAA,EAC7BF,GAAiB,IAAKiG,GAAe,CAC3C,MAAMoD,EAAexF,GAAoBoC,CAAU,EAC7CqD,EAASrH,GAAagE,CAAU,EACtC,MAAO,CACN,KAAMA,EACN,MAAOoD,EAAa,MACpB,UAAWpD,IAAehG,EAAAA,oBAAoB,SAC9C,QAAS0B,GAAgBc,IAAyBwD,EAClD,YACCA,IAAehG,sBAAoB,UACnCsB,GACD,SACC,CAACH,EAAY,KAAA,GACbA,EAAY,QACV8C,EAAiB+B,CAAU,GAC3B9B,EAAAA,4BAA4B8B,CAAU,GACtC,KACFtE,GACC2F,GACA7E,IAAyBwD,EAC3B,iBACCA,IAAehG,sBAAoB,UACnC,CAAC,CAACoJ,EAAa,OAAO,OACvB,MAAOA,EAAa,MACpB,eAAgBC,CAAA,CAElB,CAAC,EACC,CACFtJ,GACAE,GACA2D,GACA5B,GACAN,EACAc,EACA6E,EACA/F,GACAH,EACA8C,CAAA,CACA,EAEDqF,OAAAA,EAAAA,oBACCtI,GACA,KACQ,CACN,cAAAqF,GACA,QAAAG,GACA,KAAM,CACL,OAAOrF,CACR,EACA,iBAAAyE,EAAA,GAGF,CAACS,GAAeG,GAASrF,CAAW,CAAA,EAGrCuC,EAAAA,UAAU,IAAM,CACX9E,IAAe,QACnBgG,EAAchG,GAAc,EAAE,CAC/B,EAAG,CAACA,EAAYgG,CAAa,CAAC,EAE9BlB,EAAAA,UAAU,IAAM,CACf,GAAI,CAAC3E,GAAS,CAACC,EAAS,OACxB,MAAMuK,EACLpI,EAAY,OAASpC,EAAQ5C,GAAgB2C,GAAS,GACnDkE,GAA0B,UAAYuG,IAC1CvG,GAA0B,QAAUuG,EACpCvK,EAAQuK,CAAS,EAClB,EAAG,CAACpI,EAAarC,EAAOC,EAAOC,CAAO,CAAC,SAGrCwK,iBAAA,CACA,SAAA,CAAAC,OAACC,EAAAA,gBAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAAA,kBAAA,CACC,YACAD,EAAAA,IAACE,GAAAA,WAAA,CAAW,YAAU,8BACpB,SAAAnJ,EAAA,CACF,EACG,IAAA,CACL,SACCoJ,EAAAA,kBAAA,CACC,SAAA,CAAAhL,GAASA,IAAU3C,GACnBsN,EAAAA,KAAAM,EAAAA,SAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAO9M,EAAAA,OAAO,QAAQ,QAAA,CAAA,QAEtB+M,GAAAA,YAAA,CAAY,MAAO/M,EAAAA,OAAO,QAAQ,SACjC,SAAA4B,CAAA,CACF,CAAA,CAAA,CACD,EACG,KACHC,EACA0K,EAAAA,KAACQ,GAAAA,YAAA,CACA,MAAO,CACN,MACCnL,IAAU3C,IAAiBgF,EAAY,OAASpC,EAC7C7B,EAAAA,OAAO,QAAQ,SACfA,EAAAA,OAAO,QAAQ,SAAA,EAGnB,SAAA,CAAAiE,EAAY,OAAO,IAAEpC,CAAA,CAAA,CAAA,EAEpB,IAAA,CAAA,CACL,CAAA,EACD,EACA0K,EAAAA,KAACS,EAAAA,UAAA,CAAU,QAAS,CAAC,CAACpL,EACpB,SAAA,CAAAuI,EACAoC,EAAAA,KAACzM,GAAA,CAA2B,IAAK0F,GAChC,SAAA,CAAAiH,EAAAA,IAAC1M,GAAA,CACA,wBAAyB,CAAE,OAAQiK,EAAA,CAAmB,CAAA,EAEtDxF,EACAiI,EAAAA,IAACxM,GAAA,CAAwB,YAAU,OAClC,gBAACC,GAAA,CACA,SAAA,CAAAuM,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,EAChC6M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,EAChC6M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,CAAA,CAAA,CACjC,EACD,EAEA6M,EAAAA,IAACxM,GAAA,CACA,wBAAyB,CACxB,OAAQgK,EAAA,CACT,CAAA,SAGD9J,GAAA,CACA,SAAA,CAAAsM,EAAAA,IAACpM,EAAA,CACA,aAAW,sBACX,KAAK,SACL,SAAU+J,GACV,QAAS,IACR/E,EAAoB4H,GAAQ,KAAK,IAAI,EAAGA,EAAM,CAAC,CAAC,EAGjD,SAAAR,EAAAA,IAACS,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOlN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,SAEAI,GAAA,CACC,SAAA,CAAAgF,EAAkB,EAAE,IAAEF,EAAqB,MAAA,EAC7C,EACAuH,EAAAA,IAACpM,EAAA,CACA,aAAW,kBACX,KAAK,SACL,SAAUgK,GACV,QAAS,IACRhF,EAAoB4H,GACnB,KAAK,IAAI/H,EAAqB,OAAS,EAAG+H,EAAM,CAAC,CAAA,EAInD,SAAAR,EAAAA,IAACU,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOnN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,EAEDyM,EAAAA,IAACW,GAAAA,QAAA,CAAQ,KAAK,OAAO,UAAU,MAC9B,SAAAX,EAAAA,IAACpM,EAAA,CACA,aAAW,kBACX,KAAK,SACL,SAAU0J,GACV,QAAS,IAAMgC,GAAe,MAAA,EAE9B,SAAAU,EAAAA,IAACY,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOrN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,EAEF,EACAyM,EAAAA,IAACW,GAAAA,QAAA,CAAQ,KAAK,UAAU,UAAU,MACjC,SAAAX,EAAAA,IAACpM,EAAA,CACA,aAAW,qBACX,KAAK,SACL,SAAU0J,GACV,QAAS,IAAMgC,GAAe,SAAA,EAE9B,SAAAU,EAAAA,IAACa,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOtN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,EAEF,EACCkK,GACAuC,EAAAA,IAACW,GAAAA,QAAA,CACA,KAAM5I,EAAe,gBAAkB,aACvC,UAAU,MAEV,SAAAiI,EAAAA,IAACnM,GAAA,CACA,aAAW,wBACX,YAAWkE,EACX,KAAK,SACL,SAAUA,EACV,QAAS,IAAM,CACVc,GACHiF,EAAgBjF,EAAsB,EAAI,CAE5C,EAEC,SAAAd,EACAiI,EAAAA,IAAClM,GAAA,CAAsB,cAAW,EAAA,CAAC,EAEnCkM,EAAAA,IAACc,GAAAA,QAAA,CAAW,MAAO,GAAI,OAAQ,EAAA,CAAI,CAAA,CAAA,CAErC,CAAA,EAEE,KACJd,EAAAA,IAACW,GAAAA,QAAA,CAAQ,KAAK,UAAU,UAAU,MACjC,SAAAX,EAAAA,IAACpM,EAAA,CACA,aAAW,qBACX,KAAK,SACL,QAASyL,GAET,SAAAW,EAAAA,IAACe,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOxN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,EAEF,EACAyM,EAAAA,IAACW,GAAAA,QAAA,CAAQ,KAAK,SAAS,UAAU,MAChC,SAAAX,EAAAA,IAACpM,EAAA,CACA,aAAW,oBACX,KAAK,SACL,QAASqL,GAET,SAAAe,EAAAA,IAACgB,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOzN,EAAAA,OAAO,QAAQ,SAAA,CAAA,CACvB,CAAA,CACD,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CACD,EACGwE,EACH+H,EAAAA,KAAC7M,GAAA,CACA,SAAA,CAAA+M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,EAChC6M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,EAChC6M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,EAChC6M,EAAAA,IAAC7M,EAAA,CAAmB,MAAM,KAAA,CAAM,CAAA,CAAA,CACjC,EAEA6M,EAAAA,IAACiB,EAAAA,UAAA,CACA,IAAK3J,EACJ,GAAGF,GACJ,MAAOI,EACP,SAAUqE,GACV,OAAS,GAAM,CACV3C,EAAkB,UACrB,aAAaA,EAAkB,OAAO,EACtCA,EAAkB,QAAU,MAE7BmC,GAA2B,EAAE,OAAO,KAAK,EACzClE,KAAiB,CAAC,CACnB,EACA,QAAU,GAAM,CACf,MAAM+J,EAAa,EAAE,cAAc,QAAQ,MAAM,EACjD,GAAIA,EAAW,OAAStO,GAAuB,CAC9C,EAAE,eAAA,EACF,MAAMuO,EAAK7J,EAAa,QAClBiF,EAAQ4E,GAAI,gBAAkB,EAC9B3E,EAAM2E,GAAI,cAAgB5E,EAE1B6E,EAAOD,GAAI,OAAS3J,EACpB0D,GACLkG,EAAK,MAAM,EAAG7E,CAAK,EAAI2E,EAAaE,EAAK,MAAM5E,CAAG,EACnDvB,EAAcC,EAAQ,EACtBE,EAAoBF,EAAQ,EAC5B,MAAMmG,EAAQ9E,EAAQ2E,EAAW,OACjC,sBAAsB,IAAM,CAC3B,MAAMI,EAAKhK,EAAa,QACxB,GAAKgK,EACL,GAAI,CACHA,EAAG,kBAAkBD,EAAOA,CAAK,CAClC,MAAQ,CAER,CACD,CAAC,CACF,CACD,EACA,KAAA/L,EAAA,CAAA,EAGD2C,UACClE,GAAA,CACA,SAAA,CAAA+L,OAAC9L,GAAA,CACA,SAAA,CAAAgM,EAAAA,IAACuB,GAAAA,QAAA,CACA,MAAO,GACP,OAAQ,GACR,MAAOhO,EAAAA,OAAO,QAAQ,SAAA,CAAA,EAEvByM,EAAAA,IAAC/L,GAAA,CACA,MAAOkE,EACP,YAAY,mDACZ,SAAW,GAAMC,GAAmB,EAAE,OAAO,KAAK,CAAA,CAAA,SAElDlE,GAAA,CACA,SAAA,CAAA8L,EAAAA,IAAC7L,GAAA,CACA,KAAK,SACL,QAAS,IAAM,CACdiE,GAAmB,EAAE,EACrBF,GAA6B,EAAK,CACnC,EACA,SAAA,QAAA,CAAA,EAGD8H,EAAAA,IAAC5L,GAAA,CACA,KAAK,SACL,QAAS,IAAM,CACd,MAAMoN,EAAqBrJ,EAAgB,KAAA,EACvCqJ,GACH1G,EAAY,sBAAuB,CAClC,YAAazE,EAAAA,oBAAoB,SACjC,YAAaX,EACb,iBACC+E,GAAyB+G,CAAkB,CAAA,CAC5C,EAEFtJ,GAA6B,EAAK,EAClCE,GAAmB,EAAE,EACrB0F,EACCzH,EAAAA,oBAAoB,SACpB,GACAmL,CAAA,CAEF,EACA,SAAA,SAAA,CAAA,CAED,CAAA,CACD,CAAA,EACD,EACCrJ,EAAgB,KAAA,EAAO,OAAS,GACjCgC,GAA+B,OAAS,EACvC6F,EAAAA,IAAC3L,GAAA,CACC,SAAA8F,GAA+B,IAAKE,GACpC2F,EAAAA,IAAC1L,GAAA,CAEA,KAAK,SACL,SAAU6D,IAAoBkC,EAC9B,QAAS,IAAMjC,GAAmBiC,CAAU,EAE3C,SAAAA,CAAA,EALIA,CAAA,CAON,EACF,EACG,IAAA,CAAA,CACL,EAEA2F,EAAAA,IAACyB,EAAAA,yBAAA,CACA,QAAAlM,GACA,IAAK+B,EACL,eAAA8E,GACA,eAAAlH,GACA,qBAAsBwI,GAA+B3F,EACrD,aAAc4E,GACd,UAAW6C,GACX,kBAAmB9B,GAA+B3F,EAClD,kBAAmBE,GACnB,sBAAuB,IAAMC,GAA6B,EAAI,EAC9D,eAAgB,CAACmE,EAAYqD,IAAW,CACvCpH,GAAiB6C,IAAU,CAAE,GAAGA,EAAM,CAACkB,CAAU,EAAGqD,CAAA,EAAS,EAC7D1I,KAAiBqF,EAAYqD,CAAM,EAC/BrD,IAAehG,EAAAA,oBAAoB,UACtCyH,EACCzB,EACA,GACA,OACAqD,EACAvB,kBAAgB,OAAA,CAGnB,EACA,gBAAiB,CAChB9B,EACA6B,EAAgBC,EAAAA,gBAAgB,UAC5B,CACJ,GAAI,CAAApG,EAEJ,IAAI2F,EAA6B,CAChC,GAAI7E,IAAyBwD,EAG5B,OAGDZ,EAAA,EACAqC,EACCzB,EACA,GACA,OACA,OACA6B,CAAA,EAED,MACD,CAEAJ,EACCzB,EACA,GACA,OACA,OACA6B,CAAA,EAEF,CAAA,CAAA,CACD,CAAA,CAEF,CAAA,EACD,CAEF,CACD,EAEArJ,GAAmB,YAAc"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),A=require("../../../helpers/sanitize.js"),T=require("react"),o=require("../../TypographyStyle.js"),i=require("../../../constants/Theme.js"),t=require("../AgentBuilder.styled.js"),j=({label:l,value:r,onChange:c,maxLength:s,placeholder:a,minHeight:u,disabled:d,...x})=>{const[h,n]=T.useState(!1);return e.jsxs(t.FieldBlock,{children:[e.jsxs(t.FieldLabelRow,{children:[e.jsx(o.TitleSmall,{color:i.COLORS.content.primary,children:l}),e.jsxs(o.BodyCaption,{color:i.COLORS.content.secondary,children:[r.length,"/",s]})]}),e.jsx(t.AiTextAreaShell,{focused:h,minHeight:u,children:e.jsx(t.AiTextAreaInput,{"data-test":x["data-test"],value:r,placeholder:a,maxLength:s,disabled:d,onFocus:()=>n(!0),onBlur:()=>n(!1),onChange:y=>c(A.stripHtmlTags(y.target.value))})})]})};exports.AiTextArea=j;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),A=require("react"),n=require("../../TypographyStyle.js"),l=require("../../../constants/Theme.js"),t=require("../AgentBuilder.styled.js"),j=({label:c,value:r,onChange:i,maxLength:s,placeholder:a,minHeight:u,disabled:d,...x})=>{const[h,o]=A.useState(!1);return e.jsxs(t.FieldBlock,{children:[e.jsxs(t.FieldLabelRow,{children:[e.jsx(n.TitleSmall,{color:l.COLORS.content.primary,children:c}),e.jsxs(n.BodyCaption,{color:l.COLORS.content.secondary,children:[r.length,"/",s]})]}),e.jsx(t.AiTextAreaShell,{focused:h,minHeight:u,children:e.jsx(t.AiTextAreaInput,{"data-test":x["data-test"],value:r,placeholder:a,maxLength:s,disabled:d,onFocus:()=>o(!0),onBlur:()=>o(!1),onChange:y=>i(y.target.value)})})]})};exports.AiTextArea=j;
2
2
  //# sourceMappingURL=AiTextArea.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiTextArea.js","sources":["../../../../../src/components/agent-builder/components/AiTextArea.tsx"],"sourcesContent":["import { stripHtmlTags } from '@src/helpers/sanitize';\nimport React, { useState } from 'react';\nimport { BodyCaption, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAiTextAreaInput,\n\tAiTextAreaShell,\n\tFieldBlock,\n\tFieldLabelRow,\n} from '../AgentBuilder.styled';\n\ninterface AiTextAreaProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\tdisabled?: boolean;\n\t'data-test'?: string;\n}\n\n/** Labelled textarea with a live character counter. */\nexport const AiTextArea: React.FC<AiTextAreaProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight,\n\tdisabled,\n\t...rest\n}) => {\n\tconst [focused, setFocused] = useState(false);\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<FieldLabelRow>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t{value.length}/{maxLength}\n\t\t\t\t</BodyCaption>\n\t\t\t</FieldLabelRow>\n\n\t\t\t<AiTextAreaShell focused={focused} minHeight={minHeight}>\n\t\t\t\t<AiTextAreaInput\n\t\t\t\t\tdata-test={rest['data-test']}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonFocus={() => setFocused(true)}\n\t\t\t\t\tonBlur={() => setFocused(false)}\n\t\t\t\t\tonChange={(e) => onChange(stripHtmlTags(e.target.value))}\n\t\t\t\t/>\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n"],"names":["AiTextArea","label","value","onChange","maxLength","placeholder","minHeight","disabled","rest","focused","setFocused","useState","FieldBlock","jsxs","FieldLabelRow","jsx","TitleSmall","COLORS","BodyCaption","AiTextAreaShell","AiTextAreaInput","e","stripHtmlTags"],"mappings":"wSAuBaA,EAAwC,CAAC,CACrD,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,IAAM,CACL,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EAE5C,cACEC,aAAA,CACA,SAAA,CAAAC,OAACC,EAAAA,cAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAhB,EAAM,EAClDY,EAAAA,KAACK,EAAAA,YAAA,CAAY,MAAOD,EAAAA,OAAO,QAAQ,UACjC,SAAA,CAAAf,EAAM,OAAO,IAAEE,CAAA,CAAA,CACjB,CAAA,EACD,EAEAW,EAAAA,IAACI,EAAAA,gBAAA,CAAgB,QAAAV,EAAkB,UAAAH,EAClC,SAAAS,EAAAA,IAACK,EAAAA,gBAAA,CACA,YAAWZ,EAAK,WAAW,EAC3B,MAAAN,EACA,YAAAG,EACA,UAAAD,EACA,SAAAG,EACA,QAAS,IAAMG,EAAW,EAAI,EAC9B,OAAQ,IAAMA,EAAW,EAAK,EAC9B,SAAWW,GAAMlB,EAASmB,EAAAA,cAAcD,EAAE,OAAO,KAAK,CAAC,CAAA,CAAA,CACxD,CACD,CAAA,EACD,CAEF"}
1
+ {"version":3,"file":"AiTextArea.js","sources":["../../../../../src/components/agent-builder/components/AiTextArea.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { BodyCaption, TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAiTextAreaInput,\n\tAiTextAreaShell,\n\tFieldBlock,\n\tFieldLabelRow,\n} from '../AgentBuilder.styled';\n\ninterface AiTextAreaProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\tdisabled?: boolean;\n\t'data-test'?: string;\n}\n\n/** Labelled textarea with a live character counter. */\nexport const AiTextArea: React.FC<AiTextAreaProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight,\n\tdisabled,\n\t...rest\n}) => {\n\tconst [focused, setFocused] = useState(false);\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<FieldLabelRow>\n\t\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t\t<BodyCaption color={COLORS.content.secondary}>\n\t\t\t\t\t{value.length}/{maxLength}\n\t\t\t\t</BodyCaption>\n\t\t\t</FieldLabelRow>\n\n\t\t\t<AiTextAreaShell focused={focused} minHeight={minHeight}>\n\t\t\t\t<AiTextAreaInput\n\t\t\t\t\tdata-test={rest['data-test']}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonFocus={() => setFocused(true)}\n\t\t\t\t\tonBlur={() => setFocused(false)}\n\t\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\t/>\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n"],"names":["AiTextArea","label","value","onChange","maxLength","placeholder","minHeight","disabled","rest","focused","setFocused","useState","FieldBlock","jsxs","FieldLabelRow","jsx","TitleSmall","COLORS","BodyCaption","AiTextAreaShell","AiTextAreaInput","e"],"mappings":"8PAsBaA,EAAwC,CAAC,CACrD,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,EACA,SAAAC,EACA,GAAGC,CACJ,IAAM,CACL,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EAE5C,cACEC,aAAA,CACA,SAAA,CAAAC,OAACC,EAAAA,cAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAhB,EAAM,EAClDY,EAAAA,KAACK,EAAAA,YAAA,CAAY,MAAOD,EAAAA,OAAO,QAAQ,UACjC,SAAA,CAAAf,EAAM,OAAO,IAAEE,CAAA,CAAA,CACjB,CAAA,EACD,EAEAW,EAAAA,IAACI,EAAAA,gBAAA,CAAgB,QAAAV,EAAkB,UAAAH,EAClC,SAAAS,EAAAA,IAACK,EAAAA,gBAAA,CACA,YAAWZ,EAAK,WAAW,EAC3B,MAAAN,EACA,YAAAG,EACA,UAAAD,EACA,SAAAG,EACA,QAAS,IAAMG,EAAW,EAAI,EAC9B,OAAQ,IAAMA,EAAW,EAAK,EAC9B,SAAWW,GAAMlB,EAASkB,EAAE,OAAO,KAAK,CAAA,CAAA,CACzC,CACD,CAAA,EACD,CAEF"}
@@ -1,5 +1,5 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("../../../helpers/sanitize.js"),u=require("react"),h=require("styled-components"),T=require("../../TypographyStyle.js"),j=require("../../../constants/Theme.js"),r=require("../AgentBuilder.styled.js"),q=require("../../button/Button.js"),S=require("../../../icons/BIK AI specific/WandSparkles.js"),I=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},b=I(h),A=({label:t,value:s,onChange:o,maxLength:d,placeholder:p,minHeight:f="120px",onImprove:n,...l})=>{const[m,a]=u.useState(!1),[i,c]=u.useState(!1),y=async()=>{if(!(!n||i||s.trim().length===0)){c(!0);try{o(await n(s))}finally{c(!1)}}};return e.jsxs(r.FieldBlock,{children:[e.jsx(T.TitleSmall,{color:j.COLORS.content.primary,children:t}),e.jsxs(r.AiTextAreaShell,{focused:m,minHeight:f,children:[e.jsx(r.AiTextAreaInput,{"data-test":l["data-test"],value:s,placeholder:p,maxLength:d,onFocus:()=>a(!0),onBlur:()=>a(!1),onChange:g=>o(x.stripHtmlTags(g.target.value))}),n&&e.jsx(B,{children:e.jsx(q.Button,{"data-test":`${l["data-test"]??"tool"}-improve`,buttonType:"ai",size:"small",LeadingIcon:S.default,buttonText:"Improve with AI",isLoading:i,disabled:i||s.trim().length===0,onClick:y})})]})]})},B=b.default.div`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),u=require("react"),x=require("styled-components"),h=require("../../TypographyStyle.js"),T=require("../../../constants/Theme.js"),r=require("../AgentBuilder.styled.js"),j=require("../../button/Button.js"),S=require("../../../icons/BIK AI specific/WandSparkles.js"),q=t=>t&&typeof t=="object"&&"default"in t?t:{default:t},I=q(x),b=({label:t,value:s,onChange:i,maxLength:d,placeholder:f,minHeight:p="120px",onImprove:n,...l})=>{const[y,a]=u.useState(!1),[o,c]=u.useState(!1),m=async()=>{if(!(!n||o||s.trim().length===0)){c(!0);try{i(await n(s))}finally{c(!1)}}};return e.jsxs(r.FieldBlock,{children:[e.jsx(h.TitleSmall,{color:T.COLORS.content.primary,children:t}),e.jsxs(r.AiTextAreaShell,{focused:y,minHeight:p,children:[e.jsx(r.AiTextAreaInput,{"data-test":l["data-test"],value:s,placeholder:f,maxLength:d,onFocus:()=>a(!0),onBlur:()=>a(!1),onChange:g=>i(g.target.value)}),n&&e.jsx(A,{children:e.jsx(j.Button,{"data-test":`${l["data-test"]??"tool"}-improve`,buttonType:"ai",size:"small",LeadingIcon:S.default,buttonText:"Improve with AI",isLoading:o,disabled:o||s.trim().length===0,onClick:m})})]})]})},A=I.default.div`
2
2
  display: flex;
3
3
  align-items: center;
4
- `;exports.ToolInstructionsField=A;
4
+ `;exports.ToolInstructionsField=b;
5
5
  //# sourceMappingURL=ToolInstructionsField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolInstructionsField.js","sources":["../../../../../src/components/agent-builder/components/ToolInstructionsField.tsx"],"sourcesContent":["import { stripHtmlTags } from '@src/helpers/sanitize';\nimport { WandSparkles } from '@src/icons';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '@src/components/button';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAiTextAreaInput,\n\tAiTextAreaShell,\n\tFieldBlock,\n} from '../AgentBuilder.styled';\n\ninterface ToolInstructionsFieldProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\t/** \"Improve with AI\" — resolves with rewritten text. Omit to hide the button. */\n\tonImprove?: (text: string) => Promise<string>;\n\t'data-test'?: string;\n}\n\n/**\n * A labelled multiline field with an inline \"Improve with AI\" action pinned to\n * the bottom-left of the box (Figma: Rest API / Handover-to-email drawers). The\n * button is hidden when `onImprove` is omitted.\n */\nexport const ToolInstructionsField: React.FC<ToolInstructionsFieldProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight = '120px',\n\tonImprove,\n\t...rest\n}) => {\n\tconst [focused, setFocused] = useState(false);\n\tconst [improving, setImproving] = useState(false);\n\n\tconst handleImprove = async () => {\n\t\tif (!onImprove || improving || value.trim().length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(true);\n\t\ttry {\n\t\t\tonChange(await onImprove(value));\n\t\t} finally {\n\t\t\tsetImproving(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t<AiTextAreaShell focused={focused} minHeight={minHeight}>\n\t\t\t\t<AiTextAreaInput\n\t\t\t\t\tdata-test={rest['data-test']}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tonFocus={() => setFocused(true)}\n\t\t\t\t\tonBlur={() => setFocused(false)}\n\t\t\t\t\tonChange={(e) => onChange(stripHtmlTags(e.target.value))}\n\t\t\t\t/>\n\t\t\t\t{onImprove && (\n\t\t\t\t\t<ImproveRow>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tdata-test={`${rest['data-test'] ?? 'tool'}-improve`}\n\t\t\t\t\t\t\tbuttonType=\"ai\"\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tLeadingIcon={WandSparkles}\n\t\t\t\t\t\t\tbuttonText=\"Improve with AI\"\n\t\t\t\t\t\t\tisLoading={improving}\n\t\t\t\t\t\t\tdisabled={improving || value.trim().length === 0}\n\t\t\t\t\t\t\tonClick={handleImprove}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ImproveRow>\n\t\t\t\t)}\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n\nconst ImproveRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n`;\n"],"names":["ToolInstructionsField","label","value","onChange","maxLength","placeholder","minHeight","onImprove","rest","focused","setFocused","useState","improving","setImproving","handleImprove","FieldBlock","jsx","TitleSmall","COLORS","jsxs","AiTextAreaShell","AiTextAreaInput","e","stripHtmlTags","ImproveRow","Button","WandSparkles","styled"],"mappings":"seA8BaA,EAA8D,CAAC,CAC3E,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,EAAY,QACZ,UAAAC,EACA,GAAGC,CACJ,IAAM,CACL,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAE1CG,EAAgB,SAAY,CACjC,GAAI,GAACP,GAAaK,GAAaV,EAAM,KAAA,EAAO,SAAW,GAGvD,CAAAW,EAAa,EAAI,EACjB,GAAI,CACHV,EAAS,MAAMI,EAAUL,CAAK,CAAC,CAChC,QAAA,CACCW,EAAa,EAAK,CACnB,EACD,EAEA,cACEE,aAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAjB,EAAM,EAClDkB,EAAAA,KAACC,EAAAA,gBAAA,CAAgB,QAAAX,EAAkB,UAAAH,EAClC,SAAA,CAAAU,EAAAA,IAACK,EAAAA,gBAAA,CACA,YAAWb,EAAK,WAAW,EAC3B,MAAAN,EACA,YAAAG,EACA,UAAAD,EACA,QAAS,IAAMM,EAAW,EAAI,EAC9B,OAAQ,IAAMA,EAAW,EAAK,EAC9B,SAAWY,GAAMnB,EAASoB,EAAAA,cAAcD,EAAE,OAAO,KAAK,CAAC,CAAA,CAAA,EAEvDf,SACCiB,EAAA,CACA,SAAAR,EAAAA,IAACS,EAAAA,OAAA,CACA,YAAW,GAAGjB,EAAK,WAAW,GAAK,MAAM,WACzC,WAAW,KACX,KAAK,QACL,YAAakB,EAAAA,QACb,WAAW,kBACX,UAAWd,EACX,SAAUA,GAAaV,EAAM,KAAA,EAAO,SAAW,EAC/C,QAASY,CAAA,CAAA,CACV,CACD,CAAA,CAAA,CAEF,CAAA,EACD,CAEF,EAEMU,EAAaG,EAAAA,QAAO;AAAA;AAAA;AAAA"}
1
+ {"version":3,"file":"ToolInstructionsField.js","sources":["../../../../../src/components/agent-builder/components/ToolInstructionsField.tsx"],"sourcesContent":["import { WandSparkles } from '@src/icons';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button } from '@src/components/button';\nimport { TitleSmall } from '@src/components/TypographyStyle';\nimport { COLORS } from '@src/constants/Theme';\nimport {\n\tAiTextAreaInput,\n\tAiTextAreaShell,\n\tFieldBlock,\n} from '../AgentBuilder.styled';\n\ninterface ToolInstructionsFieldProps {\n\tlabel: string;\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tmaxLength: number;\n\tplaceholder?: string;\n\tminHeight?: string;\n\t/** \"Improve with AI\" — resolves with rewritten text. Omit to hide the button. */\n\tonImprove?: (text: string) => Promise<string>;\n\t'data-test'?: string;\n}\n\n/**\n * A labelled multiline field with an inline \"Improve with AI\" action pinned to\n * the bottom-left of the box (Figma: Rest API / Handover-to-email drawers). The\n * button is hidden when `onImprove` is omitted.\n */\nexport const ToolInstructionsField: React.FC<ToolInstructionsFieldProps> = ({\n\tlabel,\n\tvalue,\n\tonChange,\n\tmaxLength,\n\tplaceholder,\n\tminHeight = '120px',\n\tonImprove,\n\t...rest\n}) => {\n\tconst [focused, setFocused] = useState(false);\n\tconst [improving, setImproving] = useState(false);\n\n\tconst handleImprove = async () => {\n\t\tif (!onImprove || improving || value.trim().length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tsetImproving(true);\n\t\ttry {\n\t\t\tonChange(await onImprove(value));\n\t\t} finally {\n\t\t\tsetImproving(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FieldBlock>\n\t\t\t<TitleSmall color={COLORS.content.primary}>{label}</TitleSmall>\n\t\t\t<AiTextAreaShell focused={focused} minHeight={minHeight}>\n\t\t\t\t<AiTextAreaInput\n\t\t\t\t\tdata-test={rest['data-test']}\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\tonFocus={() => setFocused(true)}\n\t\t\t\t\tonBlur={() => setFocused(false)}\n\t\t\t\t\tonChange={(e) => onChange(e.target.value)}\n\t\t\t\t/>\n\t\t\t\t{onImprove && (\n\t\t\t\t\t<ImproveRow>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tdata-test={`${rest['data-test'] ?? 'tool'}-improve`}\n\t\t\t\t\t\t\tbuttonType=\"ai\"\n\t\t\t\t\t\t\tsize=\"small\"\n\t\t\t\t\t\t\tLeadingIcon={WandSparkles}\n\t\t\t\t\t\t\tbuttonText=\"Improve with AI\"\n\t\t\t\t\t\t\tisLoading={improving}\n\t\t\t\t\t\t\tdisabled={improving || value.trim().length === 0}\n\t\t\t\t\t\t\tonClick={handleImprove}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ImproveRow>\n\t\t\t\t)}\n\t\t\t</AiTextAreaShell>\n\t\t</FieldBlock>\n\t);\n};\n\nconst ImproveRow = styled.div`\n\tdisplay: flex;\n\talign-items: center;\n`;\n"],"names":["ToolInstructionsField","label","value","onChange","maxLength","placeholder","minHeight","onImprove","rest","focused","setFocused","useState","improving","setImproving","handleImprove","FieldBlock","jsx","TitleSmall","COLORS","jsxs","AiTextAreaShell","AiTextAreaInput","e","ImproveRow","Button","WandSparkles","styled"],"mappings":"4bA6BaA,EAA8D,CAAC,CAC3E,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,EAAY,QACZ,UAAAC,EACA,GAAGC,CACJ,IAAM,CACL,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EACtC,CAACC,EAAWC,CAAY,EAAIF,EAAAA,SAAS,EAAK,EAE1CG,EAAgB,SAAY,CACjC,GAAI,GAACP,GAAaK,GAAaV,EAAM,KAAA,EAAO,SAAW,GAGvD,CAAAW,EAAa,EAAI,EACjB,GAAI,CACHV,EAAS,MAAMI,EAAUL,CAAK,CAAC,CAChC,QAAA,CACCW,EAAa,EAAK,CACnB,EACD,EAEA,cACEE,aAAA,CACA,SAAA,CAAAC,MAACC,EAAAA,WAAA,CAAW,MAAOC,EAAAA,OAAO,QAAQ,QAAU,SAAAjB,EAAM,EAClDkB,EAAAA,KAACC,EAAAA,gBAAA,CAAgB,QAAAX,EAAkB,UAAAH,EAClC,SAAA,CAAAU,EAAAA,IAACK,EAAAA,gBAAA,CACA,YAAWb,EAAK,WAAW,EAC3B,MAAAN,EACA,YAAAG,EACA,UAAAD,EACA,QAAS,IAAMM,EAAW,EAAI,EAC9B,OAAQ,IAAMA,EAAW,EAAK,EAC9B,SAAWY,GAAMnB,EAASmB,EAAE,OAAO,KAAK,CAAA,CAAA,EAExCf,SACCgB,EAAA,CACA,SAAAP,EAAAA,IAACQ,EAAAA,OAAA,CACA,YAAW,GAAGhB,EAAK,WAAW,GAAK,MAAM,WACzC,WAAW,KACX,KAAK,QACL,YAAaiB,EAAAA,QACb,WAAW,kBACX,UAAWb,EACX,SAAUA,GAAaV,EAAM,KAAA,EAAO,SAAW,EAC/C,QAASY,CAAA,CAAA,CACV,CACD,CAAA,CAAA,CAEF,CAAA,EACD,CAEF,EAEMS,EAAaG,EAAAA,QAAO;AAAA;AAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),H=require("../../../assets/icons/Ai_event_generating.svg.js"),G=require("../../../helpers/sanitize.js"),o=require("react"),L=require("styled-components"),F=require("../../TypographyStyle.js"),V=require("../utils/markdown.js"),W=require("./ThinkingIndicator.js"),K=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},n=K(L),P=n.default.div`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("react/jsx-runtime"),G=require("../../../assets/icons/Ai_event_generating.svg.js"),o=require("react"),H=require("styled-components"),F=require("../../TypographyStyle.js"),L=require("../utils/markdown.js"),V=require("./ThinkingIndicator.js"),W=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},n=W(H),K=n.default.div`
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  width: 100%;
@@ -18,7 +18,7 @@
18
18
  `;default:return`
19
19
  background: white;
20
20
  `}}}
21
- `,E=n.default.div`
21
+ `,P=n.default.div`
22
22
  padding: 16px;
23
23
  border-bottom: 1px solid #e5e7eb;
24
24
  display: flex;
@@ -32,13 +32,13 @@
32
32
  font-weight: 500;
33
33
  color: #374151;
34
34
  }
35
- `,N=n.default.div`
35
+ `,E=n.default.div`
36
36
  flex: 1;
37
37
  display: flex;
38
38
  flex-direction: column;
39
39
  overflow: hidden;
40
40
  min-height: 0;
41
- `,O=n.default.div`
41
+ `,N=n.default.div`
42
42
  flex: 1;
43
43
  overflow-y: auto;
44
44
  padding: 16px;
@@ -67,13 +67,13 @@
67
67
  &::-webkit-scrollbar-thumb:hover {
68
68
  background: #a8a8a8;
69
69
  }
70
- `,J=n.default.div`
70
+ `,O=n.default.div`
71
71
  background: white;
72
72
  border-radius: 12px;
73
73
  padding: 16px;
74
74
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
75
75
  border: 1px solid #e5e7eb;
76
- `,Q=n.default.div`
76
+ `,J=n.default.div`
77
77
  width: 100%;
78
78
  height: 180px;
79
79
  background: #f3f4f6;
@@ -83,7 +83,7 @@
83
83
  justify-content: center;
84
84
  position: relative;
85
85
  margin-bottom: 12px;
86
- `,U=n.default.div`
86
+ `,Q=n.default.div`
87
87
  width: 48px;
88
88
  height: 48px;
89
89
  background: rgba(0, 0, 0, 0.7);
@@ -105,11 +105,11 @@
105
105
  fill: white;
106
106
  margin-left: 2px;
107
107
  }
108
- `,X=n.default.div`
108
+ `,U=n.default.div`
109
109
  font-size: 14px;
110
110
  color: #374151;
111
111
  line-height: 1.5;
112
- `,Y=n.default.div`
112
+ `,X=n.default.div`
113
113
  padding: 12px 16px;
114
114
  border-radius: 16px;
115
115
  font-size: 14px;
@@ -145,15 +145,15 @@
145
145
  border-bottom-left-radius: 4px;
146
146
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
147
147
  `}
148
- `,Z=n.default.div`
148
+ `,Y=n.default.div`
149
149
  padding: 16px;
150
150
  flex-shrink: 0;
151
- `,ee=n.default.div`
151
+ `,Z=n.default.div`
152
152
  display: flex;
153
153
  flex-direction: column;
154
154
  gap: 8px;
155
155
  align-items: flex-end;
156
- `,te=n.default.button`
156
+ `,ee=n.default.button`
157
157
  border: 1px dotted #febad2;
158
158
  background: linear-gradient(
159
159
  92.69deg,
@@ -182,14 +182,14 @@
182
182
  &:active:not(:disabled) {
183
183
  transform: scale(0.98);
184
184
  }
185
- `,ie=n.default.div`
185
+ `,te=n.default.div`
186
186
  padding: 16px;
187
187
  background: white;
188
- `,ne=n.default.div`
188
+ `,ie=n.default.div`
189
189
  display: flex;
190
190
  flex-direction: column;
191
191
  gap: 8px;
192
- `,re=n.default.button`
192
+ `,ne=n.default.button`
193
193
  background: #fef2f2;
194
194
  color: #dc2626;
195
195
  padding: 12px 16px;
@@ -209,14 +209,14 @@
209
209
  &:active:not(:disabled) {
210
210
  transform: scale(0.98);
211
211
  }
212
- `,ae=n.default.div`
212
+ `,re=n.default.div`
213
213
  padding: 16px;
214
214
  flex-shrink: 0;
215
- `,oe=n.default.div`
215
+ `,ae=n.default.div`
216
216
  position: relative;
217
217
  display: flex;
218
218
  width: 100%;
219
- `,de=n.default.textarea`
219
+ `,oe=n.default.textarea`
220
220
  flex: 1;
221
221
  border: 1px solid ${e=>e.hasText?"#3b82f6":"#d1d5db"};
222
222
  border-radius: 12px;
@@ -243,7 +243,7 @@
243
243
  &::placeholder {
244
244
  color: #9ca3af;
245
245
  }
246
- `,le=n.default.button`
246
+ `,de=n.default.button`
247
247
  position: absolute;
248
248
  bottom: 10px;
249
249
  right: 10px;
@@ -284,5 +284,5 @@
284
284
  -webkit-text-fill-color: transparent;
285
285
  background-clip: text;
286
286
  display: inline-block;
287
- `,se=({messages:e,onSend:u,header:S="Create with AI",placeholder:T="Discover the right event & launch campaigns for better conversions...",suggestions:g=["Top festivals for marketing","Top events this week?","Top August festivals near you"],iceBreakers:h,videoStarter:l,disabled:I=!1,isThinking:s=!1,onIceBreakerClick:$,chatState:b,chatWindowHeight:z,inputDisabled:M=!1})=>{const[a,w]=o.useState(""),[c,k]=o.useState(!1),[B,_]=o.useState(!1),m=o.useRef(null),v=o.useRef(null),p=c||s,r=I||M,d=b||(c||s?"thinking":B&&a.trim().length>0?"typing":e.length===0?"conversation-starter":e.length>0?"conversation":"default"),y=()=>{!a.trim()||r||p||(u(a),w(""),k(!0),setTimeout(()=>k(!1),1500))},q=i=>{r||i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),!p&&a.trim()&&y())},A=i=>{if(r)return;const j=G.stripHtmlTags(i.target.value);w(j),_(j.trim().length>0);const x=v.current;x&&(x.style.height="auto",x.style.height=`${Math.min(x.scrollHeight,117)}px`)},f=a.trim().length>0,D=r||p||!f;o.useEffect(()=>{m.current?.scrollIntoView({behavior:"smooth"})},[e,c,s]);const R=z||"100%";return t.jsxs(P,{chatState:d,style:{height:R},children:[t.jsxs(E,{children:[t.jsx(H.default,{height:24,width:24}),t.jsx("div",{className:"header-text",children:S})]}),t.jsxs(N,{children:[t.jsxs(O,{children:[d==="conversation-starter"&&l&&t.jsxs(J,{children:[t.jsx(Q,{children:t.jsx(U,{onClick:l.onPlay,children:t.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:t.jsx("path",{d:"M8 5v14l11-7z"})})})}),t.jsxs(X,{children:[t.jsx(F.BodySecondary,{style:{fontWeight:500,marginBottom:"4px"},children:l.title}),t.jsx(F.BodyCaption,{children:l.description})]})]}),e.map(i=>t.jsx(Y,{role:i.role,children:i.role==="assistant"?t.jsx("div",{dangerouslySetInnerHTML:{__html:V.renderMarkdownLite(i.content)}}):t.jsx("div",{style:{whiteSpace:"pre-wrap"},children:i.content})},i.id)),(c||s)&&t.jsx(W.default,{}),t.jsx("div",{ref:m})]}),h&&d==="conversation-starter"&&t.jsx(Z,{children:t.jsx(ee,{children:h.map(i=>t.jsx(te,{disabled:r,onClick:()=>{r||($?.(i),u(i.text))},children:t.jsx(C,{children:i.text})},i.id))})}),!h&&g.length>0&&d==="default"&&t.jsx(ie,{children:t.jsx(ne,{children:g.map(i=>t.jsx(re,{disabled:r,onClick:()=>!r&&u(i),children:i},i))})}),t.jsx(ae,{children:t.jsxs(oe,{children:[t.jsx(de,{ref:v,value:a,onChange:A,placeholder:T,onKeyDown:q,disabled:r,hasText:f,chatState:d}),t.jsx(le,{onClick:y,disabled:D,hasText:f,"aria-label":"Send",children:t.jsxs("svg",{viewBox:"0 0 24 24",width:"20",height:"20",stroke:"white",strokeWidth:"2",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[t.jsx("path",{d:"M6 12h12"}),t.jsx("path",{d:"M12 6l6 6-6 6"})]})})]})})]})]})};exports.CustomGradientText=C;exports.default=se;
287
+ `,le=({messages:e,onSend:u,header:S="Create with AI",placeholder:T="Discover the right event & launch campaigns for better conversions...",suggestions:g=["Top festivals for marketing","Top events this week?","Top August festivals near you"],iceBreakers:h,videoStarter:l,disabled:I=!1,isThinking:s=!1,onIceBreakerClick:$,chatState:b,chatWindowHeight:z,inputDisabled:M=!1})=>{const[a,w]=o.useState(""),[c,k]=o.useState(!1),[B,_]=o.useState(!1),m=o.useRef(null),v=o.useRef(null),p=c||s,r=I||M,d=b||(c||s?"thinking":B&&a.trim().length>0?"typing":e.length===0?"conversation-starter":e.length>0?"conversation":"default"),y=()=>{!a.trim()||r||p||(u(a),w(""),k(!0),setTimeout(()=>k(!1),1500))},q=i=>{r||i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),!p&&a.trim()&&y())},A=i=>{if(r)return;const j=i.target.value;w(j),_(j.trim().length>0);const x=v.current;x&&(x.style.height="auto",x.style.height=`${Math.min(x.scrollHeight,117)}px`)},f=a.trim().length>0,D=r||p||!f;o.useEffect(()=>{m.current?.scrollIntoView({behavior:"smooth"})},[e,c,s]);const R=z||"100%";return t.jsxs(K,{chatState:d,style:{height:R},children:[t.jsxs(P,{children:[t.jsx(G.default,{height:24,width:24}),t.jsx("div",{className:"header-text",children:S})]}),t.jsxs(E,{children:[t.jsxs(N,{children:[d==="conversation-starter"&&l&&t.jsxs(O,{children:[t.jsx(J,{children:t.jsx(Q,{onClick:l.onPlay,children:t.jsx("svg",{viewBox:"0 0 24 24",fill:"currentColor",children:t.jsx("path",{d:"M8 5v14l11-7z"})})})}),t.jsxs(U,{children:[t.jsx(F.BodySecondary,{style:{fontWeight:500,marginBottom:"4px"},children:l.title}),t.jsx(F.BodyCaption,{children:l.description})]})]}),e.map(i=>t.jsx(X,{role:i.role,children:i.role==="assistant"?t.jsx("div",{dangerouslySetInnerHTML:{__html:L.renderMarkdownLite(i.content)}}):t.jsx("div",{style:{whiteSpace:"pre-wrap"},children:i.content})},i.id)),(c||s)&&t.jsx(V.default,{}),t.jsx("div",{ref:m})]}),h&&d==="conversation-starter"&&t.jsx(Y,{children:t.jsx(Z,{children:h.map(i=>t.jsx(ee,{disabled:r,onClick:()=>{r||($?.(i),u(i.text))},children:t.jsx(C,{children:i.text})},i.id))})}),!h&&g.length>0&&d==="default"&&t.jsx(te,{children:t.jsx(ie,{children:g.map(i=>t.jsx(ne,{disabled:r,onClick:()=>!r&&u(i),children:i},i))})}),t.jsx(re,{children:t.jsxs(ae,{children:[t.jsx(oe,{ref:v,value:a,onChange:A,placeholder:T,onKeyDown:q,disabled:r,hasText:f,chatState:d}),t.jsx(de,{onClick:y,disabled:D,hasText:f,"aria-label":"Send",children:t.jsxs("svg",{viewBox:"0 0 24 24",width:"20",height:"20",stroke:"white",strokeWidth:"2",fill:"none",strokeLinecap:"round",strokeLinejoin:"round",children:[t.jsx("path",{d:"M6 12h12"}),t.jsx("path",{d:"M12 6l6 6-6 6"})]})})]})})]})]})};exports.CustomGradientText=C;exports.default=le;
288
288
  //# sourceMappingURL=ChatWindow.js.map