@vonage/vivid 3.40.0 → 3.41.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 (160) hide show
  1. package/accordion/index.js +2 -2
  2. package/accordion-item/index.js +2 -2
  3. package/alert/index.js +6 -5
  4. package/audio-player/index.js +33 -0
  5. package/avatar/index.js +2 -2
  6. package/badge/index.js +2 -2
  7. package/banner/index.js +8 -5
  8. package/breadcrumb/index.js +1 -1
  9. package/breadcrumb-item/index.js +3 -3
  10. package/button/index.js +4 -4
  11. package/calendar/index.js +1 -1
  12. package/calendar-event/index.js +1 -1
  13. package/card/index.js +4 -3
  14. package/checkbox/index.js +3 -3
  15. package/combobox/index.js +8 -8
  16. package/custom-elements.json +330 -38
  17. package/data-grid/index.js +2 -2
  18. package/date-picker/index.js +9 -9
  19. package/date-range-picker/index.js +8 -8
  20. package/dialog/index.js +6 -6
  21. package/divider/index.js +1 -1
  22. package/elevation/index.js +1 -1
  23. package/empty-state/index.js +2 -2
  24. package/fab/index.js +3 -3
  25. package/file-picker/index.js +5 -5
  26. package/focus/index.js +1 -1
  27. package/header/index.js +2 -2
  28. package/icon/index.js +1 -1
  29. package/index.js +57 -56
  30. package/layout/index.js +1 -1
  31. package/lib/alert/alert.d.ts +3 -1
  32. package/lib/alert/locale.d.ts +3 -0
  33. package/lib/audio-player/audio-player.d.ts +17 -0
  34. package/lib/audio-player/audio-player.template.d.ts +4 -0
  35. package/lib/audio-player/definition.d.ts +4 -0
  36. package/lib/audio-player/locale.d.ts +5 -0
  37. package/lib/banner/banner.d.ts +3 -1
  38. package/lib/banner/locale.d.ts +3 -0
  39. package/lib/card/card.d.ts +3 -0
  40. package/lib/card/card.template.d.ts +1 -1
  41. package/lib/card/definition.d.ts +1 -0
  42. package/lib/checkbox/checkbox.d.ts +1 -0
  43. package/lib/components.d.ts +1 -0
  44. package/lib/enums.d.ts +2 -1
  45. package/lib/selectable-box/selectable-box.d.ts +1 -2
  46. package/lib/split-button/locale.d.ts +3 -0
  47. package/lib/split-button/split-button.d.ts +3 -1
  48. package/listbox/index.js +4 -4
  49. package/locales/en-GB.js +14 -0
  50. package/locales/en-US.js +14 -0
  51. package/locales/ja-JP.js +14 -0
  52. package/locales/zh-CN.js +14 -0
  53. package/menu/index.js +8 -8
  54. package/menu-item/index.js +3 -3
  55. package/nav/index.js +1 -1
  56. package/nav-disclosure/index.js +3 -3
  57. package/nav-item/index.js +3 -3
  58. package/note/index.js +2 -2
  59. package/number-field/index.js +6 -6
  60. package/option/index.js +3 -3
  61. package/package.json +1 -1
  62. package/pagination/index.js +5 -5
  63. package/popup/index.js +6 -6
  64. package/progress/index.js +1 -1
  65. package/progress-ring/index.js +1 -1
  66. package/radio/index.js +2 -2
  67. package/radio-group/index.js +2 -2
  68. package/select/index.js +8 -8
  69. package/selectable-box/index.js +5 -5
  70. package/shared/definition.js +3 -3
  71. package/shared/definition10.js +90 -159
  72. package/shared/definition11.js +151 -29
  73. package/shared/definition12.js +37 -766
  74. package/shared/definition13.js +747 -106
  75. package/shared/definition14.js +121 -198
  76. package/shared/definition15.js +156 -664
  77. package/shared/definition16.js +576 -1137
  78. package/shared/definition17.js +1278 -143
  79. package/shared/definition18.js +64 -305
  80. package/shared/definition19.js +357 -218
  81. package/shared/definition2.js +1 -1
  82. package/shared/definition20.js +259 -67
  83. package/shared/definition21.js +66 -58
  84. package/shared/definition22.js +43 -84
  85. package/shared/definition23.js +76 -2353
  86. package/shared/definition24.js +2362 -45
  87. package/shared/definition25.js +63 -27
  88. package/shared/definition26.js +24 -51
  89. package/shared/definition27.js +36 -822
  90. package/shared/definition28.js +837 -49
  91. package/shared/definition29.js +52 -89
  92. package/shared/definition3.js +1 -1
  93. package/shared/definition30.js +88 -24
  94. package/shared/definition31.js +25 -12
  95. package/shared/definition32.js +12 -52
  96. package/shared/definition33.js +28 -502
  97. package/shared/definition34.js +442 -197
  98. package/shared/definition35.js +260 -186
  99. package/shared/definition36.js +186 -75
  100. package/shared/definition37.js +70 -54
  101. package/shared/definition38.js +65 -421
  102. package/shared/definition39.js +437 -38
  103. package/shared/definition4.js +43 -16
  104. package/shared/definition40.js +32 -680
  105. package/shared/definition41.js +654 -105
  106. package/shared/definition42.js +105 -77
  107. package/shared/definition43.js +74 -567
  108. package/shared/definition44.js +568 -102
  109. package/shared/definition45.js +110 -135
  110. package/shared/definition46.js +153 -17
  111. package/shared/definition47.js +16 -79
  112. package/shared/definition48.js +53 -475
  113. package/shared/definition49.js +493 -25
  114. package/shared/definition5.js +160 -44
  115. package/shared/definition50.js +22 -121
  116. package/shared/definition51.js +113 -271
  117. package/shared/definition52.js +249 -243
  118. package/shared/definition53.js +270 -109
  119. package/shared/definition54.js +84 -74
  120. package/shared/definition55.js +114 -69
  121. package/shared/definition56.js +81 -292
  122. package/shared/definition57.js +302 -13
  123. package/shared/definition58.js +11 -41
  124. package/shared/definition59.js +20 -154
  125. package/shared/definition6.js +43 -33
  126. package/shared/definition60.js +181 -0
  127. package/shared/definition7.js +39 -106
  128. package/shared/definition8.js +122 -38
  129. package/shared/definition9.js +56 -89
  130. package/shared/enums.js +1 -0
  131. package/shared/icon.js +2 -2
  132. package/shared/index2.js +1 -1
  133. package/shared/listbox.js +1 -1
  134. package/shared/localization/Locale.d.ts +8 -0
  135. package/shared/patterns/form-elements/form-elements.d.ts +6 -6
  136. package/shared/presentationDate.js +5 -5
  137. package/shared/text-field.js +1 -1
  138. package/side-drawer/index.js +1 -1
  139. package/slider/index.js +3 -3
  140. package/split-button/index.js +6 -3
  141. package/style.css +248 -208
  142. package/styles/core/all.css +1 -1
  143. package/styles/core/theme.css +1 -1
  144. package/styles/core/typography.css +1 -1
  145. package/styles/tokens/theme-dark.css +4 -4
  146. package/styles/tokens/theme-light.css +4 -4
  147. package/styles/tokens/vivid-2-compat.css +1 -1
  148. package/switch/index.js +3 -3
  149. package/tab/index.js +3 -3
  150. package/tab-panel/index.js +1 -1
  151. package/tabs/index.js +5 -5
  152. package/tag/index.js +3 -3
  153. package/tag-group/index.js +1 -1
  154. package/text-area/index.js +3 -3
  155. package/text-field/index.js +3 -3
  156. package/toggletip/index.js +7 -7
  157. package/tooltip/index.js +7 -7
  158. package/tree-item/index.js +3 -3
  159. package/tree-view/index.js +1 -1
  160. package/vivid.api.json +251 -0
