ssml-builder-js 2.11.0 → 2.13.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/dist/react.mjs CHANGED
@@ -26,9 +26,8 @@ import {
26
26
  SILENCE_VALUE_DESCRIPTIONS,
27
27
  SILENCE_VALUE_PRESETS,
28
28
  SSML_ATTRIBUTE_PRESETS,
29
+ SSML_ELEMENT_COPY,
29
30
  SSML_HOVER_COPY,
30
- buildPartialSsml,
31
- buildSsml,
32
31
  clearSsmlDocument,
33
32
  createSsmlInsertionEdit,
34
33
  findActiveSsmlTags,
@@ -42,10 +41,14 @@ import {
42
41
  registerSsmlCompletionProvider,
43
42
  resolveExpressAsStyles,
44
43
  updateEditableText,
45
- updateTagAttribute,
44
+ updateTagAttribute
45
+ } from "./chunk-LCTE26LS.mjs";
46
+ import {
47
+ buildPartialSsml,
48
+ buildSsml,
46
49
  validateAzureSsml,
47
50
  validateSsml
48
- } from "./chunk-FWWMWI2C.mjs";
51
+ } from "./chunk-CZ2F3TET.mjs";
49
52
  import "./chunk-6S5ODO6A.mjs";
50
53
 
51
54
  // packages/ssml-editor-react/src/SsmlEditor.tsx
@@ -1871,6 +1874,210 @@ function updateOptionalElementProperty(document2, path, property, value) {
1871
1874
  return next;
1872
1875
  });
1873
1876
  }
