@ssml-builder-js/ssml-editor-react 2.14.0 → 2.16.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/CHANGELOG.md +18 -0
- package/dist/index.d.mts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +84 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/SsmlEditor.tsx +8 -0
- package/src/components/VisualSsmlEditor.tsx +87 -2
- package/test/ui-components.test.tsx +28 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/SsmlEditor.tsx","../src/buttonVisibility.ts","../src/constants/ssmlPresets.ts","../src/constants/azureVoiceStyleMap.generated.ts","../src/locales.ts","../src/constants/ui.ts","../src/components/popovers/InsertionPopover.tsx","../src/styles/editorStyles.ts","../src/components/popovers/InsertionPopovers.tsx","../src/components/popovers/ProsodyPopovers.tsx","../src/components/popovers/TextPopovers.tsx","../src/components/popovers/TimingPopovers.tsx","../src/hooks/useSsmlEditorState.ts","../src/clearSsmlDocument.ts","../src/formatXml.ts","../src/editableSsml.ts","../src/ssmlInsertion.ts","../src/ssmlContext.ts","../src/hooks/useSsmlMonaco.ts","../src/ssmlDiagnostics.ts","../src/ssmlCompletion.ts","../src/ssmlCodeAction.ts","../src/ssmlCodeLens.ts","../src/ssmlHover.ts","../src/components/VisualSsmlEditor.tsx"],"sourcesContent":["import { Fragment, forwardRef, useEffect, useImperativeHandle, useState } 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 AUDIO_DURATION_DESCRIPTIONS,\n AUDIO_DURATION_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\";\nimport {\n VisualSsmlEditor,\n type VisualInspectorRenderer,\n type VisualVoiceCatalogEntry,\n type VoiceSelectorRenderProps,\n} from \"./components/VisualSsmlEditor\";\nconst UNGROUPED_TOOLBAR_GROUP = \"__ssml-editor-ungrouped__\";\nconst TIMING_POPOVER_TAGS = new Set([\"break\", \"mstts:silence\", \"mstts:audioduration\"]);\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 {\n id: \"mstts:audioduration\",\n icon: \"◷\",\n tagName: \"mstts:audioduration\",\n selfClosing: true,\n labels: { ja: \"音声長\", en: \"Audio duration\" },\n descriptions: {\n ja: \"合成音声の目標時間を指定します。\",\n en: \"Sets the target duration of synthesized audio.\",\n },\n parameterDescription: {\n ja: \"目標時間を選択します。\",\n en: \"Selects the target duration.\",\n },\n options: createInsertionOptions(AUDIO_DURATION_PRESETS, AUDIO_DURATION_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:audioduration 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\", \"mstts:audioduration\"],\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[data-ssml-editor] .ssml-editor-visual-layout {\n display: grid;\n grid-template-columns: minmax(12rem, 0.35fr) minmax(16rem, 1fr);\n gap: 1rem;\n}\n[data-ssml-editor] .ssml-editor-visual-tree,\n[data-ssml-editor] .ssml-editor-visual-form {\n display: grid;\n gap: 0.5rem;\n align-content: start;\n}\n[data-ssml-editor] .ssml-editor-visual-tree ul {\n margin: 0;\n padding-left: 1.25rem;\n}\n[data-ssml-editor] .ssml-editor-visual-tree button,\n[data-ssml-editor] .ssml-editor-visual-breadcrumb button,\n[data-ssml-editor] .ssml-editor-visual-actions button {\n padding: 0.35rem 0.5rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-control-bg);\n cursor: pointer;\n}\n[data-ssml-editor] .ssml-editor-visual-tree button[aria-current] {\n border-color: var(--ssml-editor-active-border);\n background: var(--ssml-editor-active-bg);\n}\n[data-ssml-editor] .ssml-editor-visual-breadcrumb,\n[data-ssml-editor] .ssml-editor-visual-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n align-items: center;\n}\n[data-ssml-editor] .ssml-editor-visual-form textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 6rem;\n padding: 0.5rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-control-bg);\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n font: inherit;\n}\n[data-ssml-editor] .ssml-editor-visual-errors {\n padding: 0.5rem;\n color: var(--ssml-editor-error);\n background: var(--ssml-editor-error-bg);\n border: 1px solid var(--ssml-editor-error);\n border-radius: 0.25rem;\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 /** Selects the XML source editor or the structured visual editor. */\n editMode?: SsmlEditorEditMode;\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 /** Replaces the visual inspector for an element type or serialized tag name. */\n customInspectors?: Readonly<Record<string, VisualInspectorRenderer>>;\n /** Replaces the built-in voice catalog selector in visual mode. */\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n /** Voice metadata used by the visual selector. */\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n /** Optional locale filter for the visual voice selector. */\n voiceLocale?: string;\n /** Optional region filter for the visual voice selector. */\n voiceRegion?: string;\n /** Optional style filter for the visual voice selector. */\n voiceStyle?: string;\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 type SsmlEditorEditMode = \"code\" | \"visual\";\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 customInspectors,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n emotionStyles,\n className,\n style,\n toolbarClassName,\n toolbarStyle,\n displayClassName,\n displayStyle,\n loadingFallback,\n editMode: editModeProp = \"code\",\n }: SsmlEditorProps,\n ref,\n): ReactElement {\n const [editMode, setEditMode] = useState<SsmlEditorEditMode>(editModeProp);\n useEffect(() => setEditMode(editModeProp), [editModeProp]);\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 draftDocument,\n text,\n selectionOverlay,\n activeTags,\n isDarkTheme,\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,\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 <span style={styles.toolbarSeparator} aria-hidden=\"true\" />\n <button\n type=\"button\"\n style={\n editMode === \"visual\" ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive } : toolbarButtonStyle\n }\n aria-pressed={editMode === \"visual\"}\n onClick={() => setEditMode(\"visual\")}\n >\n Visual\n </button>\n <button\n type=\"button\"\n style={\n editMode === \"code\" ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive } : toolbarButtonStyle\n }\n aria-pressed={editMode === \"code\"}\n onClick={() => setEditMode(\"code\")}\n >\n Code\n </button>\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 {editMode === \"visual\" ? (\n <div style={styles.visual}>\n <VisualSsmlEditor\n document={draftDocument}\n readOnly={isReadOnly}\n onChange={commit}\n onPreviewSelection={onPreviewSelection}\n locale={localeProp ?? languageProp}\n customInspectors={customInspectors}\n renderVoiceSelector={renderVoiceSelector}\n voiceCatalog={voiceCatalog}\n voiceLocale={voiceLocale}\n voiceRegion={voiceRegion}\n voiceStyle={voiceStyle}\n />\n </div>\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 )}\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:audioduration\"\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","type SsmlPresetDescription = Readonly<Record<\"ja\" | \"en\", string>>;\n\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { AZURE_VOICE_STYLE_MAP } from \"./azureVoiceStyleMap.generated.ts\";\n\nexport interface SsmlPreset {\n id: string;\n label: string;\n ssml: string;\n description?: string;\n}\n\nexport const SSML_PRESETS: readonly SsmlPreset[] = [\n {\n id: \"basic\",\n label: \"Basic speech\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\">Hello, world!</speak>',\n description: \"A minimal SSML document.\",\n },\n {\n id: \"voice\",\n label: \"Voice selection\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello, world!</voice></speak>',\n description: \"Speaks text with a selected voice.\",\n },\n {\n id: \"prosody\",\n label: \"Prosody\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\"><prosody rate=\"fast\" pitch=\"+2st\">Hello, world!</prosody></speak>',\n description: \"Adjusts the speech rate and pitch.\",\n },\n] as const;\n\nexport const BREAK_TIME_PRESETS = [\"500ms\", \"1s\", \"2s\", \"3s\"] as const;\nexport const BREAK_STRENGTH_PRESETS = [\"none\", \"x-weak\", \"weak\", \"medium\", \"strong\", \"x-strong\"] as const;\n\nexport const PROSODY_RATE_PRESETS = [\"x-slow\", \"slow\", \"medium\", \"fast\", \"x-fast\"] as const;\nexport const PROSODY_RATE_VALUES = [...PROSODY_RATE_PRESETS, \"percentage\"] as const;\nexport const PROSODY_PITCH_PRESETS = [\"+2st\", \"-2st\", \"0st\", \"+4st\", \"-4st\", \"+8st\", \"-8st\", \"+12st\", \"-12st\"] as const;\nexport const PROSODY_VOLUME_PRESETS = [\"silent\", \"x-soft\", \"soft\", \"medium\", \"loud\", \"x-loud\"] as const;\n\nexport const EXPRESS_AS_STYLE_PRESETS = [\n \"cheerful\",\n \"friendly\",\n \"calm\",\n \"sad\",\n \"angry\",\n \"excited\",\n \"serious\",\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"hopeful\",\n \"newscast\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n \"empathetic\",\n \"relieved\",\n \"fearful\",\n \"depressed\",\n \"disgruntled\",\n \"embarrassed\",\n \"narration-relaxed\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n] as const;\nexport type ExpressAsStyle = (typeof EXPRESS_AS_STYLE_PRESETS)[number];\n\nexport const EXPRESS_AS_STYLE_CATEGORIES = {\n emotions: [\n \"cheerful\",\n \"sad\",\n \"angry\",\n \"calm\",\n \"fearful\",\n \"depressed\",\n \"disgruntled\",\n \"embarrassed\",\n \"empathetic\",\n \"envious\",\n \"excited\",\n \"friendly\",\n \"gentle\",\n \"hopeful\",\n \"relieved\",\n \"serious\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n scenarios: [\"chat\", \"customerservice\", \"assistant\", \"livecommercial\", \"poetry-reading\", \"story\"],\n media: [\n \"newscast\",\n \"newscast-casual\",\n \"newscast-formal\",\n \"narration-professional\",\n \"narration-relaxed\",\n \"documentary-narration\",\n \"advertisement_upbeat\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n ],\n} as const;\n\nexport type ExpressAsStyleCategory = keyof typeof EXPRESS_AS_STYLE_CATEGORIES | \"other\";\n\nexport function getExpressAsStyleCategory(style: string): ExpressAsStyleCategory {\n for (const [category, styles] of Object.entries(EXPRESS_AS_STYLE_CATEGORIES) as [\n keyof typeof EXPRESS_AS_STYLE_CATEGORIES,\n readonly string[],\n ][]) {\n if (styles.includes(style)) {\n return category;\n }\n }\n\n return \"other\";\n}\n\nconst LEGACY_VOICE_STYLE_MAP = {\n \"ja-JP-MayuNeural\": [\"calm\", \"cheerful\", \"sad\"],\n \"ja-JP-KeitaNeural\": [\"chat\"],\n \"ja-JP-NanamiNeural\": [\"chat\", \"customerservice\", \"cheerful\", \"whispering\", \"sad\"],\n \"en-US-JennyMultilingualNeural\": [\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-AndrewNeural\": [\"empathetic\", \"relieved\"],\n \"en-US-JennyNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-GuyNeural\": [\n \"angry\",\n \"cheerful\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"newscast\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"ko-KR-SunHiNeural\": [\"cheerful\", \"sad\"],\n \"zh-CN-XiaoxiaoNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"terrified\",\n \"whispering\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n ],\n \"zh-CN-YunxiNeural\": [\n \"narration-relaxed\",\n \"embarrassed\",\n \"fearful\",\n \"sad\",\n \"disgruntled\",\n \"serious\",\n \"angry\",\n \"depressed\",\n \"chat\",\n \"cheerful\",\n \"assistant\",\n ],\n \"fr-FR-DeniseNeural\": [\"cheerful\", \"sad\"],\n \"fr-FR-HenriNeural\": [\"cheerful\", \"sad\"],\n \"pt-BR-FranciscaNeural\": [\"calm\"],\n \"it-IT-ElsaNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-KatjaNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-ConradNeural\": [\"cheerful\", \"sad\"],\n \"ru-RU-SvetlanaNeural\": [\"cheerful\", \"sad\", \"angry\", \"disgruntled\", \"embarrassed\", \"fearful\"],\n} as const satisfies Readonly<Record<string, readonly ExpressAsStyle[]>>;\n\n/** Snapshot generated from Azure's List Voices API. The legacy map is only a safety fallback for an empty generated file. */\nexport const VOICE_STYLE_MAP =\n Object.keys(AZURE_VOICE_STYLE_MAP).length > 0 ? AZURE_VOICE_STYLE_MAP : LEGACY_VOICE_STYLE_MAP;\n\nconst VOICE_STYLE_MAP_BY_NORMALIZED_NAME = new Map<string, readonly string[]>(\n Object.entries(VOICE_STYLE_MAP).map(([voiceName, styles]) => [voiceName.toLowerCase(), styles]),\n);\n\nexport function resolveExpressAsStyles(\n voiceName: string | null | undefined,\n candidates: readonly string[] = EXPRESS_AS_STYLE_PRESETS,\n): readonly string[] {\n const normalizedVoiceName = voiceName?.trim().toLowerCase();\n if (!normalizedVoiceName) {\n return candidates;\n }\n\n const supportedStyles = VOICE_STYLE_MAP_BY_NORMALIZED_NAME.get(normalizedVoiceName);\n if (supportedStyles === undefined) {\n return [];\n }\n\n const supportedStyleSet = new Set<string>(supportedStyles);\n return candidates.filter((style) => supportedStyleSet.has(style));\n}\nexport const EXPRESS_AS_ROLE_PRESETS = [\n \"Girl\",\n \"Boy\",\n \"YoungAdultFemale\",\n \"YoungAdultMale\",\n \"OlderAdultFemale\",\n \"OlderAdultMale\",\n \"SeniorFemale\",\n \"SeniorMale\",\n] as const;\nexport const EMPHASIS_LEVEL_PRESETS = [\"strong\", \"moderate\", \"reduced\", \"none\"] as const;\nexport const SAY_AS_PRESETS = [\n \"characters\",\n \"spell-out\",\n \"cardinal\",\n \"ordinal\",\n \"number\",\n \"date\",\n \"time\",\n \"telephone\",\n \"fraction\",\n \"address\",\n \"name\",\n \"currency\",\n] as const;\nexport const LANGUAGE_PRESETS = [\"ja-JP\", \"en-US\", \"de-DE\", \"fr-FR\"] as const;\nexport const SILENCE_VALUE_PRESETS = [\"300ms\", \"500ms\", \"1s\"] as const;\nexport const AUDIO_DURATION_PRESETS = [\"5s\", \"10s\", \"30s\"] as const;\nexport const BACKGROUND_AUDIO_DURATION_PRESETS = [\"0\", \"500\", \"1000\", \"3000\", \"10000\"] as const;\nexport const SILENCE_TYPE_PRESETS = [\n \"Leading\",\n \"Tailing\",\n \"Sentenceboundary\",\n \"Comma\",\n \"Semicolon\",\n \"Enumerationcomma\",\n] as const;\nexport const AUDIO_DURATION_DESCRIPTIONS = {\n \"5s\": { ja: \"5秒\", en: \"5 seconds\" },\n \"10s\": { ja: \"10秒\", en: \"10 seconds\" },\n \"30s\": { ja: \"30秒\", en: \"30 seconds\" },\n} as const;\nexport const PHONEME_ALPHABET_PRESETS = [\"ipa\", \"sapi\", \"ups\", \"x-sampa\"] as const;\nexport const VISEME_TYPE_PRESETS = [\"redlips_front\", \"FacialExpression\"] as const;\n\nexport const SSML_ATTRIBUTE_PRESETS = {\n break: {\n strength: BREAK_STRENGTH_PRESETS,\n time: BREAK_TIME_PRESETS,\n },\n prosody: {\n rate: PROSODY_RATE_PRESETS,\n pitch: PROSODY_PITCH_PRESETS,\n volume: PROSODY_VOLUME_PRESETS,\n },\n \"mstts:express-as\": {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n \"express-as\": {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n expressAs: {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n \"say-as\": {\n \"interpret-as\": SAY_AS_PRESETS,\n },\n sayAs: {\n \"interpret-as\": SAY_AS_PRESETS,\n },\n emphasis: {\n level: EMPHASIS_LEVEL_PRESETS,\n },\n lang: {\n \"xml:lang\": LANGUAGE_PRESETS,\n },\n phoneme: {\n alphabet: PHONEME_ALPHABET_PRESETS,\n },\n \"mstts:silence\": {\n type: SILENCE_TYPE_PRESETS,\n value: SILENCE_VALUE_PRESETS,\n },\n \"mstts:audioduration\": {\n value: AUDIO_DURATION_PRESETS,\n },\n \"mstts:backgroundaudio\": {\n volume: PROSODY_VOLUME_PRESETS,\n fadein: BACKGROUND_AUDIO_DURATION_PRESETS,\n fadeout: BACKGROUND_AUDIO_DURATION_PRESETS,\n },\n silence: {\n type: SILENCE_TYPE_PRESETS,\n value: SILENCE_VALUE_PRESETS,\n },\n \"mstts:viseme\": {\n type: VISEME_TYPE_PRESETS,\n },\n viseme: {\n type: VISEME_TYPE_PRESETS,\n },\n} as const satisfies Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>;\n\nexport const SSML_PRESET_EXAMPLES = {\n breakTime: \"500ms\",\n prosodyRate: \"fast\",\n prosodyPitch: \"+2st\",\n prosodyVolume: \"loud\",\n expressAsStyle: \"cheerful\",\n phonemeAlphabet: \"ipa\",\n silenceValue: \"300ms\",\n} as const satisfies {\n breakTime: (typeof BREAK_TIME_PRESETS)[number];\n prosodyRate: (typeof PROSODY_RATE_PRESETS)[number];\n prosodyPitch: (typeof PROSODY_PITCH_PRESETS)[number];\n prosodyVolume: (typeof PROSODY_VOLUME_PRESETS)[number];\n expressAsStyle: (typeof EXPRESS_AS_STYLE_PRESETS)[number];\n phonemeAlphabet: (typeof PHONEME_ALPHABET_PRESETS)[number];\n silenceValue: (typeof SILENCE_VALUE_PRESETS)[number];\n};\n\nexport const BREAK_TIME_DESCRIPTIONS = {\n \"500ms\": {\n ja: \"500ミリ秒の無音\",\n en: \"Inserts 500 milliseconds of silence.\",\n },\n \"1s\": {\n ja: \"1秒の無音\",\n en: \"Inserts one second of silence.\",\n },\n \"2s\": {\n ja: \"2秒の無音\",\n en: \"Inserts two seconds of silence.\",\n },\n \"3s\": {\n ja: \"3秒の無音\",\n en: \"Inserts three seconds of silence.\",\n },\n} as const satisfies Readonly<Record<(typeof BREAK_TIME_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const EMPHASIS_LEVEL_DESCRIPTIONS = {\n strong: {\n ja: \"強い強調\",\n en: \"Applies strong emphasis.\",\n },\n moderate: {\n ja: \"中程度の強調\",\n en: \"Applies moderate emphasis.\",\n },\n reduced: {\n ja: \"弱めの強調\",\n en: \"Applies reduced emphasis.\",\n },\n none: {\n ja: \"強調なし\",\n en: \"Applies no emphasis.\",\n },\n} as const satisfies Readonly<Record<(typeof EMPHASIS_LEVEL_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_RATE_DESCRIPTIONS = {\n \"x-slow\": {\n ja: \"最も遅い速度\",\n en: \"Uses the slowest speech rate.\",\n },\n slow: {\n ja: \"遅い速度\",\n en: \"Uses a slow speech rate.\",\n },\n medium: {\n ja: \"標準的な速度\",\n en: \"Uses the standard speech rate.\",\n },\n fast: {\n ja: \"速い速度\",\n en: \"Uses a fast speech rate.\",\n },\n \"x-fast\": {\n ja: \"最も速い速度\",\n en: \"Uses the fastest speech rate.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_RATE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_PITCH_DESCRIPTIONS = {\n \"+2st\": {\n ja: \"基準の声の高さより2半音上\",\n en: \"Raises the pitch by two semitones.\",\n },\n \"-2st\": {\n ja: \"基準の声の高さより2半音下\",\n en: \"Lowers the pitch by two semitones.\",\n },\n \"0st\": {\n ja: \"基準の声の高さ\",\n en: \"Keeps the baseline pitch.\",\n },\n \"+4st\": {\n ja: \"基準の声の高さより4半音上\",\n en: \"Raises the pitch by four semitones.\",\n },\n \"-4st\": {\n ja: \"基準の声の高さより4半音下\",\n en: \"Lowers the pitch by four semitones.\",\n },\n \"+8st\": {\n ja: \"基準の声の高さより8半音上\",\n en: \"Raises the pitch by eight semitones.\",\n },\n \"-8st\": {\n ja: \"基準の声の高さより8半音下\",\n en: \"Lowers the pitch by eight semitones.\",\n },\n \"+12st\": {\n ja: \"基準の声の高さより12半音上\",\n en: \"Raises the pitch by twelve semitones.\",\n },\n \"-12st\": {\n ja: \"基準の声の高さより12半音下\",\n en: \"Lowers the pitch by twelve semitones.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_PITCH_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_VOLUME_DESCRIPTIONS = {\n silent: {\n ja: \"無音\",\n en: \"Makes the selected text silent.\",\n },\n \"x-soft\": {\n ja: \"最も小さい音量\",\n en: \"Uses the quietest volume.\",\n },\n soft: {\n ja: \"小さい音量\",\n en: \"Uses a soft volume.\",\n },\n medium: {\n ja: \"標準的な音量\",\n en: \"Uses the standard volume.\",\n },\n loud: {\n ja: \"大きい音量\",\n en: \"Uses a loud volume.\",\n },\n \"x-loud\": {\n ja: \"最も大きい音量\",\n en: \"Uses the loudest volume.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_VOLUME_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const EXPRESS_AS_STYLE_DESCRIPTIONS = {\n cheerful: {\n ja: \"明るく元気なスタイル\",\n en: \"Uses a cheerful style.\",\n },\n friendly: {\n ja: \"親しみやすいスタイル\",\n en: \"Uses a friendly style.\",\n },\n calm: {\n ja: \"穏やかなスタイル\",\n en: \"Uses a calm style.\",\n },\n sad: {\n ja: \"悲しげなスタイル\",\n en: \"Uses a sad style.\",\n },\n angry: {\n ja: \"怒ったようなスタイル\",\n en: \"Uses an angry style.\",\n },\n excited: {\n ja: \"興奮したスタイル\",\n en: \"Uses an excited style.\",\n },\n empathetic: {\n ja: \"共感を示すスタイル\",\n en: \"Uses an empathetic style.\",\n },\n relieved: {\n ja: \"安心したスタイル\",\n en: \"Uses a relieved style.\",\n },\n fearful: {\n ja: \"恐れを感じさせるスタイル\",\n en: \"Uses a fearful style.\",\n },\n depressed: {\n ja: \"落ち込んだスタイル\",\n en: \"Uses a depressed style.\",\n },\n disgruntled: {\n ja: \"不満を感じさせるスタイル\",\n en: \"Uses a disgruntled style.\",\n },\n embarrassed: {\n ja: \"恥ずかしそうなスタイル\",\n en: \"Uses an embarrassed style.\",\n },\n serious: {\n ja: \"真剣なスタイル\",\n en: \"Uses a serious style.\",\n },\n assistant: {\n ja: \"デジタルアシスタント向けのスタイル\",\n en: \"Uses a digital assistant style.\",\n },\n chat: {\n ja: \"会話向けのスタイル\",\n en: \"Uses a conversational style.\",\n },\n customerservice: {\n ja: \"カスタマーサービス向けのスタイル\",\n en: \"Uses a customer service style.\",\n },\n hopeful: {\n ja: \"希望に満ちたスタイル\",\n en: \"Uses a hopeful style.\",\n },\n newscast: {\n ja: \"ニュース読み上げ向けのスタイル\",\n en: \"Uses a newscast style.\",\n },\n shouting: {\n ja: \"叫ぶようなスタイル\",\n en: \"Uses a shouting style.\",\n },\n terrified: {\n ja: \"恐怖に満ちたスタイル\",\n en: \"Uses a terrified style.\",\n },\n unfriendly: {\n ja: \"無愛想なスタイル\",\n en: \"Uses an unfriendly style.\",\n },\n whispering: {\n ja: \"ささやくようなスタイル\",\n en: \"Uses a whispering style.\",\n },\n \"narration-relaxed\": {\n ja: \"リラックスしたナレーション向けのスタイル\",\n en: \"Uses a relaxed narration style.\",\n },\n \"poetry-reading\": {\n ja: \"詩の朗読向けのスタイル\",\n en: \"Uses a poetry-reading style.\",\n },\n sports_commentary: {\n ja: \"スポーツ実況向けのスタイル\",\n en: \"Uses a sports commentary style.\",\n },\n sports_commentary_excited: {\n ja: \"興奮したスポーツ実況向けのスタイル\",\n en: \"Uses an excited sports commentary style.\",\n },\n story: {\n ja: \"物語の朗読向けのスタイル\",\n en: \"Uses a storytelling style.\",\n },\n} as const satisfies Readonly<Record<(typeof EXPRESS_AS_STYLE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const SAY_AS_DESCRIPTIONS = {\n characters: {\n ja: \"1文字ずつの読み上げ\",\n en: \"Speaks the characters one by one.\",\n },\n \"spell-out\": {\n ja: \"綴りの読み上げ(1文字ずつ)\",\n en: \"Spells out the text character by character.\",\n },\n cardinal: {\n ja: \"基数としての読み上げ\",\n en: \"Speaks the value as a cardinal number.\",\n },\n ordinal: {\n ja: \"序数としての読み上げ\",\n en: \"Speaks the value as an ordinal number.\",\n },\n number: {\n ja: \"数値としての読み上げ\",\n en: \"Speaks the value as a number.\",\n },\n date: {\n ja: \"日付としての読み上げ\",\n en: \"Speaks the value as a date.\",\n },\n time: {\n ja: \"時刻としての読み上げ\",\n en: \"Speaks the value as a time.\",\n },\n telephone: {\n ja: \"電話番号としての読み上げ\",\n en: \"Speaks the value as a telephone number.\",\n },\n fraction: {\n ja: \"分数としての読み上げ\",\n en: \"Speaks the value as a fraction.\",\n },\n address: {\n ja: \"住所としての読み上げ\",\n en: \"Speaks the value as an address.\",\n },\n name: {\n ja: \"名前としての読み上げ\",\n en: \"Speaks the value as a name.\",\n },\n currency: {\n ja: \"通貨としての読み上げ\",\n en: \"Speaks the value as currency.\",\n },\n} as const satisfies Readonly<Record<(typeof SAY_AS_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const LANGUAGE_DESCRIPTIONS = {\n \"ja-JP\": {\n ja: \"日本語(日本)で読み上げます。\",\n en: \"Speaks the text in Japanese (Japan).\",\n },\n \"en-US\": {\n ja: \"英語(米国)で読み上げます。\",\n en: \"Speaks the text in English (United States).\",\n },\n \"de-DE\": {\n ja: \"ドイツ語(ドイツ)で読み上げます。\",\n en: \"Speaks the text in German (Germany).\",\n },\n \"fr-FR\": {\n ja: \"フランス語(フランス)で読み上げます。\",\n en: \"Speaks the text in French (France).\",\n },\n} as const satisfies Readonly<Record<(typeof LANGUAGE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const SILENCE_VALUE_DESCRIPTIONS = {\n \"300ms\": {\n ja: \"先頭に300ミリ秒の無音を挿入します。\",\n en: \"Inserts 300 milliseconds of leading silence.\",\n },\n \"500ms\": {\n ja: \"先頭に500ミリ秒の無音を挿入します。\",\n en: \"Inserts 500 milliseconds of leading silence.\",\n },\n \"1s\": {\n ja: \"先頭に1秒の無音を挿入します。\",\n en: \"Inserts one second of leading silence.\",\n },\n} as const satisfies Readonly<Record<(typeof SILENCE_VALUE_PRESETS)[number], SsmlPresetDescription>>;\n","/** Generated by scripts/sync-azure-voices.ts. */\nexport const AZURE_VOICE_STYLE_MAP = {\n \"de-DE-ConradNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-KatjaNeural\": [\"cheerful\", \"sad\"],\n \"en-US-AndrewNeural\": [\"empathetic\", \"relieved\"],\n \"en-US-GuyNeural\": [\n \"angry\",\n \"cheerful\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"newscast\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-JennyMultilingualNeural\": [\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-JennyNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"es-ES-ElviraNeural\": [],\n \"fil-PH-AngeloNeural\": [],\n \"fil-PH-Angelo:DragonHDLatestNeural\": [],\n \"fil-PH-BlessicaNeural\": [],\n \"fil-PH-Blessica:DragonHDLatestNeural\": [],\n \"fr-FR-DeniseNeural\": [\"cheerful\", \"sad\"],\n \"fr-FR-HenriNeural\": [\"cheerful\", \"sad\"],\n \"id-ID-GadisNeural\": [],\n \"it-IT-ElsaNeural\": [\"cheerful\", \"sad\"],\n \"ja-JP-KeitaNeural\": [\"chat\"],\n \"ja-JP-MayuNeural\": [\"calm\", \"cheerful\", \"sad\"],\n \"ja-JP-NanamiNeural\": [\"chat\", \"customerservice\", \"cheerful\", \"whispering\", \"sad\"],\n \"ko-KR-SunHiNeural\": [\"cheerful\", \"sad\"],\n \"ms-MY-YasminNeural\": [],\n \"pt-BR-FranciscaNeural\": [\"calm\"],\n \"ru-RU-SvetlanaNeural\": [\"cheerful\", \"sad\", \"angry\", \"disgruntled\", \"embarrassed\", \"fearful\"],\n \"th-TH-PremwadeeNeural\": [],\n \"vi-VN-HoaiMyNeural\": [],\n \"zh-CN-XiaoxiaoNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"terrified\",\n \"whispering\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n ],\n \"zh-CN-YunxiNeural\": [\n \"narration-relaxed\",\n \"embarrassed\",\n \"fearful\",\n \"sad\",\n \"disgruntled\",\n \"serious\",\n \"angry\",\n \"depressed\",\n \"chat\",\n \"cheerful\",\n \"assistant\",\n ],\n \"zh-TW-HsiaoChenNeural\": [],\n} as const satisfies Readonly<Record<string, readonly string[]>>;\n","export type SsmlEditorLocale = \"ja\" | \"en\";\nexport type SsmlEditorLanguage = SsmlEditorLocale;\nexport type SsmlEditorLocalizedText = Readonly<Record<SsmlEditorLocale, string>>;\n\nexport interface EditorCopy {\n editorAriaLabel: string;\n toolbarAriaLabel: string;\n undo: string;\n undoTitle: string;\n redo: string;\n redoTitle: string;\n clearAll: string;\n clearAllTitle: string;\n help: string;\n helpTitle: string;\n helpHeading: string;\n helpDescription: string;\n parameters: string;\n format: string;\n formatTitle: string;\n decorations: string;\n decorationsShowTitle: string;\n decorationsHideTitle: string;\n syntaxError: string;\n selectionActions: string;\n selectionCountSuffix: string;\n previewSelection: string;\n previewSelectionTitle: string;\n noAvailableOptions: string;\n styleNotSupported: string;\n categoryEmotions: string;\n categoryScenarios: string;\n categoryMedia: string;\n categoryOther: string;\n}\n\nexport interface InlineBadgeCopy {\n pause: string;\n pitch: string;\n prosody: string;\n}\n\nexport interface SsmlHoverParameterCopy {\n title: string;\n description: string;\n}\n\nexport interface SsmlHoverTagCopy {\n title: string;\n description: string;\n parameters: Readonly<Record<string, SsmlHoverParameterCopy>>;\n}\n\nexport interface SsmlHoverLocale {\n parameterHeading: string;\n parametersHeading: string;\n allowedValues: string;\n example: string;\n noParameters: string;\n tags: Readonly<Record<string, SsmlHoverTagCopy>>;\n}\n\nexport interface SsmlElementLocaleCopy {\n label: string;\n description: string;\n validationErrors: Readonly<Record<string, string>>;\n}\n\n/** Localized labels and validation copy for Azure extension elements. */\nexport const SSML_ELEMENT_COPY: Readonly<Record<SsmlEditorLocale, Readonly<Record<string, SsmlElementLocaleCopy>>>> = {\n ja: {\n dialog: {\n label: \"ダイアログ\",\n description: \"複数の話者ターンをまとめます。\",\n validationErrors: { turn: \"turn は dialog の直下に配置してください。\" },\n },\n \"mstts:dialog\": {\n label: \"ダイアログ\",\n description: \"複数の話者ターンをまとめます。\",\n validationErrors: { turn: \"turn は dialog の直下に配置してください。\" },\n },\n turn: {\n label: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n validationErrors: { voice: \"voice または speaker を指定してください。\" },\n },\n \"mstts:turn\": {\n label: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n validationErrors: { voice: \"voice または speaker を指定してください。\" },\n },\n backgroundaudio: {\n label: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n validationErrors: { src: \"背景音声には URL を指定してください。\" },\n },\n \"mstts:backgroundaudio\": {\n label: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n validationErrors: { src: \"背景音声には URL を指定してください。\" },\n },\n ttsembedding: {\n label: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n validationErrors: { speakerProfileId: \"話者プロファイル ID を指定してください。\" },\n },\n \"mstts:ttsembedding\": {\n label: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n validationErrors: { speakerProfileId: \"話者プロファイル ID を指定してください。\" },\n },\n embedding: {\n label: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n validationErrors: {},\n },\n \"mstts:embedding\": {\n label: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n validationErrors: {},\n },\n silence: {\n label: \"無音\",\n description: \"発話前後または句読点の境界に無音を追加します。\",\n validationErrors: { value: \"無音の長さを指定してください。\" },\n },\n \"mstts:silence\": {\n label: \"無音\",\n description: \"発話前後または句読点の境界に無音を追加します。\",\n validationErrors: { value: \"無音の長さを指定してください。\" },\n },\n voiceconversion: {\n label: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n validationErrors: {},\n },\n \"mstts:voiceconversion\": {\n label: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n validationErrors: {},\n },\n },\n en: {\n dialog: {\n label: \"Dialog\",\n description: \"Groups multiple speaker turns.\",\n validationErrors: { turn: \"Place turns directly inside a dialog.\" },\n },\n \"mstts:dialog\": {\n label: \"Dialog\",\n description: \"Groups multiple speaker turns.\",\n validationErrors: { turn: \"Place turns directly inside a dialog.\" },\n },\n turn: {\n label: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n validationErrors: { voice: \"Provide a voice or speaker.\" },\n },\n \"mstts:turn\": {\n label: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n validationErrors: { voice: \"Provide a voice or speaker.\" },\n },\n backgroundaudio: {\n label: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n validationErrors: { src: \"Provide a background audio URL.\" },\n },\n \"mstts:backgroundaudio\": {\n label: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n validationErrors: { src: \"Provide a background audio URL.\" },\n },\n ttsembedding: {\n label: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n validationErrors: { speakerProfileId: \"Provide a speaker profile ID.\" },\n },\n \"mstts:ttsembedding\": {\n label: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n validationErrors: { speakerProfileId: \"Provide a speaker profile ID.\" },\n },\n embedding: {\n label: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n validationErrors: {},\n },\n \"mstts:embedding\": {\n label: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n validationErrors: {},\n },\n silence: {\n label: \"Silence\",\n description: \"Adds silence before, after, or around punctuation.\",\n validationErrors: { value: \"Provide a silence duration.\" },\n },\n \"mstts:silence\": {\n label: \"Silence\",\n description: \"Adds silence before, after, or around punctuation.\",\n validationErrors: { value: \"Provide a silence duration.\" },\n },\n voiceconversion: {\n label: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n validationErrors: {},\n },\n \"mstts:voiceconversion\": {\n label: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n validationErrors: {},\n },\n },\n};\n\nexport const EDITOR_COPY: Readonly<Record<SsmlEditorLocale, EditorCopy>> = {\n ja: {\n editorAriaLabel: \"SSMLエディター\",\n toolbarAriaLabel: \"SSMLツールバー\",\n clearAll: \"全てクリア\",\n clearAllTitle: \"音声設定を保持してXML要素を削除し本文を残す\",\n undo: \"元に戻す\",\n undoTitle: \"直前の変更を元に戻す\",\n redo: \"やり直す\",\n redoTitle: \"元に戻した変更をやり直す\",\n help: \"説明\",\n helpTitle: \"ボタンとパラメータの説明を表示\",\n helpHeading: \"ボタンとパラメータの説明\",\n helpDescription: \"各コントロールの機能とパラメータを確認できます。\",\n parameters: \"パラメータ\",\n format: \"フォーマット\",\n formatTitle: \"本文のXMLを改行して見やすく表示\",\n decorations: \"装飾\",\n decorationsShowTitle: \"インライン装飾を表示\",\n decorationsHideTitle: \"インライン装飾を非表示\",\n syntaxError: \"構文エラー\",\n selectionActions: \"選択範囲の操作\",\n selectionCountSuffix: \"文字\",\n previewSelection: \"選択部分を試聴\",\n previewSelectionTitle: \"選択部分のSSMLを試聴\",\n noAvailableOptions: \"利用可能な選択肢がありません。\",\n styleNotSupported: \"この音声はスタイル指定に対応していません\",\n categoryEmotions: \"感情・トーン\",\n categoryScenarios: \"会話・シナリオ\",\n categoryMedia: \"メディア・ナレーション\",\n categoryOther: \"その他\",\n },\n en: {\n editorAriaLabel: \"SSML editor\",\n toolbarAriaLabel: \"SSML toolbar\",\n clearAll: \"Clear all\",\n clearAllTitle: \"Remove non-voice XML elements and keep the text and voice settings\",\n undo: \"Undo\",\n undoTitle: \"Undo the last change\",\n redo: \"Redo\",\n redoTitle: \"Redo the last undone change\",\n help: \"Help\",\n helpTitle: \"Show button and parameter descriptions\",\n helpHeading: \"Button and parameter descriptions\",\n helpDescription: \"Review what each control does and its parameters.\",\n parameters: \"Parameters\",\n format: \"Format\",\n formatTitle: \"Format the XML in the editor\",\n decorations: \"Decorations\",\n decorationsShowTitle: \"Show inline decorations\",\n decorationsHideTitle: \"Hide inline decorations\",\n syntaxError: \"Syntax error\",\n selectionActions: \"Selection actions\",\n selectionCountSuffix: \" characters\",\n previewSelection: \"Preview selection\",\n previewSelectionTitle: \"Preview the selected SSML\",\n noAvailableOptions: \"No options are available.\",\n styleNotSupported: \"This voice does not support style selection.\",\n categoryEmotions: \"Emotions / Tone\",\n categoryScenarios: \"Conversations / Scenarios\",\n categoryMedia: \"Media / Broadcast\",\n categoryOther: \"Other\",\n },\n};\n\nexport const INLINE_BADGE_COPY: Readonly<Record<SsmlEditorLocale, InlineBadgeCopy>> = {\n ja: {\n pause: \"間\",\n pitch: \"ピッチ変化\",\n prosody: \"声の調整\",\n },\n en: {\n pause: \"Pause\",\n pitch: \"Pitch change\",\n prosody: \"Prosody\",\n },\n};\n\nexport const SSML_HOVER_COPY: Readonly<Record<SsmlEditorLocale, SsmlHoverLocale>> = {\n ja: {\n parameterHeading: \"パラメータ\",\n parametersHeading: \"パラメータ\",\n allowedValues: \"使用できる値\",\n example: \"例\",\n noParameters: \"この要素にパラメータはありません。\",\n tags: {\n voice: {\n title: \"音声\",\n description: \"囲まれたテキストの合成に使用する音声と、任意の音声効果を選択します。\",\n parameters: {\n name: { title: \"name\", description: \"音声名。例: `en-US-JennyNeural`。\" },\n effect: { title: \"effect\", description: \"任意の音声効果。例: `eq_car`。\" },\n },\n },\n prosody: {\n title: \"韻律\",\n description: \"囲まれたテキストの速度、ピッチ、音量、またはピッチ曲線を変更します。\",\n parameters: {\n rate: { title: \"rate\", description: \"発話速度を指定します。\" },\n pitch: { title: \"pitch\", description: \"名前付きの値、割合、周波数、または半音でピッチを調整します。\" },\n volume: { title: \"volume\", description: \"名前付きの値、割合、またはデシベル値で音量を指定します。\" },\n contour: { title: \"contour\", description: \"テキスト内の位置ごとの相対的なピッチ変化を定義します。\" },\n range: { title: \"range\", description: \"音声のピッチ範囲を調整します。\" },\n },\n },\n break: {\n title: \"間\",\n description: \"単語やその他の音声コンテンツの間にポーズを挿入します。\",\n parameters: {\n time: { title: \"time\", description: \"ポーズの長さ。例: `500ms` または `1s`。\" },\n strength: { title: \"strength\", description: \"相対的なポーズの強さ。\" },\n },\n },\n \"mstts:express-as\": {\n title: \"表現\",\n description: \"囲まれたテキストに音声スタイル、スタイルの強さ、または役割を適用します。\",\n parameters: {\n style: { title: \"style\", description: \"選択した音声が対応する音声スタイル。例: `cheerful`。\" },\n styledegree: { title: \"styledegree\", description: \"選択した音声スタイルの強さを指定します。\" },\n role: { title: \"role\", description: \"対応している場合に音声の役割を変更します。\" },\n },\n },\n \"say-as\": {\n title: \"読み上げ方\",\n description: \"囲まれたテキストの解釈方法と読み上げ方を指定します。\",\n parameters: {\n \"interpret-as\": { title: \"interpret-as\", description: \"文字、数字、日付、時刻などの解釈を指定します。\" },\n format: { title: \"format\", description: \"選択した解釈の形式を補足します。\" },\n detail: { title: \"detail\", description: \"選択した解釈の詳細を補足します。\" },\n },\n },\n phoneme: {\n title: \"音素\",\n description: \"指定した音素表記で通常の発音を置き換えます。\",\n parameters: {\n alphabet: { title: \"alphabet\", description: \"`ph` 値に使用する音素アルファベット。\" },\n ph: { title: \"ph\", description: \"囲まれたテキストの音素表記。\" },\n },\n },\n emphasis: {\n title: \"強調\",\n description: \"囲まれたテキストを強調します。\",\n parameters: {\n level: { title: \"level\", description: \"強調の度合いを指定します。\" },\n },\n },\n audio: {\n title: \"音声ファイル\",\n description: \"合成結果の一部として音声ファイルを再生します。\",\n parameters: {\n src: { title: \"src\", description: \"音声ファイルの URI。\" },\n desc: { title: \"desc\", description: \"音声を再生できない場合に使用する代替テキスト。\" },\n clipBegin: { title: \"clipBegin\", description: \"音声ファイル内の開始位置。例: `0s`。\" },\n clipEnd: { title: \"clipEnd\", description: \"音声ファイル内の終了位置。例: `5s`。\" },\n speed: { title: \"speed\", description: \"音声ファイルの再生速度。例: `1.0`。\" },\n repeatCount: { title: \"repeatCount\", description: \"音声を繰り返す回数。例: `2`。\" },\n repeatDuration: { title: \"repeatDuration\", description: \"音声を繰り返す合計時間。例: `10s`。\" },\n soundLevel: { title: \"soundLevel\", description: \"デシベル単位の音量調整。例: `-3dB`。\" },\n },\n },\n sub: {\n title: \"置換\",\n description: \"囲まれたテキストの代わりに別名テキストを読み上げます。\",\n parameters: {\n alias: { title: \"alias\", description: \"元のテキストの代わりに読み上げるテキスト。例: `World Wide Web`。\" },\n },\n },\n lang: {\n title: \"言語\",\n description: \"囲まれたテキストの読み上げ言語を変更します。\",\n parameters: {\n \"xml:lang\": { title: \"xml:lang\", description: \"BCP-47 言語タグ。例: `ja-JP`。\" },\n },\n },\n mark: {\n title: \"マーカー\",\n description: \"合成音声ストリームにカスタムマーカーを挿入します。\",\n parameters: {\n name: { title: \"name\", description: \"アプリケーションで定義したマーカー名。例: `chapter-1`。\" },\n },\n },\n bookmark: {\n title: \"ブックマーク\",\n description: \"合成音声ストリームにブックマークマーカーを挿入します。\",\n parameters: {\n mark: { title: \"mark\", description: \"アプリケーションで定義したブックマーク名。例: `chapter-1`。\" },\n },\n },\n lexicon: {\n title: \"発音辞書\",\n description: \"合成文書に発音辞書を関連付けます。\",\n parameters: {\n uri: { title: \"uri\", description: \"発音辞書の URI。\" },\n },\n },\n p: { title: \"段落\", description: \"テキストを段落としてまとめます。\", parameters: {} },\n s: { title: \"文\", description: \"テキストを文としてまとめます。\", parameters: {} },\n w: { title: \"単語\", description: \"テキストを単語としてまとめます。\", parameters: {} },\n \"mstts:silence\": {\n title: \"無音\",\n description: \"テキストの前後、または句読点の境界に指定した無音を追加します。\",\n parameters: {\n type: { title: \"type\", description: \"無音の位置または句読点の境界。\" },\n value: { title: \"value\", description: \"無音の長さ。例: `300ms`。\" },\n },\n },\n \"mstts:viseme\": {\n title: \"ビゼーム\",\n description: \"合成音声のビゼームイベントを要求します。\",\n parameters: {\n type: { title: \"type\", description: \"ビゼームイベントの形式。\" },\n },\n },\n \"mstts:audioduration\": {\n title: \"音声長\",\n description: \"合成音声の目標時間を指定します。\",\n parameters: {\n value: { title: \"value\", description: \"目標時間。例: `10s`、`5000ms`、`00:00:10`。\" },\n },\n },\n \"mstts:dialog\": { title: \"ダイアログ\", description: \"複数の話者ターンをまとめます。\", parameters: {} },\n \"mstts:turn\": {\n title: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n parameters: {\n voice: { title: \"voice\", description: \"このターンで使用する Azure 音声名。\" },\n speaker: { title: \"speaker\", description: \"話者識別子。\" },\n },\n },\n \"mstts:backgroundaudio\": {\n title: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n parameters: { src: { title: \"src\", description: \"音声ファイルの HTTPS URL。\" } },\n },\n \"mstts:ttsembedding\": {\n title: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n parameters: { speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" } },\n },\n \"mstts:embedding\": {\n title: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n parameters: {\n id: { title: \"id\", description: \"埋め込み ID。\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" },\n },\n },\n \"mstts:voiceconversion\": {\n title: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n parameters: {\n url: { title: \"url\", description: \"音声変換プロファイル URL。\" },\n profile: { title: \"profile\", description: \"変換プロファイル。\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" },\n },\n },\n },\n },\n en: {\n parameterHeading: \"Parameter\",\n parametersHeading: \"Parameters\",\n allowedValues: \"Allowed values\",\n example: \"Example\",\n noParameters: \"This element has no parameters.\",\n tags: {\n voice: {\n title: \"Voice\",\n description: \"Selects the voice and optional voice effect used to synthesize the enclosed text.\",\n parameters: {\n name: { title: \"name\", description: \"The voice name, such as `en-US-JennyNeural`.\" },\n effect: { title: \"effect\", description: \"An optional voice effect, such as `eq_car`.\" },\n },\n },\n prosody: {\n title: \"Prosody\",\n description: \"Changes the speaking rate, pitch, volume, or pitch contour of the enclosed text.\",\n parameters: {\n rate: { title: \"rate\", description: \"Controls speaking speed.\" },\n pitch: {\n title: \"pitch\",\n description: \"Adjusts pitch using a named value, percentage, frequency, or semitone value.\",\n },\n volume: {\n title: \"volume\",\n description: \"Controls loudness using a named value, percentage, or decibel value.\",\n },\n contour: {\n title: \"contour\",\n description: \"Defines a sequence of relative pitch changes at positions in the text.\",\n },\n range: { title: \"range\", description: \"Adjusts the pitch range of the voice.\" },\n },\n },\n break: {\n title: \"Break\",\n description: \"Inserts a pause between words or other spoken content.\",\n parameters: {\n time: { title: \"time\", description: \"The pause duration, for example `500ms` or `1s`.\" },\n strength: { title: \"strength\", description: \"The relative pause strength.\" },\n },\n },\n \"mstts:express-as\": {\n title: \"Express-as\",\n description: \"Applies a speaking style, style degree, or role to the enclosed text.\",\n parameters: {\n style: {\n title: \"style\",\n description: \"The speaking style supported by the selected voice, such as `cheerful`.\",\n },\n styledegree: { title: \"styledegree\", description: \"Controls the intensity of the selected speaking style.\" },\n role: { title: \"role\", description: \"Changes the speaking role when supported by the selected voice.\" },\n },\n },\n \"say-as\": {\n title: \"Say-as\",\n description: \"Controls how the enclosed text is interpreted and spoken.\",\n parameters: {\n \"interpret-as\": {\n title: \"interpret-as\",\n description: \"Specifies the interpretation, such as characters, digits, date, or time.\",\n },\n format: { title: \"format\", description: \"Provides a format hint for the selected interpretation.\" },\n detail: {\n title: \"detail\",\n description: \"Provides an additional detail hint for the selected interpretation.\",\n },\n },\n },\n phoneme: {\n title: \"Phoneme\",\n description: \"Replaces normal pronunciation with the supplied phonetic pronunciation.\",\n parameters: {\n alphabet: { title: \"alphabet\", description: \"The phonetic alphabet used by the `ph` value.\" },\n ph: { title: \"ph\", description: \"The phonetic pronunciation for the enclosed text.\" },\n },\n },\n emphasis: {\n title: \"Emphasis\",\n description: \"Adds emphasis to the enclosed text.\",\n parameters: {\n level: { title: \"level\", description: \"Controls the amount of emphasis.\" },\n },\n },\n audio: {\n title: \"Audio\",\n description: \"Plays an audio file as part of the synthesized output.\",\n parameters: {\n src: { title: \"src\", description: \"The URI of the audio file.\" },\n desc: { title: \"desc\", description: \"Alternative text to use if the audio cannot be played.\" },\n clipBegin: { title: \"clipBegin\", description: \"The starting offset within the audio file.\" },\n clipEnd: { title: \"clipEnd\", description: \"The ending offset within the audio file.\" },\n speed: { title: \"speed\", description: \"The playback speed of the audio file.\" },\n repeatCount: { title: \"repeatCount\", description: \"The number of times to repeat the audio.\" },\n repeatDuration: {\n title: \"repeatDuration\",\n description: \"The total duration for which the audio may repeat.\",\n },\n soundLevel: { title: \"soundLevel\", description: \"The audio volume adjustment in decibels.\" },\n },\n },\n sub: {\n title: \"Substitution\",\n description: \"Substitutes the alias text when speaking the enclosed text.\",\n parameters: {\n alias: { title: \"alias\", description: \"The text to speak instead of the enclosed text.\" },\n },\n },\n lang: {\n title: \"Language\",\n description: \"Changes the language used for the enclosed text.\",\n parameters: {\n \"xml:lang\": { title: \"xml:lang\", description: \"The BCP-47 language tag.\" },\n },\n },\n mark: {\n title: \"Mark\",\n description: \"Inserts a custom marker into the synthesized audio stream.\",\n parameters: {\n name: { title: \"name\", description: \"The application-defined marker name.\" },\n },\n },\n bookmark: {\n title: \"Bookmark\",\n description: \"Inserts a bookmark marker into the synthesized audio stream.\",\n parameters: {\n mark: { title: \"mark\", description: \"The application-defined bookmark name.\" },\n },\n },\n lexicon: {\n title: \"Lexicon\",\n description: \"Associates a pronunciation lexicon with the synthesized document.\",\n parameters: {\n uri: { title: \"uri\", description: \"The URI of the pronunciation lexicon.\" },\n },\n },\n p: { title: \"Paragraph\", description: \"Groups text into a paragraph.\", parameters: {} },\n s: { title: \"Sentence\", description: \"Groups text into a sentence.\", parameters: {} },\n w: { title: \"Word\", description: \"Groups text into a word.\", parameters: {} },\n \"mstts:silence\": {\n title: \"Silence\",\n description: \"Adds a specified silence before or after text or at a punctuation boundary.\",\n parameters: {\n type: { title: \"type\", description: \"The silence position or punctuation boundary.\" },\n value: { title: \"value\", description: \"The silence duration, for example `300ms`.\" },\n },\n },\n \"mstts:viseme\": {\n title: \"Viseme\",\n description: \"Requests viseme events for the synthesized audio.\",\n parameters: {\n type: { title: \"type\", description: \"The viseme event format.\" },\n },\n },\n \"mstts:audioduration\": {\n title: \"Audio duration\",\n description: \"Sets the target duration of synthesized audio.\",\n parameters: {\n value: { title: \"value\", description: \"The target duration, such as `10s`, `5000ms`, or `00:00:10`.\" },\n },\n },\n \"mstts:dialog\": { title: \"Dialog\", description: \"Groups multiple speaker turns.\", parameters: {} },\n \"mstts:turn\": {\n title: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n parameters: {\n voice: { title: \"voice\", description: \"The Azure voice used by this turn.\" },\n speaker: { title: \"speaker\", description: \"The speaker identifier.\" },\n },\n },\n \"mstts:backgroundaudio\": {\n title: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n parameters: { src: { title: \"src\", description: \"The HTTPS URL of the audio file.\" } },\n },\n \"mstts:ttsembedding\": {\n title: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n parameters: { speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" } },\n },\n \"mstts:embedding\": {\n title: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n parameters: {\n id: { title: \"id\", description: \"The embedding ID.\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" },\n },\n },\n \"mstts:voiceconversion\": {\n title: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n parameters: {\n url: { title: \"url\", description: \"The voice conversion profile URL.\" },\n profile: { title: \"profile\", description: \"The conversion profile.\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" },\n },\n },\n },\n },\n};\n","import type { SsmlEditorLocale } from \"../locales.ts\";\n\n// Keep the editor's existing Japanese default for backward compatibility.\nexport const DEFAULT_LOCALE: SsmlEditorLocale = \"ja\";\nexport const OVERLAY_Z_INDEX = 9999;\nexport const SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES = 4;\n\nexport const SSML_INSERTION_MODES = {\n insert: \"insert\",\n wrap: \"wrap\",\n} as const;\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 visual: {\n display: \"grid\",\n gap: \"0.75rem\",\n minHeight: \"8rem\",\n padding: \"0.75rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\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\", \"mstts:audioduration\"]);\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\" | \"mstts:audioduration\";\n attributeName: \"rate\" | \"pitch\" | \"time\" | \"value\";\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 type { SsmlDocument, SsmlNode } from \"@ssml-builder-js/ssml-core\";\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction appendNode(nodes: SsmlNode[], node: SsmlNode): void {\n if (typeof node === \"string\") {\n const lastNode = nodes[nodes.length - 1];\n if (typeof lastNode === \"string\") {\n nodes[nodes.length - 1] = lastNode + node;\n } else if (node !== \"\") {\n nodes.push(node);\n }\n return;\n }\n\n nodes.push(node);\n}\n\nfunction clearNodes(nodes: SsmlNode[]): SsmlNode[] {\n const clearedNodes: SsmlNode[] = [];\n for (const node of nodes) {\n if (typeof node === \"string\") {\n appendNode(clearedNodes, node);\n continue;\n }\n\n if (node.type === \"text\") {\n appendNode(clearedNodes, node.value);\n continue;\n }\n\n const children = clearNodes(node.children ?? []);\n if (node.type === \"voice\") {\n appendNode(clearedNodes, { ...node, children });\n continue;\n }\n\n for (const child of children) {\n appendNode(clearedNodes, child);\n }\n }\n\n return clearedNodes;\n}\n\nexport function clearSsmlDocument(document: SsmlDocument): SsmlDocument {\n const nextDocument: SsmlDocument = {\n ...document,\n children: clearNodes(getDocumentChildren(document)),\n };\n if (nextDocument.content !== undefined) {\n delete nextDocument.content;\n }\n return nextDocument;\n}\n","const INDENT = \" \";\nconst FRAGMENT_ROOT = \"ssml-builder-fragment\";\nconst XML_ENTITY_NAMES = new Set([\"amp\", \"apos\", \"gt\", \"lt\", \"quot\"]);\nexport const INTRINSICALLY_EMPTY_ELEMENTS = new Set([\n \"break\",\n \"bookmark\",\n \"lexicon\",\n \"mark\",\n \"mstts:silence\",\n \"mstts:audioduration\",\n \"mstts:viseme\",\n \"silence\",\n \"viseme\",\n]);\n\ntype XmlNode = XmlElementNode | XmlTextNode | XmlMarkupNode;\n\ninterface XmlElementNode {\n kind: \"element\";\n name: string;\n open: string;\n close?: string;\n selfClosing: boolean;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n kind: \"text\";\n value: string;\n}\n\ninterface XmlMarkupNode {\n kind: \"comment\" | \"cdata\" | \"declaration\" | \"processing-instruction\";\n raw: string;\n}\n\ninterface XmlDocument {\n children: XmlNode[];\n root: XmlElementNode;\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction fail(message: string): never {\n throw new Error(message);\n}\n\nfunction skipWhitespace(source: string, index: number): number {\n while (isXmlWhitespace(source[index])) {\n index += 1;\n }\n return index;\n}\n\nfunction readName(source: string, start: number, end: number): { name: string; index: number } {\n if (!isXmlNameStart(source[start])) {\n fail(\"Invalid XML name\");\n }\n\n let index = start + 1;\n while (index < end && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n\n return { name: source.slice(start, index), index };\n}\n\nfunction validateCharacterReference(entity: string): void {\n const isHexadecimal = entity.startsWith(\"#x\") || entity.startsWith(\"#X\");\n const isDecimal = entity.startsWith(\"#\");\n if (!isHexadecimal && !isDecimal) {\n if (!XML_ENTITY_NAMES.has(entity)) {\n fail(`Unknown XML entity: &${entity};`);\n }\n return;\n }\n\n const digits = entity.slice(isHexadecimal ? 2 : 1);\n const validDigits = isHexadecimal ? /^[0-9A-Fa-f]+$/.test(digits) : /^[0-9]+$/.test(digits);\n const codePoint = Number.parseInt(digits, isHexadecimal ? 16 : 10);\n if (\n !validDigits ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > 0x10ffff ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (codePoint < 0x20 && ![9, 10, 13].includes(codePoint))\n ) {\n fail(`Invalid XML character reference: &${entity};`);\n }\n}\n\nfunction validateEntityReferences(value: string): void {\n let index = 0;\n\n while (true) {\n const ampersand = value.indexOf(\"&\", index);\n if (ampersand === -1) {\n return;\n }\n\n const semicolon = value.indexOf(\";\", ampersand + 1);\n if (semicolon === -1) {\n fail(\"Unterminated XML entity reference\");\n }\n\n validateCharacterReference(value.slice(ampersand + 1, semicolon));\n index = semicolon + 1;\n }\n}\n\nfunction findTagEnd(source: string, start: number, hasInternalSubset = false): number {\n let quote: string | undefined;\n let subsetDepth = 0;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n\n if (quote !== undefined) {\n if (character === quote) {\n quote = undefined;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (hasInternalSubset) {\n if (character === \"[\") {\n subsetDepth += 1;\n continue;\n }\n if (character === \"]\" && subsetDepth > 0) {\n subsetDepth -= 1;\n continue;\n }\n }\n\n if (character === \">\" && subsetDepth === 0) {\n return index;\n }\n }\n\n fail(\"Unclosed XML markup\");\n}\n\nfunction parseStartTag(\n source: string,\n start: number,\n end: number,\n): {\n name: string;\n selfClosing: boolean;\n} {\n const nameResult = readName(source, start + 1, end);\n let index = nameResult.index;\n let hasAttribute = false;\n const attributeNames = new Set<string>();\n\n while (index < end) {\n const beforeWhitespace = index;\n index = skipWhitespace(source, index);\n if (index === end) {\n break;\n }\n\n if (source[index] === \"/\") {\n if (index + 1 !== end) {\n fail(\"Invalid XML self-closing tag\");\n }\n return { name: nameResult.name, selfClosing: true };\n }\n\n if (hasAttribute && beforeWhitespace === index) {\n fail(\"XML attributes must be separated by whitespace\");\n }\n\n const attribute = readName(source, index, end);\n index = skipWhitespace(source, attribute.index);\n if (source[index] !== \"=\") {\n fail(`XML attribute ${attribute.name} must have a value`);\n }\n index = skipWhitespace(source, index + 1);\n\n const quote = source[index];\n if (quote !== '\"' && quote !== \"'\") {\n fail(`XML attribute ${attribute.name} must use a quoted value`);\n }\n index += 1;\n\n const valueStart = index;\n while (index < end && source[index] !== quote) {\n if (source[index] === \"<\") {\n fail(`Invalid \"<\" in XML attribute ${attribute.name}`);\n }\n index += 1;\n }\n if (index === end) {\n fail(`Unclosed XML attribute ${attribute.name}`);\n }\n\n if (attributeNames.has(attribute.name)) {\n fail(`Duplicate XML attribute: ${attribute.name}`);\n }\n attributeNames.add(attribute.name);\n validateEntityReferences(source.slice(valueStart, index));\n index += 1;\n hasAttribute = true;\n }\n\n return { name: nameResult.name, selfClosing: false };\n}\n\nfunction parseClosingTag(source: string, start: number, end: number): string {\n const nameResult = readName(source, start + 2, end);\n if (skipWhitespace(source, nameResult.index) !== end) {\n fail(\"Invalid XML closing tag\");\n }\n return nameResult.name;\n}\n\nfunction parseProcessingInstruction(source: string, start: number, end: number): void {\n readName(source, start + 2, end);\n}\n\nfunction parseDeclaration(source: string, start: number, end: number): void {\n readName(source, start + 2, end);\n}\n\nfunction appendNode(nodes: XmlNode[], node: XmlNode): void {\n const previous = nodes[nodes.length - 1];\n if (node.kind === \"text\" && previous?.kind === \"text\") {\n previous.value += node.value;\n return;\n }\n nodes.push(node);\n}\n\nfunction currentElement(stack: XmlElementNode[]): XmlElementNode | undefined {\n return stack[stack.length - 1];\n}\n\nfunction parseXml(source: string): XmlDocument {\n const children: XmlNode[] = [];\n const stack: XmlElementNode[] = [];\n let root: XmlElementNode | undefined;\n let index = 0;\n\n while (index < source.length) {\n if (source[index] !== \"<\") {\n const textStart = index;\n while (index < source.length && source[index] !== \"<\") {\n index += 1;\n }\n\n const value = source.slice(textStart, index);\n if (value.includes(\"]]>\")) {\n fail(\"CDATA termination is not valid in ordinary XML text\");\n }\n validateEntityReferences(value);\n if (stack.length === 0 && value.trim() !== \"\") {\n fail(\"Unexpected text outside the root XML element\");\n }\n appendNode(currentElement(stack)?.children ?? children, { kind: \"text\", value });\n continue;\n }\n\n if (source.startsWith(\"<!--\", index)) {\n const end = source.indexOf(\"-->\", index + 4);\n if (end === -1) {\n fail(\"Unclosed XML comment\");\n }\n const content = source.slice(index + 4, end);\n if (content.includes(\"--\") || content.endsWith(\"-\")) {\n fail(\"Invalid XML comment\");\n }\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"comment\",\n raw: source.slice(index, end + 3),\n });\n index = end + 3;\n continue;\n }\n\n if (source.startsWith(\"<![CDATA[\", index)) {\n const end = source.indexOf(\"]]>\", index + \"<![CDATA[\".length);\n if (end === -1) {\n fail(\"Unclosed XML CDATA section\");\n }\n if (stack.length === 0) {\n fail(\"CDATA is not allowed outside the root XML element\");\n }\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"cdata\",\n raw: source.slice(index, end + 3),\n });\n index = end + 3;\n continue;\n }\n\n if (source.startsWith(\"<?\", index)) {\n const end = source.indexOf(\"?>\", index + 2);\n if (end === -1) {\n fail(\"Unclosed XML processing instruction\");\n }\n parseProcessingInstruction(source, index, end);\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"processing-instruction\",\n raw: source.slice(index, end + 2),\n });\n index = end + 2;\n continue;\n }\n\n if (source.startsWith(\"</\", index)) {\n const end = findTagEnd(source, index);\n const name = parseClosingTag(source, index, end);\n const element = currentElement(stack);\n if (element === undefined || element.name !== name) {\n fail(`Mismatched closing XML element: </${name}>`);\n }\n element.close = source.slice(index, end + 1);\n stack.pop();\n index = end + 1;\n continue;\n }\n\n if (source.startsWith(\"<!\", index)) {\n const end = findTagEnd(source, index, true);\n parseDeclaration(source, index, end);\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"declaration\",\n raw: source.slice(index, end + 1),\n });\n index = end + 1;\n continue;\n }\n\n const end = findTagEnd(source, index);\n const { name, selfClosing } = parseStartTag(source, index, end);\n if (stack.length === 0) {\n if (root !== undefined) {\n fail(\"Multiple root XML elements are not allowed\");\n }\n root = {\n kind: \"element\",\n name,\n open: source.slice(index, end + 1),\n selfClosing,\n children: [],\n };\n children.push(root);\n } else {\n const element: XmlElementNode = {\n kind: \"element\",\n name,\n open: source.slice(index, end + 1),\n selfClosing,\n children: [],\n };\n currentElement(stack)?.children.push(element);\n if (!selfClosing) {\n stack.push(element);\n }\n index = end + 1;\n continue;\n }\n\n if (!selfClosing) {\n stack.push(root);\n }\n index = end + 1;\n }\n\n if (stack.length > 0) {\n fail(`Unclosed XML element: <${currentElement(stack)?.name}>`);\n }\n if (root === undefined) {\n fail(\"XML input does not contain a root element\");\n }\n\n return { children, root };\n}\n\nfunction indentation(depth: number): string {\n return INDENT.repeat(depth);\n}\n\nfunction renderInline(node: XmlElementNode): string {\n const content = node.children\n .map((child) => {\n if (child.kind === \"element\") {\n return renderInline(child);\n }\n return child.kind === \"text\" ? child.value : child.raw;\n })\n .join(\"\");\n\n return `${node.open}${content}${node.close ?? \"\"}`;\n}\n\nfunction hasOnlyTextChildren(node: XmlElementNode): boolean {\n return node.children.every((child) => child.kind === \"text\");\n}\n\nfunction hasSignificantText(node: XmlElementNode): boolean {\n return node.children.some((child) => child.kind === \"text\" && child.value.trim() !== \"\");\n}\n\nfunction hasOnlyWhitespaceText(node: XmlElementNode): boolean {\n return node.children.every((child) => child.kind === \"text\" && child.value.trim() === \"\");\n}\n\nfunction toSelfClosingTag(open: string): string {\n return `${open.slice(0, -1).trimEnd()}/>`;\n}\n\nfunction formatElement(node: XmlElementNode, depth: number, isRoot: boolean): string[] {\n const prefix = indentation(depth);\n\n if (node.selfClosing) {\n return [`${prefix}${node.open}`];\n }\n if (node.close === undefined) {\n fail(`Unclosed XML element: <${node.name}>`);\n }\n if (INTRINSICALLY_EMPTY_ELEMENTS.has(node.name) && hasOnlyWhitespaceText(node)) {\n return [`${prefix}${toSelfClosingTag(node.open)}`];\n }\n\n if (isRoot && hasOnlyTextChildren(node)) {\n const text = node.children\n .filter((child): child is XmlTextNode => child.kind === \"text\")\n .map((child) => child.value)\n .join(\"\");\n const trimmedText = text.trim();\n\n if (trimmedText === \"\") {\n return [`${prefix}${node.open}`, `${prefix}${node.close}`];\n }\n if (text.includes(\"\\n\") || text.includes(\"\\r\") || text !== trimmedText) {\n return [`${prefix}${renderInline(node)}`];\n }\n return [`${prefix}${node.open}`, `${indentation(depth + 1)}${trimmedText}`, `${prefix}${node.close}`];\n }\n\n if (hasSignificantText(node)) {\n return [`${prefix}${renderInline(node)}`];\n }\n\n const lines = [`${prefix}${node.open}`];\n for (const child of node.children) {\n if (child.kind === \"text\") {\n continue;\n }\n if (child.kind === \"element\") {\n lines.push(...formatElement(child, depth + 1, false));\n } else {\n lines.push(`${indentation(depth + 1)}${child.raw}`);\n }\n }\n lines.push(`${prefix}${node.close}`);\n return lines;\n}\n\nfunction stripTrailingWhitespace(value: string): string {\n return value.replace(/[ \\t]+$/gm, \"\");\n}\n\nfunction getTrailingLineBreaks(value: string): string {\n let start = value.length;\n while (start > 0) {\n if (value[start - 1] === \"\\n\") {\n start -= 1;\n if (start > 0 && value[start - 1] === \"\\r\") {\n start -= 1;\n }\n continue;\n }\n if (value[start - 1] === \"\\r\") {\n start -= 1;\n continue;\n }\n break;\n }\n return value.slice(start);\n}\n\nfunction stripTrailingLineBreaks(value: string): string {\n let end = value.length;\n while (end > 0) {\n if (value[end - 1] === \"\\n\") {\n end -= 1;\n if (end > 0 && value[end - 1] === \"\\r\") {\n end -= 1;\n }\n continue;\n }\n if (value[end - 1] === \"\\r\") {\n end -= 1;\n continue;\n }\n break;\n }\n return value.slice(0, end);\n}\n\nfunction preserveTrailingLineBreak(formatted: string, trailingLineBreaks: string): string {\n if (trailingLineBreaks === \"\") {\n return formatted;\n }\n\n return `${stripTrailingLineBreaks(formatted)}${trailingLineBreaks}`;\n}\n\nfunction renderDocument(document: XmlDocument): string {\n const lines: string[] = [];\n\n for (const child of document.children) {\n if (child.kind === \"text\") {\n continue;\n }\n if (child.kind === \"element\") {\n lines.push(...formatElement(child, 0, child === document.root));\n } else {\n lines.push(child.raw);\n }\n }\n\n return stripTrailingWhitespace(lines.join(\"\\n\")).trim();\n}\n\nexport function formatXml(xml: string): string {\n const trailingLineBreaks = getTrailingLineBreaks(xml);\n const source = xml.trim();\n if (source === \"\") {\n return \"\";\n }\n\n try {\n return preserveTrailingLineBreak(renderDocument(parseXml(source)), trailingLineBreaks);\n } catch {\n return xml;\n }\n}\n\nfunction unwrapFormattedFragment(formatted: string): string | undefined {\n const opening = `<${FRAGMENT_ROOT}>`;\n const closing = `</${FRAGMENT_ROOT}>`;\n\n if (!formatted.startsWith(opening) || !formatted.endsWith(closing)) {\n return undefined;\n }\n\n if (formatted === `${opening}${closing}`) {\n return \"\";\n }\n\n const multilineOpening = `${opening}\\n`;\n const multilineClosing = `\\n${closing}`;\n if (formatted.startsWith(multilineOpening) && formatted.endsWith(multilineClosing)) {\n const content = formatted.slice(multilineOpening.length, -multilineClosing.length);\n return content\n .split(\"\\n\")\n .map((line) => (line.startsWith(INDENT) ? line.slice(INDENT.length) : line))\n .join(\"\\n\");\n }\n\n return formatted.slice(opening.length, -closing.length);\n}\n\nexport function formatXmlFragment(xml: string): string {\n const trailingLineBreaks = getTrailingLineBreaks(xml);\n const source = xml.trim();\n if (source === \"\") {\n return \"\";\n }\n\n const wrapped = `<${FRAGMENT_ROOT}>${source}</${FRAGMENT_ROOT}>`;\n let formatted: string;\n try {\n formatted = renderDocument(parseXml(wrapped));\n } catch {\n return xml;\n }\n\n return preserveTrailingLineBreak(unwrapFormattedFragment(formatted) ?? xml, trailingLineBreaks);\n}\n","import { buildSsml, parseSsml } from \"@ssml-builder-js/ssml-core\";\nimport type { ProsodyElement, SsmlDocument, SsmlElement, SsmlNode, VoiceElement } from \"@ssml-builder-js/ssml-core\";\nimport { INTRINSICALLY_EMPTY_ELEMENTS } from \"./formatXml\";\n\ninterface EditableStartTag {\n name: string;\n selfClosing: boolean;\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 getSsmlElementName(element: SsmlElement): string {\n return element.type === \"custom\" || element.type === \"element\" ? element.name : element.type;\n}\n\nfunction findEditableTagEnd(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 continue;\n }\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === \">\") {\n return index;\n }\n }\n return source.length;\n}\n\nfunction collectEditableStartTags(source: string): EditableStartTag[] {\n const tags: EditableStartTag[] = [];\n let index = 0;\n\n while (index < source.length) {\n if (source[index] !== \"<\") {\n index += 1;\n continue;\n }\n if (source.startsWith(\"<!--\", index)) {\n const end = source.indexOf(\"-->\", index + 4);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", index)) {\n const end = source.indexOf(\"]]>\", index + 9);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", index)) {\n const end = source.indexOf(\"?>\", index + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n if (source.startsWith(\"</\", index) || source.startsWith(\"<!\", index)) {\n const end = findEditableTagEnd(source, index);\n index = end === source.length ? source.length : end + 1;\n continue;\n }\n\n const end = findEditableTagEnd(source, index);\n if (end === source.length) {\n break;\n }\n const raw = source.slice(index, end + 1);\n const match = raw.match(/^<([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (match) {\n tags.push({ name: match[1], selfClosing: /\\/\\s*>$/.test(raw) });\n }\n index = end + 1;\n }\n\n return tags;\n}\n\nfunction preserveEmptyPairElements(\n nodes: SsmlNode[],\n startTags: readonly EditableStartTag[],\n startTagIndex: { value: number },\n): SsmlNode[] {\n return nodes.map((node) => {\n if (!isSsmlElement(node)) {\n return node;\n }\n\n const elementName = getSsmlElementName(node);\n const startTag = startTags[startTagIndex.value];\n startTagIndex.value += 1;\n if (node.children === undefined || node.children.length === 0) {\n return startTag?.name === elementName && !startTag.selfClosing && !INTRINSICALLY_EMPTY_ELEMENTS.has(elementName)\n ? { ...node, children: [\"\"] }\n : node;\n }\n\n const children = preserveEmptyPairElements(node.children, startTags, startTagIndex);\n if (children.every((child, index) => child === node.children?.[index])) {\n return node;\n }\n return { ...node, children };\n });\n}\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction findFirstElementPath(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => boolean,\n ancestors: readonly SsmlElement[] = [],\n): SsmlElement[] | undefined {\n for (const node of nodes) {\n if (!isSsmlElement(node)) {\n continue;\n }\n\n const path = [...ancestors, node];\n if (predicate(node)) {\n return path;\n }\n\n const childPath = findFirstElementPath(node.children ?? [], predicate, path);\n if (childPath) {\n return childPath;\n }\n }\n return undefined;\n}\n\nfunction updateFirstElement<T extends SsmlElement>(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => element is T,\n update: (element: T) => SsmlElement,\n): { nodes: SsmlNode[]; updated: boolean } {\n let updated = false;\n const nextNodes = nodes.map((node) => {\n if (updated || !isSsmlElement(node)) {\n return node;\n }\n\n if (predicate(node)) {\n updated = true;\n return update(node);\n }\n\n if (node.children) {\n const result = updateFirstElement(node.children, predicate, update);\n if (result.updated) {\n updated = true;\n return { ...node, children: result.nodes };\n }\n }\n\n return node;\n });\n\n return { nodes: nextNodes, updated };\n}\n\nfunction withChildren(document: SsmlDocument, children: SsmlNode[]): SsmlDocument {\n const nextDocument: SsmlDocument = { ...document, children };\n if (nextDocument.content !== undefined) {\n delete nextDocument.content;\n }\n return nextDocument;\n}\n\nfunction parseEditableText(value: string, lang: string): SsmlNode[] {\n try {\n const wrapper = buildSsml({\n version: \"1.0\",\n lang,\n children: [],\n });\n const openingTagEnd = wrapper.indexOf(\">\") + 1;\n const children = parseSsml(`${wrapper.slice(0, openingTagEnd)}${value}</speak>`).children ?? [];\n return children.some(isSsmlElement)\n ? preserveEmptyPairElements(children, collectEditableStartTags(value), { value: 0 })\n : [value];\n } catch {\n return [value];\n }\n}\n\nfunction serializeEditableText(nodes: SsmlNode[], lang: string): string {\n if (nodes.length === 1 && typeof nodes[0] === \"string\") {\n return nodes[0];\n }\n\n const xml = buildSsml({\n version: \"1.0\",\n lang,\n children: nodes,\n });\n const contentStart = xml.indexOf(\">\") + 1;\n return xml.slice(contentStart, -\"</speak>\".length);\n}\n\nexport function getEditableRegion(document: SsmlDocument): { children: SsmlNode[]; voiceName?: string } {\n const children = getDocumentChildren(document);\n const path = findFirstElementPath(children, isProsody) ?? findFirstElementPath(children, isVoice);\n const element = path ? path[path.length - 1] : undefined;\n const voice = path ? [...path].reverse().find(isVoice) : undefined;\n return {\n children: element?.children ?? children,\n ...(voice ? { voiceName: voice.name } : {}),\n };\n}\n\nexport function getEditableText(document: SsmlDocument): string {\n return serializeEditableText(getEditableRegion(document).children, document.lang);\n}\n\nexport function updateEditableText(document: SsmlDocument, value: string): SsmlDocument {\n const nextChildren = parseEditableText(value, document.lang);\n const editableChildren = nextChildren.length > 0 ? nextChildren : [value];\n const children = getDocumentChildren(document);\n const prosodyResult = updateFirstElement(children, isProsody, (prosody) => ({\n ...prosody,\n children: editableChildren,\n }));\n if (prosodyResult.updated) {\n return withChildren(document, prosodyResult.nodes);\n }\n\n const voiceResult = updateFirstElement(children, isVoice, (voice) => ({\n ...voice,\n children: editableChildren,\n }));\n if (voiceResult.updated) {\n return withChildren(document, voiceResult.nodes);\n }\n\n return withChildren(document, editableChildren);\n}\n","// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { SSML_INSERTION_MODES } from \"./constants/ui.ts\";\n\nexport type SsmlInsertionMode = (typeof SSML_INSERTION_MODES)[keyof typeof SSML_INSERTION_MODES];\n\nexport interface SsmlInsertionTemplate {\n prefix: string;\n suffix: string;\n mode: SsmlInsertionMode;\n}\n\nexport interface SsmlInsertionEdit {\n replacement: string;\n selectionOffset: number;\n}\n\nfunction isLineStart(value: string, offset: number): boolean {\n return offset === 0 || value[offset - 1] === \"\\n\" || value[offset - 1] === \"\\r\";\n}\n\nfunction isLineEnd(value: string, offset: number): boolean {\n return offset === value.length || value[offset] === \"\\n\" || value[offset] === \"\\r\";\n}\n\nfunction getLineBreakAt(value: string, offset: number): string {\n if (value.startsWith(\"\\r\\n\", offset)) {\n return \"\\r\\n\";\n }\n if (value[offset] === \"\\n\" || value[offset] === \"\\r\") {\n return value[offset];\n }\n return \"\";\n}\n\nfunction startsWithLineBreak(value: string): boolean {\n return value.startsWith(\"\\n\") || value.startsWith(\"\\r\");\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nexport function createSsmlInsertionEdit(\n source: string,\n startOffset: number,\n endOffset: number,\n template: SsmlInsertionTemplate,\n eol = \"\\n\",\n selectedText = startOffset === endOffset ? \"\" : source.slice(startOffset, endOffset),\n): SsmlInsertionEdit {\n if (template.mode === SSML_INSERTION_MODES.wrap) {\n const trailingLineBreak = getLineBreakAt(source, endOffset) === \"\" ? eol : \"\";\n return {\n replacement: `${template.prefix}${selectedText}${template.suffix}${trailingLineBreak}`,\n selectionOffset: template.prefix.length,\n };\n }\n\n const followingLineBreak = getLineBreakAt(source, endOffset);\n const leadingLineBreak = !isLineStart(source, startOffset) && !startsWithLineBreak(template.prefix) ? eol : \"\";\n const needsTrailingLineBreak =\n selectedText.length > 0\n ? !selectedText.startsWith(\"\\n\") && !selectedText.startsWith(\"\\r\")\n : !isLineEnd(source, endOffset) || followingLineBreak === \"\";\n const trailingLineBreak = needsTrailingLineBreak && !endsWithLineBreak(template.prefix) ? eol : \"\";\n const insertionPrefix = `${leadingLineBreak}${template.prefix}`;\n\n return {\n replacement: `${insertionPrefix}${trailingLineBreak}${selectedText}`,\n selectionOffset:\n insertionPrefix.length +\n trailingLineBreak.length +\n (selectedText.length === 0 && trailingLineBreak === \"\" ? followingLineBreak.length : 0),\n };\n}\n","export interface SsmlVoiceContext {\n voiceName?: string;\n}\n\nexport interface SsmlTagRange {\n start: number;\n end: number;\n}\n\ninterface OpenElement {\n name: string;\n voiceName?: string;\n}\n\nfunction findTagEnd(source: string, start: number, limit: number): number {\n let quote: string | undefined;\n for (let index = start + 1; index < limit; index += 1) {\n const character = source[index];\n if (quote !== undefined) {\n if (character === quote) {\n quote = undefined;\n }\n continue;\n }\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === \">\") {\n return index;\n }\n }\n return -1;\n}\n\nfunction getVoiceName(tag: string): string | undefined {\n return tag.match(/\\bname\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i)?.[2];\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 updateTagAttribute(\n text: string,\n tagRange: SsmlTagRange,\n attributeName: string,\n newValue: string,\n): string {\n const start = Math.max(0, Math.min(tagRange.start, text.length));\n const end = Math.max(start, Math.min(tagRange.end, text.length));\n const tag = text.slice(start, end);\n const escapedAttributeName = attributeName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const attributePattern = new RegExp(`(\\\\b${escapedAttributeName}\\\\s*=\\\\s*)([\"'])([\\\\s\\\\S]*?)\\\\2`, \"i\");\n const escapedValue = escapeXmlAttribute(newValue);\n const match = tag.match(attributePattern);\n\n if (match?.index !== undefined) {\n const valueStart = match.index + match[0].indexOf(match[2]) + 1;\n const valueEnd = valueStart + (match[3]?.length ?? 0);\n return `${text.slice(0, start)}${tag.slice(0, valueStart)}${escapedValue}${tag.slice(valueEnd)}${text.slice(end)}`;\n }\n\n const insertionIndex = tag.endsWith(\"/>\") ? tag.length - 2 : tag.length - 1;\n const attribute = ` ${attributeName}=\"${escapedValue}\"`;\n return `${text.slice(0, start)}${tag.slice(0, insertionIndex)}${attribute}${tag.slice(insertionIndex)}${text.slice(end)}`;\n}\n\nfunction closeElement(stack: OpenElement[], name: string): void {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n if (stack[index]?.name === name) {\n stack.splice(index);\n return;\n }\n }\n}\n\nexport function findActiveSsmlTags(source: string, offset: number): Set<string> {\n const limit = Math.max(0, Math.min(offset, source.length));\n const stack: OpenElement[] = [];\n let index = 0;\n\n while (index < source.length) {\n const tagStart = source.indexOf(\"<\", index);\n if (tagStart === -1 || tagStart > limit) {\n break;\n }\n\n const nonContentEnd = source.startsWith(\"<!--\", tagStart)\n ? source.indexOf(\"-->\", tagStart + 4)\n : source.startsWith(\"<![CDATA[\", tagStart)\n ? source.indexOf(\"]]>\", tagStart + 9)\n : source.startsWith(\"<?\", tagStart)\n ? source.indexOf(\"?>\", tagStart + 2)\n : undefined;\n if (nonContentEnd !== undefined) {\n const delimiterLength = source.startsWith(\"<?\", tagStart) ? 2 : 3;\n const end = nonContentEnd === -1 ? source.length : nonContentEnd + delimiterLength;\n if (limit < end) {\n break;\n }\n index = end;\n continue;\n }\n\n const tagEnd = findTagEnd(source, tagStart, source.length);\n const tag = source.slice(tagStart, tagEnd === -1 ? source.length : tagEnd + 1);\n const closingMatch = tag.match(/^<\\s*\\/\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n const openingMatch = tag.match(/^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n\n if (tagEnd === -1 || limit <= tagEnd) {\n if (openingMatch?.[1]) {\n stack.push({ name: openingMatch[1].toLowerCase() });\n }\n break;\n }\n\n if (closingMatch?.[1]) {\n closeElement(stack, closingMatch[1].toLowerCase());\n } else if (openingMatch?.[1] && !/\\/\\s*>$/.test(tag)) {\n stack.push({ name: openingMatch[1].toLowerCase() });\n }\n index = tagEnd + 1;\n }\n\n return new Set(stack.map(({ name }) => name));\n}\n\nexport function findSsmlVoiceContext(source: string, offset: number): SsmlVoiceContext | undefined {\n const limit = Math.max(0, Math.min(offset, source.length));\n const stack: OpenElement[] = [];\n let index = 0;\n\n while (index < limit) {\n const tagStart = source.indexOf(\"<\", index);\n if (tagStart === -1 || tagStart >= limit) {\n break;\n }\n\n if (source.startsWith(\"<!--\", tagStart)) {\n const end = source.indexOf(\"-->\", tagStart + 4);\n index = end === -1 || end + 3 > limit ? limit : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", tagStart)) {\n const end = source.indexOf(\"]]>\", tagStart + 9);\n index = end === -1 || end + 3 > limit ? limit : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", tagStart)) {\n const end = source.indexOf(\"?>\", tagStart + 2);\n index = end === -1 || end + 2 > limit ? limit : end + 2;\n continue;\n }\n\n const tagEnd = findTagEnd(source, tagStart, limit);\n if (tagEnd === -1) {\n break;\n }\n const tag = source.slice(tagStart, tagEnd + 1);\n if (tag.startsWith(\"<!\")) {\n index = tagEnd + 1;\n continue;\n }\n\n const closingMatch = tag.match(/^<\\s*\\/\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (closingMatch?.[1]) {\n closeElement(stack, closingMatch[1].toLowerCase());\n index = tagEnd + 1;\n continue;\n }\n\n const openingMatch = tag.match(/^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (openingMatch?.[1] && !/\\/\\s*>$/.test(tag)) {\n const name = openingMatch[1].toLowerCase();\n stack.push({\n name,\n ...(name === \"voice\" ? { voiceName: getVoiceName(tag) } : {}),\n });\n }\n index = tagEnd + 1;\n }\n\n for (let stackIndex = stack.length - 1; stackIndex >= 0; stackIndex -= 1) {\n const element = stack[stackIndex];\n if (element?.name === \"voice\") {\n return element.voiceName === undefined ? {} : { voiceName: element.voiceName };\n }\n }\n return undefined;\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 * as monaco from \"monaco-editor\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { resolveExpressAsStyles, SSML_ATTRIBUTE_PRESETS } from \"./constants/ssmlPresets.ts\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { findSsmlVoiceContext } from \"./ssmlContext.ts\";\n\ntype Monaco = typeof monaco;\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoCompletionProvider = Parameters<MonacoLanguages[\"registerCompletionItemProvider\"]>[1];\ntype MonacoCompletionMethod = NonNullable<MonacoCompletionProvider[\"provideCompletionItems\"]>;\ntype MonacoCompletionModel = Parameters<MonacoCompletionMethod>[0];\ntype MonacoCompletionPosition = Parameters<MonacoCompletionMethod>[1];\n\nconst SSML_ATTRIBUTE_VALUE_PATTERN = /<([\\w:-]+)\\s+[^>]*?\\b([\\w:-]+)=[\"']([^\"']*)$/i;\nconst EXPRESS_AS_TAG_NAMES = new Set([\"mstts:express-as\", \"express-as\", \"expressas\"]);\n\nexport interface SsmlCompletionProviderOptions {\n getOuterVoiceName?: () => string | undefined;\n model?: MonacoCompletionModel | null;\n}\n\nfunction findSsmlAttributePresets(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\nconst SSML_COMPLETION_SNIPPETS = [\n {\n label: \"break\",\n insertText: '<break time=\"500ms\" />',\n },\n {\n label: \"prosody\",\n insertText: `<prosody rate=\"medium\" pitch=\"medium\">\\${1:text}</prosody>`,\n },\n {\n label: \"mstts:express-as\",\n insertText: `<mstts:express-as style=\"cheerful\">\\${1:text}</mstts:express-as>`,\n },\n {\n label: \"mstts:audioduration\",\n insertText: '<mstts:audioduration value=\"10s\" />',\n },\n {\n label: \"mstts:dialog\",\n insertText: `<mstts:dialog>\\n <mstts:turn voice=\"\\${1:en-US-JennyNeural}\">\\${2:text}</mstts:turn>\\n</mstts:dialog>`,\n },\n {\n label: \"mstts:turn\",\n insertText: `<mstts:turn voice=\"\\${1:en-US-JennyNeural}\">\\${2:text}</mstts:turn>`,\n },\n {\n label: \"mstts:backgroundaudio\",\n insertText: `<mstts:backgroundaudio src=\"\\${1:https://example.com/audio.mp3}\" volume=\"\\${2:70}\" fadein=\"\\${3:1000}\" fadeout=\"\\${4:1000}\" />`,\n },\n {\n label: \"mstts:ttsembedding\",\n insertText: `<mstts:ttsembedding>\\${1:text}</mstts:ttsembedding>`,\n },\n {\n label: \"sub\",\n insertText: `<sub alias=\"\\${1:読み}\">\\${2:漢字}</sub>`,\n },\n] as const;\n\nexport function registerSsmlCompletionProvider(\n monaco: Monaco,\n options: SsmlCompletionProviderOptions = {},\n): ReturnType<MonacoLanguages[\"registerCompletionItemProvider\"]> {\n const provider: MonacoCompletionProvider = {\n provideCompletionItems(model: MonacoCompletionModel, position: MonacoCompletionPosition) {\n if (options.model && options.model !== model) {\n return { suggestions: [] };\n }\n\n const value = model.getValue();\n const offset = model.getOffsetAt(position);\n const textUntilPosition = value.slice(0, offset);\n const isClosingTag = /<\\/[a-zA-Z0-9:-]*$/.test(textUntilPosition);\n if (isClosingTag) {\n return { suggestions: [] };\n }\n\n const attributeMatch = SSML_ATTRIBUTE_VALUE_PATTERN.exec(textUntilPosition);\n let attributeValues = attributeMatch ? findSsmlAttributePresets(attributeMatch[1], attributeMatch[2]) : undefined;\n if (\n attributeMatch &&\n attributeValues &&\n EXPRESS_AS_TAG_NAMES.has(attributeMatch[1].toLowerCase()) &&\n attributeMatch[2].toLowerCase() === \"style\"\n ) {\n const voiceContext = findSsmlVoiceContext(value, offset);\n const voiceName = voiceContext === undefined ? options.getOuterVoiceName?.() : voiceContext.voiceName;\n attributeValues = resolveExpressAsStyles(voiceName, attributeValues);\n }\n const openTagMatch = textUntilPosition.match(/<(?!\\/)[a-zA-Z0-9:-]*$/);\n const openTagLength = openTagMatch?.[0].length ?? 0;\n const isAfterBracket =\n model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: position.column - 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n }) === \"<\";\n const hasClosingBracket =\n isAfterBracket &&\n model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: position.column,\n endLineNumber: position.lineNumber,\n endColumn: position.column + 1,\n }) === \">\";\n const range = {\n startLineNumber: position.lineNumber,\n startColumn: openTagLength > 0 ? position.column - openTagLength : position.column,\n endLineNumber: position.lineNumber,\n endColumn: hasClosingBracket ? position.column + 1 : position.column,\n };\n\n return {\n suggestions: [\n ...(attributeMatch\n ? []\n : SSML_COMPLETION_SNIPPETS.map(({ label, insertText }) => ({\n label,\n kind: monaco.languages.CompletionItemKind.Snippet,\n insertText,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n }))),\n ...(attributeValues?.map((value) => ({\n label: value,\n kind: monaco.languages.CompletionItemKind.Value,\n insertText: value,\n range,\n })) ?? []),\n ],\n };\n },\n triggerCharacters: [\"<\", '\"', \"'\"],\n };\n\n return monaco.languages.registerCompletionItemProvider(\"xml\", provider);\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\" | \"mstts:audioduration\";\n attributeName: \"rate\" | \"pitch\" | \"time\" | \"value\";\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|mstts:audioduration)\\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 (tagName === \"mstts:audioduration\" && /\\/\\s*>$/.test(tag)) {\n lenses.push(\n createLens(\n model,\n tagStart,\n tagEnd + 1,\n `⚡ Duration: ${getAttributeValue(tag, \"value\") ?? \"default\"} (Click to edit)`,\n { type: \"attribute\", insertionId: \"mstts:audioduration\", attributeName: \"value\", tagRange },\n ),\n createLens(model, tagStart, tagEnd + 1, \"Delete\", {\n type: \"delete\",\n tagRange,\n elementRange,\n }),\n );\n } else if (tagName === \"break\" && /\\/\\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","// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport * as SSML_PRESETS from \"./constants/ssmlPresets.ts\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { SSML_HOVER_COPY, type SsmlEditorLocale } from \"./locales.ts\";\n\nconst {\n BREAK_STRENGTH_PRESETS,\n EMPHASIS_LEVEL_PRESETS,\n PHONEME_ALPHABET_PRESETS,\n PROSODY_RATE_VALUES,\n PROSODY_VOLUME_PRESETS,\n SILENCE_TYPE_PRESETS,\n SSML_PRESET_EXAMPLES,\n VISEME_TYPE_PRESETS,\n} = SSML_PRESETS;\n\nexport interface SsmlParameterDefinition {\n name: string;\n description: string;\n aliases?: readonly string[];\n values?: readonly string[];\n example?: string;\n}\n\nexport interface SsmlTagDefinition {\n name: string;\n description: string;\n aliases?: readonly string[];\n parameters: readonly SsmlParameterDefinition[];\n}\n\nexport interface SsmlHoverRange {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n}\n\nexport type SsmlHoverTargetKind = \"tag\" | \"parameter\" | \"parameter-value\";\n\nexport interface SsmlHoverTarget {\n kind: SsmlHoverTargetKind;\n tagName: string;\n isClosingTag: boolean;\n definition: SsmlTagDefinition;\n parameter?: SsmlParameterDefinition;\n range: SsmlHoverRange;\n}\n\nconst SSML_TAG_DEFINITIONS: readonly SsmlTagDefinition[] = [\n {\n name: \"voice\",\n description: \"Selects the voice and optional voice effect used to synthesize the enclosed text.\",\n parameters: [\n {\n name: \"name\",\n description: \"The voice name, such as `en-US-JennyNeural`.\",\n example: \"en-US-JennyNeural\",\n },\n {\n name: \"effect\",\n description: \"An optional voice effect, such as `eq_car`.\",\n },\n ],\n },\n {\n name: \"prosody\",\n description: \"Changes the speaking rate, pitch, volume, or pitch contour of the enclosed text.\",\n parameters: [\n {\n name: \"rate\",\n description: \"Controls speaking speed.\",\n values: PROSODY_RATE_VALUES,\n example: SSML_PRESET_EXAMPLES.prosodyRate,\n },\n {\n name: \"pitch\",\n description: \"Adjusts pitch using a named value, percentage, frequency, or semitone value.\",\n example: SSML_PRESET_EXAMPLES.prosodyPitch,\n },\n {\n name: \"volume\",\n description: \"Controls loudness using a named value, percentage, or decibel value.\",\n values: PROSODY_VOLUME_PRESETS,\n example: SSML_PRESET_EXAMPLES.prosodyVolume,\n },\n {\n name: \"contour\",\n description: \"Defines a sequence of relative pitch changes at positions in the text.\",\n example: \"(0%,+0st) (100%,+2st)\",\n },\n {\n name: \"range\",\n description: \"Adjusts the pitch range of the voice.\",\n example: \"+2st\",\n },\n ],\n },\n {\n name: \"break\",\n description: \"Inserts a pause between words or other spoken content.\",\n parameters: [\n {\n name: \"time\",\n description: \"The pause duration, for example `500ms` or `1s`.\",\n example: SSML_PRESET_EXAMPLES.breakTime,\n },\n {\n name: \"strength\",\n description: \"The relative pause strength.\",\n values: BREAK_STRENGTH_PRESETS,\n },\n ],\n },\n {\n name: \"mstts:express-as\",\n aliases: [\"express-as\", \"expressAs\"],\n description: \"Applies a speaking style, style degree, or role to the enclosed text.\",\n parameters: [\n {\n name: \"style\",\n description: \"The speaking style supported by the selected voice, such as `cheerful`.\",\n example: SSML_PRESET_EXAMPLES.expressAsStyle,\n },\n {\n name: \"styledegree\",\n aliases: [\"style-degree\", \"styleDegree\"],\n description: \"Controls the intensity of the selected speaking style.\",\n example: \"1.5\",\n },\n {\n name: \"role\",\n description: \"Changes the speaking role when supported by the selected voice.\",\n example: \"YoungAdultFemale\",\n },\n ],\n },\n {\n name: \"say-as\",\n aliases: [\"sayAs\"],\n description: \"Controls how the enclosed text is interpreted and spoken.\",\n parameters: [\n {\n name: \"interpret-as\",\n description: \"Specifies the interpretation, such as characters, digits, date, or time.\",\n example: \"characters\",\n },\n {\n name: \"format\",\n description: \"Provides a format hint for the selected interpretation.\",\n },\n {\n name: \"detail\",\n description: \"Provides an additional detail hint for the selected interpretation.\",\n },\n ],\n },\n {\n name: \"phoneme\",\n description: \"Replaces normal pronunciation with the supplied phonetic pronunciation.\",\n parameters: [\n {\n name: \"alphabet\",\n description: \"The phonetic alphabet used by the `ph` value.\",\n values: PHONEME_ALPHABET_PRESETS,\n example: SSML_PRESET_EXAMPLES.phonemeAlphabet,\n },\n {\n name: \"ph\",\n description: \"The phonetic pronunciation for the enclosed text.\",\n example: \"həˈloʊ\",\n },\n ],\n },\n {\n name: \"emphasis\",\n description: \"Adds emphasis to the enclosed text.\",\n parameters: [\n {\n name: \"level\",\n description: \"Controls the amount of emphasis.\",\n values: EMPHASIS_LEVEL_PRESETS,\n },\n ],\n },\n {\n name: \"audio\",\n description: \"Plays an audio file as part of the synthesized output.\",\n parameters: [\n {\n name: \"src\",\n description: \"The URI of the audio file.\",\n example: \"https://example.com/intro.wav\",\n },\n {\n name: \"desc\",\n description: \"Alternative text to use if the audio cannot be played.\",\n },\n {\n name: \"clipBegin\",\n description: \"The starting offset within the audio file.\",\n example: \"0s\",\n },\n {\n name: \"clipEnd\",\n description: \"The ending offset within the audio file.\",\n example: \"5s\",\n },\n {\n name: \"speed\",\n description: \"The playback speed of the audio file.\",\n example: \"1.0\",\n },\n {\n name: \"repeatCount\",\n description: \"The number of times to repeat the audio.\",\n example: \"2\",\n },\n {\n name: \"repeatDuration\",\n description: \"The total duration for which the audio may repeat.\",\n example: \"10s\",\n },\n {\n name: \"soundLevel\",\n description: \"The audio volume adjustment in decibels.\",\n example: \"-3dB\",\n },\n ],\n },\n {\n name: \"sub\",\n description: \"Substitutes the alias text when speaking the enclosed text.\",\n parameters: [\n {\n name: \"alias\",\n description: \"The text to speak instead of the enclosed text.\",\n example: \"World Wide Web\",\n },\n ],\n },\n {\n name: \"lang\",\n description: \"Changes the language used for the enclosed text.\",\n parameters: [\n {\n name: \"xml:lang\",\n aliases: [\"lang\"],\n description: \"The BCP-47 language tag.\",\n example: \"ja-JP\",\n },\n ],\n },\n {\n name: \"mark\",\n description: \"Inserts a custom marker into the synthesized audio stream.\",\n parameters: [\n {\n name: \"name\",\n description: \"The application-defined marker name.\",\n example: \"chapter-1\",\n },\n ],\n },\n {\n name: \"bookmark\",\n description: \"Inserts a bookmark marker into the synthesized audio stream.\",\n parameters: [\n {\n name: \"mark\",\n description: \"The application-defined bookmark name.\",\n example: \"chapter-1\",\n },\n ],\n },\n {\n name: \"lexicon\",\n description: \"Associates a pronunciation lexicon with the synthesized document.\",\n parameters: [\n {\n name: \"uri\",\n description: \"The URI of the pronunciation lexicon.\",\n example: \"https://example.com/lexicon.pls\",\n },\n ],\n },\n {\n name: \"p\",\n description: \"Groups text into a paragraph.\",\n parameters: [],\n },\n {\n name: \"s\",\n description: \"Groups text into a sentence.\",\n parameters: [],\n },\n {\n name: \"w\",\n description: \"Groups text into a word.\",\n parameters: [],\n },\n {\n name: \"mstts:silence\",\n aliases: [\"silence\"],\n description: \"Adds a specified silence before or after text or at a punctuation boundary.\",\n parameters: [\n {\n name: \"type\",\n description: \"The silence position or punctuation boundary.\",\n values: SILENCE_TYPE_PRESETS,\n },\n {\n name: \"value\",\n description: \"The silence duration, for example `300ms`.\",\n example: SSML_PRESET_EXAMPLES.silenceValue,\n },\n ],\n },\n {\n name: \"mstts:viseme\",\n aliases: [\"viseme\"],\n description: \"Requests viseme events for the synthesized audio.\",\n parameters: [\n {\n name: \"type\",\n description: \"The viseme event format.\",\n values: VISEME_TYPE_PRESETS,\n },\n ],\n },\n {\n name: \"mstts:audioduration\",\n description: \"Sets the target duration of synthesized audio.\",\n parameters: [\n {\n name: \"value\",\n description: \"The target duration, such as `10s`, `5000ms`, or `00:00:10`.\",\n example: \"10s\",\n },\n ],\n },\n {\n name: \"mstts:dialog\",\n description: \"Groups multiple Azure dialog turns that can use different voices.\",\n parameters: [],\n },\n {\n name: \"mstts:turn\",\n description: \"Adds one dialog turn using the required Azure voice name.\",\n parameters: [\n {\n name: \"voice\",\n description: \"The Azure voice used for this turn, such as `en-US-JennyNeural`.\",\n example: \"en-US-JennyNeural\",\n },\n ],\n },\n {\n name: \"mstts:backgroundaudio\",\n description: \"Plays background audio while speech is synthesized.\",\n parameters: [\n {\n name: \"src\",\n description: \"An absolute HTTP(S) URL for the background audio file.\",\n example: \"https://example.com/music.mp3\",\n },\n {\n name: \"volume\",\n description: \"The background audio volume from 0 to 100.\",\n example: \"70\",\n },\n {\n name: \"fadein\",\n description: \"The fade-in duration in milliseconds from 0 to 10000.\",\n example: \"1000\",\n },\n {\n name: \"fadeout\",\n description: \"The fade-out duration in milliseconds from 0 to 10000.\",\n example: \"1000\",\n },\n ],\n },\n {\n name: \"mstts:ttsembedding\",\n description: \"Embeds custom voice or speaker profile metadata for Azure Speech.\",\n parameters: [],\n },\n {\n name: \"mstts:embedding\",\n description: \"Specifies embedding metadata for custom voice scenarios.\",\n parameters: [],\n },\n {\n name: \"mstts:voiceconversion\",\n description: \"Specifies voice conversion metadata for custom voice scenarios.\",\n parameters: [],\n },\n] as const;\n\nexport { SSML_TAG_DEFINITIONS };\n\nconst definitionsByName = new Map<string, SsmlTagDefinition>();\nfor (const definition of SSML_TAG_DEFINITIONS) {\n definitionsByName.set(definition.name, definition);\n for (const alias of definition.aliases ?? []) {\n definitionsByName.set(alias, definition);\n }\n}\n\ninterface TokenRange {\n start: number;\n end: number;\n}\n\ninterface AttributeToken {\n name: TokenRange;\n value?: TokenRange;\n}\n\ninterface TagToken {\n name: string;\n nameRange: TokenRange;\n start: number;\n end: number;\n closing: boolean;\n attributes: AttributeToken[];\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction positionToOffset(source: string, lineNumber: number, column: number): number | undefined {\n if (!Number.isInteger(lineNumber) || !Number.isInteger(column) || lineNumber < 1 || column < 1) {\n return undefined;\n }\n\n let lineStart = 0;\n for (let line = 1; line < lineNumber; line += 1) {\n const newline = source.indexOf(\"\\n\", lineStart);\n if (newline === -1) {\n return undefined;\n }\n lineStart = newline + 1;\n }\n\n const lineEnd = source.indexOf(\"\\n\", lineStart);\n const lineLength = lineEnd === -1 ? source.length - lineStart : lineEnd - lineStart;\n if (column > lineLength + 1) {\n return undefined;\n }\n\n return lineStart + column - 1;\n}\n\nfunction offsetToPosition(\n source: string,\n offset: number,\n): {\n lineNumber: number;\n column: number;\n} {\n const lastNewline = source.lastIndexOf(\"\\n\", offset - 1);\n const lineNumber = source.slice(0, offset).split(\"\\n\").length;\n return {\n lineNumber,\n column: offset - lastNewline,\n };\n}\n\nfunction toRange(source: string, token: TokenRange): SsmlHoverRange {\n const start = offsetToPosition(source, token.start);\n const end = offsetToPosition(source, token.end);\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n };\n}\n\nfunction containsOffset(token: TokenRange, offset: number): boolean {\n return offset >= token.start && offset < token.end;\n}\n\nfunction findTagEnd(source: string, start: number): number | undefined {\n let quote: string | undefined;\n for (let index = start; 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 undefined;\n}\n\nfunction parseTag(source: string, start: number, contentEnd: number, tokenEnd: number): TagToken | undefined {\n let index = start + 1;\n let closing = false;\n if (source[index] === \"/\") {\n closing = true;\n index += 1;\n }\n\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n if (!isXmlNameStart(source[index])) {\n return undefined;\n }\n\n const nameStart = index;\n index += 1;\n while (index < contentEnd && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n const nameEnd = index;\n const attributes: AttributeToken[] = [];\n\n if (!closing) {\n while (index < contentEnd) {\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n if (index >= contentEnd || source[index] === \"/\") {\n break;\n }\n if (!isXmlNameStart(source[index])) {\n index += 1;\n continue;\n }\n\n const attributeStart = index;\n index += 1;\n while (index < contentEnd && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n const attributeEnd = index;\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n\n let value: TokenRange | undefined;\n if (source[index] === \"=\") {\n index += 1;\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n\n const quote = source[index];\n if (quote === '\"' || quote === \"'\") {\n index += 1;\n const valueStart = index;\n while (index < contentEnd && source[index] !== quote) {\n index += 1;\n }\n value = { start: valueStart, end: index };\n if (index < contentEnd) {\n index += 1;\n }\n } else {\n const valueStart = index;\n while (index < contentEnd && !isXmlWhitespace(source[index]) && source[index] !== \"/\") {\n index += 1;\n }\n value = { start: valueStart, end: index };\n }\n }\n\n attributes.push({\n name: { start: attributeStart, end: attributeEnd },\n value,\n });\n }\n }\n\n return {\n name: source.slice(nameStart, nameEnd),\n nameRange: { start: nameStart, end: nameEnd },\n start,\n end: tokenEnd,\n closing,\n attributes,\n };\n}\n\nfunction findTagAtOffset(source: string, offset: number): TagToken | undefined {\n let searchStart = 0;\n while (searchStart < source.length) {\n const start = source.indexOf(\"<\", searchStart);\n if (start === -1 || start > offset) {\n return undefined;\n }\n\n if (source.startsWith(\"<!--\", start)) {\n const commentEnd = source.indexOf(\"-->\", start + 4);\n const tokenEnd = commentEnd === -1 ? source.length : commentEnd + 3;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n if (source.startsWith(\"<![CDATA[\", start)) {\n const cdataEnd = source.indexOf(\"]]>\", start + 9);\n const tokenEnd = cdataEnd === -1 ? source.length : cdataEnd + 3;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n if (source.startsWith(\"<?\", start)) {\n const processingEnd = source.indexOf(\"?>\", start + 2);\n const tokenEnd = processingEnd === -1 ? source.length : processingEnd + 2;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n const tagEnd = findTagEnd(source, start + 1);\n const contentEnd = tagEnd ?? source.length;\n const tokenEnd = tagEnd === undefined ? source.length : tagEnd + 1;\n if (offset < tokenEnd) {\n return parseTag(source, start, contentEnd, tokenEnd);\n }\n\n if (tagEnd === undefined) {\n return undefined;\n }\n searchStart = tokenEnd;\n }\n return undefined;\n}\n\nfunction findParameter(definition: SsmlTagDefinition, name: string): SsmlParameterDefinition | undefined {\n return definition.parameters.find(\n (parameter) => parameter.name === name || parameter.aliases?.includes(name) === true,\n );\n}\n\nexport function getSsmlTagDefinition(name: string): SsmlTagDefinition | undefined {\n return definitionsByName.get(name);\n}\n\nexport function findSsmlHoverTarget(source: string, lineNumber: number, column: number): SsmlHoverTarget | undefined {\n const offset = positionToOffset(source, lineNumber, column);\n if (offset === undefined) {\n return undefined;\n }\n\n const tag = findTagAtOffset(source, offset);\n if (!tag) {\n return undefined;\n }\n\n const definition = getSsmlTagDefinition(tag.name);\n if (!definition) {\n return undefined;\n }\n\n if (containsOffset(tag.nameRange, offset)) {\n return {\n kind: \"tag\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n range: toRange(source, tag.nameRange),\n };\n }\n\n for (const attribute of tag.attributes) {\n if (containsOffset(attribute.name, offset)) {\n const parameter = findParameter(definition, source.slice(attribute.name.start, attribute.name.end));\n if (!parameter) {\n return undefined;\n }\n return {\n kind: \"parameter\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n parameter,\n range: toRange(source, attribute.name),\n };\n }\n\n if (attribute.value && containsOffset(attribute.value, offset)) {\n const parameter = findParameter(definition, source.slice(attribute.name.start, attribute.name.end));\n if (!parameter) {\n return undefined;\n }\n return {\n kind: \"parameter-value\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n parameter,\n range: toRange(source, attribute.value),\n };\n }\n }\n\n return undefined;\n}\n\nfunction code(value: string): string {\n return `\\`${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\")}\\``;\n}\n\nfunction formatParameter(parameter: SsmlParameterDefinition, tagName: string, locale: SsmlEditorLocale): string {\n const localizedParameter = SSML_HOVER_COPY[locale].tags[tagName]?.parameters[parameter.name];\n const description = localizedParameter?.description ?? parameter.description;\n const values =\n parameter.values && parameter.values.length > 0\n ? ` ${SSML_HOVER_COPY[locale].allowedValues}: ${parameter.values.map(code).join(\", \")}.`\n : \"\";\n const example = parameter.example ? ` ${SSML_HOVER_COPY[locale].example}: ${code(parameter.example)}.` : \"\";\n return `- ${code(parameter.name)}: ${description}${values}${example}`;\n}\n\nexport function formatSsmlHover(target: SsmlHoverTarget, locale: SsmlEditorLocale = \"en\"): string {\n const localizedTag = SSML_HOVER_COPY[locale].tags[target.definition.name];\n const tagTitle = localizedTag?.title ?? target.definition.name;\n const tagDescription = localizedTag?.description ?? target.definition.description;\n const tagSyntax = target.isClosingTag ? `</${target.tagName}>` : `<${target.tagName}>`;\n const lines = [`### ${code(tagSyntax)}`, \"\", `**${tagTitle}**`, \"\", tagDescription];\n\n if (target.parameter) {\n const localizedParameter = localizedTag?.parameters[target.parameter.name];\n const parameterTitle = localizedParameter?.title ?? target.parameter.name;\n const parameterDescription = localizedParameter?.description ?? target.parameter.description;\n lines.push(\"\", `**${SSML_HOVER_COPY[locale].parameterHeading} ${code(parameterTitle)}**`, \"\", parameterDescription);\n if (target.parameter.values && target.parameter.values.length > 0) {\n lines.push(\"\", `${SSML_HOVER_COPY[locale].allowedValues}: ${target.parameter.values.map(code).join(\", \")}.`);\n }\n if (target.parameter.example) {\n lines.push(\"\", `${SSML_HOVER_COPY[locale].example}: ${code(target.parameter.example)}.`);\n }\n } else if (target.definition.parameters.length > 0) {\n lines.push(\n \"\",\n `**${SSML_HOVER_COPY[locale].parametersHeading}**`,\n \"\",\n ...target.definition.parameters.map((parameter) => formatParameter(parameter, target.definition.name, locale)),\n );\n } else {\n lines.push(\"\", SSML_HOVER_COPY[locale].noParameters);\n }\n\n return lines.join(\"\\n\");\n}\n","import { useMemo, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n buildSsml,\n validateAzureSsml,\n type SsmlDocument,\n type SsmlElement,\n type SsmlNode,\n} from \"@ssml-builder-js/ssml-core\";\nimport { SSML_ELEMENT_COPY, type SsmlEditorLocale } from \"../locales\";\n\nexport interface VisualVoiceCatalogEntry {\n name: string;\n locale: string;\n region?: string;\n regions?: readonly string[];\n styles?: readonly string[];\n supportedTags?: readonly string[];\n unsupportedTags?: readonly string[];\n preview?: boolean;\n status?: \"ga\" | \"preview\" | \"deprecated\";\n}\n\nexport interface VoiceSelectorRenderProps {\n value: string;\n voices: readonly VisualVoiceCatalogEntry[];\n selectedVoice?: VisualVoiceCatalogEntry;\n readOnly: boolean;\n locale: SsmlEditorLocale;\n onChange: (voice: string) => void;\n}\n\nexport interface VisualInspectorRenderProps {\n document: SsmlDocument;\n element: SsmlElement;\n path: number[];\n readOnly: boolean;\n onChange: (document: SsmlDocument) => void;\n locale: SsmlEditorLocale;\n}\n\nexport type VisualInspectorRenderer = (props: VisualInspectorRenderProps) => ReactNode;\n\nexport interface VisualSsmlEditorProps {\n document: SsmlDocument;\n readOnly?: boolean;\n onChange?: (document: SsmlDocument) => void;\n onPreviewSelection?: (ssml: string) => void;\n locale?: SsmlEditorLocale;\n customInspectors?: Readonly<Record<string, VisualInspectorRenderer>>;\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n voiceLocale?: string;\n voiceRegion?: string;\n voiceStyle?: string;\n}\n\ninterface TextLeaf {\n path: number[];\n value: string;\n ancestors: string[];\n}\n\nfunction isElement(node: SsmlNode): node is SsmlElement {\n return typeof node !== \"string\" && node.type !== \"text\";\n}\n\nfunction elementLabel(element: SsmlElement): string {\n return element.type === \"custom\" || element.type === \"element\" ? element.name : element.type;\n}\n\nfunction collectTextLeaves(nodes: SsmlNode[], path: number[] = [], ancestors: string[] = []): TextLeaf[] {\n return nodes.flatMap((node, index) => {\n const currentPath = [...path, index];\n if (typeof node === \"string\") return [{ ancestors, path: currentPath, value: node }];\n if (node.type === \"text\") return [{ ancestors, path: currentPath, value: node.value }];\n return collectTextLeaves(node.children ?? [], currentPath, [...ancestors, elementLabel(node)]);\n });\n}\n\nfunction updateNodesAtPath(\n nodes: SsmlNode[],\n path: number[],\n update: (node: SsmlNode) => SsmlNode | SsmlNode[],\n): SsmlNode[] {\n if (path.length === 0) return nodes;\n const [index, ...rest] = path;\n return nodes.flatMap((node, nodeIndex) => {\n if (nodeIndex !== index) return [node];\n if (rest.length === 0) {\n const next = update(node);\n return Array.isArray(next) ? next : [next];\n }\n if (!isElement(node)) return [node];\n return [{ ...node, children: updateNodesAtPath(node.children ?? [], rest, update) }];\n });\n}\n\nfunction updateTextAtPath(document: SsmlDocument, path: number[], value: string): SsmlDocument {\n return { ...document, children: updateNodesAtPath(document.children ?? [], path, () => value) };\n}\n\nfunction getNodeAtPath(nodes: SsmlNode[], path: number[]): SsmlNode | undefined {\n let current: SsmlNode | undefined;\n let currentNodes = nodes;\n for (const index of path) {\n current = currentNodes[index];\n if (current === undefined) return undefined;\n if (!isElement(current)) {\n currentNodes = [];\n } else {\n currentNodes = current.children ?? [];\n }\n }\n return current;\n}\n\nfunction updateElementAtPath(\n document: SsmlDocument,\n path: number[],\n update: (element: SsmlElement) => SsmlElement,\n): SsmlDocument {\n return {\n ...document,\n children: updateNodesAtPath(document.children ?? [], path, (node) => (isElement(node) ? update(node) : node)),\n };\n}\n\nfunction updateElementText(element: SsmlElement, value: string): SsmlElement {\n return { ...element, children: [value] };\n}\n\nfunction updateOptionalElementProperty(\n document: SsmlDocument,\n path: number[],\n property: string,\n value: string,\n): SsmlDocument {\n return updateElementAtPath(document, path, (element) => {\n const next = { ...element } as SsmlElement & Record<string, unknown>;\n if (value.trim()) next[property] = value;\n else delete next[property];\n return next;\n });\n}\n\ninterface VisualElementField {\n key: string;\n label: string;\n multiline?: boolean;\n}\n\nconst VISUAL_ELEMENT_FIELDS: Readonly<Record<string, readonly VisualElementField[]>> = {\n voice: [\n { key: \"name\", label: \"Voice name\" },\n { key: \"effect\", label: \"Effect\" },\n ],\n prosody: [\n { key: \"rate\", label: \"Rate\" },\n { key: \"pitch\", label: \"Pitch\" },\n { key: \"volume\", label: \"Volume\" },\n { key: \"contour\", label: \"Contour\" },\n { key: \"range\", label: \"Range\" },\n ],\n \"express-as\": [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n expressAs: [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n \"mstts:express-as\": [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n \"say-as\": [\n { key: \"interpretAs\", label: \"Interpret as\" },\n { key: \"format\", label: \"Format\" },\n { key: \"detail\", label: \"Detail\" },\n ],\n sayAs: [\n { key: \"interpretAs\", label: \"Interpret as\" },\n { key: \"format\", label: \"Format\" },\n { key: \"detail\", label: \"Detail\" },\n ],\n phoneme: [\n { key: \"alphabet\", label: \"Alphabet\" },\n { key: \"ph\", label: \"Pronunciation\" },\n ],\n emphasis: [{ key: \"level\", label: \"Level\" }],\n audio: [\n { key: \"src\", label: \"Source URL\" },\n { key: \"desc\", label: \"Description\" },\n { key: \"clipBegin\", label: \"Clip begin\" },\n { key: \"clipEnd\", label: \"Clip end\" },\n { key: \"speed\", label: \"Speed\" },\n { key: \"repeatCount\", label: \"Repeat count\" },\n { key: \"repeatDuration\", label: \"Repeat duration\" },\n { key: \"soundLevel\", label: \"Sound level\" },\n ],\n mark: [{ key: \"name\", label: \"Mark name\" }],\n bookmark: [{ key: \"mark\", label: \"Bookmark name\" }],\n sub: [{ key: \"alias\", label: \"Alias\" }],\n lang: [{ key: \"lang\", label: \"Language\" }],\n lexicon: [{ key: \"uri\", label: \"Lexicon URI\" }],\n \"mstts:silence\": [\n { key: \"typeValue\", label: \"Silence type\" },\n { key: \"value\", label: \"Value\" },\n ],\n silence: [\n { key: \"typeValue\", label: \"Silence type\" },\n { key: \"value\", label: \"Value\" },\n ],\n \"mstts:audioduration\": [{ key: \"value\", label: \"Duration\" }],\n \"mstts:ttsembedding\": [{ key: \"speakerProfileId\", label: \"Speaker profile ID\" }],\n \"mstts:embedding\": [\n { key: \"id\", label: \"Embedding ID\" },\n { key: \"speakerProfileId\", label: \"Speaker profile ID\" },\n ],\n \"mstts:voiceconversion\": [\n { key: \"url\", label: \"Source URL\" },\n { key: \"profile\", label: \"Profile\" },\n { key: \"speakerProfileId\", label: \"Speaker profile ID\" },\n ],\n};\n\nfunction getElementFields(element: SsmlElement): readonly VisualElementField[] {\n return VISUAL_ELEMENT_FIELDS[elementLabel(element)] ?? [];\n}\n\nfunction localizedElementLabel(element: SsmlElement, locale: SsmlEditorLocale): string {\n return SSML_ELEMENT_COPY[locale][elementLabel(element)]?.label ?? elementLabel(element);\n}\n\nfunction filteredVoices(\n voiceCatalog: readonly VisualVoiceCatalogEntry[] | undefined,\n locale: string | undefined,\n region: string | undefined,\n style: string | undefined,\n): readonly VisualVoiceCatalogEntry[] {\n return (voiceCatalog ?? []).filter((voice) => {\n if (locale && voice.locale.toLowerCase() !== locale.toLowerCase()) return false;\n const regions = [voice.region, ...(voice.regions ?? [])].filter((candidate): candidate is string =>\n Boolean(candidate),\n );\n if (region && regions.length > 0 && !regions.some((candidate) => candidate.toLowerCase() === region.toLowerCase()))\n return false;\n if (style && !voice.styles?.some((candidate) => candidate.toLowerCase() === style.toLowerCase())) return false;\n return true;\n });\n}\n\nfunction VoiceCapabilityMatrix({\n voice,\n locale,\n}: {\n voice: VisualVoiceCatalogEntry;\n locale: SsmlEditorLocale;\n}): ReactElement {\n const status = voice.status ?? (voice.preview ? \"preview\" : undefined);\n return (\n <div className=\"ssml-editor-voice-capabilities\" data-voice-capabilities=\"\">\n <div>\n {locale === \"ja\" ? \"ステータス\" : \"Status\"}: {status?.toUpperCase() ?? (locale === \"ja\" ? \"GA\" : \"GA\")}\n {status === \"preview\" || status === \"deprecated\" ? (\n <span role=\"status\" aria-label={status} className=\"ssml-editor-voice-warning-badge\">\n {status === \"preview\" ? \"⚠ Preview\" : \"⚠ Deprecated\"}\n </span>\n ) : null}\n </div>\n {(voice.regions?.length || voice.region) && (\n <div>\n {locale === \"ja\" ? \"リージョン\" : \"Regions\"}:{\" \"}\n {[...(voice.regions ?? []), ...(voice.region ? [voice.region] : [])]\n .filter((region, index, all) => all.indexOf(region) === index)\n .join(\", \")}\n </div>\n )}\n {voice.supportedTags && voice.supportedTags.length > 0 && (\n <div>\n {locale === \"ja\" ? \"対応タグ\" : \"Supported tags\"}: {voice.supportedTags.join(\", \")}\n </div>\n )}\n {voice.unsupportedTags && voice.unsupportedTags.length > 0 && (\n <div className=\"ssml-editor-voice-unsupported\">\n {locale === \"ja\" ? \"非対応タグ\" : \"Unsupported tags\"}: {voice.unsupportedTags.join(\", \")}\n </div>\n )}\n </div>\n );\n}\n\nfunction DefaultVoiceSelector({\n value,\n voices,\n selectedVoice,\n readOnly,\n locale,\n onChange,\n}: VoiceSelectorRenderProps): ReactElement {\n return (\n <>\n <select\n aria-label={locale === \"ja\" ? \"音声\" : \"Voice\"}\n value={value}\n disabled={readOnly}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">{locale === \"ja\" ? \"音声を選択\" : \"Select a voice\"}</option>\n {voices.map((voice) => (\n <option key={voice.name} value={voice.name}>\n {voice.name}\n {voice.preview || voice.status === \"preview\" ? \" (preview)\" : \"\"}\n </option>\n ))}\n </select>\n {selectedVoice ? <VoiceCapabilityMatrix voice={selectedVoice} locale={locale} /> : null}\n </>\n );\n}\n\nfunction VisualElementInspector({\n document,\n element,\n path,\n readOnly,\n commit,\n locale,\n customInspector,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n}: {\n document: SsmlDocument;\n element: SsmlElement;\n path: number[];\n readOnly: boolean;\n commit: (document: SsmlDocument) => void;\n locale: SsmlEditorLocale;\n customInspector?: VisualInspectorRenderer;\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n voiceLocale?: string;\n voiceRegion?: string;\n voiceStyle?: string;\n}): ReactElement {\n if (customInspector) {\n return <>{customInspector({ document, element, path, readOnly, onChange: commit, locale })}</>;\n }\n const fields = getElementFields(element);\n const availableVoices = filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle);\n const selectedVoice = voiceCatalog?.find(\n (voice) => voice.name === (element.type === \"voice\" ? element.name : undefined),\n );\n const renderSelector = renderVoiceSelector ?? DefaultVoiceSelector;\n return (\n <fieldset>\n <legend>{`<${elementLabel(element)}>`}</legend>\n {fields.length === 0 ? (\n <p>This element is preserved in the visual tree. Edit its attributes in Code mode.</p>\n ) : (\n fields.map((field) => {\n const value = (element as SsmlElement & Record<string, unknown>)[field.key];\n const inputValue = value === undefined ? \"\" : String(value);\n const inputId = `ssml-visual-${field.key}`;\n return (\n <label key={field.key} htmlFor={inputId}>\n {locale === \"ja\"\n ? ((\n {\n name: \"名前\",\n effect: \"効果\",\n rate: \"速度\",\n pitch: \"ピッチ\",\n volume: \"音量\",\n contour: \"ピッチ曲線\",\n range: \"範囲\",\n style: \"スタイル\",\n styleDegree: \"スタイル強度\",\n role: \"役割\",\n interpretAs: \"解釈\",\n alphabet: \"アルファベット\",\n ph: \"発音\",\n level: \"強調レベル\",\n src: \"音声 URL\",\n desc: \"説明\",\n clipBegin: \"開始位置\",\n clipEnd: \"終了位置\",\n speed: \"速度\",\n repeatCount: \"繰り返し回数\",\n repeatDuration: \"繰り返し時間\",\n soundLevel: \"音量レベル\",\n mark: \"ブックマーク名\",\n alias: \"別名\",\n lang: \"言語\",\n uri: \"辞書 URI\",\n typeValue: \"無音の種類\",\n value: \"値\",\n id: \"埋め込み ID\",\n speakerProfileId: \"話者プロファイル ID\",\n url: \"音声変換 URL\",\n profile: \"プロファイル\",\n } as Record<string, string>\n )[field.key] ?? field.label)\n : field.label}\n {field.key === \"name\" && elementLabel(element) === \"voice\" && voiceCatalog ? (\n renderSelector({\n value: inputValue,\n voices: availableVoices,\n selectedVoice,\n readOnly,\n locale,\n onChange: (value) => commit(updateOptionalElementProperty(document, path, field.key, value)),\n })\n ) : field.multiline ? (\n <textarea\n id={inputId}\n value={inputValue}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, path, field.key, event.target.value))\n }\n />\n ) : (\n <input\n id={inputId}\n value={inputValue}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, path, field.key, event.target.value))\n }\n />\n )}\n </label>\n );\n })\n )}\n </fieldset>\n );\n}\n\nfunction getElementAncestors(nodes: SsmlNode[], path: number[], ancestors: SsmlElement[] = []): SsmlElement[] {\n const [index, ...rest] = path;\n const node = nodes[index];\n if (!node || !isElement(node)) return ancestors;\n if (rest.length === 0) return ancestors;\n return getElementAncestors(node.children ?? [], rest, [...ancestors, node]);\n}\n\nfunction buildVisualPreview(document: SsmlDocument, leaf: TextLeaf, selection: { start: number; end: number }): string {\n const start = Math.max(0, Math.min(selection.start, leaf.value.length));\n const end = Math.max(start, Math.min(selection.end, leaf.value.length));\n const value = start === end ? leaf.value : leaf.value.slice(start, end);\n const ancestors = getElementAncestors(document.children ?? [], leaf.path);\n const children = ancestors.reduceRight<SsmlNode[]>(\n (current, ancestor) => [{ ...ancestor, children: current }],\n [value],\n );\n return buildSsml({ ...document, children });\n}\n\nfunction addDialogTurn(document: SsmlDocument, path: number[]): SsmlDocument {\n return updateElementAtPath(document, path, (element) => ({\n ...element,\n children: [\n ...(element.children ?? []),\n { type: \"mstts:turn\", voice: \"en-US-JennyNeural\", children: [\"New dialog turn\"] },\n ],\n }));\n}\n\nfunction wrapTextAtPath(\n document: SsmlDocument,\n path: number[],\n start: number,\n end: number,\n tag: SsmlElement[\"type\"],\n attributes: Record<string, string>,\n): SsmlDocument {\n return {\n ...document,\n children: updateNodesAtPath(document.children ?? [], path, (node) => {\n const value = typeof node === \"string\" ? node : node.type === \"text\" ? node.value : \"\";\n if (!value || start === end) return node;\n if (tag === \"break\") {\n return [\n value.slice(0, start),\n { type: tag, attributes, children: [] } as SsmlElement,\n value.slice(start),\n ].filter((part) => (typeof part === \"string\" ? part.length > 0 : true));\n }\n const selected = value.slice(start, end);\n const wrapped = { type: tag, attributes, children: [selected] } as SsmlElement;\n return [value.slice(0, start), wrapped, value.slice(end)].filter((part) =>\n typeof part === \"string\" ? part.length > 0 : true,\n );\n }),\n };\n}\n\nfunction TreeNode({\n node,\n path,\n selectedPath,\n onSelect,\n}: {\n node: SsmlNode;\n path: number[];\n selectedPath: number[] | null;\n onSelect: (path: number[]) => void;\n}): ReactElement | null {\n if (!isElement(node)) return null;\n const name = elementLabel(node);\n const isSelected = selectedPath?.join(\".\") === path.join(\".\");\n return (\n <li>\n <button type=\"button\" aria-current={isSelected ? \"true\" : undefined} onClick={() => onSelect(path)}>\n {`<${name}>`}\n </button>\n {(node.children ?? []).length > 0 && (\n <ul>\n {node.children?.map((child, index) => (\n <TreeNode\n key={`${path.join(\".\")}/${isElement(child) ? elementLabel(child) : JSON.stringify(child)}`}\n node={child}\n path={[...path, index]}\n selectedPath={selectedPath}\n onSelect={onSelect}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function VisualSsmlEditor({\n document,\n readOnly = false,\n onChange,\n onPreviewSelection,\n locale = \"en\",\n customInspectors,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n}: VisualSsmlEditorProps): ReactElement {\n const [selectedPath, setSelectedPath] = useState<number[] | null>(null);\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n const textLeaves = useMemo(() => collectTextLeaves(document.children ?? []), [document]);\n const selectedLeaf = textLeaves.find((leaf) => leaf.path.join(\".\") === selectedPath?.join(\".\")) ?? textLeaves[0];\n const selectedElement = selectedPath ? getNodeAtPath(document.children ?? [], selectedPath) : undefined;\n const selectedCustomInspector =\n selectedElement && isElement(selectedElement)\n ? (customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type])\n : undefined;\n const diagnostics = useMemo(() => validateAzureSsml(buildSsml(document)), [document]);\n const commit = (nextDocument: SsmlDocument): void => onChange?.(nextDocument);\n\n const applyWrapper = (tag: SsmlElement[\"type\"], attributes: Record<string, string>): void => {\n if (readOnly || !selectedLeaf) return;\n const start = selection.start === selection.end ? 0 : selection.start;\n const end = selection.start === selection.end ? selectedLeaf.value.length : selection.end;\n commit(wrapTextAtPath(document, selectedLeaf.path, start, end, tag, attributes));\n };\n\n return (\n <div className=\"ssml-editor-visual\" data-ssml-editor-visual=\"\">\n <fieldset className=\"ssml-editor-visual-breadcrumb\">\n <legend>SSML structure breadcrumb</legend>\n <span><speak></span>\n {selectedLeaf?.ancestors.map((ancestor, index) => (\n <span key={selectedLeaf?.ancestors.slice(0, index + 1).join(\"/\")}> / <{ancestor}></span>\n ))}\n {selectedPath && (\n <button type=\"button\" onClick={() => setSelectedPath(null)}>\n Clear parent\n </button>\n )}\n </fieldset>\n {diagnostics.length > 0 && (\n <div role=\"alert\" aria-invalid=\"true\" className=\"ssml-editor-visual-errors\">\n {diagnostics.map((diagnostic) => (\n <div key={`${diagnostic.code}-${diagnostic.message}`}>{diagnostic.message}</div>\n ))}\n </div>\n )}\n <div className=\"ssml-editor-visual-layout\">\n <nav aria-label=\"SSML structure tree\" className=\"ssml-editor-visual-tree\">\n <strong>Structure</strong>\n <ul>\n {document.children?.map((node, index) => (\n <TreeNode\n key={isElement(node) ? elementLabel(node) : JSON.stringify(node)}\n node={node}\n path={[index]}\n selectedPath={selectedPath}\n onSelect={setSelectedPath}\n />\n ))}\n </ul>\n </nav>\n <div className=\"ssml-editor-visual-form\">\n {selectedCustomInspector && selectedElement && isElement(selectedElement) ? (\n selectedCustomInspector({\n document,\n element: selectedElement,\n path: selectedPath ?? [],\n readOnly,\n onChange: commit,\n locale,\n })\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:dialog\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <p>{SSML_ELEMENT_COPY[locale][elementLabel(selectedElement)]?.description}</p>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => commit(addDialogTurn(document, selectedPath ?? []))}\n >\n {locale === \"ja\" ? \"ターンを追加\" : \"Add turn\"}\n </button>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:turn\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <label htmlFor=\"ssml-visual-turn-voice\">\n {locale === \"ja\" ? \"音声\" : \"Voice\"}\n {voiceCatalog ? (\n (renderVoiceSelector ?? DefaultVoiceSelector)({\n value: selectedElement.voice ?? \"\",\n voices: filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle),\n selectedVoice: voiceCatalog?.find((voice) => voice.name === selectedElement.voice),\n readOnly,\n locale,\n onChange: (value) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"voice\", value)),\n })\n ) : (\n <input\n id=\"ssml-visual-turn-voice\"\n value={selectedElement.voice ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"voice\", event.target.value))\n }\n />\n )}\n </label>\n <label>\n {locale === \"ja\" ? \"話者\" : \"Speaker\"}\n <input\n value={selectedElement.speaker ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"speaker\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"発話テキスト\" : \"Turn text\"}\n <textarea\n value={\n selectedElement.children?.filter((child): child is string => typeof child === \"string\").join(\"\") ??\n \"\"\n }\n readOnly={readOnly}\n onChange={(event) =>\n commit(\n updateElementAtPath(document, selectedPath ?? [], (element) =>\n updateElementText(element, event.target.value),\n ),\n )\n }\n />\n </label>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:backgroundaudio\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <label>\n {locale === \"ja\" ? \"音声 URL\" : \"Source URL\"}\n <input\n value={selectedElement.src ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"src\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"音量\" : \"Volume\"}\n <input\n value={selectedElement.volume === undefined ? \"\" : String(selectedElement.volume)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"volume\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"フェードイン\" : \"Fade in\"}\n <input\n value={selectedElement.fadeIn === undefined ? \"\" : String(selectedElement.fadeIn)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"fadeIn\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"フェードアウト\" : \"Fade out\"}\n <input\n value={selectedElement.fadeOut === undefined ? \"\" : String(selectedElement.fadeOut)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"fadeOut\", event.target.value))\n }\n />\n </label>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) ? (\n <VisualElementInspector\n document={document}\n element={selectedElement}\n path={selectedPath ?? []}\n readOnly={readOnly}\n commit={commit}\n locale={locale}\n customInspector={\n customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type]\n }\n renderVoiceSelector={renderVoiceSelector}\n voiceCatalog={voiceCatalog}\n voiceLocale={voiceLocale}\n voiceRegion={voiceRegion}\n voiceStyle={voiceStyle}\n />\n ) : selectedLeaf ? (\n <>\n <label>\n Text\n <textarea\n value={selectedLeaf.value}\n readOnly={readOnly}\n onSelect={(event) =>\n setSelection({ start: event.currentTarget.selectionStart, end: event.currentTarget.selectionEnd })\n }\n onChange={(event) => commit(updateTextAtPath(document, selectedLeaf.path, event.target.value))}\n />\n </label>\n <fieldset className=\"ssml-editor-visual-actions\">\n <legend>Apply SSML formatting</legend>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"prosody\", { rate: \"slow\" })}>\n Rate\n </button>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"prosody\", { pitch: \"high\" })}>\n Pitch\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => applyWrapper(\"mstts:express-as\", { style: \"cheerful\" })}\n >\n Emotion\n </button>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"break\", { time: \"500ms\" })}>\n Pause\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => applyWrapper(\"phoneme\", { alphabet: \"ipa\", ph: selectedLeaf.value })}\n >\n Pronunciation\n </button>\n {onPreviewSelection && (\n <button\n type=\"button\"\n onClick={() => onPreviewSelection(buildVisualPreview(document, selectedLeaf, selection))}\n >\n Preview selection\n </button>\n )}\n </fieldset>\n </>\n ) : (\n <p>Select an element or text node to edit it.</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Fragment","useEffect","useState","Fragment","jsx","jsx","jsx","jsx","buildSsml","document","appendNode","end","name","document","end","getDocumentChildren","document","trailingLineBreak","findTagEnd","isSsmlElement","isVoice","isProsody","getDocumentChildren","document","buildSsml","useCallback","useEffect","useRef","value","findTagEnd","BREAK_STRENGTH_PRESETS","EMPHASIS_LEVEL_PRESETS","PHONEME_ALPHABET_PRESETS","PROSODY_RATE_VALUES","PROSODY_VOLUME_PRESETS","SILENCE_TYPE_PRESETS","SSML_PRESET_EXAMPLES","VISEME_TYPE_PRESETS","isXmlNameStart","isXmlNameCharacter","isXmlWhitespace","findTagEnd","tokenEnd","useRef","useCallback","model","useEffect","useState","buildSsml","Fragment","jsx","jsxs","document","value","buildSsml","useState","Fragment","jsx","jsxs","escapeXmlAttribute","SsmlEditor","document","useState","useEffect","getSelectedSsml","getCurrentLineSsml"]}
|
|
1
|
+
{"version":3,"sources":["../src/SsmlEditor.tsx","../src/buttonVisibility.ts","../src/constants/ssmlPresets.ts","../src/constants/azureVoiceStyleMap.generated.ts","../src/locales.ts","../src/constants/ui.ts","../src/components/popovers/InsertionPopover.tsx","../src/styles/editorStyles.ts","../src/components/popovers/InsertionPopovers.tsx","../src/components/popovers/ProsodyPopovers.tsx","../src/components/popovers/TextPopovers.tsx","../src/components/popovers/TimingPopovers.tsx","../src/hooks/useSsmlEditorState.ts","../src/clearSsmlDocument.ts","../src/formatXml.ts","../src/editableSsml.ts","../src/ssmlInsertion.ts","../src/ssmlContext.ts","../src/hooks/useSsmlMonaco.ts","../src/ssmlDiagnostics.ts","../src/ssmlCompletion.ts","../src/ssmlCodeAction.ts","../src/ssmlCodeLens.ts","../src/ssmlHover.ts","../src/components/VisualSsmlEditor.tsx"],"sourcesContent":["import { Fragment, forwardRef, useEffect, useImperativeHandle, useState } 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 AUDIO_DURATION_DESCRIPTIONS,\n AUDIO_DURATION_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\";\nimport {\n VisualSsmlEditor,\n type VisualInspectorRenderer,\n type VisualVoiceCatalogEntry,\n type VoiceSelectorRenderProps,\n} from \"./components/VisualSsmlEditor\";\nconst UNGROUPED_TOOLBAR_GROUP = \"__ssml-editor-ungrouped__\";\nconst TIMING_POPOVER_TAGS = new Set([\"break\", \"mstts:silence\", \"mstts:audioduration\"]);\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 {\n id: \"mstts:audioduration\",\n icon: \"◷\",\n tagName: \"mstts:audioduration\",\n selfClosing: true,\n labels: { ja: \"音声長\", en: \"Audio duration\" },\n descriptions: {\n ja: \"合成音声の目標時間を指定します。\",\n en: \"Sets the target duration of synthesized audio.\",\n },\n parameterDescription: {\n ja: \"目標時間を選択します。\",\n en: \"Selects the target duration.\",\n },\n options: createInsertionOptions(AUDIO_DURATION_PRESETS, AUDIO_DURATION_DESCRIPTIONS),\n createTemplate: (value) => ({\n prefix: `<mstts:audioduration 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\", \"mstts:audioduration\"],\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[data-ssml-editor] .ssml-editor-visual-layout {\n display: grid;\n grid-template-columns: minmax(12rem, 0.35fr) minmax(16rem, 1fr);\n gap: 1rem;\n}\n[data-ssml-editor] .ssml-editor-visual-tree,\n[data-ssml-editor] .ssml-editor-visual-form {\n display: grid;\n gap: 0.5rem;\n align-content: start;\n}\n[data-ssml-editor] .ssml-editor-visual-tree ul {\n margin: 0;\n padding-left: 1.25rem;\n}\n[data-ssml-editor] .ssml-editor-visual-tree button,\n[data-ssml-editor] .ssml-editor-visual-breadcrumb button,\n[data-ssml-editor] .ssml-editor-visual-actions button {\n padding: 0.35rem 0.5rem;\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-control-bg);\n cursor: pointer;\n}\n[data-ssml-editor] .ssml-editor-visual-tree button[aria-current] {\n border-color: var(--ssml-editor-active-border);\n background: var(--ssml-editor-active-bg);\n}\n[data-ssml-editor] .ssml-editor-visual-breadcrumb,\n[data-ssml-editor] .ssml-editor-visual-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n align-items: center;\n}\n[data-ssml-editor] .ssml-editor-visual-form textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 6rem;\n padding: 0.5rem;\n color: var(--ssml-editor-color);\n background: var(--ssml-editor-control-bg);\n border: 1px solid var(--ssml-editor-control-border);\n border-radius: 0.25rem;\n font: inherit;\n}\n[data-ssml-editor] .ssml-editor-visual-errors {\n padding: 0.5rem;\n color: var(--ssml-editor-error);\n background: var(--ssml-editor-error-bg);\n border: 1px solid var(--ssml-editor-error);\n border-radius: 0.25rem;\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 /** Selects the XML source editor or the structured visual editor. */\n editMode?: SsmlEditorEditMode;\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 /** Replaces the visual inspector for an element type or serialized tag name. */\n customInspectors?: Readonly<Record<string, VisualInspectorRenderer>>;\n /** Replaces the built-in voice catalog selector in visual mode. */\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n /** Voice metadata used by the visual selector. */\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n /** Optional locale filter for the visual voice selector. */\n voiceLocale?: string;\n /** Optional region filter for the visual voice selector. */\n voiceRegion?: string;\n /** Optional style filter for the visual voice selector. */\n voiceStyle?: string;\n /** Selected Azure voice model used for live capability validation. */\n voiceModel?: string;\n /** Alias for voiceModel. */\n model?: string;\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 type SsmlEditorEditMode = \"code\" | \"visual\";\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 customInspectors,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n voiceModel,\n model,\n emotionStyles,\n className,\n style,\n toolbarClassName,\n toolbarStyle,\n displayClassName,\n displayStyle,\n loadingFallback,\n editMode: editModeProp = \"code\",\n }: SsmlEditorProps,\n ref,\n): ReactElement {\n const [editMode, setEditMode] = useState<SsmlEditorEditMode>(editModeProp);\n useEffect(() => setEditMode(editModeProp), [editModeProp]);\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 draftDocument,\n text,\n selectionOverlay,\n activeTags,\n isDarkTheme,\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,\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 <span style={styles.toolbarSeparator} aria-hidden=\"true\" />\n <button\n type=\"button\"\n style={\n editMode === \"visual\" ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive } : toolbarButtonStyle\n }\n aria-pressed={editMode === \"visual\"}\n onClick={() => setEditMode(\"visual\")}\n >\n Visual\n </button>\n <button\n type=\"button\"\n style={\n editMode === \"code\" ? { ...toolbarButtonStyle, ...styles.toolbarButtonActive } : toolbarButtonStyle\n }\n aria-pressed={editMode === \"code\"}\n onClick={() => setEditMode(\"code\")}\n >\n Code\n </button>\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 {editMode === \"visual\" ? (\n <div style={styles.visual}>\n <VisualSsmlEditor\n document={draftDocument}\n readOnly={isReadOnly}\n onChange={commit}\n onPreviewSelection={onPreviewSelection}\n locale={localeProp ?? languageProp}\n customInspectors={customInspectors}\n renderVoiceSelector={renderVoiceSelector}\n voiceCatalog={voiceCatalog}\n voiceLocale={voiceLocale}\n voiceRegion={voiceRegion}\n voiceStyle={voiceStyle}\n voiceModel={voiceModel}\n model={model}\n />\n </div>\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 )}\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:audioduration\"\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","type SsmlPresetDescription = Readonly<Record<\"ja\" | \"en\", string>>;\n\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { AZURE_VOICE_STYLE_MAP } from \"./azureVoiceStyleMap.generated.ts\";\n\nexport interface SsmlPreset {\n id: string;\n label: string;\n ssml: string;\n description?: string;\n}\n\nexport const SSML_PRESETS: readonly SsmlPreset[] = [\n {\n id: \"basic\",\n label: \"Basic speech\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\">Hello, world!</speak>',\n description: \"A minimal SSML document.\",\n },\n {\n id: \"voice\",\n label: \"Voice selection\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">Hello, world!</voice></speak>',\n description: \"Speaks text with a selected voice.\",\n },\n {\n id: \"prosody\",\n label: \"Prosody\",\n ssml: '<speak version=\"1.0\" xml:lang=\"en-US\"><prosody rate=\"fast\" pitch=\"+2st\">Hello, world!</prosody></speak>',\n description: \"Adjusts the speech rate and pitch.\",\n },\n] as const;\n\nexport const BREAK_TIME_PRESETS = [\"500ms\", \"1s\", \"2s\", \"3s\"] as const;\nexport const BREAK_STRENGTH_PRESETS = [\"none\", \"x-weak\", \"weak\", \"medium\", \"strong\", \"x-strong\"] as const;\n\nexport const PROSODY_RATE_PRESETS = [\"x-slow\", \"slow\", \"medium\", \"fast\", \"x-fast\"] as const;\nexport const PROSODY_RATE_VALUES = [...PROSODY_RATE_PRESETS, \"percentage\"] as const;\nexport const PROSODY_PITCH_PRESETS = [\"+2st\", \"-2st\", \"0st\", \"+4st\", \"-4st\", \"+8st\", \"-8st\", \"+12st\", \"-12st\"] as const;\nexport const PROSODY_VOLUME_PRESETS = [\"silent\", \"x-soft\", \"soft\", \"medium\", \"loud\", \"x-loud\"] as const;\n\nexport const EXPRESS_AS_STYLE_PRESETS = [\n \"cheerful\",\n \"friendly\",\n \"calm\",\n \"sad\",\n \"angry\",\n \"excited\",\n \"serious\",\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"hopeful\",\n \"newscast\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n \"empathetic\",\n \"relieved\",\n \"fearful\",\n \"depressed\",\n \"disgruntled\",\n \"embarrassed\",\n \"narration-relaxed\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n] as const;\nexport type ExpressAsStyle = (typeof EXPRESS_AS_STYLE_PRESETS)[number];\n\nexport const EXPRESS_AS_STYLE_CATEGORIES = {\n emotions: [\n \"cheerful\",\n \"sad\",\n \"angry\",\n \"calm\",\n \"fearful\",\n \"depressed\",\n \"disgruntled\",\n \"embarrassed\",\n \"empathetic\",\n \"envious\",\n \"excited\",\n \"friendly\",\n \"gentle\",\n \"hopeful\",\n \"relieved\",\n \"serious\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n scenarios: [\"chat\", \"customerservice\", \"assistant\", \"livecommercial\", \"poetry-reading\", \"story\"],\n media: [\n \"newscast\",\n \"newscast-casual\",\n \"newscast-formal\",\n \"narration-professional\",\n \"narration-relaxed\",\n \"documentary-narration\",\n \"advertisement_upbeat\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n ],\n} as const;\n\nexport type ExpressAsStyleCategory = keyof typeof EXPRESS_AS_STYLE_CATEGORIES | \"other\";\n\nexport function getExpressAsStyleCategory(style: string): ExpressAsStyleCategory {\n for (const [category, styles] of Object.entries(EXPRESS_AS_STYLE_CATEGORIES) as [\n keyof typeof EXPRESS_AS_STYLE_CATEGORIES,\n readonly string[],\n ][]) {\n if (styles.includes(style)) {\n return category;\n }\n }\n\n return \"other\";\n}\n\nconst LEGACY_VOICE_STYLE_MAP = {\n \"ja-JP-MayuNeural\": [\"calm\", \"cheerful\", \"sad\"],\n \"ja-JP-KeitaNeural\": [\"chat\"],\n \"ja-JP-NanamiNeural\": [\"chat\", \"customerservice\", \"cheerful\", \"whispering\", \"sad\"],\n \"en-US-JennyMultilingualNeural\": [\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-AndrewNeural\": [\"empathetic\", \"relieved\"],\n \"en-US-JennyNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-GuyNeural\": [\n \"angry\",\n \"cheerful\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"newscast\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"ko-KR-SunHiNeural\": [\"cheerful\", \"sad\"],\n \"zh-CN-XiaoxiaoNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"terrified\",\n \"whispering\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n ],\n \"zh-CN-YunxiNeural\": [\n \"narration-relaxed\",\n \"embarrassed\",\n \"fearful\",\n \"sad\",\n \"disgruntled\",\n \"serious\",\n \"angry\",\n \"depressed\",\n \"chat\",\n \"cheerful\",\n \"assistant\",\n ],\n \"fr-FR-DeniseNeural\": [\"cheerful\", \"sad\"],\n \"fr-FR-HenriNeural\": [\"cheerful\", \"sad\"],\n \"pt-BR-FranciscaNeural\": [\"calm\"],\n \"it-IT-ElsaNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-KatjaNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-ConradNeural\": [\"cheerful\", \"sad\"],\n \"ru-RU-SvetlanaNeural\": [\"cheerful\", \"sad\", \"angry\", \"disgruntled\", \"embarrassed\", \"fearful\"],\n} as const satisfies Readonly<Record<string, readonly ExpressAsStyle[]>>;\n\n/** Snapshot generated from Azure's List Voices API. The legacy map is only a safety fallback for an empty generated file. */\nexport const VOICE_STYLE_MAP =\n Object.keys(AZURE_VOICE_STYLE_MAP).length > 0 ? AZURE_VOICE_STYLE_MAP : LEGACY_VOICE_STYLE_MAP;\n\nconst VOICE_STYLE_MAP_BY_NORMALIZED_NAME = new Map<string, readonly string[]>(\n Object.entries(VOICE_STYLE_MAP).map(([voiceName, styles]) => [voiceName.toLowerCase(), styles]),\n);\n\nexport function resolveExpressAsStyles(\n voiceName: string | null | undefined,\n candidates: readonly string[] = EXPRESS_AS_STYLE_PRESETS,\n): readonly string[] {\n const normalizedVoiceName = voiceName?.trim().toLowerCase();\n if (!normalizedVoiceName) {\n return candidates;\n }\n\n const supportedStyles = VOICE_STYLE_MAP_BY_NORMALIZED_NAME.get(normalizedVoiceName);\n if (supportedStyles === undefined) {\n return [];\n }\n\n const supportedStyleSet = new Set<string>(supportedStyles);\n return candidates.filter((style) => supportedStyleSet.has(style));\n}\nexport const EXPRESS_AS_ROLE_PRESETS = [\n \"Girl\",\n \"Boy\",\n \"YoungAdultFemale\",\n \"YoungAdultMale\",\n \"OlderAdultFemale\",\n \"OlderAdultMale\",\n \"SeniorFemale\",\n \"SeniorMale\",\n] as const;\nexport const EMPHASIS_LEVEL_PRESETS = [\"strong\", \"moderate\", \"reduced\", \"none\"] as const;\nexport const SAY_AS_PRESETS = [\n \"characters\",\n \"spell-out\",\n \"cardinal\",\n \"ordinal\",\n \"number\",\n \"date\",\n \"time\",\n \"telephone\",\n \"fraction\",\n \"address\",\n \"name\",\n \"currency\",\n] as const;\nexport const LANGUAGE_PRESETS = [\"ja-JP\", \"en-US\", \"de-DE\", \"fr-FR\"] as const;\nexport const SILENCE_VALUE_PRESETS = [\"300ms\", \"500ms\", \"1s\"] as const;\nexport const AUDIO_DURATION_PRESETS = [\"5s\", \"10s\", \"30s\"] as const;\nexport const BACKGROUND_AUDIO_DURATION_PRESETS = [\"0\", \"500\", \"1000\", \"3000\", \"10000\"] as const;\nexport const SILENCE_TYPE_PRESETS = [\n \"Leading\",\n \"Tailing\",\n \"Sentenceboundary\",\n \"Comma\",\n \"Semicolon\",\n \"Enumerationcomma\",\n] as const;\nexport const AUDIO_DURATION_DESCRIPTIONS = {\n \"5s\": { ja: \"5秒\", en: \"5 seconds\" },\n \"10s\": { ja: \"10秒\", en: \"10 seconds\" },\n \"30s\": { ja: \"30秒\", en: \"30 seconds\" },\n} as const;\nexport const PHONEME_ALPHABET_PRESETS = [\"ipa\", \"sapi\", \"ups\", \"x-sampa\"] as const;\nexport const VISEME_TYPE_PRESETS = [\"redlips_front\", \"FacialExpression\"] as const;\n\nexport const SSML_ATTRIBUTE_PRESETS = {\n break: {\n strength: BREAK_STRENGTH_PRESETS,\n time: BREAK_TIME_PRESETS,\n },\n prosody: {\n rate: PROSODY_RATE_PRESETS,\n pitch: PROSODY_PITCH_PRESETS,\n volume: PROSODY_VOLUME_PRESETS,\n },\n \"mstts:express-as\": {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n \"express-as\": {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n expressAs: {\n style: EXPRESS_AS_STYLE_PRESETS,\n role: EXPRESS_AS_ROLE_PRESETS,\n },\n \"say-as\": {\n \"interpret-as\": SAY_AS_PRESETS,\n },\n sayAs: {\n \"interpret-as\": SAY_AS_PRESETS,\n },\n emphasis: {\n level: EMPHASIS_LEVEL_PRESETS,\n },\n lang: {\n \"xml:lang\": LANGUAGE_PRESETS,\n },\n phoneme: {\n alphabet: PHONEME_ALPHABET_PRESETS,\n },\n \"mstts:silence\": {\n type: SILENCE_TYPE_PRESETS,\n value: SILENCE_VALUE_PRESETS,\n },\n \"mstts:audioduration\": {\n value: AUDIO_DURATION_PRESETS,\n },\n \"mstts:backgroundaudio\": {\n volume: PROSODY_VOLUME_PRESETS,\n fadein: BACKGROUND_AUDIO_DURATION_PRESETS,\n fadeout: BACKGROUND_AUDIO_DURATION_PRESETS,\n },\n silence: {\n type: SILENCE_TYPE_PRESETS,\n value: SILENCE_VALUE_PRESETS,\n },\n \"mstts:viseme\": {\n type: VISEME_TYPE_PRESETS,\n },\n viseme: {\n type: VISEME_TYPE_PRESETS,\n },\n} as const satisfies Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>;\n\nexport const SSML_PRESET_EXAMPLES = {\n breakTime: \"500ms\",\n prosodyRate: \"fast\",\n prosodyPitch: \"+2st\",\n prosodyVolume: \"loud\",\n expressAsStyle: \"cheerful\",\n phonemeAlphabet: \"ipa\",\n silenceValue: \"300ms\",\n} as const satisfies {\n breakTime: (typeof BREAK_TIME_PRESETS)[number];\n prosodyRate: (typeof PROSODY_RATE_PRESETS)[number];\n prosodyPitch: (typeof PROSODY_PITCH_PRESETS)[number];\n prosodyVolume: (typeof PROSODY_VOLUME_PRESETS)[number];\n expressAsStyle: (typeof EXPRESS_AS_STYLE_PRESETS)[number];\n phonemeAlphabet: (typeof PHONEME_ALPHABET_PRESETS)[number];\n silenceValue: (typeof SILENCE_VALUE_PRESETS)[number];\n};\n\nexport const BREAK_TIME_DESCRIPTIONS = {\n \"500ms\": {\n ja: \"500ミリ秒の無音\",\n en: \"Inserts 500 milliseconds of silence.\",\n },\n \"1s\": {\n ja: \"1秒の無音\",\n en: \"Inserts one second of silence.\",\n },\n \"2s\": {\n ja: \"2秒の無音\",\n en: \"Inserts two seconds of silence.\",\n },\n \"3s\": {\n ja: \"3秒の無音\",\n en: \"Inserts three seconds of silence.\",\n },\n} as const satisfies Readonly<Record<(typeof BREAK_TIME_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const EMPHASIS_LEVEL_DESCRIPTIONS = {\n strong: {\n ja: \"強い強調\",\n en: \"Applies strong emphasis.\",\n },\n moderate: {\n ja: \"中程度の強調\",\n en: \"Applies moderate emphasis.\",\n },\n reduced: {\n ja: \"弱めの強調\",\n en: \"Applies reduced emphasis.\",\n },\n none: {\n ja: \"強調なし\",\n en: \"Applies no emphasis.\",\n },\n} as const satisfies Readonly<Record<(typeof EMPHASIS_LEVEL_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_RATE_DESCRIPTIONS = {\n \"x-slow\": {\n ja: \"最も遅い速度\",\n en: \"Uses the slowest speech rate.\",\n },\n slow: {\n ja: \"遅い速度\",\n en: \"Uses a slow speech rate.\",\n },\n medium: {\n ja: \"標準的な速度\",\n en: \"Uses the standard speech rate.\",\n },\n fast: {\n ja: \"速い速度\",\n en: \"Uses a fast speech rate.\",\n },\n \"x-fast\": {\n ja: \"最も速い速度\",\n en: \"Uses the fastest speech rate.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_RATE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_PITCH_DESCRIPTIONS = {\n \"+2st\": {\n ja: \"基準の声の高さより2半音上\",\n en: \"Raises the pitch by two semitones.\",\n },\n \"-2st\": {\n ja: \"基準の声の高さより2半音下\",\n en: \"Lowers the pitch by two semitones.\",\n },\n \"0st\": {\n ja: \"基準の声の高さ\",\n en: \"Keeps the baseline pitch.\",\n },\n \"+4st\": {\n ja: \"基準の声の高さより4半音上\",\n en: \"Raises the pitch by four semitones.\",\n },\n \"-4st\": {\n ja: \"基準の声の高さより4半音下\",\n en: \"Lowers the pitch by four semitones.\",\n },\n \"+8st\": {\n ja: \"基準の声の高さより8半音上\",\n en: \"Raises the pitch by eight semitones.\",\n },\n \"-8st\": {\n ja: \"基準の声の高さより8半音下\",\n en: \"Lowers the pitch by eight semitones.\",\n },\n \"+12st\": {\n ja: \"基準の声の高さより12半音上\",\n en: \"Raises the pitch by twelve semitones.\",\n },\n \"-12st\": {\n ja: \"基準の声の高さより12半音下\",\n en: \"Lowers the pitch by twelve semitones.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_PITCH_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const PROSODY_VOLUME_DESCRIPTIONS = {\n silent: {\n ja: \"無音\",\n en: \"Makes the selected text silent.\",\n },\n \"x-soft\": {\n ja: \"最も小さい音量\",\n en: \"Uses the quietest volume.\",\n },\n soft: {\n ja: \"小さい音量\",\n en: \"Uses a soft volume.\",\n },\n medium: {\n ja: \"標準的な音量\",\n en: \"Uses the standard volume.\",\n },\n loud: {\n ja: \"大きい音量\",\n en: \"Uses a loud volume.\",\n },\n \"x-loud\": {\n ja: \"最も大きい音量\",\n en: \"Uses the loudest volume.\",\n },\n} as const satisfies Readonly<Record<(typeof PROSODY_VOLUME_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const EXPRESS_AS_STYLE_DESCRIPTIONS = {\n cheerful: {\n ja: \"明るく元気なスタイル\",\n en: \"Uses a cheerful style.\",\n },\n friendly: {\n ja: \"親しみやすいスタイル\",\n en: \"Uses a friendly style.\",\n },\n calm: {\n ja: \"穏やかなスタイル\",\n en: \"Uses a calm style.\",\n },\n sad: {\n ja: \"悲しげなスタイル\",\n en: \"Uses a sad style.\",\n },\n angry: {\n ja: \"怒ったようなスタイル\",\n en: \"Uses an angry style.\",\n },\n excited: {\n ja: \"興奮したスタイル\",\n en: \"Uses an excited style.\",\n },\n empathetic: {\n ja: \"共感を示すスタイル\",\n en: \"Uses an empathetic style.\",\n },\n relieved: {\n ja: \"安心したスタイル\",\n en: \"Uses a relieved style.\",\n },\n fearful: {\n ja: \"恐れを感じさせるスタイル\",\n en: \"Uses a fearful style.\",\n },\n depressed: {\n ja: \"落ち込んだスタイル\",\n en: \"Uses a depressed style.\",\n },\n disgruntled: {\n ja: \"不満を感じさせるスタイル\",\n en: \"Uses a disgruntled style.\",\n },\n embarrassed: {\n ja: \"恥ずかしそうなスタイル\",\n en: \"Uses an embarrassed style.\",\n },\n serious: {\n ja: \"真剣なスタイル\",\n en: \"Uses a serious style.\",\n },\n assistant: {\n ja: \"デジタルアシスタント向けのスタイル\",\n en: \"Uses a digital assistant style.\",\n },\n chat: {\n ja: \"会話向けのスタイル\",\n en: \"Uses a conversational style.\",\n },\n customerservice: {\n ja: \"カスタマーサービス向けのスタイル\",\n en: \"Uses a customer service style.\",\n },\n hopeful: {\n ja: \"希望に満ちたスタイル\",\n en: \"Uses a hopeful style.\",\n },\n newscast: {\n ja: \"ニュース読み上げ向けのスタイル\",\n en: \"Uses a newscast style.\",\n },\n shouting: {\n ja: \"叫ぶようなスタイル\",\n en: \"Uses a shouting style.\",\n },\n terrified: {\n ja: \"恐怖に満ちたスタイル\",\n en: \"Uses a terrified style.\",\n },\n unfriendly: {\n ja: \"無愛想なスタイル\",\n en: \"Uses an unfriendly style.\",\n },\n whispering: {\n ja: \"ささやくようなスタイル\",\n en: \"Uses a whispering style.\",\n },\n \"narration-relaxed\": {\n ja: \"リラックスしたナレーション向けのスタイル\",\n en: \"Uses a relaxed narration style.\",\n },\n \"poetry-reading\": {\n ja: \"詩の朗読向けのスタイル\",\n en: \"Uses a poetry-reading style.\",\n },\n sports_commentary: {\n ja: \"スポーツ実況向けのスタイル\",\n en: \"Uses a sports commentary style.\",\n },\n sports_commentary_excited: {\n ja: \"興奮したスポーツ実況向けのスタイル\",\n en: \"Uses an excited sports commentary style.\",\n },\n story: {\n ja: \"物語の朗読向けのスタイル\",\n en: \"Uses a storytelling style.\",\n },\n} as const satisfies Readonly<Record<(typeof EXPRESS_AS_STYLE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const SAY_AS_DESCRIPTIONS = {\n characters: {\n ja: \"1文字ずつの読み上げ\",\n en: \"Speaks the characters one by one.\",\n },\n \"spell-out\": {\n ja: \"綴りの読み上げ(1文字ずつ)\",\n en: \"Spells out the text character by character.\",\n },\n cardinal: {\n ja: \"基数としての読み上げ\",\n en: \"Speaks the value as a cardinal number.\",\n },\n ordinal: {\n ja: \"序数としての読み上げ\",\n en: \"Speaks the value as an ordinal number.\",\n },\n number: {\n ja: \"数値としての読み上げ\",\n en: \"Speaks the value as a number.\",\n },\n date: {\n ja: \"日付としての読み上げ\",\n en: \"Speaks the value as a date.\",\n },\n time: {\n ja: \"時刻としての読み上げ\",\n en: \"Speaks the value as a time.\",\n },\n telephone: {\n ja: \"電話番号としての読み上げ\",\n en: \"Speaks the value as a telephone number.\",\n },\n fraction: {\n ja: \"分数としての読み上げ\",\n en: \"Speaks the value as a fraction.\",\n },\n address: {\n ja: \"住所としての読み上げ\",\n en: \"Speaks the value as an address.\",\n },\n name: {\n ja: \"名前としての読み上げ\",\n en: \"Speaks the value as a name.\",\n },\n currency: {\n ja: \"通貨としての読み上げ\",\n en: \"Speaks the value as currency.\",\n },\n} as const satisfies Readonly<Record<(typeof SAY_AS_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const LANGUAGE_DESCRIPTIONS = {\n \"ja-JP\": {\n ja: \"日本語(日本)で読み上げます。\",\n en: \"Speaks the text in Japanese (Japan).\",\n },\n \"en-US\": {\n ja: \"英語(米国)で読み上げます。\",\n en: \"Speaks the text in English (United States).\",\n },\n \"de-DE\": {\n ja: \"ドイツ語(ドイツ)で読み上げます。\",\n en: \"Speaks the text in German (Germany).\",\n },\n \"fr-FR\": {\n ja: \"フランス語(フランス)で読み上げます。\",\n en: \"Speaks the text in French (France).\",\n },\n} as const satisfies Readonly<Record<(typeof LANGUAGE_PRESETS)[number], SsmlPresetDescription>>;\n\nexport const SILENCE_VALUE_DESCRIPTIONS = {\n \"300ms\": {\n ja: \"先頭に300ミリ秒の無音を挿入します。\",\n en: \"Inserts 300 milliseconds of leading silence.\",\n },\n \"500ms\": {\n ja: \"先頭に500ミリ秒の無音を挿入します。\",\n en: \"Inserts 500 milliseconds of leading silence.\",\n },\n \"1s\": {\n ja: \"先頭に1秒の無音を挿入します。\",\n en: \"Inserts one second of leading silence.\",\n },\n} as const satisfies Readonly<Record<(typeof SILENCE_VALUE_PRESETS)[number], SsmlPresetDescription>>;\n","/** Generated by scripts/sync-azure-voices.ts. */\nexport const AZURE_VOICE_STYLE_MAP = {\n \"de-DE-ConradNeural\": [\"cheerful\", \"sad\"],\n \"de-DE-KatjaNeural\": [\"cheerful\", \"sad\"],\n \"en-US-AndrewNeural\": [\"empathetic\", \"relieved\"],\n \"en-US-GuyNeural\": [\n \"angry\",\n \"cheerful\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"newscast\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-JennyMultilingualNeural\": [\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"en-US-JennyNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"shouting\",\n \"terrified\",\n \"unfriendly\",\n \"whispering\",\n ],\n \"es-ES-ElviraNeural\": [],\n \"fil-PH-AngeloNeural\": [],\n \"fil-PH-Angelo:DragonHDLatestNeural\": [],\n \"fil-PH-BlessicaNeural\": [],\n \"fil-PH-Blessica:DragonHDLatestNeural\": [],\n \"fr-FR-DeniseNeural\": [\"cheerful\", \"sad\"],\n \"fr-FR-HenriNeural\": [\"cheerful\", \"sad\"],\n \"id-ID-GadisNeural\": [],\n \"it-IT-ElsaNeural\": [\"cheerful\", \"sad\"],\n \"ja-JP-KeitaNeural\": [\"chat\"],\n \"ja-JP-MayuNeural\": [\"calm\", \"cheerful\", \"sad\"],\n \"ja-JP-NanamiNeural\": [\"chat\", \"customerservice\", \"cheerful\", \"whispering\", \"sad\"],\n \"ko-KR-SunHiNeural\": [\"cheerful\", \"sad\"],\n \"ms-MY-YasminNeural\": [],\n \"pt-BR-FranciscaNeural\": [\"calm\"],\n \"ru-RU-SvetlanaNeural\": [\"cheerful\", \"sad\", \"angry\", \"disgruntled\", \"embarrassed\", \"fearful\"],\n \"th-TH-PremwadeeNeural\": [],\n \"vi-VN-HoaiMyNeural\": [],\n \"zh-CN-XiaoxiaoNeural\": [\n \"assistant\",\n \"chat\",\n \"customerservice\",\n \"newscast\",\n \"cheerful\",\n \"empathetic\",\n \"excited\",\n \"friendly\",\n \"hopeful\",\n \"sad\",\n \"terrified\",\n \"whispering\",\n \"poetry-reading\",\n \"sports_commentary\",\n \"sports_commentary_excited\",\n \"story\",\n ],\n \"zh-CN-YunxiNeural\": [\n \"narration-relaxed\",\n \"embarrassed\",\n \"fearful\",\n \"sad\",\n \"disgruntled\",\n \"serious\",\n \"angry\",\n \"depressed\",\n \"chat\",\n \"cheerful\",\n \"assistant\",\n ],\n \"zh-TW-HsiaoChenNeural\": [],\n} as const satisfies Readonly<Record<string, readonly string[]>>;\n","export type SsmlEditorLocale = \"ja\" | \"en\";\nexport type SsmlEditorLanguage = SsmlEditorLocale;\nexport type SsmlEditorLocalizedText = Readonly<Record<SsmlEditorLocale, string>>;\n\nexport interface EditorCopy {\n editorAriaLabel: string;\n toolbarAriaLabel: string;\n undo: string;\n undoTitle: string;\n redo: string;\n redoTitle: string;\n clearAll: string;\n clearAllTitle: string;\n help: string;\n helpTitle: string;\n helpHeading: string;\n helpDescription: string;\n parameters: string;\n format: string;\n formatTitle: string;\n decorations: string;\n decorationsShowTitle: string;\n decorationsHideTitle: string;\n syntaxError: string;\n selectionActions: string;\n selectionCountSuffix: string;\n previewSelection: string;\n previewSelectionTitle: string;\n noAvailableOptions: string;\n styleNotSupported: string;\n categoryEmotions: string;\n categoryScenarios: string;\n categoryMedia: string;\n categoryOther: string;\n}\n\nexport interface InlineBadgeCopy {\n pause: string;\n pitch: string;\n prosody: string;\n}\n\nexport interface SsmlHoverParameterCopy {\n title: string;\n description: string;\n}\n\nexport interface SsmlHoverTagCopy {\n title: string;\n description: string;\n parameters: Readonly<Record<string, SsmlHoverParameterCopy>>;\n}\n\nexport interface SsmlHoverLocale {\n parameterHeading: string;\n parametersHeading: string;\n allowedValues: string;\n example: string;\n noParameters: string;\n tags: Readonly<Record<string, SsmlHoverTagCopy>>;\n}\n\nexport interface SsmlElementLocaleCopy {\n label: string;\n description: string;\n validationErrors: Readonly<Record<string, string>>;\n}\n\n/** Localized labels and validation copy for Azure extension elements. */\nexport const SSML_ELEMENT_COPY: Readonly<Record<SsmlEditorLocale, Readonly<Record<string, SsmlElementLocaleCopy>>>> = {\n ja: {\n dialog: {\n label: \"ダイアログ\",\n description: \"複数の話者ターンをまとめます。\",\n validationErrors: { turn: \"turn は dialog の直下に配置してください。\" },\n },\n \"mstts:dialog\": {\n label: \"ダイアログ\",\n description: \"複数の話者ターンをまとめます。\",\n validationErrors: { turn: \"turn は dialog の直下に配置してください。\" },\n },\n turn: {\n label: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n validationErrors: { voice: \"voice または speaker を指定してください。\" },\n },\n \"mstts:turn\": {\n label: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n validationErrors: { voice: \"voice または speaker を指定してください。\" },\n },\n backgroundaudio: {\n label: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n validationErrors: { src: \"背景音声には URL を指定してください。\" },\n },\n \"mstts:backgroundaudio\": {\n label: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n validationErrors: { src: \"背景音声には URL を指定してください。\" },\n },\n ttsembedding: {\n label: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n validationErrors: { speakerProfileId: \"話者プロファイル ID を指定してください。\" },\n },\n \"mstts:ttsembedding\": {\n label: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n validationErrors: { speakerProfileId: \"話者プロファイル ID を指定してください。\" },\n },\n embedding: {\n label: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n validationErrors: {},\n },\n \"mstts:embedding\": {\n label: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n validationErrors: {},\n },\n silence: {\n label: \"無音\",\n description: \"発話前後または句読点の境界に無音を追加します。\",\n validationErrors: { value: \"無音の長さを指定してください。\" },\n },\n \"mstts:silence\": {\n label: \"無音\",\n description: \"発話前後または句読点の境界に無音を追加します。\",\n validationErrors: { value: \"無音の長さを指定してください。\" },\n },\n voiceconversion: {\n label: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n validationErrors: {},\n },\n \"mstts:voiceconversion\": {\n label: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n validationErrors: {},\n },\n },\n en: {\n dialog: {\n label: \"Dialog\",\n description: \"Groups multiple speaker turns.\",\n validationErrors: { turn: \"Place turns directly inside a dialog.\" },\n },\n \"mstts:dialog\": {\n label: \"Dialog\",\n description: \"Groups multiple speaker turns.\",\n validationErrors: { turn: \"Place turns directly inside a dialog.\" },\n },\n turn: {\n label: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n validationErrors: { voice: \"Provide a voice or speaker.\" },\n },\n \"mstts:turn\": {\n label: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n validationErrors: { voice: \"Provide a voice or speaker.\" },\n },\n backgroundaudio: {\n label: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n validationErrors: { src: \"Provide a background audio URL.\" },\n },\n \"mstts:backgroundaudio\": {\n label: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n validationErrors: { src: \"Provide a background audio URL.\" },\n },\n ttsembedding: {\n label: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n validationErrors: { speakerProfileId: \"Provide a speaker profile ID.\" },\n },\n \"mstts:ttsembedding\": {\n label: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n validationErrors: { speakerProfileId: \"Provide a speaker profile ID.\" },\n },\n embedding: {\n label: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n validationErrors: {},\n },\n \"mstts:embedding\": {\n label: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n validationErrors: {},\n },\n silence: {\n label: \"Silence\",\n description: \"Adds silence before, after, or around punctuation.\",\n validationErrors: { value: \"Provide a silence duration.\" },\n },\n \"mstts:silence\": {\n label: \"Silence\",\n description: \"Adds silence before, after, or around punctuation.\",\n validationErrors: { value: \"Provide a silence duration.\" },\n },\n voiceconversion: {\n label: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n validationErrors: {},\n },\n \"mstts:voiceconversion\": {\n label: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n validationErrors: {},\n },\n },\n};\n\nexport const EDITOR_COPY: Readonly<Record<SsmlEditorLocale, EditorCopy>> = {\n ja: {\n editorAriaLabel: \"SSMLエディター\",\n toolbarAriaLabel: \"SSMLツールバー\",\n clearAll: \"全てクリア\",\n clearAllTitle: \"音声設定を保持してXML要素を削除し本文を残す\",\n undo: \"元に戻す\",\n undoTitle: \"直前の変更を元に戻す\",\n redo: \"やり直す\",\n redoTitle: \"元に戻した変更をやり直す\",\n help: \"説明\",\n helpTitle: \"ボタンとパラメータの説明を表示\",\n helpHeading: \"ボタンとパラメータの説明\",\n helpDescription: \"各コントロールの機能とパラメータを確認できます。\",\n parameters: \"パラメータ\",\n format: \"フォーマット\",\n formatTitle: \"本文のXMLを改行して見やすく表示\",\n decorations: \"装飾\",\n decorationsShowTitle: \"インライン装飾を表示\",\n decorationsHideTitle: \"インライン装飾を非表示\",\n syntaxError: \"構文エラー\",\n selectionActions: \"選択範囲の操作\",\n selectionCountSuffix: \"文字\",\n previewSelection: \"選択部分を試聴\",\n previewSelectionTitle: \"選択部分のSSMLを試聴\",\n noAvailableOptions: \"利用可能な選択肢がありません。\",\n styleNotSupported: \"この音声はスタイル指定に対応していません\",\n categoryEmotions: \"感情・トーン\",\n categoryScenarios: \"会話・シナリオ\",\n categoryMedia: \"メディア・ナレーション\",\n categoryOther: \"その他\",\n },\n en: {\n editorAriaLabel: \"SSML editor\",\n toolbarAriaLabel: \"SSML toolbar\",\n clearAll: \"Clear all\",\n clearAllTitle: \"Remove non-voice XML elements and keep the text and voice settings\",\n undo: \"Undo\",\n undoTitle: \"Undo the last change\",\n redo: \"Redo\",\n redoTitle: \"Redo the last undone change\",\n help: \"Help\",\n helpTitle: \"Show button and parameter descriptions\",\n helpHeading: \"Button and parameter descriptions\",\n helpDescription: \"Review what each control does and its parameters.\",\n parameters: \"Parameters\",\n format: \"Format\",\n formatTitle: \"Format the XML in the editor\",\n decorations: \"Decorations\",\n decorationsShowTitle: \"Show inline decorations\",\n decorationsHideTitle: \"Hide inline decorations\",\n syntaxError: \"Syntax error\",\n selectionActions: \"Selection actions\",\n selectionCountSuffix: \" characters\",\n previewSelection: \"Preview selection\",\n previewSelectionTitle: \"Preview the selected SSML\",\n noAvailableOptions: \"No options are available.\",\n styleNotSupported: \"This voice does not support style selection.\",\n categoryEmotions: \"Emotions / Tone\",\n categoryScenarios: \"Conversations / Scenarios\",\n categoryMedia: \"Media / Broadcast\",\n categoryOther: \"Other\",\n },\n};\n\nexport const INLINE_BADGE_COPY: Readonly<Record<SsmlEditorLocale, InlineBadgeCopy>> = {\n ja: {\n pause: \"間\",\n pitch: \"ピッチ変化\",\n prosody: \"声の調整\",\n },\n en: {\n pause: \"Pause\",\n pitch: \"Pitch change\",\n prosody: \"Prosody\",\n },\n};\n\nexport const SSML_HOVER_COPY: Readonly<Record<SsmlEditorLocale, SsmlHoverLocale>> = {\n ja: {\n parameterHeading: \"パラメータ\",\n parametersHeading: \"パラメータ\",\n allowedValues: \"使用できる値\",\n example: \"例\",\n noParameters: \"この要素にパラメータはありません。\",\n tags: {\n voice: {\n title: \"音声\",\n description: \"囲まれたテキストの合成に使用する音声と、任意の音声効果を選択します。\",\n parameters: {\n name: { title: \"name\", description: \"音声名。例: `en-US-JennyNeural`。\" },\n effect: { title: \"effect\", description: \"任意の音声効果。例: `eq_car`。\" },\n },\n },\n prosody: {\n title: \"韻律\",\n description: \"囲まれたテキストの速度、ピッチ、音量、またはピッチ曲線を変更します。\",\n parameters: {\n rate: { title: \"rate\", description: \"発話速度を指定します。\" },\n pitch: { title: \"pitch\", description: \"名前付きの値、割合、周波数、または半音でピッチを調整します。\" },\n volume: { title: \"volume\", description: \"名前付きの値、割合、またはデシベル値で音量を指定します。\" },\n contour: { title: \"contour\", description: \"テキスト内の位置ごとの相対的なピッチ変化を定義します。\" },\n range: { title: \"range\", description: \"音声のピッチ範囲を調整します。\" },\n },\n },\n break: {\n title: \"間\",\n description: \"単語やその他の音声コンテンツの間にポーズを挿入します。\",\n parameters: {\n time: { title: \"time\", description: \"ポーズの長さ。例: `500ms` または `1s`。\" },\n strength: { title: \"strength\", description: \"相対的なポーズの強さ。\" },\n },\n },\n \"mstts:express-as\": {\n title: \"表現\",\n description: \"囲まれたテキストに音声スタイル、スタイルの強さ、または役割を適用します。\",\n parameters: {\n style: { title: \"style\", description: \"選択した音声が対応する音声スタイル。例: `cheerful`。\" },\n styledegree: { title: \"styledegree\", description: \"選択した音声スタイルの強さを指定します。\" },\n role: { title: \"role\", description: \"対応している場合に音声の役割を変更します。\" },\n },\n },\n \"say-as\": {\n title: \"読み上げ方\",\n description: \"囲まれたテキストの解釈方法と読み上げ方を指定します。\",\n parameters: {\n \"interpret-as\": { title: \"interpret-as\", description: \"文字、数字、日付、時刻などの解釈を指定します。\" },\n format: { title: \"format\", description: \"選択した解釈の形式を補足します。\" },\n detail: { title: \"detail\", description: \"選択した解釈の詳細を補足します。\" },\n },\n },\n phoneme: {\n title: \"音素\",\n description: \"指定した音素表記で通常の発音を置き換えます。\",\n parameters: {\n alphabet: { title: \"alphabet\", description: \"`ph` 値に使用する音素アルファベット。\" },\n ph: { title: \"ph\", description: \"囲まれたテキストの音素表記。\" },\n },\n },\n emphasis: {\n title: \"強調\",\n description: \"囲まれたテキストを強調します。\",\n parameters: {\n level: { title: \"level\", description: \"強調の度合いを指定します。\" },\n },\n },\n audio: {\n title: \"音声ファイル\",\n description: \"合成結果の一部として音声ファイルを再生します。\",\n parameters: {\n src: { title: \"src\", description: \"音声ファイルの URI。\" },\n desc: { title: \"desc\", description: \"音声を再生できない場合に使用する代替テキスト。\" },\n clipBegin: { title: \"clipBegin\", description: \"音声ファイル内の開始位置。例: `0s`。\" },\n clipEnd: { title: \"clipEnd\", description: \"音声ファイル内の終了位置。例: `5s`。\" },\n speed: { title: \"speed\", description: \"音声ファイルの再生速度。例: `1.0`。\" },\n repeatCount: { title: \"repeatCount\", description: \"音声を繰り返す回数。例: `2`。\" },\n repeatDuration: { title: \"repeatDuration\", description: \"音声を繰り返す合計時間。例: `10s`。\" },\n soundLevel: { title: \"soundLevel\", description: \"デシベル単位の音量調整。例: `-3dB`。\" },\n },\n },\n sub: {\n title: \"置換\",\n description: \"囲まれたテキストの代わりに別名テキストを読み上げます。\",\n parameters: {\n alias: { title: \"alias\", description: \"元のテキストの代わりに読み上げるテキスト。例: `World Wide Web`。\" },\n },\n },\n lang: {\n title: \"言語\",\n description: \"囲まれたテキストの読み上げ言語を変更します。\",\n parameters: {\n \"xml:lang\": { title: \"xml:lang\", description: \"BCP-47 言語タグ。例: `ja-JP`。\" },\n },\n },\n mark: {\n title: \"マーカー\",\n description: \"合成音声ストリームにカスタムマーカーを挿入します。\",\n parameters: {\n name: { title: \"name\", description: \"アプリケーションで定義したマーカー名。例: `chapter-1`。\" },\n },\n },\n bookmark: {\n title: \"ブックマーク\",\n description: \"合成音声ストリームにブックマークマーカーを挿入します。\",\n parameters: {\n mark: { title: \"mark\", description: \"アプリケーションで定義したブックマーク名。例: `chapter-1`。\" },\n },\n },\n lexicon: {\n title: \"発音辞書\",\n description: \"合成文書に発音辞書を関連付けます。\",\n parameters: {\n uri: { title: \"uri\", description: \"発音辞書の URI。\" },\n },\n },\n p: { title: \"段落\", description: \"テキストを段落としてまとめます。\", parameters: {} },\n s: { title: \"文\", description: \"テキストを文としてまとめます。\", parameters: {} },\n w: { title: \"単語\", description: \"テキストを単語としてまとめます。\", parameters: {} },\n \"mstts:silence\": {\n title: \"無音\",\n description: \"テキストの前後、または句読点の境界に指定した無音を追加します。\",\n parameters: {\n type: { title: \"type\", description: \"無音の位置または句読点の境界。\" },\n value: { title: \"value\", description: \"無音の長さ。例: `300ms`。\" },\n },\n },\n \"mstts:viseme\": {\n title: \"ビゼーム\",\n description: \"合成音声のビゼームイベントを要求します。\",\n parameters: {\n type: { title: \"type\", description: \"ビゼームイベントの形式。\" },\n },\n },\n \"mstts:audioduration\": {\n title: \"音声長\",\n description: \"合成音声の目標時間を指定します。\",\n parameters: {\n value: { title: \"value\", description: \"目標時間。例: `10s`、`5000ms`、`00:00:10`。\" },\n },\n },\n \"mstts:dialog\": { title: \"ダイアログ\", description: \"複数の話者ターンをまとめます。\", parameters: {} },\n \"mstts:turn\": {\n title: \"話者ターン\",\n description: \"ダイアログ内の話者と発話内容を指定します。\",\n parameters: {\n voice: { title: \"voice\", description: \"このターンで使用する Azure 音声名。\" },\n speaker: { title: \"speaker\", description: \"話者識別子。\" },\n },\n },\n \"mstts:backgroundaudio\": {\n title: \"背景音声\",\n description: \"合成音声の背後で再生する音声ファイルを指定します。\",\n parameters: { src: { title: \"src\", description: \"音声ファイルの HTTPS URL。\" } },\n },\n \"mstts:ttsembedding\": {\n title: \"音声埋め込み\",\n description: \"カスタム音声または話者プロファイルのメタデータを埋め込みます。\",\n parameters: { speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" } },\n },\n \"mstts:embedding\": {\n title: \"埋め込み\",\n description: \"話者埋め込みのメタデータを指定します。\",\n parameters: {\n id: { title: \"id\", description: \"埋め込み ID。\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" },\n },\n },\n \"mstts:voiceconversion\": {\n title: \"音声変換\",\n description: \"カスタム音声の変換メタデータを指定します。\",\n parameters: {\n url: { title: \"url\", description: \"音声変換プロファイル URL。\" },\n profile: { title: \"profile\", description: \"変換プロファイル。\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"話者プロファイル ID。\" },\n },\n },\n },\n },\n en: {\n parameterHeading: \"Parameter\",\n parametersHeading: \"Parameters\",\n allowedValues: \"Allowed values\",\n example: \"Example\",\n noParameters: \"This element has no parameters.\",\n tags: {\n voice: {\n title: \"Voice\",\n description: \"Selects the voice and optional voice effect used to synthesize the enclosed text.\",\n parameters: {\n name: { title: \"name\", description: \"The voice name, such as `en-US-JennyNeural`.\" },\n effect: { title: \"effect\", description: \"An optional voice effect, such as `eq_car`.\" },\n },\n },\n prosody: {\n title: \"Prosody\",\n description: \"Changes the speaking rate, pitch, volume, or pitch contour of the enclosed text.\",\n parameters: {\n rate: { title: \"rate\", description: \"Controls speaking speed.\" },\n pitch: {\n title: \"pitch\",\n description: \"Adjusts pitch using a named value, percentage, frequency, or semitone value.\",\n },\n volume: {\n title: \"volume\",\n description: \"Controls loudness using a named value, percentage, or decibel value.\",\n },\n contour: {\n title: \"contour\",\n description: \"Defines a sequence of relative pitch changes at positions in the text.\",\n },\n range: { title: \"range\", description: \"Adjusts the pitch range of the voice.\" },\n },\n },\n break: {\n title: \"Break\",\n description: \"Inserts a pause between words or other spoken content.\",\n parameters: {\n time: { title: \"time\", description: \"The pause duration, for example `500ms` or `1s`.\" },\n strength: { title: \"strength\", description: \"The relative pause strength.\" },\n },\n },\n \"mstts:express-as\": {\n title: \"Express-as\",\n description: \"Applies a speaking style, style degree, or role to the enclosed text.\",\n parameters: {\n style: {\n title: \"style\",\n description: \"The speaking style supported by the selected voice, such as `cheerful`.\",\n },\n styledegree: { title: \"styledegree\", description: \"Controls the intensity of the selected speaking style.\" },\n role: { title: \"role\", description: \"Changes the speaking role when supported by the selected voice.\" },\n },\n },\n \"say-as\": {\n title: \"Say-as\",\n description: \"Controls how the enclosed text is interpreted and spoken.\",\n parameters: {\n \"interpret-as\": {\n title: \"interpret-as\",\n description: \"Specifies the interpretation, such as characters, digits, date, or time.\",\n },\n format: { title: \"format\", description: \"Provides a format hint for the selected interpretation.\" },\n detail: {\n title: \"detail\",\n description: \"Provides an additional detail hint for the selected interpretation.\",\n },\n },\n },\n phoneme: {\n title: \"Phoneme\",\n description: \"Replaces normal pronunciation with the supplied phonetic pronunciation.\",\n parameters: {\n alphabet: { title: \"alphabet\", description: \"The phonetic alphabet used by the `ph` value.\" },\n ph: { title: \"ph\", description: \"The phonetic pronunciation for the enclosed text.\" },\n },\n },\n emphasis: {\n title: \"Emphasis\",\n description: \"Adds emphasis to the enclosed text.\",\n parameters: {\n level: { title: \"level\", description: \"Controls the amount of emphasis.\" },\n },\n },\n audio: {\n title: \"Audio\",\n description: \"Plays an audio file as part of the synthesized output.\",\n parameters: {\n src: { title: \"src\", description: \"The URI of the audio file.\" },\n desc: { title: \"desc\", description: \"Alternative text to use if the audio cannot be played.\" },\n clipBegin: { title: \"clipBegin\", description: \"The starting offset within the audio file.\" },\n clipEnd: { title: \"clipEnd\", description: \"The ending offset within the audio file.\" },\n speed: { title: \"speed\", description: \"The playback speed of the audio file.\" },\n repeatCount: { title: \"repeatCount\", description: \"The number of times to repeat the audio.\" },\n repeatDuration: {\n title: \"repeatDuration\",\n description: \"The total duration for which the audio may repeat.\",\n },\n soundLevel: { title: \"soundLevel\", description: \"The audio volume adjustment in decibels.\" },\n },\n },\n sub: {\n title: \"Substitution\",\n description: \"Substitutes the alias text when speaking the enclosed text.\",\n parameters: {\n alias: { title: \"alias\", description: \"The text to speak instead of the enclosed text.\" },\n },\n },\n lang: {\n title: \"Language\",\n description: \"Changes the language used for the enclosed text.\",\n parameters: {\n \"xml:lang\": { title: \"xml:lang\", description: \"The BCP-47 language tag.\" },\n },\n },\n mark: {\n title: \"Mark\",\n description: \"Inserts a custom marker into the synthesized audio stream.\",\n parameters: {\n name: { title: \"name\", description: \"The application-defined marker name.\" },\n },\n },\n bookmark: {\n title: \"Bookmark\",\n description: \"Inserts a bookmark marker into the synthesized audio stream.\",\n parameters: {\n mark: { title: \"mark\", description: \"The application-defined bookmark name.\" },\n },\n },\n lexicon: {\n title: \"Lexicon\",\n description: \"Associates a pronunciation lexicon with the synthesized document.\",\n parameters: {\n uri: { title: \"uri\", description: \"The URI of the pronunciation lexicon.\" },\n },\n },\n p: { title: \"Paragraph\", description: \"Groups text into a paragraph.\", parameters: {} },\n s: { title: \"Sentence\", description: \"Groups text into a sentence.\", parameters: {} },\n w: { title: \"Word\", description: \"Groups text into a word.\", parameters: {} },\n \"mstts:silence\": {\n title: \"Silence\",\n description: \"Adds a specified silence before or after text or at a punctuation boundary.\",\n parameters: {\n type: { title: \"type\", description: \"The silence position or punctuation boundary.\" },\n value: { title: \"value\", description: \"The silence duration, for example `300ms`.\" },\n },\n },\n \"mstts:viseme\": {\n title: \"Viseme\",\n description: \"Requests viseme events for the synthesized audio.\",\n parameters: {\n type: { title: \"type\", description: \"The viseme event format.\" },\n },\n },\n \"mstts:audioduration\": {\n title: \"Audio duration\",\n description: \"Sets the target duration of synthesized audio.\",\n parameters: {\n value: { title: \"value\", description: \"The target duration, such as `10s`, `5000ms`, or `00:00:10`.\" },\n },\n },\n \"mstts:dialog\": { title: \"Dialog\", description: \"Groups multiple speaker turns.\", parameters: {} },\n \"mstts:turn\": {\n title: \"Dialog turn\",\n description: \"Specifies a speaker and utterance within a dialog.\",\n parameters: {\n voice: { title: \"voice\", description: \"The Azure voice used by this turn.\" },\n speaker: { title: \"speaker\", description: \"The speaker identifier.\" },\n },\n },\n \"mstts:backgroundaudio\": {\n title: \"Background audio\",\n description: \"Specifies an audio file played behind synthesized speech.\",\n parameters: { src: { title: \"src\", description: \"The HTTPS URL of the audio file.\" } },\n },\n \"mstts:ttsembedding\": {\n title: \"TTS embedding\",\n description: \"Embeds custom voice or speaker profile metadata.\",\n parameters: { speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" } },\n },\n \"mstts:embedding\": {\n title: \"Embedding\",\n description: \"Specifies speaker embedding metadata.\",\n parameters: {\n id: { title: \"id\", description: \"The embedding ID.\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" },\n },\n },\n \"mstts:voiceconversion\": {\n title: \"Voice conversion\",\n description: \"Specifies custom voice conversion metadata.\",\n parameters: {\n url: { title: \"url\", description: \"The voice conversion profile URL.\" },\n profile: { title: \"profile\", description: \"The conversion profile.\" },\n speakerProfileId: { title: \"speakerProfileId\", description: \"The speaker profile ID.\" },\n },\n },\n },\n },\n};\n","import type { SsmlEditorLocale } from \"../locales.ts\";\n\n// Keep the editor's existing Japanese default for backward compatibility.\nexport const DEFAULT_LOCALE: SsmlEditorLocale = \"ja\";\nexport const OVERLAY_Z_INDEX = 9999;\nexport const SELECTION_OVERLAY_ABOVE_THRESHOLD_LINES = 4;\n\nexport const SSML_INSERTION_MODES = {\n insert: \"insert\",\n wrap: \"wrap\",\n} as const;\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 visual: {\n display: \"grid\",\n gap: \"0.75rem\",\n minHeight: \"8rem\",\n padding: \"0.75rem\",\n border: \"1px solid var(--ssml-editor-control-border)\",\n borderRadius: \"0.25rem\",\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\", \"mstts:audioduration\"]);\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\" | \"mstts:audioduration\";\n attributeName: \"rate\" | \"pitch\" | \"time\" | \"value\";\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 type { SsmlDocument, SsmlNode } from \"@ssml-builder-js/ssml-core\";\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction appendNode(nodes: SsmlNode[], node: SsmlNode): void {\n if (typeof node === \"string\") {\n const lastNode = nodes[nodes.length - 1];\n if (typeof lastNode === \"string\") {\n nodes[nodes.length - 1] = lastNode + node;\n } else if (node !== \"\") {\n nodes.push(node);\n }\n return;\n }\n\n nodes.push(node);\n}\n\nfunction clearNodes(nodes: SsmlNode[]): SsmlNode[] {\n const clearedNodes: SsmlNode[] = [];\n for (const node of nodes) {\n if (typeof node === \"string\") {\n appendNode(clearedNodes, node);\n continue;\n }\n\n if (node.type === \"text\") {\n appendNode(clearedNodes, node.value);\n continue;\n }\n\n const children = clearNodes(node.children ?? []);\n if (node.type === \"voice\") {\n appendNode(clearedNodes, { ...node, children });\n continue;\n }\n\n for (const child of children) {\n appendNode(clearedNodes, child);\n }\n }\n\n return clearedNodes;\n}\n\nexport function clearSsmlDocument(document: SsmlDocument): SsmlDocument {\n const nextDocument: SsmlDocument = {\n ...document,\n children: clearNodes(getDocumentChildren(document)),\n };\n if (nextDocument.content !== undefined) {\n delete nextDocument.content;\n }\n return nextDocument;\n}\n","const INDENT = \" \";\nconst FRAGMENT_ROOT = \"ssml-builder-fragment\";\nconst XML_ENTITY_NAMES = new Set([\"amp\", \"apos\", \"gt\", \"lt\", \"quot\"]);\nexport const INTRINSICALLY_EMPTY_ELEMENTS = new Set([\n \"break\",\n \"bookmark\",\n \"lexicon\",\n \"mark\",\n \"mstts:silence\",\n \"mstts:audioduration\",\n \"mstts:viseme\",\n \"silence\",\n \"viseme\",\n]);\n\ntype XmlNode = XmlElementNode | XmlTextNode | XmlMarkupNode;\n\ninterface XmlElementNode {\n kind: \"element\";\n name: string;\n open: string;\n close?: string;\n selfClosing: boolean;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n kind: \"text\";\n value: string;\n}\n\ninterface XmlMarkupNode {\n kind: \"comment\" | \"cdata\" | \"declaration\" | \"processing-instruction\";\n raw: string;\n}\n\ninterface XmlDocument {\n children: XmlNode[];\n root: XmlElementNode;\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction fail(message: string): never {\n throw new Error(message);\n}\n\nfunction skipWhitespace(source: string, index: number): number {\n while (isXmlWhitespace(source[index])) {\n index += 1;\n }\n return index;\n}\n\nfunction readName(source: string, start: number, end: number): { name: string; index: number } {\n if (!isXmlNameStart(source[start])) {\n fail(\"Invalid XML name\");\n }\n\n let index = start + 1;\n while (index < end && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n\n return { name: source.slice(start, index), index };\n}\n\nfunction validateCharacterReference(entity: string): void {\n const isHexadecimal = entity.startsWith(\"#x\") || entity.startsWith(\"#X\");\n const isDecimal = entity.startsWith(\"#\");\n if (!isHexadecimal && !isDecimal) {\n if (!XML_ENTITY_NAMES.has(entity)) {\n fail(`Unknown XML entity: &${entity};`);\n }\n return;\n }\n\n const digits = entity.slice(isHexadecimal ? 2 : 1);\n const validDigits = isHexadecimal ? /^[0-9A-Fa-f]+$/.test(digits) : /^[0-9]+$/.test(digits);\n const codePoint = Number.parseInt(digits, isHexadecimal ? 16 : 10);\n if (\n !validDigits ||\n !Number.isInteger(codePoint) ||\n codePoint < 0 ||\n codePoint > 0x10ffff ||\n (codePoint >= 0xd800 && codePoint <= 0xdfff) ||\n (codePoint < 0x20 && ![9, 10, 13].includes(codePoint))\n ) {\n fail(`Invalid XML character reference: &${entity};`);\n }\n}\n\nfunction validateEntityReferences(value: string): void {\n let index = 0;\n\n while (true) {\n const ampersand = value.indexOf(\"&\", index);\n if (ampersand === -1) {\n return;\n }\n\n const semicolon = value.indexOf(\";\", ampersand + 1);\n if (semicolon === -1) {\n fail(\"Unterminated XML entity reference\");\n }\n\n validateCharacterReference(value.slice(ampersand + 1, semicolon));\n index = semicolon + 1;\n }\n}\n\nfunction findTagEnd(source: string, start: number, hasInternalSubset = false): number {\n let quote: string | undefined;\n let subsetDepth = 0;\n\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n\n if (quote !== undefined) {\n if (character === quote) {\n quote = undefined;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (hasInternalSubset) {\n if (character === \"[\") {\n subsetDepth += 1;\n continue;\n }\n if (character === \"]\" && subsetDepth > 0) {\n subsetDepth -= 1;\n continue;\n }\n }\n\n if (character === \">\" && subsetDepth === 0) {\n return index;\n }\n }\n\n fail(\"Unclosed XML markup\");\n}\n\nfunction parseStartTag(\n source: string,\n start: number,\n end: number,\n): {\n name: string;\n selfClosing: boolean;\n} {\n const nameResult = readName(source, start + 1, end);\n let index = nameResult.index;\n let hasAttribute = false;\n const attributeNames = new Set<string>();\n\n while (index < end) {\n const beforeWhitespace = index;\n index = skipWhitespace(source, index);\n if (index === end) {\n break;\n }\n\n if (source[index] === \"/\") {\n if (index + 1 !== end) {\n fail(\"Invalid XML self-closing tag\");\n }\n return { name: nameResult.name, selfClosing: true };\n }\n\n if (hasAttribute && beforeWhitespace === index) {\n fail(\"XML attributes must be separated by whitespace\");\n }\n\n const attribute = readName(source, index, end);\n index = skipWhitespace(source, attribute.index);\n if (source[index] !== \"=\") {\n fail(`XML attribute ${attribute.name} must have a value`);\n }\n index = skipWhitespace(source, index + 1);\n\n const quote = source[index];\n if (quote !== '\"' && quote !== \"'\") {\n fail(`XML attribute ${attribute.name} must use a quoted value`);\n }\n index += 1;\n\n const valueStart = index;\n while (index < end && source[index] !== quote) {\n if (source[index] === \"<\") {\n fail(`Invalid \"<\" in XML attribute ${attribute.name}`);\n }\n index += 1;\n }\n if (index === end) {\n fail(`Unclosed XML attribute ${attribute.name}`);\n }\n\n if (attributeNames.has(attribute.name)) {\n fail(`Duplicate XML attribute: ${attribute.name}`);\n }\n attributeNames.add(attribute.name);\n validateEntityReferences(source.slice(valueStart, index));\n index += 1;\n hasAttribute = true;\n }\n\n return { name: nameResult.name, selfClosing: false };\n}\n\nfunction parseClosingTag(source: string, start: number, end: number): string {\n const nameResult = readName(source, start + 2, end);\n if (skipWhitespace(source, nameResult.index) !== end) {\n fail(\"Invalid XML closing tag\");\n }\n return nameResult.name;\n}\n\nfunction parseProcessingInstruction(source: string, start: number, end: number): void {\n readName(source, start + 2, end);\n}\n\nfunction parseDeclaration(source: string, start: number, end: number): void {\n readName(source, start + 2, end);\n}\n\nfunction appendNode(nodes: XmlNode[], node: XmlNode): void {\n const previous = nodes[nodes.length - 1];\n if (node.kind === \"text\" && previous?.kind === \"text\") {\n previous.value += node.value;\n return;\n }\n nodes.push(node);\n}\n\nfunction currentElement(stack: XmlElementNode[]): XmlElementNode | undefined {\n return stack[stack.length - 1];\n}\n\nfunction parseXml(source: string): XmlDocument {\n const children: XmlNode[] = [];\n const stack: XmlElementNode[] = [];\n let root: XmlElementNode | undefined;\n let index = 0;\n\n while (index < source.length) {\n if (source[index] !== \"<\") {\n const textStart = index;\n while (index < source.length && source[index] !== \"<\") {\n index += 1;\n }\n\n const value = source.slice(textStart, index);\n if (value.includes(\"]]>\")) {\n fail(\"CDATA termination is not valid in ordinary XML text\");\n }\n validateEntityReferences(value);\n if (stack.length === 0 && value.trim() !== \"\") {\n fail(\"Unexpected text outside the root XML element\");\n }\n appendNode(currentElement(stack)?.children ?? children, { kind: \"text\", value });\n continue;\n }\n\n if (source.startsWith(\"<!--\", index)) {\n const end = source.indexOf(\"-->\", index + 4);\n if (end === -1) {\n fail(\"Unclosed XML comment\");\n }\n const content = source.slice(index + 4, end);\n if (content.includes(\"--\") || content.endsWith(\"-\")) {\n fail(\"Invalid XML comment\");\n }\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"comment\",\n raw: source.slice(index, end + 3),\n });\n index = end + 3;\n continue;\n }\n\n if (source.startsWith(\"<![CDATA[\", index)) {\n const end = source.indexOf(\"]]>\", index + \"<![CDATA[\".length);\n if (end === -1) {\n fail(\"Unclosed XML CDATA section\");\n }\n if (stack.length === 0) {\n fail(\"CDATA is not allowed outside the root XML element\");\n }\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"cdata\",\n raw: source.slice(index, end + 3),\n });\n index = end + 3;\n continue;\n }\n\n if (source.startsWith(\"<?\", index)) {\n const end = source.indexOf(\"?>\", index + 2);\n if (end === -1) {\n fail(\"Unclosed XML processing instruction\");\n }\n parseProcessingInstruction(source, index, end);\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"processing-instruction\",\n raw: source.slice(index, end + 2),\n });\n index = end + 2;\n continue;\n }\n\n if (source.startsWith(\"</\", index)) {\n const end = findTagEnd(source, index);\n const name = parseClosingTag(source, index, end);\n const element = currentElement(stack);\n if (element === undefined || element.name !== name) {\n fail(`Mismatched closing XML element: </${name}>`);\n }\n element.close = source.slice(index, end + 1);\n stack.pop();\n index = end + 1;\n continue;\n }\n\n if (source.startsWith(\"<!\", index)) {\n const end = findTagEnd(source, index, true);\n parseDeclaration(source, index, end);\n appendNode(currentElement(stack)?.children ?? children, {\n kind: \"declaration\",\n raw: source.slice(index, end + 1),\n });\n index = end + 1;\n continue;\n }\n\n const end = findTagEnd(source, index);\n const { name, selfClosing } = parseStartTag(source, index, end);\n if (stack.length === 0) {\n if (root !== undefined) {\n fail(\"Multiple root XML elements are not allowed\");\n }\n root = {\n kind: \"element\",\n name,\n open: source.slice(index, end + 1),\n selfClosing,\n children: [],\n };\n children.push(root);\n } else {\n const element: XmlElementNode = {\n kind: \"element\",\n name,\n open: source.slice(index, end + 1),\n selfClosing,\n children: [],\n };\n currentElement(stack)?.children.push(element);\n if (!selfClosing) {\n stack.push(element);\n }\n index = end + 1;\n continue;\n }\n\n if (!selfClosing) {\n stack.push(root);\n }\n index = end + 1;\n }\n\n if (stack.length > 0) {\n fail(`Unclosed XML element: <${currentElement(stack)?.name}>`);\n }\n if (root === undefined) {\n fail(\"XML input does not contain a root element\");\n }\n\n return { children, root };\n}\n\nfunction indentation(depth: number): string {\n return INDENT.repeat(depth);\n}\n\nfunction renderInline(node: XmlElementNode): string {\n const content = node.children\n .map((child) => {\n if (child.kind === \"element\") {\n return renderInline(child);\n }\n return child.kind === \"text\" ? child.value : child.raw;\n })\n .join(\"\");\n\n return `${node.open}${content}${node.close ?? \"\"}`;\n}\n\nfunction hasOnlyTextChildren(node: XmlElementNode): boolean {\n return node.children.every((child) => child.kind === \"text\");\n}\n\nfunction hasSignificantText(node: XmlElementNode): boolean {\n return node.children.some((child) => child.kind === \"text\" && child.value.trim() !== \"\");\n}\n\nfunction hasOnlyWhitespaceText(node: XmlElementNode): boolean {\n return node.children.every((child) => child.kind === \"text\" && child.value.trim() === \"\");\n}\n\nfunction toSelfClosingTag(open: string): string {\n return `${open.slice(0, -1).trimEnd()}/>`;\n}\n\nfunction formatElement(node: XmlElementNode, depth: number, isRoot: boolean): string[] {\n const prefix = indentation(depth);\n\n if (node.selfClosing) {\n return [`${prefix}${node.open}`];\n }\n if (node.close === undefined) {\n fail(`Unclosed XML element: <${node.name}>`);\n }\n if (INTRINSICALLY_EMPTY_ELEMENTS.has(node.name) && hasOnlyWhitespaceText(node)) {\n return [`${prefix}${toSelfClosingTag(node.open)}`];\n }\n\n if (isRoot && hasOnlyTextChildren(node)) {\n const text = node.children\n .filter((child): child is XmlTextNode => child.kind === \"text\")\n .map((child) => child.value)\n .join(\"\");\n const trimmedText = text.trim();\n\n if (trimmedText === \"\") {\n return [`${prefix}${node.open}`, `${prefix}${node.close}`];\n }\n if (text.includes(\"\\n\") || text.includes(\"\\r\") || text !== trimmedText) {\n return [`${prefix}${renderInline(node)}`];\n }\n return [`${prefix}${node.open}`, `${indentation(depth + 1)}${trimmedText}`, `${prefix}${node.close}`];\n }\n\n if (hasSignificantText(node)) {\n return [`${prefix}${renderInline(node)}`];\n }\n\n const lines = [`${prefix}${node.open}`];\n for (const child of node.children) {\n if (child.kind === \"text\") {\n continue;\n }\n if (child.kind === \"element\") {\n lines.push(...formatElement(child, depth + 1, false));\n } else {\n lines.push(`${indentation(depth + 1)}${child.raw}`);\n }\n }\n lines.push(`${prefix}${node.close}`);\n return lines;\n}\n\nfunction stripTrailingWhitespace(value: string): string {\n return value.replace(/[ \\t]+$/gm, \"\");\n}\n\nfunction getTrailingLineBreaks(value: string): string {\n let start = value.length;\n while (start > 0) {\n if (value[start - 1] === \"\\n\") {\n start -= 1;\n if (start > 0 && value[start - 1] === \"\\r\") {\n start -= 1;\n }\n continue;\n }\n if (value[start - 1] === \"\\r\") {\n start -= 1;\n continue;\n }\n break;\n }\n return value.slice(start);\n}\n\nfunction stripTrailingLineBreaks(value: string): string {\n let end = value.length;\n while (end > 0) {\n if (value[end - 1] === \"\\n\") {\n end -= 1;\n if (end > 0 && value[end - 1] === \"\\r\") {\n end -= 1;\n }\n continue;\n }\n if (value[end - 1] === \"\\r\") {\n end -= 1;\n continue;\n }\n break;\n }\n return value.slice(0, end);\n}\n\nfunction preserveTrailingLineBreak(formatted: string, trailingLineBreaks: string): string {\n if (trailingLineBreaks === \"\") {\n return formatted;\n }\n\n return `${stripTrailingLineBreaks(formatted)}${trailingLineBreaks}`;\n}\n\nfunction renderDocument(document: XmlDocument): string {\n const lines: string[] = [];\n\n for (const child of document.children) {\n if (child.kind === \"text\") {\n continue;\n }\n if (child.kind === \"element\") {\n lines.push(...formatElement(child, 0, child === document.root));\n } else {\n lines.push(child.raw);\n }\n }\n\n return stripTrailingWhitespace(lines.join(\"\\n\")).trim();\n}\n\nexport function formatXml(xml: string): string {\n const trailingLineBreaks = getTrailingLineBreaks(xml);\n const source = xml.trim();\n if (source === \"\") {\n return \"\";\n }\n\n try {\n return preserveTrailingLineBreak(renderDocument(parseXml(source)), trailingLineBreaks);\n } catch {\n return xml;\n }\n}\n\nfunction unwrapFormattedFragment(formatted: string): string | undefined {\n const opening = `<${FRAGMENT_ROOT}>`;\n const closing = `</${FRAGMENT_ROOT}>`;\n\n if (!formatted.startsWith(opening) || !formatted.endsWith(closing)) {\n return undefined;\n }\n\n if (formatted === `${opening}${closing}`) {\n return \"\";\n }\n\n const multilineOpening = `${opening}\\n`;\n const multilineClosing = `\\n${closing}`;\n if (formatted.startsWith(multilineOpening) && formatted.endsWith(multilineClosing)) {\n const content = formatted.slice(multilineOpening.length, -multilineClosing.length);\n return content\n .split(\"\\n\")\n .map((line) => (line.startsWith(INDENT) ? line.slice(INDENT.length) : line))\n .join(\"\\n\");\n }\n\n return formatted.slice(opening.length, -closing.length);\n}\n\nexport function formatXmlFragment(xml: string): string {\n const trailingLineBreaks = getTrailingLineBreaks(xml);\n const source = xml.trim();\n if (source === \"\") {\n return \"\";\n }\n\n const wrapped = `<${FRAGMENT_ROOT}>${source}</${FRAGMENT_ROOT}>`;\n let formatted: string;\n try {\n formatted = renderDocument(parseXml(wrapped));\n } catch {\n return xml;\n }\n\n return preserveTrailingLineBreak(unwrapFormattedFragment(formatted) ?? xml, trailingLineBreaks);\n}\n","import { buildSsml, parseSsml } from \"@ssml-builder-js/ssml-core\";\nimport type { ProsodyElement, SsmlDocument, SsmlElement, SsmlNode, VoiceElement } from \"@ssml-builder-js/ssml-core\";\nimport { INTRINSICALLY_EMPTY_ELEMENTS } from \"./formatXml\";\n\ninterface EditableStartTag {\n name: string;\n selfClosing: boolean;\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 getSsmlElementName(element: SsmlElement): string {\n return element.type === \"custom\" || element.type === \"element\" ? element.name : element.type;\n}\n\nfunction findEditableTagEnd(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 continue;\n }\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === \">\") {\n return index;\n }\n }\n return source.length;\n}\n\nfunction collectEditableStartTags(source: string): EditableStartTag[] {\n const tags: EditableStartTag[] = [];\n let index = 0;\n\n while (index < source.length) {\n if (source[index] !== \"<\") {\n index += 1;\n continue;\n }\n if (source.startsWith(\"<!--\", index)) {\n const end = source.indexOf(\"-->\", index + 4);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", index)) {\n const end = source.indexOf(\"]]>\", index + 9);\n index = end === -1 ? source.length : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", index)) {\n const end = source.indexOf(\"?>\", index + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n if (source.startsWith(\"</\", index) || source.startsWith(\"<!\", index)) {\n const end = findEditableTagEnd(source, index);\n index = end === source.length ? source.length : end + 1;\n continue;\n }\n\n const end = findEditableTagEnd(source, index);\n if (end === source.length) {\n break;\n }\n const raw = source.slice(index, end + 1);\n const match = raw.match(/^<([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (match) {\n tags.push({ name: match[1], selfClosing: /\\/\\s*>$/.test(raw) });\n }\n index = end + 1;\n }\n\n return tags;\n}\n\nfunction preserveEmptyPairElements(\n nodes: SsmlNode[],\n startTags: readonly EditableStartTag[],\n startTagIndex: { value: number },\n): SsmlNode[] {\n return nodes.map((node) => {\n if (!isSsmlElement(node)) {\n return node;\n }\n\n const elementName = getSsmlElementName(node);\n const startTag = startTags[startTagIndex.value];\n startTagIndex.value += 1;\n if (node.children === undefined || node.children.length === 0) {\n return startTag?.name === elementName && !startTag.selfClosing && !INTRINSICALLY_EMPTY_ELEMENTS.has(elementName)\n ? { ...node, children: [\"\"] }\n : node;\n }\n\n const children = preserveEmptyPairElements(node.children, startTags, startTagIndex);\n if (children.every((child, index) => child === node.children?.[index])) {\n return node;\n }\n return { ...node, children };\n });\n}\n\nfunction getDocumentChildren(document: SsmlDocument): SsmlNode[] {\n return document.children ?? (document.content === undefined ? [] : [document.content]);\n}\n\nfunction findFirstElementPath(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => boolean,\n ancestors: readonly SsmlElement[] = [],\n): SsmlElement[] | undefined {\n for (const node of nodes) {\n if (!isSsmlElement(node)) {\n continue;\n }\n\n const path = [...ancestors, node];\n if (predicate(node)) {\n return path;\n }\n\n const childPath = findFirstElementPath(node.children ?? [], predicate, path);\n if (childPath) {\n return childPath;\n }\n }\n return undefined;\n}\n\nfunction updateFirstElement<T extends SsmlElement>(\n nodes: SsmlNode[],\n predicate: (element: SsmlElement) => element is T,\n update: (element: T) => SsmlElement,\n): { nodes: SsmlNode[]; updated: boolean } {\n let updated = false;\n const nextNodes = nodes.map((node) => {\n if (updated || !isSsmlElement(node)) {\n return node;\n }\n\n if (predicate(node)) {\n updated = true;\n return update(node);\n }\n\n if (node.children) {\n const result = updateFirstElement(node.children, predicate, update);\n if (result.updated) {\n updated = true;\n return { ...node, children: result.nodes };\n }\n }\n\n return node;\n });\n\n return { nodes: nextNodes, updated };\n}\n\nfunction withChildren(document: SsmlDocument, children: SsmlNode[]): SsmlDocument {\n const nextDocument: SsmlDocument = { ...document, children };\n if (nextDocument.content !== undefined) {\n delete nextDocument.content;\n }\n return nextDocument;\n}\n\nfunction parseEditableText(value: string, lang: string): SsmlNode[] {\n try {\n const wrapper = buildSsml({\n version: \"1.0\",\n lang,\n children: [],\n });\n const openingTagEnd = wrapper.indexOf(\">\") + 1;\n const children = parseSsml(`${wrapper.slice(0, openingTagEnd)}${value}</speak>`).children ?? [];\n return children.some(isSsmlElement)\n ? preserveEmptyPairElements(children, collectEditableStartTags(value), { value: 0 })\n : [value];\n } catch {\n return [value];\n }\n}\n\nfunction serializeEditableText(nodes: SsmlNode[], lang: string): string {\n if (nodes.length === 1 && typeof nodes[0] === \"string\") {\n return nodes[0];\n }\n\n const xml = buildSsml({\n version: \"1.0\",\n lang,\n children: nodes,\n });\n const contentStart = xml.indexOf(\">\") + 1;\n return xml.slice(contentStart, -\"</speak>\".length);\n}\n\nexport function getEditableRegion(document: SsmlDocument): { children: SsmlNode[]; voiceName?: string } {\n const children = getDocumentChildren(document);\n const path = findFirstElementPath(children, isProsody) ?? findFirstElementPath(children, isVoice);\n const element = path ? path[path.length - 1] : undefined;\n const voice = path ? [...path].reverse().find(isVoice) : undefined;\n return {\n children: element?.children ?? children,\n ...(voice ? { voiceName: voice.name } : {}),\n };\n}\n\nexport function getEditableText(document: SsmlDocument): string {\n return serializeEditableText(getEditableRegion(document).children, document.lang);\n}\n\nexport function updateEditableText(document: SsmlDocument, value: string): SsmlDocument {\n const nextChildren = parseEditableText(value, document.lang);\n const editableChildren = nextChildren.length > 0 ? nextChildren : [value];\n const children = getDocumentChildren(document);\n const prosodyResult = updateFirstElement(children, isProsody, (prosody) => ({\n ...prosody,\n children: editableChildren,\n }));\n if (prosodyResult.updated) {\n return withChildren(document, prosodyResult.nodes);\n }\n\n const voiceResult = updateFirstElement(children, isVoice, (voice) => ({\n ...voice,\n children: editableChildren,\n }));\n if (voiceResult.updated) {\n return withChildren(document, voiceResult.nodes);\n }\n\n return withChildren(document, editableChildren);\n}\n","// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { SSML_INSERTION_MODES } from \"./constants/ui.ts\";\n\nexport type SsmlInsertionMode = (typeof SSML_INSERTION_MODES)[keyof typeof SSML_INSERTION_MODES];\n\nexport interface SsmlInsertionTemplate {\n prefix: string;\n suffix: string;\n mode: SsmlInsertionMode;\n}\n\nexport interface SsmlInsertionEdit {\n replacement: string;\n selectionOffset: number;\n}\n\nfunction isLineStart(value: string, offset: number): boolean {\n return offset === 0 || value[offset - 1] === \"\\n\" || value[offset - 1] === \"\\r\";\n}\n\nfunction isLineEnd(value: string, offset: number): boolean {\n return offset === value.length || value[offset] === \"\\n\" || value[offset] === \"\\r\";\n}\n\nfunction getLineBreakAt(value: string, offset: number): string {\n if (value.startsWith(\"\\r\\n\", offset)) {\n return \"\\r\\n\";\n }\n if (value[offset] === \"\\n\" || value[offset] === \"\\r\") {\n return value[offset];\n }\n return \"\";\n}\n\nfunction startsWithLineBreak(value: string): boolean {\n return value.startsWith(\"\\n\") || value.startsWith(\"\\r\");\n}\n\nfunction endsWithLineBreak(value: string): boolean {\n return value.endsWith(\"\\n\") || value.endsWith(\"\\r\");\n}\n\nexport function createSsmlInsertionEdit(\n source: string,\n startOffset: number,\n endOffset: number,\n template: SsmlInsertionTemplate,\n eol = \"\\n\",\n selectedText = startOffset === endOffset ? \"\" : source.slice(startOffset, endOffset),\n): SsmlInsertionEdit {\n if (template.mode === SSML_INSERTION_MODES.wrap) {\n const trailingLineBreak = getLineBreakAt(source, endOffset) === \"\" ? eol : \"\";\n return {\n replacement: `${template.prefix}${selectedText}${template.suffix}${trailingLineBreak}`,\n selectionOffset: template.prefix.length,\n };\n }\n\n const followingLineBreak = getLineBreakAt(source, endOffset);\n const leadingLineBreak = !isLineStart(source, startOffset) && !startsWithLineBreak(template.prefix) ? eol : \"\";\n const needsTrailingLineBreak =\n selectedText.length > 0\n ? !selectedText.startsWith(\"\\n\") && !selectedText.startsWith(\"\\r\")\n : !isLineEnd(source, endOffset) || followingLineBreak === \"\";\n const trailingLineBreak = needsTrailingLineBreak && !endsWithLineBreak(template.prefix) ? eol : \"\";\n const insertionPrefix = `${leadingLineBreak}${template.prefix}`;\n\n return {\n replacement: `${insertionPrefix}${trailingLineBreak}${selectedText}`,\n selectionOffset:\n insertionPrefix.length +\n trailingLineBreak.length +\n (selectedText.length === 0 && trailingLineBreak === \"\" ? followingLineBreak.length : 0),\n };\n}\n","export interface SsmlVoiceContext {\n voiceName?: string;\n}\n\nexport interface SsmlTagRange {\n start: number;\n end: number;\n}\n\ninterface OpenElement {\n name: string;\n voiceName?: string;\n}\n\nfunction findTagEnd(source: string, start: number, limit: number): number {\n let quote: string | undefined;\n for (let index = start + 1; index < limit; index += 1) {\n const character = source[index];\n if (quote !== undefined) {\n if (character === quote) {\n quote = undefined;\n }\n continue;\n }\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === \">\") {\n return index;\n }\n }\n return -1;\n}\n\nfunction getVoiceName(tag: string): string | undefined {\n return tag.match(/\\bname\\s*=\\s*([\"'])([\\s\\S]*?)\\1/i)?.[2];\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 updateTagAttribute(\n text: string,\n tagRange: SsmlTagRange,\n attributeName: string,\n newValue: string,\n): string {\n const start = Math.max(0, Math.min(tagRange.start, text.length));\n const end = Math.max(start, Math.min(tagRange.end, text.length));\n const tag = text.slice(start, end);\n const escapedAttributeName = attributeName.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const attributePattern = new RegExp(`(\\\\b${escapedAttributeName}\\\\s*=\\\\s*)([\"'])([\\\\s\\\\S]*?)\\\\2`, \"i\");\n const escapedValue = escapeXmlAttribute(newValue);\n const match = tag.match(attributePattern);\n\n if (match?.index !== undefined) {\n const valueStart = match.index + match[0].indexOf(match[2]) + 1;\n const valueEnd = valueStart + (match[3]?.length ?? 0);\n return `${text.slice(0, start)}${tag.slice(0, valueStart)}${escapedValue}${tag.slice(valueEnd)}${text.slice(end)}`;\n }\n\n const insertionIndex = tag.endsWith(\"/>\") ? tag.length - 2 : tag.length - 1;\n const attribute = ` ${attributeName}=\"${escapedValue}\"`;\n return `${text.slice(0, start)}${tag.slice(0, insertionIndex)}${attribute}${tag.slice(insertionIndex)}${text.slice(end)}`;\n}\n\nfunction closeElement(stack: OpenElement[], name: string): void {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n if (stack[index]?.name === name) {\n stack.splice(index);\n return;\n }\n }\n}\n\nexport function findActiveSsmlTags(source: string, offset: number): Set<string> {\n const limit = Math.max(0, Math.min(offset, source.length));\n const stack: OpenElement[] = [];\n let index = 0;\n\n while (index < source.length) {\n const tagStart = source.indexOf(\"<\", index);\n if (tagStart === -1 || tagStart > limit) {\n break;\n }\n\n const nonContentEnd = source.startsWith(\"<!--\", tagStart)\n ? source.indexOf(\"-->\", tagStart + 4)\n : source.startsWith(\"<![CDATA[\", tagStart)\n ? source.indexOf(\"]]>\", tagStart + 9)\n : source.startsWith(\"<?\", tagStart)\n ? source.indexOf(\"?>\", tagStart + 2)\n : undefined;\n if (nonContentEnd !== undefined) {\n const delimiterLength = source.startsWith(\"<?\", tagStart) ? 2 : 3;\n const end = nonContentEnd === -1 ? source.length : nonContentEnd + delimiterLength;\n if (limit < end) {\n break;\n }\n index = end;\n continue;\n }\n\n const tagEnd = findTagEnd(source, tagStart, source.length);\n const tag = source.slice(tagStart, tagEnd === -1 ? source.length : tagEnd + 1);\n const closingMatch = tag.match(/^<\\s*\\/\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n const openingMatch = tag.match(/^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n\n if (tagEnd === -1 || limit <= tagEnd) {\n if (openingMatch?.[1]) {\n stack.push({ name: openingMatch[1].toLowerCase() });\n }\n break;\n }\n\n if (closingMatch?.[1]) {\n closeElement(stack, closingMatch[1].toLowerCase());\n } else if (openingMatch?.[1] && !/\\/\\s*>$/.test(tag)) {\n stack.push({ name: openingMatch[1].toLowerCase() });\n }\n index = tagEnd + 1;\n }\n\n return new Set(stack.map(({ name }) => name));\n}\n\nexport function findSsmlVoiceContext(source: string, offset: number): SsmlVoiceContext | undefined {\n const limit = Math.max(0, Math.min(offset, source.length));\n const stack: OpenElement[] = [];\n let index = 0;\n\n while (index < limit) {\n const tagStart = source.indexOf(\"<\", index);\n if (tagStart === -1 || tagStart >= limit) {\n break;\n }\n\n if (source.startsWith(\"<!--\", tagStart)) {\n const end = source.indexOf(\"-->\", tagStart + 4);\n index = end === -1 || end + 3 > limit ? limit : end + 3;\n continue;\n }\n if (source.startsWith(\"<![CDATA[\", tagStart)) {\n const end = source.indexOf(\"]]>\", tagStart + 9);\n index = end === -1 || end + 3 > limit ? limit : end + 3;\n continue;\n }\n if (source.startsWith(\"<?\", tagStart)) {\n const end = source.indexOf(\"?>\", tagStart + 2);\n index = end === -1 || end + 2 > limit ? limit : end + 2;\n continue;\n }\n\n const tagEnd = findTagEnd(source, tagStart, limit);\n if (tagEnd === -1) {\n break;\n }\n const tag = source.slice(tagStart, tagEnd + 1);\n if (tag.startsWith(\"<!\")) {\n index = tagEnd + 1;\n continue;\n }\n\n const closingMatch = tag.match(/^<\\s*\\/\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (closingMatch?.[1]) {\n closeElement(stack, closingMatch[1].toLowerCase());\n index = tagEnd + 1;\n continue;\n }\n\n const openingMatch = tag.match(/^<\\s*([A-Za-z_][A-Za-z0-9_.:-]*)/);\n if (openingMatch?.[1] && !/\\/\\s*>$/.test(tag)) {\n const name = openingMatch[1].toLowerCase();\n stack.push({\n name,\n ...(name === \"voice\" ? { voiceName: getVoiceName(tag) } : {}),\n });\n }\n index = tagEnd + 1;\n }\n\n for (let stackIndex = stack.length - 1; stackIndex >= 0; stackIndex -= 1) {\n const element = stack[stackIndex];\n if (element?.name === \"voice\") {\n return element.voiceName === undefined ? {} : { voiceName: element.voiceName };\n }\n }\n return undefined;\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 * as monaco from \"monaco-editor\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { resolveExpressAsStyles, SSML_ATTRIBUTE_PRESETS } from \"./constants/ssmlPresets.ts\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { findSsmlVoiceContext } from \"./ssmlContext.ts\";\n\ntype Monaco = typeof monaco;\ntype MonacoLanguages = Monaco[\"languages\"];\ntype MonacoCompletionProvider = Parameters<MonacoLanguages[\"registerCompletionItemProvider\"]>[1];\ntype MonacoCompletionMethod = NonNullable<MonacoCompletionProvider[\"provideCompletionItems\"]>;\ntype MonacoCompletionModel = Parameters<MonacoCompletionMethod>[0];\ntype MonacoCompletionPosition = Parameters<MonacoCompletionMethod>[1];\n\nconst SSML_ATTRIBUTE_VALUE_PATTERN = /<([\\w:-]+)\\s+[^>]*?\\b([\\w:-]+)=[\"']([^\"']*)$/i;\nconst EXPRESS_AS_TAG_NAMES = new Set([\"mstts:express-as\", \"express-as\", \"expressas\"]);\n\nexport interface SsmlCompletionProviderOptions {\n getOuterVoiceName?: () => string | undefined;\n model?: MonacoCompletionModel | null;\n}\n\nfunction findSsmlAttributePresets(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\nconst SSML_COMPLETION_SNIPPETS = [\n {\n label: \"break\",\n insertText: '<break time=\"500ms\" />',\n },\n {\n label: \"prosody\",\n insertText: `<prosody rate=\"medium\" pitch=\"medium\">\\${1:text}</prosody>`,\n },\n {\n label: \"mstts:express-as\",\n insertText: `<mstts:express-as style=\"cheerful\">\\${1:text}</mstts:express-as>`,\n },\n {\n label: \"mstts:audioduration\",\n insertText: '<mstts:audioduration value=\"10s\" />',\n },\n {\n label: \"mstts:dialog\",\n insertText: `<mstts:dialog>\\n <mstts:turn voice=\"\\${1:en-US-JennyNeural}\">\\${2:text}</mstts:turn>\\n</mstts:dialog>`,\n },\n {\n label: \"mstts:turn\",\n insertText: `<mstts:turn voice=\"\\${1:en-US-JennyNeural}\">\\${2:text}</mstts:turn>`,\n },\n {\n label: \"mstts:backgroundaudio\",\n insertText: `<mstts:backgroundaudio src=\"\\${1:https://example.com/audio.mp3}\" volume=\"\\${2:70}\" fadein=\"\\${3:1000}\" fadeout=\"\\${4:1000}\" />`,\n },\n {\n label: \"mstts:ttsembedding\",\n insertText: `<mstts:ttsembedding>\\${1:text}</mstts:ttsembedding>`,\n },\n {\n label: \"sub\",\n insertText: `<sub alias=\"\\${1:読み}\">\\${2:漢字}</sub>`,\n },\n] as const;\n\nexport function registerSsmlCompletionProvider(\n monaco: Monaco,\n options: SsmlCompletionProviderOptions = {},\n): ReturnType<MonacoLanguages[\"registerCompletionItemProvider\"]> {\n const provider: MonacoCompletionProvider = {\n provideCompletionItems(model: MonacoCompletionModel, position: MonacoCompletionPosition) {\n if (options.model && options.model !== model) {\n return { suggestions: [] };\n }\n\n const value = model.getValue();\n const offset = model.getOffsetAt(position);\n const textUntilPosition = value.slice(0, offset);\n const isClosingTag = /<\\/[a-zA-Z0-9:-]*$/.test(textUntilPosition);\n if (isClosingTag) {\n return { suggestions: [] };\n }\n\n const attributeMatch = SSML_ATTRIBUTE_VALUE_PATTERN.exec(textUntilPosition);\n let attributeValues = attributeMatch ? findSsmlAttributePresets(attributeMatch[1], attributeMatch[2]) : undefined;\n if (\n attributeMatch &&\n attributeValues &&\n EXPRESS_AS_TAG_NAMES.has(attributeMatch[1].toLowerCase()) &&\n attributeMatch[2].toLowerCase() === \"style\"\n ) {\n const voiceContext = findSsmlVoiceContext(value, offset);\n const voiceName = voiceContext === undefined ? options.getOuterVoiceName?.() : voiceContext.voiceName;\n attributeValues = resolveExpressAsStyles(voiceName, attributeValues);\n }\n const openTagMatch = textUntilPosition.match(/<(?!\\/)[a-zA-Z0-9:-]*$/);\n const openTagLength = openTagMatch?.[0].length ?? 0;\n const isAfterBracket =\n model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: position.column - 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n }) === \"<\";\n const hasClosingBracket =\n isAfterBracket &&\n model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: position.column,\n endLineNumber: position.lineNumber,\n endColumn: position.column + 1,\n }) === \">\";\n const range = {\n startLineNumber: position.lineNumber,\n startColumn: openTagLength > 0 ? position.column - openTagLength : position.column,\n endLineNumber: position.lineNumber,\n endColumn: hasClosingBracket ? position.column + 1 : position.column,\n };\n\n return {\n suggestions: [\n ...(attributeMatch\n ? []\n : SSML_COMPLETION_SNIPPETS.map(({ label, insertText }) => ({\n label,\n kind: monaco.languages.CompletionItemKind.Snippet,\n insertText,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n }))),\n ...(attributeValues?.map((value) => ({\n label: value,\n kind: monaco.languages.CompletionItemKind.Value,\n insertText: value,\n range,\n })) ?? []),\n ],\n };\n },\n triggerCharacters: [\"<\", '\"', \"'\"],\n };\n\n return monaco.languages.registerCompletionItemProvider(\"xml\", provider);\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\" | \"mstts:audioduration\";\n attributeName: \"rate\" | \"pitch\" | \"time\" | \"value\";\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|mstts:audioduration)\\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 (tagName === \"mstts:audioduration\" && /\\/\\s*>$/.test(tag)) {\n lenses.push(\n createLens(\n model,\n tagStart,\n tagEnd + 1,\n `⚡ Duration: ${getAttributeValue(tag, \"value\") ?? \"default\"} (Click to edit)`,\n { type: \"attribute\", insertionId: \"mstts:audioduration\", attributeName: \"value\", tagRange },\n ),\n createLens(model, tagStart, tagEnd + 1, \"Delete\", {\n type: \"delete\",\n tagRange,\n elementRange,\n }),\n );\n } else if (tagName === \"break\" && /\\/\\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","// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport * as SSML_PRESETS from \"./constants/ssmlPresets.ts\";\n// @ts-expect-error The Node strip-types test runner requires the explicit TypeScript extension.\nimport { SSML_HOVER_COPY, type SsmlEditorLocale } from \"./locales.ts\";\n\nconst {\n BREAK_STRENGTH_PRESETS,\n EMPHASIS_LEVEL_PRESETS,\n PHONEME_ALPHABET_PRESETS,\n PROSODY_RATE_VALUES,\n PROSODY_VOLUME_PRESETS,\n SILENCE_TYPE_PRESETS,\n SSML_PRESET_EXAMPLES,\n VISEME_TYPE_PRESETS,\n} = SSML_PRESETS;\n\nexport interface SsmlParameterDefinition {\n name: string;\n description: string;\n aliases?: readonly string[];\n values?: readonly string[];\n example?: string;\n}\n\nexport interface SsmlTagDefinition {\n name: string;\n description: string;\n aliases?: readonly string[];\n parameters: readonly SsmlParameterDefinition[];\n}\n\nexport interface SsmlHoverRange {\n startLineNumber: number;\n startColumn: number;\n endLineNumber: number;\n endColumn: number;\n}\n\nexport type SsmlHoverTargetKind = \"tag\" | \"parameter\" | \"parameter-value\";\n\nexport interface SsmlHoverTarget {\n kind: SsmlHoverTargetKind;\n tagName: string;\n isClosingTag: boolean;\n definition: SsmlTagDefinition;\n parameter?: SsmlParameterDefinition;\n range: SsmlHoverRange;\n}\n\nconst SSML_TAG_DEFINITIONS: readonly SsmlTagDefinition[] = [\n {\n name: \"voice\",\n description: \"Selects the voice and optional voice effect used to synthesize the enclosed text.\",\n parameters: [\n {\n name: \"name\",\n description: \"The voice name, such as `en-US-JennyNeural`.\",\n example: \"en-US-JennyNeural\",\n },\n {\n name: \"effect\",\n description: \"An optional voice effect, such as `eq_car`.\",\n },\n ],\n },\n {\n name: \"prosody\",\n description: \"Changes the speaking rate, pitch, volume, or pitch contour of the enclosed text.\",\n parameters: [\n {\n name: \"rate\",\n description: \"Controls speaking speed.\",\n values: PROSODY_RATE_VALUES,\n example: SSML_PRESET_EXAMPLES.prosodyRate,\n },\n {\n name: \"pitch\",\n description: \"Adjusts pitch using a named value, percentage, frequency, or semitone value.\",\n example: SSML_PRESET_EXAMPLES.prosodyPitch,\n },\n {\n name: \"volume\",\n description: \"Controls loudness using a named value, percentage, or decibel value.\",\n values: PROSODY_VOLUME_PRESETS,\n example: SSML_PRESET_EXAMPLES.prosodyVolume,\n },\n {\n name: \"contour\",\n description: \"Defines a sequence of relative pitch changes at positions in the text.\",\n example: \"(0%,+0st) (100%,+2st)\",\n },\n {\n name: \"range\",\n description: \"Adjusts the pitch range of the voice.\",\n example: \"+2st\",\n },\n ],\n },\n {\n name: \"break\",\n description: \"Inserts a pause between words or other spoken content.\",\n parameters: [\n {\n name: \"time\",\n description: \"The pause duration, for example `500ms` or `1s`.\",\n example: SSML_PRESET_EXAMPLES.breakTime,\n },\n {\n name: \"strength\",\n description: \"The relative pause strength.\",\n values: BREAK_STRENGTH_PRESETS,\n },\n ],\n },\n {\n name: \"mstts:express-as\",\n aliases: [\"express-as\", \"expressAs\"],\n description: \"Applies a speaking style, style degree, or role to the enclosed text.\",\n parameters: [\n {\n name: \"style\",\n description: \"The speaking style supported by the selected voice, such as `cheerful`.\",\n example: SSML_PRESET_EXAMPLES.expressAsStyle,\n },\n {\n name: \"styledegree\",\n aliases: [\"style-degree\", \"styleDegree\"],\n description: \"Controls the intensity of the selected speaking style.\",\n example: \"1.5\",\n },\n {\n name: \"role\",\n description: \"Changes the speaking role when supported by the selected voice.\",\n example: \"YoungAdultFemale\",\n },\n ],\n },\n {\n name: \"say-as\",\n aliases: [\"sayAs\"],\n description: \"Controls how the enclosed text is interpreted and spoken.\",\n parameters: [\n {\n name: \"interpret-as\",\n description: \"Specifies the interpretation, such as characters, digits, date, or time.\",\n example: \"characters\",\n },\n {\n name: \"format\",\n description: \"Provides a format hint for the selected interpretation.\",\n },\n {\n name: \"detail\",\n description: \"Provides an additional detail hint for the selected interpretation.\",\n },\n ],\n },\n {\n name: \"phoneme\",\n description: \"Replaces normal pronunciation with the supplied phonetic pronunciation.\",\n parameters: [\n {\n name: \"alphabet\",\n description: \"The phonetic alphabet used by the `ph` value.\",\n values: PHONEME_ALPHABET_PRESETS,\n example: SSML_PRESET_EXAMPLES.phonemeAlphabet,\n },\n {\n name: \"ph\",\n description: \"The phonetic pronunciation for the enclosed text.\",\n example: \"həˈloʊ\",\n },\n ],\n },\n {\n name: \"emphasis\",\n description: \"Adds emphasis to the enclosed text.\",\n parameters: [\n {\n name: \"level\",\n description: \"Controls the amount of emphasis.\",\n values: EMPHASIS_LEVEL_PRESETS,\n },\n ],\n },\n {\n name: \"audio\",\n description: \"Plays an audio file as part of the synthesized output.\",\n parameters: [\n {\n name: \"src\",\n description: \"The URI of the audio file.\",\n example: \"https://example.com/intro.wav\",\n },\n {\n name: \"desc\",\n description: \"Alternative text to use if the audio cannot be played.\",\n },\n {\n name: \"clipBegin\",\n description: \"The starting offset within the audio file.\",\n example: \"0s\",\n },\n {\n name: \"clipEnd\",\n description: \"The ending offset within the audio file.\",\n example: \"5s\",\n },\n {\n name: \"speed\",\n description: \"The playback speed of the audio file.\",\n example: \"1.0\",\n },\n {\n name: \"repeatCount\",\n description: \"The number of times to repeat the audio.\",\n example: \"2\",\n },\n {\n name: \"repeatDuration\",\n description: \"The total duration for which the audio may repeat.\",\n example: \"10s\",\n },\n {\n name: \"soundLevel\",\n description: \"The audio volume adjustment in decibels.\",\n example: \"-3dB\",\n },\n ],\n },\n {\n name: \"sub\",\n description: \"Substitutes the alias text when speaking the enclosed text.\",\n parameters: [\n {\n name: \"alias\",\n description: \"The text to speak instead of the enclosed text.\",\n example: \"World Wide Web\",\n },\n ],\n },\n {\n name: \"lang\",\n description: \"Changes the language used for the enclosed text.\",\n parameters: [\n {\n name: \"xml:lang\",\n aliases: [\"lang\"],\n description: \"The BCP-47 language tag.\",\n example: \"ja-JP\",\n },\n ],\n },\n {\n name: \"mark\",\n description: \"Inserts a custom marker into the synthesized audio stream.\",\n parameters: [\n {\n name: \"name\",\n description: \"The application-defined marker name.\",\n example: \"chapter-1\",\n },\n ],\n },\n {\n name: \"bookmark\",\n description: \"Inserts a bookmark marker into the synthesized audio stream.\",\n parameters: [\n {\n name: \"mark\",\n description: \"The application-defined bookmark name.\",\n example: \"chapter-1\",\n },\n ],\n },\n {\n name: \"lexicon\",\n description: \"Associates a pronunciation lexicon with the synthesized document.\",\n parameters: [\n {\n name: \"uri\",\n description: \"The URI of the pronunciation lexicon.\",\n example: \"https://example.com/lexicon.pls\",\n },\n ],\n },\n {\n name: \"p\",\n description: \"Groups text into a paragraph.\",\n parameters: [],\n },\n {\n name: \"s\",\n description: \"Groups text into a sentence.\",\n parameters: [],\n },\n {\n name: \"w\",\n description: \"Groups text into a word.\",\n parameters: [],\n },\n {\n name: \"mstts:silence\",\n aliases: [\"silence\"],\n description: \"Adds a specified silence before or after text or at a punctuation boundary.\",\n parameters: [\n {\n name: \"type\",\n description: \"The silence position or punctuation boundary.\",\n values: SILENCE_TYPE_PRESETS,\n },\n {\n name: \"value\",\n description: \"The silence duration, for example `300ms`.\",\n example: SSML_PRESET_EXAMPLES.silenceValue,\n },\n ],\n },\n {\n name: \"mstts:viseme\",\n aliases: [\"viseme\"],\n description: \"Requests viseme events for the synthesized audio.\",\n parameters: [\n {\n name: \"type\",\n description: \"The viseme event format.\",\n values: VISEME_TYPE_PRESETS,\n },\n ],\n },\n {\n name: \"mstts:audioduration\",\n description: \"Sets the target duration of synthesized audio.\",\n parameters: [\n {\n name: \"value\",\n description: \"The target duration, such as `10s`, `5000ms`, or `00:00:10`.\",\n example: \"10s\",\n },\n ],\n },\n {\n name: \"mstts:dialog\",\n description: \"Groups multiple Azure dialog turns that can use different voices.\",\n parameters: [],\n },\n {\n name: \"mstts:turn\",\n description: \"Adds one dialog turn using the required Azure voice name.\",\n parameters: [\n {\n name: \"voice\",\n description: \"The Azure voice used for this turn, such as `en-US-JennyNeural`.\",\n example: \"en-US-JennyNeural\",\n },\n ],\n },\n {\n name: \"mstts:backgroundaudio\",\n description: \"Plays background audio while speech is synthesized.\",\n parameters: [\n {\n name: \"src\",\n description: \"An absolute HTTP(S) URL for the background audio file.\",\n example: \"https://example.com/music.mp3\",\n },\n {\n name: \"volume\",\n description: \"The background audio volume from 0 to 100.\",\n example: \"70\",\n },\n {\n name: \"fadein\",\n description: \"The fade-in duration in milliseconds from 0 to 10000.\",\n example: \"1000\",\n },\n {\n name: \"fadeout\",\n description: \"The fade-out duration in milliseconds from 0 to 10000.\",\n example: \"1000\",\n },\n ],\n },\n {\n name: \"mstts:ttsembedding\",\n description: \"Embeds custom voice or speaker profile metadata for Azure Speech.\",\n parameters: [],\n },\n {\n name: \"mstts:embedding\",\n description: \"Specifies embedding metadata for custom voice scenarios.\",\n parameters: [],\n },\n {\n name: \"mstts:voiceconversion\",\n description: \"Specifies voice conversion metadata for custom voice scenarios.\",\n parameters: [],\n },\n] as const;\n\nexport { SSML_TAG_DEFINITIONS };\n\nconst definitionsByName = new Map<string, SsmlTagDefinition>();\nfor (const definition of SSML_TAG_DEFINITIONS) {\n definitionsByName.set(definition.name, definition);\n for (const alias of definition.aliases ?? []) {\n definitionsByName.set(alias, definition);\n }\n}\n\ninterface TokenRange {\n start: number;\n end: number;\n}\n\ninterface AttributeToken {\n name: TokenRange;\n value?: TokenRange;\n}\n\ninterface TagToken {\n name: string;\n nameRange: TokenRange;\n start: number;\n end: number;\n closing: boolean;\n attributes: AttributeToken[];\n}\n\nfunction isXmlNameStart(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z_]/.test(value);\n}\n\nfunction isXmlNameCharacter(value: string | undefined): boolean {\n return value !== undefined && /[A-Za-z0-9_.:-]/.test(value);\n}\n\nfunction isXmlWhitespace(value: string | undefined): boolean {\n return value === \" \" || value === \"\\t\" || value === \"\\r\" || value === \"\\n\";\n}\n\nfunction positionToOffset(source: string, lineNumber: number, column: number): number | undefined {\n if (!Number.isInteger(lineNumber) || !Number.isInteger(column) || lineNumber < 1 || column < 1) {\n return undefined;\n }\n\n let lineStart = 0;\n for (let line = 1; line < lineNumber; line += 1) {\n const newline = source.indexOf(\"\\n\", lineStart);\n if (newline === -1) {\n return undefined;\n }\n lineStart = newline + 1;\n }\n\n const lineEnd = source.indexOf(\"\\n\", lineStart);\n const lineLength = lineEnd === -1 ? source.length - lineStart : lineEnd - lineStart;\n if (column > lineLength + 1) {\n return undefined;\n }\n\n return lineStart + column - 1;\n}\n\nfunction offsetToPosition(\n source: string,\n offset: number,\n): {\n lineNumber: number;\n column: number;\n} {\n const lastNewline = source.lastIndexOf(\"\\n\", offset - 1);\n const lineNumber = source.slice(0, offset).split(\"\\n\").length;\n return {\n lineNumber,\n column: offset - lastNewline,\n };\n}\n\nfunction toRange(source: string, token: TokenRange): SsmlHoverRange {\n const start = offsetToPosition(source, token.start);\n const end = offsetToPosition(source, token.end);\n return {\n startLineNumber: start.lineNumber,\n startColumn: start.column,\n endLineNumber: end.lineNumber,\n endColumn: end.column,\n };\n}\n\nfunction containsOffset(token: TokenRange, offset: number): boolean {\n return offset >= token.start && offset < token.end;\n}\n\nfunction findTagEnd(source: string, start: number): number | undefined {\n let quote: string | undefined;\n for (let index = start; 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 undefined;\n}\n\nfunction parseTag(source: string, start: number, contentEnd: number, tokenEnd: number): TagToken | undefined {\n let index = start + 1;\n let closing = false;\n if (source[index] === \"/\") {\n closing = true;\n index += 1;\n }\n\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n if (!isXmlNameStart(source[index])) {\n return undefined;\n }\n\n const nameStart = index;\n index += 1;\n while (index < contentEnd && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n const nameEnd = index;\n const attributes: AttributeToken[] = [];\n\n if (!closing) {\n while (index < contentEnd) {\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n if (index >= contentEnd || source[index] === \"/\") {\n break;\n }\n if (!isXmlNameStart(source[index])) {\n index += 1;\n continue;\n }\n\n const attributeStart = index;\n index += 1;\n while (index < contentEnd && isXmlNameCharacter(source[index])) {\n index += 1;\n }\n const attributeEnd = index;\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n\n let value: TokenRange | undefined;\n if (source[index] === \"=\") {\n index += 1;\n while (index < contentEnd && isXmlWhitespace(source[index])) {\n index += 1;\n }\n\n const quote = source[index];\n if (quote === '\"' || quote === \"'\") {\n index += 1;\n const valueStart = index;\n while (index < contentEnd && source[index] !== quote) {\n index += 1;\n }\n value = { start: valueStart, end: index };\n if (index < contentEnd) {\n index += 1;\n }\n } else {\n const valueStart = index;\n while (index < contentEnd && !isXmlWhitespace(source[index]) && source[index] !== \"/\") {\n index += 1;\n }\n value = { start: valueStart, end: index };\n }\n }\n\n attributes.push({\n name: { start: attributeStart, end: attributeEnd },\n value,\n });\n }\n }\n\n return {\n name: source.slice(nameStart, nameEnd),\n nameRange: { start: nameStart, end: nameEnd },\n start,\n end: tokenEnd,\n closing,\n attributes,\n };\n}\n\nfunction findTagAtOffset(source: string, offset: number): TagToken | undefined {\n let searchStart = 0;\n while (searchStart < source.length) {\n const start = source.indexOf(\"<\", searchStart);\n if (start === -1 || start > offset) {\n return undefined;\n }\n\n if (source.startsWith(\"<!--\", start)) {\n const commentEnd = source.indexOf(\"-->\", start + 4);\n const tokenEnd = commentEnd === -1 ? source.length : commentEnd + 3;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n if (source.startsWith(\"<![CDATA[\", start)) {\n const cdataEnd = source.indexOf(\"]]>\", start + 9);\n const tokenEnd = cdataEnd === -1 ? source.length : cdataEnd + 3;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n if (source.startsWith(\"<?\", start)) {\n const processingEnd = source.indexOf(\"?>\", start + 2);\n const tokenEnd = processingEnd === -1 ? source.length : processingEnd + 2;\n if (offset < tokenEnd) {\n return undefined;\n }\n searchStart = tokenEnd;\n continue;\n }\n\n const tagEnd = findTagEnd(source, start + 1);\n const contentEnd = tagEnd ?? source.length;\n const tokenEnd = tagEnd === undefined ? source.length : tagEnd + 1;\n if (offset < tokenEnd) {\n return parseTag(source, start, contentEnd, tokenEnd);\n }\n\n if (tagEnd === undefined) {\n return undefined;\n }\n searchStart = tokenEnd;\n }\n return undefined;\n}\n\nfunction findParameter(definition: SsmlTagDefinition, name: string): SsmlParameterDefinition | undefined {\n return definition.parameters.find(\n (parameter) => parameter.name === name || parameter.aliases?.includes(name) === true,\n );\n}\n\nexport function getSsmlTagDefinition(name: string): SsmlTagDefinition | undefined {\n return definitionsByName.get(name);\n}\n\nexport function findSsmlHoverTarget(source: string, lineNumber: number, column: number): SsmlHoverTarget | undefined {\n const offset = positionToOffset(source, lineNumber, column);\n if (offset === undefined) {\n return undefined;\n }\n\n const tag = findTagAtOffset(source, offset);\n if (!tag) {\n return undefined;\n }\n\n const definition = getSsmlTagDefinition(tag.name);\n if (!definition) {\n return undefined;\n }\n\n if (containsOffset(tag.nameRange, offset)) {\n return {\n kind: \"tag\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n range: toRange(source, tag.nameRange),\n };\n }\n\n for (const attribute of tag.attributes) {\n if (containsOffset(attribute.name, offset)) {\n const parameter = findParameter(definition, source.slice(attribute.name.start, attribute.name.end));\n if (!parameter) {\n return undefined;\n }\n return {\n kind: \"parameter\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n parameter,\n range: toRange(source, attribute.name),\n };\n }\n\n if (attribute.value && containsOffset(attribute.value, offset)) {\n const parameter = findParameter(definition, source.slice(attribute.name.start, attribute.name.end));\n if (!parameter) {\n return undefined;\n }\n return {\n kind: \"parameter-value\",\n tagName: tag.name,\n isClosingTag: tag.closing,\n definition,\n parameter,\n range: toRange(source, attribute.value),\n };\n }\n }\n\n return undefined;\n}\n\nfunction code(value: string): string {\n return `\\`${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\")}\\``;\n}\n\nfunction formatParameter(parameter: SsmlParameterDefinition, tagName: string, locale: SsmlEditorLocale): string {\n const localizedParameter = SSML_HOVER_COPY[locale].tags[tagName]?.parameters[parameter.name];\n const description = localizedParameter?.description ?? parameter.description;\n const values =\n parameter.values && parameter.values.length > 0\n ? ` ${SSML_HOVER_COPY[locale].allowedValues}: ${parameter.values.map(code).join(\", \")}.`\n : \"\";\n const example = parameter.example ? ` ${SSML_HOVER_COPY[locale].example}: ${code(parameter.example)}.` : \"\";\n return `- ${code(parameter.name)}: ${description}${values}${example}`;\n}\n\nexport function formatSsmlHover(target: SsmlHoverTarget, locale: SsmlEditorLocale = \"en\"): string {\n const localizedTag = SSML_HOVER_COPY[locale].tags[target.definition.name];\n const tagTitle = localizedTag?.title ?? target.definition.name;\n const tagDescription = localizedTag?.description ?? target.definition.description;\n const tagSyntax = target.isClosingTag ? `</${target.tagName}>` : `<${target.tagName}>`;\n const lines = [`### ${code(tagSyntax)}`, \"\", `**${tagTitle}**`, \"\", tagDescription];\n\n if (target.parameter) {\n const localizedParameter = localizedTag?.parameters[target.parameter.name];\n const parameterTitle = localizedParameter?.title ?? target.parameter.name;\n const parameterDescription = localizedParameter?.description ?? target.parameter.description;\n lines.push(\"\", `**${SSML_HOVER_COPY[locale].parameterHeading} ${code(parameterTitle)}**`, \"\", parameterDescription);\n if (target.parameter.values && target.parameter.values.length > 0) {\n lines.push(\"\", `${SSML_HOVER_COPY[locale].allowedValues}: ${target.parameter.values.map(code).join(\", \")}.`);\n }\n if (target.parameter.example) {\n lines.push(\"\", `${SSML_HOVER_COPY[locale].example}: ${code(target.parameter.example)}.`);\n }\n } else if (target.definition.parameters.length > 0) {\n lines.push(\n \"\",\n `**${SSML_HOVER_COPY[locale].parametersHeading}**`,\n \"\",\n ...target.definition.parameters.map((parameter) => formatParameter(parameter, target.definition.name, locale)),\n );\n } else {\n lines.push(\"\", SSML_HOVER_COPY[locale].noParameters);\n }\n\n return lines.join(\"\\n\");\n}\n","import { useMemo, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n buildSsml,\n validateAzureSsml,\n type SsmlDocument,\n type SsmlElement,\n type SsmlNode,\n type SsmlDiagnostic,\n} from \"@ssml-builder-js/ssml-core\";\nimport { SSML_ELEMENT_COPY, type SsmlEditorLocale } from \"../locales\";\n\nexport interface VisualVoiceCatalogEntry {\n name: string;\n locale: string;\n region?: string;\n regions?: readonly string[];\n styles?: readonly string[];\n supportedTags?: readonly string[];\n unsupportedTags?: readonly string[];\n models?: readonly string[];\n preview?: boolean;\n status?: \"ga\" | \"preview\" | \"deprecated\";\n}\n\nexport interface VoiceSelectorRenderProps {\n value: string;\n voices: readonly VisualVoiceCatalogEntry[];\n selectedVoice?: VisualVoiceCatalogEntry;\n readOnly: boolean;\n locale: SsmlEditorLocale;\n onChange: (voice: string) => void;\n}\n\nexport interface VisualInspectorRenderProps {\n document: SsmlDocument;\n element: SsmlElement;\n path: number[];\n readOnly: boolean;\n onChange: (document: SsmlDocument) => void;\n locale: SsmlEditorLocale;\n}\n\nexport type VisualInspectorRenderer = (props: VisualInspectorRenderProps) => ReactNode;\n\nexport interface VisualSsmlEditorProps {\n document: SsmlDocument;\n readOnly?: boolean;\n onChange?: (document: SsmlDocument) => void;\n onPreviewSelection?: (ssml: string) => void;\n locale?: SsmlEditorLocale;\n customInspectors?: Readonly<Record<string, VisualInspectorRenderer>>;\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n voiceLocale?: string;\n voiceRegion?: string;\n voiceStyle?: string;\n /** Selected Azure voice model used for live capability validation. */\n voiceModel?: string;\n /** Alias for voiceModel. */\n model?: string;\n}\n\ninterface TextLeaf {\n path: number[];\n value: string;\n ancestors: string[];\n}\n\nfunction isElement(node: SsmlNode): node is SsmlElement {\n return typeof node !== \"string\" && node.type !== \"text\";\n}\n\nfunction elementLabel(element: SsmlElement): string {\n return element.type === \"custom\" || element.type === \"element\" ? element.name : element.type;\n}\n\nfunction collectTextLeaves(nodes: SsmlNode[], path: number[] = [], ancestors: string[] = []): TextLeaf[] {\n return nodes.flatMap((node, index) => {\n const currentPath = [...path, index];\n if (typeof node === \"string\") return [{ ancestors, path: currentPath, value: node }];\n if (node.type === \"text\") return [{ ancestors, path: currentPath, value: node.value }];\n return collectTextLeaves(node.children ?? [], currentPath, [...ancestors, elementLabel(node)]);\n });\n}\n\nfunction updateNodesAtPath(\n nodes: SsmlNode[],\n path: number[],\n update: (node: SsmlNode) => SsmlNode | SsmlNode[],\n): SsmlNode[] {\n if (path.length === 0) return nodes;\n const [index, ...rest] = path;\n return nodes.flatMap((node, nodeIndex) => {\n if (nodeIndex !== index) return [node];\n if (rest.length === 0) {\n const next = update(node);\n return Array.isArray(next) ? next : [next];\n }\n if (!isElement(node)) return [node];\n return [{ ...node, children: updateNodesAtPath(node.children ?? [], rest, update) }];\n });\n}\n\nfunction updateTextAtPath(document: SsmlDocument, path: number[], value: string): SsmlDocument {\n return { ...document, children: updateNodesAtPath(document.children ?? [], path, () => value) };\n}\n\nfunction getNodeAtPath(nodes: SsmlNode[], path: number[]): SsmlNode | undefined {\n let current: SsmlNode | undefined;\n let currentNodes = nodes;\n for (const index of path) {\n current = currentNodes[index];\n if (current === undefined) return undefined;\n if (!isElement(current)) {\n currentNodes = [];\n } else {\n currentNodes = current.children ?? [];\n }\n }\n return current;\n}\n\nfunction updateElementAtPath(\n document: SsmlDocument,\n path: number[],\n update: (element: SsmlElement) => SsmlElement,\n): SsmlDocument {\n return {\n ...document,\n children: updateNodesAtPath(document.children ?? [], path, (node) => (isElement(node) ? update(node) : node)),\n };\n}\n\nfunction updateElementText(element: SsmlElement, value: string): SsmlElement {\n return { ...element, children: [value] };\n}\n\nfunction updateOptionalElementProperty(\n document: SsmlDocument,\n path: number[],\n property: string,\n value: string,\n): SsmlDocument {\n return updateElementAtPath(document, path, (element) => {\n const next = { ...element } as SsmlElement & Record<string, unknown>;\n if (value.trim()) next[property] = value;\n else delete next[property];\n return next;\n });\n}\n\ninterface VisualElementField {\n key: string;\n label: string;\n multiline?: boolean;\n}\n\nconst VISUAL_ELEMENT_FIELDS: Readonly<Record<string, readonly VisualElementField[]>> = {\n voice: [\n { key: \"name\", label: \"Voice name\" },\n { key: \"effect\", label: \"Effect\" },\n ],\n prosody: [\n { key: \"rate\", label: \"Rate\" },\n { key: \"pitch\", label: \"Pitch\" },\n { key: \"volume\", label: \"Volume\" },\n { key: \"contour\", label: \"Contour\" },\n { key: \"range\", label: \"Range\" },\n ],\n \"express-as\": [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n expressAs: [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n \"mstts:express-as\": [\n { key: \"style\", label: \"Style\" },\n { key: \"styleDegree\", label: \"Style degree\" },\n { key: \"role\", label: \"Role\" },\n ],\n \"say-as\": [\n { key: \"interpretAs\", label: \"Interpret as\" },\n { key: \"format\", label: \"Format\" },\n { key: \"detail\", label: \"Detail\" },\n ],\n sayAs: [\n { key: \"interpretAs\", label: \"Interpret as\" },\n { key: \"format\", label: \"Format\" },\n { key: \"detail\", label: \"Detail\" },\n ],\n phoneme: [\n { key: \"alphabet\", label: \"Alphabet\" },\n { key: \"ph\", label: \"Pronunciation\" },\n ],\n emphasis: [{ key: \"level\", label: \"Level\" }],\n audio: [\n { key: \"src\", label: \"Source URL\" },\n { key: \"desc\", label: \"Description\" },\n { key: \"clipBegin\", label: \"Clip begin\" },\n { key: \"clipEnd\", label: \"Clip end\" },\n { key: \"speed\", label: \"Speed\" },\n { key: \"repeatCount\", label: \"Repeat count\" },\n { key: \"repeatDuration\", label: \"Repeat duration\" },\n { key: \"soundLevel\", label: \"Sound level\" },\n ],\n mark: [{ key: \"name\", label: \"Mark name\" }],\n bookmark: [{ key: \"mark\", label: \"Bookmark name\" }],\n sub: [{ key: \"alias\", label: \"Alias\" }],\n lang: [{ key: \"lang\", label: \"Language\" }],\n lexicon: [{ key: \"uri\", label: \"Lexicon URI\" }],\n \"mstts:silence\": [\n { key: \"typeValue\", label: \"Silence type\" },\n { key: \"value\", label: \"Value\" },\n ],\n silence: [\n { key: \"typeValue\", label: \"Silence type\" },\n { key: \"value\", label: \"Value\" },\n ],\n \"mstts:audioduration\": [{ key: \"value\", label: \"Duration\" }],\n \"mstts:ttsembedding\": [{ key: \"speakerProfileId\", label: \"Speaker profile ID\" }],\n \"mstts:embedding\": [\n { key: \"id\", label: \"Embedding ID\" },\n { key: \"speakerProfileId\", label: \"Speaker profile ID\" },\n ],\n \"mstts:voiceconversion\": [\n { key: \"url\", label: \"Source URL\" },\n { key: \"profile\", label: \"Profile\" },\n { key: \"speakerProfileId\", label: \"Speaker profile ID\" },\n ],\n};\n\nfunction getElementFields(element: SsmlElement): readonly VisualElementField[] {\n return VISUAL_ELEMENT_FIELDS[elementLabel(element)] ?? [];\n}\n\nfunction localizedElementLabel(element: SsmlElement, locale: SsmlEditorLocale): string {\n return SSML_ELEMENT_COPY[locale][elementLabel(element)]?.label ?? elementLabel(element);\n}\n\nfunction filteredVoices(\n voiceCatalog: readonly VisualVoiceCatalogEntry[] | undefined,\n locale: string | undefined,\n region: string | undefined,\n style: string | undefined,\n): readonly VisualVoiceCatalogEntry[] {\n return (voiceCatalog ?? []).filter((voice) => {\n if (locale && voice.locale.toLowerCase() !== locale.toLowerCase()) return false;\n const regions = [voice.region, ...(voice.regions ?? [])].filter((candidate): candidate is string =>\n Boolean(candidate),\n );\n if (region && regions.length > 0 && !regions.some((candidate) => candidate.toLowerCase() === region.toLowerCase()))\n return false;\n if (style && !voice.styles?.some((candidate) => candidate.toLowerCase() === style.toLowerCase())) return false;\n return true;\n });\n}\n\nfunction VoiceCapabilityMatrix({\n voice,\n locale,\n}: {\n voice: VisualVoiceCatalogEntry;\n locale: SsmlEditorLocale;\n}): ReactElement {\n const status = voice.status ?? (voice.preview ? \"preview\" : undefined);\n return (\n <div className=\"ssml-editor-voice-capabilities\" data-voice-capabilities=\"\">\n <div>\n {locale === \"ja\" ? \"ステータス\" : \"Status\"}: {status?.toUpperCase() ?? (locale === \"ja\" ? \"GA\" : \"GA\")}\n {status === \"preview\" || status === \"deprecated\" ? (\n <span role=\"status\" aria-label={status} className=\"ssml-editor-voice-warning-badge\">\n {status === \"preview\" ? \"⚠ Preview\" : \"⚠ Deprecated\"}\n </span>\n ) : null}\n </div>\n {(voice.regions?.length || voice.region) && (\n <div>\n {locale === \"ja\" ? \"リージョン\" : \"Regions\"}:{\" \"}\n {[...(voice.regions ?? []), ...(voice.region ? [voice.region] : [])]\n .filter((region, index, all) => all.indexOf(region) === index)\n .join(\", \")}\n </div>\n )}\n {voice.supportedTags && voice.supportedTags.length > 0 && (\n <div>\n {locale === \"ja\" ? \"対応タグ\" : \"Supported tags\"}: {voice.supportedTags.join(\", \")}\n </div>\n )}\n {voice.unsupportedTags && voice.unsupportedTags.length > 0 && (\n <div className=\"ssml-editor-voice-unsupported\">\n {locale === \"ja\" ? \"非対応タグ\" : \"Unsupported tags\"}: {voice.unsupportedTags.join(\", \")}\n </div>\n )}\n </div>\n );\n}\n\nfunction diagnosticMatchesElement(diagnostic: SsmlDiagnostic, element: SsmlElement): boolean {\n const name = elementLabel(element).toLowerCase().replace(\"expressas\", \"mstts:express-as\");\n if (diagnostic.code === \"azure-unsupported-style\") return name === \"mstts:express-as\" || name === \"express-as\";\n if (diagnostic.code === \"azure-unsupported-tag-for-voice\") {\n return (\n diagnostic.message.toLowerCase().includes(`<${name}>`) ||\n diagnostic.message.toLowerCase().includes(`<${name.replace(\"mstts:\", \"\")}>`)\n );\n }\n if (diagnostic.code === \"azure-locale-mismatch\" || diagnostic.code === \"azure-unsupported-model-for-voice\")\n return name === \"voice\" || name === \"mstts:turn\";\n return false;\n}\n\nfunction elementWarnings(diagnostics: readonly SsmlDiagnostic[], element: SsmlElement): readonly SsmlDiagnostic[] {\n return diagnostics.filter((diagnostic) => diagnosticMatchesElement(diagnostic, element));\n}\n\nfunction fieldWarnings(\n diagnostics: readonly SsmlDiagnostic[],\n element: SsmlElement,\n field: VisualElementField,\n): readonly SsmlDiagnostic[] {\n return elementWarnings(diagnostics, element).filter((diagnostic) => {\n if (diagnostic.code === \"azure-unsupported-style\") return field.key === \"style\";\n return field.key === \"name\" || field.key === \"voice\";\n });\n}\n\nfunction WarningBadge({ messages }: { messages: readonly SsmlDiagnostic[] }): ReactElement | null {\n if (messages.length === 0) return null;\n return (\n <span\n role=\"status\"\n aria-label={messages.map((message) => message.message).join(\" \")}\n title={messages.map((message) => message.message).join(\" \")}\n data-ssml-warning-badge=\"\"\n data-testid=\"ssml-editor-warning-badge\"\n className=\"ssml-editor-warning-badge\"\n >\n ⚠\n </span>\n );\n}\n\nfunction DefaultVoiceSelector({\n value,\n voices,\n selectedVoice,\n readOnly,\n locale,\n onChange,\n}: VoiceSelectorRenderProps): ReactElement {\n return (\n <>\n <select\n aria-label={locale === \"ja\" ? \"音声\" : \"Voice\"}\n value={value}\n disabled={readOnly}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">{locale === \"ja\" ? \"音声を選択\" : \"Select a voice\"}</option>\n {voices.map((voice) => (\n <option key={voice.name} value={voice.name}>\n {voice.name}\n {voice.preview || voice.status === \"preview\" ? \" (preview)\" : \"\"}\n </option>\n ))}\n </select>\n {selectedVoice ? <VoiceCapabilityMatrix voice={selectedVoice} locale={locale} /> : null}\n </>\n );\n}\n\nfunction VisualElementInspector({\n document,\n element,\n path,\n readOnly,\n commit,\n locale,\n customInspector,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n diagnostics,\n}: {\n document: SsmlDocument;\n element: SsmlElement;\n path: number[];\n readOnly: boolean;\n commit: (document: SsmlDocument) => void;\n locale: SsmlEditorLocale;\n customInspector?: VisualInspectorRenderer;\n renderVoiceSelector?: (props: VoiceSelectorRenderProps) => ReactNode;\n voiceCatalog?: readonly VisualVoiceCatalogEntry[];\n voiceLocale?: string;\n voiceRegion?: string;\n voiceStyle?: string;\n diagnostics: readonly SsmlDiagnostic[];\n}): ReactElement {\n if (customInspector) {\n return <>{customInspector({ document, element, path, readOnly, onChange: commit, locale })}</>;\n }\n const fields = getElementFields(element);\n const availableVoices = filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle);\n const selectedVoice = voiceCatalog?.find(\n (voice) => voice.name === (element.type === \"voice\" ? element.name : undefined),\n );\n const renderSelector = renderVoiceSelector ?? DefaultVoiceSelector;\n return (\n <fieldset>\n <legend>\n {`<${elementLabel(element)}>`} <WarningBadge messages={elementWarnings(diagnostics, element)} />\n </legend>\n {fields.length === 0 ? (\n <p>This element is preserved in the visual tree. Edit its attributes in Code mode.</p>\n ) : (\n fields.map((field) => {\n const value = (element as SsmlElement & Record<string, unknown>)[field.key];\n const inputValue = value === undefined ? \"\" : String(value);\n const inputId = `ssml-visual-${field.key}`;\n return (\n <label key={field.key} htmlFor={inputId}>\n {locale === \"ja\"\n ? ((\n {\n name: \"名前\",\n effect: \"効果\",\n rate: \"速度\",\n pitch: \"ピッチ\",\n volume: \"音量\",\n contour: \"ピッチ曲線\",\n range: \"範囲\",\n style: \"スタイル\",\n styleDegree: \"スタイル強度\",\n role: \"役割\",\n interpretAs: \"解釈\",\n alphabet: \"アルファベット\",\n ph: \"発音\",\n level: \"強調レベル\",\n src: \"音声 URL\",\n desc: \"説明\",\n clipBegin: \"開始位置\",\n clipEnd: \"終了位置\",\n speed: \"速度\",\n repeatCount: \"繰り返し回数\",\n repeatDuration: \"繰り返し時間\",\n soundLevel: \"音量レベル\",\n mark: \"ブックマーク名\",\n alias: \"別名\",\n lang: \"言語\",\n uri: \"辞書 URI\",\n typeValue: \"無音の種類\",\n value: \"値\",\n id: \"埋め込み ID\",\n speakerProfileId: \"話者プロファイル ID\",\n url: \"音声変換 URL\",\n profile: \"プロファイル\",\n } as Record<string, string>\n )[field.key] ?? field.label)\n : field.label}\n <WarningBadge messages={fieldWarnings(diagnostics, element, field)} />\n {field.key === \"name\" && elementLabel(element) === \"voice\" && voiceCatalog ? (\n renderSelector({\n value: inputValue,\n voices: availableVoices,\n selectedVoice,\n readOnly,\n locale,\n onChange: (value) => commit(updateOptionalElementProperty(document, path, field.key, value)),\n })\n ) : field.multiline ? (\n <textarea\n id={inputId}\n value={inputValue}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, path, field.key, event.target.value))\n }\n />\n ) : (\n <input\n id={inputId}\n value={inputValue}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, path, field.key, event.target.value))\n }\n />\n )}\n </label>\n );\n })\n )}\n </fieldset>\n );\n}\n\nfunction getElementAncestors(nodes: SsmlNode[], path: number[], ancestors: SsmlElement[] = []): SsmlElement[] {\n const [index, ...rest] = path;\n const node = nodes[index];\n if (!node || !isElement(node)) return ancestors;\n if (rest.length === 0) return ancestors;\n return getElementAncestors(node.children ?? [], rest, [...ancestors, node]);\n}\n\nfunction buildVisualPreview(document: SsmlDocument, leaf: TextLeaf, selection: { start: number; end: number }): string {\n const start = Math.max(0, Math.min(selection.start, leaf.value.length));\n const end = Math.max(start, Math.min(selection.end, leaf.value.length));\n const value = start === end ? leaf.value : leaf.value.slice(start, end);\n const ancestors = getElementAncestors(document.children ?? [], leaf.path);\n const children = ancestors.reduceRight<SsmlNode[]>(\n (current, ancestor) => [{ ...ancestor, children: current }],\n [value],\n );\n return buildSsml({ ...document, children });\n}\n\nfunction addDialogTurn(document: SsmlDocument, path: number[]): SsmlDocument {\n return updateElementAtPath(document, path, (element) => ({\n ...element,\n children: [\n ...(element.children ?? []),\n { type: \"mstts:turn\", voice: \"en-US-JennyNeural\", children: [\"New dialog turn\"] },\n ],\n }));\n}\n\nfunction wrapTextAtPath(\n document: SsmlDocument,\n path: number[],\n start: number,\n end: number,\n tag: SsmlElement[\"type\"],\n attributes: Record<string, string>,\n): SsmlDocument {\n return {\n ...document,\n children: updateNodesAtPath(document.children ?? [], path, (node) => {\n const value = typeof node === \"string\" ? node : node.type === \"text\" ? node.value : \"\";\n if (!value || start === end) return node;\n if (tag === \"break\") {\n return [\n value.slice(0, start),\n { type: tag, attributes, children: [] } as SsmlElement,\n value.slice(start),\n ].filter((part) => (typeof part === \"string\" ? part.length > 0 : true));\n }\n const selected = value.slice(start, end);\n const wrapped = { type: tag, attributes, children: [selected] } as SsmlElement;\n return [value.slice(0, start), wrapped, value.slice(end)].filter((part) =>\n typeof part === \"string\" ? part.length > 0 : true,\n );\n }),\n };\n}\n\nfunction TreeNode({\n node,\n path,\n selectedPath,\n onSelect,\n getWarnings,\n}: {\n node: SsmlNode;\n path: number[];\n selectedPath: number[] | null;\n onSelect: (path: number[]) => void;\n getWarnings: (element: SsmlElement) => readonly SsmlDiagnostic[];\n}): ReactElement | null {\n if (!isElement(node)) return null;\n const name = elementLabel(node);\n const isSelected = selectedPath?.join(\".\") === path.join(\".\");\n return (\n <li>\n <button type=\"button\" aria-current={isSelected ? \"true\" : undefined} onClick={() => onSelect(path)}>\n {`<${name}>`}\n <WarningBadge messages={getWarnings(node)} />\n </button>\n {(node.children ?? []).length > 0 && (\n <ul>\n {node.children?.map((child, index) => (\n <TreeNode\n key={`${path.join(\".\")}/${isElement(child) ? elementLabel(child) : JSON.stringify(child)}`}\n node={child}\n path={[...path, index]}\n selectedPath={selectedPath}\n onSelect={onSelect}\n getWarnings={getWarnings}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nexport function VisualSsmlEditor({\n document,\n readOnly = false,\n onChange,\n onPreviewSelection,\n locale = \"en\",\n customInspectors,\n renderVoiceSelector,\n voiceCatalog,\n voiceLocale,\n voiceRegion,\n voiceStyle,\n voiceModel,\n model,\n}: VisualSsmlEditorProps): ReactElement {\n const [selectedPath, setSelectedPath] = useState<number[] | null>(null);\n const [selection, setSelection] = useState({ start: 0, end: 0 });\n const textLeaves = useMemo(() => collectTextLeaves(document.children ?? []), [document]);\n const selectedLeaf = textLeaves.find((leaf) => leaf.path.join(\".\") === selectedPath?.join(\".\")) ?? textLeaves[0];\n const selectedElement = selectedPath ? getNodeAtPath(document.children ?? [], selectedPath) : undefined;\n const selectedCustomInspector =\n selectedElement && isElement(selectedElement)\n ? (customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type])\n : undefined;\n const validationOptions = useMemo(\n () => ({\n model: voiceModel ?? model,\n customVoiceDefinitions: voiceCatalog?.map((voice) => ({\n name: voice.name,\n locale: voice.locale,\n regions: voice.regions ?? (voice.region ? [voice.region] : undefined),\n styles: voice.styles,\n supportedTags: voice.supportedTags,\n unsupportedTags: voice.unsupportedTags,\n models: voice.models,\n status: voice.status ?? (voice.preview ? \"preview\" : \"ga\"),\n })),\n }),\n [model, voiceCatalog, voiceModel],\n );\n const diagnostics = useMemo(\n () => validateAzureSsml(buildSsml(document), validationOptions) as SsmlDiagnostic[],\n [document, validationOptions],\n );\n const getWarnings = (element: SsmlElement): readonly SsmlDiagnostic[] => elementWarnings(diagnostics, element);\n const commit = (nextDocument: SsmlDocument): void => onChange?.(nextDocument);\n\n const applyWrapper = (tag: SsmlElement[\"type\"], attributes: Record<string, string>): void => {\n if (readOnly || !selectedLeaf) return;\n const start = selection.start === selection.end ? 0 : selection.start;\n const end = selection.start === selection.end ? selectedLeaf.value.length : selection.end;\n commit(wrapTextAtPath(document, selectedLeaf.path, start, end, tag, attributes));\n };\n\n return (\n <div className=\"ssml-editor-visual\" data-ssml-editor-visual=\"\">\n <fieldset className=\"ssml-editor-visual-breadcrumb\">\n <legend>SSML structure breadcrumb</legend>\n <span><speak></span>\n {selectedLeaf?.ancestors.map((ancestor, index) => (\n <span key={selectedLeaf?.ancestors.slice(0, index + 1).join(\"/\")}> / <{ancestor}></span>\n ))}\n {selectedPath && (\n <button type=\"button\" onClick={() => setSelectedPath(null)}>\n Clear parent\n </button>\n )}\n </fieldset>\n {diagnostics.length > 0 && (\n <div role=\"alert\" aria-invalid=\"true\" className=\"ssml-editor-visual-errors\">\n {diagnostics.map((diagnostic) => (\n <div key={`${diagnostic.code}-${diagnostic.message}`}>{diagnostic.message}</div>\n ))}\n </div>\n )}\n <div className=\"ssml-editor-visual-layout\">\n <nav aria-label=\"SSML structure tree\" className=\"ssml-editor-visual-tree\">\n <strong>Structure</strong>\n <ul>\n {document.children?.map((node, index) => (\n <TreeNode\n key={isElement(node) ? elementLabel(node) : JSON.stringify(node)}\n node={node}\n path={[index]}\n selectedPath={selectedPath}\n onSelect={setSelectedPath}\n getWarnings={getWarnings}\n />\n ))}\n </ul>\n </nav>\n <div className=\"ssml-editor-visual-form\">\n {selectedCustomInspector && selectedElement && isElement(selectedElement) ? (\n selectedCustomInspector({\n document,\n element: selectedElement,\n path: selectedPath ?? [],\n readOnly,\n onChange: commit,\n locale,\n })\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:dialog\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <p>{SSML_ELEMENT_COPY[locale][elementLabel(selectedElement)]?.description}</p>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => commit(addDialogTurn(document, selectedPath ?? []))}\n >\n {locale === \"ja\" ? \"ターンを追加\" : \"Add turn\"}\n </button>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:turn\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <label htmlFor=\"ssml-visual-turn-voice\">\n {locale === \"ja\" ? \"音声\" : \"Voice\"}\n <WarningBadge messages={elementWarnings(diagnostics, selectedElement)} />\n {voiceCatalog ? (\n (renderVoiceSelector ?? DefaultVoiceSelector)({\n value: selectedElement.voice ?? \"\",\n voices: filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle),\n selectedVoice: voiceCatalog?.find((voice) => voice.name === selectedElement.voice),\n readOnly,\n locale,\n onChange: (value) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"voice\", value)),\n })\n ) : (\n <input\n id=\"ssml-visual-turn-voice\"\n value={selectedElement.voice ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"voice\", event.target.value))\n }\n />\n )}\n </label>\n <label>\n {locale === \"ja\" ? \"話者\" : \"Speaker\"}\n <input\n value={selectedElement.speaker ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"speaker\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"発話テキスト\" : \"Turn text\"}\n <textarea\n value={\n selectedElement.children?.filter((child): child is string => typeof child === \"string\").join(\"\") ??\n \"\"\n }\n readOnly={readOnly}\n onChange={(event) =>\n commit(\n updateElementAtPath(document, selectedPath ?? [], (element) =>\n updateElementText(element, event.target.value),\n ),\n )\n }\n />\n </label>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) && selectedElement.type === \"mstts:backgroundaudio\" ? (\n <fieldset>\n <legend>{localizedElementLabel(selectedElement, locale)}</legend>\n <label>\n {locale === \"ja\" ? \"音声 URL\" : \"Source URL\"}\n <input\n value={selectedElement.src ?? \"\"}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"src\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"音量\" : \"Volume\"}\n <input\n value={selectedElement.volume === undefined ? \"\" : String(selectedElement.volume)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"volume\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"フェードイン\" : \"Fade in\"}\n <input\n value={selectedElement.fadeIn === undefined ? \"\" : String(selectedElement.fadeIn)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"fadeIn\", event.target.value))\n }\n />\n </label>\n <label>\n {locale === \"ja\" ? \"フェードアウト\" : \"Fade out\"}\n <input\n value={selectedElement.fadeOut === undefined ? \"\" : String(selectedElement.fadeOut)}\n readOnly={readOnly}\n onChange={(event) =>\n commit(updateOptionalElementProperty(document, selectedPath ?? [], \"fadeOut\", event.target.value))\n }\n />\n </label>\n </fieldset>\n ) : selectedElement && isElement(selectedElement) ? (\n <VisualElementInspector\n document={document}\n element={selectedElement}\n path={selectedPath ?? []}\n readOnly={readOnly}\n commit={commit}\n locale={locale}\n customInspector={\n customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type]\n }\n renderVoiceSelector={renderVoiceSelector}\n voiceCatalog={voiceCatalog}\n voiceLocale={voiceLocale}\n voiceRegion={voiceRegion}\n voiceStyle={voiceStyle}\n diagnostics={diagnostics}\n />\n ) : selectedLeaf ? (\n <>\n <label>\n Text\n <textarea\n value={selectedLeaf.value}\n readOnly={readOnly}\n onSelect={(event) =>\n setSelection({ start: event.currentTarget.selectionStart, end: event.currentTarget.selectionEnd })\n }\n onChange={(event) => commit(updateTextAtPath(document, selectedLeaf.path, event.target.value))}\n />\n </label>\n <fieldset className=\"ssml-editor-visual-actions\">\n <legend>Apply SSML formatting</legend>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"prosody\", { rate: \"slow\" })}>\n Rate\n </button>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"prosody\", { pitch: \"high\" })}>\n Pitch\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => applyWrapper(\"mstts:express-as\", { style: \"cheerful\" })}\n >\n Emotion\n </button>\n <button type=\"button\" disabled={readOnly} onClick={() => applyWrapper(\"break\", { time: \"500ms\" })}>\n Pause\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => applyWrapper(\"phoneme\", { alphabet: \"ipa\", ph: selectedLeaf.value })}\n >\n Pronunciation\n </button>\n {onPreviewSelection && (\n <button\n type=\"button\"\n onClick={() => onPreviewSelection(buildVisualPreview(document, selectedLeaf, selection))}\n >\n Preview selection\n </button>\n )}\n </fieldset>\n </>\n ) : (\n <p>Select an element or text node to edit it.</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Fragment","useEffect","useState","Fragment","jsx","jsx","jsx","jsx","buildSsml","document","appendNode","end","name","document","end","getDocumentChildren","document","trailingLineBreak","findTagEnd","isSsmlElement","isVoice","isProsody","getDocumentChildren","document","buildSsml","useCallback","useEffect","useRef","value","findTagEnd","BREAK_STRENGTH_PRESETS","EMPHASIS_LEVEL_PRESETS","PHONEME_ALPHABET_PRESETS","PROSODY_RATE_VALUES","PROSODY_VOLUME_PRESETS","SILENCE_TYPE_PRESETS","SSML_PRESET_EXAMPLES","VISEME_TYPE_PRESETS","isXmlNameStart","isXmlNameCharacter","isXmlWhitespace","findTagEnd","tokenEnd","useRef","useCallback","model","useEffect","useState","buildSsml","Fragment","jsx","jsxs","document","value","buildSsml","useState","Fragment","jsx","jsxs","escapeXmlAttribute","SsmlEditor","document","useState","useEffect","getSelectedSsml","getCurrentLineSsml"]}
|