@@ -1,10 +1,16 @@
1
- import { F as FoundationElement, a as attr, h as html, r as registerFactory } from './index.js';
2
- import { a as iconRegistries } from './definition25.js';
3
- import { I as Icon } from './icon.js';
1
+ import { a as attr, F as FoundationElement, o as observable, h as html, r as registerFactory } from './index.js';
2
+ import { B as Button, a as buttonRegistries } from './definition11.js';
3
+ import { S as Slider, a as sliderRegistries } from './definition44.js';
4
+ import { f as focusRegistries } from './definition58.js';
5
+ import './affix.js';
6
+ import './index2.js';
7
+ import { L as Localized } from './localized.js';
8
+ import { a as applyMixins } from './apply-mixins.js';
4
9
  import { w as when } from './when.js';
10
+ import { r as ref } from './ref.js';
5
11
  import { c as classNames } from './class-names.js';
6
12
 
7
- const styles = "/**\n * Do not edit directly\n * Generated on Wed, 01 Nov 2023 12:16:28 GMT\n */\n.base {\n display: inline-flex;\n overflow: hidden;\n align-items: center;\n justify-content: center;\n background-color: var(--_appearance-color-fill);\n block-size: var(--_size);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n color: var(--_appearance-color-text);\n inline-size: var(--_size);\n vertical-align: middle;\n}\n.base.connotation-cta {\n /* @cssprop [--vvd-avatar-cta-primary=var(--vvd-color-cta-500)] */\n --_connotation-color-primary: var(--vvd-avatar-cta-primary, var(--vvd-color-cta-500));\n /* @cssprop [--vvd-avatar-cta-primary-text=var(--vvd-color-canvas)] */\n --_connotation-color-primary-text: var(--vvd-avatar-cta-primary-text, var(--vvd-color-canvas));\n /* @cssprop [--vvd-avatar-cta-firm=var(--vvd-color-cta-600)] */\n --_connotation-color-firm: var(--vvd-avatar-cta-firm, var(--vvd-color-cta-600));\n /* @cssprop [--vvd-avatar-cta-fierce=var(--vvd-color-cta-700)] */\n --_connotation-color-fierce: var(--vvd-avatar-cta-fierce, var(--vvd-color-cta-700));\n /* @cssprop [--vvd-avatar-cta-pale=var(--vvd-color-cta-300)] */\n --_connotation-color-pale: var(--vvd-avatar-cta-pale, var(--vvd-color-cta-300));\n /* @cssprop [--vvd-avatar-cta-soft=var(--vvd-color-cta-100)] */\n --_connotation-color-soft: var(--vvd-avatar-cta-soft, var(--vvd-color-cta-100));\n}\n.base:not(.connotation-cta) {\n /* @cssprop [--vvd-avatar-accent-primary=var(--vvd-color-canvas-text)] */\n --_connotation-color-primary: var(--vvd-avatar-accent-primary, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-avatar-accent-primary-text=var(--vvd-color-canvas)] */\n --_connotation-color-primary-text: var(--vvd-avatar-accent-primary-text, var(--vvd-color-canvas));\n /* @cssprop [--vvd-avatar-accent-firm=var(--vvd-color-canvas-text)] */\n --_connotation-color-firm: var(--vvd-avatar-accent-firm, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-avatar-accent-fierce=var(--vvd-color-neutral-700)] */\n --_connotation-color-fierce: var(--vvd-avatar-accent-fierce, var(--vvd-color-neutral-700));\n /* @cssprop [--vvd-avatar-accent-pale=var(--vvd-color-neutral-300)] */\n --_connotation-color-pale: var(--vvd-avatar-accent-pale, var(--vvd-color-neutral-300));\n /* @cssprop [--vvd-avatar-accent-soft=var(--vvd-color-neutral-100)] */\n --_connotation-color-soft: var(--vvd-avatar-accent-soft, var(--vvd-color-neutral-100));\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-primary-text);\n --_appearance-color-fill: var(--_connotation-color-primary);\n --_appearance-color-outline: transparent;\n}\n.base.appearance-outlined {\n --_appearance-color-text: var(--_connotation-color-firm);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-firm);\n}\n.base.appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base.appearance-subtle {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-soft);\n --_appearance-color-outline: transparent;\n}\n.base.size-condensed {\n --_size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 8));\n}\n.base.size-condensed .initials {\n font: var(--vvd-typography-base-condensed-bold);\n}\n.base.size-condensed .icon {\n font-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 8)) / 2);\n line-height: 1;\n}\n.base.size-expanded {\n --_size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) + 8));\n}\n.base.size-expanded .initials {\n font: var(--vvd-typography-heading-4);\n}\n.base.size-expanded .icon {\n font-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) + 8)) / 2);\n line-height: 1;\n}\n.base:not(.size-condensed, .size-expanded) {\n --_size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2)));\n}\n.base:not(.size-condensed, .size-expanded) .initials {\n font: var(--vvd-typography-base-extended-bold);\n}\n.base:not(.size-condensed, .size-expanded) .icon {\n font-size: calc(calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2))) / 2);\n line-height: 1;\n}\n.base:not(.shape-pill) {\n border-radius: 6px;\n}\n.base.shape-pill {\n border-radius: 50%;\n}\n.base .initials {\n text-transform: uppercase;\n}\n.base ::slotted(*) {\n block-size: 100%;\n inline-size: 100%;\n object-fit: cover;\n}";
13
+ const styles = "/**\n * Do not edit directly\n * Generated on Wed, 22 Nov 2023 16:09:43 GMT\n */\n.base {\n display: inline-flex;\n align-items: center;\n padding: 8px;\n color: var(--vvd-color-canvas-text);\n user-select: none;\n}\n.base .slider {\n min-inline-size: var(--audio-player-min-inline-size, 200px);\n}\n.base .controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n.base .time-stamp {\n display: inline-flex;\n}\n.base .time-stamp .current-time,\n.base .time-stamp .total-time {\n margin-inline: 6px;\n min-inline-size: 32px;\n}";
8
14
 
