@vonage/vivid 4.28.0 → 4.30.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.
Files changed (92) hide show
  1. package/custom-elements.json +707 -86
  2. package/lib/accordion-item/accordion-item.d.ts +3 -1
  3. package/lib/audio-player/audio-player.d.ts +4 -3
  4. package/lib/data-grid/data-grid.d.ts +2 -0
  5. package/lib/data-grid/locale.d.ts +1 -0
  6. package/lib/date-picker/date-picker.d.ts +4 -2
  7. package/lib/date-time-picker/date-time-picker.d.ts +6 -3
  8. package/lib/divider/definition.d.ts +1 -0
  9. package/lib/divider/divider.d.ts +5 -1
  10. package/lib/option/option.d.ts +4 -7
  11. package/lib/rich-text-editor/facades/prose-mirror-vivid.schema.d.ts +2 -1
  12. package/lib/rich-text-editor/facades/vivid-prose-mirror.facade.d.ts +2 -2
  13. package/lib/rich-text-editor/image-placeholder/definition.d.ts +2 -0
  14. package/lib/rich-text-editor/image-placeholder/image-placeholder.d.ts +7 -0
  15. package/lib/rich-text-editor/image-placeholder/image-placeholder.template.d.ts +4 -0
  16. package/lib/rich-text-editor/menubar/consts.d.ts +2 -2
  17. package/lib/rich-text-editor/menubar/definition.d.ts +2 -2
  18. package/lib/rich-text-editor/menubar/menubar.d.ts +2 -2
  19. package/lib/rich-text-editor/menubar/menubar.template.d.ts +2 -2
  20. package/lib/rich-text-editor/rich-text-editor.d.ts +1 -0
  21. package/lib/selectable-box/selectable-box.d.ts +2 -0
  22. package/lib/split-button/split-button.d.ts +1 -1
  23. package/lib/tag/tag.d.ts +1 -1
  24. package/lib/time-picker/time-picker.d.ts +4 -2
  25. package/locales/de-DE.cjs +2 -1
  26. package/locales/de-DE.js +2 -1
  27. package/locales/en-GB.cjs +2 -1
  28. package/locales/en-GB.js +2 -1
  29. package/locales/en-US.cjs +2 -1
  30. package/locales/en-US.js +2 -1
  31. package/locales/ja-JP.cjs +2 -1
  32. package/locales/ja-JP.js +2 -1
  33. package/locales/zh-CN.cjs +2 -1
  34. package/locales/zh-CN.js +2 -1
  35. package/package.json +2 -1
  36. package/shared/calendar-picker.template.cjs +6 -5
  37. package/shared/calendar-picker.template.js +6 -5
  38. package/shared/definition.cjs +11 -2
  39. package/shared/definition.js +11 -2
  40. package/shared/definition16.cjs +33 -30
  41. package/shared/definition16.js +33 -30
  42. package/shared/definition17.cjs +137 -1
  43. package/shared/definition17.js +138 -2
  44. package/shared/definition23.cjs +12 -7
  45. package/shared/definition23.js +12 -7
  46. package/shared/definition28.cjs +1 -2
  47. package/shared/definition28.js +2 -2
  48. package/shared/definition36.cjs +1 -1
  49. package/shared/definition36.js +1 -1
  50. package/shared/definition44.cjs +194 -77
  51. package/shared/definition44.js +194 -77
  52. package/shared/definition45.cjs +12 -5
  53. package/shared/definition45.js +12 -5
  54. package/shared/definition47.cjs +11 -5
  55. package/shared/definition47.js +11 -5
  56. package/shared/definition5.cjs +86 -30
  57. package/shared/definition5.js +86 -30
  58. package/shared/definition50.cjs +1 -1
  59. package/shared/definition50.js +1 -1
  60. package/shared/definition56.cjs +1 -1
  61. package/shared/definition56.js +1 -1
  62. package/shared/definition58.cjs +10 -29
  63. package/shared/definition58.js +12 -31
  64. package/shared/definition61.cjs +11 -0
  65. package/shared/definition61.js +11 -0
  66. package/shared/definition64.cjs +1 -1
  67. package/shared/definition64.js +1 -1
  68. package/shared/definition67.cjs +27 -16
  69. package/shared/definition67.js +27 -16
  70. package/shared/divider.cjs +7 -2
  71. package/shared/divider.js +7 -2
  72. package/shared/option.cjs +36 -38
  73. package/shared/option.js +37 -39
  74. package/shared/picker-field/mixins/single-date-picker.d.ts +4 -2
  75. package/shared/picker-field/mixins/single-value-picker.d.ts +2 -1
  76. package/shared/picker-field/mixins/time-selection-picker.d.ts +4 -2
  77. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +4 -2
  78. package/shared/single-value-picker.cjs +40 -6
  79. package/shared/single-value-picker.js +40 -6
  80. package/shared/text-field.cjs +1 -1
  81. package/shared/text-field.js +1 -1
  82. package/shared/time-selection-picker.template.cjs +2 -2
  83. package/shared/time-selection-picker.template.js +2 -2
  84. package/shared/vivid-element.cjs +2 -1
  85. package/shared/vivid-element.js +2 -2
  86. package/styles/core/all.css +1 -1
  87. package/styles/core/theme.css +1 -1
  88. package/styles/core/typography.css +1 -1
  89. package/styles/tokens/theme-dark.css +4 -4
  90. package/styles/tokens/theme-light.css +4 -4
  91. package/styles/tokens/vivid-2-compat.css +1 -1
  92. package/vivid.api.json +294 -129
@@ -11,11 +11,13 @@ import { L as ListboxOption } from './option.js';
11
11
  import { r as repeat } from './repeat.js';
12
12
  import { c as classNames } from './class-names.js';
13
13
  import { L as Localized } from './localized.js';
14
+ import { I as Icon, i as iconDefinition } from './definition28.js';
15
+ import { w as when } from './when.js';
14
16
 