1877
+ var VISUAL_ELEMENT_FIELDS = {
1878
+ voice: [
1879
+ { key: "name", label: "Voice name" },
1880
+ { key: "effect", label: "Effect" }
1881
+ ],
1882
+ prosody: [
1883
+ { key: "rate", label: "Rate" },
1884
+ { key: "pitch", label: "Pitch" },
1885
+ { key: "volume", label: "Volume" },
1886
+ { key: "contour", label: "Contour" },
1887
+ { key: "range", label: "Range" }
1888
+ ],
1889
+ "express-as": [
1890
+ { key: "style", label: "Style" },
1891
+ { key: "styleDegree", label: "Style degree" },
1892
+ { key: "role", label: "Role" }
1893
+ ],
1894
+ expressAs: [
1895
+ { key: "style", label: "Style" },
1896
+ { key: "styleDegree", label: "Style degree" },
1897
+ { key: "role", label: "Role" }
1898
+ ],
1899
+ "mstts:express-as": [
1900
+ { key: "style", label: "Style" },
1901
+ { key: "styleDegree", label: "Style degree" },
1902
+ { key: "role", label: "Role" }
1903
+ ],
1904
+ "say-as": [
1905
+ { key: "interpretAs", label: "Interpret as" },
1906
+ { key: "format", label: "Format" },
1907
+ { key: "detail", label: "Detail" }
1908
+ ],
1909
+ sayAs: [
1910
+ { key: "interpretAs", label: "Interpret as" },
1911
+ { key: "format", label: "Format" },
1912
+ { key: "detail", label: "Detail" }
1913
+ ],
1914
+ phoneme: [
1915
+ { key: "alphabet", label: "Alphabet" },
1916
+ { key: "ph", label: "Pronunciation" }
1917
+ ],
1918
+ emphasis: [{ key: "level", label: "Level" }],
1919
+ audio: [
1920
+ { key: "src", label: "Source URL" },
1921
+ { key: "desc", label: "Description" },
1922
+ { key: "clipBegin", label: "Clip begin" },
1923
+ { key: "clipEnd", label: "Clip end" },
1924
+ { key: "speed", label: "Speed" },
1925
+ { key: "repeatCount", label: "Repeat count" },
1926
+ { key: "repeatDuration", label: "Repeat duration" },
1927
+ { key: "soundLevel", label: "Sound level" }
1928
+ ],
1929
+ mark: [{ key: "name", label: "Mark name" }],
1930
+ bookmark: [{ key: "mark", label: "Bookmark name" }],
1931
+ sub: [{ key: "alias", label: "Alias" }],
1932
+ lang: [{ key: "lang", label: "Language" }],
1933
+ lexicon: [{ key: "uri", label: "Lexicon URI" }],
1934
+ "mstts:silence": [
1935
+ { key: "typeValue", label: "Silence type" },
1936
+ { key: "value", label: "Value" }
1937
+ ],
1938
+ silence: [
1939
+ { key: "typeValue", label: "Silence type" },
1940
+ { key: "value", label: "Value" }
1941
+ ],
1942
+ "mstts:audioduration": [{ key: "value", label: "Duration" }],
1943
+ "mstts:ttsembedding": [{ key: "speakerProfileId", label: "Speaker profile ID" }],
1944
+ "mstts:embedding": [
1945
+ { key: "id", label: "Embedding ID" },
1946
+ { key: "speakerProfileId", label: "Speaker profile ID" }
1947
+ ],
1948
+ "mstts:voiceconversion": [
1949
+ { key: "url", label: "Source URL" },
1950
+ { key: "profile", label: "Profile" },
1951
+ { key: "speakerProfileId", label: "Speaker profile ID" }
1952
+ ]
1953
+ };
1954
+ function getElementFields(element) {
1955
+ return VISUAL_ELEMENT_FIELDS[elementLabel(element)] ?? [];
1956
+ }
1957
+ function localizedElementLabel(element, locale) {
1958
+ return SSML_ELEMENT_COPY[locale][elementLabel(element)]?.label ?? elementLabel(element);
1959
+ }
1960
+ function filteredVoices(voiceCatalog, locale, region, style) {
1961
+ return (voiceCatalog ?? []).filter((voice) => {
1962
+ if (locale && voice.locale.toLowerCase() !== locale.toLowerCase()) return false;
1963
+ if (region && voice.region && voice.region.toLowerCase() !== region.toLowerCase()) return false;
1964
+ if (style && !voice.styles?.some((candidate) => candidate.toLowerCase() === style.toLowerCase())) return false;
1965
+ return true;
1966
+ });
1967
+ }
1968
+ function DefaultVoiceSelector({ value, voices, readOnly, locale, onChange }) {
1969
+ return /* @__PURE__ */ React.createElement(
1970
+ "select",
1971
+ {
1972
+ "aria-label": locale === "ja" ? "\u97F3\u58F0" : "Voice",
1973
+ value,
1974
+ disabled: readOnly,
1975
+ onChange: (event) => onChange(event.target.value)
1976
+ },
1977
+ /* @__PURE__ */ React.createElement("option", { value: "" }, locale === "ja" ? "\u97F3\u58F0\u3092\u9078\u629E" : "Select a voice"),
1978
+ voices.map((voice) => /* @__PURE__ */ React.createElement("option", { key: voice.name, value: voice.name }, voice.name, voice.preview || voice.status === "preview" ? " (preview)" : ""))
1979
+ );
1980
+ }
1981
+ function VisualElementInspector({
1982
+ document: document2,
1983
+ element,
1984
+ path,
1985
+ readOnly,
1986
+ commit,
1987
+ locale,
1988
+ customInspector,
1989
+ renderVoiceSelector,
1990
+ voiceCatalog,
1991
+ voiceLocale,
1992
+ voiceRegion,
1993
+ voiceStyle
1994
+ }) {
1995
+ if (customInspector) {
1996
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, customInspector({ document: document2, element, path, readOnly, onChange: commit, locale }));
1997
+ }
1998
+ const fields = getElementFields(element);
1999
+ const availableVoices = filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle);
2000
+ const renderSelector = renderVoiceSelector ?? DefaultVoiceSelector;
2001
+ return /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, `<${elementLabel(element)}>`), fields.length === 0 ? /* @__PURE__ */ React.createElement("p", null, "This element is preserved in the visual tree. Edit its attributes in Code mode.") : fields.map((field) => {
2002
+ const value = element[field.key];
2003
+ const inputValue = value === void 0 ? "" : String(value);
2004
+ const inputId = `ssml-visual-${field.key}`;
2005
+ return /* @__PURE__ */ React.createElement("label", { key: field.key, htmlFor: inputId }, locale === "ja" ? {
2006
+ name: "\u540D\u524D",
2007
+ effect: "\u52B9\u679C",
2008
+ rate: "\u901F\u5EA6",
2009
+ pitch: "\u30D4\u30C3\u30C1",
2010
+ volume: "\u97F3\u91CF",
2011
+ contour: "\u30D4\u30C3\u30C1\u66F2\u7DDA",
2012
+ range: "\u7BC4\u56F2",
2013
+ style: "\u30B9\u30BF\u30A4\u30EB",
2014
+ styleDegree: "\u30B9\u30BF\u30A4\u30EB\u5F37\u5EA6",
2015
+ role: "\u5F79\u5272",
2016
+ interpretAs: "\u89E3\u91C8",
2017
+ alphabet: "\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8",
2018
+ ph: "\u767A\u97F3",
2019
+ level: "\u5F37\u8ABF\u30EC\u30D9\u30EB",
2020
+ src: "\u97F3\u58F0 URL",
2021
+ desc: "\u8AAC\u660E",
2022
+ clipBegin: "\u958B\u59CB\u4F4D\u7F6E",
2023
+ clipEnd: "\u7D42\u4E86\u4F4D\u7F6E",
2024
+ speed: "\u901F\u5EA6",
2025
+ repeatCount: "\u7E70\u308A\u8FD4\u3057\u56DE\u6570",
2026
+ repeatDuration: "\u7E70\u308A\u8FD4\u3057\u6642\u9593",
2027
+ soundLevel: "\u97F3\u91CF\u30EC\u30D9\u30EB",
2028
+ mark: "\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF\u540D",
2029
+ alias: "\u5225\u540D",
2030
+ lang: "\u8A00\u8A9E",
2031
+ uri: "\u8F9E\u66F8 URI",
2032
+ typeValue: "\u7121\u97F3\u306E\u7A2E\u985E",
2033
+ value: "\u5024",
2034
+ id: "\u57CB\u3081\u8FBC\u307F ID",
2035
+ speakerProfileId: "\u8A71\u8005\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB ID",
2036
+ url: "\u97F3\u58F0\u5909\u63DB URL",
2037
+ profile: "\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB"
2038
+ }[field.key] ?? field.label : field.label, field.key === "name" && elementLabel(element) === "voice" && voiceCatalog ? renderSelector({
2039
+ value: inputValue,
2040
+ voices: availableVoices,
2041
+ readOnly,
2042
+ locale,
2043
+ onChange: (value2) => commit(updateOptionalElementProperty(document2, path, field.key, value2))
2044
+ }) : field.multiline ? /* @__PURE__ */ React.createElement(
2045
+ "textarea",
2046
+ {
2047
+ id: inputId,
2048
+ value: inputValue,
2049
+ readOnly,
2050
+ onChange: (event) => commit(updateOptionalElementProperty(document2, path, field.key, event.target.value))
2051
+ }
2052
+ ) : /* @__PURE__ */ React.createElement(
2053
+ "input",
2054
+ {
2055
+ id: inputId,
2056
+ value: inputValue,
2057
+ readOnly,
2058
+ onChange: (event) => commit(updateOptionalElementProperty(document2, path, field.key, event.target.value))
2059
+ }
2060
+ ));
2061
+ }));
2062
+ }
2063
+ function getElementAncestors(nodes, path, ancestors = []) {
2064
+ const [index, ...rest] = path;
2065
+ const node = nodes[index];
2066
+ if (!node || !isElement(node)) return ancestors;
2067
+ if (rest.length === 0) return ancestors;
2068
+ return getElementAncestors(node.children ?? [], rest, [...ancestors, node]);
2069
+ }
2070
+ function buildVisualPreview(document2, leaf, selection) {
2071
+ const start = Math.max(0, Math.min(selection.start, leaf.value.length));
2072
+ const end = Math.max(start, Math.min(selection.end, leaf.value.length));
2073
+ const value = start === end ? leaf.value : leaf.value.slice(start, end);
2074
+ const ancestors = getElementAncestors(document2.children ?? [], leaf.path);
2075
+ const children = ancestors.reduceRight(
2076
+ (current, ancestor) => [{ ...ancestor, children: current }],
2077
+ [value]
2078
+ );
2079
+ return buildSsml({ ...document2, children });
2080
+ }
1874
2081
  function addDialogTurn(document2, path) {
1875
2082
  return updateElementAtPath(document2, path, (element) => ({
1876
2083
  ...element,
@@ -1925,13 +2132,21 @@ function VisualSsmlEditor({
1925
2132
  document: document2,
1926
2133
  readOnly = false,
1927
2134
  onChange,
1928
- onPreviewSelection
2135
+ onPreviewSelection,
2136
+ locale = "en",
2137
+ customInspectors,
2138
+ renderVoiceSelector,
2139
+ voiceCatalog,
2140
+ voiceLocale,
2141
+ voiceRegion,
2142
+ voiceStyle
1929
2143
  }) {
1930
2144
  const [selectedPath, setSelectedPath] = useState2(null);
1931
2145
  const [selection, setSelection] = useState2({ start: 0, end: 0 });
1932
2146
  const textLeaves = useMemo(() => collectTextLeaves(document2.children ?? []), [document2]);
1933
2147
  const selectedLeaf = textLeaves.find((leaf) => leaf.path.join(".") === selectedPath?.join(".")) ?? textLeaves[0];
1934
2148
  const selectedElement = selectedPath ? getNodeAtPath(document2.children ?? [], selectedPath) : void 0;
2149
+ const selectedCustomInspector = selectedElement && isElement(selectedElement) ? customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type] : void 0;
1935
2150
  const diagnostics = useMemo(() => validateAzureSsml(buildSsml(document2)), [document2]);
1936
2151
  const commit = (nextDocument) => onChange?.(nextDocument);
1937
2152
  const applyWrapper = (tag, attributes) => {
@@ -1949,29 +2164,43 @@ function VisualSsmlEditor({
1949
2164
  selectedPath,
1950
2165
  onSelect: setSelectedPath
1951
2166
  }
1952
- )))), /* @__PURE__ */ React.createElement("div", { className: "ssml-editor-visual-form" }, selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:dialog" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, "Dialog"), /* @__PURE__ */ React.createElement("p", null, "Add and edit speaker turns in this dialog."), /* @__PURE__ */ React.createElement(
2167
+ )))), /* @__PURE__ */ React.createElement("div", { className: "ssml-editor-visual-form" }, selectedCustomInspector && selectedElement && isElement(selectedElement) ? selectedCustomInspector({
2168
+ document: document2,
2169
+ element: selectedElement,
2170
+ path: selectedPath ?? [],
2171
+ readOnly,
2172
+ onChange: commit,
2173
+ locale
2174
+ }) : selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:dialog" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, localizedElementLabel(selectedElement, locale)), /* @__PURE__ */ React.createElement("p", null, SSML_ELEMENT_COPY[locale][elementLabel(selectedElement)]?.description), /* @__PURE__ */ React.createElement(
1953
2175
  "button",
1954
2176
  {
1955
2177
  type: "button",
1956
2178
  disabled: readOnly,
1957
2179
  onClick: () => commit(addDialogTurn(document2, selectedPath ?? []))
1958
2180
  },
1959
- "Add turn"
1960
- )) : selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:turn" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, "Dialog turn"), /* @__PURE__ */ React.createElement("label", null, "Voice", /* @__PURE__ */ React.createElement(
2181
+ locale === "ja" ? "\u30BF\u30FC\u30F3\u3092\u8FFD\u52A0" : "Add turn"
2182
+ )) : selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:turn" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, localizedElementLabel(selectedElement, locale)), /* @__PURE__ */ React.createElement("label", { htmlFor: "ssml-visual-turn-voice" }, locale === "ja" ? "\u97F3\u58F0" : "Voice", voiceCatalog ? (renderVoiceSelector ?? DefaultVoiceSelector)({
2183
+ value: selectedElement.voice ?? "",
2184
+ voices: filteredVoices(voiceCatalog, voiceLocale, voiceRegion, voiceStyle),
2185
+ readOnly,
2186
+ locale,
2187
+ onChange: (value) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "voice", value))
2188
+ }) : /* @__PURE__ */ React.createElement(
1961
2189
  "input",
1962
2190
  {
2191
+ id: "ssml-visual-turn-voice",
1963
2192
  value: selectedElement.voice ?? "",
1964
2193
  readOnly,
1965
2194
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "voice", event.target.value))
1966
2195
  }
