@vonage/vivid 4.21.0 → 4.22.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 (63) hide show
  1. package/custom-elements.json +175 -116
  2. package/index.cjs +1 -1
  3. package/index.js +2 -2
  4. package/lib/audio-player/audio-player.d.ts +2 -1
  5. package/lib/calendar/calendar.d.ts +3 -1
  6. package/lib/enums.d.ts +0 -4
  7. package/lib/file-picker/file-picker.d.ts +3 -2
  8. package/lib/option/option.d.ts +2 -0
  9. package/lib/rich-text-editor/rich-text-editor.d.ts +4 -3
  10. package/lib/searchable-select/option-tag.d.ts +3 -1
  11. package/lib/tabs/definition.d.ts +1 -0
  12. package/lib/tabs/tabs.d.ts +6 -1
  13. package/lib/video-player/video-player.d.ts +3 -1
  14. package/package.json +1 -1
  15. package/shared/definition15.cjs +1 -1
  16. package/shared/definition15.js +1 -1
  17. package/shared/definition16.cjs +1 -1
  18. package/shared/definition16.js +1 -1
  19. package/shared/definition19.cjs +3 -0
  20. package/shared/definition19.js +3 -0
  21. package/shared/definition26.cjs +8 -0
  22. package/shared/definition26.js +8 -0
  23. package/shared/definition28.cjs +1 -1
  24. package/shared/definition28.js +1 -1
  25. package/shared/definition3.cjs +1 -1
  26. package/shared/definition3.js +1 -1
  27. package/shared/definition30.cjs +1 -0
  28. package/shared/definition30.js +1 -0
  29. package/shared/definition35.cjs +1 -1
  30. package/shared/definition35.js +1 -1
  31. package/shared/definition4.cjs +1 -1
  32. package/shared/definition4.js +1 -1
  33. package/shared/definition41.cjs +1 -1
  34. package/shared/definition41.js +1 -1
  35. package/shared/definition43.cjs +105 -52
  36. package/shared/definition43.js +105 -52
  37. package/shared/definition44.cjs +18 -4
  38. package/shared/definition44.js +18 -4
  39. package/shared/definition45.cjs +3 -3
  40. package/shared/definition45.js +3 -3
  41. package/shared/definition50.cjs +1 -1
  42. package/shared/definition50.js +1 -1
  43. package/shared/definition53.cjs +5 -0
  44. package/shared/definition53.js +5 -1
  45. package/shared/definition56.cjs +1 -1
  46. package/shared/definition56.js +1 -1
  47. package/shared/enums.cjs +0 -6
  48. package/shared/enums.js +1 -6
  49. package/shared/option.cjs +3 -0
  50. package/shared/option.js +3 -0
  51. package/shared/single-value-picker.cjs +3 -0
  52. package/shared/single-value-picker.js +3 -0
  53. package/shared/text-field.cjs +1 -1
  54. package/shared/text-field.js +1 -1
  55. package/shared/vivid-element.cjs +1 -1
  56. package/shared/vivid-element.js +1 -1
  57. package/styles/core/all.css +1 -1
  58. package/styles/core/theme.css +1 -1
  59. package/styles/core/typography.css +1 -1
  60. package/styles/tokens/theme-dark.css +4 -4
  61. package/styles/tokens/theme-light.css +4 -4
  62. package/styles/tokens/vivid-2-compat.css +1 -1
  63. package/vivid.api.json +161 -56
@@ -2,11 +2,13 @@
2
2
 
3
3
  const vividElement = require('./vivid-element.cjs');
4
4
  const definition = require('./definition11.cjs');
5
- const definition$3 = require('./definition30.cjs');
6
5
  const definition$1 = require('./definition23.cjs');
7
6
  const definition$2 = require('./definition60.cjs');
7
+ const definition$3 = require('./definition45.cjs');
8
+ const option = require('./option.cjs');
8
9
  const classNames = require('./class-names.cjs');
9
10
  const repeat = require('./repeat.cjs');
11
+ const definition$4 = require('./definition36.cjs');
10
12
 
11
13
  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}.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)}";
12
14
 
@@ -59,53 +61,99 @@ const TEXT_DECORATION_ITEMS = [
59
61
  }
60
62
  ];
