@descope-ui/descope-multi-select-combo-box 3.9.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.
@@ -0,0 +1,692 @@
1
+ import { compose, compareArraysUnordered } from '@descope-ui/common/utils';
2
+ import {
3
+ forwardAttrs,
4
+ getComponentName,
5
+ observeAttributes,
6
+ observeChildren,
7
+ } from '@descope-ui/common/components-helpers';
8
+ import {
9
+ resetInputLabelPosition,
10
+ resetInputCursor,
11
+ resetInputPlaceholder,
12
+ resetInputReadonlyStyle,
13
+ useHostExternalPadding,
14
+ inputFloatingLabelStyle,
15
+ } from '@descope-ui/common/theme-helpers';
16
+ import {
17
+ createStyleMixin,
18
+ draggableMixin,
19
+ createProxy,
20
+ componentNameValidationMixin,
21
+ portalMixin,
22
+ proxyInputMixin,
23
+ changeMixin,
24
+ } from '@descope-ui/common/components-mixins';
25
+
26
+ export const componentName = getComponentName('multi-select-combo-box');
27
+
28
+ const multiSelectComboBoxMixin = (superclass) =>
29
+ class MultiSelectComboBoxMixinClass extends superclass {
30
+ static get observedAttributes() {
31
+ return ['readonly'];
32
+ }
33
+
34
+ #renderItem = ({ displayName, value, label }) => {
35
+ const ele = document.createElement('span');
36
+ ele.setAttribute('data-name', label);
37
+ ele.setAttribute('data-id', value);
38
+ ele.textContent = displayName || label;
39
+
40
+ return ele.outerHTML;
41
+ };
42
+
43
+ #data;
44
+
45
+ #value = [];
46
+
47
+ get defaultValues() {
48
+ const defaultValuesAttr = this.getAttribute('default-values');
49
+ if (defaultValuesAttr) {
50
+ try {
51
+ const defaultValues = JSON.parse(defaultValuesAttr);
52
+ if (this.isValidDataType(defaultValues)) {
53
+ return defaultValues;
54
+ }
55
+ } catch (e) {
56
+ console.error(
57
+ 'could not parse data string from attribute "default-values" -',
58
+ e.message,
59
+ );
60
+ }
61
+ }
62
+ return [];
63
+ }
64
+
65
+ get renderItem() {
66
+ return this.#renderItem;
67
+ }
68
+
69
+ set renderItem(renderFn) {
70
+ this.#renderItem = renderFn;
71
+ this.renderItems();
72
+ }
73
+
74
+ get data() {
75
+ if (this.#data) return this.#data;
76
+
77
+ const dataAttr = this.getAttribute('data');
78
+
79
+ if (dataAttr) {
80
+ try {
81
+ const data = JSON.parse(dataAttr);
82
+ if (this.isValidDataType(data)) {
83
+ return data;
84
+ }
85
+ } catch (e) {
86
+ console.error(
87
+ 'could not parse data string from attribute "data" -',
88
+ e.message,
89
+ );
90
+ }
91
+ }
92
+
93
+ return [];
94
+ }
95
+
96
+ set data(data) {
97
+ if (this.isValidDataType(data)) {
98
+ this.#data = data;
99
+ this.renderItems();
100
+ }
101
+ }
102
+
103
+ get allowCustomValues() {
104
+ return this.getAttribute('allow-custom-value') === 'true';
105
+ }
106
+
107
+ get minItemsSelection() {
108
+ return parseInt(this.getAttribute('min-items-selection'), 10) || 0;
109
+ }
110
+
111
+ get maxItemsSelection() {
112
+ return parseInt(this.getAttribute('max-items-selection'), 10) || 0;
113
+ }
114
+
115
+ isValidDataType(data) {
116
+ const isValid = Array.isArray(data);
117
+ if (!isValid) {
118
+ console.error(
119
+ 'data and default-values must be an array, received:',
120
+ data,
121
+ );
122
+ }
123
+
124
+ return isValid;
125
+ }
126
+
127
+ getItemsTemplate() {
128
+ return this.data?.reduce?.(
129
+ (acc, item) => acc + (this.renderItem?.(item || {}) || ''),
130
+ '',
131
+ );
132
+ }
133
+
134
+ renderItems() {
135
+ const template = this.getItemsTemplate();
136
+ if (template) this.innerHTML = template;
137
+ }
138
+
139
+ updateSelectedItems() {
140
+ const currentSelected =
141
+ this.baseElement.selectedItems?.map((item) =>
142
+ item.getAttribute('data-id'),
143
+ ) || [];
144
+
145
+ if (currentSelected.length > 0) {
146
+ this.value = currentSelected;
147
+ }
148
+
149
+ if (this.value.length === 0) {
150
+ this.setDefaultValues();
151
+ }
152
+ }
153
+
154
+ customValueTransformFn(val) {
155
+ return val;
156
+ }
157
+
158
+ setComboBoxDescriptor() {
159
+ const valueDescriptor = Object.getOwnPropertyDescriptor(
160
+ this.inputElement.constructor.prototype,
161
+ 'value',
162
+ );
163
+
164
+ const comboBox = this;
165
+
166
+ Object.defineProperties(this.inputElement, {
167
+ value: {
168
+ ...valueDescriptor,
169
+ set(val) {
170
+ const transformedValue = comboBox.customValueTransformFn(val) || '';
171
+
172
+ if (transformedValue === this.value) {
173
+ return;
174
+ }
175
+
176
+ valueDescriptor.set.call(this, transformedValue);
177
+ },
178
+ },
179
+ });
180
+ }
181
+
182
+ #dedupItems(items) {
183
+ return Array.from(
184
+ new Map(
185
+ items.map((item) => [item.getAttribute('data-id'), item]),
186
+ ).values(),
187
+ );
188
+ }
189
+
190
+ #onChildrenChange() {
191
+ const items = Array.from(this.children);
192
+ const dedupItems = this.#dedupItems(items);
193
+
194
+ if (items.length) {
195
+ this.removeAttribute('has-no-options');
196
+
197
+ dedupItems.forEach((node) => {
198
+ Object.defineProperty(node, 'data-name', {
199
+ value: node.getAttribute('data-name'),
200
+ configurable: true,
201
+ writable: true,
202
+ });
203
+ Object.defineProperty(node, 'data-id', {
204
+ value: node.getAttribute('data-id'),
205
+ configurable: true,
206
+ writable: true,
207
+ });
208
+ });
209
+
210
+ this.baseElement.items = dedupItems;
211
+
212
+ setTimeout(() => {
213
+ this.updateSelectedItems();
214
+ }, 0);
215
+ } else {
216
+ this.baseElement.items = [];
217
+ this.setAttribute('has-no-options', '');
218
+ }
219
+
220
+ this.baseElement.renderer = (root, combo, model) => {
221
+ root.innerHTML = model.item.outerHTML;
222
+ };
223
+ }
224
+
225
+ #overrideOverlaySettings() {
226
+ const overlay = this.baseElement.shadowRoot
227
+ .querySelector('vaadin-multi-select-combo-box-internal')
228
+ .shadowRoot.querySelector('vaadin-multi-select-combo-box-overlay');
229
+ overlay._attachOverlay = () => {
230
+ overlay.bringToFront();
231
+ };
232
+ overlay._detachOverlay = () => {};
233
+ overlay._enterModalState = () => {};
234
+ }
235
+
236
+ #handleCustomValues() {
237
+ if (this.allowCustomValues) {
238
+ this.baseElement.addEventListener('custom-value-set', (e) => {
239
+ const newItemHtml = this.#renderItem({
240
+ label: e.detail,
241
+ displayName: e.detail,
242
+ value: e.detail,
243
+ });
244
+ this.innerHTML += newItemHtml;
245
+ this.baseElement._lastFilter = '';
246
+ setTimeout(() => {
247
+ this.value = [...this.value, e.detail];
248
+ }, 0);
249
+ });
250
+ }
251
+ }
252
+
253
+ setGetValidity() {
254
+ this.getValidity = function () {
255
+ if (this.pattern) {
256
+ const patternRegex = new RegExp(this.pattern);
257
+ if (this.value.some((val) => !patternRegex.test(val)))
258
+ return {
259
+ patternMismatch: true,
260
+ };
261
+ }
262
+
263
+ if (this.isRequired && !this.value.length) {
264
+ return {
265
+ valueMissing: true,
266
+ };
267
+ }
268
+ if (
269
+ this.isRequired &&
270
+ this.minItemsSelection &&
271
+ this.value.length < this.minItemsSelection
272
+ ) {
273
+ return {
274
+ rangeUnderflow: true,
275
+ };
276
+ }
277
+ if (
278
+ this.maxItemsSelection &&
279
+ this.value.length > this.maxItemsSelection
280
+ ) {
281
+ return {
282
+ rangeOverflow: true,
283
+ };
284
+ }
285
+ return {};
286
+ };
287
+
288
+ const that = this;
289
+
290
+ this.baseElement.checkValidity = () => that.validity.valid;
291
+ }
292
+
293
+ init() {
294
+ super.init?.();
295
+
296
+ this.setGetValidity();
297
+
298
+ this.#handleCustomValues();
299
+
300
+ this.renderItems();
301
+
302
+ observeAttributes(this, this.renderItems.bind(this), {
303
+ includeAttrs: ['data'],
304
+ });
305
+
306
+ observeChildren(this, this.#onChildrenChange.bind(this));
307
+
308
+ forwardAttrs(this, this.baseElement, { includeAttrs: ['placeholder'] });
309
+
310
+ setTimeout(() => {
311
+ this.setComboBoxDescriptor();
312
+ this.#overrideOverlaySettings();
313
+ });
314
+
315
+ this.setDefaultValues();
316
+
317
+ this.baseElement.addEventListener('selected-items-changed', () => {
318
+ this.#updateInternalValue();
319
+ this.dispatchEvent(new CustomEvent('input', { bubbles: true }));
320
+ });
321
+ }
322
+
323
+ setDefaultValues() {
324
+ const initialDefaultValues = this.defaultValues;
325
+ if (initialDefaultValues.length > 0) {
326
+ this.value = this.defaultValues;
327
+ }
328
+ }
329
+
330
+ #updateInternalValue() {
331
+ this.#value =
332
+ this.baseElement.selectedItems?.map((elem) =>
333
+ elem.getAttribute('data-id'),
334
+ ) || [];
335
+ }
336
+
337
+ set value(vals) {
338
+ if (vals && vals.length > 0) {
339
+ const selectedChildren = this.baseElement.items?.filter((item) =>
340
+ vals.includes(item['data-id']),
341
+ );
342
+
343
+ if (this.allowCustomValues) {
344
+ const existingValues =
345
+ selectedChildren?.map((child) => child.getAttribute('data-id')) ||
346
+ [];
347
+ const missingValues = vals.filter(
348
+ (val) => !existingValues.includes(val),
349
+ );
350
+
351
+ if (missingValues.length) {
352
+ const newItemsHtml = missingValues.reduce((acc, val) => {
353
+ const newItemHtml = this.#renderItem({
354
+ label: val,
355
+ displayName: val,
356
+ value: val,
357
+ });
358
+ return acc + newItemHtml;
359
+ }, '');
360
+ this.innerHTML += newItemsHtml;
361
+
362
+ setTimeout(() => {
363
+ this.value = vals;
364
+ }, 0);
365
+ return;
366
+ }
367
+ }
368
+
369
+ const newSelectedValues =
370
+ selectedChildren?.map((child) => child.getAttribute('data-id')) || [];
371
+ if (!compareArraysUnordered(this.#value, newSelectedValues)) {
372
+ this.baseElement.selectedItems = selectedChildren;
373
+ }
374
+ } else {
375
+ this.baseElement.selectedItems = [];
376
+ }
377
+ }
378
+
379
+ get value() {
380
+ return this.#value;
381
+ }
382
+
383
+ attributeChangedCallback(attrName, oldValue, newValue) {
384
+ super.attributeChangedCallback?.(attrName, oldValue, newValue);
385
+
386
+ if (attrName === 'readonly') {
387
+ this.onReadOnlyChange(newValue !== null && newValue === 'true');
388
+ }
389
+ }
390
+
391
+ onReadOnlyChange(val) {
392
+ if (val) {
393
+ this.baseElement?.shadowRoot
394
+ ?.querySelector('vaadin-multi-select-combo-box-internal')
395
+ ?.setAttribute('inert', val);
396
+ } else {
397
+ this.baseElement?.shadowRoot
398
+ ?.querySelector('vaadin-multi-select-combo-box-internal')
399
+ ?.removeAttribute('inert');
400
+ }
401
+ }
402
+ };
403
+
404
+ const {
405
+ host,
406
+ inputField,
407
+ inputElement,
408
+ placeholder,
409
+ toggle,
410
+ clearButton,
411
+ label,
412
+ requiredIndicator,
413
+ helperText,
414
+ errorMessage,
415
+ chip,
416
+ chipLabel,
417
+ overflowChipFirstBorder,
418
+ overflowChipSecondBorder,
419
+ } = {
420
+ host: { selector: () => ':host' },
421
+ inputField: { selector: '::part(input-field)' },
422
+ inputElement: { selector: 'input' },
423
+ placeholder: { selector: '> input:placeholder-shown' },
424
+ toggle: { selector: '::part(toggle-button)' },
425
+ clearButton: { selector: '::part(clear-button)' },
426
+ label: { selector: '::part(label)' },
427
+ requiredIndicator: {
428
+ selector: '[required]::part(required-indicator)::after',
429
+ },
430
+ helperText: { selector: '::part(helper-text)' },
431
+ errorMessage: { selector: '::part(error-message)' },
432
+ chip: { selector: 'vaadin-multi-select-combo-box-chip' },
433
+ chipLabel: { selector: 'vaadin-multi-select-combo-box-chip::part(label)' },
434
+ overflowChipFirstBorder: {
435
+ selector: "vaadin-multi-select-combo-box-chip[slot='overflow']::before",
436
+ },
437
+ overflowChipSecondBorder: {
438
+ selector: "vaadin-multi-select-combo-box-chip[slot='overflow']::after",
439
+ },
440
+ };
441
+
442
+ export const MultiSelectComboBoxClass = compose(
443
+ createStyleMixin({
444
+ mappings: {
445
+ hostWidth: { ...host, property: 'width' },
446
+ hostDirection: { ...host, property: 'direction' },
447
+ fontSize: [{}, host],
448
+ chipFontSize: { ...chipLabel, property: 'font-size' },
449
+ fontFamily: [
450
+ label,
451
+ placeholder,
452
+ inputField,
453
+ helperText,
454
+ errorMessage,
455
+ chipLabel,
456
+ ],
457
+ labelFontSize: { ...label, property: 'font-size' },
458
+ labelFontWeight: { ...label, property: 'font-weight' },
459
+ inputValueFontWeight: { ...inputField, property: 'font-weight' },
460
+ inputPlaceholderFontWeight: { ...placeholder, property: 'font-weight' },
461
+ helperTextFontWeight: { ...helperText, property: 'font-weight' },
462
+ errorMessageFontWeight: { ...errorMessage, property: 'font-weight' },
463
+ labelTextColor: [
464
+ { ...label, property: 'color' },
465
+ { ...requiredIndicator, property: 'color' },
466
+ ],
467
+ errorMessageTextColor: { ...errorMessage, property: 'color' },
468
+ errorMessageIcon: { ...errorMessage, property: 'background-image' },
469
+ errorMessageIconSize: { ...errorMessage, property: 'background-size' },
470
+ errorMessageIconPadding: {
471
+ ...errorMessage,
472
+ property: 'padding-inline-start',
473
+ },
474
+ errorMessageIconRepeat: {
475
+ ...errorMessage,
476
+ property: 'background-repeat',
477
+ },
478
+ errorMessageIconPosition: {
479
+ ...errorMessage,
480
+ property: 'background-position',
481
+ },
482
+ errorMessageFontSize: { ...errorMessage, property: 'font-size' },
483
+ inputHeight: { ...inputField, property: 'min-height' },
484
+ inputBackgroundColor: { ...inputField, property: 'background-color' },
485
+ inputBorderColor: { ...inputField, property: 'border-color' },
486
+ inputBorderWidth: { ...inputField, property: 'border-width' },
487
+ inputBorderStyle: { ...inputField, property: 'border-style' },
488
+ inputBorderRadius: { ...inputField, property: 'border-radius' },
489
+ labelRequiredIndicator: { ...requiredIndicator, property: 'content' },
490
+ inputValueTextColor: { ...inputField, property: 'color' },
491
+ inputPlaceholderTextColor: { ...placeholder, property: 'color' },
492
+ inputDropdownButtonCursor: [
493
+ { ...toggle, property: 'cursor' },
494
+ { ...clearButton, property: 'cursor' },
495
+ ],
496
+ inputDropdownButtonColor: [
497
+ { ...toggle, property: 'color' },
498
+ { ...clearButton, property: 'color' },
499
+ ],
500
+ inputDropdownButtonSize: [
501
+ { ...toggle, property: 'font-size' },
502
+ { ...clearButton, property: 'font-size' },
503
+ ],
504
+ inputDropdownButtonOffset: [
505
+ { ...toggle, property: 'margin-right' },
506
+ { ...toggle, property: 'margin-left' },
507
+ ],
508
+ inputOutlineColor: { ...inputField, property: 'outline-color' },
509
+ inputOutlineWidth: { ...inputField, property: 'outline-width' },
510
+ inputOutlineStyle: { ...inputField, property: 'outline-style' },
511
+ inputOutlineOffset: { ...inputField, property: 'outline-offset' },
512
+ inputHorizontalPadding: [
513
+ { ...inputElement, property: 'padding-left' },
514
+ { ...inputElement, property: 'padding-right' },
515
+ { ...inputField, property: 'padding-inline-start' },
516
+ ],
517
+ inputVerticalPadding: [
518
+ { ...inputField, property: 'padding-top' },
519
+ { ...inputField, property: 'padding-bottom' },
520
+ ],
521
+ chipTextColor: { ...chipLabel, property: 'color' },
522
+ chipBackgroundColor: [
523
+ { ...chip, property: 'background-color' },
524
+ { ...overflowChipFirstBorder, property: 'border-color' },
525
+ { ...overflowChipSecondBorder, property: 'border-color' },
526
+ ],
527
+
528
+ labelPosition: { ...label, property: 'position' },
529
+ labelTopPosition: { ...label, property: 'top' },
530
+ labelLeftPosition: { ...label, property: 'left' },
531
+ labelHorizontalPosition: [
532
+ { ...label, property: 'left' },
533
+ { ...label, property: 'right' },
534
+ ],
535
+ inputTransformY: { ...label, property: 'transform' },
536
+ inputTransition: { ...label, property: 'transition' },
537
+ marginInlineStart: { ...label, property: 'margin-inline-start' },
538
+ placeholderOpacity: { ...placeholder, property: 'opacity' },
539
+ inputVerticalAlignment: { ...inputField, property: 'align-items' },
540
+
541
+ overlayBackground: {
542
+ property: () =>
543
+ MultiSelectComboBoxClass.cssVarList.overlay.backgroundColor,
544
+ },
545
+ overlayTextColor: {
546
+ property: () => MultiSelectComboBoxClass.cssVarList.overlay.textColor,
547
+ },
548
+ overlayBorder: {
549
+ property: () => MultiSelectComboBoxClass.cssVarList.overlay.border,
550
+ },
551
+ overlayFontSize: {
552
+ property: () => MultiSelectComboBoxClass.cssVarList.overlay.fontSize,
553
+ },
554
+ overlayFontFamily: {
555
+ property: () => MultiSelectComboBoxClass.cssVarList.overlay.fontFamily,
556
+ },
557
+ overlayCursor: {
558
+ property: () => MultiSelectComboBoxClass.cssVarList.overlay.cursor,
559
+ },
560
+ overlayItemBoxShadow: {
561
+ property: () =>
562
+ MultiSelectComboBoxClass.cssVarList.overlay.itemBoxShadow,
563
+ },
564
+ overlayItemPaddingInlineStart: {
565
+ property: () =>
566
+ MultiSelectComboBoxClass.cssVarList.overlay.itemPaddingInlineStart,
567
+ },
568
+ overlayItemPaddingInlineEnd: {
569
+ property: () =>
570
+ MultiSelectComboBoxClass.cssVarList.overlay.itemPaddingInlineEnd,
571
+ },
572
+ },
573
+ }),
574
+ draggableMixin,
575
+ portalMixin({
576
+ name: 'overlay',
577
+ selector: 'vaadin-multi-select-combo-box-internal',
578
+ mappings: {
579
+ backgroundColor: { selector: 'vaadin-multi-select-combo-box-scroller' },
580
+ minHeight: { selector: 'vaadin-multi-select-combo-box-overlay' },
581
+ margin: { selector: 'vaadin-multi-select-combo-box-overlay' },
582
+ cursor: { selector: 'vaadin-multi-select-combo-box-item' },
583
+ fontFamily: { selector: 'vaadin-multi-select-combo-box-item' },
584
+ textColor: {
585
+ selector: 'vaadin-multi-select-combo-box-item',
586
+ property: 'color',
587
+ },
588
+ fontSize: { selector: 'vaadin-multi-select-combo-box-item' },
589
+ itemBoxShadow: {
590
+ selector: 'vaadin-multi-select-combo-box-item',
591
+ property: 'box-shadow',
592
+ },
593
+ itemPaddingInlineStart: {
594
+ selector: 'vaadin-multi-select-combo-box-item',
595
+ property: 'padding-inline-start',
596
+ },
597
+ itemPaddingInlineEnd: {
598
+ selector: 'vaadin-multi-select-combo-box-item',
599
+ property: 'padding-inline-end',
600
+ },
601
+ },
602
+ forward: {
603
+ include: false,
604
+ attributes: ['size'],
605
+ },
606
+ }),
607
+ proxyInputMixin({
608
+ proxyProps: ['selectionStart'],
609
+ inputEvent: 'selected-items-changed',
610
+ }),
611
+ changeMixin,
612
+ componentNameValidationMixin,
613
+ multiSelectComboBoxMixin,
614
+ )(
615
+ createProxy({
616
+ slots: ['', 'prefix'],
617
+ wrappedEleName: 'vaadin-multi-select-combo-box',
618
+ style: () => `
619
+ :host {
620
+ display: inline-flex;
621
+ box-sizing: border-box;
622
+ -webkit-mask-image: none;
623
+ }
624
+ ${useHostExternalPadding(MultiSelectComboBoxClass.cssVarList)}
625
+ ${resetInputReadonlyStyle('vaadin-multi-select-combo-box')}
626
+ ${resetInputPlaceholder('vaadin-multi-select-combo-box')}
627
+ ${resetInputCursor('vaadin-multi-select-combo-box')}
628
+
629
+ vaadin-multi-select-combo-box {
630
+ padding: 0;
631
+ width: 100%;
632
+ }
633
+ vaadin-multi-select-combo-box::before {
634
+ height: initial;
635
+ }
636
+ vaadin-multi-select-combo-box [slot="input"] {
637
+ -webkit-mask-image: none;
638
+ min-height: 0;
639
+ align-self: center;
640
+ box-sizing: border-box;
641
+ }
642
+ vaadin-multi-select-combo-box[readonly] [slot="input"] {
643
+ flex-grow: 1;
644
+ flex-basis: 4em;
645
+ }
646
+
647
+ ::part(input-field) {
648
+ padding: 0;
649
+ box-shadow: none;
650
+ }
651
+ ${resetInputLabelPosition('vaadin-multi-select-combo-box')}
652
+ :host([has-label]) vaadin-multi-select-combo-box-chip::part(label) {
653
+ display: block;
654
+ }
655
+
656
+ vaadin-multi-select-combo-box vaadin-multi-select-combo-box-chip[slot='overflow']::before,
657
+ vaadin-multi-select-combo-box vaadin-multi-select-combo-box-chip[slot='overflow']::after {
658
+ left: -4px;
659
+ right: -4px;
660
+ border-left-width: 0;
661
+ border-inline-start-style: solid;
662
+ border-inline-start-width: 2px;
663
+ }
664
+ vaadin-multi-select-combo-box vaadin-multi-select-combo-box-chip[slot='overflow']::after {
665
+ left: -8px;
666
+ right: -8px;
667
+ }
668
+
669
+ :host([has-no-options][allow-custom-value='true']) ::part(toggle-button) {
670
+ display: none;
671
+ }
672
+
673
+ ${inputFloatingLabelStyle()}
674
+
675
+ vaadin-multi-select-combo-box::part(toggle-button),
676
+ vaadin-multi-select-combo-box::part(clear-button) {
677
+ align-self: center;
678
+ }
679
+
680
+ vaadin-multi-select-combo-box[label-type="floating"]:not([focused])[readonly] > input:placeholder-shown {
681
+ opacity: 0;
682
+ }
683
+ vaadin-multi-select-combo-box[label-type="floating"]:not([focused])[disabled] > input:placeholder-shown {
684
+ opacity: 0;
685
+ }
686
+
687
+ `,
688
+ excludeAttrsSync: ['tabindex', 'size', 'data', 'placeholder', 'style'],
689
+ componentName,
690
+ includeForwardProps: ['items', 'renderer', 'selectedItems'],
691
+ }),
692
+ );
@@ -0,0 +1,9 @@
1
+ import '@vaadin/multi-select-combo-box';
2
+ import {
3
+ componentName,
4
+ MultiSelectComboBoxClass,
5
+ } from './MultiSelectComboBoxClass';
6
+
7
+ customElements.define(componentName, MultiSelectComboBoxClass);
8
+
9
+ export { MultiSelectComboBoxClass, componentName };