ssml-builder-js 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/{chunk-2XJER2BG.mjs → chunk-NPZ44CHU.mjs} +161 -134
- package/dist/chunk-NPZ44CHU.mjs.map +1 -0
- package/dist/{chunk-I3GP7OJU.mjs → chunk-PSN6XAFF.mjs} +8 -2
- package/dist/chunk-PSN6XAFF.mjs.map +1 -0
- package/dist/core.js +7 -1
- package/dist/core.js.map +1 -1
- package/dist/core.mjs +1 -1
- package/dist/elements.js +7 -1
- package/dist/elements.js.map +1 -1
- package/dist/elements.mjs +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/react.d.mts +25 -1
- package/dist/react.d.ts +25 -1
- package/dist/react.js +365 -15
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +333 -10
- package/dist/react.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-2XJER2BG.mjs.map +0 -1
- package/dist/chunk-I3GP7OJU.mjs.map +0 -1
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/ssml-editor-react/src/SsmlEditor.tsx","../packages/ssml-editor-react/src/buttonVisibility.ts","../packages/ssml-editor-react/src/components/popovers/InsertionPopover.tsx","../packages/ssml-editor-react/src/styles/editorStyles.ts","../packages/ssml-editor-react/src/components/popovers/InsertionPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/ProsodyPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/TextPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/TimingPopovers.tsx","../packages/ssml-editor-react/src/hooks/useSsmlEditorState.ts","../packages/ssml-editor-react/src/hooks/useSsmlMonaco.ts","../packages/ssml-editor-react/src/ssmlDiagnostics.ts","../packages/ssml-editor-react/src/ssmlCodeAction.ts"],"sourcesContent":["import { Fragment, forwardRef, useImperativeHandle } from \"react\";\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport Editor from \"@monaco-editor/react\";\nimport type { SsmlDocument } from \"@ssml-builder-js/ssml-core\";\nimport { isSsmlEditorButtonVisible, type SsmlEditorButton, type SsmlEditorButtonVisibility } from \"./buttonVisibility\";\nimport {\n BREAK_TIME_DESCRIPTIONS,\n BREAK_TIME_PRESETS,\n EMPHASIS_LEVEL_DESCRIPTIONS,\n EMPHASIS_LEVEL_PRESETS,\n EXPRESS_AS_STYLE_DESCRIPTIONS,\n EXPRESS_AS_STYLE_PRESETS,\n LANGUAGE_DESCRIPTIONS,\n LANGUAGE_PRESETS,\n PROSODY_PITCH_DESCRIPTIONS,\n PROSODY_PITCH_PRESETS,\n PROSODY_RATE_DESCRIPTIONS,\n PROSODY_RATE_PRESETS,\n PROSODY_VOLUME_DESCRIPTIONS,\n PROSODY_VOLUME_PRESETS,\n SAY_AS_DESCRIPTIONS,\n SAY_AS_PRESETS,\n SILENCE_VALUE_DESCRIPTIONS,\n SILENCE_VALUE_PRESETS,\n} from \"./constants/ssmlPresets\";\nimport {\n EDITOR_COPY,\n type EditorCopy,\n type SsmlEditorLanguage,\n type SsmlEditorLocale,\n type SsmlEditorLocalizedText,\n} from \"./locales\";\nimport { DEFAULT_LOCALE } from \"./constants/ui\";\nimport { ProsodyPopovers } from \"./components/popovers/ProsodyPopovers\";\nimport { TextPopovers } from \"./components/popovers/TextPopovers\";\nimport { TimingPopovers } from \"./components/popovers/TimingPopovers\";\nimport { InsertionPopover } from \"./components/popovers/InsertionPopover\";\nimport { useSsmlEditorState } from \"./hooks/useSsmlEditorState\";\nimport { useSsmlMonaco } from \"./hooks/useSsmlMonaco\";\nimport { editorStyles as styles } from \"./styles/editorStyles\";\nconst UNGROUPED_TOOLBAR_GROUP = \"__ssml-editor-ungrouped__\";\nconst TIMING_POPOVER_TAGS = new Set([\"break\", \"mstts:silence\"]);\nconst PROSODY_POPOVER_TAGS = new Set([\"prosody\", \"mstts:express-as\", \"voice\", \"emphasis\"]);\nconst TEXT_POPOVER_TAGS = new Set([\"sub\", \"say-as\", \"phoneme\", \"w\", \"lang\"]);\n\nexport type { SsmlEditorLanguage, SsmlEditorLocalizedText } from \"./locales\";\n\nexport type SsmlEditorInsertionMode = \"insert\" | \"wrap\";\n\nexport interface SsmlEditorInsertionOption {\n value: string;\n labels: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n}\n\nexport interface SsmlEditorInsertionTemplate {\n prefix: string;\n suffix: string;\n mode: SsmlEditorInsertionMode;\n}\n\nexport interface SsmlEditorInsertionDefinition {\n id: string;\n icon: string;\n tagName?: string;\n selfClosing?: boolean;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions: SsmlEditorLocalizedText;\n parameterDescription: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n createTemplate: (value: string) => SsmlEditorInsertionTemplate;\n}\n\nexport interface SsmlEditorCustomInsertionDefinition {\n id: string;\n tagName: string;\n attribute?: string;\n icon?: string;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n parameterDescription?: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n mode?: SsmlEditorInsertionMode;\n}\n\nexport type SsmlEditorCustomInsertion = SsmlEditorInsertionDefinition | SsmlEditorCustomInsertionDefinition;\n\nexport type SsmlEditorCustomInsertionCollection =\n | readonly SsmlEditorCustomInsertion[]\n | Readonly<Record<string, SsmlEditorCustomInsertion | undefined>>;\n\nexport interface SsmlEditorInsertionGroup {\n id: string;\n labels: SsmlEditorLocalizedText;\n insertionIds: readonly string[];\n}\n\nexport interface SsmlEditorToolbarGroup {\n id: string;\n buttonIds: readonly string[];\n}\n\nexport type SsmlEditorTheme = \"system\" | \"light\" | \"dark\";\nexport type SsmlEditorWordWrap = \"off\" | \"on\" | \"wordWrapColumn\" | \"bounded\";\nexport type SsmlEditorLineNumbers = \"on\" | \"off\" | \"relative\" | \"interval\";\n\nexport interface SsmlEditorOptions {\n height?: string | number;\n minHeight?: string | number;\n readOnly?: boolean;\n theme?: SsmlEditorTheme;\n fontSize?: number;\n wordWrap?: SsmlEditorWordWrap;\n lineNumbers?: SsmlEditorLineNumbers;\n minimap?: boolean;\n automaticLayout?: boolean;\n}\n\nexport type SsmlInsertionOption = SsmlEditorInsertionOption;\nexport type SsmlInsertionTemplate = SsmlEditorInsertionTemplate;\nexport type SsmlInsertionDefinition = SsmlEditorInsertionDefinition;\n\nfunction localizedText(value: string): SsmlEditorLocalizedText {\n return { ja: value, en: value };\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\n}\n\nexport function createSsmlEditorInsertionDefinition(\n definition: SsmlEditorCustomInsertionDefinition,\n): SsmlEditorInsertionDefinition {\n const mode = definition.mode ?? \"wrap\";\n const attribute = definition.attribute ? ` ${definition.attribute}=\"` : \"\";\n\n return {\n id: definition.id,\n icon: definition.icon ?? \"+\",\n tagName: definition.tagName,\n selfClosing: mode === \"insert\",\n labels: definition.labels,\n titles: definition.titles,\n descriptions: definition.descriptions ?? localizedText(`Inserts the <${definition.tagName}> element.`),\n parameterDescription:\n definition.parameterDescription ?? localizedText(`Selects the value for the <${definition.tagName}> element.`),\n options: definition.options,\n createTemplate: (value) => {\n const attributeValue = definition.attribute ? `${attribute}${escapeXmlAttribute(value)}\"` : \"\";\n if (mode === \"wrap\") {\n return {\n prefix: `<${definition.tagName}${attributeValue}>`,\n suffix: `</${definition.tagName}>`,\n mode,\n };\n }\n\n return {\n prefix: `<${definition.tagName}${attributeValue}/>`,\n suffix: \"\",\n mode,\n };\n },\n };\n}\n\nfunction createInsertionOptions(\n values: readonly string[],\n descriptions?: Readonly<Record<string, SsmlEditorLocalizedText>>,\n): readonly SsmlInsertionOption[] {\n return values.map((value) => ({\n value,\n labels: { ja: value, en: value },\n ...(descriptions?.[value] ? { descriptions: descriptions[value] } : {}),\n }));\n}\n\nexport const SSML_INSERTIONS = [\n {\n id: \"break\",\n icon: \"⏸\",\n tagName: \"break\",\n selfClosing: true,\n labels: { ja: \"間\", en: \"Break\" },\n descriptions: {\n ja: \"指定した時間だけ無音の間を挿入します。\",\n en: \"Inserts a silent pause for the selected duration.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the duration of the silent pause.\",\n },\n options: createInsertionOptions(BREAK_TIME_PRESETS, BREAK_TIME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<break time=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n {\n id: \"emphasis\",\n icon: \"✦\",\n tagName: \"emphasis\",\n labels: { ja: \"強調\", en: \"Emphasis\" },\n descriptions: {\n ja: \"選択範囲の強調レベルを変更します。\",\n en: \"Changes the emphasis level of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の強調レベルを選択します。\",\n en: \"Selects the emphasis level for the selected text.\",\n },\n options: createInsertionOptions(EMPHASIS_LEVEL_PRESETS, EMPHASIS_LEVEL_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<emphasis level=\"${value}\">`,\n suffix: \"</emphasis>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"rate\",\n icon: \"↕\",\n tagName: \"prosody\",\n labels: { ja: \"速度\", en: \"Rate\" },\n descriptions: {\n ja: \"選択範囲の読み上げ速度を変更します。\",\n en: \"Changes the speech rate of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ速度を選択します。\",\n en: \"Selects the speech rate for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_RATE_PRESETS, PROSODY_RATE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody rate=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"pitch\",\n icon: \"↗\",\n tagName: \"prosody\",\n labels: { ja: \"高さ\", en: \"Pitch\" },\n descriptions: {\n ja: \"選択範囲の声の高さを変更します。\",\n en: \"Changes the pitch of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の声の高さを半音単位で選択します。\",\n en: \"Selects the pitch adjustment in semitone steps.\",\n },\n options: createInsertionOptions(PROSODY_PITCH_PRESETS, PROSODY_PITCH_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody pitch=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"volume\",\n icon: \"🔊\",\n tagName: \"prosody\",\n labels: { ja: \"音量\", en: \"Volume\" },\n descriptions: {\n ja: \"選択範囲の音量を変更します。\",\n en: \"Changes the volume of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の音量レベルを選択します。\",\n en: \"Selects the volume level for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_VOLUME_PRESETS, PROSODY_VOLUME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody volume=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"emotion\",\n icon: \"☺\",\n tagName: \"mstts:express-as\",\n labels: { ja: \"感情\", en: \"Emotion\" },\n descriptions: {\n ja: \"選択範囲に音声の感情スタイルを適用します。\",\n en: \"Applies a voice emotion style to the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する音声の感情スタイルを選択します。\",\n en: \"Selects the voice emotion style to apply.\",\n },\n options: createInsertionOptions(EXPRESS_AS_STYLE_PRESETS, EXPRESS_AS_STYLE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:express-as style=\"${value}\">`,\n suffix: \"</mstts:express-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"say-as\",\n icon: \"Aa\",\n tagName: \"say-as\",\n labels: { ja: \"読み上げ\", en: \"Say as\" },\n descriptions: {\n ja: \"数字や日付などの読み上げ方を指定します。\",\n en: \"Specifies how values such as numbers or dates are spoken.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ方を選択します。\",\n en: \"Selects how the selected text is spoken.\",\n },\n options: createInsertionOptions(SAY_AS_PRESETS, SAY_AS_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<say-as interpret-as=\"${value}\">`,\n suffix: \"</say-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"lang\",\n icon: \"文\",\n tagName: \"lang\",\n labels: { ja: \"言語\", en: \"Language\" },\n descriptions: {\n ja: \"選択範囲の読み上げ言語を変更します。\",\n en: \"Changes the speaking language of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する BCP-47 言語タグを選択します。\",\n en: \"Selects the BCP-47 language tag for the selected text.\",\n },\n options: createInsertionOptions(LANGUAGE_PRESETS, LANGUAGE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<lang xml:lang=\"${value}\">`,\n suffix: \"</lang>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"mstts:silence\",\n icon: \"⏳\",\n tagName: \"mstts:silence\",\n selfClosing: true,\n labels: { ja: \"無音\", en: \"Silence\" },\n descriptions: {\n ja: \"無音時間を挿入します。\",\n en: \"Inserts a silence interval.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the silence duration.\",\n },\n options: createInsertionOptions(SILENCE_VALUE_PRESETS, SILENCE_VALUE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:silence type=\"Leading\" value=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n] satisfies readonly SsmlInsertionDefinition[];\n\nconst DEFAULT_INSERTION_GROUPS = [\n {\n id: \"pauses\",\n labels: { ja: \"間・無音\", en: \"Pauses\" },\n insertionIds: [\"break\", \"mstts:silence\"],\n },\n {\n id: \"prosody\",\n labels: { ja: \"声の調整\", en: \"Voice\" },\n insertionIds: [\"rate\", \"pitch\", \"volume\"],\n },\n {\n id: \"expression\",\n labels: { ja: \"表現\", en: \"Expression\" },\n insertionIds: [\"emphasis\", \"emotion\"],\n },\n {\n id: \"pronunciation\",\n labels: { ja: \"読み上げ\", en: \"Pronunciation\" },\n insertionIds: [\"say-as\", \"lang\"],\n },\n] satisfies readonly SsmlEditorInsertionGroup[];\n\nfunction createDefaultToolbarGroups(\n insertionGroups: readonly SsmlEditorInsertionGroup[],\n): readonly SsmlEditorToolbarGroup[] {\n return [\n {\n id: \"history\",\n buttonIds: [\"undo\", \"redo\"],\n },\n ...insertionGroups.map(({ id, insertionIds }) => ({\n id,\n buttonIds: insertionIds,\n })),\n {\n id: \"document\",\n buttonIds: [\"clearAll\", \"format\", \"decorations\"],\n },\n {\n id: \"help\",\n buttonIds: [\"help\"],\n },\n ];\n}\n\nfunction getInsertionCollection(\n collection: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlEditorCustomInsertion[] {\n if (!collection) {\n return [];\n }\n\n return Array.isArray(collection)\n ? collection\n : Object.values(collection).filter((insertion): insertion is SsmlEditorCustomInsertion => insertion !== undefined);\n}\n\nfunction getConfiguredInsertions(\n emotionStyles: readonly string[] | undefined,\n customInsertions: SsmlEditorCustomInsertionCollection | undefined,\n additionalInsertions: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlInsertionDefinition[] {\n const insertions = new Map<string, SsmlInsertionDefinition>();\n for (const insertion of SSML_INSERTIONS) {\n if (insertion.id === \"emotion\" && emotionStyles !== undefined) {\n insertions.set(insertion.id, {\n ...insertion,\n options: createInsertionOptions(emotionStyles),\n });\n continue;\n }\n insertions.set(insertion.id, insertion);\n }\n\n const normalizeInsertion = (insertion: SsmlEditorCustomInsertion): SsmlInsertionDefinition =>\n \"createTemplate\" in insertion ? insertion : createSsmlEditorInsertionDefinition(insertion);\n\n for (const insertion of getInsertionCollection(additionalInsertions)) {\n const normalized = normalizeInsertion(insertion);\n if (!insertions.has(normalized.id)) {\n insertions.set(normalized.id, normalized);\n }\n }\n\n for (const insertion of getInsertionCollection(customInsertions)) {\n const normalized = normalizeInsertion(insertion);\n insertions.set(normalized.id, normalized);\n }\n\n return [...insertions.values()];\n}\n\nfunction orderInsertions(\n insertions: readonly SsmlInsertionDefinition[],\n insertionOrder: readonly string[] | undefined,\n): readonly SsmlInsertionDefinition[] {\n if (!insertionOrder || insertionOrder.length === 0) {\n return insertions;\n }\n\n const insertionsById = new Map(insertions.map((insertion) => [insertion.id, insertion]));\n const ordered: SsmlInsertionDefinition[] = [];\n const included = new Set<string>();\n for (const id of insertionOrder) {\n const insertion = insertionsById.get(id);\n if (insertion && !included.has(id)) {\n ordered.push(insertion);\n included.add(id);\n }\n }\n\n for (const insertion of insertions) {\n if (!included.has(insertion.id)) {\n ordered.push(insertion);\n }\n }\n\n return ordered;\n}\n\nfunction orderToolbarButtons(\n buttonIds: readonly string[],\n toolbarOrder: readonly string[] | undefined,\n): readonly string[] {\n if (!toolbarOrder || toolbarOrder.length === 0) {\n return buttonIds;\n }\n\n const available = new Set(buttonIds);\n const ordered: string[] = [];\n const included = new Set<string>();\n for (const id of toolbarOrder) {\n if (available.has(id) && !included.has(id)) {\n ordered.push(id);\n included.add(id);\n }\n }\n\n for (const id of buttonIds) {\n if (!included.has(id)) {\n ordered.push(id);\n }\n }\n\n return ordered;\n}\n\nconst STYLE_ID = \"ssml-editor-theme\";\nconst STYLE_CSS = `\n[data-ssml-editor] {\n --ssml-editor-color: #111827;\n --ssml-editor-bg: #ffffff;\n --ssml-editor-border: #d1d5db;\n --ssml-editor-control-bg: #f9fafb;\n --ssml-editor-control-border: #9ca3af;\n --ssml-editor-active-bg: #dbeafe;\n --ssml-editor-active-border: #2563eb;\n --ssml-editor-preview-bg: #f3f4f6;\n --ssml-editor-error: #b91c1c;\n --ssml-editor-error-bg: #fef2f2;\n --ssml-editor-switch-active: #2563eb;\n --ssml-editor-pause-badge-bg: #e0e7ff;\n --ssml-editor-pause-badge-color: #3730a3;\n --ssml-editor-pause-badge-border: #c7d2fe;\n --ssml-editor-prosody-badge-bg: #dcfce7;\n --ssml-editor-prosody-badge-color: #166534;\n --ssml-editor-prosody-badge-border: #86efac;\n}\n[data-ssml-editor][data-theme=\"dark\"] {\n --ssml-editor-color: #f9fafb;\n --ssml-editor-bg: #1f2937;\n --ssml-editor-border: #374151;\n --ssml-editor-control-bg: #111827;\n --ssml-editor-control-border: #4b5563;\n --ssml-editor-active-bg: #1e3a8a;\n --ssml-editor-active-border: #60a5fa;\n --ssml-editor-preview-bg: #111827;\n --ssml-editor-error: #fca5a5;\n --ssml-editor-error-bg: #450a0a;\n --ssml-editor-switch-active: #60a5fa;\n --ssml-editor-pause-badge-bg: #312e81;\n --ssml-editor-pause-badge-color: #c7d2fe;\n --ssml-editor-pause-badge-border: #6366f1;\n --ssml-editor-prosody-badge-bg: #14532d;\n --ssml-editor-prosody-badge-color: #bbf7d0;\n --ssml-editor-prosody-badge-border: #4ade80;\n}\n[data-ssml-editor] .ssml-editor-inline-badge {\n display: inline-block;\n margin-left: 0.35em;\n padding: 0 0.35em;\n border: 1px solid;\n border-radius: 999px;\n font-size: 0.75em;\n font-weight: 600;\n line-height: 1.4;\n white-space: nowrap;\n vertical-align: middle;\n pointer-events: none;\n}\n[data-ssml-editor] .ssml-editor-inline-badge-pause {\n color: var(--ssml-editor-pause-badge-color);\n background-color: var(--ssml-editor-pause-badge-bg);\n border-color: var(--ssml-editor-pause-badge-border);\n}\n[data-ssml-editor] .ssml-editor-inline-badge-prosody {\n color: var(--ssml-editor-prosody-badge-color);\n background-color: var(--ssml-editor-prosody-badge-bg);\n border-color: var(--ssml-editor-prosody-badge-border);\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] {\n background-color: var(--ssml-editor-switch-active);\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] .ssml-editor-switch-thumb {\n transform: translateX(1.25rem);\n}\n[data-ssml-editor] .ssml-editor-switch-track:focus-visible {\n outline: 2px solid var(--ssml-editor-switch-active);\n outline-offset: 2px;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary {\n list-style: none;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary::-webkit-details-marker {\n display: none;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary:hover {\n background-color: var(--ssml-editor-preview-bg);\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary:focus-visible {\n outline: 2px solid var(--ssml-editor-control-border);\n outline-offset: -2px;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary::before {\n content: \"▸\";\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n line-height: 1.45;\n}\n[data-ssml-editor]\n .ssml-editor-help-settings-accordion[open]\n > .ssml-editor-help-settings-summary::before {\n content: \"▾\";\n}\n`.trim();\n\nfunction injectEditorTheme(): void {\n if (typeof document !== \"undefined\" && !document.getElementById(STYLE_ID)) {\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = STYLE_CSS;\n document.head.appendChild(style);\n }\n}\n\nexport interface SsmlEditorProps {\n document: SsmlDocument;\n onChange?: (document: SsmlDocument) => void;\n onSsmlChange?: (xml: string) => void;\n onSelectionChange?: (info: SelectionInfo) => void;\n /** Called with the selected partial SSML when the selection preview action is used. The action is disabled when omitted. */\n onPreviewSelection?: (ssml: string) => void;\n /** UI language. Japanese is used when omitted. */\n language?: SsmlEditorLanguage;\n /** UI locale. Japanese is used when omitted; takes precedence over the legacy language prop. */\n locale?: SsmlEditorLocale;\n /** Whether the toolbar is displayed. */\n showToolbar?: boolean;\n /** Whether toolbar action icons are displayed. */\n showToolbarIcons?: boolean;\n /** Whether toolbar action text labels are displayed. */\n showToolbarLabels?: boolean;\n /** Whether inline SSML decorations are displayed. The toolbar switch can change this at runtime. */\n showDecorations?: boolean;\n /** Controls which editor action buttons are displayed. Unspecified buttons are shown. */\n buttonVisibility?: SsmlEditorButtonVisibility;\n /** Monaco editor settings. */\n editorOptions?: SsmlEditorOptions;\n /** Alias for editorOptions. */\n settings?: SsmlEditorOptions;\n /** Fallback UI displayed while Monaco is loading. */\n loadingFallback?: ReactNode;\n /** Height of the Monaco editor. */\n height?: string | number;\n /** Minimum height of the Monaco editor container. */\n minHeight?: string | number;\n /** Whether the Monaco editor is read-only. */\n readOnly?: boolean;\n /** Monaco theme mode. */\n theme?: SsmlEditorTheme;\n /** Monaco editor font size. */\n fontSize?: number;\n /** Monaco editor word wrapping mode. */\n wordWrap?: SsmlEditorWordWrap;\n /** Monaco editor line number mode. */\n lineNumbers?: SsmlEditorLineNumbers;\n /** Whether the Monaco minimap is displayed. */\n minimap?: boolean;\n /** Whether Monaco automatically lays out when its container changes size. */\n automaticLayout?: boolean;\n /** Reorders all toolbar controls. Unlisted controls follow. */\n toolbarOrder?: readonly SsmlEditorButton[];\n /** Adds vertical separators between configured toolbar groups. */\n toolbarGroups?: readonly SsmlEditorToolbarGroup[];\n /** Reorders built-in and custom insertion menus. Unlisted insertions follow. */\n insertionOrder?: readonly string[];\n /** Visually groups insertion menus when toolbarGroups is not supplied. */\n insertionGroups?: readonly SsmlEditorInsertionGroup[];\n /** Replaces built-in insertion definitions with custom definitions by ID. */\n customInsertions?: SsmlEditorCustomInsertionCollection;\n /** Adds insertion definitions without replacing built-in definitions. */\n additionalInsertions?: SsmlEditorCustomInsertionCollection;\n /** Candidate style values shown by the built-in emotion insertion. */\n emotionStyles?: readonly string[];\n /** Class name applied to the editor container. */\n className?: string;\n /** Inline styles applied to the editor container. */\n style?: CSSProperties;\n /** Class name applied to the toolbar. */\n toolbarClassName?: string;\n /** Inline styles applied to the toolbar. */\n toolbarStyle?: CSSProperties;\n /** Class name applied to the editor display area. */\n displayClassName?: string;\n /** Inline styles applied to the editor display area. */\n displayStyle?: CSSProperties;\n}\n\nexport interface SelectionInfo {\n selectedText: string;\n characterCount: number;\n hasSelection: boolean;\n}\n\nexport interface SsmlEditorRef {\n getSelectedSsml(): string | null;\n getCurrentLineSsml(): string | null;\n getFullSsml(): string;\n}\n\ninterface ToolbarDecorationsSwitchProps {\n copy: EditorCopy;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n decorationsVisible: boolean;\n onVisibilityChange: (visible: boolean) => void;\n}\n\nfunction ToolbarDecorationsSwitch({\n copy,\n showToolbarIcons,\n showToolbarText,\n decorationsVisible,\n onVisibilityChange,\n}: ToolbarDecorationsSwitchProps): ReactElement {\n return (\n <div style={styles.toolbarSwitch}>\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ☆\n </span>\n )}\n {showToolbarText && <span>{copy.decorations}</span>}\n <button\n type=\"button\"\n className=\"ssml-editor-switch-track\"\n style={styles.toolbarSwitchTrack}\n role=\"switch\"\n aria-checked={decorationsVisible}\n aria-label={copy.decorations}\n title={decorationsVisible ? copy.decorationsHideTitle : copy.decorationsShowTitle}\n onClick={() => onVisibilityChange(!decorationsVisible)}\n >\n <span className=\"ssml-editor-switch-thumb\" style={styles.toolbarSwitchThumb} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nexport const SsmlEditor = forwardRef<SsmlEditorRef, SsmlEditorProps>(function SsmlEditor(\n {\n document,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n language: languageProp,\n locale: localeProp,\n showToolbar = true,\n showToolbarIcons = true,\n showToolbarLabels = false,\n showDecorations = false,\n buttonVisibility,\n editorOptions,\n settings,\n height,\n minHeight,\n readOnly,\n theme,\n fontSize,\n wordWrap,\n lineNumbers,\n minimap,\n automaticLayout,\n toolbarOrder,\n toolbarGroups,\n insertionOrder,\n insertionGroups,\n customInsertions,\n additionalInsertions,\n emotionStyles,\n className,\n style,\n toolbarClassName,\n toolbarStyle,\n displayClassName,\n displayStyle,\n loadingFallback,\n }: SsmlEditorProps,\n ref,\n): ReactElement {\n const resolvedEditorOptions: SsmlEditorOptions = {\n ...settings,\n ...editorOptions,\n ...(height === undefined ? {} : { height }),\n ...(minHeight === undefined ? {} : { minHeight }),\n ...(readOnly === undefined ? {} : { readOnly }),\n ...(theme === undefined ? {} : { theme }),\n ...(fontSize === undefined ? {} : { fontSize }),\n ...(wordWrap === undefined ? {} : { wordWrap }),\n ...(lineNumbers === undefined ? {} : { lineNumbers }),\n ...(minimap === undefined ? {} : { minimap }),\n ...(automaticLayout === undefined ? {} : { automaticLayout }),\n };\n const language = localeProp ?? languageProp ?? DEFAULT_LOCALE;\n const copy = EDITOR_COPY[language];\n const showToolbarText = showToolbarLabels || !showToolbarIcons;\n const resolvedTheme = resolvedEditorOptions.theme ?? \"system\";\n const editorMinHeight = resolvedEditorOptions.minHeight ?? \"8rem\";\n const editorHeight = resolvedEditorOptions.height ?? editorMinHeight;\n const isReadOnly = resolvedEditorOptions.readOnly ?? false;\n const toolbarButtonStyle = showToolbarText\n ? styles.toolbarButton\n : { ...styles.toolbarButton, ...styles.toolbarIconOnly };\n const configuredInsertions = getConfiguredInsertions(emotionStyles, customInsertions, additionalInsertions);\n const visibleInsertions = orderInsertions(configuredInsertions, insertionOrder).filter((insertion) =>\n isSsmlEditorButtonVisible(buttonVisibility, insertion.id),\n );\n const insertionById = new Map(visibleInsertions.map((insertion) => [insertion.id, insertion]));\n const configuredInsertionGroups = insertionGroups ?? DEFAULT_INSERTION_GROUPS;\n const groupedInsertionIds = new Set<string>();\n const visibleInsertionGroups = configuredInsertionGroups\n .map((group) => {\n const groupInsertionIds = new Set(group.insertionIds);\n const candidates =\n insertionOrder && insertionOrder.length > 0\n ? visibleInsertions.filter((insertion) => groupInsertionIds.has(insertion.id))\n : group.insertionIds\n .map((id) => insertionById.get(id))\n .filter((insertion): insertion is SsmlInsertionDefinition => insertion !== undefined);\n const insertions = candidates.filter((insertion) => {\n if (groupedInsertionIds.has(insertion.id)) {\n return false;\n }\n groupedInsertionIds.add(insertion.id);\n return true;\n });\n\n return { group, insertions };\n })\n .filter(({ insertions }) => insertions.length > 0);\n const ungroupedInsertions = visibleInsertions.filter((insertion) => !groupedInsertionIds.has(insertion.id));\n const toolbarActionIds = [\"undo\", \"redo\", \"clearAll\", \"format\", \"decorations\", \"help\"] as const;\n const defaultToolbarOrder = [\n \"undo\",\n \"redo\",\n ...visibleInsertionGroups.flatMap(({ insertions }) => insertions.map((insertion) => insertion.id)),\n ...ungroupedInsertions.map((insertion) => insertion.id),\n \"clearAll\",\n \"format\",\n \"decorations\",\n \"help\",\n ];\n const visibleToolbarIds = new Set<string>([\n ...visibleInsertions.map((insertion) => insertion.id),\n ...toolbarActionIds.filter((id) => isSsmlEditorButtonVisible(buttonVisibility, id)),\n ]);\n const toolbarItemIds = orderToolbarButtons(\n defaultToolbarOrder.filter((id) => visibleToolbarIds.has(id)),\n toolbarOrder,\n );\n const effectiveToolbarGroups = toolbarGroups ?? createDefaultToolbarGroups(configuredInsertionGroups);\n const toolbarGroupByButtonId = new Map<string, string>();\n for (const group of effectiveToolbarGroups) {\n for (const buttonId of group.buttonIds) {\n if (!toolbarGroupByButtonId.has(buttonId)) {\n toolbarGroupByButtonId.set(buttonId, group.id);\n }\n }\n }\n const helpInsertions = [\n ...visibleInsertionGroups.flatMap(({ insertions }) => insertions),\n ...ungroupedInsertions,\n ].filter(\n (insertion, index, insertions) => insertions.findIndex((candidate) => candidate.id === insertion.id) === index,\n );\n\n const {\n editorRef,\n text,\n selectionOverlay,\n activeTags,\n isDarkTheme,\n decorationsVisible,\n setDecorationsVisible,\n isHelpOpen,\n setIsHelpOpen,\n syntaxError,\n setSyntaxError,\n helpPanelId,\n handleTextChange,\n handleInsert,\n handleInsertBreak,\n handleInsertProsody,\n handleInsertText,\n handleClear,\n handleFormat,\n handleUndo,\n handleRedo,\n previewSelection,\n canPreviewSelection,\n refreshSelectionOverlay,\n updateActiveTags,\n getSelectedSsml,\n getCurrentLineSsml,\n getFullSsml,\n getOuterVoiceName,\n openPopoverId,\n popoverVoiceName,\n popoverPosition,\n isPopoverOpen,\n togglePopover,\n closePopover,\n setPopoverMenuRef,\n } = useSsmlEditorState({\n document,\n resolvedTheme,\n showDecorations,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n injectTheme: injectEditorTheme,\n });\n const { onMount } = useSsmlMonaco({\n editorRef,\n language,\n text,\n decorationsVisible,\n getOuterVoiceName,\n onSelectionOverlayChange: refreshSelectionOverlay,\n onActiveTagsChange: updateActiveTags,\n onSyntaxErrorChange: setSyntaxError,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n getSelectedSsml,\n getCurrentLineSsml,\n getFullSsml,\n }),\n [getCurrentLineSsml, getFullSsml, getSelectedSsml],\n );\n\n const renderInsertion = (insertion: SsmlEditorInsertionDefinition): ReactElement => {\n const isTimingPopover = insertion.tagName !== undefined && TIMING_POPOVER_TAGS.has(insertion.tagName);\n const isProsodyPopover = insertion.tagName !== undefined && PROSODY_POPOVER_TAGS.has(insertion.tagName);\n const isTextPopover = insertion.tagName !== undefined && TEXT_POPOVER_TAGS.has(insertion.tagName);\n const insertionButtonStyle =\n insertion.tagName && activeTags.has(insertion.tagName.toLowerCase())\n ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive }\n : toolbarButtonStyle;\n const props = {\n language,\n isDarkTheme,\n showToolbarIcons,\n showToolbarText,\n toolbarButtonStyle: insertionButtonStyle,\n emptyOptionsMessage: copy.noAvailableOptions,\n isReadOnly,\n openPopoverId,\n menuPosition: popoverPosition,\n menuRef: setPopoverMenuRef,\n onToggle: togglePopover,\n onClose: closePopover,\n onApply: isTimingPopover\n ? handleInsertBreak\n : isProsodyPopover\n ? handleInsertProsody\n : isTextPopover\n ? handleInsertText\n : handleInsert,\n };\n\n if (isTimingPopover) {\n return <TimingPopovers {...props} insertions={[insertion]} />;\n }\n if (isProsodyPopover) {\n return <ProsodyPopovers {...props} insertions={[insertion]} voiceName={popoverVoiceName} />;\n }\n if (isTextPopover) {\n return <TextPopovers {...props} insertions={[insertion]} />;\n }\n return (\n <InsertionPopover\n {...props}\n insertion={insertion}\n isOpen={isPopoverOpen(insertion.id)}\n onToggle={(trigger) => togglePopover(insertion.id, trigger)}\n />\n );\n };\n\n const toolbarItemRenderers = new Map<string, () => ReactElement>([\n [\n \"undo\",\n () => (\n <button\n key=\"undo\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.undo}\n title={copy.undoTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleUndo();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ↩\n </span>\n )}\n {showToolbarText && <span>{copy.undo}</span>}\n </button>\n ),\n ],\n [\n \"redo\",\n () => (\n <button\n key=\"redo\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.redo}\n title={copy.redoTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleRedo();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ↪\n </span>\n )}\n {showToolbarText && <span>{copy.redo}</span>}\n </button>\n ),\n ],\n [\n \"clearAll\",\n () => (\n <button\n key=\"clearAll\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.clearAll}\n title={copy.clearAllTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleClear();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ×\n </span>\n )}\n {showToolbarText && <span>{copy.clearAll}</span>}\n </button>\n ),\n ],\n [\n \"format\",\n () => (\n <button\n key=\"format\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.format}\n title={copy.formatTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleFormat();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ≡\n </span>\n )}\n {showToolbarText && <span>{copy.format}</span>}\n </button>\n ),\n ],\n [\n \"decorations\",\n () => (\n <ToolbarDecorationsSwitch\n key=\"decorations\"\n copy={copy}\n showToolbarIcons={showToolbarIcons}\n showToolbarText={showToolbarText}\n decorationsVisible={decorationsVisible}\n onVisibilityChange={setDecorationsVisible}\n />\n ),\n ],\n [\n \"help\",\n () => (\n <button\n key=\"help\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.help}\n title={copy.helpTitle}\n aria-expanded={isHelpOpen}\n aria-controls={helpPanelId}\n onClick={() => setIsHelpOpen((open) => !open)}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ?\n </span>\n )}\n {showToolbarText && <span>{copy.help}</span>}\n </button>\n ),\n ],\n ]);\n for (const insertion of visibleInsertions) {\n toolbarItemRenderers.set(insertion.id, () => renderInsertion(insertion));\n }\n const renderToolbarItems = (): ReactElement[] => {\n let previousRenderedGroupId = UNGROUPED_TOOLBAR_GROUP;\n let hasRenderedToolbarItem = false;\n const renderedItems: ReactElement[] = [];\n\n for (const id of toolbarItemIds) {\n const render = toolbarItemRenderers.get(id);\n if (!render) {\n continue;\n }\n\n const groupId = toolbarGroupByButtonId.get(id) ?? UNGROUPED_TOOLBAR_GROUP;\n const showSeparator = hasRenderedToolbarItem && groupId !== previousRenderedGroupId;\n previousRenderedGroupId = groupId;\n hasRenderedToolbarItem = true;\n renderedItems.push(\n <Fragment key={id}>\n {showSeparator && <span style={styles.toolbarSeparator} aria-hidden=\"true\" />}\n {render()}\n </Fragment>,\n );\n }\n\n return renderedItems;\n };\n\n return (\n <section\n className={className}\n style={{ ...styles.container, ...style }}\n aria-label={copy.editorAriaLabel}\n data-ssml-editor=\"\"\n data-theme={isDarkTheme ? \"dark\" : \"light\"}\n >\n {showToolbar && (\n <div\n className={toolbarClassName}\n style={{ ...styles.toolbarContainer, ...toolbarStyle }}\n data-ssml-editor-toolbar=\"\"\n >\n <div\n style={styles.toolbarActions}\n role=\"toolbar\"\n aria-label={copy.toolbarAriaLabel}\n data-ssml-editor-toolbar-actions=\"\"\n >\n {renderToolbarItems()}\n </div>\n </div>\n )}\n <div className={displayClassName} style={{ ...styles.display, ...displayStyle }} data-ssml-editor-display=\"\">\n {isHelpOpen && isSsmlEditorButtonVisible(buttonVisibility, \"help\") && (\n <section id={helpPanelId} style={styles.helpPanel} aria-label={copy.helpHeading}>\n <h3 style={styles.helpHeading}>{copy.helpHeading}</h3>\n <p style={styles.helpDescription}>{copy.helpDescription}</p>\n {helpInsertions.length > 0 && (\n <ul style={styles.helpList}>\n {helpInsertions.map((insertion) => (\n <li key={insertion.id} style={styles.helpItem}>\n <details className=\"ssml-editor-help-settings-accordion\" style={styles.helpSettingsAccordion}>\n <summary className=\"ssml-editor-help-settings-summary\" style={styles.helpSettingsSummary}>\n <span style={styles.helpIcon} aria-hidden=\"true\">\n {insertion.icon}\n </span>\n <span style={styles.helpSettingsSummaryContent}>\n <strong>{insertion.labels[language]}</strong>{\" \"}\n {insertion.tagName && (\n <>\n <code>{`<${insertion.tagName}${insertion.selfClosing ? \"/>\" : \">\"}`}</code> —{\" \"}\n </>\n )}\n {insertion.descriptions[language]}\n </span>\n </summary>\n <p style={styles.helpSettingsDescription}>\n <strong>{copy.parameters}:</strong> {insertion.parameterDescription[language]}\n </p>\n <ul style={styles.helpSettingsList}>\n {insertion.options.map((option) => (\n <li key={option.value}>\n <strong>{option.labels[language]}</strong>\n {option.descriptions && <> — {option.descriptions[language]}</>}\n </li>\n ))}\n </ul>\n </details>\n </li>\n ))}\n </ul>\n )}\n </section>\n )}\n <div style={{ ...styles.editor, minHeight: editorMinHeight }}>\n <Editor\n height={editorHeight}\n language=\"xml\"\n theme={isDarkTheme ? \"vs-dark\" : \"light\"}\n options={{\n automaticLayout: resolvedEditorOptions.automaticLayout ?? true,\n autoClosingBrackets: \"never\",\n fontSize: resolvedEditorOptions.fontSize,\n hover: { enabled: \"on\" },\n inlayHints: { enabled: decorationsVisible ? \"on\" : \"off\" },\n lineNumbers: resolvedEditorOptions.lineNumbers,\n minimap: {\n enabled: resolvedEditorOptions.minimap ?? true,\n },\n readOnly: isReadOnly,\n wordWrap: resolvedEditorOptions.wordWrap,\n }}\n value={text}\n loading={loadingFallback}\n onMount={onMount}\n onChange={(value) => handleTextChange(value ?? \"\")}\n />\n {selectionOverlay.hasSelection && selectionOverlay.position && (\n <div\n role=\"toolbar\"\n aria-label={copy.selectionActions}\n data-ssml-editor-selection-actions=\"\"\n style={{\n ...styles.selectionActions,\n top: selectionOverlay.position.top,\n left: selectionOverlay.position.left,\n transform:\n selectionOverlay.placement === \"above\"\n ? \"translateY(calc(-100% - 0.5rem))\"\n : `translateY(calc(${selectionOverlay.position.height}px + 0.5rem))`,\n }}\n onMouseDown={(event) => event.preventDefault()}\n >\n <span style={styles.selectionCount} aria-live=\"polite\">\n {selectionOverlay.characterCount}\n {copy.selectionCountSuffix}\n </span>\n <span style={styles.selectionActionsDivider} aria-hidden=\"true\" />\n <button\n type=\"button\"\n style={styles.selectionActionButton}\n title={copy.previewSelectionTitle}\n disabled={!canPreviewSelection}\n onClick={previewSelection}\n >\n <span style={styles.selectionActionIcon} aria-hidden=\"true\">\n ▶\n </span>\n {copy.previewSelection}\n </button>\n </div>\n )}\n </div>\n {syntaxError && (\n <p style={styles.error} role=\"alert\">\n {copy.syntaxError}: {syntaxError.message}\n </p>\n )}\n </div>\n </section>\n );\n});\n","export type SsmlEditorInsertionButton =\n | \"break\"\n | \"emphasis\"\n | \"rate\"\n | \"pitch\"\n | \"volume\"\n | \"emotion\"\n | \"say-as\"\n | \"phoneme\"\n | \"audio\"\n | \"sub\"\n | \"lang\"\n | \"mark\"\n | \"bookmark\"\n | \"mstts:silence\"\n | \"mstts:viseme\"\n | (string & {});\n\nexport type SsmlEditorButton =\n | \"help\"\n | SsmlEditorInsertionButton\n | \"undo\"\n | \"redo\"\n | \"clearAll\"\n | \"format\"\n | \"decorations\"\n | (string & {});\n\nexport type SsmlEditorButtonVisibility = Readonly<Partial<Record<string, boolean>>>;\n\nexport function isSsmlEditorButtonVisible(\n buttonVisibility: SsmlEditorButtonVisibility | undefined,\n button: SsmlEditorButton | string,\n): boolean {\n return buttonVisibility?.[button] !== false;\n}\n","import type { CSSProperties, ReactElement, Ref } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { SsmlEditorInsertionDefinition, SsmlEditorInsertionOption } from \"../../SsmlEditor\";\nimport { editorStyles as styles } from \"../../styles/editorStyles\";\n\nexport interface InsertionOptionGroup {\n label: string;\n options: readonly SsmlEditorInsertionOption[];\n}\n\nexport interface InsertionPopoverProps {\n insertion: SsmlEditorInsertionDefinition;\n language: \"ja\" | \"en\";\n isDarkTheme: boolean;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n toolbarButtonStyle: CSSProperties;\n emptyOptionsMessage: string;\n isReadOnly: boolean;\n isOpen: boolean;\n menuPosition: { top: number; left: number } | null;\n menuRef: Ref<HTMLDivElement>;\n onToggle: (trigger: HTMLButtonElement) => void;\n onClose: () => void;\n onApply: (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption) => void;\n optionGroups?: readonly InsertionOptionGroup[];\n}\n\nfunction getInsertionTitle(insertion: SsmlEditorInsertionDefinition, language: \"ja\" | \"en\"): string {\n if (insertion.titles) {\n return insertion.titles[language];\n }\n\n const tag = insertion.tagName ? ` <${insertion.tagName}${insertion.selfClosing ? \"/>\" : \">\"}` : \"\";\n return `${insertion.labels[language]}${tag} — ${insertion.descriptions[language]}`;\n}\n\nexport function InsertionPopover({\n insertion,\n language,\n isDarkTheme,\n showToolbarIcons,\n showToolbarText,\n toolbarButtonStyle,\n emptyOptionsMessage,\n isReadOnly,\n isOpen,\n menuPosition,\n menuRef,\n onToggle,\n onClose,\n onApply,\n optionGroups,\n}: InsertionPopoverProps): ReactElement {\n const hasOptions = optionGroups\n ? optionGroups.some((group) => group.options.length > 0)\n : insertion.options.length > 0;\n const renderOption = (option: SsmlEditorInsertionOption): ReactElement => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n style={styles.toolbarOption}\n title={option.descriptions?.[language] ?? insertion.descriptions[language]}\n disabled={isReadOnly}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (!isReadOnly) {\n onApply(insertion, option);\n }\n onClose();\n }}\n >\n {option.labels[language]}\n </button>\n );\n const menu =\n isOpen && menuPosition && typeof document !== \"undefined\" ? (\n <div\n ref={menuRef}\n id={`ssml-editor-popover-${insertion.id}`}\n data-ssml-editor=\"\"\n data-theme={isDarkTheme ? \"dark\" : \"light\"}\n style={{ ...styles.toolbarMenu, top: menuPosition.top, left: menuPosition.left }}\n role=\"menu\"\n aria-label={insertion.labels[language]}\n >\n {!hasOptions ? (\n <div role=\"presentation\">\n <select disabled value=\"\" style={styles.toolbarEmptySelect}>\n <option value=\"\" disabled>\n {emptyOptionsMessage}\n </option>\n </select>\n </div>\n ) : optionGroups ? (\n optionGroups.map((group) => (\n <fieldset key={group.label} style={styles.toolbarOptionGroup}>\n <legend style={styles.toolbarOptionGroupLabel}>{group.label}</legend>\n {group.options.map(renderOption)}\n </fieldset>\n ))\n ) : (\n insertion.options.map(renderOption)\n )}\n </div>\n ) : null;\n\n return (\n <>\n <div style={styles.toolbarDropdown}>\n <button\n type=\"button\"\n style={toolbarButtonStyle}\n title={getInsertionTitle(insertion, language)}\n aria-label={insertion.labels[language]}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? `ssml-editor-popover-${insertion.id}` : undefined}\n onClick={(event) => onToggle(event.currentTarget)}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n {insertion.icon}\n </span>\n )}\n {showToolbarText && <span>{insertion.labels[language]}</span>}\n <span style={styles.toolbarChevron} aria-hidden=\"true\">\n ▾\n </span>\n </button>\n </div>\n {menu && createPortal(menu, document.body)}\n </>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { OVERLAY_Z_INDEX } from \"../constants/ui\";\n\nexport const editorStyles: Record<string, CSSProperties> = {\n container: {\n display: \"grid\",\n gap: \"0.75rem\",\n padding: \"1rem\",\n border: \"1px solid var(--ssml-editor-border)\",\n borderRadius: \"0.5rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n },\n toolbarContainer: {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n },\n toolbarActions: {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n },\n toolbarSeparator: {\n width: \"1px\",\n height: \"2.25rem\",\n margin: \"0 0.25rem\",\n backgroundColor: \"var(--ssml-editor-border)\",\n },\n toolbarDropdown: {\n position: \"relative\",\n display: \"inline-block\",\n },\n toolbarSwitch: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n minHeight: \"2.25rem\",\n color: \"var(--ssml-editor-color)\",\n font: \"inherit\",\n },\n toolbarSwitchTrack: {\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"2.75rem\",\n height: \"1.5rem\",\n padding: \"0.1875rem\",\n border: 0,\n borderRadius: \"999px\",\n backgroundColor: \"var(--ssml-editor-control-border)\",\n cursor: \"pointer\",\n font: \"inherit\",\n transition: \"background-color 0.2s ease\",\n },\n toolbarSwitchThumb: {\n width: \"1.125rem\",\n height: \"1.125rem\",\n borderRadius: \"50%\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n transition: \"transform 0.2s ease\",\n },\n toolbarButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n minHeight: \"2.25rem\",\n padding: \"0.375rem 0.625rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n font: \"inherit\",\n cursor: \"pointer\",\n },\n toolbarButtonActive: {\n border: \"1px solid var(--ssml-editor-active-border)\",\n backgroundColor: \"var(--ssml-editor-active-bg)\",\n },\n display: {\n display: \"grid\",\n gap: \"0.5rem\",\n },\n toolbarIconOnly: {\n justifyContent: \"center\",\n minWidth: \"2.25rem\",\n padding: \"0.375rem\",\n },\n toolbarIcon: {\n display: \"inline-flex\",\n width: \"1.25rem\",\n justifyContent: \"center\",\n fontSize: \"1.1rem\",\n lineHeight: 1,\n },\n toolbarChevron: {\n fontSize: \"0.7rem\",\n lineHeight: 1,\n },\n toolbarMenu: {\n position: \"fixed\",\n zIndex: OVERLAY_Z_INDEX,\n display: \"grid\",\n minWidth: \"max-content\",\n maxHeight: \"min(24rem, calc(100vh - 1rem))\",\n gap: \"0.125rem\",\n padding: \"0.25rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n boxShadow: \"0 0.25rem 0.75rem rgb(0 0 0 / 20%)\",\n overflowY: \"auto\",\n },\n toolbarOption: {\n padding: \"0.375rem 0.5rem\",\n border: 0,\n borderRadius: \"0.125rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"transparent\",\n font: \"inherit\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n },\n toolbarOptionGroup: {\n display: \"grid\",\n gap: \"0.125rem\",\n margin: 0,\n padding: 0,\n border: 0,\n },\n toolbarOptionGroupLabel: {\n padding: \"0.375rem 0.5rem 0.125rem\",\n color: \"var(--ssml-editor-color)\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n },\n toolbarEmpty: {\n margin: 0,\n padding: \"0.375rem 0.5rem\",\n color: \"var(--ssml-editor-color)\",\n whiteSpace: \"nowrap\",\n },\n toolbarEmptySelect: {\n padding: \"0.375rem 0.5rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.125rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n font: \"inherit\",\n textAlign: \"left\",\n },\n helpPanel: {\n display: \"grid\",\n gap: \"0.5rem\",\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-preview-bg)\",\n },\n helpHeading: {\n margin: 0,\n fontSize: \"1rem\",\n },\n helpDescription: {\n margin: 0,\n lineHeight: 1.5,\n },\n helpList: {\n display: \"grid\",\n gap: \"0.375rem\",\n margin: 0,\n paddingLeft: \"1.25rem\",\n },\n helpItem: {\n listStyleType: \"none\",\n lineHeight: 1.45,\n },\n helpIcon: {\n display: \"inline-flex\",\n width: \"1.25rem\",\n justifyContent: \"center\",\n fontSize: \"1.1rem\",\n lineHeight: 1.45,\n },\n helpSettingsAccordion: {\n marginTop: \"0.375rem\",\n overflow: \"hidden\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n },\n helpSettingsSummary: {\n display: \"grid\",\n gridTemplateColumns: \"1rem 1.25rem minmax(0, 1fr)\",\n columnGap: \"0.5rem\",\n alignItems: \"start\",\n padding: \"0.5rem 0.625rem\",\n cursor: \"pointer\",\n },\n helpSettingsSummaryContent: {\n minWidth: 0,\n },\n helpSettingsDescription: {\n margin: \"0.5rem 0.75rem 0\",\n fontSize: \"0.875rem\",\n },\n helpSettingsList: {\n display: \"grid\",\n gap: \"0.125rem\",\n margin: \"0.25rem 0.75rem 0.75rem\",\n paddingLeft: \"1.25rem\",\n fontSize: \"0.875rem\",\n },\n editor: {\n boxSizing: \"border-box\",\n position: \"relative\",\n width: \"100%\",\n minHeight: \"8rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n overflow: \"visible\",\n },\n selectionActions: {\n position: \"absolute\",\n zIndex: OVERLAY_Z_INDEX,\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.25rem\",\n maxWidth: \"calc(100% - 1rem)\",\n padding: \"0.25rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.375rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n boxShadow: \"0 0.25rem 0.75rem rgb(0 0 0 / 20%)\",\n },\n selectionCount: {\n padding: \"0.25rem 0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n },\n selectionActionsDivider: {\n width: \"1px\",\n height: \"1.5rem\",\n backgroundColor: \"var(--ssml-editor-border)\",\n },\n selectionActionButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n minHeight: \"1.75rem\",\n padding: \"0.25rem 0.375rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n font: \"inherit\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n },\n selectionActionIcon: {\n display: \"inline-flex\",\n width: \"1rem\",\n justifyContent: \"center\",\n lineHeight: 1,\n },\n error: {\n margin: 0,\n padding: \"0.5rem 0.75rem\",\n border: \"1px solid var(--ssml-editor-error)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-error)\",\n backgroundColor: \"var(--ssml-editor-error-bg)\",\n lineHeight: 1.5,\n },\n};\n","import type { CSSProperties, ReactElement, Ref } from \"react\";\nimport type { SsmlEditorInsertionDefinition, SsmlEditorInsertionOption } from \"../../SsmlEditor\";\nimport { InsertionPopover, type InsertionOptionGroup } from \"./InsertionPopover\";\n\nexport interface InsertionPopoversProps {\n insertions: readonly SsmlEditorInsertionDefinition[];\n language: \"ja\" | \"en\";\n isDarkTheme: boolean;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n toolbarButtonStyle: CSSProperties;\n emptyOptionsMessage: string;\n isReadOnly: boolean;\n openPopoverId: string | null;\n menuPosition: { top: number; left: number } | null;\n menuRef: Ref<HTMLDivElement>;\n onToggle: (id: string, trigger: HTMLButtonElement) => void;\n onClose: () => void;\n onApply: (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption) => void;\n emptyOptionsMessages?: Readonly<Record<string, string>>;\n optionGroups?: Readonly<Record<string, readonly InsertionOptionGroup[]>>;\n}\n\nexport function InsertionPopovers({\n insertions,\n openPopoverId,\n onToggle,\n emptyOptionsMessages,\n optionGroups,\n ...props\n}: InsertionPopoversProps): ReactElement {\n return (\n <>\n {insertions.map((insertion) => (\n <InsertionPopover\n key={insertion.id}\n {...props}\n insertion={insertion}\n emptyOptionsMessage={emptyOptionsMessages?.[insertion.id] ?? props.emptyOptionsMessage}\n optionGroups={optionGroups?.[insertion.id]}\n isOpen={openPopoverId === insertion.id}\n onToggle={(trigger) => onToggle(insertion.id, trigger)}\n />\n ))}\n </>\n );\n}\n","import type { ReactElement } from \"react\";\nimport {\n getExpressAsStyleCategory,\n resolveExpressAsStyles,\n type ExpressAsStyleCategory,\n} from \"../../constants/ssmlPresets\";\nimport { EDITOR_COPY, type EditorCopy } from \"../../locales\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\nimport type { InsertionOptionGroup } from \"./InsertionPopover\";\n\nexport interface ProsodyPopoversProps extends InsertionPopoversProps {\n voiceName?: string;\n}\n\nconst CATEGORY_LABEL_KEYS = {\n emotions: \"categoryEmotions\",\n scenarios: \"categoryScenarios\",\n media: \"categoryMedia\",\n other: \"categoryOther\",\n} as const satisfies Record<ExpressAsStyleCategory, keyof EditorCopy>;\n\nconst CATEGORY_ORDER: readonly ExpressAsStyleCategory[] = [\"emotions\", \"scenarios\", \"media\", \"other\"];\n\nfunction isExpressAsInsertion(insertion: ProsodyPopoversProps[\"insertions\"][number]): boolean {\n return insertion.id === \"emotion\" && insertion.tagName?.toLowerCase() === \"mstts:express-as\";\n}\n\nfunction createOptionGroups(\n options: ProsodyPopoversProps[\"insertions\"][number][\"options\"],\n language: ProsodyPopoversProps[\"language\"],\n): readonly InsertionOptionGroup[] {\n const t = (key: keyof EditorCopy): string => EDITOR_COPY[language][key];\n\n return CATEGORY_ORDER.map((category) => ({\n label: t(CATEGORY_LABEL_KEYS[category]),\n options: options.filter((option) => getExpressAsStyleCategory(option.value) === category),\n })).filter((group) => group.options.length > 0);\n}\n\nexport function ProsodyPopovers({ insertions, voiceName, language, ...props }: ProsodyPopoversProps): ReactElement {\n const emptyOptionsMessages: Record<string, string> = {};\n const filteredInsertions = insertions.map((insertion) => {\n if (!isExpressAsInsertion(insertion)) {\n return insertion;\n }\n\n const availableStyles = new Set(\n resolveExpressAsStyles(\n voiceName,\n insertion.options.map((option) => option.value),\n ),\n );\n if (availableStyles.size === 0) {\n emptyOptionsMessages[insertion.id] = EDITOR_COPY[language].styleNotSupported;\n }\n const availableOptions = insertion.options.filter((option) => availableStyles.has(option.value));\n\n return {\n ...insertion,\n options: availableOptions,\n };\n });\n const optionGroups = Object.fromEntries(\n filteredInsertions\n .filter(isExpressAsInsertion)\n .map((insertion) => [insertion.id, createOptionGroups(insertion.options, language)]),\n );\n\n return (\n <InsertionPopovers\n {...props}\n emptyOptionsMessages={emptyOptionsMessages}\n language={language}\n insertions={filteredInsertions}\n optionGroups={optionGroups}\n />\n );\n}\n","import type { ReactElement } from \"react\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\n\nexport type TextPopoversProps = InsertionPopoversProps;\n\nexport function TextPopovers(props: TextPopoversProps): ReactElement {\n return <InsertionPopovers {...props} />;\n}\n","import type { ReactElement } from \"react\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\n\nexport type TimingPopoversProps = InsertionPopoversProps;\n\nexport function TimingPopovers(props: TimingPopoversProps): ReactElement {\n return <InsertionPopovers {...props} />;\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { buildPartialSsml, buildSsml } from \"@ssml-builder-js/ssml-core\";\nimport type {\n ProsodyElement,\n SsmlDocument,\n SsmlElement,\n SsmlNode,\n SsmlPartialContext,\n VoiceElement,\n} from \"@ssml-builder-js/ssml-core\";\nimport type {\n SsmlEditorInsertionDefinition,\n SsmlEditorInsertionOption,\n SsmlEditorInsertionTemplate,\n SsmlEditorTheme,\n SelectionInfo,\n} from \"../SsmlEditor\";\nimport { clearSsmlDocument } from \"../clearSsmlDocument\";\nimport { formatXmlFragment } from \"../formatXml\";\nimport { getEditableRegion, getEditableText, updateEditableText } from \"../editableSsml\";\nimport { createSsmlInsertionEdit } from \"../ssmlInsertion\";\nimport { findSsmlVoiceContext } from \"../ssmlContext\";\nimport type { MonacoEditor, SsmlSyntaxError } from \"../ssmlDiagnostics\";\nimport { SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES } from \"../constants/ui\";\n\nconst TIMING_INSERTION_TAGS = new Set([\"break\", \"mstts:silence\"]);\nconst PROSODY_INSERTION_TAGS = new Set([\"prosody\", \"mstts:express-as\", \"voice\", \"emphasis\"]);\nconst TEXT_INSERTION_TAGS = new Set([\"sub\", \"say-as\", \"phoneme\", \"w\", \"lang\"]);\n\nexport interface SelectionOverlayState extends SelectionInfo {\n position: {\n top: number;\n left: number;\n height: number;\n } | null;\n placement: \"above\" | \"below\";\n}\n\nexport interface MonacoEditorRef {\n current: MonacoEditor | null;\n}\n\nexport interface UseSsmlEditorStateOptions {\n document: SsmlDocument;\n resolvedTheme: SsmlEditorTheme;\n showDecorations: boolean;\n onChange?: (document: SsmlDocument) => void;\n onSsmlChange?: (xml: string) => void;\n onSelectionChange?: (info: SelectionInfo) => void;\n onPreviewSelection?: (ssml: string) => void;\n injectTheme?: () => void;\n}\n\nconst EMPTY_SELECTION_OVERLAY: SelectionOverlayState = {\n selectedText: \"\",\n characterCount: 0,\n hasSelection: false,\n position: null,\n placement: \"above\",\n};\n\nfunction isSsmlElement(node: SsmlNode): node is SsmlElement {\n return typeof node !== \"string\" && node.type !== \"text\";\n}\n\nfunction isVoice(element: SsmlElement): element is VoiceElement {\n return element.type === \"voice\";\n}\n\nfunction isProsody(element: SsmlElement): element is ProsodyElement {\n return element.type === \"prosody\";\n}\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction getPartialContext(document: SsmlDocument): SsmlPartialContext {\n const children = getDocumentChildren(document);\n const voice = findFirstElement(children, isVoice);\n const prosody = findFirstElement(children, isProsody);\n const context: SsmlPartialContext = {\n version: document.version,\n lang: document.lang,\n };\n\n if (voice) {\n context.voice = {\n name: voice.name,\n effect: voice.effect,\n attributes: voice.attributes,\n };\n }\n\n if (prosody) {\n context.prosody = {\n rate: prosody.rate,\n pitch: prosody.pitch,\n volume: prosody.volume,\n contour: prosody.contour,\n range: prosody.range,\n attributes: prosody.attributes,\n };\n }\n\n return context;\n}\n\nfunction findFirstElement<T extends SsmlElement>(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => element is T,\n): T | undefined {\n for (const node of nodes) {\n if (!isSsmlElement(node)) {\n continue;\n }\n\n if (predicate(node)) {\n return node;\n }\n\n const child = findFirstElement(node.children ?? [], predicate);\n if (child) {\n return child;\n }\n }\n\n return undefined;\n}\n\nfunction getSelectionInfo(editor: MonacoEditor): SelectionInfo {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return {\n selectedText: \"\",\n characterCount: 0,\n hasSelection: false,\n };\n }\n\n const selectedText = model.getValueInRange(selection);\n return {\n selectedText,\n characterCount: selectedText.length,\n hasSelection: selectedText.length > 0,\n };\n}\n\nfunction getSelectionOverlayState(editor: MonacoEditor): SelectionOverlayState {\n const info = getSelectionInfo(editor);\n if (!info.hasSelection) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const selection = editor.getSelection();\n if (!selection) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const position = editor.getScrolledVisiblePosition(selection.getStartPosition());\n if (!position) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const editorHeight = editor.getLayoutInfo().height;\n if (position.top + position.height < 0 || position.top > editorHeight) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n return {\n ...info,\n position,\n placement: position.top >= SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES * position.height ? \"above\" : \"below\",\n };\n}\n\nfunction getCurrentLineText(editor: MonacoEditor): string | null {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return null;\n }\n\n const text = model.getLineContent(selection.positionLineNumber);\n return text.trim().length > 0 ? text : null;\n}\n\nfunction getSelectedText(editor: MonacoEditor): string | null {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return null;\n }\n\n const selectedText = model.getValueInRange(selection);\n return selectedText.length > 0 ? selectedText : getCurrentLineText(editor);\n}\n\nfunction getEffectiveVoiceName(editor: MonacoEditor, document: SsmlDocument): string | undefined {\n const model = editor.getModel();\n const selection = editor.getSelection();\n const outerVoiceName = getEditableRegion(document).voiceName;\n if (!model || !selection) {\n return outerVoiceName;\n }\n\n const offset = model.getOffsetAt(selection.getStartPosition());\n const voiceContext = findSsmlVoiceContext(model.getValue(), offset);\n return voiceContext === undefined ? outerVoiceName : voiceContext.voiceName;\n}\n\nfunction getSelectedSsml(editor: MonacoEditor, document: SsmlDocument): string | null {\n const selectedText = getSelectedText(editor);\n return selectedText === null ? null : buildPartialSsml(selectedText, getPartialContext(document));\n}\n\nfunction getCurrentLineSsml(editor: MonacoEditor, document: SsmlDocument): string | null {\n const currentLineText = getCurrentLineText(editor);\n return currentLineText === null ? null : buildPartialSsml(currentLineText, getPartialContext(document));\n}\n\nfunction applySsmlTemplate(editor: MonacoEditor, template: SsmlEditorInsertionTemplate): void {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return;\n }\n\n const startOffset = model.getOffsetAt(selection.getStartPosition());\n const endOffset = model.getOffsetAt(selection.getEndPosition());\n const selectedText = selection.isEmpty() ? \"\" : model.getValueInRange(selection);\n const { replacement, selectionOffset } = createSsmlInsertionEdit(\n model.getValue(),\n startOffset,\n endOffset,\n template,\n model.getEOL(),\n selectedText,\n );\n\n editor.pushUndoStop();\n const applied = editor.executeEdits(\"ssml-toolbar\", [\n {\n range: selection,\n text: replacement,\n },\n ]);\n editor.pushUndoStop();\n if (!applied) {\n return;\n }\n\n const nextSelectionStart = model.getPositionAt(startOffset + selectionOffset);\n const nextSelectionEnd = model.getPositionAt(endOffset + selectionOffset);\n editor.setSelection({\n selectionStartLineNumber: nextSelectionStart.lineNumber,\n selectionStartColumn: nextSelectionStart.column,\n positionLineNumber: nextSelectionEnd.lineNumber,\n positionColumn: nextSelectionEnd.column,\n });\n editor.focus();\n}\n\nfunction applySsmlInsertion(\n editor: MonacoEditor,\n insertion: SsmlEditorInsertionDefinition,\n option: SsmlEditorInsertionOption,\n): void {\n applySsmlTemplate(editor, insertion.createTemplate(option.value));\n}\n\nexport function useSsmlEditorState({\n document,\n resolvedTheme,\n showDecorations,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n injectTheme,\n}: UseSsmlEditorStateOptions) {\n const editorRef = useRef<MonacoEditor | null>(null);\n const [draftDocument, setDraftDocument] = useState(document);\n const [selectionOverlay, setSelectionOverlay] = useState<SelectionOverlayState>(EMPTY_SELECTION_OVERLAY);\n const [isDark, setIsDark] = useState(false);\n const [decorationsVisible, setDecorationsVisible] = useState(showDecorations);\n const [isHelpOpen, setIsHelpOpen] = useState(false);\n const [syntaxError, setSyntaxError] = useState<SsmlSyntaxError | null>(null);\n const [activeTags, setActiveTags] = useState<Set<string>>(() => new Set());\n const [openPopoverId, setOpenPopoverId] = useState<string | null>(null);\n const [popoverVoiceName, setPopoverVoiceName] = useState<string | undefined>(undefined);\n const [popoverPosition, setPopoverPosition] = useState<{ top: number; left: number } | null>(null);\n const helpPanelId = useId();\n const draftDocumentRef = useRef(document);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onPreviewSelectionRef = useRef(onPreviewSelection);\n const activePopoverTriggerRef = useRef<HTMLButtonElement | null>(null);\n const activePopoverMenuRef = useRef<HTMLDivElement | null>(null);\n\n draftDocumentRef.current = draftDocument;\n onSelectionChangeRef.current = onSelectionChange;\n onPreviewSelectionRef.current = onPreviewSelection;\n\n useEffect(() => {\n injectTheme?.();\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n setIsDark(mq.matches);\n const handler = (event: MediaQueryListEvent): void => setIsDark(event.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [injectTheme]);\n\n useEffect(() => {\n draftDocumentRef.current = document;\n setDraftDocument(document);\n }, [document]);\n\n useEffect(() => {\n setDecorationsVisible(showDecorations);\n }, [showDecorations]);\n\n const closePopover = useCallback((restoreFocus = false): void => {\n setOpenPopoverId(null);\n setPopoverVoiceName(undefined);\n setPopoverPosition(null);\n if (restoreFocus) {\n activePopoverTriggerRef.current?.focus();\n }\n }, []);\n\n const togglePopover = useCallback((id: string, trigger: HTMLButtonElement): void => {\n setOpenPopoverId((currentId) => {\n if (currentId === id) {\n setPopoverVoiceName(undefined);\n setPopoverPosition(null);\n return null;\n }\n activePopoverTriggerRef.current = trigger;\n setPopoverVoiceName(\n editorRef.current ? getEffectiveVoiceName(editorRef.current, draftDocumentRef.current) : undefined,\n );\n return id;\n });\n }, []);\n\n const setPopoverMenuRef = useCallback((menu: HTMLDivElement | null): void => {\n activePopoverMenuRef.current = menu;\n }, []);\n\n useEffect(() => {\n if (!openPopoverId) {\n setPopoverPosition(null);\n return;\n }\n\n const updatePopoverPosition = (): void => {\n const trigger = activePopoverTriggerRef.current;\n if (!trigger) {\n return;\n }\n\n const triggerBounds = trigger.getBoundingClientRect();\n setPopoverPosition({\n top: triggerBounds.bottom + 4,\n left: triggerBounds.left,\n });\n };\n const handlePointerDown = (event: PointerEvent): void => {\n const target = event.target;\n if (\n target instanceof Node &&\n !activePopoverTriggerRef.current?.contains(target) &&\n !activePopoverMenuRef.current?.contains(target)\n ) {\n closePopover();\n }\n };\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n closePopover(true);\n }\n };\n\n updatePopoverPosition();\n window.addEventListener(\"resize\", updatePopoverPosition);\n window.addEventListener(\"scroll\", updatePopoverPosition, true);\n globalThis.document.addEventListener(\"pointerdown\", handlePointerDown);\n globalThis.document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"resize\", updatePopoverPosition);\n window.removeEventListener(\"scroll\", updatePopoverPosition, true);\n globalThis.document.removeEventListener(\"pointerdown\", handlePointerDown);\n globalThis.document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [closePopover, openPopoverId]);\n\n const refreshSelectionOverlay = useCallback((editor: MonacoEditor, notify: boolean): void => {\n const nextSelection = getSelectionOverlayState(editor);\n setSelectionOverlay(nextSelection);\n if (notify) {\n onSelectionChangeRef.current?.({\n selectedText: nextSelection.selectedText,\n characterCount: nextSelection.characterCount,\n hasSelection: nextSelection.hasSelection,\n });\n }\n }, []);\n\n const updateActiveTags = useCallback((nextTags: ReadonlySet<string>): void => {\n setActiveTags((currentTags) => {\n if (currentTags.size === nextTags.size && [...currentTags].every((tag) => nextTags.has(tag))) {\n return currentTags;\n }\n return new Set(nextTags);\n });\n }, []);\n\n const commit = useCallback(\n (nextDocument: SsmlDocument): void => {\n draftDocumentRef.current = nextDocument;\n setDraftDocument(nextDocument);\n onChange?.(nextDocument);\n onSsmlChange?.(buildSsml(nextDocument));\n },\n [onChange, onSsmlChange],\n );\n\n const handleTextChange = useCallback(\n (value: string): void => {\n commit(updateEditableText(draftDocumentRef.current, value));\n if (editorRef.current) {\n refreshSelectionOverlay(editorRef.current, false);\n }\n },\n [commit, refreshSelectionOverlay],\n );\n\n const handleInsert = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (editorRef.current) {\n applySsmlInsertion(editorRef.current, insertion, option);\n }\n },\n [],\n );\n const handleInsertBreak = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && TIMING_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n const handleInsertProsody = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && PROSODY_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n const handleInsertText = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && TEXT_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n\n const handleClear = useCallback((): void => {\n commit(clearSsmlDocument(draftDocumentRef.current));\n }, [commit]);\n\n const handleFormat = useCallback((): void => {\n const value = editorRef.current?.getValue() ?? getEditableText(draftDocumentRef.current);\n commit(updateEditableText(draftDocumentRef.current, formatXmlFragment(value)));\n }, [commit]);\n\n const handleUndo = useCallback((): void => {\n editorRef.current?.trigger(\"toolbar\", \"undo\", null);\n editorRef.current?.focus();\n }, []);\n\n const handleRedo = useCallback((): void => {\n editorRef.current?.trigger(\"toolbar\", \"redo\", null);\n editorRef.current?.focus();\n }, []);\n\n const previewSelection = useCallback((): void => {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n const selectedSsml = getSelectedSsml(editor, draftDocumentRef.current);\n if (selectedSsml !== null) {\n onPreviewSelectionRef.current?.(selectedSsml);\n }\n }, []);\n\n const getSelectedSsmlValue = useCallback(\n () => (editorRef.current ? getSelectedSsml(editorRef.current, draftDocumentRef.current) : null),\n [],\n );\n const getCurrentLineSsmlValue = useCallback(\n () => (editorRef.current ? getCurrentLineSsml(editorRef.current, draftDocumentRef.current) : null),\n [],\n );\n const getFullSsml = useCallback(\n () =>\n buildSsml(\n editorRef.current\n ? updateEditableText(draftDocumentRef.current, editorRef.current.getValue())\n : draftDocumentRef.current,\n ),\n [],\n );\n const getOuterVoiceName = useCallback(() => getEditableRegion(draftDocumentRef.current).voiceName, []);\n\n return {\n editorRef,\n draftDocument,\n text: getEditableText(draftDocument),\n selectionOverlay,\n activeTags,\n isDarkTheme: resolvedTheme === \"dark\" || (resolvedTheme === \"system\" && isDark),\n decorationsVisible,\n setDecorationsVisible,\n isHelpOpen,\n setIsHelpOpen,\n syntaxError,\n setSyntaxError,\n helpPanelId,\n commit,\n handleTextChange,\n handleInsert,\n handleInsertBreak,\n handleInsertProsody,\n handleInsertText,\n handleClear,\n handleFormat,\n handleUndo,\n handleRedo,\n previewSelection,\n canPreviewSelection: onPreviewSelection !== undefined,\n refreshSelectionOverlay,\n updateActiveTags,\n getSelectedSsml: getSelectedSsmlValue,\n getCurrentLineSsml: getCurrentLineSsmlValue,\n getFullSsml,\n getOuterVoiceName,\n openPopoverId,\n popoverVoiceName,\n popoverPosition,\n isPopoverOpen: (id: string) => openPopoverId === id,\n togglePopover,\n closePopover,\n setPopoverMenuRef,\n };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport type { Monaco, OnMount } from \"@monaco-editor/react\";\nimport { INLINE_BADGE_COPY, type SsmlEditorLanguage, type SsmlEditorLocale } from \"../locales\";\nimport {\n clearSsmlDiagnostics,\n type MonacoEditor,\n type MonacoModel,\n type SsmlSyntaxError,\n updateSsmlDiagnostics,\n} from \"../ssmlDiagnostics\";\nimport { registerSsmlCompletionProvider } from \"../ssmlCompletion\";\nimport { registerSsmlCodeActions } from \"../ssmlCodeAction\";\nimport { findSsmlHoverTarget, formatSsmlHover } from \"../ssmlHover\";\nimport { findActiveSsmlTags } from \"../ssmlContext\";\nimport type { MonacoEditorRef } from \"./useSsmlEditorState\";\n\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoDisposable = ReturnType<MonacoEditor[\"onDidChangeCursorSelection\"]>;\ntype MonacoContentDisposable = ReturnType<MonacoEditor[\"onDidChangeModelContent\"]>;\ntype MonacoCursorPositionDisposable = ReturnType<MonacoEditor[\"onDidChangeCursorPosition\"]>;\ntype MonacoCompletionDisposable = ReturnType<MonacoLanguages[\"registerCompletionItemProvider\"]>;\ntype MonacoCodeActionDisposable = ReturnType<MonacoLanguages[\"registerCodeActionProvider\"]>;\ntype MonacoHoverProvider = Parameters<MonacoLanguages[\"registerHoverProvider\"]>[1];\ntype MonacoHoverModel = Parameters<MonacoHoverProvider[\"provideHover\"]>[0];\ntype MonacoHoverPosition = Parameters<MonacoHoverProvider[\"provideHover\"]>[1];\ntype MonacoDecoration = Parameters<MonacoModel[\"deltaDecorations\"]>[1][number];\n\nconst SSML_DIAGNOSTICS_DEBOUNCE_MS = 300;\n\ninterface HoverProviderRegistration {\n disposable: ReturnType<MonacoLanguages[\"registerHoverProvider\"]>;\n references: number;\n}\n\nconst hoverProviderRegistrations = new WeakMap<MonacoLanguages, Map<SsmlEditorLocale, HoverProviderRegistration>>();\n\nexport interface UseSsmlMonacoOptions {\n editorRef?: MonacoEditorRef;\n language: SsmlEditorLanguage;\n text: string;\n decorationsVisible: boolean;\n getOuterVoiceName: () => string | undefined;\n onSelectionOverlayChange: (editor: MonacoEditor, notify: boolean) => void;\n onActiveTagsChange: (tags: ReadonlySet<string>) => void;\n onSyntaxErrorChange: (error: SsmlSyntaxError | null) => void;\n}\n\nexport interface UseSsmlMonacoResult {\n editorRef: { current: MonacoEditor | null };\n onMount: OnMount;\n}\n\nfunction acquireSsmlHoverProvider(monaco: Monaco, locale: SsmlEditorLocale): () => void {\n const languages = monaco.languages;\n let registrations = hoverProviderRegistrations.get(languages);\n if (!registrations) {\n registrations = new Map();\n hoverProviderRegistrations.set(languages, registrations);\n }\n let registration = registrations.get(locale);\n\n if (!registration) {\n const provider: MonacoHoverProvider = {\n provideHover(model: MonacoHoverModel, position: MonacoHoverPosition) {\n const target = findSsmlHoverTarget(model.getValue(), position.lineNumber, position.column);\n if (!target) {\n return undefined;\n }\n\n return {\n contents: [\n {\n isTrusted: false,\n supportHtml: false,\n value: formatSsmlHover(target, locale),\n },\n ],\n range: target.range,\n };\n },\n };\n const disposable = languages.registerHoverProvider(\"xml\", provider);\n registration = { disposable, references: 0 };\n registrations.set(locale, registration);\n }\n\n registration.references += 1;\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n\n const currentRegistrations = hoverProviderRegistrations.get(languages);\n const current = currentRegistrations?.get(locale);\n if (!current) {\n return;\n }\n\n current.references -= 1;\n if (current.references === 0) {\n current.disposable.dispose();\n currentRegistrations?.delete(locale);\n if (currentRegistrations?.size === 0) {\n hoverProviderRegistrations.delete(languages);\n }\n }\n };\n}\n\nfunction getSsmlAttributeValue(tag: string, attributeName: string): string | undefined {\n const escapedAttributeName = attributeName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tag.match(new RegExp(`\\\\b${escapedAttributeName}\\\\s*=\\\\s*(\"|')([^\"']*)\\\\1`, \"i\"));\n return match?.[2];\n}\n\nfunction getSsmlInlineDecorations(model: MonacoModel, value: string, language: SsmlEditorLanguage): MonacoDecoration[] {\n const decorations: MonacoDecoration[] = [];\n const tagPattern = /<(break|prosody)\\b[^>]*>/gi;\n const badgeCopy = INLINE_BADGE_COPY[language];\n\n for (const match of value.matchAll(tagPattern)) {\n const tag = match[0];\n const tagName = match[1].toLowerCase();\n const startOffset = match.index ?? 0;\n const endOffset = startOffset + tag.length;\n const start = model.getPositionAt(startOffset);\n const end = model.getPositionAt(endOffset);\n const pauseValue = getSsmlAttributeValue(tag, \"time\") ?? getSsmlAttributeValue(tag, \"strength\");\n const pitchValue =\n getSsmlAttributeValue(tag, \"pitch\") ??\n getSsmlAttributeValue(tag, \"contour\") ??\n getSsmlAttributeValue(tag, \"range\");\n const prosodyValue = pitchValue ?? getSsmlAttributeValue(tag, \"rate\") ?? getSsmlAttributeValue(tag, \"volume\");\n\n const badge =\n tagName === \"break\"\n ? `${badgeCopy.pause}${pauseValue ? ` ${pauseValue}` : \"\"}`\n : `${pitchValue ? badgeCopy.pitch : badgeCopy.prosody}${prosodyValue ? ` ${prosodyValue}` : \"\"}`;\n\n decorations.push({\n range: {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n },\n options: {\n after: {\n content: ` ${badge}`,\n inlineClassName: `ssml-editor-inline-badge ssml-editor-inline-badge-${tagName === \"break\" ? \"pause\" : \"prosody\"}`,\n },\n },\n });\n }\n\n return decorations;\n}\n\nfunction syncSsmlInlineDecorations(\n model: MonacoModel,\n value: string,\n language: SsmlEditorLanguage,\n showDecorations: boolean,\n decorationIds: string[],\n): string[] {\n return model.deltaDecorations(decorationIds, showDecorations ? getSsmlInlineDecorations(model, value, language) : []);\n}\n\nexport function useSsmlMonaco({\n editorRef: externalEditorRef,\n language,\n text,\n decorationsVisible,\n getOuterVoiceName,\n onSelectionOverlayChange,\n onActiveTagsChange,\n onSyntaxErrorChange,\n}: UseSsmlMonacoOptions): UseSsmlMonacoResult {\n const internalEditorRef = useRef<MonacoEditor | null>(null);\n const editorRef = useRef(externalEditorRef ?? internalEditorRef).current;\n const monacoRef = useRef<Monaco | null>(null);\n const completionProviderRef = useRef<MonacoCompletionDisposable | null>(null);\n const codeActionProviderRef = useRef<MonacoCodeActionDisposable | null>(null);\n const releaseHoverProviderRef = useRef<(() => void) | null>(null);\n const selectionChangeRef = useRef<MonacoDisposable | null>(null);\n const cursorPositionChangeRef = useRef<MonacoCursorPositionDisposable | null>(null);\n const diagnosticsChangeRef = useRef<MonacoContentDisposable | null>(null);\n const diagnosticsTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const selectionLayoutDisposablesRef = useRef<MonacoDisposable[]>([]);\n const inlineDecorationIdsRef = useRef<string[]>([]);\n const languageRef = useRef(language);\n const decorationsVisibleRef = useRef(decorationsVisible);\n const getOuterVoiceNameRef = useRef(getOuterVoiceName);\n const onSelectionOverlayChangeRef = useRef(onSelectionOverlayChange);\n const onActiveTagsChangeRef = useRef(onActiveTagsChange);\n const onSyntaxErrorChangeRef = useRef(onSyntaxErrorChange);\n\n languageRef.current = language;\n decorationsVisibleRef.current = decorationsVisible;\n getOuterVoiceNameRef.current = getOuterVoiceName;\n onSelectionOverlayChangeRef.current = onSelectionOverlayChange;\n onActiveTagsChangeRef.current = onActiveTagsChange;\n onSyntaxErrorChangeRef.current = onSyntaxErrorChange;\n\n const runSsmlDiagnostics = useCallback((editor: MonacoEditor, monaco: Monaco): void => {\n const model = editor.getModel();\n if (!model) {\n onSyntaxErrorChangeRef.current(null);\n return;\n }\n\n onSyntaxErrorChangeRef.current(updateSsmlDiagnostics(monaco, model));\n }, []);\n\n const scheduleSsmlDiagnostics = useCallback(\n (editor: MonacoEditor, monaco: Monaco): void => {\n if (diagnosticsTimeoutRef.current !== null) {\n clearTimeout(diagnosticsTimeoutRef.current);\n }\n\n diagnosticsTimeoutRef.current = setTimeout(() => {\n diagnosticsTimeoutRef.current = null;\n runSsmlDiagnostics(editor, monaco);\n }, SSML_DIAGNOSTICS_DEBOUNCE_MS);\n },\n [runSsmlDiagnostics],\n );\n\n const clearSsmlDiagnosticsResources = useCallback((): void => {\n if (diagnosticsTimeoutRef.current !== null) {\n clearTimeout(diagnosticsTimeoutRef.current);\n diagnosticsTimeoutRef.current = null;\n }\n diagnosticsChangeRef.current?.dispose();\n diagnosticsChangeRef.current = null;\n }, []);\n\n const syncActiveTags = useCallback((editor: MonacoEditor): void => {\n const model = editor.getModel();\n const position = editor.getPosition();\n if (!model || !position) {\n onActiveTagsChangeRef.current(new Set());\n return;\n }\n onActiveTagsChangeRef.current(findActiveSsmlTags(model.getValue(), model.getOffsetAt(position)));\n }, []);\n\n const disposeMonacoResources = useCallback((): void => {\n clearSsmlDiagnosticsResources();\n const model = editorRef.current?.getModel();\n if (model && monacoRef.current) {\n clearSsmlDiagnostics(monacoRef.current, model);\n inlineDecorationIdsRef.current = model.deltaDecorations(inlineDecorationIdsRef.current, []);\n }\n selectionChangeRef.current?.dispose();\n selectionChangeRef.current = null;\n cursorPositionChangeRef.current?.dispose();\n cursorPositionChangeRef.current = null;\n completionProviderRef.current?.dispose();\n completionProviderRef.current = null;\n codeActionProviderRef.current?.dispose();\n codeActionProviderRef.current = null;\n for (const disposable of selectionLayoutDisposablesRef.current) {\n disposable.dispose();\n }\n selectionLayoutDisposablesRef.current = [];\n releaseHoverProviderRef.current?.();\n releaseHoverProviderRef.current = null;\n editorRef.current = null;\n monacoRef.current = null;\n }, [clearSsmlDiagnosticsResources, editorRef]);\n\n const onMount = useCallback<OnMount>(\n (editor, monaco) => {\n disposeMonacoResources();\n editorRef.current = editor;\n monacoRef.current = monaco;\n selectionChangeRef.current = editor.onDidChangeCursorSelection(() => {\n onSelectionOverlayChangeRef.current(editor, true);\n });\n cursorPositionChangeRef.current = editor.onDidChangeCursorPosition(() => {\n syncActiveTags(editor);\n });\n diagnosticsChangeRef.current = editor.onDidChangeModelContent(() => {\n const model = editor.getModel();\n if (model) {\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n model.getValue(),\n languageRef.current,\n decorationsVisibleRef.current,\n inlineDecorationIdsRef.current,\n );\n }\n syncActiveTags(editor);\n scheduleSsmlDiagnostics(editor, monaco);\n });\n selectionLayoutDisposablesRef.current = [\n editor.onDidScrollChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n editor.onDidLayoutChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n editor.onDidContentSizeChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n ];\n completionProviderRef.current = registerSsmlCompletionProvider(monaco, {\n getOuterVoiceName: () => getOuterVoiceNameRef.current(),\n model: editor.getModel(),\n });\n codeActionProviderRef.current = registerSsmlCodeActions(monaco);\n releaseHoverProviderRef.current = acquireSsmlHoverProvider(monaco, languageRef.current);\n runSsmlDiagnostics(editor, monaco);\n const model = editor.getModel();\n if (model) {\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n editor.getValue(),\n languageRef.current,\n decorationsVisibleRef.current,\n inlineDecorationIdsRef.current,\n );\n }\n onSelectionOverlayChangeRef.current(editor, true);\n syncActiveTags(editor);\n },\n [disposeMonacoResources, editorRef, runSsmlDiagnostics, scheduleSsmlDiagnostics, syncActiveTags],\n );\n\n useEffect(() => {\n const monaco = monacoRef.current;\n if (!monaco) {\n return;\n }\n\n releaseHoverProviderRef.current?.();\n releaseHoverProviderRef.current = acquireSsmlHoverProvider(monaco, language);\n }, [language]);\n\n const previousTextRef = useRef<string | null>(null);\n useEffect(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n const model = editor?.getModel();\n if (editor && model && monaco) {\n const previousText = previousTextRef.current;\n previousTextRef.current = text;\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n text,\n language,\n decorationsVisible,\n inlineDecorationIdsRef.current,\n );\n if (previousText === null || previousText !== text) {\n scheduleSsmlDiagnostics(editor, monaco);\n }\n }\n }, [decorationsVisible, editorRef, language, scheduleSsmlDiagnostics, text]);\n\n useEffect(() => disposeMonacoResources, [disposeMonacoResources]);\n\n return { editorRef, onMount };\n}\n","import type { Monaco, OnMount } from \"@monaco-editor/react\";\nimport { validateSsml } from \"@ssml-builder-js/ssml-core\";\nimport { SSML_ATTRIBUTE_PRESETS } from \"./constants/ssmlPresets\";\n\nconst EDITABLE_SSML_PREFIX = '<speak version=\"1.0\" xml:lang=\"en-US\">';\nconst EDITABLE_SSML_SUFFIX = \"</speak>\";\n\nexport const SSML_DIAGNOSTIC_OWNER = \"ssml\";\n\nexport const SSML_DIAGNOSTIC_CODES = {\n INVALID_ATTR_VALUE: \"INVALID_ATTR_VALUE\",\n MISSING_TIME_UNIT: \"MISSING_TIME_UNIT\",\n SYNTAX_ERROR: \"SSML_SYNTAX_ERROR\",\n UNCLOSED_TAG: \"UNCLOSED_TAG\",\n} as const;\n\nexport type SsmlDiagnosticCode = (typeof SSML_DIAGNOSTIC_CODES)[keyof typeof SSML_DIAGNOSTIC_CODES];\n\nexport type SsmlDiagnosticMarkerCode =\n | {\n value: typeof SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE;\n suggestedValue: string;\n }\n | {\n value: typeof SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG;\n target: string;\n };\n\nexport type MonacoEditor = Parameters<OnMount>[0];\nexport type MonacoModel = NonNullable<ReturnType<MonacoEditor[\"getModel\"]>>;\n\nexport interface SsmlSyntaxError {\n code: SsmlDiagnosticCode | SsmlDiagnosticMarkerCode;\n length?: number;\n message: string;\n offset: number;\n}\n\nconst MISSING_TIME_UNIT_PATTERN = /<break\\b[^>]*?\\s+time\\s*=\\s*([\"'])(\\s*)(\\d+(?:\\.\\d+)?)(\\s*)\\1/i;\nconst OPEN_TAG_PATTERN = /<([A-Za-z_][A-Za-z0-9_.:-]*)\\b((?:\"[^\"]*\"|'[^']*'|[^'\">])*)>/g;\nconst ATTRIBUTE_PATTERN = /([A-Za-z_][A-Za-z0-9_.:-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\nconst UNCLOSED_TAG_MESSAGE_PATTERN =\n /^(?:Unclosed XML element: <([^>]+)>|Mismatched closing element: expected <\\/([^>]+)> but found <\\/speak>)$/;\n\nfunction getSsmlAttributePresets(tagName: string, attributeName: string): readonly string[] | undefined {\n const tagPresets = Object.entries(SSML_ATTRIBUTE_PRESETS).find(\n ([presetTagName]) => presetTagName.toLowerCase() === tagName.toLowerCase(),\n )?.[1];\n\n return Object.entries(tagPresets ?? {}).find(\n ([presetAttributeName]) => presetAttributeName.toLowerCase() === attributeName.toLowerCase(),\n )?.[1];\n}\n\nfunction findInvalidAttribute(value: string): {\n attributeName: string;\n attributeValue: string;\n offset: number;\n suggestedValue: string;\n tagName: string;\n} | null {\n for (const tagMatch of value.matchAll(OPEN_TAG_PATTERN)) {\n const tagName = tagMatch[1];\n const tagContent = tagMatch[2];\n if (!tagName || tagContent === undefined) {\n continue;\n }\n\n for (const attributeMatch of tagContent.matchAll(ATTRIBUTE_PATTERN)) {\n const attributeName = attributeMatch[1];\n const quote = attributeMatch[2];\n const attributeValue = attributeMatch[3];\n if (!attributeName || !quote || attributeValue === undefined) {\n continue;\n }\n\n const presets = getSsmlAttributePresets(tagName, attributeName);\n if (!presets || presets.includes(attributeValue)) {\n continue;\n }\n\n const suggestedValue = presets.includes(\"x-fast\") ? \"x-fast\" : presets[0];\n if (!suggestedValue) {\n continue;\n }\n\n const attributeOffset = attributeMatch.index ?? 0;\n const quoteOffset = attributeMatch[0].indexOf(quote);\n return {\n attributeName,\n attributeValue,\n offset: (tagMatch.index ?? 0) + 1 + tagName.length + attributeOffset + quoteOffset + 1,\n suggestedValue,\n tagName,\n };\n }\n }\n\n return null;\n}\n\nexport function validateSsmlText(value: string): SsmlSyntaxError | null {\n if (!value.includes(\"<\")) {\n return null;\n }\n\n const source = `${EDITABLE_SSML_PREFIX}${value}${EDITABLE_SSML_SUFFIX}`;\n const validationError = validateSsml(source);\n if (!validationError) {\n const missingTimeUnit = MISSING_TIME_UNIT_PATTERN.exec(value);\n if (missingTimeUnit) {\n const numericValue = missingTimeUnit[3];\n const offset =\n (missingTimeUnit.index ?? 0) + missingTimeUnit[0].length - 1 - missingTimeUnit[4].length - numericValue.length;\n\n return {\n code: SSML_DIAGNOSTIC_CODES.MISSING_TIME_UNIT,\n length: numericValue.length,\n message: 'SSML time values must include a unit (\"ms\" or \"s\")',\n offset,\n };\n }\n\n const invalidAttribute = findInvalidAttribute(value);\n if (invalidAttribute) {\n return {\n code: {\n value: SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE,\n suggestedValue: invalidAttribute.suggestedValue,\n },\n length: invalidAttribute.attributeValue.length,\n message: `Invalid value \"${invalidAttribute.attributeValue}\" for ${invalidAttribute.tagName} attribute \"${invalidAttribute.attributeName}\"`,\n offset: invalidAttribute.offset,\n };\n }\n\n return null;\n }\n\n const unclosedTagMatch = UNCLOSED_TAG_MESSAGE_PATTERN.exec(validationError.message);\n const unclosedTag = unclosedTagMatch?.[1] ?? unclosedTagMatch?.[2];\n if (unclosedTag) {\n return {\n code: {\n value: SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG,\n target: unclosedTag,\n },\n message: `Unclosed XML element: <${unclosedTag}>`,\n offset: value.length,\n };\n }\n\n return {\n code: SSML_DIAGNOSTIC_CODES.SYNTAX_ERROR,\n message: validationError.message,\n offset: Math.min(Math.max(validationError.position - EDITABLE_SSML_PREFIX.length, 0), value.length),\n };\n}\n\ntype MonacoMarkerData = Parameters<Monaco[\"editor\"][\"setModelMarkers\"]>[2][number];\n\nexport function clearSsmlDiagnostics(monaco: Monaco, model: MonacoModel): void {\n monaco.editor.setModelMarkers(model, SSML_DIAGNOSTIC_OWNER, []);\n}\n\nexport function updateSsmlDiagnostics(monaco: Monaco, model: MonacoModel): SsmlSyntaxError | null {\n const value = model.getValue();\n const syntaxError = validateSsmlText(value);\n if (!syntaxError) {\n clearSsmlDiagnostics(monaco, model);\n return null;\n }\n\n const startOffset = value.length === 0 ? 0 : Math.min(syntaxError.offset, value.length - 1);\n const endOffset = Math.min(startOffset + (syntaxError.length ?? 1), value.length);\n const start = model.getPositionAt(startOffset);\n const end = model.getPositionAt(endOffset);\n\n monaco.editor.setModelMarkers(model, SSML_DIAGNOSTIC_OWNER, [\n {\n message: syntaxError.message,\n severity: monaco.MarkerSeverity.Error,\n code: syntaxError.code as unknown as MonacoMarkerData[\"code\"],\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n },\n ]);\n return syntaxError;\n}\n","import type { Monaco } from \"@monaco-editor/react\";\nimport { SSML_DIAGNOSTIC_CODES } from \"./ssmlDiagnostics\";\n\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoCodeActionProvider = Parameters<MonacoLanguages[\"registerCodeActionProvider\"]>[1];\ntype MonacoCodeActionMethod = NonNullable<MonacoCodeActionProvider[\"provideCodeActions\"]>;\ntype MonacoCodeActionModel = Parameters<MonacoCodeActionMethod>[0];\ntype MonacoCodeActionRange = Parameters<MonacoCodeActionMethod>[1];\ntype MonacoCodeActionContext = Parameters<MonacoCodeActionMethod>[2];\ntype MonacoCodeActionMarker = MonacoCodeActionContext[\"markers\"][number];\n\nconst MISSING_TIME_UNIT_ACTION_TITLE = '単位 \"ms\" を付与して修復';\n\ninterface StructuredMarkerCode {\n suggestedValue?: unknown;\n target?: unknown;\n value?: unknown;\n}\n\nfunction getStructuredMarkerCode(marker: MonacoCodeActionMarker): StructuredMarkerCode | undefined {\n return typeof marker.code === \"object\" && marker.code !== null\n ? (marker.code as unknown as StructuredMarkerCode)\n : undefined;\n}\n\nfunction createMissingTimeUnitAction(model: MonacoCodeActionModel, marker: MonacoCodeActionMarker) {\n return {\n title: MISSING_TIME_UNIT_ACTION_TITLE,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: `${model.getValueInRange(marker)}ms`,\n },\n },\n ],\n },\n };\n}\n\nfunction createUnclosedTagAction(model: MonacoCodeActionModel, marker: MonacoCodeActionMarker, target: string) {\n return {\n title: `閉じタグ \"</${target}>\" を自動挿入`,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.endLineNumber,\n startColumn: marker.endColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: `</${target}>`,\n },\n },\n ],\n },\n };\n}\n\nfunction createInvalidAttributeValueAction(\n model: MonacoCodeActionModel,\n marker: MonacoCodeActionMarker,\n suggestedValue: string,\n) {\n return {\n title: `\"${suggestedValue}\" に変更`,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: suggestedValue,\n },\n },\n ],\n },\n };\n}\n\nexport function registerSsmlCodeActions(monaco: Monaco): ReturnType<MonacoLanguages[\"registerCodeActionProvider\"]> {\n const provider: MonacoCodeActionProvider = {\n provideCodeActions(\n model: MonacoCodeActionModel,\n _range: MonacoCodeActionRange,\n context: MonacoCodeActionContext,\n ): ReturnType<MonacoCodeActionMethod> {\n const actions = context.markers.flatMap((marker: MonacoCodeActionMarker) => {\n if (marker.code === SSML_DIAGNOSTIC_CODES.MISSING_TIME_UNIT) {\n return [createMissingTimeUnitAction(model, marker)];\n }\n\n const structuredCode = getStructuredMarkerCode(marker);\n if (structuredCode?.value === SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG && typeof structuredCode.target === \"string\") {\n return [createUnclosedTagAction(model, marker, structuredCode.target)];\n }\n if (\n structuredCode?.value === SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE &&\n typeof structuredCode.suggestedValue === \"string\"\n ) {\n return [createInvalidAttributeValueAction(model, marker, structuredCode.suggestedValue)];\n }\n\n return [];\n });\n\n return {\n actions,\n dispose() {},\n };\n },\n };\n\n return monaco.languages.registerCodeActionProvider(\"xml\", provider, {\n providedCodeActionKinds: [\"quickfix\"],\n });\n}\n"],"mappings":"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","names":["document","useCallback","useEffect","useRef","useRef","useCallback","model","useEffect","SsmlEditor","document","getSelectedSsml","getCurrentLineSsml"]}
|
|
1
|
+
{"version":3,"sources":["../packages/ssml-editor-react/src/SsmlEditor.tsx","../packages/ssml-editor-react/src/buttonVisibility.ts","../packages/ssml-editor-react/src/components/popovers/InsertionPopover.tsx","../packages/ssml-editor-react/src/styles/editorStyles.ts","../packages/ssml-editor-react/src/components/popovers/InsertionPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/ProsodyPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/TextPopovers.tsx","../packages/ssml-editor-react/src/components/popovers/TimingPopovers.tsx","../packages/ssml-editor-react/src/hooks/useSsmlEditorState.ts","../packages/ssml-editor-react/src/hooks/useSsmlMonaco.ts","../packages/ssml-editor-react/src/ssmlDiagnostics.ts","../packages/ssml-editor-react/src/ssmlCodeAction.ts","../packages/ssml-editor-react/src/ssmlCodeLens.ts"],"sourcesContent":["import { Fragment, forwardRef, useImperativeHandle } from \"react\";\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport Editor from \"@monaco-editor/react\";\nimport type { SsmlDocument } from \"@ssml-builder-js/ssml-core\";\nimport { isSsmlEditorButtonVisible, type SsmlEditorButton, type SsmlEditorButtonVisibility } from \"./buttonVisibility\";\nimport {\n BREAK_TIME_DESCRIPTIONS,\n BREAK_TIME_PRESETS,\n EMPHASIS_LEVEL_DESCRIPTIONS,\n EMPHASIS_LEVEL_PRESETS,\n EXPRESS_AS_STYLE_DESCRIPTIONS,\n EXPRESS_AS_STYLE_PRESETS,\n LANGUAGE_DESCRIPTIONS,\n LANGUAGE_PRESETS,\n PROSODY_PITCH_DESCRIPTIONS,\n PROSODY_PITCH_PRESETS,\n PROSODY_RATE_DESCRIPTIONS,\n PROSODY_RATE_PRESETS,\n PROSODY_VOLUME_DESCRIPTIONS,\n PROSODY_VOLUME_PRESETS,\n SAY_AS_DESCRIPTIONS,\n SAY_AS_PRESETS,\n SILENCE_VALUE_DESCRIPTIONS,\n SILENCE_VALUE_PRESETS,\n} from \"./constants/ssmlPresets\";\nimport {\n EDITOR_COPY,\n type EditorCopy,\n type SsmlEditorLanguage,\n type SsmlEditorLocale,\n type SsmlEditorLocalizedText,\n} from \"./locales\";\nimport { DEFAULT_LOCALE } from \"./constants/ui\";\nimport { ProsodyPopovers } from \"./components/popovers/ProsodyPopovers\";\nimport { TextPopovers } from \"./components/popovers/TextPopovers\";\nimport { TimingPopovers } from \"./components/popovers/TimingPopovers\";\nimport { InsertionPopover } from \"./components/popovers/InsertionPopover\";\nimport { useSsmlEditorState } from \"./hooks/useSsmlEditorState\";\nimport { useSsmlMonaco } from \"./hooks/useSsmlMonaco\";\nimport { editorStyles as styles } from \"./styles/editorStyles\";\nconst UNGROUPED_TOOLBAR_GROUP = \"__ssml-editor-ungrouped__\";\nconst TIMING_POPOVER_TAGS = new Set([\"break\", \"mstts:silence\"]);\nconst PROSODY_POPOVER_TAGS = new Set([\"prosody\", \"mstts:express-as\", \"voice\", \"emphasis\"]);\nconst TEXT_POPOVER_TAGS = new Set([\"sub\", \"say-as\", \"phoneme\", \"w\", \"lang\"]);\n\nexport type { SsmlEditorLanguage, SsmlEditorLocalizedText } from \"./locales\";\n\nexport type SsmlEditorInsertionMode = \"insert\" | \"wrap\";\n\nexport interface SsmlEditorInsertionOption {\n value: string;\n labels: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n}\n\nexport interface SsmlEditorInsertionTemplate {\n prefix: string;\n suffix: string;\n mode: SsmlEditorInsertionMode;\n}\n\nexport interface SsmlEditorInsertionDefinition {\n id: string;\n icon: string;\n tagName?: string;\n selfClosing?: boolean;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions: SsmlEditorLocalizedText;\n parameterDescription: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n createTemplate: (value: string) => SsmlEditorInsertionTemplate;\n}\n\nexport interface SsmlEditorCustomInsertionDefinition {\n id: string;\n tagName: string;\n attribute?: string;\n icon?: string;\n labels: SsmlEditorLocalizedText;\n titles?: SsmlEditorLocalizedText;\n descriptions?: SsmlEditorLocalizedText;\n parameterDescription?: SsmlEditorLocalizedText;\n options: readonly SsmlEditorInsertionOption[];\n mode?: SsmlEditorInsertionMode;\n}\n\nexport type SsmlEditorCustomInsertion = SsmlEditorInsertionDefinition | SsmlEditorCustomInsertionDefinition;\n\nexport type SsmlEditorCustomInsertionCollection =\n | readonly SsmlEditorCustomInsertion[]\n | Readonly<Record<string, SsmlEditorCustomInsertion | undefined>>;\n\nexport interface SsmlEditorInsertionGroup {\n id: string;\n labels: SsmlEditorLocalizedText;\n insertionIds: readonly string[];\n}\n\nexport interface SsmlEditorToolbarGroup {\n id: string;\n buttonIds: readonly string[];\n}\n\nexport type SsmlEditorTheme = \"system\" | \"light\" | \"dark\";\nexport type SsmlEditorWordWrap = \"off\" | \"on\" | \"wordWrapColumn\" | \"bounded\";\nexport type SsmlEditorLineNumbers = \"on\" | \"off\" | \"relative\" | \"interval\";\n\nexport interface SsmlEditorOptions {\n height?: string | number;\n minHeight?: string | number;\n readOnly?: boolean;\n theme?: SsmlEditorTheme;\n fontSize?: number;\n wordWrap?: SsmlEditorWordWrap;\n lineNumbers?: SsmlEditorLineNumbers;\n minimap?: boolean;\n automaticLayout?: boolean;\n}\n\nexport type SsmlInsertionOption = SsmlEditorInsertionOption;\nexport type SsmlInsertionTemplate = SsmlEditorInsertionTemplate;\nexport type SsmlInsertionDefinition = SsmlEditorInsertionDefinition;\n\nfunction localizedText(value: string): SsmlEditorLocalizedText {\n return { ja: value, en: value };\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\n}\n\nexport function createSsmlEditorInsertionDefinition(\n definition: SsmlEditorCustomInsertionDefinition,\n): SsmlEditorInsertionDefinition {\n const mode = definition.mode ?? \"wrap\";\n const attribute = definition.attribute ? ` ${definition.attribute}=\"` : \"\";\n\n return {\n id: definition.id,\n icon: definition.icon ?? \"+\",\n tagName: definition.tagName,\n selfClosing: mode === \"insert\",\n labels: definition.labels,\n titles: definition.titles,\n descriptions: definition.descriptions ?? localizedText(`Inserts the <${definition.tagName}> element.`),\n parameterDescription:\n definition.parameterDescription ?? localizedText(`Selects the value for the <${definition.tagName}> element.`),\n options: definition.options,\n createTemplate: (value) => {\n const attributeValue = definition.attribute ? `${attribute}${escapeXmlAttribute(value)}\"` : \"\";\n if (mode === \"wrap\") {\n return {\n prefix: `<${definition.tagName}${attributeValue}>`,\n suffix: `</${definition.tagName}>`,\n mode,\n };\n }\n\n return {\n prefix: `<${definition.tagName}${attributeValue}/>`,\n suffix: \"\",\n mode,\n };\n },\n };\n}\n\nfunction createInsertionOptions(\n values: readonly string[],\n descriptions?: Readonly<Record<string, SsmlEditorLocalizedText>>,\n): readonly SsmlInsertionOption[] {\n return values.map((value) => ({\n value,\n labels: { ja: value, en: value },\n ...(descriptions?.[value] ? { descriptions: descriptions[value] } : {}),\n }));\n}\n\nexport const SSML_INSERTIONS = [\n {\n id: \"break\",\n icon: \"⏸\",\n tagName: \"break\",\n selfClosing: true,\n labels: { ja: \"間\", en: \"Break\" },\n descriptions: {\n ja: \"指定した時間だけ無音の間を挿入します。\",\n en: \"Inserts a silent pause for the selected duration.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the duration of the silent pause.\",\n },\n options: createInsertionOptions(BREAK_TIME_PRESETS, BREAK_TIME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<break time=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n {\n id: \"emphasis\",\n icon: \"✦\",\n tagName: \"emphasis\",\n labels: { ja: \"強調\", en: \"Emphasis\" },\n descriptions: {\n ja: \"選択範囲の強調レベルを変更します。\",\n en: \"Changes the emphasis level of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の強調レベルを選択します。\",\n en: \"Selects the emphasis level for the selected text.\",\n },\n options: createInsertionOptions(EMPHASIS_LEVEL_PRESETS, EMPHASIS_LEVEL_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<emphasis level=\"${value}\">`,\n suffix: \"</emphasis>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"rate\",\n icon: \"↕\",\n tagName: \"prosody\",\n labels: { ja: \"速度\", en: \"Rate\" },\n descriptions: {\n ja: \"選択範囲の読み上げ速度を変更します。\",\n en: \"Changes the speech rate of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ速度を選択します。\",\n en: \"Selects the speech rate for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_RATE_PRESETS, PROSODY_RATE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody rate=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"pitch\",\n icon: \"↗\",\n tagName: \"prosody\",\n labels: { ja: \"高さ\", en: \"Pitch\" },\n descriptions: {\n ja: \"選択範囲の声の高さを変更します。\",\n en: \"Changes the pitch of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の声の高さを半音単位で選択します。\",\n en: \"Selects the pitch adjustment in semitone steps.\",\n },\n options: createInsertionOptions(PROSODY_PITCH_PRESETS, PROSODY_PITCH_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody pitch=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"volume\",\n icon: \"🔊\",\n tagName: \"prosody\",\n labels: { ja: \"音量\", en: \"Volume\" },\n descriptions: {\n ja: \"選択範囲の音量を変更します。\",\n en: \"Changes the volume of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲の音量レベルを選択します。\",\n en: \"Selects the volume level for the selected text.\",\n },\n options: createInsertionOptions(PROSODY_VOLUME_PRESETS, PROSODY_VOLUME_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<prosody volume=\"${value}\">`,\n suffix: \"</prosody>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"emotion\",\n icon: \"☺\",\n tagName: \"mstts:express-as\",\n labels: { ja: \"感情\", en: \"Emotion\" },\n descriptions: {\n ja: \"選択範囲に音声の感情スタイルを適用します。\",\n en: \"Applies a voice emotion style to the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する音声の感情スタイルを選択します。\",\n en: \"Selects the voice emotion style to apply.\",\n },\n options: createInsertionOptions(EXPRESS_AS_STYLE_PRESETS, EXPRESS_AS_STYLE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:express-as style=\"${value}\">`,\n suffix: \"</mstts:express-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"say-as\",\n icon: \"Aa\",\n tagName: \"say-as\",\n labels: { ja: \"読み上げ\", en: \"Say as\" },\n descriptions: {\n ja: \"数字や日付などの読み上げ方を指定します。\",\n en: \"Specifies how values such as numbers or dates are spoken.\",\n },\n parameterDescription: {\n ja: \"選択範囲の読み上げ方を選択します。\",\n en: \"Selects how the selected text is spoken.\",\n },\n options: createInsertionOptions(SAY_AS_PRESETS, SAY_AS_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<say-as interpret-as=\"${value}\">`,\n suffix: \"</say-as>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"lang\",\n icon: \"文\",\n tagName: \"lang\",\n labels: { ja: \"言語\", en: \"Language\" },\n descriptions: {\n ja: \"選択範囲の読み上げ言語を変更します。\",\n en: \"Changes the speaking language of the selected text.\",\n },\n parameterDescription: {\n ja: \"選択範囲に適用する BCP-47 言語タグを選択します。\",\n en: \"Selects the BCP-47 language tag for the selected text.\",\n },\n options: createInsertionOptions(LANGUAGE_PRESETS, LANGUAGE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<lang xml:lang=\"${value}\">`,\n suffix: \"</lang>\",\n mode: \"wrap\",\n }),\n },\n {\n id: \"mstts:silence\",\n icon: \"⏳\",\n tagName: \"mstts:silence\",\n selfClosing: true,\n labels: { ja: \"無音\", en: \"Silence\" },\n descriptions: {\n ja: \"無音時間を挿入します。\",\n en: \"Inserts a silence interval.\",\n },\n parameterDescription: {\n ja: \"無音にする時間を選択します。\",\n en: \"Selects the silence duration.\",\n },\n options: createInsertionOptions(SILENCE_VALUE_PRESETS, SILENCE_VALUE_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:silence type=\"Leading\" value=\"${value}\"/>`,\n suffix: \"\",\n mode: \"insert\",\n }),\n },\n] satisfies readonly SsmlInsertionDefinition[];\n\nconst DEFAULT_INSERTION_GROUPS = [\n {\n id: \"pauses\",\n labels: { ja: \"間・無音\", en: \"Pauses\" },\n insertionIds: [\"break\", \"mstts:silence\"],\n },\n {\n id: \"prosody\",\n labels: { ja: \"声の調整\", en: \"Voice\" },\n insertionIds: [\"rate\", \"pitch\", \"volume\"],\n },\n {\n id: \"expression\",\n labels: { ja: \"表現\", en: \"Expression\" },\n insertionIds: [\"emphasis\", \"emotion\"],\n },\n {\n id: \"pronunciation\",\n labels: { ja: \"読み上げ\", en: \"Pronunciation\" },\n insertionIds: [\"say-as\", \"lang\"],\n },\n] satisfies readonly SsmlEditorInsertionGroup[];\n\nfunction createDefaultToolbarGroups(\n insertionGroups: readonly SsmlEditorInsertionGroup[],\n): readonly SsmlEditorToolbarGroup[] {\n return [\n {\n id: \"history\",\n buttonIds: [\"undo\", \"redo\"],\n },\n ...insertionGroups.map(({ id, insertionIds }) => ({\n id,\n buttonIds: insertionIds,\n })),\n {\n id: \"document\",\n buttonIds: [\"clearAll\", \"format\", \"decorations\"],\n },\n {\n id: \"help\",\n buttonIds: [\"help\"],\n },\n ];\n}\n\nfunction getInsertionCollection(\n collection: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlEditorCustomInsertion[] {\n if (!collection) {\n return [];\n }\n\n return Array.isArray(collection)\n ? collection\n : Object.values(collection).filter((insertion): insertion is SsmlEditorCustomInsertion => insertion !== undefined);\n}\n\nfunction getConfiguredInsertions(\n emotionStyles: readonly string[] | undefined,\n customInsertions: SsmlEditorCustomInsertionCollection | undefined,\n additionalInsertions: SsmlEditorCustomInsertionCollection | undefined,\n): readonly SsmlInsertionDefinition[] {\n const insertions = new Map<string, SsmlInsertionDefinition>();\n for (const insertion of SSML_INSERTIONS) {\n if (insertion.id === \"emotion\" && emotionStyles !== undefined) {\n insertions.set(insertion.id, {\n ...insertion,\n options: createInsertionOptions(emotionStyles),\n });\n continue;\n }\n insertions.set(insertion.id, insertion);\n }\n\n const normalizeInsertion = (insertion: SsmlEditorCustomInsertion): SsmlInsertionDefinition =>\n \"createTemplate\" in insertion ? insertion : createSsmlEditorInsertionDefinition(insertion);\n\n for (const insertion of getInsertionCollection(additionalInsertions)) {\n const normalized = normalizeInsertion(insertion);\n if (!insertions.has(normalized.id)) {\n insertions.set(normalized.id, normalized);\n }\n }\n\n for (const insertion of getInsertionCollection(customInsertions)) {\n const normalized = normalizeInsertion(insertion);\n insertions.set(normalized.id, normalized);\n }\n\n return [...insertions.values()];\n}\n\nfunction orderInsertions(\n insertions: readonly SsmlInsertionDefinition[],\n insertionOrder: readonly string[] | undefined,\n): readonly SsmlInsertionDefinition[] {\n if (!insertionOrder || insertionOrder.length === 0) {\n return insertions;\n }\n\n const insertionsById = new Map(insertions.map((insertion) => [insertion.id, insertion]));\n const ordered: SsmlInsertionDefinition[] = [];\n const included = new Set<string>();\n for (const id of insertionOrder) {\n const insertion = insertionsById.get(id);\n if (insertion && !included.has(id)) {\n ordered.push(insertion);\n included.add(id);\n }\n }\n\n for (const insertion of insertions) {\n if (!included.has(insertion.id)) {\n ordered.push(insertion);\n }\n }\n\n return ordered;\n}\n\nfunction orderToolbarButtons(\n buttonIds: readonly string[],\n toolbarOrder: readonly string[] | undefined,\n): readonly string[] {\n if (!toolbarOrder || toolbarOrder.length === 0) {\n return buttonIds;\n }\n\n const available = new Set(buttonIds);\n const ordered: string[] = [];\n const included = new Set<string>();\n for (const id of toolbarOrder) {\n if (available.has(id) && !included.has(id)) {\n ordered.push(id);\n included.add(id);\n }\n }\n\n for (const id of buttonIds) {\n if (!included.has(id)) {\n ordered.push(id);\n }\n }\n\n return ordered;\n}\n\nconst STYLE_ID = \"ssml-editor-theme\";\nconst STYLE_CSS = `\n[data-ssml-editor] {\n --ssml-editor-color: #111827;\n --ssml-editor-bg: #ffffff;\n --ssml-editor-border: #d1d5db;\n --ssml-editor-control-bg: #f9fafb;\n --ssml-editor-control-border: #9ca3af;\n --ssml-editor-active-bg: #dbeafe;\n --ssml-editor-active-border: #2563eb;\n --ssml-editor-preview-bg: #f3f4f6;\n --ssml-editor-error: #b91c1c;\n --ssml-editor-error-bg: #fef2f2;\n --ssml-editor-switch-active: #2563eb;\n --ssml-editor-pause-badge-bg: #e0e7ff;\n --ssml-editor-pause-badge-color: #3730a3;\n --ssml-editor-pause-badge-border: #c7d2fe;\n --ssml-editor-prosody-badge-bg: #dcfce7;\n --ssml-editor-prosody-badge-color: #166534;\n --ssml-editor-prosody-badge-border: #86efac;\n}\n[data-ssml-editor][data-theme=\"dark\"] {\n --ssml-editor-color: #f9fafb;\n --ssml-editor-bg: #1f2937;\n --ssml-editor-border: #374151;\n --ssml-editor-control-bg: #111827;\n --ssml-editor-control-border: #4b5563;\n --ssml-editor-active-bg: #1e3a8a;\n --ssml-editor-active-border: #60a5fa;\n --ssml-editor-preview-bg: #111827;\n --ssml-editor-error: #fca5a5;\n --ssml-editor-error-bg: #450a0a;\n --ssml-editor-switch-active: #60a5fa;\n --ssml-editor-pause-badge-bg: #312e81;\n --ssml-editor-pause-badge-color: #c7d2fe;\n --ssml-editor-pause-badge-border: #6366f1;\n --ssml-editor-prosody-badge-bg: #14532d;\n --ssml-editor-prosody-badge-color: #bbf7d0;\n --ssml-editor-prosody-badge-border: #4ade80;\n}\n[data-ssml-editor] .ssml-editor-inline-badge {\n display: inline-block;\n margin-left: 0.35em;\n padding: 0 0.35em;\n border: 1px solid;\n border-radius: 999px;\n font-size: 0.75em;\n font-weight: 600;\n line-height: 1.4;\n white-space: nowrap;\n vertical-align: middle;\n pointer-events: none;\n}\n[data-ssml-editor] .ssml-editor-inline-badge-pause {\n color: var(--ssml-editor-pause-badge-color);\n background-color: var(--ssml-editor-pause-badge-bg);\n border-color: var(--ssml-editor-pause-badge-border);\n}\n[data-ssml-editor] .ssml-editor-inline-badge-prosody {\n color: var(--ssml-editor-prosody-badge-color);\n background-color: var(--ssml-editor-prosody-badge-bg);\n border-color: var(--ssml-editor-prosody-badge-border);\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] {\n background-color: var(--ssml-editor-switch-active);\n}\n[data-ssml-editor] .ssml-editor-switch-track[aria-checked=\"true\"] .ssml-editor-switch-thumb {\n transform: translateX(1.25rem);\n}\n[data-ssml-editor] .ssml-editor-switch-track:focus-visible {\n outline: 2px solid var(--ssml-editor-switch-active);\n outline-offset: 2px;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary {\n list-style: none;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary::-webkit-details-marker {\n display: none;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary:hover {\n background-color: var(--ssml-editor-preview-bg);\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary:focus-visible {\n outline: 2px solid var(--ssml-editor-control-border);\n outline-offset: -2px;\n}\n[data-ssml-editor] .ssml-editor-help-settings-summary::before {\n content: \"▸\";\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 1rem;\n line-height: 1.45;\n}\n[data-ssml-editor]\n .ssml-editor-help-settings-accordion[open]\n > .ssml-editor-help-settings-summary::before {\n content: \"▾\";\n}\n`.trim();\n\nfunction injectEditorTheme(): void {\n if (typeof document !== \"undefined\" && !document.getElementById(STYLE_ID)) {\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = STYLE_CSS;\n document.head.appendChild(style);\n }\n}\n\nexport interface SsmlEditorProps {\n document: SsmlDocument;\n onChange?: (document: SsmlDocument) => void;\n onSsmlChange?: (xml: string) => void;\n onSelectionChange?: (info: SelectionInfo) => void;\n /** Called with the selected partial SSML when the selection preview action is used. The action is disabled when omitted. */\n onPreviewSelection?: (ssml: string) => void;\n /** UI language. Japanese is used when omitted. */\n language?: SsmlEditorLanguage;\n /** UI locale. Japanese is used when omitted; takes precedence over the legacy language prop. */\n locale?: SsmlEditorLocale;\n /** Whether the toolbar is displayed. */\n showToolbar?: boolean;\n /** Whether toolbar action icons are displayed. */\n showToolbarIcons?: boolean;\n /** Whether toolbar action text labels are displayed. */\n showToolbarLabels?: boolean;\n /** Whether inline SSML decorations are displayed. The toolbar switch can change this at runtime. */\n showDecorations?: boolean;\n /** Whether SSML CodeLens quick controls are displayed. */\n enableCodeLens?: boolean;\n /** Controls which editor action buttons are displayed. Unspecified buttons are shown. */\n buttonVisibility?: SsmlEditorButtonVisibility;\n /** Monaco editor settings. */\n editorOptions?: SsmlEditorOptions;\n /** Alias for editorOptions. */\n settings?: SsmlEditorOptions;\n /** Fallback UI displayed while Monaco is loading. */\n loadingFallback?: ReactNode;\n /** Height of the Monaco editor. */\n height?: string | number;\n /** Minimum height of the Monaco editor container. */\n minHeight?: string | number;\n /** Whether the Monaco editor is read-only. */\n readOnly?: boolean;\n /** Monaco theme mode. */\n theme?: SsmlEditorTheme;\n /** Monaco editor font size. */\n fontSize?: number;\n /** Monaco editor word wrapping mode. */\n wordWrap?: SsmlEditorWordWrap;\n /** Monaco editor line number mode. */\n lineNumbers?: SsmlEditorLineNumbers;\n /** Whether the Monaco minimap is displayed. */\n minimap?: boolean;\n /** Whether Monaco automatically lays out when its container changes size. */\n automaticLayout?: boolean;\n /** Reorders all toolbar controls. Unlisted controls follow. */\n toolbarOrder?: readonly SsmlEditorButton[];\n /** Adds vertical separators between configured toolbar groups. */\n toolbarGroups?: readonly SsmlEditorToolbarGroup[];\n /** Reorders built-in and custom insertion menus. Unlisted insertions follow. */\n insertionOrder?: readonly string[];\n /** Visually groups insertion menus when toolbarGroups is not supplied. */\n insertionGroups?: readonly SsmlEditorInsertionGroup[];\n /** Replaces built-in insertion definitions with custom definitions by ID. */\n customInsertions?: SsmlEditorCustomInsertionCollection;\n /** Adds insertion definitions without replacing built-in definitions. */\n additionalInsertions?: SsmlEditorCustomInsertionCollection;\n /** Candidate style values shown by the built-in emotion insertion. */\n emotionStyles?: readonly string[];\n /** Class name applied to the editor container. */\n className?: string;\n /** Inline styles applied to the editor container. */\n style?: CSSProperties;\n /** Class name applied to the toolbar. */\n toolbarClassName?: string;\n /** Inline styles applied to the toolbar. */\n toolbarStyle?: CSSProperties;\n /** Class name applied to the editor display area. */\n displayClassName?: string;\n /** Inline styles applied to the editor display area. */\n displayStyle?: CSSProperties;\n}\n\nexport interface SelectionInfo {\n selectedText: string;\n characterCount: number;\n hasSelection: boolean;\n}\n\nexport interface SsmlEditorRef {\n getSelectedSsml(): string | null;\n getCurrentLineSsml(): string | null;\n getFullSsml(): string;\n}\n\ninterface ToolbarDecorationsSwitchProps {\n copy: EditorCopy;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n decorationsVisible: boolean;\n onVisibilityChange: (visible: boolean) => void;\n}\n\nfunction ToolbarDecorationsSwitch({\n copy,\n showToolbarIcons,\n showToolbarText,\n decorationsVisible,\n onVisibilityChange,\n}: ToolbarDecorationsSwitchProps): ReactElement {\n return (\n <div style={styles.toolbarSwitch}>\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ☆\n </span>\n )}\n {showToolbarText && <span>{copy.decorations}</span>}\n <button\n type=\"button\"\n className=\"ssml-editor-switch-track\"\n style={styles.toolbarSwitchTrack}\n role=\"switch\"\n aria-checked={decorationsVisible}\n aria-label={copy.decorations}\n title={decorationsVisible ? copy.decorationsHideTitle : copy.decorationsShowTitle}\n onClick={() => onVisibilityChange(!decorationsVisible)}\n >\n <span className=\"ssml-editor-switch-thumb\" style={styles.toolbarSwitchThumb} aria-hidden=\"true\" />\n </button>\n </div>\n );\n}\n\nexport const SsmlEditor = forwardRef<SsmlEditorRef, SsmlEditorProps>(function SsmlEditor(\n {\n document,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n language: languageProp,\n locale: localeProp,\n showToolbar = true,\n showToolbarIcons = true,\n showToolbarLabels = false,\n showDecorations = false,\n enableCodeLens = true,\n buttonVisibility,\n editorOptions,\n settings,\n height,\n minHeight,\n readOnly,\n theme,\n fontSize,\n wordWrap,\n lineNumbers,\n minimap,\n automaticLayout,\n toolbarOrder,\n toolbarGroups,\n insertionOrder,\n insertionGroups,\n customInsertions,\n additionalInsertions,\n emotionStyles,\n className,\n style,\n toolbarClassName,\n toolbarStyle,\n displayClassName,\n displayStyle,\n loadingFallback,\n }: SsmlEditorProps,\n ref,\n): ReactElement {\n const resolvedEditorOptions: SsmlEditorOptions = {\n ...settings,\n ...editorOptions,\n ...(height === undefined ? {} : { height }),\n ...(minHeight === undefined ? {} : { minHeight }),\n ...(readOnly === undefined ? {} : { readOnly }),\n ...(theme === undefined ? {} : { theme }),\n ...(fontSize === undefined ? {} : { fontSize }),\n ...(wordWrap === undefined ? {} : { wordWrap }),\n ...(lineNumbers === undefined ? {} : { lineNumbers }),\n ...(minimap === undefined ? {} : { minimap }),\n ...(automaticLayout === undefined ? {} : { automaticLayout }),\n };\n const language = localeProp ?? languageProp ?? DEFAULT_LOCALE;\n const copy = EDITOR_COPY[language];\n const showToolbarText = showToolbarLabels || !showToolbarIcons;\n const resolvedTheme = resolvedEditorOptions.theme ?? \"system\";\n const editorMinHeight = resolvedEditorOptions.minHeight ?? \"8rem\";\n const editorHeight = resolvedEditorOptions.height ?? editorMinHeight;\n const isReadOnly = resolvedEditorOptions.readOnly ?? false;\n const toolbarButtonStyle = showToolbarText\n ? styles.toolbarButton\n : { ...styles.toolbarButton, ...styles.toolbarIconOnly };\n const configuredInsertions = getConfiguredInsertions(emotionStyles, customInsertions, additionalInsertions);\n const visibleInsertions = orderInsertions(configuredInsertions, insertionOrder).filter((insertion) =>\n isSsmlEditorButtonVisible(buttonVisibility, insertion.id),\n );\n const insertionById = new Map(visibleInsertions.map((insertion) => [insertion.id, insertion]));\n const configuredInsertionGroups = insertionGroups ?? DEFAULT_INSERTION_GROUPS;\n const groupedInsertionIds = new Set<string>();\n const visibleInsertionGroups = configuredInsertionGroups\n .map((group) => {\n const groupInsertionIds = new Set(group.insertionIds);\n const candidates =\n insertionOrder && insertionOrder.length > 0\n ? visibleInsertions.filter((insertion) => groupInsertionIds.has(insertion.id))\n : group.insertionIds\n .map((id) => insertionById.get(id))\n .filter((insertion): insertion is SsmlInsertionDefinition => insertion !== undefined);\n const insertions = candidates.filter((insertion) => {\n if (groupedInsertionIds.has(insertion.id)) {\n return false;\n }\n groupedInsertionIds.add(insertion.id);\n return true;\n });\n\n return { group, insertions };\n })\n .filter(({ insertions }) => insertions.length > 0);\n const ungroupedInsertions = visibleInsertions.filter((insertion) => !groupedInsertionIds.has(insertion.id));\n const toolbarActionIds = [\"undo\", \"redo\", \"clearAll\", \"format\", \"decorations\", \"help\"] as const;\n const defaultToolbarOrder = [\n \"undo\",\n \"redo\",\n ...visibleInsertionGroups.flatMap(({ insertions }) => insertions.map((insertion) => insertion.id)),\n ...ungroupedInsertions.map((insertion) => insertion.id),\n \"clearAll\",\n \"format\",\n \"decorations\",\n \"help\",\n ];\n const visibleToolbarIds = new Set<string>([\n ...visibleInsertions.map((insertion) => insertion.id),\n ...toolbarActionIds.filter((id) => isSsmlEditorButtonVisible(buttonVisibility, id)),\n ]);\n const toolbarItemIds = orderToolbarButtons(\n defaultToolbarOrder.filter((id) => visibleToolbarIds.has(id)),\n toolbarOrder,\n );\n const effectiveToolbarGroups = toolbarGroups ?? createDefaultToolbarGroups(configuredInsertionGroups);\n const toolbarGroupByButtonId = new Map<string, string>();\n for (const group of effectiveToolbarGroups) {\n for (const buttonId of group.buttonIds) {\n if (!toolbarGroupByButtonId.has(buttonId)) {\n toolbarGroupByButtonId.set(buttonId, group.id);\n }\n }\n }\n const helpInsertions = [\n ...visibleInsertionGroups.flatMap(({ insertions }) => insertions),\n ...ungroupedInsertions,\n ].filter(\n (insertion, index, insertions) => insertions.findIndex((candidate) => candidate.id === insertion.id) === index,\n );\n\n const {\n editorRef,\n text,\n selectionOverlay,\n activeTags,\n isDarkTheme,\n decorationsVisible,\n setDecorationsVisible,\n isHelpOpen,\n setIsHelpOpen,\n syntaxError,\n setSyntaxError,\n helpPanelId,\n handleTextChange,\n handleInsert,\n handleInsertBreak,\n handleInsertProsody,\n handleInsertText,\n handleClear,\n handleFormat,\n handleUndo,\n handleRedo,\n previewSelection,\n canPreviewSelection,\n refreshSelectionOverlay,\n updateActiveTags,\n getSelectedSsml,\n getCurrentLineSsml,\n getFullSsml,\n getOuterVoiceName,\n handleCodeLensAction,\n openPopoverId,\n popoverVoiceName,\n popoverPosition,\n isPopoverOpen,\n togglePopover,\n closePopover,\n setPopoverMenuRef,\n } = useSsmlEditorState({\n document,\n resolvedTheme,\n showDecorations,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n injectTheme: injectEditorTheme,\n });\n const { onMount } = useSsmlMonaco({\n editorRef,\n language,\n text,\n decorationsVisible,\n getOuterVoiceName,\n onSelectionOverlayChange: refreshSelectionOverlay,\n onActiveTagsChange: updateActiveTags,\n onSyntaxErrorChange: setSyntaxError,\n enableCodeLens,\n onOpenPopover: handleCodeLensAction,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n getSelectedSsml,\n getCurrentLineSsml,\n getFullSsml,\n }),\n [getCurrentLineSsml, getFullSsml, getSelectedSsml],\n );\n\n const renderInsertion = (insertion: SsmlEditorInsertionDefinition): ReactElement => {\n const isTimingPopover = insertion.tagName !== undefined && TIMING_POPOVER_TAGS.has(insertion.tagName);\n const isProsodyPopover = insertion.tagName !== undefined && PROSODY_POPOVER_TAGS.has(insertion.tagName);\n const isTextPopover = insertion.tagName !== undefined && TEXT_POPOVER_TAGS.has(insertion.tagName);\n const insertionButtonStyle =\n insertion.tagName && activeTags.has(insertion.tagName.toLowerCase())\n ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive }\n : toolbarButtonStyle;\n const props = {\n language,\n isDarkTheme,\n showToolbarIcons,\n showToolbarText,\n toolbarButtonStyle: insertionButtonStyle,\n emptyOptionsMessage: copy.noAvailableOptions,\n isReadOnly,\n openPopoverId,\n menuPosition: popoverPosition,\n menuRef: setPopoverMenuRef,\n onToggle: togglePopover,\n onClose: closePopover,\n onApply: isTimingPopover\n ? handleInsertBreak\n : isProsodyPopover\n ? handleInsertProsody\n : isTextPopover\n ? handleInsertText\n : handleInsert,\n };\n\n if (isTimingPopover) {\n return <TimingPopovers {...props} insertions={[insertion]} />;\n }\n if (isProsodyPopover) {\n return <ProsodyPopovers {...props} insertions={[insertion]} voiceName={popoverVoiceName} />;\n }\n if (isTextPopover) {\n return <TextPopovers {...props} insertions={[insertion]} />;\n }\n return (\n <InsertionPopover\n {...props}\n insertion={insertion}\n isOpen={isPopoverOpen(insertion.id)}\n onToggle={(trigger) => togglePopover(insertion.id, trigger)}\n />\n );\n };\n\n const toolbarItemRenderers = new Map<string, () => ReactElement>([\n [\n \"undo\",\n () => (\n <button\n key=\"undo\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.undo}\n title={copy.undoTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleUndo();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ↩\n </span>\n )}\n {showToolbarText && <span>{copy.undo}</span>}\n </button>\n ),\n ],\n [\n \"redo\",\n () => (\n <button\n key=\"redo\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.redo}\n title={copy.redoTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleRedo();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ↪\n </span>\n )}\n {showToolbarText && <span>{copy.redo}</span>}\n </button>\n ),\n ],\n [\n \"clearAll\",\n () => (\n <button\n key=\"clearAll\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.clearAll}\n title={copy.clearAllTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleClear();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ×\n </span>\n )}\n {showToolbarText && <span>{copy.clearAll}</span>}\n </button>\n ),\n ],\n [\n \"format\",\n () => (\n <button\n key=\"format\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.format}\n title={copy.formatTitle}\n disabled={isReadOnly}\n onClick={() => {\n if (!isReadOnly) {\n handleFormat();\n }\n }}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ≡\n </span>\n )}\n {showToolbarText && <span>{copy.format}</span>}\n </button>\n ),\n ],\n [\n \"decorations\",\n () => (\n <ToolbarDecorationsSwitch\n key=\"decorations\"\n copy={copy}\n showToolbarIcons={showToolbarIcons}\n showToolbarText={showToolbarText}\n decorationsVisible={decorationsVisible}\n onVisibilityChange={setDecorationsVisible}\n />\n ),\n ],\n [\n \"help\",\n () => (\n <button\n key=\"help\"\n type=\"button\"\n style={toolbarButtonStyle}\n aria-label={copy.help}\n title={copy.helpTitle}\n aria-expanded={isHelpOpen}\n aria-controls={helpPanelId}\n onClick={() => setIsHelpOpen((open) => !open)}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n ?\n </span>\n )}\n {showToolbarText && <span>{copy.help}</span>}\n </button>\n ),\n ],\n ]);\n for (const insertion of visibleInsertions) {\n toolbarItemRenderers.set(insertion.id, () => renderInsertion(insertion));\n }\n const renderToolbarItems = (): ReactElement[] => {\n let previousRenderedGroupId = UNGROUPED_TOOLBAR_GROUP;\n let hasRenderedToolbarItem = false;\n const renderedItems: ReactElement[] = [];\n\n for (const id of toolbarItemIds) {\n const render = toolbarItemRenderers.get(id);\n if (!render) {\n continue;\n }\n\n const groupId = toolbarGroupByButtonId.get(id) ?? UNGROUPED_TOOLBAR_GROUP;\n const showSeparator = hasRenderedToolbarItem && groupId !== previousRenderedGroupId;\n previousRenderedGroupId = groupId;\n hasRenderedToolbarItem = true;\n renderedItems.push(\n <Fragment key={id}>\n {showSeparator && <span style={styles.toolbarSeparator} aria-hidden=\"true\" />}\n {render()}\n </Fragment>,\n );\n }\n\n return renderedItems;\n };\n\n return (\n <section\n className={className}\n style={{ ...styles.container, ...style }}\n aria-label={copy.editorAriaLabel}\n data-ssml-editor=\"\"\n data-theme={isDarkTheme ? \"dark\" : \"light\"}\n >\n {showToolbar && (\n <div\n className={toolbarClassName}\n style={{ ...styles.toolbarContainer, ...toolbarStyle }}\n data-ssml-editor-toolbar=\"\"\n >\n <div\n style={styles.toolbarActions}\n role=\"toolbar\"\n aria-label={copy.toolbarAriaLabel}\n data-ssml-editor-toolbar-actions=\"\"\n >\n {renderToolbarItems()}\n </div>\n </div>\n )}\n <div className={displayClassName} style={{ ...styles.display, ...displayStyle }} data-ssml-editor-display=\"\">\n {isHelpOpen && isSsmlEditorButtonVisible(buttonVisibility, \"help\") && (\n <section id={helpPanelId} style={styles.helpPanel} aria-label={copy.helpHeading}>\n <h3 style={styles.helpHeading}>{copy.helpHeading}</h3>\n <p style={styles.helpDescription}>{copy.helpDescription}</p>\n {helpInsertions.length > 0 && (\n <ul style={styles.helpList}>\n {helpInsertions.map((insertion) => (\n <li key={insertion.id} style={styles.helpItem}>\n <details className=\"ssml-editor-help-settings-accordion\" style={styles.helpSettingsAccordion}>\n <summary className=\"ssml-editor-help-settings-summary\" style={styles.helpSettingsSummary}>\n <span style={styles.helpIcon} aria-hidden=\"true\">\n {insertion.icon}\n </span>\n <span style={styles.helpSettingsSummaryContent}>\n <strong>{insertion.labels[language]}</strong>{\" \"}\n {insertion.tagName && (\n <>\n <code>{`<${insertion.tagName}${insertion.selfClosing ? \"/>\" : \">\"}`}</code> —{\" \"}\n </>\n )}\n {insertion.descriptions[language]}\n </span>\n </summary>\n <p style={styles.helpSettingsDescription}>\n <strong>{copy.parameters}:</strong> {insertion.parameterDescription[language]}\n </p>\n <ul style={styles.helpSettingsList}>\n {insertion.options.map((option) => (\n <li key={option.value}>\n <strong>{option.labels[language]}</strong>\n {option.descriptions && <> — {option.descriptions[language]}</>}\n </li>\n ))}\n </ul>\n </details>\n </li>\n ))}\n </ul>\n )}\n </section>\n )}\n <div style={{ ...styles.editor, minHeight: editorMinHeight }}>\n <Editor\n height={editorHeight}\n language=\"xml\"\n theme={isDarkTheme ? \"vs-dark\" : \"light\"}\n options={{\n automaticLayout: resolvedEditorOptions.automaticLayout ?? true,\n autoClosingBrackets: \"never\",\n fontSize: resolvedEditorOptions.fontSize,\n hover: { enabled: \"on\" },\n inlayHints: { enabled: decorationsVisible ? \"on\" : \"off\" },\n lineNumbers: resolvedEditorOptions.lineNumbers,\n minimap: {\n enabled: resolvedEditorOptions.minimap ?? true,\n },\n readOnly: isReadOnly,\n wordWrap: resolvedEditorOptions.wordWrap,\n }}\n value={text}\n loading={loadingFallback}\n onMount={onMount}\n onChange={(value) => handleTextChange(value ?? \"\")}\n />\n {selectionOverlay.hasSelection && selectionOverlay.position && (\n <div\n role=\"toolbar\"\n aria-label={copy.selectionActions}\n data-ssml-editor-selection-actions=\"\"\n style={{\n ...styles.selectionActions,\n top: selectionOverlay.position.top,\n left: selectionOverlay.position.left,\n transform:\n selectionOverlay.placement === \"above\"\n ? \"translateY(calc(-100% - 0.5rem))\"\n : `translateY(calc(${selectionOverlay.position.height}px + 0.5rem))`,\n }}\n onMouseDown={(event) => event.preventDefault()}\n >\n <span style={styles.selectionCount} aria-live=\"polite\">\n {selectionOverlay.characterCount}\n {copy.selectionCountSuffix}\n </span>\n <span style={styles.selectionActionsDivider} aria-hidden=\"true\" />\n <button\n type=\"button\"\n style={styles.selectionActionButton}\n title={copy.previewSelectionTitle}\n disabled={!canPreviewSelection}\n onClick={previewSelection}\n >\n <span style={styles.selectionActionIcon} aria-hidden=\"true\">\n ▶\n </span>\n {copy.previewSelection}\n </button>\n </div>\n )}\n </div>\n {syntaxError && (\n <p style={styles.error} role=\"alert\">\n {copy.syntaxError}: {syntaxError.message}\n </p>\n )}\n </div>\n </section>\n );\n});\n","export type SsmlEditorInsertionButton =\n | \"break\"\n | \"emphasis\"\n | \"rate\"\n | \"pitch\"\n | \"volume\"\n | \"emotion\"\n | \"say-as\"\n | \"phoneme\"\n | \"audio\"\n | \"sub\"\n | \"lang\"\n | \"mark\"\n | \"bookmark\"\n | \"mstts:silence\"\n | \"mstts:viseme\"\n | (string & {});\n\nexport type SsmlEditorButton =\n | \"help\"\n | SsmlEditorInsertionButton\n | \"undo\"\n | \"redo\"\n | \"clearAll\"\n | \"format\"\n | \"decorations\"\n | (string & {});\n\nexport type SsmlEditorButtonVisibility = Readonly<Partial<Record<string, boolean>>>;\n\nexport function isSsmlEditorButtonVisible(\n buttonVisibility: SsmlEditorButtonVisibility | undefined,\n button: SsmlEditorButton | string,\n): boolean {\n return buttonVisibility?.[button] !== false;\n}\n","import type { CSSProperties, ReactElement, Ref } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { SsmlEditorInsertionDefinition, SsmlEditorInsertionOption } from \"../../SsmlEditor\";\nimport { editorStyles as styles } from \"../../styles/editorStyles\";\n\nexport interface InsertionOptionGroup {\n label: string;\n options: readonly SsmlEditorInsertionOption[];\n}\n\nexport interface InsertionPopoverProps {\n insertion: SsmlEditorInsertionDefinition;\n language: \"ja\" | \"en\";\n isDarkTheme: boolean;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n toolbarButtonStyle: CSSProperties;\n emptyOptionsMessage: string;\n isReadOnly: boolean;\n isOpen: boolean;\n menuPosition: { top: number; left: number } | null;\n menuRef: Ref<HTMLDivElement>;\n onToggle: (trigger: HTMLButtonElement) => void;\n onClose: () => void;\n onApply: (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption) => void;\n optionGroups?: readonly InsertionOptionGroup[];\n}\n\nfunction getInsertionTitle(insertion: SsmlEditorInsertionDefinition, language: \"ja\" | \"en\"): string {\n if (insertion.titles) {\n return insertion.titles[language];\n }\n\n const tag = insertion.tagName ? ` <${insertion.tagName}${insertion.selfClosing ? \"/>\" : \">\"}` : \"\";\n return `${insertion.labels[language]}${tag} — ${insertion.descriptions[language]}`;\n}\n\nexport function InsertionPopover({\n insertion,\n language,\n isDarkTheme,\n showToolbarIcons,\n showToolbarText,\n toolbarButtonStyle,\n emptyOptionsMessage,\n isReadOnly,\n isOpen,\n menuPosition,\n menuRef,\n onToggle,\n onClose,\n onApply,\n optionGroups,\n}: InsertionPopoverProps): ReactElement {\n const hasOptions = optionGroups\n ? optionGroups.some((group) => group.options.length > 0)\n : insertion.options.length > 0;\n const renderOption = (option: SsmlEditorInsertionOption): ReactElement => (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitem\"\n style={styles.toolbarOption}\n title={option.descriptions?.[language] ?? insertion.descriptions[language]}\n disabled={isReadOnly}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (!isReadOnly) {\n onApply(insertion, option);\n }\n onClose();\n }}\n >\n {option.labels[language]}\n </button>\n );\n const menu =\n isOpen && menuPosition && typeof document !== \"undefined\" ? (\n <div\n ref={menuRef}\n id={`ssml-editor-popover-${insertion.id}`}\n data-ssml-editor=\"\"\n data-theme={isDarkTheme ? \"dark\" : \"light\"}\n style={{ ...styles.toolbarMenu, top: menuPosition.top, left: menuPosition.left }}\n role=\"menu\"\n aria-label={insertion.labels[language]}\n >\n {!hasOptions ? (\n <div role=\"presentation\">\n <select disabled value=\"\" style={styles.toolbarEmptySelect}>\n <option value=\"\" disabled>\n {emptyOptionsMessage}\n </option>\n </select>\n </div>\n ) : optionGroups ? (\n optionGroups.map((group) => (\n <fieldset key={group.label} style={styles.toolbarOptionGroup}>\n <legend style={styles.toolbarOptionGroupLabel}>{group.label}</legend>\n {group.options.map(renderOption)}\n </fieldset>\n ))\n ) : (\n insertion.options.map(renderOption)\n )}\n </div>\n ) : null;\n\n return (\n <>\n <div style={styles.toolbarDropdown}>\n <button\n type=\"button\"\n style={toolbarButtonStyle}\n title={getInsertionTitle(insertion, language)}\n aria-label={insertion.labels[language]}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? `ssml-editor-popover-${insertion.id}` : undefined}\n onClick={(event) => onToggle(event.currentTarget)}\n >\n {showToolbarIcons && (\n <span style={styles.toolbarIcon} aria-hidden=\"true\">\n {insertion.icon}\n </span>\n )}\n {showToolbarText && <span>{insertion.labels[language]}</span>}\n <span style={styles.toolbarChevron} aria-hidden=\"true\">\n ▾\n </span>\n </button>\n </div>\n {menu && createPortal(menu, document.body)}\n </>\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { OVERLAY_Z_INDEX } from \"../constants/ui\";\n\nexport const editorStyles: Record<string, CSSProperties> = {\n container: {\n display: \"grid\",\n gap: \"0.75rem\",\n padding: \"1rem\",\n border: \"1px solid var(--ssml-editor-border)\",\n borderRadius: \"0.5rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n },\n toolbarContainer: {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n },\n toolbarActions: {\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n },\n toolbarSeparator: {\n width: \"1px\",\n height: \"2.25rem\",\n margin: \"0 0.25rem\",\n backgroundColor: \"var(--ssml-editor-border)\",\n },\n toolbarDropdown: {\n position: \"relative\",\n display: \"inline-block\",\n },\n toolbarSwitch: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n minHeight: \"2.25rem\",\n color: \"var(--ssml-editor-color)\",\n font: \"inherit\",\n },\n toolbarSwitchTrack: {\n display: \"inline-flex\",\n alignItems: \"center\",\n width: \"2.75rem\",\n height: \"1.5rem\",\n padding: \"0.1875rem\",\n border: 0,\n borderRadius: \"999px\",\n backgroundColor: \"var(--ssml-editor-control-border)\",\n cursor: \"pointer\",\n font: \"inherit\",\n transition: \"background-color 0.2s ease\",\n },\n toolbarSwitchThumb: {\n width: \"1.125rem\",\n height: \"1.125rem\",\n borderRadius: \"50%\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n transition: \"transform 0.2s ease\",\n },\n toolbarButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n minHeight: \"2.25rem\",\n padding: \"0.375rem 0.625rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n font: \"inherit\",\n cursor: \"pointer\",\n },\n toolbarButtonActive: {\n border: \"1px solid var(--ssml-editor-active-border)\",\n backgroundColor: \"var(--ssml-editor-active-bg)\",\n },\n display: {\n display: \"grid\",\n gap: \"0.5rem\",\n },\n toolbarIconOnly: {\n justifyContent: \"center\",\n minWidth: \"2.25rem\",\n padding: \"0.375rem\",\n },\n toolbarIcon: {\n display: \"inline-flex\",\n width: \"1.25rem\",\n justifyContent: \"center\",\n fontSize: \"1.1rem\",\n lineHeight: 1,\n },\n toolbarChevron: {\n fontSize: \"0.7rem\",\n lineHeight: 1,\n },\n toolbarMenu: {\n position: \"fixed\",\n zIndex: OVERLAY_Z_INDEX,\n display: \"grid\",\n minWidth: \"max-content\",\n maxHeight: \"min(24rem, calc(100vh - 1rem))\",\n gap: \"0.125rem\",\n padding: \"0.25rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n boxShadow: \"0 0.25rem 0.75rem rgb(0 0 0 / 20%)\",\n overflowY: \"auto\",\n },\n toolbarOption: {\n padding: \"0.375rem 0.5rem\",\n border: 0,\n borderRadius: \"0.125rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"transparent\",\n font: \"inherit\",\n textAlign: \"left\",\n whiteSpace: \"nowrap\",\n cursor: \"pointer\",\n },\n toolbarOptionGroup: {\n display: \"grid\",\n gap: \"0.125rem\",\n margin: 0,\n padding: 0,\n border: 0,\n },\n toolbarOptionGroupLabel: {\n padding: \"0.375rem 0.5rem 0.125rem\",\n color: \"var(--ssml-editor-color)\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n },\n toolbarEmpty: {\n margin: 0,\n padding: \"0.375rem 0.5rem\",\n color: \"var(--ssml-editor-color)\",\n whiteSpace: \"nowrap\",\n },\n toolbarEmptySelect: {\n padding: \"0.375rem 0.5rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.125rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n font: \"inherit\",\n textAlign: \"left\",\n },\n helpPanel: {\n display: \"grid\",\n gap: \"0.5rem\",\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-preview-bg)\",\n },\n helpHeading: {\n margin: 0,\n fontSize: \"1rem\",\n },\n helpDescription: {\n margin: 0,\n lineHeight: 1.5,\n },\n helpList: {\n display: \"grid\",\n gap: \"0.375rem\",\n margin: 0,\n paddingLeft: \"1.25rem\",\n },\n helpItem: {\n listStyleType: \"none\",\n lineHeight: 1.45,\n },\n helpIcon: {\n display: \"inline-flex\",\n width: \"1.25rem\",\n justifyContent: \"center\",\n fontSize: \"1.1rem\",\n lineHeight: 1.45,\n },\n helpSettingsAccordion: {\n marginTop: \"0.375rem\",\n overflow: \"hidden\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n },\n helpSettingsSummary: {\n display: \"grid\",\n gridTemplateColumns: \"1rem 1.25rem minmax(0, 1fr)\",\n columnGap: \"0.5rem\",\n alignItems: \"start\",\n padding: \"0.5rem 0.625rem\",\n cursor: \"pointer\",\n },\n helpSettingsSummaryContent: {\n minWidth: 0,\n },\n helpSettingsDescription: {\n margin: \"0.5rem 0.75rem 0\",\n fontSize: \"0.875rem\",\n },\n helpSettingsList: {\n display: \"grid\",\n gap: \"0.125rem\",\n margin: \"0.25rem 0.75rem 0.75rem\",\n paddingLeft: \"1.25rem\",\n fontSize: \"0.875rem\",\n },\n editor: {\n boxSizing: \"border-box\",\n position: \"relative\",\n width: \"100%\",\n minHeight: \"8rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n overflow: \"visible\",\n },\n selectionActions: {\n position: \"absolute\",\n zIndex: OVERLAY_Z_INDEX,\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"0.25rem\",\n maxWidth: \"calc(100% - 1rem)\",\n padding: \"0.25rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.375rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-control-bg)\",\n boxShadow: \"0 0.25rem 0.75rem rgb(0 0 0 / 20%)\",\n },\n selectionCount: {\n padding: \"0.25rem 0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n whiteSpace: \"nowrap\",\n },\n selectionActionsDivider: {\n width: \"1px\",\n height: \"1.5rem\",\n backgroundColor: \"var(--ssml-editor-border)\",\n },\n selectionActionButton: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n minHeight: \"1.75rem\",\n padding: \"0.25rem 0.375rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-color)\",\n backgroundColor: \"var(--ssml-editor-bg)\",\n font: \"inherit\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n },\n selectionActionIcon: {\n display: \"inline-flex\",\n width: \"1rem\",\n justifyContent: \"center\",\n lineHeight: 1,\n },\n error: {\n margin: 0,\n padding: \"0.5rem 0.75rem\",\n border: \"1px solid var(--ssml-editor-error)\",\n borderRadius: \"0.25rem\",\n color: \"var(--ssml-editor-error)\",\n backgroundColor: \"var(--ssml-editor-error-bg)\",\n lineHeight: 1.5,\n },\n};\n","import type { CSSProperties, ReactElement, Ref } from \"react\";\nimport type { SsmlEditorInsertionDefinition, SsmlEditorInsertionOption } from \"../../SsmlEditor\";\nimport { InsertionPopover, type InsertionOptionGroup } from \"./InsertionPopover\";\n\nexport interface InsertionPopoversProps {\n insertions: readonly SsmlEditorInsertionDefinition[];\n language: \"ja\" | \"en\";\n isDarkTheme: boolean;\n showToolbarIcons: boolean;\n showToolbarText: boolean;\n toolbarButtonStyle: CSSProperties;\n emptyOptionsMessage: string;\n isReadOnly: boolean;\n openPopoverId: string | null;\n menuPosition: { top: number; left: number } | null;\n menuRef: Ref<HTMLDivElement>;\n onToggle: (id: string, trigger: HTMLButtonElement) => void;\n onClose: () => void;\n onApply: (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption) => void;\n emptyOptionsMessages?: Readonly<Record<string, string>>;\n optionGroups?: Readonly<Record<string, readonly InsertionOptionGroup[]>>;\n}\n\nexport function InsertionPopovers({\n insertions,\n openPopoverId,\n onToggle,\n emptyOptionsMessages,\n optionGroups,\n ...props\n}: InsertionPopoversProps): ReactElement {\n return (\n <>\n {insertions.map((insertion) => (\n <InsertionPopover\n key={insertion.id}\n {...props}\n insertion={insertion}\n emptyOptionsMessage={emptyOptionsMessages?.[insertion.id] ?? props.emptyOptionsMessage}\n optionGroups={optionGroups?.[insertion.id]}\n isOpen={openPopoverId === insertion.id}\n onToggle={(trigger) => onToggle(insertion.id, trigger)}\n />\n ))}\n </>\n );\n}\n","import type { ReactElement } from \"react\";\nimport {\n getExpressAsStyleCategory,\n resolveExpressAsStyles,\n type ExpressAsStyleCategory,\n} from \"../../constants/ssmlPresets\";\nimport { EDITOR_COPY, type EditorCopy } from \"../../locales\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\nimport type { InsertionOptionGroup } from \"./InsertionPopover\";\n\nexport interface ProsodyPopoversProps extends InsertionPopoversProps {\n voiceName?: string;\n}\n\nconst CATEGORY_LABEL_KEYS = {\n emotions: \"categoryEmotions\",\n scenarios: \"categoryScenarios\",\n media: \"categoryMedia\",\n other: \"categoryOther\",\n} as const satisfies Record<ExpressAsStyleCategory, keyof EditorCopy>;\n\nconst CATEGORY_ORDER: readonly ExpressAsStyleCategory[] = [\"emotions\", \"scenarios\", \"media\", \"other\"];\n\nfunction isExpressAsInsertion(insertion: ProsodyPopoversProps[\"insertions\"][number]): boolean {\n return insertion.id === \"emotion\" && insertion.tagName?.toLowerCase() === \"mstts:express-as\";\n}\n\nfunction createOptionGroups(\n options: ProsodyPopoversProps[\"insertions\"][number][\"options\"],\n language: ProsodyPopoversProps[\"language\"],\n): readonly InsertionOptionGroup[] {\n const t = (key: keyof EditorCopy): string => EDITOR_COPY[language][key];\n\n return CATEGORY_ORDER.map((category) => ({\n label: t(CATEGORY_LABEL_KEYS[category]),\n options: options.filter((option) => getExpressAsStyleCategory(option.value) === category),\n })).filter((group) => group.options.length > 0);\n}\n\nexport function ProsodyPopovers({ insertions, voiceName, language, ...props }: ProsodyPopoversProps): ReactElement {\n const emptyOptionsMessages: Record<string, string> = {};\n const filteredInsertions = insertions.map((insertion) => {\n if (!isExpressAsInsertion(insertion)) {\n return insertion;\n }\n\n const availableStyles = new Set(\n resolveExpressAsStyles(\n voiceName,\n insertion.options.map((option) => option.value),\n ),\n );\n if (availableStyles.size === 0) {\n emptyOptionsMessages[insertion.id] = EDITOR_COPY[language].styleNotSupported;\n }\n const availableOptions = insertion.options.filter((option) => availableStyles.has(option.value));\n\n return {\n ...insertion,\n options: availableOptions,\n };\n });\n const optionGroups = Object.fromEntries(\n filteredInsertions\n .filter(isExpressAsInsertion)\n .map((insertion) => [insertion.id, createOptionGroups(insertion.options, language)]),\n );\n\n return (\n <InsertionPopovers\n {...props}\n emptyOptionsMessages={emptyOptionsMessages}\n language={language}\n insertions={filteredInsertions}\n optionGroups={optionGroups}\n />\n );\n}\n","import type { ReactElement } from \"react\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\n\nexport type TextPopoversProps = InsertionPopoversProps;\n\nexport function TextPopovers(props: TextPopoversProps): ReactElement {\n return <InsertionPopovers {...props} />;\n}\n","import type { ReactElement } from \"react\";\nimport { InsertionPopovers, type InsertionPopoversProps } from \"./InsertionPopovers\";\n\nexport type TimingPopoversProps = InsertionPopoversProps;\n\nexport function TimingPopovers(props: TimingPopoversProps): ReactElement {\n return <InsertionPopovers {...props} />;\n}\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { buildPartialSsml, buildSsml } from \"@ssml-builder-js/ssml-core\";\nimport type {\n ProsodyElement,\n SsmlDocument,\n SsmlElement,\n SsmlNode,\n SsmlPartialContext,\n VoiceElement,\n} from \"@ssml-builder-js/ssml-core\";\nimport type {\n SsmlEditorInsertionDefinition,\n SsmlEditorInsertionOption,\n SsmlEditorInsertionTemplate,\n SsmlEditorTheme,\n SelectionInfo,\n} from \"../SsmlEditor\";\nimport { clearSsmlDocument } from \"../clearSsmlDocument\";\nimport { formatXmlFragment } from \"../formatXml\";\nimport { getEditableRegion, getEditableText, updateEditableText } from \"../editableSsml\";\nimport { createSsmlInsertionEdit } from \"../ssmlInsertion\";\nimport { findSsmlVoiceContext, updateTagAttribute } from \"../ssmlContext\";\nimport type { MonacoEditor, SsmlSyntaxError } from \"../ssmlDiagnostics\";\nimport type { SsmlCodeLensAction } from \"../ssmlCodeLens\";\nimport { SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES } from \"../constants/ui\";\n\nconst TIMING_INSERTION_TAGS = new Set([\"break\", \"mstts:silence\"]);\nconst PROSODY_INSERTION_TAGS = new Set([\"prosody\", \"mstts:express-as\", \"voice\", \"emphasis\"]);\nconst TEXT_INSERTION_TAGS = new Set([\"sub\", \"say-as\", \"phoneme\", \"w\", \"lang\"]);\n\nexport interface SelectionOverlayState extends SelectionInfo {\n position: {\n top: number;\n left: number;\n height: number;\n } | null;\n placement: \"above\" | \"below\";\n}\n\nexport interface MonacoEditorRef {\n current: MonacoEditor | null;\n}\n\nexport interface UseSsmlEditorStateOptions {\n document: SsmlDocument;\n resolvedTheme: SsmlEditorTheme;\n showDecorations: boolean;\n onChange?: (document: SsmlDocument) => void;\n onSsmlChange?: (xml: string) => void;\n onSelectionChange?: (info: SelectionInfo) => void;\n onPreviewSelection?: (ssml: string) => void;\n injectTheme?: () => void;\n}\n\ninterface PendingCodeLensAttribute {\n insertionId: \"rate\" | \"pitch\" | \"break\";\n attributeName: \"rate\" | \"pitch\" | \"time\";\n tagRange: { start: number; end: number };\n modelVersionId: number;\n}\n\nconst EMPTY_SELECTION_OVERLAY: SelectionOverlayState = {\n selectedText: \"\",\n characterCount: 0,\n hasSelection: false,\n position: null,\n placement: \"above\",\n};\n\nfunction isSsmlElement(node: SsmlNode): node is SsmlElement {\n return typeof node !== \"string\" && node.type !== \"text\";\n}\n\nfunction isVoice(element: SsmlElement): element is VoiceElement {\n return element.type === \"voice\";\n}\n\nfunction isProsody(element: SsmlElement): element is ProsodyElement {\n return element.type === \"prosody\";\n}\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction getPartialContext(document: SsmlDocument): SsmlPartialContext {\n const children = getDocumentChildren(document);\n const voice = findFirstElement(children, isVoice);\n const prosody = findFirstElement(children, isProsody);\n const context: SsmlPartialContext = {\n version: document.version,\n lang: document.lang,\n };\n\n if (voice) {\n context.voice = {\n name: voice.name,\n effect: voice.effect,\n attributes: voice.attributes,\n };\n }\n\n if (prosody) {\n context.prosody = {\n rate: prosody.rate,\n pitch: prosody.pitch,\n volume: prosody.volume,\n contour: prosody.contour,\n range: prosody.range,\n attributes: prosody.attributes,\n };\n }\n\n return context;\n}\n\nfunction findFirstElement<T extends SsmlElement>(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => element is T,\n): T | undefined {\n for (const node of nodes) {\n if (!isSsmlElement(node)) {\n continue;\n }\n\n if (predicate(node)) {\n return node;\n }\n\n const child = findFirstElement(node.children ?? [], predicate);\n if (child) {\n return child;\n }\n }\n\n return undefined;\n}\n\nfunction getSelectionInfo(editor: MonacoEditor): SelectionInfo {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return {\n selectedText: \"\",\n characterCount: 0,\n hasSelection: false,\n };\n }\n\n const selectedText = model.getValueInRange(selection);\n return {\n selectedText,\n characterCount: selectedText.length,\n hasSelection: selectedText.length > 0,\n };\n}\n\nfunction getSelectionOverlayState(editor: MonacoEditor): SelectionOverlayState {\n const info = getSelectionInfo(editor);\n if (!info.hasSelection) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const selection = editor.getSelection();\n if (!selection) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const position = editor.getScrolledVisiblePosition(selection.getStartPosition());\n if (!position) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n const editorHeight = editor.getLayoutInfo().height;\n if (position.top + position.height < 0 || position.top > editorHeight) {\n return { ...info, position: null, placement: \"above\" };\n }\n\n return {\n ...info,\n position,\n placement: position.top >= SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES * position.height ? \"above\" : \"below\",\n };\n}\n\nfunction getCurrentLineText(editor: MonacoEditor): string | null {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return null;\n }\n\n const text = model.getLineContent(selection.positionLineNumber);\n return text.trim().length > 0 ? text : null;\n}\n\nfunction getSelectedText(editor: MonacoEditor): string | null {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return null;\n }\n\n const selectedText = model.getValueInRange(selection);\n return selectedText.length > 0 ? selectedText : getCurrentLineText(editor);\n}\n\nfunction getEffectiveVoiceName(editor: MonacoEditor, document: SsmlDocument): string | undefined {\n const model = editor.getModel();\n const selection = editor.getSelection();\n const outerVoiceName = getEditableRegion(document).voiceName;\n if (!model || !selection) {\n return outerVoiceName;\n }\n\n const offset = model.getOffsetAt(selection.getStartPosition());\n const voiceContext = findSsmlVoiceContext(model.getValue(), offset);\n return voiceContext === undefined ? outerVoiceName : voiceContext.voiceName;\n}\n\nfunction getSelectedSsml(editor: MonacoEditor, document: SsmlDocument): string | null {\n const selectedText = getSelectedText(editor);\n return selectedText === null ? null : buildPartialSsml(selectedText, getPartialContext(document));\n}\n\nfunction getCurrentLineSsml(editor: MonacoEditor, document: SsmlDocument): string | null {\n const currentLineText = getCurrentLineText(editor);\n return currentLineText === null ? null : buildPartialSsml(currentLineText, getPartialContext(document));\n}\n\nfunction applySsmlTemplate(editor: MonacoEditor, template: SsmlEditorInsertionTemplate): void {\n const model = editor.getModel();\n const selection = editor.getSelection();\n if (!model || !selection) {\n return;\n }\n\n const startOffset = model.getOffsetAt(selection.getStartPosition());\n const endOffset = model.getOffsetAt(selection.getEndPosition());\n const selectedText = selection.isEmpty() ? \"\" : model.getValueInRange(selection);\n const { replacement, selectionOffset } = createSsmlInsertionEdit(\n model.getValue(),\n startOffset,\n endOffset,\n template,\n model.getEOL(),\n selectedText,\n );\n\n editor.pushUndoStop();\n const applied = editor.executeEdits(\"ssml-toolbar\", [\n {\n range: selection,\n text: replacement,\n },\n ]);\n editor.pushUndoStop();\n if (!applied) {\n return;\n }\n\n const nextSelectionStart = model.getPositionAt(startOffset + selectionOffset);\n const nextSelectionEnd = model.getPositionAt(endOffset + selectionOffset);\n editor.setSelection({\n selectionStartLineNumber: nextSelectionStart.lineNumber,\n selectionStartColumn: nextSelectionStart.column,\n positionLineNumber: nextSelectionEnd.lineNumber,\n positionColumn: nextSelectionEnd.column,\n });\n editor.focus();\n}\n\nfunction applySsmlInsertion(\n editor: MonacoEditor,\n insertion: SsmlEditorInsertionDefinition,\n option: SsmlEditorInsertionOption,\n): void {\n applySsmlTemplate(editor, insertion.createTemplate(option.value));\n}\n\nexport function useSsmlEditorState({\n document,\n resolvedTheme,\n showDecorations,\n onChange,\n onSsmlChange,\n onSelectionChange,\n onPreviewSelection,\n injectTheme,\n}: UseSsmlEditorStateOptions) {\n const editorRef = useRef<MonacoEditor | null>(null);\n const [draftDocument, setDraftDocument] = useState(document);\n const [selectionOverlay, setSelectionOverlay] = useState<SelectionOverlayState>(EMPTY_SELECTION_OVERLAY);\n const [isDark, setIsDark] = useState(false);\n const [decorationsVisible, setDecorationsVisible] = useState(showDecorations);\n const [isHelpOpen, setIsHelpOpen] = useState(false);\n const [syntaxError, setSyntaxError] = useState<SsmlSyntaxError | null>(null);\n const [activeTags, setActiveTags] = useState<Set<string>>(() => new Set());\n const [openPopoverId, setOpenPopoverId] = useState<string | null>(null);\n const [popoverVoiceName, setPopoverVoiceName] = useState<string | undefined>(undefined);\n const [popoverPosition, setPopoverPosition] = useState<{ top: number; left: number } | null>(null);\n const pendingCodeLensAttributeRef = useRef<PendingCodeLensAttribute | null>(null);\n const helpPanelId = useId();\n const draftDocumentRef = useRef(document);\n const onSelectionChangeRef = useRef(onSelectionChange);\n const onPreviewSelectionRef = useRef(onPreviewSelection);\n const activePopoverTriggerRef = useRef<HTMLButtonElement | null>(null);\n const activePopoverMenuRef = useRef<HTMLDivElement | null>(null);\n\n draftDocumentRef.current = draftDocument;\n onSelectionChangeRef.current = onSelectionChange;\n onPreviewSelectionRef.current = onPreviewSelection;\n\n useEffect(() => {\n injectTheme?.();\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n setIsDark(mq.matches);\n const handler = (event: MediaQueryListEvent): void => setIsDark(event.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [injectTheme]);\n\n useEffect(() => {\n draftDocumentRef.current = document;\n setDraftDocument(document);\n }, [document]);\n\n useEffect(() => {\n setDecorationsVisible(showDecorations);\n }, [showDecorations]);\n\n const closePopover = useCallback((restoreFocus = false): void => {\n pendingCodeLensAttributeRef.current = null;\n setOpenPopoverId(null);\n setPopoverVoiceName(undefined);\n setPopoverPosition(null);\n if (restoreFocus) {\n activePopoverTriggerRef.current?.focus();\n }\n }, []);\n\n const togglePopover = useCallback((id: string, trigger: HTMLButtonElement): void => {\n pendingCodeLensAttributeRef.current = null;\n setOpenPopoverId((currentId) => {\n if (currentId === id) {\n setPopoverVoiceName(undefined);\n setPopoverPosition(null);\n return null;\n }\n activePopoverTriggerRef.current = trigger;\n setPopoverVoiceName(\n editorRef.current ? getEffectiveVoiceName(editorRef.current, draftDocumentRef.current) : undefined,\n );\n return id;\n });\n }, []);\n\n const setPopoverMenuRef = useCallback((menu: HTMLDivElement | null): void => {\n activePopoverMenuRef.current = menu;\n }, []);\n\n useEffect(() => {\n if (!openPopoverId) {\n setPopoverPosition(null);\n return;\n }\n\n const updatePopoverPosition = (): void => {\n const trigger = activePopoverTriggerRef.current;\n if (trigger) {\n const triggerBounds = trigger.getBoundingClientRect();\n setPopoverPosition({\n top: triggerBounds.bottom + 4,\n left: triggerBounds.left,\n });\n return;\n }\n\n const pending = pendingCodeLensAttributeRef.current;\n const editor = editorRef.current;\n const model = editor?.getModel();\n if (!pending || !editor || !model) {\n return;\n }\n\n const position = model.getPositionAt(pending.tagRange.start);\n const visiblePosition = editor.getScrolledVisiblePosition(position);\n const editorElement = editor.getDomNode();\n if (!visiblePosition || !editorElement) {\n return;\n }\n\n const editorBounds = editorElement.getBoundingClientRect();\n const menu = activePopoverMenuRef.current;\n const margin = 8;\n setPopoverPosition({\n top: Math.max(\n margin,\n Math.min(\n editorBounds.top + visiblePosition.top + visiblePosition.height + 4,\n window.innerHeight - (menu?.offsetHeight ?? 0) - margin,\n ),\n ),\n left: Math.max(\n margin,\n Math.min(editorBounds.left + visiblePosition.left, window.innerWidth - (menu?.offsetWidth ?? 0) - margin),\n ),\n });\n };\n const handlePointerDown = (event: PointerEvent): void => {\n const target = event.target;\n if (\n target instanceof Node &&\n !activePopoverTriggerRef.current?.contains(target) &&\n !activePopoverMenuRef.current?.contains(target)\n ) {\n closePopover();\n }\n };\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key === \"Escape\") {\n closePopover(true);\n }\n };\n\n updatePopoverPosition();\n window.addEventListener(\"resize\", updatePopoverPosition);\n window.addEventListener(\"scroll\", updatePopoverPosition, true);\n globalThis.document.addEventListener(\"pointerdown\", handlePointerDown);\n globalThis.document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n window.removeEventListener(\"resize\", updatePopoverPosition);\n window.removeEventListener(\"scroll\", updatePopoverPosition, true);\n globalThis.document.removeEventListener(\"pointerdown\", handlePointerDown);\n globalThis.document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [closePopover, openPopoverId]);\n\n const refreshSelectionOverlay = useCallback((editor: MonacoEditor, notify: boolean): void => {\n const nextSelection = getSelectionOverlayState(editor);\n setSelectionOverlay(nextSelection);\n if (notify) {\n onSelectionChangeRef.current?.({\n selectedText: nextSelection.selectedText,\n characterCount: nextSelection.characterCount,\n hasSelection: nextSelection.hasSelection,\n });\n }\n }, []);\n\n const updateActiveTags = useCallback((nextTags: ReadonlySet<string>): void => {\n setActiveTags((currentTags) => {\n if (currentTags.size === nextTags.size && [...currentTags].every((tag) => nextTags.has(tag))) {\n return currentTags;\n }\n return new Set(nextTags);\n });\n }, []);\n\n const commit = useCallback(\n (nextDocument: SsmlDocument): void => {\n draftDocumentRef.current = nextDocument;\n setDraftDocument(nextDocument);\n onChange?.(nextDocument);\n onSsmlChange?.(buildSsml(nextDocument));\n },\n [onChange, onSsmlChange],\n );\n\n const handleTextChange = useCallback(\n (value: string): void => {\n commit(updateEditableText(draftDocumentRef.current, value));\n if (editorRef.current) {\n refreshSelectionOverlay(editorRef.current, false);\n }\n },\n [commit, refreshSelectionOverlay],\n );\n\n const handleInsert = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n const editor = editorRef.current;\n const pending = pendingCodeLensAttributeRef.current;\n if (!editor) {\n return;\n }\n\n if (pending?.insertionId === insertion.id) {\n const model = editor.getModel();\n if (model && model.getVersionId() === pending.modelVersionId) {\n const source = model.getValue();\n const tagText = source.slice(pending.tagRange.start, pending.tagRange.end);\n const updatedTag = updateTagAttribute(\n tagText,\n { start: 0, end: tagText.length },\n pending.attributeName,\n option.value,\n );\n const start = model.getPositionAt(pending.tagRange.start);\n const end = model.getPositionAt(pending.tagRange.end);\n editor.pushUndoStop();\n editor.executeEdits(\"ssml-code-lens\", [\n {\n range: {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n },\n text: updatedTag,\n },\n ]);\n editor.pushUndoStop();\n editor.focus();\n }\n pendingCodeLensAttributeRef.current = null;\n if (!model || model.getVersionId() !== pending.modelVersionId) {\n closePopover();\n }\n return;\n }\n\n applySsmlInsertion(editor, insertion, option);\n },\n [closePopover],\n );\n const handleInsertBreak = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && TIMING_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n const handleInsertProsody = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && PROSODY_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n const handleInsertText = useCallback(\n (insertion: SsmlEditorInsertionDefinition, option: SsmlEditorInsertionOption): void => {\n if (insertion.tagName && TEXT_INSERTION_TAGS.has(insertion.tagName)) {\n handleInsert(insertion, option);\n }\n },\n [handleInsert],\n );\n\n const handleClear = useCallback((): void => {\n commit(clearSsmlDocument(draftDocumentRef.current));\n }, [commit]);\n\n const handleFormat = useCallback((): void => {\n const value = editorRef.current?.getValue() ?? getEditableText(draftDocumentRef.current);\n commit(updateEditableText(draftDocumentRef.current, formatXmlFragment(value)));\n }, [commit]);\n\n const handleUndo = useCallback((): void => {\n editorRef.current?.trigger(\"toolbar\", \"undo\", null);\n editorRef.current?.focus();\n }, []);\n\n const handleRedo = useCallback((): void => {\n editorRef.current?.trigger(\"toolbar\", \"redo\", null);\n editorRef.current?.focus();\n }, []);\n\n const previewSelection = useCallback((): void => {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n const selectedSsml = getSelectedSsml(editor, draftDocumentRef.current);\n if (selectedSsml !== null) {\n onPreviewSelectionRef.current?.(selectedSsml);\n }\n }, []);\n\n const getSelectedSsmlValue = useCallback(\n () => (editorRef.current ? getSelectedSsml(editorRef.current, draftDocumentRef.current) : null),\n [],\n );\n const getCurrentLineSsmlValue = useCallback(\n () => (editorRef.current ? getCurrentLineSsml(editorRef.current, draftDocumentRef.current) : null),\n [],\n );\n const getFullSsml = useCallback(\n () =>\n buildSsml(\n editorRef.current\n ? updateEditableText(draftDocumentRef.current, editorRef.current.getValue())\n : draftDocumentRef.current,\n ),\n [],\n );\n const getOuterVoiceName = useCallback(() => getEditableRegion(draftDocumentRef.current).voiceName, []);\n\n const handleCodeLensAction = useCallback((action: SsmlCodeLensAction): void => {\n const editor = editorRef.current;\n const model = editor?.getModel();\n if (!editor || !model) {\n return;\n }\n\n if (action.type === \"attribute\") {\n pendingCodeLensAttributeRef.current = {\n insertionId: action.insertionId,\n attributeName: action.attributeName,\n tagRange: action.tagRange,\n modelVersionId: model.getVersionId(),\n };\n activePopoverTriggerRef.current = null;\n setPopoverVoiceName(getEffectiveVoiceName(editor, draftDocumentRef.current));\n setOpenPopoverId(action.insertionId);\n setPopoverPosition(null);\n return;\n }\n\n const source = model.getValue();\n const toEditorRange = (range: { start: number; end: number }) => {\n const start = model.getPositionAt(range.start);\n const end = model.getPositionAt(range.end);\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n };\n };\n const edits =\n action.type === \"delete\"\n ? [{ range: toEditorRange(action.tagRange), text: \"\" }]\n : (() => {\n const elementText = source.slice(action.elementRange.start, action.elementRange.end);\n const closingOffset = elementText.search(/<\\/\\s*prosody\\s*>/i);\n const closingStart =\n closingOffset === -1 ? action.elementRange.end : action.elementRange.start + closingOffset;\n const closingEnd =\n closingOffset === -1\n ? action.elementRange.end\n : source.indexOf(\">\", closingStart) === -1\n ? action.elementRange.end\n : source.indexOf(\">\", closingStart) + 1;\n return [\n { range: toEditorRange(action.tagRange), text: \"\" },\n { range: toEditorRange({ start: closingStart, end: closingEnd }), text: \"\" },\n ];\n })();\n editor.pushUndoStop();\n editor.executeEdits(\"ssml-code-lens\", edits);\n editor.pushUndoStop();\n pendingCodeLensAttributeRef.current = null;\n setOpenPopoverId(null);\n setPopoverPosition(null);\n editor.focus();\n }, []);\n\n return {\n editorRef,\n draftDocument,\n text: getEditableText(draftDocument),\n selectionOverlay,\n activeTags,\n isDarkTheme: resolvedTheme === \"dark\" || (resolvedTheme === \"system\" && isDark),\n decorationsVisible,\n setDecorationsVisible,\n isHelpOpen,\n setIsHelpOpen,\n syntaxError,\n setSyntaxError,\n helpPanelId,\n commit,\n handleTextChange,\n handleInsert,\n handleInsertBreak,\n handleInsertProsody,\n handleInsertText,\n handleClear,\n handleFormat,\n handleUndo,\n handleRedo,\n previewSelection,\n canPreviewSelection: onPreviewSelection !== undefined,\n refreshSelectionOverlay,\n updateActiveTags,\n getSelectedSsml: getSelectedSsmlValue,\n getCurrentLineSsml: getCurrentLineSsmlValue,\n getFullSsml,\n getOuterVoiceName,\n handleCodeLensAction,\n openPopoverId,\n popoverVoiceName,\n popoverPosition,\n isPopoverOpen: (id: string) => openPopoverId === id,\n togglePopover,\n closePopover,\n setPopoverMenuRef,\n };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport type { Monaco, OnMount } from \"@monaco-editor/react\";\nimport { INLINE_BADGE_COPY, type SsmlEditorLanguage, type SsmlEditorLocale } from \"../locales\";\nimport {\n clearSsmlDiagnostics,\n type MonacoEditor,\n type MonacoModel,\n type SsmlSyntaxError,\n updateSsmlDiagnostics,\n} from \"../ssmlDiagnostics\";\nimport { registerSsmlCompletionProvider } from \"../ssmlCompletion\";\nimport { registerSsmlCodeActions } from \"../ssmlCodeAction\";\nimport { registerSsmlCodeLens, type SsmlCodeLensCallback } from \"../ssmlCodeLens\";\nimport { findSsmlHoverTarget, formatSsmlHover } from \"../ssmlHover\";\nimport { findActiveSsmlTags } from \"../ssmlContext\";\nimport type { MonacoEditorRef } from \"./useSsmlEditorState\";\n\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoDisposable = ReturnType<MonacoEditor[\"onDidChangeCursorSelection\"]>;\ntype MonacoContentDisposable = ReturnType<MonacoEditor[\"onDidChangeModelContent\"]>;\ntype MonacoCursorPositionDisposable = ReturnType<MonacoEditor[\"onDidChangeCursorPosition\"]>;\ntype MonacoCompletionDisposable = ReturnType<MonacoLanguages[\"registerCompletionItemProvider\"]>;\ntype MonacoCodeActionDisposable = ReturnType<MonacoLanguages[\"registerCodeActionProvider\"]>;\ntype MonacoCodeLensDisposable = ReturnType<MonacoLanguages[\"registerCodeLensProvider\"]>;\ntype MonacoHoverProvider = Parameters<MonacoLanguages[\"registerHoverProvider\"]>[1];\ntype MonacoHoverModel = Parameters<MonacoHoverProvider[\"provideHover\"]>[0];\ntype MonacoHoverPosition = Parameters<MonacoHoverProvider[\"provideHover\"]>[1];\ntype MonacoDecoration = Parameters<MonacoModel[\"deltaDecorations\"]>[1][number];\n\nconst SSML_DIAGNOSTICS_DEBOUNCE_MS = 300;\n\ninterface HoverProviderRegistration {\n disposable: ReturnType<MonacoLanguages[\"registerHoverProvider\"]>;\n references: number;\n}\n\nconst hoverProviderRegistrations = new WeakMap<MonacoLanguages, Map<SsmlEditorLocale, HoverProviderRegistration>>();\n\nexport interface UseSsmlMonacoOptions {\n editorRef?: MonacoEditorRef;\n language: SsmlEditorLanguage;\n text: string;\n decorationsVisible: boolean;\n enableCodeLens: boolean;\n getOuterVoiceName: () => string | undefined;\n onOpenPopover: SsmlCodeLensCallback;\n onSelectionOverlayChange: (editor: MonacoEditor, notify: boolean) => void;\n onActiveTagsChange: (tags: ReadonlySet<string>) => void;\n onSyntaxErrorChange: (error: SsmlSyntaxError | null) => void;\n}\n\nexport interface UseSsmlMonacoResult {\n editorRef: { current: MonacoEditor | null };\n onMount: OnMount;\n}\n\nfunction acquireSsmlHoverProvider(monaco: Monaco, locale: SsmlEditorLocale): () => void {\n const languages = monaco.languages;\n let registrations = hoverProviderRegistrations.get(languages);\n if (!registrations) {\n registrations = new Map();\n hoverProviderRegistrations.set(languages, registrations);\n }\n let registration = registrations.get(locale);\n\n if (!registration) {\n const provider: MonacoHoverProvider = {\n provideHover(model: MonacoHoverModel, position: MonacoHoverPosition) {\n const target = findSsmlHoverTarget(model.getValue(), position.lineNumber, position.column);\n if (!target) {\n return undefined;\n }\n\n return {\n contents: [\n {\n isTrusted: false,\n supportHtml: false,\n value: formatSsmlHover(target, locale),\n },\n ],\n range: target.range,\n };\n },\n };\n const disposable = languages.registerHoverProvider(\"xml\", provider);\n registration = { disposable, references: 0 };\n registrations.set(locale, registration);\n }\n\n registration.references += 1;\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n\n const currentRegistrations = hoverProviderRegistrations.get(languages);\n const current = currentRegistrations?.get(locale);\n if (!current) {\n return;\n }\n\n current.references -= 1;\n if (current.references === 0) {\n current.disposable.dispose();\n currentRegistrations?.delete(locale);\n if (currentRegistrations?.size === 0) {\n hoverProviderRegistrations.delete(languages);\n }\n }\n };\n}\n\nfunction getSsmlAttributeValue(tag: string, attributeName: string): string | undefined {\n const escapedAttributeName = attributeName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = tag.match(new RegExp(`\\\\b${escapedAttributeName}\\\\s*=\\\\s*(\"|')([^\"']*)\\\\1`, \"i\"));\n return match?.[2];\n}\n\nfunction getSsmlInlineDecorations(model: MonacoModel, value: string, language: SsmlEditorLanguage): MonacoDecoration[] {\n const decorations: MonacoDecoration[] = [];\n const tagPattern = /<(break|prosody)\\b[^>]*>/gi;\n const badgeCopy = INLINE_BADGE_COPY[language];\n\n for (const match of value.matchAll(tagPattern)) {\n const tag = match[0];\n const tagName = match[1].toLowerCase();\n const startOffset = match.index ?? 0;\n const endOffset = startOffset + tag.length;\n const start = model.getPositionAt(startOffset);\n const end = model.getPositionAt(endOffset);\n const pauseValue = getSsmlAttributeValue(tag, \"time\") ?? getSsmlAttributeValue(tag, \"strength\");\n const pitchValue =\n getSsmlAttributeValue(tag, \"pitch\") ??\n getSsmlAttributeValue(tag, \"contour\") ??\n getSsmlAttributeValue(tag, \"range\");\n const prosodyValue = pitchValue ?? getSsmlAttributeValue(tag, \"rate\") ?? getSsmlAttributeValue(tag, \"volume\");\n\n const badge =\n tagName === \"break\"\n ? `${badgeCopy.pause}${pauseValue ? ` ${pauseValue}` : \"\"}`\n : `${pitchValue ? badgeCopy.pitch : badgeCopy.prosody}${prosodyValue ? ` ${prosodyValue}` : \"\"}`;\n\n decorations.push({\n range: {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n },\n options: {\n after: {\n content: ` ${badge}`,\n inlineClassName: `ssml-editor-inline-badge ssml-editor-inline-badge-${tagName === \"break\" ? \"pause\" : \"prosody\"}`,\n },\n },\n });\n }\n\n return decorations;\n}\n\nfunction syncSsmlInlineDecorations(\n model: MonacoModel,\n value: string,\n language: SsmlEditorLanguage,\n showDecorations: boolean,\n decorationIds: string[],\n): string[] {\n return model.deltaDecorations(decorationIds, showDecorations ? getSsmlInlineDecorations(model, value, language) : []);\n}\n\nexport function useSsmlMonaco({\n editorRef: externalEditorRef,\n language,\n text,\n decorationsVisible,\n enableCodeLens,\n getOuterVoiceName,\n onOpenPopover,\n onSelectionOverlayChange,\n onActiveTagsChange,\n onSyntaxErrorChange,\n}: UseSsmlMonacoOptions): UseSsmlMonacoResult {\n const internalEditorRef = useRef<MonacoEditor | null>(null);\n const editorRef = useRef(externalEditorRef ?? internalEditorRef).current;\n const monacoRef = useRef<Monaco | null>(null);\n const completionProviderRef = useRef<MonacoCompletionDisposable | null>(null);\n const codeActionProviderRef = useRef<MonacoCodeActionDisposable | null>(null);\n const codeLensProviderRef = useRef<MonacoCodeLensDisposable | null>(null);\n const releaseHoverProviderRef = useRef<(() => void) | null>(null);\n const selectionChangeRef = useRef<MonacoDisposable | null>(null);\n const cursorPositionChangeRef = useRef<MonacoCursorPositionDisposable | null>(null);\n const diagnosticsChangeRef = useRef<MonacoContentDisposable | null>(null);\n const diagnosticsTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const selectionLayoutDisposablesRef = useRef<MonacoDisposable[]>([]);\n const inlineDecorationIdsRef = useRef<string[]>([]);\n const languageRef = useRef(language);\n const decorationsVisibleRef = useRef(decorationsVisible);\n const enableCodeLensRef = useRef(enableCodeLens);\n const getOuterVoiceNameRef = useRef(getOuterVoiceName);\n const onSelectionOverlayChangeRef = useRef(onSelectionOverlayChange);\n const onActiveTagsChangeRef = useRef(onActiveTagsChange);\n const onSyntaxErrorChangeRef = useRef(onSyntaxErrorChange);\n const onOpenPopoverRef = useRef(onOpenPopover);\n\n languageRef.current = language;\n decorationsVisibleRef.current = decorationsVisible;\n enableCodeLensRef.current = enableCodeLens;\n getOuterVoiceNameRef.current = getOuterVoiceName;\n onSelectionOverlayChangeRef.current = onSelectionOverlayChange;\n onActiveTagsChangeRef.current = onActiveTagsChange;\n onSyntaxErrorChangeRef.current = onSyntaxErrorChange;\n onOpenPopoverRef.current = onOpenPopover;\n\n const runSsmlDiagnostics = useCallback((editor: MonacoEditor, monaco: Monaco): void => {\n const model = editor.getModel();\n if (!model) {\n onSyntaxErrorChangeRef.current(null);\n return;\n }\n\n onSyntaxErrorChangeRef.current(updateSsmlDiagnostics(monaco, model));\n }, []);\n\n const scheduleSsmlDiagnostics = useCallback(\n (editor: MonacoEditor, monaco: Monaco): void => {\n if (diagnosticsTimeoutRef.current !== null) {\n clearTimeout(diagnosticsTimeoutRef.current);\n }\n\n diagnosticsTimeoutRef.current = setTimeout(() => {\n diagnosticsTimeoutRef.current = null;\n runSsmlDiagnostics(editor, monaco);\n }, SSML_DIAGNOSTICS_DEBOUNCE_MS);\n },\n [runSsmlDiagnostics],\n );\n\n const clearSsmlDiagnosticsResources = useCallback((): void => {\n if (diagnosticsTimeoutRef.current !== null) {\n clearTimeout(diagnosticsTimeoutRef.current);\n diagnosticsTimeoutRef.current = null;\n }\n diagnosticsChangeRef.current?.dispose();\n diagnosticsChangeRef.current = null;\n }, []);\n\n const syncActiveTags = useCallback((editor: MonacoEditor): void => {\n const model = editor.getModel();\n const position = editor.getPosition();\n if (!model || !position) {\n onActiveTagsChangeRef.current(new Set());\n return;\n }\n onActiveTagsChangeRef.current(findActiveSsmlTags(model.getValue(), model.getOffsetAt(position)));\n }, []);\n\n const disposeMonacoResources = useCallback((): void => {\n clearSsmlDiagnosticsResources();\n const model = editorRef.current?.getModel();\n if (model && monacoRef.current) {\n clearSsmlDiagnostics(monacoRef.current, model);\n inlineDecorationIdsRef.current = model.deltaDecorations(inlineDecorationIdsRef.current, []);\n }\n selectionChangeRef.current?.dispose();\n selectionChangeRef.current = null;\n cursorPositionChangeRef.current?.dispose();\n cursorPositionChangeRef.current = null;\n completionProviderRef.current?.dispose();\n completionProviderRef.current = null;\n codeActionProviderRef.current?.dispose();\n codeActionProviderRef.current = null;\n codeLensProviderRef.current?.dispose();\n codeLensProviderRef.current = null;\n for (const disposable of selectionLayoutDisposablesRef.current) {\n disposable.dispose();\n }\n selectionLayoutDisposablesRef.current = [];\n releaseHoverProviderRef.current?.();\n releaseHoverProviderRef.current = null;\n editorRef.current = null;\n monacoRef.current = null;\n }, [clearSsmlDiagnosticsResources, editorRef]);\n\n const onMount = useCallback<OnMount>(\n (editor, monaco) => {\n disposeMonacoResources();\n editorRef.current = editor;\n monacoRef.current = monaco;\n selectionChangeRef.current = editor.onDidChangeCursorSelection(() => {\n onSelectionOverlayChangeRef.current(editor, true);\n });\n cursorPositionChangeRef.current = editor.onDidChangeCursorPosition(() => {\n syncActiveTags(editor);\n });\n diagnosticsChangeRef.current = editor.onDidChangeModelContent(() => {\n const model = editor.getModel();\n if (model) {\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n model.getValue(),\n languageRef.current,\n decorationsVisibleRef.current,\n inlineDecorationIdsRef.current,\n );\n }\n syncActiveTags(editor);\n scheduleSsmlDiagnostics(editor, monaco);\n });\n selectionLayoutDisposablesRef.current = [\n editor.onDidScrollChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n editor.onDidLayoutChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n editor.onDidContentSizeChange(() => onSelectionOverlayChangeRef.current(editor, false)),\n ];\n completionProviderRef.current = registerSsmlCompletionProvider(monaco, {\n getOuterVoiceName: () => getOuterVoiceNameRef.current(),\n model: editor.getModel(),\n });\n codeActionProviderRef.current = registerSsmlCodeActions(monaco);\n if (enableCodeLensRef.current) {\n codeLensProviderRef.current = registerSsmlCodeLens(monaco, editor, (action) =>\n onOpenPopoverRef.current(action),\n );\n }\n releaseHoverProviderRef.current = acquireSsmlHoverProvider(monaco, languageRef.current);\n runSsmlDiagnostics(editor, monaco);\n const model = editor.getModel();\n if (model) {\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n editor.getValue(),\n languageRef.current,\n decorationsVisibleRef.current,\n inlineDecorationIdsRef.current,\n );\n }\n onSelectionOverlayChangeRef.current(editor, true);\n syncActiveTags(editor);\n },\n [disposeMonacoResources, editorRef, runSsmlDiagnostics, scheduleSsmlDiagnostics, syncActiveTags],\n );\n\n useEffect(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n if (!editor || !monaco) {\n return;\n }\n\n codeLensProviderRef.current?.dispose();\n codeLensProviderRef.current = enableCodeLens\n ? registerSsmlCodeLens(monaco, editor, (action) => onOpenPopoverRef.current(action))\n : null;\n }, [editorRef, enableCodeLens]);\n\n useEffect(() => {\n const monaco = monacoRef.current;\n if (!monaco) {\n return;\n }\n\n releaseHoverProviderRef.current?.();\n releaseHoverProviderRef.current = acquireSsmlHoverProvider(monaco, language);\n }, [language]);\n\n const previousTextRef = useRef<string | null>(null);\n useEffect(() => {\n const editor = editorRef.current;\n const monaco = monacoRef.current;\n const model = editor?.getModel();\n if (editor && model && monaco) {\n const previousText = previousTextRef.current;\n previousTextRef.current = text;\n inlineDecorationIdsRef.current = syncSsmlInlineDecorations(\n model,\n text,\n language,\n decorationsVisible,\n inlineDecorationIdsRef.current,\n );\n if (previousText === null || previousText !== text) {\n scheduleSsmlDiagnostics(editor, monaco);\n }\n }\n }, [decorationsVisible, editorRef, language, scheduleSsmlDiagnostics, text]);\n\n useEffect(() => disposeMonacoResources, [disposeMonacoResources]);\n\n return { editorRef, onMount };\n}\n","import type { Monaco, OnMount } from \"@monaco-editor/react\";\nimport { validateSsml } from \"@ssml-builder-js/ssml-core\";\nimport { SSML_ATTRIBUTE_PRESETS } from \"./constants/ssmlPresets\";\n\nconst EDITABLE_SSML_PREFIX = '<speak version=\"1.0\" xml:lang=\"en-US\">';\nconst EDITABLE_SSML_SUFFIX = \"</speak>\";\n\nexport const SSML_DIAGNOSTIC_OWNER = \"ssml\";\n\nexport const SSML_DIAGNOSTIC_CODES = {\n INVALID_ATTR_VALUE: \"INVALID_ATTR_VALUE\",\n MISSING_TIME_UNIT: \"MISSING_TIME_UNIT\",\n SYNTAX_ERROR: \"SSML_SYNTAX_ERROR\",\n UNCLOSED_TAG: \"UNCLOSED_TAG\",\n} as const;\n\nexport type SsmlDiagnosticCode = (typeof SSML_DIAGNOSTIC_CODES)[keyof typeof SSML_DIAGNOSTIC_CODES];\n\nexport type SsmlDiagnosticMarkerCode =\n | {\n value: typeof SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE;\n suggestedValue: string;\n }\n | {\n value: typeof SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG;\n target: string;\n };\n\nexport type MonacoEditor = Parameters<OnMount>[0];\nexport type MonacoModel = NonNullable<ReturnType<MonacoEditor[\"getModel\"]>>;\n\nexport interface SsmlSyntaxError {\n code: SsmlDiagnosticCode | SsmlDiagnosticMarkerCode;\n length?: number;\n message: string;\n offset: number;\n}\n\nconst MISSING_TIME_UNIT_PATTERN = /<break\\b[^>]*?\\s+time\\s*=\\s*([\"'])(\\s*)(\\d+(?:\\.\\d+)?)(\\s*)\\1/i;\nconst OPEN_TAG_PATTERN = /<([A-Za-z_][A-Za-z0-9_.:-]*)\\b((?:\"[^\"]*\"|'[^']*'|[^'\">])*)>/g;\nconst ATTRIBUTE_PATTERN = /([A-Za-z_][A-Za-z0-9_.:-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\nconst UNCLOSED_TAG_MESSAGE_PATTERN =\n /^(?:Unclosed XML element: <([^>]+)>|Mismatched closing element: expected <\\/([^>]+)> but found <\\/speak>)$/;\n\nfunction getSsmlAttributePresets(tagName: string, attributeName: string): readonly string[] | undefined {\n const tagPresets = Object.entries(SSML_ATTRIBUTE_PRESETS).find(\n ([presetTagName]) => presetTagName.toLowerCase() === tagName.toLowerCase(),\n )?.[1];\n\n return Object.entries(tagPresets ?? {}).find(\n ([presetAttributeName]) => presetAttributeName.toLowerCase() === attributeName.toLowerCase(),\n )?.[1];\n}\n\nfunction findInvalidAttribute(value: string): {\n attributeName: string;\n attributeValue: string;\n offset: number;\n suggestedValue: string;\n tagName: string;\n} | null {\n for (const tagMatch of value.matchAll(OPEN_TAG_PATTERN)) {\n const tagName = tagMatch[1];\n const tagContent = tagMatch[2];\n if (!tagName || tagContent === undefined) {\n continue;\n }\n\n for (const attributeMatch of tagContent.matchAll(ATTRIBUTE_PATTERN)) {\n const attributeName = attributeMatch[1];\n const quote = attributeMatch[2];\n const attributeValue = attributeMatch[3];\n if (!attributeName || !quote || attributeValue === undefined) {\n continue;\n }\n\n const presets = getSsmlAttributePresets(tagName, attributeName);\n if (!presets || presets.includes(attributeValue)) {\n continue;\n }\n\n const suggestedValue = presets.includes(\"x-fast\") ? \"x-fast\" : presets[0];\n if (!suggestedValue) {\n continue;\n }\n\n const attributeOffset = attributeMatch.index ?? 0;\n const quoteOffset = attributeMatch[0].indexOf(quote);\n return {\n attributeName,\n attributeValue,\n offset: (tagMatch.index ?? 0) + 1 + tagName.length + attributeOffset + quoteOffset + 1,\n suggestedValue,\n tagName,\n };\n }\n }\n\n return null;\n}\n\nexport function validateSsmlText(value: string): SsmlSyntaxError | null {\n if (!value.includes(\"<\")) {\n return null;\n }\n\n const source = `${EDITABLE_SSML_PREFIX}${value}${EDITABLE_SSML_SUFFIX}`;\n const validationError = validateSsml(source);\n if (!validationError) {\n const missingTimeUnit = MISSING_TIME_UNIT_PATTERN.exec(value);\n if (missingTimeUnit) {\n const numericValue = missingTimeUnit[3];\n const offset =\n (missingTimeUnit.index ?? 0) + missingTimeUnit[0].length - 1 - missingTimeUnit[4].length - numericValue.length;\n\n return {\n code: SSML_DIAGNOSTIC_CODES.MISSING_TIME_UNIT,\n length: numericValue.length,\n message: 'SSML time values must include a unit (\"ms\" or \"s\")',\n offset,\n };\n }\n\n const invalidAttribute = findInvalidAttribute(value);\n if (invalidAttribute) {\n return {\n code: {\n value: SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE,\n suggestedValue: invalidAttribute.suggestedValue,\n },\n length: invalidAttribute.attributeValue.length,\n message: `Invalid value \"${invalidAttribute.attributeValue}\" for ${invalidAttribute.tagName} attribute \"${invalidAttribute.attributeName}\"`,\n offset: invalidAttribute.offset,\n };\n }\n\n return null;\n }\n\n const unclosedTagMatch = UNCLOSED_TAG_MESSAGE_PATTERN.exec(validationError.message);\n const unclosedTag = unclosedTagMatch?.[1] ?? unclosedTagMatch?.[2];\n if (unclosedTag) {\n return {\n code: {\n value: SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG,\n target: unclosedTag,\n },\n message: `Unclosed XML element: <${unclosedTag}>`,\n offset: value.length,\n };\n }\n\n return {\n code: SSML_DIAGNOSTIC_CODES.SYNTAX_ERROR,\n message: validationError.message,\n offset: Math.min(Math.max(validationError.position - EDITABLE_SSML_PREFIX.length, 0), value.length),\n };\n}\n\ntype MonacoMarkerData = Parameters<Monaco[\"editor\"][\"setModelMarkers\"]>[2][number];\n\nexport function clearSsmlDiagnostics(monaco: Monaco, model: MonacoModel): void {\n monaco.editor.setModelMarkers(model, SSML_DIAGNOSTIC_OWNER, []);\n}\n\nexport function updateSsmlDiagnostics(monaco: Monaco, model: MonacoModel): SsmlSyntaxError | null {\n const value = model.getValue();\n const syntaxError = validateSsmlText(value);\n if (!syntaxError) {\n clearSsmlDiagnostics(monaco, model);\n return null;\n }\n\n const startOffset = value.length === 0 ? 0 : Math.min(syntaxError.offset, value.length - 1);\n const endOffset = Math.min(startOffset + (syntaxError.length ?? 1), value.length);\n const start = model.getPositionAt(startOffset);\n const end = model.getPositionAt(endOffset);\n\n monaco.editor.setModelMarkers(model, SSML_DIAGNOSTIC_OWNER, [\n {\n message: syntaxError.message,\n severity: monaco.MarkerSeverity.Error,\n code: syntaxError.code as unknown as MonacoMarkerData[\"code\"],\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n },\n ]);\n return syntaxError;\n}\n","import type { Monaco } from \"@monaco-editor/react\";\nimport { SSML_DIAGNOSTIC_CODES } from \"./ssmlDiagnostics\";\n\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoCodeActionProvider = Parameters<MonacoLanguages[\"registerCodeActionProvider\"]>[1];\ntype MonacoCodeActionMethod = NonNullable<MonacoCodeActionProvider[\"provideCodeActions\"]>;\ntype MonacoCodeActionModel = Parameters<MonacoCodeActionMethod>[0];\ntype MonacoCodeActionRange = Parameters<MonacoCodeActionMethod>[1];\ntype MonacoCodeActionContext = Parameters<MonacoCodeActionMethod>[2];\ntype MonacoCodeActionMarker = MonacoCodeActionContext[\"markers\"][number];\n\nconst MISSING_TIME_UNIT_ACTION_TITLE = '単位 \"ms\" を付与して修復';\n\ninterface StructuredMarkerCode {\n suggestedValue?: unknown;\n target?: unknown;\n value?: unknown;\n}\n\nfunction getStructuredMarkerCode(marker: MonacoCodeActionMarker): StructuredMarkerCode | undefined {\n return typeof marker.code === \"object\" && marker.code !== null\n ? (marker.code as unknown as StructuredMarkerCode)\n : undefined;\n}\n\nfunction createMissingTimeUnitAction(model: MonacoCodeActionModel, marker: MonacoCodeActionMarker) {\n return {\n title: MISSING_TIME_UNIT_ACTION_TITLE,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: `${model.getValueInRange(marker)}ms`,\n },\n },\n ],\n },\n };\n}\n\nfunction createUnclosedTagAction(model: MonacoCodeActionModel, marker: MonacoCodeActionMarker, target: string) {\n return {\n title: `閉じタグ \"</${target}>\" を自動挿入`,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.endLineNumber,\n startColumn: marker.endColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: `</${target}>`,\n },\n },\n ],\n },\n };\n}\n\nfunction createInvalidAttributeValueAction(\n model: MonacoCodeActionModel,\n marker: MonacoCodeActionMarker,\n suggestedValue: string,\n) {\n return {\n title: `\"${suggestedValue}\" に変更`,\n kind: \"quickfix\",\n isPreferred: true,\n diagnostics: [marker],\n edit: {\n edits: [\n {\n resource: model.uri,\n versionId: model.getVersionId(),\n textEdit: {\n range: {\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n },\n text: suggestedValue,\n },\n },\n ],\n },\n };\n}\n\nexport function registerSsmlCodeActions(monaco: Monaco): ReturnType<MonacoLanguages[\"registerCodeActionProvider\"]> {\n const provider: MonacoCodeActionProvider = {\n provideCodeActions(\n model: MonacoCodeActionModel,\n _range: MonacoCodeActionRange,\n context: MonacoCodeActionContext,\n ): ReturnType<MonacoCodeActionMethod> {\n const actions = context.markers.flatMap((marker: MonacoCodeActionMarker) => {\n if (marker.code === SSML_DIAGNOSTIC_CODES.MISSING_TIME_UNIT) {\n return [createMissingTimeUnitAction(model, marker)];\n }\n\n const structuredCode = getStructuredMarkerCode(marker);\n if (structuredCode?.value === SSML_DIAGNOSTIC_CODES.UNCLOSED_TAG && typeof structuredCode.target === \"string\") {\n return [createUnclosedTagAction(model, marker, structuredCode.target)];\n }\n if (\n structuredCode?.value === SSML_DIAGNOSTIC_CODES.INVALID_ATTR_VALUE &&\n typeof structuredCode.suggestedValue === \"string\"\n ) {\n return [createInvalidAttributeValueAction(model, marker, structuredCode.suggestedValue)];\n }\n\n return [];\n });\n\n return {\n actions,\n dispose() {},\n };\n },\n };\n\n return monaco.languages.registerCodeActionProvider(\"xml\", provider, {\n providedCodeActionKinds: [\"quickfix\"],\n });\n}\n","import type { Monaco } from \"@monaco-editor/react\";\nimport type { MonacoEditor } from \"./ssmlDiagnostics\";\nimport type { SsmlTagRange } from \"./ssmlContext\";\n\nexport type SsmlCodeLensAction =\n | {\n type: \"attribute\";\n insertionId: \"rate\" | \"pitch\" | \"break\";\n attributeName: \"rate\" | \"pitch\" | \"time\";\n tagRange: SsmlTagRange;\n }\n | {\n type: \"unwrap\" | \"delete\";\n tagRange: SsmlTagRange;\n elementRange: SsmlTagRange;\n };\n\nexport type SsmlCodeLensCallback = (action: SsmlCodeLensAction) => void;\n\ntype MonacoCodeLensProvider = Parameters<Monaco[\"languages\"][\"registerCodeLensProvider\"]>[1];\ntype MonacoCodeLensModel = Parameters<NonNullable<MonacoCodeLensProvider[\"provideCodeLenses\"]>>[0];\ntype MonacoCodeLens = NonNullable<\n Awaited<ReturnType<NonNullable<MonacoCodeLensProvider[\"provideCodeLenses\"]>>>\n>[\"lenses\"][number];\n\nconst CODE_LENS_COMMAND = \"ssml-editor.codeLens\";\n\nfunction findTagEnd(source: string, start: number): number {\n let quote: string | undefined;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n if (quote !== undefined) {\n if (character === quote) {\n quote = undefined;\n }\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === \">\") {\n return index;\n }\n }\n return -1;\n}\n\nfunction getAttributeValue(tag: string, attributeName: string): string | undefined {\n const escapedName = attributeName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return tag.match(new RegExp(`\\\\b${escapedName}\\\\s*=\\\\s*([\"'])([\\\\s\\\\S]*?)\\\\1`, \"i\"))?.[2];\n}\n\nfunction getTagRange(start: number, end: number): SsmlTagRange {\n return { start, end };\n}\n\nfunction getElementEnd(source: string, tagName: string, tagEnd: number): number {\n const openingTag = source.slice(0, tagEnd + 1);\n if (/\\/\\s*>$/.test(openingTag)) {\n return tagEnd + 1;\n }\n\n let depth = 1;\n let index = tagEnd + 1;\n while (index < source.length) {\n const nextStart = source.indexOf(\"<\", index);\n if (nextStart === -1) {\n break;\n }\n if (source.startsWith(\"<!--\", nextStart)) {\n index = source.indexOf(\"-->\", nextStart + 4);\n index = index === -1 ? source.length : index + 3;\n continue;\n }\n const nextEnd = findTagEnd(source, nextStart);\n if (nextEnd === -1) {\n break;\n }\n const nextTag = source.slice(nextStart, nextEnd + 1);\n const closingMatch = nextTag.match(/^<\\s*\\/\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n const openingMatch = nextTag.match(/^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (closingMatch?.[1]?.toLowerCase() === tagName) {\n depth -= 1;\n if (depth === 0) {\n return nextEnd + 1;\n }\n } else if (openingMatch?.[1]?.toLowerCase() === tagName && !/\\/\\s*>$/.test(nextTag)) {\n depth += 1;\n }\n index = nextEnd + 1;\n }\n return tagEnd + 1;\n}\n\nfunction createLens(\n model: MonacoCodeLensModel,\n start: number,\n end: number,\n title: string,\n action: SsmlCodeLensAction,\n): MonacoCodeLens {\n const startPosition = model.getPositionAt(start);\n const endPosition = model.getPositionAt(end);\n return {\n range: {\n startLineNumber: startPosition.lineNumber,\n startColumn: startPosition.column,\n endLineNumber: endPosition.lineNumber,\n endColumn: endPosition.column,\n },\n command: {\n id: CODE_LENS_COMMAND,\n title,\n arguments: [action],\n },\n };\n}\n\nexport function registerSsmlCodeLens(\n monaco: Monaco,\n editor: MonacoEditor,\n onOpenPopover: SsmlCodeLensCallback,\n): ReturnType<Monaco[\"languages\"][\"registerCodeLensProvider\"]> {\n const provider: MonacoCodeLensProvider = {\n provideCodeLenses(model: MonacoCodeLensModel) {\n const source = model.getValue();\n const lenses: MonacoCodeLens[] = [];\n let index = 0;\n\n while (index < source.length) {\n const tagStart = source.indexOf(\"<\", index);\n if (tagStart === -1) {\n break;\n }\n if (source.startsWith(\"<!--\", tagStart)) {\n index = source.indexOf(\"-->\", tagStart + 4);\n index = index === -1 ? source.length : index + 3;\n continue;\n }\n const tagEnd = findTagEnd(source, tagStart);\n if (tagEnd === -1) {\n break;\n }\n const tag = source.slice(tagStart, tagEnd + 1);\n const tagName = tag.match(/^<\\s*(prosody|break)\\b/i)?.[1]?.toLowerCase();\n index = tagEnd + 1;\n if (!tagName) {\n continue;\n }\n\n const tagRange = getTagRange(tagStart, tagEnd + 1);\n const elementEnd = getElementEnd(source, tagName, tagEnd);\n const elementRange = { start: tagStart, end: elementEnd };\n\n if (tagName === \"prosody\") {\n lenses.push(\n createLens(\n model,\n tagStart,\n tagEnd + 1,\n `⚡ Rate: ${getAttributeValue(tag, \"rate\") ?? \"default\"} (Click to edit)`,\n { type: \"attribute\", insertionId: \"rate\", attributeName: \"rate\", tagRange },\n ),\n createLens(\n model,\n tagStart,\n tagEnd + 1,\n `⚡ Pitch: ${getAttributeValue(tag, \"pitch\") ?? \"default\"} (Click to edit)`,\n { type: \"attribute\", insertionId: \"pitch\", attributeName: \"pitch\", tagRange },\n ),\n createLens(model, tagStart, tagEnd + 1, \"Unwrap\", {\n type: \"unwrap\",\n tagRange,\n elementRange,\n }),\n );\n } else if (/\\/\\s*>$/.test(tag)) {\n lenses.push(\n createLens(\n model,\n tagStart,\n tagEnd + 1,\n `⚡ Time: ${getAttributeValue(tag, \"time\") ?? \"default\"} (Click to edit)`,\n { type: \"attribute\", insertionId: \"break\", attributeName: \"time\", tagRange },\n ),\n createLens(model, tagStart, tagEnd + 1, \"Delete\", {\n type: \"delete\",\n tagRange,\n elementRange,\n }),\n );\n }\n }\n\n return { lenses, dispose: () => undefined };\n },\n };\n\n const disposable = monaco.languages.registerCodeLensProvider(\"xml\", provider);\n const commandHandler = (_accessor: unknown, ...args: unknown[]) => {\n const action = args[0];\n if (action && typeof action === \"object\" && \"type\" in action) {\n onOpenPopover(action as SsmlCodeLensAction);\n }\n };\n\n const commandDisposable =\n typeof monaco.editor?.registerCommand === \"function\"\n ? monaco.editor.registerCommand(CODE_LENS_COMMAND, commandHandler)\n : typeof monaco.registerCommand === \"function\"\n ? monaco.registerCommand(CODE_LENS_COMMAND, commandHandler)\n : editor.addAction({\n id: CODE_LENS_COMMAND,\n label: \"SSML CodeLens\",\n run: (_editor, ...args: unknown[]) => {\n const action = args[0];\n if (action && typeof action === \"object\" && \"type\" in action) {\n onOpenPopover(action as SsmlCodeLensAction);\n }\n },\n });\n\n return {\n dispose: () => {\n commandDisposable.dispose();\n disposable.dispose();\n },\n };\n}\n"],"mappings":"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","names":["document","useCallback","useEffect","useRef","useRef","useCallback","model","useEffect","SsmlEditor","document","getSelectedSsml","getCurrentLineSsml"]}
|