1967
- )), /* @__PURE__ */ React.createElement("label", null, "Speaker", /* @__PURE__ */ React.createElement(
2196
+ )), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u8A71\u8005" : "Speaker", /* @__PURE__ */ React.createElement(
1968
2197
  "input",
1969
2198
  {
1970
2199
  value: selectedElement.speaker ?? "",
1971
2200
  readOnly,
1972
2201
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "speaker", event.target.value))
1973
2202
  }
1974
- )), /* @__PURE__ */ React.createElement("label", null, "Turn text", /* @__PURE__ */ React.createElement(
2203
+ )), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u767A\u8A71\u30C6\u30AD\u30B9\u30C8" : "Turn text", /* @__PURE__ */ React.createElement(
1975
2204
  "textarea",
1976
2205
  {
1977
2206
  value: selectedElement.children?.filter((child) => typeof child === "string").join("") ?? "",
@@ -1984,35 +2213,51 @@ function VisualSsmlEditor({
1984
2213
  )
1985
2214
  )
1986
2215
  }
1987
- ))) : selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:backgroundaudio" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, "Background audio"), /* @__PURE__ */ React.createElement("label", null, "Source URL", /* @__PURE__ */ React.createElement(
2216
+ ))) : selectedElement && isElement(selectedElement) && selectedElement.type === "mstts:backgroundaudio" ? /* @__PURE__ */ React.createElement("fieldset", null, /* @__PURE__ */ React.createElement("legend", null, localizedElementLabel(selectedElement, locale)), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u97F3\u58F0 URL" : "Source URL", /* @__PURE__ */ React.createElement(
1988
2217
  "input",
1989
2218
  {
1990
2219
  value: selectedElement.src ?? "",
1991
2220
  readOnly,
1992
2221
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "src", event.target.value))
1993
2222
  }
