@vonage/vivid 5.1.0 → 5.2.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 (102) hide show
  1. package/audio-player/definition.cjs +37 -4
  2. package/audio-player/definition.js +37 -4
  3. package/audio-player/index.cjs +25 -25
  4. package/audio-player/index.js +86 -62
  5. package/bundled/definition13.cjs +2 -2
  6. package/bundled/definition13.js +4 -4
  7. package/bundled/definition19.cjs +18 -15
  8. package/bundled/definition19.js +85 -77
  9. package/bundled/definition6.cjs +6 -6
  10. package/bundled/definition6.js +34 -31
  11. package/bundled/localized.cjs +1 -1
  12. package/bundled/localized.js +2 -1
  13. package/bundled/picker-field.template.cjs +18 -13
  14. package/bundled/picker-field.template.js +44 -36
  15. package/bundled/text-field.cjs +1 -1
  16. package/bundled/text-field.js +1 -1
  17. package/bundled/vivid-element.cjs +1 -1
  18. package/bundled/vivid-element.js +1 -1
  19. package/bundled/with-contextual-help.cjs +1 -1
  20. package/bundled/with-contextual-help.js +17 -7
  21. package/combobox/definition.cjs +12 -5
  22. package/combobox/definition.js +12 -5
  23. package/combobox/index.cjs +15 -11
  24. package/combobox/index.js +83 -76
  25. package/custom-elements.json +95 -3
  26. package/dial-pad/definition.cjs +51 -1
  27. package/dial-pad/definition.js +52 -2
  28. package/dial-pad/index.cjs +21 -18
  29. package/dial-pad/index.js +123 -92
  30. package/file-picker/definition.cjs +14 -5
  31. package/file-picker/definition.js +15 -6
  32. package/file-picker/index.cjs +12 -9
  33. package/file-picker/index.js +102 -92
  34. package/lib/audio-player/audio-player.d.ts +4 -0
  35. package/lib/combobox/combobox.d.ts +483 -66
  36. package/lib/date-picker/date-picker.d.ts +839 -827
  37. package/lib/date-range-picker/date-range-picker.d.ts +580 -574
  38. package/lib/date-time-picker/date-time-picker.d.ts +863 -851
  39. package/lib/dial-pad/dial-pad.template.d.ts +1 -1
  40. package/lib/dial-pad/locale.d.ts +1 -0
  41. package/lib/file-picker/file-picker.d.ts +483 -66
  42. package/lib/menu/menu.d.ts +1 -0
  43. package/lib/number-field/number-field.d.ts +1 -0
  44. package/lib/searchable-select/searchable-select.d.ts +505 -88
  45. package/lib/select/select.d.ts +470 -53
  46. package/lib/text-area/text-area.d.ts +1 -0
  47. package/lib/text-field/text-field.d.ts +1 -0
  48. package/lib/time-picker/time-picker.d.ts +551 -545
  49. package/locales/de-DE.cjs +2 -1
  50. package/locales/de-DE.js +2 -1
  51. package/locales/en-GB.cjs +2 -1
  52. package/locales/en-GB.js +2 -1
  53. package/locales/en-US.cjs +2 -1
  54. package/locales/en-US.js +2 -1
  55. package/locales/ja-JP.cjs +2 -1
  56. package/locales/ja-JP.js +2 -1
  57. package/locales/zh-CN.cjs +2 -1
  58. package/locales/zh-CN.js +2 -1
  59. package/menu/definition.cjs +6 -2
  60. package/menu/definition.js +7 -3
  61. package/number-field/definition.cjs +2 -2
  62. package/number-field/definition.js +3 -3
  63. package/number-field/index.cjs +9 -9
  64. package/number-field/index.js +28 -27
  65. package/package.json +1 -1
  66. package/searchable-select/definition.cjs +27 -18
  67. package/searchable-select/definition.js +28 -19
  68. package/searchable-select/index.cjs +28 -25
  69. package/searchable-select/index.js +150 -141
  70. package/select/definition.cjs +14 -6
  71. package/select/definition.js +14 -6
  72. package/shared/patterns/form-elements/index.d.ts +1 -0
  73. package/shared/patterns/form-elements/with-contextual-help.d.ts +1 -0
  74. package/shared/picker-field/mixins/calendar-picker.d.ts +442 -439
  75. package/shared/picker-field/mixins/calendar-picker.template.d.ts +442 -439
  76. package/shared/picker-field/mixins/min-max-calendar-picker.d.ts +584 -578
  77. package/shared/picker-field/mixins/single-date-picker.d.ts +696 -687
  78. package/shared/picker-field/mixins/single-value-picker.d.ts +441 -438
  79. package/shared/picker-field/mixins/time-selection-picker.d.ts +562 -556
  80. package/shared/picker-field/mixins/time-selection-picker.template.d.ts +551 -545
  81. package/shared/picker-field/picker-field.d.ts +483 -66
  82. package/styles/core/all.css +1 -1
  83. package/styles/core/theme.css +1 -1
  84. package/styles/core/typography.css +1 -1
  85. package/styles/tokens/theme-dark.css +4 -4
  86. package/styles/tokens/theme-light.css +4 -4
  87. package/styles/tokens/vivid-2-compat.css +1 -1
  88. package/text-area/definition.cjs +1 -1
  89. package/text-area/definition.js +1 -1
  90. package/text-area/index.cjs +1 -1
  91. package/text-area/index.js +1 -1
  92. package/text-field/definition.cjs +1 -1
  93. package/text-field/definition.js +1 -1
  94. package/unbundled/picker-field.template.cjs +11 -3
  95. package/unbundled/picker-field.template.js +11 -3
  96. package/unbundled/text-field.cjs +1 -1
  97. package/unbundled/text-field.js +1 -1
  98. package/unbundled/vivid-element.cjs +1 -1
  99. package/unbundled/vivid-element.js +1 -1
  100. package/unbundled/with-contextual-help.cjs +11 -0
  101. package/unbundled/with-contextual-help.js +11 -0
  102. package/vivid.api.json +30 -0
@@ -2,7 +2,8 @@ import { B as Button, b as buttonDefinition } from '../unbundled/definition.js';
2
2
  import { VwcTextFieldElement as TextField, textFieldDefinition } from '../text-field/definition.js';
3
3
  import { V as VividElement, d as defineVividComponent, c as createRegisterFunction } from '../unbundled/vivid-element.js';
4
4
  import { VwcIconElement as Icon, iconDefinition } from '../icon/definition.js';
5
- import { attr, when, html, repeat, ref } from '@microsoft/fast-element';
5
+ import { VwcVisuallyHiddenElement as VisuallyHidden, visuallyHiddenDefinition } from '../visually-hidden/definition.js';
6
+ import { attr, observable, when, html, repeat, ref } from '@microsoft/fast-element';
6
7
  import { L as Localized } from '../unbundled/localized.js';
7
8
  import { classNames, keyEnter } from '@microsoft/fast-web-utilities';
8
9
 