9
15
  var __defProp = Object.defineProperty;
10
16
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -17,63 +23,173 @@ var __decorateClass = (decorators, target, key, kind) => {
17
23
  __defProp(target, key, result);
18
24
  return result;
19
25
  };
20
- class Avatar extends FoundationElement {
26
+ class AudioPlayer extends FoundationElement {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.playButtonAriaLabel = null;
30
+ this.pauseButtonAriaLabel = null;
31
+ this.sliderAriaLabel = null;
32
+ this.disabled = false;
33
+ this.notime = false;
34
+ this.paused = true;
35
+ /**
36
+ * @internal
37
+ */
38
+ this._rewind = () => {
39
+ this.paused = true;
40
+ if (this._playerEl) {
41
+ this._playerEl.pause();
42
+ this._playerEl.currentTime = this._playerEl.duration * (Number(this._sliderEl.value) / 100);
43
+ }
44
+ };
45
+ }
46
+ connectedCallback() {
47
+ super.connectedCallback();
48
+ this.addEventListener("keydown", this._rewind);
49
+ this.addEventListener("mousedown", this._rewind);
50
+ this.addEventListener("keyup", this._rewind);
51
+ document.addEventListener("mouseup", this._rewind);
52
+ }
53
+ disconnectedCallback() {
54
+ super.disconnectedCallback();
55
+ this.removeEventListener("keydown", this._rewind);
56
+ this.removeEventListener("mousedown", this._rewind);
57
+ this.removeEventListener("keyup", this._rewind);
58
+ document.removeEventListener("mouseup", this._rewind);
59
+ }
60
+ /**
61
+ * @internal
62
+ */
63
+ _togglePlay() {
64
+ if (this.paused) {
65
+ this._updateProgress();
66
+ this._playerEl.play();
67
+ } else {
68
+ this._playerEl.pause();
69
+ }
70
+ this.paused = !this.paused;
71
+ }
72
+ /**
73
+ * @internal
74
+ */
75
+ _updateProgress() {
76
+ let currentTime;
77
+ const current = this._playerEl.currentTime;
78
+ const percent = current / this._playerEl.duration * 100;
79
+ if (this._sliderEl) {
80
+ this._sliderEl.value = percent.toString();
81
+ this._sliderEl.ariaValuetext = this._formatTime(current);
82
+ }
83
+ if (percent === 100) {
84
+ this.paused = true;
85
+ }
86
+ if (this._timeStampEl) {
87
+ currentTime = this._timeStampEl.querySelector(".current-time");
88
+ if (currentTime)
89
+ currentTime.textContent = this._formatTime(current);
90
+ }
91
+ }
92
+ /**
93
+ * @internal
94
+ */
95
+ _updateTotalTime() {
96
+ let totalTime;
97
+ if (this._playerEl)
98
+ this.duration = this._playerEl.duration;
99
+ if (this._timeStampEl) {
100
+ totalTime = this._timeStampEl.querySelector(".total-time");
101
+ if (totalTime)
102
+ totalTime.textContent = this._formatTime(this._playerEl.duration);
103
+ }
104
+ }
105
+ /**
106
+ * @internal
107
+ */
108
+ _formatTime(time) {
109
+ const min = Math.floor(time / 60);
110
+ const sec = Math.floor(time % 60);
111
+ return min + ":" + (sec < 10 ? "0" + sec : sec);
112
+ }
21
113
  }