15
- const styles$1 = "@charset \"UTF-8\";.ProseMirror li{position:relative}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror [draggable][contenteditable=false]{user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:\"\";position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none}img.ProseMirror-separator{display:inline!important;border:none!important;margin:0!important}.ProseMirror-textblock-dropdown{min-width:3em}.ProseMirror-menu{margin:0 -4px;line-height:1}.ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProseMirror-menuitem{margin-right:3px;display:inline-block}.ProseMirror-menuseparator{border-right:1px solid #ddd;margin-right:3px}.ProseMirror-menu-dropdown,.ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}.ProseMirror-menu-dropdown{vertical-align:1px;cursor:pointer;position:relative;padding-right:15px}.ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 4px;display:inline-block;position:relative}.ProseMirror-menu-dropdown:after{content:\"\";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}.ProseMirror-menu-dropdown-menu,.ProseMirror-menu-submenu{position:absolute;background:#fff;color:#666;border:1px solid #aaa;padding:2px}.ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em}.ProseMirror-menu-dropdown-item{cursor:pointer;padding:2px 8px 2px 4px}.ProseMirror-menu-dropdown-item:hover{background:#f2f2f2}.ProseMirror-menu-submenu-wrap{position:relative;margin-right:-4px}.ProseMirror-menu-submenu-label:after{content:\"\";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}.ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:-3px}.ProseMirror-menu-active{background:#eee;border-radius:4px}.ProseMirror-menu-disabled{opacity:.3}.ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,.ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}.ProseMirror-menubar{border-top-left-radius:inherit;border-top-right-radius:inherit;position:relative;min-height:1em;color:#666;padding:1px 6px;top:0;left:0;right:0;border-bottom:1px solid silver;background:#fff;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible}.ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:2px 8px;cursor:pointer}.ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}.ProseMirror-icon svg{fill:currentColor;height:1em}.ProseMirror-icon span{vertical-align:text-top}.ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}.ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}.ProseMirror-focused .ProseMirror-gapcursor{display:block}.ProseMirror-example-setup-style hr{padding:2px 10px;border:none;margin:1em 0}.ProseMirror-example-setup-style hr:after{content:\"\";display:block;height:1px;background-color:silver;line-height:2px}.ProseMirror ul,.ProseMirror ol{padding-left:30px}.ProseMirror blockquote{padding-left:1em;border-left:3px solid #eee;margin-left:0;margin-right:0}.ProseMirror-example-setup-style img{cursor:default}.ProseMirror-prompt{background:#fff;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;z-index:11;box-shadow:-.5px 2px 5px #0003}.ProseMirror-prompt h5{margin:0;font-weight:400;font-size:100%;color:#444}.ProseMirror-prompt input[type=text],.ProseMirror-prompt textarea{background:#eee;border:none;outline:none}.ProseMirror-prompt input[type=text]{padding:0 4px}.ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:#666;border:none;background:transparent;padding:0}.ProseMirror-prompt-close:after{content:\"✕\";font-size:12px}.ProseMirror-invalid{background:#ffc;border:1px solid #cc7;border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}.ProseMirror-prompt-buttons{margin-top:5px;display:none}.placeholder:before{position:absolute;color:var(--vvd-color-neutral-600);content:attr(data-placeholder);font:var(--vvd-typography-base);pointer-events:none}.editor{box-sizing:border-box;background:var(--vvd-color-canvas);background-clip:padding-box;color:var(--vvd-color-canvas-text)}.ProseMirror{position:relative;box-sizing:border-box;padding:10px 16px;block-size:120px;font:var(--vvd-typography-base);font-feature-settings:\"liga\" 0;font-variant-ligatures:none;line-height:1.2;outline:none;overflow-y:auto;white-space:break-spaces;word-wrap:break-word}.ProseMirror pre{white-space:pre-wrap}.ProseMirror p{margin-bottom:1em}.ProseMirror p:first-child,.ProseMirror h1:first-child,.ProseMirror h2:first-child,.ProseMirror h3:first-child,.ProseMirror h4:first-child,.ProseMirror h5:first-child,.ProseMirror h6:first-child{margin-top:10px}h2{font:var(--vvd-typography-heading-4)}h3{font:var(--vvd-typography-base-extended)}p{font:var(--vvd-typography-base)}:host{display:block}#editor{--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}#editor{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}#editor ::-webkit-scrollbar{width:4px}#editor ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}#editor ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}#editor{position:relative;display:flex;flex-direction:column;block-size:100%;overflow-y:auto}[contenteditable=true]{overflow:unset;block-size:unset}#attachments-wrapper{order:1}#attachments-wrapper .divider{padding:0 12px}.hidden{display:none}.drag-overlay{position:absolute;z-index:10;display:none;align-items:center;justify-content:center;border:1px dashed var(--vvd-color-cta-400);border-radius:8px;background:var(--vvd-color-cta-100);font:var(--vvd-typography-base);inset:0;opacity:.8;pointer-events:none;transition:opacity .2s}.drag-over .drag-overlay{display:flex}";
17
+ const styles$2 = "@charset \"UTF-8\";.ProseMirror li{position:relative}.ProseMirror-hideselection *::selection{background:transparent}.ProseMirror-hideselection *::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror [draggable][contenteditable=false]{user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{content:\"\";position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none}img.ProseMirror-separator{display:inline!important;border:none!important;margin:0!important}.ProseMirror-textblock-dropdown{min-width:3em}.ProseMirror-menu{margin:0 -4px;line-height:1}.ProseMirror-tooltip .ProseMirror-menu{width:-webkit-fit-content;width:fit-content;white-space:pre}.ProseMirror-menuitem{margin-right:3px;display:inline-block}.ProseMirror-menuseparator{border-right:1px solid #ddd;margin-right:3px}.ProseMirror-menu-dropdown,.ProseMirror-menu-dropdown-menu{font-size:90%;white-space:nowrap}.ProseMirror-menu-dropdown{vertical-align:1px;cursor:pointer;position:relative;padding-right:15px}.ProseMirror-menu-dropdown-wrap{padding:1px 0 1px 4px;display:inline-block;position:relative}.ProseMirror-menu-dropdown:after{content:\"\";border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 2px)}.ProseMirror-menu-dropdown-menu,.ProseMirror-menu-submenu{position:absolute;background:#fff;color:#666;border:1px solid #aaa;padding:2px}.ProseMirror-menu-dropdown-menu{z-index:15;min-width:6em}.ProseMirror-menu-dropdown-item{cursor:pointer;padding:2px 8px 2px 4px}.ProseMirror-menu-dropdown-item:hover{background:#f2f2f2}.ProseMirror-menu-submenu-wrap{position:relative;margin-right:-4px}.ProseMirror-menu-submenu-label:after{content:\"\";border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid currentColor;opacity:.6;position:absolute;right:4px;top:calc(50% - 4px)}.ProseMirror-menu-submenu{display:none;min-width:4em;left:100%;top:-3px}.ProseMirror-menu-active{background:#eee;border-radius:4px}.ProseMirror-menu-disabled{opacity:.3}.ProseMirror-menu-submenu-wrap:hover .ProseMirror-menu-submenu,.ProseMirror-menu-submenu-wrap-active .ProseMirror-menu-submenu{display:block}.ProseMirror-menubar{border-top-left-radius:inherit;border-top-right-radius:inherit;position:relative;min-height:1em;color:#666;padding:1px 6px;top:0;left:0;right:0;border-bottom:1px solid silver;background:#fff;z-index:10;-moz-box-sizing:border-box;box-sizing:border-box;overflow:visible}.ProseMirror-icon{display:inline-block;line-height:.8;vertical-align:-2px;padding:2px 8px;cursor:pointer}.ProseMirror-menu-disabled.ProseMirror-icon{cursor:default}.ProseMirror-icon svg{fill:currentColor;height:1em}.ProseMirror-icon span{vertical-align:text-top}.ProseMirror-gapcursor{display:none;pointer-events:none;position:absolute}.ProseMirror-gapcursor:after{content:\"\";display:block;position:absolute;top:-2px;width:20px;border-top:1px solid black;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}.ProseMirror-focused .ProseMirror-gapcursor{display:block}.ProseMirror-example-setup-style hr{padding:2px 10px;border:none;margin:1em 0}.ProseMirror-example-setup-style hr:after{content:\"\";display:block;height:1px;background-color:silver;line-height:2px}.ProseMirror ul,.ProseMirror ol{padding-left:30px}.ProseMirror blockquote{padding-left:1em;border-left:3px solid #eee;margin-left:0;margin-right:0}.ProseMirror-example-setup-style img{cursor:default}.ProseMirror-prompt{background:#fff;padding:5px 10px 5px 15px;border:1px solid silver;position:fixed;border-radius:3px;z-index:11;box-shadow:-.5px 2px 5px #0003}.ProseMirror-prompt h5{margin:0;font-weight:400;font-size:100%;color:#444}.ProseMirror-prompt input[type=text],.ProseMirror-prompt textarea{background:#eee;border:none;outline:none}.ProseMirror-prompt input[type=text]{padding:0 4px}.ProseMirror-prompt-close{position:absolute;left:2px;top:1px;color:#666;border:none;background:transparent;padding:0}.ProseMirror-prompt-close:after{content:\"✕\";font-size:12px}.ProseMirror-invalid{background:#ffc;border:1px solid #cc7;border-radius:4px;padding:5px 10px;position:absolute;min-width:10em}.ProseMirror-prompt-buttons{margin-top:5px;display:none}.placeholder:before{position:absolute;color:var(--vvd-color-neutral-600);content:attr(data-placeholder);font:var(--vvd-typography-base);pointer-events:none}.editor{box-sizing:border-box;background:var(--vvd-color-canvas);background-clip:padding-box;color:var(--vvd-color-canvas-text)}.ProseMirror{position:relative;box-sizing:border-box;padding:10px 16px;block-size:120px;font:var(--vvd-typography-base);font-feature-settings:\"liga\" 0;font-variant-ligatures:none;line-height:1.2;outline:none;overflow-y:auto;white-space:break-spaces;word-wrap:break-word}.ProseMirror pre{white-space:pre-wrap}.ProseMirror p{margin-bottom:1em}.ProseMirror p:first-child,.ProseMirror h1:first-child,.ProseMirror h2:first-child,.ProseMirror h3:first-child,.ProseMirror h4:first-child,.ProseMirror h5:first-child,.ProseMirror h6:first-child{margin-top:10px}h2{font:var(--vvd-typography-heading-4)}h3{font:var(--vvd-typography-base-extended)}p{font:var(--vvd-typography-base)}:host{display:block}#editor{--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}#editor{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}#editor ::-webkit-scrollbar{width:4px}#editor ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}#editor ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}#editor{position:relative;display:flex;flex-direction:column;block-size:100%;overflow-y:auto}[contenteditable=true]{overflow:unset;block-size:unset}#attachments-wrapper{order:1}#attachments-wrapper .divider{padding:0 12px}.hidden{display:none}.drag-overlay{position:absolute;z-index:10;display:none;align-items:center;justify-content:center;border:1px dashed var(--vvd-color-cta-400);border-radius:8px;background:var(--vvd-color-cta-100);font:var(--vvd-typography-base);inset:0;opacity:.8;pointer-events:none;transition:opacity .2s}.drag-over .drag-overlay{display:flex}";
16
18
 
