@universal-material/web 3.0.91 → 3.0.93

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 (59) hide show
  1. package/card/card.d.ts.map +1 -1
  2. package/card/card.js +2 -1
  3. package/card/card.js.map +1 -1
  4. package/custom-elements.json +10254 -8425
  5. package/field/field-base.d.ts +3 -1
  6. package/field/field-base.d.ts.map +1 -1
  7. package/field/field-base.js +22 -11
  8. package/field/field-base.js.map +1 -1
  9. package/field/field-base.styles.d.ts.map +1 -1
  10. package/field/field-base.styles.js +14 -6
  11. package/field/field-base.styles.js.map +1 -1
  12. package/index.d.ts +2 -0
  13. package/index.d.ts.map +1 -1
  14. package/index.js +2 -0
  15. package/index.js.map +1 -1
  16. package/navigation/side-navigation.d.ts.map +1 -1
  17. package/navigation/side-navigation.js +18 -7
  18. package/navigation/side-navigation.js.map +1 -1
  19. package/package.json +4 -4
  20. package/select/select.d.ts +1 -1
  21. package/select/select.d.ts.map +1 -1
  22. package/select/select.js +5 -1
  23. package/select/select.js.map +1 -1
  24. package/shared/char-count-text-field/native-text-field-wrapper.d.ts +14 -0
  25. package/shared/char-count-text-field/native-text-field-wrapper.d.ts.map +1 -0
  26. package/shared/char-count-text-field/native-text-field-wrapper.js +54 -0
  27. package/shared/char-count-text-field/native-text-field-wrapper.js.map +1 -0
  28. package/shared/text-field-base/text-field-base.d.ts +1 -1
  29. package/shared/text-field-base/text-field-base.d.ts.map +1 -1
  30. package/shared/text-field-base/text-field-base.js +1 -0
  31. package/shared/text-field-base/text-field-base.js.map +1 -1
  32. package/snackbar/snackbar.d.ts.map +1 -1
  33. package/snackbar/snackbar.js +25 -17
  34. package/snackbar/snackbar.js.map +1 -1
  35. package/tab-bar/tab-bar.d.ts.map +1 -1
  36. package/tab-bar/tab-bar.js +33 -17
  37. package/tab-bar/tab-bar.js.map +1 -1
  38. package/tab-bar/tab.d.ts.map +1 -1
  39. package/tab-bar/tab.js +6 -5
  40. package/tab-bar/tab.js.map +1 -1
  41. package/text-area/text-area.d.ts +15 -0
  42. package/text-area/text-area.d.ts.map +1 -0
  43. package/text-area/text-area.js +51 -0
  44. package/text-area/text-area.js.map +1 -0
  45. package/text-area/text-area.styles.d.ts +2 -0
  46. package/text-area/text-area.styles.d.ts.map +1 -0
  47. package/text-area/text-area.styles.js +39 -0
  48. package/text-area/text-area.styles.js.map +1 -0
  49. package/text-field/text-field.d.ts +2 -7
  50. package/text-field/text-field.d.ts.map +1 -1
  51. package/text-field/text-field.js +9 -31
  52. package/text-field/text-field.js.map +1 -1
  53. package/text-field/text-field.styles.d.ts.map +1 -1
  54. package/text-field/text-field.styles.js +14 -0
  55. package/text-field/text-field.styles.js.map +1 -1
  56. package/typeahead/typeahead.d.ts +2 -0
  57. package/typeahead/typeahead.d.ts.map +1 -1
  58. package/typeahead/typeahead.js +28 -24
  59. package/typeahead/typeahead.js.map +1 -1
@@ -0,0 +1,51 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, nothing } from 'lit';
8
+ import { customElement, property, query } from 'lit/decorators.js';
9
+ import { live } from 'lit/directives/live.js';
10
+ import { styles } from './text-area.styles.js';
11
+ import { UmNativeTextFieldWrapper } from '../shared/char-count-text-field/native-text-field-wrapper.js';
12
+ import { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';
13
+ let UmTextArea = class UmTextArea extends UmNativeTextFieldWrapper {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.rows = 2;
17
+ }
18
+ static { this.styles = [UmTextFieldBase.styles, styles]; }
19
+ renderControl() {
20
+ return html `
21
+ <div class="input">
22
+ <textarea
23
+ part="input"
24
+ id=${this.id || nothing}
25
+ aria-labelledby="label"
26
+ aria-describedBy="supporting-text"
27
+ ?disabled=${this.disabled}
28
+ spellcheck=${this.spellcheck}
29
+ autocomplete=${this.autocomplete}
30
+ autocapitalize=${this.autocapitalize}
31
+ role=${this.role}
32
+ maxlength=${this.maxlength ?? nothing}
33
+ .rows=${this.rows}
34
+ .placeholder=${this.placeholder}
35
+ .value=${live(this._value)}
36
+ @input=${this._handleInput}></textarea>
37
+ </div>
38
+ `;
39
+ }
40
+ };
41
+ __decorate([
42
+ property({ type: Number })
43
+ ], UmTextArea.prototype, "rows", void 0);
44
+ __decorate([
45
+ query('textarea')
46
+ ], UmTextArea.prototype, "input", void 0);
47
+ UmTextArea = __decorate([
48
+ customElement('u-text-area')
49
+ ], UmTextArea);
50
+ export { UmTextArea };
51
+ //# sourceMappingURL=text-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-area.js","sourceRoot":"","sources":["../../src/text-area/text-area.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,IAAI,EAAsB,OAAO,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,8DAA8D,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAGxE,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,wBAAwB;IAAjD;;QAGuB,SAAI,GAAG,CAAC,CAAC;IAyBvC,CAAC;aA3BiB,WAAM,GAAmB,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,AAAnD,CAAoD;IAMvD,aAAa;QAC9B,OAAO,IAAI,CAAA;;;;eAIA,IAAI,CAAC,EAAE,IAAI,OAAO;;;sBAGX,IAAI,CAAC,QAAQ;uBACZ,IAAI,CAAC,UAAU;yBACb,IAAI,CAAC,YAAY;2BACf,IAAI,CAAC,cAAc;iBAC7B,IAAI,CAAC,IAAI;sBACJ,IAAI,CAAC,SAAS,IAAI,OAAO;kBAC7B,IAAI,CAAC,IAAI;yBACF,IAAI,CAAC,WAAW;mBACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;mBACjB,IAAI,CAAC,YAAY;;KAE/B,CAAC;IACJ,CAAC;;AAxB2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCAAU;AAET;IAA3B,KAAK,CAAC,UAAU,CAAC;yCAAsC;AAL7C,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CA4BtB","sourcesContent":["import { CSSResultGroup } from '@lit/reactive-element/css-tag';\nimport { html, HTMLTemplateResult, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { styles } from './text-area.styles.js';\n\nimport { UmNativeTextFieldWrapper } from '../shared/char-count-text-field/native-text-field-wrapper.js';\nimport { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';\n\n@customElement('u-text-area')\nexport class UmTextArea extends UmNativeTextFieldWrapper {\n static override styles: CSSResultGroup = [UmTextFieldBase.styles, styles];\n\n @property({ type: Number }) rows = 2;\n\n @query('textarea') override input!: HTMLTextAreaElement;\n\n protected override renderControl(): HTMLTemplateResult {\n return html`\n <div class=\"input\">\n <textarea\n part=\"input\"\n id=${this.id || nothing}\n aria-labelledby=\"label\"\n aria-describedBy=\"supporting-text\"\n ?disabled=${this.disabled}\n spellcheck=${this.spellcheck}\n autocomplete=${this.autocomplete}\n autocapitalize=${this.autocapitalize}\n role=${this.role}\n maxlength=${this.maxlength ?? nothing}\n .rows=${this.rows}\n .placeholder=${this.placeholder}\n .value=${live(this._value)}\n @input=${this._handleInput}></textarea>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-text-area': UmTextArea;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const styles: import("lit").CSSResult;
2
+ //# sourceMappingURL=text-area.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-area.styles.d.ts","sourceRoot":"","sources":["../../src/text-area/text-area.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAoClB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { css } from 'lit';
2
+ export const styles = css `
3
+ :host {
4
+ resize: both;
5
+ }
6
+
7
+ .container,
8
+ .input-wrapper {
9
+ resize: inherit;
10
+ }
11
+
12
+ .input-wrapper,
13
+ .input,
14
+ textarea,
15
+ .container {
16
+ height: 100%;
17
+ }
18
+
19
+ .input-wrapper {
20
+ padding: 0 !important;
21
+ overflow: hidden;
22
+ }
23
+
24
+ textarea {
25
+ margin: 0;
26
+ resize: none;
27
+ }
28
+
29
+ .input textarea {
30
+ border-block: var(--_vertical-padding) solid transparent;
31
+ padding-inline: var(--_field-control-inline-padding);
32
+ }
33
+
34
+ .container.filled:not(.no-label) textarea {
35
+ border-top: calc(var(--_vertical-padding) + var(--_label-line-height)) solid transparent;
36
+ border-bottom: var(--_vertical-padding) solid transparent;
37
+ }
38
+ `;
39
+ //# sourceMappingURL=text-area.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-area.styles.js","sourceRoot":"","sources":["../../src/text-area/text-area.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n :host {\n resize: both;\n }\n\n .container,\n .input-wrapper {\n resize: inherit;\n }\n\n .input-wrapper,\n .input,\n textarea,\n .container {\n height: 100%;\n }\n\n .input-wrapper {\n padding: 0 !important;\n overflow: hidden;\n }\n\n textarea {\n margin: 0;\n resize: none;\n }\n\n .input textarea {\n border-block: var(--_vertical-padding) solid transparent;\n padding-inline: var(--_field-control-inline-padding);\n }\n\n .container.filled:not(.no-label) textarea {\n border-top: calc(var(--_vertical-padding) + var(--_label-line-height)) solid transparent;\n border-bottom: var(--_vertical-padding) solid transparent;\n }\n`;\n"]}
@@ -1,18 +1,13 @@
1
1
  import { CSSResultGroup } from '@lit/reactive-element/css-tag';