@@ -36,9 +37,22 @@ class DialPad extends Localized(VividElement) {
36
37
  * @internal
37
38
  */
38
39
  this._onDial = () => {
40
+ const invalid = !this._textFieldEl.checkValidity();
41
+ if (invalid) {
42
+ this._announceValidationError(
43
+ this._textFieldEl.errorValidationMessage ?? ""
44
+ );
45
+ } else {
46
+ this._clearErrorAnnouncement();
47
+ }
39
48
  this.callActive ? this.$emit("end-call") : this.$emit("dial");
40
49
  };
41
50
  this.autofocus = false;
51
+ this._errorAnnouncement = "";
52
+ /**
53
+ * @internal
54
+ */
55
+ this._forceAnnouncementToggle = false;
42
56
  }
43
57
  valueChanged(_oldValue, newValue) {
44
58
  if (newValue !== void 0 && newValue !== null && this._textFieldEl && newValue !== this._textFieldEl.value) {
@@ -56,6 +70,27 @@ class DialPad extends Localized(VividElement) {
56
70
  const firstFocusableEl = this._textFieldEl || digitBtns?.[0];
57
71
  firstFocusableEl?.focus();
58
72
  }
73
+ /**
74
+ * @internal
75
+ */
76
+ _announceValidationError(message) {
77
+ this._errorAnnouncement = "";
78
+ window.queueMicrotask(() => {
79
+ if (message) {
80
+ this._forceAnnouncementToggle = !this._forceAnnouncementToggle;
81
+ this._errorAnnouncement = `${message}${this._forceAnnouncementToggle ? "​" : ""}`;
82
+ } else {
83
+ this._clearErrorAnnouncement();
84
+ }
85
+ });
86
+ }
87
+ /**
88
+ * @internal
89
+ */
90
+ _clearErrorAnnouncement() {
91
+ this._errorAnnouncement = "";
92
+ this._forceAnnouncementToggle = false;
93
+ }
59
94
  }
60
95
  __decorateClass([
61
96
  attr({ attribute: "helper-text" })
@@ -93,6 +128,9 @@ __decorateClass([
93
128
  __decorateClass([
94
129
  attr({ mode: "boolean" })
95
130
  ], DialPad.prototype, "autofocus");
131
+ __decorateClass([
132
+ observable
133
+ ], DialPad.prototype, "_errorAnnouncement");
96
134
 
97
135
  class DialPadButton {
98
136
  constructor(value, label, ariaLabel, icon, id) {
@@ -236,14 +274,21 @@ function renderDialButton(buttonTag) {
236
274
  label="${(x) => x.callActive ? x.endCallButtonLabel || x.locale.dialPad.endCallButtonLabel : x.callButtonLabel || x.locale.dialPad.callButtonLabel}">
237
275
  </${buttonTag}>`;
238
276
  }
277
+ function renderErrorAnnouncement(visuallyHiddenTag) {
278
+ return html`<${visuallyHiddenTag} role="alert" aria-atomic="true">
279
+ ${(x) => `${x.locale.dialPad.errorLabel} ${x._errorAnnouncement}`}
280
+ </${visuallyHiddenTag}>`;
281
+ }
239
282
  const DialPadTemplate = (context) => {
240
283
  const buttonTag = context.tagFor(Button);
241
284
  const iconTag = context.tagFor(Icon);
242
285
  const textFieldTag = context.tagFor(TextField);
286
+ const visuallyHiddenTag = context.tagFor(VisuallyHidden);
243
287
  return html` <div class="${getClasses}">
244
288
  ${when((x) => !x.noInput, renderTextField(textFieldTag, buttonTag))}
245
289
  <div class="digits">${renderDigits(buttonTag, iconTag)}</div>
246
290
  ${when((x) => !x.noCall, renderDialButton(buttonTag))}
291
+ ${renderErrorAnnouncement(visuallyHiddenTag)}
247
292
  </div>`;
248
293
  };
249
294
 
@@ -251,7 +296,12 @@ const dialPadDefinition = defineVividComponent(
251
296
  "dial-pad",
252
297
  DialPad,
253
298
  DialPadTemplate,
254
- [buttonDefinition, textFieldDefinition, iconDefinition],
299
+ [
300
+ buttonDefinition,
301
+ textFieldDefinition,
302
+ iconDefinition,
303
+ visuallyHiddenDefinition
304
+ ],
255
305
  {
256
306
  styles
257
307
  }
@@ -1,25 +1,25 @@
1
- "use strict";const b=require("../bundled/definition3.cjs"),f=require("../bundled/definition13.cjs"),l=require("../bundled/vivid-element.cjs"),h=require("../bundled/definition2.cjs"),m=require("../bundled/localized.cjs"),$=require("../bundled/class-names.cjs"),s=require("../bundled/when.cjs"),_=require("../bundled/repeat.cjs"),x=require("../bundled/ref.cjs"),y=require("../bundled/key-codes.cjs"),w=":host{display:inline-block;margin:16px;inline-size:230px}.base{display:grid;box-sizing:border-box;grid-template-rows:80px 1fr auto}.base.no-input{grid-template-rows:1fr auto}.digits{display:grid;gap:16px;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(4,1fr);inline-size:100%}.phone-field{align-self:flex-start;grid-column:1/-1}.digit-btn{--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-pale)}@media (hover: hover){.digit-btn:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}}.digit-btn.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}.digit-btn:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn{--_connotation-color-contrast: var(--vvd-dial-pad-accent-contrast, var(--vvd-color-neutral-800));--_connotation-color-soft: var(--vvd-dial-pad-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-dial-pad-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-fierce: var(--vvd-dial-pad-accent-fierce, var(--vvd-color-neutral-700));--_connotation-color-firm-all: var(--vvd-dial-pad-accent-firm-all, var(--vvd-color-neutral-600));--_connotation-color-faint: var(--vvd-dial-pad-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-dim: var(--vvd-dial-pad-accent-dim, var(--vvd-color-neutral-200))}.digit-btn{--vvd-button-accent-firm: var(--_appearance-color-text);display:flex;overflow:hidden;flex-direction:column;border-radius:16px;box-shadow:0 0 0 1px var(--_appearance-color-outline);inline-size:100%}.digit-btn:not(.disabled) .digit-btn-num{color:var(--vvd-color-canvas-text)}.digit-btn:focus-within{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.call-btn{margin-top:32px;grid-column:1/-1}";var L=Object.defineProperty,c=(a,t,e,o)=>{for(var n=void 0,d=a.length-1,p;d>=0;d--)(p=a[d])&&(n=p(t,e,n)||n);return n&&L(t,e,n),n};class i extends m.Localized(l.VividElement){constructor(){super(...arguments),this.helperText=null,this.placeholder=null,this.value="",this.pattern="^[0-9#*]*$",this.disabled=!1,this.pending=!1,this.callActive=!1,this.noCall=!1,this.noInput=!1,this.endCallButtonLabel=null,this.callButtonLabel=null,this._onDial=()=>{this.callActive?this.$emit("end-call"):this.$emit("dial")},this.autofocus=!1}valueChanged(t,e){e!=null&&this._textFieldEl&&e!==this._textFieldEl.value&&(this._textFieldEl.value=e,this._textFieldEl.reportValidity())}focus(){const t=this.shadowRoot?.querySelectorAll(".digits .digit-btn");(this._textFieldEl||t?.[0])?.focus()}}c([l.attr({attribute:"helper-text"})],i.prototype,"helperText");c([l.attr],i.prototype,"placeholder");c([l.attr({mode:"fromView"})],i.prototype,"value");c([l.attr({mode:"fromView"})],i.prototype,"pattern");c([l.attr({mode:"boolean"})],i.prototype,"disabled");c([l.attr({mode:"boolean"})],i.prototype,"pending");c([l.attr({attribute:"call-active",mode:"boolean"})],i.prototype,"callActive");c([l.attr({mode:"boolean",attribute:"no-call"})],i.prototype,"noCall");c([l.attr({mode:"boolean",attribute:"no-input"})],i.prototype,"noInput");c([l.attr({attribute:"end-call-button-label"})],i.prototype,"endCallButtonLabel");c([l.attr({attribute:"call-button-label"})],i.prototype,"callButtonLabel");c([l.attr({mode:"boolean"})],i.prototype,"autofocus");class r{constructor(t,e,o,n,d){this.value=t,this.label=e,this.ariaLabel=o,this.icon=n,this.id=d}}const g=[new r("1","&nbsp;","digitOneLabel","one-solid","btn1"),new r("2","ABC","digitTwoLabel","two-solid","btn2"),new r("3","DEF","digitThreeLabel","three-solid","btn3"),new r("4","GHI","digitFourLabel","four-solid","btn4"),new r("5","JKL","digitFiveLabel","five-solid","btn5"),new r("6","MNO","digitSixLabel","six-solid","btn6"),new r("7","PQRS","digitSevenLabel","seven-solid","btn7"),new r("8","TUV","digitEightLabel","eight-solid","btn8"),new r("9","WXYZ","digitNineLabel","nine-solid","btn9"),new r("*",null,"digitAsteriskLabel","asterisk-2-solid","btnAsterisk"),new r("0","+","digitZeroLabel","zero-solid","btn0"),new r("#",null,"digitHashtagLabel","hashtag-solid","btnHashtag")],F=({noInput:a})=>$.classNames("base",["no-input",!!a]);function k(a,t){if(t.key===y.keyEnter&&!a.pending&&!a.disabled&&!a.callActive&&!a.noCall&&a.value.length>0&&t.target instanceof HTMLInputElement)a._onDial();else{const e=g.findIndex(o=>o.value===t.key);if(e>-1){const o=a.shadowRoot.querySelector(".digits").children[e];o&&(o.active=!0,setTimeout(()=>{o.active=!1},200))}}return!0}function u(a){a.value=a._textFieldEl.value}function v(a,{event:t}){t.stopImmediatePropagation()}function D(a){a.value=a.value.slice(0,-1),a.$emit("input"),a.$emit("change"),a.value===""&&a._textFieldEl?.focus()}function C(a,t){return l.html`<${a} ${x.ref("_textFieldEl")} class="phone-field" internal-part type="tel"
1
+ "use strict";const b=require("../bundled/definition3.cjs"),f=require("../bundled/definition13.cjs"),n=require("../bundled/vivid-element.cjs"),h=require("../bundled/definition2.cjs"),g=require("../bundled/definition12.cjs"),_=require("../bundled/localized.cjs"),$=require("../bundled/class-names.cjs"),d=require("../bundled/when.cjs"),y=require("../bundled/repeat.cjs"),w=require("../bundled/ref.cjs"),x=require("../bundled/key-codes.cjs"),A=":host{display:inline-block;margin:16px;inline-size:230px}.base{display:grid;box-sizing:border-box;grid-template-rows:80px 1fr auto}.base.no-input{grid-template-rows:1fr auto}.digits{display:grid;gap:16px;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(4,1fr);inline-size:100%}.phone-field{align-self:flex-start;grid-column:1/-1}.digit-btn{--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-pale)}@media (hover: hover){.digit-btn:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}}.digit-btn.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}.digit-btn:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn{--_connotation-color-contrast: var(--vvd-dial-pad-accent-contrast, var(--vvd-color-neutral-800));--_connotation-color-soft: var(--vvd-dial-pad-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-dial-pad-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-fierce: var(--vvd-dial-pad-accent-fierce, var(--vvd-color-neutral-700));--_connotation-color-firm-all: var(--vvd-dial-pad-accent-firm-all, var(--vvd-color-neutral-600));--_connotation-color-faint: var(--vvd-dial-pad-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-dim: var(--vvd-dial-pad-accent-dim, var(--vvd-color-neutral-200))}.digit-btn{--vvd-button-accent-firm: var(--_appearance-color-text);display:flex;overflow:hidden;flex-direction:column;border-radius:16px;box-shadow:0 0 0 1px var(--_appearance-color-outline);inline-size:100%}.digit-btn:not(.disabled) .digit-btn-num{color:var(--vvd-color-canvas-text)}.digit-btn:focus-within{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.call-btn{margin-top:32px;grid-column:1/-1}";var L=Object.defineProperty,i=(a,t,e,l)=>{for(var c=void 0,s=a.length-1,u;s>=0;s--)(u=a[s])&&(c=u(t,e,c)||c);return c&&L(t,e,c),c};class o extends _.Localized(n.VividElement){constructor(){super(...arguments),this.helperText=null,this.placeholder=null,this.value="",this.pattern="^[0-9#*]*$",this.disabled=!1,this.pending=!1,this.callActive=!1,this.noCall=!1,this.noInput=!1,this.endCallButtonLabel=null,this.callButtonLabel=null,this._onDial=()=>{!this._textFieldEl.checkValidity()?this._announceValidationError(this._textFieldEl.errorValidationMessage??""):this._clearErrorAnnouncement(),this.callActive?this.$emit("end-call"):this.$emit("dial")},this.autofocus=!1,this._errorAnnouncement="",this._forceAnnouncementToggle=!1}valueChanged(t,e){e!=null&&this._textFieldEl&&e!==this._textFieldEl.value&&(this._textFieldEl.value=e,this._textFieldEl.reportValidity())}focus(){const t=this.shadowRoot?.querySelectorAll(".digits .digit-btn");(this._textFieldEl||t?.[0])?.focus()}_announceValidationError(t){this._errorAnnouncement="",window.queueMicrotask(()=>{t?(this._forceAnnouncementToggle=!this._forceAnnouncementToggle,this._errorAnnouncement=`${t}${this._forceAnnouncementToggle?"​":""}`):this._clearErrorAnnouncement()})}_clearErrorAnnouncement(){this._errorAnnouncement="",this._forceAnnouncementToggle=!1}}i([n.attr({attribute:"helper-text"})],o.prototype,"helperText");i([n.attr],o.prototype,"placeholder");i([n.attr({mode:"fromView"})],o.prototype,"value");i([n.attr({mode:"fromView"})],o.prototype,"pattern");i([n.attr({mode:"boolean"})],o.prototype,"disabled");i([n.attr({mode:"boolean"})],o.prototype,"pending");i([n.attr({attribute:"call-active",mode:"boolean"})],o.prototype,"callActive");i([n.attr({mode:"boolean",attribute:"no-call"})],o.prototype,"noCall");i([n.attr({mode:"boolean",attribute:"no-input"})],o.prototype,"noInput");i([n.attr({attribute:"end-call-button-label"})],o.prototype,"endCallButtonLabel");i([n.attr({attribute:"call-button-label"})],o.prototype,"callButtonLabel");i([n.attr({mode:"boolean"})],o.prototype,"autofocus");i([n.observable],o.prototype,"_errorAnnouncement");class r{constructor(t,e,l,c,s){this.value=t,this.label=e,this.ariaLabel=l,this.icon=c,this.id=s}}const m=[new r("1","&nbsp;","digitOneLabel","one-solid","btn1"),new r("2","ABC","digitTwoLabel","two-solid","btn2"),new r("3","DEF","digitThreeLabel","three-solid","btn3"),new r("4","GHI","digitFourLabel","four-solid","btn4"),new r("5","JKL","digitFiveLabel","five-solid","btn5"),new r("6","MNO","digitSixLabel","six-solid","btn6"),new r("7","PQRS","digitSevenLabel","seven-solid","btn7"),new r("8","TUV","digitEightLabel","eight-solid","btn8"),new r("9","WXYZ","digitNineLabel","nine-solid","btn9"),new r("*",null,"digitAsteriskLabel","asterisk-2-solid","btnAsterisk"),new r("0","+","digitZeroLabel","zero-solid","btn0"),new r("#",null,"digitHashtagLabel","hashtag-solid","btnHashtag")],E=({noInput:a})=>$.classNames("base",["no-input",!!a]);function F(a,t){if(t.key===x.keyEnter&&!a.pending&&!a.disabled&&!a.callActive&&!a.noCall&&a.value.length>0&&t.target instanceof HTMLInputElement)a._onDial();else{const e=m.findIndex(l=>l.value===t.key);if(e>-1){const l=a.shadowRoot.querySelector(".digits").children[e];l&&(l.active=!0,setTimeout(()=>{l.active=!1},200))}}return!0}function p(a){a.value=a._textFieldEl.value}function v(a,{event:t}){t.stopImmediatePropagation()}function k(a){a.value=a.value.slice(0,-1),a.$emit("input"),a.$emit("change"),a.value===""&&a._textFieldEl?.focus()}function D(a,t){return n.html`<${a} ${w.ref("_textFieldEl")} class="phone-field" internal-part type="tel"
2
2
  value="${e=>e.value}" placeholder="${e=>e.placeholder}"
3
3
  ?disabled="${e=>e.disabled}" helper-text="${e=>e.helperText}" pattern="${e=>e.pattern}"
4
4
  aria-label="${e=>e.locale.dialPad.inputLabel}"
5
- @keydown="${(e,o)=>k(e,o.event)}"
6
- @input="${u}"
7
- @change="${u}"
5
+ @keydown="${(e,l)=>F(e,l.event)}"
6
+ @input="${p}"
7
+ @change="${p}"
8
8
  @focus="${v}"
9
9
  @blur="${v}"
10
10
  ?autofocus="${e=>e.autofocus}"
11
11
  >
12
- ${s.when(e=>e.value&&e.value.length&&e.value.length>0,l.html`<${t}
12
+ ${d.when(e=>e.value&&e.value.length&&e.value.length>0,n.html`<${t}
13
13
  slot="action-items"
14
14
  size='super-condensed'
15
15
  icon="backspace-line"
16
16
  aria-label="${e=>e.deleteAriaLabel||e.locale.dialPad.deleteButtonLabel}"
17
17
  appearance='ghost'
18
18
  ?disabled="${e=>e.disabled||e.callActive}"
19
- @click="${e=>D(e)}">
19
+ @click="${e=>k(e)}">
20
20
  </${t}>`)}
21
- </${a}>`}function A(a,{parent:t,event:e}){t.value+=a.value,t.$emit("keypad-click",e.currentTarget),t.$emit("input"),t.$emit("change")}function B(a,t){return l.html`
22
- ${_.repeat(e=>g,l.html`
21
+ </${a}>`}function C(a,{parent:t,event:e}){t.value+=a.value,t.$emit("keypad-click",e.currentTarget),t.$emit("input"),t.$emit("change")}function T(a,t){return n.html`
22
+ ${y.repeat(e=>m,n.html`
23
23
  <${a}
24
24
  id="${e=>e.id}"
25
25
  value="${e=>e.value}"
@@ -29,16 +29,16 @@
29
29
  label="${e=>e.label==="&nbsp;"?" ":e.label}"
30
30
  size='condensed'
31
31
  class="digit-btn"
32
- ?autofocus="${(e,o)=>o.parent.autofocus&&o.parent.noInput&&o.index===0}"
33
- aria-label="${(e,o)=>o.parent.locale.dialPad[e.ariaLabel]}"
34
- ?disabled="${(e,o)=>o.parent.disabled}"
35
- @click="${A}">
32
+ ?autofocus="${(e,l)=>l.parent.autofocus&&l.parent.noInput&&l.index===0}"
33
+ aria-label="${(e,l)=>l.parent.locale.dialPad[e.ariaLabel]}"
34
+ ?disabled="${(e,l)=>l.parent.disabled}"
35
+ @click="${C}">
36
36
  <${t} slot="icon"
37
37
  name="${e=>e.icon}"
38
38
  class="digit-btn-num"></${t}>
39
39
  </${a}>
40
40
  `,{positioning:!0})}
41
- `}function E(a){return l.html`<${a} class="call-btn"
41
+ `}function B(a){return n.html`<${a} class="call-btn"
42
42
  size="expanded"
43
43
  appearance="filled"
44
44
  icon="${t=>t.callActive?"disable-call-line":"call-line"}"
@@ -47,8 +47,11 @@
47
47
  ?pending="${t=>t.pending}"
48
48
  @click="${t=>t._onDial()}"
49
49
  label="${t=>t.callActive?t.endCallButtonLabel||t.locale.dialPad.endCallButtonLabel:t.callButtonLabel||t.locale.dialPad.callButtonLabel}">
50
- </${a}>`}const q=a=>{const t=a.tagFor(b.Button),e=a.tagFor(h.Icon),o=a.tagFor(f.TextField);return l.html` <div class="${F}">
51
- ${s.when(n=>!n.noInput,C(o,t))}
52
- <div class="digits">${B(t,e)}</div>
53
- ${s.when(n=>!n.noCall,E(t))}
54
- </div>`},T=l.defineVividComponent("dial-pad",i,q,[b.buttonDefinition,f.textFieldDefinition,h.iconDefinition],{styles:w}),I=l.createRegisterFunction(T);I();
50
+ </${a}>`}function q(a){return n.html`<${a} role="alert" aria-atomic="true">
51
+ ${t=>`${t.locale.dialPad.errorLabel} ${t._errorAnnouncement}`}
52
+ </${a}>`}const I=a=>{const t=a.tagFor(b.Button),e=a.tagFor(h.Icon),l=a.tagFor(f.TextField),c=a.tagFor(g.VisuallyHidden);return n.html` <div class="${E}">
53
+ ${d.when(s=>!s.noInput,D(l,t))}
54
+ <div class="digits">${T(t,e)}</div>
55
+ ${d.when(s=>!s.noCall,B(t))}
56
+ ${q(c)}
57
+ </div>`},z=n.defineVividComponent("dial-pad",o,I,[b.buttonDefinition,f.textFieldDefinition,h.iconDefinition,g.visuallyHiddenDefinition],{styles:A}),P=n.createRegisterFunction(z);P();
package/dial-pad/index.js CHANGED
@@ -1,24 +1,27 @@
1
- import { B as g, b as h } from "../bundled/definition3.js";
2
- import { T as m, t as $ } from "../bundled/definition13.js";
3
- import { V as _, a as r, h as s, c as x, d as L } from "../bundled/vivid-element.js";
4
- import { I as y, i as w } from "../bundled/definition2.js";
5
- import { L as F } from "../bundled/localized.js";
6
- import { c as k } from "../bundled/class-names.js";
1
+ import { B as h, b as m } from "../bundled/definition3.js";
2
+ import { T as g, t as _ } from "../bundled/definition13.js";
3
+ import { V as $, a as r, o as y, h as d, c as x, d as L } from "../bundled/vivid-element.js";
4
+ import { I as A, i as w } from "../bundled/definition2.js";
5
+ import { V as F, v as E } from "../bundled/definition12.js";
6
+ import { L as k } from "../bundled/localized.js";
7
+ import { c as D } from "../bundled/class-names.js";
7
8
  import { w as p } from "../bundled/when.js";
8
- import { r as D } from "../bundled/repeat.js";
9
+ import { r as T } from "../bundled/repeat.js";
9
10
  import { r as B } from "../bundled/ref.js";
10
- import { f as A } from "../bundled/key-codes.js";
11
- const C = ":host{display:inline-block;margin:16px;inline-size:230px}.base{display:grid;box-sizing:border-box;grid-template-rows:80px 1fr auto}.base.no-input{grid-template-rows:1fr auto}.digits{display:grid;gap:16px;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(4,1fr);inline-size:100%}.phone-field{align-self:flex-start;grid-column:1/-1}.digit-btn{--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-pale)}@media (hover: hover){.digit-btn:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}}.digit-btn.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}.digit-btn:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn{--_connotation-color-contrast: var(--vvd-dial-pad-accent-contrast, var(--vvd-color-neutral-800));--_connotation-color-soft: var(--vvd-dial-pad-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-dial-pad-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-fierce: var(--vvd-dial-pad-accent-fierce, var(--vvd-color-neutral-700));--_connotation-color-firm-all: var(--vvd-dial-pad-accent-firm-all, var(--vvd-color-neutral-600));--_connotation-color-faint: var(--vvd-dial-pad-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-dim: var(--vvd-dial-pad-accent-dim, var(--vvd-color-neutral-200))}.digit-btn{--vvd-button-accent-firm: var(--_appearance-color-text);display:flex;overflow:hidden;flex-direction:column;border-radius:16px;box-shadow:0 0 0 1px var(--_appearance-color-outline);inline-size:100%}.digit-btn:not(.disabled) .digit-btn-num{color:var(--vvd-color-canvas-text)}.digit-btn:focus-within{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.call-btn{margin-top:32px;grid-column:1/-1}";
12
- var E = Object.defineProperty, c = (a, t, e, l) => {
13
- for (var i = void 0, d = a.length - 1, u; d >= 0; d--)
14
- (u = a[d]) && (i = u(t, e, i) || i);
15
- return i && E(t, e, i), i;
11
+ import { f as C } from "../bundled/key-codes.js";
12
+ const I = ":host{display:inline-block;margin:16px;inline-size:230px}.base{display:grid;box-sizing:border-box;grid-template-rows:80px 1fr auto}.base.no-input{grid-template-rows:1fr auto}.digits{display:grid;gap:16px;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(4,1fr);inline-size:100%}.phone-field{align-self:flex-start;grid-column:1/-1}.digit-btn{--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-pale)}@media (hover: hover){.digit-btn:hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}}.digit-btn.hover:where(:not(.disabled,:disabled,.readonly)){--_appearance-color-text: var(--_connotation-color-firm-all);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--_connotation-color-firm-all)}.digit-btn:disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn.disabled{--_appearance-color-text: var(--vvd-color-neutral-300);--_appearance-color-fill: transparent;--_appearance-color-outline: var(--vvd-color-neutral-100)}.digit-btn{--_connotation-color-contrast: var(--vvd-dial-pad-accent-contrast, var(--vvd-color-neutral-800));--_connotation-color-soft: var(--vvd-dial-pad-accent-soft, var(--vvd-color-neutral-100));--_connotation-color-pale: var(--vvd-dial-pad-accent-pale, var(--vvd-color-neutral-300));--_connotation-color-fierce: var(--vvd-dial-pad-accent-fierce, var(--vvd-color-neutral-700));--_connotation-color-firm-all: var(--vvd-dial-pad-accent-firm-all, var(--vvd-color-neutral-600));--_connotation-color-faint: var(--vvd-dial-pad-accent-faint, var(--vvd-color-neutral-50));--_connotation-color-dim: var(--vvd-dial-pad-accent-dim, var(--vvd-color-neutral-200))}.digit-btn{--vvd-button-accent-firm: var(--_appearance-color-text);display:flex;overflow:hidden;flex-direction:column;border-radius:16px;box-shadow:0 0 0 1px var(--_appearance-color-outline);inline-size:100%}.digit-btn:not(.disabled) .digit-btn-num{color:var(--vvd-color-canvas-text)}.digit-btn:focus-within{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.call-btn{margin-top:32px;grid-column:1/-1}";
13
+ var V = Object.defineProperty, n = (a, t, e, o) => {
14
+ for (var c = void 0, s = a.length - 1, u; s >= 0; s--)
15
+ (u = a[s]) && (c = u(t, e, c) || c);
16
+ return c && V(t, e, c), c;
16
17
  };
17
- class o extends F(_) {
18
+ class l extends k($) {
18
19
  constructor() {
19
20
  super(...arguments), this.helperText = null, this.placeholder = null, this.value = "", this.pattern = "^[0-9#*]*$", this.disabled = !1, this.pending = !1, this.callActive = !1, this.noCall = !1, this.noInput = !1, this.endCallButtonLabel = null, this.callButtonLabel = null, this._onDial = () => {
20
- this.callActive ? this.$emit("end-call") : this.$emit("dial");
21
- }, this.autofocus = !1;
21
+ !this._textFieldEl.checkValidity() ? this._announceValidationError(
22
+ this._textFieldEl.errorValidationMessage ?? ""
23
+ ) : this._clearErrorAnnouncement(), this.callActive ? this.$emit("end-call") : this.$emit("dial");
24
+ }, this.autofocus = !1, this._errorAnnouncement = "", this._forceAnnouncementToggle = !1;
22
25
  }
23
26
  valueChanged(t, e) {
24
27
  e != null && this._textFieldEl && e !== this._textFieldEl.value && (this._textFieldEl.value = e, this._textFieldEl.reportValidity());
@@ -32,83 +35,100 @@ class o extends F(_) {
32
35
  const t = this.shadowRoot?.querySelectorAll(".digits .digit-btn");
33
36
  (this._textFieldEl || t?.[0])?.focus();
34
37
  }
38
+ /**
39
+ * @internal
40
+ */
41
+ _announceValidationError(t) {
42
+ this._errorAnnouncement = "", window.queueMicrotask(() => {
43
+ t ? (this._forceAnnouncementToggle = !this._forceAnnouncementToggle, this._errorAnnouncement = `${t}${this._forceAnnouncementToggle ? "​" : ""}`) : this._clearErrorAnnouncement();
44
+ });
45
+ }
46
+ /**
47
+ * @internal
48
+ */
49
+ _clearErrorAnnouncement() {
50
+ this._errorAnnouncement = "", this._forceAnnouncementToggle = !1;
51
+ }
35
52
  }
36
- c([
53
+ n([
37
54
  r({ attribute: "helper-text" })
38
- ], o.prototype, "helperText");
39
- c([
55
+ ], l.prototype, "helperText");
56
+ n([
40
57
  r
41
- ], o.prototype, "placeholder");
42
- c([
58
+ ], l.prototype, "placeholder");
59
+ n([
43
60
  r({ mode: "fromView" })
44
- ], o.prototype, "value");
45
- c([
61
+ ], l.prototype, "value");
62
+ n([
46
63
  r({ mode: "fromView" })
47
- ], o.prototype, "pattern");
48
- c([
64
+ ], l.prototype, "pattern");
65
+ n([
49
66
  r({ mode: "boolean" })
50
- ], o.prototype, "disabled");
51
- c([
67
+ ], l.prototype, "disabled");
68
+ n([
52
69
  r({ mode: "boolean" })
53
- ], o.prototype, "pending");
54
- c([
70
+ ], l.prototype, "pending");
71
+ n([
55
72
  r({ attribute: "call-active", mode: "boolean" })
56
- ], o.prototype, "callActive");
57
- c([
73
+ ], l.prototype, "callActive");
74
+ n([
58
75
  r({ mode: "boolean", attribute: "no-call" })
59
- ], o.prototype, "noCall");
60
- c([
76
+ ], l.prototype, "noCall");
77
+ n([
61
78
  r({ mode: "boolean", attribute: "no-input" })
62
- ], o.prototype, "noInput");
63
- c([
79
+ ], l.prototype, "noInput");
80
+ n([
64
81
  r({ attribute: "end-call-button-label" })
65
- ], o.prototype, "endCallButtonLabel");
66
- c([
82
+ ], l.prototype, "endCallButtonLabel");
83
+ n([
67
84
  r({ attribute: "call-button-label" })
68
- ], o.prototype, "callButtonLabel");
69
- c([
85
+ ], l.prototype, "callButtonLabel");
86
+ n([
70
87
  r({ mode: "boolean" })
71
- ], o.prototype, "autofocus");
72
- class n {
73
- constructor(t, e, l, i, d) {
74
- this.value = t, this.label = e, this.ariaLabel = l, this.icon = i, this.id = d;
88
+ ], l.prototype, "autofocus");
89
+ n([
90
+ y
91
+ ], l.prototype, "_errorAnnouncement");
92
+ class i {
93
+ constructor(t, e, o, c, s) {
94
+ this.value = t, this.label = e, this.ariaLabel = o, this.icon = c, this.id = s;
75
95
  }
76
96
  }
77
97
  const f = [
78
- new n("1", "&nbsp;", "digitOneLabel", "one-solid", "btn1"),
79
- new n("2", "ABC", "digitTwoLabel", "two-solid", "btn2"),
80
- new n("3", "DEF", "digitThreeLabel", "three-solid", "btn3"),
81
- new n("4", "GHI", "digitFourLabel", "four-solid", "btn4"),
82
- new n("5", "JKL", "digitFiveLabel", "five-solid", "btn5"),
83
- new n("6", "MNO", "digitSixLabel", "six-solid", "btn6"),
84
- new n("7", "PQRS", "digitSevenLabel", "seven-solid", "btn7"),
85
- new n("8", "TUV", "digitEightLabel", "eight-solid", "btn8"),
86
- new n("9", "WXYZ", "digitNineLabel", "nine-solid", "btn9"),
87
- new n(
98
+ new i("1", "&nbsp;", "digitOneLabel", "one-solid", "btn1"),
99
+ new i("2", "ABC", "digitTwoLabel", "two-solid", "btn2"),
100
+ new i("3", "DEF", "digitThreeLabel", "three-solid", "btn3"),
101
+ new i("4", "GHI", "digitFourLabel", "four-solid", "btn4"),
102
+ new i("5", "JKL", "digitFiveLabel", "five-solid", "btn5"),
103
+ new i("6", "MNO", "digitSixLabel", "six-solid", "btn6"),
104
+ new i("7", "PQRS", "digitSevenLabel", "seven-solid", "btn7"),
105
+ new i("8", "TUV", "digitEightLabel", "eight-solid", "btn8"),
106
+ new i("9", "WXYZ", "digitNineLabel", "nine-solid", "btn9"),
107
+ new i(
88
108
  "*",
89
109
  null,
90
110
  "digitAsteriskLabel",
91
111
  "asterisk-2-solid",
92
112
  "btnAsterisk"
93
113
  ),
94
- new n("0", "+", "digitZeroLabel", "zero-solid", "btn0"),
95
- new n(
114
+ new i("0", "+", "digitZeroLabel", "zero-solid", "btn0"),
115
+ new i(
96
116
  "#",
97
117
  null,
98
118
  "digitHashtagLabel",
99
119
  "hashtag-solid",
100
120
  "btnHashtag"
101
121
  )
102
- ], T = ({ noInput: a }) => k("base", ["no-input", !!a]);
103
- function I(a, t) {
104
- if (t.key === A && !a.pending && !a.disabled && !a.callActive && !a.noCall && a.value.length > 0 && t.target instanceof HTMLInputElement)
122
+ ], P = ({ noInput: a }) => D("base", ["no-input", !!a]);
123
+ function z(a, t) {
124
+ if (t.key === C && !a.pending && !a.disabled && !a.callActive && !a.noCall && a.value.length > 0 && t.target instanceof HTMLInputElement)
105
125
  a._onDial();
106
126
  else {
107
- const e = f.findIndex((l) => l.value === t.key);
127
+ const e = f.findIndex((o) => o.value === t.key);
108
128
  if (e > -1) {
109
- const l = a.shadowRoot.querySelector(".digits").children[e];
110
- l && (l.active = !0, setTimeout(() => {
111
- l.active = !1;
129
+ const o = a.shadowRoot.querySelector(".digits").children[e];
130
+ o && (o.active = !0, setTimeout(() => {
131
+ o.active = !1;
112
132
  }, 200));
113
133
  }
114
134
  }
@@ -120,17 +140,17 @@ function v(a) {
120
140
  function b(a, { event: t }) {
121
141
  t.stopImmediatePropagation();
122
142
  }
123
- function z(a) {
143
+ function H(a) {
124
144
  a.value = a.value.slice(0, -1), a.$emit("input"), a.$emit("change"), a.value === "" && a._textFieldEl?.focus();
125
145
  }
126
- function P(a, t) {
127
- return s`<${a} ${B(
146
+ function S(a, t) {
147
+ return d`<${a} ${B(
128
148
  "_textFieldEl"
129
149
  )} class="phone-field" internal-part type="tel"
130
150
  value="${(e) => e.value}" placeholder="${(e) => e.placeholder}"
131
151
  ?disabled="${(e) => e.disabled}" helper-text="${(e) => e.helperText}" pattern="${(e) => e.pattern}"
132
152
  aria-label="${(e) => e.locale.dialPad.inputLabel}"
133
- @keydown="${(e, l) => I(e, l.event)}"
153
+ @keydown="${(e, o) => z(e, o.event)}"
134
154
  @input="${v}"
135
155
  @change="${v}"
136
156
  @focus="${b}"
@@ -139,26 +159,26 @@ function P(a, t) {
139
159
  >
140
160
  ${p(
141
161
  (e) => e.value && e.value.length && e.value.length > 0,
142
- s`<${t}
162
+ d`<${t}
143
163
  slot="action-items"
144
164
  size='super-condensed'
145
165
  icon="backspace-line"
146
166
  aria-label="${(e) => e.deleteAriaLabel || e.locale.dialPad.deleteButtonLabel}"
147
167
  appearance='ghost'
148
168
  ?disabled="${(e) => e.disabled || e.callActive}"
149
- @click="${(e) => z(e)}">
169
+ @click="${(e) => H(e)}">
150
170
  </${t}>`
151
171
  )}
152
172
  </${a}>`;
153
173
  }
154
- function S(a, { parent: t, event: e }) {
174
+ function M(a, { parent: t, event: e }) {
155
175
  t.value += a.value, t.$emit("keypad-click", e.currentTarget), t.$emit("input"), t.$emit("change");
156
176
  }
157
- function V(a, t) {
158
- return s`
159
- ${D(
177
+ function N(a, t) {
178
+ return d`
179
+ ${T(
160
180
  (e) => f,
161
- s`
181
+ d`
162
182
  <${a}
163
183
  id="${(e) => e.id}"
164
184
  value="${(e) => e.value}"
@@ -168,10 +188,10 @@ function V(a, t) {
168
188
  label="${(e) => e.label === "&nbsp;" ? " " : e.label}"
169
189
  size='condensed'
170
190
  class="digit-btn"
171
- ?autofocus="${(e, l) => l.parent.autofocus && l.parent.noInput && l.index === 0}"
172
- aria-label="${(e, l) => l.parent.locale.dialPad[e.ariaLabel]}"
173
- ?disabled="${(e, l) => l.parent.disabled}"
174
- @click="${S}">
191
+ ?autofocus="${(e, o) => o.parent.autofocus && o.parent.noInput && o.index === 0}"
192
+ aria-label="${(e, o) => o.parent.locale.dialPad[e.ariaLabel]}"
193
+ ?disabled="${(e, o) => o.parent.disabled}"
194
+ @click="${M}">
175
195
  <${t} slot="icon"
176
196
  name="${(e) => e.icon}"
177
197
  class="digit-btn-num"></${t}>
@@ -183,8 +203,8 @@ function V(a, t) {
183
203
  )}
184
204
  `;
185
205
  }
186
- function H(a) {
187
- return s`<${a} class="call-btn"
206
+ function O(a) {
207
+ return d`<${a} class="call-btn"
188
208
  size="expanded"
189
209
  appearance="filled"
190
210
  icon="${(t) => t.callActive ? "disable-call-line" : "call-line"}"
@@ -195,20 +215,31 @@ function H(a) {
195
215
  label="${(t) => t.callActive ? t.endCallButtonLabel || t.locale.dialPad.endCallButtonLabel : t.callButtonLabel || t.locale.dialPad.callButtonLabel}">
196
216
  </${a}>`;
197
217
  }
198
- const N = (a) => {
199
- const t = a.tagFor(g), e = a.tagFor(y), l = a.tagFor(m);
200
- return s` <div class="${T}">
201
- ${p((i) => !i.noInput, P(l, t))}
202
- <div class="digits">${V(t, e)}</div>
203
- ${p((i) => !i.noCall, H(t))}
218
+ function R(a) {
219
+ return d`<${a} role="alert" aria-atomic="true">
220
+ ${(t) => `${t.locale.dialPad.errorLabel} ${t._errorAnnouncement}`}
221
+ </${a}>`;
222
+ }
223
+ const q = (a) => {
224
+ const t = a.tagFor(h), e = a.tagFor(A), o = a.tagFor(g), c = a.tagFor(F);
225
+ return d` <div class="${P}">
226
+ ${p((s) => !s.noInput, S(o, t))}
227
+ <div class="digits">${N(t, e)}</div>
228
+ ${p((s) => !s.noCall, O(t))}
229
+ ${R(c)}
204
230
  </div>`;
205
- }, O = L(
231
+ }, K = L(
206
232
  "dial-pad",
207
- o,
208
- N,
209
- [h, $, w],
233
+ l,
234
+ q,
235
+ [
236
+ m,
237
+ _,
238
+ w,
239
+ E
240
+ ],
210
241
  {
211
- styles: C
242
+ styles: I
212
243
  }
213
- ), R = x(O);
214
- R();
244
+ ), U = x(K);
245
+ U();
@@ -9,12 +9,13 @@ const mixins = require('../unbundled/mixins.cjs');
9
9
  const fastElement = require('@microsoft/fast-element');
10
10
  const delegatesAria = require('../unbundled/delegates-aria.cjs');
11
11
  const formAssociated = require('../unbundled/form-associated.cjs');
12
+ const withContextualHelp = require('../unbundled/with-contextual-help.cjs');
12
13
  const withErrorText = require('../unbundled/with-error-text.cjs');
13
14
  const formElement = require('../unbundled/form-element.cjs');
14
15
  const localized = require('../unbundled/localized.cjs');
15
16
  const fastWebUtilities = require('@microsoft/fast-web-utilities');
16
17
 
17
- const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column;block-size:inherit;max-block-size:inherit;--_low-ink-color: var(--vvd-color-neutral-600)}.control-wrapper{display:flex;flex-direction:column;block-size:inherit;gap:4px;max-block-size:inherit}.control{position:relative;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 .upload-text{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-600);isolation:isolate;pointer-events:none;text-align:center;transition:all .3s ease}@media (hover: hover){.control:hover .upload-text{color:var(--vvd-color-neutral-800)}}.control.drag-hover .upload-text{color:var(--vvd-color-neutral-800)}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.control:active,.control:focus-visible{border-color:var(--vvd-color-cta-400);background-color:var(--vvd-color-cta-100);box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}@media (hover: hover){.control:hover{border-color:var(--vvd-color-cta-400);background-color:var(--vvd-color-cta-100);box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}}.control:active{box-shadow:0 1px 4px #0000001a;transform:translateY(0)}.control.drag-hover{border-color:var(--vvd-color-cta-200);background-color:var(--vvd-color-cta-200);outline:2px dashed var(--vvd-color-cta-500);transform:scale(1.02)}.upload-icon{animation:subtle-pulse 2s ease-in-out infinite;color:var(--vvd-color-cta-600);pointer-events:none;transition:all .3s ease}@media (hover: hover){.control:hover .upload-icon{animation:none;color:var(--vvd-color-cta-700);transform:scale(1.1)}}.control:active .upload-icon{transform:scale(1.05)}.control.drag-hover .upload-icon{animation:none;color:var(--vvd-color-neutral-800);transform:scale(1.15)}@keyframes subtle-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}.main{pointer-events:none}.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%}.preview .details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.preview .details .filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.preview .details .size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.preview .error-message{display:flex;align-items:center;color:var(--vvd-color-alert-600);font:var(--vvd-typography-base-condensed-bold);gap:4px;margin-block-start:4px}.preview:not(.has-error) .error-message{display:none}.preview.has-error{border:1px solid var(--vvd-color-alert-500);background-color:var(--vvd-color-alert-50)}.preview.has-error .size{display:none}.preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.preview-list{--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.preview-list{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.preview-list ::-webkit-scrollbar{width:4px}.preview-list ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.preview-list ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:not(:has(.preview)){display:none}.hidden-input{position:absolute;top:0;left:0;width:0;height:0;visibility:hidden}";
18
+ const styles = ":host{display:block;max-inline-size:400px}.base{display:flex;flex-direction:column;block-size:inherit;max-block-size:inherit;--_low-ink-color: var(--vvd-color-neutral-600)}.control-wrapper{display:flex;flex-direction:column;block-size:inherit;gap:4px;max-block-size:inherit}.control{position:relative;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 .upload-text{display:flex;align-items:center;justify-content:center;color:var(--vvd-color-neutral-600);isolation:isolate;pointer-events:none;text-align:center;transition:all .3s ease}@media (hover: hover){.control:hover .upload-text{color:var(--vvd-color-neutral-800)}}.control.drag-hover .upload-text{color:var(--vvd-color-neutral-800)}.control:not(.size-expanded){min-block-size:52px}.control.size-expanded{min-block-size:120px}.control:focus-visible{--focus-stroke-gap-color: transparent;box-shadow:0 0 0 4px color-mix(in srgb,var(--vvd-color-cta-500),transparent 85%),inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:1px solid var(--focus-stroke-color, var(--vvd-color-cta-500));outline-offset:calc(-1px - var(--focus-inset, 0px))}.control:active,.control:focus-visible{border-color:var(--vvd-color-cta-400);background-color:var(--vvd-color-cta-100);box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}@media (hover: hover){.control:hover{border-color:var(--vvd-color-cta-400);background-color:var(--vvd-color-cta-100);box-shadow:0 2px 8px #0000001a;transform:translateY(-1px)}}.control:active{box-shadow:0 1px 4px #0000001a;transform:translateY(0)}.control.drag-hover{border-color:var(--vvd-color-cta-200);background-color:var(--vvd-color-cta-200);outline:2px dashed var(--vvd-color-cta-500);transform:scale(1.02)}.upload-icon{animation:subtle-pulse 2s ease-in-out infinite;color:var(--vvd-color-cta-600);pointer-events:none;transition:all .3s ease}@media (hover: hover){.control:hover .upload-icon{animation:none;color:var(--vvd-color-cta-700);transform:scale(1.1)}}.control:active .upload-icon{transform:scale(1.05)}.control.drag-hover .upload-icon{animation:none;color:var(--vvd-color-neutral-800);transform:scale(1.15)}@keyframes subtle-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}.main{pointer-events:none}.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%}.preview .details{display:flex;min-width:0;flex-direction:column;max-inline-size:100%}.preview .details .filename{overflow:hidden;color:var(--vvd-color-canvas-text);font:var(--vvd-typography-base);text-overflow:ellipsis;white-space:nowrap}.preview .details .size{color:var(--vvd-color-neutral-600);font:var(--vvd-typography-base-condensed)}.preview .error-message{display:flex;align-items:center;color:var(--vvd-color-alert-600);font:var(--vvd-typography-base-condensed-bold);gap:4px;margin-block-start:4px}.preview:not(.has-error) .error-message{display:none}.preview.has-error{border:1px solid var(--vvd-color-alert-500);background-color:var(--vvd-color-alert-50)}.preview.has-error .size{display:none}.preview .remove-btn{display:inline;align-self:center;grid-column:2/-1;grid-row:1/-1}.preview-list{--scrollbar-track-color: transparent;--scrollbar-thumb-color: color-mix(in srgb, var(--vvd-color-neutral-950), transparent 70%)}.preview-list{scrollbar-color:var(--scrollbar-thumb-color) var(--scrollbar-track-color);scrollbar-width:thin}.preview-list ::-webkit-scrollbar{width:4px}.preview-list ::-webkit-scrollbar-track{background:var(--scrollbar-track-color)}.preview-list ::-webkit-scrollbar-thumb{border:0;border-radius:4px;background-color:var(--scrollbar-fallback-track-color, var(--scrollbar-thumb-color))}.preview-list{display:flex;flex-direction:column;gap:12px;margin-block-start:12px;overflow-y:auto}.preview-list:not(:has(.preview)){display:none}.hidden-input{position:absolute;top:0;left:0;width:0;height:0;visibility:hidden}.label-wrapper{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:var(--label-wrapper-gap, 8px)}.label-wrapper[hidden]{display:none}.label-wrapper .label{flex:1 1 auto}.label-wrapper slot[name=contextual-help]::slotted([data-vvd-component=contextual-help]){margin-inline-start:auto}";
18
19
 
19
20
  async function filesFromDataTransfer(dataTransfer) {
20
21
  const browserSupportFolderDrop = dataTransfer.items?.[0]?.webkitGetAsEntry != null;
@@ -103,9 +104,11 @@ var __decorateClass = (decorators, target, key, kind) => {
103
104
  if (kind && result) __defProp(target, key, result);
104
105
  return result;
105
106
  };
106
- class FilePicker extends mixins.WithFeedback(
107
- withErrorText.WithErrorText(
108
- formElement.FormElement(delegatesAria.DelegatesAria(localized.Localized(formAssociated.FormAssociated(vividElement.VividElement))))
107
+ class FilePicker extends withContextualHelp.WithContextualHelp(
108
+ mixins.WithFeedback(
109
+ withErrorText.WithErrorText(
110
+ formElement.FormElement(delegatesAria.DelegatesAria(localized.Localized(formAssociated.FormAssociated(vividElement.VividElement))))
111
+ )
109
112
  )
110
113
  ) {
111
114
  constructor() {
@@ -431,7 +434,13 @@ const FilePickerTemplate = (context) => {
431
434
  const buttonTag = context.tagFor(button_definition.Button);
432
435
  return fastElement.html`
433
436
  <div class="base">
434
- ${fastElement.when((x) => x.label, fastElement.html`<label>${(x) => x.label}</label>`)}
437
+ <div class="label-wrapper" ?hidden=${(x) => !x.label && !x._hasContextualHelp}>
438
+ ${fastElement.when(
439
+ (x) => x.label,
440
+ fastElement.html`<label class="label">${(x) => x.label}</label>`
441
+ )}
442
+ <slot name="contextual-help" ${fastElement.slotted("_contextualHelpSlottedContent")}></slot>
443
+ </div>
435
444
  <div class="control-wrapper">
436
445
  <button
437
446
  type="button"