17
- function notifyMenuBarChange(menuBar, eventName, payload) {
18
- menuBar.$emit(eventName, payload, { bubbles: false, composed: false });
19
+ function notifyMenubarChange(menubar, eventName, payload) {
20
+ menubar.$emit(eventName, payload, { bubbles: false, composed: false });
19
21
  return true;
20
22
  }
21
23
  const TEXT_DECORATION_ITEMS = [
@@ -106,8 +108,8 @@ const textSizeEventHandler = (event) => {
106
108
  };
107
109
  const MENU_BAR_ITEMS = {
108
110
  textBlock: {
109
- registerStateProperty: function(menuBar) {
110
- menuBar.addEventListener("text-styles-changed", textBlockEventHandler);
111
+ registerStateProperty: function(menubar) {
112
+ menubar.addEventListener("text-styles-changed", textBlockEventHandler);
111
113
  },
112
114
  render: function(context) {
113
115
  const selectTag = context.tagFor(Select);
@@ -125,7 +127,7 @@ const MENU_BAR_ITEMS = {
125
127
  aria-label="Text Block"
126
128
  placement="bottom-end"
127
129
  value="${(_, { parent }) => parent.textBlockType}"
128
- @change="${(_, { parent, event }) => notifyMenuBarChange(
130
+ @change="${(_, { parent, event }) => notifyMenubarChange(
129
131
  parent,
130
132
  "text-block-selected",
131
133
  event.target.value
@@ -158,8 +160,8 @@ const MENU_BAR_ITEMS = {
158
160
  }
159
161
  },
160
162
  textDecoration: {
161
- registerStateProperty: function(menuBar) {
162
- menuBar.addEventListener(
163
+ registerStateProperty: function(menubar) {
164
+ menubar.addEventListener(
163
165
  "text-styles-changed",
164
166
  textDecorationEventHandler
165
167
  );
@@ -181,7 +183,7 @@ const MENU_BAR_ITEMS = {
181
183
  appearance="ghost-light"
182
184
  shape="rounded"
183
185
  icon="${(x) => x.icon}"
184
- @click="${(x, c) => notifyMenuBarChange(
186
+ @click="${(x, c) => notifyMenubarChange(
185
187
  c.parentContext.parent,
186
188
  "text-decoration-selected",
187
189
  x.value
@@ -195,8 +197,8 @@ const MENU_BAR_ITEMS = {
195
197
  }
196
198
  },
197
199
  textSize: {
198
- registerStateProperty: function(menuBar) {
199
- menuBar.addEventListener("text-styles-changed", textSizeEventHandler);
200
+ registerStateProperty: function(menubar) {
201
+ menubar.addEventListener("text-styles-changed", textSizeEventHandler);
200
202
  },
201
203
  render: function(context) {
202
204
  const menuTag = context.tagFor(Menu);
@@ -232,7 +234,7 @@ const MENU_BAR_ITEMS = {
232
234
  internal-part
233
235
  class="menubar-selector-menuitem"
234
236
  connotation="cta"
235
- @click="${(x, c) => notifyMenuBarChange(
237
+ @click="${(x, c) => notifyMenubarChange(
236
238
  c.parentContext.parent,
237
239
  "text-size-selected",
238
240
  x.value
@@ -254,16 +256,16 @@ const MENU_BAR_ITEMS = {
254
256
  }
255
257
  };
256
258
 
257
- var __defProp$1 = Object.defineProperty;
258
- var __decorateClass$1 = (decorators, target, key, kind) => {
259
+ var __defProp$2 = Object.defineProperty;
260
+ var __decorateClass$2 = (decorators, target, key, kind) => {
259
261
  var result = void 0 ;
260
262
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
261
263
  if (decorator = decorators[i])
262
264
  result = (decorator(target, key, result) ) || result;
263
- if (result) __defProp$1(target, key, result);
265
+ if (result) __defProp$2(target, key, result);
264
266
  return result;
265
267
  };
266
- class MenuBar extends Localized(VividElement) {
268
+ class Menubar extends Localized(VividElement) {
267
269
  get #textEditorElement() {
268
270
  return this.parentElement;
269
271
  }
@@ -297,13 +299,13 @@ class MenuBar extends Localized(VividElement) {
297
299
  );
298
300
  }
299
301
  }
300
- __decorateClass$1([
302
+ __decorateClass$2([
301
303
  attr({ attribute: "menu-items" })
302
- ], MenuBar.prototype, "menuItems");
304
+ ], Menubar.prototype, "menuItems");
303
305
 
304
- const getClasses$1 = (menuBar) => classNames("control", [
306
+ const getClasses$2 = (menubar) => classNames("control", [
305
307
  "hide-menubar",
306
- getValidMenuItems(menuBar).length === 0
308
+ getValidMenuItems(menubar).length === 0
307
309
  ]);
308
310
  const validItems = ["textBlock", "textDecoration", "textSize", "divider"];
309
311
  function getPropertyStateRgistrationFunction(item) {
@@ -324,18 +326,18 @@ function renderMenuItems(context) {
324
326
  }}`
325
327
  )}`;
326
328
  }
327
- const MenuBarTemplate = (context) => {
328
- return html`<template class="${getClasses$1}">
329
+ const MenubarTemplate = (context) => {
330
+ return html`<template class="${getClasses$2}">
329
331
  ${renderMenuItems(context)}
330
332
  </template>`;
331
333
  };
332
334
 
333
- const styles = ":host{display:flex;align-items:center;background-color:var(--vvd-color-neutral-50);gap:4px}:host .hide-menubar{display:none}.title{--_text-primary-custom-size: var(--vvd-typography-heading-4)}.subtitle{--_text-primary-custom-size: var(--vvd-typography-base-extended)}.body{--_text-primary-custom-size: var(--vvd-typography-base)}.divider{height:28px}#text-block{width:104px}";
335
+ const styles$1 = ":host{display:flex;align-items:center;background-color:var(--vvd-color-neutral-50);gap:4px}:host .hide-menubar{display:none}.title{--_text-primary-custom-size: var(--vvd-typography-heading-4)}.subtitle{--_text-primary-custom-size: var(--vvd-typography-base-extended)}.body{--_text-primary-custom-size: var(--vvd-typography-base)}.divider{height:28px}#text-block{width:104px}";
334
336
 
335
- const menuBarDefinition = defineVividComponent(
337
+ const menubarDefinition = defineVividComponent(
336
338
  "menubar",
337
- MenuBar,
338
- MenuBarTemplate,
339
+ Menubar,
340
+ MenubarTemplate,
339
341
  [
340
342
  buttonDefinition,
341
343
  selectDefinition,
@@ -346,7 +348,7 @@ const menuBarDefinition = defineVividComponent(
346
348
  menuItemDefinition
347
349
  ],
348
350
  {
349
- styles,
351
+ styles: styles$1,
350
352
  shadowOptions: {
351
353
  delegatesFocus: true
352
354
  }
@@ -761,7 +763,7 @@ class Fragment {
761
763
  position in this fragment. The result object will be reused
762
764
  (overwritten) the next time the function is called. @internal
763
765
  */
764
- findIndex(pos, round = -1) {
766
+ findIndex(pos) {
765
767
  if (pos == 0)
766
768
  return retIndex(0, pos);
767
769
  if (pos == this.size)
@@ -771,7 +773,7 @@ class Fragment {
771
773
  for (let i = 0, curPos = 0;; i++) {
772
774
  let cur = this.child(i), end = curPos + cur.nodeSize;
773
775
  if (end >= pos) {
774
- if (end == pos || round > 0)
776
+ if (end == pos)
775
777
  return retIndex(i + 1, end);
776
778
  return retIndex(i, curPos);
777
779
  }
@@ -1732,7 +1734,7 @@ class Node {
1732
1734
  `blockSeparator` is given, it will be inserted to separate text
1733
1735
  from different block nodes. If `leafText` is given, it'll be
1734
1736
  inserted for every non-text leaf node encountered, otherwise
1735
- [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used.
1737
+ [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec.leafText) will be used.
1736
1738
  */
1737
1739
  textBetween(from, to, blockSeparator, leafText) {
1738
1740
  return this.content.textBetween(from, to, blockSeparator, leafText);
@@ -2942,8 +2944,8 @@ class Schema {
2942
2944
  let type = this.marks[prop], excl = type.spec.excludes;
2943
2945
  type.excluded = excl == null ? [type] : excl == "" ? [] : gatherMarks(this, excl.split(" "));
2944
2946
  }
2945
- this.nodeFromJSON = this.nodeFromJSON.bind(this);
2946
- this.markFromJSON = this.markFromJSON.bind(this);
2947
+ this.nodeFromJSON = json => Node.fromJSON(this, json);
2948
+ this.markFromJSON = json => Mark.fromJSON(this, json);
2947
2949
  this.topNodeType = this.nodes[this.spec.topNode || "doc"];
2948
2950
  this.cached.wrappings = Object.create(null);
2949
2951
  }
@@ -2979,20 +2981,6 @@ class Schema {
2979
2981
  return type.create(attrs);
2980
2982
  }
2981
2983
  /**
2982
- Deserialize a node from its JSON representation. This method is
2983
- bound.
2984
- */
2985
- nodeFromJSON(json) {
2986
- return Node.fromJSON(this, json);
2987
- }
2988
- /**
2989
- Deserialize a mark from its JSON representation. This method is
2990
- bound.
2991
- */
2992
- markFromJSON(json) {
2993
- return Mark.fromJSON(this, json);
2994
- }
2995
- /**
2996
2984
  @internal
2997
2985
  */
2998
2986
  nodeType(name) {
@@ -3174,7 +3162,7 @@ class DOMParser {
3174
3162
  /**
3175
3163
  Construct a DOM parser using the parsing rules listed in a
3176
3164
  schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by
3177
- [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority).
3165
+ [priority](https://prosemirror.net/docs/ref/#model.GenericParseRule.priority).
3178
3166
  */
3179
3167
  static fromSchema(schema) {
3180
3168
  return schema.cached.domParser ||
@@ -3925,6 +3913,8 @@ function renderSpec(doc, structure, xmlNS, blockArraysIn) {
3925
3913
  let space = name.indexOf(" ");
3926
3914
  if (space > 0)
3927
3915
  dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);
3916
+ else if (name == "style" && dom.style)
3917
+ dom.style.cssText = attrs[name];
3928
3918
  else
3929
3919
  dom.setAttribute(name, attrs[name]);
3930
3920
  }
@@ -7444,7 +7434,7 @@ function posFromCaret(view, node, offset, coords) {
7444
7434
  if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&
7445
7435
  // Ignore elements with zero-size bounding rectangles
7446
7436
  ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {
7447
- if (desc.node.isBlock && desc.parent) {
7437
+ if (desc.node.isBlock && desc.parent && !/^T(R|BODY|HEAD|FOOT)$/.test(desc.dom.nodeName)) {
7448
7438
  // Only apply the horizontal test to the innermost block. Vertical for any parent.
7449
7439
  if (!sawBlock && rect.left > coords.left || rect.top > coords.top)
7450
7440
  outsideBlock = desc.posBefore;
@@ -11958,7 +11948,7 @@ function ruleFromNode(dom) {
11958
11948
  }
11959
11949
  return null;
11960
11950
  }
11961
- const isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;
11951
+ const isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;
11962
11952
  function readDOMChange(view, from, to, typeOver, addedNodes) {
11963
11953
  let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);
11964
11954
  view.input.compositionPendingChanges = 0;
@@ -13881,13 +13871,51 @@ const customMarks = {
13881
13871
  }
13882
13872
  }
13883
13873
  };
13884
- const extendedSchema = new Schema({
13885
- nodes: schema.spec.nodes,
13874
+ const dynamicSchema = (prefix = "vwc") => new Schema({
13875
+ nodes: {
13876
+ ...schema.spec.nodes.toObject(),
13877
+ imageError: {
13878
+ inline: true,
13879
+ group: "inline",
13880
+ atom: true,
13881
+ attrs: {
13882
+ alt: { default: "" },
13883
+ icon: { default: "" },
13884
+ errorMessage: { default: "Failed to attach" },
13885
+ fileName: { default: "" }
13886
+ },
13887
+ toDOM(node) {
13888
+ return [
13889
+ `${prefix}-text-editor-image-placeholder`,
13890
+ {
13891
+ alt: node.attrs.alt,
13892
+ icon: node.attrs.icon,
13893
+ "error-message": node.attrs.errorMessage,
13894
+ "file-name": node.attrs.fileName
13895
+ }
13896
+ ];
13897
+ },
13898
+ parseDOM: [
13899
+ {
13900
+ tag: `${prefix}-text-editor-image-placeholder`,
13901
+ getAttrs(dom) {
13902
+ return {
13903
+ alt: dom.getAttribute("alt"),
13904
+ icon: dom.getAttribute("icon"),
13905
+ errorMessage: dom.getAttribute("error-message"),
13906
+ fileName: dom.getAttribute("file-name")
13907
+ };
13908
+ }
13909
+ }
13910
+ ]
13911
+ }
13912
+ },
13886
13913
  marks: {
13887
13914
  ...schema.spec.marks.toObject(),
13888
13915
  ...customMarks
13889
13916
  }
13890
13917
  });
13918
+ dynamicSchema();
13891
13919
 
13892
13920
  const NEGATIVE_SELECTION = {
13893
13921
  start: -1,
@@ -13986,6 +14014,16 @@ function convertSelectionToVividFormat({
13986
14014
  end: to
13987
14015
  };
13988
14016
  }
14017
+ function getImageErrorNode(schema, file, errorMessage = "Image loading failed") {
14018
+ const nodeType = schema.nodes.imageError;
14019
+ const imageErrorNode = nodeType.create({
14020
+ alt: `inline image from file ${file.name}`,
14021
+ fileName: file.name,
14022
+ icon: file.type.split("/")[1],
14023
+ errorMessage
14024
+ });
14025
+ return imageErrorNode;
14026
+ }
13989
14027
  const isEmptyParagraph = (node) => {
13990
14028
  return node.type.name === "paragraph" && node.nodeSize === 2;
13991
14029
  };
@@ -14035,7 +14073,9 @@ class ProseMirrorFacade {
14035
14073
  }
14036
14074
  this.#dispatchEvent("change");
14037
14075
  };
14038
- init(element) {
14076
+ #vwcPrefix = "vwc";
14077
+ init(element, vwcPrefix = "vwc") {
14078
+ this.#vwcPrefix = vwcPrefix;
14039
14079
  if (!(element instanceof HTMLElement)) {
14040
14080
  throw new Error(
14041
14081
  "ProseMirror Facade init accepts a valid HTMLElement as its first parameter"
@@ -14048,7 +14088,7 @@ class ProseMirrorFacade {
14048
14088
  keymap(baseKeymap)
14049
14089
  ];
14050
14090
  const state = EditorState.create({
14051
- schema: extendedSchema,
14091
+ schema: dynamicSchema(this.#vwcPrefix),
14052
14092
  plugins
14053
14093
  });
14054
14094
  this.#view = new EditorView(element, { state });
@@ -14069,7 +14109,7 @@ class ProseMirrorFacade {
14069
14109
  }
14070
14110
  replaceContent(content) {
14071
14111
  this.#verifyViewInitiation();
14072
- const parser = DOMParser.fromSchema(extendedSchema);
14112
+ const parser = DOMParser.fromSchema(this.#view.state.schema);
14073
14113
  const doc = parser.parse(
14074
14114
  new window.DOMParser().parseFromString(content, "text/html").body
14075
14115
  );
@@ -14254,7 +14294,8 @@ class ProseMirrorFacade {
14254
14294
  async addInlineImage({
14255
14295
  file,
14256
14296
  position,
14257
- alt
14297
+ alt,
14298
+ error
14258
14299
  }) {
14259
14300
  this.#verifyViewInitiation();
14260
14301
  const reader = new FileReader();
@@ -14266,7 +14307,7 @@ class ProseMirrorFacade {
14266
14307
  const { state, dispatch } = this.#view;
14267
14308
  const { schema } = state;
14268
14309
  const imageAlt = alt ?? `inline image from file ${file.name}`;
14269
- const imageNode = schema.nodes.image.create({ src, alt: imageAlt });
14310
+ const imageNode = error ? getImageErrorNode(schema, file, error) : schema.nodes.image.create({ src, alt: imageAlt });
14270
14311
  let insertPos = position;
14271
14312
  if (typeof insertPos !== "number") {
14272
14313
  insertPos = state.selection.from;
@@ -14276,13 +14317,13 @@ class ProseMirrorFacade {
14276
14317
  }
14277
14318
  }
14278
14319
 
14279
- var __defProp = Object.defineProperty;
14280
- var __decorateClass = (decorators, target, key, kind) => {
14320
+ var __defProp$1 = Object.defineProperty;
14321
+ var __decorateClass$1 = (decorators, target, key, kind) => {
14281
14322
  var result = void 0 ;
14282
14323
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14283
14324
  if (decorator = decorators[i])
14284
14325
  result = (decorator(target, key, result) ) || result;
14285
- if (result) __defProp(target, key, result);
14326
+ if (result) __defProp$1(target, key, result);
14286
14327
  return result;
14287
14328
  };
14288
14329
  const RichTextEditorTextBlocks = {
@@ -14420,17 +14461,17 @@ class RichTextEditor extends Localized(VividElement) {
14420
14461
  }
14421
14462
  }
14422
14463
  }
14423
- __decorateClass([
14464
+ __decorateClass$1([
14424
14465
  attr({ converter: nullableNumberConverter, attribute: "selection-start" })
14425
14466
  ], RichTextEditor.prototype, "selectionStart");
14426
- __decorateClass([
14467
+ __decorateClass$1([
14427
14468
  attr({ converter: nullableNumberConverter, attribute: "selection-end" })
14428
14469
  ], RichTextEditor.prototype, "selectionEnd");
14429
- __decorateClass([
14470
+ __decorateClass$1([
14430
14471
  attr
14431
14472
  ], RichTextEditor.prototype, "placeholder");
14432
14473
 
14433
- const getClasses = (_) => classNames("control");
14474
+ const getClasses$1 = (_) => classNames("control");
14434
14475
  const VALID_MENU_ELEMEMENT_SUFFIX = "menubar";
14435
14476
  const menuParent = (target) => target.parentElement;
14436
14477
  function textBlockSelectedHandler(event) {
@@ -14458,29 +14499,29 @@ function handleAttachmentsSlotChange(_, { event }) {
14458
14499
  slotElement.assignedElements().length < 1
14459
14500
  );
14460
14501
  }
14461
- function handleMenuBarSlotChange(_, { event }) {
14502
+ function handleMenubarSlotChange(_, { event }) {
14462
14503
  const slot = event.target;
14463
14504
  const assignedElements = slot.assignedElements({ flatten: true });
14464
- const menuBar = assignedElements.find(
14505
+ const menubar = assignedElements.find(
14465
14506
  (element) => element.tagName.toLowerCase().endsWith(VALID_MENU_ELEMEMENT_SUFFIX)
14466
14507
  );
14467
14508
  assignedElements.forEach((element) => {
14468
- if (element === menuBar) {
14509
+ if (element === menubar) {
14469
14510
  element.style.removeProperty("display");
14470
14511
  } else {
14471
14512
  element.style.display = "none";
14472
14513
  }
14473
14514
  });
14474
- if (menuBar) {
14475
- menuBar.addEventListener(
14515
+ if (menubar) {
14516
+ menubar.addEventListener(
14476
14517
  "text-block-selected",
14477
14518
  textBlockSelectedHandler
14478
14519
  );
14479
- menuBar.addEventListener(
14520
+ menubar.addEventListener(
14480
14521
  "text-decoration-selected",
14481
14522
  selectionDecorationSelectedHandler
14482
14523
  );
14483
- menuBar.addEventListener(
14524
+ menubar.addEventListener(
14484
14525
  "text-size-selected",
14485
14526
  textSizeSelectedHandler
14486
14527
  );
@@ -14504,9 +14545,9 @@ function handleDragLeave(_, { event }) {
14504
14545
  }
14505
14546
  const RichTextEditorTemplate = (context) => {
14506
14547
  const dividerTag = context.tagFor(Divider);
14507
- return html`<template class="${getClasses}">
14508
- <div id="editor"
14509
- class="editor"
14548
+ return html`<template class="${getClasses$1}">
14549
+ <div id="editor"
14550
+ class="editor"
14510
14551
  @drop="${handleFileDrop}"
14511
14552
  @dragenter="${handleDragEnter}"
14512
14553
  @dragleave="${handleDragLeave}"
@@ -14521,18 +14562,94 @@ const RichTextEditorTemplate = (context) => {
14521
14562
  </slot>
14522
14563
  </div>
14523
14564
  </div>
14524
- <slot name="menu-bar"
14525
- @slotchange="${handleMenuBarSlotChange}"></slot>
14565
+ <slot name="menu-bar"
14566
+ @slotchange="${handleMenubarSlotChange}"></slot>
14526
14567
  </template>`;
14527
14568
  };
14528
14569
 
14570
+ const styles = ":host{white-space:normal}.image-placeholder{display:flex;width:250px;height:64px;box-sizing:border-box;align-items:center;padding:16px;border:1px solid var(--vvd-color-neutral-200);border-radius:12px;background-color:var(--vvd-color-canvas);gap:16px}.icon{display:flex;width:40px;height:40px;box-sizing:border-box;flex-shrink:0;align-items:center;justify-content:center;border-radius:8px;background-color:color-mix(in srgb,var(--vvd-color-neutral-950),transparent 90%);color:var(--vvd-color-neutral-600)}.info{display:flex;flex-direction:column;min-inline-size:0}.filename{display:flex;overflow:hidden;width:100%;max-width:220px;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base-condensed-bold);white-space:nowrap}.name{overflow:hidden;flex:1 1 auto;text-overflow:ellipsis}.suffix{flex:0 0 auto;margin-left:4px}.error{display:flex;align-items:center;color:var(--vvd-color-alert-600);font:var(--vvd-typography-base-condensed);gap:6px}";
14571
+
14572
+ var __defProp = Object.defineProperty;
14573
+ var __decorateClass = (decorators, target, key, kind) => {
14574
+ var result = void 0 ;
14575
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
14576
+ if (decorator = decorators[i])
14577
+ result = (decorator(target, key, result) ) || result;
14578
+ if (result) __defProp(target, key, result);
14579
+ return result;
14580
+ };
14581
+ class ImagePlaceholder extends VividElement {
14582
+ }
14583
+ __decorateClass([
14584
+ attr({ attribute: "file-name" })
14585
+ ], ImagePlaceholder.prototype, "fileName");
14586
+ __decorateClass([
14587
+ attr({ attribute: "size" })
14588
+ ], ImagePlaceholder.prototype, "size");
14589
+ __decorateClass([
14590
+ attr({ attribute: "error-message" })
14591
+ ], ImagePlaceholder.prototype, "errorMessage");
14592
+ __decorateClass([
14593
+ attr({ attribute: "icon" })
14594
+ ], ImagePlaceholder.prototype, "icon");
14595
+
14596
+ const getClasses = (_) => classNames("base");
14597
+ const getIconName = ({ icon }) => {
14598
+ if (!icon) {
14599
+ return "clear-file-solid";
14600
+ }
14601
+ return `file-${icon}-solid`;
14602
+ };
14603
+ const getFileSuffix = (x) => {
14604
+ return x.fileName?.split(".").pop() || "";
14605
+ };
14606
+ const getFileName = (x) => {
14607
+ return x.fileName?.replace(/\.[^/.]+$/, "") || "";
14608
+ };
14609
+ const ImagePlaceholderTemplate = (context) => {
14610
+ const iconTag = context.tagFor(Icon);
14611
+ return html`<template class="${getClasses}">
14612
+ <div class="image-placeholder">
14613
+ <div class="icon">
14614
+ <${iconTag} name="${getIconName}" size="-5"></${iconTag}>
14615
+ </div>
14616
+ <div class="info">
14617
+ <div class="filename" title="${(x) => x.fileName}">
14618
+ <div class="name">${getFileName}</div>
14619
+ <div class="suffix">${getFileSuffix}</div>
14620
+ </div>
14621
+ ${when(
14622
+ (x) => x.errorMessage,
14623
+ html`<div class="error">
14624
+ <span class="error-icon"><${iconTag} name="error-solid" size="-6"></${iconTag}></span>
14625
+ <span class="error-text">${(x) => x.errorMessage}</span>
14626
+ </div>`
14627
+ )}
14628
+ </div>
14629
+ </div>
14630
+ </template>`;
14631
+ };
14632
+
14633
+ const imagePlaceholderDefinition = defineVividComponent(
14634
+ "text-editor-image-placeholder",
14635
+ ImagePlaceholder,
14636
+ ImagePlaceholderTemplate,
14637
+ [iconDefinition],
14638
+ {
14639
+ styles,
14640
+ shadowOptions: {
14641
+ delegatesFocus: true
14642
+ }
14643
+ }
14644
+ );
14645
+
14529
14646
  const richTextEditorDefinition = defineVividComponent(
14530
14647
  "rich-text-editor",
14531
14648
  RichTextEditor,
14532
14649
  RichTextEditorTemplate,
14533
- [menuBarDefinition, dividerDefinition],
14650
+ [menubarDefinition, dividerDefinition, imagePlaceholderDefinition],
14534
14651
  {
14535
- styles: styles$1,
14652
+ styles: styles$2,
14536
14653
  shadowOptions: {
14537
14654
  delegatesFocus: true
14538
14655
  }
@@ -21,9 +21,9 @@ const slotted = require('./slotted.cjs');
21
21
  const classNames = require('./class-names.cjs');
22
22
  const repeat = require('./repeat.cjs');
23
23
 
24
- const styles = ".chevron{display:flex;flex-shrink:0;font:var(--vvd-typography-base-extended);transform:rotate(0);transition:transform .2s}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:not(.disabled) .chevron{cursor:pointer}.disabled .chevron{color:var(--_low-ink-color);cursor:not-allowed}:host(:focus-visible){outline:none}:host{display:inline-block;inline-size:300px;--_low-ink-color: var(--vvd-color-neutral-600)}:host([disabled]){--_low-ink-color: var(--vvd-color-neutral-400);cursor:not-allowed}.control-wrapper{display:flex;flex-direction:column;gap:4px}.label{color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base)}.selection-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.fieldset{--_connotation-color-primary: var(--vvd-searchable-select-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-searchable-select-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-searchable-select-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-intermediate: var(--vvd-searchable-select-accent-intermediate, var(--vvd-color-neutral-500));--_connotation-color-faint: var(--vvd-searchable-select-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-searchable-select-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-firm: var(--vvd-searchable-select-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-fierce: var(--vvd-searchable-select-accent-fierce, var(--vvd-color-neutral-700))}.fieldset{--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-canvas);--_appearance-color-outline: var(--vvd-color-neutral-500)}.fieldset.appearance-ghost{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-canvas);--_appearance-color-outline: var(--vvd-color-neutral-700)}.fieldset:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.fieldset:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-100);--_appearance-color-outline: var(--vvd-color-neutral-300)}.fieldset:where(.disabled,:disabled).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.readonly):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: var(--vvd-color-neutral-400)}.fieldset:where(.readonly):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-600);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.error):where(:not(.disabled,:disabled)){--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-alert-50);--_appearance-color-outline: var(--vvd-color-alert-500)}.fieldset:where(.error):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-alert-50);--_appearance-color-outline: transparent}.fieldset:where(.success):where(:not(.disabled,:disabled)){--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-success-50);--_appearance-color-outline: var(--vvd-color-success-500)}.fieldset:where(.success):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-success-50);--_appearance-color-outline: transparent}.fieldset{display:flex;align-items:center;justify-content:space-between;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);gap:8px;padding-block:8px;padding-inline:16px;transition:box-shadow .2s,background-color .2s}.fieldset:focus-within{box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}:host(:not([shape=pill])) .fieldset{border-radius:8px}:host([shape=pill]) .fieldset{border-radius:24px}.popup-wrapper{position:relative}.content-area{display:flex;overflow:hidden;flex:1;flex-direction:column;gap:8px;min-block-size:24px}.tag-row{display:flex;gap:8px;inline-size:100%}.tag-row.contains-only-input:not(:focus-within){display:contents}.tag-wrapper{overflow:hidden}.tag{max-inline-size:100%}input{box-sizing:border-box;flex:1;border:none;background:none;block-size:24px;font:var(--vvd-typography-base);max-inline-size:100%;min-inline-size:min(100px,40%);outline:none}.contains-only-input input:not(:focus){position:absolute;block-size:0;inline-size:0;min-inline-size:0;opacity:0;pointer-events:none}.listbox{display:flex;flex-direction:column;padding:4px;gap:2px;max-block-size:var(--searchable-select-height, 408px);overflow-y:auto}.empty-message{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);min-block-size:40px;text-align:center}::part(popup-base){inline-size:max-content;min-inline-size:var(--_searchable-select-fixed-width, 100%)}slot[name=icon]{font-size:20px}.visually-hidden{position:absolute;overflow:hidden;width:1px;height:1px;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}";
24
+ const styles = ".chevron{display:flex;flex-shrink:0;font:var(--vvd-typography-base-extended);transform:rotate(0);transition:transform .2s}:host([data-expanded=true]) .chevron,:host([open]) .chevron{transform:rotate(180deg)}:not(.disabled) .chevron{cursor:pointer}.disabled .chevron{color:var(--_low-ink-color);cursor:not-allowed}:host(:focus-visible){outline:none}:host{display:inline-block;inline-size:300px;--_low-ink-color: var(--vvd-color-neutral-600)}:host([disabled]){--_low-ink-color: var(--vvd-color-neutral-400);cursor:not-allowed}.control-wrapper{display:flex;flex-direction:column;gap:4px}.label{color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base)}.selection-count{color:var(--_low-ink-color);font:var(--vvd-typography-base)}.fieldset{--_connotation-color-primary: var(--vvd-searchable-select-accent-primary, var(--vvd-color-canvas-text));--_connotation-color-primary-text: var(--vvd-searchable-select-accent-primary-text, var(--vvd-color-canvas));--_connotation-color-primary-increment: var(--vvd-searchable-select-accent-primary-increment, var(--vvd-color-neutral-800));--_connotation-color-intermediate: var(--vvd-searchable-select-accent-intermediate, var(--vvd-color-neutral-500));--_connotation-color-faint: var(--vvd-searchable-select-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-soft: var(--vvd-searchable-select-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-firm: var(--vvd-searchable-select-accent-firm, var(--vvd-color-canvas-text));--_connotation-color-fierce: var(--vvd-searchable-select-accent-fierce, var(--vvd-color-neutral-700))}.fieldset{--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-canvas);--_appearance-color-outline: var(--vvd-color-neutral-500)}.fieldset.appearance-ghost{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-canvas);--_appearance-color-outline: var(--vvd-color-neutral-700)}.fieldset:where(.hover,:hover):where(:not(.disabled,:disabled,.readonly)).appearance-ghost{--_appearance-color-text: var(--_connotation-color-firm);--_appearance-color-fill: var(--_connotation-color-faint);--_appearance-color-outline: transparent}.fieldset:where(.disabled,:disabled){--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: var(--vvd-color-neutral-100);--_appearance-color-outline: var(--vvd-color-neutral-300)}.fieldset:where(.disabled,:disabled).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.readonly):where(:not(.disabled,:disabled)){--_appearance-color-text: var(--vvd-color-canvas-text);--_appearance-color-fill: var(--vvd-color-neutral-200);--_appearance-color-outline: var(--vvd-color-neutral-400)}.fieldset:where(.readonly):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: var(--vvd-color-neutral-600);--_appearance-color-fill: transparent;--_appearance-color-outline: transparent}.fieldset:where(.error):where(:not(.disabled,:disabled)){--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-alert-50);--_appearance-color-outline: var(--vvd-color-alert-500)}.fieldset:where(.error):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-alert-50);--_appearance-color-outline: transparent}.fieldset:where(.success):where(:not(.disabled,:disabled)){--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-success-50);--_appearance-color-outline: var(--vvd-color-success-500)}.fieldset:where(.success):where(:not(.disabled,:disabled)).appearance-ghost{--_appearance-color-text: notSet;--_appearance-color-fill: var(--vvd-color-success-50);--_appearance-color-outline: transparent}.fieldset{display:flex;align-items:center;justify-content:space-between;background-color:var(--_appearance-color-fill);box-shadow:inset 0 0 0 1px var(--_appearance-color-outline);color:var(--_appearance-color-text);font:var(--vvd-typography-base);gap:8px;padding-block:8px;padding-inline:16px;transition:box-shadow .2s,background-color .2s}@supports selector(:has(*)){.fieldset:not(.has-highlighted-option):has(input:focus){box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}}@supports not selector(:has(*)){.fieldset:not(.has-highlighted-option):focus-within{box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}}:host(:not([shape=pill])) .fieldset{border-radius:8px}:host([shape=pill]) .fieldset{border-radius:24px}.popup-wrapper{position:relative}.content-area{display:flex;overflow:hidden;flex:1;flex-direction:column;gap:8px;min-block-size:24px}.tag-row{display:flex;gap:8px;inline-size:100%}.tag-row.contains-only-input:not(:focus-within){display:contents}.tag-wrapper{overflow:hidden}.tag{max-inline-size:100%}input{box-sizing:border-box;flex:1;border:none;background:none;block-size:24px;font:var(--vvd-typography-base);max-inline-size:100%;min-inline-size:min(100px,40%);outline:none}.contains-only-input input:not(:focus){position:absolute;block-size:0;inline-size:0;min-inline-size:0;opacity:0;pointer-events:none}.listbox{display:flex;flex-direction:column;padding:4px;gap:2px;max-block-size:var(--searchable-select-height, 408px);overflow-y:auto}.empty-message{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-300);font:var(--vvd-typography-base);min-block-size:40px;text-align:center}::part(popup-base){inline-size:max-content;min-inline-size:var(--_searchable-select-fixed-width, 100%)}slot[name=icon]{font-size:20px}.visually-hidden{position:absolute;overflow:hidden;width:1px;height:1px;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}::slotted([data-vvd-component=option][data-highlighted]){border-radius:8px;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent}";
25
25
 
26
- const optionTagStyles = ".base.connotation-cta{--_connotation-color-contrast: var(--vvd-option-tag-cta-contrast, var(--vvd-color-cta-800))}.base:not(.connotation-cta){--_connotation-color-contrast: var(--vvd-option-tag-accent-contrast, var(--vvd-color-neutral-800))}.base{position:relative;display:inline-flex;box-sizing:border-box;align-items:center;background-color:var(--fill-color);block-size:calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2)));box-shadow:inset 0 0 0 1px var(--outline-color);color:var(--text-color);column-gap:8px;font:var(--vvd-typography-base-bold);max-inline-size:100%;padding-inline:8px;user-select:none;vertical-align:middle}.base:not(.disabled){--text-color: var(--_connotation-color-contrast);--fill-color: color-mix( in srgb, var(--_connotation-color-contrast), transparent 87.5% );--outline-color: transparent}.base.disabled{--text-color: var(--vvd-color-neutral-300);--fill-color: color-mix( in srgb, var(--vvd-color-neutral-800), transparent 87.5% );--outline-color: transparent}.base:not(.shape-pill){border-radius:4px}.base.shape-pill{border-radius:16px}.label{overflow:hidden;max-inline-size:100%;text-overflow:ellipsis;white-space:nowrap}slot[name=icon]{font-size:calc(calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 1.5);line-height:1}.icon-placeholder{inline-size:calc(calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 1.5)}.remove-button{display:flex;align-items:center;border-radius:inherit;cursor:pointer;outline:none}.disabled .remove-button{pointer-events:none}.remove-button:focus-visible:before{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));position:absolute;z-index:1;display:block;border-radius:inherit;content:\"\";inset:0;pointer-events:none}";
26
+ const optionTagStyles = ".base.connotation-cta{--_connotation-color-contrast: var(--vvd-option-tag-cta-contrast, var(--vvd-color-cta-800))}.base:not(.connotation-cta){--_connotation-color-contrast: var(--vvd-option-tag-accent-contrast, var(--vvd-color-neutral-800))}.base{position:relative;display:inline-flex;box-sizing:border-box;align-items:center;background-color:var(--fill-color);block-size:calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2)));box-shadow:inset 0 0 0 1px var(--outline-color);color:var(--text-color);column-gap:8px;font:var(--vvd-typography-base-bold);max-inline-size:100%;padding-inline:8px;user-select:none;vertical-align:middle}.base:not(.disabled){--text-color: var(--_connotation-color-contrast);--fill-color: var(--_connotation-color-soft);--outline-color: transparent}@supports (background-color: color-mix(in srgb,black 50%,white)){.base:not(.disabled){--fill-color: color-mix( in srgb, var(--_connotation-color-contrast), transparent 87.5% )}}.base.disabled{--text-color: var(--vvd-color-neutral-300);--fill-color: var(--vvd-color-neutral-200);--outline-color: transparent}@supports (background-color: color-mix(in srgb,black 50%,white)){.base.disabled{--fill-color: color-mix( in srgb, var(--vvd-color-neutral-800), transparent 87.5% )}}.base:not(.shape-pill){border-radius:4px}.base.shape-pill{border-radius:16px}.label{overflow:hidden;max-inline-size:100%;text-overflow:ellipsis;white-space:nowrap}slot[name=icon]{font-size:calc(calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 1.5);line-height:1}.icon-placeholder{inline-size:calc(calc(1px*(24 + 4*clamp(-1,var(--vvd-size-density, 0),2))) / 1.5)}.remove-button{display:flex;align-items:center;border-radius:inherit;cursor:pointer;outline:none}.disabled .remove-button{pointer-events:none}.remove-button:focus-visible:before{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px));position:absolute;z-index:1;display:block;border-radius:inherit;content:\"\";inset:0;pointer-events:none}";
27
27
 
28
28
  var __defProp$1 = Object.defineProperty;
29
29
  var __decorateClass$1 = (decorators, target, key, kind) => {
@@ -451,7 +451,9 @@ class SearchableSelect extends mixins.WithFeedback(
451
451
  }
452
452
  #transitionHighlightedOptionTo(index) {
453
453
  if (typeof this._highlightedOptionIndex === "number") {
454
- this._filteredEnabledOptions[this._highlightedOptionIndex]._highlighted = false;
454
+ const prevOption = this._filteredEnabledOptions[this._highlightedOptionIndex];
455
+ prevOption._highlighted = false;
456
+ prevOption.removeAttribute("data-highlighted");
455
457
  }
456
458
  if (typeof index === "number") {
457
459
  if (!this._filteredEnabledOptions.length) {
@@ -467,6 +469,7 @@ class SearchableSelect extends mixins.WithFeedback(
467
469
  if (typeof this._highlightedOptionIndex === "number") {
468
470
  const highlightedOption = this._filteredEnabledOptions[this._highlightedOptionIndex];
469
471
  highlightedOption._highlighted = true;
472
+ highlightedOption.setAttribute("data-highlighted", "");
470
473
  scrollIntoView.scrollIntoView(highlightedOption, this._listbox, "nearest");
471
474
  this._changeDescription = this.locale.searchableSelect.optionFocusedMessage(
472
475
  highlightedOption.text,
@@ -541,7 +544,10 @@ class SearchableSelect extends mixins.WithFeedback(
541
544
  return this.disabled || option.disabled;
542
545
  }
543
546
  #textForValue(value) {
544
- return this._slottedOptions?.find((option) => option.value === value)?.text;
547
+ const option = this._slottedOptions?.find(
548
+ (option2) => option2.value === value
549
+ );
550
+ return option?.label;
545
551
  }
546
552
  /**
547
553
  * @internal
@@ -968,7 +974,8 @@ const getStateClasses = (x) => classNames.classNames(
968
974
  [`appearance-${x.appearance}`, Boolean(x.appearance)],
969
975
  [`shape-${x.shape}`, Boolean(x.shape)],
970
976
  ["error", Boolean(x.errorValidationMessage)],
971
- ["success", !!x.successText]
977
+ ["success", !!x.successText],
978
+ ["has-highlighted-option", x._highlightedOptionIndex !== null]
972
979
  );
973
980
  function renderLabel() {
974
981
  return vividElement.html`