@vonage/vivid 4.10.0 → 4.11.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 (90) hide show
  1. package/custom-elements.json +9103 -6572
  2. package/lib/badge/badge.d.ts +1 -1
  3. package/lib/breadcrumb-item/breadcrumb-item.d.ts +1 -1
  4. package/lib/button/button.d.ts +1 -1
  5. package/lib/checkbox/checkbox.d.ts +5 -3
  6. package/lib/checkbox/checkbox.form-associated.d.ts +10 -0
  7. package/lib/enums.d.ts +1 -0
  8. package/lib/fab/fab.d.ts +1 -1
  9. package/lib/file-picker/file-picker.d.ts +3 -0
  10. package/lib/slider/slider.d.ts +30 -6
  11. package/lib/slider/slider.form-associated.d.ts +10 -0
  12. package/lib/split-button/split-button.d.ts +1 -1
  13. package/lib/tabs/tabs.d.ts +1 -0
  14. package/package.json +1 -1
  15. package/shared/aria-global2.cjs +93 -0
  16. package/shared/aria-global2.js +91 -0
  17. package/shared/breadcrumb-item.cjs +2 -89
  18. package/shared/breadcrumb-item.js +1 -88
  19. package/shared/definition11.cjs +200 -4
  20. package/shared/definition11.js +198 -3
  21. package/shared/definition15.cjs +34 -91
  22. package/shared/definition15.js +35 -92
  23. package/shared/definition16.cjs +9 -7
  24. package/shared/definition16.js +9 -7
  25. package/shared/definition20.cjs +1 -1
  26. package/shared/definition20.js +1 -1
  27. package/shared/definition21.cjs +1 -1
  28. package/shared/definition21.js +1 -1
  29. package/shared/definition24.cjs +156 -2
  30. package/shared/definition24.js +157 -3
  31. package/shared/definition25.cjs +106 -56
  32. package/shared/definition25.js +106 -56
  33. package/shared/definition35.cjs +2 -2
  34. package/shared/definition35.js +2 -2
  35. package/shared/definition37.cjs +1 -1
  36. package/shared/definition37.js +1 -1
  37. package/shared/definition4.cjs +5 -6
  38. package/shared/definition4.js +1 -2
  39. package/shared/definition40.cjs +11 -4
  40. package/shared/definition40.js +8 -1
  41. package/shared/definition42.cjs +3 -22
  42. package/shared/definition42.js +2 -21
  43. package/shared/definition43.cjs +1 -2
  44. package/shared/definition43.js +1 -2
  45. package/shared/definition44.js +1 -1
  46. package/shared/definition47.cjs +369 -502
  47. package/shared/definition47.js +370 -503
  48. package/shared/definition5.cjs +4 -4
  49. package/shared/definition5.js +1 -1
  50. package/shared/definition51.cjs +1 -1
  51. package/shared/definition51.js +1 -1
  52. package/shared/definition52.cjs +63 -26
  53. package/shared/definition52.js +63 -26
  54. package/shared/definition56.cjs +41 -43
  55. package/shared/definition56.js +41 -43
  56. package/shared/definition57.cjs +1 -1
  57. package/shared/definition57.js +1 -1
  58. package/shared/definition64.cjs +242 -79
  59. package/shared/definition64.js +242 -79
  60. package/shared/definition7.cjs +1 -1
  61. package/shared/definition7.js +1 -1
  62. package/shared/definition8.cjs +1 -1
  63. package/shared/definition8.js +1 -1
  64. package/shared/enums.cjs +1 -0
  65. package/shared/enums.js +1 -0
  66. package/shared/form-associated.js +1 -1
  67. package/shared/{patterns → foundation/anchor}/anchor.d.ts +1 -1
  68. package/shared/foundation/button/button.d.ts +27 -0
  69. package/shared/foundation/button/button.template.d.ts +4 -0
  70. package/shared/foundation/button/index.d.ts +2 -0
  71. package/shared/foundation/patterns/index.d.ts +1 -0
  72. package/shared/index.cjs +22 -2
  73. package/shared/index.js +22 -2
  74. package/shared/key-codes2.js +1 -1
  75. package/shared/presentationDate.cjs +4328 -4042
  76. package/shared/presentationDate.js +4327 -4041
  77. package/shared/slider.template.cjs +23 -1
  78. package/shared/slider.template.js +21 -2
  79. package/styles/core/all.css +1 -1
  80. package/styles/core/theme.css +1 -1
  81. package/styles/core/typography.css +1 -1
  82. package/styles/tokens/theme-dark.css +4 -4
  83. package/styles/tokens/theme-light.css +4 -4
  84. package/styles/tokens/vivid-2-compat.css +1 -1
  85. package/vivid.api.json +52 -4
  86. package/shared/aria2.cjs +0 -11
  87. package/shared/aria2.js +0 -9
  88. package/shared/button.cjs +0 -202
  89. package/shared/button.js +0 -200
  90. /package/shared/{patterns → foundation/patterns}/aria-global.d.ts +0 -0
@@ -12,7 +12,7 @@ const when = require('./when.cjs');
12
12
  const ref = require('./ref.cjs');
13
13
  const classNames = require('./class-names.cjs');
14
14
 