2
2
  import { HTMLTemplateResult } from 'lit';
3
- import { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';
4
- export declare class UmTextField extends UmTextFieldBase {
5
- #private;
3
+ import { UmNativeTextFieldWrapper } from '../shared/char-count-text-field/native-text-field-wrapper.js';
4
+ export declare class UmTextField extends UmNativeTextFieldWrapper {
6
5
  static styles: CSSResultGroup;
7
- get value(): string;
8
- set value(value: string);
9
6
  type: string;
10
7
  prefixText: string | undefined;
11
8
  suffixText: string | undefined;
12
- autocomplete: 'on' | 'off' | string | undefined;
13
9
  autocapitalize: string;
14
10
  input: HTMLInputElement;
15
- focus(): void;
16
11
  protected renderControl(): HTMLTemplateResult;
17
12
  }
18
13
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../src/text-field/text-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAQ,kBAAkB,EAAW,MAAM,KAAK,CAAC;AAMxD,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAE/E,qBACa,WAAY,SAAQ,eAAe;;IAE9C,OAAgB,MAAM,EAAE,cAAc,CAGpC;IAIF,IACI,KAAK,IAGQ,MAAM,CADtB;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAItB;IAEW,IAAI,EAAE,MAAM,CAAU;IACI,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,YAAY,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IACvC,cAAc,EAAG,MAAM,CAAC;IAE5C,KAAK,EAAG,gBAAgB,CAAC;IAEhC,KAAK;cAIK,aAAa,IAAI,kBAAkB;CA8BvD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,WAAW,CAAC;KAC7B;CACF"}
1
+ {"version":3,"file":"text-field.d.ts","sourceRoot":"","sources":["../../src/text-field/text-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAQ,kBAAkB,EAAW,MAAM,KAAK,CAAC;AAMxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8DAA8D,CAAC;AAGxG,qBACa,WAAY,SAAQ,wBAAwB;IACvD,OAAgB,MAAM,EAAE,cAAc,CAAoC;IAE9D,IAAI,EAAE,MAAM,CAAU;IACM,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,cAAc,EAAG,MAAM,CAAC;IAE9C,KAAK,EAAG,gBAAgB,CAAC;cAEtB,aAAa,IAAI,kBAAkB;CA2BvD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,WAAW,CAAC;KAC7B;CACF"}
@@ -8,29 +8,14 @@ import { html, nothing } from 'lit';
8
8
  import { customElement, property, query } from 'lit/decorators.js';
9
9
  import { live } from 'lit/directives/live.js';
10
10
  import { styles } from './text-field.styles.js';
11
+ import { UmNativeTextFieldWrapper } from '../shared/char-count-text-field/native-text-field-wrapper.js';
11
12
  import { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';
12
- let UmTextField = class UmTextField extends UmTextFieldBase {
13
+ let UmTextField = class UmTextField extends UmNativeTextFieldWrapper {
13
14
  constructor() {
14
15
  super(...arguments);
15
- this.#value = '';
16
16
  this.type = 'text';
17
17
  }
18
- static { this.styles = [
19
- UmTextFieldBase.styles,
20
- styles
21
- ]; }
22
- #value;
23
- get value() {
24
- return this.#value;
25
- }
26
- set value(value) {
27
- this.#value = value;
28
- this.empty = !value;
29
- this.elementInternals.setFormValue(value);
30
- }
31
- focus() {
32
- this.input.focus();
33
- }
18
+ static { this.styles = [UmTextFieldBase.styles, styles]; }
34
19
  renderControl() {
35
20
  return html `
36
21
  <slot class="prefix" name="prefix">
@@ -44,25 +29,21 @@ let UmTextField = class UmTextField extends UmTextFieldBase {
44
29
  aria-labelledby="label"
45
30
  aria-describedBy="supporting-text"
46
31
  ?disabled=${this.disabled}
47
- placeholder=${this.placeholder || nothing}
48
32
  spellcheck=${this.spellcheck}
49
33
  autocomplete=${this.autocomplete}
50
34
  autocapitalize=${this.autocapitalize}
51
35
  role=${this.role}
52
- .value=${live(this.#value)}
53
- @input=${this.#handleInput} />
36
+ maxlength=${this.maxlength ?? nothing}
37
+ .placeholder=${this.placeholder}
38
+ .value=${live(this._value)}
39
+ @input=${this._handleInput} />
54
40
  </div>
55
41
  <slot class="suffix" name="suffix">
56
42
  <span>${this.suffixText}</span>
57
- </slot>`;
58
- }
59
- #handleInput() {
60
- this.value = this.input.value;
43
+ </slot>
44
+ `;
61
45
  }
62
46
  };
63
- __decorate([
64
- property()
65
- ], UmTextField.prototype, "value", null);
66
47
  __decorate([
67
48
  property()
68
49
  ], UmTextField.prototype, "type", void 0);
@@ -72,9 +53,6 @@ __decorate([
72
53
  __decorate([
73
54
  property({ attribute: 'suffix-text' })
74
55
  ], UmTextField.prototype, "suffixText", void 0);
75
- __decorate([
76
- property({ reflect: true })
77
- ], UmTextField.prototype, "autocomplete", void 0);
78
56
  __decorate([
79
57
  property({ reflect: true })
80
58
  ], UmTextField.prototype, "autocapitalize", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.js","sourceRoot":"","sources":["../../src/text-field/text-field.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,IAAI,EAAsB,OAAO,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAGxE,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,eAAe;IAAzC;;QAOL,WAAM,GAAW,EAAE,CAAC;QAYR,SAAI,GAAW,MAAM,CAAC;IA0CpC,CAAC;aA3DiB,WAAM,GAAmB;QACvC,eAAe,CAAC,MAAM;QACtB,MAAM;KACP,AAHqB,CAGpB;IAEF,MAAM,CAAc;IAGpB,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,CAAC,KAAa;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAUQ,KAAK;QACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEkB,aAAa;QAE9B,OAAO,IAAI,CAAA;;gBAEC,IAAI,CAAC,UAAU;;;;iBAId,IAAI,CAAC,IAAI;;eAEX,IAAI,CAAC,EAAE,IAAI,OAAO;;;sBAGX,IAAI,CAAC,QAAQ;wBACX,IAAI,CAAC,WAAW,IAAI,OAAO;uBAC5B,IAAI,CAAC,UAAU;yBACb,IAAI,CAAC,YAAY;2BACf,IAAI,CAAC,cAAc;iBAC7B,IAAI,CAAC,IAAI;mBACP,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;mBACjB,IAAI,CAAC,YAAY;;;gBAGpB,IAAI,CAAC,UAAU;cACjB,CAAC;IACb,CAAC;IAED,YAAY;QACV,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAChC,CAAC;;AAlDD;IADC,QAAQ,EAAE;wCAGV;AAOW;IAAX,QAAQ,EAAE;yCAAuB;AACI;IAArC,QAAQ,CAAC,EAAC,SAAS,EAAE,aAAa,EAAC,CAAC;+CAAgC;AAC/B;IAArC,QAAQ,CAAC,EAAC,SAAS,EAAE,aAAa,EAAC,CAAC;+CAAgC;AAC1C;IAA1B,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;iDAAiD;AACvC;IAAnC,QAAQ,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;mDAAkC;AAE5C;IAAf,KAAK,CAAC,OAAO,CAAC;0CAA0B;AAzB9B,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA6DvB","sourcesContent":["import { CSSResultGroup } from '@lit/reactive-element/css-tag';\nimport { html, HTMLTemplateResult, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { styles } from './text-field.styles.js';\n\nimport { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';\n\n@customElement('u-text-field')\nexport class UmTextField extends UmTextFieldBase {\n\n static override styles: CSSResultGroup = [\n UmTextFieldBase.styles,\n styles\n ];\n\n #value: string = '';\n\n @property()\n get value() {\n return this.#value;\n }\n set value(value: string) {\n this.#value = value;\n this.empty = !value;\n this.elementInternals.setFormValue(value);\n }\n\n @property() type: string = 'text';\n @property({attribute: 'prefix-text'}) prefixText: string | undefined;\n @property({attribute: 'suffix-text'}) suffixText: string | undefined;\n @property({reflect: true}) autocomplete: 'on' | 'off' | string | undefined;\n @property({reflect: true}) override autocapitalize!: string;\n\n @query('input') input!: HTMLInputElement;\n\n override focus() {\n this.input.focus();\n }\n\n protected override renderControl(): HTMLTemplateResult {\n\n return html`\n <slot class=\"prefix\" name=\"prefix\">\n <span>${this.prefixText}</span>\n </slot>\n <div class=\"input\">\n <input\n type=${this.type}\n part=\"input\"\n id=${this.id || nothing}\n aria-labelledby=\"label\"\n aria-describedBy=\"supporting-text\"\n ?disabled=${this.disabled}\n placeholder=${this.placeholder || nothing}\n spellcheck=${this.spellcheck}\n autocomplete=${this.autocomplete}\n autocapitalize=${this.autocapitalize}\n role=${this.role}\n .value=${live(this.#value)}\n @input=${this.#handleInput} />\n </div>\n <slot class=\"suffix\" name=\"suffix\">\n <span>${this.suffixText}</span>\n </slot>`;\n }\n\n #handleInput() {\n this.value = this.input.value;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-text-field': UmTextField;\n }\n}\n"]}
1
+ {"version":3,"file":"text-field.js","sourceRoot":"","sources":["../../src/text-field/text-field.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,IAAI,EAAsB,OAAO,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8DAA8D,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAGxE,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,wBAAwB;IAAlD;;QAGO,SAAI,GAAW,MAAM,CAAC;IAkCpC,CAAC;aApCiB,WAAM,GAAmB,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,AAAnD,CAAoD;IASvD,aAAa;QAC9B,OAAO,IAAI,CAAA;;gBAEC,IAAI,CAAC,UAAU;;;;iBAId,IAAI,CAAC,IAAI;;eAEX,IAAI,CAAC,EAAE,IAAI,OAAO;;;sBAGX,IAAI,CAAC,QAAQ;uBACZ,IAAI,CAAC,UAAU;yBACb,IAAI,CAAC,YAAY;2BACf,IAAI,CAAC,cAAc;iBAC7B,IAAI,CAAC,IAAI;sBACJ,IAAI,CAAC,SAAS,IAAI,OAAO;yBACtB,IAAI,CAAC,WAAW;mBACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;mBACjB,IAAI,CAAC,YAAY;;;gBAGpB,IAAI,CAAC,UAAU;;KAE1B,CAAC;IACJ,CAAC;;AAjCW;IAAX,QAAQ,EAAE;yCAAuB;AACM;IAAvC,QAAQ,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;+CAAgC;AAC/B;IAAvC,QAAQ,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;+CAAgC;AACjC;IAArC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;mDAAkC;AAE9C;IAAf,KAAK,CAAC,OAAO,CAAC;0CAA0B;AAR9B,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CAqCvB","sourcesContent":["import { CSSResultGroup } from '@lit/reactive-element/css-tag';\nimport { html, HTMLTemplateResult, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { styles } from './text-field.styles.js';\n\nimport { UmNativeTextFieldWrapper } from '../shared/char-count-text-field/native-text-field-wrapper.js';\nimport { UmTextFieldBase } from '../shared/text-field-base/text-field-base.js';\n\n@customElement('u-text-field')\nexport class UmTextField extends UmNativeTextFieldWrapper {\n static override styles: CSSResultGroup = [UmTextFieldBase.styles, styles];\n\n @property() type: string = 'text';\n @property({ attribute: 'prefix-text' }) prefixText: string | undefined;\n @property({ attribute: 'suffix-text' }) suffixText: string | undefined;\n @property({ reflect: true }) override autocapitalize!: string;\n\n @query('input') input!: HTMLInputElement;\n\n protected override renderControl(): HTMLTemplateResult {\n return html`\n <slot class=\"prefix\" name=\"prefix\">\n <span>${this.prefixText}</span>\n </slot>\n <div class=\"input\">\n <input\n type=${this.type}\n part=\"input\"\n id=${this.id || nothing}\n aria-labelledby=\"label\"\n aria-describedBy=\"supporting-text\"\n ?disabled=${this.disabled}\n spellcheck=${this.spellcheck}\n autocomplete=${this.autocomplete}\n autocapitalize=${this.autocapitalize}\n role=${this.role}\n maxlength=${this.maxlength ?? nothing}\n .placeholder=${this.placeholder}\n .value=${live(this._value)}\n @input=${this._handleInput} />\n </div>\n <slot class=\"suffix\" name=\"suffix\">\n <span>${this.suffixText}</span>\n </slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-text-field': UmTextField;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.styles.d.ts","sourceRoot":"","sources":["../../src/text-field/text-field.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAwBlB,CAAC"}
1
+ {"version":3,"file":"text-field.styles.d.ts","sourceRoot":"","sources":["../../src/text-field/text-field.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAsClB,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import { css } from 'lit';
2
2
  export const styles = css `
3
+ .prefix::slotted(*),
4
+ .prefix span,
5
+ .suffix::slotted(*),
6
+ .suffix span {
7
+ transition: opacity 150ms 100ms;
8
+ }
3
9
  .prefix span:empty,
4
10
  .suffix span:empty {
5
11
  display: none;
@@ -23,5 +29,13 @@ export const styles = css `
23
29
  :host([disabled]) .suffix span, :host([disabled]) .suffix::slotted(*) {
24
30
  color: var(--u-text-field-suffix-color, var(--u-text-field-affix-color, rgba(var(--u-color-on-surface-rgb, 29, 27, 32), var(--u-field-disabled-opacity, 0.38))));
25
31
  }
32
+
33
+ :host([empty]:not(:focus-within)) .container:not(.no-label) .suffix::slotted(*),
34
+ :host([empty]:not(:focus-within)) .container:not(.no-label) .suffix span,
35
+ :host([empty]:not(:focus-within)) .container:not(.no-label) .prefix::slotted(*),
36
+ :host([empty]:not(:focus-within)) .container:not(.no-label) .prefix span {
37
+ opacity: 0;
38
+ transition: opacity 150ms;
39
+ }
26
40
  `;
27
41
  //# sourceMappingURL=text-field.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-field.styles.js","sourceRoot":"","sources":["../../src/text-field/text-field.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n .prefix span:empty,\n .suffix span:empty {\n display: none;\n }\n\n .prefix::slotted(*),\n .prefix span {\n color: var(--u-field-prefix-color, var(--u-field-affix-color, var(--u-color-on-surface-variant, rgb(73, 69, 79))));\n margin-inline-end: var(--u-prefix-margin, var(--u-affix-margin, 2px));\n }\n\n .suffix::slotted(*),\n .suffix span {\n color: var(--u-field-suffix-color, var(--u-field-affix-color, var(--u-color-on-surface-variant, rgb(73, 69, 79))));\n margin-inline-start: var(--u-suffix-margin, var(--u-affix-margin, 2px));\n }\n\n :host([disabled]) .prefix span, :host([disabled]) .prefix::slotted(*) {\n color: var(--u-text-field-prefix-color, var(--u-text-field-affix-color, rgba(var(--u-color-on-surface-rgb, 29, 27, 32), var(--u-field-disabled-opacity, 0.38))));\n }\n :host([disabled]) .suffix span, :host([disabled]) .suffix::slotted(*) {\n color: var(--u-text-field-suffix-color, var(--u-text-field-affix-color, rgba(var(--u-color-on-surface-rgb, 29, 27, 32), var(--u-field-disabled-opacity, 0.38))));\n }\n`;\n"]}
1
+ {"version":3,"file":"text-field.styles.js","sourceRoot":"","sources":["../../src/text-field/text-field.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCzB,CAAC","sourcesContent":["import { css } from 'lit';\n\nexport const styles = css `\n .prefix::slotted(*),\n .prefix span,\n .suffix::slotted(*),\n .suffix span {\n transition: opacity 150ms 100ms;\n }\n .prefix span:empty,\n .suffix span:empty {\n display: none;\n }\n\n .prefix::slotted(*),\n .prefix span {\n color: var(--u-field-prefix-color, var(--u-field-affix-color, var(--u-color-on-surface-variant, rgb(73, 69, 79))));\n margin-inline-end: var(--u-prefix-margin, var(--u-affix-margin, 2px));\n }\n\n .suffix::slotted(*),\n .suffix span {\n color: var(--u-field-suffix-color, var(--u-field-affix-color, var(--u-color-on-surface-variant, rgb(73, 69, 79))));\n margin-inline-start: var(--u-suffix-margin, var(--u-affix-margin, 2px));\n }\n\n :host([disabled]) .prefix span, :host([disabled]) .prefix::slotted(*) {\n color: var(--u-text-field-prefix-color, var(--u-text-field-affix-color, rgba(var(--u-color-on-surface-rgb, 29, 27, 32), var(--u-field-disabled-opacity, 0.38))));\n }\n :host([disabled]) .suffix span, :host([disabled]) .suffix::slotted(*) {\n color: var(--u-text-field-suffix-color, var(--u-text-field-affix-color, rgba(var(--u-color-on-surface-rgb, 29, 27, 32), var(--u-field-disabled-opacity, 0.38))));\n }\n\n :host([empty]:not(:focus-within)) .container:not(.no-label) .suffix::slotted(*),\n :host([empty]:not(:focus-within)) .container:not(.no-label) .suffix span,\n :host([empty]:not(:focus-within)) .container:not(.no-label) .prefix::slotted(*),\n :host([empty]:not(:focus-within)) .container:not(.no-label) .prefix span {\n opacity: 0;\n transition: opacity 150ms;\n }\n`;\n"]}
@@ -1,6 +1,8 @@
1
1
  import { HTMLTemplateResult, LitElement } from 'lit';
2
2
  import { UmMenuItem } from '../menu/menu-item.js';
3
3
  import { UmMenu } from '../menu/menu.js';
4
+ import '../menu/menu.js';
5
+ import '../menu/menu-item.js';
4
6
  import './highlight.js';
5
7
  export interface Data {
6
8
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAM3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBACa,WAAY,SAAQ,UAAU;;IACzC,MAAM,CAAC,QAAQ,CAAC,cAAc,QAAQ;IAEtC,OAAgB,MAAM,0BAAU;IAKhC,OAAO,CAAC,MAAM,CAA6I;IASlJ,OAAO,CAAC,OAAO,CAAS;IAEjC;;OAEG;IACM,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAE1E;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAEhD;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAE7D;;OAEG;IACsC,QAAQ,SAAO;IAExD;;OAEG;IACsC,KAAK,SAAM;IAEpD;;;;OAIG;IACsC,SAAS,SAAK;IAEvD;;;;OAIG;IACmE,WAAW,UAAS;IAE1F;;OAEG;IACuC,QAAQ,UAAS;IAE3D;;OAEG;IACwB,YAAY,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAS;IAEvE;;OAEG;IACiC,UAAU,UAAS;IAEvD,IAAI,IAAI,IAAI,eAAe,GAAG,IAAI,CAEjC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,GAAG,CAEf;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAOnB;IAEQ,KAAK;IAId,KAAK;IASL;;OAEG;IACH,IACI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAMrC;IAEgB,KAAK,EAAG,MAAM,CAAC;IACP,UAAU,EAAG,UAAU,EAAE,CAAC;;IAO1C,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYhF,iBAAiB;IAQjB,oBAAoB;cAiGV,MAAM,IAAI,kBAAkB;IAuG/C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;CAarB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,WAAW,CAAC;KAC5B;CACF"}
1
+ {"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAa3D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,OAAO,iBAAiB,CAAC;AACzB,OAAO,sBAAsB,CAAC;AAC9B,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBACa,WAAY,SAAQ,UAAU;;IACzC,MAAM,CAAC,QAAQ,CAAC,cAAc,QAAQ;IAEtC,OAAgB,MAAM,0BAAU;IAKhC,OAAO,CAAC,MAAM,CAOE;IASP,OAAO,CAAC,OAAO,CAAS;IAEjC;;OAEG;IACM,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAE1E;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAEhD;;;;OAIG;IACH,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAE7D;;OAEG;IACwC,QAAQ,SAAO;IAE1D;;OAEG;IACwC,KAAK,SAAM;IAEtD;;;;OAIG;IACwC,SAAS,SAAK;IAEzD;;;;OAIG;IAEH,WAAW,UAAS;IAEpB;;OAEG;IACyC,QAAQ,UAAS;IAE7D;;OAEG;IAC0B,YAAY,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAS;IAEzE;;OAEG;IACmC,UAAU,UAAS;IAEzD,IAAI,IAAI,IAAI,eAAe,GAAG,IAAI,CAEjC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,GAAG,CAEf;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAOnB;IAEQ,KAAK;IAId,KAAK;IASL;;OAEG;IACH,IACI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAMrC;IAEgB,KAAK,EAAG,MAAM,CAAC;IACP,UAAU,EAAG,UAAU,EAAE,CAAC;;IAO1C,wBAAwB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI;IAab,iBAAiB;IAWjB,oBAAoB;cAyGV,MAAM,IAAI,kBAAkB;IA0G/C,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;CAWrB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,WAAW,CAAC;KAC5B;CACF"}
@@ -6,10 +6,12 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { html, LitElement } from 'lit';
8
8
  import { unsafeHTML } from 'lit-html/directives/unsafe-html.js';
9
- import { customElement, property, query, queryAll, state } from 'lit/decorators.js';
9
+ import { customElement, property, query, queryAll, state, } from 'lit/decorators.js';
10
10
  import { styles } from './typeahead.styles.js';
11
11
  import { MenuFieldNavigationController } from '../shared/menu-field/menu-field-navigation-controller.js';
12
12
  import { normalizeText } from '../shared/normalize-text.js';
13
+ import '../menu/menu.js';
14
+ import '../menu/menu-item.js';
13
15
  import './highlight.js';
14
16
  let UmTypeahead = class UmTypeahead extends LitElement {
15
17
  static { this.formAssociated = true; }
@@ -128,7 +130,10 @@ let UmTypeahead = class UmTypeahead extends LitElement {
128
130
  this.#connected = true;
129
131
  this.#attach();
130
132
  this.#documentMutationObserver = new MutationObserver(() => this.#attach());
131
- this.#documentMutationObserver.observe(document, { attributes: true, childList: true });
133
+ this.#documentMutationObserver.observe(document, {
134
+ attributes: true,
135
+ childList: true,
136
+ });
132
137
  }
133
138
  disconnectedCallback() {
134
139
  super.disconnectedCallback();
@@ -152,7 +157,7 @@ let UmTypeahead = class UmTypeahead extends LitElement {
152
157
  }
153
158
  // @ts-ignore
154
159
  this.target = newTarget;
155
- newTarget.role = "combobox";
160
+ newTarget.role = 'combobox';
156
161
  newTarget.autocomplete = this.autocomplete;
157
162
  newTarget.spellcheck = this.spellcheck;
158
163
  newTarget.autocapitalize = 'off';
@@ -176,7 +181,7 @@ let UmTypeahead = class UmTypeahead extends LitElement {
176
181
  return () => {
177
182
  const selectedEvent = new CustomEvent('selected', {
178
183
  cancelable: true,
179
- detail: data.value
184
+ detail: data.value,
180
185
  });
181
186
  this.dispatchEvent(selectedEvent);
182
187
  if (selectedEvent.defaultPrevented) {
@@ -206,13 +211,18 @@ let UmTypeahead = class UmTypeahead extends LitElement {
206
211
  });
207
212
  return html `
208
213
  <u-menu manualFocus anchor-corner="auto-start">
209
- ${this.results
210
- .map(result => {
214
+ ${this.results.map(result => {
211
215
  const content = this.template
212
216
  ? unsafeHTML(this.template(this.#termNormalized, result.value))
213
- : html `<u-highlight .term=${this.#termNormalized} .result=${result.label}></u-highlight>`;
214
- return html `
215
- <u-menu-item @click=${this.#getItemClickHandler(result)} tabindex="-1">${content}</u-menu-item>`;
217
+ : html `<u-highlight
218
+ .term=${this.#termNormalized}
219
+ .result=${result.label}
220
+ ></u-highlight>`;
221
+ return html ` <u-menu-item
222
+ @click=${this.#getItemClickHandler(result)}
223
+ tabindex="-1"
224
+ >${content}</u-menu-item
225
+ >`;
216
226
  })}
217
227
  </u-menu>
218
228
  `;
@@ -220,7 +230,9 @@ let UmTypeahead = class UmTypeahead extends LitElement {
220
230
  async #updateResults(lazy = false) {
221
231
  const term = this.getTargetValue();
222
232
  const termNormalized = normalizeText(term).toLowerCase();
223
- if (lazy && termNormalized === this.#termNormalized && this._menu?.open === true) {
233
+ if (lazy &&
234
+ termNormalized === this.#termNormalized &&
235
+ this._menu?.open === true) {
224
236
  return;
225
237
  }
226
238
  this.#termNormalized = termNormalized;
@@ -245,20 +257,14 @@ let UmTypeahead = class UmTypeahead extends LitElement {
245
257
  const source = this.source;
246
258
  values = await source(this.#termNormalized);
247
259
  }
248
- const result = values
249
- .map(source => ({
250
- label: this.formatter
251
- ? this.formatter(source)
252
- : source.toString(),
253
- value: source
260
+ const result = values.map(source => ({
261
+ label: this.formatter ? this.formatter(source) : source.toString(),
262
+ value: source,
254
263
  }));
255
264
  if (!filter) {
256
265
  return result;
257
266
  }
258
- return result
259
- .filter(t => normalizeText(t.label)
260
- .toLowerCase()
261
- .includes(this.#termNormalized));
267
+ return result.filter(t => normalizeText(t.label).toLowerCase().includes(this.#termNormalized));
262
268
  }
263
269
  #setValueOnTarget() {
264
270
  if (!this.target) {
@@ -301,9 +307,7 @@ let UmTypeahead = class UmTypeahead extends LitElement {
301
307
  if (!this.value) {
302
308
  return '';
303
309
  }
304
- return this.formatter
305
- ? this.formatter(this.value)
306
- : this.value;
310
+ return this.formatter ? this.formatter(this.value) : this.value;
307
311
  }
308
312
  #handleClick(e) {
309
313
  e.stopPropagation();
@@ -337,7 +341,7 @@ __decorate([
337
341
  property({ reflect: true })
338
342
  ], UmTypeahead.prototype, "spellcheck", void 0);
339
343
  __decorate([
340
- property({ reflect: true, attribute: "target-id" })
344
+ property({ reflect: true, attribute: 'target-id' })
341
345
  ], UmTypeahead.prototype, "targetId", null);
342
346
  __decorate([
343
347
  query('u-menu')
@@ -1 +1 @@
1
- {"version":3,"file":"typeahead.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, HTMLTemplateResult, LitElement } from 'lit';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { customElement, property, query, queryAll, state } from 'lit/decorators.js';\n\nimport { styles } from './typeahead.styles.js';\n\nimport { UmMenuItem } from '../menu/menu-item.js';\nimport { UmMenu } from '../menu/menu.js';\nimport { MenuFieldNavigationController } from '../shared/menu-field/menu-field-navigation-controller.js';\nimport { normalizeText } from '../shared/normalize-text.js';\n\nimport './highlight.js';\n\nexport interface Data {\n label: string;\n value: any;\n}\n\n@customElement('u-typeahead')\nexport class UmTypeahead extends LitElement {\n static readonly formAssociated = true;\n\n static override styles = styles;\n\n #targetId: string | undefined;\n\n #connected = false;\n private target: HTMLElement & {autocomplete: 'on' | 'off' | string | null; input?: HTMLInputElement; container?: HTMLElement; value: string} | null = null;\n #documentMutationObserver: MutationObserver | null = null;\n #navigationController = new MenuFieldNavigationController(this);\n #termNormalized: string = '';\n #debounceTimeout: number | null = null;\n #value: any;\n readonly #elementInternals: ElementInternals;\n\n // @ts-ignore\n @state() private results: Data[];\n\n /**\n * The datasource of the typeahead. Accepts an `Array` or a `Promise<[]>`.\n */\n @state() source: (any[] | ((term: string) => Promise<any[]>)) | undefined;\n\n /**\n * A function return a string based on a result from the `source`. Useful when the source results are objects.\n */\n formatter: ((value: any) => string) | undefined;\n\n /**\n * A string representing an HTML to be rendered inside the menu item. If set, it will replace the `u-highlight`.\n *\n * _Note:_ Subject to signature change\n */\n template: ((term: string, value: any) => string) | undefined;\n\n /**\n * The time in milliseconds before triggering an update in the results.\n */\n @property({type: Number, reflect: true}) debounce = 300;\n\n /**\n * The number of suggestions to show\n */\n @property({type: Number, reflect: true}) limit = 10;\n\n /**\n * How many characters must be typed before show suggestions\n *\n * _Note:_ Not used when the source is a `Promise`\n */\n @property({type: Number, reflect: true}) minLength = 2;\n\n /**\n * Whether the menu will be show when the target get focus.\n *\n * _Note:_ The `minLength` will still be applied\n */\n @property({type: Boolean, attribute: 'open-on-focus', reflect: true}) openOnFocus = false;\n\n /**\n * If `true`, model values will not be restricted only to items selected from the menu.\n */\n @property({type: Boolean, reflect: true}) editable = false;\n\n /**\n * The value for the `autocomplete` attribute for the target element.\n */\n @property({reflect: true}) autocomplete: 'on' | 'off' | string = 'off';\n\n /**\n * The value for the `spellcheck` attribute for the target element.\n */\n @property({reflect: true}) override spellcheck = false;\n\n get form(): HTMLFormElement | null {\n return this.#elementInternals.form;\n }\n\n /**\n * Gets or sets the current value of the typeahead.\n */\n get value(): any {\n return this.#value;\n }\n set value(value: any) {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n\n if (this.#connected) {\n this.#setValueOnTarget();\n }\n }\n\n override focus() {\n this.target?.focus();\n }\n\n clear() {\n if (!this.target) {\n return;\n }\n\n this.#termNormalized = '';\n this.setTargetValue('');\n }\n\n /**\n * The id of the target element to attach the typeahead.\n */\n @property({reflect: true, attribute: \"target-id\"})\n get targetId(): string | undefined {\n return this.#targetId;\n }\n set targetId(value: string | undefined) {\n this.#targetId = value;\n\n if (this.#connected) {\n this.#attach();\n }\n }\n\n @query('u-menu') _menu!: UmMenu;\n @queryAll('u-menu-item') _menuItems!: UmMenuItem[];\n\n constructor() {\n super();\n this.#elementInternals = this.attachInternals();\n }\n\n override attributeChangedCallback(name: string, _old: string | null, value: string | null) {\n super.attributeChangedCallback(name, _old, value);\n\n if (name === 'autocomplete') {\n this.target!.autocomplete = value;\n }\n\n if (name === 'spellcheck') {\n this.target!.spellcheck = value === 'true';\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.#connected = true;\n this.#attach();\n this.#documentMutationObserver = new MutationObserver(() => this.#attach())\n this.#documentMutationObserver.observe(document, {attributes: true, childList: true});\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#connected = false;\n this.#detach();\n this.#documentMutationObserver!.disconnect();\n this.#documentMutationObserver = null;\n }\n\n #attach() {\n if (!this.targetId) {\n this.#detach();\n return;\n }\n\n const newTarget = document.getElementById(this.targetId) as HTMLInputElement;\n\n if (newTarget === this.target) {\n return;\n }\n\n this.#detach();\n\n if (!newTarget) {\n return;\n }\n\n // @ts-ignore\n this.target = newTarget;\n newTarget.role = \"combobox\";\n newTarget.autocomplete = <any>this.autocomplete;\n newTarget.spellcheck = this.spellcheck;\n newTarget.autocapitalize = 'off';\n\n newTarget.addEventListener('click', this.#handleClick);\n newTarget.addEventListener('input', this.#handleInput);\n this.#navigationController.attach(newTarget);\n newTarget.addEventListener('focus', this.#handleFocus);\n\n if (this.value) {\n this.#setValueOnTarget();\n }\n }\n\n #detach() {\n this.target?.removeEventListener('click', this.#handleClick);\n this.target?.removeEventListener('input', this.#handleInput);\n this.#navigationController.detach();\n this.target?.removeEventListener('focus', this.#handleFocus);\n }\n\n #handleFocus = async () => {\n if (this.openOnFocus) {\n await this.#updateResults();\n }\n }\n\n #handleInput = () => {\n\n if (this.#debounceTimeout) {\n clearTimeout(this.#debounceTimeout);\n }\n\n this.#setValueAndDispatchEvents(this.editable ? this.getTargetValue() : null, true);\n\n this.#debounceTimeout = setTimeout(async () => await this.#updateResults(true), this.debounce);\n }\n\n #getItemClickHandler(data: Data) {\n return () => {\n const selectedEvent = new CustomEvent('selected', {\n cancelable: true,\n detail: data.value\n });\n\n this.dispatchEvent(selectedEvent);\n\n if (selectedEvent.defaultPrevented) {\n return;\n }\n\n this.#setValueAndDispatchEvents(data.value);\n }\n }\n\n #setValueAndDispatchEvents(value: any, direct = false) {\n\n if (!direct) {\n this.value = value;\n } else {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n }\n\n this.dispatchEvent(new InputEvent('input', {bubbles: true, composed: true}));\n this.dispatchEvent(new Event('change', {bubbles: true}));\n }\n\n protected override render(): HTMLTemplateResult {\n\n if (!this.results?.length) {\n return html``;\n }\n\n setTimeout(() => {\n this._menu.anchorElement = this.getMenuAnchor();\n this._menu.open = true;\n });\n\n return html`\n <u-menu manualFocus anchor-corner=\"auto-start\">\n ${this.results\n .map(result => {\n const content = this.template\n ? unsafeHTML(this.template(this.#termNormalized, result.value))\n : html`<u-highlight .term=${this.#termNormalized} .result=${result.label}></u-highlight>`;\n \n return html`\n <u-menu-item @click=${this.#getItemClickHandler(result)} tabindex=\"-1\">${content}</u-menu-item>`;\n })}\n </u-menu>\n `;\n }\n\n async #updateResults(lazy = false) {\n\n const term = this.getTargetValue();\n\n const termNormalized = normalizeText(term).toLowerCase();\n\n if (lazy && termNormalized === this.#termNormalized && this._menu?.open === true) {\n return;\n }\n\n this.#termNormalized = termNormalized;\n\n if (termNormalized.length < this.minLength) {\n this.results = [];\n return;\n }\n\n this.results = await this.#getData();\n this.results = this.results.slice(0, this.limit || this.results.length);\n }\n\n async #getData(): Promise<Data[]> {\n if (!this.source) {\n return [];\n }\n\n let values: any[]\n\n let filter = false;\n\n if (this.source instanceof Array) {\n values = this.source;\n filter = true;\n } else {\n const source = this.source as ((term: string) => Promise<any[]>);\n values = await source(this.#termNormalized);\n }\n\n const result = values\n .map(source => ({\n label: this.formatter\n ? this.formatter(source)\n : source.toString(),\n value: source\n }));\n\n if (!filter) {\n return result;\n }\n\n return result\n .filter(t => normalizeText(t.label)\n .toLowerCase()\n .includes(this.#termNormalized))\n }\n\n #setValueOnTarget() {\n if (!this.target) {\n return;\n }\n\n const textValue = this.getTextValue();\n this.#termNormalized = normalizeText(textValue)?.toLowerCase();\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n this.target.value = textValue;\n return;\n }\n\n if (this.target.input) {\n this.target.input.value = textValue;\n return;\n }\n \n this.target.value = textValue;\n }\n\n private getTargetValue(): string {\n return this.target!.input?.value ?? this.target!.value;\n }\n\n private setTargetValue(value: string): void {\n const targetInput = this.target?.input ?? this.target;\n\n if (targetInput) {\n targetInput.value = value;\n }\n }\n\n private getMenuAnchor() {\n if (!this.target) {\n return null;\n }\n\n if (this.target.tagName === 'U-CHIP-FIELD') {\n return this.target.input;\n }\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n return this.target.container;\n }\n\n return this.target;\n }\n\n private getTextValue(): string {\n if (!this.value) {\n return '';\n }\n\n return this.formatter\n ? this.formatter(this.value)\n : this.value\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-typeahead': UmTypeahead;\n }\n}\n"]}
1
+ {"version":3,"file":"typeahead.js","sourceRoot":"","sources":["../../src/typeahead/typeahead.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, HTMLTemplateResult, LitElement } from 'lit';\n\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport {\n customElement,\n property,\n query,\n queryAll,\n state,\n} from 'lit/decorators.js';\n\nimport { styles } from './typeahead.styles.js';\n\nimport { UmMenuItem } from '../menu/menu-item.js';\nimport { UmMenu } from '../menu/menu.js';\nimport { MenuFieldNavigationController } from '../shared/menu-field/menu-field-navigation-controller.js';\nimport { normalizeText } from '../shared/normalize-text.js';\n\nimport '../menu/menu.js';\nimport '../menu/menu-item.js';\nimport './highlight.js';\n\nexport interface Data {\n label: string;\n value: any;\n}\n\n@customElement('u-typeahead')\nexport class UmTypeahead extends LitElement {\n static readonly formAssociated = true;\n\n static override styles = styles;\n\n #targetId: string | undefined;\n\n #connected = false;\n private target:\n | (HTMLElement & {\n autocomplete: 'on' | 'off' | string | null;\n input?: HTMLInputElement;\n container?: HTMLElement;\n value: string;\n })\n | null = null;\n #documentMutationObserver: MutationObserver | null = null;\n #navigationController = new MenuFieldNavigationController(this);\n #termNormalized: string = '';\n #debounceTimeout: number | null = null;\n #value: any;\n readonly #elementInternals: ElementInternals;\n\n // @ts-ignore\n @state() private results: Data[];\n\n /**\n * The datasource of the typeahead. Accepts an `Array` or a `Promise<[]>`.\n */\n @state() source: (any[] | ((term: string) => Promise<any[]>)) | undefined;\n\n /**\n * A function return a string based on a result from the `source`. Useful when the source results are objects.\n */\n formatter: ((value: any) => string) | undefined;\n\n /**\n * A string representing an HTML to be rendered inside the menu item. If set, it will replace the `u-highlight`.\n *\n * _Note:_ Subject to signature change\n */\n template: ((term: string, value: any) => string) | undefined;\n\n /**\n * The time in milliseconds before triggering an update in the results.\n */\n @property({ type: Number, reflect: true }) debounce = 300;\n\n /**\n * The number of suggestions to show\n */\n @property({ type: Number, reflect: true }) limit = 10;\n\n /**\n * How many characters must be typed before show suggestions\n *\n * _Note:_ Not used when the source is a `Promise`\n */\n @property({ type: Number, reflect: true }) minLength = 2;\n\n /**\n * Whether the menu will be show when the target get focus.\n *\n * _Note:_ The `minLength` will still be applied\n */\n @property({ type: Boolean, attribute: 'open-on-focus', reflect: true })\n openOnFocus = false;\n\n /**\n * If `true`, model values will not be restricted only to items selected from the menu.\n */\n @property({ type: Boolean, reflect: true }) editable = false;\n\n /**\n * The value for the `autocomplete` attribute for the target element.\n */\n @property({ reflect: true }) autocomplete: 'on' | 'off' | string = 'off';\n\n /**\n * The value for the `spellcheck` attribute for the target element.\n */\n @property({ reflect: true }) override spellcheck = false;\n\n get form(): HTMLFormElement | null {\n return this.#elementInternals.form;\n }\n\n /**\n * Gets or sets the current value of the typeahead.\n */\n get value(): any {\n return this.#value;\n }\n set value(value: any) {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n\n if (this.#connected) {\n this.#setValueOnTarget();\n }\n }\n\n override focus() {\n this.target?.focus();\n }\n\n clear() {\n if (!this.target) {\n return;\n }\n\n this.#termNormalized = '';\n this.setTargetValue('');\n }\n\n /**\n * The id of the target element to attach the typeahead.\n */\n @property({ reflect: true, attribute: 'target-id' })\n get targetId(): string | undefined {\n return this.#targetId;\n }\n set targetId(value: string | undefined) {\n this.#targetId = value;\n\n if (this.#connected) {\n this.#attach();\n }\n }\n\n @query('u-menu') _menu!: UmMenu;\n @queryAll('u-menu-item') _menuItems!: UmMenuItem[];\n\n constructor() {\n super();\n this.#elementInternals = this.attachInternals();\n }\n\n override attributeChangedCallback(\n name: string,\n _old: string | null,\n value: string | null,\n ) {\n super.attributeChangedCallback(name, _old, value);\n\n if (name === 'autocomplete') {\n this.target!.autocomplete = value;\n }\n\n if (name === 'spellcheck') {\n this.target!.spellcheck = value === 'true';\n }\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.#connected = true;\n this.#attach();\n this.#documentMutationObserver = new MutationObserver(() => this.#attach());\n this.#documentMutationObserver.observe(document, {\n attributes: true,\n childList: true,\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.#connected = false;\n this.#detach();\n this.#documentMutationObserver!.disconnect();\n this.#documentMutationObserver = null;\n }\n\n #attach() {\n if (!this.targetId) {\n this.#detach();\n return;\n }\n\n const newTarget = document.getElementById(\n this.targetId,\n ) as HTMLInputElement;\n\n if (newTarget === this.target) {\n return;\n }\n\n this.#detach();\n\n if (!newTarget) {\n return;\n }\n\n // @ts-ignore\n this.target = newTarget;\n newTarget.role = 'combobox';\n newTarget.autocomplete = <any>this.autocomplete;\n newTarget.spellcheck = this.spellcheck;\n newTarget.autocapitalize = 'off';\n\n newTarget.addEventListener('click', this.#handleClick);\n newTarget.addEventListener('input', this.#handleInput);\n this.#navigationController.attach(newTarget);\n newTarget.addEventListener('focus', this.#handleFocus);\n\n if (this.value) {\n this.#setValueOnTarget();\n }\n }\n\n #detach() {\n this.target?.removeEventListener('click', this.#handleClick);\n this.target?.removeEventListener('input', this.#handleInput);\n this.#navigationController.detach();\n this.target?.removeEventListener('focus', this.#handleFocus);\n }\n\n #handleFocus = async () => {\n if (this.openOnFocus) {\n await this.#updateResults();\n }\n };\n\n #handleInput = () => {\n if (this.#debounceTimeout) {\n clearTimeout(this.#debounceTimeout);\n }\n\n this.#setValueAndDispatchEvents(\n this.editable ? this.getTargetValue() : null,\n true,\n );\n\n this.#debounceTimeout = setTimeout(\n async () => await this.#updateResults(true),\n this.debounce,\n );\n };\n\n #getItemClickHandler(data: Data) {\n return () => {\n const selectedEvent = new CustomEvent('selected', {\n cancelable: true,\n detail: data.value,\n });\n\n this.dispatchEvent(selectedEvent);\n\n if (selectedEvent.defaultPrevented) {\n return;\n }\n\n this.#setValueAndDispatchEvents(data.value);\n };\n }\n\n #setValueAndDispatchEvents(value: any, direct = false) {\n if (!direct) {\n this.value = value;\n } else {\n this.#value = value;\n this.#elementInternals.setFormValue(value);\n }\n\n this.dispatchEvent(\n new InputEvent('input', { bubbles: true, composed: true }),\n );\n this.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n protected override render(): HTMLTemplateResult {\n if (!this.results?.length) {\n return html``;\n }\n\n setTimeout(() => {\n this._menu.anchorElement = this.getMenuAnchor();\n this._menu.open = true;\n });\n\n return html`\n <u-menu manualFocus anchor-corner=\"auto-start\">\n ${this.results.map(result => {\n const content = this.template\n ? unsafeHTML(this.template(this.#termNormalized, result.value))\n : html`<u-highlight\n .term=${this.#termNormalized}\n .result=${result.label}\n ></u-highlight>`;\n\n return html` <u-menu-item\n @click=${this.#getItemClickHandler(result)}\n tabindex=\"-1\"\n >${content}</u-menu-item\n >`;\n })}\n </u-menu>\n `;\n }\n\n async #updateResults(lazy = false) {\n const term = this.getTargetValue();\n\n const termNormalized = normalizeText(term).toLowerCase();\n\n if (\n lazy &&\n termNormalized === this.#termNormalized &&\n this._menu?.open === true\n ) {\n return;\n }\n\n this.#termNormalized = termNormalized;\n\n if (termNormalized.length < this.minLength) {\n this.results = [];\n return;\n }\n\n this.results = await this.#getData();\n this.results = this.results.slice(0, this.limit || this.results.length);\n }\n\n async #getData(): Promise<Data[]> {\n if (!this.source) {\n return [];\n }\n\n let values: any[];\n\n let filter = false;\n\n if (this.source instanceof Array) {\n values = this.source;\n filter = true;\n } else {\n const source = this.source as (term: string) => Promise<any[]>;\n values = await source(this.#termNormalized);\n }\n\n const result = values.map(source => ({\n label: this.formatter ? this.formatter(source) : source.toString(),\n value: source,\n }));\n\n if (!filter) {\n return result;\n }\n\n return result.filter(t =>\n normalizeText(t.label).toLowerCase().includes(this.#termNormalized),\n );\n }\n\n #setValueOnTarget() {\n if (!this.target) {\n return;\n }\n\n const textValue = this.getTextValue();\n this.#termNormalized = normalizeText(textValue)?.toLowerCase();\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n this.target.value = textValue;\n return;\n }\n\n if (this.target.input) {\n this.target.input.value = textValue;\n return;\n }\n\n this.target.value = textValue;\n }\n\n private getTargetValue(): string {\n return this.target!.input?.value ?? this.target!.value;\n }\n\n private setTargetValue(value: string): void {\n const targetInput = this.target?.input ?? this.target;\n\n if (targetInput) {\n targetInput.value = value;\n }\n }\n\n private getMenuAnchor() {\n if (!this.target) {\n return null;\n }\n\n if (this.target.tagName === 'U-CHIP-FIELD') {\n return this.target.input;\n }\n\n if (this.target.tagName === 'U-TEXT-FIELD') {\n return this.target.container;\n }\n\n return this.target;\n }\n\n private getTextValue(): string {\n if (!this.value) {\n return '';\n }\n\n return this.formatter ? this.formatter(this.value) : this.value;\n }\n\n #handleClick(e: Event) {\n e.stopPropagation();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-typeahead': UmTypeahead;\n }\n}\n"]}