61
63
  const MENU_BAR_ITEMS = {
62
- textSize: function(context) {
63
- const buttonTag = context.tagFor(definition.Button);
64
- const menuTag = context.tagFor(definition$3.Menu);
65
- const menuItemTag = context.tagFor(definition$3.MenuItem);
64
+ /*textSize: function (context) {
65
+ const buttonTag = context.tagFor(Button);
66
+ const menuTag = context.tagFor(Menu);
67
+ const menuItemTag = context.tagFor(MenuItem);
68
+ const tooltipTag = context.tagFor(Tooltip);
69
+ return html`
70
+ <${menuTag}
71
+ trigger="auto"
72
+ id="text-block"
73
+ aria-label="Text Block"
74
+ placement="bottom-end"
75
+ >
76
+ <${tooltipTag} slot="anchor" text="Text Block Type" placement="top">
77
+ <${buttonTag}
78
+ slot="anchor"
79
+ aria-label="Open text block menu"
80
+ size="super-condensed"
81
+ appearance="ghost-light"
82
+ shape="pill"
83
+ icon="text-size-line"
84
+ ></${buttonTag}>
85
+ </${tooltipTag}>
86
+ <${menuItemTag}
87
+ text="Title"
88
+ value="title"
89
+ internal-part
90
+ class="title"
91
+ connotation="cta"
92
+ @click="${(_, { parent }) =>
93
+ notifyMenuBarChange(parent, 'text-block-selected', 'title')}"
94
+ ></${menuItemTag}>
95
+ <${menuItemTag}
96
+ text="Subtitle"
97
+ value="subtitle"
98
+ internal-part
99
+ class="subtitle"
100
+ connotation="cta"
101
+ @click="${(_, { parent }) =>
102
+ notifyMenuBarChange(parent, 'text-block-selected', 'subtitle')}"
103
+ ></${menuItemTag}>
104
+ <${menuItemTag}
105
+ text="Body"
106
+ value="body"
107
+ internal-part
108
+ class="body"
109
+ connotation="cta"
110
+ @click="${(_, { parent }) =>
111
+ notifyMenuBarChange(parent, 'text-block-selected', 'body')}"
112
+ ></${menuItemTag}>
113
+ </${menuTag}>
114
+ `;
115
+ },*/
116
+ textBlock: function(context) {
117
+ const selectTag = context.tagFor(definition$3.Select);
118
+ const optionTag = context.tagFor(option.ListboxOption);
66
119
  const tooltipTag = context.tagFor(definition$2.Tooltip);
67
120
  return vividElement.html`
68
- <${menuTag}
121
+ <${tooltipTag} text="Text Block Type" placement="top">
122
+ <${selectTag}
123
+ slot="anchor"
69
124
  trigger="auto"
70
- id="text-size"
71
- aria-label="Text Size"
125
+ id="text-block"
126
+ aria-label="Text Block"
72
127
  placement="bottom-end"
128
+ @change="${(_, { parent, event }) => notifyMenuBarChange(
129
+ parent,
130
+ "text-block-selected",
131
+ event.target.value
132
+ )}"
73
133
  >
74
- <${tooltipTag} slot="anchor" text="Text Size" placement="top">
75
- <${buttonTag}
76
- slot="anchor"
77
- aria-label="Open text size menu"
78
- size="super-condensed"
79
- appearance="ghost-light"
80
- shape="pill"
81
- icon="text-size-line"
82
- ></${buttonTag}>
83
- </${tooltipTag}>
84
- <${menuItemTag}
134
+ <${optionTag}
85
135
  text="Title"
86
136
  value="title"
87
137
  internal-part
88
138
  class="title"
89
139
  connotation="cta"
90
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "title")}"
91
- ></${menuItemTag}>
92
- <${menuItemTag}
140
+ ></${optionTag}>
141
+ <${optionTag}
93
142
  text="Subtitle"
94
143
  value="subtitle"
95
144
  internal-part
96
145
  class="subtitle"
97
146
  connotation="cta"
98
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "subtitle")}"
99
- ></${menuItemTag}>
100
- <${menuItemTag}
147
+ ></${optionTag}>
148
+ <${optionTag}
101
149
  text="Body"
102
150
  value="body"
103
151
  internal-part
104
152
  class="body"
105
153
  connotation="cta"
106
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "body")}"
107
- ></${menuItemTag}>
108
- </${menuTag}>
154
+ ></${optionTag}>
155
+ </${selectTag}>
156
+ </${tooltipTag}>
109
157
  `;
110
158
  },
111
159
  textDecoration: function(context) {
@@ -142,7 +190,7 @@ const getClasses$1 = (menuBar) => classNames.classNames("control", [
142
190
  "hide-menubar",
143
191
  getValidMenuItems(menuBar).length === 0
144
192
  ]);
145
- const validItems = ["textSize", "textDecoration"];
193
+ const validItems = ["textBlock", "textDecoration"];
146
194
  function createMenuItem(item) {
147
195
  return MENU_BAR_ITEMS[item];
148
196
  }
@@ -167,8 +215,8 @@ const menuBarDefinition = vividElement.defineVividComponent(
167
215
  MenuBarTemplate,
168
216
  [
169
217
  definition.buttonDefinition,
170
- definition$3.menuDefinition,
171
- definition$3.menuItemDefinition,
218
+ definition$3.selectDefinition,
219
+ definition$4.listboxOptionDefinition,
172
220
  definition$1.dividerDefinition,
173
221
  definition$2.tooltipDefinition
174
222
  ],
@@ -13801,7 +13849,7 @@ var __decorateClass = (decorators, target, key, kind) => {
13801
13849
  if (result) __defProp(target, key, result);
13802
13850
  return result;
13803
13851
  };
13804
- const RichTextEditorTextSizes = {
13852
+ const RichTextEditorTextBlocks = {
13805
13853
  title: "h2",
13806
13854
  subtitle: "h3",
13807
13855
  body: "p"
@@ -13821,13 +13869,11 @@ class RichTextEditor extends vividElement.VividElement {
13821
13869
  }
13822
13870
  };
13823
13871
  this.selectionEnd = null;
13824
- this.#selectionChangedByUser = false;
13825
13872
  this.#handleSelectionChange = () => {
13826
13873
  if (!this.#editor.selection()) {
13827
13874
  return;
13828
13875
  }
13829
13876
  const { start, end } = this.#editor.selection();
13830
- this.#selectionChangedByUser = true;
13831
13877
  this.selectionStart = start;
13832
13878
  this.selectionEnd = end;
13833
13879
  this.$emit("selection-changed");
@@ -13859,9 +13905,6 @@ class RichTextEditor extends vividElement.VividElement {
13859
13905
  return this.shadowRoot.querySelector("#editor");
13860
13906
  }
13861
13907
  selectionStartChanged() {
13862
- if (this.#selectionChangedByUser) {
13863
- return;
13864
- }
13865
13908
  if (!this.selectionStart || this.selectionEnd && this.selectionStart > this.selectionEnd) {
13866
13909
  return;
13867
13910
  }
@@ -13869,16 +13912,11 @@ class RichTextEditor extends vividElement.VividElement {
13869
13912
  }
13870
13913
  #updateEditorSelection;
13871
13914
  selectionEndChanged() {
13872
- if (this.#selectionChangedByUser) {
13873
- this.#selectionChangedByUser = false;
13874
- return;
13875
- }
13876
13915
  if (this.selectionEnd && !this.selectionStart) {
13877
13916
  this.selectionStart = 1;
13878
13917
  }
13879
13918
  this.#updateEditorSelection();
13880
13919
  }
13881
- #selectionChangedByUser;
13882
13920
  #handleSelectionChange;
13883
13921
  #handleChange;
13884
13922
  #handleInput;
@@ -13895,11 +13933,11 @@ class RichTextEditor extends vividElement.VividElement {
13895
13933
  this.#editor.addEventListener("input", this.#handleInput);
13896
13934
  }
13897
13935
  }
13898
- setTextSize(size) {
13936
+ setTextBlock(blockType) {
13899
13937
  try {
13900
- this.#editor?.setSelectionTag(RichTextEditorTextSizes[size]);
13938
+ this.#editor?.setSelectionTag(RichTextEditorTextBlocks[blockType]);
13901
13939
  } catch (e) {
13902
- console.warn(`Invalid text size: ${size}`);
13940
+ console.warn(`Invalid text block: ${blockType}`);
13903
13941
  }
13904
13942
  }
13905
13943
  setSelectionDecoration(decoration) {
@@ -13909,6 +13947,14 @@ class RichTextEditor extends vividElement.VividElement {
13909
13947
  console.warn(`Invalid decoration: ${decoration}`);
13910
13948
  }
13911
13949
  }
13950
+ focus() {
13951
+ super.focus();
13952
+ setTimeout(() => {
13953
+ this.#editorWrapperElement.querySelector(
13954
+ '[contenteditable="true"]'
13955
+ ).focus();
13956
+ }, 0);
13957
+ }
13912
13958
  }
13913
13959
  __decorateClass([
13914
13960
  vividElement.attr({ converter: vividElement.nullableNumberConverter, attribute: "selection-start" })
@@ -13919,13 +13965,20 @@ __decorateClass([
13919
13965
 
13920
13966
  const getClasses = (_) => classNames.classNames("control");
13921
13967
  const VALID_MENU_ELEMEMENT_SUFFIX = "menubar";
13922
- function textSizeSelectedHandler(event) {
13923
- this.setTextSize(event.detail);
13968
+ const menuParent = (target) => target.parentElement;
13969
+ function textBlockSelectedHandler(event) {
13970
+ menuParent(event.target).setTextBlock(
13971
+ event.detail
13972
+ );
13973
+ menuParent(event.target).focus();
13924
13974
  }
13925
13975
  function selectionDecorationSelectedHandler(event) {
13926
- this.setSelectionDecoration(event.detail);
13976
+ menuParent(event.target).setSelectionDecoration(
13977
+ event.detail
13978
+ );
13979
+ menuParent(event.target).focus();
13927
13980
  }
13928
- function handleMenuBarSlotChange(richTextEditor, { event }) {
13981
+ function handleMenuBarSlotChange(_, { event }) {
13929
13982
  const slot = event.target;
13930
13983
  const assignedElements = slot.assignedElements({ flatten: true });
13931
13984
  const menuBar = assignedElements.find(
@@ -13940,12 +13993,12 @@ function handleMenuBarSlotChange(richTextEditor, { event }) {
13940
13993
  });
13941
13994
  if (menuBar) {
13942
13995
  menuBar.addEventListener(
13943
- "text-size-selected",
13944
- textSizeSelectedHandler.bind(richTextEditor)
13996
+ "text-block-selected",
13997
+ textBlockSelectedHandler
13945
13998
  );
13946
13999
  menuBar.addEventListener(
13947
14000
  "text-decoration-selected",
13948
- selectionDecorationSelectedHandler.bind(richTextEditor)
14001
+ selectionDecorationSelectedHandler
13949
14002
  );
13950
14003
  }
13951
14004
  }
@@ -1,10 +1,12 @@
1
1
  import { V as VividElement, a as attr, h as html, f as defineVividComponent, n as nullableNumberConverter, d as createRegisterFunction } from './vivid-element.js';
2
2
  import { B as Button, b as buttonDefinition } from './definition11.js';
3
- import { e as Menu, M as MenuItem, c as menuDefinition, m as menuItemDefinition } from './definition30.js';
4
3
  import { D as Divider, d as dividerDefinition } from './definition23.js';
5
4
  import { T as Tooltip, t as tooltipDefinition } from './definition60.js';
5
+ import { S as Select, s as selectDefinition } from './definition45.js';
6
+ import { L as ListboxOption } from './option.js';
6
7
  import { c as classNames } from './class-names.js';
7
8
  import { r as repeat } from './repeat.js';
9
+ import { l as listboxOptionDefinition } from './definition36.js';
8
10
 
9
11
  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}.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)}";
10
12
 
@@ -57,53 +59,99 @@ const TEXT_DECORATION_ITEMS = [
57
59
  }
58
60
  ];
59
61
  const MENU_BAR_ITEMS = {
60
- textSize: function(context) {
61
- const buttonTag = context.tagFor(Button);
62
- const menuTag = context.tagFor(Menu);
63
- const menuItemTag = context.tagFor(MenuItem);
62
+ /*textSize: function (context) {
63
+ const buttonTag = context.tagFor(Button);
64
+ const menuTag = context.tagFor(Menu);
65
+ const menuItemTag = context.tagFor(MenuItem);
66
+ const tooltipTag = context.tagFor(Tooltip);
67
+ return html`
68
+ <${menuTag}
69
+ trigger="auto"
70
+ id="text-block"
71
+ aria-label="Text Block"
72
+ placement="bottom-end"
73
+ >
74
+ <${tooltipTag} slot="anchor" text="Text Block Type" placement="top">
75
+ <${buttonTag}
76
+ slot="anchor"
77
+ aria-label="Open text block menu"
78
+ size="super-condensed"
79
+ appearance="ghost-light"
80
+ shape="pill"
81
+ icon="text-size-line"
82
+ ></${buttonTag}>
83
+ </${tooltipTag}>
84
+ <${menuItemTag}
85
+ text="Title"
86
+ value="title"
87
+ internal-part
88
+ class="title"
89
+ connotation="cta"
90
+ @click="${(_, { parent }) =>
91
+ notifyMenuBarChange(parent, 'text-block-selected', 'title')}"
92
+ ></${menuItemTag}>
93
+ <${menuItemTag}
94
+ text="Subtitle"
95
+ value="subtitle"
96
+ internal-part
97
+ class="subtitle"
98
+ connotation="cta"
99
+ @click="${(_, { parent }) =>
100
+ notifyMenuBarChange(parent, 'text-block-selected', 'subtitle')}"
101
+ ></${menuItemTag}>
102
+ <${menuItemTag}
103
+ text="Body"
104
+ value="body"
105
+ internal-part
106
+ class="body"
107
+ connotation="cta"
108
+ @click="${(_, { parent }) =>
109
+ notifyMenuBarChange(parent, 'text-block-selected', 'body')}"
110
+ ></${menuItemTag}>
111
+ </${menuTag}>
112
+ `;
113
+ },*/
114
+ textBlock: function(context) {
115
+ const selectTag = context.tagFor(Select);
116
+ const optionTag = context.tagFor(ListboxOption);
64
117
  const tooltipTag = context.tagFor(Tooltip);
65
118
  return html`
66
- <${menuTag}
119
+ <${tooltipTag} text="Text Block Type" placement="top">
120
+ <${selectTag}
121
+ slot="anchor"
67
122
  trigger="auto"
68
- id="text-size"
69
- aria-label="Text Size"
123
+ id="text-block"
124
+ aria-label="Text Block"
70
125
  placement="bottom-end"
126
+ @change="${(_, { parent, event }) => notifyMenuBarChange(
127
+ parent,
128
+ "text-block-selected",
129
+ event.target.value
130
+ )}"
71
131
  >
72
- <${tooltipTag} slot="anchor" text="Text Size" placement="top">
73
- <${buttonTag}
74
- slot="anchor"
75
- aria-label="Open text size menu"
76
- size="super-condensed"
77
- appearance="ghost-light"
78
- shape="pill"
79
- icon="text-size-line"
80
- ></${buttonTag}>
81
- </${tooltipTag}>
82
- <${menuItemTag}
132
+ <${optionTag}
83
133
  text="Title"
84
134
  value="title"
85
135
  internal-part
86
136
  class="title"
87
137
  connotation="cta"
88
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "title")}"
89
- ></${menuItemTag}>
90
- <${menuItemTag}
138
+ ></${optionTag}>
139
+ <${optionTag}
91
140
  text="Subtitle"
92
141
  value="subtitle"
93
142
  internal-part
94
143
  class="subtitle"
95
144
  connotation="cta"
96
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "subtitle")}"
97
- ></${menuItemTag}>
98
- <${menuItemTag}
145
+ ></${optionTag}>
146
+ <${optionTag}
99
147
  text="Body"
100
148
  value="body"
101
149
  internal-part
102
150
  class="body"
103
151
  connotation="cta"
104
- @click="${(_, { parent }) => notifyMenuBarChange(parent, "text-size-selected", "body")}"
105
- ></${menuItemTag}>
106
- </${menuTag}>
152
+ ></${optionTag}>
153
+ </${selectTag}>
154
+ </${tooltipTag}>
107
155
  `;
108
156
  },
109
157
  textDecoration: function(context) {
@@ -140,7 +188,7 @@ const getClasses$1 = (menuBar) => classNames("control", [
140
188
  "hide-menubar",
141
189
  getValidMenuItems(menuBar).length === 0
142
190
  ]);
143
- const validItems = ["textSize", "textDecoration"];
191
+ const validItems = ["textBlock", "textDecoration"];
144
192
  function createMenuItem(item) {
145
193
  return MENU_BAR_ITEMS[item];
146
194
  }
@@ -165,8 +213,8 @@ const menuBarDefinition = defineVividComponent(
165
213
  MenuBarTemplate,
166
214
  [
167
215
  buttonDefinition,
168
- menuDefinition,
169
- menuItemDefinition,
216
+ selectDefinition,
217
+ listboxOptionDefinition,
170
218
  dividerDefinition,
171
219
  tooltipDefinition
172
220
  ],
@@ -13799,7 +13847,7 @@ var __decorateClass = (decorators, target, key, kind) => {
13799
13847
  if (result) __defProp(target, key, result);
13800
13848
  return result;
13801
13849
  };
13802
- const RichTextEditorTextSizes = {
13850
+ const RichTextEditorTextBlocks = {
13803
13851
  title: "h2",
13804
13852
  subtitle: "h3",
13805
13853
  body: "p"
@@ -13819,13 +13867,11 @@ class RichTextEditor extends VividElement {
13819
13867
  }
13820
13868
  };
13821
13869
  this.selectionEnd = null;
13822
- this.#selectionChangedByUser = false;
13823
13870
  this.#handleSelectionChange = () => {
13824
13871
  if (!this.#editor.selection()) {
13825
13872
  return;
13826
13873
  }
13827
13874
  const { start, end } = this.#editor.selection();
13828
- this.#selectionChangedByUser = true;
13829
13875
  this.selectionStart = start;
13830
13876
  this.selectionEnd = end;
13831
13877
  this.$emit("selection-changed");
@@ -13857,9 +13903,6 @@ class RichTextEditor extends VividElement {
13857
13903
  return this.shadowRoot.querySelector("#editor");
13858
13904
  }
13859
13905
  selectionStartChanged() {
13860
- if (this.#selectionChangedByUser) {
13861
- return;
13862
- }
13863
13906
  if (!this.selectionStart || this.selectionEnd && this.selectionStart > this.selectionEnd) {
13864
13907
  return;
13865
13908
  }
@@ -13867,16 +13910,11 @@ class RichTextEditor extends VividElement {
13867
13910
  }
13868
13911
  #updateEditorSelection;
13869
13912
  selectionEndChanged() {
13870
- if (this.#selectionChangedByUser) {
13871
- this.#selectionChangedByUser = false;
13872
- return;
13873
- }
13874
13913
  if (this.selectionEnd && !this.selectionStart) {
13875
13914
  this.selectionStart = 1;
13876
13915
  }
13877
13916
  this.#updateEditorSelection();
13878
13917
  }
13879
- #selectionChangedByUser;
13880
13918
  #handleSelectionChange;
13881
13919
  #handleChange;
13882
13920
  #handleInput;
@@ -13893,11 +13931,11 @@ class RichTextEditor extends VividElement {
13893
13931
  this.#editor.addEventListener("input", this.#handleInput);
13894
13932
  }
13895
13933
  }
13896
- setTextSize(size) {
13934
+ setTextBlock(blockType) {
13897
13935
  try {
13898
- this.#editor?.setSelectionTag(RichTextEditorTextSizes[size]);
13936
+ this.#editor?.setSelectionTag(RichTextEditorTextBlocks[blockType]);
13899
13937
  } catch (e) {
13900
- console.warn(`Invalid text size: ${size}`);
13938
+ console.warn(`Invalid text block: ${blockType}`);
13901
13939
  }
13902
13940
  }
13903
13941
  setSelectionDecoration(decoration) {
@@ -13907,6 +13945,14 @@ class RichTextEditor extends VividElement {
13907
13945
  console.warn(`Invalid decoration: ${decoration}`);
13908
13946
  }
13909
13947
  }
13948
+ focus() {
13949
+ super.focus();
13950
+ setTimeout(() => {
13951
+ this.#editorWrapperElement.querySelector(
13952
+ '[contenteditable="true"]'
13953
+ ).focus();
13954
+ }, 0);
13955
+ }
13910
13956
  }
13911
13957
  __decorateClass([
13912
13958
  attr({ converter: nullableNumberConverter, attribute: "selection-start" })
@@ -13917,13 +13963,20 @@ __decorateClass([
13917
13963
 
13918
13964
  const getClasses = (_) => classNames("control");
13919
13965
  const VALID_MENU_ELEMEMENT_SUFFIX = "menubar";
13920
- function textSizeSelectedHandler(event) {
13921
- this.setTextSize(event.detail);
13966
+ const menuParent = (target) => target.parentElement;
13967
+ function textBlockSelectedHandler(event) {
13968
+ menuParent(event.target).setTextBlock(
13969
+ event.detail
13970
+ );
13971
+ menuParent(event.target).focus();
13922
13972
  }
13923
13973
  function selectionDecorationSelectedHandler(event) {
13924
- this.setSelectionDecoration(event.detail);
13974
+ menuParent(event.target).setSelectionDecoration(
13975
+ event.detail
13976
+ );
13977
+ menuParent(event.target).focus();
13925
13978
  }
13926
- function handleMenuBarSlotChange(richTextEditor, { event }) {
13979
+ function handleMenuBarSlotChange(_, { event }) {
13927
13980
  const slot = event.target;
13928
13981
  const assignedElements = slot.assignedElements({ flatten: true });
13929
13982
  const menuBar = assignedElements.find(
@@ -13938,12 +13991,12 @@ function handleMenuBarSlotChange(richTextEditor, { event }) {
13938
13991
  });
13939
13992
  if (menuBar) {
13940
13993
  menuBar.addEventListener(
13941
- "text-size-selected",
13942
- textSizeSelectedHandler.bind(richTextEditor)
13994
+ "text-block-selected",
13995
+ textBlockSelectedHandler
13943
13996
  );
13944
13997
  menuBar.addEventListener(
13945
13998
  "text-decoration-selected",
13946
- selectionDecorationSelectedHandler.bind(richTextEditor)
13999
+ selectionDecorationSelectedHandler
13947
14000
  );
13948
14001
  }
13949
14002
  }
@@ -18,9 +18,9 @@ const slotted = require('./slotted.cjs');
18
18
  const classNames = require('./class-names.cjs');
19
19
  const repeat = require('./repeat.cjs');
20
20
 
21
- const styles = ".chevron{display:flex;flex-shrink:0;font:var(--vvd-typography-base-extended);transform:rotate(0);transition:transform .2s}:host([aria-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)}.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(--_connotation-color-intermediate)}.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(--_connotation-color-fierce)}.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:100px;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);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}";
21
+ const styles = ".chevron{display:flex;flex-shrink:0;font:var(--vvd-typography-base-extended);transform:rotate(0);transition:transform .2s}:host([aria-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)}.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:100px;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}";
22
22
 
23
- const optionTagStyles = ".base{--_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}";
23
+ 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}";
24
24
 
25
25
  class _SearchableSelect extends vividElement.VividElement {
26
26
  }
@@ -353,6 +353,15 @@ exports.SearchableSelect = class SearchableSelect extends affix.AffixIconWithTra
353
353
  );
354
354
  return option.label;
355
355
  }
356
+ /**
357
+ * @internal
358
+ */
359
+ _tagConnotationForValue(value) {
360
+ const option = this._slottedOptions.find(
361
+ (option2) => option2.value === value
362
+ );
363
+ return option.tagConnotation;
364
+ }
356
365
  /**
357
366
  * @internal
358
367
  */
@@ -879,6 +888,9 @@ class OptionTag extends localized.Localized(vividElement.VividElement) {
879
888
  __decorateClass([
880
889
  vividElement.attr
881
890
  ], OptionTag.prototype, "shape");
891
+ __decorateClass([
892
+ vividElement.observable
893
+ ], OptionTag.prototype, "connotation");
882
894
  __decorateClass([
883
895
  vividElement.attr
884
896
  ], OptionTag.prototype, "label");
@@ -915,6 +927,7 @@ const tagTemplateFactory = (context, getComponent) => {
915
927
  removable
916
928
  :label="${(x, c) => getComponent(c)._tagLabelForValue(x)}"
917
929
  :shape="${(_, c) => getComponent(c).shape}"
930
+ :connotation="${(x, c) => getComponent(c)._tagConnotationForValue(x)}"
918
931
  ?disabled="${(x, c) => getComponent(c)._isTagDisabled(x)}"
919
932
  @remove="${(x, c) => getComponent(c)._onTagRemoved(x)}"
920
933
  @keydown="${(_, c) => getComponent(c)._onTagKeydown(c.event)}"
@@ -1117,11 +1130,12 @@ const SearchableSelectTemplate = (context) => {
1117
1130
  `;
1118
1131
  };
1119
1132
 
1120
- const getClasses = ({ shape, disabled, removable }) => classNames.classNames(
1133
+ const getClasses = ({ shape, connotation, disabled, removable }) => classNames.classNames(
1121
1134
  "base",
1122
1135
  ["disabled", disabled],
1123
1136
  ["removable", removable],
1124
- [`shape-${shape}`, Boolean(shape)]
1137
+ [`shape-${shape}`, Boolean(shape)],
1138
+ [`connotation-${connotation}`, Boolean(connotation)]
1125
1139
  );
1126
1140
  function renderRemoveButton(iconTag) {
1127
1141
  return vividElement.html`