15
- const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column}.control{display:flex;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;padding:16px;border:1px dashed var(--vvd-color-neutral-400);border-radius:8px;background-color:var(--vvd-color-cta-50);color:var(--vvd-color-neutral-600);cursor:pointer;font:var(--vvd-typography-base);gap:8px;inline-size:100%;min-block-size:52px;outline:none}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: 1px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.main{pointer-events:none}.dz-preview{display:grid;box-sizing:border-box;padding:8px;border-radius:8px;background-color:var(--file-picker-list-item-background-color, var(--vvd-color-canvas));grid-template-columns:1fr auto;grid-template-rows:auto auto;inline-size:100%}.dz-preview .dz-details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.dz-preview .dz-details .dz-filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.dz-preview .dz-details .dz-size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.dz-preview .dz-error-message{color:var(--vvd-color-alert-500);font:var(--vvd-typography-base-condensed);margin-block-start:4px}.dz-preview:not(.dz-error) .dz-error-message{display:none}.dz-preview.dz-error{border:1px solid var(--vvd-color-alert-500)}.dz-preview.dz-error .dz-details .dz-size,.dz-preview.dz-error .dz-progress{display:none}.dz-preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.message{margin-block-start:4px;--_low-ink-color: var(--vvd-color-neutral-600)}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:empty{display:none}";
15
+ const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column}.control{display:flex;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;padding:16px;border:1px dashed var(--vvd-color-neutral-400);border-radius:8px;background-color:var(--vvd-color-cta-50);color:var(--vvd-color-neutral-600);cursor:pointer;font:var(--vvd-typography-base);gap:8px;inline-size:100%;min-block-size:52px;outline:none;transition:all .3s ease}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: 1px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.control:hover{border-style:solid;background-color:var(--vvd-color-cta-100)}.main{pointer-events:none}.dz-preview{display:grid;box-sizing:border-box;padding:8px;border:1px solid var(--vvd-color-neutral-300);border-radius:8px;background-color:var(--file-picker-list-item-background-color, var(--vvd-color-canvas));grid-template-columns:1fr auto;grid-template-rows:auto auto;inline-size:100%}.dz-preview .dz-details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.dz-preview .dz-details .dz-filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.dz-preview .dz-details .dz-size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.dz-preview .dz-error-message{color:var(--vvd-color-alert-500);font:var(--vvd-typography-base-condensed);margin-block-start:4px}.dz-preview:not(.dz-error) .dz-error-message{display:none}.dz-preview.dz-error{border:1px solid var(--vvd-color-alert-500)}.dz-preview.dz-error .dz-details .dz-size,.dz-preview.dz-error .dz-progress{display:none}.dz-preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.message{margin-block-start:4px;--_low-ink-color: var(--vvd-color-neutral-600)}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:empty{display:none}";
16
16
 
17
17
  var objectExtend = extend;
18
18
 
@@ -2167,18 +2167,56 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
2167
2167
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
2168
2168
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
2169
2169
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
2170
- var _dropzone, _FilePicker_instances, chooseFile_fn, updateHiddenFileInput_fn, handleFilesChanged_fn, updateFormValue_fn, setValueToAFakePathLikeNativeInput_fn, formatNumbersInMessage_fn;
2170
+ var _dropzone, _FilePicker_instances, syncSingleFileState_fn, _localizeErrorMessage, _localizeFileSizeNumberAndUnits, addRemoveButtonToFilesPreview_fn, setRemoveButtonConnotationOnError_fn, chooseFile_fn, updateHiddenFileInput_fn, keepOnlyNewestFile_fn, handleFilesChanged_fn, updateFormValue_fn, setValueToAFakePathLikeNativeInput_fn, formatNumbersInMessage_fn;
2171
2171
  const isFormAssociatedTryingToSetFormValueToFakePath = (value) => typeof value === "string";