22
114
  __decorateClass([
23
- attr
24
- ], Avatar.prototype, "connotation", 2);
115
+ attr({ attribute: "play-button-aria-label" })
116
+ ], AudioPlayer.prototype, "playButtonAriaLabel", 2);
25
117
  __decorateClass([
26
- attr
27
- ], Avatar.prototype, "shape", 2);
118
+ attr({ attribute: "pause-button-aria-label" })
119
+ ], AudioPlayer.prototype, "pauseButtonAriaLabel", 2);
28
120
  __decorateClass([
29
- attr
30
- ], Avatar.prototype, "appearance", 2);
121
+ attr({ attribute: "slider-aria-label" })
122
+ ], AudioPlayer.prototype, "sliderAriaLabel", 2);
31
123
  __decorateClass([
32
124
  attr
33
- ], Avatar.prototype, "size", 2);
125
+ ], AudioPlayer.prototype, "connotation", 2);
34
126
  __decorateClass([
35
127
  attr
36
- ], Avatar.prototype, "icon", 2);
128
+ ], AudioPlayer.prototype, "src", 2);
37
129
  __decorateClass([
38
- attr
39
- ], Avatar.prototype, "initials", 2);
130
+ attr({ mode: "boolean" })
131
+ ], AudioPlayer.prototype, "disabled", 2);
132
+ __decorateClass([
133
+ attr({ mode: "boolean" })
134
+ ], AudioPlayer.prototype, "notime", 2);
135
+ __decorateClass([
136
+ observable
137
+ ], AudioPlayer.prototype, "paused", 2);
138
+ __decorateClass([
139
+ observable
140
+ ], AudioPlayer.prototype, "duration", 2);
141
+ applyMixins(AudioPlayer, Localized);
40
142
 