1994
- )), /* @__PURE__ */ React.createElement("label", null, "Volume", /* @__PURE__ */ React.createElement(
2223
+ )), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u97F3\u91CF" : "Volume", /* @__PURE__ */ React.createElement(
1995
2224
  "input",
1996
2225
  {
1997
2226
  value: selectedElement.volume === void 0 ? "" : String(selectedElement.volume),
1998
2227
  readOnly,
1999
2228
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "volume", event.target.value))
2000
2229
  }
2001
- )), /* @__PURE__ */ React.createElement("label", null, "Fade in", /* @__PURE__ */ React.createElement(
2230
+ )), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u30D5\u30A7\u30FC\u30C9\u30A4\u30F3" : "Fade in", /* @__PURE__ */ React.createElement(
2002
2231
  "input",
2003
2232
  {
2004
2233
  value: selectedElement.fadeIn === void 0 ? "" : String(selectedElement.fadeIn),
2005
2234
  readOnly,
2006
2235
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "fadeIn", event.target.value))
2007
2236
  }
2008
- )), /* @__PURE__ */ React.createElement("label", null, "Fade out", /* @__PURE__ */ React.createElement(
2237
+ )), /* @__PURE__ */ React.createElement("label", null, locale === "ja" ? "\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8" : "Fade out", /* @__PURE__ */ React.createElement(
2009
2238
  "input",
2010
2239
  {
2011
2240
  value: selectedElement.fadeOut === void 0 ? "" : String(selectedElement.fadeOut),
2012
2241
  readOnly,
2013
2242
  onChange: (event) => commit(updateOptionalElementProperty(document2, selectedPath ?? [], "fadeOut", event.target.value))
2014
2243
  }
2015
- ))) : selectedLeaf ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("label", null, "Text", /* @__PURE__ */ React.createElement(
2244
+ ))) : selectedElement && isElement(selectedElement) ? /* @__PURE__ */ React.createElement(
2245
+ VisualElementInspector,
2246
+ {
2247
+ document: document2,
2248
+ element: selectedElement,
2249
+ path: selectedPath ?? [],
2250
+ readOnly,
2251
+ commit,
2252
+ locale,
2253
+ customInspector: customInspectors?.[elementLabel(selectedElement)] ?? customInspectors?.[selectedElement.type],
2254
+ renderVoiceSelector,
2255
+ voiceCatalog,
2256
+ voiceLocale,
2257
+ voiceRegion,
2258
+ voiceStyle
2259
+ }
2260
+ ) : selectedLeaf ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("label", null, "Text", /* @__PURE__ */ React.createElement(
2016
2261
  "textarea",
2017
2262
  {
2018
2263
  value: selectedLeaf.value,
@@ -2040,7 +2285,7 @@ function VisualSsmlEditor({
2040
2285
  "button",
2041
2286
  {
2042
2287
  type: "button",
2043
- onClick: () => onPreviewSelection(buildSsml({ ...document2, children: [selectedLeaf.value] }))
2288
+ onClick: () => onPreviewSelection(buildVisualPreview(document2, selectedLeaf, selection))
2044
2289
  },
2045
2290
  "Preview selection"
2046
2291
  ))) : /* @__PURE__ */ React.createElement("p", null, "Select an element or text node to edit it."))));