2172
+ const generateFilePreviewTemplate = (buttonTag, locale) => {
2173
+ return `<div class="dz-preview dz-file-preview">
2174
+ <div class="dz-details">
2175
+ <div class="dz-filename"><span data-dz-name></span></div>
2176
+ <div class="dz-size"><span data-dz-size></span></div>
2177
+ </div>
2178
+ <div class="dz-error-message"><span data-dz-errormessage></span></div>
2179
+ <${buttonTag} class="remove-btn" icon="delete-line" appearance="ghost" size="condensed" aria-label="${locale.filePicker.removeFileLabel}"></${buttonTag}>
2180
+ </div>`;
2181
+ };
2172
2182
  let FilePicker = class extends FormAssociatedFilePicker {
2173
2183
  constructor() {
2174
2184
  super();
2175
2185
  __privateAdd(this, _FilePicker_instances);
2176
2186
  __privateAdd(this, _dropzone);
2187
+ this.singleFile = false;
2177
2188
  this.maxFileSize = 256;
2189
+ /**
2190
+ * @internal
2191
+ */
2192
+ this.valueChanged = (previous, next) => {
2193
+ super.valueChanged(previous, next);
2194
+ if (next === "" && this.files.length) {
2195
+ this.removeAllFiles();
2196
+ }
2197
+ };
2178
2198
  /**
2179
2199
  * Used internally to hold the tag that button is registered at.
2180
2200
  */
2181
2201
  this.buttonTag = "vwc-button";
2202
+ __privateAdd(this, _localizeErrorMessage, (file, message) => {
2203
+ if (file.previewElement) {
2204
+ file.previewElement.classList.add("dz-error");
2205
+ if (typeof message !== "string" && message.error) {
2206
+ message = message.error;
2207
+ }
2208
+ for (const node of file.previewElement.querySelectorAll(
2209
+ "[data-dz-errormessage]"
2210
+ )) {
2211
+ node.textContent = __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, message);
2212
+ }
2213
+ }
2214
+ });
2215
+ __privateAdd(this, _localizeFileSizeNumberAndUnits, () => {
2216
+ __privateGet(this, _dropzone).filesize = (size) => {
2217
+ return __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, $3ed269f2f0fb224b$export$2e2bcd8739ae039.prototype.filesize.call(__privateGet(this, _dropzone), size));
2218
+ };
2219
+ });
2182
2220
  this.setFormValue = (value, state) => {
2183
2221
  if (isFormAssociatedTryingToSetFormValueToFakePath(value)) {
2184
2222
  return;
@@ -2195,6 +2233,9 @@ let FilePicker = class extends FormAssociatedFilePicker {
2195
2233
  get files() {
2196
2234
  return __privateGet(this, _dropzone)?.getAcceptedFiles() ?? [];
2197
2235
  }
2236
+ singleFileChanged() {
2237
+ __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this);
2238
+ }
2198
2239
  maxFilesChanged(_oldValue, newValue) {
2199
2240
  if (!__privateGet(this, _dropzone)) {
2200
2241
  return;
@@ -2236,62 +2277,18 @@ let FilePicker = class extends FormAssociatedFilePicker {
2236
2277
  addRemoveLinks: false,
2237
2278
  previewsContainer: previewList,
2238
2279
  createImageThumbnails: false,
2239
- // Updated version of default template (https://github.com/dropzone/dropzone/blob/f50d1828ab5df79a76be00d1306cc320e39a27f4/src/preview-template.html)
2240
- previewTemplate: `<div class="dz-preview dz-file-preview">
2241
- <div class="dz-details">
2242
- <div class="dz-filename"><span data-dz-name></span></div>
2243
- <div class="dz-size"><span data-dz-size></span></div>
2244
- </div>
2245
- <div class="dz-error-message"><span data-dz-errormessage></span></div>
2246
- <${this.buttonTag} class="remove-btn" icon="delete-line" appearance="ghost" size="condensed" aria-label="${this.locale.filePicker.removeFileLabel}"></${this.buttonTag}>
2247
- </div>`,
2280
+ previewTemplate: generateFilePreviewTemplate(this.buttonTag, this.locale),
2248
2281
  dictInvalidFileType: this.locale.filePicker.invalidFileTypeError,
2249
2282
  dictMaxFilesExceeded: this.locale.filePicker.maxFilesExceededError,
2250
2283
  dictFileTooBig: this.locale.filePicker.fileTooBigError,
2251
- // Override the default implementation to localize the error messages
2252
- error: (file, message) => {
2253
- if (file.previewElement) {
2254
- file.previewElement.classList.add("dz-error");
2255
- if (typeof message !== "string" && message.error) {
2256
- message = message.error;
2257
- }
2258
- for (const node of file.previewElement.querySelectorAll(
2259
- "[data-dz-errormessage]"
2260
- )) {
2261
- node.textContent = __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, message);
2262
- }
2263
- }
2264
- }
2284
+ error: __privateGet(this, _localizeErrorMessage)
2265
2285
  }));
2266
- __privateGet(this, _dropzone).filesize = (size) => {
2267
- return __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, $3ed269f2f0fb224b$export$2e2bcd8739ae039.prototype.filesize.call(__privateGet(this, _dropzone), size));
2268
- };
2269
- __privateGet(this, _dropzone).on("addedfiles", (files) => {
2270
- for (const file of files) {
2271
- if (file.previewElement) {
2272
- const removeButton = file.previewElement.querySelector(
2273
- ".remove-btn"
2274
- );
2275
- removeButton.addEventListener("click", (e) => {
2276
- e.preventDefault();
2277
- e.stopPropagation();
2278
- __privateGet(this, _dropzone).removeFile(file);
2279
- });
2280
- }
2281
- }
2282
- __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2283
- });
2286
+ __privateGet(this, _localizeFileSizeNumberAndUnits).call(this);
2287
+ __privateMethod(this, _FilePicker_instances, addRemoveButtonToFilesPreview_fn).call(this);
2284
2288
  __privateGet(this, _dropzone).on("removedfile", () => {
2285
2289
  __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2286
2290
  });
2287
- __privateGet(this, _dropzone).on("error", (file) => {
2288
- if (file.previewElement) {
2289
- const removeButton = file.previewElement.querySelector(
2290
- ".remove-btn"
2291
- );
2292
- removeButton.connotation = enums.Connotation.Alert;
2293
- }
2294
- });
2291
+ __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this);
2295
2292
  }
2296
2293
  disconnectedCallback() {
2297
2294
  super.disconnectedCallback();
@@ -2320,24 +2317,74 @@ let FilePicker = class extends FormAssociatedFilePicker {
2320
2317
  super.formResetCallback();
2321
2318
  __privateGet(this, _dropzone).removeAllFiles();
2322
2319
  }
2320
+ /**
2321
+ * Removes all files from the File Picker.
2322
+ */
2323
+ removeAllFiles() {
2324
+ __privateGet(this, _dropzone)?.removeAllFiles();
2325
+ }
2323
2326
  };
2324
2327
  _dropzone = new WeakMap();
2325
2328
  _FilePicker_instances = new WeakSet();