41
- const getClasses = ({ appearance, connotation, shape, size }) => classNames(
42
- "base",
43
- [`connotation-${connotation}`, Boolean(connotation)],
44
- [`appearance-${appearance}`, Boolean(appearance)],
45
- [`shape-${shape}`, Boolean(shape)],
46
- [`size-${size}`, Boolean(size)]
143
+ const getClasses = ({ disabled, duration }) => classNames(
144
+ ["disabled", Boolean(disabled) || !Boolean(duration)]
47
145
  );
48
- function renderIcon(iconTag) {
49
- return html`
50
- <span class="icon">
51
- <${iconTag} name="${(x) => x.icon ? `${x.icon}` : "user-line"}"></${iconTag}>
52
- </span>
53
- `;
146
+ function renderButton(context) {
147
+ const buttonTag = context.tagFor(Button);
148
+ return html`<${buttonTag} class="pause" @click="${(x) => x._togglePlay()}"
149
+ icon="${(x) => x.paused ? "play-solid" : "pause-solid"}"
150
+ aria-label="${(x) => x.paused ? x.playButtonAriaLabel || x.locale.audioPlayer.playButtonLabel : x.pauseButtonAriaLabel || x.locale.audioPlayer.playButtonLabel}"
151
+ size='condensed'
152
+ connotation="${(x) => x.connotation}"
153
+ ?disabled="${(x) => x.disabled || !x.duration}"
154
+ ></${buttonTag}>`;
155
+ }
156
+ function renderSlider(context) {
157
+ const sliderTag = context.tagFor(Slider);
158
+ return html`<${sliderTag}
159
+ ${ref("_sliderEl")} class="slider"
160
+ aria-label="${(x) => x.sliderAriaLabel || x.locale.audioPlayer.sliderLabel}"
161
+ value="0" max="100"
162
+ connotation="${(x) => x.connotation}"
163
+ ?disabled="${(x) => x.disabled || !x.duration}">
164
+ </${sliderTag}>`;
54
165
  }
55
- function renderInitials() {
166
+ function renderTimestamp() {
56
167
  return html`
57
- <span class="initials">${({ initials }) => initials.substring(0, 2)}</span>
58
- `;
168
+ <div class="time-stamp" ${ref("_timeStampEl")}>
169
+ <span class="current-time">0:00</span>
170
+ <span>/</span>
171
+ <span class="total-time">0:00</span>
172
+ </div>`;
59
173
  }
60
- const AvatarTemplate = (context) => {
61
- const iconTag = context.tagFor(Icon);
174
+ const AudioPlayerTemplate = (context) => {
62
175
  return html`
63
- <span class="${getClasses}">
64
- <slot name="graphic">
65
- ${when((x) => x.initials, renderInitials())}
66
- ${when((x) => !x.initials, renderIcon(iconTag))}
67
- </slot>
68
- </span>`;
176
+ <div class="base ${getClasses}">
177
+ <div class="controls">
178
+ ${renderButton(context)}
179
+ ${when((x) => !x.notime, renderTimestamp())}
180
+ ${renderSlider(context)}
181
+ </div>
182
+ <audio ${ref("_playerEl")} src="${(x) => x.src}"
183
+ @timeupdate="${(x) => x._updateProgress()}" @loadedmetadata="${(x) => x._updateTotalTime()}"></audio>
184
+ </div>`;
69
185
  };
70
186
 
71
- const avatarDefinition = Avatar.compose({
72
- baseName: "avatar",
73
- template: AvatarTemplate,
187
+ const audioPlayerDefinition = AudioPlayer.compose({
188
+ baseName: "audio-player",
189
+ template: AudioPlayerTemplate,
74
190
  styles
75
191
  });
76
- const avatarRegistries = [avatarDefinition(), ...iconRegistries];
77
- const registerAvatar = registerFactory(avatarRegistries);
192
+ const audioPlayerRegistries = [audioPlayerDefinition(), ...buttonRegistries, ...sliderRegistries, ...focusRegistries];
193
+ const registerAudioPlayer = registerFactory(audioPlayerRegistries);
78
194
 
79
- export { avatarDefinition as a, avatarRegistries as b, registerAvatar as r };
195
+ export { audioPlayerDefinition as a, audioPlayerRegistries as b, registerAudioPlayer as r };
@@ -1,13 +1,8 @@
1
1
  import { a as attr, F as FoundationElement, h as html, r as registerFactory } from './index.js';
2
- import { a as iconRegistries } from './definition25.js';
3
- import { f as focusRegistries } from './definition57.js';
4
- import { A as AffixIcon, a as affixIconTemplateFactory, I as IconWrapper } from './affix.js';
5
- import { a as applyMixins } from './apply-mixins.js';
6
- import { f as focusTemplateFactory } from './focus2.js';
7
- import { I as Icon } from './icon.js';
8
- import { w as when } from './when.js';
9
2
  import { c as classNames } from './class-names.js';
10
3
 
4
+ const styles = ".base {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}";
5
+
11
6
  var __defProp = Object.defineProperty;
12
7
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
13
8
  var __decorateClass = (decorators, target, key, kind) => {
@@ -19,129 +14,35 @@ var __decorateClass = (decorators, target, key, kind) => {
19
14
  __defProp(target, key, result);
20
15
  return result;
21
16
  };
22
- class Tag extends FoundationElement {
17
+ class TagGroup extends FoundationElement {
23
18
  constructor() {
24
19
  super(...arguments);
25
- this.removable = false;
26
- this.disabled = false;
27
- this.selectable = false;
28
- this.selected = false;
29
- this.#select = () => {
30
- if (!this.selectable || this.disabled) {
31
- return;
32
- }
33
- this.selected = !this.selected;
34
- this.$emit("selected-change");
35
- };
36
- }
37
- remove() {
38
- if (!this.removable || this.selectable) {
39
- return;
40
- }
41
- this.$emit("removed");
42
- this.parentElement && this.parentElement.removeChild(this);
43
- }
44
- #select;
45
- handleKeydown(e) {
46
- if (e.key === "Enter") {
47
- this.#select();
48
- }
49
- if (e.key === "Delete" || e.key === "Backspace") {
50
- this.remove();
51
- }
52
- return true;
53
- }
54
- handleClick() {
55
- this.#select();
20
+ this.ariaLabel = null;
56
21
  }
57
22
  }
58
23
  __decorateClass([
59
- attr
60
- ], Tag.prototype, "connotation", 2);
61
- __decorateClass([
62
- attr
63
- ], Tag.prototype, "shape", 2);
64
- __decorateClass([
65
- attr
66
- ], Tag.prototype, "appearance", 2);
67
- __decorateClass([
68
- attr
69
- ], Tag.prototype, "label", 2);
70
- __decorateClass([
71
- attr({ mode: "boolean" })
72
- ], Tag.prototype, "removable", 2);
73
- __decorateClass([
74
- attr({ mode: "boolean" })
75
- ], Tag.prototype, "disabled", 2);
76
- __decorateClass([
77
- attr({ mode: "boolean" })
78
- ], Tag.prototype, "selectable", 2);
79
- __decorateClass([
80
- attr({ mode: "boolean" })
81
- ], Tag.prototype, "selected", 2);
82
- applyMixins(Tag, AffixIcon);
83
-
84
- const styles = "/**\n * Do not edit directly\n * Generated on Wed, 01 Nov 2023 12:16:28 GMT\n */\n.base {\n --tag-block-size: calc(1px * (40 + 4 * clamp(-1, var(--vvd-size-density, 0), 2) - 16));\n position: relative;\n display: inline-flex;\n box-sizing: border-box;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n block-size: var(--tag-block-size);\n box-shadow: inset 0 0 0 1px var(--_appearance-color-outline);\n color: var(--_appearance-color-text);\n column-gap: 8px;\n font: var(--vvd-typography-base-bold);\n max-inline-size: 100%;\n padding-inline: 8px;\n vertical-align: middle;\n /* Shape */\n}\n.base.connotation-cta {\n /* @cssprop [--vvd-tag-cta-contrast=var(--vvd-color-cta-800)] */\n --_connotation-color-contrast: var(--vvd-tag-cta-contrast, var(--vvd-color-cta-800));\n /* @cssprop [--vvd-tag-cta-soft=var(--vvd-color-cta-100)] */\n --_connotation-color-soft: var(--vvd-tag-cta-soft, var(--vvd-color-cta-100));\n /* @cssprop [--vvd-tag-cta-pale=var(--vvd-color-cta-300)] */\n --_connotation-color-pale: var(--vvd-tag-cta-pale, var(--vvd-color-cta-300));\n /* @cssprop [--vvd-tag-cta-fierce=var(--vvd-color-cta-700)] */\n --_connotation-color-fierce: var(--vvd-tag-cta-fierce, var(--vvd-color-cta-700));\n /* @cssprop [--vvd-tag-cta-firm=var(--vvd-color-cta-600)] */\n --_connotation-color-firm: var(--vvd-tag-cta-firm, var(--vvd-color-cta-600));\n /* @cssprop [--vvd-tag-cta-faint=var(--vvd-color-cta-50)] */\n --_connotation-color-faint: var(--vvd-tag-cta-faint, var(--vvd-color-cta-50));\n /* @cssprop [--vvd-tag-cta-dim=var(--vvd-color-cta-200)] */\n --_connotation-color-dim: var(--vvd-tag-cta-dim, var(--vvd-color-cta-200));\n}\n.base:not(.connotation-cta) {\n /* @cssprop [--vvd-tag-accent-contrast=var(--vvd-color-neutral-800)] */\n --_connotation-color-contrast: var(--vvd-tag-accent-contrast, var(--vvd-color-neutral-800));\n /* @cssprop [--vvd-tag-accent-soft=var(--vvd-color-neutral-100)] */\n --_connotation-color-soft: var(--vvd-tag-accent-soft, var(--vvd-color-neutral-100));\n /* @cssprop [--vvd-tag-accent-pale=var(--vvd-color-neutral-300)] */\n --_connotation-color-pale: var(--vvd-tag-accent-pale, var(--vvd-color-neutral-300));\n /* @cssprop [--vvd-tag-accent-fierce=var(--vvd-color-neutral-700)] */\n --_connotation-color-fierce: var(--vvd-tag-accent-fierce, var(--vvd-color-neutral-700));\n /* @cssprop [--vvd-tag-accent-firm=var(--vvd-color-canvas-text)] */\n --_connotation-color-firm: var(--vvd-tag-accent-firm, var(--vvd-color-canvas-text));\n /* @cssprop [--vvd-tag-accent-faint=var(--vvd-color-neutral-50)] */\n --_connotation-color-faint: var(--vvd-tag-accent-faint, var(--vvd-color-neutral-50));\n /* @cssprop [--vvd-tag-accent-dim=var(--vvd-color-neutral-200)] */\n --_connotation-color-dim: var(--vvd-tag-accent-dim, var(--vvd-color-neutral-200));\n}\n.base {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-soft);\n --_appearance-color-outline: transparent;\n}\n.base.appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: transparent;\n}\n.base:where(:hover, .hover):where(:not(:disabled, .disabled, .readonly)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--_connotation-color-firm);\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-dim);\n --_appearance-color-outline: transparent;\n}\n.base:where(:active, .active):where(:not(:disabled, .disabled)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:where(:disabled, .disabled) {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: var(--vvd-color-neutral-100);\n --_appearance-color-outline: transparent;\n}\n.base:where(:disabled, .disabled).appearance-duotone {\n --_appearance-color-text: var(--vvd-color-neutral-300);\n --_appearance-color-fill: transparent;\n --_appearance-color-outline: var(--vvd-color-neutral-100);\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)) {\n --_appearance-color-text: var(--_connotation-color-contrast);\n --_appearance-color-fill: var(--_connotation-color-pale);\n --_appearance-color-outline: transparent;\n}\n.base:where(.selected, [aria-current]):where(:not(:disabled, .disabled, :hover, .hover)).appearance-duotone {\n --_appearance-color-text: var(--_connotation-color-fierce);\n --_appearance-color-fill: var(--_connotation-color-faint);\n --_appearance-color-outline: var(--_connotation-color-pale);\n}\n.base:not(.shape-pill) {\n border-radius: 4px;\n}\n.base.shape-pill {\n border-radius: 14px;\n}\n@supports selector(:focus-visible) {\n .base:focus-visible {\n outline: none;\n }\n}\n@supports (user-select: none) {\n .base {\n user-select: none;\n }\n}\n.base:not(.disabled) {\n cursor: pointer;\n}\n.base.disabled {\n cursor: not-allowed;\n pointer-events: none;\n}\n.base.removable {\n cursor: auto;\n}\n\n.label {\n overflow: hidden;\n max-inline-size: 100%;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\nslot[name=icon] {\n font-size: calc(var(--tag-block-size) / 1.5);\n line-height: 1;\n}\n\n.dismiss-button {\n display: flex;\n align-items: center;\n background-color: var(--_appearance-color-fill);\n border-radius: inherit;\n cursor: pointer;\n}\n\n.focus-indicator {\n --focus-stroke-gap-color: transparent;\n}\n.base:not(:focus-visible) .focus-indicator {\n display: none;\n}";
24
+ attr({ attribute: "aria-label" })
25
+ ], TagGroup.prototype, "ariaLabel", 2);
85
26
 
86
- const getClasses = ({
87
- connotation,
88
- appearance,
89
- shape,
90
- disabled,
91
- selectable,
92
- removable,
93
- selected
94
- }) => classNames(
95
- "base",
96
- ["disabled", disabled],
97
- ["selectable", selectable],
98
- ["active", selectable && selected],
99
- ["removable", removable && !selectable],
100
- [`connotation-${connotation}`, Boolean(connotation)],
101
- [`appearance-${appearance}`, Boolean(appearance)],
102
- [`shape-${shape}`, Boolean(shape)]
27
+ const getClasses = (_) => classNames(
28
+ "base"
103
29
  );
104
- function renderDismissButton(iconTag) {
30
+ const TagGroupTemplate = () => {
105
31
  return html`
106
- <span
107
- aria-hidden="true"
108
- class="dismiss-button"
109
- @click="${(x) => x.remove()}">
110
- <${iconTag} name="close-line"></${iconTag}>
111
- </span>`;
112
- }
113
- const tagTemplate = (context) => {
114
- const affixIconTemplate = affixIconTemplateFactory(context);
115
- const iconTag = context.tagFor(Icon);
116
- const focusTemplate = focusTemplateFactory(context);
117
- return html`
118
- <span class="${getClasses}"
119
- role="option"
120
- aria-disabled="${(x) => x.disabled}"
121
- aria-selected="${(x) => x.selectable}"
122
- tabindex="${(x) => x.disabled ? null : 0}"
123
- @keydown="${(x, c) => x.handleKeydown(c.event)}"
124
- @click="${(x) => x.handleClick()}">
125
- ${(x) => affixIconTemplate(x.icon, IconWrapper.Slot)}
126
- ${when((x) => x.label, (x) => html`<span class="label">${x.label}</span>`)}
127
- ${when((x) => x.removable && !x.selectable, renderDismissButton(iconTag))}
128
- ${when(
129
- (x) => x.selectable && x.selected,
130
- html`<${iconTag} class="selectable-icon" name="check-circle-solid"></${iconTag}>`
131
- )}
132
- ${() => focusTemplate}
133
- </span>`;
32
+ <div class="${getClasses}" role="listbox" aria-orientation="horizontal" aria-label="${(x) => x.ariaLabel}">
33
+ <slot></slot>
34
+ </div>
35
+ `;
134
36
  };
135
37
 
136
- const tagDefinition = Tag.compose({
137
- baseName: "tag",
138
- template: tagTemplate,
139
- styles,
140
- shadowOptions: {
141
- delegatesFocus: true
38
+ const tagGroupDefinition = TagGroup.compose(
39
+ {
40
+ baseName: "tag-group",
41
+ template: TagGroupTemplate,
42
+ styles
142
43
  }
143
- });
144
- const tagRegistries = [tagDefinition(), ...iconRegistries, ...focusRegistries];
145
- const registerTag = registerFactory(tagRegistries);
44
+ );
45
+ const tagGroupRegistries = [tagGroupDefinition()];
46
+ const registerTagGroup = registerFactory(tagGroupRegistries);
146
47
 
147
- export { registerTag as r, tagDefinition as t };
48
+ export { tagGroupRegistries as a, registerTagGroup as r, tagGroupDefinition as t };