@@ -2628,6 +2873,12 @@ var SsmlEditor = forwardRef(function SsmlEditor2({
2628
2873
  insertionGroups,
2629
2874
  customInsertions,
2630
2875
  additionalInsertions,
2876
+ customInspectors,
2877
+ renderVoiceSelector,
2878
+ voiceCatalog,
2879
+ voiceLocale,
2880
+ voiceRegion,
2881
+ voiceStyle,
2631
2882
  emotionStyles,
2632
2883
  className,
2633
2884
  style,
@@ -3019,7 +3270,14 @@ var SsmlEditor = forwardRef(function SsmlEditor2({
3019
3270
  document: draftDocument,
3020
3271
  readOnly: isReadOnly,
3021
3272
  onChange: commit,
3022
- onPreviewSelection
3273
+ onPreviewSelection,
3274
+ locale: localeProp ?? languageProp,
3275
+ customInspectors,
3276
+ renderVoiceSelector,
3277
+ voiceCatalog,
3278
+ voiceLocale,
3279
+ voiceRegion,
3280
+ voiceStyle
3023
3281
  }
3024
3282
  )) : /* @__PURE__ */ React.createElement("div", { style: { ...editorStyles.editor, minHeight: editorMinHeight } }, /* @__PURE__ */ React.createElement(
3025
3283
  Editor,
@@ -3079,6 +3337,7 @@ var SsmlEditor = forwardRef(function SsmlEditor2({
3079
3337
  export {
3080
3338
  EDITOR_COPY,
3081
3339
  INLINE_BADGE_COPY,
3340
+ SSML_ELEMENT_COPY,
3082
3341
  SSML_HOVER_COPY,
3083
3342
  SSML_INSERTIONS,
3084
3343
  SsmlEditor,