2329
+ syncSingleFileState_fn = function() {
2330
+ if (this.singleFile) {
2331
+ __privateGet(this, _dropzone)?.hiddenFileInput?.removeAttribute("multiple");
2332
+ } else {
2333
+ __privateGet(this, _dropzone)?.hiddenFileInput?.setAttribute("multiple", "multiple");
2334
+ }
2335
+ };
2336
+ _localizeErrorMessage = new WeakMap();
2337
+ _localizeFileSizeNumberAndUnits = new WeakMap();
2338
+ addRemoveButtonToFilesPreview_fn = function() {
2339
+ __privateGet(this, _dropzone).on("addedfiles", (files) => {
2340
+ for (const file of files) {
2341
+ if (file.previewElement) {
2342
+ const removeButton = file.previewElement.querySelector(
2343
+ ".remove-btn"
2344
+ );
2345
+ removeButton.addEventListener("click", (e) => {
2346
+ e.preventDefault();
2347
+ e.stopPropagation();
2348
+ __privateGet(this, _dropzone).removeFile(file);
2349
+ });
2350
+ }
2351
+ }
2352
+ __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2353
+ });
2354
+ __privateMethod(this, _FilePicker_instances, setRemoveButtonConnotationOnError_fn).call(this);
2355
+ };
2356
+ setRemoveButtonConnotationOnError_fn = function() {
2357
+ __privateGet(this, _dropzone).on("error", (file) => {
2358
+ if (file.previewElement) {
2359
+ const removeButton = file.previewElement.querySelector(
2360
+ ".remove-btn"
2361
+ );
2362
+ removeButton.connotation = enums.Connotation.Alert;
2363
+ }
2364
+ });
2365
+ };
2326
2366
  chooseFile_fn = function() {
2327
2367
  if (__privateGet(this, _dropzone).hiddenFileInput) {
2328
2368
  __privateGet(this, _dropzone).hiddenFileInput.click();
2329
2369
  }
2330
2370
  };
2331
2371
  updateHiddenFileInput_fn = function() {
2332
- if (__privateGet(this, _dropzone).hiddenFileInput) {
2333
- __privateGet(this, _dropzone).hiddenFileInput.dispatchEvent(
2334
- new Event("change", { bubbles: false })
2335
- );
2372
+ __privateGet(this, _dropzone).hiddenFileInput.dispatchEvent(
2373
+ new Event("change", { bubbles: false })
2374
+ );
2375
+ };
2376
+ keepOnlyNewestFile_fn = function() {
2377
+ for (let i = 0; i < this.files.length - 1; i++) {
2378
+ __privateGet(this, _dropzone).removeFile(this.files[i]);
2336
2379
  }
2337
2380
  };
2338
2381
  handleFilesChanged_fn = function() {
2382
+ if (this.singleFile && this.files.length >= 1) {
2383
+ __privateMethod(this, _FilePicker_instances, keepOnlyNewestFile_fn).call(this);
2384
+ }
2339
2385
  this.$emit("change");
2340
2386
  __privateMethod(this, _FilePicker_instances, updateFormValue_fn).call(this);
2387
+ requestAnimationFrame(() => __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this));
2341
2388
  };
2342
2389
  updateFormValue_fn = function() {
2343
2390
  const files = this.files;
@@ -2361,6 +2408,9 @@ formatNumbersInMessage_fn = function(message) {
2361
2408
  }
2362
2409
  return message;
2363
2410
  };
2411
+ __decorateClass([
2412
+ index.attr({ attribute: "single-file", mode: "boolean" })
2413
+ ], FilePicker.prototype, "singleFile", 2);
2364
2414
  __decorateClass([
2365
2415
  index.attr({ attribute: "max-files" })
2366
2416
  ], FilePicker.prototype, "maxFiles", 2);
@@ -2386,7 +2436,7 @@ const getClasses = ({ size }) => classNames.classNames("control", "dz-default",
2386
2436
  const FilePickerTemplate = (context) => {
2387
2437
  return index.html`
2388
2438
  ${(x) => {
2389
- x.setButtonTag(context.tagFor(definition.Button));
2439
+ x.setButtonTag(context.tagFor(definition.Button$1));
2390
2440
  }}
2391
2441
  <div class="base" aria-label="${(x) => x.label}">
2392
2442
  ${when.when(
@@ -1,6 +1,6 @@
1
1
  import { F as FoundationElement, a as attr, h as html, r as registerFactory } from './index.js';
2
2
  import { a as iconRegistries } from './definition27.js';
3
- import { B as Button, a as buttonRegistries } from './definition11.js';
3
+ import { c as Button, a as buttonRegistries } from './definition11.js';
4
4
  import { C as Connotation } from './enums.js';
5
5
  import { a as applyMixinsWithObservables } from './applyMixinsWithObservables.js';
6
6
  import { F as FormAssociated } from './form-associated.js';
@@ -10,7 +10,7 @@ import { w as when } from './when.js';
10
10
  import { r as ref } from './ref.js';
11
11
  import { c as classNames } from './class-names.js';
12
12
 
13
- const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column}.control{display:flex;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;padding:16px;border:1px dashed var(--vvd-color-neutral-400);border-radius:8px;background-color:var(--vvd-color-cta-50);color:var(--vvd-color-neutral-600);cursor:pointer;font:var(--vvd-typography-base);gap:8px;inline-size:100%;min-block-size:52px;outline:none}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: 1px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.main{pointer-events:none}.dz-preview{display:grid;box-sizing:border-box;padding:8px;border-radius:8px;background-color:var(--file-picker-list-item-background-color, var(--vvd-color-canvas));grid-template-columns:1fr auto;grid-template-rows:auto auto;inline-size:100%}.dz-preview .dz-details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.dz-preview .dz-details .dz-filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.dz-preview .dz-details .dz-size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.dz-preview .dz-error-message{color:var(--vvd-color-alert-500);font:var(--vvd-typography-base-condensed);margin-block-start:4px}.dz-preview:not(.dz-error) .dz-error-message{display:none}.dz-preview.dz-error{border:1px solid var(--vvd-color-alert-500)}.dz-preview.dz-error .dz-details .dz-size,.dz-preview.dz-error .dz-progress{display:none}.dz-preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.message{margin-block-start:4px;--_low-ink-color: var(--vvd-color-neutral-600)}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:empty{display:none}";
13
+ const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column}.control{display:flex;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;padding:16px;border:1px dashed var(--vvd-color-neutral-400);border-radius:8px;background-color:var(--vvd-color-cta-50);color:var(--vvd-color-neutral-600);cursor:pointer;font:var(--vvd-typography-base);gap:8px;inline-size:100%;min-block-size:52px;outline:none;transition:all .3s ease}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;--focus-inset: 1px;box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px))}.control:hover{border-style:solid;background-color:var(--vvd-color-cta-100)}.main{pointer-events:none}.dz-preview{display:grid;box-sizing:border-box;padding:8px;border:1px solid var(--vvd-color-neutral-300);border-radius:8px;background-color:var(--file-picker-list-item-background-color, var(--vvd-color-canvas));grid-template-columns:1fr auto;grid-template-rows:auto auto;inline-size:100%}.dz-preview .dz-details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.dz-preview .dz-details .dz-filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.dz-preview .dz-details .dz-size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.dz-preview .dz-error-message{color:var(--vvd-color-alert-500);font:var(--vvd-typography-base-condensed);margin-block-start:4px}.dz-preview:not(.dz-error) .dz-error-message{display:none}.dz-preview.dz-error{border:1px solid var(--vvd-color-alert-500)}.dz-preview.dz-error .dz-details .dz-size,.dz-preview.dz-error .dz-progress{display:none}.dz-preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.message{margin-block-start:4px;--_low-ink-color: var(--vvd-color-neutral-600)}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:empty{display:none}";
14
14
 
15
15
  var objectExtend = extend;
16
16
 
@@ -2165,18 +2165,56 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
2165
2165
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
2166
2166
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
2167
2167
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
2168
- var _dropzone, _FilePicker_instances, chooseFile_fn, updateHiddenFileInput_fn, handleFilesChanged_fn, updateFormValue_fn, setValueToAFakePathLikeNativeInput_fn, formatNumbersInMessage_fn;
2168
+ var _dropzone, _FilePicker_instances, syncSingleFileState_fn, _localizeErrorMessage, _localizeFileSizeNumberAndUnits, addRemoveButtonToFilesPreview_fn, setRemoveButtonConnotationOnError_fn, chooseFile_fn, updateHiddenFileInput_fn, keepOnlyNewestFile_fn, handleFilesChanged_fn, updateFormValue_fn, setValueToAFakePathLikeNativeInput_fn, formatNumbersInMessage_fn;
2169
2169
  const isFormAssociatedTryingToSetFormValueToFakePath = (value) => typeof value === "string";
2170
+ const generateFilePreviewTemplate = (buttonTag, locale) => {
2171
+ return `<div class="dz-preview dz-file-preview">
2172
+ <div class="dz-details">
2173
+ <div class="dz-filename"><span data-dz-name></span></div>
2174
+ <div class="dz-size"><span data-dz-size></span></div>
2175
+ </div>
2176
+ <div class="dz-error-message"><span data-dz-errormessage></span></div>
2177
+ <${buttonTag} class="remove-btn" icon="delete-line" appearance="ghost" size="condensed" aria-label="${locale.filePicker.removeFileLabel}"></${buttonTag}>
2178
+ </div>`;
2179
+ };
2170
2180
  let FilePicker = class extends FormAssociatedFilePicker {
2171
2181
  constructor() {
2172
2182
  super();
2173
2183
  __privateAdd(this, _FilePicker_instances);
2174
2184
  __privateAdd(this, _dropzone);
2185
+ this.singleFile = false;
2175
2186
  this.maxFileSize = 256;
2187
+ /**
2188
+ * @internal
2189
+ */
2190
+ this.valueChanged = (previous, next) => {
2191
+ super.valueChanged(previous, next);
2192
+ if (next === "" && this.files.length) {
2193
+ this.removeAllFiles();
2194
+ }
2195
+ };
2176
2196
  /**
2177
2197
  * Used internally to hold the tag that button is registered at.
2178
2198
  */
2179
2199
  this.buttonTag = "vwc-button";
2200
+ __privateAdd(this, _localizeErrorMessage, (file, message) => {
2201
+ if (file.previewElement) {
2202
+ file.previewElement.classList.add("dz-error");
2203
+ if (typeof message !== "string" && message.error) {
2204
+ message = message.error;
2205
+ }
2206
+ for (const node of file.previewElement.querySelectorAll(
2207
+ "[data-dz-errormessage]"
2208
+ )) {
2209
+ node.textContent = __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, message);
2210
+ }
2211
+ }
2212
+ });
2213
+ __privateAdd(this, _localizeFileSizeNumberAndUnits, () => {
2214
+ __privateGet(this, _dropzone).filesize = (size) => {
2215
+ return __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, $3ed269f2f0fb224b$export$2e2bcd8739ae039.prototype.filesize.call(__privateGet(this, _dropzone), size));
2216
+ };
2217
+ });
2180
2218
  this.setFormValue = (value, state) => {
2181
2219
  if (isFormAssociatedTryingToSetFormValueToFakePath(value)) {
2182
2220
  return;
@@ -2193,6 +2231,9 @@ let FilePicker = class extends FormAssociatedFilePicker {
2193
2231
  get files() {
2194
2232
  return __privateGet(this, _dropzone)?.getAcceptedFiles() ?? [];
2195
2233
  }
2234
+ singleFileChanged() {
2235
+ __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this);
2236
+ }
2196
2237
  maxFilesChanged(_oldValue, newValue) {
2197
2238
  if (!__privateGet(this, _dropzone)) {
2198
2239
  return;
@@ -2234,62 +2275,18 @@ let FilePicker = class extends FormAssociatedFilePicker {
2234
2275
  addRemoveLinks: false,
2235
2276
  previewsContainer: previewList,
2236
2277
  createImageThumbnails: false,
2237
- // Updated version of default template (https://github.com/dropzone/dropzone/blob/f50d1828ab5df79a76be00d1306cc320e39a27f4/src/preview-template.html)
2238
- previewTemplate: `<div class="dz-preview dz-file-preview">
2239
- <div class="dz-details">
2240
- <div class="dz-filename"><span data-dz-name></span></div>
2241
- <div class="dz-size"><span data-dz-size></span></div>
2242
- </div>
2243
- <div class="dz-error-message"><span data-dz-errormessage></span></div>
2244
- <${this.buttonTag} class="remove-btn" icon="delete-line" appearance="ghost" size="condensed" aria-label="${this.locale.filePicker.removeFileLabel}"></${this.buttonTag}>
2245
- </div>`,
2278
+ previewTemplate: generateFilePreviewTemplate(this.buttonTag, this.locale),
2246
2279
  dictInvalidFileType: this.locale.filePicker.invalidFileTypeError,
2247
2280
  dictMaxFilesExceeded: this.locale.filePicker.maxFilesExceededError,
2248
2281
  dictFileTooBig: this.locale.filePicker.fileTooBigError,
2249
- // Override the default implementation to localize the error messages
2250
- error: (file, message) => {
2251
- if (file.previewElement) {
2252
- file.previewElement.classList.add("dz-error");
2253
- if (typeof message !== "string" && message.error) {
2254
- message = message.error;
2255
- }
2256
- for (const node of file.previewElement.querySelectorAll(
2257
- "[data-dz-errormessage]"
2258
- )) {
2259
- node.textContent = __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, message);
2260
- }
2261
- }
2262
- }
2282
+ error: __privateGet(this, _localizeErrorMessage)
2263
2283
  }));
2264
- __privateGet(this, _dropzone).filesize = (size) => {
2265
- return __privateMethod(this, _FilePicker_instances, formatNumbersInMessage_fn).call(this, $3ed269f2f0fb224b$export$2e2bcd8739ae039.prototype.filesize.call(__privateGet(this, _dropzone), size));
2266
- };
2267
- __privateGet(this, _dropzone).on("addedfiles", (files) => {
2268
- for (const file of files) {
2269
- if (file.previewElement) {
2270
- const removeButton = file.previewElement.querySelector(
2271
- ".remove-btn"
2272
- );
2273
- removeButton.addEventListener("click", (e) => {
2274
- e.preventDefault();
2275
- e.stopPropagation();
2276
- __privateGet(this, _dropzone).removeFile(file);
2277
- });
2278
- }
2279
- }
2280
- __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2281
- });
2284
+ __privateGet(this, _localizeFileSizeNumberAndUnits).call(this);
2285
+ __privateMethod(this, _FilePicker_instances, addRemoveButtonToFilesPreview_fn).call(this);
2282
2286
  __privateGet(this, _dropzone).on("removedfile", () => {
2283
2287
  __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2284
2288
  });
2285
- __privateGet(this, _dropzone).on("error", (file) => {
2286
- if (file.previewElement) {
2287
- const removeButton = file.previewElement.querySelector(
2288
- ".remove-btn"
2289
- );
2290
- removeButton.connotation = Connotation.Alert;
2291
- }
2292
- });
2289
+ __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this);
2293
2290
  }
2294
2291
  disconnectedCallback() {
2295
2292
  super.disconnectedCallback();
@@ -2318,24 +2315,74 @@ let FilePicker = class extends FormAssociatedFilePicker {
2318
2315
  super.formResetCallback();
2319
2316
  __privateGet(this, _dropzone).removeAllFiles();
2320
2317
  }
2318
+ /**
2319
+ * Removes all files from the File Picker.
2320
+ */
2321
+ removeAllFiles() {
2322
+ __privateGet(this, _dropzone)?.removeAllFiles();
2323
+ }
2321
2324
  };
2322
2325
  _dropzone = new WeakMap();
2323
2326
  _FilePicker_instances = new WeakSet();
2327
+ syncSingleFileState_fn = function() {
2328
+ if (this.singleFile) {
2329
+ __privateGet(this, _dropzone)?.hiddenFileInput?.removeAttribute("multiple");
2330
+ } else {
2331
+ __privateGet(this, _dropzone)?.hiddenFileInput?.setAttribute("multiple", "multiple");
2332
+ }
2333
+ };
2334
+ _localizeErrorMessage = new WeakMap();
2335
+ _localizeFileSizeNumberAndUnits = new WeakMap();
2336
+ addRemoveButtonToFilesPreview_fn = function() {
2337
+ __privateGet(this, _dropzone).on("addedfiles", (files) => {
2338
+ for (const file of files) {
2339
+ if (file.previewElement) {
2340
+ const removeButton = file.previewElement.querySelector(
2341
+ ".remove-btn"
2342
+ );
2343
+ removeButton.addEventListener("click", (e) => {
2344
+ e.preventDefault();
2345
+ e.stopPropagation();
2346
+ __privateGet(this, _dropzone).removeFile(file);
2347
+ });
2348
+ }
2349
+ }
2350
+ __privateMethod(this, _FilePicker_instances, handleFilesChanged_fn).call(this);
2351
+ });
2352
+ __privateMethod(this, _FilePicker_instances, setRemoveButtonConnotationOnError_fn).call(this);
2353
+ };
2354
+ setRemoveButtonConnotationOnError_fn = function() {
2355
+ __privateGet(this, _dropzone).on("error", (file) => {
2356
+ if (file.previewElement) {
2357
+ const removeButton = file.previewElement.querySelector(
2358
+ ".remove-btn"
2359
+ );
2360
+ removeButton.connotation = Connotation.Alert;
2361
+ }
2362
+ });
2363
+ };
2324
2364
  chooseFile_fn = function() {
2325
2365
  if (__privateGet(this, _dropzone).hiddenFileInput) {
2326
2366
  __privateGet(this, _dropzone).hiddenFileInput.click();
2327
2367
  }
2328
2368
  };
2329
2369
  updateHiddenFileInput_fn = function() {
2330
- if (__privateGet(this, _dropzone).hiddenFileInput) {
2331
- __privateGet(this, _dropzone).hiddenFileInput.dispatchEvent(
2332
- new Event("change", { bubbles: false })
2333
- );
2370
+ __privateGet(this, _dropzone).hiddenFileInput.dispatchEvent(
2371
+ new Event("change", { bubbles: false })
2372
+ );
2373
+ };
2374
+ keepOnlyNewestFile_fn = function() {
2375
+ for (let i = 0; i < this.files.length - 1; i++) {
2376
+ __privateGet(this, _dropzone).removeFile(this.files[i]);
2334
2377
  }
2335
2378
  };
2336
2379
  handleFilesChanged_fn = function() {
2380
+ if (this.singleFile && this.files.length >= 1) {
2381
+ __privateMethod(this, _FilePicker_instances, keepOnlyNewestFile_fn).call(this);
2382
+ }
2337
2383
  this.$emit("change");
2338
2384
  __privateMethod(this, _FilePicker_instances, updateFormValue_fn).call(this);
2385
+ requestAnimationFrame(() => __privateMethod(this, _FilePicker_instances, syncSingleFileState_fn).call(this));
2339
2386
  };
2340
2387
  updateFormValue_fn = function() {
2341
2388
  const files = this.files;
@@ -2359,6 +2406,9 @@ formatNumbersInMessage_fn = function(message) {
2359
2406
  }
2360
2407
  return message;
2361
2408
  };
2409
+ __decorateClass([
2410
+ attr({ attribute: "single-file", mode: "boolean" })
2411
+ ], FilePicker.prototype, "singleFile", 2);
2362
2412
  __decorateClass([
2363
2413
  attr({ attribute: "max-files" })
2364
2414
  ], FilePicker.prototype, "maxFiles", 2);
@@ -5,8 +5,8 @@ const definition = require('./definition11.cjs');
5
5
  const definition$1 = require('./definition22.cjs');
6
6
  const applyMixinsWithObservables = require('./applyMixinsWithObservables.cjs');
7
7
  const formAssociated = require('./form-associated.cjs');
8
- const keyCodes = require('./key-codes2.cjs');
9
8
  const textField = require('./text-field2.cjs');
9
+ const keyCodes = require('./key-codes2.cjs');
10
10
  const formElements = require('./form-elements.cjs');
11
11
  const affix = require('./affix.cjs');
12
12
  const localized = require('./localized.cjs');
@@ -346,7 +346,7 @@ function getTabIndex(numberField) {
346
346
  return numberField.disabled || numberField.readOnly ? "-1" : null;
347
347
  }
348
348
  function numberControlButtons(context) {
349
- const buttonTag = context.tagFor(definition.Button);
349
+ const buttonTag = context.tagFor(definition.Button$1);
350
350
  const dividerTag = context.tagFor(definition$1.Divider);
351
351
  return index.html`
352
352
  <div class="control-buttons"
@@ -1,10 +1,10 @@
1
1
  import { F as FoundationElement, D as DOM, a as attr, n as nullableNumberConverter, o as observable, h as html, r as registerFactory } from './index.js';
2
- import { B as Button, a as buttonRegistries } from './definition11.js';
2
+ import { c as Button, a as buttonRegistries } from './definition11.js';
3
3
  import { D as Divider, a as dividerRegistries } from './definition22.js';
4
4
  import { a as applyMixinsWithObservables } from './applyMixinsWithObservables.js';
5
5
  import { F as FormAssociated } from './form-associated.js';
6
- import { c as keyArrowDown, d as keyArrowUp } from './key-codes2.js';
7
6
  import { D as DelegatesARIATextbox } from './text-field2.js';
7
+ import { e as keyArrowDown, f as keyArrowUp } from './key-codes2.js';
8
8
  import { e as errorText, f as formElements, F as FormElementSuccessText, a as FormElementHelperText, b as FormElementCharCount, g as getFeedbackTemplate } from './form-elements.js';
9
9
  import { A as AffixIcon } from './affix.js';
10
10
  import { L as Localized } from './localized.js';
@@ -185,7 +185,7 @@ const getPaginationButtonWidth = (value) => {
185
185
  return `calc(var(--base-size) + ${String(value).length - 1}ch)`;
186
186
  };
187
187
  const PaginationTemplate = (context) => {
188
- const buttonTag = context.tagFor(definition.Button);
188
+ const buttonTag = context.tagFor(definition.Button$1);
189
189
  const paginationButtonTemplate = paginationButtonRenderer(buttonTag);
190
190
  return index.html`
191
191
  <div class="${getClasses}">
@@ -1,4 +1,4 @@
1
- import { B as Button, a as buttonRegistries } from './definition11.js';
1
+ import { c as Button, a as buttonRegistries } from './definition11.js';
2
2
  import { F as FoundationElement, a as attr, o as observable, v as volatile, h as html, r as registerFactory } from './index.js';
3
3
  import { b as Size, S as Shape } from './enums.js';
4
4
  import { e as elements } from './slotted.js';
@@ -1,15 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  const index = require('./index.cjs');
4
- const definition$2 = require('./definition11.cjs');
4
+ const definition$1 = require('./definition11.cjs');
5
5
  const definition = require('./definition63.cjs');
6
- const definition$1 = require('./definition27.cjs');
6
+ const definition$2 = require('./definition27.cjs');
7
7
  const enums = require('./enums.cjs');
8
8
  const affix = require('./affix.cjs');
9
9
  const index$1 = require('./index2.cjs');
10
10
  const localized = require('./localized.cjs');
11
11
  const applyMixins = require('./apply-mixins.cjs');
12
- const button = require('./button.cjs');
13
12
  const when = require('./when.cjs');
14
13
  const classNames = require('./class-names.cjs');
15
14
 
@@ -164,7 +163,7 @@ function renderDismissButton(buttonTag) {
164
163
  }
165
164
  const AlertTemplate = (context) => {
166
165
  const elevationTag = context.tagFor(definition.Elevation);
167
- const buttonTag = context.tagFor(button.Button);
166
+ const buttonTag = context.tagFor(definition$1.Button);
168
167
  return index.html`
169
168
  <${elevationTag} class="elevation" dp='8' exportparts="vvd-theme-alternate">
170
169
  <div
@@ -197,8 +196,8 @@ const alertDefinition = Alert.compose({
197
196
  });
198
197
  const alertRegistries = [
199
198
  alertDefinition(),
200
- ...definition$1.iconRegistries,
201
- ...definition$2.buttonRegistries,
199
+ ...definition$2.iconRegistries,
200
+ ...definition$1.buttonRegistries,
202
201
  ...definition.elevationRegistries
203
202
  ];
204
203
  const registerAlert = index.registerFactory(alertRegistries);
@@ -1,5 +1,5 @@
1
1
  import { F as FoundationElement, a as attr, n as nullableNumberConverter, h as html, r as registerFactory } from './index.js';
2
- import { a as buttonRegistries } from './definition11.js';
2
+ import { B as Button$1, a as buttonRegistries } from './definition11.js';
3
3
  import { E as Elevation, e as elevationRegistries } from './definition63.js';
4
4
  import { a as iconRegistries } from './definition27.js';
5
5
  import { C as Connotation } from './enums.js';
@@ -7,7 +7,6 @@ import { A as AffixIcon, a as affixIconTemplateFactory, I as IconWrapper } from
7
7
  import { h as handleEscapeKeyAndStopPropogation } from './index2.js';
8
8
  import { L as Localized } from './localized.js';
9
9
  import { a as applyMixins } from './apply-mixins.js';
10
- import { B as Button$1 } from './button.js';
11
10
  import { w as when } from './when.js';
12
11
  import { c as classNames } from './class-names.js';
13
12
 
@@ -3,11 +3,18 @@
3
3
  const index = require('./index.cjs');
4
4
  const direction = require('./direction.cjs');
5
5
  const keyCodes = require('./key-codes.cjs');
6
- const aria = require('./aria2.cjs');
7
6
  const radio = require('./radio.cjs');
8
7
  const slotted = require('./slotted.cjs');
9
8
  const when = require('./when.cjs');
10
- const aria$1 = require('./aria.cjs');
9
+ const aria = require('./aria.cjs');
10
+
11
+ /**
12
+ * Standard orientation values
13
+ */
14
+ const Orientation = {
15
+ horizontal: "horizontal",
16
+ vertical: "vertical",
17
+ };
11
18
 
12
19
  /**
13
20
  * An Radio Group Custom HTML Element.
@@ -30,7 +37,7 @@ let RadioGroup$1 = class RadioGroup extends index.FoundationElement {
30
37
  * @remarks
31
38
  * HTML Attribute: orientation
32
39
  */
33
- this.orientation = aria.Orientation.horizontal;
40
+ this.orientation = Orientation.horizontal;
34
41
  this.radioChangeHandler = (e) => {
35
42
  const changedRadio = e.target;
36
43
  if (changedRadio.checked) {
@@ -429,7 +436,7 @@ const RadioGroupTemplate = (context) => {
429
436
  )}
430
437
 
431
438
  <div
432
- class="positioning-region ${(x) => x.orientation === aria$1.Orientation.horizontal ? "horizontal" : "vertical"}"
439
+ class="positioning-region ${(x) => x.orientation === aria.Orientation.horizontal ? "horizontal" : "vertical"}"
433
440
  >
434
441
  <slot
435
442
  ${slotted.slotted({